crypto: Convert crypto_ec_key_get_private_key() to return new bignum

This makes it easier for the crypto library/wrapper to avoid direct
references to internal EC key parameters.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2022-05-26 14:23:46 +03:00
parent c9c2c2d9c7
commit 26780d92f3
3 changed files with 25 additions and 12 deletions

View file

@ -1037,8 +1037,8 @@ int dpp_auth_derive_l_responder(struct dpp_authentication *auth)
struct crypto_ec *ec;
struct crypto_ec_point *L = NULL;
const struct crypto_ec_point *BI;
const struct crypto_bignum *bR, *pR, *q;
struct crypto_bignum *sum = NULL, *lx = NULL;
const struct crypto_bignum *q;
struct crypto_bignum *sum = NULL, *lx = NULL, *bR = NULL, *pR = NULL;
int ret = -1;
/* L = ((bR + pR) modulo q) * BI */
@ -1068,6 +1068,8 @@ int dpp_auth_derive_l_responder(struct dpp_authentication *auth)
fail:
crypto_bignum_deinit(lx, 1);
crypto_bignum_deinit(sum, 1);
crypto_bignum_deinit(bR, 1);
crypto_bignum_deinit(pR, 1);
crypto_ec_point_deinit(L, 1);
crypto_ec_deinit(ec);
return ret;
@ -1079,8 +1081,7 @@ int dpp_auth_derive_l_initiator(struct dpp_authentication *auth)
struct crypto_ec *ec;
struct crypto_ec_point *L = NULL, *sum = NULL;
const struct crypto_ec_point *BR, *PR;
const struct crypto_bignum *bI;
struct crypto_bignum *lx = NULL;
struct crypto_bignum *lx = NULL, *bI = NULL;
int ret = -1;
/* L = bI * (BR + PR) */
@ -1108,6 +1109,7 @@ int dpp_auth_derive_l_initiator(struct dpp_authentication *auth)
ret = 0;
fail:
crypto_bignum_deinit(lx, 1);
crypto_bignum_deinit(bI, 1);
crypto_ec_point_deinit(sum, 1);
crypto_ec_point_deinit(L, 1);
crypto_ec_deinit(ec);
@ -1661,8 +1663,8 @@ int dpp_reconfig_derive_ke_responder(struct dpp_authentication *auth,
struct json_token *peer_net_access_key)
{
struct crypto_ec_key *own_key = NULL, *peer_key = NULL;
struct crypto_bignum *sum = NULL;
const struct crypto_bignum *q, *cR, *pR;
struct crypto_bignum *sum = NULL, *cR = NULL, *pR = NULL;
const struct crypto_bignum *q;
struct crypto_ec *ec = NULL;
struct crypto_ec_point *M = NULL;
const struct crypto_ec_point *CI;
@ -1749,6 +1751,8 @@ fail:
forced_memzero(Mx, sizeof(Mx));
crypto_ec_point_deinit(M, 1);
crypto_bignum_deinit(sum, 1);
crypto_bignum_deinit(cR, 1);
crypto_bignum_deinit(pR, 1);
crypto_ec_key_deinit(own_key);
crypto_ec_key_deinit(peer_key);
crypto_ec_deinit(ec);
@ -1762,7 +1766,7 @@ int dpp_reconfig_derive_ke_initiator(struct dpp_authentication *auth,
{
struct crypto_ec_key *pr = NULL, *peer_key = NULL;
const struct crypto_ec_point *CR, *PR;
const struct crypto_bignum *cI;
struct crypto_bignum *cI = NULL;
struct crypto_ec *ec = NULL;
struct crypto_ec_point *sum = NULL, *M = NULL;
u8 Mx[DPP_MAX_SHARED_SECRET_LEN];
@ -1835,6 +1839,7 @@ int dpp_reconfig_derive_ke_initiator(struct dpp_authentication *auth,
fail:
forced_memzero(prk, sizeof(prk));
forced_memzero(Mx, sizeof(Mx));
crypto_bignum_deinit(cI, 1);
crypto_ec_key_deinit(pr);
crypto_ec_key_deinit(peer_key);
crypto_ec_point_deinit(sum, 1);
@ -2321,7 +2326,7 @@ struct crypto_ec_point * dpp_decrypt_e_id(struct crypto_ec_key *ppkey,
struct crypto_ec_key *e_prime_id)
{
struct crypto_ec *ec;
const struct crypto_bignum *pp;
struct crypto_bignum *pp = NULL;
struct crypto_ec_point *e_id = NULL;
const struct crypto_ec_point *a_nonce_point, *e_prime_id_point;
@ -2348,6 +2353,7 @@ struct crypto_ec_point * dpp_decrypt_e_id(struct crypto_ec_key *ppkey,
crypto_ec_point_debug_print(ec, e_id, "DPP: Decrypted E-id");
fail:
crypto_bignum_deinit(pp, 1);
crypto_ec_deinit(ec);
return e_id;
}

View file

@ -1094,8 +1094,10 @@ crypto_ec_key_get_public_key(struct crypto_ec_key *key);
* crypto_ec_key_get_private_key - Get EC private key as a bignum
* @key: EC key from crypto_ec_key_parse/set_pub() or crypto_ec_key_parse_priv()
* Returns: Private key as a bignum or %NULL on failure
*
* The caller needs to free the returned value with crypto_bignum_deinit().
*/
const struct crypto_bignum *
struct crypto_bignum *
crypto_ec_key_get_private_key(struct crypto_ec_key *key);
/**

View file

@ -3425,15 +3425,20 @@ crypto_ec_key_get_public_key(struct crypto_ec_key *key)
}
const struct crypto_bignum *
struct crypto_bignum *
crypto_ec_key_get_private_key(struct crypto_ec_key *key)
{
EVP_PKEY *pkey = (EVP_PKEY *) key;
const EC_KEY *eckey;
const BIGNUM *bn;
eckey = EVP_PKEY_get0_EC_KEY((EVP_PKEY *) key);
eckey = EVP_PKEY_get0_EC_KEY(pkey);
if (!eckey)
return NULL;
return (const struct crypto_bignum *) EC_KEY_get0_private_key(eckey);
bn = EC_KEY_get0_private_key(eckey);
if (!bn)
return NULL;
return (struct crypto_bignum *) BN_dup(bn);
}