mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
STORE: Make try_decode_PrivateKey() ENGINE aware
This function only considered the built-in and application EVP_PKEY_ASN1_METHODs, and is now amended with a loop that goes through all loaded engines, using whatever table of methods they each have. Fixes #11861 Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com> Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org> (Merged from https://github.com/openssl/openssl/pull/11872)
This commit is contained in:
parent
e637d47c91
commit
b84439b06a
@ -450,6 +450,43 @@ static OSSL_STORE_INFO *try_decode_PrivateKey(const char *pem_name,
|
||||
}
|
||||
} else {
|
||||
int i;
|
||||
#ifndef OPENSSL_NO_ENGINE
|
||||
ENGINE *curengine = ENGINE_get_first();
|
||||
|
||||
while (curengine != NULL) {
|
||||
ENGINE_PKEY_ASN1_METHS_PTR asn1meths =
|
||||
ENGINE_get_pkey_asn1_meths(curengine);
|
||||
|
||||
if (asn1meths != NULL) {
|
||||
const int *nids = NULL;
|
||||
int nids_n = asn1meths(curengine, NULL, &nids, 0);
|
||||
|
||||
for (i = 0; i < nids_n; i++) {
|
||||
EVP_PKEY_ASN1_METHOD *ameth2 = NULL;
|
||||
EVP_PKEY *tmp_pkey = NULL;
|
||||
const unsigned char *tmp_blob = blob;
|
||||
|
||||
if (!asn1meths(curengine, &ameth2, NULL, nids[i]))
|
||||
continue;
|
||||
if (ameth2 == NULL
|
||||
|| ameth2->pkey_flags & ASN1_PKEY_ALIAS)
|
||||
continue;
|
||||
|
||||
tmp_pkey =
|
||||
d2i_PrivateKey_ex(ameth2->pkey_id, NULL,
|
||||
&tmp_blob, len, libctx, propq);
|
||||
if (tmp_pkey != NULL) {
|
||||
if (pkey != NULL)
|
||||
EVP_PKEY_free(tmp_pkey);
|
||||
else
|
||||
pkey = tmp_pkey;
|
||||
(*matchcount)++;
|
||||
}
|
||||
}
|
||||
}
|
||||
curengine = ENGINE_get_next(curengine);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) {
|
||||
EVP_PKEY *tmp_pkey = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user