diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 5336d15f0..45dd1f17e 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -1283,7 +1283,7 @@ enum ecc_curve_load_mask { #endif #define DECLARE_CURVE_SPECS(curve, intcount) ecc_curve_spec* curve = NULL - #define ALLOC_CURVE_SPECS(intcount) + #define ALLOC_CURVE_SPECS(intcount, err) #define FREE_CURVE_SPECS() #elif defined(WOLFSSL_SMALL_STACK) #define DECLARE_CURVE_SPECS(curve, intcount) \ @@ -1293,12 +1293,13 @@ enum ecc_curve_load_mask { XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \ curve->spec_count = intcount - #define ALLOC_CURVE_SPECS(intcount) \ + #define ALLOC_CURVE_SPECS(intcount, err) \ spec_ints = (mp_int*)XMALLOC(sizeof(mp_int) * (intcount), NULL, \ DYNAMIC_TYPE_ECC); \ if (spec_ints == NULL) \ - return MEMORY_E; \ - curve->spec_ints = spec_ints + err = MEMORY_E; \ + else \ + curve->spec_ints = spec_ints #define FREE_CURVE_SPECS() \ XFREE(spec_ints, NULL, DYNAMIC_TYPE_ECC) #else @@ -1309,7 +1310,7 @@ enum ecc_curve_load_mask { XMEMSET(curve, 0, sizeof(ecc_curve_spec)); \ curve->spec_ints = spec_ints; \ curve->spec_count = intcount - #define ALLOC_CURVE_SPECS(intcount) + #define ALLOC_CURVE_SPECS(intcount, err) #define FREE_CURVE_SPECS() #endif /* ECC_CACHE_CURVE */ @@ -4132,7 +4133,7 @@ static int wc_ecc_shared_secret_gen_async(ecc_key* private_key, int wc_ecc_shared_secret_gen(ecc_key* private_key, ecc_point* point, byte* out, word32 *outlen) { - int err; + int err = MP_OKAY; DECLARE_CURVE_SPECS(curve, 3); if (private_key == NULL || point == NULL || out == NULL || @@ -4141,9 +4142,12 @@ int wc_ecc_shared_secret_gen(ecc_key* private_key, ecc_point* point, } /* load curve info */ - ALLOC_CURVE_SPECS(3); - err = wc_ecc_curve_load(private_key->dp, &curve, + ALLOC_CURVE_SPECS(3, err); + if (err == MP_OKAY) { + err = wc_ecc_curve_load(private_key->dp, &curve, (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF | ECC_CURVE_FIELD_ORDER)); + } + if (err != MP_OKAY) { FREE_CURVE_SPECS(); return err; @@ -4254,7 +4258,7 @@ int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point, /* Checks if a point p lies on the curve with index curve_idx */ int wc_ecc_point_is_on_curve(ecc_point *p, int curve_idx) { - int err; + int err = MP_OKAY; DECLARE_CURVE_SPECS(curve, 3); if (p == NULL) @@ -4265,10 +4269,12 @@ int wc_ecc_point_is_on_curve(ecc_point *p, int curve_idx) return ECC_BAD_ARG_E; } - ALLOC_CURVE_SPECS(3); - err = wc_ecc_curve_load(wc_ecc_get_curve_params(curve_idx), &curve, + ALLOC_CURVE_SPECS(3, err); + if (err == MP_OKAY) { + err = wc_ecc_curve_load(wc_ecc_get_curve_params(curve_idx), &curve, ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF | ECC_CURVE_FIELD_BF); + } if (err == MP_OKAY) { err = wc_ecc_is_point(p, curve->Af, curve->Bf, curve->prime); } @@ -4404,7 +4410,9 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn, else { /* load curve info */ if (err == MP_OKAY) { - ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT); + ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err); + } + if (err == MP_OKAY) { err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); } } @@ -4720,7 +4728,9 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id, /* load curve info */ if (err == MP_OKAY) { - ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT); + ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err); + } + if (err == MP_OKAY) { err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); } @@ -5005,12 +5015,15 @@ int wc_ecc_set_flags(ecc_key* key, word32 flags) static int wc_ecc_get_curve_order_bit_count(const ecc_set_type* dp) { - int err; + int err = MP_OKAY; word32 orderBits; DECLARE_CURVE_SPECS(curve, 1); - ALLOC_CURVE_SPECS(1); - err = wc_ecc_curve_load(dp, &curve, ECC_CURVE_FIELD_ORDER); + ALLOC_CURVE_SPECS(1, err); + if (err == MP_OKAY) { + err = wc_ecc_curve_load(dp, &curve, ECC_CURVE_FIELD_ORDER); + } + if (err != 0) { FREE_CURVE_SPECS(); return err; @@ -5319,12 +5332,15 @@ int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen, /* returns MP_OKAY on success */ static int deterministic_sign_helper(const byte* in, word32 inlen, ecc_key* key) { - int err; + int err = MP_OKAY; DECLARE_CURVE_SPECS(curve, 1); - ALLOC_CURVE_SPECS(1); + ALLOC_CURVE_SPECS(1, err); /* get curve order */ - err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); + if (err == MP_OKAY) { + err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); + } + if (err == MP_OKAY) { /* if key->sign_k is NULL then create a buffer for the mp_int * if not NULL then assume the user correctly set deterministic flag and @@ -5691,21 +5707,24 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng, /* load curve info */ #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \ defined(WOLFSSL_ECDSA_DETERMINISTIC_K) - ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT); - err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); + ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err); + if (err == MP_OKAY) + err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); #else - #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \ + #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); - err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); - } - else - #endif - { - ALLOC_CURVE_SPECS(1); - err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); - } + if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) { + ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err); + if (err == MP_OKAY) + err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); + } + else + #endif + { + ALLOC_CURVE_SPECS(1, err); + if (err == MP_OKAY) + err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); + } #endif /* load digest into e */ @@ -6099,15 +6118,18 @@ int wc_ecc_set_deterministic(ecc_key* key, byte flag) #if defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) int wc_ecc_sign_set_k(const byte* k, word32 klen, ecc_key* key) { - int ret; + int ret = MP_OKAY; DECLARE_CURVE_SPECS(curve, 1); if (k == NULL || klen == 0 || key == NULL) { return BAD_FUNC_ARG; } - ALLOC_CURVE_SPECS(1); - ret = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); + ALLOC_CURVE_SPECS(1, ret); + if (ret == MP_OKAY) { + ret = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); + } + if (ret != 0) { FREE_CURVE_SPECS(); return ret; @@ -6798,11 +6820,13 @@ int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash, static int wc_ecc_check_r_s_range(ecc_key* key, mp_int* r, mp_int* s) { - int err; + int err = MP_OKAY; DECLARE_CURVE_SPECS(curve, 1); - ALLOC_CURVE_SPECS(1); - err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); + ALLOC_CURVE_SPECS(1, err); + if (err == MP_OKAY) { + err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER); + } if (err != 0) { FREE_CURVE_SPECS(); return err; @@ -7080,7 +7104,7 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, #endif #if !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC) - ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT); + ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err); #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V) err = wc_ecc_alloc_mpint(key, &key->e); @@ -7426,12 +7450,14 @@ int wc_ecc_import_point_der_ex(const byte* in, word32 inLen, mp_int t1, t2; DECLARE_CURVE_SPECS(curve, 3); - ALLOC_CURVE_SPECS(3); + ALLOC_CURVE_SPECS(3, err); - if (mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY) - err = MEMORY_E; - else - did_init = 1; + if (err == MP_OKAY) { + if (mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY) + err = MEMORY_E; + else + did_init = 1; + } /* load curve info */ if (err == MP_OKAY) @@ -7930,7 +7956,7 @@ static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime) if (key == NULL) return BAD_FUNC_ARG; - ALLOC_CURVE_SPECS(3); + ALLOC_CURVE_SPECS(3, err); #ifdef WOLFSSL_NO_MALLOC res = &lcl_res; @@ -8027,11 +8053,13 @@ static int ecc_check_privkey_gen_helper(ecc_key* key) /* Hardware based private key, so this operation is not supported */ err = MP_OKAY; /* just report success */ #else - ALLOC_CURVE_SPECS(2); + err = MP_OKAY; + ALLOC_CURVE_SPECS(2, err); /* load curve info */ - err = wc_ecc_curve_load(key->dp, &curve, - (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF)); + if (err == MP_OKAY) + err = wc_ecc_curve_load(key->dp, &curve, + (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF)); if (err == MP_OKAY) err = ecc_check_privkey_gen(key, curve->Af, curve->prime); @@ -8111,9 +8139,10 @@ int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) if (!ecp || curve_idx < 0 || curve_idx > (int)(ECC_SET_COUNT-1)) return BAD_FUNC_ARG; - ALLOC_CURVE_SPECS(2); + ALLOC_CURVE_SPECS(2, err); - err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve, + if (err == MP_OKAY) + err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve, (ECC_CURVE_FIELD_GX | ECC_CURVE_FIELD_GY)); if (err == MP_OKAY) err = mp_copy(curve->Gx, ecp->x); @@ -8133,7 +8162,7 @@ int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) int wc_ecc_check_key(ecc_key* key) { #ifndef WOLFSSL_SP_MATH - int err; + int err = MP_OKAY; #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ !defined(WOLFSSL_CRYPTOCELL) mp_int* b = NULL; @@ -8181,9 +8210,9 @@ int wc_ecc_check_key(ecc_key* key) #else #ifdef USE_ECC_B_PARAM - ALLOC_CURVE_SPECS(4); + ALLOC_CURVE_SPECS(4, err); #else - ALLOC_CURVE_SPECS(3); + ALLOC_CURVE_SPECS(3, err); #ifndef WOLFSSL_SMALL_STACK b = &b_lcl; #else @@ -8219,7 +8248,8 @@ int wc_ecc_check_key(ecc_key* key) } /* load curve info */ - err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_PRIME | + if (err == MP_OKAY) + err = wc_ecc_curve_load(key->dp, &curve, (ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF | ECC_CURVE_FIELD_ORDER #ifdef USE_ECC_B_PARAM | ECC_CURVE_FIELD_BF @@ -8386,9 +8416,10 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key, int did_init = 0; DECLARE_CURVE_SPECS(curve, 3); - ALLOC_CURVE_SPECS(3); + ALLOC_CURVE_SPECS(3, err); - if (mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY) + if (err == MP_OKAY && + mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY) err = MEMORY_E; else did_init = 1;