From a05533bf95f774fe0fdb94ac874184924892a823 Mon Sep 17 00:00:00 2001 From: weidai Date: Sun, 5 Jul 2009 18:10:10 +0000 Subject: fix incorrect SHA-256 computation on non-SSE2 x86 machines on non-aligned input (reported by pycryptopp project) git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@470 57ff6487-cd31-0410-9ec3-f628ee90f5f0 --- sha.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sha.cpp b/sha.cpp index fd0b0a2..376d0c3 100644 --- a/sha.cpp +++ b/sha.cpp @@ -273,14 +273,15 @@ static void CRYPTOPP_FASTCALL X86_SHA256_HashBlocks(word32 *state, const word32 #endif AS2( mov STATE_SAVE, WORD_REG(cx)) AS2( mov DATA_SAVE, WORD_REG(dx)) - AS2( add WORD_REG(di), WORD_REG(dx)) - AS2( mov DATA_END, WORD_REG(di)) + AS2( lea WORD_REG(ax), [WORD_REG(di) + WORD_REG(dx)]) + AS2( mov DATA_END, WORD_REG(ax)) AS2( mov K_END, WORD_REG(si)) #if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE #if CRYPTOPP_BOOL_X86 AS2( test edi, 1) ASJ( jnz, 2, f) + AS1( dec DWORD PTR K_END) #endif AS2( movdqa xmm0, XMMWORD_PTR [WORD_REG(cx)+0*16]) AS2( movdqa xmm1, XMMWORD_PTR [WORD_REG(cx)+1*16]) @@ -355,7 +356,7 @@ static void CRYPTOPP_FASTCALL X86_SHA256_HashBlocks(word32 *state, const word32 ROUND(14, 1, eax, ecx, edi, edx) ROUND(15, 1, ecx, eax, edx, edi) AS2( cmp WORD_REG(si), K_END) - ASJ( jne, 1, b) + ASJ( jl, 1, b) AS2( mov WORD_REG(dx), DATA_SAVE) AS2( add WORD_REG(dx), 64) @@ -364,8 +365,8 @@ static void CRYPTOPP_FASTCALL X86_SHA256_HashBlocks(word32 *state, const word32 #if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE #if CRYPTOPP_BOOL_X86 - AS2( test DWORD PTR DATA_END, 1) - ASJ( jnz, 4, f) + AS2( test DWORD PTR K_END, 1) + ASJ( jz, 4, f) #endif AS2( movdqa xmm1, XMMWORD_PTR [AS_REG_7+1*16]) AS2( movdqa xmm0, XMMWORD_PTR [AS_REG_7+0*16]) -- cgit v1.2.1