18ccd4a63SDavid du Colombier.text 28ccd4a63SDavid du Colombier 38ccd4a63SDavid du Colombier.p2align 2,0x90 4*96cbc34fSDavid du Colombier#ifdef __APPLE__ 5*96cbc34fSDavid du Colombier.globl __sha1block 6*96cbc34fSDavid du Colombier__sha1block: 7*96cbc34fSDavid du Colombier#else 88ccd4a63SDavid du Colombier.globl _sha1block 98ccd4a63SDavid du Colombier_sha1block: 10*96cbc34fSDavid du Colombier#endif 118ccd4a63SDavid du Colombier 128ccd4a63SDavid du Colombier/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; 138ccd4a63SDavid du Colombier * wp[off] = x; 148ccd4a63SDavid du Colombier * x += A <<< 5; 158ccd4a63SDavid du Colombier * E += 0xca62c1d6 + x; 168ccd4a63SDavid du Colombier * x = FN(B,C,D); 178ccd4a63SDavid du Colombier * E += x; 188ccd4a63SDavid du Colombier * B >>> 2 198ccd4a63SDavid du Colombier */ 208ccd4a63SDavid du Colombier#define BSWAPDI BYTE $0x0f; BYTE $0xcf; 218ccd4a63SDavid du Colombier 228ccd4a63SDavid du Colombier#define BODY(off,FN,V,A,B,C,D,E)\ 238ccd4a63SDavid du Colombier movl (off-64)(%ebp), %edi;\ 248ccd4a63SDavid du Colombier xorl (off-56)(%ebp), %edi;\ 258ccd4a63SDavid du Colombier xorl (off-32)(%ebp), %edi;\ 268ccd4a63SDavid du Colombier xorl (off-12)(%ebp), %edi;\ 278ccd4a63SDavid du Colombier roll $1, %edi;\ 288ccd4a63SDavid du Colombier movl %edi, off(%ebp);\ 298ccd4a63SDavid du Colombier leal V(%edi, E, 1), E;\ 308ccd4a63SDavid du Colombier movl A, %edi;\ 318ccd4a63SDavid du Colombier roll $5, %edi;\ 328ccd4a63SDavid du Colombier addl %edi, E;\ 338ccd4a63SDavid du Colombier FN(B,C,D)\ 348ccd4a63SDavid du Colombier addl %edi, E;\ 358ccd4a63SDavid du Colombier rorl $2, B;\ 368ccd4a63SDavid du Colombier 378ccd4a63SDavid du Colombier#define BODY0(off,FN,V,A,B,C,D,E)\ 388ccd4a63SDavid du Colombier movl off(%ebx), %edi;\ 398ccd4a63SDavid du Colombier bswap %edi;\ 408ccd4a63SDavid du Colombier movl %edi, off(%ebp);\ 418ccd4a63SDavid du Colombier leal V(%edi,E,1), E;\ 428ccd4a63SDavid du Colombier movl A, %edi;\ 438ccd4a63SDavid du Colombier roll $5,%edi;\ 448ccd4a63SDavid du Colombier addl %edi,E;\ 458ccd4a63SDavid du Colombier FN(B,C,D)\ 468ccd4a63SDavid du Colombier addl %edi,E;\ 478ccd4a63SDavid du Colombier rorl $2,B;\ 488ccd4a63SDavid du Colombier 498ccd4a63SDavid du Colombier/* 508ccd4a63SDavid du Colombier * fn1 = (((C^D)&B)^D); 518ccd4a63SDavid du Colombier */ 528ccd4a63SDavid du Colombier#define FN1(B,C,D)\ 538ccd4a63SDavid du Colombier movl C, %edi;\ 548ccd4a63SDavid du Colombier xorl D, %edi;\ 558ccd4a63SDavid du Colombier andl B, %edi;\ 568ccd4a63SDavid du Colombier xorl D, %edi;\ 578ccd4a63SDavid du Colombier 588ccd4a63SDavid du Colombier/* 598ccd4a63SDavid du Colombier * fn24 = B ^ C ^ D 608ccd4a63SDavid du Colombier */ 618ccd4a63SDavid du Colombier#define FN24(B,C,D)\ 628ccd4a63SDavid du Colombier movl B, %edi;\ 638ccd4a63SDavid du Colombier xorl C, %edi;\ 648ccd4a63SDavid du Colombier xorl D, %edi;\ 658ccd4a63SDavid du Colombier 668ccd4a63SDavid du Colombier/* 678ccd4a63SDavid du Colombier * fn3 = ((B ^ C) & (D ^= B)) ^ B 688ccd4a63SDavid du Colombier * D ^= B to restore D 698ccd4a63SDavid du Colombier */ 708ccd4a63SDavid du Colombier#define FN3(B,C,D)\ 718ccd4a63SDavid du Colombier movl B, %edi;\ 728ccd4a63SDavid du Colombier xorl C, %edi;\ 738ccd4a63SDavid du Colombier xorl B, D;\ 748ccd4a63SDavid du Colombier andl D, %edi;\ 758ccd4a63SDavid du Colombier xorl B, %edi;\ 768ccd4a63SDavid du Colombier xorl B, D;\ 778ccd4a63SDavid du Colombier 788ccd4a63SDavid du Colombier/* 798ccd4a63SDavid du Colombier * stack offsets 808ccd4a63SDavid du Colombier * void sha1block(uchar *DATA, int LEN, ulong *STATE) 818ccd4a63SDavid du Colombier */ 828ccd4a63SDavid du Colombier#define STACKSIZE (48+80*4) 838ccd4a63SDavid du Colombier#define DATA (STACKSIZE+8) 848ccd4a63SDavid du Colombier#define LEN (STACKSIZE+12) 858ccd4a63SDavid du Colombier#define STATE (STACKSIZE+16) 868ccd4a63SDavid du Colombier 878ccd4a63SDavid du Colombier/* 888ccd4a63SDavid du Colombier * stack offsets for locals 898ccd4a63SDavid du Colombier * ulong w[80]; 908ccd4a63SDavid du Colombier * uchar *edata; 918ccd4a63SDavid du Colombier * ulong *w15, *w40, *w60, *w80; 928ccd4a63SDavid du Colombier * register local 938ccd4a63SDavid du Colombier * ulong *wp = %ebp 948ccd4a63SDavid du Colombier * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi 958ccd4a63SDavid du Colombier * ulong tmp = edi 968ccd4a63SDavid du Colombier */ 978ccd4a63SDavid du Colombier#define WARRAY (STACKSIZE-4-(80*4)) 988ccd4a63SDavid du Colombier#define TMP1 (STACKSIZE-8-(80*4)) 998ccd4a63SDavid du Colombier#define TMP2 (STACKSIZE-12-(80*4)) 1008ccd4a63SDavid du Colombier#define W15 (STACKSIZE-16-(80*4)) 1018ccd4a63SDavid du Colombier#define W40 (STACKSIZE-20-(80*4)) 1028ccd4a63SDavid du Colombier#define W60 (STACKSIZE-24-(80*4)) 1038ccd4a63SDavid du Colombier#define W80 (STACKSIZE-28-(80*4)) 1048ccd4a63SDavid du Colombier#define EDATA (STACKSIZE-32-(80*4)) 1058ccd4a63SDavid du Colombier#define OLDEBX (STACKSIZE-36-(80*4)) 1068ccd4a63SDavid du Colombier#define OLDESI (STACKSIZE-40-(80*4)) 1078ccd4a63SDavid du Colombier#define OLDEDI (STACKSIZE-44-(80*4)) 1088ccd4a63SDavid du Colombier 1098ccd4a63SDavid du Colombier /* Prelude */ 1108ccd4a63SDavid du Colombier pushl %ebp 1118ccd4a63SDavid du Colombier subl $(STACKSIZE), %esp 1128ccd4a63SDavid du Colombier 1138ccd4a63SDavid du Colombier mov %ebx, OLDEBX(%esp) 1148ccd4a63SDavid du Colombier mov %esi, OLDESI(%esp) 1158ccd4a63SDavid du Colombier mov %edi, OLDEDI(%esp) 1168ccd4a63SDavid du Colombier 1178ccd4a63SDavid du Colombier movl DATA(%esp), %eax 1188ccd4a63SDavid du Colombier addl LEN(%esp), %eax 1198ccd4a63SDavid du Colombier movl %eax, EDATA(%esp) 1208ccd4a63SDavid du Colombier 1218ccd4a63SDavid du Colombier leal (WARRAY+15*4)(%esp), %edi /* aw15 */ 1228ccd4a63SDavid du Colombier movl %edi, W15(%esp) 1238ccd4a63SDavid du Colombier leal (WARRAY+40*4)(%esp), %edx /* aw40 */ 1248ccd4a63SDavid du Colombier movl %edx, W40(%esp) 1258ccd4a63SDavid du Colombier leal (WARRAY+60*4)(%esp), %ecx /* aw60 */ 1268ccd4a63SDavid du Colombier movl %ecx, W60(%esp) 1278ccd4a63SDavid du Colombier leal (WARRAY+80*4)(%esp), %edi /* aw80 */ 1288ccd4a63SDavid du Colombier movl %edi, W80(%esp) 1298ccd4a63SDavid du Colombier 1308ccd4a63SDavid du Colombier0: 1318ccd4a63SDavid du Colombier leal WARRAY(%esp), %ebp /* warray */ 1328ccd4a63SDavid du Colombier 1338ccd4a63SDavid du Colombier movl STATE(%esp), %edi /* state */ 1348ccd4a63SDavid du Colombier movl (%edi),%eax 1358ccd4a63SDavid du Colombier movl 4(%edi),%ebx 1368ccd4a63SDavid du Colombier movl %ebx, TMP1(%esp) /* tmp1 */ 1378ccd4a63SDavid du Colombier movl 8(%edi), %ecx 1388ccd4a63SDavid du Colombier movl 12(%edi), %edx 1398ccd4a63SDavid du Colombier movl 16(%edi), %esi 1408ccd4a63SDavid du Colombier 1418ccd4a63SDavid du Colombier movl DATA(%esp), %ebx /* data */ 1428ccd4a63SDavid du Colombier 1438ccd4a63SDavid du Colombier1: 1448ccd4a63SDavid du Colombier BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) 1458ccd4a63SDavid du Colombier movl %esi,TMP2(%esp) 1468ccd4a63SDavid du Colombier BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx) 1478ccd4a63SDavid du Colombier movl TMP1(%esp),%esi 1488ccd4a63SDavid du Colombier BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx) 1498ccd4a63SDavid du Colombier BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi) 1508ccd4a63SDavid du Colombier movl %esi,TMP1(%esp) 1518ccd4a63SDavid du Colombier BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax) 1528ccd4a63SDavid du Colombier movl TMP2(%esp),%esi 1538ccd4a63SDavid du Colombier 1548ccd4a63SDavid du Colombier addl $20, %ebx 1558ccd4a63SDavid du Colombier addl $20, %ebp 1568ccd4a63SDavid du Colombier cmpl W15(%esp), %ebp /* w15 */ 1578ccd4a63SDavid du Colombier jb 1b 1588ccd4a63SDavid du Colombier 1598ccd4a63SDavid du Colombier BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) 1608ccd4a63SDavid du Colombier addl $4, %ebx 1618ccd4a63SDavid du Colombier MOVL %ebx, DATA(%esp) /* data */ 1628ccd4a63SDavid du Colombier MOVL TMP1(%esp),%ebx 1638ccd4a63SDavid du Colombier 1648ccd4a63SDavid du Colombier BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx) 1658ccd4a63SDavid du Colombier BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx) 1668ccd4a63SDavid du Colombier BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx) 1678ccd4a63SDavid du Colombier BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax) 1688ccd4a63SDavid du Colombier 1698ccd4a63SDavid du Colombier addl $20, %ebp 1708ccd4a63SDavid du Colombier 1718ccd4a63SDavid du Colombier2: 1728ccd4a63SDavid du Colombier BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi) 1738ccd4a63SDavid du Colombier BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx) 1748ccd4a63SDavid du Colombier BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx) 1758ccd4a63SDavid du Colombier BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx) 1768ccd4a63SDavid du Colombier BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax) 1778ccd4a63SDavid du Colombier 1788ccd4a63SDavid du Colombier addl $20,%ebp 1798ccd4a63SDavid du Colombier cmpl W40(%esp), %ebp 1808ccd4a63SDavid du Colombier jb 2b 1818ccd4a63SDavid du Colombier 1828ccd4a63SDavid du Colombier3: 1838ccd4a63SDavid du Colombier BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi) 1848ccd4a63SDavid du Colombier BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx) 1858ccd4a63SDavid du Colombier BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx) 1868ccd4a63SDavid du Colombier BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx) 1878ccd4a63SDavid du Colombier BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax) 1888ccd4a63SDavid du Colombier 1898ccd4a63SDavid du Colombier addl $20, %ebp 1908ccd4a63SDavid du Colombier cmpl W60(%esp), %ebp /* w60 */ 1918ccd4a63SDavid du Colombier jb 3b 1928ccd4a63SDavid du Colombier 1938ccd4a63SDavid du Colombier4: 1948ccd4a63SDavid du Colombier BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi) 1958ccd4a63SDavid du Colombier BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx) 1968ccd4a63SDavid du Colombier BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx) 1978ccd4a63SDavid du Colombier BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx) 1988ccd4a63SDavid du Colombier BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax) 1998ccd4a63SDavid du Colombier 2008ccd4a63SDavid du Colombier addl $20, %ebp 2018ccd4a63SDavid du Colombier cmpl W80(%esp), %ebp /* w80 */ 2028ccd4a63SDavid du Colombier jb 4b 2038ccd4a63SDavid du Colombier 2048ccd4a63SDavid du Colombier movl STATE(%esp), %edi /* state */ 2058ccd4a63SDavid du Colombier addl %eax, 0(%edi) 2068ccd4a63SDavid du Colombier addl %ebx, 4(%edi) 2078ccd4a63SDavid du Colombier addl %ecx, 8(%edi) 2088ccd4a63SDavid du Colombier addl %edx, 12(%edi) 2098ccd4a63SDavid du Colombier addl %esi, 16(%edi) 2108ccd4a63SDavid du Colombier 2118ccd4a63SDavid du Colombier movl EDATA(%esp), %edi /* edata */ 2128ccd4a63SDavid du Colombier cmpl %edi, DATA(%esp) /* data */ 2138ccd4a63SDavid du Colombier jb 0b 2148ccd4a63SDavid du Colombier 2158ccd4a63SDavid du Colombier /* Postlude */ 2168ccd4a63SDavid du Colombier mov OLDEBX(%esp), %ebx 2178ccd4a63SDavid du Colombier mov OLDESI(%esp), %esi 2188ccd4a63SDavid du Colombier mov OLDEDI(%esp), %edi 2198ccd4a63SDavid du Colombier addl $(STACKSIZE), %esp 2208ccd4a63SDavid du Colombier popl %ebp 2218ccd4a63SDavid du Colombier ret 222