Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'C/Sha256.c')
-rw-r--r--C/Sha256.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/C/Sha256.c b/C/Sha256.c
index 3a8cc41a..b5bc19b9 100644
--- a/C/Sha256.c
+++ b/C/Sha256.c
@@ -1,5 +1,5 @@
/* Crypto/Sha256.c -- SHA-256 Hash
-2015-03-02 : Igor Pavlov : Public domain
+2015-11-14 : Igor Pavlov : Public domain
This code is based on public domain code from Wei Dai's Crypto++ library. */
#include "Precomp.h"
@@ -113,10 +113,26 @@ static void Sha256_WriteByteBlock(CSha256 *p)
{
UInt32 W[16];
unsigned j;
- UInt32 *state = p->state;
+ UInt32 *state;
#ifdef _SHA256_UNROLL2
UInt32 a,b,c,d,e,f,g,h;
+ #else
+ UInt32 T[8];
+ #endif
+
+ for (j = 0; j < 16; j += 4)
+ {
+ const Byte *ccc = p->buffer + j * 4;
+ W[j ] = GetBe32(ccc);
+ W[j + 1] = GetBe32(ccc + 4);
+ W[j + 2] = GetBe32(ccc + 8);
+ W[j + 3] = GetBe32(ccc + 12);
+ }
+
+ state = p->state;
+
+ #ifdef _SHA256_UNROLL2
a = state[0];
b = state[1];
c = state[2];
@@ -126,17 +142,10 @@ static void Sha256_WriteByteBlock(CSha256 *p)
g = state[6];
h = state[7];
#else
- UInt32 T[8];
for (j = 0; j < 8; j++)
T[j] = state[j];
#endif
- for (j = 0; j < 16; j += 2)
- {
- W[j ] = GetBe32(p->buffer + j * 4);
- W[j + 1] = GetBe32(p->buffer + j * 4 + 4);
- }
-
for (j = 0; j < 64; j += 16)
{
RX_16
@@ -226,11 +235,13 @@ void Sha256_Final(CSha256 *p, Byte *digest)
Sha256_WriteByteBlock(p);
- for (i = 0; i < 8; i++)
+ for (i = 0; i < 8; i += 2)
{
- UInt32 v = p->state[i];
- SetBe32(digest, v);
- digest += 4;
+ UInt32 v0 = p->state[i];
+ UInt32 v1 = p->state[i + 1];
+ SetBe32(digest , v0);
+ SetBe32(digest + 4, v1);
+ digest += 8;
}
Sha256_Init(p);