mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments
@ 2014-07-28 13:54 David Howells
  2014-07-28 13:54 ` [PATCH 2/2] PKCS#7: Use x509_request_asymmetric_key() David Howells
  2014-07-29 12:02 ` [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments Mimi Zohar
  0 siblings, 2 replies; 4+ messages in thread
From: David Howells @ 2014-07-28 13:54 UTC (permalink / raw)
  To: d.kasatkin, zohar; +Cc: dhowells, keyrings, linux-kernel

x509_request_asymmetric_keys() doesn't need the lengths of the NUL-terminated
strings passing in as it can work that out for itself.

Signed-off-by: David Howells <dhowells@redhat.com>
---
 crypto/asymmetric_keys/x509_public_key.c |    9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/crypto/asymmetric_keys/x509_public_key.c b/crypto/asymmetric_keys/x509_public_key.c
index a0f7cd196c9b..4ae982234d78 100644
--- a/crypto/asymmetric_keys/x509_public_key.c
+++ b/crypto/asymmetric_keys/x509_public_key.c
@@ -48,11 +48,10 @@ __setup("ca_keys=", ca_keys_setup);
  */
 static struct key *x509_request_asymmetric_key(struct key *keyring,
 					       const char *signer,
-					       size_t signer_len,
-					       const char *authority,
-					       size_t auth_len)
+					       const char *authority)
 {
 	key_ref_t key;
+	size_t signer_len = strlen(signer), auth_len = strlen(authority);
 	char *id;
 
 	/* Construct an identifier. */
@@ -193,9 +192,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))


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] PKCS#7: Use x509_request_asymmetric_key()
  2014-07-28 13:54 [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments David Howells
@ 2014-07-28 13:54 ` David Howells
  2014-07-29 12:03   ` Mimi Zohar
  2014-07-29 12:02 ` [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments Mimi Zohar
  1 sibling, 1 reply; 4+ messages in thread
From: David Howells @ 2014-07-28 13:54 UTC (permalink / raw)
  To: d.kasatkin, zohar; +Cc: dhowells, keyrings, linux-kernel

pkcs7_request_asymmetric_key() and x509_request_asymmetric_key() do the same
thing, the latter being a copy of the former created by the IMA folks, so drop
the PKCS#7 version as the X.509 location is more general.

Whilst we're at it, rename the arguments of x509_request_asymmetric_key() to
better reflect what the values being passed in are intended to match on an
X.509 cert.

Signed-off-by: David Howells <dhowells@redhat.com>
---
 crypto/asymmetric_keys/pkcs7_trust.c     |   61 ++----------------------------
 crypto/asymmetric_keys/x509_public_key.c |   36 ++++++++++--------
 include/crypto/public_key.h              |    4 ++
 3 files changed, 29 insertions(+), 72 deletions(-)

diff --git a/crypto/asymmetric_keys/pkcs7_trust.c b/crypto/asymmetric_keys/pkcs7_trust.c
index b6b045131403..e666eb011a85 100644
--- a/crypto/asymmetric_keys/pkcs7_trust.c
+++ b/crypto/asymmetric_keys/pkcs7_trust.c
@@ -20,55 +20,6 @@
 #include "public_key.h"
 #include "pkcs7_parser.h"
 
-/*
- * Request an asymmetric key.
- */
-static struct key *pkcs7_request_asymmetric_key(
-	struct key *keyring,
-	const char *signer, size_t signer_len,
-	const char *authority, size_t auth_len)
-{
-	key_ref_t key;
-	char *id;
-
-	kenter(",%zu,,%zu", signer_len, auth_len);
-
-	/* Construct an identifier. */
-	id = kmalloc(signer_len + 2 + auth_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;
-
-	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));
-	kfree(id);
-
-	if (IS_ERR(key)) {
-		switch (PTR_ERR(key)) {
-			/* Hide some search errors */
-		case -EACCES:
-		case -ENOTDIR:
-		case -EAGAIN:
-			return ERR_PTR(-ENOKEY);
-		default:
-			return ERR_CAST(key);
-		}
-	}
-
-	pr_devel("<==%s() = 0 [%x]\n", __func__, key_serial(key_ref_to_ptr(key)));
-	return key_ref_to_ptr(key);
-}
-
 /**
  * Check the trust on one PKCS#7 SignedInfo block.
  */
@@ -98,10 +49,8 @@ int pkcs7_validate_trust_one(struct pkcs7_message *pkcs7,
 		/* Look to see if this certificate is present in the trusted
 		 * keys.
 		 */
-		key = pkcs7_request_asymmetric_key(
-			trust_keyring,
-			x509->subject, strlen(x509->subject),
-			x509->fingerprint, strlen(x509->fingerprint));
+		key = x509_request_asymmetric_key(trust_keyring, x509->subject,
+						  x509->fingerprint);
 		if (!IS_ERR(key))
 			/* One of the X.509 certificates in the PKCS#7 message
 			 * is apparently the same as one we already trust.
@@ -133,10 +82,8 @@ int pkcs7_validate_trust_one(struct pkcs7_message *pkcs7,
 		return -ENOKEY;
 	}
 
-	key = pkcs7_request_asymmetric_key(
-		trust_keyring,
-		last->issuer, strlen(last->issuer),
-		last->authority, strlen(last->authority));
+	key = x509_request_asymmetric_key(trust_keyring, last->issuer,
+					  last->authority);
 	if (IS_ERR(key))
 		return PTR_ERR(key) == -ENOMEM ? -ENOMEM : -ENOKEY;
 	x509 = last;
diff --git a/crypto/asymmetric_keys/x509_public_key.c b/crypto/asymmetric_keys/x509_public_key.c
index 4ae982234d78..da1e5fc85346 100644
--- a/crypto/asymmetric_keys/x509_public_key.c
+++ b/crypto/asymmetric_keys/x509_public_key.c
@@ -43,35 +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,
-					       const char *authority)
+struct key *x509_request_asymmetric_key(struct key *keyring,
+					const char *subject,
+					const char *key_id)
 {
 	key_ref_t key;
-	size_t signer_len = strlen(signer), auth_len = strlen(authority);
+	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)) {
diff --git a/include/crypto/public_key.h b/include/crypto/public_key.h
index fc09732613ad..0d164c6af539 100644
--- a/include/crypto/public_key.h
+++ b/include/crypto/public_key.h
@@ -98,4 +98,8 @@ struct key;
 extern int verify_signature(const struct key *key,
 			    const struct public_key_signature *sig);
 
+extern struct key *x509_request_asymmetric_key(struct key *keyring,
+					       const char *issuer,
+					       const char *key_id);
+
 #endif /* _LINUX_PUBLIC_KEY_H */


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments
  2014-07-28 13:54 [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments David Howells
  2014-07-28 13:54 ` [PATCH 2/2] PKCS#7: Use x509_request_asymmetric_key() David Howells
@ 2014-07-29 12:02 ` Mimi Zohar
  1 sibling, 0 replies; 4+ messages in thread
From: Mimi Zohar @ 2014-07-29 12:02 UTC (permalink / raw)
  To: David Howells; +Cc: d.kasatkin, keyrings, linux-kernel

On Mon, 2014-07-28 at 14:54 +0100, David Howells wrote: 
> x509_request_asymmetric_keys() doesn't need the lengths of the NUL-terminated
> strings passing in as it can work that out for itself.
> 
> Signed-off-by: David Howells <dhowells@redhat.com>

Acked-by: Mimi Zohar <zohar@linux.vnet.ibm.com>

> ---
>  crypto/asymmetric_keys/x509_public_key.c |    9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
> 
> diff --git a/crypto/asymmetric_keys/x509_public_key.c b/crypto/asymmetric_keys/x509_public_key.c
> index a0f7cd196c9b..4ae982234d78 100644
> --- a/crypto/asymmetric_keys/x509_public_key.c
> +++ b/crypto/asymmetric_keys/x509_public_key.c
> @@ -48,11 +48,10 @@ __setup("ca_keys=", ca_keys_setup);
>   */
>  static struct key *x509_request_asymmetric_key(struct key *keyring,
>  					       const char *signer,
> -					       size_t signer_len,
> -					       const char *authority,
> -					       size_t auth_len)
> +					       const char *authority)
>  {
>  	key_ref_t key;
> +	size_t signer_len = strlen(signer), auth_len = strlen(authority);
>  	char *id;
> 
>  	/* Construct an identifier. */
> @@ -193,9 +192,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))
> 



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] PKCS#7: Use x509_request_asymmetric_key()
  2014-07-28 13:54 ` [PATCH 2/2] PKCS#7: Use x509_request_asymmetric_key() David Howells
@ 2014-07-29 12:03   ` Mimi Zohar
  0 siblings, 0 replies; 4+ messages in thread
From: Mimi Zohar @ 2014-07-29 12:03 UTC (permalink / raw)
  To: David Howells; +Cc: d.kasatkin, keyrings, linux-kernel

On Mon, 2014-07-28 at 14:54 +0100, David Howells wrote: 
> pkcs7_request_asymmetric_key() and x509_request_asymmetric_key() do the same
> thing, the latter being a copy of the former created by the IMA folks, so drop
> the PKCS#7 version as the X.509 location is more general.
> 
> Whilst we're at it, rename the arguments of x509_request_asymmetric_key() to
> better reflect what the values being passed in are intended to match on an
> X.509 cert.
> 
> Signed-off-by: David Howells <dhowells@redhat.com>

Acked-by: Mimi Zohar <zohar@linux.vnet.ibm.com>

> ---
>  crypto/asymmetric_keys/pkcs7_trust.c     |   61 ++----------------------------
>  crypto/asymmetric_keys/x509_public_key.c |   36 ++++++++++--------
>  include/crypto/public_key.h              |    4 ++
>  3 files changed, 29 insertions(+), 72 deletions(-)
> 
> diff --git a/crypto/asymmetric_keys/pkcs7_trust.c b/crypto/asymmetric_keys/pkcs7_trust.c
> index b6b045131403..e666eb011a85 100644
> --- a/crypto/asymmetric_keys/pkcs7_trust.c
> +++ b/crypto/asymmetric_keys/pkcs7_trust.c
> @@ -20,55 +20,6 @@
>  #include "public_key.h"
>  #include "pkcs7_parser.h"
> 
> -/*
> - * Request an asymmetric key.
> - */
> -static struct key *pkcs7_request_asymmetric_key(
> -	struct key *keyring,
> -	const char *signer, size_t signer_len,
> -	const char *authority, size_t auth_len)
> -{
> -	key_ref_t key;
> -	char *id;
> -
> -	kenter(",%zu,,%zu", signer_len, auth_len);
> -
> -	/* Construct an identifier. */
> -	id = kmalloc(signer_len + 2 + auth_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;
> -
> -	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));
> -	kfree(id);
> -
> -	if (IS_ERR(key)) {
> -		switch (PTR_ERR(key)) {
> -			/* Hide some search errors */
> -		case -EACCES:
> -		case -ENOTDIR:
> -		case -EAGAIN:
> -			return ERR_PTR(-ENOKEY);
> -		default:
> -			return ERR_CAST(key);
> -		}
> -	}
> -
> -	pr_devel("<==%s() = 0 [%x]\n", __func__, key_serial(key_ref_to_ptr(key)));
> -	return key_ref_to_ptr(key);
> -}
> -
>  /**
>   * Check the trust on one PKCS#7 SignedInfo block.
>   */
> @@ -98,10 +49,8 @@ int pkcs7_validate_trust_one(struct pkcs7_message *pkcs7,
>  		/* Look to see if this certificate is present in the trusted
>  		 * keys.
>  		 */
> -		key = pkcs7_request_asymmetric_key(
> -			trust_keyring,
> -			x509->subject, strlen(x509->subject),
> -			x509->fingerprint, strlen(x509->fingerprint));
> +		key = x509_request_asymmetric_key(trust_keyring, x509->subject,
> +						  x509->fingerprint);
>  		if (!IS_ERR(key))
>  			/* One of the X.509 certificates in the PKCS#7 message
>  			 * is apparently the same as one we already trust.
> @@ -133,10 +82,8 @@ int pkcs7_validate_trust_one(struct pkcs7_message *pkcs7,
>  		return -ENOKEY;
>  	}
> 
> -	key = pkcs7_request_asymmetric_key(
> -		trust_keyring,
> -		last->issuer, strlen(last->issuer),
> -		last->authority, strlen(last->authority));
> +	key = x509_request_asymmetric_key(trust_keyring, last->issuer,
> +					  last->authority);
>  	if (IS_ERR(key))
>  		return PTR_ERR(key) == -ENOMEM ? -ENOMEM : -ENOKEY;
>  	x509 = last;
> diff --git a/crypto/asymmetric_keys/x509_public_key.c b/crypto/asymmetric_keys/x509_public_key.c
> index 4ae982234d78..da1e5fc85346 100644
> --- a/crypto/asymmetric_keys/x509_public_key.c
> +++ b/crypto/asymmetric_keys/x509_public_key.c
> @@ -43,35 +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,
> -					       const char *authority)
> +struct key *x509_request_asymmetric_key(struct key *keyring,
> +					const char *subject,
> +					const char *key_id)
>  {
>  	key_ref_t key;
> -	size_t signer_len = strlen(signer), auth_len = strlen(authority);
> +	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)) {
> diff --git a/include/crypto/public_key.h b/include/crypto/public_key.h
> index fc09732613ad..0d164c6af539 100644
> --- a/include/crypto/public_key.h
> +++ b/include/crypto/public_key.h
> @@ -98,4 +98,8 @@ struct key;
>  extern int verify_signature(const struct key *key,
>  			    const struct public_key_signature *sig);
> 
> +extern struct key *x509_request_asymmetric_key(struct key *keyring,
> +					       const char *issuer,
> +					       const char *key_id);
> +
>  #endif /* _LINUX_PUBLIC_KEY_H */
> 



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-07-29 12:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-28 13:54 [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments David Howells
2014-07-28 13:54 ` [PATCH 2/2] PKCS#7: Use x509_request_asymmetric_key() David Howells
2014-07-29 12:03   ` Mimi Zohar
2014-07-29 12:02 ` [PATCH 1/2] X.509: x509_request_asymmetric_keys() doesn't need string length arguments Mimi Zohar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®