summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Kasatkin <d.kasatkin@samsung.com>2014-06-17 04:56:58 -0400
committerMimi Zohar <zohar@linux.vnet.ibm.com>2014-07-17 09:35:16 -0400
commitffb70f61bab1482a3bd0f85fd8f1e9c9909df2ca (patch)
treef25c90a65af6441434dd70dcaacb7d204b6ea00b
parentb3426827c848d252ed4ca5f4d3085551be083e12 (diff)
KEYS: validate certificate trust only with selected key
Instead of allowing public keys, with certificates signed by any key on the system trusted keyring, to be added to a trusted keyring, this patch further restricts the certificates to those signed by a particular key on the system keyring. This patch defines a new kernel parameter 'ca_keys' to identify the specific key which must be used for trust validation of certificates. Simplified Mimi's "KEYS: define an owner trusted keyring" patch. Changelog: - support for builtin x509 public keys only - export "asymmetric_keyid_match" - remove ifndefs MODULE - rename kernel boot parameter from keys_ownerid to ca_keys Signed-off-by: Dmitry Kasatkin <d.kasatkin@samsung.com> Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
-rw-r--r--Documentation/kernel-parameters.txt5
-rw-r--r--crypto/asymmetric_keys/asymmetric_type.c1
-rw-r--r--crypto/asymmetric_keys/x509_public_key.c19
3 files changed, 25 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 8b2ab548b6e4..bdb193afe176 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -566,6 +566,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
566 possible to determine what the correct size should be. 566 possible to determine what the correct size should be.
567 This option provides an override for these situations. 567 This option provides an override for these situations.
568 568
569 ca_keys= [KEYS] This parameter identifies a specific key(s) on
570 the system trusted keyring to be used for certificate
571 trust validation.
572 format: id:<keyid>
573
569 ccw_timeout_log [S390] 574 ccw_timeout_log [S390]
570 See Documentation/s390/CommonIO for details. 575 See Documentation/s390/CommonIO for details.
571 576
diff --git a/crypto/asymmetric_keys/asymmetric_type.c b/crypto/asymmetric_keys/asymmetric_type.c
index 1fd1d304a15a..c948df5c4ecd 100644
--- a/crypto/asymmetric_keys/asymmetric_type.c
+++ b/crypto/asymmetric_keys/asymmetric_type.c
@@ -49,6 +49,7 @@ int asymmetric_keyid_match(const char *kid, const char *id)
49 49
50 return 1; 50 return 1;
51} 51}
52EXPORT_SYMBOL_GPL(asymmetric_keyid_match);
52 53
53/* 54/*
54 * Match asymmetric keys on (part of) their name 55 * Match asymmetric keys on (part of) their name
diff --git a/crypto/asymmetric_keys/x509_public_key.c b/crypto/asymmetric_keys/x509_public_key.c
index 436fbd8552fc..d376195e1d08 100644
--- a/crypto/asymmetric_keys/x509_public_key.c
+++ b/crypto/asymmetric_keys/x509_public_key.c
@@ -24,6 +24,22 @@
24#include "public_key.h" 24#include "public_key.h"
25#include "x509_parser.h" 25#include "x509_parser.h"
26 26
27static char *ca_keyid;
28
29#ifndef MODULE
30static int __init ca_keys_setup(char *str)
31{
32 if (!str) /* default system keyring */
33 return 1;
34
35 if (strncmp(str, "id:", 3) == 0)
36 ca_keyid = str; /* owner key 'id:xxxxxx' */
37
38 return 1;
39}
40__setup("ca_keys=", ca_keys_setup);
41#endif
42
27/* 43/*
28 * Find a key in the given keyring by issuer and authority. 44 * Find a key in the given keyring by issuer and authority.
29 */ 45 */
@@ -171,6 +187,9 @@ static int x509_validate_trust(struct x509_certificate *cert,
171 if (!trust_keyring) 187 if (!trust_keyring)
172 return -EOPNOTSUPP; 188 return -EOPNOTSUPP;
173 189
190 if (ca_keyid && !asymmetric_keyid_match(cert->authority, ca_keyid))
191 return -EPERM;
192
174 key = x509_request_asymmetric_key(trust_keyring, 193 key = x509_request_asymmetric_key(trust_keyring,
175 cert->issuer, strlen(cert->issuer), 194 cert->issuer, strlen(cert->issuer),
176 cert->authority, 195 cert->authority,