This source file includes following definitions.
- key_task_permission
- key_validate
1
2
3
4
5
6
7
8 #include <linux/export.h>
9 #include <linux/security.h>
10 #include "internal.h"
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 int key_task_permission(const key_ref_t key_ref, const struct cred *cred,
27 unsigned perm)
28 {
29 struct key *key;
30 key_perm_t kperm;
31 int ret;
32
33 key = key_ref_to_ptr(key_ref);
34
35
36 if (uid_eq(key->uid, cred->fsuid)) {
37 kperm = key->perm >> 16;
38 goto use_these_perms;
39 }
40
41
42
43 if (gid_valid(key->gid) && key->perm & KEY_GRP_ALL) {
44 if (gid_eq(key->gid, cred->fsgid)) {
45 kperm = key->perm >> 8;
46 goto use_these_perms;
47 }
48
49 ret = groups_search(cred->group_info, key->gid);
50 if (ret) {
51 kperm = key->perm >> 8;
52 goto use_these_perms;
53 }
54 }
55
56
57 kperm = key->perm;
58
59 use_these_perms:
60
61
62
63
64 if (is_key_possessed(key_ref))
65 kperm |= key->perm >> 24;
66
67 kperm = kperm & perm & KEY_NEED_ALL;
68
69 if (kperm != perm)
70 return -EACCES;
71
72
73 return security_key_permission(key_ref, cred, perm);
74 }
75 EXPORT_SYMBOL(key_task_permission);
76
77
78
79
80
81
82
83
84
85 int key_validate(const struct key *key)
86 {
87 unsigned long flags = READ_ONCE(key->flags);
88 time64_t expiry = READ_ONCE(key->expiry);
89
90 if (flags & (1 << KEY_FLAG_INVALIDATED))
91 return -ENOKEY;
92
93
94 if (flags & ((1 << KEY_FLAG_REVOKED) |
95 (1 << KEY_FLAG_DEAD)))
96 return -EKEYREVOKED;
97
98
99 if (expiry) {
100 if (ktime_get_real_seconds() >= expiry)
101 return -EKEYEXPIRED;
102 }
103
104 return 0;
105 }
106 EXPORT_SYMBOL(key_validate);