1.text 2 3.p2align 2,0x90 4.globl _sha1block 5 .type _sha1block, @function 6_sha1block: 7 8/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; 9 * wp[off] = x; 10 * x += A <<< 5; 11 * E += 0xca62c1d6 + x; 12 * x = FN(B,C,D); 13 * E += x; 14 * B >>> 2 15 */ 16#define BSWAPDI BYTE $0x0f; BYTE $0xcf; 17 18#define BODY(off,FN,V,A,B,C,D,E)\ 19 movl (off-64)(%ebp), %edi;\ 20 xorl (off-56)(%ebp), %edi;\ 21 xorl (off-32)(%ebp), %edi;\ 22 xorl (off-12)(%ebp), %edi;\ 23 roll $1, %edi;\ 24 movl %edi, off(%ebp);\ 25 leal V(%edi, E, 1), E;\ 26 movl A, %edi;\ 27 roll $5, %edi;\ 28 addl %edi, E;\ 29 FN(B,C,D)\ 30 addl %edi, E;\ 31 rorl $2, B;\ 32 33#define BODY0(off,FN,V,A,B,C,D,E)\ 34 movl off(%ebx), %edi;\ 35 bswap %edi;\ 36 movl %edi, off(%ebp);\ 37 leal V(%edi,E,1), E;\ 38 movl A, %edi;\ 39 roll $5,%edi;\ 40 addl %edi,E;\ 41 FN(B,C,D)\ 42 addl %edi,E;\ 43 rorl $2,B;\ 44 45/* 46 * fn1 = (((C^D)&B)^D); 47 */ 48#define FN1(B,C,D)\ 49 movl C, %edi;\ 50 xorl D, %edi;\ 51 andl B, %edi;\ 52 xorl D, %edi;\ 53 54/* 55 * fn24 = B ^ C ^ D 56 */ 57#define FN24(B,C,D)\ 58 movl B, %edi;\ 59 xorl C, %edi;\ 60 xorl D, %edi;\ 61 62/* 63 * fn3 = ((B ^ C) & (D ^= B)) ^ B 64 * D ^= B to restore D 65 */ 66#define FN3(B,C,D)\ 67 movl B, %edi;\ 68 xorl C, %edi;\ 69 xorl B, D;\ 70 andl D, %edi;\ 71 xorl B, %edi;\ 72 xorl B, D;\ 73 74/* 75 * stack offsets 76 * void sha1block(uchar *DATA, int LEN, ulong *STATE) 77 */ 78#define STACKSIZE (48+80*4) 79#define DATA (STACKSIZE+8) 80#define LEN (STACKSIZE+12) 81#define STATE (STACKSIZE+16) 82 83/* 84 * stack offsets for locals 85 * ulong w[80]; 86 * uchar *edata; 87 * ulong *w15, *w40, *w60, *w80; 88 * register local 89 * ulong *wp = %ebp 90 * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi 91 * ulong tmp = edi 92 */ 93#define WARRAY (STACKSIZE-4-(80*4)) 94#define TMP1 (STACKSIZE-8-(80*4)) 95#define TMP2 (STACKSIZE-12-(80*4)) 96#define W15 (STACKSIZE-16-(80*4)) 97#define W40 (STACKSIZE-20-(80*4)) 98#define W60 (STACKSIZE-24-(80*4)) 99#define W80 (STACKSIZE-28-(80*4)) 100#define EDATA (STACKSIZE-32-(80*4)) 101#define OLDEBX (STACKSIZE-36-(80*4)) 102#define OLDESI (STACKSIZE-40-(80*4)) 103#define OLDEDI (STACKSIZE-44-(80*4)) 104 105 /* Prelude */ 106 pushl %ebp 107 subl $(STACKSIZE), %esp 108 109 mov %ebx, OLDEBX(%esp) 110 mov %esi, OLDESI(%esp) 111 mov %edi, OLDEDI(%esp) 112 113 movl DATA(%esp), %eax 114 addl LEN(%esp), %eax 115 movl %eax, EDATA(%esp) 116 117 leal (WARRAY+15*4)(%esp), %edi /* aw15 */ 118 movl %edi, W15(%esp) 119 leal (WARRAY+40*4)(%esp), %edx /* aw40 */ 120 movl %edx, W40(%esp) 121 leal (WARRAY+60*4)(%esp), %ecx /* aw60 */ 122 movl %ecx, W60(%esp) 123 leal (WARRAY+80*4)(%esp), %edi /* aw80 */ 124 movl %edi, W80(%esp) 125 1260: 127 leal WARRAY(%esp), %ebp /* warray */ 128 129 movl STATE(%esp), %edi /* state */ 130 movl (%edi),%eax 131 movl 4(%edi),%ebx 132 movl %ebx, TMP1(%esp) /* tmp1 */ 133 movl 8(%edi), %ecx 134 movl 12(%edi), %edx 135 movl 16(%edi), %esi 136 137 movl DATA(%esp), %ebx /* data */ 138 1391: 140 BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) 141 movl %esi,TMP2(%esp) 142 BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx) 143 movl TMP1(%esp),%esi 144 BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx) 145 BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi) 146 movl %esi,TMP1(%esp) 147 BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax) 148 movl TMP2(%esp),%esi 149 150 addl $20, %ebx 151 addl $20, %ebp 152 cmpl W15(%esp), %ebp /* w15 */ 153 jb 1b 154 155 BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) 156 addl $4, %ebx 157 MOVL %ebx, DATA(%esp) /* data */ 158 MOVL TMP1(%esp),%ebx 159 160 BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx) 161 BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx) 162 BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx) 163 BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax) 164 165 addl $20, %ebp 166 1672: 168 BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi) 169 BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx) 170 BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx) 171 BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx) 172 BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax) 173 174 addl $20,%ebp 175 cmpl W40(%esp), %ebp 176 jb 2b 177 1783: 179 BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi) 180 BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx) 181 BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx) 182 BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx) 183 BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax) 184 185 addl $20, %ebp 186 cmpl W60(%esp), %ebp /* w60 */ 187 jb 3b 188 1894: 190 BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi) 191 BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx) 192 BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx) 193 BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx) 194 BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax) 195 196 addl $20, %ebp 197 cmpl W80(%esp), %ebp /* w80 */ 198 jb 4b 199 200 movl STATE(%esp), %edi /* state */ 201 addl %eax, 0(%edi) 202 addl %ebx, 4(%edi) 203 addl %ecx, 8(%edi) 204 addl %edx, 12(%edi) 205 addl %esi, 16(%edi) 206 207 movl EDATA(%esp), %edi /* edata */ 208 cmpl %edi, DATA(%esp) /* data */ 209 jb 0b 210 211 /* Postlude */ 212 mov OLDEBX(%esp), %ebx 213 mov OLDESI(%esp), %esi 214 mov OLDEDI(%esp), %edi 215 addl $(STACKSIZE), %esp 216 popl %ebp 217 ret 218