diff options
Diffstat (limited to 'security')
-rw-r--r-- | security/keys/internal.h | 1 | ||||
-rw-r--r-- | security/keys/key.c | 1 | ||||
-rw-r--r-- | security/keys/user_defined.c | 37 |
3 files changed, 39 insertions, 0 deletions
diff --git a/security/keys/internal.h b/security/keys/internal.h index c7a7caec4830..65647f825584 100644 --- a/security/keys/internal.h +++ b/security/keys/internal.h | |||
@@ -33,6 +33,7 @@ | |||
33 | 33 | ||
34 | extern struct key_type key_type_dead; | 34 | extern struct key_type key_type_dead; |
35 | extern struct key_type key_type_user; | 35 | extern struct key_type key_type_user; |
36 | extern struct key_type key_type_logon; | ||
36 | 37 | ||
37 | /*****************************************************************************/ | 38 | /*****************************************************************************/ |
38 | /* | 39 | /* |
diff --git a/security/keys/key.c b/security/keys/key.c index 4f64c7267afb..7ada8019be1f 100644 --- a/security/keys/key.c +++ b/security/keys/key.c | |||
@@ -999,6 +999,7 @@ void __init key_init(void) | |||
999 | list_add_tail(&key_type_keyring.link, &key_types_list); | 999 | list_add_tail(&key_type_keyring.link, &key_types_list); |
1000 | list_add_tail(&key_type_dead.link, &key_types_list); | 1000 | list_add_tail(&key_type_dead.link, &key_types_list); |
1001 | list_add_tail(&key_type_user.link, &key_types_list); | 1001 | list_add_tail(&key_type_user.link, &key_types_list); |
1002 | list_add_tail(&key_type_logon.link, &key_types_list); | ||
1002 | 1003 | ||
1003 | /* record the root user tracking */ | 1004 | /* record the root user tracking */ |
1004 | rb_link_node(&root_key_user.node, | 1005 | rb_link_node(&root_key_user.node, |
diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c index 69ff52c08e97..6e1a6276649f 100644 --- a/security/keys/user_defined.c +++ b/security/keys/user_defined.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <asm/uaccess.h> | 18 | #include <asm/uaccess.h> |
19 | #include "internal.h" | 19 | #include "internal.h" |
20 | 20 | ||
21 | static int logon_vet_description(const char *desc); | ||
22 | |||
21 | /* | 23 | /* |
22 | * user defined keys take an arbitrary string as the description and an | 24 | * user defined keys take an arbitrary string as the description and an |
23 | * arbitrary blob of data as the payload | 25 | * arbitrary blob of data as the payload |
@@ -36,6 +38,24 @@ struct key_type key_type_user = { | |||
36 | EXPORT_SYMBOL_GPL(key_type_user); | 38 | EXPORT_SYMBOL_GPL(key_type_user); |
37 | 39 | ||
38 | /* | 40 | /* |
41 | * This key type is essentially the same as key_type_user, but it does | ||
42 | * not define a .read op. This is suitable for storing username and | ||
43 | * password pairs in the keyring that you do not want to be readable | ||
44 | * from userspace. | ||
45 | */ | ||
46 | struct key_type key_type_logon = { | ||
47 | .name = "logon", | ||
48 | .instantiate = user_instantiate, | ||
49 | .update = user_update, | ||
50 | .match = user_match, | ||
51 | .revoke = user_revoke, | ||
52 | .destroy = user_destroy, | ||
53 | .describe = user_describe, | ||
54 | .vet_description = logon_vet_description, | ||
55 | }; | ||
56 | EXPORT_SYMBOL_GPL(key_type_logon); | ||
57 | |||
58 | /* | ||
39 | * instantiate a user defined key | 59 | * instantiate a user defined key |
40 | */ | 60 | */ |
41 | int user_instantiate(struct key *key, const void *data, size_t datalen) | 61 | int user_instantiate(struct key *key, const void *data, size_t datalen) |
@@ -189,3 +209,20 @@ long user_read(const struct key *key, char __user *buffer, size_t buflen) | |||
189 | } | 209 | } |
190 | 210 | ||
191 | EXPORT_SYMBOL_GPL(user_read); | 211 | EXPORT_SYMBOL_GPL(user_read); |
212 | |||
213 | /* Vet the description for a "logon" key */ | ||
214 | static int logon_vet_description(const char *desc) | ||
215 | { | ||
216 | char *p; | ||
217 | |||
218 | /* require a "qualified" description string */ | ||
219 | p = strchr(desc, ':'); | ||
220 | if (!p) | ||
221 | return -EINVAL; | ||
222 | |||
223 | /* also reject description with ':' as first char */ | ||
224 | if (p == desc) | ||
225 | return -EINVAL; | ||
226 | |||
227 | return 0; | ||
228 | } | ||