diff options
| -rw-r--r-- | Documentation/kernel-parameters.txt | 5 | ||||
| -rw-r--r-- | crypto/asymmetric_keys/asymmetric_keys.h | 2 | ||||
| -rw-r--r-- | crypto/asymmetric_keys/asymmetric_type.c | 51 | ||||
| -rw-r--r-- | crypto/asymmetric_keys/x509_public_key.c | 109 | ||||
| -rw-r--r-- | include/keys/system_keyring.h | 10 | ||||
| -rw-r--r-- | include/linux/key.h | 1 | ||||
| -rw-r--r-- | kernel/system_keyring.c | 1 | ||||
| -rw-r--r-- | security/integrity/digsig.c | 28 | ||||
| -rw-r--r-- | security/integrity/ima/Kconfig | 10 | ||||
| -rw-r--r-- | security/integrity/ima/ima.h | 12 | ||||
| -rw-r--r-- | security/integrity/ima/ima_main.c | 10 | ||||
| -rw-r--r-- | security/integrity/integrity.h | 5 | ||||
| -rw-r--r-- | security/keys/keyctl.c | 6 |
13 files changed, 225 insertions, 25 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 8b2ab548b6e4..90c12c591168 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> | builtin } | ||
| 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_keys.h b/crypto/asymmetric_keys/asymmetric_keys.h index 515b63430812..a63c551c6557 100644 --- a/crypto/asymmetric_keys/asymmetric_keys.h +++ b/crypto/asymmetric_keys/asymmetric_keys.h | |||
| @@ -9,6 +9,8 @@ | |||
| 9 | * 2 of the Licence, or (at your option) any later version. | 9 | * 2 of the Licence, or (at your option) any later version. |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | int asymmetric_keyid_match(const char *kid, const char *id); | ||
| 13 | |||
| 12 | static inline const char *asymmetric_key_id(const struct key *key) | 14 | static inline const char *asymmetric_key_id(const struct key *key) |
| 13 | { | 15 | { |
| 14 | return key->type_data.p[1]; | 16 | return key->type_data.p[1]; |
diff --git a/crypto/asymmetric_keys/asymmetric_type.c b/crypto/asymmetric_keys/asymmetric_type.c index 21960a4e74e8..eb8cd46961a5 100644 --- a/crypto/asymmetric_keys/asymmetric_type.c +++ b/crypto/asymmetric_keys/asymmetric_type.c | |||
| @@ -23,6 +23,35 @@ static LIST_HEAD(asymmetric_key_parsers); | |||
| 23 | static DECLARE_RWSEM(asymmetric_key_parsers_sem); | 23 | static DECLARE_RWSEM(asymmetric_key_parsers_sem); |
| 24 | 24 | ||
| 25 | /* | 25 | /* |
| 26 | * Match asymmetric key id with partial match | ||
| 27 | * @id: key id to match in a form "id:<id>" | ||
| 28 | */ | ||
| 29 | int asymmetric_keyid_match(const char *kid, const char *id) | ||
| 30 | { | ||
| 31 | size_t idlen, kidlen; | ||
| 32 | |||
| 33 | if (!kid || !id) | ||
| 34 | return 0; | ||
| 35 | |||
| 36 | /* make it possible to use id as in the request: "id:<id>" */ | ||
| 37 | if (strncmp(id, "id:", 3) == 0) | ||
| 38 | id += 3; | ||
| 39 | |||
| 40 | /* Anything after here requires a partial match on the ID string */ | ||
| 41 | idlen = strlen(id); | ||
| 42 | kidlen = strlen(kid); | ||
| 43 | if (idlen > kidlen) | ||
| 44 | return 0; | ||
| 45 | |||
| 46 | kid += kidlen - idlen; | ||
| 47 | if (strcasecmp(id, kid) != 0) | ||
| 48 | return 0; | ||
| 49 | |||
| 50 | return 1; | ||
| 51 | } | ||
| 52 | EXPORT_SYMBOL_GPL(asymmetric_keyid_match); | ||
| 53 | |||
| 54 | /* | ||
| 26 | * Match asymmetric keys on (part of) their name | 55 | * Match asymmetric keys on (part of) their name |
| 27 | * We have some shorthand methods for matching keys. We allow: | 56 | * We have some shorthand methods for matching keys. We allow: |
| 28 | * | 57 | * |
| @@ -34,9 +63,8 @@ static int asymmetric_key_match(const struct key *key, const void *description) | |||
| 34 | { | 63 | { |
| 35 | const struct asymmetric_key_subtype *subtype = asymmetric_key_subtype(key); | 64 | const struct asymmetric_key_subtype *subtype = asymmetric_key_subtype(key); |
| 36 | const char *spec = description; | 65 | const char *spec = description; |
| 37 | const char *id, *kid; | 66 | const char *id; |
| 38 | ptrdiff_t speclen; | 67 | ptrdiff_t speclen; |
| 39 | size_t idlen, kidlen; | ||
| 40 | 68 | ||
| 41 | if (!subtype || !spec || !*spec) | 69 | if (!subtype || !spec || !*spec) |
| 42 | return 0; | 70 | return 0; |
| @@ -55,23 +83,8 @@ static int asymmetric_key_match(const struct key *key, const void *description) | |||
| 55 | speclen = id - spec; | 83 | speclen = id - spec; |
| 56 | id++; | 84 | id++; |
| 57 | 85 | ||
| 58 | /* Anything after here requires a partial match on the ID string */ | 86 | if (speclen == 2 && memcmp(spec, "id", 2) == 0) |
| 59 | kid = asymmetric_key_id(key); | 87 | return asymmetric_keyid_match(asymmetric_key_id(key), id); |
| 60 | if (!kid) | ||
| 61 | return 0; | ||
| 62 | |||
| 63 | idlen = strlen(id); | ||
| 64 | kidlen = strlen(kid); | ||
| 65 | if (idlen > kidlen) | ||
| 66 | return 0; | ||
| 67 | |||
| 68 | kid += kidlen - idlen; | ||
| 69 | if (strcasecmp(id, kid) != 0) | ||
| 70 | return 0; | ||
| 71 | |||
| 72 | if (speclen == 2 && | ||
| 73 | memcmp(spec, "id", 2) == 0) | ||
| 74 | return 1; | ||
| 75 | 88 | ||
| 76 | if (speclen == subtype->name_len && | 89 | if (speclen == subtype->name_len && |
| 77 | memcmp(spec, subtype->name, speclen) == 0) | 90 | memcmp(spec, subtype->name, speclen) == 0) |
diff --git a/crypto/asymmetric_keys/x509_public_key.c b/crypto/asymmetric_keys/x509_public_key.c index 3fc8a0634ed7..a0f7cd196c9b 100644 --- a/crypto/asymmetric_keys/x509_public_key.c +++ b/crypto/asymmetric_keys/x509_public_key.c | |||
| @@ -18,11 +18,80 @@ | |||
| 18 | #include <linux/asn1_decoder.h> | 18 | #include <linux/asn1_decoder.h> |
| 19 | #include <keys/asymmetric-subtype.h> | 19 | #include <keys/asymmetric-subtype.h> |
| 20 | #include <keys/asymmetric-parser.h> | 20 | #include <keys/asymmetric-parser.h> |
| 21 | #include <keys/system_keyring.h> | ||
| 21 | #include <crypto/hash.h> | 22 | #include <crypto/hash.h> |
| 22 | #include "asymmetric_keys.h" | 23 | #include "asymmetric_keys.h" |
| 23 | #include "public_key.h" | 24 | #include "public_key.h" |
| 24 | #include "x509_parser.h" | 25 | #include "x509_parser.h" |
| 25 | 26 | ||
| 27 | static bool use_builtin_keys; | ||
| 28 | static char *ca_keyid; | ||
| 29 | |||
| 30 | #ifndef MODULE | ||
| 31 | static int __init ca_keys_setup(char *str) | ||
| 32 | { | ||
| 33 | if (!str) /* default system keyring */ | ||
| 34 | return 1; | ||
| 35 | |||
| 36 | if (strncmp(str, "id:", 3) == 0) | ||
| 37 | ca_keyid = str; /* owner key 'id:xxxxxx' */ | ||
| 38 | else if (strcmp(str, "builtin") == 0) | ||
| 39 | use_builtin_keys = true; | ||
| 40 | |||
| 41 | return 1; | ||
| 42 | } | ||
| 43 | __setup("ca_keys=", ca_keys_setup); | ||
| 44 | #endif | ||
| 45 | |||
| 46 | /* | ||
| 47 | * Find a key in the given keyring by issuer and authority. | ||
| 48 | */ | ||
| 49 | static struct key *x509_request_asymmetric_key(struct key *keyring, | ||
| 50 | const char *signer, | ||
| 51 | size_t signer_len, | ||
| 52 | const char *authority, | ||
| 53 | size_t auth_len) | ||
| 54 | { | ||
| 55 | key_ref_t key; | ||
| 56 | char *id; | ||
| 57 | |||
| 58 | /* Construct an identifier. */ | ||
| 59 | id = kmalloc(signer_len + 2 + auth_len + 1, GFP_KERNEL); | ||
| 60 | if (!id) | ||
| 61 | return ERR_PTR(-ENOMEM); | ||
| 62 | |||
| 63 | memcpy(id, signer, signer_len); | ||
| 64 | id[signer_len + 0] = ':'; | ||
| 65 | id[signer_len + 1] = ' '; | ||
| 66 | memcpy(id + signer_len + 2, authority, auth_len); | ||
| 67 | id[signer_len + 2 + auth_len] = 0; | ||
| 68 | |||
| 69 | pr_debug("Look up: \"%s\"\n", id); | ||
| 70 | |||
| 71 | key = keyring_search(make_key_ref(keyring, 1), | ||
| 72 | &key_type_asymmetric, id); | ||
| 73 | |||
