upstream: cleanup PKCS#11 ECDSA pubkey loading: the returned
object should never have a DER header work by markus; feedback and ok djm@ OpenBSD-Commit-ID: b617fa585eddbbf0b1245b58b7a3c4b8d613db17
This commit is contained in:
parent
749aef3032
commit
24757c1ae3
24
ssh-pkcs11.c
24
ssh-pkcs11.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ssh-pkcs11.c,v 1.29 2019/01/20 23:00:12 djm Exp $ */
|
/* $OpenBSD: ssh-pkcs11.c,v 1.30 2019/01/20 23:01:59 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2010 Markus Friedl. All rights reserved.
|
* Copyright (c) 2010 Markus Friedl. All rights reserved.
|
||||||
* Copyright (c) 2014 Pedro Martelletto. All rights reserved.
|
* Copyright (c) 2014 Pedro Martelletto. All rights reserved.
|
||||||
|
@ -576,6 +576,7 @@ pkcs11_fetch_ecdsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx,
|
||||||
CK_SESSION_HANDLE session;
|
CK_SESSION_HANDLE session;
|
||||||
CK_FUNCTION_LIST *f = NULL;
|
CK_FUNCTION_LIST *f = NULL;
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
|
ASN1_OCTET_STRING *octet = NULL;
|
||||||
EC_KEY *ec = NULL;
|
EC_KEY *ec = NULL;
|
||||||
EC_GROUP *group = NULL;
|
EC_GROUP *group = NULL;
|
||||||
struct sshkey *key = NULL;
|
struct sshkey *key = NULL;
|
||||||
|
@ -644,15 +645,16 @@ pkcs11_fetch_ecdsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
attrp = (const unsigned char *)key_attr[1].pValue;
|
attrp = key_attr[1].pValue;
|
||||||
if (o2i_ECPublicKey(&ec, &attrp, key_attr[1].ulValueLen) == NULL) {
|
octet = d2i_ASN1_OCTET_STRING(NULL, &attrp, key_attr[1].ulValueLen);
|
||||||
/* try to skip DER header (octet string type and length byte) */
|
if (octet == NULL) {
|
||||||
attrp = (const unsigned char *)key_attr[1].pValue + 2;
|
ossl_error("d2i_ASN1_OCTET_STRING failed");
|
||||||
if (o2i_ECPublicKey(&ec, &attrp, key_attr[1].ulValueLen - 2)
|
goto fail;
|
||||||
== NULL) {
|
}
|
||||||
ossl_error("o2i_ECPublicKey failed");
|
attrp = octet->data;
|
||||||
goto fail;
|
if (o2i_ECPublicKey(&ec, &attrp, octet->length) == NULL) {
|
||||||
}
|
ossl_error("o2i_ECPublicKey failed");
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
nid = sshkey_ecdsa_key_to_nid(ec);
|
nid = sshkey_ecdsa_key_to_nid(ec);
|
||||||
|
@ -683,6 +685,8 @@ fail:
|
||||||
EC_KEY_free(ec);
|
EC_KEY_free(ec);
|
||||||
if (group)
|
if (group)
|
||||||
EC_GROUP_free(group);
|
EC_GROUP_free(group);
|
||||||
|
if (octet)
|
||||||
|
ASN1_OCTET_STRING_free(octet);
|
||||||
|
|
||||||
return (key);
|
return (key);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue