mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-10-23 21:27:45 -04:00
Update wolfSSL to the latest version(v.4.4.0) (#186)
* deleted old version wolfSSL before updating * updated wolfSSL to the latest version(v4.4.0) * updated wolfSSL to the latest version(v4.4.0) * added macros for timing resistance Co-authored-by: RichardBarry <3073890+RichardBarry@users.noreply.github.com> Co-authored-by: Ming Yue <mingyue86010@gmail.com>
This commit is contained in:
parent
68518f5866
commit
94aa31c3cb
1185 changed files with 837519 additions and 72138 deletions
|
|
@ -1,8 +1,8 @@
|
|||
/* hc128.c
|
||||
*
|
||||
* Copyright (C) 2006-2015 wolfSSL Inc.
|
||||
* Copyright (C) 2006-2020 wolfSSL Inc.
|
||||
*
|
||||
* This file is part of wolfSSL. (formerly known as CyaSSL)
|
||||
* This file is part of wolfSSL.
|
||||
*
|
||||
* wolfSSL is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -16,9 +16,10 @@
|
|||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
|
@ -34,6 +35,7 @@
|
|||
#include <wolfssl/wolfcrypt/hc128.h>
|
||||
#include <wolfssl/wolfcrypt/misc.h>
|
||||
#else
|
||||
#define WOLFSSL_MISC_INCLUDED
|
||||
#include <wolfcrypt/src/misc.c>
|
||||
#endif
|
||||
|
||||
|
|
@ -71,7 +73,7 @@
|
|||
(ctx->T[(u)]) += tem2+(tem0 ^ tem1); \
|
||||
(ctx->X[(a)]) = (ctx->T[(u)]); \
|
||||
(n) = tem3 ^ (ctx->T[(u)]) ; \
|
||||
}
|
||||
}
|
||||
|
||||
/*one step of HC-128, update Q and generate 32 bits keystream*/
|
||||
#define step_Q(ctx,u,v,a,b,c,d,n){ \
|
||||
|
|
@ -83,17 +85,17 @@
|
|||
(ctx->T[(u)]) += tem2 + (tem0 ^ tem1); \
|
||||
(ctx->Y[(a)]) = (ctx->T[(u)]); \
|
||||
(n) = tem3 ^ (ctx->T[(u)]) ; \
|
||||
}
|
||||
}
|
||||
|
||||
/*16 steps of HC-128, generate 512 bits keystream*/
|
||||
static void generate_keystream(HC128* ctx, word32* keystream)
|
||||
static void generate_keystream(HC128* ctx, word32* keystream)
|
||||
{
|
||||
word32 cc,dd;
|
||||
cc = ctx->counter1024 & 0x1ff;
|
||||
dd = (cc+16)&0x1ff;
|
||||
|
||||
if (ctx->counter1024 < 512)
|
||||
{
|
||||
if (ctx->counter1024 < 512)
|
||||
{
|
||||
ctx->counter1024 = (ctx->counter1024 + 16) & 0x3ff;
|
||||
step_P(ctx, cc+0, cc+1, 0, 6, 13,4, keystream[0]);
|
||||
step_P(ctx, cc+1, cc+2, 1, 7, 14,5, keystream[1]);
|
||||
|
|
@ -112,7 +114,7 @@ static void generate_keystream(HC128* ctx, word32* keystream)
|
|||
step_P(ctx, cc+14,cc+15,14,4, 11,2, keystream[14]);
|
||||
step_P(ctx, cc+15,dd+0, 15,5, 12,3, keystream[15]);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
ctx->counter1024 = (ctx->counter1024 + 16) & 0x3ff;
|
||||
step_Q(ctx, 512+cc+0, 512+cc+1, 0, 6, 13,4, keystream[0]);
|
||||
|
|
@ -148,7 +150,7 @@ static void generate_keystream(HC128* ctx, word32* keystream)
|
|||
h1((ctx),(ctx->X[(d)]),tem3); \
|
||||
(ctx->T[(u)]) = ((ctx->T[(u)]) + tem2+(tem0^tem1)) ^ tem3; \
|
||||
(ctx->X[(a)]) = (ctx->T[(u)]); \
|
||||
}
|
||||
}
|
||||
|
||||
/*update table Q*/
|
||||
#define update_Q(ctx,u,v,a,b,c,d){ \
|
||||
|
|
@ -159,7 +161,7 @@ static void generate_keystream(HC128* ctx, word32* keystream)
|
|||
h2((ctx),(ctx->Y[(d)]),tem3); \
|
||||
(ctx->T[(u)]) = ((ctx->T[(u)]) + tem2+(tem0^tem1)) ^ tem3; \
|
||||
(ctx->Y[(a)]) = (ctx->T[(u)]); \
|
||||
}
|
||||
}
|
||||
|
||||
/*16 steps of HC-128, without generating keystream, */
|
||||
/*but use the outputs to update P and Q*/
|
||||
|
|
@ -169,8 +171,8 @@ static void setup_update(HC128* ctx) /*each time 16 steps*/
|
|||
cc = ctx->counter1024 & 0x1ff;
|
||||
dd = (cc+16)&0x1ff;
|
||||
|
||||
if (ctx->counter1024 < 512)
|
||||
{
|
||||
if (ctx->counter1024 < 512)
|
||||
{
|
||||
ctx->counter1024 = (ctx->counter1024 + 16) & 0x3ff;
|
||||
update_P(ctx, cc+0, cc+1, 0, 6, 13, 4);
|
||||
update_P(ctx, cc+1, cc+2, 1, 7, 14, 5);
|
||||
|
|
@ -187,9 +189,9 @@ static void setup_update(HC128* ctx) /*each time 16 steps*/
|
|||
update_P(ctx, cc+12,cc+13,12,2, 9, 0);
|
||||
update_P(ctx, cc+13,cc+14,13,3, 10, 1);
|
||||
update_P(ctx, cc+14,cc+15,14,4, 11, 2);
|
||||
update_P(ctx, cc+15,dd+0, 15,5, 12, 3);
|
||||
update_P(ctx, cc+15,dd+0, 15,5, 12, 3);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
ctx->counter1024 = (ctx->counter1024 + 16) & 0x3ff;
|
||||
update_Q(ctx, 512+cc+0, 512+cc+1, 0, 6, 13, 4);
|
||||
|
|
@ -207,8 +209,8 @@ static void setup_update(HC128* ctx) /*each time 16 steps*/
|
|||
update_Q(ctx, 512+cc+12,512+cc+13,12,2, 9, 0);
|
||||
update_Q(ctx, 512+cc+13,512+cc+14,13,3, 10, 1);
|
||||
update_Q(ctx, 512+cc+14,512+cc+15,14,4, 11, 2);
|
||||
update_Q(ctx, 512+cc+15,512+dd+0, 15,5, 12, 3);
|
||||
}
|
||||
update_Q(ctx, 512+cc+15,512+dd+0, 15,5, 12, 3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -230,7 +232,7 @@ static void setup_update(HC128* ctx) /*each time 16 steps*/
|
|||
|
||||
|
||||
static void Hc128_SetIV(HC128* ctx, const byte* inIv)
|
||||
{
|
||||
{
|
||||
word32 i;
|
||||
word32 iv[4];
|
||||
|
||||
|
|
@ -238,46 +240,46 @@ static void Hc128_SetIV(HC128* ctx, const byte* inIv)
|
|||
XMEMCPY(iv, inIv, sizeof(iv));
|
||||
else
|
||||
XMEMSET(iv, 0, sizeof(iv));
|
||||
|
||||
|
||||
for (i = 0; i < (128 >> 5); i++)
|
||||
ctx->iv[i] = LITTLE32(iv[i]);
|
||||
|
||||
|
||||
for (; i < 8; i++) ctx->iv[i] = ctx->iv[i-4];
|
||||
|
||||
/* expand the key and IV into the table T */
|
||||
/* (expand the key and IV into the table P and Q) */
|
||||
|
||||
|
||||
/* expand the key and IV into the table T */
|
||||
/* (expand the key and IV into the table P and Q) */
|
||||
|
||||
for (i = 0; i < 8; i++) ctx->T[i] = ctx->key[i];
|
||||
for (i = 8; i < 16; i++) ctx->T[i] = ctx->iv[i-8];
|
||||
|
||||
for (i = 16; i < (256+16); i++)
|
||||
for (i = 16; i < (256+16); i++)
|
||||
ctx->T[i] = f2(ctx->T[i-2]) + ctx->T[i-7] + f1(ctx->T[i-15]) +
|
||||
ctx->T[i-16]+i;
|
||||
|
||||
|
||||
for (i = 0; i < 16; i++) ctx->T[i] = ctx->T[256+i];
|
||||
|
||||
for (i = 16; i < 1024; i++)
|
||||
for (i = 16; i < 1024; i++)
|
||||
ctx->T[i] = f2(ctx->T[i-2]) + ctx->T[i-7] + f1(ctx->T[i-15]) +
|
||||
ctx->T[i-16]+256+i;
|
||||
|
||||
|
||||
/* initialize counter1024, X and Y */
|
||||
ctx->counter1024 = 0;
|
||||
for (i = 0; i < 16; i++) ctx->X[i] = ctx->T[512-16+i];
|
||||
for (i = 0; i < 16; i++) ctx->Y[i] = ctx->T[512+512-16+i];
|
||||
|
||||
|
||||
/* run the cipher 1024 steps before generating the output */
|
||||
for (i = 0; i < 64; i++) setup_update(ctx);
|
||||
for (i = 0; i < 64; i++) setup_update(ctx);
|
||||
}
|
||||
|
||||
|
||||
static INLINE int DoKey(HC128* ctx, const byte* key, const byte* iv)
|
||||
{
|
||||
word32 i;
|
||||
static WC_INLINE int DoKey(HC128* ctx, const byte* key, const byte* iv)
|
||||
{
|
||||
word32 i;
|
||||
|
||||
/* Key size in bits 128 */
|
||||
/* Key size in bits 128 */
|
||||
for (i = 0; i < (128 >> 5); i++)
|
||||
ctx->key[i] = LITTLE32(((word32*)key)[i]);
|
||||
|
||||
|
||||
for ( ; i < 8 ; i++) ctx->key[i] = ctx->key[i-4];
|
||||
|
||||
Hc128_SetIV(ctx, iv);
|
||||
|
|
@ -286,10 +288,35 @@ static INLINE int DoKey(HC128* ctx, const byte* key, const byte* iv)
|
|||
}
|
||||
|
||||
|
||||
int wc_Hc128_SetHeap(HC128* ctx, void* heap)
|
||||
{
|
||||
if (ctx == NULL) {
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
#ifdef XSTREAM_ALIGN
|
||||
ctx->heap = heap;
|
||||
#endif
|
||||
|
||||
(void)heap;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Key setup */
|
||||
int wc_Hc128_SetKey(HC128* ctx, const byte* key, const byte* iv)
|
||||
{
|
||||
if (ctx == NULL || key == NULL) {
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
#ifdef XSTREAM_ALIGN
|
||||
/* default heap to NULL or heap test value */
|
||||
#ifdef WOLFSSL_HEAP_TEST
|
||||
ctx->heap = (void*)WOLFSSL_HEAP_TEST;
|
||||
#else
|
||||
ctx->heap = NULL;
|
||||
#endif /* WOLFSSL_HEAP_TEST */
|
||||
|
||||
if ((wolfssl_word)key % 4) {
|
||||
int alignKey[4];
|
||||
|
||||
|
|
@ -308,7 +335,7 @@ int wc_Hc128_SetKey(HC128* ctx, const byte* key, const byte* iv)
|
|||
|
||||
|
||||
/* The following defines the encryption of data stream */
|
||||
static INLINE int DoProcess(HC128* ctx, byte* output, const byte* input,
|
||||
static WC_INLINE int DoProcess(HC128* ctx, byte* output, const byte* input,
|
||||
word32 msglen)
|
||||
{
|
||||
word32 i, keystream[16];
|
||||
|
|
@ -345,7 +372,7 @@ static INLINE int DoProcess(HC128* ctx, byte* output, const byte* input,
|
|||
{
|
||||
word32 wordsLeft = msglen / sizeof(word32);
|
||||
if (msglen % sizeof(word32)) wordsLeft++;
|
||||
|
||||
|
||||
ByteReverseWords(keystream, keystream, wordsLeft * sizeof(word32));
|
||||
}
|
||||
#endif
|
||||
|
|
@ -361,20 +388,24 @@ static INLINE int DoProcess(HC128* ctx, byte* output, const byte* input,
|
|||
/* Encrypt/decrypt a message of any size */
|
||||
int wc_Hc128_Process(HC128* ctx, byte* output, const byte* input, word32 msglen)
|
||||
{
|
||||
if (ctx == NULL || output == NULL || input == NULL) {
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
#ifdef XSTREAM_ALIGN
|
||||
if ((wolfssl_word)input % 4 || (wolfssl_word)output % 4) {
|
||||
#ifndef NO_WOLFSSL_ALLOC_ALIGN
|
||||
byte* tmp;
|
||||
WOLFSSL_MSG("Hc128Process unaligned");
|
||||
|
||||
tmp = (byte*)XMALLOC(msglen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
tmp = (byte*)XMALLOC(msglen, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
if (tmp == NULL) return MEMORY_E;
|
||||
|
||||
XMEMCPY(tmp, input, msglen);
|
||||
DoProcess(ctx, tmp, tmp, msglen);
|
||||
XMEMCPY(output, tmp, msglen);
|
||||
|
||||
XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
XFREE(tmp, ctx->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
||||
|
||||
return 0;
|
||||
#else
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue