security: Introduce key_post_create_or_update hook
[linux-2.6-block.git] / security / keys / key.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
76181c13 2/* Basic authentication token and access key management
1da177e4 3 *
69664cf1 4 * Copyright (C) 2004-2008 Red Hat, Inc. All Rights Reserved.
1da177e4 5 * Written by David Howells (dhowells@redhat.com)
1da177e4
LT
6 */
7
876979c9 8#include <linux/export.h>
1da177e4 9#include <linux/init.h>
a7807a32 10#include <linux/poison.h>
1da177e4
LT
11#include <linux/sched.h>
12#include <linux/slab.h>
29db9190 13#include <linux/security.h>
1da177e4 14#include <linux/workqueue.h>
e51f6d34 15#include <linux/random.h>
cb1aa382 16#include <linux/ima.h>
1da177e4
LT
17#include <linux/err.h>
18#include "internal.h"
19
8bc16dea 20struct kmem_cache *key_jar;
1da177e4
LT
21struct rb_root key_serial_tree; /* tree of keys indexed by serial */
22DEFINE_SPINLOCK(key_serial_lock);
23
24struct rb_root key_user_tree; /* tree of quota records indexed by UID */
25DEFINE_SPINLOCK(key_user_lock);
26
738c5d19
SD
27unsigned int key_quota_root_maxkeys = 1000000; /* root's key count quota */
28unsigned int key_quota_root_maxbytes = 25000000; /* root's key space quota */
0b77f5bf
DH
29unsigned int key_quota_maxkeys = 200; /* general key count quota */
30unsigned int key_quota_maxbytes = 20000; /* general key space quota */
31
1da177e4
LT
32static LIST_HEAD(key_types_list);
33static DECLARE_RWSEM(key_types_sem);
34
973c9f4f 35/* We serialise key instantiation and link */
76181c13 36DEFINE_MUTEX(key_construction_mutex);
1da177e4 37
1da177e4
LT
38#ifdef KEY_DEBUGGING
39void __key_check(const struct key *key)
40{
41 printk("__key_check: key %p {%08x} should be {%08x}\n",
42 key, key->magic, KEY_DEBUG_MAGIC);
43 BUG();
44}
45#endif
46
1da177e4 47/*
973c9f4f
DH
48 * Get the key quota record for a user, allocating a new record if one doesn't
49 * already exist.
1da177e4 50 */
9a56c2db 51struct key_user *key_user_lookup(kuid_t uid)
1da177e4
LT
52{
53 struct key_user *candidate = NULL, *user;
8f674565 54 struct rb_node *parent, **p;
1da177e4 55
973c9f4f 56try_again:
8f674565 57 parent = NULL;
1da177e4
LT
58 p = &key_user_tree.rb_node;
59 spin_lock(&key_user_lock);
60
61 /* search the tree for a user record with a matching UID */
62 while (*p) {
63 parent = *p;
64 user = rb_entry(parent, struct key_user, node);
65
9a56c2db 66 if (uid_lt(uid, user->uid))
1da177e4 67 p = &(*p)->rb_left;
9a56c2db 68 else if (uid_gt(uid, user->uid))
1d1e9756 69 p = &(*p)->rb_right;
1da177e4
LT
70 else
71 goto found;
72 }
73
74 /* if we get here, we failed to find a match in the tree */
75 if (!candidate) {
76 /* allocate a candidate user record if we don't already have
77 * one */
78 spin_unlock(&key_user_lock);
79
80 user = NULL;
81 candidate = kmalloc(sizeof(struct key_user), GFP_KERNEL);
82 if (unlikely(!candidate))
83 goto out;
84
85 /* the allocation may have scheduled, so we need to repeat the
86 * search lest someone else added the record whilst we were
87 * asleep */
88 goto try_again;
89 }
90
91 /* if we get here, then the user record still hadn't appeared on the
92 * second pass - so we use the candidate record */
ddb99e11 93 refcount_set(&candidate->usage, 1);
1da177e4
LT
94 atomic_set(&candidate->nkeys, 0);
95 atomic_set(&candidate->nikeys, 0);
96 candidate->uid = uid;
97 candidate->qnkeys = 0;
98 candidate->qnbytes = 0;
99 spin_lock_init(&candidate->lock);
76181c13 100 mutex_init(&candidate->cons_lock);
1da177e4
LT
101
102 rb_link_node(&candidate->node, parent, p);
103 rb_insert_color(&candidate->node, &key_user_tree);
104 spin_unlock(&key_user_lock);
105 user = candidate;
106 goto out;
107
108 /* okay - we found a user record for this UID */
973c9f4f 109found:
ddb99e11 110 refcount_inc(&user->usage);
1da177e4 111 spin_unlock(&key_user_lock);
a7f988ba 112 kfree(candidate);
973c9f4f 113out:
1da177e4 114 return user;
a8b17ed0 115}
1da177e4 116
1da177e4 117/*
973c9f4f 118 * Dispose of a user structure
1da177e4
LT
119 */
120void key_user_put(struct key_user *user)
121{
ddb99e11 122 if (refcount_dec_and_lock(&user->usage, &key_user_lock)) {
1da177e4
LT
123 rb_erase(&user->node, &key_user_tree);
124 spin_unlock(&key_user_lock);
125
126 kfree(user);
127 }
a8b17ed0 128}
1da177e4 129
1da177e4 130/*
973c9f4f
DH
131 * Allocate a serial number for a key. These are assigned randomly to avoid
132 * security issues through covert channel problems.
1da177e4
LT
133 */
134static inline void key_alloc_serial(struct key *key)
135{
136 struct rb_node *parent, **p;
137 struct key *xkey;
138
e51f6d34 139 /* propose a random serial number and look for a hole for it in the
1da177e4 140 * serial number tree */
e51f6d34
ML
141 do {
142 get_random_bytes(&key->serial, sizeof(key->serial));
143
144 key->serial >>= 1; /* negative numbers are not permitted */
145 } while (key->serial < 3);
146
147 spin_lock(&key_serial_lock);
1da177e4 148
9ad0830f 149attempt_insertion:
1da177e4
LT
150 parent = NULL;
151 p = &key_serial_tree.rb_node;
152
153 while (*p) {
154 parent = *p;
155 xkey = rb_entry(parent, struct key, serial_node);
156
157 if (key->serial < xkey->serial)
158 p = &(*p)->rb_left;
159 else if (key->serial > xkey->serial)
160 p = &(*p)->rb_right;
161 else
162 goto serial_exists;
163 }
9ad0830f
DH
164
165 /* we've found a suitable hole - arrange for this key to occupy it */
166 rb_link_node(&key->serial_node, parent, p);
167 rb_insert_color(&key->serial_node, &key_serial_tree);
168
169 spin_unlock(&key_serial_lock);
170 return;
1da177e4
LT
171
172 /* we found a key with the proposed serial number - walk the tree from
173 * that point looking for the next unused serial number */
e51f6d34 174serial_exists:
1da177e4 175 for (;;) {
e51f6d34 176 key->serial++;
9ad0830f
DH
177 if (key->serial < 3) {
178 key->serial = 3;
179 goto attempt_insertion;
180 }
1da177e4
LT
181
182 parent = rb_next(parent);
183 if (!parent)
9ad0830f 184 goto attempt_insertion;
1da177e4
LT
185
186 xkey = rb_entry(parent, struct key, serial_node);
187 if (key->serial < xkey->serial)
9ad0830f 188 goto attempt_insertion;
1da177e4 189 }
a8b17ed0 190}
1da177e4 191
973c9f4f
DH
192/**
193 * key_alloc - Allocate a key of the specified type.
194 * @type: The type of key to allocate.
195 * @desc: The key description to allow the key to be searched out.
196 * @uid: The owner of the new key.
197 * @gid: The group ID for the new key's group permissions.
198 * @cred: The credentials specifying UID namespace.
028db3e2 199 * @perm: The permissions mask of the new key.
973c9f4f 200 * @flags: Flags specifying quota properties.
2b6aa412 201 * @restrict_link: Optional link restriction for new keyrings.
973c9f4f
DH
202 *
203 * Allocate a key of the specified type with the attributes given. The key is
204 * returned in an uninstantiated state and the caller needs to instantiate the
205 * key before returning.
206 *
2b6aa412
MM
207 * The restrict_link structure (if not NULL) will be freed when the
208 * keyring is destroyed, so it must be dynamically allocated.
209 *
973c9f4f
DH
210 * The user's key count quota is updated to reflect the creation of the key and
211 * the user's key data quota has the default for the key type reserved. The
212 * instantiation function should amend this as necessary. If insufficient
213 * quota is available, -EDQUOT will be returned.
214 *
215 * The LSM security modules can prevent a key being created, in which case
216 * -EACCES will be returned.
217 *
218 * Returns a pointer to the new key if successful and an error code otherwise.
219 *
220 * Note that the caller needs to ensure the key type isn't uninstantiated.
221 * Internally this can be done by locking key_types_sem. Externally, this can
222 * be done by either never unregistering the key type, or making sure
223 * key_alloc() calls don't race with module unloading.
1da177e4
LT
224 */
225struct key *key_alloc(struct key_type *type, const char *desc,
9a56c2db 226 kuid_t uid, kgid_t gid, const struct cred *cred,
028db3e2 227 key_perm_t perm, unsigned long flags,
2b6aa412 228 struct key_restriction *restrict_link)
1da177e4
LT
229{
230 struct key_user *user = NULL;
231 struct key *key;
232 size_t desclen, quotalen;
29db9190 233 int ret;
1da177e4
LT
234
235 key = ERR_PTR(-EINVAL);
236 if (!desc || !*desc)
237 goto error;
238
b9fffa38
DH
239 if (type->vet_description) {
240 ret = type->vet_description(desc);
241 if (ret < 0) {
242 key = ERR_PTR(ret);
243 goto error;
244 }
245 }
246
16feef43
DH
247 desclen = strlen(desc);
248 quotalen = desclen + 1 + type->def_datalen;
1da177e4
LT
249
250 /* get hold of the key tracking for this user */
9a56c2db 251 user = key_user_lookup(uid);
1da177e4
LT
252 if (!user)
253 goto no_memory_1;
254
255 /* check that the user's quota permits allocation of another key and
256 * its description */
7e047ef5 257 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
9a56c2db 258 unsigned maxkeys = uid_eq(uid, GLOBAL_ROOT_UID) ?
0b77f5bf 259 key_quota_root_maxkeys : key_quota_maxkeys;
9a56c2db 260 unsigned maxbytes = uid_eq(uid, GLOBAL_ROOT_UID) ?
0b77f5bf
DH
261 key_quota_root_maxbytes : key_quota_maxbytes;
262
1da177e4 263 spin_lock(&user->lock);
7e047ef5 264 if (!(flags & KEY_ALLOC_QUOTA_OVERRUN)) {
a08bf91c
EB
265 if (user->qnkeys + 1 > maxkeys ||
266 user->qnbytes + quotalen > maxbytes ||
0b77f5bf 267 user->qnbytes + quotalen < user->qnbytes)
7e047ef5
DH
268 goto no_quota;
269 }
1da177e4
LT
270
271 user->qnkeys++;
272 user->qnbytes += quotalen;
273 spin_unlock(&user->lock);
274 }
275
276 /* allocate and initialise the key and its description */
2480f57f 277 key = kmem_cache_zalloc(key_jar, GFP_KERNEL);
1da177e4
LT
278 if (!key)
279 goto no_memory_2;
280
5057975a
DC
281 key->index_key.desc_len = desclen;
282 key->index_key.description = kmemdup(desc, desclen + 1, GFP_KERNEL);
27720e75 283 if (!key->index_key.description)
5057975a 284 goto no_memory_3;
355ef8e1 285 key->index_key.type = type;
f771fde8 286 key_set_index_key(&key->index_key);
1da177e4 287
fff29291 288 refcount_set(&key->usage, 1);
1da177e4 289 init_rwsem(&key->sem);
7845bc39 290 lockdep_set_class(&key->sem, &type->lock_class);
1da177e4
LT
291 key->user = user;
292 key->quotalen = quotalen;
293 key->datalen = type->def_datalen;
294 key->uid = uid;
295 key->gid = gid;
028db3e2 296 key->perm = perm;
39299bdd 297 key->expiry = TIME64_MAX;
5ac7eace 298 key->restrict_link = restrict_link;
7c1857bd 299 key->last_used_at = ktime_get_real_seconds();
1da177e4 300
7e047ef5 301 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA))
76d8aeab 302 key->flags |= 1 << KEY_FLAG_IN_QUOTA;
5d2787cf
DH
303 if (flags & KEY_ALLOC_BUILT_IN)
304 key->flags |= 1 << KEY_FLAG_BUILTIN;
237bbd29
EB
305 if (flags & KEY_ALLOC_UID_KEYRING)
306 key->flags |= 1 << KEY_FLAG_UID_KEYRING;
4993e1f9
DH
307 if (flags & KEY_ALLOC_SET_KEEP)
308 key->flags |= 1 << KEY_FLAG_KEEP;
1da177e4 309
1da177e4
LT
310#ifdef KEY_DEBUGGING
311 key->magic = KEY_DEBUG_MAGIC;
312#endif
313
29db9190 314 /* let the security module know about the key */
d84f4f99 315 ret = security_key_alloc(key, cred, flags);
29db9190
DH
316 if (ret < 0)
317 goto security_error;
318
1da177e4 319 /* publish the key by giving it a serial number */
3b6e4de0 320 refcount_inc(&key->domain_tag->usage);
1da177e4
LT
321 atomic_inc(&user->nkeys);
322 key_alloc_serial(key);
323
29db9190 324error:
1da177e4
LT
325 return key;
326
29db9190
DH
327security_error:
328 kfree(key->description);
1da177e4 329 kmem_cache_free(key_jar, key);
7e047ef5 330 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
1da177e4
LT
331 spin_lock(&user->lock);
332 user->qnkeys--;
333 user->qnbytes -= quotalen;
334 spin_unlock(&user->lock);
335 }
336 key_user_put(user);
29db9190
DH
337 key = ERR_PTR(ret);
338 goto error;
339
340no_memory_3:
341 kmem_cache_free(key_jar, key);
342no_memory_2:
7e047ef5 343 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
29db9190
DH
344 spin_lock(&user->lock);
345 user->qnkeys--;
346 user->qnbytes -= quotalen;
347 spin_unlock(&user->lock);
348 }
349 key_user_put(user);
350no_memory_1:
1da177e4
LT
351 key = ERR_PTR(-ENOMEM);
352 goto error;
353
29db9190 354no_quota:
1da177e4
LT
355 spin_unlock(&user->lock);
356 key_user_put(user);
357 key = ERR_PTR(-EDQUOT);
358 goto error;
a8b17ed0 359}
1da177e4
LT
360EXPORT_SYMBOL(key_alloc);
361
973c9f4f
DH
362/**
363 * key_payload_reserve - Adjust data quota reservation for the key's payload
364 * @key: The key to make the reservation for.
365 * @datalen: The amount of data payload the caller now wants.
366 *
367 * Adjust the amount of the owning user's key data quota that a key reserves.
368 * If the amount is increased, then -EDQUOT may be returned if there isn't
369 * enough free quota available.
370 *
371 * If successful, 0 is returned.
1da177e4
LT
372 */
373int key_payload_reserve(struct key *key, size_t datalen)
374{
c5b60b5e 375 int delta = (int)datalen - key->datalen;
1da177e4
LT
376 int ret = 0;
377
378 key_check(key);
379
380 /* contemplate the quota adjustment */
76d8aeab 381 if (delta != 0 && test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) {
9a56c2db 382 unsigned maxbytes = uid_eq(key->user->uid, GLOBAL_ROOT_UID) ?
0b77f5bf
DH
383 key_quota_root_maxbytes : key_quota_maxbytes;
384
1da177e4
LT
385 spin_lock(&key->user->lock);
386
387 if (delta > 0 &&
2e356101 388 (key->user->qnbytes + delta > maxbytes ||
0b77f5bf 389 key->user->qnbytes + delta < key->user->qnbytes)) {
1da177e4
LT
390 ret = -EDQUOT;
391 }
392 else {
393 key->user->qnbytes += delta;
394 key->quotalen += delta;
395 }
396 spin_unlock(&key->user->lock);
397 }
398
399 /* change the recorded data length if that didn't generate an error */
400 if (ret == 0)
401 key->datalen = datalen;
402
403 return ret;
a8b17ed0 404}
1da177e4
LT
405EXPORT_SYMBOL(key_payload_reserve);
406
363b02da
DH
407/*
408 * Change the key state to being instantiated.
409 */
410static void mark_key_instantiated(struct key *key, int reject_error)
411{
412 /* Commit the payload before setting the state; barrier versus
413 * key_read_state().
414 */
415 smp_store_release(&key->state,
416 (reject_error < 0) ? reject_error : KEY_IS_POSITIVE);
417}
418
1da177e4 419/*
973c9f4f
DH
420 * Instantiate a key and link it into the target keyring atomically. Must be
421 * called with the target keyring's semaphore writelocked. The target key's
422 * semaphore need not be locked as instantiation is serialised by
423 * key_construction_mutex.
1da177e4
LT
424 */
425static int __key_instantiate_and_link(struct key *key,
cf7f601c 426 struct key_preparsed_payload *prep,
3e30148c 427 struct key *keyring,
f70e2e06 428 struct key *authkey,
b2a4df20 429 struct assoc_array_edit **_edit)
1da177e4
LT
430{
431 int ret, awaken;
432
433 key_check(key);
434 key_check(keyring);
435
436 awaken = 0;
437 ret = -EBUSY;
438
76181c13 439 mutex_lock(&key_construction_mutex);
1da177e4
LT
440
441 /* can't instantiate twice */
363b02da 442 if (key->state == KEY_IS_UNINSTANTIATED) {
1da177e4 443 /* instantiate the key */
cf7f601c 444 ret = key->type->instantiate(key, prep);
1da177e4
LT
445
446 if (ret == 0) {
447 /* mark the key as being instantiated */
1da177e4 448 atomic_inc(&key->user->nikeys);
363b02da 449 mark_key_instantiated(key, 0);
f7e47677 450 notify_key(key, NOTIFY_KEY_INSTANTIATED, 0);
1da177e4 451
76d8aeab 452 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
1da177e4 453 awaken = 1;
1da177e4
LT
454
455 /* and link it into the destination keyring */
d3600bcf 456 if (keyring) {
eee04502
DH
457 if (test_bit(KEY_FLAG_KEEP, &keyring->flags))
458 set_bit(KEY_FLAG_KEEP, &key->flags);
d3600bcf 459
f7e47677 460 __key_link(keyring, key, _edit);
d3600bcf 461 }
3e30148c
DH
462
463 /* disable the authorisation key */
d84f4f99 464 if (authkey)
a09003b5 465 key_invalidate(authkey);
7dfa0ca6 466
39299bdd 467 key_set_expiry(key, prep->expiry);
1da177e4
LT
468 }
469 }
470
76181c13 471 mutex_unlock(&key_construction_mutex);
1da177e4
LT
472
473 /* wake up anyone waiting for a key to be constructed */
474 if (awaken)
76181c13 475 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
1da177e4
LT
476
477 return ret;
a8b17ed0 478}
1da177e4 479
973c9f4f
DH
480/**
481 * key_instantiate_and_link - Instantiate a key and link it into the keyring.
482 * @key: The key to instantiate.
483 * @data: The data to use to instantiate the keyring.
484 * @datalen: The length of @data.
485 * @keyring: Keyring to create a link in on success (or NULL).
486 * @authkey: The authorisation token permitting instantiation.
487 *
488 * Instantiate a key that's in the uninstantiated state using the provided data
489 * and, if successful, link it in to the destination keyring if one is
490 * supplied.
491 *
492 * If successful, 0 is returned, the authorisation token is revoked and anyone
493 * waiting for the key is woken up. If the key was already instantiated,
494 * -EBUSY will be returned.
1da177e4
LT
495 */
496int key_instantiate_and_link(struct key *key,
497 const void *data,
498 size_t datalen,
3e30148c 499 struct key *keyring,
d84f4f99 500 struct key *authkey)
1da177e4 501{
cf7f601c 502 struct key_preparsed_payload prep;
df593ee2 503 struct assoc_array_edit *edit = NULL;
1da177e4
LT
504 int ret;
505
cf7f601c 506 memset(&prep, 0, sizeof(prep));
8eb62169 507 prep.orig_description = key->description;
cf7f601c
DH
508 prep.data = data;
509 prep.datalen = datalen;
510 prep.quotalen = key->type->def_datalen;
0a9dd0e0 511 prep.expiry = TIME64_MAX;
cf7f601c
DH
512 if (key->type->preparse) {
513 ret = key->type->preparse(&prep);
514 if (ret < 0)
515 goto error;
516 }
517
f70e2e06 518 if (keyring) {
df593ee2 519 ret = __key_link_lock(keyring, &key->index_key);
4a420896
MM
520 if (ret < 0)
521 goto error;
522
df593ee2
DH
523 ret = __key_link_begin(keyring, &key->index_key, &edit);
524 if (ret < 0)
525 goto error_link_end;
526
2b6aa412
MM
527 if (keyring->restrict_link && keyring->restrict_link->check) {
528 struct key_restriction *keyres = keyring->restrict_link;
529
530 ret = keyres->check(keyring, key->type, &prep.payload,
531 keyres->key);
5ac7eace 532 if (ret < 0)
4a420896 533 goto error_link_end;
5ac7eace 534 }
f70e2e06 535 }
1da177e4 536
b2a4df20 537 ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
1da177e4 538
4a420896 539error_link_end:
1da177e4 540 if (keyring)
b2a4df20 541 __key_link_end(keyring, &key->index_key, edit);
1da177e4 542
4d8c0250 543error:
cf7f601c
DH
544 if (key->type->preparse)
545 key->type->free_preparse(&prep);
1da177e4 546 return ret;
a8b17ed0 547}
1da177e4
LT
548
549EXPORT_SYMBOL(key_instantiate_and_link);
550
973c9f4f 551/**
fdd1b945 552 * key_reject_and_link - Negatively instantiate a key and link it into the keyring.
973c9f4f
DH
553 * @key: The key to instantiate.
554 * @timeout: The timeout on the negative key.
fdd1b945 555 * @error: The error to return when the key is hit.
973c9f4f
DH
556 * @keyring: Keyring to create a link in on success (or NULL).
557 * @authkey: The authorisation token permitting instantiation.
558 *
559 * Negatively instantiate a key that's in the uninstantiated state and, if
fdd1b945
DH
560 * successful, set its timeout and stored error and link it in to the
561 * destination keyring if one is supplied. The key and any links to the key
562 * will be automatically garbage collected after the timeout expires.
973c9f4f
DH
563 *
564 * Negative keys are used to rate limit repeated request_key() calls by causing
fdd1b945
DH
565 * them to return the stored error code (typically ENOKEY) until the negative
566 * key expires.
973c9f4f
DH
567 *
568 * If successful, 0 is returned, the authorisation token is revoked and anyone
569 * waiting for the key is woken up. If the key was already instantiated,
570 * -EBUSY will be returned.
1da177e4 571 */
fdd1b945 572int key_reject_and_link(struct key *key,
1da177e4 573 unsigned timeout,
fdd1b945 574 unsigned error,
3e30148c 575 struct key *keyring,
d84f4f99 576 struct key *authkey)
1da177e4 577{
df593ee2 578 struct assoc_array_edit *edit = NULL;
f70e2e06 579 int ret, awaken, link_ret = 0;
1da177e4
LT
580
581 key_check(key);
582 key_check(keyring);
583
584 awaken = 0;
585 ret = -EBUSY;
586
5ac7eace
DH
587 if (keyring) {
588 if (keyring->restrict_link)
589 return -EPERM;
590
df593ee2
DH
591 link_ret = __key_link_lock(keyring, &key->index_key);
592 if (link_ret == 0) {
593 link_ret = __key_link_begin(keyring, &key->index_key, &edit);
594 if (link_ret < 0)
595 __key_link_end(keyring, &key->index_key, edit);
596 }
5ac7eace 597 }
1da177e4 598
76181c13 599 mutex_lock(&key_construction_mutex);
1da177e4
LT
600
601 /* can't instantiate twice */
363b02da 602 if (key->state == KEY_IS_UNINSTANTIATED) {
1da177e4 603 /* mark the key as being negatively instantiated */
1da177e4 604 atomic_inc(&key->user->nikeys);
363b02da 605 mark_key_instantiated(key, -error);
f7e47677 606 notify_key(key, NOTIFY_KEY_INSTANTIATED, -error);
39299bdd 607 key_set_expiry(key, ktime_get_real_seconds() + timeout);
1da177e4 608
76d8aeab 609 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
1da177e4 610 awaken = 1;
1da177e4 611
1da177e4
LT
612 ret = 0;
613
614 /* and link it into the destination keyring */
f70e2e06 615 if (keyring && link_ret == 0)
f7e47677 616 __key_link(keyring, key, &edit);
3e30148c
DH
617
618 /* disable the authorisation key */
d84f4f99 619 if (authkey)
a09003b5 620 key_invalidate(authkey);
1da177e4
LT
621 }
622
76181c13 623 mutex_unlock(&key_construction_mutex);
1da177e4 624
38327424 625 if (keyring && link_ret == 0)
b2a4df20 626 __key_link_end(keyring, &key->index_key, edit);
1da177e4
LT
627
628 /* wake up anyone waiting for a key to be constructed */
629 if (awaken)
76181c13 630 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
1da177e4 631
f70e2e06 632 return ret == 0 ? link_ret : ret;
a8b17ed0 633}
fdd1b945 634EXPORT_SYMBOL(key_reject_and_link);
1da177e4 635
973c9f4f
DH
636/**
637 * key_put - Discard a reference to a key.
638 * @key: The key to discard a reference from.
639 *
640 * Discard a reference to a key, and when all the references are gone, we
641 * schedule the cleanup task to come and pull it out of the tree in process
642 * context at some later time.
1da177e4
LT
643 */
644void key_put(struct key *key)
645{
646 if (key) {
647 key_check(key);
648
fff29291 649 if (refcount_dec_and_test(&key->usage))
3b07e9ca 650 schedule_work(&key_gc_work);
1da177e4 651 }
a8b17ed0 652}
1da177e4
LT
653EXPORT_SYMBOL(key_put);
654
1da177e4 655/*
973c9f4f 656 * Find a key by its serial number.
1da177e4
LT
657 */
658struct key *key_lookup(key_serial_t id)
659{
660 struct rb_node *n;
661 struct key *key;
662
663 spin_lock(&key_serial_lock);
664
665 /* search the tree for the specified key */
666 n = key_serial_tree.rb_node;
667 while (n) {
668 key = rb_entry(n, struct key, serial_node);
669
670 if (id < key->serial)
671 n = n->rb_left;
672 else if (id > key->serial)
673 n = n->rb_right;
674 else
675 goto found;
676 }
677
973c9f4f 678not_found:
1da177e4
LT
679 key = ERR_PTR(-ENOKEY);
680 goto error;
681
973c9f4f 682found:
92347cfd
MR
683 /* A key is allowed to be looked up only if someone still owns a
684 * reference to it - otherwise it's awaiting the gc.
1da177e4 685 */
92347cfd
MR
686 if (!refcount_inc_not_zero(&key->usage))
687 goto not_found;
1da177e4 688
973c9f4f 689error:
1da177e4
LT
690 spin_unlock(&key_serial_lock);
691 return key;
a8b17ed0 692}
037c3431 693EXPORT_SYMBOL(key_lookup);
1da177e4 694
1da177e4 695/*
973c9f4f
DH
696 * Find and lock the specified key type against removal.
697 *
698 * We return with the sem read-locked if successful. If the type wasn't
699 * available -ENOKEY is returned instead.
1da177e4
LT
700 */
701struct key_type *key_type_lookup(const char *type)
702{
703 struct key_type *ktype;
704
705 down_read(&key_types_sem);
706
707 /* look up the key type to see if it's one of the registered kernel
708 * types */
709 list_for_each_entry(ktype, &key_types_list, link) {
710 if (strcmp(ktype->name, type) == 0)
711 goto found_kernel_type;
712 }
713
714 up_read(&key_types_sem);
715 ktype = ERR_PTR(-ENOKEY);
716
973c9f4f 717found_kernel_type:
1da177e4 718 return ktype;
a8b17ed0 719}
1da177e4 720
59e6b9c1
BS
721void key_set_timeout(struct key *key, unsigned timeout)
722{
39299bdd 723 time64_t expiry = TIME64_MAX;
59e6b9c1
BS
724
725 /* make the changes with the locks held to prevent races */
726 down_write(&key->sem);
727
074d5898
BW
728 if (timeout > 0)
729 expiry = ktime_get_real_seconds() + timeout;
39299bdd 730 key_set_expiry(key, expiry);
59e6b9c1
BS
731
732 up_write(&key->sem);
733}
734EXPORT_SYMBOL_GPL(key_set_timeout);
735
1da177e4 736/*
973c9f4f 737 * Unlock a key type locked by key_type_lookup().
1da177e4
LT
738 */
739void key_type_put(struct key_type *ktype)
740{
741 up_read(&key_types_sem);
a8b17ed0 742}
1da177e4 743
1da177e4 744/*
973c9f4f
DH
745 * Attempt to update an existing key.
746 *
747 * The key is given to us with an incremented refcount that we need to discard
748 * if we get an error.
1da177e4 749 */
664cceb0 750static inline key_ref_t __key_update(key_ref_t key_ref,
cf7f601c 751 struct key_preparsed_payload *prep)
1da177e4 752{
664cceb0 753 struct key *key = key_ref_to_ptr(key_ref);
1da177e4
LT
754 int ret;
755
756 /* need write permission on the key to update it */
f5895943 757 ret = key_permission(key_ref, KEY_NEED_WRITE);
29db9190 758 if (ret < 0)
1da177e4
LT
759 goto error;
760
761 ret = -EEXIST;
762 if (!key->type->update)
763 goto error;
764
765 down_write(&key->sem);
766
cf7f601c 767 ret = key->type->update(key, prep);
f7e47677 768 if (ret == 0) {
363b02da
DH
769 /* Updating a negative key positively instantiates it */
770 mark_key_instantiated(key, 0);
f7e47677
DH
771 notify_key(key, NOTIFY_KEY_UPDATED, 0);
772 }
1da177e4
LT
773
774 up_write(&key->sem);
775
776 if (ret < 0)
777 goto error;
664cceb0
DH
778out:
779 return key_ref;
1da177e4 780
664cceb0 781error:
1da177e4 782 key_put(key);
664cceb0 783 key_ref = ERR_PTR(ret);
1da177e4 784 goto out;
a8b17ed0 785}
1da177e4 786
6c1976ad
TW
787/*
788 * Create or potentially update a key. The combined logic behind
789 * key_create_or_update() and key_create()
1da177e4 790 */
6c1976ad
TW
791static key_ref_t __key_create_or_update(key_ref_t keyring_ref,
792 const char *type,
793 const char *description,
794 const void *payload,
795 size_t plen,
796 key_perm_t perm,
797 unsigned long flags,
798 bool allow_update)
1da177e4 799{
16feef43
DH
800 struct keyring_index_key index_key = {
801 .description = description,
802 };
cf7f601c 803 struct key_preparsed_payload prep;
df593ee2 804 struct assoc_array_edit *edit = NULL;
d84f4f99 805 const struct cred *cred = current_cred();
664cceb0 806 struct key *keyring, *key = NULL;
664cceb0 807 key_ref_t key_ref;
1da177e4 808 int ret;
2b6aa412 809 struct key_restriction *restrict_link = NULL;
1da177e4 810
1da177e4
LT
811 /* look up the key type to see if it's one of the registered kernel
812 * types */
16feef43
DH
813 index_key.type = key_type_lookup(type);
814 if (IS_ERR(index_key.type)) {
664cceb0 815 key_ref = ERR_PTR(-ENODEV);
1da177e4
LT
816 goto error;
817 }
818
664cceb0 819 key_ref = ERR_PTR(-EINVAL);
c06cfb08 820 if (!index_key.type->instantiate ||
16feef43 821 (!index_key.description && !index_key.type->preparse))
cf7f601c 822 goto error_put_type;
1da177e4 823
664cceb0
DH
824 keyring = key_ref_to_ptr(keyring_ref);
825
826 key_check(keyring);
827
5ac7eace
DH
828 if (!(flags & KEY_ALLOC_BYPASS_RESTRICTION))
829 restrict_link = keyring->restrict_link;
830
c3a9d654
DH
831 key_ref = ERR_PTR(-ENOTDIR);
832 if (keyring->type != &key_type_keyring)
cf7f601c
DH
833 goto error_put_type;
834
835 memset(&prep, 0, sizeof(prep));
8eb62169 836 prep.orig_description = description;
cf7f601c
DH
837 prep.data = payload;
838 prep.datalen = plen;
16feef43 839 prep.quotalen = index_key.type->def_datalen;
0a9dd0e0 840 prep.expiry = TIME64_MAX;
16feef43
DH
841 if (index_key.type->preparse) {
842 ret = index_key.type->preparse(&prep);
cf7f601c
DH
843 if (ret < 0) {
844 key_ref = ERR_PTR(ret);
4d8c0250 845 goto error_free_prep;
cf7f601c 846 }
16feef43
DH
847 if (!index_key.description)
848 index_key.description = prep.description;
cf7f601c 849 key_ref = ERR_PTR(-EINVAL);
16feef43 850 if (!index_key.description)
cf7f601c
DH
851 goto error_free_prep;
852 }
16feef43 853 index_key.desc_len = strlen(index_key.description);
f771fde8 854 key_set_index_key(&index_key);
c3a9d654 855
df593ee2 856 ret = __key_link_lock(keyring, &index_key);
4a420896
MM
857 if (ret < 0) {
858 key_ref = ERR_PTR(ret);
859 goto error_free_prep;
860 }
861
df593ee2
DH
862 ret = __key_link_begin(keyring, &index_key, &edit);
863 if (ret < 0) {
864 key_ref = ERR_PTR(ret);
865 goto error_link_end;
866 }
867
2b6aa412
MM
868 if (restrict_link && restrict_link->check) {
869 ret = restrict_link->check(keyring, index_key.type,
870 &prep.payload, restrict_link->key);
5ac7eace
DH
871 if (ret < 0) {
872 key_ref = ERR_PTR(ret);
4a420896 873 goto error_link_end;
5ac7eace
DH
874 }
875 }
008643b8 876
664cceb0
DH
877 /* if we're going to allocate a new key, we're going to have
878 * to modify the keyring */
f5895943 879 ret = key_permission(keyring_ref, KEY_NEED_WRITE);
29db9190
DH
880 if (ret < 0) {
881 key_ref = ERR_PTR(ret);
cf7f601c 882 goto error_link_end;
29db9190 883 }
664cceb0 884
6c1976ad
TW
885 /* if it's requested and possible to update this type of key, search
886 * for an existing key of the same type and description in the
887 * destination keyring and update that instead if possible
1da177e4 888 */
6c1976ad
TW
889 if (allow_update) {
890 if (index_key.type->update) {
891 key_ref = find_key_to_update(keyring_ref, &index_key);
892 if (key_ref)
893 goto found_matching_key;
894 }
895 } else {
b2a4df20 896 key_ref = find_key_to_update(keyring_ref, &index_key);
6c1976ad
TW
897 if (key_ref) {
898 key_ref_put(key_ref);
899 key_ref = ERR_PTR(-EEXIST);
900 goto error_link_end;
901 }
1d9b7d97 902 }
1da177e4 903
028db3e2
LT
904 /* if the client doesn't provide, decide on the permissions we want */
905 if (perm == KEY_PERM_UNDEF) {
906 perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR;
907 perm |= KEY_USR_VIEW;
908
909 if (index_key.type->read)
910 perm |= KEY_POS_READ;
911
912 if (index_key.type == &key_type_keyring ||
913 index_key.type->update)
914 perm |= KEY_POS_WRITE;
915 }
916
1da177e4 917 /* allocate a new key */
16feef43 918 key = key_alloc(index_key.type, index_key.description,
028db3e2 919 cred->fsuid, cred->fsgid, cred, perm, flags, NULL);
1da177e4 920 if (IS_ERR(key)) {
e231c2ee 921 key_ref = ERR_CAST(key);
cf7f601c 922 goto error_link_end;
1da177e4
LT
923 }
924
925 /* instantiate it and link it into the target keyring */
b2a4df20 926 ret = __key_instantiate_and_link(key, &prep, keyring, NULL, &edit);
1da177e4
LT
927 if (ret < 0) {
928 key_put(key);
664cceb0 929 key_ref = ERR_PTR(ret);
cf7f601c 930 goto error_link_end;
1da177e4
LT
931 }
932
b8d99703
RS
933 security_key_post_create_or_update(keyring, key, payload, plen, flags,
934 true);
cb1aa382
LR
935 ima_post_key_create_or_update(keyring, key, payload, plen,
936 flags, true);
937
664cceb0
DH
938 key_ref = make_key_ref(key, is_key_possessed(keyring_ref));
939
cf7f601c 940error_link_end:
b2a4df20 941 __key_link_end(keyring, &index_key, edit);
cf7f601c 942error_free_prep:
16feef43
DH
943 if (index_key.type->preparse)
944 index_key.type->free_preparse(&prep);
cf7f601c 945error_put_type:
16feef43 946 key_type_put(index_key.type);
cf7f601c 947error:
664cceb0 948 return key_ref;
1da177e4
LT
949
950 found_matching_key:
951 /* we found a matching key, so we're going to try to update it
952 * - we can drop the locks first as we have the key pinned
953 */
b2a4df20 954 __key_link_end(keyring, &index_key, edit);
1da177e4 955
60ff5b2f
DH
956 key = key_ref_to_ptr(key_ref);
957 if (test_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags)) {
958 ret = wait_for_key_construction(key, true);
959 if (ret < 0) {
960 key_ref_put(key_ref);
961 key_ref = ERR_PTR(ret);
962 goto error_free_prep;
963 }
964 }
965
cf7f601c 966 key_ref = __key_update(key_ref, &prep);
cb1aa382 967
b8d99703
RS
968 if (!IS_ERR(key_ref)) {
969 security_key_post_create_or_update(keyring, key, payload, plen,
970 flags, false);
cb1aa382
LR
971 ima_post_key_create_or_update(keyring, key,
972 payload, plen,
973 flags, false);
b8d99703 974 }
cb1aa382 975
cf7f601c 976 goto error_free_prep;
a8b17ed0 977}
6c1976ad
TW
978
979/**
980 * key_create_or_update - Update or create and instantiate a key.
981 * @keyring_ref: A pointer to the destination keyring with possession flag.
982 * @type: The type of key.
983 * @description: The searchable description for the key.
984 * @payload: The data to use to instantiate or update the key.
985 * @plen: The length of @payload.
986 * @perm: The permissions mask for a new key.
987 * @flags: The quota flags for a new key.
988 *
989 * Search the destination keyring for a key of the same description and if one
990 * is found, update it, otherwise create and instantiate a new one and create a
991 * link to it from that keyring.
992 *
993 * If perm is KEY_PERM_UNDEF then an appropriate key permissions mask will be
994 * concocted.
995 *
996 * Returns a pointer to the new key if successful, -ENODEV if the key type
997 * wasn't available, -ENOTDIR if the keyring wasn't a keyring, -EACCES if the
998 * caller isn't permitted to modify the keyring or the LSM did not permit
999 * creation of the key.
1000 *
1001 * On success, the possession flag from the keyring ref will be tacked on to
1002 * the key ref before it is returned.
1003 */
1004key_ref_t key_create_or_update(key_ref_t keyring_ref,
1005 const char *type,
1006 const char *description,
1007 const void *payload,
1008 size_t plen,
1009 key_perm_t perm,
1010 unsigned long flags)
1011{
1012 return __key_create_or_update(keyring_ref, type, description, payload,
1013 plen, perm, flags, true);
1014}
1da177e4
LT
1015EXPORT_SYMBOL(key_create_or_update);
1016
6c1976ad
TW
1017/**
1018 * key_create - Create and instantiate a key.
1019 * @keyring_ref: A pointer to the destination keyring with possession flag.
1020 * @type: The type of key.
1021 * @description: The searchable description for the key.
1022 * @payload: The data to use to instantiate or update the key.
1023 * @plen: The length of @payload.
1024 * @perm: The permissions mask for a new key.
1025 * @flags: The quota flags for a new key.
1026 *
1027 * Create and instantiate a new key and link to it from the destination keyring.
1028 *
1029 * If perm is KEY_PERM_UNDEF then an appropriate key permissions mask will be
1030 * concocted.
1031 *
1032 * Returns a pointer to the new key if successful, -EEXIST if a key with the
1033 * same description already exists, -ENODEV if the key type wasn't available,
1034 * -ENOTDIR if the keyring wasn't a keyring, -EACCES if the caller isn't
1035 * permitted to modify the keyring or the LSM did not permit creation of the
1036 * key.
1037 *
1038 * On success, the possession flag from the keyring ref will be tacked on to
1039 * the key ref before it is returned.
1040 */
1041key_ref_t key_create(key_ref_t keyring_ref,
1042 const char *type,
1043 const char *description,
1044 const void *payload,
1045 size_t plen,
1046 key_perm_t perm,
1047 unsigned long flags)
1048{
1049 return __key_create_or_update(keyring_ref, type, description, payload,
1050 plen, perm, flags, false);
1051}
1052EXPORT_SYMBOL(key_create);
1053
973c9f4f
DH
1054/**
1055 * key_update - Update a key's contents.
1056 * @key_ref: The pointer (plus possession flag) to the key.
1057 * @payload: The data to be used to update the key.
1058 * @plen: The length of @payload.
1059 *
1060 * Attempt to update the contents of a key with the given payload data. The
1061 * caller must be granted Write permission on the key. Negative keys can be
1062 * instantiated by this method.
1063 *
1064 * Returns 0 on success, -EACCES if not permitted and -EOPNOTSUPP if the key
1065 * type does not support updating. The key type may return other errors.
1da177e4 1066 */
664cceb0 1067int key_update(key_ref_t key_ref, const void *payload, size_t plen)
1da177e4 1068{
cf7f601c 1069 struct key_preparsed_payload prep;
664cceb0 1070 struct key *key = key_ref_to_ptr(key_ref);
1da177e4
LT
1071 int ret;
1072
1073 key_check(key);
1074
1075 /* the key must be writable */
f5895943 1076 ret = key_permission(key_ref, KEY_NEED_WRITE);
29db9190 1077 if (ret < 0)
63a0b050 1078 return ret;
1da177e4
LT
1079
1080 /* attempt to update it if supported */
cf7f601c 1081 if (!key->type->update)
63a0b050 1082 return -EOPNOTSUPP;
1da177e4 1083
cf7f601c
DH
1084 memset(&prep, 0, sizeof(prep));
1085 prep.data = payload;
1086 prep.datalen = plen;
1087 prep.quotalen = key->type->def_datalen;
0a9dd0e0 1088 prep.expiry = TIME64_MAX;
cf7f601c
DH
1089 if (key->type->preparse) {
1090 ret = key->type->preparse(&prep);
1091 if (ret < 0)
1092 goto error;
1da177e4
LT
1093 }
1094
cf7f601c
DH
1095 down_write(&key->sem);
1096
1097 ret = key->type->update(key, &prep);
f7e47677 1098 if (ret == 0) {
363b02da
DH
1099 /* Updating a negative key positively instantiates it */
1100 mark_key_instantiated(key, 0);
f7e47677
DH
1101 notify_key(key, NOTIFY_KEY_UPDATED, 0);
1102 }
cf7f601c
DH
1103
1104 up_write(&key->sem);
1105
4d8c0250 1106error:
cf7f601c
DH
1107 if (key->type->preparse)
1108 key->type->free_preparse(&prep);
1da177e4 1109 return ret;
a8b17ed0 1110}
1da177e4
LT
1111EXPORT_SYMBOL(key_update);
1112
973c9f4f
DH
1113/**
1114 * key_revoke - Revoke a key.
1115 * @key: The key to be revoked.
1116 *
1117 * Mark a key as being revoked and ask the type to free up its resources. The
1118 * revocation timeout is set and the key and all its links will be
1119 * automatically garbage collected after key_gc_delay amount of time if they
1120 * are not manually dealt with first.
1da177e4
LT
1121 */
1122void key_revoke(struct key *key)
1123{
074d5898 1124 time64_t time;
5d135440 1125
1da177e4
LT
1126 key_check(key);
1127
76181c13
DH
1128 /* make sure no one's trying to change or use the key when we mark it
1129 * - we tell lockdep that we might nest because we might be revoking an
1130 * authorisation key whilst holding the sem on a key we've just
1131 * instantiated
1132 */
1133 down_write_nested(&key->sem, 1);
f7e47677
DH
1134 if (!test_and_set_bit(KEY_FLAG_REVOKED, &key->flags)) {
1135 notify_key(key, NOTIFY_KEY_REVOKED, 0);
1136 if (key->type->revoke)
1137 key->type->revoke(key);
1138
1139 /* set the death time to no more than the expiry time */
1140 time = ktime_get_real_seconds();
1141 if (key->revoked_at == 0 || key->revoked_at > time) {
1142 key->revoked_at = time;
1143 key_schedule_gc(key->revoked_at + key_gc_delay);
1144 }
5d135440
DH
1145 }
1146
1da177e4 1147 up_write(&key->sem);
a8b17ed0 1148}
1da177e4
LT
1149EXPORT_SYMBOL(key_revoke);
1150
fd75815f
DH
1151/**
1152 * key_invalidate - Invalidate a key.
1153 * @key: The key to be invalidated.
1154 *
1155 * Mark a key as being invalidated and have it cleaned up immediately. The key
1156 * is ignored by all searches and other operations from this point.
1157 */
1158void key_invalidate(struct key *key)
1159{
1160 kenter("%d", key_serial(key));
1161
1162 key_check(key);
1163
1164 if (!test_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
1165 down_write_nested(&key->sem, 1);
f7e47677
DH
1166 if (!test_and_set_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
1167 notify_key(key, NOTIFY_KEY_INVALIDATED, 0);
fd75815f 1168 key_schedule_gc_links();
f7e47677 1169 }
fd75815f
DH
1170 up_write(&key->sem);
1171 }
1172}
1173EXPORT_SYMBOL(key_invalidate);
1174
6a09d17b
DH
1175/**
1176 * generic_key_instantiate - Simple instantiation of a key from preparsed data
1177 * @key: The key to be instantiated
1178 * @prep: The preparsed data to load.
1179 *
1180 * Instantiate a key from preparsed data. We assume we can just copy the data
1181 * in directly and clear the old pointers.
1182 *
1183 * This can be pointed to directly by the key type instantiate op pointer.
1184 */
1185int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
1186{
1187 int ret;
1188
1189 pr_devel("==>%s()\n", __func__);
1190
1191 ret = key_payload_reserve(key, prep->quotalen);
1192 if (ret == 0) {
146aa8b1
DH
1193 rcu_assign_keypointer(key, prep->payload.data[0]);
1194 key->payload.data[1] = prep->payload.data[1];
1195 key->payload.data[2] = prep->payload.data[2];
1196 key->payload.data[3] = prep->payload.data[3];
1197 prep->payload.data[0] = NULL;
1198 prep->payload.data[1] = NULL;
1199 prep->payload.data[2] = NULL;
1200 prep->payload.data[3] = NULL;
6a09d17b
DH
1201 }
1202 pr_devel("<==%s() = %d\n", __func__, ret);
1203 return ret;
1204}
1205EXPORT_SYMBOL(generic_key_instantiate);
1206
973c9f4f
DH
1207/**
1208 * register_key_type - Register a type of key.
1209 * @ktype: The new key type.
1210 *
1211 * Register a new key type.
1212 *
1213 * Returns 0 on success or -EEXIST if a type of this name already exists.
1da177e4
LT
1214 */
1215int register_key_type(struct key_type *ktype)
1216{
1217 struct key_type *p;
1218 int ret;
1219
7845bc39
DH
1220 memset(&ktype->lock_class, 0, sizeof(ktype->lock_class));
1221
1da177e4
LT
1222 ret = -EEXIST;
1223 down_write(&key_types_sem);
1224
1225 /* disallow key types with the same name */
1226 list_for_each_entry(p, &key_types_list, link) {
1227 if (strcmp(p->name, ktype->name) == 0)
1228 goto out;
1229 }
1230
1231 /* store the type */
1232 list_add(&ktype->link, &key_types_list);
1eb1bcf5
DH
1233
1234 pr_notice("Key type %s registered\n", ktype->name);
1da177e4
LT
1235 ret = 0;
1236
973c9f4f 1237out:
1da177e4
LT
1238 up_write(&key_types_sem);
1239 return ret;
a8b17ed0 1240}
1da177e4
LT
1241EXPORT_SYMBOL(register_key_type);
1242
973c9f4f
DH
1243/**
1244 * unregister_key_type - Unregister a type of key.
1245 * @ktype: The key type.
1246 *
1247 * Unregister a key type and mark all the extant keys of this type as dead.
1248 * Those keys of this type are then destroyed to get rid of their payloads and
1249 * they and their links will be garbage collected as soon as possible.
1da177e4
LT
1250 */
1251void unregister_key_type(struct key_type *ktype)
1252{
1da177e4 1253 down_write(&key_types_sem);
1da177e4 1254 list_del_init(&ktype->link);
0c061b57
DH
1255 downgrade_write(&key_types_sem);
1256 key_gc_keytype(ktype);
1eb1bcf5 1257 pr_notice("Key type %s unregistered\n", ktype->name);
0c061b57 1258 up_read(&key_types_sem);
a8b17ed0 1259}
1da177e4
LT
1260EXPORT_SYMBOL(unregister_key_type);
1261
1da177e4 1262/*
973c9f4f 1263 * Initialise the key management state.
1da177e4
LT
1264 */
1265void __init key_init(void)
1266{
1267 /* allocate a slab in which we can store keys */
1268 key_jar = kmem_cache_create("key_jar", sizeof(struct key),
20c2df83 1269 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1da177e4
LT
1270
1271 /* add the special key types */
1272 list_add_tail(&key_type_keyring.link, &key_types_list);
1273 list_add_tail(&key_type_dead.link, &key_types_list);
1274 list_add_tail(&key_type_user.link, &key_types_list);
9f6ed2ca 1275 list_add_tail(&key_type_logon.link, &key_types_list);
1da177e4
LT
1276
1277 /* record the root user tracking */
1278 rb_link_node(&root_key_user.node,
1279 NULL,
1280 &key_user_tree.rb_node);
1281
1282 rb_insert_color(&root_key_user.node,
1283 &key_user_tree);
a8b17ed0 1284}