From 20edc0e96134d40b21e66d4cb8fedfd4dc517466 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Thu, 16 Nov 2017 08:59:21 +1000 Subject: [PATCH] Remove use of data from SHA-2 data structures Only compiled and used with Intel speed-up code --- wolfcrypt/src/sha256.c | 22 ++++++++++------------ wolfcrypt/src/sha512.c | 22 ++++++++++------------ wolfssl/wolfcrypt/sha256.h | 2 ++ wolfssl/wolfcrypt/sha512.h | 2 ++ 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 321106f07..6cdc7b594 100644 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -612,7 +612,7 @@ static int InitSha256(wc_Sha256* sha256) S[i] = sha256->digest[i]; for (i = 0; i < 16; i++) - W[i] = ((word32*)sha256->data)[i]; + W[i] = sha256->buffer[i]; for (i = 16; i < WC_SHA256_BLOCK_SIZE; i++) W[i] = Gamma1(W[i-2]) + W[i-7] + Gamma0(W[i-15]) + W[i-16]; @@ -702,7 +702,6 @@ static INLINE void AddLength(wc_Sha256* sha256, word32 len) WC_SHA256_BLOCK_SIZE); } #endif - sha256->data = local; ret = XTRANSFORM(sha256); if (ret == 0) { AddLength(sha256, WC_SHA256_BLOCK_SIZE); @@ -734,15 +733,16 @@ static INLINE void AddLength(wc_Sha256* sha256, word32 len) word32 blocksLen = len & ~(WC_SHA256_BLOCK_SIZE-1); AddLength(sha256, blocksLen); - sha256->data = data; while (len >= WC_SHA256_BLOCK_SIZE) { + XMEMCPY(local, data, WC_SHA256_BLOCK_SIZE); + + data += WC_SHA256_BLOCK_SIZE; + len -= WC_SHA256_BLOCK_SIZE; + /* Byte reversal performed in function if required. */ ret = XTRANSFORM(sha256); if (ret != 0) break; - - sha256->data = (data += WC_SHA256_BLOCK_SIZE); - len -= WC_SHA256_BLOCK_SIZE; } } #else @@ -750,7 +750,6 @@ static INLINE void AddLength(wc_Sha256* sha256, word32 len) word32 blocksLen = len & ~(WC_SHA256_BLOCK_SIZE-1); AddLength(sha256, blocksLen); - sha256->data = local; while (len >= WC_SHA256_BLOCK_SIZE) { XMEMCPY(local, data, WC_SHA256_BLOCK_SIZE); @@ -789,7 +788,6 @@ static INLINE void AddLength(wc_Sha256* sha256, word32 len) return BAD_FUNC_ARG; } - sha256->data = local; AddLength(sha256, sha256->buffLen); /* before adding pads */ local[sha256->buffLen++] = 0x80; /* add 1 */ @@ -1711,7 +1709,7 @@ SHA256_NOINLINE static int Transform_Sha256_AVX1(wc_Sha256* sha256) "subq $64, %%rsp\n\t" - "movq 120(%[sha256]), %%rax\n\t" + "leaq 32(%[sha256]), %%rax\n\t" Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) LOAD_DIGEST() @@ -1840,7 +1838,7 @@ SHA256_NOINLINE static int Transform_Sha256_AVX1_RORX(wc_Sha256* sha256) "subq $64, %%rsp\n\t" Init_Masks(BYTE_FLIP_MASK, SHUF_00BA, SHUF_DC00) - "movq 120(%[sha256]), %%rax\n\t" + "leaq 32(%[sha256]), %%rax\n\t" W_K_from_buff(X0, X1, X2, X3, BYTE_FLIP_MASK) LOAD_DIGEST() @@ -2233,7 +2231,7 @@ SHA256_NOINLINE static int Transform_Sha256_AVX2(wc_Sha256* sha256) __asm__ __volatile__ ( "subq $512, %%rsp\n\t" - "movq 120(%[sha256]), %%rax\n\t" + "leaq 32(%[sha256]), %%rax\n\t" INIT_MASKS_Y(BYTE_FLIP_MASK, SHUF_Y_00BA, SHUF_Y_DC00) LOAD_DIGEST() @@ -2392,7 +2390,7 @@ SHA256_NOINLINE static int Transform_Sha256_AVX2_RORX(wc_Sha256* sha256) __asm__ __volatile__ ( "subq $512, %%rsp\n\t" - "movq 120(%[sha256]), %%rax\n\t" + "leaq 32(%[sha256]), %%rax\n\t" INIT_MASKS_Y(BYTE_FLIP_MASK, SHUF_Y_00BA, SHUF_Y_DC00) LOAD_W_K_LOW(BYTE_FLIP_MASK, rax) diff --git a/wolfcrypt/src/sha512.c b/wolfcrypt/src/sha512.c index 20222b524..15cfeeb82 100644 --- a/wolfcrypt/src/sha512.c +++ b/wolfcrypt/src/sha512.c @@ -409,7 +409,7 @@ static const word64 K512[80] = { W64LIT(0x5fcb6fab3ad6faec), W64LIT(0x6c44198c4a475817) }; -#define blk0(i) (W[i] = ((word64*)sha512->data)[i]) +#define blk0(i) (W[i] = sha512->buffer[i]) #define blk2(i) (\ W[ i & 15] += \ @@ -534,7 +534,6 @@ static INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, word32 len) WC_SHA512_BLOCK_SIZE); } #endif - sha512->data = local; ret = Transform_Sha512(sha512); if (ret == 0) { AddLength(sha512, WC_SHA512_BLOCK_SIZE); @@ -566,15 +565,16 @@ static INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, word32 len) word32 blocksLen = len & ~(WC_SHA512_BLOCK_SIZE-1); AddLength(sha512, blocksLen); - sha512->data = data; while (len >= WC_SHA512_BLOCK_SIZE) { + XMEMCPY(local, data, WC_SHA512_BLOCK_SIZE); + + data += WC_SHA512_BLOCK_SIZE; + len -= WC_SHA512_BLOCK_SIZE; + /* Byte reversal performed in function if required. */ ret = Transform_Sha512(sha512); if (ret != 0) break; - - sha512->data = (data += WC_SHA512_BLOCK_SIZE); - len -= WC_SHA512_BLOCK_SIZE; } } #else @@ -582,7 +582,6 @@ static INLINE int Sha512Update(wc_Sha512* sha512, const byte* data, word32 len) word32 blocksLen = len & ~(WC_SHA512_BLOCK_SIZE-1); AddLength(sha512, blocksLen); - sha512->data = local; while (len >= WC_SHA512_BLOCK_SIZE) { XMEMCPY(local, data, WC_SHA512_BLOCK_SIZE); @@ -636,7 +635,6 @@ static INLINE int Sha512Final(wc_Sha512* sha512) AddLength(sha512, sha512->buffLen); /* before adding pads */ local[sha512->buffLen++] = 0x80; /* add 1 */ - sha512->data = local; /* pad with zeros */ if (sha512->buffLen > WC_SHA512_PAD_SIZE) { @@ -1344,7 +1342,7 @@ static int Transform_Sha512_AVX1(wc_Sha512* sha512) /* 16 Ws plus loop counter. */ "subq $136, %%rsp\n\t" - "movq 224(%[sha512]), %%rax\n\t" + "leaq 64(%[sha512]), %%rax\n\t" INIT_MASK(MASK) LOAD_DIGEST() @@ -1496,7 +1494,7 @@ static int Transform_Sha512_AVX1_RORX(wc_Sha512* sha512) /* 16 Ws plus loop counter and K512. */ "subq $144, %%rsp\n\t" - "movq 224(%[sha512]), %%rax\n\t" + "leaq 64(%[sha512]), %%rax\n\t" INIT_MASK(MASK) LOAD_DIGEST() @@ -2192,7 +2190,7 @@ static int Transform_Sha512_AVX2(wc_Sha512* sha512) /* 16 Ws plus loop counter and K512. */ "subq $136, %%rsp\n\t" - "movq 224(%[sha512]), %%rax\n\t" + "leaq 64(%[sha512]), %%rax\n\t" INIT_MASK(MASK_Y) LOAD_DIGEST() @@ -2366,7 +2364,7 @@ static int Transform_Sha512_AVX2_RORX(wc_Sha512* sha512) /* 16 Ws plus loop counter. */ "subq $136, %%rsp\n\t" - "movq 224(%[sha512]), "L2"\n\t" + "leaq 64(%[sha512]), "L2"\n\t" INIT_MASK(MASK_Y) LOAD_DIGEST() diff --git a/wolfssl/wolfcrypt/sha256.h b/wolfssl/wolfcrypt/sha256.h index d8b85bbfd..0cc9beb3c 100644 --- a/wolfssl/wolfcrypt/sha256.h +++ b/wolfssl/wolfcrypt/sha256.h @@ -104,7 +104,9 @@ typedef struct wc_Sha256 { word32 loLen; /* length in bytes */ word32 hiLen; /* length in bytes */ void* heap; +#ifdef USE_INTEL_SPEEDUP const byte* data; +#endif #ifdef WOLFSSL_PIC32MZ_HASH hashUpdCache cache; /* cache for updates */ #endif diff --git a/wolfssl/wolfcrypt/sha512.h b/wolfssl/wolfcrypt/sha512.h index aad1d5d73..277f1a687 100644 --- a/wolfssl/wolfcrypt/sha512.h +++ b/wolfssl/wolfcrypt/sha512.h @@ -92,7 +92,9 @@ typedef struct wc_Sha512 { word64 loLen; /* length in bytes */ word64 hiLen; /* length in bytes */ void* heap; +#ifdef USE_INTEL_SPEEDUP const byte* data; +#endif #ifdef WOLFSSL_ASYNC_CRYPT WC_ASYNC_DEV asyncDev; #endif /* WOLFSSL_ASYNC_CRYPT */