From 6a3eccd344e7ad219d088b321af3a63ca9a3cd1c Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Sun, 17 Mar 2019 13:28:04 +0900 Subject: [PATCH] add BN_init, working with tfm, only. --- src/ssl.c | 22 ++++++++++++++++++++++ tests/api.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ wolfssl/openssl/bn.h | 14 +++++++++++--- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 766f55e5d..be6782080 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -22711,20 +22711,28 @@ WOLFSSL_BIGNUM* wolfSSL_BN_new(void) WOLFSSL_MSG("wolfSSL_BN_new"); +#if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT) mpi = (mp_int*) XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_BIGINT); if (mpi == NULL) { WOLFSSL_MSG("wolfSSL_BN_new malloc mpi failure"); return NULL; } +#endif external = (WOLFSSL_BIGNUM*) XMALLOC(sizeof(WOLFSSL_BIGNUM), NULL, DYNAMIC_TYPE_BIGINT); if (external == NULL) { WOLFSSL_MSG("wolfSSL_BN_new malloc WOLFSSL_BIGNUM failure"); +#if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT) XFREE(mpi, NULL, DYNAMIC_TYPE_BIGINT); +#endif return NULL; } +#if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT) + mpi = &external->fp; +#endif + InitwolfSSL_BigNum(external); if (mp_init(mpi) != MP_OKAY) { wolfSSL_BN_free(external); @@ -22735,6 +22743,18 @@ WOLFSSL_BIGNUM* wolfSSL_BN_new(void) return external; } +#if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT) +/* This function works without BN_free only with TFM */ +void wolfSSL_BN_init(WOLFSSL_BIGNUM* bn) +{ + if(bn == NULL)return; + WOLFSSL_MSG("wolfSSL_BN_init"); + InitwolfSSL_BigNum(bn); + if (mp_init(&bn->fp) != MP_OKAY) + return; + bn->internal = (void *)&bn->fp; +} +#endif void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn) { @@ -22744,7 +22764,9 @@ void wolfSSL_BN_free(WOLFSSL_BIGNUM* bn) mp_int* bni = (mp_int*)bn->internal; mp_forcezero(bni); mp_free(bni); +#if !defined(USE_FAST_MATH) || defined(HAVE_WOLF_BIGINT) XFREE(bn->internal, NULL, DYNAMIC_TYPE_BIGINT); +#endif bn->internal = NULL; } XFREE(bn, NULL, DYNAMIC_TYPE_BIGINT); diff --git a/tests/api.c b/tests/api.c index 843bf0bf2..1da87d949 100644 --- a/tests/api.c +++ b/tests/api.c @@ -18951,6 +18951,51 @@ static void test_wolfSSL_BN(void) BN_free(b); BN_free(c); + #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT) + { + BIGNUM *ap; + BIGNUM bv; + BIGNUM cv; + BIGNUM dv; + + AssertNotNull(ap = BN_new()); + BN_init(&bv); + BN_init(&cv); + BN_init(&dv); + + value[0] = 0x3; + AssertNotNull(BN_bin2bn(value, sizeof(value), ap)); + + value[0] = 0x02; + AssertNotNull(BN_bin2bn(value, sizeof(value), &bv)); + + value[0] = 0x05; + AssertNotNull(BN_bin2bn(value, sizeof(value), &cv)); + + /* a^b mod c = */ + AssertIntEQ(BN_mod_exp(&dv, NULL, &bv, &cv, NULL), WOLFSSL_FAILURE); + AssertIntEQ(BN_mod_exp(&dv, ap, &bv, &cv, NULL), WOLFSSL_SUCCESS); + + /* check result 3^2 mod 5 */ + value[0] = 0; + printf("BN_bn2bin = %d\n", BN_bn2bin(&dv, value)); + AssertIntEQ(BN_bn2bin(&dv, value), WOLFSSL_SUCCESS); + AssertIntEQ(BN_bn2bin(&dv, value), SSL_SUCCESS); + AssertIntEQ((int)(value[0]), 4); + + /* a*b mod c = */ + AssertIntEQ(BN_mod_mul(&dv, NULL, &bv, &cv, NULL), SSL_FAILURE); + AssertIntEQ(BN_mod_mul(&dv, ap, &bv, &cv, NULL), SSL_SUCCESS); + + /* check result 3*2 mod 5 */ + value[0] = 0; + AssertIntEQ(BN_bn2bin(&dv, value), SSL_SUCCESS); + AssertIntEQ((int)(value[0]), 1); + + BN_free(ap); + } + #endif + printf(resultFmt, passed); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ } diff --git a/wolfssl/openssl/bn.h b/wolfssl/openssl/bn.h index d51450e7b..02297d7d2 100644 --- a/wolfssl/openssl/bn.h +++ b/wolfssl/openssl/bn.h @@ -37,9 +37,13 @@ extern "C" { #endif -typedef struct WOLFSSL_BIGNUM { - int neg; /* openssh deference */ - void* internal; /* our big num */ +typedef struct WOLFSSL_BIGNUM +{ + int neg; /* openssh deference */ + void *internal; /* our big num */ +#if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT) + fp_int fp; +#endif } WOLFSSL_BIGNUM; @@ -53,6 +57,9 @@ WOLFSSL_API void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX*); WOLFSSL_API void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX*); WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_new(void); +#if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT) +WOLFSSL_API void wolfSSL_BN_init(WOLFSSL_BIGNUM *); +#endif WOLFSSL_API void wolfSSL_BN_free(WOLFSSL_BIGNUM*); WOLFSSL_API void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM*); @@ -126,6 +133,7 @@ typedef WOLFSSL_BN_GENCB BN_GENCB; #define BN_CTX_free wolfSSL_BN_CTX_free #define BN_new wolfSSL_BN_new +#define BN_init wolfSSL_BN_init #define BN_free wolfSSL_BN_free #define BN_clear_free wolfSSL_BN_clear_free