Linux Audio

Check our new training course

Loading...
v4.10.11
 
  1/* Authentication token and access key management
  2 *
  3 * Copyright (C) 2004, 2007 Red Hat, Inc. All Rights Reserved.
  4 * Written by David Howells (dhowells@redhat.com)
  5 *
  6 * This program is free software; you can redistribute it and/or
  7 * modify it under the terms of the GNU General Public License
  8 * as published by the Free Software Foundation; either version
  9 * 2 of the License, or (at your option) any later version.
 10 *
 11 *
 12 * See Documentation/security/keys.txt for information on keys/keyrings.
 13 */
 14
 15#ifndef _LINUX_KEY_H
 16#define _LINUX_KEY_H
 17
 18#include <linux/types.h>
 19#include <linux/list.h>
 20#include <linux/rbtree.h>
 21#include <linux/rcupdate.h>
 22#include <linux/sysctl.h>
 23#include <linux/rwsem.h>
 24#include <linux/atomic.h>
 25#include <linux/assoc_array.h>
 
 
 26
 27#ifdef __KERNEL__
 28#include <linux/uidgid.h>
 29
 30/* key handle serial number */
 31typedef int32_t key_serial_t;
 32
 33/* key handle permissions mask */
 34typedef uint32_t key_perm_t;
 35
 36struct key;
 
 37
 38#ifdef CONFIG_KEYS
 39
 40#undef KEY_DEBUGGING
 41
 42#define KEY_POS_VIEW	0x01000000	/* possessor can view a key's attributes */
 43#define KEY_POS_READ	0x02000000	/* possessor can read key payload / view keyring */
 44#define KEY_POS_WRITE	0x04000000	/* possessor can update key payload / add link to keyring */
 45#define KEY_POS_SEARCH	0x08000000	/* possessor can find a key in search / search a keyring */
 46#define KEY_POS_LINK	0x10000000	/* possessor can create a link to a key/keyring */
 47#define KEY_POS_SETATTR	0x20000000	/* possessor can set key attributes */
 48#define KEY_POS_ALL	0x3f000000
 49
 50#define KEY_USR_VIEW	0x00010000	/* user permissions... */
 51#define KEY_USR_READ	0x00020000
 52#define KEY_USR_WRITE	0x00040000
 53#define KEY_USR_SEARCH	0x00080000
 54#define KEY_USR_LINK	0x00100000
 55#define KEY_USR_SETATTR	0x00200000
 56#define KEY_USR_ALL	0x003f0000
 57
 58#define KEY_GRP_VIEW	0x00000100	/* group permissions... */
 59#define KEY_GRP_READ	0x00000200
 60#define KEY_GRP_WRITE	0x00000400
 61#define KEY_GRP_SEARCH	0x00000800
 62#define KEY_GRP_LINK	0x00001000
 63#define KEY_GRP_SETATTR	0x00002000
 64#define KEY_GRP_ALL	0x00003f00
 65
 66#define KEY_OTH_VIEW	0x00000001	/* third party permissions... */
 67#define KEY_OTH_READ	0x00000002
 68#define KEY_OTH_WRITE	0x00000004
 69#define KEY_OTH_SEARCH	0x00000008
 70#define KEY_OTH_LINK	0x00000010
 71#define KEY_OTH_SETATTR	0x00000020
 72#define KEY_OTH_ALL	0x0000003f
 73
 74#define KEY_PERM_UNDEF	0xffffffff
 75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 76struct seq_file;
 77struct user_struct;
 78struct signal_struct;
 79struct cred;
 80
 81struct key_type;
 82struct key_owner;
 
 83struct keyring_list;
 84struct keyring_name;
 85
 
 
 
 
 
 
 86struct keyring_index_key {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 87	struct key_type		*type;
 
 88	const char		*description;
 89	size_t			desc_len;
 90};
 91
 92union key_payload {
 93	void __rcu		*rcu_data0;
 94	void			*data[4];
 95};
 96
 97/*****************************************************************************/
 98/*
 99 * key reference with possession attribute handling
100 *
101 * NOTE! key_ref_t is a typedef'd pointer to a type that is not actually
102 * defined. This is because we abuse the bottom bit of the reference to carry a
103 * flag to indicate whether the calling process possesses that key in one of
104 * its keyrings.
105 *
106 * the key_ref_t has been made a separate type so that the compiler can reject
107 * attempts to dereference it without proper conversion.
108 *
109 * the three functions are used to assemble and disassemble references
110 */
111typedef struct __key_reference_with_attributes *key_ref_t;
112
113static inline key_ref_t make_key_ref(const struct key *key,
114				     bool possession)
115{
116	return (key_ref_t) ((unsigned long) key | possession);
117}
118
119static inline struct key *key_ref_to_ptr(const key_ref_t key_ref)
120{
121	return (struct key *) ((unsigned long) key_ref & ~1UL);
122}
123
124static inline bool is_key_possessed(const key_ref_t key_ref)
125{
126	return (unsigned long) key_ref & 1UL;
127}
128
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129/*****************************************************************************/
130/*
131 * authentication token / access credential / keyring
132 * - types of key include:
133 *   - keyrings
134 *   - disk encryption IDs
135 *   - Kerberos TGTs and tickets
136 */
137struct key {
138	atomic_t		usage;		/* number of references */
139	key_serial_t		serial;		/* key serial number */
140	union {
141		struct list_head graveyard_link;
142		struct rb_node	serial_node;
143	};
 
 
 
144	struct rw_semaphore	sem;		/* change vs change sem */
145	struct key_user		*user;		/* owner of this key */
146	void			*security;	/* security data for this key */
147	union {
148		time_t		expiry;		/* time at which key expires (or 0) */
149		time_t		revoked_at;	/* time at which key was revoked */
150	};
151	time_t			last_used_at;	/* last time used for LRU keyring discard */
152	kuid_t			uid;
153	kgid_t			gid;
154	key_perm_t		perm;		/* access permissions */
155	unsigned short		quotalen;	/* length added to quota */
156	unsigned short		datalen;	/* payload data length
157						 * - may not match RCU dereferenced payload
158						 * - payload should contain own length
159						 */
 
160
161#ifdef KEY_DEBUGGING
162	unsigned		magic;
163#define KEY_DEBUG_MAGIC		0x18273645u
164#define KEY_DEBUG_MAGIC_X	0xf8e9dacbu
165#endif
166
167	unsigned long		flags;		/* status flags (change with bitops) */
168#define KEY_FLAG_INSTANTIATED	0	/* set if key has been instantiated */
169#define KEY_FLAG_DEAD		1	/* set if key type has been deleted */
170#define KEY_FLAG_REVOKED	2	/* set if key had been revoked */
171#define KEY_FLAG_IN_QUOTA	3	/* set if key consumes quota */
172#define KEY_FLAG_USER_CONSTRUCT	4	/* set if key is being constructed in userspace */
173#define KEY_FLAG_NEGATIVE	5	/* set if key is negative */
174#define KEY_FLAG_ROOT_CAN_CLEAR	6	/* set if key can be cleared by root without permission */
175#define KEY_FLAG_INVALIDATED	7	/* set if key has been invalidated */
176#define KEY_FLAG_BUILTIN	8	/* set if key is built in to the kernel */
177#define KEY_FLAG_ROOT_CAN_INVAL	9	/* set if key can be invalidated by root without permission */
178#define KEY_FLAG_KEEP		10	/* set if key should not be removed */
179
180	/* the key type and key description string
181	 * - the desc is used to match a key against search criteria
182	 * - it should be a printable string
183	 * - eg: for krb5 AFS, this might be "afs@REDHAT.COM"
184	 */
185	union {
186		struct keyring_index_key index_key;
187		struct {
 
 
188			struct key_type	*type;		/* type of key */
 
189			char		*description;
190		};
191	};
192
193	/* key data
194	 * - this is used to hold the data actually used in cryptography or
195	 *   whatever
196	 */
197	union {
198		union key_payload payload;
199		struct {
200			/* Keyring bits */
201			struct list_head name_link;
202			struct assoc_array keys;
203		};
204		int reject_error;
205	};
206
207	/* This is set on a keyring to restrict the addition of a link to a key
208	 * to it.  If this method isn't provided then it is assumed that the
209	 * keyring is open to any addition.  It is ignored for non-keyring
210	 * keys.
 
211	 *
212	 * This is intended for use with rings of trusted keys whereby addition
213	 * to the keyring needs to be controlled.  KEY_ALLOC_BYPASS_RESTRICTION
214	 * overrides this, allowing the kernel to add extra keys without
215	 * restriction.
216	 */
217	int (*restrict_link)(struct key *keyring,
218			     const struct key_type *type,
219			     const union key_payload *payload);
220};
221
222extern struct key *key_alloc(struct key_type *type,
223			     const char *desc,
224			     kuid_t uid, kgid_t gid,
225			     const struct cred *cred,
226			     key_perm_t perm,
227			     unsigned long flags,
228			     int (*restrict_link)(struct key *,
229						  const struct key_type *,
230						  const union key_payload *));
231
232
233#define KEY_ALLOC_IN_QUOTA		0x0000	/* add to quota, reject if would overrun */
234#define KEY_ALLOC_QUOTA_OVERRUN		0x0001	/* add to quota, permit even if overrun */
235#define KEY_ALLOC_NOT_IN_QUOTA		0x0002	/* not in quota */
236#define KEY_ALLOC_BUILT_IN		0x0004	/* Key is built into kernel */
237#define KEY_ALLOC_BYPASS_RESTRICTION	0x0008	/* Override the check on restricted keyrings */
 
 
238
239extern void key_revoke(struct key *key);
240extern void key_invalidate(struct key *key);
241extern void key_put(struct key *key);
 
 
242
243static inline struct key *__key_get(struct key *key)
244{
245	atomic_inc(&key->usage);
246	return key;
247}
248
249static inline struct key *key_get(struct key *key)
250{
251	return key ? __key_get(key) : key;
252}
253
254static inline void key_ref_put(key_ref_t key_ref)
255{
256	key_put(key_ref_to_ptr(key_ref));
257}
258
259extern struct key *request_key(struct key_type *type,
260			       const char *description,
261			       const char *callout_info);
 
 
 
 
 
