mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-02 12:14:38 +02:00
Merge pull request #7901 from SparkiDev/memusage_8
Memory usage improvements
This commit is contained in:
@@ -84,11 +84,9 @@ int wc_PRF(byte* result, word32 resLen, const byte* secret,
|
|||||||
word32 lastTime;
|
word32 lastTime;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
#ifdef WOLFSSL_SMALL_STACK
|
||||||
byte* previous;
|
|
||||||
byte* current;
|
byte* current;
|
||||||
Hmac* hmac;
|
Hmac* hmac;
|
||||||
#else
|
#else
|
||||||
byte previous[P_HASH_MAX_SIZE]; /* max size */
|
|
||||||
byte current[P_HASH_MAX_SIZE]; /* max size */
|
byte current[P_HASH_MAX_SIZE]; /* max size */
|
||||||
Hmac hmac[1];
|
Hmac hmac[1];
|
||||||
#endif
|
#endif
|
||||||
@@ -153,19 +151,16 @@ int wc_PRF(byte* result, word32 resLen, const byte* secret,
|
|||||||
lastTime = times - 1;
|
lastTime = times - 1;
|
||||||
|
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
#ifdef WOLFSSL_SMALL_STACK
|
||||||
previous = (byte*)XMALLOC(P_HASH_MAX_SIZE, heap, DYNAMIC_TYPE_DIGEST);
|
|
||||||
current = (byte*)XMALLOC(P_HASH_MAX_SIZE, heap, DYNAMIC_TYPE_DIGEST);
|
current = (byte*)XMALLOC(P_HASH_MAX_SIZE, heap, DYNAMIC_TYPE_DIGEST);
|
||||||
hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
|
hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
|
||||||
if (previous == NULL || current == NULL || hmac == NULL) {
|
if (current == NULL || hmac == NULL) {
|
||||||
XFREE(previous, heap, DYNAMIC_TYPE_DIGEST);
|
|
||||||
XFREE(current, heap, DYNAMIC_TYPE_DIGEST);
|
XFREE(current, heap, DYNAMIC_TYPE_DIGEST);
|
||||||
XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
|
XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef WOLFSSL_CHECK_MEM_ZERO
|
#ifdef WOLFSSL_CHECK_MEM_ZERO
|
||||||
XMEMSET(previous, 0xff, P_HASH_MAX_SIZE);
|
XMEMSET(current, 0xff, P_HASH_MAX_SIZE);
|
||||||
wc_MemZero_Add("wc_PRF previous", previous, P_HASH_MAX_SIZE);
|
|
||||||
wc_MemZero_Add("wc_PRF current", current, P_HASH_MAX_SIZE);
|
wc_MemZero_Add("wc_PRF current", current, P_HASH_MAX_SIZE);
|
||||||
wc_MemZero_Add("wc_PRF hmac", hmac, sizeof(Hmac));
|
wc_MemZero_Add("wc_PRF hmac", hmac, sizeof(Hmac));
|
||||||
#endif
|
#endif
|
||||||
@@ -176,52 +171,52 @@ int wc_PRF(byte* result, word32 resLen, const byte* secret,
|
|||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = wc_HmacUpdate(hmac, seed, seedLen); /* A0 = seed */
|
ret = wc_HmacUpdate(hmac, seed, seedLen); /* A0 = seed */
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = wc_HmacFinal(hmac, previous); /* A1 */
|
ret = wc_HmacFinal(hmac, current); /* A1 */
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
word32 i;
|
word32 i;
|
||||||
word32 idx = 0;
|
word32 idx = 0;
|
||||||
|
|
||||||
for (i = 0; i < times; i++) {
|
for (i = 0; i < times; i++) {
|
||||||
ret = wc_HmacUpdate(hmac, previous, len);
|
ret = wc_HmacUpdate(hmac, current, len);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
break;
|
break;
|
||||||
ret = wc_HmacUpdate(hmac, seed, seedLen);
|
ret = wc_HmacUpdate(hmac, seed, seedLen);
|
||||||
|
if (ret != 0)
|
||||||
|
break;
|
||||||
|
if ((i != lastTime) || !lastLen) {
|
||||||
|
ret = wc_HmacFinal(hmac, &result[idx]);
|
||||||
|
if (ret != 0)
|
||||||
|
break;
|
||||||
|
idx += len;
|
||||||
|
|
||||||
|
ret = wc_HmacUpdate(hmac, current, len);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
break;
|
break;
|
||||||
ret = wc_HmacFinal(hmac, current);
|
ret = wc_HmacFinal(hmac, current);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
if ((i == lastTime) && lastLen)
|
else {
|
||||||
|
ret = wc_HmacFinal(hmac, current);
|
||||||
|
if (ret != 0)
|
||||||
|
break;
|
||||||
XMEMCPY(&result[idx], current,
|
XMEMCPY(&result[idx], current,
|
||||||
min(lastLen, P_HASH_MAX_SIZE));
|
min(lastLen, P_HASH_MAX_SIZE));
|
||||||
else {
|
|
||||||
XMEMCPY(&result[idx], current, len);
|
|
||||||
idx += len;
|
|
||||||
ret = wc_HmacUpdate(hmac, previous, len);
|
|
||||||
if (ret != 0)
|
|
||||||
break;
|
|
||||||
ret = wc_HmacFinal(hmac, previous);
|
|
||||||
if (ret != 0)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wc_HmacFree(hmac);
|
wc_HmacFree(hmac);
|
||||||
}
|
}
|
||||||
|
|
||||||
ForceZero(previous, P_HASH_MAX_SIZE);
|
|
||||||
ForceZero(current, P_HASH_MAX_SIZE);
|
ForceZero(current, P_HASH_MAX_SIZE);
|
||||||
ForceZero(hmac, sizeof(Hmac));
|
ForceZero(hmac, sizeof(Hmac));
|
||||||
|
|
||||||
#if defined(WOLFSSL_CHECK_MEM_ZERO)
|
#if defined(WOLFSSL_CHECK_MEM_ZERO)
|
||||||
wc_MemZero_Check(previous, P_HASH_MAX_SIZE);
|
|
||||||
wc_MemZero_Check(current, P_HASH_MAX_SIZE);
|
wc_MemZero_Check(current, P_HASH_MAX_SIZE);
|
||||||
wc_MemZero_Check(hmac, sizeof(Hmac));
|
wc_MemZero_Check(hmac, sizeof(Hmac));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
#ifdef WOLFSSL_SMALL_STACK
|
||||||
XFREE(previous, heap, DYNAMIC_TYPE_DIGEST);
|
|
||||||
XFREE(current, heap, DYNAMIC_TYPE_DIGEST);
|
XFREE(current, heap, DYNAMIC_TYPE_DIGEST);
|
||||||
XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
|
XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1255,6 +1255,9 @@ static int InitSha256(wc_Sha256* sha256)
|
|||||||
{
|
{
|
||||||
word32 S[8], t0, t1;
|
word32 S[8], t0, t1;
|
||||||
int i;
|
int i;
|
||||||
|
#ifdef USE_SLOW_SHA256
|
||||||
|
int j;
|
||||||
|
#endif
|
||||||
word32 W[WC_SHA256_BLOCK_SIZE/sizeof(word32)];
|
word32 W[WC_SHA256_BLOCK_SIZE/sizeof(word32)];
|
||||||
|
|
||||||
/* Copy digest to working vars */
|
/* Copy digest to working vars */
|
||||||
@@ -1268,6 +1271,16 @@ static int InitSha256(wc_Sha256* sha256)
|
|||||||
S[7] = sha256->digest[7];
|
S[7] = sha256->digest[7];
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
#ifdef USE_SLOW_SHA256
|
||||||
|
for (j = 0; j < 16; j++) {
|
||||||
|
RND1(j);
|
||||||
|
}
|
||||||
|
for (i = 16; i < 64; i += 16) {
|
||||||
|
for (j = 0; j < 16; j++) {
|
||||||
|
RNDN(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
RND1( 0); RND1( 1); RND1( 2); RND1( 3);
|
RND1( 0); RND1( 1); RND1( 2); RND1( 3);
|
||||||
RND1( 4); RND1( 5); RND1( 6); RND1( 7);
|
RND1( 4); RND1( 5); RND1( 6); RND1( 7);
|
||||||
RND1( 8); RND1( 9); RND1(10); RND1(11);
|
RND1( 8); RND1( 9); RND1(10); RND1(11);
|
||||||
@@ -1279,6 +1292,7 @@ static int InitSha256(wc_Sha256* sha256)
|
|||||||
RNDN( 8); RNDN( 9); RNDN(10); RNDN(11);
|
RNDN( 8); RNDN( 9); RNDN(10); RNDN(11);
|
||||||
RNDN(12); RNDN(13); RNDN(14); RNDN(15);
|
RNDN(12); RNDN(13); RNDN(14); RNDN(15);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Add the working vars back into digest */
|
/* Add the working vars back into digest */
|
||||||
sha256->digest[0] += S[0];
|
sha256->digest[0] += S[0];
|
||||||
|
@@ -168,7 +168,7 @@ This library provides single precision (SP) integer math functions.
|
|||||||
do { \
|
do { \
|
||||||
ALLOC_SP_INT(n, s, err, h); \
|
ALLOC_SP_INT(n, s, err, h); \
|
||||||
if ((err) == MP_OKAY) { \
|
if ((err) == MP_OKAY) { \
|
||||||
(n)->size = (s); \
|
(n)->size = (sp_size_t)(s); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
@@ -187,7 +187,7 @@ This library provides single precision (SP) integer math functions.
|
|||||||
do { \
|
do { \
|
||||||
ALLOC_SP_INT(n, s, err, h); \
|
ALLOC_SP_INT(n, s, err, h); \
|
||||||
if ((err) == MP_OKAY) { \
|
if ((err) == MP_OKAY) { \
|
||||||
(n)->size = (unsigned int)(s); \
|
(n)->size = (sp_size_t)(s); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
@@ -222,8 +222,7 @@ This library provides single precision (SP) integer math functions.
|
|||||||
/* Declare a variable that will be assigned a value on XMALLOC. */
|
/* Declare a variable that will be assigned a value on XMALLOC. */
|
||||||
#define DECL_SP_INT_ARRAY(n, s, c) \
|
#define DECL_SP_INT_ARRAY(n, s, c) \
|
||||||
DECL_DYN_SP_INT_ARRAY(n, s, c)
|
DECL_DYN_SP_INT_ARRAY(n, s, c)
|
||||||
#else
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
||||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
|
||||||
!defined(WOLFSSL_SP_NO_DYN_STACK)
|
!defined(WOLFSSL_SP_NO_DYN_STACK)
|
||||||
/* Declare a variable on the stack with the required data size. */
|
/* Declare a variable on the stack with the required data size. */
|
||||||
#define DECL_SP_INT_ARRAY(n, s, c) \
|
#define DECL_SP_INT_ARRAY(n, s, c) \
|
||||||
@@ -235,7 +234,6 @@ This library provides single precision (SP) integer math functions.
|
|||||||
sp_int n##d[c]; \
|
sp_int n##d[c]; \
|
||||||
sp_int* (n)[c]
|
sp_int* (n)[c]
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Dynamically allocate just enough data to support multiple sp_ints of the
|
/* Dynamically allocate just enough data to support multiple sp_ints of the
|
||||||
* required size. Use pointers into data to make up array and set sizes.
|
* required size. Use pointers into data to make up array and set sizes.
|
||||||
@@ -255,10 +253,10 @@ do { \
|
|||||||
else { \
|
else { \
|
||||||
int n##ii; \
|
int n##ii; \
|
||||||
(n)[0] = n##d; \
|
(n)[0] = n##d; \
|
||||||
(n)[0]->size = (s); \
|
(n)[0]->size = (sp_size_t)(s); \
|
||||||
for (n##ii = 1; n##ii < (int)(c); n##ii++) { \
|
for (n##ii = 1; n##ii < (int)(c); n##ii++) { \
|
||||||
(n)[n##ii] = MP_INT_NEXT((n)[n##ii-1], s); \
|
(n)[n##ii] = MP_INT_NEXT((n)[n##ii-1], s); \
|
||||||
(n)[n##ii]->size = (s); \
|
(n)[n##ii]->size = (sp_size_t)(s); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@@ -270,8 +268,7 @@ while (0)
|
|||||||
!defined(WOLFSSL_SP_NO_MALLOC)
|
!defined(WOLFSSL_SP_NO_MALLOC)
|
||||||
#define ALLOC_SP_INT_ARRAY(n, s, c, err, h) \
|
#define ALLOC_SP_INT_ARRAY(n, s, c, err, h) \
|
||||||
ALLOC_DYN_SP_INT_ARRAY(n, s, c, err, h)
|
ALLOC_DYN_SP_INT_ARRAY(n, s, c, err, h)
|
||||||
#else
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
||||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
|
||||||
!defined(WOLFSSL_SP_NO_DYN_STACK)
|
!defined(WOLFSSL_SP_NO_DYN_STACK)
|
||||||
/* Data declared on stack that supports multiple sp_ints of the
|
/* Data declared on stack that supports multiple sp_ints of the
|
||||||
* required size. Use pointers into data to make up array and set sizes.
|
* required size. Use pointers into data to make up array and set sizes.
|
||||||
@@ -284,10 +281,10 @@ while (0)
|
|||||||
if ((err) == MP_OKAY) { \
|
if ((err) == MP_OKAY) { \
|
||||||
int n##ii; \
|
int n##ii; \
|
||||||
(n)[0] = (sp_int*)n##d; \
|
(n)[0] = (sp_int*)n##d; \
|
||||||
((sp_int_minimal*)(n)[0])->size = (s); \
|
((sp_int_minimal*)(n)[0])->size = (sp_size_t)(s); \
|
||||||
for (n##ii = 1; n##ii < (int)(c); n##ii++) { \
|
for (n##ii = 1; n##ii < (int)(c); n##ii++) { \
|
||||||
(n)[n##ii] = MP_INT_NEXT((n)[n##ii-1], s); \
|
(n)[n##ii] = MP_INT_NEXT((n)[n##ii-1], s); \
|
||||||
((sp_int_minimal*)(n)[n##ii])->size = (s); \
|
((sp_int_minimal*)(n)[n##ii])->size = (sp_size_t)(s); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@@ -305,13 +302,12 @@ while (0)
|
|||||||
int n##ii; \
|
int n##ii; \
|
||||||
for (n##ii = 0; n##ii < (int)(c); n##ii++) { \
|
for (n##ii = 0; n##ii < (int)(c); n##ii++) { \
|
||||||
(n)[n##ii] = &n##d[n##ii]; \
|
(n)[n##ii] = &n##d[n##ii]; \
|
||||||
(n)[n##ii]->size = (s); \
|
(n)[n##ii]->size = (sp_size_t)(s); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Free data variable that was dynamically allocated. */
|
/* Free data variable that was dynamically allocated. */
|
||||||
#define FREE_DYN_SP_INT_ARRAY(n, h) \
|
#define FREE_DYN_SP_INT_ARRAY(n, h) \
|
||||||
@@ -4862,7 +4858,7 @@ static void _sp_init_size(sp_int* a, unsigned int size)
|
|||||||
#endif
|
#endif
|
||||||
_sp_zero((sp_int*)am);
|
_sp_zero((sp_int*)am);
|
||||||
|
|
||||||
a->size = size;
|
a->size = (sp_size_t)size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the multi-precision number to be zero with a given max size.
|
/* Initialize the multi-precision number to be zero with a given max size.
|
||||||
@@ -5217,8 +5213,8 @@ int sp_exch(sp_int* a, sp_int* b)
|
|||||||
ALLOC_SP_INT(t, a->used, err, NULL);
|
ALLOC_SP_INT(t, a->used, err, NULL);
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
/* Cache allocated size of a and b. */
|
/* Cache allocated size of a and b. */
|
||||||
unsigned int asize = a->size;
|
sp_size_t asize = a->size;
|
||||||
unsigned int bsize = b->size;
|
sp_size_t bsize = b->size;
|
||||||
/* Copy all of SP int: t <- a, a <- b, b <- t. */
|
/* Copy all of SP int: t <- a, a <- b, b <- t. */
|
||||||
XMEMCPY(t, a, MP_INT_SIZEOF(a->used));
|
XMEMCPY(t, a, MP_INT_SIZEOF(a->used));
|
||||||
XMEMCPY(a, b, MP_INT_SIZEOF(b->used));
|
XMEMCPY(a, b, MP_INT_SIZEOF(b->used));
|
||||||
@@ -5254,9 +5250,9 @@ int sp_cond_swap_ct_ex(sp_int* a, sp_int* b, int cnt, int swap, sp_int* t)
|
|||||||
sp_int_digit mask = (sp_int_digit)0 - (sp_int_digit)swap;
|
sp_int_digit mask = (sp_int_digit)0 - (sp_int_digit)swap;
|
||||||
|
|
||||||
/* XOR other fields in sp_int into temp - mask set when swapping. */
|
/* XOR other fields in sp_int into temp - mask set when swapping. */
|
||||||
t->used = (a->used ^ b->used) & (unsigned int)mask;
|
t->used = (a->used ^ b->used) & (sp_size_t)mask;
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
t->sign = (a->sign ^ b->sign) & (unsigned int)mask;
|
t->sign = (a->sign ^ b->sign) & (sp_uint8)mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* XOR requested words into temp - mask set when swapping. */
|
/* XOR requested words into temp - mask set when swapping. */
|
||||||
@@ -5722,7 +5718,7 @@ int sp_cnt_lsb(const sp_int* a)
|
|||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
|
||||||
/* Count least significant words that are zero. */
|
/* Count least significant words that are zero. */
|
||||||
for (i = 0; i < a->used && a->dp[i] == 0; i++, bc += SP_WORD_SIZE) {
|
for (i = 0; (i < a->used) && (a->dp[i] == 0); i++, bc += SP_WORD_SIZE) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use 4-bit table to get count. */
|
/* Use 4-bit table to get count. */
|
||||||
@@ -5793,7 +5789,7 @@ int sp_set_bit(sp_int* a, int i)
|
|||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
/* Get index of word to set. */
|
/* Get index of word to set. */
|
||||||
unsigned int w = (unsigned int)(i >> SP_WORD_SHIFT);
|
sp_size_t w = (sp_size_t)(i >> SP_WORD_SHIFT);
|
||||||
|
|
||||||
/* Check for valid number and and space for bit. */
|
/* Check for valid number and and space for bit. */
|
||||||
if ((a == NULL) || (i < 0) || (w >= a->size)) {
|
if ((a == NULL) || (i < 0) || (w >= a->size)) {
|
||||||
@@ -6329,7 +6325,7 @@ static int _sp_mul_d(const sp_int* a, sp_int_digit d, sp_int* r, unsigned int o)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Update number of words in result. */
|
/* Update number of words in result. */
|
||||||
r->used = o;
|
r->used = (sp_size_t)o;
|
||||||
/* In case n is zero. */
|
/* In case n is zero. */
|
||||||
sp_clamp(r);
|
sp_clamp(r);
|
||||||
|
|
||||||
@@ -7060,7 +7056,7 @@ static void _sp_div_2(const sp_int* a, sp_int* r)
|
|||||||
/* Last word only needs to be shifted down. */
|
/* Last word only needs to be shifted down. */
|
||||||
r->dp[i] = a->dp[i] >> 1;
|
r->dp[i] = a->dp[i] >> 1;
|
||||||
/* Set used to be all words seen. */
|
/* Set used to be all words seen. */
|
||||||
r->used = (unsigned int)i + 1;
|
r->used = (sp_size_t)i + 1;
|
||||||
/* Remove leading zeros. */
|
/* Remove leading zeros. */
|
||||||
sp_clamp(r);
|
sp_clamp(r);
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
@@ -7136,7 +7132,7 @@ int sp_div_2_mod_ct(const sp_int* a, const sp_int* m, sp_int* r)
|
|||||||
#endif
|
#endif
|
||||||
/* Mask to apply to modulus. */
|
/* Mask to apply to modulus. */
|
||||||
sp_int_digit mask = (sp_int_digit)0 - (a->dp[0] & 1);
|
sp_int_digit mask = (sp_int_digit)0 - (a->dp[0] & 1);
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
sp_print(a, "a");
|
sp_print(a, "a");
|
||||||
@@ -7211,7 +7207,7 @@ int sp_div_2_mod_ct(const sp_int* a, const sp_int* m, sp_int* r)
|
|||||||
*/
|
*/
|
||||||
static void _sp_add_off(const sp_int* a, const sp_int* b, sp_int* r, int o)
|
static void _sp_add_off(const sp_int* a, const sp_int* b, sp_int* r, int o)
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
sp_size_t i = 0;
|
||||||
#ifndef SQR_MUL_ASM
|
#ifndef SQR_MUL_ASM
|
||||||
sp_int_word t = 0;
|
sp_int_word t = 0;
|
||||||
#else
|
#else
|
||||||
@@ -7332,10 +7328,10 @@ static void _sp_add_off(const sp_int* a, const sp_int* b, sp_int* r, int o)
|
|||||||
/* Put in carry. */
|
/* Put in carry. */
|
||||||
#ifndef SQR_MUL_ASM
|
#ifndef SQR_MUL_ASM
|
||||||
r->dp[i] = (sp_int_digit)t;
|
r->dp[i] = (sp_int_digit)t;
|
||||||
r->used += (t != 0);
|
r->used = (sp_size_t)(r->used + (sp_size_t)(t != 0));
|
||||||
#else
|
#else
|
||||||
r->dp[i] = l;
|
r->dp[i] = l;
|
||||||
r->used += (l != 0);
|
r->used = (sp_size_t)(r->used + (sp_size_t)(l != 0));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Remove leading zeros. */
|
/* Remove leading zeros. */
|
||||||
@@ -7359,8 +7355,8 @@ static void _sp_add_off(const sp_int* a, const sp_int* b, sp_int* r, int o)
|
|||||||
static void _sp_sub_off(const sp_int* a, const sp_int* b, sp_int* r,
|
static void _sp_sub_off(const sp_int* a, const sp_int* b, sp_int* r,
|
||||||
unsigned int o)
|
unsigned int o)
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
sp_size_t i = 0;
|
||||||
unsigned int j;
|
sp_size_t j;
|
||||||
#ifndef SQR_MUL_ASM
|
#ifndef SQR_MUL_ASM
|
||||||
sp_int_sword t = 0;
|
sp_int_sword t = 0;
|
||||||
#else
|
#else
|
||||||
@@ -7375,7 +7371,7 @@ static void _sp_sub_off(const sp_int* a, const sp_int* b, sp_int* r,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
i = o;
|
i = (sp_size_t)o;
|
||||||
}
|
}
|
||||||
/* Index to add at is the offset now. */
|
/* Index to add at is the offset now. */
|
||||||
|
|
||||||
@@ -7569,7 +7565,7 @@ static int _sp_addmod(const sp_int* a, const sp_int* b, const sp_int* m,
|
|||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
/* Calculate used based on digits used in a and b. */
|
/* Calculate used based on digits used in a and b. */
|
||||||
unsigned int used = ((a->used >= b->used) ? a->used + 1 : b->used + 1);
|
sp_size_t used = ((a->used >= b->used) ? a->used + 1 : b->used + 1);
|
||||||
DECL_SP_INT(t, used);
|
DECL_SP_INT(t, used);
|
||||||
|
|
||||||
/* Allocate a temporary SP int to hold sum. */
|
/* Allocate a temporary SP int to hold sum. */
|
||||||
@@ -7690,7 +7686,7 @@ static int _sp_submod(const sp_int* a, const sp_int* b, const sp_int* m,
|
|||||||
|
|
||||||
FREE_SP_INT_ARRAY(t, NULL);
|
FREE_SP_INT_ARRAY(t, NULL);
|
||||||
#else /* WOLFSSL_SP_INT_NEGATIVE */
|
#else /* WOLFSSL_SP_INT_NEGATIVE */
|
||||||
unsigned int used = ((a->used >= b->used) ? a->used + 1 : b->used + 1);
|
sp_size_t used = ((a->used >= b->used) ? a->used + 1 : b->used + 1);
|
||||||
DECL_SP_INT(t, used);
|
DECL_SP_INT(t, used);
|
||||||
|
|
||||||
ALLOC_SP_INT_SIZE(t, used, err, NULL);
|
ALLOC_SP_INT_SIZE(t, used, err, NULL);
|
||||||
@@ -7766,12 +7762,12 @@ int sp_submod(const sp_int* a, const sp_int* b, const sp_int* m, sp_int* r)
|
|||||||
static void sp_clamp_ct(sp_int* a)
|
static void sp_clamp_ct(sp_int* a)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned int used = a->used;
|
sp_size_t used = a->used;
|
||||||
unsigned int mask = (unsigned int)-1;
|
sp_size_t mask = (sp_size_t)-1;
|
||||||
|
|
||||||
for (i = (int)a->used - 1; i >= 0; i--) {
|
for (i = (int)a->used - 1; i >= 0; i--) {
|
||||||
used -= ((unsigned int)(a->dp[i] == 0)) & mask;
|
used = (sp_size_t)(used - ((a->dp[i] == 0) & mask));
|
||||||
mask &= (unsigned int)0 - (a->dp[i] == 0);
|
mask &= (sp_size_t)(0 - (a->dp[i] == 0));
|
||||||
}
|
}
|
||||||
a->used = used;
|
a->used = used;
|
||||||
}
|
}
|
||||||
@@ -7807,7 +7803,7 @@ int sp_addmod_ct(const sp_int* a, const sp_int* b, const sp_int* m, sp_int* r)
|
|||||||
sp_int_digit mask;
|
sp_int_digit mask;
|
||||||
sp_int_digit mask_a = (sp_int_digit)-1;
|
sp_int_digit mask_a = (sp_int_digit)-1;
|
||||||
sp_int_digit mask_b = (sp_int_digit)-1;
|
sp_int_digit mask_b = (sp_int_digit)-1;
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
|
|
||||||
/* Check result is as big as modulus. */
|
/* Check result is as big as modulus. */
|
||||||
if (m->used > r->size) {
|
if (m->used > r->size) {
|
||||||
@@ -8044,7 +8040,7 @@ static void _sp_submod_ct(const sp_int* a, const sp_int* b, const sp_int* m,
|
|||||||
}
|
}
|
||||||
/* Result will always have digits equal to or less than those in
|
/* Result will always have digits equal to or less than those in
|
||||||
* modulus. */
|
* modulus. */
|
||||||
r->used = i;
|
r->used = (sp_size_t)i;
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
r->sign = MP_ZPOS;
|
r->sign = MP_ZPOS;
|
||||||
#endif /* WOLFSSL_SP_INT_NEGATIVE */
|
#endif /* WOLFSSL_SP_INT_NEGATIVE */
|
||||||
@@ -8153,7 +8149,7 @@ int sp_lshd(sp_int* a, int s)
|
|||||||
/* Back fill with zeros. */
|
/* Back fill with zeros. */
|
||||||
XMEMSET(a->dp, 0, (size_t)s * SP_WORD_SIZEOF);
|
XMEMSET(a->dp, 0, (size_t)s * SP_WORD_SIZEOF);
|
||||||
/* Update used. */
|
/* Update used. */
|
||||||
a->used += (unsigned int)s;
|
a->used += (sp_size_t)s;
|
||||||
/* Remove leading zeros. */
|
/* Remove leading zeros. */
|
||||||
sp_clamp(a);
|
sp_clamp(a);
|
||||||
}
|
}
|
||||||
@@ -8182,7 +8178,7 @@ static int sp_lshb(sp_int* a, int n)
|
|||||||
|
|
||||||
if (a->used != 0) {
|
if (a->used != 0) {
|
||||||
/* Calculate number of digits to shift. */
|
/* Calculate number of digits to shift. */
|
||||||
unsigned int s = (unsigned int)n >> SP_WORD_SHIFT;
|
sp_size_t s = (sp_size_t)n >> SP_WORD_SHIFT;
|
||||||
|
|
||||||
/* Ensure number has enough digits for result. */
|
/* Ensure number has enough digits for result. */
|
||||||
if (a->used + s >= a->size) {
|
if (a->used + s >= a->size) {
|
||||||
@@ -8240,14 +8236,14 @@ void sp_rshd(sp_int* a, int c)
|
|||||||
/* Do shift if we have an SP int. */
|
/* Do shift if we have an SP int. */
|
||||||
if ((a != NULL) && (c > 0)) {
|
if ((a != NULL) && (c > 0)) {
|
||||||
/* Make zero if shift removes all digits. */
|
/* Make zero if shift removes all digits. */
|
||||||
if ((unsigned int)c >= a->used) {
|
if ((sp_size_t)c >= a->used) {
|
||||||
_sp_zero(a);
|
_sp_zero(a);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
|
|
||||||
/* Update used digits count. */
|
/* Update used digits count. */
|
||||||
a->used -= (unsigned int)c;
|
a->used -= (sp_size_t)c;
|
||||||
/* Move digits down. */
|
/* Move digits down. */
|
||||||
for (i = 0; i < a->used; i++, c++) {
|
for (i = 0; i < a->used; i++, c++) {
|
||||||
a->dp[i] = a->dp[c];
|
a->dp[i] = a->dp[c];
|
||||||
@@ -8270,7 +8266,7 @@ int sp_rshb(const sp_int* a, int n, sp_int* r)
|
|||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
/* Number of digits to shift down. */
|
/* Number of digits to shift down. */
|
||||||
unsigned int i = (unsigned int)(n >> SP_WORD_SHIFT);
|
sp_size_t i = (sp_size_t)(n >> SP_WORD_SHIFT);
|
||||||
|
|
||||||
if ((a == NULL) || (n < 0)) {
|
if ((a == NULL) || (n < 0)) {
|
||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
@@ -8284,7 +8280,7 @@ int sp_rshb(const sp_int* a, int n, sp_int* r)
|
|||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
}
|
}
|
||||||
else if (err == MP_OKAY) {
|
else if (err == MP_OKAY) {
|
||||||
unsigned int j;
|
sp_size_t j;
|
||||||
|
|
||||||
/* Number of bits to shift in digits. */
|
/* Number of bits to shift in digits. */
|
||||||
n &= SP_WORD_SIZE - 1;
|
n &= SP_WORD_SIZE - 1;
|
||||||
@@ -8307,7 +8303,7 @@ int sp_rshb(const sp_int* a, int n, sp_int* r)
|
|||||||
/* Most significant digit has no higher digit to pull from. */
|
/* Most significant digit has no higher digit to pull from. */
|
||||||
r->dp[j] = a->dp[i] >> n;
|
r->dp[j] = a->dp[i] >> n;
|
||||||
/* Set the count of used digits. */
|
/* Set the count of used digits. */
|
||||||
r->used = j + (r->dp[j] > 0);
|
r->used = (sp_size_t)(j + (r->dp[j] > 0));
|
||||||
}
|
}
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
if (sp_iszero(r)) {
|
if (sp_iszero(r)) {
|
||||||
@@ -8331,7 +8327,7 @@ int sp_rshb(const sp_int* a, int n, sp_int* r)
|
|||||||
!defined(WOLFSSL_RSA_PUBLIC_ONLY))
|
!defined(WOLFSSL_RSA_PUBLIC_ONLY))
|
||||||
static void _sp_div_same_size(sp_int* a, const sp_int* d, sp_int* r)
|
static void _sp_div_same_size(sp_int* a, const sp_int* d, sp_int* r)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
|
|
||||||
/* Compare top digits of dividend with those of divisor up to last. */
|
/* Compare top digits of dividend with those of divisor up to last. */
|
||||||
for (i = d->used - 1; i > 0; i--) {
|
for (i = d->used - 1; i > 0; i--) {
|
||||||
@@ -8369,12 +8365,12 @@ static void _sp_div_same_size(sp_int* a, const sp_int* d, sp_int* r)
|
|||||||
static int _sp_div_impl(sp_int* a, const sp_int* d, sp_int* r, sp_int* trial)
|
static int _sp_div_impl(sp_int* a, const sp_int* d, sp_int* r, sp_int* trial)
|
||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
#ifdef WOLFSSL_SP_SMALL
|
#ifdef WOLFSSL_SP_SMALL
|
||||||
int c;
|
int c;
|
||||||
#else
|
#else
|
||||||
unsigned int j;
|
sp_size_t j;
|
||||||
unsigned int o;
|
sp_size_t o;
|
||||||
#ifndef SQR_MUL_ASM
|
#ifndef SQR_MUL_ASM
|
||||||
sp_int_sword sw;
|
sp_int_sword sw;
|
||||||
#else
|
#else
|
||||||
@@ -8387,7 +8383,7 @@ static int _sp_div_impl(sp_int* a, const sp_int* d, sp_int* r, sp_int* trial)
|
|||||||
sp_int_digit dt;
|
sp_int_digit dt;
|
||||||
|
|
||||||
/* Set result size to clear. */
|
/* Set result size to clear. */
|
||||||
r->used = a->used - d->used + 1;
|
r->used = (sp_size_t)(a->used - d->used + 1);
|
||||||
/* Set all potentially used digits to zero. */
|
/* Set all potentially used digits to zero. */
|
||||||
for (i = 0; i < r->used; i++) {
|
for (i = 0; i < r->used; i++) {
|
||||||
r->dp[i] = 0;
|
r->dp[i] = 0;
|
||||||
@@ -8560,8 +8556,8 @@ static int _sp_div(const sp_int* a, const sp_int* d, sp_int* r, sp_int* rem,
|
|||||||
sp_int* tr = NULL;
|
sp_int* tr = NULL;
|
||||||
sp_int* trial = NULL;
|
sp_int* trial = NULL;
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
unsigned int signA = MP_ZPOS;
|
sp_uint8 signA = MP_ZPOS;
|
||||||
unsigned int signD = MP_ZPOS;
|
sp_uint8 signD = MP_ZPOS;
|
||||||
#endif /* WOLFSSL_SP_INT_NEGATIVE */
|
#endif /* WOLFSSL_SP_INT_NEGATIVE */
|
||||||
/* Intermediates will always be less than or equal to dividend. */
|
/* Intermediates will always be less than or equal to dividend. */
|
||||||
DECL_SP_INT_ARRAY(td, used, 4);
|
DECL_SP_INT_ARRAY(td, used, 4);
|
||||||
@@ -8655,7 +8651,7 @@ static int _sp_div(const sp_int* a, const sp_int* d, sp_int* r, sp_int* rem,
|
|||||||
tr = td[3];
|
tr = td[3];
|
||||||
|
|
||||||
_sp_init_size(sa, used);
|
_sp_init_size(sa, used);
|
||||||
_sp_init_size(tr, a->used - d->used + 2);
|
_sp_init_size(tr, (unsigned int)(a->used - d->used + 2));
|
||||||
#endif
|
#endif
|
||||||
sd = td[0];
|
sd = td[0];
|
||||||
trial = td[1];
|
trial = td[1];
|
||||||
@@ -8936,7 +8932,7 @@ static int _sp_mul_nxn(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
t[0] = h;
|
t[0] = h;
|
||||||
h = 0;
|
h = 0;
|
||||||
o = 0;
|
o = 0;
|
||||||
for (k = 1; k <= a->used - 1; k++) {
|
for (k = 1; k <= (unsigned int)a->used - 1; k++) {
|
||||||
j = (int)k;
|
j = (int)k;
|
||||||
dp = a->dp;
|
dp = a->dp;
|
||||||
for (; j >= 0; dp++, j--) {
|
for (; j >= 0; dp++, j--) {
|
||||||
@@ -8947,8 +8943,8 @@ static int _sp_mul_nxn(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
h = o;
|
h = o;
|
||||||
o = 0;
|
o = 0;
|
||||||
}
|
}
|
||||||
for (; k <= (a->used - 1) * 2; k++) {
|
for (; k <= ((unsigned int)a->used - 1) * 2; k++) {
|
||||||
i = k - (b->used - 1);
|
i = k - (sp_size_t)(b->used - 1);
|
||||||
dp = &b->dp[b->used - 1];
|
dp = &b->dp[b->used - 1];
|
||||||
for (; i < a->used; i++, dp--) {
|
for (; i < a->used; i++, dp--) {
|
||||||
SP_ASM_MUL_ADD(l, h, o, a->dp[i], dp[0]);
|
SP_ASM_MUL_ADD(l, h, o, a->dp[i], dp[0]);
|
||||||
@@ -8960,7 +8956,7 @@ static int _sp_mul_nxn(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
}
|
}
|
||||||
r->dp[k] = l;
|
r->dp[k] = l;
|
||||||
XMEMCPY(r->dp, t, a->used * sizeof(sp_int_digit));
|
XMEMCPY(r->dp, t, a->used * sizeof(sp_int_digit));
|
||||||
r->used = k + 1;
|
r->used = (sp_size_t)(k + 1);
|
||||||
sp_clamp(r);
|
sp_clamp(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8982,9 +8978,9 @@ static int _sp_mul_nxn(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
int j;
|
int j;
|
||||||
unsigned int k;
|
sp_size_t k;
|
||||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
||||||
sp_int_digit* t = NULL;
|
sp_int_digit* t = NULL;
|
||||||
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
||||||
@@ -9012,7 +9008,7 @@ static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
t[0] = h;
|
t[0] = h;
|
||||||
h = 0;
|
h = 0;
|
||||||
o = 0;
|
o = 0;
|
||||||
for (k = 1; k <= b->used - 1; k++) {
|
for (k = 1; k <= (sp_size_t)(b->used - 1); k++) {
|
||||||
i = 0;
|
i = 0;
|
||||||
j = (int)k;
|
j = (int)k;
|
||||||
for (; (i < a->used) && (j >= 0); i++, j--) {
|
for (; (i < a->used) && (j >= 0); i++, j--) {
|
||||||
@@ -9023,9 +9019,9 @@ static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
h = o;
|
h = o;
|
||||||
o = 0;
|
o = 0;
|
||||||
}
|
}
|
||||||
for (; k <= (a->used - 1) + (b->used - 1); k++) {
|
for (; k <= (sp_size_t)((a->used - 1) + (b->used - 1)); k++) {
|
||||||
j = (int)(b->used - 1);
|
j = (int)(b->used - 1);
|
||||||
i = k - (unsigned int)j;
|
i = k - (sp_size_t)j;
|
||||||
for (; (i < a->used) && (j >= 0); i++, j--) {
|
for (; (i < a->used) && (j >= 0); i++, j--) {
|
||||||
SP_ASM_MUL_ADD(l, h, o, a->dp[i], b->dp[j]);
|
SP_ASM_MUL_ADD(l, h, o, a->dp[i], b->dp[j]);
|
||||||
}
|
}
|
||||||
@@ -9035,7 +9031,7 @@ static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
o = 0;
|
o = 0;
|
||||||
}
|
}
|
||||||
t[k] = l;
|
t[k] = l;
|
||||||
r->used = k + 1;
|
r->used = (sp_size_t)(k + 1);
|
||||||
XMEMCPY(r->dp, t, r->used * sizeof(sp_int_digit));
|
XMEMCPY(r->dp, t, r->used * sizeof(sp_int_digit));
|
||||||
sp_clamp(r);
|
sp_clamp(r);
|
||||||
}
|
}
|
||||||
@@ -9058,9 +9054,9 @@ static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
int j;
|
int j;
|
||||||
unsigned int k;
|
sp_size_t k;
|
||||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
||||||
sp_int_digit* t = NULL;
|
sp_int_digit* t = NULL;
|
||||||
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
||||||
@@ -9093,8 +9089,8 @@ static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
o = 0;
|
o = 0;
|
||||||
#endif
|
#endif
|
||||||
for (k = 1; k <= (a->used - 1) + (b->used - 1); k++) {
|
for (k = 1; k <= (a->used - 1) + (b->used - 1); k++) {
|
||||||
i = k - (b->used - 1);
|
i = k - (sp_size_t)(b->used - 1);
|
||||||
i &= (((unsigned int)i >> (sizeof(i) * 8 - 1)) - 1U);
|
i &= (sp_size_t)(((unsigned int)i >> (sizeof(i) * 8 - 1)) - 1U);
|
||||||
j = (int)(k - i);
|
j = (int)(k - i);
|
||||||
for (; (i < a->used) && (j >= 0); i++, j--) {
|
for (; (i < a->used) && (j >= 0); i++, j--) {
|
||||||
w = (sp_int_word)a->dp[i] * b->dp[j];
|
w = (sp_int_word)a->dp[i] * b->dp[j];
|
||||||
@@ -9117,7 +9113,7 @@ static int _sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
t[k] = (sp_int_digit)l;
|
t[k] = (sp_int_digit)l;
|
||||||
r->used = k + 1;
|
r->used = (sp_size_t)(k + 1);
|
||||||
XMEMCPY(r->dp, t, r->used * sizeof(sp_int_digit));
|
XMEMCPY(r->dp, t, r->used * sizeof(sp_int_digit));
|
||||||
sp_clamp(r);
|
sp_clamp(r);
|
||||||
}
|
}
|
||||||
@@ -11738,7 +11734,7 @@ int sp_mul(const sp_int* a, const sp_int* b, sp_int* r)
|
|||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
unsigned int sign = MP_ZPOS;
|
sp_uint8 sign = MP_ZPOS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((a == NULL) || (b == NULL) || (r == NULL)) {
|
if ((a == NULL) || (b == NULL) || (r == NULL)) {
|
||||||
@@ -12131,7 +12127,7 @@ static int _sp_invmod_div(const sp_int* a, const sp_int* m, sp_int* x,
|
|||||||
|
|
||||||
ALLOC_SP_INT(d, m->used + 1, err, NULL);
|
ALLOC_SP_INT(d, m->used + 1, err, NULL);
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
mp_init(d);
|
sp_init_size(d, m->used + 1);
|
||||||
|
|
||||||
/* 1. x = m, y = a, b = 1, c = 0 */
|
/* 1. x = m, y = a, b = 1, c = 0 */
|
||||||
if (a != y) {
|
if (a != y) {
|
||||||
@@ -12293,7 +12289,7 @@ static int _sp_invmod(const sp_int* a, const sp_int* m, sp_int* r)
|
|||||||
err = sp_init_size(b, m->used + 1);
|
err = sp_init_size(b, m->used + 1);
|
||||||
}
|
}
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
err = sp_init_size(c, 2 * m->used + 1);
|
err = sp_init_size(c, (sp_size_t)(2 * m->used + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
@@ -12497,12 +12493,12 @@ static int _sp_invmod_mont_ct(const sp_int* a, const sp_int* m, sp_int* r,
|
|||||||
t = pre[CT_INV_MOD_PRE_CNT + 0];
|
t = pre[CT_INV_MOD_PRE_CNT + 0];
|
||||||
e = pre[CT_INV_MOD_PRE_CNT + 1];
|
e = pre[CT_INV_MOD_PRE_CNT + 1];
|
||||||
/* Space for sqr and mul result. */
|
/* Space for sqr and mul result. */
|
||||||
_sp_init_size(t, m->used * 2 + 1);
|
_sp_init_size(t, (sp_size_t)(m->used * 2 + 1));
|
||||||
/* e = mod - 2 */
|
/* e = mod - 2 */
|
||||||
_sp_init_size(e, m->used + 1);
|
_sp_init_size(e, (sp_size_t)(m->used + 1));
|
||||||
|
|
||||||
/* Create pre-computation results: ((2^(1..8))-1).a. */
|
/* Create pre-computation results: ((2^(1..8))-1).a. */
|
||||||
_sp_init_size(pre[0], m->used * 2 + 1);
|
_sp_init_size(pre[0], (sp_size_t)(m->used * 2 + 1));
|
||||||
/* 1. pre[0] = 2^0 * a mod m
|
/* 1. pre[0] = 2^0 * a mod m
|
||||||
* Start with 1.a = a.
|
* Start with 1.a = a.
|
||||||
*/
|
*/
|
||||||
@@ -12513,7 +12509,7 @@ static int _sp_invmod_mont_ct(const sp_int* a, const sp_int* m, sp_int* r,
|
|||||||
for (i = 1; (err == MP_OKAY) && (i < CT_INV_MOD_PRE_CNT); i++) {
|
for (i = 1; (err == MP_OKAY) && (i < CT_INV_MOD_PRE_CNT); i++) {
|
||||||
/* 2.1 pre[i-1] = ((pre[i-1] ^ 2) * a) mod m */
|
/* 2.1 pre[i-1] = ((pre[i-1] ^ 2) * a) mod m */
|
||||||
/* Previous value ..1 -> ..10 */
|
/* Previous value ..1 -> ..10 */
|
||||||
_sp_init_size(pre[i], m->used * 2 + 1);
|
_sp_init_size(pre[i], (sp_size_t)(m->used * 2 + 1));
|
||||||
err = sp_sqr(pre[i-1], pre[i]);
|
err = sp_sqr(pre[i-1], pre[i]);
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
err = _sp_mont_red(pre[i], m, mp, 0);
|
err = _sp_mont_red(pre[i], m, mp, 0);
|
||||||
@@ -12739,10 +12735,10 @@ static int _sp_exptmod_ex(const sp_int* b, const sp_int* e, int bits,
|
|||||||
#endif
|
#endif
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
/* Initialize temporaries. */
|
/* Initialize temporaries. */
|
||||||
_sp_init_size(t[0], 2 * m->used + 1);
|
_sp_init_size(t[0], (sp_size_t)(m->used * 2 + 1));
|
||||||
_sp_init_size(t[1], 2 * m->used + 1);
|
_sp_init_size(t[1], (sp_size_t)(m->used * 2 + 1));
|
||||||
#ifndef WC_NO_CACHE_RESISTANT
|
#ifndef WC_NO_CACHE_RESISTANT
|
||||||
_sp_init_size(t[2], 2 * m->used + 1);
|
_sp_init_size(t[2], (sp_size_t)(m->used * 2 + 1));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* 2. t[0] = b mod m
|
/* 2. t[0] = b mod m
|
||||||
@@ -12970,10 +12966,10 @@ static int _sp_exptmod_mont_ex(const sp_int* b, const sp_int* e, int bits,
|
|||||||
ALLOC_SP_INT_ARRAY(t, m->used * 2 + 1, 4, err, NULL);
|
ALLOC_SP_INT_ARRAY(t, m->used * 2 + 1, 4, err, NULL);
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
/* Initialize temporaries. */
|
/* Initialize temporaries. */
|
||||||
_sp_init_size(t[0], m->used * 2 + 1);
|
_sp_init_size(t[0], (sp_size_t)(m->used * 2 + 1));
|
||||||
_sp_init_size(t[1], m->used * 2 + 1);
|
_sp_init_size(t[1], (sp_size_t)(m->used * 2 + 1));
|
||||||
_sp_init_size(t[2], m->used * 2 + 1);
|
_sp_init_size(t[2], (sp_size_t)(m->used * 2 + 1));
|
||||||
_sp_init_size(t[3], m->used * 2 + 1);
|
_sp_init_size(t[3], (sp_size_t)(m->used * 2 + 1));
|
||||||
|
|
||||||
/* 1. Ensure base is less than modulus. */
|
/* 1. Ensure base is less than modulus. */
|
||||||
if (_sp_cmp_abs(b, m) != MP_LT) {
|
if (_sp_cmp_abs(b, m) != MP_LT) {
|
||||||
@@ -13512,9 +13508,9 @@ static int _sp_exptmod_base_2(const sp_int* e, int digits, const sp_int* m,
|
|||||||
a = d[0];
|
a = d[0];
|
||||||
tr = d[1];
|
tr = d[1];
|
||||||
|
|
||||||
_sp_init_size(a, m->used * 2 + 1);
|
_sp_init_size(a, (sp_size_t)(m->used * 2 + 1));
|
||||||
#endif
|
#endif
|
||||||
_sp_init_size(tr, m->used * 2 + 1);
|
_sp_init_size(tr, (sp_size_t)(m->used * 2 + 1));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13974,10 +13970,10 @@ static int _sp_exptmod_nct(const sp_int* b, const sp_int* e, const sp_int* m,
|
|||||||
|
|
||||||
/* Initialize all allocated */
|
/* Initialize all allocated */
|
||||||
for (i = 0; i < preCnt; i++) {
|
for (i = 0; i < preCnt; i++) {
|
||||||
_sp_init_size(t[i], m->used * 2 + 1);
|
_sp_init_size(t[i], (sp_size_t)(m->used * 2 + 1));
|
||||||
}
|
}
|
||||||
_sp_init_size(tr, m->used * 2 + 1);
|
_sp_init_size(tr, (sp_size_t)(m->used * 2 + 1));
|
||||||
_sp_init_size(bm, m->used * 2 + 1);
|
_sp_init_size(bm, (sp_size_t)(m->used * 2 + 1));
|
||||||
|
|
||||||
/* 1. Ensure base is less than modulus. */
|
/* 1. Ensure base is less than modulus. */
|
||||||
if (_sp_cmp_abs(b, m) != MP_LT) {
|
if (_sp_cmp_abs(b, m) != MP_LT) {
|
||||||
@@ -14432,8 +14428,8 @@ int sp_div_2d(const sp_int* a, int e, sp_int* r, sp_int* rem)
|
|||||||
}
|
}
|
||||||
if ((err == MP_OKAY) && (rem != NULL)) {
|
if ((err == MP_OKAY) && (rem != NULL)) {
|
||||||
/* Set used and mask off top digit of remainder. */
|
/* Set used and mask off top digit of remainder. */
|
||||||
rem->used = ((unsigned int)e + SP_WORD_SIZE - 1) >>
|
rem->used = (sp_size_t)((e + SP_WORD_SIZE - 1) >>
|
||||||
SP_WORD_SHIFT;
|
SP_WORD_SHIFT);
|
||||||
e &= SP_WORD_MASK;
|
e &= SP_WORD_MASK;
|
||||||
if (e > 0) {
|
if (e > 0) {
|
||||||
rem->dp[rem->used - 1] &= ((sp_int_digit)1 << e) - 1;
|
rem->dp[rem->used - 1] &= ((sp_int_digit)1 << e) - 1;
|
||||||
@@ -14467,7 +14463,7 @@ int sp_div_2d(const sp_int* a, int e, sp_int* r, sp_int* rem)
|
|||||||
int sp_mod_2d(const sp_int* a, int e, sp_int* r)
|
int sp_mod_2d(const sp_int* a, int e, sp_int* r)
|
||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
unsigned int digits = ((unsigned int)e + SP_WORD_SIZE - 1) >> SP_WORD_SHIFT;
|
sp_size_t digits = (sp_size_t)((e + SP_WORD_SIZE - 1) >> SP_WORD_SHIFT);
|
||||||
|
|
||||||
if ((a == NULL) || (r == NULL) || (e < 0)) {
|
if ((a == NULL) || (r == NULL) || (e < 0)) {
|
||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
@@ -14548,7 +14544,8 @@ int sp_mul_2d(const sp_int* a, int e, sp_int* r)
|
|||||||
|
|
||||||
/* Ensure result has enough allocated digits for result. */
|
/* Ensure result has enough allocated digits for result. */
|
||||||
if ((err == MP_OKAY) &&
|
if ((err == MP_OKAY) &&
|
||||||
((unsigned int)(sp_count_bits(a) + e) > r->size * SP_WORD_SIZE)) {
|
((unsigned int)(sp_count_bits(a) + e) >
|
||||||
|
(unsigned int)r->size * SP_WORD_SIZE)) {
|
||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14598,9 +14595,9 @@ int sp_mul_2d(const sp_int* a, int e, sp_int* r)
|
|||||||
static int _sp_sqr(const sp_int* a, sp_int* r)
|
static int _sp_sqr(const sp_int* a, sp_int* r)
|
||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
int j;
|
int j;
|
||||||
unsigned int k;
|
sp_size_t k;
|
||||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
||||||
sp_int_digit* t = NULL;
|
sp_int_digit* t = NULL;
|
||||||
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
||||||
@@ -14640,7 +14637,7 @@ static int _sp_sqr(const sp_int* a, sp_int* r)
|
|||||||
t[0] = h;
|
t[0] = h;
|
||||||
h = 0;
|
h = 0;
|
||||||
o = 0;
|
o = 0;
|
||||||
for (k = 1; k < (a->used + 1) / 2; k++) {
|
for (k = 1; k < (sp_size_t)((a->used + 1) / 2); k++) {
|
||||||
i = k;
|
i = k;
|
||||||
j = (int)(k - 1);
|
j = (int)(k - 1);
|
||||||
for (; (j >= 0); i++, j--) {
|
for (; (j >= 0); i++, j--) {
|
||||||
@@ -14652,7 +14649,7 @@ static int _sp_sqr(const sp_int* a, sp_int* r)
|
|||||||
o = 0;
|
o = 0;
|
||||||
|
|
||||||
SP_ASM_SQR_ADD(l, h, o, a->dp[k]);
|
SP_ASM_SQR_ADD(l, h, o, a->dp[k]);
|
||||||
i = k + 1;
|
i = (sp_size_t)(k + 1);
|
||||||
j = (int)(k - 1);
|
j = (int)(k - 1);
|
||||||
for (; (j >= 0); i++, j--) {
|
for (; (j >= 0); i++, j--) {
|
||||||
SP_ASM_MUL_ADD2(l, h, o, a->dp[i], a->dp[j]);
|
SP_ASM_MUL_ADD2(l, h, o, a->dp[i], a->dp[j]);
|
||||||
@@ -14674,7 +14671,7 @@ static int _sp_sqr(const sp_int* a, sp_int* r)
|
|||||||
o = 0;
|
o = 0;
|
||||||
|
|
||||||
SP_ASM_SQR_ADD(l, h, o, a->dp[k]);
|
SP_ASM_SQR_ADD(l, h, o, a->dp[k]);
|
||||||
i = k + 1;
|
i = (sp_size_t)(k + 1);
|
||||||
j = (int)(k - 1);
|
j = (int)(k - 1);
|
||||||
for (; (i < a->used); i++, j--) {
|
for (; (i < a->used); i++, j--) {
|
||||||
SP_ASM_MUL_ADD2(l, h, o, a->dp[i], a->dp[j]);
|
SP_ASM_MUL_ADD2(l, h, o, a->dp[i], a->dp[j]);
|
||||||
@@ -14687,7 +14684,8 @@ static int _sp_sqr(const sp_int* a, sp_int* r)
|
|||||||
p = r->dp;
|
p = r->dp;
|
||||||
}
|
}
|
||||||
r->dp[k * 2 - 1] = l;
|
r->dp[k * 2 - 1] = l;
|
||||||
XMEMCPY(r->dp, t, (((a->used + 1) / 2) * 2 + 1) * sizeof(sp_int_digit));
|
XMEMCPY(r->dp, t, (size_t)(((a->used + 1) / 2) * 2 + 1) *
|
||||||
|
sizeof(sp_int_digit));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
@@ -14712,9 +14710,9 @@ static int _sp_sqr(const sp_int* a, sp_int* r)
|
|||||||
static int _sp_sqr(const sp_int* a, sp_int* r)
|
static int _sp_sqr(const sp_int* a, sp_int* r)
|
||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
unsigned int i;
|
sp_size_t i;
|
||||||
int j;
|
int j;
|
||||||
unsigned int k;
|
sp_size_t k;
|
||||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
|
||||||
sp_int_digit* t = NULL;
|
sp_int_digit* t = NULL;
|
||||||
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
|
||||||
@@ -14752,7 +14750,7 @@ static int _sp_sqr(const sp_int* a, sp_int* r)
|
|||||||
#ifdef SP_WORD_OVERFLOW
|
#ifdef SP_WORD_OVERFLOW
|
||||||
o = 0;
|
o = 0;
|
||||||
#endif
|
#endif
|
||||||
for (k = 1; k <= (a->used - 1) * 2; k++) {
|
for (k = 1; k <= (sp_size_t)((a->used - 1) * 2); k++) {
|
||||||
i = k / 2;
|
i = k / 2;
|
||||||
j = (int)(k - i);
|
j = (int)(k - i);
|
||||||
if (i == (unsigned int)j) {
|
if (i == (unsigned int)j) {
|
||||||
@@ -14795,7 +14793,7 @@ static int _sp_sqr(const sp_int* a, sp_int* r)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
t[k] = (sp_int_digit)l;
|
t[k] = (sp_int_digit)l;
|
||||||
r->used = k + 1;
|
r->used = (sp_size_t)(k + 1);
|
||||||
XMEMCPY(r->dp, t, r->used * sizeof(sp_int_digit));
|
XMEMCPY(r->dp, t, r->used * sizeof(sp_int_digit));
|
||||||
sp_clamp(r);
|
sp_clamp(r);
|
||||||
}
|
}
|
||||||
@@ -17148,7 +17146,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
/* Adding numbers into m->used * 2 digits - zero out unused digits. */
|
/* Adding numbers into m->used * 2 digits - zero out unused digits. */
|
||||||
#ifndef WOLFSSL_NO_CT_OPS
|
#ifndef WOLFSSL_NO_CT_OPS
|
||||||
if (ct) {
|
if (ct) {
|
||||||
for (i = 0; i < m->used * 2; i++) {
|
for (i = 0; i < (unsigned int)m->used * 2; i++) {
|
||||||
a->dp[i] &=
|
a->dp[i] &=
|
||||||
(sp_int_digit)
|
(sp_int_digit)
|
||||||
(sp_int_sdigit)ctMaskIntGTE((int)(a->used-1), (int)i);
|
(sp_int_sdigit)ctMaskIntGTE((int)(a->used-1), (int)i);
|
||||||
@@ -17157,7 +17155,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
else
|
else
|
||||||
#endif /* !WOLFSSL_NO_CT_OPS */
|
#endif /* !WOLFSSL_NO_CT_OPS */
|
||||||
{
|
{
|
||||||
for (i = a->used; i < m->used * 2; i++) {
|
for (i = a->used; i < (unsigned int)m->used * 2; i++) {
|
||||||
a->dp[i] = 0;
|
a->dp[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17195,7 +17193,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
/* 2.1. mu = (mp * DigitMask(a, i)) & WORD_MASK */
|
/* 2.1. mu = (mp * DigitMask(a, i)) & WORD_MASK */
|
||||||
mu = mp * a->dp[i];
|
mu = mp * a->dp[i];
|
||||||
/* 2.2. If i == NumDigits(m)-1 and mask != 0 then mu & = mask */
|
/* 2.2. If i == NumDigits(m)-1 and mask != 0 then mu & = mask */
|
||||||
if ((i == m->used - 1) && (mask != 0)) {
|
if ((i == (unsigned int)m->used - 1) && (mask != 0)) {
|
||||||
mu &= mask;
|
mu &= mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17205,7 +17203,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
a->dp[i] = (sp_int_digit)w;
|
a->dp[i] = (sp_int_digit)w;
|
||||||
w >>= SP_WORD_SIZE;
|
w >>= SP_WORD_SIZE;
|
||||||
/* 2.4. For j = 1 up to NumDigits(m)-2 */
|
/* 2.4. For j = 1 up to NumDigits(m)-2 */
|
||||||
for (j = 1; j < m->used - 1; j++) {
|
for (j = 1; j < (unsigned int)m->used - 1; j++) {
|
||||||
/* 2.4.1 a += mu * DigitMask(m, j) */
|
/* 2.4.1 a += mu * DigitMask(m, j) */
|
||||||
w += a->dp[i + j];
|
w += a->dp[i + j];
|
||||||
w += (sp_int_word)mu * m->dp[j];
|
w += (sp_int_word)mu * m->dp[j];
|
||||||
@@ -17227,7 +17225,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
a->dp[m->used * 2 - 1] = (sp_int_digit)o;
|
a->dp[m->used * 2 - 1] = (sp_int_digit)o;
|
||||||
o >>= SP_WORD_SIZE;
|
o >>= SP_WORD_SIZE;
|
||||||
a->dp[m->used * 2] = (sp_int_digit)o;
|
a->dp[m->used * 2] = (sp_int_digit)o;
|
||||||
a->used = m->used * 2 + 1;
|
a->used = (sp_size_t)(m->used * 2 + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ct) {
|
if (!ct) {
|
||||||
@@ -17276,7 +17274,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
|
|
||||||
#ifndef WOLFSSL_NO_CT_OPS
|
#ifndef WOLFSSL_NO_CT_OPS
|
||||||
if (ct) {
|
if (ct) {
|
||||||
for (i = 0; i < m->used * 2; i++) {
|
for (i = 0; i < (unsigned int)m->used * 2; i++) {
|
||||||
a->dp[i] &=
|
a->dp[i] &=
|
||||||
(sp_int_digit)
|
(sp_int_digit)
|
||||||
(sp_int_sdigit)ctMaskIntGTE((int)(a->used-1), (int)i);
|
(sp_int_sdigit)ctMaskIntGTE((int)(a->used-1), (int)i);
|
||||||
@@ -17285,7 +17283,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
for (i = a->used; i < m->used * 2; i++) {
|
for (i = a->used; i < (unsigned int)m->used * 2; i++) {
|
||||||
a->dp[i] = 0;
|
a->dp[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17306,7 +17304,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
SP_ASM_ADDC(l, h, a->dp[1]);
|
SP_ASM_ADDC(l, h, a->dp[1]);
|
||||||
a->dp[1] = l;
|
a->dp[1] = l;
|
||||||
a->dp[2] = h;
|
a->dp[2] = h;
|
||||||
a->used = m->used * 2 + 1;
|
a->used = (sp_size_t)(m->used * 2 + 1);
|
||||||
/* mp is SP_WORD_SIZE */
|
/* mp is SP_WORD_SIZE */
|
||||||
bits = SP_WORD_SIZE;
|
bits = SP_WORD_SIZE;
|
||||||
}
|
}
|
||||||
@@ -17456,7 +17454,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
h = 0;
|
h = 0;
|
||||||
SP_ASM_MUL_ADD_NO(l, h, mu, *(md++));
|
SP_ASM_MUL_ADD_NO(l, h, mu, *(md++));
|
||||||
l = h;
|
l = h;
|
||||||
for (j = 1; j + 1 < m->used - 1; j += 2) {
|
for (j = 1; j + 1 < (unsigned int)m->used - 1; j += 2) {
|
||||||
h = 0;
|
h = 0;
|
||||||
SP_ASM_ADDC(l, h, ad[j]);
|
SP_ASM_ADDC(l, h, ad[j]);
|
||||||
SP_ASM_MUL_ADD_NO(l, h, mu, *(md++));
|
SP_ASM_MUL_ADD_NO(l, h, mu, *(md++));
|
||||||
@@ -17466,7 +17464,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
SP_ASM_MUL_ADD_NO(h, l, mu, *(md++));
|
SP_ASM_MUL_ADD_NO(h, l, mu, *(md++));
|
||||||
ad[j] = h;
|
ad[j] = h;
|
||||||
}
|
}
|
||||||
for (; j < m->used - 1; j++) {
|
for (; j < (unsigned int)m->used - 1; j++) {
|
||||||
h = 0;
|
h = 0;
|
||||||
SP_ASM_ADDC(l, h, ad[j]);
|
SP_ASM_ADDC(l, h, ad[j]);
|
||||||
SP_ASM_MUL_ADD_NO(l, h, mu, *(md++));
|
SP_ASM_MUL_ADD_NO(l, h, mu, *(md++));
|
||||||
@@ -17517,7 +17515,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
/* 2.1. mu = (mp * DigitMask(a, i)) & WORD_MASK */
|
/* 2.1. mu = (mp * DigitMask(a, i)) & WORD_MASK */
|
||||||
mu = mp * ad[0];
|
mu = mp * ad[0];
|
||||||
/* 2.2. If i == NumDigits(m)-1 and mask != 0 then mu & = mask */
|
/* 2.2. If i == NumDigits(m)-1 and mask != 0 then mu & = mask */
|
||||||
if ((i == m->used - 1) && (mask != 0)) {
|
if ((i == (unsigned int)m->used - 1) && (mask != 0)) {
|
||||||
mu &= mask;
|
mu &= mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17528,7 +17526,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
ad[0] = l;
|
ad[0] = l;
|
||||||
l = h;
|
l = h;
|
||||||
/* 2.4. If i == NumDigits(m)-1 and mask != 0 then mu & = mask */
|
/* 2.4. If i == NumDigits(m)-1 and mask != 0 then mu & = mask */
|
||||||
for (j = 1; j + 1 < m->used - 1; j += 2) {
|
for (j = 1; j + 1 < (unsigned int)m->used - 1; j += 2) {
|
||||||
h = 0;
|
h = 0;
|
||||||
/* 2.4.1. a += mu * DigitMask(m, j) */
|
/* 2.4.1. a += mu * DigitMask(m, j) */
|
||||||
SP_ASM_ADDC(l, h, ad[j + 0]);
|
SP_ASM_ADDC(l, h, ad[j + 0]);
|
||||||
@@ -17540,7 +17538,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
SP_ASM_MUL_ADD_NO(h, l, mu, *(md++));
|
SP_ASM_MUL_ADD_NO(h, l, mu, *(md++));
|
||||||
ad[j + 1] = h;
|
ad[j + 1] = h;
|
||||||
}
|
}
|
||||||
for (; j < m->used - 1; j++) {
|
for (; j < (unsigned int)m->used - 1; j++) {
|
||||||
h = 0;
|
h = 0;
|
||||||
/* 2.4.1. a += mu * DigitMask(m, j) */
|
/* 2.4.1. a += mu * DigitMask(m, j) */
|
||||||
SP_ASM_ADDC(l, h, ad[j]);
|
SP_ASM_ADDC(l, h, ad[j]);
|
||||||
@@ -17563,7 +17561,7 @@ static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct)
|
|||||||
SP_ASM_ADDC(l, h, a->dp[m->used * 2 - 1]);
|
SP_ASM_ADDC(l, h, a->dp[m->used * 2 - 1]);
|
||||||
a->dp[m->used * 2 - 1] = l;
|
a->dp[m->used * 2 - 1] = l;
|
||||||
a->dp[m->used * 2] = h;
|
a->dp[m->used * 2] = h;
|
||||||
a->used = m->used * 2 + 1;
|
a->used = (sp_size_t)(m->used * 2 + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ct) {
|
if (!ct) {
|
||||||
@@ -17715,7 +17713,7 @@ int sp_mont_norm(sp_int* norm, const sp_int* m)
|
|||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
/* Find top bit and ensure norm has enough space. */
|
/* Find top bit and ensure norm has enough space. */
|
||||||
bits = (unsigned int)sp_count_bits(m);
|
bits = (unsigned int)sp_count_bits(m);
|
||||||
if (bits >= norm->size * SP_WORD_SIZE) {
|
if (bits >= (unsigned int)norm->size * SP_WORD_SIZE) {
|
||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17802,7 +17800,7 @@ int sp_read_unsigned_bin(sp_int* a, const byte* in, word32 inSz)
|
|||||||
int i;
|
int i;
|
||||||
int j = 0;
|
int j = 0;
|
||||||
|
|
||||||
a->used = (inSz + SP_WORD_SIZEOF - 1) / SP_WORD_SIZEOF;
|
a->used = (sp_size_t)((inSz + SP_WORD_SIZEOF - 1) / SP_WORD_SIZEOF);
|
||||||
|
|
||||||
#if defined(BIG_ENDIAN_ORDER) && !defined(WOLFSSL_SP_INT_DIGIT_ALIGN)
|
#if defined(BIG_ENDIAN_ORDER) && !defined(WOLFSSL_SP_INT_DIGIT_ALIGN)
|
||||||
/* Data endian matches representation of number.
|
/* Data endian matches representation of number.
|
||||||
@@ -17930,7 +17928,7 @@ int sp_to_unsigned_bin_len(const sp_int* a, byte* out, int outSz)
|
|||||||
d >>= 8;
|
d >>= 8;
|
||||||
/* Stop if the output buffer is filled. */
|
/* Stop if the output buffer is filled. */
|
||||||
if (j < 0) {
|
if (j < 0) {
|
||||||
if ((i < a->used - 1) || (d > 0)) {
|
if ((i < (unsigned int)a->used - 1) || (d > 0)) {
|
||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -18004,7 +18002,7 @@ int sp_to_unsigned_bin_len_ct(const sp_int* a, byte* out, int outSz)
|
|||||||
out[j--] = (byte)(d & mask);
|
out[j--] = (byte)(d & mask);
|
||||||
d >>= 8;
|
d >>= 8;
|
||||||
}
|
}
|
||||||
mask &= (sp_int_digit)0 - (i < a->used - 1);
|
mask &= (sp_int_digit)0 - (i < (unsigned int)a->used - 1);
|
||||||
i += (unsigned int)(1 & mask);
|
i += (unsigned int)(1 & mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18020,7 +18018,7 @@ int sp_to_unsigned_bin_len_ct(const sp_int* a, byte* out, int outSz)
|
|||||||
i = 0;
|
i = 0;
|
||||||
for (j = outSz - 1; j >= 0; j--) {
|
for (j = outSz - 1; j >= 0; j--) {
|
||||||
out[j] = a->dp[i] & mask;
|
out[j] = a->dp[i] & mask;
|
||||||
mask &= (sp_int_digit)0 - (i < a->used - 1);
|
mask &= (sp_int_digit)0 - (i < (unsigned int)a->used - 1);
|
||||||
i += (unsigned int)(1 & mask);
|
i += (unsigned int)(1 & mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18076,7 +18074,7 @@ static int _sp_read_radix_16(sp_int* a, const char* in)
|
|||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
int i;
|
int i;
|
||||||
unsigned int s = 0;
|
unsigned int s = 0;
|
||||||
unsigned int j = 0;
|
sp_size_t j = 0;
|
||||||
sp_int_digit d;
|
sp_int_digit d;
|
||||||
/* Skip whitespace at end of line */
|
/* Skip whitespace at end of line */
|
||||||
int eol_done = 0;
|
int eol_done = 0;
|
||||||
@@ -18206,7 +18204,7 @@ int sp_read_radix(sp_int* a, const char* in, int radix)
|
|||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
unsigned int sign = MP_ZPOS;
|
sp_uint8 sign = MP_ZPOS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((a == NULL) || (in == NULL)) {
|
if ((a == NULL) || (in == NULL)) {
|
||||||
@@ -18683,7 +18681,7 @@ int sp_rand_prime(sp_int* r, int len, WC_RNG* rng, void* heap)
|
|||||||
r->sign = MP_ZPOS;
|
r->sign = MP_ZPOS;
|
||||||
#endif /* WOLFSSL_SP_INT_NEGATIVE */
|
#endif /* WOLFSSL_SP_INT_NEGATIVE */
|
||||||
/* Set number of digits that will be used. */
|
/* Set number of digits that will be used. */
|
||||||
r->used = digits;
|
r->used = (sp_size_t)digits;
|
||||||
#if defined(WOLFSSL_SP_MATH_ALL) || defined(BIG_ENDIAN_ORDER)
|
#if defined(WOLFSSL_SP_MATH_ALL) || defined(BIG_ENDIAN_ORDER)
|
||||||
/* Calculate number of bits in last digit. */
|
/* Calculate number of bits in last digit. */
|
||||||
bits = (len * 8) & SP_WORD_MASK;
|
bits = (len * 8) & SP_WORD_MASK;
|
||||||
@@ -19020,7 +19018,7 @@ static int _sp_prime_trials(const sp_int* a, int trials, int* result)
|
|||||||
|
|
||||||
_sp_init_size(n1, a->used + 1);
|
_sp_init_size(n1, a->used + 1);
|
||||||
_sp_init_size(r, a->used + 1);
|
_sp_init_size(r, a->used + 1);
|
||||||
_sp_init_size(b, a->used * 2 + 1);
|
_sp_init_size(b, (sp_size_t)(a->used * 2 + 1));
|
||||||
|
|
||||||
/* Do requested number of trials of Miller-Rabin test. */
|
/* Do requested number of trials of Miller-Rabin test. */
|
||||||
for (i = 0; i < trials; i++) {
|
for (i = 0; i < trials; i++) {
|
||||||
@@ -19144,8 +19142,8 @@ static int _sp_prime_random_trials(const sp_int* a, int trials, int* result,
|
|||||||
|
|
||||||
_sp_init_size(c , a->used + 1);
|
_sp_init_size(c , a->used + 1);
|
||||||
_sp_init_size(n1, a->used + 1);
|
_sp_init_size(n1, a->used + 1);
|
||||||
_sp_init_size(b , a->used * 2 + 1);
|
_sp_init_size(b , (sp_size_t)(a->used * 2 + 1));
|
||||||
_sp_init_size(r , a->used * 2 + 1);
|
_sp_init_size(r , (sp_size_t)(a->used * 2 + 1));
|
||||||
|
|
||||||
_sp_sub_d(a, 2, c);
|
_sp_sub_d(a, 2, c);
|
||||||
|
|
||||||
|
@@ -149,10 +149,10 @@ int mp_cond_copy(mp_int* a, int copy, mp_int* b)
|
|||||||
for (; i < b->used; i++) {
|
for (; i < b->used; i++) {
|
||||||
b->dp[i] ^= (get_digit(a, (int)i) ^ get_digit(b, (int)i)) & mask;
|
b->dp[i] ^= (get_digit(a, (int)i) ^ get_digit(b, (int)i)) & mask;
|
||||||
}
|
}
|
||||||
b->used ^= (a->used ^ b->used) & (unsigned int)mask;
|
b->used ^= (a->used ^ b->used) & (mp_size_t)mask;
|
||||||
#if (!defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL)) || \
|
#if (!defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL)) || \
|
||||||
defined(WOLFSSL_SP_INT_NEGATIVE)
|
defined(WOLFSSL_SP_INT_NEGATIVE)
|
||||||
b->sign ^= (a->sign ^ b->sign) & (unsigned int)mask;
|
b->sign ^= (a->sign ^ b->sign) & (mp_size_t)mask;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +196,7 @@ int mp_rand(mp_int* a, int digits, WC_RNG* rng)
|
|||||||
ret = BAD_FUNC_ARG;
|
ret = BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
if (ret == MP_OKAY) {
|
if (ret == MP_OKAY) {
|
||||||
a->used = (word32)digits;
|
a->used = (mp_size_t)digits;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* fill the data with random bytes */
|
/* fill the data with random bytes */
|
||||||
|
@@ -222,6 +222,8 @@ typedef int mp_err;
|
|||||||
#define WOLF_BIGINT_DEFINED
|
#define WOLF_BIGINT_DEFINED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define mp_size_t int
|
||||||
|
|
||||||
/* the mp_int structure */
|
/* the mp_int structure */
|
||||||
typedef struct mp_int {
|
typedef struct mp_int {
|
||||||
int used, alloc, sign;
|
int used, alloc, sign;
|
||||||
|
@@ -698,7 +698,7 @@ typedef struct sp_ecc_ctx {
|
|||||||
if ((a)->used > 0) { \
|
if ((a)->used > 0) { \
|
||||||
for (ii = (int)(a)->used - 1; ii >= 0 && (a)->dp[ii] == 0; ii--) { \
|
for (ii = (int)(a)->used - 1; ii >= 0 && (a)->dp[ii] == 0; ii--) { \
|
||||||
} \
|
} \
|
||||||
(a)->used = (unsigned int)(ii + 1); \
|
(a)->used = (mp_size_t)(ii + 1); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
@@ -771,7 +771,7 @@ typedef struct sp_ecc_ctx {
|
|||||||
* Must have at least one digit.
|
* Must have at least one digit.
|
||||||
*/
|
*/
|
||||||
#define MP_INT_SIZEOF(cnt) \
|
#define MP_INT_SIZEOF(cnt) \
|
||||||
(sizeof(sp_int_minimal) + (((cnt) <= 1) ? 0 : ((cnt) - 1)) * \
|
(sizeof(sp_int_minimal) + (((cnt) <= 1) ? 0 : ((size_t)((cnt) - 1))) * \
|
||||||
sizeof(sp_int_digit))
|
sizeof(sp_int_digit))
|
||||||
/* The address of the next sp_int after one with 'cnt' digits. */
|
/* The address of the next sp_int after one with 'cnt' digits. */
|
||||||
#define MP_INT_NEXT(t, cnt) \
|
#define MP_INT_NEXT(t, cnt) \
|
||||||
@@ -780,7 +780,7 @@ typedef struct sp_ecc_ctx {
|
|||||||
|
|
||||||
/* Calculate the number of words required to support a number of bits. */
|
/* Calculate the number of words required to support a number of bits. */
|
||||||
#define MP_BITS_CNT(bits) \
|
#define MP_BITS_CNT(bits) \
|
||||||
((((bits) + SP_WORD_SIZE - 1) / SP_WORD_SIZE) * 2 + 1)
|
((unsigned int)(((((bits) + SP_WORD_SIZE - 1) / SP_WORD_SIZE) * 2 + 1)))
|
||||||
|
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
#ifdef WOLFSSL_SMALL_STACK
|
||||||
/*
|
/*
|
||||||
@@ -865,6 +865,16 @@ while (0)
|
|||||||
#define WOLF_BIGINT_DEFINED
|
#define WOLF_BIGINT_DEFINED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SP_INT_DIGITS < (65536 / SP_WORD_SIZEOF)
|
||||||
|
/* Type for number of digits. */
|
||||||
|
typedef word16 sp_size_t;
|
||||||
|
#else
|
||||||
|
/* Type for number of digits. */
|
||||||
|
typedef unsigned int sp_size_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Type for number of digits. */
|
||||||
|
#define mp_size_t sp_size_t
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SP integer.
|
* SP integer.
|
||||||
@@ -873,12 +883,12 @@ while (0)
|
|||||||
*/
|
*/
|
||||||
typedef struct sp_int {
|
typedef struct sp_int {
|
||||||
/** Number of words that contain data. */
|
/** Number of words that contain data. */
|
||||||
unsigned int used;
|
sp_size_t used;
|
||||||
/** Maximum number of words in data. */
|
/** Maximum number of words in data. */
|
||||||
unsigned int size;
|
sp_size_t size;
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
/** Indicates whether number is 0/positive or negative. */
|
/** Indicates whether number is 0/positive or negative. */
|
||||||
unsigned int sign;
|
sp_uint8 sign;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_WOLF_BIGINT
|
#ifdef HAVE_WOLF_BIGINT
|
||||||
/** Unsigned binary (big endian) representation of number. */
|
/** Unsigned binary (big endian) representation of number. */
|
||||||
@@ -889,12 +899,16 @@ typedef struct sp_int {
|
|||||||
} sp_int;
|
} sp_int;
|
||||||
|
|
||||||
typedef struct sp_int_minimal {
|
typedef struct sp_int_minimal {
|
||||||
unsigned int used;
|
/** Number of words that contain data. */
|
||||||
unsigned int size;
|
sp_size_t used;
|
||||||
|
/** Maximum number of words in data. */
|
||||||
|
sp_size_t size;
|
||||||
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
#ifdef WOLFSSL_SP_INT_NEGATIVE
|
||||||
unsigned int sign;
|
/** Indicates whether number is 0/positive or negative. */
|
||||||
|
sp_uint8 sign;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_WOLF_BIGINT
|
#ifdef HAVE_WOLF_BIGINT
|
||||||
|
/** Unsigned binary (big endian) representation of number. */
|
||||||
struct WC_BIGINT raw;
|
struct WC_BIGINT raw;
|
||||||
#endif
|
#endif
|
||||||
/** First digit of number. */
|
/** First digit of number. */
|
||||||
|
@@ -379,6 +379,8 @@ while (0)
|
|||||||
#define WOLF_BIGINT_DEFINED
|
#define WOLF_BIGINT_DEFINED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define mp_size_t int
|
||||||
|
|
||||||
/* a FP type */
|
/* a FP type */
|
||||||
typedef struct fp_int {
|
typedef struct fp_int {
|
||||||
int used;
|
int used;
|
||||||
|
Reference in New Issue
Block a user