add BN_init, working with tfm, only.

This commit is contained in:
Takashi Kojo
2019-03-17 13:28:04 +09:00
parent 0ef4b7e933
commit 6a3eccd344
3 changed files with 78 additions and 3 deletions

View File

@ -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);

View File

@ -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) */
}

View File

@ -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