1
2
3
4
5
6
7
8#include <linux/export.h>
9#include <linux/init.h>
10#include <linux/poison.h>
11#include <linux/sched.h>
12#include <linux/slab.h>
13#include <linux/security.h>
14#include <linux/workqueue.h>
15#include <linux/random.h>
16#include <linux/ima.h>
17#include <linux/err.h>
18#include "internal.h"
19
20struct kmem_cache *key_jar;
21struct rb_root key_serial_tree;
22DEFINE_SPINLOCK(key_serial_lock);
23
24struct rb_root key_user_tree;
25DEFINE_SPINLOCK(key_user_lock);
26
27unsigned int key_quota_root_maxkeys = 1000000;
28unsigned int key_quota_root_maxbytes = 25000000;
29unsigned int key_quota_maxkeys = 200;
30unsigned int key_quota_maxbytes = 20000;
31
32static LIST_HEAD(key_types_list);
33static DECLARE_RWSEM(key_types_sem);
34
35
36DEFINE_MUTEX(key_construction_mutex);
37
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
47
48
49
50
51struct key_user *key_user_lookup(kuid_t uid)
52{
53 struct key_user *candidate = NULL, *user;
54 struct rb_node *parent, **p;
55
56try_again:
57 parent = NULL;
58 p = &key_user_tree.rb_node;
59 spin_lock(&key_user_lock);
60
61
62 while (*p) {
63 parent = *p;
64 user = rb_entry(parent, struct key_user, node);
65
66 if (uid_lt(uid, user->uid))
67 p = &(*p)->rb_left;
68 else if (uid_gt(uid, user->uid))
69 p = &(*p)->rb_right;
70 else
71 goto found;
72 }
73
74
75 if (!candidate) {
76
77
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
86
87
88 goto try_again;
89 }
90
91
92
93 refcount_set(&candidate->usage, 1);
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);
100 mutex_init(&candidate->cons_lock);
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
109found:
110 refcount_inc(&user->usage);
111 spin_unlock(&key_user_lock);
112 kfree(candidate);
113out:
114 return user;
115}
116
117
118
119
120void key_user_put(struct key_user *user)
121{
122 if (refcount_dec_and_lock(&user->usage, &key_user_lock)) {
123 rb_erase(&user->node, &key_user_tree);
124 spin_unlock(&key_user_lock);
125
126 kfree(user);
127 }
128}
129
130
131
132
133
134static inline void key_alloc_serial(struct key *key)
135{
136 struct rb_node *parent, **p;
137 struct key *xkey;
138
139
140
141 do {
142 get_random_bytes(&key->serial, sizeof(key->serial));
143
144 key->serial >>= 1;
145 } while (key->serial < 3);
146
147 spin_lock(&key_serial_lock);
148
149attempt_insertion:
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 }
164
165
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;
171
172
173
174serial_exists:
175 for (;;) {
176 key->serial++;
177 if (key->serial < 3) {
178 key->serial = 3;
179 goto attempt_insertion;
180 }
181
182 parent = rb_next(parent);
183 if (!parent)
184 goto attempt_insertion;
185
186 xkey = rb_entry(parent, struct key, serial_node);
187 if (key->serial < xkey->serial)
188 goto attempt_insertion;
189 }
190}
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225struct key *key_alloc(struct key_type *type, const char *desc,
226 kuid_t uid, kgid_t gid, const struct cred *cred,
227 key_perm_t perm, unsigned long flags,
228 struct key_restriction *restrict_link)
229{
230 struct key_user *user = NULL;
231 struct key *key;
232 size_t desclen, quotalen;
233 int ret;
234
235 key = ERR_PTR(-EINVAL);
236 if (!desc || !*desc)
237 goto error;
238
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
247 desclen = strlen(desc);
248 quotalen = desclen + 1 + type->def_datalen;
249
250
251 user = key_user_lookup(uid);
252 if (!user)
253 goto no_memory_1;
254
255
256
257 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
258 unsigned maxkeys = uid_eq(uid, GLOBAL_ROOT_UID) ?
259 key_quota_root_maxkeys : key_quota_maxkeys;
260 unsigned maxbytes = uid_eq(uid, GLOBAL_ROOT_UID) ?
261 key_quota_root_maxbytes : key_quota_maxbytes;
262
263 spin_lock(&user->lock);
264 if (!(flags & KEY_ALLOC_QUOTA_OVERRUN)) {
265 if (user->qnkeys + 1 > maxkeys ||
266 user->qnbytes + quotalen > maxbytes ||
267 user->qnbytes + quotalen < user->qnbytes)
268 goto no_quota;
269 }
270
271 user->qnkeys++;
272 user->qnbytes += quotalen;
273 spin_unlock(&user->lock);
274 }
275
276
277 key = kmem_cache_zalloc(key_jar, GFP_KERNEL);
278 if (!key)
279 goto no_memory_2;
280
281 key->index_key.desc_len = desclen;
282 key->index_key.description = kmemdup(desc, desclen + 1, GFP_KERNEL);
283 if (!key->index_key.description)
284 goto no_memory_3;
285 key->index_key.type = type;
286 key_set_index_key(&key->index_key);
287
288 refcount_set(&key->usage, 1);
289 init_rwsem(&key->sem);
290 lockdep_set_class(&key->sem, &type->lock_class);
291 key->user = user;
292 key->quotalen = quotalen;
293 key->datalen = type->def_datalen;
294 key->uid = uid;
295 key->gid = gid;
296 key->perm = perm;
297 key->restrict_link = restrict_link;
298 key->last_used_at = ktime_get_real_seconds();
299
300 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA))
301 key->flags |= 1 << KEY_FLAG_IN_QUOTA;
302 if (flags & KEY_ALLOC_BUILT_IN)
303 key->flags |= 1 << KEY_FLAG_BUILTIN;
304 if (flags & KEY_ALLOC_UID_KEYRING)
305 key->flags |= 1 << KEY_FLAG_UID_KEYRING;
306
307#ifdef KEY_DEBUGGING
308 key->magic = KEY_DEBUG_MAGIC;
309#endif
310
311
312 ret = security_key_alloc(key, cred, flags);
313 if (ret < 0)
314 goto security_error;
315
316
317 refcount_inc(&key->domain_tag->usage);
318 atomic_inc(&user->nkeys);
319 key_alloc_serial(key);
320
321error:
322 return key;
323
324security_error:
325 kfree(key->description);
326 kmem_cache_free(key_jar, key);
327 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
328 spin_lock(&user->lock);
329 user->qnkeys--;
330 user->qnbytes -= quotalen;
331 spin_unlock(&user->lock);
332 }
333 key_user_put(user);
334 key = ERR_PTR(ret);
335 goto error;
336
337no_memory_3:
338 kmem_cache_free(key_jar, key);
339no_memory_2:
340 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
341 spin_lock(&user->lock);
342 user->qnkeys--;
343 user->qnbytes -= quotalen;
344 spin_unlock(&user->lock);
345 }
346 key_user_put(user);
347no_memory_1:
348 key = ERR_PTR(-ENOMEM);
349 goto error;
350
351no_quota:
352 spin_unlock(&user->lock);
353 key_user_put(user);
354 key = ERR_PTR(-EDQUOT);
355 goto error;
356}
357EXPORT_SYMBOL(key_alloc);
358
359
360
361
362
363
364
365
366
367
368
369
370int key_payload_reserve(struct key *key, size_t datalen)
371{
372 int delta = (int)datalen - key->datalen;
373 int ret = 0;
374
375 key_check(key);
376
377
378 if (delta != 0 && test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) {
379 unsigned maxbytes = uid_eq(key->user->uid, GLOBAL_ROOT_UID) ?
380 key_quota_root_maxbytes : key_quota_maxbytes;
381
382 spin_lock(&key->user->lock);
383
384 if (delta > 0 &&
385 (key->user->qnbytes + delta > maxbytes ||
386 key->user->qnbytes + delta < key->user->qnbytes)) {
387 ret = -EDQUOT;
388 }
389 else {
390 key->user->qnbytes += delta;
391 key->quotalen += delta;
392 }
393 spin_unlock(&key->user->lock);
394 }
395
396
397 if (ret == 0)
398 key->datalen = datalen;
399
400 return ret;
401}
402EXPORT_SYMBOL(key_payload_reserve);
403
404
405
406
407static void mark_key_instantiated(struct key *key, int reject_error)
408{
409
410
411
412 smp_store_release(&key->state,
413 (reject_error < 0) ? reject_error : KEY_IS_POSITIVE);
414}
415
416
417
418
419
420
421
422static int __key_instantiate_and_link(struct key *key,
423 struct key_preparsed_payload *prep,
424 struct key *keyring,
425 struct key *authkey,
426 struct assoc_array_edit **_edit)
427{
428 int ret, awaken;
429
430 key_check(key);
431 key_check(keyring);
432
433 awaken = 0;
434 ret = -EBUSY;
435
436 mutex_lock(&key_construction_mutex);
437
438
439 if (key->state == KEY_IS_UNINSTANTIATED) {
440
441 ret = key->type->instantiate(key, prep);
442
443 if (ret == 0) {
444
445 atomic_inc(&key->user->nikeys);
446 mark_key_instantiated(key, 0);
447 notify_key(key, NOTIFY_KEY_INSTANTIATED, 0);
448
449 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
450 awaken = 1;
451
452
453 if (keyring) {
454 if (test_bit(KEY_FLAG_KEEP, &keyring->flags))
455 set_bit(KEY_FLAG_KEEP, &key->flags);
456
457 __key_link(keyring, key, _edit);
458 }
459
460
461 if (authkey)
462 key_invalidate(authkey);
463
464 if (prep->expiry != TIME64_MAX) {
465 key->expiry = prep->expiry;
466 key_schedule_gc(prep->expiry + key_gc_delay);
467 }
468 }
469 }
470
471 mutex_unlock(&key_construction_mutex);
472
473
474 if (awaken)
475 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
476
477 return ret;
478}
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496int key_instantiate_and_link(struct key *key,
497 const void *data,
498 size_t datalen,
499 struct key *keyring,
500 struct key *authkey)
501{
502 struct key_preparsed_payload prep;
503 struct assoc_array_edit *edit = NULL;
504 int ret;
505
506 memset(&prep, 0, sizeof(prep));
507 prep.data = data;
508 prep.datalen = datalen;
509 prep.quotalen = key->type->def_datalen;
510 prep.expiry = TIME64_MAX;
511 if (key->type->preparse) {
512 ret = key->type->preparse(&prep);
513 if (ret < 0)
514 goto error;
515 }
516
517 if (keyring) {
518 ret = __key_link_lock(keyring, &key->index_key);
519 if (ret < 0)
520 goto error;
521
522 ret = __key_link_begin(keyring, &key->index_key, &edit);
523 if (ret < 0)
524 goto error_link_end;
525
526 if (keyring->restrict_link && keyring->restrict_link->check) {
527 struct key_restriction *keyres = keyring->restrict_link;
528
529 ret = keyres->check(keyring, key->type, &prep.payload,
530 keyres->key);
531 if (ret < 0)
532 goto error_link_end;
533 }
534 }
535
536 ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
537
538error_link_end:
539 if (keyring)
540 __key_link_end(keyring, &key->index_key, edit);
541
542error:
543 if (key->type->preparse)
544 key->type->free_preparse(&prep);
545 return ret;
546}
547
548EXPORT_SYMBOL(key_instantiate_and_link);
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571int key_reject_and_link(struct key *key,
572 unsigned timeout,
573 unsigned error,
574 struct key *keyring,
575 struct key *authkey)
576{
577 struct assoc_array_edit *edit = NULL;
578 int ret, awaken, link_ret = 0;
579
580 key_check(key);
581 key_check(keyring);
582
583 awaken = 0;
584 ret = -EBUSY;
585
586 if (keyring) {
587 if (keyring->restrict_link)
588 return -EPERM;
589
590 link_ret = __key_link_lock(keyring, &key->index_key);
591 if (link_ret == 0) {
592 link_ret = __key_link_begin(keyring, &key->index_key, &edit);
593 if (link_ret < 0)
594 __key_link_end(keyring, &key->index_key, edit);
595 }
596 }
597
598 mutex_lock(&key_construction_mutex);
599
600
601 if (key->state == KEY_IS_UNINSTANTIATED) {
602
603 atomic_inc(&key->user->nikeys);
604 mark_key_instantiated(key, -error);
605 notify_key(key, NOTIFY_KEY_INSTANTIATED, -error);
606 key->expiry = ktime_get_real_seconds() + timeout;
607 key_schedule_gc(key->expiry + key_gc_delay);
608
609 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
610 awaken = 1;
611
612 ret = 0;
613
614
615 if (keyring && link_ret == 0)
616 __key_link(keyring, key, &edit);
617
618
619 if (authkey)
620 key_invalidate(authkey);
621 }
622
623 mutex_unlock(&key_construction_mutex);
624
625 if (keyring && link_ret == 0)
626 __key_link_end(keyring, &key->index_key, edit);
627
628
629 if (awaken)
630 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
631
632 return ret == 0 ? link_ret : ret;
633}
634EXPORT_SYMBOL(key_reject_and_link);
635
636
637
638
639
640
641
642
643
644void key_put(struct key *key)
645{
646 if (key) {
647 key_check(key);
648
649 if (refcount_dec_and_test(&key->usage))
650 schedule_work(&key_gc_work);
651 }
652}
653EXPORT_SYMBOL(key_put);
654
655
656
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
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
678not_found:
679 key = ERR_PTR(-ENOKEY);
680 goto error;
681
682found:
683
684
685
686 if (!refcount_inc_not_zero(&key->usage))
687 goto not_found;
688
689error:
690 spin_unlock(&key_serial_lock);
691 return key;
692}
693
694
695
696
697
698
699
700struct key_type *key_type_lookup(const char *type)
701{
702 struct key_type *ktype;
703
704 down_read(&key_types_sem);
705
706
707
708 list_for_each_entry(ktype, &key_types_list, link) {
709 if (strcmp(ktype->name, type) == 0)
710 goto found_kernel_type;
711 }
712
713 up_read(&key_types_sem);
714 ktype = ERR_PTR(-ENOKEY);
715
716found_kernel_type:
717 return ktype;
718}
719
720void key_set_timeout(struct key *key, unsigned timeout)
721{
722 time64_t expiry = 0;
723
724
725 down_write(&key->sem);
726
727 if (timeout > 0)
728 expiry = ktime_get_real_seconds() + timeout;
729
730 key->expiry = expiry;
731 key_schedule_gc(key->expiry + key_gc_delay);
732
733 up_write(&key->sem);
734}
735EXPORT_SYMBOL_GPL(key_set_timeout);
736
737
738
739
740void key_type_put(struct key_type *ktype)
741{
742 up_read(&key_types_sem);
743}
744
745
746
747
748
749
750
751static inline key_ref_t __key_update(key_ref_t key_ref,
752 struct key_preparsed_payload *prep)
753{
754 struct key *key = key_ref_to_ptr(key_ref);
755 int ret;
756
757
758 ret = key_permission(key_ref, KEY_NEED_WRITE);
759 if (ret < 0)
760 goto error;
761
762 ret = -EEXIST;
763 if (!key->type->update)
764 goto error;
765
766 down_write(&key->sem);
767
768 ret = key->type->update(key, prep);
769 if (ret == 0) {
770
771 mark_key_instantiated(key, 0);
772 notify_key(key, NOTIFY_KEY_UPDATED, 0);
773 }
774
775 up_write(&key->sem);
776
777 if (ret < 0)
778 goto error;
779out:
780 return key_ref;
781
782error:
783 key_put(key);
784 key_ref = ERR_PTR(ret);
785 goto out;
786}
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813key_ref_t key_create_or_update(key_ref_t keyring_ref,
814 const char *type,
815 const char *description,
816 const void *payload,
817 size_t plen,
818 key_perm_t perm,
819 unsigned long flags)
820{
821 struct keyring_index_key index_key = {
822 .description = description,
823 };
824 struct key_preparsed_payload prep;
825 struct assoc_array_edit *edit = NULL;
826 const struct cred *cred = current_cred();
827 struct key *keyring, *key = NULL;
828 key_ref_t key_ref;
829 int ret;
830 struct key_restriction *restrict_link = NULL;
831
832
833
834 index_key.type = key_type_lookup(type);
835 if (IS_ERR(index_key.type)) {
836 key_ref = ERR_PTR(-ENODEV);
837 goto error;
838 }
839
840 key_ref = ERR_PTR(-EINVAL);
841 if (!index_key.type->instantiate ||
842 (!index_key.description && !index_key.type->preparse))
843 goto error_put_type;
844
845 keyring = key_ref_to_ptr(keyring_ref);
846
847 key_check(keyring);
848
849 if (!(flags & KEY_ALLOC_BYPASS_RESTRICTION))
850 restrict_link = keyring->restrict_link;
851
852 key_ref = ERR_PTR(-ENOTDIR);
853 if (keyring->type != &key_type_keyring)
854 goto error_put_type;
855
856 memset(&prep, 0, sizeof(prep));
857 prep.data = payload;
858 prep.datalen = plen;
859 prep.quotalen = index_key.type->def_datalen;
860 prep.expiry = TIME64_MAX;
861 if (index_key.type->preparse) {
862 ret = index_key.type->preparse(&prep);
863 if (ret < 0) {
864 key_ref = ERR_PTR(ret);
865 goto error_free_prep;
866 }
867 if (!index_key.description)
868 index_key.description = prep.description;
869 key_ref = ERR_PTR(-EINVAL);
870 if (!index_key.description)
871 goto error_free_prep;
872 }
873 index_key.desc_len = strlen(index_key.description);
874 key_set_index_key(&index_key);
875
876 ret = __key_link_lock(keyring, &index_key);
877 if (ret < 0) {
878 key_ref = ERR_PTR(ret);
879 goto error_free_prep;
880 }
881
882 ret = __key_link_begin(keyring, &index_key, &edit);
883 if (ret < 0) {
884 key_ref = ERR_PTR(ret);
885 goto error_link_end;
886 }
887
888 if (restrict_link && restrict_link->check) {
889 ret = restrict_link->check(keyring, index_key.type,
890 &prep.payload, restrict_link->key);
891 if (ret < 0) {
892 key_ref = ERR_PTR(ret);
893 goto error_link_end;
894 }
895 }
896
897
898
899 ret = key_permission(keyring_ref, KEY_NEED_WRITE);
900 if (ret < 0) {
901 key_ref = ERR_PTR(ret);
902 goto error_link_end;
903 }
904
905
906
907
908
909 if (index_key.type->update) {
910 key_ref = find_key_to_update(keyring_ref, &index_key);
911 if (key_ref)
912 goto found_matching_key;
913 }
914
915
916 if (perm == KEY_PERM_UNDEF) {
917 perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR;
918 perm |= KEY_USR_VIEW;
919
920 if (index_key.type->read)
921 perm |= KEY_POS_READ;
922
923 if (index_key.type == &key_type_keyring ||
924 index_key.type->update)
925 perm |= KEY_POS_WRITE;
926 }
927
928
929 key = key_alloc(index_key.type, index_key.description,
930 cred->fsuid, cred->fsgid, cred, perm, flags, NULL);
931 if (IS_ERR(key)) {
932 key_ref = ERR_CAST(key);
933 goto error_link_end;
934 }
935
936
937 ret = __key_instantiate_and_link(key, &prep, keyring, NULL, &edit);
938 if (ret < 0) {
939 key_put(key);
940 key_ref = ERR_PTR(ret);
941 goto error_link_end;
942 }
943
944 ima_post_key_create_or_update(keyring, key, payload, plen,
945 flags, true);
946
947 key_ref = make_key_ref(key, is_key_possessed(keyring_ref));
948
949error_link_end:
950 __key_link_end(keyring, &index_key, edit);
951error_free_prep:
952 if (index_key.type->preparse)
953 index_key.type->free_preparse(&prep);
954error_put_type:
955 key_type_put(index_key.type);
956error:
957 return key_ref;
958
959 found_matching_key:
960
961
962
963 __key_link_end(keyring, &index_key, edit);
964
965 key = key_ref_to_ptr(key_ref);
966 if (test_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags)) {
967 ret = wait_for_key_construction(key, true);
968 if (ret < 0) {
969 key_ref_put(key_ref);
970 key_ref = ERR_PTR(ret);
971 goto error_free_prep;
972 }
973 }
974
975 key_ref = __key_update(key_ref, &prep);
976
977 if (!IS_ERR(key_ref))
978 ima_post_key_create_or_update(keyring, key,
979 payload, plen,
980 flags, false);
981
982 goto error_free_prep;
983}
984EXPORT_SYMBOL(key_create_or_update);
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999int key_update(key_ref_t key_ref, const void *payload, size_t plen)
1000{
1001 struct key_preparsed_payload prep;
1002 struct key *key = key_ref_to_ptr(key_ref);
1003 int ret;
1004
1005 key_check(key);
1006
1007
1008 ret = key_permission(key_ref, KEY_NEED_WRITE);
1009 if (ret < 0)
1010 return ret;
1011
1012
1013 if (!key->type->update)
1014 return -EOPNOTSUPP;
1015
1016 memset(&prep, 0, sizeof(prep));
1017 prep.data = payload;
1018 prep.datalen = plen;
1019 prep.quotalen = key->type->def_datalen;
1020 prep.expiry = TIME64_MAX;
1021 if (key->type->preparse) {
1022 ret = key->type->preparse(&prep);
1023 if (ret < 0)
1024 goto error;
1025 }
1026
1027 down_write(&key->sem);
1028
1029 ret = key->type->update(key, &prep);
1030 if (ret == 0) {
1031
1032 mark_key_instantiated(key, 0);
1033 notify_key(key, NOTIFY_KEY_UPDATED, 0);
1034 }
1035
1036 up_write(&key->sem);
1037
1038error:
1039 if (key->type->preparse)
1040 key->type->free_preparse(&prep);
1041 return ret;
1042}
1043EXPORT_SYMBOL(key_update);
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054void key_revoke(struct key *key)
1055{
1056 time64_t time;
1057
1058 key_check(key);
1059
1060
1061
1062
1063
1064
1065 down_write_nested(&key->sem, 1);
1066 if (!test_and_set_bit(KEY_FLAG_REVOKED, &key->flags)) {
1067 notify_key(key, NOTIFY_KEY_REVOKED, 0);
1068 if (key->type->revoke)
1069 key->type->revoke(key);
1070
1071
1072 time = ktime_get_real_seconds();
1073 if (key->revoked_at == 0 || key->revoked_at > time) {
1074 key->revoked_at = time;
1075 key_schedule_gc(key->revoked_at + key_gc_delay);
1076 }
1077 }
1078
1079 up_write(&key->sem);
1080}
1081EXPORT_SYMBOL(key_revoke);
1082
1083
1084
1085
1086
1087
1088
1089
1090void key_invalidate(struct key *key)
1091{
1092 kenter("%d", key_serial(key));
1093
1094 key_check(key);
1095
1096 if (!test_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
1097 down_write_nested(&key->sem, 1);
1098 if (!test_and_set_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
1099 notify_key(key, NOTIFY_KEY_INVALIDATED, 0);
1100 key_schedule_gc_links();
1101 }
1102 up_write(&key->sem);
1103 }
1104}
1105EXPORT_SYMBOL(key_invalidate);
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
1118{
1119 int ret;
1120
1121 pr_devel("==>%s()\n", __func__);
1122
1123 ret = key_payload_reserve(key, prep->quotalen);
1124 if (ret == 0) {
1125 rcu_assign_keypointer(key, prep->payload.data[0]);
1126 key->payload.data[1] = prep->payload.data[1];
1127 key->payload.data[2] = prep->payload.data[2];
1128 key->payload.data[3] = prep->payload.data[3];
1129 prep->payload.data[0] = NULL;
1130 prep->payload.data[1] = NULL;
1131 prep->payload.data[2] = NULL;
1132 prep->payload.data[3] = NULL;
1133 }
1134 pr_devel("<==%s() = %d\n", __func__, ret);
1135 return ret;
1136}
1137EXPORT_SYMBOL(generic_key_instantiate);
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147int register_key_type(struct key_type *ktype)
1148{
1149 struct key_type *p;
1150 int ret;
1151
1152 memset(&ktype->lock_class, 0, sizeof(ktype->lock_class));
1153
1154 ret = -EEXIST;
1155 down_write(&key_types_sem);
1156
1157
1158 list_for_each_entry(p, &key_types_list, link) {
1159 if (strcmp(p->name, ktype->name) == 0)
1160 goto out;
1161 }
1162
1163
1164 list_add(&ktype->link, &key_types_list);
1165
1166 pr_notice("Key type %s registered\n", ktype->name);
1167 ret = 0;
1168
1169out:
1170 up_write(&key_types_sem);
1171 return ret;
1172}
1173EXPORT_SYMBOL(register_key_type);
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183void unregister_key_type(struct key_type *ktype)
1184{
1185 down_write(&key_types_sem);
1186 list_del_init(&ktype->link);
1187 downgrade_write(&key_types_sem);
1188 key_gc_keytype(ktype);
1189 pr_notice("Key type %s unregistered\n", ktype->name);
1190 up_read(&key_types_sem);
1191}
1192EXPORT_SYMBOL(unregister_key_type);
1193
1194
1195
1196
1197void __init key_init(void)
1198{
1199
1200 key_jar = kmem_cache_create("key_jar", sizeof(struct key),
1201 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1202
1203
1204 list_add_tail(&key_type_keyring.link, &key_types_list);
1205 list_add_tail(&key_type_dead.link, &key_types_list);
1206 list_add_tail(&key_type_user.link, &key_types_list);
1207 list_add_tail(&key_type_logon.link, &key_types_list);
1208
1209
1210 rb_link_node(&root_key_user.node,
1211 NULL,
1212 &key_user_tree.rb_node);
1213
1214 rb_insert_color(&root_key_user.node,
1215 &key_user_tree);
1216}
1217