@@ -378,15 +378,33 @@ ECC Curve Sizes:
378378#endif
379379
380380#ifdef WOLFSSL_ECC_BLIND_K
381+ /* Number of digits covered by the fixed-width XORs below. */
382+ #define ECC_BLIND_K_DIGITS(key) \
383+ ((int)(((key)->dp->size + sizeof(mp_digit) - 1) / sizeof(mp_digit)))
384+
385+ /* The XORs read this many whole digits regardless of each operand's current
386+ * length, so operands written at partial width (e.g. by mp_copy()) must be
387+ * zero-extended first or stale digits fold into the value. mp_grow() cannot
388+ * fail for a curve-sized key; fail closed if it ever does. */
381389mp_int* ecc_get_k(ecc_key* key)
382390{
383- mp_xor_ct(key->k, key->kb, key->dp->size, key->ku);
391+ if ((mp_grow(key->k, ECC_BLIND_K_DIGITS(key)) != MP_OKAY) ||
392+ (mp_grow(key->kb, ECC_BLIND_K_DIGITS(key)) != MP_OKAY)) {
393+ mp_forcezero(key->ku);
394+ }
395+ else {
396+ mp_xor_ct(key->k, key->kb, key->dp->size, key->ku);
397+ }
384398 return key->ku;
385399}
386400void ecc_blind_k(ecc_key* key, mp_int* b)
387401{
388- mp_xor_ct(key->k, b, key->dp->size, key->k);
389- mp_xor_ct(key->kb, b, key->dp->size, key->kb);
402+ if ((mp_grow(key->k, ECC_BLIND_K_DIGITS(key)) == MP_OKAY) &&
403+ (mp_grow(key->kb, ECC_BLIND_K_DIGITS(key)) == MP_OKAY) &&
404+ (mp_grow(b, ECC_BLIND_K_DIGITS(key)) == MP_OKAY)) {
405+ mp_xor_ct(key->k, b, key->dp->size, key->k);
406+ mp_xor_ct(key->kb, b, key->dp->size, key->kb);
407+ }
390408}
391409int ecc_blind_k_rng(ecc_key* key, WC_RNG* rng)
392410{
@@ -405,11 +423,17 @@ int ecc_blind_k_rng(ecc_key* key, WC_RNG* rng)
405423 }
406424 }
407425 if (ret == 0) {
408- ret = mp_rand(key->kb, (key->dp->size + sizeof(mp_digit) - 1) /
409- sizeof(mp_digit), rng);
426+ ret = mp_rand(key->kb, ECC_BLIND_K_DIGITS(key), rng);
427+ if (ret == 0) {
428+ ret = mp_grow(key->k, ECC_BLIND_K_DIGITS(key));
429+ }
410430 if (ret == 0) {
411431 mp_xor_ct(key->k, key->kb, key->dp->size, key->k);
412432 }
433+ else {
434+ /* No blind installed - keep the stored pair consistent. */
435+ mp_forcezero(key->kb);
436+ }
413437 }
414438
415439 if (rng == &local_rng) {
@@ -418,6 +442,13 @@ int ecc_blind_k_rng(ecc_key* key, WC_RNG* rng)
418442 return ret;
419443}
420444
445+ void ecc_forcezero_k(ecc_key* key)
446+ {
447+ mp_forcezero(key->k);
448+ mp_forcezero(key->kb);
449+ mp_forcezero(key->ku);
450+ }
451+
421452mp_int* wc_ecc_key_get_priv(ecc_key* key)
422453{
423454 return ecc_get_k(key);
0 commit comments