262
263extern struct key *request_key_with_auxdata(struct key_type *type,
264					    const char *description,
 
265					    const void *callout_info,
266					    size_t callout_len,
267					    void *aux);
268
269extern struct key *request_key_async(struct key_type *type,
270				     const char *description,
271				     const void *callout_info,
272				     size_t callout_len);
273
274extern struct key *request_key_async_with_auxdata(struct key_type *type,
275						  const char *description,
276						  const void *callout_info,
277						  size_t callout_len,
278						  void *aux);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
279
280extern int wait_for_key_construction(struct key *key, bool intr);
281
282extern int key_validate(const struct key *key);
283
284extern key_ref_t key_create_or_update(key_ref_t keyring,
285				      const char *type,
286				      const char *description,
287				      const void *payload,
288				      size_t plen,
289				      key_perm_t perm,
290				      unsigned long flags);
291
292extern int key_update(key_ref_t key,
293		      const void *payload,
294		      size_t plen);
295
296extern int key_link(struct key *keyring,
297		    struct key *key);
298
 
 
 
 
 
299extern int key_unlink(struct key *keyring,
300		      struct key *key);
301
302extern struct key *keyring_alloc(const char *description, kuid_t uid, kgid_t gid,
303				 const struct cred *cred,
304				 key_perm_t perm,
305				 unsigned long flags,
306				 int (*restrict_link)(struct key *,
307						      const struct key_type *,
308						      const union key_payload *),
309				 struct key *dest);
310
311extern int restrict_link_reject(struct key *keyring,
312				const struct key_type *type,
313				const union key_payload *payload);
 
