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