| .text |
| |
| .p2align 2,0x90 |
| #ifdef __Darwin__ |
| .globl __sha1block |
| __sha1block: |
| #else |
| .globl _sha1block |
| _sha1block: |
| #endif |
| |
| /* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; |
| * wp[off] = x; |
| * x += A <<< 5; |
| * E += 0xca62c1d6 + x; |
| * x = FN(B,C,D); |
| * E += x; |
| * B >>> 2 |
| */ |
| #define BSWAPDI BYTE $0x0f; BYTE $0xcf; |
| |
| #define BODY(off,FN,V,A,B,C,D,E)\ |
| movl (off-64)(%ebp), %edi;\ |
| xorl (off-56)(%ebp), %edi;\ |
| xorl (off-32)(%ebp), %edi;\ |
| xorl (off-12)(%ebp), %edi;\ |
| roll $1, %edi;\ |
| movl %edi, off(%ebp);\ |
| leal V(%edi, E, 1), E;\ |
| movl A, %edi;\ |
| roll $5, %edi;\ |
| addl %edi, E;\ |
| FN(B,C,D)\ |
| addl %edi, E;\ |
| rorl $2, B;\ |
| |
| #define BODY0(off,FN,V,A,B,C,D,E)\ |
| movl off(%ebx), %edi;\ |
| bswap %edi;\ |
| movl %edi, off(%ebp);\ |
| leal V(%edi,E,1), E;\ |
| movl A, %edi;\ |
| roll $5,%edi;\ |
| addl %edi,E;\ |
| FN(B,C,D)\ |
| addl %edi,E;\ |
| rorl $2,B;\ |
| |
| /* |
| * fn1 = (((C^D)&B)^D); |
| */ |
| #define FN1(B,C,D)\ |
| movl C, %edi;\ |
| xorl D, %edi;\ |
| andl B, %edi;\ |
| xorl D, %edi;\ |
| |
| /* |
| * fn24 = B ^ C ^ D |
| */ |
| #define FN24(B,C,D)\ |
| movl B, %edi;\ |
| xorl C, %edi;\ |
| xorl D, %edi;\ |
| |
| /* |
| * fn3 = ((B ^ C) & (D ^= B)) ^ B |
| * D ^= B to restore D |
| */ |
| #define FN3(B,C,D)\ |
| movl B, %edi;\ |
| xorl C, %edi;\ |
| xorl B, D;\ |
| andl D, %edi;\ |
| xorl B, %edi;\ |
| xorl B, D;\ |
| |
| /* |
| * stack offsets |
| * void sha1block(uchar *DATA, int LEN, ulong *STATE) |
| */ |
| #define STACKSIZE (48+80*4) |
| #define DATA (STACKSIZE+8) |
| #define LEN (STACKSIZE+12) |
| #define STATE (STACKSIZE+16) |
| |
| /* |
| * stack offsets for locals |
| * ulong w[80]; |
| * uchar *edata; |
| * ulong *w15, *w40, *w60, *w80; |
| * register local |
| * ulong *wp = %ebp |
| * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi |
| * ulong tmp = edi |
| */ |
| #define WARRAY (STACKSIZE-4-(80*4)) |
| #define TMP1 (STACKSIZE-8-(80*4)) |
| #define TMP2 (STACKSIZE-12-(80*4)) |
| #define W15 (STACKSIZE-16-(80*4)) |
| #define W40 (STACKSIZE-20-(80*4)) |
| #define W60 (STACKSIZE-24-(80*4)) |
| #define W80 (STACKSIZE-28-(80*4)) |
| #define EDATA (STACKSIZE-32-(80*4)) |
| #define OLDEBX (STACKSIZE-36-(80*4)) |
| #define OLDESI (STACKSIZE-40-(80*4)) |
| #define OLDEDI (STACKSIZE-44-(80*4)) |
| |
| /* Prelude */ |
| pushl %ebp |
| subl $(STACKSIZE), %esp |
| |
| mov %ebx, OLDEBX(%esp) |
| mov %esi, OLDESI(%esp) |
| mov %edi, OLDEDI(%esp) |
| |
| movl DATA(%esp), %eax |
| addl LEN(%esp), %eax |
| movl %eax, EDATA(%esp) |
| |
| leal (WARRAY+15*4)(%esp), %edi /* aw15 */ |
| movl %edi, W15(%esp) |
| leal (WARRAY+40*4)(%esp), %edx /* aw40 */ |
| movl %edx, W40(%esp) |
| leal (WARRAY+60*4)(%esp), %ecx /* aw60 */ |
| movl %ecx, W60(%esp) |
| leal (WARRAY+80*4)(%esp), %edi /* aw80 */ |
| movl %edi, W80(%esp) |
| |
| 0: |
| leal WARRAY(%esp), %ebp /* warray */ |
| |
| movl STATE(%esp), %edi /* state */ |
| movl (%edi),%eax |
| movl 4(%edi),%ebx |
| movl %ebx, TMP1(%esp) /* tmp1 */ |
| movl 8(%edi), %ecx |
| movl 12(%edi), %edx |
| movl 16(%edi), %esi |
| |
| movl DATA(%esp), %ebx /* data */ |
| |
| 1: |
| BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) |
| movl %esi,TMP2(%esp) |
| BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx) |
| movl TMP1(%esp),%esi |
| BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx) |
| BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi) |
| movl %esi,TMP1(%esp) |
| BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax) |
| movl TMP2(%esp),%esi |
| |
| addl $20, %ebx |
| addl $20, %ebp |
| cmpl W15(%esp), %ebp /* w15 */ |
| jb 1b |
| |
| BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) |
| addl $4, %ebx |
| movl %ebx, DATA(%esp) /* data */ |
| movl TMP1(%esp),%ebx |
| |
| BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx) |
| BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx) |
| BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx) |
| BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax) |
| |
| addl $20, %ebp |
| |
| 2: |
| BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi) |
| BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx) |
| BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx) |
| BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx) |
| BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax) |
| |
| addl $20,%ebp |
| cmpl W40(%esp), %ebp |
| jb 2b |
| |
| 3: |
| BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi) |
| BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx) |
| BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx) |
| BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx) |
| BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax) |
| |
| addl $20, %ebp |
| cmpl W60(%esp), %ebp /* w60 */ |
| jb 3b |
| |
| 4: |
| BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi) |
| BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx) |
| BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx) |
| BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx) |
| BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax) |
| |
| addl $20, %ebp |
| cmpl W80(%esp), %ebp /* w80 */ |
| jb 4b |
| |
| movl STATE(%esp), %edi /* state */ |
| addl %eax, 0(%edi) |
| addl %ebx, 4(%edi) |
| addl %ecx, 8(%edi) |
| addl %edx, 12(%edi) |
| addl %esi, 16(%edi) |
| |
| movl EDATA(%esp), %edi /* edata */ |
| cmpl %edi, DATA(%esp) /* data */ |
| jb 0b |
| |
| /* Postlude */ |
| mov OLDEBX(%esp), %ebx |
| mov OLDESI(%esp), %esi |
| mov OLDEDI(%esp), %edi |
| addl $(STACKSIZE), %esp |
| popl %ebp |
| ret |