Fixes for ECC sign with WOLFSSL_ECDSA_SET_K, which was not loading all curve params for the wc_ecc_make_pub_ex call and not correctly setting ALLOC_CURVE_SPECS for WOLFSSL_SMALL_STACK. Cleanup around the loading of curve specs.

This commit is contained in:
David Garske
2020-01-13 16:25:37 -08:00
parent 22f49d8597
commit 95b6076fe1

View File

@ -3683,9 +3683,8 @@ int wc_ecc_shared_secret_gen(ecc_key* private_key, ecc_point* point,
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
} }
ALLOC_CURVE_SPECS(2);
/* load curve info */ /* load curve info */
ALLOC_CURVE_SPECS(2);
err = wc_ecc_curve_load(private_key->dp, &curve, err = wc_ecc_curve_load(private_key->dp, &curve,
(ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF)); (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF));
if (err != MP_OKAY) { if (err != MP_OKAY) {
@ -3901,11 +3900,11 @@ static int wc_ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
curve = curveIn; curve = curveIn;
} }
else { else {
ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
/* load curve info */ /* load curve info */
if (err == MP_OKAY) if (err == MP_OKAY) {
ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
}
} }
if (err == MP_OKAY) { if (err == MP_OKAY) {
@ -4159,14 +4158,15 @@ int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
#ifdef WOLFSSL_SP_MATH #ifdef WOLFSSL_SP_MATH
err = WC_KEY_SIZE_E; err = WC_KEY_SIZE_E;
#else #else
ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
/* setup the key variables */ /* setup the key variables */
err = mp_init(&key->k); err = mp_init(&key->k);
/* load curve info */ /* load curve info */
if (err == MP_OKAY) if (err == MP_OKAY) {
ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
}
/* generate k */ /* generate k */
if (err == MP_OKAY) if (err == MP_OKAY)
@ -4736,10 +4736,13 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
!defined(WOLFSSL_SMALL_STACK) !defined(WOLFSSL_SMALL_STACK)
mp_int e_lcl; mp_int e_lcl;
#endif #endif
#ifndef WOLFSSL_ECDSA_SET_K
DECLARE_CURVE_SPECS(curve, 1); #if defined(WOLFSSL_ECDSA_SET_K) || \
#else (defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
(defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA)))
DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT); DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
#else
DECLARE_CURVE_SPECS(curve, 1);
#endif #endif
#endif /* !WOLFSSL_SP_MATH */ #endif /* !WOLFSSL_SP_MATH */
@ -4805,12 +4808,9 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
} }
#endif #endif
ALLOC_CURVE_SPECS(1);
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V) #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
err = wc_ecc_alloc_mpint(key, &key->e); err = wc_ecc_alloc_mpint(key, &key->e);
if (err != 0) { if (err != 0) {
FREE_CURVE_SPECS();
return err; return err;
} }
e = key->e; e = key->e;
@ -4819,7 +4819,6 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
#else #else
e = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC); e = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_ECC);
if (e == NULL) { if (e == NULL) {
FREE_CURVE_SPECS();
return MEMORY_E; return MEMORY_E;
} }
#endif #endif
@ -4830,15 +4829,24 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
XFREE(e, key->heap, DYNAMIC_TYPE_ECC); XFREE(e, key->heap, DYNAMIC_TYPE_ECC);
#endif #endif
FREE_CURVE_SPECS();
return err; return err;
} }
/* load curve info */ /* load curve info */
#ifndef WOLFSSL_ECDSA_SET_K #if defined(WOLFSSL_ECDSA_SET_K)
err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
#else
err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL);
#else
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \
(defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA))
if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC)
ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
else
#endif
{
ALLOC_CURVE_SPECS(1);
err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
}
#endif #endif
/* load digest into e */ /* load digest into e */