Skip to content

Commit

Permalink
KEYS: Add a lookup_restriction function for the asymmetric key type
Browse files Browse the repository at this point in the history
Look up asymmetric keyring restriction information using the key-type
lookup_restrict hook.

Signed-off-by: Mat Martineau <[email protected]>
  • Loading branch information
mjmartineau committed Apr 4, 2017
1 parent 6563c91 commit 97d3aa0
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 8 deletions.
35 changes: 35 additions & 0 deletions Documentation/crypto/asymmetric-keys.txt
Original file line number Diff line number Diff line change
Expand Up @@ -311,3 +311,38 @@ Functions are provided to register and unregister parsers:

Parsers may not have the same name. The names are otherwise only used for
displaying in debugging messages.


=========================
KEYRING LINK RESTRICTIONS
=========================

Keyrings created from userspace using add_key can be configured to check the
signature of the key being linked.

Several restriction methods are available:

(1) Restrict using the kernel builtin trusted keyring

- Option string used with KEYCTL_RESTRICT_KEYRING:
- "builtin_trusted"

The kernel builtin trusted keyring will be searched for the signing
key. The ca_keys kernel parameter also affects which keys are used for
signature verification.

(2) Restrict using the kernel builtin and secondary trusted keyrings

- Option string used with KEYCTL_RESTRICT_KEYRING:
- "builtin_and_secondary_trusted"

The kernel builtin and secondary trusted keyrings will be searched for the
signing key. The ca_keys kernel parameter also affects which keys are used
for signature verification.

In all of these cases, if the signing key is found the signature of the key to
be linked will be verified using the signing key. The requested key is added
to the keyring only if the signature is successfully verified. -ENOKEY is
returned if the parent certificate could not be found, or -EKEYREJECTED is
returned if the signature check fails or the key is blacklisted. Other errors
may be returned if the signature check could not be performed.
52 changes: 44 additions & 8 deletions crypto/asymmetric_keys/asymmetric_type.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/ctype.h>
#include <keys/system_keyring.h>
#include "asymmetric_keys.h"

MODULE_LICENSE("GPL");
Expand Down Expand Up @@ -451,15 +452,50 @@ static void asymmetric_key_destroy(struct key *key)
asymmetric_key_free_kids(kids);
}

static struct key_restriction *asymmetric_restriction_alloc(
key_restrict_link_func_t check,
struct key *key)
{
struct key_restriction *keyres =
kzalloc(sizeof(struct key_restriction), GFP_KERNEL);

if (!keyres)
return ERR_PTR(-ENOMEM);

keyres->check = check;
keyres->key = key;
keyres->keytype = &key_type_asymmetric;

return keyres;
}

/*
* look up keyring restrict functions for asymmetric keys
*/
static struct key_restriction *asymmetric_lookup_restriction(
const char *restriction)
{
if (strcmp("builtin_trusted", restriction) == 0)
return asymmetric_restriction_alloc(
restrict_link_by_builtin_trusted, NULL);

if (strcmp("builtin_and_secondary_trusted", restriction) == 0)
return asymmetric_restriction_alloc(
restrict_link_by_builtin_and_secondary_trusted, NULL);

return ERR_PTR(-EINVAL);
}

struct key_type key_type_asymmetric = {
.name = "asymmetric",
.preparse = asymmetric_key_preparse,
.free_preparse = asymmetric_key_free_preparse,
.instantiate = generic_key_instantiate,
.match_preparse = asymmetric_key_match_preparse,
.match_free = asymmetric_key_match_free,
.destroy = asymmetric_key_destroy,
.describe = asymmetric_key_describe,
.name = "asymmetric",
.preparse = asymmetric_key_preparse,
.free_preparse = asymmetric_key_free_preparse,
.instantiate = generic_key_instantiate,
.match_preparse = asymmetric_key_match_preparse,
.match_free = asymmetric_key_match_free,
.destroy = asymmetric_key_destroy,
.describe = asymmetric_key_describe,
.lookup_restriction = asymmetric_lookup_restriction,
};
EXPORT_SYMBOL_GPL(key_type_asymmetric);

Expand Down

0 comments on commit 97d3aa0

Please sign in to comment.