314
315extern int keyring_clear(struct key *keyring);
316
317extern key_ref_t keyring_search(key_ref_t keyring,
318				struct key_type *type,
319				const char *description);
 
320
321extern int keyring_add_key(struct key *keyring,
322			   struct key *key);
323
 
 
 
324extern struct key *key_lookup(key_serial_t id);
325
326static inline key_serial_t key_serial(const struct key *key)
327{
328	return key ? key->serial : 0;
329}
330
331extern void key_set_timeout(struct key *, unsigned);
332
333/*
334 * The permissions required on a key that we're looking up.
335 */
336#define	KEY_NEED_VIEW	0x01	/* Require permission to view attributes */
337#define	KEY_NEED_READ	0x02	/* Require permission to read content */
338#define	KEY_NEED_WRITE	0x04	/* Require permission to update / modify */
339#define	KEY_NEED_SEARCH	0x08	/* Require permission to search (keyring) or find (key) */
340#define	KEY_NEED_LINK	0x10	/* Require permission to link */
341#define	KEY_NEED_SETATTR 0x20	/* Require permission to change attributes */
342#define	KEY_NEED_ALL	0x3f	/* All the above permissions */
343
344/**
345 * key_is_instantiated - Determine if a key has been positively instantiated
346 * @key: The key to check.
347 *
348 * Return true if the specified key has been positively instantiated, false
349 * otherwise.
350 */
351static inline bool key_is_instantiated(const struct key *key)
 
 
 
 
 
