Skip to content

Commit

Permalink
KEYS: Allow expiry time to be set when preparsing a key
Browse files Browse the repository at this point in the history
Allow a key type's preparsing routine to set the expiry time for a key.

Signed-off-by: David Howells <[email protected]>
Acked-by: Steve Dickson <[email protected]>
Acked-by: Jeff Layton <[email protected]>
Reviewed-by: Sage Weil <[email protected]>
  • Loading branch information
dhowells committed Jul 22, 2014
1 parent fc7c70e commit 7dfa0ca
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 3 deletions.
10 changes: 7 additions & 3 deletions Documentation/security/keys.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1150,20 +1150,24 @@ The structure has a number of fields, some of which are mandatory:
const void *data;
size_t datalen;
size_t quotalen;
time_t expiry;
};

Before calling the method, the caller will fill in data and datalen with
the payload blob parameters; quotalen will be filled in with the default
quota size from the key type and the rest will be cleared.
quota size from the key type; expiry will be set to TIME_T_MAX and the
rest will be cleared.

If a description can be proposed from the payload contents, that should be
attached as a string to the description field. This will be used for the
key description if the caller of add_key() passes NULL or "".

The method can attach anything it likes to type_data[] and payload. These
are merely passed along to the instantiate() or update() operations.
are merely passed along to the instantiate() or update() operations. If
set, the expiry time will be applied to the key if it is instantiated from
this data.

The method should return 0 if success ful or a negative error code
The method should return 0 if successful or a negative error code
otherwise.


Expand Down
1 change: 1 addition & 0 deletions include/linux/key-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ struct key_preparsed_payload {
const void *data; /* Raw data */
size_t datalen; /* Raw datalen */
size_t quotalen; /* Quota length for proposed payload */
time_t expiry; /* Expiry time of key */
bool trusted; /* True if key is trusted */
};

Expand Down
8 changes: 8 additions & 0 deletions security/keys/key.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,11 @@ static int __key_instantiate_and_link(struct key *key,
/* disable the authorisation key */
if (authkey)
key_revoke(authkey);

if (prep->expiry != TIME_T_MAX) {
key->expiry = prep->expiry;
key_schedule_gc(prep->expiry + key_gc_delay);
}
}
}

Expand Down Expand Up @@ -479,6 +484,7 @@ int key_instantiate_and_link(struct key *key,
prep.data = data;
prep.datalen = datalen;
prep.quotalen = key->type->def_datalen;
prep.expiry = TIME_T_MAX;
if (key->type->preparse) {
ret = key->type->preparse(&prep);
if (ret < 0)
Expand Down Expand Up @@ -811,6 +817,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
prep.datalen = plen;
prep.quotalen = index_key.type->def_datalen;
prep.trusted = flags & KEY_ALLOC_TRUSTED;
prep.expiry = TIME_T_MAX;
if (index_key.type->preparse) {
ret = index_key.type->preparse(&prep);
if (ret < 0) {
Expand Down Expand Up @@ -941,6 +948,7 @@ int key_update(key_ref_t key_ref, const void *payload, size_t plen)
prep.data = payload;
prep.datalen = plen;
prep.quotalen = key->type->def_datalen;
prep.expiry = TIME_T_MAX;
if (key->type->preparse) {
ret = key->type->preparse(&prep);
if (ret < 0)
Expand Down

0 comments on commit 7dfa0ca

Please sign in to comment.