From 6a3eccd344e7ad219d088b321af3a63ca9a3cd1c Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Sun, 17 Mar 2019 13:28:04 +0900 Subject: [PATCH 1/3] 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 From 384b240ea26b8bf40bea92fc18b1a88a4214b484 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Sun, 17 Mar 2019 13:37:17 +0900 Subject: [PATCH 2/3] minor fix in test_wolfSSL_BN(), api.c --- tests/api.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/api.c b/tests/api.c index 1da87d949..f4f9fb2f3 100644 --- a/tests/api.c +++ b/tests/api.c @@ -18889,8 +18889,7 @@ static void test_wolfSSL_BN(void) /* check result 3^2 mod 5 */ value[0] = 0; - AssertIntEQ(BN_bn2bin(d, value), WOLFSSL_SUCCESS); - AssertIntEQ(BN_bn2bin(d, value), SSL_SUCCESS); + AssertIntEQ(BN_bn2bin(d, value), sizeof(value)); AssertIntEQ((int)(value[0]), 4); /* a*b mod c = */ @@ -18899,7 +18898,7 @@ static void test_wolfSSL_BN(void) /* check result 3*2 mod 5 */ value[0] = 0; - AssertIntEQ(BN_bn2bin(d, value), SSL_SUCCESS); + AssertIntEQ(BN_bn2bin(d, value), sizeof(value)); AssertIntEQ((int)(value[0]), 1); /* BN_mod_inverse test */ @@ -18978,9 +18977,7 @@ static void test_wolfSSL_BN(void) /* 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(BN_bn2bin(&dv, value), sizeof(value)); AssertIntEQ((int)(value[0]), 4); /* a*b mod c = */ @@ -18989,7 +18986,7 @@ static void test_wolfSSL_BN(void) /* check result 3*2 mod 5 */ value[0] = 0; - AssertIntEQ(BN_bn2bin(&dv, value), SSL_SUCCESS); + AssertIntEQ(BN_bn2bin(&dv, value), sizeof(value)); AssertIntEQ((int)(value[0]), 1); BN_free(ap); From 441fb60679c8ba8b6f25e9a41ffe61db28190883 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Fri, 22 Mar 2019 09:40:55 +0900 Subject: [PATCH 3/3] fix cr --- wolfssl/openssl/bn.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wolfssl/openssl/bn.h b/wolfssl/openssl/bn.h index 02297d7d2..7671d3cff 100644 --- a/wolfssl/openssl/bn.h +++ b/wolfssl/openssl/bn.h @@ -37,8 +37,7 @@ extern "C" { #endif -typedef struct WOLFSSL_BIGNUM -{ +typedef struct WOLFSSL_BIGNUM { int neg; /* openssh deference */ void *internal; /* our big num */ #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)