|
@@ -43,36 +43,41 @@ static int __init ca_keys_setup(char *str)
|
|
|
__setup("ca_keys=", ca_keys_setup);
|
|
|
#endif
|
|
|
|
|
|
-/*
|
|
|
- * Find a key in the given keyring by issuer and authority.
|
|
|
+/**
|
|
|
+ * x509_request_asymmetric_key - Request a key by X.509 certificate params.
|
|
|
+ * @keyring: The keys to search.
|
|
|
+ * @subject: The name of the subject to whom the key belongs.
|
|
|
+ * @key_id: The subject key ID as a hex string.
|
|
|
+ *
|
|
|
+ * Find a key in the given keyring by subject name and key ID. These might,
|
|
|
+ * for instance, be the issuer name and the authority key ID of an X.509
|
|
|
+ * certificate that needs to be verified.
|
|
|
*/
|
|
|
-static struct key *x509_request_asymmetric_key(struct key *keyring,
|
|
|
- const char *signer,
|
|
|
- size_t signer_len,
|
|
|
- const char *authority,
|
|
|
- size_t auth_len)
|
|
|
+struct key *x509_request_asymmetric_key(struct key *keyring,
|
|
|
+ const char *subject,
|
|
|
+ const char *key_id)
|
|
|
{
|
|
|
key_ref_t key;
|
|
|
+ size_t subject_len = strlen(subject), key_id_len = strlen(key_id);
|
|
|
char *id;
|
|
|
|
|
|
- /* Construct an identifier. */
|
|
|
- id = kmalloc(signer_len + 2 + auth_len + 1, GFP_KERNEL);
|
|
|
+ /* Construct an identifier "<subjname>:<keyid>". */
|
|
|
+ id = kmalloc(subject_len + 2 + key_id_len + 1, GFP_KERNEL);
|
|
|
if (!id)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- memcpy(id, signer, signer_len);
|
|
|
- id[signer_len + 0] = ':';
|
|
|
- id[signer_len + 1] = ' ';
|
|
|
- memcpy(id + signer_len + 2, authority, auth_len);
|
|
|
- id[signer_len + 2 + auth_len] = 0;
|
|
|
+ memcpy(id, subject, subject_len);
|
|
|
+ id[subject_len + 0] = ':';
|
|
|
+ id[subject_len + 1] = ' ';
|
|
|
+ memcpy(id + subject_len + 2, key_id, key_id_len);
|
|
|
+ id[subject_len + 2 + key_id_len] = 0;
|
|
|
|
|
|
pr_debug("Look up: \"%s\"\n", id);
|
|
|
|
|
|
key = keyring_search(make_key_ref(keyring, 1),
|
|
|
&key_type_asymmetric, id);
|
|
|
if (IS_ERR(key))
|
|
|
- pr_debug("Request for module key '%s' err %ld\n",
|
|
|
- id, PTR_ERR(key));
|
|
|
+ pr_debug("Request for key '%s' err %ld\n", id, PTR_ERR(key));
|
|
|
kfree(id);
|
|
|
|
|
|
if (IS_ERR(key)) {
|
|
@@ -91,6 +96,7 @@ static struct key *x509_request_asymmetric_key(struct key *keyring,
|
|
|
key_serial(key_ref_to_ptr(key)));
|
|
|
return key_ref_to_ptr(key);
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(x509_request_asymmetric_key);
|
|
|
|
|
|
/*
|
|
|
* Set up the signature parameters in an X.509 certificate. This involves
|
|
@@ -193,9 +199,7 @@ static int x509_validate_trust(struct x509_certificate *cert,
|
|
|
return -EPERM;
|
|
|
|
|
|
key = x509_request_asymmetric_key(trust_keyring,
|
|
|
- cert->issuer, strlen(cert->issuer),
|
|
|
- cert->authority,
|
|
|
- strlen(cert->authority));
|
|
|
+ cert->issuer, cert->authority);
|
|
|
if (!IS_ERR(key)) {
|
|
|
if (!use_builtin_keys
|
|
|
|| test_bit(KEY_FLAG_BUILTIN, &key->flags))
|