DPP: Move dpp_gen_keypair() to crypto

Move code in dpp_gen_keypair() to function crypto_ec_key_gen() in
crypto.h.

Signed-off-by: Cedric Izoard <cedric.izoard@ceva-dsp.com>
This commit is contained in:
Cedric Izoard 2021-06-28 18:25:21 +02:00 committed by Jouni Malinen
parent 0517948d77
commit 86cde01cbd
3 changed files with 100 additions and 85 deletions

View file

@ -524,51 +524,15 @@ struct crypto_ec_key * dpp_set_pubkey_point(struct crypto_ec_key *group_key,
struct crypto_ec_key * dpp_gen_keypair(const struct dpp_curve_params *curve) struct crypto_ec_key * dpp_gen_keypair(const struct dpp_curve_params *curve)
{ {
EVP_PKEY_CTX *kctx = NULL; struct crypto_ec_key *key;
EC_KEY *ec_params = NULL;
EVP_PKEY *params = NULL, *key = NULL;
int nid;
wpa_printf(MSG_DEBUG, "DPP: Generating a keypair"); wpa_printf(MSG_DEBUG, "DPP: Generating a keypair");
nid = OBJ_txt2nid(curve->name); key = crypto_ec_key_gen(curve->ike_group);
if (nid == NID_undef) { if (key && wpa_debug_show_keys)
wpa_printf(MSG_INFO, "DPP: Unsupported curve %s", curve->name); dpp_debug_print_key("Own generated key", key);
return NULL;
}
ec_params = EC_KEY_new_by_curve_name(nid); return key;
if (!ec_params) {
wpa_printf(MSG_ERROR,
"DPP: Failed to generate EC_KEY parameters");
goto fail;
}
EC_KEY_set_asn1_flag(ec_params, OPENSSL_EC_NAMED_CURVE);
params = EVP_PKEY_new();
if (!params || EVP_PKEY_set1_EC_KEY(params, ec_params) != 1) {
wpa_printf(MSG_ERROR,
"DPP: Failed to generate EVP_PKEY parameters");
goto fail;
}
kctx = EVP_PKEY_CTX_new(params, NULL);
if (!kctx ||
EVP_PKEY_keygen_init(kctx) != 1 ||
EVP_PKEY_keygen(kctx, &key) != 1) {
wpa_printf(MSG_ERROR, "DPP: Failed to generate EC key");
key = NULL;
goto fail;
}
if (wpa_debug_show_keys)
dpp_debug_print_key("Own generated key",
(struct crypto_ec_key *) key);
fail:
EC_KEY_free(ec_params);
EVP_PKEY_free(params);
EVP_PKEY_CTX_free(kctx);
return (struct crypto_ec_key *) key;
} }

View file

@ -994,22 +994,29 @@ struct crypto_ec_key * crypto_ec_key_parse_priv(const u8 *der, size_t der_len);
*/ */
struct crypto_ec_key * crypto_ec_key_parse_pub(const u8 *der, size_t der_len); struct crypto_ec_key * crypto_ec_key_parse_pub(const u8 *der, size_t der_len);
/**
* crypto_ec_key_gen - Generate EC key pair
* @group: Identifying number for the ECC group
* Returns: EC key or %NULL on failure
*/
struct crypto_ec_key * crypto_ec_key_gen(int group);
/** /**
* crypto_ec_key_deinit - Free EC key * crypto_ec_key_deinit - Free EC key
* @key: EC key from crypto_ec_key_parse_pub() or crypto_ec_key_parse_priv() * @key: EC key from crypto_ec_key_parse_pub/priv() or crypto_ec_key_gen()
*/ */
void crypto_ec_key_deinit(struct crypto_ec_key *key); void crypto_ec_key_deinit(struct crypto_ec_key *key);
/** /**
* crypto_ec_key_get_subject_public_key - Get SubjectPublicKeyInfo ASN.1 for an EC key * crypto_ec_key_get_subject_public_key - Get SubjectPublicKeyInfo ASN.1 for an EC key
* @key: EC key from crypto_ec_key_parse_pub() or crypto_ec_key_parse_priv() * @key: EC key from crypto_ec_key_parse_pub/priv() or crypto_ec_key_gen()
* Returns: Buffer with DER encoding of ASN.1 SubjectPublicKeyInfo or %NULL on failure * Returns: Buffer with DER encoding of ASN.1 SubjectPublicKeyInfo or %NULL on failure
*/ */
struct wpabuf * crypto_ec_key_get_subject_public_key(struct crypto_ec_key *key); struct wpabuf * crypto_ec_key_get_subject_public_key(struct crypto_ec_key *key);
/** /**
* crypto_ec_key_sign - Sign a buffer with an EC key * crypto_ec_key_sign - Sign a buffer with an EC key
* @key: EC key from crypto_ec_key_parse_priv() * @key: EC key from crypto_ec_key_parse_priv() or crypto_ec_key_gen()
* @data: Data to sign * @data: Data to sign
* @len: Length of @data buffer * @len: Length of @data buffer
* Returns: Buffer with DER encoding of ASN.1 Ecdsa-Sig-Value or %NULL on failure * Returns: Buffer with DER encoding of ASN.1 Ecdsa-Sig-Value or %NULL on failure
@ -1019,7 +1026,7 @@ struct wpabuf * crypto_ec_key_sign(struct crypto_ec_key *key, const u8 *data,
/** /**
* crypto_ec_key_verify_signature - Verify ECDSA signature * crypto_ec_key_verify_signature - Verify ECDSA signature
* @key: EC key from crypto_ec_key_parse_pub() * @key: EC key from crypto_ec_key_parse_pub() or crypto_ec_key_gen()
* @data: Data to be signed * @data: Data to be signed
* @len: Length of @data buffer * @len: Length of @data buffer
* @sig: DER encoding of ASN.1 Ecdsa-Sig-Value * @sig: DER encoding of ASN.1 Ecdsa-Sig-Value
@ -1031,7 +1038,7 @@ int crypto_ec_key_verify_signature(struct crypto_ec_key *key, const u8 *data,
/** /**
* crypto_ec_key_group - Get IANA group identifier for an EC key * crypto_ec_key_group - Get IANA group identifier for an EC key
* @key: EC key from crypto_ec_key_parse_pub() or crypto_ec_key_parse_priv() * @key: EC key from crypto_ec_key_parse_pub/priv() or crypto_ec_key_gen()
* Returns: IANA group identifier and -1 on failure * Returns: IANA group identifier and -1 on failure
*/ */
int crypto_ec_key_group(struct crypto_ec_key *key); int crypto_ec_key_group(struct crypto_ec_key *key);

View file

@ -1640,51 +1640,51 @@ struct crypto_ec {
BIGNUM *b; BIGNUM *b;
}; };
static int crypto_ec_group_2_nid(int group)
{
/* Map from IANA registry for IKE D-H groups to OpenSSL NID */
switch (group) {
case 19:
return NID_X9_62_prime256v1;
case 20:
return NID_secp384r1;
case 21:
return NID_secp521r1;
case 25:
return NID_X9_62_prime192v1;
case 26:
return NID_secp224r1;
#ifdef NID_brainpoolP224r1
case 27:
return NID_brainpoolP224r1;
#endif /* NID_brainpoolP224r1 */
#ifdef NID_brainpoolP256r1
case 28:
return NID_brainpoolP256r1;
#endif /* NID_brainpoolP256r1 */
#ifdef NID_brainpoolP384r1
case 29:
return NID_brainpoolP384r1;
#endif /* NID_brainpoolP384r1 */
#ifdef NID_brainpoolP512r1
case 30:
return NID_brainpoolP512r1;
#endif /* NID_brainpoolP512r1 */
default:
return -1;
}
}
struct crypto_ec * crypto_ec_init(int group) struct crypto_ec * crypto_ec_init(int group)
{ {
struct crypto_ec *e; struct crypto_ec *e;
int nid; int nid;
/* Map from IANA registry for IKE D-H groups to OpenSSL NID */ nid = crypto_ec_group_2_nid(group);
switch (group) { if (nid < 0)
case 19:
nid = NID_X9_62_prime256v1;
break;
case 20:
nid = NID_secp384r1;
break;
case 21:
nid = NID_secp521r1;
break;
case 25:
nid = NID_X9_62_prime192v1;
break;
case 26:
nid = NID_secp224r1;
break;
#ifdef NID_brainpoolP224r1
case 27:
nid = NID_brainpoolP224r1;
break;
#endif /* NID_brainpoolP224r1 */
#ifdef NID_brainpoolP256r1
case 28:
nid = NID_brainpoolP256r1;
break;
#endif /* NID_brainpoolP256r1 */
#ifdef NID_brainpoolP384r1
case 29:
nid = NID_brainpoolP384r1;
break;
#endif /* NID_brainpoolP384r1 */
#ifdef NID_brainpoolP512r1
case 30:
nid = NID_brainpoolP512r1;
break;
#endif /* NID_brainpoolP512r1 */
default:
return NULL; return NULL;
}
e = os_zalloc(sizeof(*e)); e = os_zalloc(sizeof(*e));
if (e == NULL) if (e == NULL)
@ -2242,6 +2242,50 @@ fail:
} }
struct crypto_ec_key * crypto_ec_key_gen(int group)
{
EVP_PKEY_CTX *kctx = NULL;
EC_KEY *ec_params = NULL;
EVP_PKEY *params = NULL, *key = NULL;
int nid;
nid = crypto_ec_group_2_nid(group);
if (nid < 0) {
wpa_printf(MSG_ERROR, "OpenSSL: Unsupported group %d", group);
return NULL;
}
ec_params = EC_KEY_new_by_curve_name(nid);
if (!ec_params) {
wpa_printf(MSG_ERROR,
"OpenSSL: Failed to generate EC_KEY parameters");
goto fail;
}
EC_KEY_set_asn1_flag(ec_params, OPENSSL_EC_NAMED_CURVE);
params = EVP_PKEY_new();
if (!params || EVP_PKEY_set1_EC_KEY(params, ec_params) != 1) {
wpa_printf(MSG_ERROR,
"OpenSSL: Failed to generate EVP_PKEY parameters");
goto fail;
}
kctx = EVP_PKEY_CTX_new(params, NULL);
if (!kctx ||
EVP_PKEY_keygen_init(kctx) != 1 ||
EVP_PKEY_keygen(kctx, &key) != 1) {
wpa_printf(MSG_ERROR, "OpenSSL: Failed to generate EC key");
key = NULL;
goto fail;
}
fail:
EC_KEY_free(ec_params);
EVP_PKEY_free(params);
EVP_PKEY_CTX_free(kctx);
return (struct crypto_ec_key *) key;
}
void crypto_ec_key_deinit(struct crypto_ec_key *key) void crypto_ec_key_deinit(struct crypto_ec_key *key)
{ {
EVP_PKEY_free((EVP_PKEY *) key); EVP_PKEY_free((EVP_PKEY *) key);