1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /* Authentication token and access key management internal defs
3   *
4   * Copyright (C) 2003-5, 2007 Red Hat, Inc. All Rights Reserved.
5   * Written by David Howells (dhowells@redhat.com)
6   */
7  
8  #ifndef _INTERNAL_H
9  #define _INTERNAL_H
10  
11  #include <linux/sched.h>
12  #include <linux/wait_bit.h>
13  #include <linux/cred.h>
14  #include <linux/key-type.h>
15  #include <linux/task_work.h>
16  #include <linux/keyctl.h>
17  #include <linux/refcount.h>
18  #include <linux/watch_queue.h>
19  #include <linux/compat.h>
20  #include <linux/mm.h>
21  #include <linux/vmalloc.h>
22  
23  struct iovec;
24  
25  #ifdef __KDEBUG
26  #define kenter(FMT, ...) \
27  	printk(KERN_DEBUG "==> %s("FMT")\n", __func__, ##__VA_ARGS__)
28  #define kleave(FMT, ...) \
29  	printk(KERN_DEBUG "<== %s()"FMT"\n", __func__, ##__VA_ARGS__)
30  #define kdebug(FMT, ...) \
31  	printk(KERN_DEBUG "   "FMT"\n", ##__VA_ARGS__)
32  #else
33  #define kenter(FMT, ...) \
34  	no_printk(KERN_DEBUG "==> %s("FMT")\n", __func__, ##__VA_ARGS__)
35  #define kleave(FMT, ...) \
36  	no_printk(KERN_DEBUG "<== %s()"FMT"\n", __func__, ##__VA_ARGS__)
37  #define kdebug(FMT, ...) \
38  	no_printk(KERN_DEBUG FMT"\n", ##__VA_ARGS__)
39  #endif
40  
41  extern struct key_type key_type_dead;
42  extern struct key_type key_type_user;
43  extern struct key_type key_type_logon;
44  
45  /*****************************************************************************/
46  /*
47   * Keep track of keys for a user.
48   *
49   * This needs to be separate to user_struct to avoid a refcount-loop
50   * (user_struct pins some keyrings which pin this struct).
51   *
52   * We also keep track of keys under request from userspace for this UID here.
53   */
54  struct key_user {
55  	struct rb_node		node;
56  	struct mutex		cons_lock;	/* construction initiation lock */
57  	spinlock_t		lock;
58  	refcount_t		usage;		/* for accessing qnkeys & qnbytes */
59  	atomic_t		nkeys;		/* number of keys */
60  	atomic_t		nikeys;		/* number of instantiated keys */
61  	kuid_t			uid;
62  	int			qnkeys;		/* number of keys allocated to this user */
63  	int			qnbytes;	/* number of bytes allocated to this user */
64  };
65  
66  extern struct rb_root	key_user_tree;
67  extern spinlock_t	key_user_lock;
68  extern struct key_user	root_key_user;
69  
70  extern struct key_user *key_user_lookup(kuid_t uid);
71  extern void key_user_put(struct key_user *user);
72  
73  /*
74   * Key quota limits.
75   * - root has its own separate limits to everyone else
76   */
77  extern unsigned key_quota_root_maxkeys;
78  extern unsigned key_quota_root_maxbytes;
79  extern unsigned key_quota_maxkeys;
80  extern unsigned key_quota_maxbytes;
81  
82  #define KEYQUOTA_LINK_BYTES	4		/* a link in a keyring is worth 4 bytes */
83  
84  
85  extern struct kmem_cache *key_jar;
86  extern struct rb_root key_serial_tree;
87  extern spinlock_t key_serial_lock;
88  extern struct mutex key_construction_mutex;
89  extern wait_queue_head_t request_key_conswq;
90  
91  extern void key_set_index_key(struct keyring_index_key *index_key);
92  extern struct key_type *key_type_lookup(const char *type);
93  extern void key_type_put(struct key_type *ktype);
94  
95  extern int __key_link_lock(struct key *keyring,
96  			   const struct keyring_index_key *index_key);
97  extern int __key_move_lock(struct key *l_keyring, struct key *u_keyring,
98  			   const struct keyring_index_key *index_key);
99  extern int __key_link_begin(struct key *keyring,
100  			    const struct keyring_index_key *index_key,
101  			    struct assoc_array_edit **_edit);
102  extern int __key_link_check_live_key(struct key *keyring, struct key *key);
103  extern void __key_link(struct key *keyring, struct key *key,
104  		       struct assoc_array_edit **_edit);
105  extern void __key_link_end(struct key *keyring,
106  			   const struct keyring_index_key *index_key,
107  			   struct assoc_array_edit *edit);
108  
109  extern key_ref_t find_key_to_update(key_ref_t keyring_ref,
110  				    const struct keyring_index_key *index_key);
111  
112  struct keyring_search_context {
113  	struct keyring_index_key index_key;
114  	const struct cred	*cred;
115  	struct key_match_data	match_data;
116  	unsigned		flags;
117  #define KEYRING_SEARCH_NO_STATE_CHECK	0x0001	/* Skip state checks */
118  #define KEYRING_SEARCH_DO_STATE_CHECK	0x0002	/* Override NO_STATE_CHECK */
119  #define KEYRING_SEARCH_NO_UPDATE_TIME	0x0004	/* Don't update times */
120  #define KEYRING_SEARCH_NO_CHECK_PERM	0x0008	/* Don't check permissions */
121  #define KEYRING_SEARCH_DETECT_TOO_DEEP	0x0010	/* Give an error on excessive depth */
122  #define KEYRING_SEARCH_SKIP_EXPIRED	0x0020	/* Ignore expired keys (intention to replace) */
123  #define KEYRING_SEARCH_RECURSE		0x0040	/* Search child keyrings also */
124  
125  	int (*iterator)(const void *object, void *iterator_data);
126  
127  	/* Internal stuff */
128  	int			skipped_ret;
129  	bool			possessed;
130  	key_ref_t		result;
131  	time64_t		now;
132  };
133  
134  extern bool key_default_cmp(const struct key *key,
135  			    const struct key_match_data *match_data);
136  extern key_ref_t keyring_search_rcu(key_ref_t keyring_ref,
137  				    struct keyring_search_context *ctx);
138  
139  extern key_ref_t search_cred_keyrings_rcu(struct keyring_search_context *ctx);
140  extern key_ref_t search_process_keyrings_rcu(struct keyring_search_context *ctx);
141  
142  extern struct key *find_keyring_by_name(const char *name, bool uid_keyring);
143  
144  extern int look_up_user_keyrings(struct key **, struct key **);
145  extern struct key *get_user_session_keyring_rcu(const struct cred *);
146  extern int install_thread_keyring_to_cred(struct cred *);
147  extern int install_process_keyring_to_cred(struct cred *);
148  extern int install_session_keyring_to_cred(struct cred *, struct key *);
149  
150  extern struct key *request_key_and_link(struct key_type *type,
151  					const char *description,
152  					struct key_tag *domain_tag,
153  					const void *callout_info,
154  					size_t callout_len,
155  					void *aux,
156  					struct key *dest_keyring,
157  					unsigned long flags);
158  
159  extern bool lookup_user_key_possessed(const struct key *key,
160  				      const struct key_match_data *match_data);
161  
162  extern long join_session_keyring(const char *name);
163  extern void key_change_session_keyring(struct callback_head *twork);
164  
165  extern struct work_struct key_gc_work;
166  extern unsigned key_gc_delay;
167  extern void keyring_gc(struct key *keyring, time64_t limit);
168  extern void keyring_restriction_gc(struct key *keyring,
169  				   struct key_type *dead_type);
170  void key_set_expiry(struct key *key, time64_t expiry);
171  extern void key_schedule_gc(time64_t gc_at);
172  extern void key_schedule_gc_links(void);
173  extern void key_gc_keytype(struct key_type *ktype);
174  
175  extern int key_task_permission(const key_ref_t key_ref,
176  			       const struct cred *cred,
177  			       enum key_need_perm need_perm);
178  
notify_key(struct key * key,enum key_notification_subtype subtype,u32 aux)179  static inline void notify_key(struct key *key,
180  			      enum key_notification_subtype subtype, u32 aux)
181  {
182  #ifdef CONFIG_KEY_NOTIFICATIONS
183  	struct key_notification n = {
184  		.watch.type	= WATCH_TYPE_KEY_NOTIFY,
185  		.watch.subtype	= subtype,
186  		.watch.info	= watch_sizeof(n),
187  		.key_id		= key_serial(key),
188  		.aux		= aux,
189  	};
190  
191  	post_watch_notification(key->watchers, &n.watch, current_cred(),
192  				n.key_id);
193  #endif
194  }
195  
196  /*
197   * Check to see whether permission is granted to use a key in the desired way.
198   */
key_permission(const key_ref_t key_ref,enum key_need_perm need_perm)199  static inline int key_permission(const key_ref_t key_ref,
200  				 enum key_need_perm need_perm)
201  {
202  	return key_task_permission(key_ref, current_cred(), need_perm);
203  }
204  
205  extern struct key_type key_type_request_key_auth;
206  extern struct key *request_key_auth_new(struct key *target,
207  					const char *op,
208  					const void *callout_info,
209  					size_t callout_len,
210  					struct key *dest_keyring);
211  
212  extern struct key *key_get_instantiation_authkey(key_serial_t target_id);
213  
214  /*
215   * Determine whether a key is dead.
216   */
key_is_dead(const struct key * key,time64_t limit)217  static inline bool key_is_dead(const struct key *key, time64_t limit)
218  {
219  	time64_t expiry = key->expiry;
220  
221  	if (expiry != TIME64_MAX) {
222  		if (!(key->type->flags & KEY_TYPE_INSTANT_REAP))
223  			expiry += key_gc_delay;
224  		if (expiry <= limit)
225  			return true;
226  	}
227  
228  	return
229  		key->flags & ((1 << KEY_FLAG_DEAD) |
230  			      (1 << KEY_FLAG_INVALIDATED)) ||
231  		key->domain_tag->removed;
232  }
233  
234  /*
235   * keyctl() functions
236   */
237  extern long keyctl_get_keyring_ID(key_serial_t, int);
238  extern long keyctl_join_session_keyring(const char __user *);
239  extern long keyctl_update_key(key_serial_t, const void __user *, size_t);
240  extern long keyctl_revoke_key(key_serial_t);
241  extern long keyctl_keyring_clear(key_serial_t);
242  extern long keyctl_keyring_link(key_serial_t, key_serial_t);
243  extern long keyctl_keyring_move(key_serial_t, key_serial_t, key_serial_t, unsigned int);
244  extern long keyctl_keyring_unlink(key_serial_t, key_serial_t);
245  extern long keyctl_describe_key(key_serial_t, char __user *, size_t);
246  extern long keyctl_keyring_search(key_serial_t, const char __user *,
247  				  const char __user *, key_serial_t);
248  extern long keyctl_read_key(key_serial_t, char __user *, size_t);
249  extern long keyctl_chown_key(key_serial_t, uid_t, gid_t);
250  extern long keyctl_setperm_key(key_serial_t, key_perm_t);
251  extern long keyctl_instantiate_key(key_serial_t, const void __user *,
252  				   size_t, key_serial_t);
253  extern long keyctl_negate_key(key_serial_t, unsigned, key_serial_t);
254  extern long keyctl_set_reqkey_keyring(int);
255  extern long keyctl_set_timeout(key_serial_t, unsigned);
256  extern long keyctl_assume_authority(key_serial_t);
257  extern long keyctl_get_security(key_serial_t keyid, char __user *buffer,
258  				size_t buflen);
259  extern long keyctl_session_to_parent(void);
260  extern long keyctl_reject_key(key_serial_t, unsigned, unsigned, key_serial_t);
261  extern long keyctl_instantiate_key_iov(key_serial_t,
262  				       const struct iovec __user *,
263  				       unsigned, key_serial_t);
264  extern long keyctl_invalidate_key(key_serial_t);
265  extern long keyctl_restrict_keyring(key_serial_t id,
266  				    const char __user *_type,
267  				    const char __user *_restriction);
268  #ifdef CONFIG_PERSISTENT_KEYRINGS
269  extern long keyctl_get_persistent(uid_t, key_serial_t);
270  extern unsigned persistent_keyring_expiry;
271  #else
keyctl_get_persistent(uid_t uid,key_serial_t destring)272  static inline long keyctl_get_persistent(uid_t uid, key_serial_t destring)
273  {
274  	return -EOPNOTSUPP;
275  }
276  #endif
277  
278  #ifdef CONFIG_KEY_DH_OPERATIONS
279  extern long keyctl_dh_compute(struct keyctl_dh_params __user *, char __user *,
280  			      size_t, struct keyctl_kdf_params __user *);
281  extern long __keyctl_dh_compute(struct keyctl_dh_params __user *, char __user *,
282  				size_t, struct keyctl_kdf_params *);
283  #ifdef CONFIG_COMPAT
284  extern long compat_keyctl_dh_compute(struct keyctl_dh_params __user *params,
285  				char __user *buffer, size_t buflen,
286  				struct compat_keyctl_kdf_params __user *kdf);
287  #endif
288  #define KEYCTL_KDF_MAX_OUTPUT_LEN	1024	/* max length of KDF output */
289  #define KEYCTL_KDF_MAX_OI_LEN		64	/* max length of otherinfo */
290  #else
keyctl_dh_compute(struct keyctl_dh_params __user * params,char __user * buffer,size_t buflen,struct keyctl_kdf_params __user * kdf)291  static inline long keyctl_dh_compute(struct keyctl_dh_params __user *params,
292  				     char __user *buffer, size_t buflen,
293  				     struct keyctl_kdf_params __user *kdf)
294  {
295  	return -EOPNOTSUPP;
296  }
297  
298  #ifdef CONFIG_COMPAT
compat_keyctl_dh_compute(struct keyctl_dh_params __user * params,char __user * buffer,size_t buflen,struct keyctl_kdf_params __user * kdf)299  static inline long compat_keyctl_dh_compute(
300  				struct keyctl_dh_params __user *params,
301  				char __user *buffer, size_t buflen,
302  				struct keyctl_kdf_params __user *kdf)
303  {
304  	return -EOPNOTSUPP;
305  }
306  #endif
307  #endif
308  
309  #ifdef CONFIG_ASYMMETRIC_KEY_TYPE
310  extern long keyctl_pkey_query(key_serial_t,
311  			      const char __user *,
312  			      struct keyctl_pkey_query __user *);
313  
314  extern long keyctl_pkey_verify(const struct keyctl_pkey_params __user *,
315  			       const char __user *,
316  			       const void __user *, const void __user *);
317  
318  extern long keyctl_pkey_e_d_s(int,
319  			      const struct keyctl_pkey_params __user *,
320  			      const char __user *,
321  			      const void __user *, void __user *);
322  #else
keyctl_pkey_query(key_serial_t id,const char __user * _info,struct keyctl_pkey_query __user * _res)323  static inline long keyctl_pkey_query(key_serial_t id,
324  				     const char __user *_info,
325  				     struct keyctl_pkey_query __user *_res)
326  {
327  	return -EOPNOTSUPP;
328  }
329  
keyctl_pkey_verify(const struct keyctl_pkey_params __user * params,const char __user * _info,const void __user * _in,const void __user * _in2)330  static inline long keyctl_pkey_verify(const struct keyctl_pkey_params __user *params,
331  				      const char __user *_info,
332  				      const void __user *_in,
333  				      const void __user *_in2)
334  {
335  	return -EOPNOTSUPP;
336  }
337  
keyctl_pkey_e_d_s(int op,const struct keyctl_pkey_params __user * params,const char __user * _info,const void __user * _in,void __user * _out)338  static inline long keyctl_pkey_e_d_s(int op,
339  				     const struct keyctl_pkey_params __user *params,
340  				     const char __user *_info,
341  				     const void __user *_in,
342  				     void __user *_out)
343  {
344  	return -EOPNOTSUPP;
345  }
346  #endif
347  
348  extern long keyctl_capabilities(unsigned char __user *_buffer, size_t buflen);
349  
350  #ifdef CONFIG_KEY_NOTIFICATIONS
351  extern long keyctl_watch_key(key_serial_t, int, int);
352  #else
keyctl_watch_key(key_serial_t key_id,int watch_fd,int watch_id)353  static inline long keyctl_watch_key(key_serial_t key_id, int watch_fd, int watch_id)
354  {
355  	return -EOPNOTSUPP;
356  }
357  #endif
358  
359  /*
360   * Debugging key validation
361   */
362  #ifdef KEY_DEBUGGING
363  extern void __key_check(const struct key *);
364  
key_check(const struct key * key)365  static inline void key_check(const struct key *key)
366  {
367  	if (key && (IS_ERR(key) || key->magic != KEY_DEBUG_MAGIC))
368  		__key_check(key);
369  }
370  
371  #else
372  
373  #define key_check(key) do {} while(0)
374  
375  #endif
376  #endif /* _INTERNAL_H */
377