diff options
author | David Howells <dhowells@redhat.com> | 2014-09-16 12:36:13 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2014-09-16 12:36:13 -0400 |
commit | 46963b774d441c833afc1535f6d84b3df2a94204 (patch) | |
tree | 335cbd163ef2581b72d462f49984a6809609a58b /crypto/asymmetric_keys/pkcs7_trust.c | |
parent | 7901c1a8effbe5f89673bfc09d6e37b8f334f1a7 (diff) |
KEYS: Overhaul key identification when searching for asymmetric keys
Make use of the new match string preparsing to overhaul key identification
when searching for asymmetric keys. The following changes are made:
(1) Use the previously created asymmetric_key_id struct to hold the following
key IDs derived from the X.509 certificate or PKCS#7 message:
id: serial number + issuer
skid: subjKeyId + subject
authority: authKeyId + issuer
(2) Replace the hex fingerprint attached to key->type_data[1] with an
asymmetric_key_ids struct containing the id and the skid (if present).
(3) Make the asymmetric_type match data preparse select one of two searches:
(a) An iterative search for the key ID given if prefixed with "id:". The
prefix is expected to be followed by a hex string giving the ID to
search for. The criterion key ID is checked against all key IDs
recorded on the key.
(b) A direct search if the key ID is not prefixed with "id:". This will
look for an exact match on the key description.
(4) Make x509_request_asymmetric_key() take a key ID. This is then converted
into "id:<hex>" and passed into keyring_search() where match preparsing
will turn it back into a binary ID.
(5) X.509 certificate verification then takes the authority key ID and looks
up a key that matches it to find the public key for the certificate
signature.
(6) PKCS#7 certificate verification then takes the id key ID and looks up a
key that matches it to find the public key for the signed information
block signature.
Additional changes:
(1) Multiple subjKeyId and authKeyId values on an X.509 certificate cause the
cert to be rejected with -EBADMSG.
(2) The 'fingerprint' ID is gone. This was primarily intended to convey PGP
public key fingerprints. If PGP is supported in future, this should
generate a key ID that carries the fingerprint.
(3) Th ca_keyid= kernel command line option is now converted to a key ID and
used to match the authority key ID. Possibly this should only match the
actual authKeyId part and not the issuer as well.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Diffstat (limited to 'crypto/asymmetric_keys/pkcs7_trust.c')
-rw-r--r-- | crypto/asymmetric_keys/pkcs7_trust.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/crypto/asymmetric_keys/pkcs7_trust.c b/crypto/asymmetric_keys/pkcs7_trust.c index fad888ea4fad..09197e50fa82 100644 --- a/crypto/asymmetric_keys/pkcs7_trust.c +++ b/crypto/asymmetric_keys/pkcs7_trust.c | |||
@@ -49,8 +49,7 @@ static int pkcs7_validate_trust_one(struct pkcs7_message *pkcs7, | |||
49 | /* Look to see if this certificate is present in the trusted | 49 | /* Look to see if this certificate is present in the trusted |
50 | * keys. | 50 | * keys. |
51 | */ | 51 | */ |
52 | key = x509_request_asymmetric_key(trust_keyring, x509->subject, | 52 | key = x509_request_asymmetric_key(trust_keyring, x509->id); |
53 | x509->fingerprint); | ||
54 | if (!IS_ERR(key)) | 53 | if (!IS_ERR(key)) |
55 | /* One of the X.509 certificates in the PKCS#7 message | 54 | /* One of the X.509 certificates in the PKCS#7 message |
56 | * is apparently the same as one we already trust. | 55 | * is apparently the same as one we already trust. |
@@ -82,8 +81,7 @@ static int pkcs7_validate_trust_one(struct pkcs7_message *pkcs7, | |||
82 | return -ENOKEY; | 81 | return -ENOKEY; |
83 | } | 82 | } |
84 | 83 | ||
85 | key = x509_request_asymmetric_key(trust_keyring, last->issuer, | 84 | key = x509_request_asymmetric_key(trust_keyring, last->authority); |
86 | last->authority); | ||
87 | if (IS_ERR(key)) | 85 | if (IS_ERR(key)) |
88 | return PTR_ERR(key) == -ENOMEM ? -ENOMEM : -ENOKEY; | 86 | return PTR_ERR(key) == -ENOMEM ? -ENOMEM : -ENOKEY; |
89 | x509 = last; | 87 | x509 = last; |