src/ssl.c and wolfssl/openssl/bn.h: refactor _word mp routines to consistently accept/return target-native unsigned long type, for compatibility with sp-math-all. needed because WOLFSSL_BN_ULONG can, surprisingly, be only 16 bits, when sp-math-all in a 32 bit build.

This commit is contained in:
Daniel Pouzzner
2020-11-26 00:25:40 -06:00
parent 7cfe1e2143
commit 53cfa55941
2 changed files with 88 additions and 25 deletions

View File

@ -30353,7 +30353,7 @@ WOLFSSL_RSA* wolfSSL_RSA_generate_key(int len, unsigned long e,
return NULL;
}
if (wolfSSL_BN_set_word(bn, (WOLFSSL_BN_ULONG)e) != WOLFSSL_SUCCESS) {
if (wolfSSL_BN_set_word(bn, e) != WOLFSSL_SUCCESS) {
WOLFSSL_MSG("Error using e value");
wolfSSL_BN_free(bn);
return NULL;
@ -46279,16 +46279,29 @@ int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM* bn)
/* return compliant with OpenSSL
* 1 if BIGNUM is word, 0 else */
int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, unsigned long w)
{
WOLFSSL_ENTER("wolfSSL_BN_is_word");
WOLFSSL_MSG("wolfSSL_BN_is_word");
if (bn == NULL || bn->internal == NULL) {
WOLFSSL_MSG("bn NULL error");
return WOLFSSL_FAILURE;
}
if (mp_isword((mp_int*)bn->internal, w) == MP_YES) {
if (w <= MP_MASK) {
if (mp_isword((mp_int*)bn->internal, (mp_digit)w) == MP_YES) {
return WOLFSSL_SUCCESS;
}
} else {
int ret;
mp_int w_mp;
if (mp_init(&w_mp) != MP_OKAY)
return WOLFSSL_FAILURE;
if (mp_set_int(&w_mp, w) != MP_OKAY)
return WOLFSSL_FAILURE;
ret = mp_cmp((mp_int *)bn->internal, &w_mp);
mp_free(&w_mp);
if (ret == MP_EQ)
return WOLFSSL_SUCCESS;
}
@ -46723,7 +46736,7 @@ WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM* r, const WOLFSSL_BIGNUM* bn)
/* return code compliant with OpenSSL :
* 1 if success, 0 else
*/
int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, unsigned long w)
{
WOLFSSL_MSG("wolfSSL_BN_set_word");
@ -46740,6 +46753,25 @@ int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
return WOLFSSL_SUCCESS;
}
static unsigned long wolfSSL_BN_get_word_1(mp_int *mp) {
#if DIGIT_BIT == (SIZEOF_LONG * 8)
return (unsigned long)mp->dp[0];
#else
unsigned long ret = 0UL;
int digit_i;
if ((unsigned long)DIGIT_BIT == (sizeof(unsigned long) * 8UL))
return (unsigned long)mp->dp[0];
else {
for (digit_i = 0; digit_i < mp->used; ++digit_i) {
ret <<= (unsigned long)DIGIT_BIT;
ret |= (unsigned long)mp->dp[digit_i];
}
}
return ret;
#endif
}
/* Returns the big number as an unsigned long if possible.
*
@ -46749,8 +46781,6 @@ int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
*/
unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
{
mp_int* mp;
WOLFSSL_MSG("wolfSSL_BN_get_word");
if (bn == NULL) {
@ -46762,9 +46792,8 @@ unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
WOLFSSL_MSG("bignum is larger than unsigned long");
return 0xFFFFFFFFL;
}
mp = (mp_int*)bn->internal;
return (unsigned long)(mp->dp[0]);
return wolfSSL_BN_get_word_1((mp_int*)bn->internal);
}
/* return code compliant with OpenSSL :
@ -46868,7 +46897,7 @@ int wolfSSL_BN_rshift(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *bn, int n)
/* return code compliant with OpenSSL :
* 1 if success, 0 else
*/
int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, unsigned long w)
{
WOLFSSL_MSG("wolfSSL_BN_add_word");
@ -46877,10 +46906,25 @@ int wolfSSL_BN_add_word(WOLFSSL_BIGNUM *bn, WOLFSSL_BN_ULONG w)
return WOLFSSL_FAILURE;
}
if (mp_add_d((mp_int*)bn->internal, w, (mp_int*)bn->internal) != MP_OKAY) {
if (w <= MP_MASK) {
if (mp_add_d((mp_int*)bn->internal, (WOLFSSL_BN_ULONG)w, (mp_int*)bn->internal) != MP_OKAY) {
WOLFSSL_MSG("mp_add_d error");
return WOLFSSL_FAILURE;
}
} else {
int ret;
mp_int w_mp;
if (mp_init(&w_mp) != MP_OKAY)
return WOLFSSL_FAILURE;
if (mp_set_int(&w_mp, w) != MP_OKAY)
return WOLFSSL_FAILURE;
ret = mp_add((mp_int *)bn->internal, &w_mp, (mp_int *)bn->internal);
mp_free(&w_mp);
if (ret != MP_OKAY) {
WOLFSSL_MSG("mp_add error");
return WOLFSSL_FAILURE;
}
}
return WOLFSSL_SUCCESS;
}
@ -47002,10 +47046,10 @@ int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM *bn, int nbchecks,
/* return code compliant with OpenSSL :
* (bn mod w) if success, -1 if error
*/
WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
WOLFSSL_BN_ULONG w)
unsigned long wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
unsigned long w)
{
WOLFSSL_BN_ULONG ret = 0;
unsigned long ret = 0;
WOLFSSL_MSG("wolfSSL_BN_mod_word");
@ -47014,9 +47058,28 @@ WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM *bn,
return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
}
if (mp_mod_d((mp_int*)bn->internal, w, &ret) != MP_OKAY) {
if (w <= MP_MASK) {
if (mp_mod_d((mp_int*)bn->internal, (WOLFSSL_BN_ULONG)w, &ret) != MP_OKAY) {
WOLFSSL_MSG("mp_add_d error");
return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
return (unsigned long)WOLFSSL_FATAL_ERROR;
}
} else {
int mp_ret;
mp_int w_mp, r_mp;
if (mp_init(&w_mp) != MP_OKAY)
return (unsigned long)WOLFSSL_FAILURE;
if (mp_init(&r_mp) != MP_OKAY)
return (unsigned long)WOLFSSL_FAILURE;
if (mp_set_int(&w_mp, w) != MP_OKAY)
return (unsigned long)WOLFSSL_FAILURE;
mp_ret = mp_mod((mp_int *)bn->internal, &w_mp, &r_mp);
ret = wolfSSL_BN_get_word_1(&r_mp);
mp_free(&r_mp);
mp_free(&w_mp);
if (mp_ret != MP_OKAY) {
WOLFSSL_MSG("mp_mod error");
return (unsigned long)WOLFSSL_FAILURE;
}
}
return ret;

View File

@ -85,7 +85,7 @@ WOLFSSL_API int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM*);
WOLFSSL_API int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM*);
WOLFSSL_API int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM*);
WOLFSSL_API int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM*);
WOLFSSL_API int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
WOLFSSL_API int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM*, unsigned long);
WOLFSSL_API int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*);
@ -109,10 +109,10 @@ WOLFSSL_API int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM**, const char* str);
WOLFSSL_API char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM*);
WOLFSSL_API int wolfSSL_BN_lshift(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, int);
WOLFSSL_API int wolfSSL_BN_add_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
WOLFSSL_API int wolfSSL_BN_add_word(WOLFSSL_BIGNUM*, unsigned long);
WOLFSSL_API int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM*, int);
WOLFSSL_API int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM*, int);
WOLFSSL_API int wolfSSL_BN_set_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
WOLFSSL_API int wolfSSL_BN_set_word(WOLFSSL_BIGNUM*, unsigned long);
WOLFSSL_API unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM*);
WOLFSSL_API int wolfSSL_BN_add(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
@ -123,8 +123,8 @@ WOLFSSL_API int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
WOLFSSL_API char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM*);
WOLFSSL_API int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM*, int,
WOLFSSL_BN_CTX*, WOLFSSL_BN_GENCB*);
WOLFSSL_API WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM*,
WOLFSSL_BN_ULONG);
WOLFSSL_API unsigned long wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM*,
unsigned long);
#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
WOLFSSL_API int wolfSSL_BN_print_fp(XFILE, const WOLFSSL_BIGNUM*);
#endif