1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* key.h: authentication token and access key management
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Written by David Howells (dhowells@redhat.com)
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * modify it under the terms of the GNU General Public License
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * as published by the Free Software Foundation; either version
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 2 of the License, or (at your option) any later version.
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * See Documentation/keys.txt for information on keys/keyrings.
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_KEY_H
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_KEY_H
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h>
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h>
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/rbtree.h>
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/rcupdate.h>
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/atomic.h>
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* key handle serial number */
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int32_t key_serial_t;
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* key handle permissions mask */
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef uint32_t key_perm_t;
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct key;
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_KEYS
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#undef KEY_DEBUGGING
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_POS_VIEW	0x01000000	/* possessor can view a key's attributes */
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_POS_READ	0x02000000	/* possessor can read key payload / view keyring */
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_POS_WRITE	0x04000000	/* possessor can update key payload / add link to keyring */
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_POS_SEARCH	0x08000000	/* possessor can find a key in search / search a keyring */
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_POS_LINK	0x10000000	/* possessor can create a link to a key/keyring */
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_POS_SETATTR	0x20000000	/* possessor can set key attributes */
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_POS_ALL	0x3f000000
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_USR_VIEW	0x00010000	/* user permissions... */
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_USR_READ	0x00020000
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_USR_WRITE	0x00040000
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_USR_SEARCH	0x00080000
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_USR_LINK	0x00100000
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_USR_SETATTR	0x00200000
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_USR_ALL	0x003f0000
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_GRP_VIEW	0x00000100	/* group permissions... */
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_GRP_READ	0x00000200
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_GRP_WRITE	0x00000400
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_GRP_SEARCH	0x00000800
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_GRP_LINK	0x00001000
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_GRP_SETATTR	0x00002000
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_GRP_ALL	0x00003f00
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_OTH_VIEW	0x00000001	/* third party permissions... */
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_OTH_READ	0x00000002
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_OTH_WRITE	0x00000004
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_OTH_SEARCH	0x00000008
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_OTH_LINK	0x00000010
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_OTH_SETATTR	0x00000020
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_OTH_ALL	0x0000003f
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct seq_file;
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct user_struct;
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct signal_struct;
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct key_type;
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct key_owner;
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct keyring_list;
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct keyring_name;
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*****************************************************************************/
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * key reference with possession attribute handling
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * NOTE! key_ref_t is a typedef'd pointer to a type that is not actually
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * defined. This is because we abuse the bottom bit of the reference to carry a
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * flag to indicate whether the calling process possesses that key in one of
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * its keyrings.
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the key_ref_t has been made a separate type so that the compiler can reject
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * attempts to dereference it without proper conversion.
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the three functions are used to assemble and disassemble references
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct __key_reference_with_attributes *key_ref_t;
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline key_ref_t make_key_ref(const struct key *key,
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				     unsigned long possession)
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (key_ref_t) ((unsigned long) key | possession);
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct key *key_ref_to_ptr(const key_ref_t key_ref)
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (struct key *) ((unsigned long) key_ref & ~1UL);
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long is_key_possessed(const key_ref_t key_ref)
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return (unsigned long) key_ref & 1UL;
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*****************************************************************************/
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * authentication token / access credential / keyring
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - types of key include:
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *   - keyrings
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *   - disk encryption IDs
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *   - Kerberos TGTs and tickets
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct key {
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	atomic_t		usage;		/* number of references */
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	key_serial_t		serial;		/* key serial number */
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct rb_node		serial_node;
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct key_type		*type;		/* type of key */
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct rw_semaphore	sem;		/* change vs change sem */
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct key_user		*user;		/* owner of this key */
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void			*security;	/* security data for this key */
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	time_t			expiry;		/* time at which key expires (or 0) */
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	uid_t			uid;
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	gid_t			gid;
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	key_perm_t		perm;		/* access permissions */
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short		quotalen;	/* length added to quota */
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned short		datalen;	/* payload data length
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru						 * - may not match RCU dereferenced payload
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru						 * - payload should contain own length
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru						 */
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef KEY_DEBUGGING
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned		magic;
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_DEBUG_MAGIC		0x18273645u
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_DEBUG_MAGIC_X	0xf8e9dacbu
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long		flags;		/* status flags (change with bitops) */
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_FLAG_INSTANTIATED	0	/* set if key has been instantiated */
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_FLAG_DEAD		1	/* set if key type has been deleted */
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_FLAG_REVOKED	2	/* set if key had been revoked */
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_FLAG_IN_QUOTA	3	/* set if key consumes quota */
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_FLAG_USER_CONSTRUCT	4	/* set if key is being constructed in userspace */
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_FLAG_NEGATIVE	5	/* set if key is negative */
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* the description string
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - this is used to match a key against search criteria
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - this should be a printable string
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - eg: for krb5 AFS, this might be "afs@REDHAT.COM"
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char			*description;
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* type specific data
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - this is used by the keyring type to index the name
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	union {
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		struct list_head	link;
163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	} type_data;
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* key data
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - this is used to hold the data actually used in cryptography or
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 *   whatever
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	union {
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		unsigned long		value;
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		void			*data;
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		struct keyring_list	*subscriptions;
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	} payload;
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*****************************************************************************/
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * kernel managed key type definition
179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (*request_key_actor_t)(struct key *key, struct key *authkey,
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				   const char *op, void *aux);
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct key_type {
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* name of the type */
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	const char *name;
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* default payload length for quota precalculation (optional)
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - this can be used instead of calling key_payload_reserve(), that
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 *   function only needs to be called if the real datalen is different
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	size_t def_datalen;
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* instantiate a key of this type
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - this method should call key_payload_reserve() to determine if the
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 *   user's quota will hold the payload
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*instantiate)(struct key *key, const void *data, size_t datalen);
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* update a key of this type (optional)
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - this method should call key_payload_reserve() to recalculate the
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 *   quota consumption
202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - the key must be locked against read when modifying
203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*update)(struct key *key, const void *data, size_t datalen);
205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* match a key against a description */
207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*match)(const struct key *key, const void *desc);
208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* clear some of the data from a key on revokation (optional)
210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - the key's semaphore will be write-locked by the caller
211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*revoke)(struct key *key);
213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* clear the data from a key (optional) */
215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*destroy)(struct key *key);
216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* describe a key */
218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*describe)(const struct key *key, struct seq_file *p);
219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* read a key's data (optional)
221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - permission checks will be done by the caller
222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - the key's semaphore will be readlocked by the caller
223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - should return the amount of data that could be read, no matter how
224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 *   much is copied into the buffer
225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - shouldn't do the copy if the buffer is NULL
226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	long (*read)(const struct key *key, char __user *buffer, size_t buflen);
228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* handle request_key() for this type instead of invoking
230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * /sbin/request-key (optional)
231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - key is the key to instantiate
232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - authkey is the authority to assume when instantiating this key
233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - op is the operation to be done, usually "create"
234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 * - the call must not return until the instantiation process has run
235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 *   its course
236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 */
237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	request_key_actor_t request_key;
238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* internal fields */
240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head	link;		/* link in types list */
241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key_type key_type_keyring;
244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int register_key_type(struct key_type *ktype);
246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void unregister_key_type(struct key_type *ktype);
247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key *key_alloc(struct key_type *type,
249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     const char *desc,
250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     uid_t uid, gid_t gid,
251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     struct task_struct *ctx,
252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     key_perm_t perm,
253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     unsigned long flags);
254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_ALLOC_IN_QUOTA	0x0000	/* add to quota, reject if would overrun */
257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_ALLOC_QUOTA_OVERRUN	0x0001	/* add to quota, permit even if overrun */
258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KEY_ALLOC_NOT_IN_QUOTA	0x0002	/* not in quota */
259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int key_payload_reserve(struct key *key, size_t datalen);
261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int key_instantiate_and_link(struct key *key,
262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				    const void *data,
263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				    size_t datalen,
264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				    struct key *keyring,
265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				    struct key *instkey);
266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int key_negate_and_link(struct key *key,
267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			       unsigned timeout,
268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			       struct key *keyring,
269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			       struct key *instkey);
270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void key_revoke(struct key *key);
271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void key_put(struct key *key);
272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct key *key_get(struct key *key)
274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (key)
276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		atomic_inc(&key->usage);
277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return key;
278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void key_ref_put(key_ref_t key_ref)
281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	key_put(key_ref_to_ptr(key_ref));
283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key *request_key(struct key_type *type,
286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			       const char *description,
287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			       const char *callout_info);
288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key *request_key_with_auxdata(struct key_type *type,
290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    const char *description,
291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    const char *callout_info,
292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					    void *aux);
293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int key_validate(struct key *key);
295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern key_ref_t key_create_or_update(key_ref_t keyring,
297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      const char *type,
298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      const char *description,
299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      const void *payload,
300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      size_t plen,
301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				      unsigned long flags);
302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int key_update(key_ref_t key,
304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		      const void *payload,
305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		      size_t plen);
306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int key_link(struct key *keyring,
308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		    struct key *key);
309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int key_unlink(struct key *keyring,
311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		      struct key *key);
312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid,
314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				 struct task_struct *ctx,
315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				 unsigned long flags,
316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				 struct key *dest);
317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int keyring_clear(struct key *keyring);
319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern key_ref_t keyring_search(key_ref_t keyring,
321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				struct key_type *type,
322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				const char *description);
323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int keyring_add_key(struct key *keyring,
325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			   struct key *key);
326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key *key_lookup(key_serial_t id);
328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void keyring_replace_payload(struct key *key, void *replacement);
330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_serial(key) ((key) ? (key)->serial : 0)
332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the userspace interface
335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key root_user_keyring, root_session_keyring;
337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int alloc_uid_keyring(struct user_struct *user,
338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     struct task_struct *ctx);
339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void switch_uid_keyring(struct user_struct *new_user);
340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int copy_keys(unsigned long clone_flags, struct task_struct *tsk);
341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int copy_thread_group_keys(struct task_struct *tsk);
342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void exit_keys(struct task_struct *tsk);
343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void exit_thread_group_keys(struct signal_struct *tg);
344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int suid_keys(struct task_struct *tsk);
345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int exec_keys(struct task_struct *tsk);
346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void key_fsuid_changed(struct task_struct *tsk);
347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void key_fsgid_changed(struct task_struct *tsk);
348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void key_init(void);
349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __install_session_keyring(tsk, keyring)			\
351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({								\
352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct key *old_session = tsk->signal->session_keyring;	\
353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	tsk->signal->session_keyring = keyring;			\
354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	old_session;						\
355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru})
356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* CONFIG_KEYS */
358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_validate(k)			0
360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_serial(k)			0
361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_get(k) 			({ NULL; })
362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_put(k)			do { } while(0)
363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_ref_put(k)			do { } while(0)
364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define make_key_ref(k)			({ NULL; })
365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_ref_to_ptr(k)		({ NULL; })
366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define is_key_possessed(k)		0
367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define alloc_uid_keyring(u,c)		0
368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define switch_uid_keyring(u)		do { } while(0)
369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __install_session_keyring(t, k)	({ NULL; })
370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define copy_keys(f,t)			0
371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define copy_thread_group_keys(t)	0
372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define exit_keys(t)			do { } while(0)
373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define exit_thread_group_keys(tg)	do { } while(0)
374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define suid_keys(t)			do { } while(0)
375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define exec_keys(t)			do { } while(0)
376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_fsuid_changed(t)		do { } while(0)
377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_fsgid_changed(t)		do { } while(0)
378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define key_init()			do { } while(0)
379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Initial keyrings */
381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key root_user_keyring;
382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct key root_session_keyring;
383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_KEYS */
385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */
386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_KEY_H */
387