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