diff --git a/hasher/asm/masm/MD4x64.asm b/hasher/asm/masm/MD4x64.asm new file mode 100644 index 000000000..2d6c48f09 --- /dev/null +++ b/hasher/asm/masm/MD4x64.asm @@ -0,0 +1,535 @@ +.code + + +MD4_x64 PROC + push rbp + push rbx + push r12 + push r13 + push r14 + push r15 + push rsi + push rdi +; parameter 1 in rcx, param 2 in rdx , param 3 in r8 + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + ;# rdi = arg #1 (ctx, MD5_CTX pointer) + ;# rsi = arg #2 (ptr, data pointer) + ;# rdx = arg #3 (nbr, number of 16-word blocks to process) + + mov rsi,rdx + mov edx,r8d + + mov r12,rcx ;# rbp = ctx + shl rdx,6 ;# rdx = nbr in bytes + push r12 + lea rdi,[rsi+rdx]; # rdi = end + + mov eax,DWORD PTR 0[r12] ;# eax = ctx->A + mov ebx,DWORD PTR 4[r12] ;# ebx = ctx->B + mov ecx,DWORD PTR 8[r12] ;# ecx = ctx->C + mov edx,DWORD PTR 12[r12] ;# edx = ctx->D + ;push rbp ;# save ctx + ;# end is 'rdi' + ;# ptr is 'rsi' + ;# A is 'eax' + ;# B is 'ebx' + ;# C is 'ecx' + ;# D is 'edx' + +; it is better with align 16 here, I don't known why +align 16 + cmp rsi,rdi ;# cmp end with ptr + mov r13d,0ffffffffh + je lab1 ;# jmp if ptr == end + + ;# BEGIN of loop over 16-word blocks +lab2: ;# save old values of A, B, C, D + mov r8d,eax + mov r9d,ebx + mov r14d,ecx + mov r15d,edx +; BEGIN of the round serie + mov r10 , QWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , edx ;/* (NEXT STEP) z' = %edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + mov r10d , [rsi] ;/* (NEXT STEP) X[1] */ + mov r11d, ecx ;/* (NEXT STEP) z' = %edx */ + mov r12d, ecx ;/* (NEXT STEP) z' = %edx */ + + lea eax,DWORD PTR 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (4*4) [rsi] ;/* (NEXT STEP) X[4] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD PTR 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (8*4) [rsi] ;/* (NEXT STEP) X[8] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD PTR 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (12*4) [rsi] ;/* (NEXT STEP) X[12] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD PTR 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (1*4) [rsi] ;/* (NEXT STEP) X[1] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + + lea eax,DWORD PTR 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (5*4) [rsi] ;/* (NEXT STEP) X[5] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD PTR 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (9*4) [rsi] ;/* (NEXT STEP) X[9] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD PTR 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (13*4) [rsi] ;/* (NEXT STEP) X[13] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD PTR 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (2*4) [rsi] ;/* (NEXT STEP) X[2] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + + lea eax,DWORD PTR 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (6*4) [rsi] ;/* (NEXT STEP) X[6] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD PTR 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (10*4) [rsi] ;/* (NEXT STEP) X[10] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD PTR 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (14*4) [rsi] ;/* (NEXT STEP) X[14] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD PTR 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (3*4) [rsi] ;/* (NEXT STEP) X[3] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + + lea eax,DWORD PTR 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (7*4) [rsi] ;/* (NEXT STEP) X[7] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD PTR 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (11*4) [rsi] ;/* (NEXT STEP) X[11] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD PTR 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (15*4) [rsi] ;/* (NEXT STEP) X[15] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD PTR 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (0*4) [rsi] ;/* (NEXT STEP) X[0] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + mov r10d , [rsi] ;/* (NEXT STEP) X[5] */ + mov r11d , ecx ;/* (NEXT STEP) y' = %ecx */ + lea eax,DWORD PTR 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD PTR 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD PTR 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD PTR 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + lea eax,DWORD PTR 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD PTR 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD PTR 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD PTR 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + lea eax,DWORD PTR 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD PTR 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD PTR 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD PTR 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + lea eax,DWORD PTR 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD PTR 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD PTR 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD PTR 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ +; # add old values of A, B, C, D + add eax,r8d + add ebx,r9d + add ecx,r14d + add edx,r15d + +; # loop control + add rsi,64 ;# ptr += 64 + cmp rsi,rdi ;# cmp end with ptr + jb lab2 ;# jmp if ptr < end +; # END of loop over 16-word blocks + +lab1: ;pop rbp ;# restore ctx +pop r12 + mov DWORD PTR 0[r12],eax ;# ctx->A = A + mov DWORD PTR 4[r12],ebx ;# ctx->B = B + mov DWORD PTR 8[r12],ecx ;# ctx->C = C + mov DWORD PTR 12[r12],edx ;# ctx->D = D + + pop rdi + pop rsi + pop r15 + pop r14 + pop r13 + pop r12 + pop rbx + pop rbp + ret +MD4_x64 ENDP +END; + diff --git a/hasher/asm/masm/MD4x86.asm b/hasher/asm/masm/MD4x86.asm new file mode 100644 index 000000000..a66b0f0a8 --- /dev/null +++ b/hasher/asm/masm/MD4x86.asm @@ -0,0 +1,261 @@ +; ##################################################################################################################### +; +; MD4_asm.asm +; +; Copyright (c) Shareaza Development Team, 2002-2007. +; This file is part of SHAREAZA (shareaza.sourceforge.net) +; +; Shareaza is free software; you can redistribute it +; and/or modify it under the terms of the GNU General Public License +; as published by the Free Software Foundation; either version 2 of +; the License, or (at your option) any later version. +; +; Shareaza is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with Shareaza; if not, write to the Free Software +; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +; +; ##################################################################################################################### +; +; MD4_asm - Implementation of MD4 for x86 - use together with MD4.cpp and MD4.h +; +; ##################################################################################################################### + + .586p + .model flat, stdcall + option casemap:none ; case sensitive + option prologue:none ; we generate our own entry/exit code + option epilogue:none + +; ##################################################################################################################### + +m_nCount0 equ 0 +m_nCount1 equ 4 + +m_nState0 equ 8 ; offsets as found in MD4.h +m_nState1 equ 12 +m_nState2 equ 16 +m_nState3 equ 20 + +m_pBuffer equ 24 + +; Some magic numbers for Transform... +MD4_S11 equ 3 +MD4_S12 equ 7 +MD4_S13 equ 11 +MD4_S14 equ 19 + +MD4_S21 equ 3 +MD4_S22 equ 5 +MD4_S23 equ 9 +MD4_S24 equ 13 + +MD4_S31 equ 3 +MD4_S32 equ 9 +MD4_S33 equ 11 +MD4_S34 equ 15 + + .data + +MD4FF MACRO count:REQ,s:REQ +; a = (a+x[count]+((b&c)|(~b&d)))rol s +; a = (a+x[count]+(d^(b&(c^d))))rol s + mov reg_temp1, reg_c + xor reg_c, reg_d + add reg_a, [ebp+count*4] + and reg_c, reg_b + xor reg_c, reg_d + add reg_a, reg_c + rol reg_a, s +reg_t textequ reg_d +reg_d textequ reg_temp1 +reg_temp1 textequ reg_c +reg_c textequ reg_b +reg_b textequ reg_a +reg_a textequ reg_t + ENDM + +MD4GG MACRO count:REQ,s:REQ +; a = (a+x[count]+((b&c)|(b&d)|(c&d))+5A827999H) rol s +; a = (a+x[count]+((b&c)|(d&(b|c)))+5A827999H)rol s + mov reg_temp2, reg_b + mov reg_temp1, reg_b + add reg_a, [ebp+count*4] + or reg_b, reg_c + and reg_temp2, reg_c + and reg_b, reg_d + add reg_a, 5A827999H + or reg_b, reg_temp2 + add reg_a, reg_b + rol reg_a, s +reg_t textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_temp1 +reg_temp1 textequ reg_b +reg_b textequ reg_a +reg_a textequ reg_t + ENDM + +MD4HH MACRO count:REQ,s:REQ +; a = (a+x[count]+(b^c^d)+6ED9EBA1H)rol s + add reg_a, [ebp+count*4] + mov reg_temp1, reg_b + xor reg_b, reg_c + add reg_a, 6ED9EBA1H + xor reg_b, reg_d + add reg_a, reg_b + rol reg_a, s +reg_t textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_temp1 +reg_temp1 textequ reg_b +reg_b textequ reg_a +reg_a textequ reg_t + ENDM + + .code + +MD4_Transform_p5 PROC ; we expect ebp to point to the Data stream + ; all other registers (eax,ebx,ecx,edx,esi,edi) will be destroyed +__this textequ <[esp+32+2*4]> ; 1*pusha+2*call +; set alias for registers +reg_a textequ +reg_b textequ +reg_c textequ +reg_d textequ +reg_temp1 textequ +reg_temp2 textequ + mov reg_temp1, __this + mov reg_a, [reg_temp1+m_nState0] + mov reg_b, [reg_temp1+m_nState1] + mov reg_c, [reg_temp1+m_nState2] + mov reg_d, [reg_temp1+m_nState3] +; round 1 + MD4FF 0, MD4_S11 + MD4FF 1, MD4_S12 + MD4FF 2, MD4_S13 + MD4FF 3, MD4_S14 + MD4FF 4, MD4_S11 + MD4FF 5, MD4_S12 + MD4FF 6, MD4_S13 + MD4FF 7, MD4_S14 + MD4FF 8, MD4_S11 + MD4FF 9, MD4_S12 + MD4FF 10, MD4_S13 + MD4FF 11, MD4_S14 + MD4FF 12, MD4_S11 + MD4FF 13, MD4_S12 + MD4FF 14, MD4_S13 + MD4FF 15, MD4_S14 +; round 2 + MD4GG 0, MD4_S21 + MD4GG 4, MD4_S22 + MD4GG 8, MD4_S23 + MD4GG 12, MD4_S24 + MD4GG 1, MD4_S21 + MD4GG 5, MD4_S22 + MD4GG 9, MD4_S23 + MD4GG 13, MD4_S24 + MD4GG 2, MD4_S21 + MD4GG 6, MD4_S22 + MD4GG 10, MD4_S23 + MD4GG 14, MD4_S24 + MD4GG 3, MD4_S21 + MD4GG 7, MD4_S22 + MD4GG 11, MD4_S23 + MD4GG 15, MD4_S24 +; round 3 + MD4HH 0, MD4_S31 + MD4HH 8, MD4_S32 + MD4HH 4, MD4_S33 + MD4HH 12, MD4_S34 + MD4HH 2, MD4_S31 + MD4HH 10, MD4_S32 + MD4HH 6, MD4_S33 + MD4HH 14, MD4_S34 + MD4HH 1, MD4_S31 + MD4HH 9, MD4_S32 + MD4HH 5, MD4_S33 + MD4HH 13, MD4_S34 + MD4HH 3, MD4_S31 + MD4HH 11, MD4_S32 + MD4HH 7, MD4_S33 + MD4HH 15, MD4_S34 + mov reg_temp1, __this + add [reg_temp1+m_nState0], reg_a + add [reg_temp1+m_nState1], reg_b + add [reg_temp1+m_nState2], reg_c + add [reg_temp1+m_nState3], reg_d + ret +MD4_Transform_p5 ENDP + +MD4_Add_p5 PROC PUBLIC, _this:DWORD, _Data:DWORD, _nLength:DWORD + + pusha +__this textequ <[esp+36]> ; different offset due to pusha +__Data textequ <[esp+40]> +__nLength textequ <[esp+44]> + + mov ecx, __nLength + and ecx, ecx + jz get_out + xor edx, edx + mov ebp, __Data + mov edi, __this + mov ebx, [edi+m_nCount0] + mov eax, ebx + add ebx, ecx + mov [edi+m_nCount0], ebx + adc [edi+m_nCount1], edx + + and eax, 63 + jnz partial_buffer +full_blocks: mov ecx, __nLength + and ecx, ecx + jz get_out + sub ecx, 64 + jb end_of_stream + mov __nLength, ecx + call MD4_Transform_p5 + add ebp, 64 + jmp full_blocks + +end_of_stream: mov edi, __this + mov esi, ebp + lea edi, [edi+m_pBuffer] + add ecx, 64 + rep movsb + jmp get_out + +partial_buffer: add ecx, eax ; eax = offset in buffer, ecx = _nLength + cmp ecx, 64 + jb short_stream ; we can't fill the buffer + mov ecx, -64 + add ecx, eax + add __nLength, ecx ; _nlength += (offset-64) +@@: mov bl, [ebp] + inc ebp + mov byte ptr [edi+m_pBuffer+64+ecx], bl + inc ecx + jnz @B ; offset = 64 + mov __Data, ebp + lea ebp, [edi+m_pBuffer] + call MD4_Transform_p5 + mov ebp, __Data + jmp full_blocks + +short_stream: sub ecx, eax ; --> ecx=_nLength + mov esi, ebp + lea edi, [edi+m_pBuffer+eax] + rep movsb + +get_out: popa + ret 12 + +MD4_Add_p5 ENDP + + end \ No newline at end of file diff --git a/hasher/asm/masm/MD5x64.asm b/hasher/asm/masm/MD5x64.asm new file mode 100644 index 000000000..eaa1f69c7 --- /dev/null +++ b/hasher/asm/masm/MD5x64.asm @@ -0,0 +1,825 @@ + +; to compile this file, I use option +; ml64.exe /Flm5n64 /c /Zi m5n64.asm +; with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK +; +; (you can get Windows 2003 server DDK with ml64 and cl for AMD64 from +; http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) +; +.code + + +MD5_x64 PROC + push rbp + push rbx + push r12 + push r13 + push r14 + push r15 + push rsi + push rdi +; parameter 1 in rcx, param 2 in rdx , param 3 in r8 + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + ;# rdi = arg #1 (ctx, MD5_CTX pointer) + ;# rsi = arg #2 (ptr, data pointer) + ;# rdx = arg #3 (nbr, number of 16-word blocks to process) + + mov rsi,rdx + mov edx,r8d + + mov r12,rcx ;# rbp = ctx + shl rdx,6 ;# rdx = nbr in bytes + push r12 + lea rdi,[rsi+rdx]; # rdi = end + + mov eax,DWORD PTR 0[r12] ;# eax = ctx->A + mov ebx,DWORD PTR 4[r12] ;# ebx = ctx->B + mov ecx,DWORD PTR 8[r12] ;# ecx = ctx->C + mov edx,DWORD PTR 12[r12] ;# edx = ctx->D + ;push rbp ;# save ctx + ;# end is 'rdi' + ;# ptr is 'rsi' + ;# A is 'eax' + ;# B is 'ebx' + ;# C is 'ecx' + ;# D is 'edx' + +; it is better with align 16 here, I don't known why +align 16 + cmp rsi,rdi ;# cmp end with ptr + mov r13d,0ffffffffh + je lab1 ;# jmp if ptr == end + + ;# BEGIN of loop over 16-word blocks +lab2: ;# save old values of A, B, C, D + mov r8d,eax + mov r9d,ebx + mov r14d,ecx + mov r15d,edx +; BEGIN of the round serie + mov r10 , QWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , edx ;/* (NEXT STEP) z' = %edx */ + + xor r11d,ecx ;/* y ^ ... */ + lea eax,DWORD PTR 0d76aa478h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD PTR 0e8c7b756h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD PTR 0242070dbh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + + lea ebx,DWORD PTR 0c1bdceeeh [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + xor r11d,ecx ;/* y ^ ... */ + + lea eax,DWORD PTR 0f57c0fafh [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD PTR 04787c62ah [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD PTR 0a8304613h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + lea ebx,DWORD PTR 0fd469501h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + xor r11d,ecx ;/* y ^ ... */ + lea eax,DWORD PTR 0698098d8h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD PTR 08b44f7afh [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD PTR 0ffff5bb1h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + lea ebx,DWORD PTR 0895cd7beh [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + xor r11d,ecx ;/* y ^ ... */ + lea eax,DWORD PTR 06b901122h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD PTR 0fd987193h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD PTR (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD PTR 0a679438eh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD PTR (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + lea ebx,DWORD PTR 049b40821h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + mov r10d , 4 [rsi] ;/* (NEXT STEP) X[1] */ + mov r11d, edx ;/* (NEXT STEP) z' = %edx */ + mov r12d, edx ;/* (NEXT STEP) z' = %edx */ + not r11d + lea eax,DWORD PTR 0f61e2562h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (6*4) [rsi] ;/* (NEXT STEP) X[6] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD PTR 0c040b340h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (11*4) [rsi] ;/* (NEXT STEP) X[11] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD PTR 0265e5a51h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (0*4) [rsi] ;/* (NEXT STEP) X[0] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD PTR 0e9b6c7aah [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (5*4) [rsi] ;/* (NEXT STEP) X[5] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + not r11d + lea eax,DWORD PTR 0d62f105dh [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (10*4) [rsi] ;/* (NEXT STEP) X[10] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD PTR 02441453h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (15*4) [rsi] ;/* (NEXT STEP) X[15] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD PTR 0d8a1e681h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (4*4) [rsi] ;/* (NEXT STEP) X[4] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD PTR 0e7d3fbc8h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (9*4) [rsi] ;/* (NEXT STEP) X[9] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + not r11d + lea eax,DWORD PTR 021e1cde6h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (14*4) [rsi] ;/* (NEXT STEP) X[14] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD PTR 0c33707d6h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (3*4) [rsi] ;/* (NEXT STEP) X[3] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD PTR 0f4d50d87h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (8*4) [rsi] ;/* (NEXT STEP) X[8] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD PTR 0455a14edh [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (13*4) [rsi] ;/* (NEXT STEP) X[13] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + not r11d + lea eax,DWORD PTR 0a9e3e905h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (2*4) [rsi] ;/* (NEXT STEP) X[2] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD PTR 0fcefa3f8h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (7*4) [rsi] ;/* (NEXT STEP) X[7] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD PTR 0676f02d9h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (12*4) [rsi] ;/* (NEXT STEP) X[12] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD PTR 08d2a4c8ah [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (0*4) [rsi] ;/* (NEXT STEP) X[0] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + mov r10d , (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + mov r11d , ecx ;/* (NEXT STEP) y' = %ecx */ + lea eax,DWORD PTR 0fffa3942h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 08771f681h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 06d9d6122h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 0fde5380ch [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD PTR 0a4beea44h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 04bdecfa9h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 0f6bb4b60h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 0bebfbc70h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD PTR 0289b7ec6h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 0eaa127fah [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 0d4ef3085h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 04881d05h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD PTR 0d9d4d039h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 0e6db99e5h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 01fa27cf8h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 0c4ac5665h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + mov r10d , (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , r13d ;0ffffffffh ;%r11d + xor r11d , edx ;/* (NEXT STEP) not z' = not %edx*/ + lea eax,DWORD PTR 0f4292244h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 0432aff97h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 0ab9423a7h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 0fc93a039h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD PTR 0655b59c3h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 08f0ccc92h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 0ffeff47dh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 085845dd1h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD PTR 06fa87e4fh [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 0fe2ce6e0h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 0a3014314h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 04e0811a1h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD PTR 0f7537e82h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD PTR 0bd3af235h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD PTR 02ad7d2bbh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD PTR 0eb86d391h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD PTR (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ +; # add old values of A, B, C, D + add eax,r8d + add ebx,r9d + add ecx,r14d + add edx,r15d + +; # loop control + add rsi,64 ;# ptr += 64 + cmp rsi,rdi ;# cmp end with ptr + jb lab2 ;# jmp if ptr < end +; # END of loop over 16-word blocks + +lab1: ;pop rbp ;# restore ctx +pop r12 + mov DWORD PTR 0[r12],eax ;# ctx->A = A + mov DWORD PTR 4[r12],ebx ;# ctx->B = B + mov DWORD PTR 8[r12],ecx ;# ctx->C = C + mov DWORD PTR 12[r12],edx ;# ctx->D = D + + pop rdi + pop rsi + pop r15 + pop r14 + pop r13 + pop r12 + pop rbx + pop rbp + ret +MD5_x64 ENDP +END; + diff --git a/hasher/asm/masm/MD5x86.asm b/hasher/asm/masm/MD5x86.asm new file mode 100644 index 000000000..42de94df0 --- /dev/null +++ b/hasher/asm/masm/MD5x86.asm @@ -0,0 +1,304 @@ +; ##################################################################################################################### +; +; MD5_asm.asm +; +; Copyright (c) Shareaza Development Team, 2002-2007. +; This file is part of SHAREAZA (shareaza.sourceforge.net) +; +; Shareaza is free software; you can redistribute it +; and/or modify it under the terms of the GNU General Public License +; as published by the Free Software Foundation; either version 2 of +; the License, or (at your option) any later version. +; +; Shareaza is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with Shareaza; if not, write to the Free Software +; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +; +; ##################################################################################################################### +; +; MD5_asm - Implementation of MD5 for x86 - use together with MD5.cpp and MD5.h +; +; ##################################################################################################################### + + .586p + .model flat, stdcall + option casemap:none ; case sensitive + option prologue:none ; we generate our own entry/exit code + option epilogue:none + +; ##################################################################################################################### + + +m_nCount0 equ 0 +m_nCount1 equ 4 + +m_nState0 equ 8 ; offsets as laid out in MD5.h +m_nState1 equ 12 +m_nState2 equ 16 +m_nState3 equ 20 + +m_pBuffer equ 24 + +; Some magic numbers for Transform... +MD5_S11 equ 7 +MD5_S12 equ 12 +MD5_S13 equ 17 +MD5_S14 equ 22 +MD5_S21 equ 5 +MD5_S22 equ 9 +MD5_S23 equ 14 +MD5_S24 equ 20 +MD5_S31 equ 4 +MD5_S32 equ 11 +MD5_S33 equ 16 +MD5_S34 equ 23 + +MD5_S41 equ 6 +MD5_S42 equ 10 +MD5_S43 equ 15 +MD5_S44 equ 21 + +MD5FF MACRO count:REQ,s:REQ,ac:REQ +; a = b+(a+x[count]+ac+((b&c)|(~b&d)))rol s +; a = b+(a+x[count]+ax+(d^(b&(c^d))))rol s + mov reg_temp1, reg_c +reg_t textequ reg_temp1 +reg_temp1 textequ reg_c +reg_c textequ reg_t + xor reg_temp1, reg_d + add reg_a, [reg_base+count*4] + and reg_temp1, reg_b + add reg_a, ac + xor reg_temp1, reg_d + add reg_a, reg_temp1 + rol reg_a, s + add reg_a, reg_b +reg_t textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_b +reg_b textequ reg_a +reg_a textequ reg_t + ENDM + + +MD5GG MACRO count:REQ,s:REQ,ac:REQ +; a = b+(a+x[count]+ac+((d&b)|(~d&c)))rol s +; a = b+(a+x[count]+ac+(c^(d&(b^c))))rols s + mov reg_temp1, reg_b +reg_t textequ reg_temp1 +reg_temp1 textequ reg_b +reg_b textequ reg_t + xor reg_temp1, reg_c + add reg_a, [reg_base+count*4] + and reg_temp1, reg_d + add reg_a, ac + xor reg_temp1, reg_c + add reg_a, reg_temp1 + rol reg_a, s + add reg_a, reg_b +reg_t textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_b +reg_b textequ reg_a +reg_a textequ reg_t + ENDM + +MD5HH MACRO count:REQ,s:REQ,ac:REQ +; a = b+(a+x[count]+ac+(b^c^d)) rol s + mov reg_temp1, reg_b +reg_t textequ reg_temp1 +reg_temp1 textequ reg_b +reg_b textequ reg_t + xor reg_temp1, reg_c + add reg_a, [reg_base+count*4] + xor reg_temp1, reg_d + add reg_a, ac + add reg_a, reg_temp1 + rol reg_a, s + add reg_a, reg_b +reg_t textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_b +reg_b textequ reg_a +reg_a textequ reg_t + ENDM + +MD5II MACRO count:REQ,s:REQ,ac:REQ +; a = b+(a+x[count]+ac+(c^(~d|b))) rol s + mov reg_temp1, reg_d +reg_t textequ reg_temp1 +reg_temp1 textequ reg_d +reg_d textequ reg_t + not reg_temp1 + add reg_a, [reg_base+count*4] + or reg_temp1, reg_b + add reg_a, ac + xor reg_temp1, reg_c + add reg_a, reg_temp1 + rol reg_a, s + add reg_a, reg_b +reg_t textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_b +reg_b textequ reg_a +reg_a textequ reg_t + ENDM + + .code + +MD5_Transform_p5 PROC ; we expect ebp to point to the Data stream + ; all other registers (eax,ebx,ecx,edx,esi,edi) will be destroyed +__this textequ <[esp+32+2*4]> ; 1*pusha+2*call + +; set alias for registers +reg_a textequ +reg_b textequ +reg_c textequ +reg_d textequ +reg_temp1 textequ +reg_temp2 textequ +reg_base textequ + mov reg_temp2, __this + mov reg_a, [reg_temp2+m_nState0] + mov reg_b, [reg_temp2+m_nState1] + mov reg_c, [reg_temp2+m_nState2] + mov reg_d, [reg_temp2+m_nState3] +; round 1 + MD5FF 0, MD5_S11,0D76AA478H ; 1 + MD5FF 1, MD5_S12,0E8C7B756H ; 2 + MD5FF 2, MD5_S13, 242070DBH ; 3 + MD5FF 3, MD5_S14,0C1BDCEEEH ; 4 + MD5FF 4, MD5_S11,0F57C0FAFH ; 5 + MD5FF 5, MD5_S12, 4787C62AH ; 6 + MD5FF 6, MD5_S13,0A8304613H ; 7 + MD5FF 7, MD5_S14,0FD469501H ; 8 + MD5FF 8, MD5_S11, 698098D8H ; 9 + MD5FF 9, MD5_S12, 8B44F7AFH ; 10 + MD5FF 10, MD5_S13,0FFFF5BB1H ; 11 + MD5FF 11, MD5_S14, 895CD7BEH ; 12 + MD5FF 12, MD5_S11, 6B901122H ; 13 + MD5FF 13, MD5_S12,0FD987193H ; 14 + MD5FF 14, MD5_S13,0A679438EH ; 15 + MD5FF 15, MD5_S14, 49B40821H ; 16 +; round 2 + MD5GG 1, MD5_S21,0F61E2562H ; 17 + MD5GG 6, MD5_S22,0C040B340H ; 18 + MD5GG 11, MD5_S23, 265E5A51H ; 19 + MD5GG 0, MD5_S24,0E9B6C7AAH ; 20 + MD5GG 5, MD5_S21,0D62F105DH ; 21 + MD5GG 10, MD5_S22, 2441453H ; 22 + MD5GG 15, MD5_S23,0D8A1E681H ; 23 + MD5GG 4, MD5_S24,0E7D3FBC8H ; 24 + MD5GG 9, MD5_S21, 21E1CDE6H ; 25 + MD5GG 14, MD5_S22,0C33707D6H ; 26 + MD5GG 3, MD5_S23,0F4D50D87H ; 27 + MD5GG 8, MD5_S24, 455A14EDH ; 28 + MD5GG 13, MD5_S21,0A9E3E905H ; 29 + MD5GG 2, MD5_S22,0FCEFA3F8H ; 30 + MD5GG 7, MD5_S23, 676F02D9H ; 31 + MD5GG 12, MD5_S24, 8D2A4C8AH ; 32 +; round 3 + MD5HH 5, MD5_S31,0FFFA3942H ; 33 + MD5HH 8, MD5_S32, 8771F681H ; 34 + MD5HH 11, MD5_S33, 6D9D6122H ; 35 + MD5HH 14, MD5_S34,0FDE5380CH ; 36 + MD5HH 1, MD5_S31,0A4BEEA44H ; 37 + MD5HH 4, MD5_S32, 4BDECFA9H ; 38 + MD5HH 7, MD5_S33,0F6BB4B60H ; 39 + MD5HH 10, MD5_S34,0BEBFBC70H ; 40 + MD5HH 13, MD5_S31, 289B7EC6H ; 41 + MD5HH 0, MD5_S32,0EAA127FAH ; 42 + MD5HH 3, MD5_S33,0D4EF3085H ; 43 + MD5HH 6, MD5_S34, 4881D05H ; 44 + MD5HH 9, MD5_S31,0D9D4D039H ; 45 + MD5HH 12, MD5_S32,0E6DB99E5H ; 46 + MD5HH 15, MD5_S33, 1FA27CF8H ; 47 + MD5HH 2, MD5_S34,0C4AC5665H ; 48 +; round 4 + MD5II 0, MD5_S41,0F4292244H ; 49 + MD5II 7, MD5_S42, 432AFF97H ; 50 + MD5II 14, MD5_S43,0AB9423A7H ; 51 + MD5II 5, MD5_S44,0FC93A039H ; 52 + MD5II 12, MD5_S41, 655B59C3H ; 53 + MD5II 3, MD5_S42, 8F0CCC92H ; 54 + MD5II 10, MD5_S43,0FFEFF47DH ; 55 + MD5II 1, MD5_S44, 85845DD1H ; 56 + MD5II 8, MD5_S41, 6FA87E4FH ; 57 + MD5II 15, MD5_S42,0FE2CE6E0H ; 58 + MD5II 6, MD5_S43,0A3014314H ; 59 + MD5II 13, MD5_S44, 4E0811A1H ; 60 + MD5II 4, MD5_S41,0F7537E82H ; 61 + MD5II 11, MD5_S42,0BD3AF235H ; 62 + MD5II 2, MD5_S43, 2AD7D2BBH ; 63 + MD5II 9, MD5_S44,0EB86D391H ; 64 + add [reg_temp2+m_nState0], reg_a + add [reg_temp2+m_nState1], reg_b + add [reg_temp2+m_nState2], reg_c + add [reg_temp2+m_nState3], reg_d + ret +MD5_Transform_p5 ENDP + +MD5_Add_p5 PROC PUBLIC, _this:DWORD, _Data:DWORD, _nLength:DWORD + pusha +__this textequ <[esp+36]> ; different offset due to pusha +__Data textequ <[esp+40]> +__nLength textequ <[esp+44]> + mov ecx, __nLength + and ecx, ecx + jz get_out + xor edx, edx + mov ebp, __Data + mov edi, __this + mov ebx, [edi+m_nCount0] + mov eax, ebx + add ebx, ecx + mov [edi+m_nCount0], ebx + adc [edi+m_nCount1], edx + and eax, 63 + jnz partial_buffer +full_blocks: mov ecx, __nLength + and ecx, ecx + jz get_out + sub ecx, 64 + jb end_of_stream + mov __nLength, ecx + call MD5_Transform_p5 + add ebp, 64 + jmp full_blocks +end_of_stream: mov edi, __this + mov esi, ebp + lea edi, [edi+m_pBuffer] + add ecx, 64 + rep movsb + jmp get_out +partial_buffer: add ecx, eax ; eax = offset in buffer, ecx = _nLength + cmp ecx, 64 + jb short_stream ; we can't fill the buffer + mov ecx, -64 + add ecx, eax + add __nLength, ecx ; _nlength += (offset-64) +@@: mov bl, [ebp] + inc ebp + mov byte ptr [edi+m_pBuffer+64+ecx], bl + inc ecx + jnz @B ; offset = 64 + mov __Data, ebp + lea ebp, [edi+m_pBuffer] + call MD5_Transform_p5 + mov ebp, __Data + jmp full_blocks +short_stream: sub ecx, eax ; --> ecx=_nLength + mov esi, ebp + lea edi, [edi+m_pBuffer+eax] + rep movsb +get_out: popa + ret 12 + +MD5_Add_p5 ENDP + + end diff --git a/hasher/asm/masm/SHA1x64.asm b/hasher/asm/masm/SHA1x64.asm new file mode 100644 index 000000000..accdacd76 --- /dev/null +++ b/hasher/asm/masm/SHA1x64.asm @@ -0,0 +1,1580 @@ + ; Don't even think of reading this code + ; It was automatically generated by sha1-586.pl + ; Which is a perl program used to generate the x86 assember for + ; any of ELF, a.out, COFF, Win32, ... + ; eric + ; +; TITLE sha1-586.asm +; .486 +;.model FLAT +;_TEXT$ SEGMENT PAGE 'CODE' +;PUBLIC _sha1_block_asm_data_order + + +; void sha1_block_host_order (SHA_CTX *c, const void *p,size_t num); +; void sha1_block_data_order (SHA_CTX *c, const void *p,size_t num); +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. +; param on rcx, rdx, r8 and r9 + +; 32 bits : num=[esp+12], p=[esp+8], c=[esp+4] +.code +sha1_block_asm_data_order PROC + +push rdi +push rsi +push rbx +push rbp + + +push r12 +push r13 +push r14 +push r15 +mov r9,rcx + +; c = rcx +; p = rdx +; num = r8 + + shl r8, 6 + mov r11,rdx + + add r8, r11 + mov rbp, rcx + + mov edx, DWORD PTR 12[rbp] + sub rsp, 120 + mov edi, DWORD PTR 16[rbp] + mov ebx, DWORD PTR 8[rbp] + mov QWORD PTR 112[rsp],r8 + ; First we need to setup the X array +$L000start: + ; First, load the words onto the stack in network byte order + mov r12d, DWORD PTR [r11] + mov r13d, DWORD PTR 4[r11] + bswap r12d + bswap r13d + + mov r14d, DWORD PTR 8[r11] + mov r15d, DWORD PTR 12[r11] + bswap r14d + bswap r15d + + mov r10d, DWORD PTR 16[r11] + mov r8d, DWORD PTR 20[r11] + bswap r10d + bswap r8d + + mov eax, DWORD PTR 24[r11] + mov ecx, DWORD PTR 28[r11] + bswap eax + bswap ecx + mov DWORD PTR 24[rsp],eax + mov DWORD PTR 28[rsp],ecx + mov eax, DWORD PTR 32[r11] + mov ecx, DWORD PTR 36[r11] + bswap eax + bswap ecx + mov DWORD PTR 32[rsp],eax + mov DWORD PTR 36[rsp],ecx + mov eax, DWORD PTR 40[r11] + mov ecx, DWORD PTR 44[r11] + bswap eax + bswap ecx + mov DWORD PTR 40[rsp],eax + mov DWORD PTR 44[rsp],ecx + mov eax, DWORD PTR 48[r11] + mov ecx, DWORD PTR 52[r11] + bswap eax + bswap ecx + mov DWORD PTR 48[rsp],eax + mov DWORD PTR 52[rsp],ecx + mov eax, DWORD PTR 56[r11] + mov ecx, DWORD PTR 60[r11] + bswap eax + bswap ecx + mov DWORD PTR 56[rsp],eax + mov DWORD PTR 60[rsp],ecx + ; We now have the X array on the stack + ; starting at sp-4 + ;;;;;mov DWORD PTR 132[rsp],esi + +$L001shortcut:: + ; + ; Start processing + mov eax, DWORD PTR [r9] + mov ecx, DWORD PTR 4[r9] + ; 00_15 0 + mov esi, ebx + mov ebp, eax + rol ebp, 5 + xor esi, edx + and esi, ecx + add ebp, edi +; mov edi, r12d + xor esi, edx + ror ecx, 2 + lea ebp, DWORD PTR 1518500249[r12d*1+ebp] + add ebp, esi + ; 00_15 1 + mov edi, ecx + mov esi, ebp + rol ebp, 5 + xor edi, ebx + and edi, eax + add ebp, edx +; mov edx, r13d + xor edi, ebx + ror eax, 2 + lea ebp, DWORD PTR 1518500249[r13d*1+ebp] + add ebp, edi + ; 00_15 2 + mov edx, eax + mov edi, ebp + rol ebp, 5 + xor edx, ecx + and edx, esi + add ebp, ebx +; mov ebx, r14d + xor edx, ecx + ror esi, 2 + lea ebp, DWORD PTR 1518500249[r14d*1+ebp] + add ebp, edx + ; 00_15 3 + mov ebx, esi + mov edx, ebp + rol ebp, 5 + xor ebx, eax + and ebx, edi + add ebp, ecx + mov ecx, r15d + xor ebx, eax + ror edi, 2 + lea ebp, DWORD PTR 1518500249[ecx*1+ebp] + add ebp, ebx + ; 00_15 4 + mov ecx, edi + mov ebx, ebp + rol ebp, 5 + xor ecx, esi + and ecx, edx + add ebp, eax + mov eax, r10d + xor ecx, esi + ror edx, 2 + lea ebp, DWORD PTR 1518500249[eax*1+ebp] + add ebp, ecx + ; 00_15 5 + mov eax, edx + mov ecx, ebp + rol ebp, 5 + xor eax, edi + and eax, ebx + add ebp, esi + mov esi, r8d + xor eax, edi + ror ebx, 2 + lea ebp, DWORD PTR 1518500249[esi*1+ebp] + add ebp, eax + ; 00_15 6 + mov esi, ebx + mov eax, ebp + rol ebp, 5 + xor esi, edx + and esi, ecx + add ebp, edi + mov edi, DWORD PTR 24[rsp] + xor esi, edx + ror ecx, 2 + lea ebp, DWORD PTR 1518500249[edi*1+ebp] + add ebp, esi + ; 00_15 7 + mov edi, ecx + mov esi, ebp + rol ebp, 5 + xor edi, ebx + and edi, eax + add ebp, edx + mov edx, DWORD PTR 28[rsp] + xor edi, ebx + ror eax, 2 + lea ebp, DWORD PTR 1518500249[edx*1+ebp] + add ebp, edi + ; 00_15 8 + mov edx, eax + mov edi, ebp + rol ebp, 5 + xor edx, ecx + and edx, esi + add ebp, ebx + mov ebx, DWORD PTR 32[rsp] + xor edx, ecx + ror esi, 2 + lea ebp, DWORD PTR 1518500249[ebx*1+ebp] + add ebp, edx + ; 00_15 9 + mov ebx, esi + mov edx, ebp + rol ebp, 5 + xor ebx, eax + and ebx, edi + add ebp, ecx + mov ecx, DWORD PTR 36[rsp] + xor ebx, eax + ror edi, 2 + lea ebp, DWORD PTR 1518500249[ecx*1+ebp] + add ebp, ebx + ; 00_15 10 + mov ecx, edi + mov ebx, ebp + rol ebp, 5 + xor ecx, esi + and ecx, edx + add ebp, eax + mov eax, DWORD PTR 40[rsp] + xor ecx, esi + ror edx, 2 + lea ebp, DWORD PTR 1518500249[eax*1+ebp] + add ebp, ecx + ; 00_15 11 + mov eax, edx + mov ecx, ebp + rol ebp, 5 + xor eax, edi + and eax, ebx + add ebp, esi + mov esi, DWORD PTR 44[rsp] + xor eax, edi + ror ebx, 2 + lea ebp, DWORD PTR 1518500249[esi*1+ebp] + add ebp, eax + ; 00_15 12 + mov esi, ebx + mov eax, ebp + rol ebp, 5 + xor esi, edx + and esi, ecx + add ebp, edi + mov edi, DWORD PTR 48[rsp] + xor esi, edx + ror ecx, 2 + lea ebp, DWORD PTR 1518500249[edi*1+ebp] + add ebp, esi + ; 00_15 13 + mov edi, ecx + mov esi, ebp + rol ebp, 5 + xor edi, ebx + and edi, eax + add ebp, edx + mov edx, DWORD PTR 52[rsp] + xor edi, ebx + ror eax, 2 + lea ebp, DWORD PTR 1518500249[edx*1+ebp] + add ebp, edi + ; 00_15 14 + mov edx, eax + mov edi, ebp + rol ebp, 5 + xor edx, ecx + and edx, esi + add ebp, ebx + mov ebx, DWORD PTR 56[rsp] + xor edx, ecx + ror esi, 2 + lea ebp, DWORD PTR 1518500249[ebx*1+ebp] + add ebp, edx + ; 00_15 15 + mov ebx, esi + mov edx, ebp + rol ebp, 5 + xor ebx, eax + and ebx, edi + add ebp, ecx + mov ecx, DWORD PTR 60[rsp] + xor ebx, eax + ror edi, 2 + lea ebp, DWORD PTR 1518500249[ecx*1+ebp] + add ebx, ebp + ; 16_19 16 + mov ecx, r14d + mov ebp, edi + xor ecx, r12d + xor ebp, esi + xor ecx, DWORD PTR 32[rsp] + and ebp, edx + ror edx, 2 + xor ecx, DWORD PTR 52[rsp] + rol ecx, 1 + xor ebp, esi + mov r12d,ecx + lea ecx, DWORD PTR 1518500249[eax*1+ecx] + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 16_19 17 + mov eax, r15d + mov ebp, edx + xor eax, r13d + xor ebp, edi + xor eax, DWORD PTR 36[rsp] + and ebp, ebx + ror ebx, 2 + xor eax, DWORD PTR 56[rsp] + rol eax, 1 + xor ebp, edi + mov r13d,eax + lea eax, DWORD PTR 1518500249[esi*1+eax] + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 16_19 18 + mov esi, r10d + mov ebp, ebx + xor esi, r14d + xor ebp, edx + xor esi, DWORD PTR 40[rsp] + and ebp, ecx + ror ecx, 2 + xor esi, DWORD PTR 60[rsp] + rol esi, 1 + xor ebp, edx + mov r14d,esi + lea esi, DWORD PTR 1518500249[edi*1+esi] + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 16_19 19 + mov edi, r8d + mov ebp, ecx + xor edi, r15d + xor ebp, ebx + xor edi, DWORD PTR 44[rsp] + and ebp, eax + ror eax, 2 + xor edi, r12d + rol edi, 1 + xor ebp, ebx + mov r15d,edi + lea edi, DWORD PTR 1518500249[edx*1+edi] + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 20_39 20 + mov ebp, esi + mov edx, r10d + ror esi, 2 + xor edx, DWORD PTR 24[rsp] + xor ebp, eax + xor edx, DWORD PTR 48[rsp] + xor ebp, ecx + xor edx, r13d + rol edx, 1 + add ebp, ebx + mov r10d,edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD PTR 1859775393[ebp*1+edx] + add edx, ebx + ; 20_39 21 + mov ebp, edi + mov ebx, r8d + ror edi, 2 + xor ebx, DWORD PTR 28[rsp] + xor ebp, esi + xor ebx, DWORD PTR 52[rsp] + xor ebp, eax + xor ebx, r14d + rol ebx, 1 + add ebp, ecx + mov r8d,ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD PTR 1859775393[ebp*1+ebx] + add ebx, ecx + ; 20_39 22 + mov ebp, edx + mov ecx, DWORD PTR 24[rsp] + ror edx, 2 + xor ecx, DWORD PTR 32[rsp] + xor ebp, edi + xor ecx, DWORD PTR 56[rsp] + xor ebp, esi + xor ecx, r15d + rol ecx, 1 + add ebp, eax + mov DWORD PTR 24[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD PTR 1859775393[ebp*1+ecx] + add ecx, eax + ; 20_39 23 + mov ebp, ebx + mov eax, DWORD PTR 28[rsp] + ror ebx, 2 + xor eax, DWORD PTR 36[rsp] + xor ebp, edx + xor eax, DWORD PTR 60[rsp] + xor ebp, edi + xor eax, r10d + rol eax, 1 + add ebp, esi + mov DWORD PTR 28[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD PTR 1859775393[ebp*1+eax] + add eax, esi + ; 20_39 24 + mov ebp, ecx + mov esi, DWORD PTR 32[rsp] + ror ecx, 2 + xor esi, DWORD PTR 40[rsp] + xor ebp, ebx + xor esi, r12d + xor ebp, edx + xor esi, r8d + rol esi, 1 + add ebp, edi + mov DWORD PTR 32[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD PTR 1859775393[ebp*1+esi] + add esi, edi + ; 20_39 25 + mov ebp, eax + mov edi, DWORD PTR 36[rsp] + ror eax, 2 + xor edi, DWORD PTR 44[rsp] + xor ebp, ecx + xor edi, r13d + xor ebp, ebx + xor edi, DWORD PTR 24[rsp] + rol edi, 1 + add ebp, edx + mov DWORD PTR 36[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD PTR 1859775393[ebp*1+edi] + add edi, edx + ; 20_39 26 + mov ebp, esi + mov edx, DWORD PTR 40[rsp] + ror esi, 2 + xor edx, DWORD PTR 48[rsp] + xor ebp, eax + xor edx, r14d + xor ebp, ecx + xor edx, DWORD PTR 28[rsp] + rol edx, 1 + add ebp, ebx + mov DWORD PTR 40[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD PTR 1859775393[ebp*1+edx] + add edx, ebx + ; 20_39 27 + mov ebp, edi + mov ebx, DWORD PTR 44[rsp] + ror edi, 2 + xor ebx, DWORD PTR 52[rsp] + xor ebp, esi + xor ebx, r15d + xor ebp, eax + xor ebx, DWORD PTR 32[rsp] + rol ebx, 1 + add ebp, ecx + mov DWORD PTR 44[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD PTR 1859775393[ebp*1+ebx] + add ebx, ecx + ; 20_39 28 + mov ebp, edx + mov ecx, DWORD PTR 48[rsp] + ror edx, 2 + xor ecx, DWORD PTR 56[rsp] + xor ebp, edi + xor ecx, r10d + xor ebp, esi + xor ecx, DWORD PTR 36[rsp] + rol ecx, 1 + add ebp, eax + mov DWORD PTR 48[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD PTR 1859775393[ebp*1+ecx] + add ecx, eax + ; 20_39 29 + mov ebp, ebx + mov eax, DWORD PTR 52[rsp] + ror ebx, 2 + xor eax, DWORD PTR 60[rsp] + xor ebp, edx + xor eax, r8d + xor ebp, edi + xor eax, DWORD PTR 40[rsp] + rol eax, 1 + add ebp, esi + mov DWORD PTR 52[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD PTR 1859775393[ebp*1+eax] + add eax, esi + ; 20_39 30 + mov ebp, ecx + mov esi, DWORD PTR 56[rsp] + ror ecx, 2 + xor esi, r12d + xor ebp, ebx + xor esi, DWORD PTR 24[rsp] + xor ebp, edx + xor esi, DWORD PTR 44[rsp] + rol esi, 1 + add ebp, edi + mov DWORD PTR 56[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD PTR 1859775393[ebp*1+esi] + add esi, edi + ; 20_39 31 + mov ebp, eax + mov edi, DWORD PTR 60[rsp] + ror eax, 2 + xor edi, r13d + xor ebp, ecx + xor edi, DWORD PTR 28[rsp] + xor ebp, ebx + xor edi, DWORD PTR 48[rsp] + rol edi, 1 + add ebp, edx + mov DWORD PTR 60[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD PTR 1859775393[ebp*1+edi] + add edi, edx + ; 20_39 32 + mov ebp, esi +; mov edx, r12d + ror esi, 2 + xor r12d, r14d + xor ebp, eax + xor r12d, DWORD PTR 32[rsp] + xor ebp, ecx + xor r12d, DWORD PTR 52[rsp] + rol r12d, 1 + add ebp, ebx +; mov r12d,edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD PTR 1859775393[ebp*1+r12d] + add edx, ebx + ; 20_39 33 + mov ebp, edi + mov ebx, r13d + ror edi, 2 + xor ebx, r15d + xor ebp, esi + xor ebx, DWORD PTR 36[rsp] + xor ebp, eax + xor ebx, DWORD PTR 56[rsp] + rol ebx, 1 + add ebp, ecx + mov r13d,ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD PTR 1859775393[ebp*1+ebx] + add ebx, ecx + ; 20_39 34 + mov ebp, edx + mov ecx, r14d + ror edx, 2 + xor ecx, r10d + xor ebp, edi + xor ecx, DWORD PTR 40[rsp] + xor ebp, esi + xor ecx, DWORD PTR 60[rsp] + rol ecx, 1 + add ebp, eax + mov r14d,ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD PTR 1859775393[ebp*1+ecx] + add ecx, eax + ; 20_39 35 + mov ebp, ebx + mov eax, r15d + ror ebx, 2 + xor eax, r8d + xor ebp, edx + xor eax, DWORD PTR 44[rsp] + xor ebp, edi + xor eax, r12d + rol eax, 1 + add ebp, esi + mov r15d,eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD PTR 1859775393[ebp*1+eax] + add eax, esi + ; 20_39 36 + mov ebp, ecx + mov esi, r10d + ror ecx, 2 + xor esi, DWORD PTR 24[rsp] + xor ebp, ebx + xor esi, DWORD PTR 48[rsp] + xor ebp, edx + xor esi, r13d + rol esi, 1 + add ebp, edi + mov r10d,esi + mov edi, eax + rol edi, 5 + lea esi, DWORD PTR 1859775393[ebp*1+esi] + add esi, edi + ; 20_39 37 + mov ebp, eax + mov edi, r8d + ror eax, 2 + xor edi, DWORD PTR 28[rsp] + xor ebp, ecx + xor edi, DWORD PTR 52[rsp] + xor ebp, ebx + xor edi, r14d + rol edi, 1 + add ebp, edx + mov r8d,edi + mov edx, esi + rol edx, 5 + lea edi, DWORD PTR 1859775393[ebp*1+edi] + add edi, edx + ; 20_39 38 + mov ebp, esi + mov edx, DWORD PTR 24[rsp] + ror esi, 2 + xor edx, DWORD PTR 32[rsp] + xor ebp, eax + xor edx, DWORD PTR 56[rsp] + xor ebp, ecx + xor edx, r15d + rol edx, 1 + add ebp, ebx + mov DWORD PTR 24[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD PTR 1859775393[ebp*1+edx] + add edx, ebx + ; 20_39 39 + mov ebp, edi + mov ebx, DWORD PTR 28[rsp] + ror edi, 2 + xor ebx, DWORD PTR 36[rsp] + xor ebp, esi + xor ebx, DWORD PTR 60[rsp] + xor ebp, eax + xor ebx, r10d + rol ebx, 1 + add ebp, ecx + mov DWORD PTR 28[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD PTR 1859775393[ebp*1+ebx] + add ebx, ecx + ; 40_59 40 + mov ecx, DWORD PTR 32[rsp] + mov ebp, DWORD PTR 40[rsp] + xor ecx, ebp +; mov ebp, r12d + xor ecx, r12d +; mov ebp, r8d + xor ecx, r8d + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov DWORD PTR 32[rsp],ecx + and ebp, esi + lea ecx, DWORD PTR 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 41 + mov eax, DWORD PTR 36[rsp] + mov ebp, DWORD PTR 44[rsp] + xor eax, ebp +; mov ebp, r13d + xor eax, r13d + mov ebp, DWORD PTR 24[rsp] + xor eax, ebp + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov DWORD PTR 36[rsp],eax + and ebp, edi + lea eax, DWORD PTR 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 40_59 42 + mov esi, DWORD PTR 40[rsp] + mov ebp, DWORD PTR 48[rsp] + xor esi, ebp +; mov ebp, r14d + xor esi, r14d + mov ebp, DWORD PTR 28[rsp] + xor esi, ebp + mov ebp, ecx + rol esi, 1 + or ebp, ebx + mov DWORD PTR 40[rsp],esi + and ebp, edx + lea esi, DWORD PTR 2400959708[edi*1+esi] + mov edi, ecx + ror ecx, 2 + and edi, ebx + or ebp, edi + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 40_59 43 + mov edi, DWORD PTR 44[rsp] + mov ebp, DWORD PTR 52[rsp] + xor edi, ebp +; mov ebp, r15d + xor edi, r15d + mov ebp, DWORD PTR 32[rsp] + xor edi, ebp + mov ebp, eax + rol edi, 1 + or ebp, ecx + mov DWORD PTR 44[rsp],edi + and ebp, ebx + lea edi, DWORD PTR 2400959708[edx*1+edi] + mov edx, eax + ror eax, 2 + and edx, ecx + or ebp, edx + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 40_59 44 + mov edx, DWORD PTR 48[rsp] + mov ebp, DWORD PTR 56[rsp] + xor edx, ebp +; mov ebp, r10d + xor edx, r10d + mov ebp, DWORD PTR 36[rsp] + xor edx, ebp + mov ebp, esi + rol edx, 1 + or ebp, eax + mov DWORD PTR 48[rsp],edx + and ebp, ecx + lea edx, DWORD PTR 2400959708[ebx*1+edx] + mov ebx, esi + ror esi, 2 + and ebx, eax + or ebp, ebx + mov ebx, edi + rol ebx, 5 + add edx, ebp + add edx, ebx + ; 40_59 45 + mov ebx, DWORD PTR 52[rsp] + mov ebp, DWORD PTR 60[rsp] + xor ebx, ebp +; mov ebp, r8d + xor ebx, r8d + mov ebp, DWORD PTR 40[rsp] + xor ebx, ebp + mov ebp, edi + rol ebx, 1 + or ebp, esi + mov DWORD PTR 52[rsp],ebx + and ebp, eax + lea ebx, DWORD PTR 2400959708[ecx*1+ebx] + mov ecx, edi + ror edi, 2 + and ecx, esi + or ebp, ecx + mov ecx, edx + rol ecx, 5 + add ebx, ebp + add ebx, ecx + ; 40_59 46 + mov ecx, DWORD PTR 56[rsp] +; mov ebp, r12d + xor ecx, r12d + mov ebp, DWORD PTR 24[rsp] + xor ecx, ebp + mov ebp, DWORD PTR 44[rsp] + xor ecx, ebp + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov DWORD PTR 56[rsp],ecx + and ebp, esi + lea ecx, DWORD PTR 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 47 + mov eax, DWORD PTR 60[rsp] +; mov ebp, r13d + xor eax, r13d + mov ebp, DWORD PTR 28[rsp] + xor eax, ebp + mov ebp, DWORD PTR 48[rsp] + xor eax, ebp + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov DWORD PTR 60[rsp],eax + and ebp, edi + lea eax, DWORD PTR 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 40_59 48 + mov esi, r12d +; mov ebp, r14d + xor esi, r14d + mov ebp, DWORD PTR 32[rsp] + xor esi, ebp + mov ebp, DWORD PTR 52[rsp] + xor esi, ebp + mov ebp, ecx + rol esi, 1 + or ebp, ebx + mov r12d,esi + and ebp, edx + lea esi, DWORD PTR 2400959708[edi*1+esi] + mov edi, ecx + ror ecx, 2 + and edi, ebx + or ebp, edi + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 40_59 49 + mov edi, r13d +; mov ebp, r15d + xor edi, r15d + mov ebp, DWORD PTR 36[rsp] + xor edi, ebp + mov ebp, DWORD PTR 56[rsp] + xor edi, ebp + mov ebp, eax + rol edi, 1 + or ebp, ecx + mov r13d,edi + and ebp, ebx + lea edi, DWORD PTR 2400959708[edx*1+edi] + mov edx, eax + ror eax, 2 + and edx, ecx + or ebp, edx + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 40_59 50 + mov edx, r14d +; mov ebp, r10d + xor edx, r10d + mov ebp, DWORD PTR 40[rsp] + xor edx, ebp + mov ebp, DWORD PTR 60[rsp] + xor edx, ebp + mov ebp, esi + rol edx, 1 + or ebp, eax + mov r14d,edx + and ebp, ecx + lea edx, DWORD PTR 2400959708[ebx*1+edx] + mov ebx, esi + ror esi, 2 + and ebx, eax + or ebp, ebx + mov ebx, edi + rol ebx, 5 + add edx, ebp + add edx, ebx + ; 40_59 51 + mov ebx, r15d +; mov ebp, r8d + xor ebx, r8d + mov ebp, DWORD PTR 44[rsp] + xor ebx, ebp +; mov ebp, r12d + xor ebx, r12d + mov ebp, edi + rol ebx, 1 + or ebp, esi + mov r15d,ebx + and ebp, eax + lea ebx, DWORD PTR 2400959708[ecx*1+ebx] + mov ecx, edi + ror edi, 2 + and ecx, esi + or ebp, ecx + mov ecx, edx + rol ecx, 5 + add ebx, ebp + add ebx, ecx + ; 40_59 52 + mov ecx, r10d + mov ebp, DWORD PTR 24[rsp] + xor ecx, ebp + mov ebp, DWORD PTR 48[rsp] + xor ecx, ebp +; mov ebp, r13d + xor ecx, r13d + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov r10d,ecx + and ebp, esi + lea ecx, DWORD PTR 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 53 + mov eax, r8d + mov ebp, DWORD PTR 28[rsp] + xor eax, ebp + mov ebp, DWORD PTR 52[rsp] + xor eax, ebp +; mov ebp, r14d + xor eax, r14d + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov r8d,eax + and ebp, edi + lea eax, DWORD PTR 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 40_59 54 + mov esi, DWORD PTR 24[rsp] + mov ebp, DWORD PTR 32[rsp] + xor esi, ebp + mov ebp, DWORD PTR 56[rsp] + xor esi, ebp +; mov ebp, r15d + xor esi, r15d + mov ebp, ecx + rol esi, 1 + or ebp, ebx + mov DWORD PTR 24[rsp],esi + and ebp, edx + lea esi, DWORD PTR 2400959708[edi*1+esi] + mov edi, ecx + ror ecx, 2 + and edi, ebx + or ebp, edi + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 40_59 55 + mov edi, DWORD PTR 28[rsp] + mov ebp, DWORD PTR 36[rsp] + xor edi, ebp + mov ebp, DWORD PTR 60[rsp] + xor edi, ebp +; mov ebp, r10d + xor edi, r10d + mov ebp, eax + rol edi, 1 + or ebp, ecx + mov DWORD PTR 28[rsp],edi + and ebp, ebx + lea edi, DWORD PTR 2400959708[edx*1+edi] + mov edx, eax + ror eax, 2 + and edx, ecx + or ebp, edx + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 40_59 56 + mov edx, DWORD PTR 32[rsp] + mov ebp, DWORD PTR 40[rsp] + xor edx, ebp +; mov ebp, r12d + xor edx, r12d +; mov ebp, r8d + xor edx, r8d + mov ebp, esi + rol edx, 1 + or ebp, eax + mov DWORD PTR 32[rsp],edx + and ebp, ecx + lea edx, DWORD PTR 2400959708[ebx*1+edx] + mov ebx, esi + ror esi, 2 + and ebx, eax + or ebp, ebx + mov ebx, edi + rol ebx, 5 + add edx, ebp + add edx, ebx + ; 40_59 57 + mov ebx, DWORD PTR 36[rsp] + mov ebp, DWORD PTR 44[rsp] + xor ebx, ebp +; mov ebp, r13d + xor ebx, r13d + mov ebp, DWORD PTR 24[rsp] + xor ebx, ebp + mov ebp, edi + rol ebx, 1 + or ebp, esi + mov DWORD PTR 36[rsp],ebx + and ebp, eax + lea ebx, DWORD PTR 2400959708[ecx*1+ebx] + mov ecx, edi + ror edi, 2 + and ecx, esi + or ebp, ecx + mov ecx, edx + rol ecx, 5 + add ebx, ebp + add ebx, ecx + ; 40_59 58 + mov ecx, DWORD PTR 40[rsp] + mov ebp, DWORD PTR 48[rsp] + xor ecx, ebp +; mov ebp, r14d + xor ecx, r14d + mov ebp, DWORD PTR 28[rsp] + xor ecx, ebp + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov DWORD PTR 40[rsp],ecx + and ebp, esi + lea ecx, DWORD PTR 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 59 + mov eax, DWORD PTR 44[rsp] + mov ebp, DWORD PTR 52[rsp] + xor eax, ebp +; mov ebp, r15d + xor eax, r15d + mov ebp, DWORD PTR 32[rsp] + xor eax, ebp + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov DWORD PTR 44[rsp],eax + and ebp, edi + lea eax, DWORD PTR 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 20_39 60 + mov ebp, ecx + mov esi, DWORD PTR 48[rsp] + ror ecx, 2 + xor esi, DWORD PTR 56[rsp] + xor ebp, ebx + xor esi, r10d + xor ebp, edx + xor esi, DWORD PTR 36[rsp] + rol esi, 1 + add ebp, edi + mov DWORD PTR 48[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD PTR 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 61 + mov ebp, eax + mov edi, DWORD PTR 52[rsp] + ror eax, 2 + xor edi, DWORD PTR 60[rsp] + xor ebp, ecx + xor edi, r8d + xor ebp, ebx + xor edi, DWORD PTR 40[rsp] + rol edi, 1 + add ebp, edx + mov DWORD PTR 52[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD PTR 3395469782[ebp*1+edi] + add edi, edx + ; 20_39 62 + mov ebp, esi + mov edx, DWORD PTR 56[rsp] + ror esi, 2 + xor edx, r12d + xor ebp, eax + xor edx, DWORD PTR 24[rsp] + xor ebp, ecx + xor edx, DWORD PTR 44[rsp] + rol edx, 1 + add ebp, ebx + mov DWORD PTR 56[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD PTR 3395469782[ebp*1+edx] + add edx, ebx + ; 20_39 63 + mov ebp, edi + mov ebx, DWORD PTR 60[rsp] + ror edi, 2 + xor ebx, r13d + xor ebp, esi + xor ebx, DWORD PTR 28[rsp] + xor ebp, eax + xor ebx, DWORD PTR 48[rsp] + rol ebx, 1 + add ebp, ecx + mov DWORD PTR 60[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD PTR 3395469782[ebp*1+ebx] + add ebx, ecx + ; 20_39 64 + mov ebp, edx + mov ecx, r12d + ror edx, 2 + xor ecx, r14d + xor ebp, edi + xor ecx, DWORD PTR 32[rsp] + xor ebp, esi + xor ecx, DWORD PTR 52[rsp] + rol ecx, 1 + add ebp, eax + mov r12d,ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD PTR 3395469782[ebp*1+ecx] + add ecx, eax + ; 20_39 65 + mov ebp, ebx + mov eax, r13d + ror ebx, 2 + xor eax, r15d + xor ebp, edx + xor eax, DWORD PTR 36[rsp] + xor ebp, edi + xor eax, DWORD PTR 56[rsp] + rol eax, 1 + add ebp, esi + mov r13d,eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD PTR 3395469782[ebp*1+eax] + add eax, esi + ; 20_39 66 + mov ebp, ecx + mov esi, r14d + ror ecx, 2 + xor esi, r10d + xor ebp, ebx + xor esi, DWORD PTR 40[rsp] + xor ebp, edx + xor esi, DWORD PTR 60[rsp] + rol esi, 1 + add ebp, edi + mov r14d,esi + mov edi, eax + rol edi, 5 + lea esi, DWORD PTR 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 67 + mov ebp, eax + mov edi, r15d + ror eax, 2 + xor edi, r8d + xor ebp, ecx + xor edi, DWORD PTR 44[rsp] + xor ebp, ebx + xor edi, r12d + rol edi, 1 + add ebp, edx + mov r15d,edi + mov edx, esi + rol edx, 5 + lea edi, DWORD PTR 3395469782[ebp*1+edi] + add edi, edx + ; 20_39 68 + mov ebp, esi + mov edx, r10d + ror esi, 2 + xor edx, DWORD PTR 24[rsp] + xor ebp, eax + xor edx, DWORD PTR 48[rsp] + xor ebp, ecx + xor edx, r13d + rol edx, 1 + add ebp, ebx + mov r10d,edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD PTR 3395469782[ebp*1+edx] + add edx, ebx + ; 20_39 69 + mov ebp, edi + mov ebx, r8d + ror edi, 2 + xor ebx, DWORD PTR 28[rsp] + xor ebp, esi + xor ebx, DWORD PTR 52[rsp] + xor ebp, eax + xor ebx, r14d + rol ebx, 1 + add ebp, ecx + mov r8d,ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD PTR 3395469782[ebp*1+ebx] + add ebx, ecx + ; 20_39 70 + mov ebp, edx + mov ecx, DWORD PTR 24[rsp] + ror edx, 2 + xor ecx, DWORD PTR 32[rsp] + xor ebp, edi + xor ecx, DWORD PTR 56[rsp] + xor ebp, esi + xor ecx, r15d + rol ecx, 1 + add ebp, eax + mov DWORD PTR 24[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD PTR 3395469782[ebp*1+ecx] + add ecx, eax + ; 20_39 71 + mov ebp, ebx + mov eax, DWORD PTR 28[rsp] + ror ebx, 2 + xor eax, DWORD PTR 36[rsp] + xor ebp, edx + xor eax, DWORD PTR 60[rsp] + xor ebp, edi + xor eax, r10d + rol eax, 1 + add ebp, esi + mov DWORD PTR 28[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD PTR 3395469782[ebp*1+eax] + add eax, esi + ; 20_39 72 + mov ebp, ecx + mov esi, DWORD PTR 32[rsp] + ror ecx, 2 + xor esi, DWORD PTR 40[rsp] + xor ebp, ebx + xor esi, r12d + xor ebp, edx + xor esi, r8d + rol esi, 1 + add ebp, edi + mov DWORD PTR 32[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD PTR 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 73 + mov ebp, eax + mov edi, DWORD PTR 36[rsp] + ror eax, 2 + xor edi, DWORD PTR 44[rsp] + xor ebp, ecx + xor edi, r13d + xor ebp, ebx + xor edi, DWORD PTR 24[rsp] + rol edi, 1 + add ebp, edx + mov DWORD PTR 36[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD PTR 3395469782[ebp*1+edi] + add edi, edx + ; 20_39 74 + mov ebp, esi + mov edx, DWORD PTR 40[rsp] + ror esi, 2 + xor edx, DWORD PTR 48[rsp] + xor ebp, eax + xor edx, r14d + xor ebp, ecx + xor edx, DWORD PTR 28[rsp] + rol edx, 1 + add ebp, ebx + mov DWORD PTR 40[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD PTR 3395469782[ebp*1+edx] + add edx, ebx + ; 20_39 75 + mov ebp, edi + mov ebx, DWORD PTR 44[rsp] + ror edi, 2 + xor ebx, DWORD PTR 52[rsp] + xor ebp, esi + xor ebx, r15d + xor ebp, eax + xor ebx, DWORD PTR 32[rsp] + rol ebx, 1 + add ebp, ecx + mov DWORD PTR 44[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD PTR 3395469782[ebp*1+ebx] + add ebx, ecx + ; 20_39 76 + mov ebp, edx + mov ecx, DWORD PTR 48[rsp] + ror edx, 2 + xor ecx, DWORD PTR 56[rsp] + xor ebp, edi + xor ecx, r10d + xor ebp, esi + xor ecx, DWORD PTR 36[rsp] + rol ecx, 1 + add ebp, eax + mov DWORD PTR 48[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD PTR 3395469782[ebp*1+ecx] + add ecx, eax + ; 20_39 77 + mov ebp, ebx + mov eax, DWORD PTR 52[rsp] + ror ebx, 2 + xor eax, DWORD PTR 60[rsp] + xor ebp, edx + xor eax, r8d + xor ebp, edi + xor eax, DWORD PTR 40[rsp] + rol eax, 1 + add ebp, esi + mov DWORD PTR 52[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD PTR 3395469782[ebp*1+eax] + add eax, esi + ; 20_39 78 + mov ebp, ecx + mov esi, DWORD PTR 56[rsp] + ror ecx, 2 + xor esi, r12d + xor ebp, ebx + xor esi, DWORD PTR 24[rsp] + xor ebp, edx + xor esi, DWORD PTR 44[rsp] + rol esi, 1 + add ebp, edi + mov DWORD PTR 56[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD PTR 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 79 +prefetcht1 [r9] + mov ebp, eax + mov edi, DWORD PTR 60[rsp] + ror eax, 2 + xor edi, r13d + xor ebp, ecx + xor edi, DWORD PTR 28[rsp] + xor ebp, ebx + xor edi, DWORD PTR 48[rsp] + rol edi, 1 + add ebp, edx + mov DWORD PTR 60[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD PTR 3395469782[ebp*1+edi] + add edi, edx + ; End processing + ; +prefetcht1 [r11+64] +; mov ebp, DWORD PTR 128[rsp] +;mov rbp,r9 + + + mov edx, DWORD PTR 12[r9] + add edx, ecx + mov ecx, DWORD PTR 4[r9] + add ecx, esi + mov esi, eax + mov eax, DWORD PTR [r9] + mov DWORD PTR 12[r9],edx + add eax, edi + mov edi, DWORD PTR 16[r9] + add edi, ebx + mov ebx, DWORD PTR 8[r9] + add ebx, esi + mov DWORD PTR [r9],eax + add r11, 64 + + mov DWORD PTR 8[r9],ebx + + + mov DWORD PTR 16[r9],edi + cmp r11,QWORD PTR 112[rsp] + mov DWORD PTR 4[r9],ecx + jb $L000start + +mov DWORD PTR [rsp],r12d +mov DWORD PTR 4[rsp],r13d +mov DWORD PTR 8[rsp],r14d +mov DWORD PTR 12[rsp],r15d +mov DWORD PTR 16[rsp],r10d +mov DWORD PTR 20[rsp],r8d + add rsp, 120 + +pop r15 +pop r14 +pop r13 +pop r12 + + + + +pop rbp +pop rbx +pop rsi +pop rdi + + ret +sha1_block_asm_data_order ENDP +;_TEXT$ ENDS +;_TEXT$ SEGMENT PAGE 'CODE' +;PUBLIC _sha1_block_asm_host_order + +sha1_block_asm_host_order PROC + +push rdi +push rsi +push rbx +push rbp + + +push r12 +push r13 +push r14 +push r15 + +; c = rcx +; p = rdx +; num = r8 + + +mov r9,rcx + + shl r8, 6 + mov r11, rdx + add r8, r11 + + mov rbp,rcx + mov edx, DWORD PTR 12[rbp] + sub rsp, 120 + mov edi, DWORD PTR 16[rbp] + mov ebx, DWORD PTR 8[rbp] + + mov QWORD PTR 112[rsp],r8 + ; First we need to setup the X array + mov eax, DWORD PTR [r11] + mov ecx, DWORD PTR 4[r11] + mov r12d,eax + mov r13d,ecx + mov eax, DWORD PTR 8[r11] + mov ecx, DWORD PTR 12[r11] + mov r14d,eax + mov r15d,ecx + mov eax, DWORD PTR 16[r11] + mov ecx, DWORD PTR 20[r11] + + mov r10d,eax + mov r8d,ecx + + mov eax, DWORD PTR 24[r11] + mov ecx, DWORD PTR 28[r11] + mov DWORD PTR 24[rsp],eax + mov DWORD PTR 28[rsp],ecx + mov eax, DWORD PTR 32[r11] + mov ecx, DWORD PTR 36[r11] + mov DWORD PTR 32[rsp],eax + mov DWORD PTR 36[rsp],ecx + mov eax, DWORD PTR 40[r11] + mov ecx, DWORD PTR 44[r11] + mov DWORD PTR 40[rsp],eax + mov DWORD PTR 44[rsp],ecx + mov eax, DWORD PTR 48[r11] + mov ecx, DWORD PTR 52[r11] + mov DWORD PTR 48[rsp],eax + mov DWORD PTR 52[rsp],ecx + mov eax, DWORD PTR 56[r11] + mov ecx, DWORD PTR 60[r11] + mov DWORD PTR 56[rsp],eax + mov DWORD PTR 60[rsp],ecx + + jmp $L001shortcut + + + +sha1_block_asm_host_order ENDP +;_TEXT$ ENDS +END diff --git a/hasher/asm/masm/SHA1x86.asm b/hasher/asm/masm/SHA1x86.asm new file mode 100644 index 000000000..fc02c1375 --- /dev/null +++ b/hasher/asm/masm/SHA1x86.asm @@ -0,0 +1,298 @@ +; ##################################################################################################################### +; +; SHA_asm.asm +; +; Copyright (c) Shareaza Development Team, 2002-2007. +; This file is part of SHAREAZA (shareaza.sourceforge.net) +; +; Shareaza is free software; you can redistribute it +; and/or modify it under the terms of the GNU General Public License +; as published by the Free Software Foundation; either version 2 of +; the License, or (at your option) any later version. +; +; Shareaza is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with Shareaza; if not, write to the Free Software +; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +; +; ##################################################################################################################### +; +; SHA_asm - Implementation of SHA-1 for x86 - use together with SHA.cpp and SHA.h +; +; ##################################################################################################################### + + .586p + .model flat, stdcall + option casemap:none ; case sensitive + option prologue:none ; we generate our own entry/exit code + option epilogue:none + +; ##################################################################################################################### + +m_nCount0 equ 0 ; offsets as found in SHA.h +m_nCount1 equ 4 + +m_nHash0 equ 8 +m_nHash1 equ 12 +m_nHash2 equ 16 +m_nHash3 equ 20 +m_nHash4 equ 24 + +m_nBuffer equ 28 + +RND_CH MACRO const:REQ +; t=a; a=rotl32(a,5)+e+k+w[i]+((b&c)^(~b&d)); e=d; d=c; c=rotl32(b,30); b=t +; a=rotl32(a,5)+e+k+w[i]+(d^(b&(c^d))); + mov reg_temp1, reg_a ; t=a + mov reg_temp2, reg_c + rol reg_a, 5 + xor reg_temp2, reg_d + add reg_a, reg_e + and reg_temp2, reg_b + add reg_a, const + xor reg_temp2, reg_d + add reg_a, [_w+count*4] + ror reg_b, 2 + add reg_a, reg_temp2 +reg_t textequ reg_e +reg_e textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_b +reg_b textequ reg_temp1 +reg_temp1 textequ reg_t +count = count + 1 + ENDM ; RND_CH + +RND_PARITY MACRO const:REQ +; t=a; a=rotl32(a,5)+e+k+w[i]+(b^c^d); e=d; d=c; c=rotl32(b,30); b=t + mov reg_temp1, reg_a ; t=a + rol reg_a, 5 + mov reg_temp2, reg_d + add reg_a, reg_e + xor reg_temp2, reg_c + add reg_a, const + xor reg_temp2, reg_b + add reg_a, [_w+count*4] + ror reg_b, 2 + add reg_a, reg_temp2 +reg_t textequ reg_e +reg_e textequ reg_d ; e=d +reg_d textequ reg_c ; d=c +reg_c textequ reg_b ; c=rotl(b,30) +reg_b textequ reg_temp1 ; b=t +reg_temp1 textequ reg_t +count = count + 1 + ENDM ; RND_PARITY + +RND_MAJ MACRO const:REQ +; t=a; a=rotl32(a,5)+e+k+w[i]+((b&c)^(b&d)^(c&d)); e=d; d=c; c=rotl32(b,30); b=t +; a=rotl32(a,5)+e+k+w[i]+((c&d)^(b&(c^d))) + mov reg_temp2, reg_d + mov reg_temp1, reg_a + rol reg_a, 5 + xor reg_temp2, reg_c + add reg_a, reg_e + and reg_temp2, reg_b + add reg_a, const + mov reg_e, reg_c + add reg_a, [_w+count*4] + and reg_e, reg_d + xor reg_temp2, reg_e + ror reg_b, 2 + add reg_a, reg_temp2 +reg_t textequ reg_e +reg_e textequ reg_d +reg_d textequ reg_c +reg_c textequ reg_b +reg_b textequ reg_temp1 +reg_temp1 textequ reg_t +count = count + 1 + ENDM ; RND_MAJ + +INIT_REG_ALIAS MACRO +reg_accu textequ +reg_base textequ +reg_i_1 textequ +reg_i_2 textequ +reg_i_3 textequ +reg_i_15 textequ +reg_i_16 textequ + ENDM + + .code + + ALIGN 16 + +SHA_Compile_p5 PROC + +__this textequ <[esp+40+320]> ; pusha + 2 * ret addr in between +_w textequ + + INIT_REG_ALIAS + +count = 0 + REPEAT 16 + IF count eq 0 + mov reg_i_16, [ebp+count*4] + bswap reg_i_16 + mov [_w+count*4], reg_i_16 + ELSEIF count eq 1 + mov reg_i_15, [ebp+count*4] + bswap reg_i_15 + mov [_w+count*4], reg_i_15 + ELSEIF count eq 13 + mov reg_i_3, [ebp+count*4] + bswap reg_i_3 + mov [_w+count*4], reg_i_3 + ELSEIF count eq 14 + mov reg_i_2, [ebp+count*4] + bswap reg_i_2 + mov [_w+count*4], reg_i_2 + ELSE + mov reg_i_1, [ebp+count*4] + bswap reg_i_1 + mov [_w+count*4], reg_i_1 + ENDIF +count = count + 1 + ENDM +count = 16 + REPEAT 64 + xor reg_i_3, reg_i_16 ; w[i-16]^w[i-3] +reg_i_14 textequ reg_i_16 ; we forget w[i-16] + IF count le 77 + mov reg_i_14, [_w+(count-14)*4] + xor reg_i_3, reg_i_14 + ELSE + xor reg_i_3, [_w+(count-14)*4] + ENDIF + xor reg_i_3, [_w+(count-8)*4] + rol reg_i_3, 1 + mov [_w+count*4], reg_i_3 +;now we prepare for the next iteration +reg_i_0 textequ reg_i_3 +reg_i_3 textequ reg_i_2 +reg_i_2 textequ reg_i_1 +reg_i_1 textequ reg_i_0 +reg_i_16 textequ reg_i_15 +reg_i_15 textequ reg_i_14 +count = count + 1 + ENDM + +reg_a textequ +reg_b textequ +reg_c textequ +reg_d textequ +reg_e textequ +reg_temp1 textequ +reg_temp2 textequ + + mov reg_temp2, __this + mov reg_a, [reg_temp2+m_nHash0] + mov reg_b, [reg_temp2+m_nHash1] + mov reg_c, [reg_temp2+m_nHash2] + mov reg_d, [reg_temp2+m_nHash3] + mov reg_e, [reg_temp2+m_nHash4] + +count = 0 + + REPEAT 20 + RND_CH 05a827999H + ENDM + REPEAT 20 + RND_PARITY 06ed9eba1H + ENDM + REPEAT 20 + RND_MAJ 08f1bbcdcH + ENDM + REPEAT 20 + RND_PARITY 0ca62c1d6H + ENDM + + mov reg_temp2, __this + add [reg_temp2+m_nHash0], reg_a + add [reg_temp2+m_nHash1], reg_b + add [reg_temp2+m_nHash2], reg_c + add [reg_temp2+m_nHash3], reg_d + add [reg_temp2+m_nHash4], reg_e + + ret + +SHA_Compile_p5 ENDP + + ALIGN 16 + +SHA1_Add_p5 PROC PUBLIC, _this:DWORD, _Data:DWORD, _nLength:DWORD + + pusha +__this textequ <[esp+36+320]> ; different offset due to pusha +__Data textequ <[esp+40+320]> +__nLength textequ <[esp+44+320]> + + sub esp, 320 + + mov ecx, __nLength + and ecx, ecx + jz get_out + xor edx, edx + mov ebp, __Data + mov edi, __this + mov ebx, [edi+m_nCount0] + mov eax, ebx + add ebx, ecx + mov [edi+m_nCount0], ebx + adc [edi+m_nCount1], edx + + and eax, 63 + jnz partial_buffer +full_blocks: mov ecx, __nLength + and ecx, ecx + jz get_out + sub ecx, 64 + jb end_of_stream + mov __nLength, ecx + call SHA_Compile_p5 + mov ebp, __Data + add ebp, 64 + mov __Data, ebp + jmp full_blocks + +end_of_stream: mov edi, __this + mov esi, ebp + lea edi, [edi+m_nBuffer] + add ecx, 64 + rep movsb + jmp get_out + +partial_buffer: add ecx, eax ; eax = offset in buffer, ecx = _nLength + cmp ecx, 64 + jb short_stream ; we can't fill the buffer + mov ecx, -64 + add ecx, eax + add __nLength, ecx ; _nlength += (offset-64) +@@: mov bl, [ebp] + inc ebp + mov byte ptr [edi+m_nBuffer+64+ecx], bl + inc ecx + jnz @B ; offset = 64 + mov __Data, ebp + lea ebp, [edi+m_nBuffer] + call SHA_Compile_p5 + mov ebp, __Data + jmp full_blocks + +short_stream: sub ecx, eax ; --> ecx=_nLength + mov esi, ebp + lea edi, [edi+m_nBuffer+eax] + rep movsb + +get_out: add esp, 320 + popa + ret 12 + +SHA1_Add_p5 ENDP + + end diff --git a/hasher/asm/masm/crc32x64.asm b/hasher/asm/masm/crc32x64.asm new file mode 100644 index 000000000..02fe36de4 --- /dev/null +++ b/hasher/asm/masm/crc32x64.asm @@ -0,0 +1,41 @@ +.code +crcCalc PROC PUBLIC USES rax rbx rcx rdx rdi rsi pdwCrc32:PTR DWORD, ptrCrc32Table:PTR DWORD,bufferAsm:PTR BYTE,dwBytesReadAsm:DWORD + + ;mov rax, pdwCrc32 ; Load the pointer to dwCrc32 + mov rsi, rcx + mov ecx, [rsi] ; Dereference the pointer to load dwCrc32 + + ;mov rdi, ptrCrc32Table ; Load the CRC32 table + + ;mov rsi, bufferAsm ; Load buffer + xor rbx, rbx + ;mov ebx, dwBytesReadAsm ; Load dwBytesRead + lea rdi, [r8 + r9] ; Calculate the end of the buffer + + crc32loop: + xor rax, rax ; Clear the eax register + mov bl, byte ptr [r8] ; Load the current source byte + + mov al, cl ; Copy crc value into eax + inc r8 ; Advance the source pointer + + xor al, bl ; Create the index into the CRC32 table + shr ecx, 8 + + mov ebx, [rdx + rax * 4] ; Get the value out of the table + xor ecx, ebx ; xor with the current byte + + cmp rdi, r8 ; Have we reached the end of the buffer? + jne crc32loop + + ; Restore the edi and esi registers + ;pop edi + ;pop esi + + ;mov rax, pdwCrc32 ; Load the pointer to dwCrc32 + mov [rsi], ecx ; Write the result + + ret + +crcCalc ENDP +END \ No newline at end of file diff --git a/hasher/asm/masm/crc32x86.asm b/hasher/asm/masm/crc32x86.asm new file mode 100644 index 000000000..44f9460fb --- /dev/null +++ b/hasher/asm/masm/crc32x86.asm @@ -0,0 +1,42 @@ +.586p +.model flat, C + +.code +crcCalc PROC PUBLIC USES eax ebx ecx edx edi esi pdwCrc32:PTR DWORD, ptrCrc32Table:PTR DWORD,bufferAsm:PTR BYTE,dwBytesReadAsm:DWORD + + mov eax, pdwCrc32 ; Load the pointer to dwCrc32 + mov ecx, [eax] ; Dereference the pointer to load dwCrc32 + + mov edi, ptrCrc32Table ; Load the CRC32 table + + mov esi, bufferAsm ; Load buffer + mov ebx, dwBytesReadAsm ; Load dwBytesRead + lea edx, [esi + ebx] ; Calculate the end of the buffer + + crc32loop: + xor eax, eax ; Clear the eax register + mov bl, byte ptr [esi] ; Load the current source byte + + mov al, cl ; Copy crc value into eax + inc esi ; Advance the source pointer + + xor al, bl ; Create the index into the CRC32 table + shr ecx, 8 + + mov ebx, [edi + eax * 4] ; Get the value out of the table + xor ecx, ebx ; xor with the current byte + + cmp edx, esi ; Have we reached the end of the buffer? + jne crc32loop + + ; Restore the edi and esi registers + ;pop edi + ;pop esi + + mov eax, pdwCrc32 ; Load the pointer to dwCrc32 + mov [eax], ecx ; Write the result + + ret + +crcCalc ENDP +END \ No newline at end of file diff --git a/hasher/asm/nasm/MD4x64.asm b/hasher/asm/nasm/MD4x64.asm new file mode 100644 index 000000000..c5e613672 --- /dev/null +++ b/hasher/asm/nasm/MD4x64.asm @@ -0,0 +1,533 @@ +SECTION .text +global MD4_x64 +align 10h +MD4_x64: + push rbp + push rbx + push r12 + push r13 + push r14 + push r15 + push rsi + push rdi +; parameter 1 in rcx, param 2 in rdx , param 3 in r8 + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + ;# rdi = arg #1 (ctx, MD5_CTX pointer) + ;# rsi = arg #2 (ptr, data pointer) + ;# rdx = arg #3 (nbr, number of 16-word blocks to process) + + mov rsi,rdx + mov edx,r8d + + mov r12,rcx ;# rbp = ctx + shl rdx,6 ;# rdx = nbr in bytes + push r12 + lea rdi,[rsi+rdx]; # rdi = end + + mov eax,DWORD 0[r12] ;# eax = ctx->A + mov ebx,DWORD 4[r12] ;# ebx = ctx->B + mov ecx,DWORD 8[r12] ;# ecx = ctx->C + mov edx,DWORD 12[r12] ;# edx = ctx->D + ;push rbp ;# save ctx + ;# end is 'rdi' + ;# ptr is 'rsi' + ;# A is 'eax' + ;# B is 'ebx' + ;# C is 'ecx' + ;# D is 'edx' + + + cmp rsi,rdi ;# cmp end with ptr + mov r13d,0ffffffffh + je lab1 ;# jmp if ptr == end + + ;# BEGIN of loop over 16-word blocks +lab2: ;# save old values of A, B, C, D + mov r8d,eax + mov r9d,ebx + mov r14d,ecx + mov r15d,edx +; BEGIN of the round serie + mov r10 , QWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , edx ;/* (NEXT STEP) z' = %edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + xor r11d,ecx ;/* y ^ ... */ + lea eax, [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 3 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + xor r11d,ebx ;/* y ^ ... */ + lea edx, [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + add edx,r11d ;/* dst += ... */ + rol edx, 7 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + xor r11d,eax ;/* y ^ ... */ + lea ecx, [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + xor r11d,edx ;/* y ^ ... */ + lea ebx, [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 19 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + mov r10d , [rsi] ;/* (NEXT STEP) X[1] */ + mov r11d, ecx ;/* (NEXT STEP) z' = %edx */ + mov r12d, ecx ;/* (NEXT STEP) z' = %edx */ + + lea eax,DWORD 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (4*4) [rsi] ;/* (NEXT STEP) X[4] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (8*4) [rsi] ;/* (NEXT STEP) X[8] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (12*4) [rsi] ;/* (NEXT STEP) X[12] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (1*4) [rsi] ;/* (NEXT STEP) X[1] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + + lea eax,DWORD 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (5*4) [rsi] ;/* (NEXT STEP) X[5] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (9*4) [rsi] ;/* (NEXT STEP) X[9] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (13*4) [rsi] ;/* (NEXT STEP) X[13] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (2*4) [rsi] ;/* (NEXT STEP) X[2] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + + lea eax,DWORD 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (6*4) [rsi] ;/* (NEXT STEP) X[6] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (10*4) [rsi] ;/* (NEXT STEP) X[10] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (14*4) [rsi] ;/* (NEXT STEP) X[14] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (3*4) [rsi] ;/* (NEXT STEP) X[3] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + + lea eax,DWORD 5A827999h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ebx + or r12d, ebx + mov r10d , (7*4) [rsi] ;/* (NEXT STEP) X[7] */ + and r12d, edx + or r11d,r12d + mov r12d, ebx ;/* (NEXT STEP) z' = ebx */ + add eax,r11d + mov r11d, ebx ;/* (NEXT STEP) z' = ebx */ + rol eax , 3 ;/* dst <<< s */ + + + lea edx,DWORD 5A827999h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, eax + or r12d, eax + mov r10d , (11*4) [rsi] ;/* (NEXT STEP) X[11] */ + and r12d, ecx + or r11d,r12d + mov r12d, eax ;/* (NEXT STEP) z' = eax */ + add edx,r11d + mov r11d, eax ;/* (NEXT STEP) z' = eax */ + rol edx , 5 ;/* dst <<< s */ + + + lea ecx,DWORD 5A827999h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, edx + or r12d, edx + mov r10d , (15*4) [rsi] ;/* (NEXT STEP) X[15] */ + and r12d, ebx + or r11d,r12d + mov r12d, edx ;/* (NEXT STEP) z' = edx */ + add ecx,r11d + mov r11d, edx ;/* (NEXT STEP) z' = edx */ + rol ecx , 9 ;/* dst <<< s */ + + + lea ebx,DWORD 5A827999h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d, ecx + or r12d, ecx + mov r10d , (0*4) [rsi] ;/* (NEXT STEP) X[0] */ + and r12d, eax + or r11d,r12d + mov r12d, ecx ;/* (NEXT STEP) z' = ecx */ + add ebx,r11d + mov r11d, ecx ;/* (NEXT STEP) z' = ecx */ + rol ebx , 13 ;/* dst <<< s */ + + mov r10d , [rsi] ;/* (NEXT STEP) X[5] */ + mov r11d , ecx ;/* (NEXT STEP) y' = %ecx */ + lea eax,DWORD 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + lea eax,DWORD 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + lea eax,DWORD 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + lea eax,DWORD 6ED9EBA1H [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 3 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + lea edx,DWORD 6ED9EBA1H [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 9 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + lea ecx,DWORD 6ED9EBA1H [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 11 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + lea ebx,DWORD 6ED9EBA1H [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 15 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ +; # add old values of A, B, C, D + add eax,r8d + add ebx,r9d + add ecx,r14d + add edx,r15d + +; # loop control + add rsi,64 ;# ptr += 64 + cmp rsi,rdi ;# cmp end with ptr + jb lab2 ;# jmp if ptr < end +; # END of loop over 16-word blocks + +lab1: ;pop rbp ;# restore ctx +pop r12 + mov DWORD 0[r12],eax ;# ctx->A = A + mov DWORD 4[r12],ebx ;# ctx->B = B + mov DWORD 8[r12],ecx ;# ctx->C = C + mov DWORD 12[r12],edx ;# ctx->D = D + + pop rdi + pop rsi + pop r15 + pop r14 + pop r13 + pop r12 + pop rbx + pop rbp + ret + + diff --git a/hasher/asm/nasm/MD4x86.asm b/hasher/asm/nasm/MD4x86.asm new file mode 100644 index 000000000..d1850ee6e --- /dev/null +++ b/hasher/asm/nasm/MD4x86.asm @@ -0,0 +1,461 @@ +section .text + +global _MD4_Transform_p5@0 +align 10h +_MD4_Transform_p5@0: + mov esi, [esp+28h] + mov eax, [esi+8] + mov ebx, [esi+0Ch] + mov ecx, [esi+10h] + mov edx, [esi+14h] + mov esi, ecx + xor ecx, edx + add eax, [ebp+0] + and ecx, ebx + xor ecx, edx + add eax, ecx + rol eax, 3 + mov ecx, ebx + xor ebx, esi + add edx, [ebp+4] + and ebx, eax + xor ebx, esi + add edx, ebx + rol edx, 7 + mov ebx, eax + xor eax, ecx + add esi, [ebp+8] + and eax, edx + xor eax, ecx + add esi, eax + rol esi, 0Bh + mov eax, edx + xor edx, ebx + add ecx, [ebp+0Ch] + and edx, esi + xor edx, ebx + add ecx, edx + rol ecx, 13h + mov edx, esi + xor esi, eax + add ebx, [ebp+10h] + and esi, ecx + xor esi, eax + add ebx, esi + rol ebx, 3 + mov esi, ecx + xor ecx, edx + add eax, [ebp+14h] + and ecx, ebx + xor ecx, edx + add eax, ecx + rol eax, 7 + mov ecx, ebx + xor ebx, esi + add edx, [ebp+18h] + and ebx, eax + xor ebx, esi + add edx, ebx + rol edx, 0Bh + mov ebx, eax + xor eax, ecx + add esi, [ebp+1Ch] + and eax, edx + xor eax, ecx + add esi, eax + rol esi, 13h + mov eax, edx + xor edx, ebx + add ecx, [ebp+20h] + and edx, esi + xor edx, ebx + add ecx, edx + rol ecx, 3 + mov edx, esi + xor esi, eax + add ebx, [ebp+24h] + and esi, ecx + xor esi, eax + add ebx, esi + rol ebx, 7 + mov esi, ecx + xor ecx, edx + add eax, [ebp+28h] + and ecx, ebx + xor ecx, edx + add eax, ecx + rol eax, 0Bh + mov ecx, ebx + xor ebx, esi + add edx, [ebp+2Ch] + and ebx, eax + xor ebx, esi + add edx, ebx + rol edx, 13h + mov ebx, eax + xor eax, ecx + add esi, [ebp+30h] + and eax, edx + xor eax, ecx + add esi, eax + rol esi, 3 + mov eax, edx + xor edx, ebx + add ecx, [ebp+34h] + and edx, esi + xor edx, ebx + add ecx, edx + rol ecx, 7 + mov edx, esi + xor esi, eax + add ebx, [ebp+38h] + and esi, ecx + xor esi, eax + add ebx, esi + rol ebx, 0Bh + mov esi, ecx + xor ecx, edx + add eax, [ebp+3Ch] + and ecx, ebx + xor ecx, edx + add eax, ecx + rol eax, 13h + mov edi, eax + mov ecx, eax + add edx, [ebp+0] + or eax, ebx + and edi, ebx + and eax, esi + add edx, 5A827999h + or eax, edi + add edx, eax + rol edx, 3 + mov edi, edx + mov eax, edx + add esi, [ebp+10h] + or edx, ecx + and edi, ecx + and edx, ebx + add esi, 5A827999h + or edx, edi + add esi, edx + rol esi, 5 + mov edi, esi + mov edx, esi + add ebx, [ebp+20h] + or esi, eax + and edi, eax + and esi, ecx + add ebx, 5A827999h + or esi, edi + add ebx, esi + rol ebx, 9 + mov edi, ebx + mov esi, ebx + add ecx, [ebp+30h] + or ebx, edx + and edi, edx + and ebx, eax + add ecx, 5A827999h + or ebx, edi + add ecx, ebx + rol ecx, 0Dh + mov edi, ecx + mov ebx, ecx + add eax, [ebp+4] + or ecx, esi + and edi, esi + and ecx, edx + add eax, 5A827999h + or ecx, edi + add eax, ecx + rol eax, 3 + mov edi, eax + mov ecx, eax + add edx, [ebp+14h] + or eax, ebx + and edi, ebx + and eax, esi + add edx, 5A827999h + or eax, edi + add edx, eax + rol edx, 5 + mov edi, edx + mov eax, edx + add esi, [ebp+24h] + or edx, ecx + and edi, ecx + and edx, ebx + add esi, 5A827999h + or edx, edi + add esi, edx + rol esi, 9 + mov edi, esi + mov edx, esi + add ebx, [ebp+34h] + or esi, eax + and edi, eax + and esi, ecx + add ebx, 5A827999h + or esi, edi + add ebx, esi + rol ebx, 0Dh + mov edi, ebx + mov esi, ebx + add ecx, [ebp+8] + or ebx, edx + and edi, edx + and ebx, eax + add ecx, 5A827999h + or ebx, edi + add ecx, ebx + rol ecx, 3 + mov edi, ecx + mov ebx, ecx + add eax, [ebp+18h] + or ecx, esi + and edi, esi + and ecx, edx + add eax, 5A827999h + or ecx, edi + add eax, ecx + rol eax, 5 + mov edi, eax + mov ecx, eax + add edx, [ebp+28h] + or eax, ebx + and edi, ebx + and eax, esi + add edx, 5A827999h + or eax, edi + add edx, eax + rol edx, 9 + mov edi, edx + mov eax, edx + add esi, [ebp+38h] + or edx, ecx + and edi, ecx + and edx, ebx + add esi, 5A827999h + or edx, edi + add esi, edx + rol esi, 0Dh + mov edi, esi + mov edx, esi + add ebx, [ebp+0Ch] + or esi, eax + and edi, eax + and esi, ecx + add ebx, 5A827999h + or esi, edi + add ebx, esi + rol ebx, 3 + mov edi, ebx + mov esi, ebx + add ecx, [ebp+1Ch] + or ebx, edx + and edi, edx + and ebx, eax + add ecx, 5A827999h + or ebx, edi + add ecx, ebx + rol ecx, 5 + mov edi, ecx + mov ebx, ecx + add eax, [ebp+2Ch] + or ecx, esi + and edi, esi + and ecx, edx + add eax, 5A827999h + or ecx, edi + add eax, ecx + rol eax, 9 + mov edi, eax + mov ecx, eax + add edx, [ebp+3Ch] + or eax, ebx + and edi, ebx + and eax, esi + add edx, 5A827999h + or eax, edi + add edx, eax + rol edx, 0Dh + add esi, [ebp+0] + mov eax, edx + xor edx, ecx + add esi, 6ED9EBA1h + xor edx, ebx + add esi, edx + rol esi, 3 + add ebx, [ebp+20h] + mov edx, esi + xor esi, eax + add ebx, 6ED9EBA1h + xor esi, ecx + add ebx, esi + rol ebx, 9 + add ecx, [ebp+10h] + mov esi, ebx + xor ebx, edx + add ecx, 6ED9EBA1h + xor ebx, eax + add ecx, ebx + rol ecx, 0Bh + add eax, [ebp+30h] + mov ebx, ecx + xor ecx, esi + add eax, 6ED9EBA1h + xor ecx, edx + add eax, ecx + rol eax, 0Fh + add edx, [ebp+8] + mov ecx, eax + xor eax, ebx + add edx, 6ED9EBA1h + xor eax, esi + add edx, eax + rol edx, 3 + add esi, [ebp+28h] + mov eax, edx + xor edx, ecx + add esi, 6ED9EBA1h + xor edx, ebx + add esi, edx + rol esi, 9 + add ebx, [ebp+18h] + mov edx, esi + xor esi, eax + add ebx, 6ED9EBA1h + xor esi, ecx + add ebx, esi + rol ebx, 0Bh + add ecx, [ebp+38h] + mov esi, ebx + xor ebx, edx + add ecx, 6ED9EBA1h + xor ebx, eax + add ecx, ebx + rol ecx, 0Fh + add eax, [ebp+4] + mov ebx, ecx + xor ecx, esi + add eax, 6ED9EBA1h + xor ecx, edx + add eax, ecx + rol eax, 3 + add edx, [ebp+24h] + mov ecx, eax + xor eax, ebx + add edx, 6ED9EBA1h + xor eax, esi + add edx, eax + rol edx, 9 + add esi, [ebp+14h] + mov eax, edx + xor edx, ecx + add esi, 6ED9EBA1h + xor edx, ebx + add esi, edx + rol esi, 0Bh + add ebx, [ebp+34h] + mov edx, esi + xor esi, eax + add ebx, 6ED9EBA1h + xor esi, ecx + add ebx, esi + rol ebx, 0Fh + add ecx, [ebp+0Ch] + mov esi, ebx + xor ebx, edx + add ecx, 6ED9EBA1h + xor ebx, eax + add ecx, ebx + rol ecx, 3 + add eax, [ebp+2Ch] + mov ebx, ecx + xor ecx, esi + add eax, 6ED9EBA1h + xor ecx, edx + add eax, ecx + rol eax, 9 + add edx, [ebp+1Ch] + mov ecx, eax + xor eax, ebx + add edx, 6ED9EBA1h + xor eax, esi + add edx, eax + rol edx, 0Bh + add esi, [ebp+3Ch] + mov eax, edx + xor edx, ecx + add esi, 6ED9EBA1h + xor edx, ebx + add esi, edx + rol esi, 0Fh + mov edx, [esp+28h] + add [edx+8], ebx + add [edx+0Ch], esi + add [edx+10h], eax + add [edx+14h], ecx + retn + +global _MD4_Add_p5@12 +align 10h +_MD4_Add_p5@12: + pusha + mov ecx, [esp+20h+12] + and ecx, ecx + jz get_out + xor edx, edx + mov ebp, [esp+20h+8] + mov edi, [esp+20h+4] + mov ebx, [edi] + mov eax, ebx + add ebx, ecx + mov [edi], ebx + adc [edi+4], edx + and eax, 3Fh + jnz partial_buffer +full_blocks: + mov ecx, [esp+20h+12] + and ecx, ecx + jz get_out + sub ecx, 40h + jb end_of_stream + mov [esp+20h+12], ecx + call _MD4_Transform_p5@0 + add ebp, 40h + jmp full_blocks +end_of_stream: + mov edi, [esp+20h+4] + mov esi, ebp + lea edi, [edi+18h] + add ecx, 40h + rep movsb + jmp get_out +partial_buffer: + add ecx, eax + cmp ecx, 40h + jb short_stream + mov ecx, 0FFFFFFC0h + add ecx, eax + add [esp+20h+12], ecx +loc: + mov bl, [ebp+0] + inc ebp + mov [edi+ecx+58h], bl + inc ecx + jnz loc + mov [esp+20h+8], ebp + lea ebp, [edi+18h] + call _MD4_Transform_p5@0 + mov ebp, [esp+20h+8] + jmp full_blocks +short_stream: + sub ecx, eax + mov esi, ebp + lea edi, [edi+eax+18h] + rep movsb +get_out: + popa + retn 0Ch \ No newline at end of file diff --git a/hasher/asm/nasm/MD5x64.asm b/hasher/asm/nasm/MD5x64.asm new file mode 100644 index 000000000..432ac70f1 --- /dev/null +++ b/hasher/asm/nasm/MD5x64.asm @@ -0,0 +1,815 @@ +SECTION .text +global MD5_x64 +align 10h + +MD5_x64: + push rbp + push rbx + push r12 + push r13 + push r14 + push r15 + push rsi + push rdi +; parameter 1 in rcx, param 2 in rdx , param 3 in r8 + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + ;# rdi = arg #1 (ctx, MD5_CTX pointer) + ;# rsi = arg #2 (ptr, data pointer) + ;# rdx = arg #3 (nbr, number of 16-word blocks to process) + + mov rsi,rdx + mov edx,r8d + + mov r12,rcx ;# rbp = ctx + shl rdx,6 ;# rdx = nbr in bytes + push r12 + lea rdi,[rsi+rdx]; # rdi = end + + mov eax,DWORD 0[r12] ;# eax = ctx->A + mov ebx,DWORD 4[r12] ;# ebx = ctx->B + mov ecx,DWORD 8[r12] ;# ecx = ctx->C + mov edx,DWORD 12[r12] ;# edx = ctx->D + ;push rbp ;# save ctx + ;# end is 'rdi' + ;# ptr is 'rsi' + ;# A is 'eax' + ;# B is 'ebx' + ;# C is 'ecx' + ;# D is 'edx' + + + + cmp rsi,rdi ;# cmp end with ptr + mov r13d,0ffffffffh + je lab1 ;# jmp if ptr == end + + ;# BEGIN of loop over 16-word blocks +lab2: ;# save old values of A, B, C, D + mov r8d,eax + mov r9d,ebx + mov r14d,ecx + mov r15d,edx +; BEGIN of the round serie + mov r10 , QWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , edx ;/* (NEXT STEP) z' = %edx */ + + xor r11d,ecx ;/* y ^ ... */ + lea eax,DWORD 0d76aa478h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD 0e8c7b756h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD 0242070dbh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + + lea ebx,DWORD 0c1bdceeeh [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + xor r11d,ecx ;/* y ^ ... */ + + lea eax,DWORD 0f57c0fafh [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD 04787c62ah [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD 0a8304613h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + lea ebx,DWORD 0fd469501h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + xor r11d,ecx ;/* y ^ ... */ + lea eax,DWORD 0698098d8h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD 08b44f7afh [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD 0ffff5bb1h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + lea ebx,DWORD 0895cd7beh [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + xor r11d,ecx ;/* y ^ ... */ + lea eax,DWORD 06b901122h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ebx ;/* x & ... */ + xor r11d,edx ;/* z ^ ... */ + ;mov r10d,DWORD (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + shr r10,32 + add eax,r11d ;/* dst += ... */ + rol eax, 7 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) z' = ecx */ + add eax , ebx ;/* dst += x */ + xor r11d,ebx ;/* y ^ ... */ + lea edx,DWORD 0fd987193h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,eax ;/* x & ... */ + xor r11d,ecx ;/* z ^ ... */ + mov r10,QWORD (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + add edx,r11d ;/* dst += ... */ + rol edx, 12 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) z' = ebx */ + add edx , eax ;/* dst += x */ + xor r11d,eax ;/* y ^ ... */ + lea ecx,DWORD 0a679438eh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,edx ;/* x & ... */ + xor r11d,ebx ;/* z ^ ... */ + ;mov r10d,DWORD (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + shr r10,32 + add ecx,r11d ;/* dst += ... */ + rol ecx, 17 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) z' = eax */ + add ecx , edx ;/* dst += x */ + xor r11d,edx ;/* y ^ ... */ + lea ebx,DWORD 049b40821h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + and r11d,ecx ;/* x & ... */ + xor r11d,eax ;/* z ^ ... */ + mov r10,QWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + add ebx,r11d ;/* dst += ... */ + rol ebx, 22 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) z' = edx */ + add ebx , ecx ;/* dst += x */ + mov r10d , 4 [rsi] ;/* (NEXT STEP) X[1] */ + mov r11d, edx ;/* (NEXT STEP) z' = %edx */ + mov r12d, edx ;/* (NEXT STEP) z' = %edx */ + not r11d + lea eax,DWORD 0f61e2562h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (6*4) [rsi] ;/* (NEXT STEP) X[6] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD 0c040b340h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (11*4) [rsi] ;/* (NEXT STEP) X[11] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD 0265e5a51h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (0*4) [rsi] ;/* (NEXT STEP) X[0] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD 0e9b6c7aah [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (5*4) [rsi] ;/* (NEXT STEP) X[5] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + not r11d + lea eax,DWORD 0d62f105dh [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (10*4) [rsi] ;/* (NEXT STEP) X[10] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD 02441453h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (15*4) [rsi] ;/* (NEXT STEP) X[15] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD 0d8a1e681h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (4*4) [rsi] ;/* (NEXT STEP) X[4] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD 0e7d3fbc8h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (9*4) [rsi] ;/* (NEXT STEP) X[9] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + not r11d + lea eax,DWORD 021e1cde6h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (14*4) [rsi] ;/* (NEXT STEP) X[14] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD 0c33707d6h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (3*4) [rsi] ;/* (NEXT STEP) X[3] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD 0f4d50d87h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (8*4) [rsi] ;/* (NEXT STEP) X[8] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD 0455a14edh [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (13*4) [rsi] ;/* (NEXT STEP) X[13] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + not r11d + lea eax,DWORD 0a9e3e905h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ebx ;/* x & z */ + and r11d,ecx ;/* y & (not z) */ + + mov r10d , (2*4) [rsi] ;/* (NEXT STEP) X[2] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ecx ;/* (NEXT STEP) z' = ecx */ + add eax, r12d ; /* dst += ... */ + mov r12d,ecx ;/* (NEXT STEP) z' = ecx */ + + + rol eax , 5 ;/* dst <<< s */ + add eax , ebx ;/* dst += x */ + not r11d + lea edx,DWORD 0fcefa3f8h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,eax ;/* x & z */ + and r11d,ebx ;/* y & (not z) */ + + mov r10d , (7*4) [rsi] ;/* (NEXT STEP) X[7] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,ebx ;/* (NEXT STEP) z' = ebx */ + add edx, r12d ; /* dst += ... */ + mov r12d,ebx ;/* (NEXT STEP) z' = ebx */ + + + rol edx , 9 ;/* dst <<< s */ + add edx , eax ;/* dst += x */ + not r11d + lea ecx,DWORD 0676f02d9h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,edx ;/* x & z */ + and r11d,eax ;/* y & (not z) */ + + mov r10d , (12*4) [rsi] ;/* (NEXT STEP) X[12] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,eax ;/* (NEXT STEP) z' = eax */ + add ecx, r12d ; /* dst += ... */ + mov r12d,eax ;/* (NEXT STEP) z' = eax */ + + + rol ecx , 14 ;/* dst <<< s */ + add ecx , edx ;/* dst += x */ + not r11d + lea ebx,DWORD 08d2a4c8ah [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + + and r12d,ecx ;/* x & z */ + and r11d,edx ;/* y & (not z) */ + + mov r10d , (0*4) [rsi] ;/* (NEXT STEP) X[0] */ + + + + or r12d,r11d ;/* (y & (not z)) | (x & z) */ + mov r11d,edx ;/* (NEXT STEP) z' = edx */ + add ebx, r12d ; /* dst += ... */ + mov r12d,edx ;/* (NEXT STEP) z' = edx */ + + + rol ebx , 20 ;/* dst <<< s */ + add ebx , ecx ;/* dst += x */ + mov r10d , (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + mov r11d , ecx ;/* (NEXT STEP) y' = %ecx */ + lea eax,DWORD 0fffa3942h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 08771f681h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 06d9d6122h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 0fde5380ch [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD 0a4beea44h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 04bdecfa9h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 0f6bb4b60h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 0bebfbc70h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD 0289b7ec6h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 0eaa127fah [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 0d4ef3085h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 04881d05h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD 0d9d4d039h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + xor r11d,edx ;/* z ^ ... */ + xor r11d,ebx ;/* x ^ ... */ + add eax , r11d ;/* dst += ... */ + rol eax , 4 ;/* dst <<< s */ + mov r11d , ebx ;/* (NEXT STEP) y' = ebx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 0e6db99e5h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + xor r11d,ecx ;/* z ^ ... */ + xor r11d,eax ;/* x ^ ... */ + add edx , r11d ;/* dst += ... */ + rol edx , 11 ;/* dst <<< s */ + mov r11d , eax ;/* (NEXT STEP) y' = eax */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 01fa27cf8h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + xor r11d,ebx ;/* z ^ ... */ + xor r11d,edx ;/* x ^ ... */ + add ecx , r11d ;/* dst += ... */ + rol ecx , 16 ;/* dst <<< s */ + mov r11d , edx ;/* (NEXT STEP) y' = edx */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 0c4ac5665h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + mov r10d,DWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + xor r11d,eax ;/* z ^ ... */ + xor r11d,ecx ;/* x ^ ... */ + add ebx , r11d ;/* dst += ... */ + rol ebx , 23 ;/* dst <<< s */ + mov r11d , ecx ;/* (NEXT STEP) y' = ecx */ + add ebx , ecx ;/* dst += x */ + mov r10d , (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , r13d ;0ffffffffh ;%r11d + xor r11d , edx ;/* (NEXT STEP) not z' = not %edx*/ + lea eax,DWORD 0f4292244h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD (7*4)[rsi] ;/* (NEXT STEP) X[7] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 0432aff97h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD (14*4)[rsi] ;/* (NEXT STEP) X[14] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 0ab9423a7h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD (5*4)[rsi] ;/* (NEXT STEP) X[5] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 0fc93a039h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD (12*4)[rsi] ;/* (NEXT STEP) X[12] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD 0655b59c3h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD (3*4)[rsi] ;/* (NEXT STEP) X[3] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 08f0ccc92h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD (10*4)[rsi] ;/* (NEXT STEP) X[10] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 0ffeff47dh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD (1*4)[rsi] ;/* (NEXT STEP) X[1] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 085845dd1h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD (8*4)[rsi] ;/* (NEXT STEP) X[8] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD 06fa87e4fh [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD (15*4)[rsi] ;/* (NEXT STEP) X[15] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 0fe2ce6e0h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD (6*4)[rsi] ;/* (NEXT STEP) X[6] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 0a3014314h [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD (13*4)[rsi] ;/* (NEXT STEP) X[13] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 04e0811a1h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD (4*4)[rsi] ;/* (NEXT STEP) X[4] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ + lea eax,DWORD 0f7537e82h [ eax * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ebx ;/* x | ... */ + xor r11d , ecx ;/* y ^ ... */ + add eax , r11d ;/* dst += ... */ + mov r10d , DWORD (11*4)[rsi] ;/* (NEXT STEP) X[11] */ + mov r11d , r13d ; 0ffffffffh + rol eax , 6 ;/* dst <<< s */ + xor r11d , ecx ;/* (NEXT STEP) not z' = not ecx */ + add eax , ebx ;/* dst += x */ + lea edx,DWORD 0bd3af235h [ edx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , eax ;/* x | ... */ + xor r11d , ebx ;/* y ^ ... */ + add edx , r11d ;/* dst += ... */ + mov r10d , DWORD (2*4)[rsi] ;/* (NEXT STEP) X[2] */ + mov r11d , r13d ; 0ffffffffh + rol edx , 10 ;/* dst <<< s */ + xor r11d , ebx ;/* (NEXT STEP) not z' = not ebx */ + add edx , eax ;/* dst += x */ + lea ecx,DWORD 02ad7d2bbh [ ecx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , edx ;/* x | ... */ + xor r11d , eax ;/* y ^ ... */ + add ecx , r11d ;/* dst += ... */ + mov r10d , DWORD (9*4)[rsi] ;/* (NEXT STEP) X[9] */ + mov r11d , r13d ; 0ffffffffh + rol ecx , 15 ;/* dst <<< s */ + xor r11d , eax ;/* (NEXT STEP) not z' = not eax */ + add ecx , edx ;/* dst += x */ + lea ebx,DWORD 0eb86d391h [ ebx * 1 +r10d ] ;/* Const + dst + ... */ + or r11d , ecx ;/* x | ... */ + xor r11d , edx ;/* y ^ ... */ + add ebx , r11d ;/* dst += ... */ + mov r10d , DWORD (0*4)[rsi] ;/* (NEXT STEP) X[0] */ + mov r11d , r13d ; 0ffffffffh + rol ebx , 21 ;/* dst <<< s */ + xor r11d , edx ;/* (NEXT STEP) not z' = not edx */ + add ebx , ecx ;/* dst += x */ +; # add old values of A, B, C, D + add eax,r8d + add ebx,r9d + add ecx,r14d + add edx,r15d + +; # loop control + add rsi,64 ;# ptr += 64 + cmp rsi,rdi ;# cmp end with ptr + jb lab2 ;# jmp if ptr < end +; # END of loop over 16-word blocks + +lab1: ;pop rbp ;# restore ctx +pop r12 + mov DWORD 0[r12],eax ;# ctx->A = A + mov DWORD 4[r12],ebx ;# ctx->B = B + mov DWORD 8[r12],ecx ;# ctx->C = C + mov DWORD 12[r12],edx ;# ctx->D = D + + pop rdi + pop rsi + pop r15 + pop r14 + pop r13 + pop r12 + pop rbx + pop rbp + ret + + diff --git a/hasher/asm/nasm/MD5x86.asm b/hasher/asm/nasm/MD5x86.asm new file mode 100644 index 000000000..15d82ce01 --- /dev/null +++ b/hasher/asm/nasm/MD5x86.asm @@ -0,0 +1,639 @@ +section .text + +global _MD5_Transform_p5@0 +align 10h + +_MD5_Transform_p5@0: + mov edi, [esp+28h] + mov eax, [edi+8] + mov ebx, [edi+0Ch] + mov ecx, [edi+10h] + mov edx, [edi+14h] + mov esi, ecx + xor ecx, edx + add eax, [ebp+0] + and ecx, ebx + add eax, 0D76AA478h + xor ecx, edx + add eax, ecx + rol eax, 7 + add eax, ebx + mov ecx, ebx + xor ebx, esi + add edx, [ebp+4] + and ebx, eax + add edx, 0E8C7B756h + xor ebx, esi + add edx, ebx + rol edx, 0Ch + add edx, eax + mov ebx, eax + xor eax, ecx + add esi, [ebp+8] + and eax, edx + add esi, 242070DBh + xor eax, ecx + add esi, eax + rol esi, 11h + add esi, edx + mov eax, edx + xor edx, ebx + add ecx, [ebp+0Ch] + and edx, esi + add ecx, 0C1BDCEEEh + xor edx, ebx + add ecx, edx + rol ecx, 16h + add ecx, esi + mov edx, esi + xor esi, eax + add ebx, [ebp+10h] + and esi, ecx + add ebx, 0F57C0FAFh + xor esi, eax + add ebx, esi + rol ebx, 7 + add ebx, ecx + mov esi, ecx + xor ecx, edx + add eax, [ebp+14h] + and ecx, ebx + add eax, 4787C62Ah + xor ecx, edx + add eax, ecx + rol eax, 0Ch + add eax, ebx + mov ecx, ebx + xor ebx, esi + add edx, [ebp+18h] + and ebx, eax + add edx, 0A8304613h + xor ebx, esi + add edx, ebx + rol edx, 11h + add edx, eax + mov ebx, eax + xor eax, ecx + add esi, [ebp+1Ch] + and eax, edx + add esi, 0FD469501h + xor eax, ecx + add esi, eax + rol esi, 16h + add esi, edx + mov eax, edx + xor edx, ebx + add ecx, [ebp+20h] + and edx, esi + add ecx, 698098D8h + xor edx, ebx + add ecx, edx + rol ecx, 7 + add ecx, esi + mov edx, esi + xor esi, eax + add ebx, [ebp+24h] + and esi, ecx + add ebx, 8B44F7AFh + xor esi, eax + add ebx, esi + rol ebx, 0Ch + add ebx, ecx + mov esi, ecx + xor ecx, edx + add eax, [ebp+28h] + and ecx, ebx + add eax, 0FFFF5BB1h + xor ecx, edx + add eax, ecx + rol eax, 11h + add eax, ebx + mov ecx, ebx + xor ebx, esi + add edx, [ebp+2Ch] + and ebx, eax + add edx, 895CD7BEh + xor ebx, esi + add edx, ebx + rol edx, 16h + add edx, eax + mov ebx, eax + xor eax, ecx + add esi, [ebp+30h] + and eax, edx + add esi, 6B901122h + xor eax, ecx + add esi, eax + rol esi, 7 + add esi, edx + mov eax, edx + xor edx, ebx + add ecx, [ebp+34h] + and edx, esi + add ecx, 0FD987193h + xor edx, ebx + add ecx, edx + rol ecx, 0Ch + add ecx, esi + mov edx, esi + xor esi, eax + add ebx, [ebp+38h] + and esi, ecx + add ebx, 0A679438Eh + xor esi, eax + add ebx, esi + rol ebx, 11h + add ebx, ecx + mov esi, ecx + xor ecx, edx + add eax, [ebp+3Ch] + and ecx, ebx + add eax, 49B40821h + xor ecx, edx + add eax, ecx + rol eax, 16h + add eax, ebx + mov ecx, eax + xor eax, ebx + add edx, [ebp+4] + and eax, esi + add edx, 0F61E2562h + xor eax, ebx + add edx, eax + rol edx, 5 + add edx, ecx + mov eax, edx + xor edx, ecx + add esi, [ebp+18h] + and edx, ebx + add esi, 0C040B340h + xor edx, ecx + add esi, edx + rol esi, 9 + add esi, eax + mov edx, esi + xor esi, eax + add ebx, [ebp+2Ch] + and esi, ecx + add ebx, 265E5A51h + xor esi, eax + add ebx, esi + rol ebx, 0Eh + add ebx, edx + mov esi, ebx + xor ebx, edx + add ecx, [ebp+0] + and ebx, eax + add ecx, 0E9B6C7AAh + xor ebx, edx + add ecx, ebx + rol ecx, 14h + add ecx, esi + mov ebx, ecx + xor ecx, esi + add eax, [ebp+14h] + and ecx, edx + add eax, 0D62F105Dh + xor ecx, esi + add eax, ecx + rol eax, 5 + add eax, ebx + mov ecx, eax + xor eax, ebx + add edx, [ebp+28h] + and eax, esi + add edx, 2441453h + xor eax, ebx + add edx, eax + rol edx, 9 + add edx, ecx + mov eax, edx + xor edx, ecx + add esi, [ebp+3Ch] + and edx, ebx + add esi, 0D8A1E681h + xor edx, ecx + add esi, edx + rol esi, 0Eh + add esi, eax + mov edx, esi + xor esi, eax + add ebx, [ebp+10h] + and esi, ecx + add ebx, 0E7D3FBC8h + xor esi, eax + add ebx, esi + rol ebx, 14h + add ebx, edx + mov esi, ebx + xor ebx, edx + add ecx, [ebp+24h] + and ebx, eax + add ecx, 21E1CDE6h + xor ebx, edx + add ecx, ebx + rol ecx, 5 + add ecx, esi + mov ebx, ecx + xor ecx, esi + add eax, [ebp+38h] + and ecx, edx + add eax, 0C33707D6h + xor ecx, esi + add eax, ecx + rol eax, 9 + add eax, ebx + mov ecx, eax + xor eax, ebx + add edx, [ebp+0Ch] + and eax, esi + add edx, 0F4D50D87h + xor eax, ebx + add edx, eax + rol edx, 0Eh + add edx, ecx + mov eax, edx + xor edx, ecx + add esi, [ebp+20h] + and edx, ebx + add esi, 455A14EDh + xor edx, ecx + add esi, edx + rol esi, 14h + add esi, eax + mov edx, esi + xor esi, eax + add ebx, [ebp+34h] + and esi, ecx + add ebx, 0A9E3E905h + xor esi, eax + add ebx, esi + rol ebx, 5 + add ebx, edx + mov esi, ebx + xor ebx, edx + add ecx, [ebp+8] + and ebx, eax + add ecx, 0FCEFA3F8h + xor ebx, edx + add ecx, ebx + rol ecx, 9 + add ecx, esi + mov ebx, ecx + xor ecx, esi + add eax, [ebp+1Ch] + and ecx, edx + add eax, 676F02D9h + xor ecx, esi + add eax, ecx + rol eax, 0Eh + add eax, ebx + mov ecx, eax + xor eax, ebx + add edx, [ebp+30h] + and eax, esi + add edx, 8D2A4C8Ah + xor eax, ebx + add edx, eax + rol edx, 14h + add edx, ecx + mov eax, edx + xor edx, ecx + add esi, [ebp+14h] + xor edx, ebx + add esi, 0FFFA3942h + add esi, edx + rol esi, 4 + add esi, eax + mov edx, esi + xor esi, eax + add ebx, [ebp+20h] + xor esi, ecx + add ebx, 8771F681h + add ebx, esi + rol ebx, 0Bh + add ebx, edx + mov esi, ebx + xor ebx, edx + add ecx, [ebp+2Ch] + xor ebx, eax + add ecx, 6D9D6122h + add ecx, ebx + rol ecx, 10h + add ecx, esi + mov ebx, ecx + xor ecx, esi + add eax, [ebp+38h] + xor ecx, edx + add eax, 0FDE5380Ch + add eax, ecx + rol eax, 17h + add eax, ebx + mov ecx, eax + xor eax, ebx + add edx, [ebp+4] + xor eax, esi + add edx, 0A4BEEA44h + add edx, eax + rol edx, 4 + add edx, ecx + mov eax, edx + xor edx, ecx + add esi, [ebp+10h] + xor edx, ebx + add esi, 4BDECFA9h + add esi, edx + rol esi, 0Bh + add esi, eax + mov edx, esi + xor esi, eax + add ebx, [ebp+1Ch] + xor esi, ecx + add ebx, 0F6BB4B60h + add ebx, esi + rol ebx, 10h + add ebx, edx + mov esi, ebx + xor ebx, edx + add ecx, [ebp+28h] + xor ebx, eax + add ecx, 0BEBFBC70h + add ecx, ebx + rol ecx, 17h + add ecx, esi + mov ebx, ecx + xor ecx, esi + add eax, [ebp+34h] + xor ecx, edx + add eax, 289B7EC6h + add eax, ecx + rol eax, 4 + add eax, ebx + mov ecx, eax + xor eax, ebx + add edx, [ebp+0] + xor eax, esi + add edx, 0EAA127FAh + add edx, eax + rol edx, 0Bh + add edx, ecx + mov eax, edx + xor edx, ecx + add esi, [ebp+0Ch] + xor edx, ebx + add esi, 0D4EF3085h + add esi, edx + rol esi, 10h + add esi, eax + mov edx, esi + xor esi, eax + add ebx, [ebp+18h] + xor esi, ecx + add ebx, 4881D05h + add ebx, esi + rol ebx, 17h + add ebx, edx + mov esi, ebx + xor ebx, edx + add ecx, [ebp+24h] + xor ebx, eax + add ecx, 0D9D4D039h + add ecx, ebx + rol ecx, 4 + add ecx, esi + mov ebx, ecx + xor ecx, esi + add eax, [ebp+30h] + xor ecx, edx + add eax, 0E6DB99E5h + add eax, ecx + rol eax, 0Bh + add eax, ebx + mov ecx, eax + xor eax, ebx + add edx, [ebp+3Ch] + xor eax, esi + add edx, 1FA27CF8h + add edx, eax + rol edx, 10h + add edx, ecx + mov eax, edx + xor edx, ecx + add esi, [ebp+8] + xor edx, ebx + add esi, 0C4AC5665h + add esi, edx + rol esi, 17h + add esi, eax + mov edx, ecx + not ecx + add ebx, [ebp+0] + or ecx, esi + add ebx, 0F4292244h + xor ecx, eax + add ebx, ecx + rol ebx, 6 + add ebx, esi + mov ecx, eax + not eax + add edx, [ebp+1Ch] + or eax, ebx + add edx, 432AFF97h + xor eax, esi + add edx, eax + rol edx, 0Ah + add edx, ebx + mov eax, esi + not esi + add ecx, [ebp+38h] + or esi, edx + add ecx, 0AB9423A7h + xor esi, ebx + add ecx, esi + rol ecx, 0Fh + add ecx, edx + mov esi, ebx + not ebx + add eax, [ebp+14h] + or ebx, ecx + add eax, 0FC93A039h + xor ebx, edx + add eax, ebx + rol eax, 15h + add eax, ecx + mov ebx, edx + not edx + add esi, [ebp+30h] + or edx, eax + add esi, 655B59C3h + xor edx, ecx + add esi, edx + rol esi, 6 + add esi, eax + mov edx, ecx + not ecx + add ebx, [ebp+0Ch] + or ecx, esi + add ebx, 8F0CCC92h + xor ecx, eax + add ebx, ecx + rol ebx, 0Ah + add ebx, esi + mov ecx, eax + not eax + add edx, [ebp+28h] + or eax, ebx + add edx, 0FFEFF47Dh + xor eax, esi + add edx, eax + rol edx, 0Fh + add edx, ebx + mov eax, esi + not esi + add ecx, [ebp+4] + or esi, edx + add ecx, 85845DD1h + xor esi, ebx + add ecx, esi + rol ecx, 15h + add ecx, edx + mov esi, ebx + not ebx + add eax, [ebp+20h] + or ebx, ecx + add eax, 6FA87E4Fh + xor ebx, edx + add eax, ebx + rol eax, 6 + add eax, ecx + mov ebx, edx + not edx + add esi, [ebp+3Ch] + or edx, eax + add esi, 0FE2CE6E0h + xor edx, ecx + add esi, edx + rol esi, 0Ah + add esi, eax + mov edx, ecx + not ecx + add ebx, [ebp+18h] + or ecx, esi + add ebx, 0A3014314h + xor ecx, eax + add ebx, ecx + rol ebx, 0Fh + add ebx, esi + mov ecx, eax + not eax + add edx, [ebp+34h] + or eax, ebx + add edx, 4E0811A1h + xor eax, esi + add edx, eax + rol edx, 15h + add edx, ebx + mov eax, esi + not esi + add ecx, [ebp+10h] + or esi, edx + add ecx, 0F7537E82h + xor esi, ebx + add ecx, esi + rol ecx, 6 + add ecx, edx + mov esi, ebx + not ebx + add eax, [ebp+2Ch] + or ebx, ecx + add eax, 0BD3AF235h + xor ebx, edx + add eax, ebx + rol eax, 0Ah + add eax, ecx + mov ebx, edx + not edx + add esi, [ebp+8] + or edx, eax + add esi, 2AD7D2BBh + xor edx, ecx + add esi, edx + rol esi, 0Fh + add esi, eax + mov edx, ecx + not ecx + add ebx, [ebp+24h] + or ecx, esi + add ebx, 0EB86D391h + xor ecx, eax + add ebx, ecx + rol ebx, 15h + add ebx, esi + add [edi+8], edx + add [edi+0Ch], ebx + add [edi+10h], esi + add [edi+14h], eax + retn + +global _MD5_Add_p5@12 +align 10h + +_MD5_Add_p5@12: + pusha + mov ecx, [esp+20h+12] + and ecx, ecx + jz get_out + xor edx, edx + mov ebp, [esp+20h+8] + mov edi, [esp+20h+4] + mov ebx, [edi] + mov eax, ebx + add ebx, ecx + mov [edi], ebx + adc [edi+4], edx + and eax, 3Fh + jnz partial_buffer +full_blocks: + mov ecx, [esp+20h+12] + and ecx, ecx + jz get_out + sub ecx, 40h + jb end_of_stream + mov [esp+20h+12], ecx + call _MD5_Transform_p5@0 + add ebp, 40h + jmp full_blocks +end_of_stream: + mov edi, [esp+20h+4] + mov esi, ebp + lea edi, [edi+18h] + add ecx, 40h + rep movsb + jmp get_out +partial_buffer: + add ecx, eax + cmp ecx, 40h + jb short_stream + mov ecx, 0FFFFFFC0h + add ecx, eax + add [esp+20h+12], ecx +loc: + mov bl, [ebp+0] + inc ebp + mov [edi+ecx+58h], bl + inc ecx + jnz loc + mov [esp+20h+8], ebp + lea ebp, [edi+18h] + call _MD5_Transform_p5@0 + mov ebp, [esp+20h+8] + jmp full_blocks +short_stream: + sub ecx, eax + mov esi, ebp + lea edi, [edi+eax+18h] + rep movsb +get_out: + popa + retn 0Ch + \ No newline at end of file diff --git a/hasher/asm/nasm/SHA1x64.asm b/hasher/asm/nasm/SHA1x64.asm new file mode 100644 index 000000000..ff1aa4283 --- /dev/null +++ b/hasher/asm/nasm/SHA1x64.asm @@ -0,0 +1,1484 @@ +section .text + +global sha1_block_asm_data_order +align 10h + +sha1_block_asm_data_order: + +push rdi +push rsi +push rbx +push rbp + + +push r12 +push r13 +push r14 +push r15 +mov r9,rcx + +; c = rcx +; p = rdx +; num = r8 + + shl r8, 6 + mov r11,rdx + + add r8, r11 + mov rbp, rcx + + mov edx, DWORD 12[rbp] + sub rsp, 120 + mov edi, DWORD 16[rbp] + mov ebx, DWORD 8[rbp] + mov QWORD 112[rsp],r8 + ; First we need to setup the X array +$L000start: + ; First, load the words onto the stack in network byte order + mov r12d, DWORD [r11] + mov r13d, DWORD 4[r11] + bswap r12d + bswap r13d + + mov r14d, DWORD 8[r11] + mov r15d, DWORD 12[r11] + bswap r14d + bswap r15d + + mov r10d, DWORD 16[r11] + mov r8d, DWORD 20[r11] + bswap r10d + bswap r8d + + mov eax, DWORD 24[r11] + mov ecx, DWORD 28[r11] + bswap eax + bswap ecx + mov DWORD 24[rsp],eax + mov DWORD 28[rsp],ecx + mov eax, DWORD 32[r11] + mov ecx, DWORD 36[r11] + bswap eax + bswap ecx + mov DWORD 32[rsp],eax + mov DWORD 36[rsp],ecx + mov eax, DWORD 40[r11] + mov ecx, DWORD 44[r11] + bswap eax + bswap ecx + mov DWORD 40[rsp],eax + mov DWORD 44[rsp],ecx + mov eax, DWORD 48[r11] + mov ecx, DWORD 52[r11] + bswap eax + bswap ecx + mov DWORD 48[rsp],eax + mov DWORD 52[rsp],ecx + mov eax, DWORD 56[r11] + mov ecx, DWORD 60[r11] + bswap eax + bswap ecx + mov DWORD 56[rsp],eax + mov DWORD 60[rsp],ecx + ; We now have the X array on the stack + ; starting at sp-4 + ;;;;;mov DWORD 132[rsp],esi + +$L001shortcut: + ; + ; Start processing + mov eax, DWORD [r9] + mov ecx, DWORD 4[r9] + ; 00_15 0 + mov esi, ebx + mov ebp, eax + rol ebp, 5 + xor esi, edx + and esi, ecx + add ebp, edi +; mov edi, r12d + xor esi, edx + ror ecx, 2 + lea ebp, DWORD 1518500249[r12d*1+ebp] + add ebp, esi + ; 00_15 1 + mov edi, ecx + mov esi, ebp + rol ebp, 5 + xor edi, ebx + and edi, eax + add ebp, edx +; mov edx, r13d + xor edi, ebx + ror eax, 2 + lea ebp, DWORD 1518500249[r13d*1+ebp] + add ebp, edi + ; 00_15 2 + mov edx, eax + mov edi, ebp + rol ebp, 5 + xor edx, ecx + and edx, esi + add ebp, ebx +; mov ebx, r14d + xor edx, ecx + ror esi, 2 + lea ebp, DWORD 1518500249[r14d*1+ebp] + add ebp, edx + ; 00_15 3 + mov ebx, esi + mov edx, ebp + rol ebp, 5 + xor ebx, eax + and ebx, edi + add ebp, ecx + mov ecx, r15d + xor ebx, eax + ror edi, 2 + lea ebp, DWORD 1518500249[ecx*1+ebp] + add ebp, ebx + ; 00_15 4 + mov ecx, edi + mov ebx, ebp + rol ebp, 5 + xor ecx, esi + and ecx, edx + add ebp, eax + mov eax, r10d + xor ecx, esi + ror edx, 2 + lea ebp, DWORD 1518500249[eax*1+ebp] + add ebp, ecx + ; 00_15 5 + mov eax, edx + mov ecx, ebp + rol ebp, 5 + xor eax, edi + and eax, ebx + add ebp, esi + mov esi, r8d + xor eax, edi + ror ebx, 2 + lea ebp, DWORD 1518500249[esi*1+ebp] + add ebp, eax + ; 00_15 6 + mov esi, ebx + mov eax, ebp + rol ebp, 5 + xor esi, edx + and esi, ecx + add ebp, edi + mov edi, DWORD 24[rsp] + xor esi, edx + ror ecx, 2 + lea ebp, DWORD 1518500249[edi*1+ebp] + add ebp, esi + ; 00_15 7 + mov edi, ecx + mov esi, ebp + rol ebp, 5 + xor edi, ebx + and edi, eax + add ebp, edx + mov edx, DWORD 28[rsp] + xor edi, ebx + ror eax, 2 + lea ebp, DWORD 1518500249[edx*1+ebp] + add ebp, edi + ; 00_15 8 + mov edx, eax + mov edi, ebp + rol ebp, 5 + xor edx, ecx + and edx, esi + add ebp, ebx + mov ebx, DWORD 32[rsp] + xor edx, ecx + ror esi, 2 + lea ebp, DWORD 1518500249[ebx*1+ebp] + add ebp, edx + ; 00_15 9 + mov ebx, esi + mov edx, ebp + rol ebp, 5 + xor ebx, eax + and ebx, edi + add ebp, ecx + mov ecx, DWORD 36[rsp] + xor ebx, eax + ror edi, 2 + lea ebp, DWORD 1518500249[ecx*1+ebp] + add ebp, ebx + ; 00_15 10 + mov ecx, edi + mov ebx, ebp + rol ebp, 5 + xor ecx, esi + and ecx, edx + add ebp, eax + mov eax, DWORD 40[rsp] + xor ecx, esi + ror edx, 2 + lea ebp, DWORD 1518500249[eax*1+ebp] + add ebp, ecx + ; 00_15 11 + mov eax, edx + mov ecx, ebp + rol ebp, 5 + xor eax, edi + and eax, ebx + add ebp, esi + mov esi, DWORD 44[rsp] + xor eax, edi + ror ebx, 2 + lea ebp, DWORD 1518500249[esi*1+ebp] + add ebp, eax + ; 00_15 12 + mov esi, ebx + mov eax, ebp + rol ebp, 5 + xor esi, edx + and esi, ecx + add ebp, edi + mov edi, DWORD 48[rsp] + xor esi, edx + ror ecx, 2 + lea ebp, DWORD 1518500249[edi*1+ebp] + add ebp, esi + ; 00_15 13 + mov edi, ecx + mov esi, ebp + rol ebp, 5 + xor edi, ebx + and edi, eax + add ebp, edx + mov edx, DWORD 52[rsp] + xor edi, ebx + ror eax, 2 + lea ebp, DWORD 1518500249[edx*1+ebp] + add ebp, edi + ; 00_15 14 + mov edx, eax + mov edi, ebp + rol ebp, 5 + xor edx, ecx + and edx, esi + add ebp, ebx + mov ebx, DWORD 56[rsp] + xor edx, ecx + ror esi, 2 + lea ebp, DWORD 1518500249[ebx*1+ebp] + add ebp, edx + ; 00_15 15 + mov ebx, esi + mov edx, ebp + rol ebp, 5 + xor ebx, eax + and ebx, edi + add ebp, ecx + mov ecx, DWORD 60[rsp] + xor ebx, eax + ror edi, 2 + lea ebp, DWORD 1518500249[ecx*1+ebp] + add ebx, ebp + ; 16_19 16 + mov ecx, r14d + mov ebp, edi + xor ecx, r12d + xor ebp, esi + xor ecx, DWORD 32[rsp] + and ebp, edx + ror edx, 2 + xor ecx, DWORD 52[rsp] + rol ecx, 1 + xor ebp, esi + mov r12d,ecx + lea ecx, DWORD 1518500249[eax*1+ecx] + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 16_19 17 + mov eax, r15d + mov ebp, edx + xor eax, r13d + xor ebp, edi + xor eax, DWORD 36[rsp] + and ebp, ebx + ror ebx, 2 + xor eax, DWORD 56[rsp] + rol eax, 1 + xor ebp, edi + mov r13d,eax + lea eax, DWORD 1518500249[esi*1+eax] + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 16_19 18 + mov esi, r10d + mov ebp, ebx + xor esi, r14d + xor ebp, edx + xor esi, DWORD 40[rsp] + and ebp, ecx + ror ecx, 2 + xor esi, DWORD 60[rsp] + rol esi, 1 + xor ebp, edx + mov r14d,esi + lea esi, DWORD 1518500249[edi*1+esi] + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 16_19 19 + mov edi, r8d + mov ebp, ecx + xor edi, r15d + xor ebp, ebx + xor edi, DWORD 44[rsp] + and ebp, eax + ror eax, 2 + xor edi, r12d + rol edi, 1 + xor ebp, ebx + mov r15d,edi + lea edi, DWORD 1518500249[edx*1+edi] + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 20_39 20 + mov ebp, esi + mov edx, r10d + ror esi, 2 + xor edx, DWORD 24[rsp] + xor ebp, eax + xor edx, DWORD 48[rsp] + xor ebp, ecx + xor edx, r13d + rol edx, 1 + add ebp, ebx + mov r10d,edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD 1859775393[ebp*1+edx] + add edx, ebx + ; 20_39 21 + mov ebp, edi + mov ebx, r8d + ror edi, 2 + xor ebx, DWORD 28[rsp] + xor ebp, esi + xor ebx, DWORD 52[rsp] + xor ebp, eax + xor ebx, r14d + rol ebx, 1 + add ebp, ecx + mov r8d,ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD 1859775393[ebp*1+ebx] + add ebx, ecx + ; 20_39 22 + mov ebp, edx + mov ecx, DWORD 24[rsp] + ror edx, 2 + xor ecx, DWORD 32[rsp] + xor ebp, edi + xor ecx, DWORD 56[rsp] + xor ebp, esi + xor ecx, r15d + rol ecx, 1 + add ebp, eax + mov DWORD 24[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD 1859775393[ebp*1+ecx] + add ecx, eax + ; 20_39 23 + mov ebp, ebx + mov eax, DWORD 28[rsp] + ror ebx, 2 + xor eax, DWORD 36[rsp] + xor ebp, edx + xor eax, DWORD 60[rsp] + xor ebp, edi + xor eax, r10d + rol eax, 1 + add ebp, esi + mov DWORD 28[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD 1859775393[ebp*1+eax] + add eax, esi + ; 20_39 24 + mov ebp, ecx + mov esi, DWORD 32[rsp] + ror ecx, 2 + xor esi, DWORD 40[rsp] + xor ebp, ebx + xor esi, r12d + xor ebp, edx + xor esi, r8d + rol esi, 1 + add ebp, edi + mov DWORD 32[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD 1859775393[ebp*1+esi] + add esi, edi + ; 20_39 25 + mov ebp, eax + mov edi, DWORD 36[rsp] + ror eax, 2 + xor edi, DWORD 44[rsp] + xor ebp, ecx + xor edi, r13d + xor ebp, ebx + xor edi, DWORD 24[rsp] + rol edi, 1 + add ebp, edx + mov DWORD 36[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD 1859775393[ebp*1+edi] + add edi, edx + ; 20_39 26 + mov ebp, esi + mov edx, DWORD 40[rsp] + ror esi, 2 + xor edx, DWORD 48[rsp] + xor ebp, eax + xor edx, r14d + xor ebp, ecx + xor edx, DWORD 28[rsp] + rol edx, 1 + add ebp, ebx + mov DWORD 40[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD 1859775393[ebp*1+edx] + add edx, ebx + ; 20_39 27 + mov ebp, edi + mov ebx, DWORD 44[rsp] + ror edi, 2 + xor ebx, DWORD 52[rsp] + xor ebp, esi + xor ebx, r15d + xor ebp, eax + xor ebx, DWORD 32[rsp] + rol ebx, 1 + add ebp, ecx + mov DWORD 44[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD 1859775393[ebp*1+ebx] + add ebx, ecx + ; 20_39 28 + mov ebp, edx + mov ecx, DWORD 48[rsp] + ror edx, 2 + xor ecx, DWORD 56[rsp] + xor ebp, edi + xor ecx, r10d + xor ebp, esi + xor ecx, DWORD 36[rsp] + rol ecx, 1 + add ebp, eax + mov DWORD 48[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD 1859775393[ebp*1+ecx] + add ecx, eax + ; 20_39 29 + mov ebp, ebx + mov eax, DWORD 52[rsp] + ror ebx, 2 + xor eax, DWORD 60[rsp] + xor ebp, edx + xor eax, r8d + xor ebp, edi + xor eax, DWORD 40[rsp] + rol eax, 1 + add ebp, esi + mov DWORD 52[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD 1859775393[ebp*1+eax] + add eax, esi + ; 20_39 30 + mov ebp, ecx + mov esi, DWORD 56[rsp] + ror ecx, 2 + xor esi, r12d + xor ebp, ebx + xor esi, DWORD 24[rsp] + xor ebp, edx + xor esi, DWORD 44[rsp] + rol esi, 1 + add ebp, edi + mov DWORD 56[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD 1859775393[ebp*1+esi] + add esi, edi + ; 20_39 31 + mov ebp, eax + mov edi, DWORD 60[rsp] + ror eax, 2 + xor edi, r13d + xor ebp, ecx + xor edi, DWORD 28[rsp] + xor ebp, ebx + xor edi, DWORD 48[rsp] + rol edi, 1 + add ebp, edx + mov DWORD 60[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD 1859775393[ebp*1+edi] + add edi, edx + ; 20_39 32 + mov ebp, esi +; mov edx, r12d + ror esi, 2 + xor r12d, r14d + xor ebp, eax + xor r12d, DWORD 32[rsp] + xor ebp, ecx + xor r12d, DWORD 52[rsp] + rol r12d, 1 + add ebp, ebx +; mov r12d,edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD 1859775393[ebp*1+r12d] + add edx, ebx + ; 20_39 33 + mov ebp, edi + mov ebx, r13d + ror edi, 2 + xor ebx, r15d + xor ebp, esi + xor ebx, DWORD 36[rsp] + xor ebp, eax + xor ebx, DWORD 56[rsp] + rol ebx, 1 + add ebp, ecx + mov r13d,ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD 1859775393[ebp*1+ebx] + add ebx, ecx + ; 20_39 34 + mov ebp, edx + mov ecx, r14d + ror edx, 2 + xor ecx, r10d + xor ebp, edi + xor ecx, DWORD 40[rsp] + xor ebp, esi + xor ecx, DWORD 60[rsp] + rol ecx, 1 + add ebp, eax + mov r14d,ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD 1859775393[ebp*1+ecx] + add ecx, eax + ; 20_39 35 + mov ebp, ebx + mov eax, r15d + ror ebx, 2 + xor eax, r8d + xor ebp, edx + xor eax, DWORD 44[rsp] + xor ebp, edi + xor eax, r12d + rol eax, 1 + add ebp, esi + mov r15d,eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD 1859775393[ebp*1+eax] + add eax, esi + ; 20_39 36 + mov ebp, ecx + mov esi, r10d + ror ecx, 2 + xor esi, DWORD 24[rsp] + xor ebp, ebx + xor esi, DWORD 48[rsp] + xor ebp, edx + xor esi, r13d + rol esi, 1 + add ebp, edi + mov r10d,esi + mov edi, eax + rol edi, 5 + lea esi, DWORD 1859775393[ebp*1+esi] + add esi, edi + ; 20_39 37 + mov ebp, eax + mov edi, r8d + ror eax, 2 + xor edi, DWORD 28[rsp] + xor ebp, ecx + xor edi, DWORD 52[rsp] + xor ebp, ebx + xor edi, r14d + rol edi, 1 + add ebp, edx + mov r8d,edi + mov edx, esi + rol edx, 5 + lea edi, DWORD 1859775393[ebp*1+edi] + add edi, edx + ; 20_39 38 + mov ebp, esi + mov edx, DWORD 24[rsp] + ror esi, 2 + xor edx, DWORD 32[rsp] + xor ebp, eax + xor edx, DWORD 56[rsp] + xor ebp, ecx + xor edx, r15d + rol edx, 1 + add ebp, ebx + mov DWORD 24[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD 1859775393[ebp*1+edx] + add edx, ebx + ; 20_39 39 + mov ebp, edi + mov ebx, DWORD 28[rsp] + ror edi, 2 + xor ebx, DWORD 36[rsp] + xor ebp, esi + xor ebx, DWORD 60[rsp] + xor ebp, eax + xor ebx, r10d + rol ebx, 1 + add ebp, ecx + mov DWORD 28[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD 1859775393[ebp*1+ebx] + add ebx, ecx + ; 40_59 40 + mov ecx, DWORD 32[rsp] + mov ebp, DWORD 40[rsp] + xor ecx, ebp +; mov ebp, r12d + xor ecx, r12d +; mov ebp, r8d + xor ecx, r8d + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov DWORD 32[rsp],ecx + and ebp, esi + lea ecx, DWORD 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 41 + mov eax, DWORD 36[rsp] + mov ebp, DWORD 44[rsp] + xor eax, ebp +; mov ebp, r13d + xor eax, r13d + mov ebp, DWORD 24[rsp] + xor eax, ebp + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov DWORD 36[rsp],eax + and ebp, edi + lea eax, DWORD 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 40_59 42 + mov esi, DWORD 40[rsp] + mov ebp, DWORD 48[rsp] + xor esi, ebp +; mov ebp, r14d + xor esi, r14d + mov ebp, DWORD 28[rsp] + xor esi, ebp + mov ebp, ecx + rol esi, 1 + or ebp, ebx + mov DWORD 40[rsp],esi + and ebp, edx + lea esi, DWORD 2400959708[edi*1+esi] + mov edi, ecx + ror ecx, 2 + and edi, ebx + or ebp, edi + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 40_59 43 + mov edi, DWORD 44[rsp] + mov ebp, DWORD 52[rsp] + xor edi, ebp +; mov ebp, r15d + xor edi, r15d + mov ebp, DWORD 32[rsp] + xor edi, ebp + mov ebp, eax + rol edi, 1 + or ebp, ecx + mov DWORD 44[rsp],edi + and ebp, ebx + lea edi, DWORD 2400959708[edx*1+edi] + mov edx, eax + ror eax, 2 + and edx, ecx + or ebp, edx + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 40_59 44 + mov edx, DWORD 48[rsp] + mov ebp, DWORD 56[rsp] + xor edx, ebp +; mov ebp, r10d + xor edx, r10d + mov ebp, DWORD 36[rsp] + xor edx, ebp + mov ebp, esi + rol edx, 1 + or ebp, eax + mov DWORD 48[rsp],edx + and ebp, ecx + lea edx, DWORD 2400959708[ebx*1+edx] + mov ebx, esi + ror esi, 2 + and ebx, eax + or ebp, ebx + mov ebx, edi + rol ebx, 5 + add edx, ebp + add edx, ebx + ; 40_59 45 + mov ebx, DWORD 52[rsp] + mov ebp, DWORD 60[rsp] + xor ebx, ebp +; mov ebp, r8d + xor ebx, r8d + mov ebp, DWORD 40[rsp] + xor ebx, ebp + mov ebp, edi + rol ebx, 1 + or ebp, esi + mov DWORD 52[rsp],ebx + and ebp, eax + lea ebx, DWORD 2400959708[ecx*1+ebx] + mov ecx, edi + ror edi, 2 + and ecx, esi + or ebp, ecx + mov ecx, edx + rol ecx, 5 + add ebx, ebp + add ebx, ecx + ; 40_59 46 + mov ecx, DWORD 56[rsp] +; mov ebp, r12d + xor ecx, r12d + mov ebp, DWORD 24[rsp] + xor ecx, ebp + mov ebp, DWORD 44[rsp] + xor ecx, ebp + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov DWORD 56[rsp],ecx + and ebp, esi + lea ecx, DWORD 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 47 + mov eax, DWORD 60[rsp] +; mov ebp, r13d + xor eax, r13d + mov ebp, DWORD 28[rsp] + xor eax, ebp + mov ebp, DWORD 48[rsp] + xor eax, ebp + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov DWORD 60[rsp],eax + and ebp, edi + lea eax, DWORD 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 40_59 48 + mov esi, r12d +; mov ebp, r14d + xor esi, r14d + mov ebp, DWORD 32[rsp] + xor esi, ebp + mov ebp, DWORD 52[rsp] + xor esi, ebp + mov ebp, ecx + rol esi, 1 + or ebp, ebx + mov r12d,esi + and ebp, edx + lea esi, DWORD 2400959708[edi*1+esi] + mov edi, ecx + ror ecx, 2 + and edi, ebx + or ebp, edi + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 40_59 49 + mov edi, r13d +; mov ebp, r15d + xor edi, r15d + mov ebp, DWORD 36[rsp] + xor edi, ebp + mov ebp, DWORD 56[rsp] + xor edi, ebp + mov ebp, eax + rol edi, 1 + or ebp, ecx + mov r13d,edi + and ebp, ebx + lea edi, DWORD 2400959708[edx*1+edi] + mov edx, eax + ror eax, 2 + and edx, ecx + or ebp, edx + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 40_59 50 + mov edx, r14d +; mov ebp, r10d + xor edx, r10d + mov ebp, DWORD 40[rsp] + xor edx, ebp + mov ebp, DWORD 60[rsp] + xor edx, ebp + mov ebp, esi + rol edx, 1 + or ebp, eax + mov r14d,edx + and ebp, ecx + lea edx, DWORD 2400959708[ebx*1+edx] + mov ebx, esi + ror esi, 2 + and ebx, eax + or ebp, ebx + mov ebx, edi + rol ebx, 5 + add edx, ebp + add edx, ebx + ; 40_59 51 + mov ebx, r15d +; mov ebp, r8d + xor ebx, r8d + mov ebp, DWORD 44[rsp] + xor ebx, ebp +; mov ebp, r12d + xor ebx, r12d + mov ebp, edi + rol ebx, 1 + or ebp, esi + mov r15d,ebx + and ebp, eax + lea ebx, DWORD 2400959708[ecx*1+ebx] + mov ecx, edi + ror edi, 2 + and ecx, esi + or ebp, ecx + mov ecx, edx + rol ecx, 5 + add ebx, ebp + add ebx, ecx + ; 40_59 52 + mov ecx, r10d + mov ebp, DWORD 24[rsp] + xor ecx, ebp + mov ebp, DWORD 48[rsp] + xor ecx, ebp +; mov ebp, r13d + xor ecx, r13d + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov r10d,ecx + and ebp, esi + lea ecx, DWORD 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 53 + mov eax, r8d + mov ebp, DWORD 28[rsp] + xor eax, ebp + mov ebp, DWORD 52[rsp] + xor eax, ebp +; mov ebp, r14d + xor eax, r14d + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov r8d,eax + and ebp, edi + lea eax, DWORD 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 40_59 54 + mov esi, DWORD 24[rsp] + mov ebp, DWORD 32[rsp] + xor esi, ebp + mov ebp, DWORD 56[rsp] + xor esi, ebp +; mov ebp, r15d + xor esi, r15d + mov ebp, ecx + rol esi, 1 + or ebp, ebx + mov DWORD 24[rsp],esi + and ebp, edx + lea esi, DWORD 2400959708[edi*1+esi] + mov edi, ecx + ror ecx, 2 + and edi, ebx + or ebp, edi + mov edi, eax + rol edi, 5 + add esi, ebp + add esi, edi + ; 40_59 55 + mov edi, DWORD 28[rsp] + mov ebp, DWORD 36[rsp] + xor edi, ebp + mov ebp, DWORD 60[rsp] + xor edi, ebp +; mov ebp, r10d + xor edi, r10d + mov ebp, eax + rol edi, 1 + or ebp, ecx + mov DWORD 28[rsp],edi + and ebp, ebx + lea edi, DWORD 2400959708[edx*1+edi] + mov edx, eax + ror eax, 2 + and edx, ecx + or ebp, edx + mov edx, esi + rol edx, 5 + add edi, ebp + add edi, edx + ; 40_59 56 + mov edx, DWORD 32[rsp] + mov ebp, DWORD 40[rsp] + xor edx, ebp +; mov ebp, r12d + xor edx, r12d +; mov ebp, r8d + xor edx, r8d + mov ebp, esi + rol edx, 1 + or ebp, eax + mov DWORD 32[rsp],edx + and ebp, ecx + lea edx, DWORD 2400959708[ebx*1+edx] + mov ebx, esi + ror esi, 2 + and ebx, eax + or ebp, ebx + mov ebx, edi + rol ebx, 5 + add edx, ebp + add edx, ebx + ; 40_59 57 + mov ebx, DWORD 36[rsp] + mov ebp, DWORD 44[rsp] + xor ebx, ebp +; mov ebp, r13d + xor ebx, r13d + mov ebp, DWORD 24[rsp] + xor ebx, ebp + mov ebp, edi + rol ebx, 1 + or ebp, esi + mov DWORD 36[rsp],ebx + and ebp, eax + lea ebx, DWORD 2400959708[ecx*1+ebx] + mov ecx, edi + ror edi, 2 + and ecx, esi + or ebp, ecx + mov ecx, edx + rol ecx, 5 + add ebx, ebp + add ebx, ecx + ; 40_59 58 + mov ecx, DWORD 40[rsp] + mov ebp, DWORD 48[rsp] + xor ecx, ebp +; mov ebp, r14d + xor ecx, r14d + mov ebp, DWORD 28[rsp] + xor ecx, ebp + mov ebp, edx + rol ecx, 1 + or ebp, edi + mov DWORD 40[rsp],ecx + and ebp, esi + lea ecx, DWORD 2400959708[eax*1+ecx] + mov eax, edx + ror edx, 2 + and eax, edi + or ebp, eax + mov eax, ebx + rol eax, 5 + add ecx, ebp + add ecx, eax + ; 40_59 59 + mov eax, DWORD 44[rsp] + mov ebp, DWORD 52[rsp] + xor eax, ebp +; mov ebp, r15d + xor eax, r15d + mov ebp, DWORD 32[rsp] + xor eax, ebp + mov ebp, ebx + rol eax, 1 + or ebp, edx + mov DWORD 44[rsp],eax + and ebp, edi + lea eax, DWORD 2400959708[esi*1+eax] + mov esi, ebx + ror ebx, 2 + and esi, edx + or ebp, esi + mov esi, ecx + rol esi, 5 + add eax, ebp + add eax, esi + ; 20_39 60 + mov ebp, ecx + mov esi, DWORD 48[rsp] + ror ecx, 2 + xor esi, DWORD 56[rsp] + xor ebp, ebx + xor esi, r10d + xor ebp, edx + xor esi, DWORD 36[rsp] + rol esi, 1 + add ebp, edi + mov DWORD 48[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 61 + mov ebp, eax + mov edi, DWORD 52[rsp] + ror eax, 2 + xor edi, DWORD 60[rsp] + xor ebp, ecx + xor edi, r8d + xor ebp, ebx + xor edi, DWORD 40[rsp] + rol edi, 1 + add ebp, edx + mov DWORD 52[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD 3395469782[ebp*1+edi] + add edi, edx + ; 20_39 62 + mov ebp, esi + mov edx, DWORD 56[rsp] + ror esi, 2 + xor edx, r12d + xor ebp, eax + xor edx, DWORD 24[rsp] + xor ebp, ecx + xor edx, DWORD 44[rsp] + rol edx, 1 + add ebp, ebx + mov DWORD 56[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD 3395469782[ebp*1+edx] + add edx, ebx + ; 20_39 63 + mov ebp, edi + mov ebx, DWORD 60[rsp] + ror edi, 2 + xor ebx, r13d + xor ebp, esi + xor ebx, DWORD 28[rsp] + xor ebp, eax + xor ebx, DWORD 48[rsp] + rol ebx, 1 + add ebp, ecx + mov DWORD 60[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD 3395469782[ebp*1+ebx] + add ebx, ecx + ; 20_39 64 + mov ebp, edx + mov ecx, r12d + ror edx, 2 + xor ecx, r14d + xor ebp, edi + xor ecx, DWORD 32[rsp] + xor ebp, esi + xor ecx, DWORD 52[rsp] + rol ecx, 1 + add ebp, eax + mov r12d,ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD 3395469782[ebp*1+ecx] + add ecx, eax + ; 20_39 65 + mov ebp, ebx + mov eax, r13d + ror ebx, 2 + xor eax, r15d + xor ebp, edx + xor eax, DWORD 36[rsp] + xor ebp, edi + xor eax, DWORD 56[rsp] + rol eax, 1 + add ebp, esi + mov r13d,eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD 3395469782[ebp*1+eax] + add eax, esi + ; 20_39 66 + mov ebp, ecx + mov esi, r14d + ror ecx, 2 + xor esi, r10d + xor ebp, ebx + xor esi, DWORD 40[rsp] + xor ebp, edx + xor esi, DWORD 60[rsp] + rol esi, 1 + add ebp, edi + mov r14d,esi + mov edi, eax + rol edi, 5 + lea esi, DWORD 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 67 + mov ebp, eax + mov edi, r15d + ror eax, 2 + xor edi, r8d + xor ebp, ecx + xor edi, DWORD 44[rsp] + xor ebp, ebx + xor edi, r12d + rol edi, 1 + add ebp, edx + mov r15d,edi + mov edx, esi + rol edx, 5 + lea edi, DWORD 3395469782[ebp*1+edi] + add edi, edx + ; 20_39 68 + mov ebp, esi + mov edx, r10d + ror esi, 2 + xor edx, DWORD 24[rsp] + xor ebp, eax + xor edx, DWORD 48[rsp] + xor ebp, ecx + xor edx, r13d + rol edx, 1 + add ebp, ebx + mov r10d,edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD 3395469782[ebp*1+edx] + add edx, ebx + ; 20_39 69 + mov ebp, edi + mov ebx, r8d + ror edi, 2 + xor ebx, DWORD 28[rsp] + xor ebp, esi + xor ebx, DWORD 52[rsp] + xor ebp, eax + xor ebx, r14d + rol ebx, 1 + add ebp, ecx + mov r8d,ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD 3395469782[ebp*1+ebx] + add ebx, ecx + ; 20_39 70 + mov ebp, edx + mov ecx, DWORD 24[rsp] + ror edx, 2 + xor ecx, DWORD 32[rsp] + xor ebp, edi + xor ecx, DWORD 56[rsp] + xor ebp, esi + xor ecx, r15d + rol ecx, 1 + add ebp, eax + mov DWORD 24[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD 3395469782[ebp*1+ecx] + add ecx, eax + ; 20_39 71 + mov ebp, ebx + mov eax, DWORD 28[rsp] + ror ebx, 2 + xor eax, DWORD 36[rsp] + xor ebp, edx + xor eax, DWORD 60[rsp] + xor ebp, edi + xor eax, r10d + rol eax, 1 + add ebp, esi + mov DWORD 28[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD 3395469782[ebp*1+eax] + add eax, esi + ; 20_39 72 + mov ebp, ecx + mov esi, DWORD 32[rsp] + ror ecx, 2 + xor esi, DWORD 40[rsp] + xor ebp, ebx + xor esi, r12d + xor ebp, edx + xor esi, r8d + rol esi, 1 + add ebp, edi + mov DWORD 32[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 73 + mov ebp, eax + mov edi, DWORD 36[rsp] + ror eax, 2 + xor edi, DWORD 44[rsp] + xor ebp, ecx + xor edi, r13d + xor ebp, ebx + xor edi, DWORD 24[rsp] + rol edi, 1 + add ebp, edx + mov DWORD 36[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD 3395469782[ebp*1+edi] + add edi, edx + ; 20_39 74 + mov ebp, esi + mov edx, DWORD 40[rsp] + ror esi, 2 + xor edx, DWORD 48[rsp] + xor ebp, eax + xor edx, r14d + xor ebp, ecx + xor edx, DWORD 28[rsp] + rol edx, 1 + add ebp, ebx + mov DWORD 40[rsp],edx + mov ebx, edi + rol ebx, 5 + lea edx, DWORD 3395469782[ebp*1+edx] + add edx, ebx + ; 20_39 75 + mov ebp, edi + mov ebx, DWORD 44[rsp] + ror edi, 2 + xor ebx, DWORD 52[rsp] + xor ebp, esi + xor ebx, r15d + xor ebp, eax + xor ebx, DWORD 32[rsp] + rol ebx, 1 + add ebp, ecx + mov DWORD 44[rsp],ebx + mov ecx, edx + rol ecx, 5 + lea ebx, DWORD 3395469782[ebp*1+ebx] + add ebx, ecx + ; 20_39 76 + mov ebp, edx + mov ecx, DWORD 48[rsp] + ror edx, 2 + xor ecx, DWORD 56[rsp] + xor ebp, edi + xor ecx, r10d + xor ebp, esi + xor ecx, DWORD 36[rsp] + rol ecx, 1 + add ebp, eax + mov DWORD 48[rsp],ecx + mov eax, ebx + rol eax, 5 + lea ecx, DWORD 3395469782[ebp*1+ecx] + add ecx, eax + ; 20_39 77 + mov ebp, ebx + mov eax, DWORD 52[rsp] + ror ebx, 2 + xor eax, DWORD 60[rsp] + xor ebp, edx + xor eax, r8d + xor ebp, edi + xor eax, DWORD 40[rsp] + rol eax, 1 + add ebp, esi + mov DWORD 52[rsp],eax + mov esi, ecx + rol esi, 5 + lea eax, DWORD 3395469782[ebp*1+eax] + add eax, esi + ; 20_39 78 + mov ebp, ecx + mov esi, DWORD 56[rsp] + ror ecx, 2 + xor esi, r12d + xor ebp, ebx + xor esi, DWORD 24[rsp] + xor ebp, edx + xor esi, DWORD 44[rsp] + rol esi, 1 + add ebp, edi + mov DWORD 56[rsp],esi + mov edi, eax + rol edi, 5 + lea esi, DWORD 3395469782[ebp*1+esi] + add esi, edi + ; 20_39 79 +prefetcht1 [r9] + mov ebp, eax + mov edi, DWORD 60[rsp] + ror eax, 2 + xor edi, r13d + xor ebp, ecx + xor edi, DWORD 28[rsp] + xor ebp, ebx + xor edi, DWORD 48[rsp] + rol edi, 1 + add ebp, edx + mov DWORD 60[rsp],edi + mov edx, esi + rol edx, 5 + lea edi, DWORD 3395469782[ebp*1+edi] + add edi, edx + ; End processing + ; +prefetcht1 [r11+64] +; mov ebp, DWORD 128[rsp] +;mov rbp,r9 + + + mov edx, DWORD 12[r9] + add edx, ecx + mov ecx, DWORD 4[r9] + add ecx, esi + mov esi, eax + mov eax, DWORD [r9] + mov DWORD 12[r9],edx + add eax, edi + mov edi, DWORD 16[r9] + add edi, ebx + mov ebx, DWORD 8[r9] + add ebx, esi + mov DWORD [r9],eax + add r11, 64 + + mov DWORD 8[r9],ebx + + + mov DWORD 16[r9],edi + cmp r11,QWORD 112[rsp] + mov DWORD 4[r9],ecx + jb $L000start + +mov DWORD [rsp],r12d +mov DWORD 4[rsp],r13d +mov DWORD 8[rsp],r14d +mov DWORD 12[rsp],r15d +mov DWORD 16[rsp],r10d +mov DWORD 20[rsp],r8d + add rsp, 120 + +pop r15 +pop r14 +pop r13 +pop r12 + + + + +pop rbp +pop rbx +pop rsi +pop rdi + + ret diff --git a/hasher/asm/nasm/SHA1x86.asm b/hasher/asm/nasm/SHA1x86.asm new file mode 100644 index 000000000..ec54b6c94 --- /dev/null +++ b/hasher/asm/nasm/SHA1x86.asm @@ -0,0 +1,1396 @@ +section .text + +global _SHA_Compile_p5@0 +align 10h + +_SHA_Compile_p5@0: + mov edi, [ebp+0] + bswap edi + mov [esp+4h], edi + mov esi, [ebp+4] + bswap esi + mov [esp+8h], esi + mov ebx, [ebp+8] + bswap ebx + mov [esp+0Ch], ebx + mov ebx, [ebp+0Ch] + bswap ebx + mov [esp+10h], ebx + mov ebx, [ebp+10h] + bswap ebx + mov [esp+14h], ebx + mov ebx, [ebp+14h] + bswap ebx + mov [esp+18h], ebx + mov ebx, [ebp+18h] + bswap ebx + mov [esp+1Ch], ebx + mov ebx, [ebp+1Ch] + bswap ebx + mov [esp+20h], ebx + mov ebx, [ebp+20h] + bswap ebx + mov [esp+24h], ebx + mov ebx, [ebp+24h] + bswap ebx + mov [esp+28h], ebx + mov ebx, [ebp+28h] + bswap ebx + mov [esp+2Ch], ebx + mov ebx, [ebp+2Ch] + bswap ebx + mov [esp+30h], ebx + mov ebx, [ebp+30h] + bswap ebx + mov [esp+34h], ebx + mov edx, [ebp+34h] + bswap edx + mov [esp+38h], edx + mov ecx, [ebp+38h] + bswap ecx + mov [esp+3Ch], ecx + mov ebx, [ebp+3Ch] + bswap ebx + mov [esp+40h], ebx + xor edx, edi + mov edi, [esp+0Ch] + xor edx, edi + xor edx, [esp+24h] + rol edx, 1 + mov [esp+44h], edx + xor ecx, esi + mov esi, [esp+10h] + xor ecx, esi + xor ecx, [esp+28h] + rol ecx, 1 + mov [esp+48h], ecx + xor ebx, edi + mov edi, [esp+14h] + xor ebx, edi + xor ebx, [esp+2Ch] + rol ebx, 1 + mov [esp+4Ch], ebx + xor edx, esi + mov esi, [esp+18h] + xor edx, esi + xor edx, [esp+30h] + rol edx, 1 + mov [esp+50h], edx + xor ecx, edi + mov edi, [esp+1Ch] + xor ecx, edi + xor ecx, [esp+34h] + rol ecx, 1 + mov [esp+54h], ecx + xor ebx, esi + mov esi, [esp+20h] + xor ebx, esi + xor ebx, [esp+38h] + rol ebx, 1 + mov [esp+58h], ebx + xor edx, edi + mov edi, [esp+24h] + xor edx, edi + xor edx, [esp+3Ch] + rol edx, 1 + mov [esp+5Ch], edx + xor ecx, esi + mov esi, [esp+28h] + xor ecx, esi + xor ecx, [esp+40h] + rol ecx, 1 + mov [esp+60h], ecx + xor ebx, edi + mov edi, [esp+2Ch] + xor ebx, edi + xor ebx, [esp+44h] + rol ebx, 1 + mov [esp+64h], ebx + xor edx, esi + mov esi, [esp+30h] + xor edx, esi + xor edx, [esp+48h] + rol edx, 1 + mov [esp+68h], edx + xor ecx, edi + mov edi, [esp+34h] + xor ecx, edi + xor ecx, [esp+4Ch] + rol ecx, 1 + mov [esp+6Ch], ecx + xor ebx, esi + mov esi, [esp+38h] + xor ebx, esi + xor ebx, [esp+50h] + rol ebx, 1 + mov [esp+70h], ebx + xor edx, edi + mov edi, [esp+3Ch] + xor edx, edi + xor edx, [esp+54h] + rol edx, 1 + mov [esp+74h], edx + xor ecx, esi + mov esi, [esp+40h] + xor ecx, esi + xor ecx, [esp+58h] + rol ecx, 1 + mov [esp+78h], ecx + xor ebx, edi + mov edi, [esp+44h] + xor ebx, edi + xor ebx, [esp+5Ch] + rol ebx, 1 + mov [esp+7Ch], ebx + xor edx, esi + mov esi, [esp+48h] + xor edx, esi + xor edx, [esp+60h] + rol edx, 1 + mov [esp+80h], edx + xor ecx, edi + mov edi, [esp+4Ch] + xor ecx, edi + xor ecx, [esp+64h] + rol ecx, 1 + mov [esp+84h], ecx + xor ebx, esi + mov esi, [esp+50h] + xor ebx, esi + xor ebx, [esp+68h] + rol ebx, 1 + mov [esp+88h], ebx + xor edx, edi + mov edi, [esp+54h] + xor edx, edi + xor edx, [esp+6Ch] + rol edx, 1 + mov [esp+8Ch], edx + xor ecx, esi + mov esi, [esp+58h] + xor ecx, esi + xor ecx, [esp+70h] + rol ecx, 1 + mov [esp+90h], ecx + xor ebx, edi + mov edi, [esp+5Ch] + xor ebx, edi + xor ebx, [esp+74h] + rol ebx, 1 + mov [esp+94h], ebx + xor edx, esi + mov esi, [esp+60h] + xor edx, esi + xor edx, [esp+78h] + rol edx, 1 + mov [esp+98h], edx + xor ecx, edi + mov edi, [esp+64h] + xor ecx, edi + xor ecx, [esp+7Ch] + rol ecx, 1 + mov [esp+9Ch], ecx + xor ebx, esi + mov esi, [esp+68h] + xor ebx, esi + xor ebx, [esp+80h] + rol ebx, 1 + mov [esp+0A0h], ebx + xor edx, edi + mov edi, [esp+6Ch] + xor edx, edi + xor edx, [esp+84h] + rol edx, 1 + mov [esp+0A4h], edx + xor ecx, esi + mov esi, [esp+70h] + xor ecx, esi + xor ecx, [esp+88h] + rol ecx, 1 + mov [esp+0A8h], ecx + xor ebx, edi + mov edi, [esp+74h] + xor ebx, edi + xor ebx, [esp+8Ch] + rol ebx, 1 + mov [esp+0ACh], ebx + xor edx, esi + mov esi, [esp+78h] + xor edx, esi + xor edx, [esp+90h] + rol edx, 1 + mov [esp+0B0h], edx + xor ecx, edi + mov edi, [esp+7Ch] + xor ecx, edi + xor ecx, [esp+94h] + rol ecx, 1 + mov [esp+0B4h], ecx + xor ebx, esi + mov esi, [esp+80h] + xor ebx, esi + xor ebx, [esp+98h] + rol ebx, 1 + mov [esp+0B8h], ebx + xor edx, edi + mov edi, [esp+84h] + xor edx, edi + xor edx, [esp+9Ch] + rol edx, 1 + mov [esp+0BCh], edx + xor ecx, esi + mov esi, [esp+88h] + xor ecx, esi + xor ecx, [esp+0A0h] + rol ecx, 1 + mov [esp+0C0h], ecx + xor ebx, edi + mov edi, [esp+8Ch] + xor ebx, edi + xor ebx, [esp+0A4h] + rol ebx, 1 + mov [esp+0C4h], ebx + xor edx, esi + mov esi, [esp+90h] + xor edx, esi + xor edx, [esp+0A8h] + rol edx, 1 + mov [esp+0C8h], edx + xor ecx, edi + mov edi, [esp+94h] + xor ecx, edi + xor ecx, [esp+0ACh] + rol ecx, 1 + mov [esp+0CCh], ecx + xor ebx, esi + mov esi, [esp+98h] + xor ebx, esi + xor ebx, [esp+0B0h] + rol ebx, 1 + mov [esp+0D0h], ebx + xor edx, edi + mov edi, [esp+9Ch] + xor edx, edi + xor edx, [esp+0B4h] + rol edx, 1 + mov [esp+0D4h], edx + xor ecx, esi + mov esi, [esp+0A0h] + xor ecx, esi + xor ecx, [esp+0B8h] + rol ecx, 1 + mov [esp+0D8h], ecx + xor ebx, edi + mov edi, [esp+0A4h] + xor ebx, edi + xor ebx, [esp+0BCh] + rol ebx, 1 + mov [esp+0DCh], ebx + xor edx, esi + mov esi, [esp+0A8h] + xor edx, esi + xor edx, [esp+0C0h] + rol edx, 1 + mov [esp+0E0h], edx + xor ecx, edi + mov edi, [esp+0ACh] + xor ecx, edi + xor ecx, [esp+0C4h] + rol ecx, 1 + mov [esp+0E4h], ecx + xor ebx, esi + mov esi, [esp+0B0h] + xor ebx, esi + xor ebx, [esp+0C8h] + rol ebx, 1 + mov [esp+0E8h], ebx + xor edx, edi + mov edi, [esp+0B4h] + xor edx, edi + xor edx, [esp+0CCh] + rol edx, 1 + mov [esp+0ECh], edx + xor ecx, esi + mov esi, [esp+0B8h] + xor ecx, esi + xor ecx, [esp+0D0h] + rol ecx, 1 + mov [esp+0F0h], ecx + xor ebx, edi + mov edi, [esp+0BCh] + xor ebx, edi + xor ebx, [esp+0D4h] + rol ebx, 1 + mov [esp+0F4h], ebx + xor edx, esi + mov esi, [esp+0C0h] + xor edx, esi + xor edx, [esp+0D8h] + rol edx, 1 + mov [esp+0F8h], edx + xor ecx, edi + mov edi, [esp+0C4h] + xor ecx, edi + xor ecx, [esp+0DCh] + rol ecx, 1 + mov [esp+0FCh], ecx + xor ebx, esi + mov esi, [esp+0C8h] + xor ebx, esi + xor ebx, [esp+0E0h] + rol ebx, 1 + mov [esp+100h], ebx + xor edx, edi + mov edi, [esp+0CCh] + xor edx, edi + xor edx, [esp+0E4h] + rol edx, 1 + mov [esp+104h], edx + xor ecx, esi + mov esi, [esp+0D0h] + xor ecx, esi + xor ecx, [esp+0E8h] + rol ecx, 1 + mov [esp+108h], ecx + xor ebx, edi + mov edi, [esp+0D4h] + xor ebx, edi + xor ebx, [esp+0ECh] + rol ebx, 1 + mov [esp+10Ch], ebx + xor edx, esi + mov esi, [esp+0D8h] + xor edx, esi + xor edx, [esp+0F0h] + rol edx, 1 + mov [esp+110h], edx + xor ecx, edi + mov edi, [esp+0DCh] + xor ecx, edi + xor ecx, [esp+0F4h] + rol ecx, 1 + mov [esp+114h], ecx + xor ebx, esi + mov esi, [esp+0E0h] + xor ebx, esi + xor ebx, [esp+0F8h] + rol ebx, 1 + mov [esp+118h], ebx + xor edx, edi + mov edi, [esp+0E4h] + xor edx, edi + xor edx, [esp+0FCh] + rol edx, 1 + mov [esp+11Ch], edx + xor ecx, esi + mov esi, [esp+0E8h] + xor ecx, esi + xor ecx, [esp+100h] + rol ecx, 1 + mov [esp+120h], ecx + xor ebx, edi + mov edi, [esp+0ECh] + xor ebx, edi + xor ebx, [esp+104h] + rol ebx, 1 + mov [esp+124h], ebx + xor edx, esi + mov esi, [esp+0F0h] + xor edx, esi + xor edx, [esp+0108h] + rol edx, 1 + mov [esp+128h], edx + xor ecx, edi + mov edi, [esp+0F4h] + xor ecx, edi + xor ecx, [esp+10Ch] + rol ecx, 1 + mov [esp+12Ch], ecx + xor ebx, esi + mov esi, [esp+0F8h] + xor ebx, esi + xor ebx, [esp+110h] + rol ebx, 1 + mov [esp+130h], ebx + xor edx, edi + mov edi, [esp+0FCh] + xor edx, edi + xor edx, [esp+114h] + rol edx, 1 + mov [esp+134h], edx + xor ecx, esi + mov esi, [esp+100h] + xor ecx, esi + xor ecx, [esp+118h] + rol ecx, 1 + mov [esp+138h], ecx + xor ebx, edi + xor ebx, [esp+104h] + xor ebx, [esp+11Ch] + rol ebx, 1 + mov [esp+13Ch], ebx + xor edx, esi + xor edx, [esp+108h] + xor edx, [esp+120h] + rol edx, 1 + mov [esp+140h], edx + mov ebp, [esp+168h] + mov eax, [ebp+8] + mov ebx, [ebp+0Ch] + mov ecx, [ebp+10h] + mov edx, [ebp+14h] + mov esi, [ebp+18h] + mov edi, eax + mov ebp, ecx + rol eax, 5 + xor ebp, edx + add eax, esi + and ebp, ebx + add eax, 5A827999h + xor ebp, edx + add eax, [esp+4h] + ror ebx, 2 + add eax, ebp + mov esi, eax + mov ebp, ebx + rol eax, 5 + xor ebp, ecx + add eax, edx + and ebp, edi + add eax, 5A827999h + xor ebp, ecx + add eax, [esp+8h] + ror edi, 2 + add eax, ebp + mov edx, eax + mov ebp, edi + rol eax, 5 + xor ebp, ebx + add eax, ecx + and ebp, esi + add eax, 5A827999h + xor ebp, ebx + add eax, [esp+0Ch] + ror esi, 2 + add eax, ebp + mov ecx, eax + mov ebp, esi + rol eax, 5 + xor ebp, edi + add eax, ebx + and ebp, edx + add eax, 5A827999h + xor ebp, edi + add eax, [esp+10h] + ror edx, 2 + add eax, ebp + mov ebx, eax + mov ebp, edx + rol eax, 5 + xor ebp, esi + add eax, edi + and ebp, ecx + add eax, 5A827999h + xor ebp, esi + add eax, [esp+14h] + ror ecx, 2 + add eax, ebp + mov edi, eax + mov ebp, ecx + rol eax, 5 + xor ebp, edx + add eax, esi + and ebp, ebx + add eax, 5A827999h + xor ebp, edx + add eax, [esp+18h] + ror ebx, 2 + add eax, ebp + mov esi, eax + mov ebp, ebx + rol eax, 5 + xor ebp, ecx + add eax, edx + and ebp, edi + add eax, 5A827999h + xor ebp, ecx + add eax, [esp+1Ch] + ror edi, 2 + add eax, ebp + mov edx, eax + mov ebp, edi + rol eax, 5 + xor ebp, ebx + add eax, ecx + and ebp, esi + add eax, 5A827999h + xor ebp, ebx + add eax, [esp+20h] + ror esi, 2 + add eax, ebp + mov ecx, eax + mov ebp, esi + rol eax, 5 + xor ebp, edi + add eax, ebx + and ebp, edx + add eax, 5A827999h + xor ebp, edi + add eax, [esp+24h] + ror edx, 2 + add eax, ebp + mov ebx, eax + mov ebp, edx + rol eax, 5 + xor ebp, esi + add eax, edi + and ebp, ecx + add eax, 5A827999h + xor ebp, esi + add eax, [esp+28h] + ror ecx, 2 + add eax, ebp + mov edi, eax + mov ebp, ecx + rol eax, 5 + xor ebp, edx + add eax, esi + and ebp, ebx + add eax, 5A827999h + xor ebp, edx + add eax, [esp+2Ch] + ror ebx, 2 + add eax, ebp + mov esi, eax + mov ebp, ebx + rol eax, 5 + xor ebp, ecx + add eax, edx + and ebp, edi + add eax, 5A827999h + xor ebp, ecx + add eax, [esp+30h] + ror edi, 2 + add eax, ebp + mov edx, eax + mov ebp, edi + rol eax, 5 + xor ebp, ebx + add eax, ecx + and ebp, esi + add eax, 5A827999h + xor ebp, ebx + add eax, [esp+34h] + ror esi, 2 + add eax, ebp + mov ecx, eax + mov ebp, esi + rol eax, 5 + xor ebp, edi + add eax, ebx + and ebp, edx + add eax, 5A827999h + xor ebp, edi + add eax, [esp+38h] + ror edx, 2 + add eax, ebp + mov ebx, eax + mov ebp, edx + rol eax, 5 + xor ebp, esi + add eax, edi + and ebp, ecx + add eax, 5A827999h + xor ebp, esi + add eax, [esp+3Ch] + ror ecx, 2 + add eax, ebp + mov edi, eax + mov ebp, ecx + rol eax, 5 + xor ebp, edx + add eax, esi + and ebp, ebx + add eax, 5A827999h + xor ebp, edx + add eax, [esp+40h] + ror ebx, 2 + add eax, ebp + mov esi, eax + mov ebp, ebx + rol eax, 5 + xor ebp, ecx + add eax, edx + and ebp, edi + add eax, 5A827999h + xor ebp, ecx + add eax, [esp+44h] + ror edi, 2 + add eax, ebp + mov edx, eax + mov ebp, edi + rol eax, 5 + xor ebp, ebx + add eax, ecx + and ebp, esi + add eax, 5A827999h + xor ebp, ebx + add eax, [esp+48h] + ror esi, 2 + add eax, ebp + mov ecx, eax + mov ebp, esi + rol eax, 5 + xor ebp, edi + add eax, ebx + and ebp, edx + add eax, 5A827999h + xor ebp, edi + add eax, [esp+4Ch] + ror edx, 2 + add eax, ebp + mov ebx, eax + mov ebp, edx + rol eax, 5 + xor ebp, esi + add eax, edi + and ebp, ecx + add eax, 5A827999h + xor ebp, esi + add eax, [esp+50h] + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 6ED9EBA1h + xor ebp, ebx + add eax, [esp+54h] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 6ED9EBA1h + xor ebp, edi + add eax, [esp+58h] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 6ED9EBA1h + xor ebp, esi + add eax, [esp+5Ch] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 6ED9EBA1h + xor ebp, edx + add eax, [esp+60h] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 6ED9EBA1h + xor ebp, ecx + add eax, [esp+64h] + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 6ED9EBA1h + xor ebp, ebx + add eax, [esp+68h] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 6ED9EBA1h + xor ebp, edi + add eax, [esp+6Ch] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 6ED9EBA1h + xor ebp, esi + add eax, [esp+70h] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 6ED9EBA1h + xor ebp, edx + add eax, [esp+74h] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 6ED9EBA1h + xor ebp, ecx + add eax, [esp+78h] + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 6ED9EBA1h + xor ebp, ebx + add eax, [esp+7Ch] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 6ED9EBA1h + xor ebp, edi + add eax, [esp+80h] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 6ED9EBA1h + xor ebp, esi + add eax, [esp+84h] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 6ED9EBA1h + xor ebp, edx + add eax, [esp+88h] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 6ED9EBA1h + xor ebp, ecx + add eax, [esp+8Ch] + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 6ED9EBA1h + xor ebp, ebx + add eax, [esp+90h] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 6ED9EBA1h + xor ebp, edi + add eax, [esp+94h] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 6ED9EBA1h + xor ebp, esi + add eax, [esp+98h] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 6ED9EBA1h + xor ebp, edx + add eax, [esp+9Ch] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 6ED9EBA1h + xor ebp, ecx + add eax, [esp+0A0h] + ror ecx, 2 + add eax, ebp + mov ebp, edx + mov edi, eax + rol eax, 5 + xor ebp, ecx + add eax, esi + and ebp, ebx + add eax, 8F1BBCDCh + mov esi, ecx + add eax, [esp+0A4h] + and esi, edx + xor ebp, esi + ror ebx, 2 + add eax, ebp + mov ebp, ecx + mov esi, eax + rol eax, 5 + xor ebp, ebx + add eax, edx + and ebp, edi + add eax, 8F1BBCDCh + mov edx, ebx + add eax, [esp+0A8h] + and edx, ecx + xor ebp, edx + ror edi, 2 + add eax, ebp + mov ebp, ebx + mov edx, eax + rol eax, 5 + xor ebp, edi + add eax, ecx + and ebp, esi + add eax, 8F1BBCDCh + mov ecx, edi + add eax, [esp+0ACh] + and ecx, ebx + xor ebp, ecx + ror esi, 2 + add eax, ebp + mov ebp, edi + mov ecx, eax + rol eax, 5 + xor ebp, esi + add eax, ebx + and ebp, edx + add eax, 8F1BBCDCh + mov ebx, esi + add eax, [esp+0B0h] + and ebx, edi + xor ebp, ebx + ror edx, 2 + add eax, ebp + mov ebp, esi + mov ebx, eax + rol eax, 5 + xor ebp, edx + add eax, edi + and ebp, ecx + add eax, 8F1BBCDCh + mov edi, edx + add eax, [esp+0B4h] + and edi, esi + xor ebp, edi + ror ecx, 2 + add eax, ebp + mov ebp, edx + mov edi, eax + rol eax, 5 + xor ebp, ecx + add eax, esi + and ebp, ebx + add eax, 8F1BBCDCh + mov esi, ecx + add eax, [esp+0B8h] + and esi, edx + xor ebp, esi + ror ebx, 2 + add eax, ebp + mov ebp, ecx + mov esi, eax + rol eax, 5 + xor ebp, ebx + add eax, edx + and ebp, edi + add eax, 8F1BBCDCh + mov edx, ebx + add eax, [esp+0BCh] + and edx, ecx + xor ebp, edx + ror edi, 2 + add eax, ebp + mov ebp, ebx + mov edx, eax + rol eax, 5 + xor ebp, edi + add eax, ecx + and ebp, esi + add eax, 8F1BBCDCh + mov ecx, edi + add eax, [esp+0C0h] + and ecx, ebx + xor ebp, ecx + ror esi, 2 + add eax, ebp + mov ebp, edi + mov ecx, eax + rol eax, 5 + xor ebp, esi + add eax, ebx + and ebp, edx + add eax, 8F1BBCDCh + mov ebx, esi + add eax, [esp+0C4h] + and ebx, edi + xor ebp, ebx + ror edx, 2 + add eax, ebp + mov ebp, esi + mov ebx, eax + rol eax, 5 + xor ebp, edx + add eax, edi + and ebp, ecx + add eax, 8F1BBCDCh + mov edi, edx + add eax, [esp+0C8h] + and edi, esi + xor ebp, edi + ror ecx, 2 + add eax, ebp + mov ebp, edx + mov edi, eax + rol eax, 5 + xor ebp, ecx + add eax, esi + and ebp, ebx + add eax, 8F1BBCDCh + mov esi, ecx + add eax, [esp+0CCh] + and esi, edx + xor ebp, esi + ror ebx, 2 + add eax, ebp + mov ebp, ecx + mov esi, eax + rol eax, 5 + xor ebp, ebx + add eax, edx + and ebp, edi + add eax, 8F1BBCDCh + mov edx, ebx + add eax, [esp+0D0h] + and edx, ecx + xor ebp, edx + ror edi, 2 + add eax, ebp + mov ebp, ebx + mov edx, eax + rol eax, 5 + xor ebp, edi + add eax, ecx + and ebp, esi + add eax, 8F1BBCDCh + mov ecx, edi + add eax, [esp+0D4h] + and ecx, ebx + xor ebp, ecx + ror esi, 2 + add eax, ebp + mov ebp, edi + mov ecx, eax + rol eax, 5 + xor ebp, esi + add eax, ebx + and ebp, edx + add eax, 8F1BBCDCh + mov ebx, esi + add eax, [esp+0D8h] + and ebx, edi + xor ebp, ebx + ror edx, 2 + add eax, ebp + mov ebp, esi + mov ebx, eax + rol eax, 5 + xor ebp, edx + add eax, edi + and ebp, ecx + add eax, 8F1BBCDCh + mov edi, edx + add eax, [esp+0DCh] + and edi, esi + xor ebp, edi + ror ecx, 2 + add eax, ebp + mov ebp, edx + mov edi, eax + rol eax, 5 + xor ebp, ecx + add eax, esi + and ebp, ebx + add eax, 8F1BBCDCh + mov esi, ecx + add eax, [esp+0E0h] + and esi, edx + xor ebp, esi + ror ebx, 2 + add eax, ebp + mov ebp, ecx + mov esi, eax + rol eax, 5 + xor ebp, ebx + add eax, edx + and ebp, edi + add eax, 8F1BBCDCh + mov edx, ebx + add eax, [esp+0E4h] + and edx, ecx + xor ebp, edx + ror edi, 2 + add eax, ebp + mov ebp, ebx + mov edx, eax + rol eax, 5 + xor ebp, edi + add eax, ecx + and ebp, esi + add eax, 8F1BBCDCh + mov ecx, edi + add eax, [esp+0E8h] + and ecx, ebx + xor ebp, ecx + ror esi, 2 + add eax, ebp + mov ebp, edi + mov ecx, eax + rol eax, 5 + xor ebp, esi + add eax, ebx + and ebp, edx + add eax, 8F1BBCDCh + mov ebx, esi + add eax, [esp+0ECh] + and ebx, edi + xor ebp, ebx + ror edx, 2 + add eax, ebp + mov ebp, esi + mov ebx, eax + rol eax, 5 + xor ebp, edx + add eax, edi + and ebp, ecx + add eax, 8F1BBCDCh + mov edi, edx + add eax, [esp+0F0h] + and edi, esi + xor ebp, edi + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 0CA62C1D6h + xor ebp, ebx + add eax, [esp+0F4h] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 0CA62C1D6h + xor ebp, edi + add eax, [esp+0F8h] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 0CA62C1D6h + xor ebp, esi + add eax, [esp+0FCh] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 0CA62C1D6h + xor ebp, edx + add eax, [esp+100h] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 0CA62C1D6h + xor ebp, ecx + add eax, [esp+104h] + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 0CA62C1D6h + xor ebp, ebx + add eax, [esp+108h] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 0CA62C1D6h + xor ebp, edi + add eax, [esp+10Ch] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 0CA62C1D6h + xor ebp, esi + add eax, [esp+110h] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 0CA62C1D6h + xor ebp, edx + add eax, [esp+114h] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 0CA62C1D6h + xor ebp, ecx + add eax, [esp+118h] + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 0CA62C1D6h + xor ebp, ebx + add eax, [esp+11Ch] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 0CA62C1D6h + xor ebp, edi + add eax, [esp+120h] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 0CA62C1D6h + xor ebp, esi + add eax, [esp+124h] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 0CA62C1D6h + xor ebp, edx + add eax, [esp+128h] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 0CA62C1D6h + xor ebp, ecx + add eax, [esp+12Ch] + ror ecx, 2 + add eax, ebp + mov edi, eax + rol eax, 5 + mov ebp, edx + add eax, esi + xor ebp, ecx + add eax, 0CA62C1D6h + xor ebp, ebx + add eax, [esp+130h] + ror ebx, 2 + add eax, ebp + mov esi, eax + rol eax, 5 + mov ebp, ecx + add eax, edx + xor ebp, ebx + add eax, 0CA62C1D6h + xor ebp, edi + add eax, [esp+134h] + ror edi, 2 + add eax, ebp + mov edx, eax + rol eax, 5 + mov ebp, ebx + add eax, ecx + xor ebp, edi + add eax, 0CA62C1D6h + xor ebp, esi + add eax, [esp+138h] + ror esi, 2 + add eax, ebp + mov ecx, eax + rol eax, 5 + mov ebp, edi + add eax, ebx + xor ebp, esi + add eax, 0CA62C1D6h + xor ebp, edx + add eax, [esp+13Ch] + ror edx, 2 + add eax, ebp + mov ebx, eax + rol eax, 5 + mov ebp, esi + add eax, edi + xor ebp, edx + add eax, 0CA62C1D6h + xor ebp, ecx + add eax, [esp+140h] + ror ecx, 2 + add eax, ebp + mov ebp, [esp+168h] + add [ebp+8], eax + add [ebp+0Ch], ebx + add [ebp+10h], ecx + add [ebp+14h], edx + add [ebp+18h], esi + retn + +align 10h + +global _SHA1_Add_p5@12 + +_SHA1_Add_p5@12: + pusha + sub esp, 140h + mov ecx, [esp+160h+0Ch] + and ecx, ecx + jz get_out + xor edx, edx + mov ebp, [esp+160h+8h] + mov edi, [esp+160h+4h] + mov ebx, [edi] + mov eax, ebx + add ebx, ecx + mov [edi], ebx + adc [edi+4], edx + and eax, 3Fh + jnz partial_buffer +full_blocks: + mov ecx, [esp+160h+0Ch] + and ecx, ecx + jz get_out + sub ecx, 40h + jb end_of_stream + mov [esp+160h+0Ch], ecx + call _SHA_Compile_p5@0 + mov ebp, [esp+160h+8h] + add ebp, 40h + mov [esp+160h+8h], ebp + jmp full_blocks +end_of_stream: + mov edi, [esp+160h+4h] + mov esi, ebp + lea edi, [edi+1Ch] + add ecx, 40h + rep movsb + jmp get_out +partial_buffer: + add ecx, eax + cmp ecx, 40h + jb short_stream + mov ecx, 0FFFFFFC0h + add ecx, eax + add [esp+160h+0Ch], ecx +loc: + mov bl, [ebp+0] + inc ebp + mov [edi+ecx+5Ch], bl + inc ecx + jnz loc + mov [esp+160h+8h], ebp + lea ebp, [edi+1Ch] + call _SHA_Compile_p5@0 + mov ebp, [esp+160h+8h] + jmp full_blocks +short_stream: + sub ecx, eax + mov esi, ebp + lea edi, [edi+eax+1Ch] + rep movsb +get_out: + add esp, 140h + popa + retn 0Ch diff --git a/hasher/asm/nasm/crc32x64.asm b/hasher/asm/nasm/crc32x64.asm new file mode 100644 index 000000000..f18385265 --- /dev/null +++ b/hasher/asm/nasm/crc32x64.asm @@ -0,0 +1,33 @@ +SECTION .text +global crcCalc +align 10h +crcCalc: + push rbx + push rdi + push rsi + mov rsi, rcx ; Load the pointer to dwCrc32 + mov ecx, [rsi] ; Dereference the pointer to load dwCrc32 + xor rbx, rbx + lea rdi, [r8 + r9] ; Calculate the end of the buffer +crc32loop: + xor rax, rax ; Clear the eax register + mov bl, byte [r8] ; Load the current source byte + + mov al, cl ; Copy crc value into eax + inc r8 ; Advance the source pointer + + xor al, bl ; Create the index into the CRC32 table + shr ecx, 8 + + mov ebx, [rdx + rax * 4] ; Get the value out of the table + xor ecx, ebx ; xor with the current byte + + cmp rdi, r8 ; Have we reached the end of the buffer? + jne crc32loop + + mov [rsi], ecx ; Write the result + pop rsi + pop rdi + pop rbx + ret + diff --git a/hasher/asm/nasm/crc32x86.asm b/hasher/asm/nasm/crc32x86.asm new file mode 100644 index 000000000..62cd96ac8 --- /dev/null +++ b/hasher/asm/nasm/crc32x86.asm @@ -0,0 +1,27 @@ +SECTION .text +global _crcCalc +align 10h +_crcCalc: + pushad + mov eax, [esp+32+4] ; Load the pointer to dwCrc32 + mov ecx, [eax] ; Dereference the pointer to load dwCrc32 + mov edi, [esp+32+8] ; Load the CRC32 table + mov esi, [esp+32+12] ; Load buffer + mov ebx, [esp+32+16] ; Load dwBytesRead + lea edx, [esi + ebx] ; Calculate the end of the buffer +crc32loop: + xor eax, eax ; Clear the eax register + mov bl, byte [esi] ; Load the current source byte + mov al, cl ; Copy crc value into eax + inc esi ; Advance the source pointer + xor al, bl ; Create the index into the CRC32 table + shr ecx, 8 + mov ebx, [edi + eax * 4] ; Get the value out of the table + xor ecx, ebx ; xor with the current byte + cmp edx, esi ; Have we reached the end of the buffer? + jne crc32loop + mov eax, [esp+32+4] ; Load the pointer to dwCrc32 + mov [eax], ecx ; Write the result + popad + ret +