diff --git a/iterhash.cpp b/iterhash.cpp index f8be97d9..bdc99ec5 100644 --- a/iterhash.cpp +++ b/iterhash.cpp @@ -83,14 +83,11 @@ template byte * IteratedHashBase::CreateUpdateSpa template size_t IteratedHashBase::HashMultipleBlocks(const T *input, size_t length) { -#if CRYPTOPP_BOOL_SSE_SHA_INTRINSICS_AVAILABLE - // SHA-1 and SHA-256 only - static const bool noReverse = HasSHA() && this->BlockSize() <= 64; -#else - const bool noReverse = NativeByteOrderIs(this->GetByteOrder()); -#endif - + // Hardware based SHA1 and SHA256 correct blocks themselves due to hardware requirements. + // For Intel, SHA1 will effectively call ByteReverse(). SHA256 formats data to Intel + // requirements, which means eight words ABCD EFGH are transformed to ABEF CDGH. unsigned int blockSize = this->BlockSize(); + bool noReverse = NativeByteOrderIs(this->GetByteOrder()); T* dataBuf = this->DataBuf(); do { diff --git a/sha.cpp b/sha.cpp index 2c7f32a6..f64ff33d 100644 --- a/sha.cpp +++ b/sha.cpp @@ -112,7 +112,7 @@ static void SHA1_SSE_SHA_Transform(word32 *state, const word32 *data) ABCD = _mm_loadu_si128((__m128i*) state); E0 = _mm_set_epi32(state[4], 0, 0, 0); ABCD = _mm_shuffle_epi32(ABCD, 0x1B); - MASK = _mm_set_epi8(0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15); + MASK = _mm_set_epi8(3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12); // Save current hash ABCD_SAVE = ABCD;