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->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
674
675
676
677void key_type_put(struct key_type *ktype)
678{
679 up_read(&key_types_sem);
680}
681
682
683
684
685
686
687
688static inline key_ref_t __key_update(key_ref_t key_ref,
689 const void *payload, size_t plen)
690{
691 struct key *key = key_ref_to_ptr(key_ref);
692 int ret;
693
694
695 ret = key_permission(key_ref, KEY_WRITE);
696 if (ret < 0)
697 goto error;
698
699 ret = -EEXIST;
700 if (!key->type->update)
701 goto error;
702
703 down_write(&key->sem);
704
705 ret = key->type->update(key, payload, plen);
706 if (ret == 0)
707
708 clear_bit(KEY_FLAG_NEGATIVE, &key->flags);
709
710 up_write(&key->sem);
711
712 if (ret < 0)
713 goto error;
714out:
715 return key_ref;
716
717error:
718 key_put(key);
719 key_ref = ERR_PTR(ret);
720 goto out;
721}
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748key_ref_t key_create_or_update(key_ref_t keyring_ref,
749 const char *type,
750 const char *description,
751 const void *payload,
752 size_t plen,
753 key_perm_t perm,
754 unsigned long flags)
755{
756 unsigned long prealloc;
757 const struct cred *cred = current_cred();
758 struct key_type *ktype;
759 struct key *keyring, *key = NULL;
760 key_ref_t key_ref;
761 int ret;
762
763
764
765 ktype = key_type_lookup(type);
766 if (IS_ERR(ktype)) {
767 key_ref = ERR_PTR(-ENODEV);
768 goto error;
769 }
770
771 key_ref = ERR_PTR(-EINVAL);
772 if (!ktype->match || !ktype->instantiate)
773 goto error_2;
774
775 keyring = key_ref_to_ptr(keyring_ref);
776
777 key_check(keyring);
778
779 key_ref = ERR_PTR(-ENOTDIR);
780 if (keyring->type != &key_type_keyring)
781 goto error_2;
782
783 ret = __key_link_begin(keyring, ktype, description, &prealloc);
784 if (ret < 0)
785 goto error_2;
786
787
788
789 ret = key_permission(keyring_ref, KEY_WRITE);
790 if (ret < 0) {
791 key_ref = ERR_PTR(ret);
792 goto error_3;
793 }
794
795
796
797
798
799 if (ktype->update) {
800 key_ref = __keyring_search_one(keyring_ref, ktype, description,
801 0);
802 if (!IS_ERR(key_ref))
803 goto found_matching_key;
804 }
805
806
807 if (perm == KEY_PERM_UNDEF) {
808 perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR;
809 perm |= KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_LINK | KEY_USR_SETATTR;
810
811 if (ktype->read)
812 perm |= KEY_POS_READ | KEY_USR_READ;
813
814 if (ktype == &key_type_keyring || ktype->update)
815 perm |= KEY_USR_WRITE;
816 }
817
818
819 key = key_alloc(ktype, description, cred->fsuid, cred->fsgid, cred,
820 perm, flags);
821 if (IS_ERR(key)) {
822 key_ref = ERR_CAST(key);
823 goto error_3;
824 }
825
826
827 ret = __key_instantiate_and_link(key, payload, plen, keyring, NULL,
828 &prealloc);
829 if (ret < 0) {
830 key_put(key);
831 key_ref = ERR_PTR(ret);
832 goto error_3;
833 }
834
835 key_ref = make_key_ref(key, is_key_possessed(keyring_ref));
836
837 error_3:
838 __key_link_end(keyring, ktype, prealloc);
839 error_2:
840 key_type_put(ktype);
841 error:
842 return key_ref;
843
844 found_matching_key:
845
846
847
848 __key_link_end(keyring, ktype, prealloc);
849 key_type_put(ktype);
850
851 key_ref = __key_update(key_ref, payload, plen);
852 goto error;
853}
854EXPORT_SYMBOL(key_create_or_update);
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869int key_update(key_ref_t key_ref, const void *payload, size_t plen)
870{
871 struct key *key = key_ref_to_ptr(key_ref);
872 int ret;
873
874 key_check(key);
875
876
877 ret = key_permission(key_ref, KEY_WRITE);
878 if (ret < 0)
879 goto error;
880
881
882 ret = -EOPNOTSUPP;
883 if (key->type->update) {
884 down_write(&key->sem);
885
886 ret = key->type->update(key, payload, plen);
887 if (ret == 0)
888
889 clear_bit(KEY_FLAG_NEGATIVE, &key->flags);
890
891 up_write(&key->sem);
892 }
893
894 error:
895 return ret;
896}
897EXPORT_SYMBOL(key_update);
898
899
900
901
902
903
904
905
906
907
908void key_revoke(struct key *key)
909{
910 struct timespec now;
911 time_t time;
912
913 key_check(key);
914
915
916
917
918
919
920 down_write_nested(&key->sem, 1);
921 if (!test_and_set_bit(KEY_FLAG_REVOKED, &key->flags) &&
922 key->type->revoke)
923 key->type->revoke(key);
924
925
926 now = current_kernel_time();
927 time = now.tv_sec;
928 if (key->revoked_at == 0 || key->revoked_at > time) {
929 key->revoked_at = time;
930 key_schedule_gc(key->revoked_at + key_gc_delay);
931 }
932
933 up_write(&key->sem);
934}
935EXPORT_SYMBOL(key_revoke);
936
937
938
939
940
941
942
943
944
945int register_key_type(struct key_type *ktype)
946{
947 struct key_type *p;
948 int ret;
949
950 memset(&ktype->lock_class, 0, sizeof(ktype->lock_class));
951
952 ret = -EEXIST;
953 down_write(&key_types_sem);
954
955
956 list_for_each_entry(p, &key_types_list, link) {
957 if (strcmp(p->name, ktype->name) == 0)
958 goto out;
959 }
960
961
962 list_add(&ktype->link, &key_types_list);
963 ret = 0;
964
965out:
966 up_write(&key_types_sem);
967 return ret;
968}
969EXPORT_SYMBOL(register_key_type);
970
971
972
973
974
975
976
977
978
979void unregister_key_type(struct key_type *ktype)
980{
981 down_write(&key_types_sem);
982 list_del_init(&ktype->link);
983 downgrade_write(&key_types_sem);
984 key_gc_keytype(ktype);
985 up_read(&key_types_sem);
986}
987EXPORT_SYMBOL(unregister_key_type);
988
989
990
991
992void __init key_init(void)
993{
994
995 key_jar = kmem_cache_create("key_jar", sizeof(struct key),
996 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
997
998
999 list_add_tail(&key_type_keyring.link, &key_types_list);
1000 list_add_tail(&key_type_dead.link, &key_types_list);
1001 list_add_tail(&key_type_user.link, &key_types_list);
1002 list_add_tail(&key_type_logon.link, &key_types_list);
1003
1004
1005 rb_link_node(&root_key_user.node,
1006 NULL,
1007 &key_user_tree.rb_node);
1008
1009 rb_insert_color(&root_key_user.node,
1010 &key_user_tree);
1011}
1012