sha256: XTRANSFORM refactory to reduce stack usage: (256 bytes - pointer size) moved to the heap.
--- W variable moved to the heap; --- return type changed to int, returning 0 for success; --- chain of dependency updated to propagate the error in Sha256Update and Sha256Final functions. sha512: Transform and Transform384 refactory to reduce stack usage: (128 bytes - pointer size) moved to the heap in each function --- W variable moved to the heap; --- return type changed to int, returning 0 for success; --- chain of dependency updated to propagate the error in Sha512Update, Sha512Final, Sha384Update and Sha384Final functions.
This commit is contained in:
parent
41cc5f06e4
commit
329cd0b241
@ -42,6 +42,7 @@
|
||||
#endif
|
||||
|
||||
#include <cyassl/ctaocrypt/sha256.h>
|
||||
#include <cyassl/ctaocrypt/error-crypt.h>
|
||||
#ifdef NO_INLINE
|
||||
#include <cyassl/ctaocrypt/misc.h>
|
||||
#else
|
||||
@ -50,12 +51,8 @@
|
||||
|
||||
#ifdef FREESCALE_MMCAU
|
||||
#include "cau_api.h"
|
||||
#define XTRANSFORM(S,B) cau_sha256_hash_n((B), 1, ((S))->digest)
|
||||
#else
|
||||
#define XTRANSFORM(S,B) Transform((S))
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef min
|
||||
|
||||
static INLINE word32 min(word32 a, word32 b)
|
||||
@ -88,7 +85,18 @@ int InitSha256(Sha256* sha256)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef FREESCALE_MMCAU
|
||||
#ifdef FREESCALE_MMCAU
|
||||
#define XTRANSFORM(S,B) Transform((S), (B))
|
||||
|
||||
static int Transform(Sha256* sha256, byte* buf)
|
||||
{
|
||||
cau_sha256_hash_n(buf, 1, sha256->digest);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#define XTRANSFORM(S,B) Transform((S))
|
||||
|
||||
static const word32 K[64] = {
|
||||
0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL,
|
||||
@ -122,11 +130,16 @@ static const word32 K[64] = {
|
||||
h = t0 + t1;
|
||||
|
||||
|
||||
static void Transform(Sha256* sha256)
|
||||
static int Transform(Sha256* sha256)
|
||||
{
|
||||
word32 S[8], W[64], t0, t1;
|
||||
word32 S[8], t0, t1;
|
||||
word32* W;
|
||||
int i;
|
||||
|
||||
W = (word32*) XMALLOC(sizeof(word32) * 64, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
if (W == NULL)
|
||||
return MEMORY_E;
|
||||
|
||||
/* Copy context->state[] to working vars */
|
||||
for (i = 0; i < 8; i++)
|
||||
S[i] = sha256->digest[i];
|
||||
@ -152,6 +165,10 @@ static void Transform(Sha256* sha256)
|
||||
for (i = 0; i < 8; i++) {
|
||||
sha256->digest[i] += S[i];
|
||||
}
|
||||
|
||||
XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* FREESCALE_MMCAU */
|
||||
@ -179,11 +196,17 @@ int Sha256Update(Sha256* sha256, const byte* data, word32 len)
|
||||
len -= add;
|
||||
|
||||
if (sha256->buffLen == SHA256_BLOCK_SIZE) {
|
||||
int ret;
|
||||
|
||||
#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU)
|
||||
ByteReverseWords(sha256->buffer, sha256->buffer,
|
||||
SHA256_BLOCK_SIZE);
|
||||
#endif
|
||||
XTRANSFORM(sha256, local);
|
||||
|
||||
ret = XTRANSFORM(sha256, local);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
AddLength(sha256, SHA256_BLOCK_SIZE);
|
||||
sha256->buffLen = 0;
|
||||
}
|
||||
@ -196,6 +219,7 @@ int Sha256Update(Sha256* sha256, const byte* data, word32 len)
|
||||
int Sha256Final(Sha256* sha256, byte* hash)
|
||||
{
|
||||
byte* local = (byte*)sha256->buffer;
|
||||
int ret;
|
||||
|
||||
AddLength(sha256, sha256->buffLen); /* before adding pads */
|
||||
|
||||
@ -209,7 +233,11 @@ int Sha256Final(Sha256* sha256, byte* hash)
|
||||
#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU)
|
||||
ByteReverseWords(sha256->buffer, sha256->buffer, SHA256_BLOCK_SIZE);
|
||||
#endif
|
||||
XTRANSFORM(sha256, local);
|
||||
|
||||
ret = XTRANSFORM(sha256, local);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
sha256->buffLen = 0;
|
||||
}
|
||||
XMEMSET(&local[sha256->buffLen], 0, SHA256_PAD_SIZE - sha256->buffLen);
|
||||
@ -235,7 +263,10 @@ int Sha256Final(Sha256* sha256, byte* hash)
|
||||
2 * sizeof(word32));
|
||||
#endif
|
||||
|
||||
XTRANSFORM(sha256, local);
|
||||
ret = XTRANSFORM(sha256, local);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords(sha256->digest, sha256->digest, SHA256_DIGEST_SIZE);
|
||||
#endif
|
||||
|
@ -33,6 +33,7 @@
|
||||
#endif
|
||||
|
||||
#include <cyassl/ctaocrypt/sha512.h>
|
||||
#include <cyassl/ctaocrypt/error-crypt.h>
|
||||
#ifdef NO_INLINE
|
||||
#include <cyassl/ctaocrypt/misc.h>
|
||||
#else
|
||||
@ -142,13 +143,17 @@ static const word64 K512[80] = {
|
||||
d(i)+=h(i);h(i)+=S0(a(i))+Maj(a(i),b(i),c(i))
|
||||
|
||||
|
||||
static void Transform(Sha512* sha512)
|
||||
static int Transform(Sha512* sha512)
|
||||
{
|
||||
const word64* K = K512;
|
||||
|
||||
word32 j;
|
||||
word64 W[16];
|
||||
word64 T[8];
|
||||
word64* W;
|
||||
|
||||
W = (word64*) XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
if (W == NULL)
|
||||
return MEMORY_E;
|
||||
|
||||
/* Copy digest to working vars */
|
||||
XMEMCPY(T, sha512->digest, sizeof(T));
|
||||
@ -184,8 +189,12 @@ static void Transform(Sha512* sha512)
|
||||
sha512->digest[7] += h(0);
|
||||
|
||||
/* Wipe variables */
|
||||
XMEMSET(W, 0, sizeof(W));
|
||||
XMEMSET(W, 0, sizeof(word64) * 16);
|
||||
XMEMSET(T, 0, sizeof(T));
|
||||
|
||||
XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -211,11 +220,16 @@ int Sha512Update(Sha512* sha512, const byte* data, word32 len)
|
||||
len -= add;
|
||||
|
||||
if (sha512->buffLen == SHA512_BLOCK_SIZE) {
|
||||
int ret;
|
||||
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords64(sha512->buffer, sha512->buffer,
|
||||
SHA512_BLOCK_SIZE);
|
||||
#endif
|
||||
Transform(sha512);
|
||||
ret = Transform(sha512);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
AddLength(sha512, SHA512_BLOCK_SIZE);
|
||||
sha512->buffLen = 0;
|
||||
}
|
||||
@ -227,6 +241,7 @@ int Sha512Update(Sha512* sha512, const byte* data, word32 len)
|
||||
int Sha512Final(Sha512* sha512, byte* hash)
|
||||
{
|
||||
byte* local = (byte*)sha512->buffer;
|
||||
int ret;
|
||||
|
||||
AddLength(sha512, sha512->buffLen); /* before adding pads */
|
||||
|
||||
@ -240,7 +255,10 @@ int Sha512Final(Sha512* sha512, byte* hash)
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords64(sha512->buffer,sha512->buffer,SHA512_BLOCK_SIZE);
|
||||
#endif
|
||||
Transform(sha512);
|
||||
ret = Transform(sha512);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
sha512->buffLen = 0;
|
||||
}
|
||||
XMEMSET(&local[sha512->buffLen], 0, SHA512_PAD_SIZE - sha512->buffLen);
|
||||
@ -258,7 +276,10 @@ int Sha512Final(Sha512* sha512, byte* hash)
|
||||
sha512->buffer[SHA512_BLOCK_SIZE / sizeof(word64) - 2] = sha512->hiLen;
|
||||
sha512->buffer[SHA512_BLOCK_SIZE / sizeof(word64) - 1] = sha512->loLen;
|
||||
|
||||
Transform(sha512);
|
||||
ret = Transform(sha512);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords64(sha512->digest, sha512->digest, SHA512_DIGEST_SIZE);
|
||||
#endif
|
||||
@ -290,13 +311,17 @@ int InitSha384(Sha384* sha384)
|
||||
}
|
||||
|
||||
|
||||
static void Transform384(Sha384* sha384)
|
||||
static int Transform384(Sha384* sha384)
|
||||
{
|
||||
const word64* K = K512;
|
||||
|
||||
word32 j;
|
||||
word64 W[16];
|
||||
word64 T[8];
|
||||
word64* W;
|
||||
|
||||
W = (word64*) XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
if (W == NULL)
|
||||
return MEMORY_E;
|
||||
|
||||
/* Copy digest to working vars */
|
||||
XMEMCPY(T, sha384->digest, sizeof(T));
|
||||
@ -332,8 +357,12 @@ static void Transform384(Sha384* sha384)
|
||||
sha384->digest[7] += h(0);
|
||||
|
||||
/* Wipe variables */
|
||||
XMEMSET(W, 0, sizeof(W));
|
||||
XMEMSET(W, 0, sizeof(word64) * 16);
|
||||
XMEMSET(T, 0, sizeof(T));
|
||||
|
||||
XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -359,11 +388,16 @@ int Sha384Update(Sha384* sha384, const byte* data, word32 len)
|
||||
len -= add;
|
||||
|
||||
if (sha384->buffLen == SHA384_BLOCK_SIZE) {
|
||||
int ret;
|
||||
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords64(sha384->buffer, sha384->buffer,
|
||||
SHA384_BLOCK_SIZE);
|
||||
#endif
|
||||
Transform384(sha384);
|
||||
ret = Transform384(sha384);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
AddLength384(sha384, SHA384_BLOCK_SIZE);
|
||||
sha384->buffLen = 0;
|
||||
}
|
||||
@ -375,6 +409,7 @@ int Sha384Update(Sha384* sha384, const byte* data, word32 len)
|
||||
int Sha384Final(Sha384* sha384, byte* hash)
|
||||
{
|
||||
byte* local = (byte*)sha384->buffer;
|
||||
int ret;
|
||||
|
||||
AddLength384(sha384, sha384->buffLen); /* before adding pads */
|
||||
|
||||
@ -388,7 +423,10 @@ int Sha384Final(Sha384* sha384, byte* hash)
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords64(sha384->buffer,sha384->buffer,SHA384_BLOCK_SIZE);
|
||||
#endif
|
||||
Transform384(sha384);
|
||||
ret = Transform384(sha384);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
sha384->buffLen = 0;
|
||||
}
|
||||
XMEMSET(&local[sha384->buffLen], 0, SHA384_PAD_SIZE - sha384->buffLen);
|
||||
@ -406,7 +444,10 @@ int Sha384Final(Sha384* sha384, byte* hash)
|
||||
sha384->buffer[SHA384_BLOCK_SIZE / sizeof(word64) - 2] = sha384->hiLen;
|
||||
sha384->buffer[SHA384_BLOCK_SIZE / sizeof(word64) - 1] = sha384->loLen;
|
||||
|
||||
Transform384(sha384);
|
||||
ret = Transform384(sha384);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords64(sha384->digest, sha384->digest, SHA384_DIGEST_SIZE);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user