aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,