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 <linux/user_namespace.h>
22#include "internal.h"
23
24struct kmem_cache *key_jar;
25struct rb_root key_serial_tree;
26DEFINE_SPINLOCK(key_serial_lock);
27
28struct rb_root key_user_tree;
29DEFINE_SPINLOCK(key_user_lock);
30
31unsigned int key_quota_root_maxkeys = 200;
32unsigned int key_quota_root_maxbytes = 20000;
33unsigned int key_quota_maxkeys = 200;
34unsigned int key_quota_maxbytes = 20000;
35
36static LIST_HEAD(key_types_list);
37static DECLARE_RWSEM(key_types_sem);
38
39
40DEFINE_MUTEX(key_construction_mutex);
41
42#ifdef KEY_DEBUGGING
43void __key_check(const struct key *key)
44{
45 printk("__key_check: key %p {%08x} should be {%08x}\n",
46 key, key->magic, KEY_DEBUG_MAGIC);
47 BUG();
48}
49#endif
50
51
52
53
54
55struct key_user *key_user_lookup(uid_t uid, struct user_namespace *user_ns)
56{
57 struct key_user *candidate = NULL, *user;
58 struct rb_node *parent = NULL;
59 struct rb_node **p;
60
61try_again:
62 p = &key_user_tree.rb_node;
63 spin_lock(&key_user_lock);
64
65
66 while (*p) {
67 parent = *p;
68 user = rb_entry(parent, struct key_user, node);
69
70 if (uid < user->uid)
71 p = &(*p)->rb_left;
72 else if (uid > user->uid)
73 p = &(*p)->rb_right;
74 else if (user_ns < user->user_ns)
75 p = &(*p)->rb_left;
76 else if (user_ns > user->user_ns)
77 p = &(*p)->rb_right;
78 else
79 goto found;
80 }
81
82
83 if (!candidate) {
84
85
86 spin_unlock(&key_user_lock);
87
88 user = NULL;
89 candidate = kmalloc(sizeof(struct key_user), GFP_KERNEL);
90 if (unlikely(!candidate))
91 goto out;
92
93
94
95
96 goto try_again;
97 }
98
99
100
101 atomic_set(&candidate->usage, 1);
102 atomic_set(&candidate->nkeys, 0);
103 atomic_set(&candidate->nikeys, 0);
104 candidate->uid = uid;
105 candidate->user_ns = get_user_ns(user_ns);
106 candidate->qnkeys = 0;
107 candidate->qnbytes = 0;
108 spin_lock_init(&candidate->lock);
109 mutex_init(&candidate->cons_lock);
110
111 rb_link_node(&candidate->node, parent, p);
112 rb_insert_color(&candidate->node, &key_user_tree);
113 spin_unlock(&key_user_lock);
114 user = candidate;
115 goto out;
116
117
118found:
119 atomic_inc(&user->usage);
120 spin_unlock(&key_user_lock);
121 kfree(candidate);
122out:
123 return user;
124}
125
126
127
128
129void key_user_put(struct key_user *user)
130{
131 if (atomic_dec_and_lock(&user->usage, &key_user_lock)) {
132 rb_erase(&user->node, &key_user_tree);
133 spin_unlock(&key_user_lock);
134 put_user_ns(user->user_ns);
135
136 kfree(user);
137 }
138}
139
140
141
142
143
144static inline void key_alloc_serial(struct key *key)
145{
146 struct rb_node *parent, **p;
147 struct key *xkey;
148
149
150
151 do {
152 get_random_bytes(&key->serial, sizeof(key->serial));
153
154 key->serial >>= 1;
155 } while (key->serial < 3);
156
157 spin_lock(&key_serial_lock);
158
159attempt_insertion:
160 parent = NULL;
161 p = &key_serial_tree.rb_node;
162
163 while (*p) {
164 parent = *p;
165 xkey = rb_entry(parent, struct key, serial_node);
166
167 if (key->serial < xkey->serial)
168 p = &(*p)->rb_left;
169 else if (key->serial > xkey->serial)
170 p = &(*p)->rb_right;
171 else
172 goto serial_exists;
173 }
174
175
176 rb_link_node(&key->serial_node, parent, p);
177 rb_insert_color(&key->serial_node, &key_serial_tree);
178
179 spin_unlock(&key_serial_lock);
180 return;
181
182
183
184serial_exists:
185 for (;;) {
186 key->serial++;
187 if (key->serial < 3) {
188 key->serial = 3;
189 goto attempt_insertion;
190 }
191
192 parent = rb_next(parent);
193 if (!parent)
194 goto attempt_insertion;
195
196 xkey = rb_entry(parent, struct key, serial_node);
197 if (key->serial < xkey->serial)
198 goto attempt_insertion;
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
228
229
230
231struct key *key_alloc(struct key_type *type, const char *desc,
232 uid_t uid, gid_t gid, const struct cred *cred,
233 key_perm_t perm, unsigned long flags)
234{
235 struct key_user *user = NULL;
236 struct key *key;
237 size_t desclen, quotalen;
238 int ret;
239
240 key = ERR_PTR(-EINVAL);
241 if (!desc || !*desc)
242 goto error;
243
244 if (type->vet_description) {
245 ret = type->vet_description(desc);
246 if (ret < 0) {
247 key = ERR_PTR(ret);
248 goto error;
249 }
250 }
251
252 desclen = strlen(desc) + 1;
253 quotalen = desclen + type->def_datalen;
254
255
256 user = key_user_lookup(uid, cred->user_ns);
257 if (!user)
258 goto no_memory_1;
259
260
261
262 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
263 unsigned maxkeys = (uid == 0) ?
264 key_quota_root_maxkeys : key_quota_maxkeys;
265 unsigned maxbytes = (uid == 0) ?
266 key_quota_root_maxbytes : key_quota_maxbytes;
267
268 spin_lock(&user->lock);
269 if (!(flags & KEY_ALLOC_QUOTA_OVERRUN)) {
270 if (user->qnkeys + 1 >= maxkeys ||
271 user->qnbytes + quotalen >= maxbytes ||
272 user->qnbytes + quotalen < user->qnbytes)
273 goto no_quota;
274 }
275
276 user->qnkeys++;
277 user->qnbytes += quotalen;
278 spin_unlock(&user->lock);
279 }
280
281
282 key = kmem_cache_alloc(key_jar, GFP_KERNEL);
283 if (!key)
284 goto no_memory_2;
285
286 if (desc) {
287 key->description = kmemdup(desc, desclen, GFP_KERNEL);
288 if (!key->description)
289 goto no_memory_3;
290 }
291
292 atomic_set(&key->usage, 1);
293 init_rwsem(&key->sem);
294 lockdep_set_class(&key->sem, &type->lock_class);
295 key->type = type;
296 key->user = user;
297 key->quotalen = quotalen;
298 key->datalen = type->def_datalen;
299 key->uid = uid;
300 key->gid = gid;
301 key->perm = perm;
302 key->flags = 0;
303 key->expiry = 0;
304 key->payload.data = NULL;
305 key->security = NULL;
306
307 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA))
308 key->flags |= 1 << KEY_FLAG_IN_QUOTA;
309
310 memset(&key->type_data, 0, sizeof(key->type_data));
311
312#ifdef KEY_DEBUGGING
313 key->magic = KEY_DEBUG_MAGIC;
314#endif
315
316
317 ret = security_key_alloc(key, cred, flags);
318 if (ret < 0)
319 goto security_error;
320
321
322 atomic_inc(&user->nkeys);
323 key_alloc_serial(key);
324
325error:
326 return key;
327
328security_error:
329 kfree(key->description);
330 kmem_cache_free(key_jar, key);
331 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
332 spin_lock(&user->lock);
333 user->qnkeys--;
334 user->qnbytes -= quotalen;
335 spin_unlock(&user->lock);
336 }
337 key_user_put(user);
338 key = ERR_PTR(ret);
339 goto error;
340
341no_memory_3:
342 kmem_cache_free(key_jar, key);
343no_memory_2:
344 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
345 spin_lock(&user->lock);
346 user->qnkeys--;
347 user->qnbytes -= quotalen;
348 spin_unlock(&user->lock);
349 }
350 key_user_put(user);
351no_memory_1:
352 key = ERR_PTR(-ENOMEM);
353 goto error;
354
355no_quota:
356 spin_unlock(&user->lock);
357 key_user_put(user);
358 key = ERR_PTR(-EDQUOT);
359 goto error;
360}
361EXPORT_SYMBOL(key_alloc);
362
363
364
365
366
367
368
369
370
371
372
373
374int key_payload_reserve(struct key *key, size_t datalen)
375{
376 int delta = (int)datalen - key->datalen;
377 int ret = 0;
378
379 key_check(key);
380
381
382 if (delta != 0 && test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) {
383 unsigned maxbytes = (key->user->uid == 0) ?
384 key_quota_root_maxbytes : key_quota_maxbytes;
385
386 spin_lock(&key->user->lock);
387
388 if (delta > 0 &&
389 (key->user->qnbytes + delta >= maxbytes ||
390 key->user->qnbytes + delta < key->user->qnbytes)) {
391 ret = -EDQUOT;
392 }
393 else {
394 key->user->qnbytes += delta;
395 key->quotalen += delta;
396 }
397 spin_unlock(&key->user->lock);
398 }
399
400
401 if (ret == 0)
402 key->datalen = datalen;
403
404 return ret;
405}
406EXPORT_SYMBOL(key_payload_reserve);
407
408
409
410
411
412
413
414static int __key_instantiate_and_link(struct key *key,
415 const void *data,
416 size_t datalen,
417 struct key *keyring,
418 struct key *authkey,
419 unsigned long *_prealloc)
420{
421 int ret, awaken;
422
423 key_check(key);
424 key_check(keyring);
425
426 awaken = 0;
427 ret = -EBUSY;
428
429 mutex_lock(&key_construction_mutex);
430
431
432 if (!test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) {
433
434 ret = key->type->instantiate(key, data, datalen);
435
436 if (ret == 0) {
437
438 atomic_inc(&key->user->nikeys);
439 set_bit(KEY_FLAG_INSTANTIATED, &key->flags);
440
441 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
442 awaken = 1;
443
444
445 if (keyring)
446 __key_link(keyring, key, _prealloc);
447
448
449 if (authkey)
450 key_revoke(authkey);
451 }
452 }
453
454 mutex_unlock(&key_construction_mutex);
455
456
457 if (awaken)
458 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
459
460 return ret;
461}
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479int key_instantiate_and_link(struct key *key,
480 const void *data,
481 size_t datalen,
482 struct key *keyring,
483 struct key *authkey)
484{
485 unsigned long prealloc;
486 int ret;
487
488 if (keyring) {
489 ret = __key_link_begin(keyring, key->type, key->description,
490 &prealloc);
491 if (ret < 0)
492 return ret;
493 }
494
495 ret = __key_instantiate_and_link(key, data, datalen, keyring, authkey,
496 &prealloc);
497
498 if (keyring)
499 __key_link_end(keyring, key->type, prealloc);
500
501 return ret;
502}
503
504EXPORT_SYMBOL(key_instantiate_and_link);
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527int key_reject_and_link(struct key *key,
528 unsigned timeout,
529 unsigned error,
530 struct key *keyring,
531 struct key *authkey)
532{
533 unsigned long prealloc;
534 struct timespec now;
535 int ret, awaken, link_ret = 0;
536
537 key_check(key);
538 key_check(keyring);
539
540 awaken = 0;
541 ret = -EBUSY;
542
543 if (keyring)
544 link_ret = __key_link_begin(keyring, key->type,
545 key->description, &prealloc);
546
547 mutex_lock(&key_construction_mutex);
548
549
550 if (!test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) {
551
552 atomic_inc(&key->user->nikeys);
553 set_bit(KEY_FLAG_NEGATIVE, &key->flags);
554 set_bit(KEY_FLAG_INSTANTIATED, &key->flags);
555 key->type_data.reject_error = -error;
556 now = current_kernel_time();
557 key->expiry = now.tv_sec + timeout;
558 key_schedule_gc(key->expiry + key_gc_delay);
559
560 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
561 awaken = 1;
562
563 ret = 0;
564
565
566 if (keyring && link_ret == 0)
567 __key_link(keyring, key, &prealloc);
568
569
570 if (authkey)
571 key_revoke(authkey);
572 }
573
574 mutex_unlock(&key_construction_mutex);
575
576 if (keyring)
577 __key_link_end(keyring, key->type, prealloc);
578
579
580 if (awaken)
581 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
582
583 return ret == 0 ? link_ret : ret;
584}
585EXPORT_SYMBOL(key_reject_and_link);
586
587
588
589
590
591
592
593
594
595void key_put(struct key *key)
596{
597 if (key) {
598 key_check(key);
599
600 if (atomic_dec_and_test(&key->usage))
601 queue_work(system_nrt_wq, &key_gc_work);
602 }
603}
604EXPORT_SYMBOL(key_put);
605
606
607
608
609struct key *key_lookup(key_serial_t id)
610{
611 struct rb_node *n;
612 struct key *key;
613
614 spin_lock(&key_serial_lock);
615
616
617 n = key_serial_tree.rb_node;
618 while (n) {
619 key = rb_entry(n, struct key, serial_node);
620
621 if (id < key->serial)
622 n = n->rb_left;
623 else if (id > key->serial)
624 n = n->rb_right;
625 else
626 goto found;
627 }
628
629not_found:
630 key = ERR_PTR(-ENOKEY);
631 goto error;
632
633found:
634
635 if (atomic_read(&key->usage) == 0)
636 goto not_found;
637
638
639
640
641 atomic_inc(&key->usage);
642
643error:
644 spin_unlock(&key_serial_lock);
645 return key;
646}
647
648
649
650
651
652
653
654struct key_type *key_type_lookup(const char *type)
655{
656 struct key_type *ktype;
657
658 down_read(&key_types_sem);
659
660
661
662 list_for_each_entry(ktype, &key_types_list, link) {
663 if (strcmp(ktype->name, type) == 0)
664 goto found_kernel_type;
665 }
666
667 up_read(&key_types_sem);
668 ktype = ERR_PTR(-ENOKEY);
669
670found_kernel_type:
671 return ktype;
672}
673
674void key_set_timeout(struct key *key, unsigned timeout)
675{
676 struct timespec now;
677 time_t expiry = 0;
678
679
680 down_write(&key->sem);
681
682 if (timeout > 0) {
683 now = current_kernel_time();
684 expiry = now.tv_sec + timeout;
685 }
686
687 key->expiry = expiry;
688 key_schedule_gc(key->expiry + key_gc_delay);
689
690 up_write(&key->sem);
691}
692EXPORT_SYMBOL_GPL(key_set_timeout);
693
694
695
696
697void key_type_put(struct key_type *ktype)
698{
699 up_read(&key_types_sem);
700}
701
702
703
704
705
706
707
708static inline key_ref_t __key_update(key_ref_t key_ref,
709 const void *payload, size_t plen)
710{
711 struct key *key = key_ref_to_ptr(key_ref);
712 int ret;
713
714
715 ret = key_permission(key_ref, KEY_WRITE);
716 if (ret < 0)
717 goto error;
718
719 ret = -EEXIST;
720 if (!key->type->update)
721 goto error;
722
723 down_write(&key->sem);
724
725 ret = key->type->update(key, payload, plen);
726 if (ret == 0)
727
728 clear_bit(KEY_FLAG_NEGATIVE, &key->flags);
729
730 up_write(&key->sem);
731
732 if (ret < 0)
733 goto error;
734out:
735 return key_ref;
736
737error:
738 key_put(key);
739 key_ref = ERR_PTR(ret);
740 goto out;
741}
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768key_ref_t key_create_or_update(key_ref_t keyring_ref,
769 const char *type,
770 const char *description,
771 const void *payload,
772 size_t plen,
773 key_perm_t perm,
774 unsigned long flags)
775{
776 unsigned long prealloc;
777 const struct cred *cred = current_cred();
778 struct key_type *ktype;
779 struct key *keyring, *key = NULL;
780 key_ref_t key_ref;
781 int ret;
782
783
784
785 ktype = key_type_lookup(type);
786 if (IS_ERR(ktype)) {
787 key_ref = ERR_PTR(-ENODEV);
788 goto error;
789 }
790
791 key_ref = ERR_PTR(-EINVAL);
792 if (!ktype->match || !ktype->instantiate)
793 goto error_2;
794
795 keyring = key_ref_to_ptr(keyring_ref);
796
797 key_check(keyring);
798
799 key_ref = ERR_PTR(-ENOTDIR);
800 if (keyring->type != &key_type_keyring)
801 goto error_2;
802
803 ret = __key_link_begin(keyring, ktype, description, &prealloc);
804 if (ret < 0)
805 goto error_2;
806
807
808
809 ret = key_permission(keyring_ref, KEY_WRITE);
810 if (ret < 0) {
811 key_ref = ERR_PTR(ret);
812 goto error_3;
813 }
814
815
816
817
818
819 if (ktype->update) {
820 key_ref = __keyring_search_one(keyring_ref, ktype, description,
821 0);
822 if (!IS_ERR(key_ref))
823 goto found_matching_key;
824 }
825
826
827 if (perm == KEY_PERM_UNDEF) {
828 perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR;
829 perm |= KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_LINK | KEY_USR_SETATTR;
830
831 if (ktype->read)
832 perm |= KEY_POS_READ | KEY_USR_READ;
833
834 if (ktype == &key_type_keyring || ktype->update)
835 perm |= KEY_USR_WRITE;
836 }
837
838
839 key = key_alloc(ktype, description, cred->fsuid, cred->fsgid, cred,
840 perm, flags);
841 if (IS_ERR(key)) {
842 key_ref = ERR_CAST(key);
843 goto error_3;
844 }
845
846
847 ret = __key_instantiate_and_link(key, payload, plen, keyring, NULL,
848 &prealloc);
849 if (ret < 0) {
850 key_put(key);
851 key_ref = ERR_PTR(ret);
852 goto error_3;
853 }
854
855 key_ref = make_key_ref(key, is_key_possessed(keyring_ref));
856
857 error_3:
858 __key_link_end(keyring, ktype, prealloc);
859 error_2:
860 key_type_put(ktype);
861 error:
862 return key_ref;
863
864 found_matching_key:
865
866
867
868 __key_link_end(keyring, ktype, prealloc);
869 key_type_put(ktype);
870
871 key_ref = __key_update(key_ref, payload, plen);
872 goto error;
873}
874EXPORT_SYMBOL(key_create_or_update);
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889int key_update(key_ref_t key_ref, const void *payload, size_t plen)
890{
891 struct key *key = key_ref_to_ptr(key_ref);
892 int ret;
893
894 key_check(key);
895
896
897 ret = key_permission(key_ref, KEY_WRITE);
898 if (ret < 0)
899 goto error;
900
901
902 ret = -EOPNOTSUPP;
903 if (key->type->update) {
904 down_write(&key->sem);
905
906 ret = key->type->update(key, payload, plen);
907 if (ret == 0)
908
909 clear_bit(KEY_FLAG_NEGATIVE, &key->flags);
910
911 up_write(&key->sem);
912 }
913
914 error:
915 return ret;
916}
917EXPORT_SYMBOL(key_update);
918
919
920
921
922
923
924
925
926
927
928void key_revoke(struct key *key)
929{
930 struct timespec now;
931 time_t time;
932
933 key_check(key);
934
935
936
937
938
939
940 down_write_nested(&key->sem, 1);
941 if (!test_and_set_bit(KEY_FLAG_REVOKED, &key->flags) &&
942 key->type->revoke)
943 key->type->revoke(key);
944
945
946 now = current_kernel_time();
947 time = now.tv_sec;
948 if (key->revoked_at == 0 || key->revoked_at > time) {
949 key->revoked_at = time;
950 key_schedule_gc(key->revoked_at + key_gc_delay);
951 }
952
953 up_write(&key->sem);
954}
955EXPORT_SYMBOL(key_revoke);
956
957
958
959
960
961
962
963
964void key_invalidate(struct key *key)
965{
966 kenter("%d", key_serial(key));
967
968 key_check(key);
969
970 if (!test_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
971 down_write_nested(&key->sem, 1);
972 if (!test_and_set_bit(KEY_FLAG_INVALIDATED, &key->flags))
973 key_schedule_gc_links();
974 up_write(&key->sem);
975 }
976}
977EXPORT_SYMBOL(key_invalidate);
978
979
980
981
982
983
984
985
986
987int register_key_type(struct key_type *ktype)
988{
989 struct key_type *p;
990 int ret;
991
992 memset(&ktype->lock_class, 0, sizeof(ktype->lock_class));
993
994 ret = -EEXIST;
995 down_write(&key_types_sem);
996
997
998 list_for_each_entry(p, &key_types_list, link) {
999 if (strcmp(p->name, ktype->name) == 0)
1000 goto out;
1001 }
1002
1003
1004 list_add(&ktype->link, &key_types_list);
1005
1006 pr_notice("Key type %s registered\n", ktype->name);
1007 ret = 0;
1008
1009out:
1010 up_write(&key_types_sem);
1011 return ret;
1012}
1013EXPORT_SYMBOL(register_key_type);
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023void unregister_key_type(struct key_type *ktype)
1024{
1025 down_write(&key_types_sem);
1026 list_del_init(&ktype->link);
1027 downgrade_write(&key_types_sem);
1028 key_gc_keytype(ktype);
1029 pr_notice("Key type %s unregistered\n", ktype->name);
1030 up_read(&key_types_sem);
1031}
1032EXPORT_SYMBOL(unregister_key_type);
1033
1034
1035
1036
1037void __init key_init(void)
1038{
1039
1040 key_jar = kmem_cache_create("key_jar", sizeof(struct key),
1041 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1042
1043
1044 list_add_tail(&key_type_keyring.link, &key_types_list);
1045 list_add_tail(&key_type_dead.link, &key_types_list);
1046 list_add_tail(&key_type_user.link, &key_types_list);
1047 list_add_tail(&key_type_logon.link, &key_types_list);
1048
1049
1050 rb_link_node(&root_key_user.node,
1051 NULL,
1052 &key_user_tree.rb_node);
1053
1054 rb_insert_color(&root_key_user.node,
1055 &key_user_tree);
1056}
1057