0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/export.h>
0009 #include <linux/init.h>
0010 #include <linux/poison.h>
0011 #include <linux/sched.h>
0012 #include <linux/slab.h>
0013 #include <linux/security.h>
0014 #include <linux/workqueue.h>
0015 #include <linux/random.h>
0016 #include <linux/ima.h>
0017 #include <linux/err.h>
0018 #include "internal.h"
0019
0020 struct kmem_cache *key_jar;
0021 struct rb_root key_serial_tree;
0022 DEFINE_SPINLOCK(key_serial_lock);
0023
0024 struct rb_root key_user_tree;
0025 DEFINE_SPINLOCK(key_user_lock);
0026
0027 unsigned int key_quota_root_maxkeys = 1000000;
0028 unsigned int key_quota_root_maxbytes = 25000000;
0029 unsigned int key_quota_maxkeys = 200;
0030 unsigned int key_quota_maxbytes = 20000;
0031
0032 static LIST_HEAD(key_types_list);
0033 static DECLARE_RWSEM(key_types_sem);
0034
0035
0036 DEFINE_MUTEX(key_construction_mutex);
0037
0038 #ifdef KEY_DEBUGGING
0039 void __key_check(const struct key *key)
0040 {
0041 printk("__key_check: key %p {%08x} should be {%08x}\n",
0042 key, key->magic, KEY_DEBUG_MAGIC);
0043 BUG();
0044 }
0045 #endif
0046
0047
0048
0049
0050
0051 struct key_user *key_user_lookup(kuid_t uid)
0052 {
0053 struct key_user *candidate = NULL, *user;
0054 struct rb_node *parent, **p;
0055
0056 try_again:
0057 parent = NULL;
0058 p = &key_user_tree.rb_node;
0059 spin_lock(&key_user_lock);
0060
0061
0062 while (*p) {
0063 parent = *p;
0064 user = rb_entry(parent, struct key_user, node);
0065
0066 if (uid_lt(uid, user->uid))
0067 p = &(*p)->rb_left;
0068 else if (uid_gt(uid, user->uid))
0069 p = &(*p)->rb_right;
0070 else
0071 goto found;
0072 }
0073
0074
0075 if (!candidate) {
0076
0077
0078 spin_unlock(&key_user_lock);
0079
0080 user = NULL;
0081 candidate = kmalloc(sizeof(struct key_user), GFP_KERNEL);
0082 if (unlikely(!candidate))
0083 goto out;
0084
0085
0086
0087
0088 goto try_again;
0089 }
0090
0091
0092
0093 refcount_set(&candidate->usage, 1);
0094 atomic_set(&candidate->nkeys, 0);
0095 atomic_set(&candidate->nikeys, 0);
0096 candidate->uid = uid;
0097 candidate->qnkeys = 0;
0098 candidate->qnbytes = 0;
0099 spin_lock_init(&candidate->lock);
0100 mutex_init(&candidate->cons_lock);
0101
0102 rb_link_node(&candidate->node, parent, p);
0103 rb_insert_color(&candidate->node, &key_user_tree);
0104 spin_unlock(&key_user_lock);
0105 user = candidate;
0106 goto out;
0107
0108
0109 found:
0110 refcount_inc(&user->usage);
0111 spin_unlock(&key_user_lock);
0112 kfree(candidate);
0113 out:
0114 return user;
0115 }
0116
0117
0118
0119
0120 void key_user_put(struct key_user *user)
0121 {
0122 if (refcount_dec_and_lock(&user->usage, &key_user_lock)) {
0123 rb_erase(&user->node, &key_user_tree);
0124 spin_unlock(&key_user_lock);
0125
0126 kfree(user);
0127 }
0128 }
0129
0130
0131
0132
0133
0134 static inline void key_alloc_serial(struct key *key)
0135 {
0136 struct rb_node *parent, **p;
0137 struct key *xkey;
0138
0139
0140
0141 do {
0142 get_random_bytes(&key->serial, sizeof(key->serial));
0143
0144 key->serial >>= 1;
0145 } while (key->serial < 3);
0146
0147 spin_lock(&key_serial_lock);
0148
0149 attempt_insertion:
0150 parent = NULL;
0151 p = &key_serial_tree.rb_node;
0152
0153 while (*p) {
0154 parent = *p;
0155 xkey = rb_entry(parent, struct key, serial_node);
0156
0157 if (key->serial < xkey->serial)
0158 p = &(*p)->rb_left;
0159 else if (key->serial > xkey->serial)
0160 p = &(*p)->rb_right;
0161 else
0162 goto serial_exists;
0163 }
0164
0165
0166 rb_link_node(&key->serial_node, parent, p);
0167 rb_insert_color(&key->serial_node, &key_serial_tree);
0168
0169 spin_unlock(&key_serial_lock);
0170 return;
0171
0172
0173
0174 serial_exists:
0175 for (;;) {
0176 key->serial++;
0177 if (key->serial < 3) {
0178 key->serial = 3;
0179 goto attempt_insertion;
0180 }
0181
0182 parent = rb_next(parent);
0183 if (!parent)
0184 goto attempt_insertion;
0185
0186 xkey = rb_entry(parent, struct key, serial_node);
0187 if (key->serial < xkey->serial)
0188 goto attempt_insertion;
0189 }
0190 }
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225 struct key *key_alloc(struct key_type *type, const char *desc,
0226 kuid_t uid, kgid_t gid, const struct cred *cred,
0227 key_perm_t perm, unsigned long flags,
0228 struct key_restriction *restrict_link)
0229 {
0230 struct key_user *user = NULL;
0231 struct key *key;
0232 size_t desclen, quotalen;
0233 int ret;
0234
0235 key = ERR_PTR(-EINVAL);
0236 if (!desc || !*desc)
0237 goto error;
0238
0239 if (type->vet_description) {
0240 ret = type->vet_description(desc);
0241 if (ret < 0) {
0242 key = ERR_PTR(ret);
0243 goto error;
0244 }
0245 }
0246
0247 desclen = strlen(desc);
0248 quotalen = desclen + 1 + type->def_datalen;
0249
0250
0251 user = key_user_lookup(uid);
0252 if (!user)
0253 goto no_memory_1;
0254
0255
0256
0257 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
0258 unsigned maxkeys = uid_eq(uid, GLOBAL_ROOT_UID) ?
0259 key_quota_root_maxkeys : key_quota_maxkeys;
0260 unsigned maxbytes = uid_eq(uid, GLOBAL_ROOT_UID) ?
0261 key_quota_root_maxbytes : key_quota_maxbytes;
0262
0263 spin_lock(&user->lock);
0264 if (!(flags & KEY_ALLOC_QUOTA_OVERRUN)) {
0265 if (user->qnkeys + 1 > maxkeys ||
0266 user->qnbytes + quotalen > maxbytes ||
0267 user->qnbytes + quotalen < user->qnbytes)
0268 goto no_quota;
0269 }
0270
0271 user->qnkeys++;
0272 user->qnbytes += quotalen;
0273 spin_unlock(&user->lock);
0274 }
0275
0276
0277 key = kmem_cache_zalloc(key_jar, GFP_KERNEL);
0278 if (!key)
0279 goto no_memory_2;
0280
0281 key->index_key.desc_len = desclen;
0282 key->index_key.description = kmemdup(desc, desclen + 1, GFP_KERNEL);
0283 if (!key->index_key.description)
0284 goto no_memory_3;
0285 key->index_key.type = type;
0286 key_set_index_key(&key->index_key);
0287
0288 refcount_set(&key->usage, 1);
0289 init_rwsem(&key->sem);
0290 lockdep_set_class(&key->sem, &type->lock_class);
0291 key->user = user;
0292 key->quotalen = quotalen;
0293 key->datalen = type->def_datalen;
0294 key->uid = uid;
0295 key->gid = gid;
0296 key->perm = perm;
0297 key->restrict_link = restrict_link;
0298 key->last_used_at = ktime_get_real_seconds();
0299
0300 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA))
0301 key->flags |= 1 << KEY_FLAG_IN_QUOTA;
0302 if (flags & KEY_ALLOC_BUILT_IN)
0303 key->flags |= 1 << KEY_FLAG_BUILTIN;
0304 if (flags & KEY_ALLOC_UID_KEYRING)
0305 key->flags |= 1 << KEY_FLAG_UID_KEYRING;
0306 if (flags & KEY_ALLOC_SET_KEEP)
0307 key->flags |= 1 << KEY_FLAG_KEEP;
0308
0309 #ifdef KEY_DEBUGGING
0310 key->magic = KEY_DEBUG_MAGIC;
0311 #endif
0312
0313
0314 ret = security_key_alloc(key, cred, flags);
0315 if (ret < 0)
0316 goto security_error;
0317
0318
0319 refcount_inc(&key->domain_tag->usage);
0320 atomic_inc(&user->nkeys);
0321 key_alloc_serial(key);
0322
0323 error:
0324 return key;
0325
0326 security_error:
0327 kfree(key->description);
0328 kmem_cache_free(key_jar, key);
0329 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
0330 spin_lock(&user->lock);
0331 user->qnkeys--;
0332 user->qnbytes -= quotalen;
0333 spin_unlock(&user->lock);
0334 }
0335 key_user_put(user);
0336 key = ERR_PTR(ret);
0337 goto error;
0338
0339 no_memory_3:
0340 kmem_cache_free(key_jar, key);
0341 no_memory_2:
0342 if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) {
0343 spin_lock(&user->lock);
0344 user->qnkeys--;
0345 user->qnbytes -= quotalen;
0346 spin_unlock(&user->lock);
0347 }
0348 key_user_put(user);
0349 no_memory_1:
0350 key = ERR_PTR(-ENOMEM);
0351 goto error;
0352
0353 no_quota:
0354 spin_unlock(&user->lock);
0355 key_user_put(user);
0356 key = ERR_PTR(-EDQUOT);
0357 goto error;
0358 }
0359 EXPORT_SYMBOL(key_alloc);
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372 int key_payload_reserve(struct key *key, size_t datalen)
0373 {
0374 int delta = (int)datalen - key->datalen;
0375 int ret = 0;
0376
0377 key_check(key);
0378
0379
0380 if (delta != 0 && test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) {
0381 unsigned maxbytes = uid_eq(key->user->uid, GLOBAL_ROOT_UID) ?
0382 key_quota_root_maxbytes : key_quota_maxbytes;
0383
0384 spin_lock(&key->user->lock);
0385
0386 if (delta > 0 &&
0387 (key->user->qnbytes + delta > maxbytes ||
0388 key->user->qnbytes + delta < key->user->qnbytes)) {
0389 ret = -EDQUOT;
0390 }
0391 else {
0392 key->user->qnbytes += delta;
0393 key->quotalen += delta;
0394 }
0395 spin_unlock(&key->user->lock);
0396 }
0397
0398
0399 if (ret == 0)
0400 key->datalen = datalen;
0401
0402 return ret;
0403 }
0404 EXPORT_SYMBOL(key_payload_reserve);
0405
0406
0407
0408
0409 static void mark_key_instantiated(struct key *key, int reject_error)
0410 {
0411
0412
0413
0414 smp_store_release(&key->state,
0415 (reject_error < 0) ? reject_error : KEY_IS_POSITIVE);
0416 }
0417
0418
0419
0420
0421
0422
0423
0424 static int __key_instantiate_and_link(struct key *key,
0425 struct key_preparsed_payload *prep,
0426 struct key *keyring,
0427 struct key *authkey,
0428 struct assoc_array_edit **_edit)
0429 {
0430 int ret, awaken;
0431
0432 key_check(key);
0433 key_check(keyring);
0434
0435 awaken = 0;
0436 ret = -EBUSY;
0437
0438 mutex_lock(&key_construction_mutex);
0439
0440
0441 if (key->state == KEY_IS_UNINSTANTIATED) {
0442
0443 ret = key->type->instantiate(key, prep);
0444
0445 if (ret == 0) {
0446
0447 atomic_inc(&key->user->nikeys);
0448 mark_key_instantiated(key, 0);
0449 notify_key(key, NOTIFY_KEY_INSTANTIATED, 0);
0450
0451 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
0452 awaken = 1;
0453
0454
0455 if (keyring) {
0456 if (test_bit(KEY_FLAG_KEEP, &keyring->flags))
0457 set_bit(KEY_FLAG_KEEP, &key->flags);
0458
0459 __key_link(keyring, key, _edit);
0460 }
0461
0462
0463 if (authkey)
0464 key_invalidate(authkey);
0465
0466 if (prep->expiry != TIME64_MAX) {
0467 key->expiry = prep->expiry;
0468 key_schedule_gc(prep->expiry + key_gc_delay);
0469 }
0470 }
0471 }
0472
0473 mutex_unlock(&key_construction_mutex);
0474
0475
0476 if (awaken)
0477 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
0478
0479 return ret;
0480 }
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498 int key_instantiate_and_link(struct key *key,
0499 const void *data,
0500 size_t datalen,
0501 struct key *keyring,
0502 struct key *authkey)
0503 {
0504 struct key_preparsed_payload prep;
0505 struct assoc_array_edit *edit = NULL;
0506 int ret;
0507
0508 memset(&prep, 0, sizeof(prep));
0509 prep.orig_description = key->description;
0510 prep.data = data;
0511 prep.datalen = datalen;
0512 prep.quotalen = key->type->def_datalen;
0513 prep.expiry = TIME64_MAX;
0514 if (key->type->preparse) {
0515 ret = key->type->preparse(&prep);
0516 if (ret < 0)
0517 goto error;
0518 }
0519
0520 if (keyring) {
0521 ret = __key_link_lock(keyring, &key->index_key);
0522 if (ret < 0)
0523 goto error;
0524
0525 ret = __key_link_begin(keyring, &key->index_key, &edit);
0526 if (ret < 0)
0527 goto error_link_end;
0528
0529 if (keyring->restrict_link && keyring->restrict_link->check) {
0530 struct key_restriction *keyres = keyring->restrict_link;
0531
0532 ret = keyres->check(keyring, key->type, &prep.payload,
0533 keyres->key);
0534 if (ret < 0)
0535 goto error_link_end;
0536 }
0537 }
0538
0539 ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
0540
0541 error_link_end:
0542 if (keyring)
0543 __key_link_end(keyring, &key->index_key, edit);
0544
0545 error:
0546 if (key->type->preparse)
0547 key->type->free_preparse(&prep);
0548 return ret;
0549 }
0550
0551 EXPORT_SYMBOL(key_instantiate_and_link);
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574 int key_reject_and_link(struct key *key,
0575 unsigned timeout,
0576 unsigned error,
0577 struct key *keyring,
0578 struct key *authkey)
0579 {
0580 struct assoc_array_edit *edit = NULL;
0581 int ret, awaken, link_ret = 0;
0582
0583 key_check(key);
0584 key_check(keyring);
0585
0586 awaken = 0;
0587 ret = -EBUSY;
0588
0589 if (keyring) {
0590 if (keyring->restrict_link)
0591 return -EPERM;
0592
0593 link_ret = __key_link_lock(keyring, &key->index_key);
0594 if (link_ret == 0) {
0595 link_ret = __key_link_begin(keyring, &key->index_key, &edit);
0596 if (link_ret < 0)
0597 __key_link_end(keyring, &key->index_key, edit);
0598 }
0599 }
0600
0601 mutex_lock(&key_construction_mutex);
0602
0603
0604 if (key->state == KEY_IS_UNINSTANTIATED) {
0605
0606 atomic_inc(&key->user->nikeys);
0607 mark_key_instantiated(key, -error);
0608 notify_key(key, NOTIFY_KEY_INSTANTIATED, -error);
0609 key->expiry = ktime_get_real_seconds() + timeout;
0610 key_schedule_gc(key->expiry + key_gc_delay);
0611
0612 if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
0613 awaken = 1;
0614
0615 ret = 0;
0616
0617
0618 if (keyring && link_ret == 0)
0619 __key_link(keyring, key, &edit);
0620
0621
0622 if (authkey)
0623 key_invalidate(authkey);
0624 }
0625
0626 mutex_unlock(&key_construction_mutex);
0627
0628 if (keyring && link_ret == 0)
0629 __key_link_end(keyring, &key->index_key, edit);
0630
0631
0632 if (awaken)
0633 wake_up_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT);
0634
0635 return ret == 0 ? link_ret : ret;
0636 }
0637 EXPORT_SYMBOL(key_reject_and_link);
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647 void key_put(struct key *key)
0648 {
0649 if (key) {
0650 key_check(key);
0651
0652 if (refcount_dec_and_test(&key->usage))
0653 schedule_work(&key_gc_work);
0654 }
0655 }
0656 EXPORT_SYMBOL(key_put);
0657
0658
0659
0660
0661 struct key *key_lookup(key_serial_t id)
0662 {
0663 struct rb_node *n;
0664 struct key *key;
0665
0666 spin_lock(&key_serial_lock);
0667
0668
0669 n = key_serial_tree.rb_node;
0670 while (n) {
0671 key = rb_entry(n, struct key, serial_node);
0672
0673 if (id < key->serial)
0674 n = n->rb_left;
0675 else if (id > key->serial)
0676 n = n->rb_right;
0677 else
0678 goto found;
0679 }
0680
0681 not_found:
0682 key = ERR_PTR(-ENOKEY);
0683 goto error;
0684
0685 found:
0686
0687
0688
0689 if (!refcount_inc_not_zero(&key->usage))
0690 goto not_found;
0691
0692 error:
0693 spin_unlock(&key_serial_lock);
0694 return key;
0695 }
0696
0697
0698
0699
0700
0701
0702
0703 struct key_type *key_type_lookup(const char *type)
0704 {
0705 struct key_type *ktype;
0706
0707 down_read(&key_types_sem);
0708
0709
0710
0711 list_for_each_entry(ktype, &key_types_list, link) {
0712 if (strcmp(ktype->name, type) == 0)
0713 goto found_kernel_type;
0714 }
0715
0716 up_read(&key_types_sem);
0717 ktype = ERR_PTR(-ENOKEY);
0718
0719 found_kernel_type:
0720 return ktype;
0721 }
0722
0723 void key_set_timeout(struct key *key, unsigned timeout)
0724 {
0725 time64_t expiry = 0;
0726
0727
0728 down_write(&key->sem);
0729
0730 if (timeout > 0)
0731 expiry = ktime_get_real_seconds() + timeout;
0732
0733 key->expiry = expiry;
0734 key_schedule_gc(key->expiry + key_gc_delay);
0735
0736 up_write(&key->sem);
0737 }
0738 EXPORT_SYMBOL_GPL(key_set_timeout);
0739
0740
0741
0742
0743 void key_type_put(struct key_type *ktype)
0744 {
0745 up_read(&key_types_sem);
0746 }
0747
0748
0749
0750
0751
0752
0753
0754 static inline key_ref_t __key_update(key_ref_t key_ref,
0755 struct key_preparsed_payload *prep)
0756 {
0757 struct key *key = key_ref_to_ptr(key_ref);
0758 int ret;
0759
0760
0761 ret = key_permission(key_ref, KEY_NEED_WRITE);
0762 if (ret < 0)
0763 goto error;
0764
0765 ret = -EEXIST;
0766 if (!key->type->update)
0767 goto error;
0768
0769 down_write(&key->sem);
0770
0771 ret = key->type->update(key, prep);
0772 if (ret == 0) {
0773
0774 mark_key_instantiated(key, 0);
0775 notify_key(key, NOTIFY_KEY_UPDATED, 0);
0776 }
0777
0778 up_write(&key->sem);
0779
0780 if (ret < 0)
0781 goto error;
0782 out:
0783 return key_ref;
0784
0785 error:
0786 key_put(key);
0787 key_ref = ERR_PTR(ret);
0788 goto out;
0789 }
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816 key_ref_t key_create_or_update(key_ref_t keyring_ref,
0817 const char *type,
0818 const char *description,
0819 const void *payload,
0820 size_t plen,
0821 key_perm_t perm,
0822 unsigned long flags)
0823 {
0824 struct keyring_index_key index_key = {
0825 .description = description,
0826 };
0827 struct key_preparsed_payload prep;
0828 struct assoc_array_edit *edit = NULL;
0829 const struct cred *cred = current_cred();
0830 struct key *keyring, *key = NULL;
0831 key_ref_t key_ref;
0832 int ret;
0833 struct key_restriction *restrict_link = NULL;
0834
0835
0836
0837 index_key.type = key_type_lookup(type);
0838 if (IS_ERR(index_key.type)) {
0839 key_ref = ERR_PTR(-ENODEV);
0840 goto error;
0841 }
0842
0843 key_ref = ERR_PTR(-EINVAL);
0844 if (!index_key.type->instantiate ||
0845 (!index_key.description && !index_key.type->preparse))
0846 goto error_put_type;
0847
0848 keyring = key_ref_to_ptr(keyring_ref);
0849
0850 key_check(keyring);
0851
0852 if (!(flags & KEY_ALLOC_BYPASS_RESTRICTION))
0853 restrict_link = keyring->restrict_link;
0854
0855 key_ref = ERR_PTR(-ENOTDIR);
0856 if (keyring->type != &key_type_keyring)
0857 goto error_put_type;
0858
0859 memset(&prep, 0, sizeof(prep));
0860 prep.orig_description = description;
0861 prep.data = payload;
0862 prep.datalen = plen;
0863 prep.quotalen = index_key.type->def_datalen;
0864 prep.expiry = TIME64_MAX;
0865 if (index_key.type->preparse) {
0866 ret = index_key.type->preparse(&prep);
0867 if (ret < 0) {
0868 key_ref = ERR_PTR(ret);
0869 goto error_free_prep;
0870 }
0871 if (!index_key.description)
0872 index_key.description = prep.description;
0873 key_ref = ERR_PTR(-EINVAL);
0874 if (!index_key.description)
0875 goto error_free_prep;
0876 }
0877 index_key.desc_len = strlen(index_key.description);
0878 key_set_index_key(&index_key);
0879
0880 ret = __key_link_lock(keyring, &index_key);
0881 if (ret < 0) {
0882 key_ref = ERR_PTR(ret);
0883 goto error_free_prep;
0884 }
0885
0886 ret = __key_link_begin(keyring, &index_key, &edit);
0887 if (ret < 0) {
0888 key_ref = ERR_PTR(ret);
0889 goto error_link_end;
0890 }
0891
0892 if (restrict_link && restrict_link->check) {
0893 ret = restrict_link->check(keyring, index_key.type,
0894 &prep.payload, restrict_link->key);
0895 if (ret < 0) {
0896 key_ref = ERR_PTR(ret);
0897 goto error_link_end;
0898 }
0899 }
0900
0901
0902
0903 ret = key_permission(keyring_ref, KEY_NEED_WRITE);
0904 if (ret < 0) {
0905 key_ref = ERR_PTR(ret);
0906 goto error_link_end;
0907 }
0908
0909
0910
0911
0912
0913 if (index_key.type->update) {
0914 key_ref = find_key_to_update(keyring_ref, &index_key);
0915 if (key_ref)
0916 goto found_matching_key;
0917 }
0918
0919
0920 if (perm == KEY_PERM_UNDEF) {
0921 perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR;
0922 perm |= KEY_USR_VIEW;
0923
0924 if (index_key.type->read)
0925 perm |= KEY_POS_READ;
0926
0927 if (index_key.type == &key_type_keyring ||
0928 index_key.type->update)
0929 perm |= KEY_POS_WRITE;
0930 }
0931
0932
0933 key = key_alloc(index_key.type, index_key.description,
0934 cred->fsuid, cred->fsgid, cred, perm, flags, NULL);
0935 if (IS_ERR(key)) {
0936 key_ref = ERR_CAST(key);
0937 goto error_link_end;
0938 }
0939
0940
0941 ret = __key_instantiate_and_link(key, &prep, keyring, NULL, &edit);
0942 if (ret < 0) {
0943 key_put(key);
0944 key_ref = ERR_PTR(ret);
0945 goto error_link_end;
0946 }
0947
0948 ima_post_key_create_or_update(keyring, key, payload, plen,
0949 flags, true);
0950
0951 key_ref = make_key_ref(key, is_key_possessed(keyring_ref));
0952
0953 error_link_end:
0954 __key_link_end(keyring, &index_key, edit);
0955 error_free_prep:
0956 if (index_key.type->preparse)
0957 index_key.type->free_preparse(&prep);
0958 error_put_type:
0959 key_type_put(index_key.type);
0960 error:
0961 return key_ref;
0962
0963 found_matching_key:
0964
0965
0966
0967 __key_link_end(keyring, &index_key, edit);
0968
0969 key = key_ref_to_ptr(key_ref);
0970 if (test_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags)) {
0971 ret = wait_for_key_construction(key, true);
0972 if (ret < 0) {
0973 key_ref_put(key_ref);
0974 key_ref = ERR_PTR(ret);
0975 goto error_free_prep;
0976 }
0977 }
0978
0979 key_ref = __key_update(key_ref, &prep);
0980
0981 if (!IS_ERR(key_ref))
0982 ima_post_key_create_or_update(keyring, key,
0983 payload, plen,
0984 flags, false);
0985
0986 goto error_free_prep;
0987 }
0988 EXPORT_SYMBOL(key_create_or_update);
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003 int key_update(key_ref_t key_ref, const void *payload, size_t plen)
1004 {
1005 struct key_preparsed_payload prep;
1006 struct key *key = key_ref_to_ptr(key_ref);
1007 int ret;
1008
1009 key_check(key);
1010
1011
1012 ret = key_permission(key_ref, KEY_NEED_WRITE);
1013 if (ret < 0)
1014 return ret;
1015
1016
1017 if (!key->type->update)
1018 return -EOPNOTSUPP;
1019
1020 memset(&prep, 0, sizeof(prep));
1021 prep.data = payload;
1022 prep.datalen = plen;
1023 prep.quotalen = key->type->def_datalen;
1024 prep.expiry = TIME64_MAX;
1025 if (key->type->preparse) {
1026 ret = key->type->preparse(&prep);
1027 if (ret < 0)
1028 goto error;
1029 }
1030
1031 down_write(&key->sem);
1032
1033 ret = key->type->update(key, &prep);
1034 if (ret == 0) {
1035
1036 mark_key_instantiated(key, 0);
1037 notify_key(key, NOTIFY_KEY_UPDATED, 0);
1038 }
1039
1040 up_write(&key->sem);
1041
1042 error:
1043 if (key->type->preparse)
1044 key->type->free_preparse(&prep);
1045 return ret;
1046 }
1047 EXPORT_SYMBOL(key_update);
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058 void key_revoke(struct key *key)
1059 {
1060 time64_t time;
1061
1062 key_check(key);
1063
1064
1065
1066
1067
1068
1069 down_write_nested(&key->sem, 1);
1070 if (!test_and_set_bit(KEY_FLAG_REVOKED, &key->flags)) {
1071 notify_key(key, NOTIFY_KEY_REVOKED, 0);
1072 if (key->type->revoke)
1073 key->type->revoke(key);
1074
1075
1076 time = ktime_get_real_seconds();
1077 if (key->revoked_at == 0 || key->revoked_at > time) {
1078 key->revoked_at = time;
1079 key_schedule_gc(key->revoked_at + key_gc_delay);
1080 }
1081 }
1082
1083 up_write(&key->sem);
1084 }
1085 EXPORT_SYMBOL(key_revoke);
1086
1087
1088
1089
1090
1091
1092
1093
1094 void key_invalidate(struct key *key)
1095 {
1096 kenter("%d", key_serial(key));
1097
1098 key_check(key);
1099
1100 if (!test_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
1101 down_write_nested(&key->sem, 1);
1102 if (!test_and_set_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
1103 notify_key(key, NOTIFY_KEY_INVALIDATED, 0);
1104 key_schedule_gc_links();
1105 }
1106 up_write(&key->sem);
1107 }
1108 }
1109 EXPORT_SYMBOL(key_invalidate);
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121 int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
1122 {
1123 int ret;
1124
1125 pr_devel("==>%s()\n", __func__);
1126
1127 ret = key_payload_reserve(key, prep->quotalen);
1128 if (ret == 0) {
1129 rcu_assign_keypointer(key, prep->payload.data[0]);
1130 key->payload.data[1] = prep->payload.data[1];
1131 key->payload.data[2] = prep->payload.data[2];
1132 key->payload.data[3] = prep->payload.data[3];
1133 prep->payload.data[0] = NULL;
1134 prep->payload.data[1] = NULL;
1135 prep->payload.data[2] = NULL;
1136 prep->payload.data[3] = NULL;
1137 }
1138 pr_devel("<==%s() = %d\n", __func__, ret);
1139 return ret;
1140 }
1141 EXPORT_SYMBOL(generic_key_instantiate);
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151 int register_key_type(struct key_type *ktype)
1152 {
1153 struct key_type *p;
1154 int ret;
1155
1156 memset(&ktype->lock_class, 0, sizeof(ktype->lock_class));
1157
1158 ret = -EEXIST;
1159 down_write(&key_types_sem);
1160
1161
1162 list_for_each_entry(p, &key_types_list, link) {
1163 if (strcmp(p->name, ktype->name) == 0)
1164 goto out;
1165 }
1166
1167
1168 list_add(&ktype->link, &key_types_list);
1169
1170 pr_notice("Key type %s registered\n", ktype->name);
1171 ret = 0;
1172
1173 out:
1174 up_write(&key_types_sem);
1175 return ret;
1176 }
1177 EXPORT_SYMBOL(register_key_type);
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187 void unregister_key_type(struct key_type *ktype)
1188 {
1189 down_write(&key_types_sem);
1190 list_del_init(&ktype->link);
1191 downgrade_write(&key_types_sem);
1192 key_gc_keytype(ktype);
1193 pr_notice("Key type %s unregistered\n", ktype->name);
1194 up_read(&key_types_sem);
1195 }
1196 EXPORT_SYMBOL(unregister_key_type);
1197
1198
1199
1200
1201 void __init key_init(void)
1202 {
1203
1204 key_jar = kmem_cache_create("key_jar", sizeof(struct key),
1205 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1206
1207
1208 list_add_tail(&key_type_keyring.link, &key_types_list);
1209 list_add_tail(&key_type_dead.link, &key_types_list);
1210 list_add_tail(&key_type_user.link, &key_types_list);
1211 list_add_tail(&key_type_logon.link, &key_types_list);
1212
1213
1214 rb_link_node(&root_key_user.node,
1215 NULL,
1216 &key_user_tree.rb_node);
1217
1218 rb_insert_color(&root_key_user.node,
1219 &key_user_tree);
1220 }