Skip to content

Commit 2c8390d

Browse files
committed
openssl: wipe the unblinded scalar after reading an EC_KEY
Under WOLFSSL_ECC_BLIND_K, wc_ecc_key_get_priv() leaves a plain copy. FIPS and self-test copies of ecc.h lack ecc_put_k(), so skip it there.
1 parent 0d34b8e commit 2c8390d

1 file changed

Lines changed: 20 additions & 8 deletions

File tree

‎src/pk_ec.c‎

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@
4747
* define WOLFSSL_HAVE_ECC_KEY_GET_PRIV, so the block above was skipped. */
4848
#define ecc_get_k_raw(key) (key)->k
4949
#endif
50+
#if defined(HAVE_FIPS) || defined(HAVE_SELFTEST)
51+
/* FIPS and self-test copies of ecc.h predate ecc_put_k(). */
52+
#define pk_ec_put_k(key) WC_DO_NOTHING
53+
#else
54+
/* Wipe the unblinded copy wc_ecc_key_get_priv() made. */
55+
#define pk_ec_put_k(key) ecc_put_k(key)
56+
#endif
5057

5158
#if !defined(WOLFSSL_PK_EC_INCLUDED)
5259
#ifndef WOLFSSL_IGNORE_FILE_WARN
@@ -4539,11 +4546,13 @@ int SetECKeyExternal(WOLFSSL_EC_KEY* eckey)
45394546

45404547
/* set the external privkey */
45414548
if ((ret == 1) && ((key->type == ECC_PRIVATEKEY) ||
4542-
(key->type == ECC_PRIVATEKEY_ONLY)) &&
4543-
(wolfssl_bn_set_value(&eckey->priv_key,
4544-
wc_ecc_key_get_priv(key)) != 1)) {
4545-
WOLFSSL_MSG("ec priv key error");
4546-
ret = WOLFSSL_FATAL_ERROR;
4549+
(key->type == ECC_PRIVATEKEY_ONLY))) {
4550+
if (wolfssl_bn_set_value(&eckey->priv_key,
4551+
wc_ecc_key_get_priv(key)) != 1) {
4552+
WOLFSSL_MSG("ec priv key error");
4553+
ret = WOLFSSL_FATAL_ERROR;
4554+
}
4555+
pk_ec_put_k(key);
45474556
}
45484557

45494558
/* External values set when operations succeeded. */
@@ -4628,11 +4637,14 @@ int SetECKeyInternal(WOLFSSL_EC_KEY* eckey)
46284637
ret = WOLFSSL_FATAL_ERROR;
46294638
}
46304639
/* private key */
4631-
if ((ret == 1) && (!mp_iszero(wc_ecc_key_get_priv(key)))) {
4632-
if (pubSet) {
4640+
if (ret == 1) {
4641+
int privSet = !mp_iszero(wc_ecc_key_get_priv(key));
4642+
4643+
pk_ec_put_k(key);
4644+
if (privSet && pubSet) {
46334645
key->type = ECC_PRIVATEKEY;
46344646
}
4635-
else {
4647+
else if (privSet) {
46364648
key->type = ECC_PRIVATEKEY_ONLY;
46374649
}
46384650
}

0 commit comments

Comments
 (0)