Skip to content

Commit

Permalink
KEYS: Add a key type op to permit the key description to be vetted
Browse files Browse the repository at this point in the history
Add a key type operation to permit the key type to vet the description of a new
key that key_alloc() is about to allocate.  The operation may reject the
description if it wishes with an error of its choosing.  If it does this, the
key will not be allocated.

Signed-off-by: David Howells <[email protected]>
Reviewed-by: Mimi Zohar <[email protected]>
Signed-off-by: James Morris <[email protected]>
  • Loading branch information
dhowells authored and James Morris committed Mar 8, 2011
1 parent 633e804 commit b9fffa3
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Documentation/keys.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,13 @@ The structure has a number of fields, some of which are mandatory:
viable.


(*) int (*vet_description)(const char *description);

This optional method is called to vet a key description. If the key type
doesn't approve of the key description, it may return an error, otherwise
it should return 0.


(*) int (*instantiate)(struct key *key, const void *data, size_t datalen);

This method is called to attach a payload to a key during construction.
Expand Down
3 changes: 3 additions & 0 deletions include/linux/key-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ struct key_type {
*/
size_t def_datalen;

/* vet a description */
int (*vet_description)(const char *description);

/* instantiate a key of this type
* - this method should call key_payload_reserve() to determine if the
* user's quota will hold the payload
Expand Down
19 changes: 19 additions & 0 deletions net/rxrpc/ar-key.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <keys/user-type.h>
#include "ar-internal.h"

static int rxrpc_vet_description_s(const char *);
static int rxrpc_instantiate(struct key *, const void *, size_t);
static int rxrpc_instantiate_s(struct key *, const void *, size_t);
static void rxrpc_destroy(struct key *);
Expand Down Expand Up @@ -52,12 +53,30 @@ EXPORT_SYMBOL(key_type_rxrpc);
*/
struct key_type key_type_rxrpc_s = {
.name = "rxrpc_s",
.vet_description = rxrpc_vet_description_s,
.instantiate = rxrpc_instantiate_s,
.match = user_match,
.destroy = rxrpc_destroy_s,
.describe = rxrpc_describe,
};

/*
* Vet the description for an RxRPC server key
*/
static int rxrpc_vet_description_s(const char *desc)
{
unsigned long num;
char *p;

num = simple_strtoul(desc, &p, 10);
if (*p != ':' || num > 65535)
return -EINVAL;
num = simple_strtoul(p + 1, &p, 10);
if (*p || num < 1 || num > 255)
return -EINVAL;
return 0;
}

/*
* parse an RxKAD type XDR format token
* - the caller guarantees we have at least 4 words
Expand Down
8 changes: 8 additions & 0 deletions security/keys/key.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,14 @@ struct key *key_alloc(struct key_type *type, const char *desc,
if (!desc || !*desc)
goto error;

if (type->vet_description) {
ret = type->vet_description(desc);
if (ret < 0) {
key = ERR_PTR(ret);
goto error;
}
}

desclen = strlen(desc) + 1;
quotalen = desclen + type->def_datalen;

Expand Down

0 comments on commit b9fffa3

Please sign in to comment.