352{
353	return test_bit(KEY_FLAG_INSTANTIATED, &key->flags) &&
354		!test_bit(KEY_FLAG_NEGATIVE, &key->flags);
355}
356
357#define rcu_dereference_key(KEY)					\
 
 
 
358	(rcu_dereference_protected((KEY)->payload.rcu_data0,		\
359				   rwsem_is_locked(&((struct key *)(KEY))->sem)))
360
361#define rcu_assign_keypointer(KEY, PAYLOAD)				\
362do {									\
363	rcu_assign_pointer((KEY)->payload.rcu_data0, (PAYLOAD));	\
364} while (0)
365
366#ifdef CONFIG_SYSCTL
367extern struct ctl_table key_sysctls[];
368#endif
369/*
370 * the userspace interface
371 */
372extern int install_thread_keyring_to_cred(struct cred *cred);
373extern void key_fsuid_changed(struct task_struct *tsk);
374extern void key_fsgid_changed(struct task_struct *tsk);
375extern void key_init(void);
376
377#else /* CONFIG_KEYS */
378
379#define key_validate(k)			0
380#define key_serial(k)			0
381#define key_get(k) 			({ NULL; })
382#define key_revoke(k)			do { } while(0)
383#define key_invalidate(k)		do { } while(0)
384#define key_put(k)			do { } while(0)
385#define key_ref_put(k)			do { } while(0)
386#define make_key_ref(k, p)		NULL
387#define key_ref_to_ptr(k)		NULL
388#define is_key_possessed(k)		0
389#define key_fsuid_changed(t)		do { } while(0)
390#define key_fsgid_changed(t)		do { } while(0)
391#define key_init()			do { } while(0)
 
 
392
393#endif /* CONFIG_KEYS */
394#endif /* __KERNEL__ */
395#endif /* _LINUX_KEY_H */
v6.2
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/* Authentication token and access key management
  3 *
  4 * Copyright (C) 2004, 2007 Red Hat, Inc. All Rights Reserved.
  5 * Written by David Howells (dhowells@redhat.com)
  6 *
  7 * See Documentation/security/keys/core.rst for information on keys/keyrings.
 
 
 
 
 
 
  8 */
  9
 10#ifndef _LINUX_KEY_H
 11#define _LINUX_KEY_H
 12
 13#include <linux/types.h>
 14#include <linux/list.h>
 15#include <linux/rbtree.h>
 16#include <linux/rcupdate.h>
 17#include <linux/sysctl.h>
 18#include <linux/rwsem.h>
 19#include <linux/atomic.h>
 20#include <linux/assoc_array.h>
 21#include <linux/refcount.h>
 22#include <linux/time64.h>
 23
 24#ifdef __KERNEL__
 25#include <linux/uidgid.h>
 26
 27/* key handle serial number */
 28typedef int32_t key_serial_t;
 29
 30/* key handle permissions mask */
 31typedef uint32_t key_perm_t;
 32
 33struct key;
 34struct net;
 35
 36#ifdef CONFIG_KEYS
 37
 38#undef KEY_DEBUGGING
 39
 40#define KEY_POS_VIEW	0x01000000	/* possessor can view a key's attributes */
 41#define KEY_POS_READ	0x02000000	/* possessor can read key payload / view keyring */
 42#define KEY_POS_WRITE	0x04000000	/* possessor can update key payload / add link to keyring */
 43#define KEY_POS_SEARCH	0x08000000	/* possessor can find a key in search / search a keyring */
 44#define KEY_POS_LINK	0x10000000	/* possessor can create a link to a key/keyring */
 45#define KEY_POS_SETATTR	0x20000000	/* possessor can set key attributes */
 46#define KEY_POS_ALL	0x3f000000
 47
 48#define KEY_USR_VIEW	0x00010000	/* user permissions... */
 49#define KEY_USR_READ	0x00020000
 50#define KEY_USR_WRITE	0x00040000
 51#define KEY_USR_SEARCH	0x00080000
 52#define KEY_USR_LINK	0x00100000
 53#define KEY_USR_SETATTR	0x00200000
 54#define KEY_USR_ALL	0x003f0000
 55
 56#define KEY_GRP_VIEW	0x00000100	/* group permissions... */
 57#define KEY_GRP_READ	0x00000200
 58#define KEY_GRP_WRITE	0x00000400
 59#define KEY_GRP_SEARCH	0x00000800
 60#define KEY_GRP_LINK	0x00001000
 61#define KEY_GRP_SETATTR	0x00002000
 62#define KEY_GRP_ALL	0x00003f00
 63
 64#define KEY_OTH_VIEW	0x00000001	/* third party permissions... */
 65#define KEY_OTH_READ	0x00000002
 66#define KEY_OTH_WRITE	0x00000004
 67#define KEY_OTH_SEARCH	0x00000008
 68#define KEY_OTH_LINK	0x00000010
 69#define KEY_OTH_SETATTR	0x00000020
 70#define KEY_OTH_ALL	0x0000003f
 71
 72#define KEY_PERM_UNDEF	0xffffffff
 73
 74/*
 75 * The permissions required on a key that we're looking up.
 76 */
 77enum key_need_perm {
 78	KEY_NEED_UNSPECIFIED,	/* Needed permission unspecified */
 79	KEY_NEED_VIEW,		/* Require permission to view attributes */
 80	KEY_NEED_READ,		/* Require permission to read content */
 81	KEY_NEED_WRITE,		/* Require permission to update / modify */
 82	KEY_NEED_SEARCH,	/* Require permission to search (keyring) or find (key) */
 83	KEY_NEED_LINK,		/* Require permission to link */
 84	KEY_NEED_SETATTR,	/* Require permission to change attributes */
 85	KEY_NEED_UNLINK,	/* Require permission to unlink key */
 86	KEY_SYSADMIN_OVERRIDE,	/* Special: override by CAP_SYS_ADMIN */
 87	KEY_AUTHTOKEN_OVERRIDE,	/* Special: override by possession of auth token */
 88	KEY_DEFER_PERM_CHECK,	/* Special: permission check is deferred */
 89};
 90
 91enum key_lookup_flag {
 92	KEY_LOOKUP_CREATE = 0x01,
 93	KEY_LOOKUP_PARTIAL = 0x02,
 94	KEY_LOOKUP_ALL = (KEY_LOOKUP_CREATE | KEY_LOOKUP_PARTIAL),
 95};
 96
 97struct seq_file;
 98struct user_struct;
 99struct signal_struct;
