1 TEXT _sha1block+0(SB),$352 2 3/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; 4 * wp[off] = x; 5 * x += A <<< 5; 6 * E += 0xca62c1d6 + x; 7 * x = FN(B,C,D); 8 * E += x; 9 * B >>> 2 10 */ 11#define BSWAPDI BYTE $0x0f; BYTE $0xcf; 12 13#define BODY(off,FN,V,A,B,C,D,E)\ 14 MOVL (off-64)(BP),DI;\ 15 XORL (off-56)(BP),DI;\ 16 XORL (off-32)(BP),DI;\ 17 XORL (off-12)(BP),DI;\ 18 ROLL $1,DI;\ 19 MOVL DI,off(BP);\ 20 LEAL V(DI)(E*1),E;\ 21 MOVL A,DI;\ 22 ROLL $5,DI;\ 23 ADDL DI,E;\ 24 FN(B,C,D)\ 25 ADDL DI,E;\ 26 RORL $2,B;\ 27 28#define BODY0(off,FN,V,A,B,C,D,E)\ 29 MOVL off(BX),DI;\ 30 BSWAPDI;\ 31 MOVL DI,off(BP);\ 32 LEAL V(DI)(E*1),E;\ 33 MOVL A,DI;\ 34 ROLL $5,DI;\ 35 ADDL DI,E;\ 36 FN(B,C,D)\ 37 ADDL DI,E;\ 38 RORL $2,B;\ 39 40/* 41 * fn1 = (((C^D)&B)^D); 42 */ 43#define FN1(B,C,D)\ 44 MOVL C,DI;\ 45 XORL D,DI;\ 46 ANDL B,DI;\ 47 XORL D,DI;\ 48 49/* 50 * fn24 = B ^ C ^ D 51 */ 52#define FN24(B,C,D)\ 53 MOVL B,DI;\ 54 XORL C,DI;\ 55 XORL D,DI;\ 56 57/* 58 * fn3 = ((B ^ C) & (D ^= B)) ^ B 59 * D ^= B to restore D 60 */ 61#define FN3(B,C,D)\ 62 MOVL B,DI;\ 63 XORL C,DI;\ 64 XORL B,D;\ 65 ANDL D,DI;\ 66 XORL B,DI;\ 67 XORL B,D;\ 68 69/* 70 * stack offsets 71 * void sha1block(uchar *DATA, int LEN, ulong *STATE) 72 */ 73#define DATA 0 74#define LEN 4 75#define STATE 8 76 77/* 78 * stack offsets for locals 79 * ulong w[80]; 80 * uchar *edata; 81 * ulong *w15, *w40, *w60, *w80; 82 * register local 83 * ulong *wp = BP 84 * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi 85 * ulong tmp = edi 86 */ 87#define WARRAY (-4-(80*4)) 88#define TMP1 (-8-(80*4)) 89#define TMP2 (-12-(80*4)) 90#define W15 (-16-(80*4)) 91#define W40 (-20-(80*4)) 92#define W60 (-24-(80*4)) 93#define W80 (-28-(80*4)) 94#define EDATA (-32-(80*4)) 95 96 MOVL data+DATA(FP),AX 97 ADDL len+LEN(FP),AX 98 MOVL AX,edata+EDATA(SP) 99 100 LEAL aw15+(WARRAY+15*4)(SP),DI 101 MOVL DI,w15+W15(SP) 102 LEAL aw40+(WARRAY+40*4)(SP),DX 103 MOVL DX,w40+W40(SP) 104 LEAL aw60+(WARRAY+60*4)(SP),CX 105 MOVL CX,w60+W60(SP) 106 LEAL aw80+(WARRAY+80*4)(SP),DI 107 MOVL DI,w80+W80(SP) 108 109mainloop: 110 LEAL warray+WARRAY(SP),BP 111 112 MOVL state+STATE(FP),DI 113 MOVL (DI),AX 114 MOVL 4(DI),BX 115 MOVL BX,tmp1+TMP1(SP) 116 MOVL 8(DI),CX 117 MOVL 12(DI),DX 118 MOVL 16(DI),SI 119 120 MOVL data+DATA(FP),BX 121 122loop1: 123 BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI) 124 MOVL SI,tmp2+TMP2(SP) 125 BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX) 126 MOVL tmp1+TMP1(SP),SI 127 BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX) 128 BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI) 129 MOVL SI,tmp1+TMP1(SP) 130 BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX) 131 MOVL tmp2+TMP2(SP),SI 132 133 ADDL $20,BX 134 ADDL $20,BP 135 CMPL BP,w15+W15(SP) 136 JCS loop1 137 138 BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI) 139 ADDL $4,BX 140 MOVL BX,data+DATA(FP) 141 MOVL tmp1+TMP1(SP),BX 142 143 BODY(4,FN1,0x5a827999,SI,AX,BX,CX,DX) 144 BODY(8,FN1,0x5a827999,DX,SI,AX,BX,CX) 145 BODY(12,FN1,0x5a827999,CX,DX,SI,AX,BX) 146 BODY(16,FN1,0x5a827999,BX,CX,DX,SI,AX) 147 148 ADDL $20,BP 149 150loop2: 151 BODY(0,FN24,0x6ed9eba1,AX,BX,CX,DX,SI) 152 BODY(4,FN24,0x6ed9eba1,SI,AX,BX,CX,DX) 153 BODY(8,FN24,0x6ed9eba1,DX,SI,AX,BX,CX) 154 BODY(12,FN24,0x6ed9eba1,CX,DX,SI,AX,BX) 155 BODY(16,FN24,0x6ed9eba1,BX,CX,DX,SI,AX) 156 157 ADDL $20,BP 158 CMPL BP,w40+W40(SP) 159 JCS loop2 160 161loop3: 162 BODY(0,FN3,0x8f1bbcdc,AX,BX,CX,DX,SI) 163 BODY(4,FN3,0x8f1bbcdc,SI,AX,BX,CX,DX) 164 BODY(8,FN3,0x8f1bbcdc,DX,SI,AX,BX,CX) 165 BODY(12,FN3,0x8f1bbcdc,CX,DX,SI,AX,BX) 166 BODY(16,FN3,0x8f1bbcdc,BX,CX,DX,SI,AX) 167 168 ADDL $20,BP 169 CMPL BP,w60+W60(SP) 170 JCS loop3 171 172loop4: 173 BODY(0,FN24,0xca62c1d6,AX,BX,CX,DX,SI) 174 BODY(4,FN24,0xca62c1d6,SI,AX,BX,CX,DX) 175 BODY(8,FN24,0xca62c1d6,DX,SI,AX,BX,CX) 176 BODY(12,FN24,0xca62c1d6,CX,DX,SI,AX,BX) 177 BODY(16,FN24,0xca62c1d6,BX,CX,DX,SI,AX) 178 179 ADDL $20,BP 180 CMPL BP,w80+W80(SP) 181 JCS loop4 182 183 MOVL state+STATE(FP),DI 184 ADDL AX,0(DI) 185 ADDL BX,4(DI) 186 ADDL CX,8(DI) 187 ADDL DX,12(DI) 188 ADDL SI,16(DI) 189 190 MOVL edata+EDATA(SP),DI 191 CMPL data+DATA(FP),DI 192 JCS mainloop 193 194 RET 195 END 196