size_t dstlen) {
EVP_PKEY *pkey = key->keydata.pkeypair.pub;
const EC_KEY *eckey = EVP_PKEY_get0_EC_KEY(pkey);
- const EC_GROUP *group = EC_KEY_get0_group(eckey);
- const EC_POINT *pub = EC_KEY_get0_public_key(eckey);
+ const EC_GROUP *group = (eckey == NULL) ? NULL
+ : EC_KEY_get0_group(eckey);
+ const EC_POINT *pub = (eckey == NULL) ? NULL
+ : EC_KEY_get0_public_key(eckey);
unsigned char buf[MAX_PUBKEY_SIZE + 1];
size_t len;
+ if (group == NULL || pub == NULL) {
+ return (false);
+ }
+
len = EC_POINT_point2oct(group, pub, POINT_CONVERSION_UNCOMPRESSED, buf,
sizeof(buf), NULL);
if (len == dstlen + 1) {
static isc_result_t
opensslecdsa_validate_pkey_group(unsigned int key_alg, EVP_PKEY *pkey) {
const EC_KEY *eckey = EVP_PKEY_get0_EC_KEY(pkey);
- int group_nid = opensslecdsa_key_alg_to_group_nid(key_alg);
+ int group_nid;
+
+ if (eckey == NULL) {
+ return (dst__openssl_toresult(DST_R_INVALIDPRIVATEKEY));
+ }
+
+ group_nid = opensslecdsa_key_alg_to_group_nid(key_alg);
if (EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey)) != group_nid) {
return (DST_R_INVALIDPRIVATEKEY);
eckey = EVP_PKEY_get0_EC_KEY(key->keydata.pkeypair.priv);
if (eckey == NULL) {
+ ERR_clear_error();
return (false);
}
DST_RET(ISC_R_NOSPACE);
}
if (!opensslecdsa_extract_public_key(key, r.base, keysize)) {
- DST_RET(DST_R_OPENSSLFAILURE);
+ DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
}
isc_buffer_add(data, keysize);