100struct cred;
101
102struct key_type;
103struct key_owner;
104struct key_tag;
105struct keyring_list;
106struct keyring_name;
107
108struct key_tag {
109	struct rcu_head		rcu;
110	refcount_t		usage;
111	bool			removed;	/* T when subject removed */
112};
113
114struct keyring_index_key {
115	/* [!] If this structure is altered, the union in struct key must change too! */
116	unsigned long		hash;			/* Hash value */
117	union {
118		struct {
119#ifdef __LITTLE_ENDIAN /* Put desc_len at the LSB of x */
120			u16	desc_len;
121			char	desc[sizeof(long) - 2];	/* First few chars of description */
122#else
123			char	desc[sizeof(long) - 2];	/* First few chars of description */
124			u16	desc_len;
125#endif
126		};
127		unsigned long x;
128	};
129	struct key_type		*type;
130	struct key_tag		*domain_tag;	/* Domain of operation */
131	const char		*description;
 
132};
133
134union key_payload {
135	void __rcu		*rcu_data0;
136	void			*data[4];
137};
138
139/*****************************************************************************/
140/*
141 * key reference with possession attribute handling
142 *
143 * NOTE! key_ref_t is a typedef'd pointer to a type that is not actually
144 * defined. This is because we abuse the bottom bit of the reference to carry a
145 * flag to indicate whether the calling process possesses that key in one of
146 * its keyrings.
147 *
148 * the key_ref_t has been made a separate type so that the compiler can reject
149 * attempts to dereference it without proper conversion.
150 *
151 * the three functions are used to assemble and disassemble references
152 */
153typedef struct __key_reference_with_attributes *key_ref_t;
154
155static inline key_ref_t make_key_ref(const struct key *key,
156				     bool possession)
157{
158	return (key_ref_t) ((unsigned long) key | possession);
159}
160
161static inline struct key *key_ref_to_ptr(const key_ref_t key_ref)
162{
163	return (struct key *) ((unsigned long) key_ref & ~1UL);
164}
165
166static inline bool is_key_possessed(const key_ref_t key_ref)
167{
168	return (unsigned long) key_ref & 1UL;
169}
170
171typedef int (*key_restrict_link_func_t)(struct key *dest_keyring,
172					const struct key_type *type,
173					const union key_payload *payload,
174					struct key *restriction_key);
175
176struct key_restriction {
177	key_restrict_link_func_t check;
178	struct key *key;
179	struct key_type *keytype;
180};
181
182enum key_state {
183	KEY_IS_UNINSTANTIATED,
184	KEY_IS_POSITIVE,		/* Positively instantiated */
185};
186
187/*****************************************************************************/
188/*
189 * authentication token / access credential / keyring
190 * - types of key include:
191 *   - keyrings
192 *   - disk encryption IDs
193 *   - Kerberos TGTs and tickets
194 */
195struct key {
196	refcount_t		usage;		/* number of references */
197	key_serial_t		serial;		/* key serial number */
198	union {
199		struct list_head graveyard_link;
200		struct rb_node	serial_node;
201	};
202#ifdef CONFIG_KEY_NOTIFICATIONS
203	struct watch_list	*watchers;	/* Entities watching this key for changes */
204#endif
205	struct rw_semaphore	sem;		/* change vs change sem */
206	struct key_user		*user;		/* owner of this key */
207	void			*security;	/* security data for this key */
208	union {
209		time64_t	expiry;		/* time at which key expires (or 0) */
210		time64_t	revoked_at;	/* time at which key was revoked */
211	};
212	time64_t		last_used_at;	/* last time used for LRU keyring discard */
213	kuid_t			uid;
214	kgid_t			gid;
215	key_perm_t		perm;		/* access permissions */
216	unsigned short		quotalen;	/* length added to quota */
217	unsigned short		datalen;	/* payload data length
218						 * - may not match RCU dereferenced payload
219						 * - payload should contain own length
220						 */
221	short			state;		/* Key state (+) or rejection error (-) */
222
223#ifdef KEY_DEBUGGING
224	unsigned		magic;
225#define KEY_DEBUG_MAGIC		0x18273645u
 
226#endif
227
228	unsigned long		flags;		/* status flags (change with bitops) */
229#define KEY_FLAG_DEAD		0	/* set if key type has been deleted */
230#define KEY_FLAG_REVOKED	1	/* set if key had been revoked */
231#define KEY_FLAG_IN_QUOTA	2	/* set if key consumes quota */
232#define KEY_FLAG_USER_CONSTRUCT	3	/* set if key is being constructed in userspace */
233#define KEY_FLAG_ROOT_CAN_CLEAR	4	/* set if key can be cleared by root without permission */
234#define KEY_FLAG_INVALIDATED	5	/* set if key has been invalidated */
235#define KEY_FLAG_BUILTIN	6	/* set if key is built in to the kernel */
236#define KEY_FLAG_ROOT_CAN_INVAL	7	/* set if key can be invalidated by root without permission */
237#define KEY_FLAG_KEEP		8	/* set if key should not be removed */
238#define KEY_FLAG_UID_KEYRING	9	/* set if key is a user or user session keyring */
 
239
240	/* the key type and key description string
241	 * - the desc is used to match a key against search criteria
242	 * - it should be a printable string
243	 * - eg: for krb5 AFS, this might be "afs@REDHAT.COM"
244	 */
245	union {
246		struct keyring_index_key index_key;
247		struct {
248			unsigned long	hash;
249			unsigned long	len_desc;
250			struct key_type	*type;		/* type of key */
251			struct key_tag	*domain_tag;	/* Domain of operation */
252			char		*description;
253		};
254	};
255
256	/* key data
257	 * - this is used to hold the data actually used in cryptography or
258	 *   whatever
259	 */
260	union {
261		union key_payload payload;
262		struct {
263			/* Keyring bits */
264			struct list_head name_link;
265			struct assoc_array keys;
266		};
 
267	};
268
269	/* This is set on a keyring to restrict the addition of a link to a key
270	 * to it.  If this structure isn't provided then it is assumed that the
271	 * keyring is open to any addition.  It is ignored for non-keyring
272	 * keys. Only set this value using keyring_restrict(), keyring_alloc(),
273	 * or key_alloc().
274	 *
275	 * This is intended for use with rings of trusted keys whereby addition
276	 * to the keyring needs to be controlled.  KEY_ALLOC_BYPASS_RESTRICTION
277	 * overrides this, allowing the kernel to add extra keys without
278	 * restriction.
279	 */
280	struct key_restriction *restrict_link;
 
 
281};
282
283extern struct key *key_alloc(struct key_type *type,
284			     const char *desc,
285			     kuid_t uid, kgid_t gid,
286			     const struct cred *cred,
287			     key_perm_t perm,
288			     unsigned long flags,
289			     struct key_restriction *restrict_link);
 
 
290
291
292#define KEY_ALLOC_IN_QUOTA		0x0000	/* add to quota, reject if would overrun */
293#define KEY_ALLOC_QUOTA_OVERRUN		0x0001	/* add to quota, permit even if overrun */
294#define KEY_ALLOC_NOT_IN_QUOTA		0x0002	/* not in quota */
295#define KEY_ALLOC_BUILT_IN		0x0004	/* Key is built into kernel */
296#define KEY_ALLOC_BYPASS_RESTRICTION	0x0008	/* Override the check on restricted keyrings */
297#define KEY_ALLOC_UID_KEYRING		0x0010	/* allocating a user or user session keyring */
298#define KEY_ALLOC_SET_KEEP		0x0020	/* Set the KEEP flag on the key/keyring */
299
300extern void key_revoke(struct key *key);
301extern void key_invalidate(struct key *key);
302extern void key_put(struct key *key);
303extern bool key_put_tag(struct key_tag *tag);
304extern void key_remove_domain(struct key_tag *domain_tag);
305
306static inline struct key *__key_get(struct key *key)
307{
308	refcount_inc(&key->usage);
309	return key;
310}
311
312static inline struct key *key_get(struct key *key)
313{
314	return key ? __key_get(key) : key;
315}
316
317static inline void key_ref_put(key_ref_t key_ref)
318{
319	key_put(key_ref_to_ptr(key_ref));
320}
321
322extern struct key *request_key_tag(struct key_type *type,
323				   const char *description,
324				   struct key_tag *domain_tag,
325				   const char *callout_info);
326
327extern struct key *request_key_rcu(struct key_type *type,
328				   const char *description,
329				   struct key_tag *domain_tag);
330
331extern struct key *request_key_with_auxdata(struct key_type *type,
332					    const char *description,
333					    struct key_tag *domain_tag,
334					    const void *callout_info,
335					    size_t callout_len,
336					    void *aux);
337
338/**
339 * request_key - Request a key and wait for construction
340 * @type: Type of key.
341 * @description: The searchable description of the key.
342 * @callout_info: The data to pass to the instantiation upcall (or NULL).
343 *
344 * As for request_key_tag(), but with the default global domain tag.
345 */
346static inline struct key *request_key(struct key_type *type,
347				      const char *description,
348				      const char *callout_info)
349{
350	return request_key_tag(type, description, NULL, callout_info);
351}
352
353#ifdef CONFIG_NET
354/**
355 * request_key_net - Request a key for a net namespace and wait for construction
356 * @type: Type of key.
357 * @description: The searchable description of the key.
358 * @net: The network namespace that is the key's domain of operation.
359 * @callout_info: The data to pass to the instantiation upcall (or NULL).
360 *
361 * As for request_key() except that it does not add the returned key to a
362 * keyring if found, new keys are always allocated in the user's quota, the
363 * callout_info must be a NUL-terminated string and no auxiliary data can be
364 * passed.  Only keys that operate the specified network namespace are used.
365 *
366 * Furthermore, it then works as wait_for_key_construction() to wait for the
367 * completion of keys undergoing construction with a non-interruptible wait.
368 */
369#define request_key_net(type, description, net, callout_info) \
370	request_key_tag(type, description, net->key_domain, callout_info)
371
372/**
373 * request_key_net_rcu - Request a key for a net namespace under RCU conditions
374 * @type: Type of key.
375 * @description: The searchable description of the key.
376 * @net: The network namespace that is the key's domain of operation.
377 *
378 * As for request_key_rcu() except that only keys that operate the specified
379 * network namespace are used.
380 */
381#define request_key_net_rcu(type, description, net) \
382	request_key_rcu(type, description, net->key_domain)
383#endif /* CONFIG_NET */
384
385extern int wait_for_key_construction(struct key *key, bool intr);
386
387extern int key_validate(const struct key *key);
388
389extern key_ref_t key_create_or_update(key_ref_t keyring,
390				      const char *type,
391				      const char *description,
392				      const void *payload,
393				      size_t plen,
394				      key_perm_t perm,
395				      unsigned long flags);
396
397extern int key_update(key_ref_t key,
398		      const void *payload,
399		      size_t plen);
400
401extern int key_link(struct key *keyring,
402		    struct key *key);
403
404extern int key_move(struct key *key,
405		    struct key *from_keyring,
406		    struct key *to_keyring,
407		    unsigned int flags);
408
409extern int key_unlink(struct key *keyring,
410		      struct key *key);
411
412extern struct key *keyring_alloc(const char *description, kuid_t uid, kgid_t gid,
413				 const struct cred *cred,
414				 key_perm_t perm,
415				 unsigned long flags,
416				 struct key_restriction *restrict_link,
 
 
417				 struct key *dest);
418
419extern int restrict_link_reject(struct key *keyring,
420				const struct key_type *type,
421				const union key_payload *payload,
422				struct key *restriction_key);
423
424extern int keyring_clear(struct key *keyring);
425
426extern key_ref_t keyring_search(key_ref_t keyring,
427				struct key_type *type,
428				const char *description,
429				bool recurse);
430
431extern int keyring_add_key(struct key *keyring,
432			   struct key *key);
433
434extern int keyring_restrict(key_ref_t keyring, const char *type,
435			    const char *restriction);
436
437extern struct key *key_lookup(key_serial_t id);
438
439static inline key_serial_t key_serial(const struct key *key)
440{
441	return key ? key->serial : 0;
442}
443
444extern void key_set_timeout(struct key *, unsigned);
445
446extern key_ref_t lookup_user_key(key_serial_t id, unsigned long flags,
447				 enum key_need_perm need_perm);
448extern void key_free_user_ns(struct user_namespace *);
449
450static inline short key_read_state(const struct key *key)
451{
452	/* Barrier versus mark_key_instantiated(). */
453	return smp_load_acquire(&key->state);
454}
 
