Better handle "mp_init_multi" failure in "wc_ecc_make_key_ex".

This commit is contained in:
David Garske
2016-11-14 12:38:01 -08:00
parent 6d5485b88f
commit cee321323a

View File

@@ -2514,7 +2514,13 @@ int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
/* setup the key variables */ /* setup the key variables */
err = mp_init_multi(&key->k, &prime, &order, &a, NULL, NULL); err = mp_init_multi(&key->k, &prime, &order, &a, NULL, NULL);
if (err == MP_OKAY) { if (err != MP_OKAY) {
#ifdef WOLFSSL_SMALL_STACK
XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
return err;
}
#ifndef ALT_ECC_SIZE #ifndef ALT_ECC_SIZE
err = mp_init_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z, err = mp_init_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z,
NULL, NULL, NULL); NULL, NULL, NULL);
@@ -2526,7 +2532,6 @@ int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
alt_fp_init(key->pubkey.y); alt_fp_init(key->pubkey.y);
alt_fp_init(key->pubkey.z); alt_fp_init(key->pubkey.z);
#endif #endif
}
if (err == MP_OKAY) { if (err == MP_OKAY) {
base = wc_ecc_new_point_h(key->heap); base = wc_ecc_new_point_h(key->heap);
@@ -2580,14 +2585,15 @@ int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id)
if (err == MP_OKAY) if (err == MP_OKAY)
key->type = ECC_PRIVATEKEY; key->type = ECC_PRIVATEKEY;
/* cleanup these on failure case only */
if (err != MP_OKAY) { if (err != MP_OKAY) {
/* clean up */
mp_clear(key->pubkey.x); mp_clear(key->pubkey.x);
mp_clear(key->pubkey.y); mp_clear(key->pubkey.y);
mp_clear(key->pubkey.z); mp_clear(key->pubkey.z);
mp_forcezero(&key->k); mp_forcezero(&key->k);
} }
/* cleanup allocations */
wc_ecc_del_point_h(base, key->heap); wc_ecc_del_point_h(base, key->heap);
#ifndef USE_FAST_MATH #ifndef USE_FAST_MATH
mp_clear(&a); mp_clear(&a);