github.com/panjjo/go@v0.0.0-20161104043856-d62b31386338/src/crypto/aes/asm_s390x.s (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "textflag.h" 6 7 // func hasAsm() bool 8 TEXT ·hasAsm(SB),NOSPLIT,$16-1 9 XOR R0, R0 // set function code to 0 (query) 10 LA mask-16(SP), R1 // 16-byte stack variable for mask 11 MOVD $(0x38<<40), R3 // mask for bits 18-20 (big endian) 12 13 // check for KM AES functions 14 WORD $0xB92E0024 // cipher message (KM) 15 MOVD mask-16(SP), R2 16 AND R3, R2 17 CMPBNE R2, R3, notfound 18 19 // check for KMC AES functions 20 WORD $0xB92F0024 // cipher message with chaining (KMC) 21 MOVD mask-16(SP), R2 22 AND R3, R2 23 CMPBNE R2, R3, notfound 24 25 // check for KMCTR AES functions 26 WORD $0xB92D4024 // cipher message with counter (KMCTR) 27 MOVD mask-16(SP), R2 28 AND R3, R2 29 CMPBNE R2, R3, notfound 30 31 // check for KIMD GHASH function 32 WORD $0xB93E0024 // compute intermediate message digest (KIMD) 33 MOVD mask-8(SP), R2 // bits 64-127 34 MOVD $(1<<62), R5 35 AND R5, R2 36 CMPBNE R2, R5, notfound 37 38 MOVB $1, ret+0(FP) 39 RET 40 notfound: 41 MOVB $0, ret+0(FP) 42 RET 43 44 // func cryptBlocks(c code, key, dst, src *byte, length int) 45 TEXT ·cryptBlocks(SB),NOSPLIT,$0-40 46 MOVD key+8(FP), R1 47 MOVD dst+16(FP), R2 48 MOVD src+24(FP), R4 49 MOVD length+32(FP), R5 50 MOVD c+0(FP), R0 51 loop: 52 WORD $0xB92E0024 // cipher message (KM) 53 BVS loop // branch back if interrupted 54 XOR R0, R0 55 RET 56 57 // func cryptBlocksChain(c code, iv, key, dst, src *byte, length int) 58 TEXT ·cryptBlocksChain(SB),NOSPLIT,$48-48 59 LA params-48(SP), R1 60 MOVD iv+8(FP), R8 61 MOVD key+16(FP), R9 62 MVC $16, 0(R8), 0(R1) // move iv into params 63 MVC $32, 0(R9), 16(R1) // move key into params 64 MOVD dst+24(FP), R2 65 MOVD src+32(FP), R4 66 MOVD length+40(FP), R5 67 MOVD c+0(FP), R0 68 loop: 69 WORD $0xB92F0024 // cipher message with chaining (KMC) 70 BVS loop // branch back if interrupted 71 XOR R0, R0 72 MVC $16, 0(R1), 0(R8) // update iv 73 RET 74 75 // func xorBytes(dst, a, b []byte) int 76 TEXT ·xorBytes(SB),NOSPLIT,$0-80 77 MOVD dst_base+0(FP), R1 78 MOVD a_base+24(FP), R2 79 MOVD b_base+48(FP), R3 80 MOVD a_len+32(FP), R4 81 MOVD b_len+56(FP), R5 82 CMPBLE R4, R5, skip 83 MOVD R5, R4 84 skip: 85 MOVD R4, ret+72(FP) 86 MOVD $0, R5 87 CMPBLT R4, $8, tail 88 loop: 89 MOVD 0(R2)(R5*1), R7 90 MOVD 0(R3)(R5*1), R8 91 XOR R7, R8 92 MOVD R8, 0(R1)(R5*1) 93 LAY 8(R5), R5 94 SUB $8, R4 95 CMPBGE R4, $8, loop 96 tail: 97 CMPBEQ R4, $0, done 98 MOVB 0(R2)(R5*1), R7 99 MOVB 0(R3)(R5*1), R8 100 XOR R7, R8 101 MOVB R8, 0(R1)(R5*1) 102 LAY 1(R5), R5 103 SUB $1, R4 104 BR tail 105 done: 106 RET 107 108 // func cryptBlocksGCM(fn code, key, dst, src, buf []byte, cnt *[16]byte) 109 TEXT ·cryptBlocksGCM(SB),NOSPLIT,$0-112 110 MOVD src_len+64(FP), R0 111 MOVD buf_base+80(FP), R1 112 MOVD cnt+104(FP), R12 113 LMG (R12), R2, R3 114 115 // Check that the src size is less than or equal to the buffer size. 116 MOVD buf_len+88(FP), R4 117 CMP R0, R4 118 BGT crash 119 120 // Check that the src size is a multiple of 16-bytes. 121 MOVD R0, R4 122 AND $0xf, R4 123 BLT crash // non-zero 124 125 // Check that the src size is less than or equal to the dst size. 126 MOVD dst_len+40(FP), R4 127 CMP R0, R4 128 BGT crash 129 130 MOVD R2, R4 131 MOVD R2, R6 132 MOVD R2, R8 133 MOVD R3, R5 134 MOVD R3, R7 135 MOVD R3, R9 136 ADDW $1, R5 137 ADDW $2, R7 138 ADDW $3, R9 139 incr: 140 CMP R0, $64 141 BLT tail 142 STMG R2, R9, (R1) 143 ADDW $4, R3 144 ADDW $4, R5 145 ADDW $4, R7 146 ADDW $4, R9 147 MOVD $64(R1), R1 148 SUB $64, R0 149 BR incr 150 tail: 151 CMP R0, $0 152 BEQ crypt 153 STMG R2, R3, (R1) 154 ADDW $1, R3 155 MOVD $16(R1), R1 156 SUB $16, R0 157 BR tail 158 crypt: 159 STMG R2, R3, (R12) // update next counter value 160 MOVD fn+0(FP), R0 // function code (encryption) 161 MOVD key_base+8(FP), R1 // key 162 MOVD buf_base+80(FP), R2 // counter values 163 MOVD dst_base+32(FP), R4 // dst 164 MOVD src_base+56(FP), R6 // src 165 MOVD src_len+64(FP), R7 // len 166 loop: 167 WORD $0xB92D2046 // cipher message with counter (KMCTR) 168 BVS loop // branch back if interrupted 169 RET 170 crash: 171 MOVD $0, (R0) 172 RET 173 174 // func ghash(key *gcmHashKey, hash *[16]byte, data []byte) 175 TEXT ·ghash(SB),NOSPLIT,$32-40 176 MOVD $65, R0 // GHASH function code 177 MOVD key+0(FP), R2 178 LMG (R2), R6, R7 179 MOVD hash+8(FP), R8 180 LMG (R8), R4, R5 181 MOVD $params-32(SP), R1 182 STMG R4, R7, (R1) 183 LMG data+16(FP), R2, R3 // R2=base, R3=len 184 loop: 185 WORD $0xB93E0002 // compute intermediate message digest (KIMD) 186 BVS loop // branch back if interrupted 187 MVC $16, (R1), (R8) 188 MOVD $0, R0 189 RET