455
456/**
457 * key_is_positive - Determine if a key has been positively instantiated
458 * @key: The key to check.
459 *
460 * Return true if the specified key has been positively instantiated, false
461 * otherwise.
462 */
463static inline bool key_is_positive(const struct key *key)
464{
465	return key_read_state(key) == KEY_IS_POSITIVE;
466}
467
468static inline bool key_is_negative(const struct key *key)
469{
470	return key_read_state(key) < 0;
 
471}
472
473#define dereference_key_rcu(KEY)					\
474	(rcu_dereference((KEY)->payload.rcu_data0))
475
476#define dereference_key_locked(KEY)					\
477	(rcu_dereference_protected((KEY)->payload.rcu_data0,		\
478				   rwsem_is_locked(&((struct key *)(KEY))->sem)))
479
480#define rcu_assign_keypointer(KEY, PAYLOAD)				\
481do {									\
482	rcu_assign_pointer((KEY)->payload.rcu_data0, (PAYLOAD));	\
483} while (0)
484
485#ifdef CONFIG_SYSCTL
486extern struct ctl_table key_sysctls[];
487#endif
488/*
489 * the userspace interface
490 */
491extern int install_thread_keyring_to_cred(struct cred *cred);
492extern void key_fsuid_changed(struct cred *new_cred);
493extern void key_fsgid_changed(struct cred *new_cred);
494extern void key_init(void);
495
496#else /* CONFIG_KEYS */
497
498#define key_validate(k)			0
499#define key_serial(k)			0
500#define key_get(k) 			({ NULL; })
501#define key_revoke(k)			do { } while(0)
502#define key_invalidate(k)		do { } while(0)
503#define key_put(k)			do { } while(0)
504#define key_ref_put(k)			do { } while(0)
505#define make_key_ref(k, p)		NULL
506#define key_ref_to_ptr(k)		NULL
507#define is_key_possessed(k)		0
508#define key_fsuid_changed(c)		do { } while(0)
509#define key_fsgid_changed(c)		do { } while(0)
510#define key_init()			do { } while(0)
511#define key_free_user_ns(ns)		do { } while(0)
512#define key_remove_domain(d)		do { } while(0)
513
514#endif /* CONFIG_KEYS */
515#endif /* __KERNEL__ */
516#endif /* _LINUX_KEY_H */