1
2
3
4
5
6
7
8#include <linux/export.h>
9#include <linux/init.h>
10#include <linux/sched.h>
11#include <linux/slab.h>
12#include <linux/security.h>
13#include <linux/seq_file.h>
14#include <linux/err.h>
15#include <linux/user_namespace.h>
16#include <linux/nsproxy.h>
17#include <keys/keyring-type.h>
18#include <keys/user-type.h>
19#include <linux/assoc_array_priv.h>
20#include <linux/uaccess.h>
21#include <net/net_namespace.h>
22#include "internal.h"
23
24
25
26
27
28#define KEYRING_SEARCH_MAX_DEPTH 6
29
30
31
32
33
34#define KEYRING_PTR_SUBTYPE 0x2UL
35
36static inline bool keyring_ptr_is_keyring(const struct assoc_array_ptr *x)
37{
38 return (unsigned long)x & KEYRING_PTR_SUBTYPE;
39}
40static inline struct key *keyring_ptr_to_key(const struct assoc_array_ptr *x)
41{
42 void *object = assoc_array_ptr_to_leaf(x);
43 return (struct key *)((unsigned long)object & ~KEYRING_PTR_SUBTYPE);
44}
45static inline void *keyring_key_to_ptr(struct key *key)
46{
47 if (key->type == &key_type_keyring)
48 return (void *)((unsigned long)key | KEYRING_PTR_SUBTYPE);
49 return key;
50}
51
52static DEFINE_RWLOCK(keyring_name_lock);
53
54
55
56
57void key_free_user_ns(struct user_namespace *ns)
58{
59 write_lock(&keyring_name_lock);
60 list_del_init(&ns->keyring_name_list);
61 write_unlock(&keyring_name_lock);
62
63 key_put(ns->user_keyring_register);
64#ifdef CONFIG_PERSISTENT_KEYRINGS
65 key_put(ns->persistent_keyring_register);
66#endif
67}
68
69
70
71
72
73
74static int keyring_preparse(struct key_preparsed_payload *prep);
75static void keyring_free_preparse(struct key_preparsed_payload *prep);
76static int keyring_instantiate(struct key *keyring,
77 struct key_preparsed_payload *prep);
78static void keyring_revoke(struct key *keyring);
79static void keyring_destroy(struct key *keyring);
80static void keyring_describe(const struct key *keyring, struct seq_file *m);
81static long keyring_read(const struct key *keyring,
82 char __user *buffer, size_t buflen);
83
84struct key_type key_type_keyring = {
85 .name = "keyring",
86 .def_datalen = 0,
87 .preparse = keyring_preparse,
88 .free_preparse = keyring_free_preparse,
89 .instantiate = keyring_instantiate,
90 .revoke = keyring_revoke,
91 .destroy = keyring_destroy,
92 .describe = keyring_describe,
93 .read = keyring_read,
94};
95EXPORT_SYMBOL(key_type_keyring);
96
97
98
99
100
101static DEFINE_MUTEX(keyring_serialise_link_lock);
102
103
104
105
106
107static void keyring_publish_name(struct key *keyring)
108{
109 struct user_namespace *ns = current_user_ns();
110
111 if (keyring->description &&
112 keyring->description[0] &&
113 keyring->description[0] != '.') {
114 write_lock(&keyring_name_lock);
115 list_add_tail(&keyring->name_link, &ns->keyring_name_list);
116 write_unlock(&keyring_name_lock);
117 }
118}
119
120
121
122
123static int keyring_preparse(struct key_preparsed_payload *prep)
124{
125 return prep->datalen != 0 ? -EINVAL : 0;
126}
127
128
129
130
131static void keyring_free_preparse(struct key_preparsed_payload *prep)
132{
133}
134
135
136
137
138
139
140static int keyring_instantiate(struct key *keyring,
141 struct key_preparsed_payload *prep)
142{
143 assoc_array_init(&keyring->keys);
144
145 keyring_publish_name(keyring);
146 return 0;
147}
148
149
150
151
152
153static u64 mult_64x32_and_fold(u64 x, u32 y)
154{
155 u64 hi = (u64)(u32)(x >> 32) * y;
156 u64 lo = (u64)(u32)(x) * y;
157 return lo + ((u64)(u32)hi << 32) + (u32)(hi >> 32);
158}
159
160
161
162
163static void hash_key_type_and_desc(struct keyring_index_key *index_key)
164{
165 const unsigned level_shift = ASSOC_ARRAY_LEVEL_STEP;
166 const unsigned long fan_mask = ASSOC_ARRAY_FAN_MASK;
167 const char *description = index_key->description;
168 unsigned long hash, type;
169 u32 piece;
170 u64 acc;
171 int n, desc_len = index_key->desc_len;
172
173 type = (unsigned long)index_key->type;
174 acc = mult_64x32_and_fold(type, desc_len + 13);
175 acc = mult_64x32_and_fold(acc, 9207);
176 piece = (unsigned long)index_key->domain_tag;
177 acc = mult_64x32_and_fold(acc, piece);
178 acc = mult_64x32_and_fold(acc, 9207);
179
180 for (;;) {
181 n = desc_len;
182 if (n <= 0)
183 break;
184 if (n > 4)
185 n = 4;
186 piece = 0;
187 memcpy(&piece, description, n);
188 description += n;
189 desc_len -= n;
190 acc = mult_64x32_and_fold(acc, piece);
191 acc = mult_64x32_and_fold(acc, 9207);
192 }
193
194
195 hash = acc;
196 if (ASSOC_ARRAY_KEY_CHUNK_SIZE == 32)
197 hash ^= acc >> 32;
198
199
200
201
202
203 if (index_key->type != &key_type_keyring && (hash & fan_mask) == 0)
204 hash |= (hash >> (ASSOC_ARRAY_KEY_CHUNK_SIZE - level_shift)) | 1;
205 else if (index_key->type == &key_type_keyring && (hash & fan_mask) != 0)
206 hash = (hash + (hash << level_shift)) & ~fan_mask;
207 index_key->hash = hash;
208}
209
210
211
212
213
214void key_set_index_key(struct keyring_index_key *index_key)
215{
216 static struct key_tag default_domain_tag = { .usage = REFCOUNT_INIT(1), };
217 size_t n = min_t(size_t, index_key->desc_len, sizeof(index_key->desc));
218
219 memcpy(index_key->desc, index_key->description, n);
220
221 if (!index_key->domain_tag) {
222 if (index_key->type->flags & KEY_TYPE_NET_DOMAIN)
223 index_key->domain_tag = current->nsproxy->net_ns->key_domain;
224 else
225 index_key->domain_tag = &default_domain_tag;
226 }
227
228 hash_key_type_and_desc(index_key);
229}
230
231
232
233
234
235
236
237
238bool key_put_tag(struct key_tag *tag)
239{
240 if (refcount_dec_and_test(&tag->usage)) {
241 kfree_rcu(tag, rcu);
242 return true;
243 }
244
245 return false;
246}
247
248
249
250
251
252
253
254
255
256void key_remove_domain(struct key_tag *domain_tag)
257{
258 domain_tag->removed = true;
259 if (!key_put_tag(domain_tag))
260 key_schedule_gc_links();
261}
262
263
264
265
266
267
268static unsigned long keyring_get_key_chunk(const void *data, int level)
269{
270 const struct keyring_index_key *index_key = data;
271 unsigned long chunk = 0;
272 const u8 *d;
273 int desc_len = index_key->desc_len, n = sizeof(chunk);
274
275 level /= ASSOC_ARRAY_KEY_CHUNK_SIZE;
276 switch (level) {
277 case 0:
278 return index_key->hash;
279 case 1:
280 return index_key->x;
281 case 2:
282 return (unsigned long)index_key->type;
283 case 3:
284 return (unsigned long)index_key->domain_tag;
285 default:
286 level -= 4;
287 if (desc_len <= sizeof(index_key->desc))
288 return 0;
289
290 d = index_key->description + sizeof(index_key->desc);
291 d += level * sizeof(long);
292 desc_len -= sizeof(index_key->desc);
293 if (desc_len > n)
294 desc_len = n;
295 do {
296 chunk <<= 8;
297 chunk |= *d++;
298 } while (--desc_len > 0);
299 return chunk;
300 }
301}
302
303static unsigned long keyring_get_object_key_chunk(const void *object, int level)
304{
305 const struct key *key = keyring_ptr_to_key(object);
306 return keyring_get_key_chunk(&key->index_key, level);
307}
308
309static bool keyring_compare_object(const void *object, const void *data)
310{
311 const struct keyring_index_key *index_key = data;
312 const struct key *key = keyring_ptr_to_key(object);
313
314 return key->index_key.type == index_key->type &&
315 key->index_key.domain_tag == index_key->domain_tag &&
316 key->index_key.desc_len == index_key->desc_len &&
317 memcmp(key->index_key.description, index_key->description,
318 index_key->desc_len) == 0;
319}
320
321
322
323
324
325static int keyring_diff_objects(const void *object, const void *data)
326{
327 const struct key *key_a = keyring_ptr_to_key(object);
328 const struct keyring_index_key *a = &key_a->index_key;
329 const struct keyring_index_key *b = data;
330 unsigned long seg_a, seg_b;
331 int level, i;
332
333 level = 0;
334 seg_a = a->hash;
335 seg_b = b->hash;
336 if ((seg_a ^ seg_b) != 0)
337 goto differ;
338 level += ASSOC_ARRAY_KEY_CHUNK_SIZE / 8;
339
340
341
342
343
344 seg_a = a->x;
345 seg_b = b->x;
346 if ((seg_a ^ seg_b) != 0)
347 goto differ;
348 level += sizeof(unsigned long);
349
350
351 seg_a = (unsigned long)a->type;
352 seg_b = (unsigned long)b->type;
353 if ((seg_a ^ seg_b) != 0)
354 goto differ;
355 level += sizeof(unsigned long);
356
357 seg_a = (unsigned long)a->domain_tag;
358 seg_b = (unsigned long)b->domain_tag;
359 if ((seg_a ^ seg_b) != 0)
360 goto differ;
361 level += sizeof(unsigned long);
362
363 i = sizeof(a->desc);
364 if (a->desc_len <= i)
365 goto same;
366
367 for (; i < a->desc_len; i++) {
368 seg_a = *(unsigned char *)(a->description + i);
369 seg_b = *(unsigned char *)(b->description + i);
370 if ((seg_a ^ seg_b) != 0)
371 goto differ_plus_i;
372 }
373
374same:
375 return -1;
376
377differ_plus_i:
378 level += i;
379differ:
380 i = level * 8 + __ffs(seg_a ^ seg_b);
381 return i;
382}
383
384
385
386
387static void keyring_free_object(void *object)
388{
389 key_put(keyring_ptr_to_key(object));
390}
391
392
393
394
395static const struct assoc_array_ops keyring_assoc_array_ops = {
396 .get_key_chunk = keyring_get_key_chunk,
397 .get_object_key_chunk = keyring_get_object_key_chunk,
398 .compare_object = keyring_compare_object,
399 .diff_objects = keyring_diff_objects,
400 .free_object = keyring_free_object,
401};
402
403
404
405
406
407
408
409
410
411
412static void keyring_destroy(struct key *keyring)
413{
414 if (keyring->description) {
415 write_lock(&keyring_name_lock);
416
417 if (keyring->name_link.next != NULL &&
418 !list_empty(&keyring->name_link))
419 list_del(&keyring->name_link);
420
421 write_unlock(&keyring_name_lock);
422 }
423
424 if (keyring->restrict_link) {
425 struct key_restriction *keyres = keyring->restrict_link;
426
427 key_put(keyres->key);
428 kfree(keyres);
429 }
430
431 assoc_array_destroy(&keyring->keys, &keyring_assoc_array_ops);
432}
433
434
435
436
437static void keyring_describe(const struct key *keyring, struct seq_file *m)
438{
439 if (keyring->description)
440 seq_puts(m, keyring->description);
441 else
442 seq_puts(m, "[anon]");
443
444 if (key_is_positive(keyring)) {
445 if (keyring->keys.nr_leaves_on_tree != 0)
446 seq_printf(m, ": %lu", keyring->keys.nr_leaves_on_tree);
447 else
448 seq_puts(m, ": empty");
449 }
450}
451
452struct keyring_read_iterator_context {
453 size_t buflen;
454 size_t count;
455 key_serial_t *buffer;
456};
457
458static int keyring_read_iterator(const void *object, void *data)
459{
460 struct keyring_read_iterator_context *ctx = data;
461 const struct key *key = keyring_ptr_to_key(object);
462
463 kenter("{%s,%d},,{%zu/%zu}",
464 key->type->name, key->serial, ctx->count, ctx->buflen);
465
466 if (ctx->count >= ctx->buflen)
467 return 1;
468
469 *ctx->buffer++ = key->serial;
470 ctx->count += sizeof(key->serial);
471 return 0;
472}
473
474
475
476
477
478
479
480
481static long keyring_read(const struct key *keyring,
482 char *buffer, size_t buflen)
483{
484 struct keyring_read_iterator_context ctx;
485 long ret;
486
487 kenter("{%d},,%zu", key_serial(keyring), buflen);
488
489 if (buflen & (sizeof(key_serial_t) - 1))
490 return -EINVAL;
491
492
493 if (buffer && buflen) {
494 ctx.buffer = (key_serial_t *)buffer;
495 ctx.buflen = buflen;
496 ctx.count = 0;
497 ret = assoc_array_iterate(&keyring->keys,
498 keyring_read_iterator, &ctx);
499 if (ret < 0) {
500 kleave(" = %ld [iterate]", ret);
501 return ret;
502 }
503 }
504
505
506 ret = keyring->keys.nr_leaves_on_tree * sizeof(key_serial_t);
507 if (ret <= buflen)
508 kleave("= %ld [ok]", ret);
509 else
510 kleave("= %ld [buffer too small]", ret);
511 return ret;
512}
513
514
515
516
517struct key *keyring_alloc(const char *description, kuid_t uid, kgid_t gid,
518 const struct cred *cred, key_perm_t perm,
519 unsigned long flags,
520 struct key_restriction *restrict_link,
521 struct key *dest)
522{
523 struct key *keyring;
524 int ret;
525
526 keyring = key_alloc(&key_type_keyring, description,
527 uid, gid, cred, perm, flags, restrict_link);
528 if (!IS_ERR(keyring)) {
529 ret = key_instantiate_and_link(keyring, NULL, 0, dest, NULL);
530 if (ret < 0) {
531 key_put(keyring);
532 keyring = ERR_PTR(ret);
533 }
534 }
535
536 return keyring;
537}
538EXPORT_SYMBOL(keyring_alloc);
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554int restrict_link_reject(struct key *keyring,
555 const struct key_type *type,
556 const union key_payload *payload,
557 struct key *restriction_key)
558{
559 return -EPERM;
560}
561
562
563
564
565bool key_default_cmp(const struct key *key,
566 const struct key_match_data *match_data)
567{
568 return strcmp(key->description, match_data->raw_data) == 0;
569}
570
571
572
573
574static int keyring_search_iterator(const void *object, void *iterator_data)
575{
576 struct keyring_search_context *ctx = iterator_data;
577 const struct key *key = keyring_ptr_to_key(object);
578 unsigned long kflags = READ_ONCE(key->flags);
579 short state = READ_ONCE(key->state);
580
581 kenter("{%d}", key->serial);
582
583
584 if (key->type != ctx->index_key.type) {
585 kleave(" = 0 [!type]");
586 return 0;
587 }
588
589
590 if (ctx->flags & KEYRING_SEARCH_DO_STATE_CHECK) {
591 time64_t expiry = READ_ONCE(key->expiry);
592
593 if (kflags & ((1 << KEY_FLAG_INVALIDATED) |
594 (1 << KEY_FLAG_REVOKED))) {
595 ctx->result = ERR_PTR(-EKEYREVOKED);
596 kleave(" = %d [invrev]", ctx->skipped_ret);
597 goto skipped;
598 }
599
600 if (expiry && ctx->now >= expiry) {
601 if (!(ctx->flags & KEYRING_SEARCH_SKIP_EXPIRED))
602 ctx->result = ERR_PTR(-EKEYEXPIRED);
603 kleave(" = %d [expire]", ctx->skipped_ret);
604 goto skipped;
605 }
606 }
607
608
609 if (!ctx->match_data.cmp(key, &ctx->match_data)) {
610 kleave(" = 0 [!match]");
611 return 0;
612 }
613
614
615 if (!(ctx->flags & KEYRING_SEARCH_NO_CHECK_PERM) &&
616 key_task_permission(make_key_ref(key, ctx->possessed),
617 ctx->cred, KEY_NEED_SEARCH) < 0) {
618 ctx->result = ERR_PTR(-EACCES);
619 kleave(" = %d [!perm]", ctx->skipped_ret);
620 goto skipped;
621 }
622
623 if (ctx->flags & KEYRING_SEARCH_DO_STATE_CHECK) {
624
625 if (state < 0) {
626 ctx->result = ERR_PTR(state);
627 kleave(" = %d [neg]", ctx->skipped_ret);
628 goto skipped;
629 }
630 }
631
632
633 ctx->result = make_key_ref(key, ctx->possessed);
634 kleave(" = 1 [found]");
635 return 1;
636
637skipped:
638 return ctx->skipped_ret;
639}
640
641
642
643
644
645
646static int search_keyring(struct key *keyring, struct keyring_search_context *ctx)
647{
648 if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_DIRECT) {
649 const void *object;
650
651 object = assoc_array_find(&keyring->keys,
652 &keyring_assoc_array_ops,
653 &ctx->index_key);
654 return object ? ctx->iterator(object, ctx) : 0;
655 }
656 return assoc_array_iterate(&keyring->keys, ctx->iterator, ctx);
657}
658
659
660
661
662
663static bool search_nested_keyrings(struct key *keyring,
664 struct keyring_search_context *ctx)
665{
666 struct {
667 struct key *keyring;
668 struct assoc_array_node *node;
669 int slot;
670 } stack[KEYRING_SEARCH_MAX_DEPTH];
671
672 struct assoc_array_shortcut *shortcut;
673 struct assoc_array_node *node;
674 struct assoc_array_ptr *ptr;
675 struct key *key;
676 int sp = 0, slot;
677
678 kenter("{%d},{%s,%s}",
679 keyring->serial,
680 ctx->index_key.type->name,
681 ctx->index_key.description);
682
683#define STATE_CHECKS (KEYRING_SEARCH_NO_STATE_CHECK | KEYRING_SEARCH_DO_STATE_CHECK)
684 BUG_ON((ctx->flags & STATE_CHECKS) == 0 ||
685 (ctx->flags & STATE_CHECKS) == STATE_CHECKS);
686
687 if (ctx->index_key.description)
688 key_set_index_key(&ctx->index_key);
689
690
691
692
693 if (ctx->match_data.lookup_type == KEYRING_SEARCH_LOOKUP_ITERATE ||
694 keyring_compare_object(keyring, &ctx->index_key)) {
695 ctx->skipped_ret = 2;
696 switch (ctx->iterator(keyring_key_to_ptr(keyring), ctx)) {
697 case 1:
698 goto found;
699 case 2:
700 return false;
701 default:
702 break;
703 }
704 }
705
706 ctx->skipped_ret = 0;
707
708
709descend_to_keyring:
710 kdebug("descend to %d", keyring->serial);
711 if (keyring->flags & ((1 << KEY_FLAG_INVALIDATED) |
712 (1 << KEY_FLAG_REVOKED)))
713 goto not_this_keyring;
714
715
716
717
718 if (search_keyring(keyring, ctx))
719 goto found;
720
721
722
723
724
725
726
727
728
729 if (!(ctx->flags & KEYRING_SEARCH_RECURSE))
730 goto not_this_keyring;
731
732 ptr = READ_ONCE(keyring->keys.root);
733 if (!ptr)
734 goto not_this_keyring;
735
736 if (assoc_array_ptr_is_shortcut(ptr)) {
737
738
739
740
741 shortcut = assoc_array_ptr_to_shortcut(ptr);
742 if ((shortcut->index_key[0] & ASSOC_ARRAY_FAN_MASK) != 0)
743 goto not_this_keyring;
744
745 ptr = READ_ONCE(shortcut->next_node);
746 node = assoc_array_ptr_to_node(ptr);
747 goto begin_node;
748 }
749
750 node = assoc_array_ptr_to_node(ptr);
751 ptr = node->slots[0];
752 if (!assoc_array_ptr_is_meta(ptr))
753 goto begin_node;
754
755descend_to_node:
756
757
758
759 kdebug("descend");
760 if (assoc_array_ptr_is_shortcut(ptr)) {
761 shortcut = assoc_array_ptr_to_shortcut(ptr);
762 ptr = READ_ONCE(shortcut->next_node);
763 BUG_ON(!assoc_array_ptr_is_node(ptr));
764 }
765 node = assoc_array_ptr_to_node(ptr);
766
767begin_node:
768 kdebug("begin_node");
769 slot = 0;
770ascend_to_node:
771
772 for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
773 ptr = READ_ONCE(node->slots[slot]);
774
775 if (assoc_array_ptr_is_meta(ptr) && node->back_pointer)
776 goto descend_to_node;
777
778 if (!keyring_ptr_is_keyring(ptr))
779 continue;
780
781 key = keyring_ptr_to_key(ptr);
782
783 if (sp >= KEYRING_SEARCH_MAX_DEPTH) {
784 if (ctx->flags & KEYRING_SEARCH_DETECT_TOO_DEEP) {
785 ctx->result = ERR_PTR(-ELOOP);
786 return false;
787 }
788 goto not_this_keyring;
789 }
790
791
792 if (!(ctx->flags & KEYRING_SEARCH_NO_CHECK_PERM) &&
793 key_task_permission(make_key_ref(key, ctx->possessed),
794 ctx->cred, KEY_NEED_SEARCH) < 0)
795 continue;
796
797
798 stack[sp].keyring = keyring;
799 stack[sp].node = node;
800 stack[sp].slot = slot;
801 sp++;
802
803
804 keyring = key;
805 goto descend_to_keyring;
806 }
807
808
809
810
811 ptr = READ_ONCE(node->back_pointer);
812 slot = node->parent_slot;
813
814 if (ptr && assoc_array_ptr_is_shortcut(ptr)) {
815 shortcut = assoc_array_ptr_to_shortcut(ptr);
816 ptr = READ_ONCE(shortcut->back_pointer);
817 slot = shortcut->parent_slot;
818 }
819 if (!ptr)
820 goto not_this_keyring;
821 node = assoc_array_ptr_to_node(ptr);
822 slot++;
823
824
825
826
827
828 if (node->back_pointer) {
829 kdebug("ascend %d", slot);
830 goto ascend_to_node;
831 }
832
833
834
835
836not_this_keyring:
837 kdebug("not_this_keyring %d", sp);
838 if (sp <= 0) {
839 kleave(" = false");
840 return false;
841 }
842
843
844 sp--;
845 keyring = stack[sp].keyring;
846 node = stack[sp].node;
847 slot = stack[sp].slot + 1;
848 kdebug("ascend to %d [%d]", keyring->serial, slot);
849 goto ascend_to_node;
850
851
852found:
853 key = key_ref_to_ptr(ctx->result);
854 key_check(key);
855 if (!(ctx->flags & KEYRING_SEARCH_NO_UPDATE_TIME)) {
856 key->last_used_at = ctx->now;
857 keyring->last_used_at = ctx->now;
858 while (sp > 0)
859 stack[--sp].keyring->last_used_at = ctx->now;
860 }
861 kleave(" = true");
862 return true;
863}
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899key_ref_t keyring_search_rcu(key_ref_t keyring_ref,
900 struct keyring_search_context *ctx)
901{
902 struct key *keyring;
903 long err;
904
905 ctx->iterator = keyring_search_iterator;
906 ctx->possessed = is_key_possessed(keyring_ref);
907 ctx->result = ERR_PTR(-EAGAIN);
908
909 keyring = key_ref_to_ptr(keyring_ref);
910 key_check(keyring);
911
912 if (keyring->type != &key_type_keyring)
913 return ERR_PTR(-ENOTDIR);
914
915 if (!(ctx->flags & KEYRING_SEARCH_NO_CHECK_PERM)) {
916 err = key_task_permission(keyring_ref, ctx->cred, KEY_NEED_SEARCH);
917 if (err < 0)
918 return ERR_PTR(err);
919 }
920
921 ctx->now = ktime_get_real_seconds();
922 if (search_nested_keyrings(keyring, ctx))
923 __key_get(key_ref_to_ptr(ctx->result));
924 return ctx->result;
925}
926
927
928
929
930
931
932
933
934
935
936
937key_ref_t keyring_search(key_ref_t keyring,
938 struct key_type *type,
939 const char *description,
940 bool recurse)
941{
942 struct keyring_search_context ctx = {
943 .index_key.type = type,
944 .index_key.description = description,
945 .index_key.desc_len = strlen(description),
946 .cred = current_cred(),
947 .match_data.cmp = key_default_cmp,
948 .match_data.raw_data = description,
949 .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
950 .flags = KEYRING_SEARCH_DO_STATE_CHECK,
951 };
952 key_ref_t key;
953 int ret;
954
955 if (recurse)
956 ctx.flags |= KEYRING_SEARCH_RECURSE;
957 if (type->match_preparse) {
958 ret = type->match_preparse(&ctx.match_data);
959 if (ret < 0)
960 return ERR_PTR(ret);
961 }
962
963 rcu_read_lock();
964 key = keyring_search_rcu(keyring, &ctx);
965 rcu_read_unlock();
966
967 if (type->match_free)
968 type->match_free(&ctx.match_data);
969 return key;
970}
971EXPORT_SYMBOL(keyring_search);
972
973static struct key_restriction *keyring_restriction_alloc(
974 key_restrict_link_func_t check)
975{
976 struct key_restriction *keyres =
977 kzalloc(sizeof(struct key_restriction), GFP_KERNEL);
978
979 if (!keyres)
980 return ERR_PTR(-ENOMEM);
981
982 keyres->check = check;
983
984 return keyres;
985}
986
987
988
989
990
991static DECLARE_RWSEM(keyring_serialise_restrict_sem);
992
993
994
995
996
997static bool keyring_detect_restriction_cycle(const struct key *dest_keyring,
998 struct key_restriction *keyres)
999{
1000 while (keyres && keyres->key &&
1001 keyres->key->type == &key_type_keyring) {
1002 if (keyres->key == dest_keyring)
1003 return true;
1004
1005 keyres = keyres->key->restrict_link;
1006 }
1007
1008 return false;
1009}
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021int keyring_restrict(key_ref_t keyring_ref, const char *type,
1022 const char *restriction)
1023{
1024 struct key *keyring;
1025 struct key_type *restrict_type = NULL;
1026 struct key_restriction *restrict_link;
1027 int ret = 0;
1028
1029 keyring = key_ref_to_ptr(keyring_ref);
1030 key_check(keyring);
1031
1032 if (keyring->type != &key_type_keyring)
1033 return -ENOTDIR;
1034
1035 if (!type) {
1036 restrict_link = keyring_restriction_alloc(restrict_link_reject);
1037 } else {
1038 restrict_type = key_type_lookup(type);
1039
1040 if (IS_ERR(restrict_type))
1041 return PTR_ERR(restrict_type);
1042
1043 if (!restrict_type->lookup_restriction) {
1044 ret = -ENOENT;
1045 goto error;
1046 }
1047
1048 restrict_link = restrict_type->lookup_restriction(restriction);
1049 }
1050
1051 if (IS_ERR(restrict_link)) {
1052 ret = PTR_ERR(restrict_link);
1053 goto error;
1054 }
1055
1056 down_write(&keyring->sem);
1057 down_write(&keyring_serialise_restrict_sem);
1058
1059 if (keyring->restrict_link) {
1060 ret = -EEXIST;
1061 } else if (keyring_detect_restriction_cycle(keyring, restrict_link)) {
1062 ret = -EDEADLK;
1063 } else {
1064 keyring->restrict_link = restrict_link;
1065 notify_key(keyring, NOTIFY_KEY_SETATTR, 0);
1066 }
1067
1068 up_write(&keyring_serialise_restrict_sem);
1069 up_write(&keyring->sem);
1070
1071 if (ret < 0) {
1072 key_put(restrict_link->key);
1073 kfree(restrict_link);
1074 }
1075
1076error:
1077 if (restrict_type)
1078 key_type_put(restrict_type);
1079
1080 return ret;
1081}
1082EXPORT_SYMBOL(keyring_restrict);
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098key_ref_t find_key_to_update(key_ref_t keyring_ref,
1099 const struct keyring_index_key *index_key)
1100{
1101 struct key *keyring, *key;
1102 const void *object;
1103
1104 keyring = key_ref_to_ptr(keyring_ref);
1105
1106 kenter("{%d},{%s,%s}",
1107 keyring->serial, index_key->type->name, index_key->description);
1108
1109 object = assoc_array_find(&keyring->keys, &keyring_assoc_array_ops,
1110 index_key);
1111
1112 if (object)
1113 goto found;
1114
1115 kleave(" = NULL");
1116 return NULL;
1117
1118found:
1119 key = keyring_ptr_to_key(object);
1120 if (key->flags & ((1 << KEY_FLAG_INVALIDATED) |
1121 (1 << KEY_FLAG_REVOKED))) {
1122 kleave(" = NULL [x]");
1123 return NULL;
1124 }
1125 __key_get(key);
1126 kleave(" = {%d}", key->serial);
1127 return make_key_ref(key, is_key_possessed(keyring_ref));
1128}
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141struct key *find_keyring_by_name(const char *name, bool uid_keyring)
1142{
1143 struct user_namespace *ns = current_user_ns();
1144 struct key *keyring;
1145
1146 if (!name)
1147 return ERR_PTR(-EINVAL);
1148
1149 read_lock(&keyring_name_lock);
1150
1151
1152
1153
1154 list_for_each_entry(keyring, &ns->keyring_name_list, name_link) {
1155 if (!kuid_has_mapping(ns, keyring->user->uid))
1156 continue;
1157
1158 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
1159 continue;
1160
1161 if (strcmp(keyring->description, name) != 0)
1162 continue;
1163
1164 if (uid_keyring) {
1165 if (!test_bit(KEY_FLAG_UID_KEYRING,
1166 &keyring->flags))
1167 continue;
1168 } else {
1169 if (key_permission(make_key_ref(keyring, 0),
1170 KEY_NEED_SEARCH) < 0)
1171 continue;
1172 }
1173
1174
1175
1176
1177 if (!refcount_inc_not_zero(&keyring->usage))
1178 continue;
1179 keyring->last_used_at = ktime_get_real_seconds();
1180 goto out;
1181 }
1182
1183 keyring = ERR_PTR(-ENOKEY);
1184out:
1185 read_unlock(&keyring_name_lock);
1186 return keyring;
1187}
1188
1189static int keyring_detect_cycle_iterator(const void *object,
1190 void *iterator_data)
1191{
1192 struct keyring_search_context *ctx = iterator_data;
1193 const struct key *key = keyring_ptr_to_key(object);
1194
1195 kenter("{%d}", key->serial);
1196
1197
1198
1199 if (key != ctx->match_data.raw_data)
1200 return 0;
1201
1202 ctx->result = ERR_PTR(-EDEADLK);
1203 return 1;
1204}
1205
1206
1207
1208
1209
1210
1211
1212
1213static int keyring_detect_cycle(struct key *A, struct key *B)
1214{
1215 struct keyring_search_context ctx = {
1216 .index_key = A->index_key,
1217 .match_data.raw_data = A,
1218 .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
1219 .iterator = keyring_detect_cycle_iterator,
1220 .flags = (KEYRING_SEARCH_NO_STATE_CHECK |
1221 KEYRING_SEARCH_NO_UPDATE_TIME |
1222 KEYRING_SEARCH_NO_CHECK_PERM |
1223 KEYRING_SEARCH_DETECT_TOO_DEEP |
1224 KEYRING_SEARCH_RECURSE),
1225 };
1226
1227 rcu_read_lock();
1228 search_nested_keyrings(B, &ctx);
1229 rcu_read_unlock();
1230 return PTR_ERR(ctx.result) == -EAGAIN ? 0 : PTR_ERR(ctx.result);
1231}
1232
1233
1234
1235
1236int __key_link_lock(struct key *keyring,
1237 const struct keyring_index_key *index_key)
1238 __acquires(&keyring->sem)
1239 __acquires(&keyring_serialise_link_lock)
1240{
1241 if (keyring->type != &key_type_keyring)
1242 return -ENOTDIR;
1243
1244 down_write(&keyring->sem);
1245
1246
1247
1248
1249 if (index_key->type == &key_type_keyring)
1250 mutex_lock(&keyring_serialise_link_lock);
1251
1252 return 0;
1253}
1254
1255
1256
1257
1258int __key_move_lock(struct key *l_keyring, struct key *u_keyring,
1259 const struct keyring_index_key *index_key)
1260 __acquires(&l_keyring->sem)
1261 __acquires(&u_keyring->sem)
1262 __acquires(&keyring_serialise_link_lock)
1263{
1264 if (l_keyring->type != &key_type_keyring ||
1265 u_keyring->type != &key_type_keyring)
1266 return -ENOTDIR;
1267
1268
1269
1270
1271
1272 if (l_keyring < u_keyring) {
1273 down_write(&l_keyring->sem);
1274 down_write_nested(&u_keyring->sem, 1);
1275 } else {
1276 down_write(&u_keyring->sem);
1277 down_write_nested(&l_keyring->sem, 1);
1278 }
1279
1280
1281
1282
1283 if (index_key->type == &key_type_keyring)
1284 mutex_lock(&keyring_serialise_link_lock);
1285
1286 return 0;
1287}
1288
1289
1290
1291
1292int __key_link_begin(struct key *keyring,
1293 const struct keyring_index_key *index_key,
1294 struct assoc_array_edit **_edit)
1295{
1296 struct assoc_array_edit *edit;
1297 int ret;
1298
1299 kenter("%d,%s,%s,",
1300 keyring->serial, index_key->type->name, index_key->description);
1301
1302 BUG_ON(index_key->desc_len == 0);
1303 BUG_ON(*_edit != NULL);
1304
1305 *_edit = NULL;
1306
1307 ret = -EKEYREVOKED;
1308 if (test_bit(KEY_FLAG_REVOKED, &keyring->flags))
1309 goto error;
1310
1311
1312
1313
1314 edit = assoc_array_insert(&keyring->keys,
1315 &keyring_assoc_array_ops,
1316 index_key,
1317 NULL);
1318 if (IS_ERR(edit)) {
1319 ret = PTR_ERR(edit);
1320 goto error;
1321 }
1322
1323
1324
1325
1326 if (!edit->dead_leaf) {
1327 ret = key_payload_reserve(keyring,
1328 keyring->datalen + KEYQUOTA_LINK_BYTES);
1329 if (ret < 0)
1330 goto error_cancel;
1331 }
1332
1333 *_edit = edit;
1334 kleave(" = 0");
1335 return 0;
1336
1337error_cancel:
1338 assoc_array_cancel_edit(edit);
1339error:
1340 kleave(" = %d", ret);
1341 return ret;
1342}
1343
1344
1345
1346
1347
1348
1349
1350int __key_link_check_live_key(struct key *keyring, struct key *key)
1351{
1352 if (key->type == &key_type_keyring)
1353
1354
1355 return keyring_detect_cycle(keyring, key);
1356 return 0;
1357}
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367void __key_link(struct key *keyring, struct key *key,
1368 struct assoc_array_edit **_edit)
1369{
1370 __key_get(key);
1371 assoc_array_insert_set_object(*_edit, keyring_key_to_ptr(key));
1372 assoc_array_apply_edit(*_edit);
1373 *_edit = NULL;
1374 notify_key(keyring, NOTIFY_KEY_LINKED, key_serial(key));
1375}
1376
1377
1378
1379
1380
1381
1382void __key_link_end(struct key *keyring,
1383 const struct keyring_index_key *index_key,
1384 struct assoc_array_edit *edit)
1385 __releases(&keyring->sem)
1386 __releases(&keyring_serialise_link_lock)
1387{
1388 BUG_ON(index_key->type == NULL);
1389 kenter("%d,%s,", keyring->serial, index_key->type->name);
1390
1391 if (edit) {
1392 if (!edit->dead_leaf) {
1393 key_payload_reserve(keyring,
1394 keyring->datalen - KEYQUOTA_LINK_BYTES);
1395 }
1396 assoc_array_cancel_edit(edit);
1397 }
1398 up_write(&keyring->sem);
1399
1400 if (index_key->type == &key_type_keyring)
1401 mutex_unlock(&keyring_serialise_link_lock);
1402}
1403
1404
1405
1406
1407static int __key_link_check_restriction(struct key *keyring, struct key *key)
1408{
1409 if (!keyring->restrict_link || !keyring->restrict_link->check)
1410 return 0;
1411 return keyring->restrict_link->check(keyring, key->type, &key->payload,
1412 keyring->restrict_link->key);
1413}
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435int key_link(struct key *keyring, struct key *key)
1436{
1437 struct assoc_array_edit *edit = NULL;
1438 int ret;
1439
1440 kenter("{%d,%d}", keyring->serial, refcount_read(&keyring->usage));
1441
1442 key_check(keyring);
1443 key_check(key);
1444
1445 ret = __key_link_lock(keyring, &key->index_key);
1446 if (ret < 0)
1447 goto error;
1448
1449 ret = __key_link_begin(keyring, &key->index_key, &edit);
1450 if (ret < 0)
1451 goto error_end;
1452
1453 kdebug("begun {%d,%d}", keyring->serial, refcount_read(&keyring->usage));
1454 ret = __key_link_check_restriction(keyring, key);
1455 if (ret == 0)
1456 ret = __key_link_check_live_key(keyring, key);
1457 if (ret == 0)
1458 __key_link(keyring, key, &edit);
1459
1460error_end:
1461 __key_link_end(keyring, &key->index_key, edit);
1462error:
1463 kleave(" = %d {%d,%d}", ret, keyring->serial, refcount_read(&keyring->usage));
1464 return ret;
1465}
1466EXPORT_SYMBOL(key_link);
1467
1468
1469
1470
1471static int __key_unlink_lock(struct key *keyring)
1472 __acquires(&keyring->sem)
1473{
1474 if (keyring->type != &key_type_keyring)
1475 return -ENOTDIR;
1476
1477 down_write(&keyring->sem);
1478 return 0;
1479}
1480
1481
1482
1483
1484static int __key_unlink_begin(struct key *keyring, struct key *key,
1485 struct assoc_array_edit **_edit)
1486{
1487 struct assoc_array_edit *edit;
1488
1489 BUG_ON(*_edit != NULL);
1490
1491 edit = assoc_array_delete(&keyring->keys, &keyring_assoc_array_ops,
1492 &key->index_key);
1493 if (IS_ERR(edit))
1494 return PTR_ERR(edit);
1495
1496 if (!edit)
1497 return -ENOENT;
1498
1499 *_edit = edit;
1500 return 0;
1501}
1502
1503
1504
1505
1506static void __key_unlink(struct key *keyring, struct key *key,
1507 struct assoc_array_edit **_edit)
1508{
1509 assoc_array_apply_edit(*_edit);
1510 notify_key(keyring, NOTIFY_KEY_UNLINKED, key_serial(key));
1511 *_edit = NULL;
1512 key_payload_reserve(keyring, keyring->datalen - KEYQUOTA_LINK_BYTES);
1513}
1514
1515
1516
1517
1518static void __key_unlink_end(struct key *keyring,
1519 struct key *key,
1520 struct assoc_array_edit *edit)
1521 __releases(&keyring->sem)
1522{
1523 if (edit)
1524 assoc_array_cancel_edit(edit);
1525 up_write(&keyring->sem);
1526}
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545int key_unlink(struct key *keyring, struct key *key)
1546{
1547 struct assoc_array_edit *edit = NULL;
1548 int ret;
1549
1550 key_check(keyring);
1551 key_check(key);
1552
1553 ret = __key_unlink_lock(keyring);
1554 if (ret < 0)
1555 return ret;
1556
1557 ret = __key_unlink_begin(keyring, key, &edit);
1558 if (ret == 0)
1559 __key_unlink(keyring, key, &edit);
1560 __key_unlink_end(keyring, key, edit);
1561 return ret;
1562}
1563EXPORT_SYMBOL(key_unlink);
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590int key_move(struct key *key,
1591 struct key *from_keyring,
1592 struct key *to_keyring,
1593 unsigned int flags)
1594{
1595 struct assoc_array_edit *from_edit = NULL, *to_edit = NULL;
1596 int ret;
1597
1598 kenter("%d,%d,%d", key->serial, from_keyring->serial, to_keyring->serial);
1599
1600 if (from_keyring == to_keyring)
1601 return 0;
1602
1603 key_check(key);
1604 key_check(from_keyring);
1605 key_check(to_keyring);
1606
1607 ret = __key_move_lock(from_keyring, to_keyring, &key->index_key);
1608 if (ret < 0)
1609 goto out;
1610 ret = __key_unlink_begin(from_keyring, key, &from_edit);
1611 if (ret < 0)
1612 goto error;
1613 ret = __key_link_begin(to_keyring, &key->index_key, &to_edit);
1614 if (ret < 0)
1615 goto error;
1616
1617 ret = -EEXIST;
1618 if (to_edit->dead_leaf && (flags & KEYCTL_MOVE_EXCL))
1619 goto error;
1620
1621 ret = __key_link_check_restriction(to_keyring, key);
1622 if (ret < 0)
1623 goto error;
1624 ret = __key_link_check_live_key(to_keyring, key);
1625 if (ret < 0)
1626 goto error;
1627
1628 __key_unlink(from_keyring, key, &from_edit);
1629 __key_link(to_keyring, key, &to_edit);
1630error:
1631 __key_link_end(to_keyring, &key->index_key, to_edit);
1632 __key_unlink_end(from_keyring, key, from_edit);
1633out:
1634 kleave(" = %d", ret);
1635 return ret;
1636}
1637EXPORT_SYMBOL(key_move);
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647int keyring_clear(struct key *keyring)
1648{
1649 struct assoc_array_edit *edit;
1650 int ret;
1651
1652 if (keyring->type != &key_type_keyring)
1653 return -ENOTDIR;
1654
1655 down_write(&keyring->sem);
1656
1657 edit = assoc_array_clear(&keyring->keys, &keyring_assoc_array_ops);
1658 if (IS_ERR(edit)) {
1659 ret = PTR_ERR(edit);
1660 } else {
1661 if (edit)
1662 assoc_array_apply_edit(edit);
1663 notify_key(keyring, NOTIFY_KEY_CLEARED, 0);
1664 key_payload_reserve(keyring, 0);
1665 ret = 0;
1666 }
1667
1668 up_write(&keyring->sem);
1669 return ret;
1670}
1671EXPORT_SYMBOL(keyring_clear);
1672
1673
1674
1675
1676
1677
1678static void keyring_revoke(struct key *keyring)
1679{
1680 struct assoc_array_edit *edit;
1681
1682 edit = assoc_array_clear(&keyring->keys, &keyring_assoc_array_ops);
1683 if (!IS_ERR(edit)) {
1684 if (edit)
1685 assoc_array_apply_edit(edit);
1686 key_payload_reserve(keyring, 0);
1687 }
1688}
1689
1690static bool keyring_gc_select_iterator(void *object, void *iterator_data)
1691{
1692 struct key *key = keyring_ptr_to_key(object);
1693 time64_t *limit = iterator_data;
1694
1695 if (key_is_dead(key, *limit))
1696 return false;
1697 key_get(key);
1698 return true;
1699}
1700
1701static int keyring_gc_check_iterator(const void *object, void *iterator_data)
1702{
1703 const struct key *key = keyring_ptr_to_key(object);
1704 time64_t *limit = iterator_data;
1705
1706 key_check(key);
1707 return key_is_dead(key, *limit);
1708}
1709
1710
1711
1712
1713
1714
1715
1716void keyring_gc(struct key *keyring, time64_t limit)
1717{
1718 int result;
1719
1720 kenter("%x{%s}", keyring->serial, keyring->description ?: "");
1721
1722 if (keyring->flags & ((1 << KEY_FLAG_INVALIDATED) |
1723 (1 << KEY_FLAG_REVOKED)))
1724 goto dont_gc;
1725
1726
1727 rcu_read_lock();
1728 result = assoc_array_iterate(&keyring->keys,
1729 keyring_gc_check_iterator, &limit);
1730 rcu_read_unlock();
1731 if (result == true)
1732 goto do_gc;
1733
1734dont_gc:
1735 kleave(" [no gc]");
1736 return;
1737
1738do_gc:
1739 down_write(&keyring->sem);
1740 assoc_array_gc(&keyring->keys, &keyring_assoc_array_ops,
1741 keyring_gc_select_iterator, &limit);
1742 up_write(&keyring->sem);
1743 kleave(" [gc]");
1744}
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761void keyring_restriction_gc(struct key *keyring, struct key_type *dead_type)
1762{
1763 struct key_restriction *keyres;
1764
1765 kenter("%x{%s}", keyring->serial, keyring->description ?: "");
1766
1767
1768
1769
1770
1771
1772
1773
1774 if (!dead_type || !keyring->restrict_link ||
1775 keyring->restrict_link->keytype != dead_type) {
1776 kleave(" [no restriction gc]");
1777 return;
1778 }
1779
1780
1781 down_write(&keyring->sem);
1782
1783 keyres = keyring->restrict_link;
1784
1785 keyres->check = restrict_link_reject;
1786
1787 key_put(keyres->key);
1788 keyres->key = NULL;
1789 keyres->keytype = NULL;
1790
1791 up_write(&keyring->sem);
1792
1793 kleave(" [restriction gc]");
1794}
1795