Blame view

security/keys/internal.h 8.28 KB
973c9f4f4   David Howells   KEYS: Fix up comm...
1
  /* Authentication token and access key management internal defs
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
   *
76181c134   David Howells   KEYS: Make reques...
3
   * Copyright (C) 2003-5, 2007 Red Hat, Inc. All Rights Reserved.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
9
10
11
12
13
   * Written by David Howells (dhowells@redhat.com)
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version
   * 2 of the License, or (at your option) any later version.
   */
  
  #ifndef _INTERNAL_H
  #define _INTERNAL_H
d84f4f992   David Howells   CRED: Inaugurate ...
14
  #include <linux/sched.h>
76181c134   David Howells   KEYS: Make reques...
15
  #include <linux/key-type.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16

76181c134   David Howells   KEYS: Make reques...
17
18
  #ifdef __KDEBUG
  #define kenter(FMT, ...) \
dd6f953ad   Harvey Harrison   security: replace...
19
20
  	printk(KERN_DEBUG "==> %s("FMT")
  ", __func__, ##__VA_ARGS__)
76181c134   David Howells   KEYS: Make reques...
21
  #define kleave(FMT, ...) \
dd6f953ad   Harvey Harrison   security: replace...
22
23
  	printk(KERN_DEBUG "<== %s()"FMT"
  ", __func__, ##__VA_ARGS__)
76181c134   David Howells   KEYS: Make reques...
24
  #define kdebug(FMT, ...) \
d84f4f992   David Howells   CRED: Inaugurate ...
25
26
  	printk(KERN_DEBUG "   "FMT"
  ", ##__VA_ARGS__)
3e30148c3   David Howells   [PATCH] Keys: Mak...
27
  #else
76181c134   David Howells   KEYS: Make reques...
28
  #define kenter(FMT, ...) \
dd6f953ad   Harvey Harrison   security: replace...
29
30
  	no_printk(KERN_DEBUG "==> %s("FMT")
  ", __func__, ##__VA_ARGS__)
76181c134   David Howells   KEYS: Make reques...
31
  #define kleave(FMT, ...) \
dd6f953ad   Harvey Harrison   security: replace...
32
33
  	no_printk(KERN_DEBUG "<== %s()"FMT"
  ", __func__, ##__VA_ARGS__)
76181c134   David Howells   KEYS: Make reques...
34
35
36
  #define kdebug(FMT, ...) \
  	no_printk(KERN_DEBUG FMT"
  ", ##__VA_ARGS__)
3e30148c3   David Howells   [PATCH] Keys: Mak...
37
  #endif
0c061b570   David Howells   KEYS: Correctly d...
38
  extern struct key_type key_type_dead;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
  extern struct key_type key_type_user;
  
  /*****************************************************************************/
  /*
973c9f4f4   David Howells   KEYS: Fix up comm...
43
44
45
46
47
48
   * Keep track of keys for a user.
   *
   * This needs to be separate to user_struct to avoid a refcount-loop
   * (user_struct pins some keyrings which pin this struct).
   *
   * We also keep track of keys under request from userspace for this UID here.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
   */
  struct key_user {
  	struct rb_node		node;
76181c134   David Howells   KEYS: Make reques...
52
  	struct mutex		cons_lock;	/* construction initiation lock */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
55
56
57
  	spinlock_t		lock;
  	atomic_t		usage;		/* for accessing qnkeys & qnbytes */
  	atomic_t		nkeys;		/* number of keys */
  	atomic_t		nikeys;		/* number of instantiated keys */
  	uid_t			uid;
1d1e97562   Serge E. Hallyn   keys: distinguish...
58
  	struct user_namespace	*user_ns;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
  	int			qnkeys;		/* number of keys allocated to this user */
  	int			qnbytes;	/* number of bytes allocated to this user */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
64
  extern struct rb_root	key_user_tree;
  extern spinlock_t	key_user_lock;
  extern struct key_user	root_key_user;
1d1e97562   Serge E. Hallyn   keys: distinguish...
65
66
  extern struct key_user *key_user_lookup(uid_t uid,
  					struct user_namespace *user_ns);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  extern void key_user_put(struct key_user *user);
0b77f5bfb   David Howells   keys: make the ke...
68
  /*
973c9f4f4   David Howells   KEYS: Fix up comm...
69
   * Key quota limits.
0b77f5bfb   David Howells   keys: make the ke...
70
71
72
73
74
75
76
77
   * - root has its own separate limits to everyone else
   */
  extern unsigned key_quota_root_maxkeys;
  extern unsigned key_quota_root_maxbytes;
  extern unsigned key_quota_maxkeys;
  extern unsigned key_quota_maxbytes;
  
  #define KEYQUOTA_LINK_BYTES	4		/* a link in a keyring is worth 4 bytes */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78

8bc16deab   David Howells   KEYS: Move the un...
79
  extern struct kmem_cache *key_jar;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
  extern struct rb_root key_serial_tree;
  extern spinlock_t key_serial_lock;
76181c134   David Howells   KEYS: Make reques...
82
  extern struct mutex key_construction_mutex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  extern wait_queue_head_t request_key_conswq;
e9e349b05   David Howells   KEYS: Disperse li...
84
85
  extern struct key_type *key_type_lookup(const char *type);
  extern void key_type_put(struct key_type *ktype);
f70e2e061   David Howells   KEYS: Do prealloc...
86
87
88
  extern int __key_link_begin(struct key *keyring,
  			    const struct key_type *type,
  			    const char *description,
ceb73c120   David Howells   KEYS: Fix __key_l...
89
  			    unsigned long *_prealloc);
f70e2e061   David Howells   KEYS: Do prealloc...
90
91
  extern int __key_link_check_live_key(struct key *keyring, struct key *key);
  extern void __key_link(struct key *keyring, struct key *key,
ceb73c120   David Howells   KEYS: Fix __key_l...
92
  		       unsigned long *_prealloc);
f70e2e061   David Howells   KEYS: Do prealloc...
93
94
  extern void __key_link_end(struct key *keyring,
  			   struct key_type *type,
ceb73c120   David Howells   KEYS: Fix __key_l...
95
  			   unsigned long prealloc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96

664cceb00   David Howells   [PATCH] Keys: Add...
97
98
99
100
  extern key_ref_t __keyring_search_one(key_ref_t keyring_ref,
  				      const struct key_type *type,
  				      const char *description,
  				      key_perm_t perm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101

3e30148c3   David Howells   [PATCH] Keys: Mak...
102
103
  extern struct key *keyring_search_instkey(struct key *keyring,
  					  key_serial_t target_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
  typedef int (*key_match_func_t)(const struct key *, const void *);
664cceb00   David Howells   [PATCH] Keys: Add...
105
  extern key_ref_t keyring_search_aux(key_ref_t keyring_ref,
d84f4f992   David Howells   CRED: Inaugurate ...
106
  				    const struct cred *cred,
664cceb00   David Howells   [PATCH] Keys: Add...
107
108
  				    struct key_type *type,
  				    const void *description,
78b7280cc   David Howells   KEYS: Improve /pr...
109
110
  				    key_match_func_t match,
  				    bool no_state_check);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111

927942aab   David Howells   KEYS: Make /proc/...
112
113
114
  extern key_ref_t search_my_process_keyrings(struct key_type *type,
  					    const void *description,
  					    key_match_func_t match,
78b7280cc   David Howells   KEYS: Improve /pr...
115
  					    bool no_state_check,
927942aab   David Howells   KEYS: Make /proc/...
116
  					    const struct cred *cred);
664cceb00   David Howells   [PATCH] Keys: Add...
117
118
119
  extern key_ref_t search_process_keyrings(struct key_type *type,
  					 const void *description,
  					 key_match_func_t match,
d84f4f992   David Howells   CRED: Inaugurate ...
120
  					 const struct cred *cred);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121

69664cf16   David Howells   keys: don't gener...
122
  extern struct key *find_keyring_by_name(const char *name, bool skip_perm_check);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123

8bbf4976b   David Howells   KEYS: Alter use o...
124
  extern int install_user_keyrings(void);
d84f4f992   David Howells   CRED: Inaugurate ...
125
126
  extern int install_thread_keyring_to_cred(struct cred *);
  extern int install_process_keyring_to_cred(struct cred *);
685bfd2c4   Oleg Nesterov   umh: creds: conve...
127
  extern int install_session_keyring_to_cred(struct cred *, struct key *);
3e30148c3   David Howells   [PATCH] Keys: Mak...
128
129
130
  
  extern struct key *request_key_and_link(struct key_type *type,
  					const char *description,
4a38e122e   David Howells   keys: allow the c...
131
132
  					const void *callout_info,
  					size_t callout_len,
4e54f0854   David Howells   [PATCH] Keys: All...
133
  					void *aux,
7e047ef5f   David Howells   [PATCH] keys: sor...
134
135
  					struct key *dest_keyring,
  					unsigned long flags);
3e30148c3   David Howells   [PATCH] Keys: Mak...
136

927942aab   David Howells   KEYS: Make /proc/...
137
  extern int lookup_user_key_possessed(const struct key *key, const void *target);
5593122ee   David Howells   KEYS: Deal with d...
138
  extern key_ref_t lookup_user_key(key_serial_t id, unsigned long flags,
e9e349b05   David Howells   KEYS: Disperse li...
139
  				 key_perm_t perm);
5593122ee   David Howells   KEYS: Deal with d...
140
141
142
  #define KEY_LOOKUP_CREATE	0x01
  #define KEY_LOOKUP_PARTIAL	0x02
  #define KEY_LOOKUP_FOR_UNLINK	0x04
e9e349b05   David Howells   KEYS: Disperse li...
143
144
  
  extern long join_session_keyring(const char *name);
0c061b570   David Howells   KEYS: Correctly d...
145
  extern struct work_struct key_gc_work;
5d135440f   David Howells   KEYS: Add garbage...
146
147
148
  extern unsigned key_gc_delay;
  extern void keyring_gc(struct key *keyring, time_t limit);
  extern void key_schedule_gc(time_t expiry_at);
0c061b570   David Howells   KEYS: Correctly d...
149
  extern void key_gc_keytype(struct key_type *ktype);
5d135440f   David Howells   KEYS: Add garbage...
150

e9e349b05   David Howells   KEYS: Disperse li...
151
  extern int key_task_permission(const key_ref_t key_ref,
d84f4f992   David Howells   CRED: Inaugurate ...
152
  			       const struct cred *cred,
e9e349b05   David Howells   KEYS: Disperse li...
153
  			       key_perm_t perm);
973c9f4f4   David Howells   KEYS: Fix up comm...
154
155
156
  /*
   * Check to see whether permission is granted to use a key in the desired way.
   */
e9e349b05   David Howells   KEYS: Disperse li...
157
158
  static inline int key_permission(const key_ref_t key_ref, key_perm_t perm)
  {
d84f4f992   David Howells   CRED: Inaugurate ...
159
  	return key_task_permission(key_ref, current_cred(), perm);
e9e349b05   David Howells   KEYS: Disperse li...
160
161
162
163
164
165
166
167
168
169
  }
  
  /* required permissions */
  #define	KEY_VIEW	0x01	/* require permission to view attributes */
  #define	KEY_READ	0x02	/* require permission to read content */
  #define	KEY_WRITE	0x04	/* require permission to update / modify */
  #define	KEY_SEARCH	0x08	/* require permission to search (keyring) or find (key) */
  #define	KEY_LINK	0x10	/* require permission to link */
  #define	KEY_SETATTR	0x20	/* require permission to change attributes */
  #define	KEY_ALL		0x3f	/* all the above permissions */
3e30148c3   David Howells   [PATCH] Keys: Mak...
170
  /*
973c9f4f4   David Howells   KEYS: Fix up comm...
171
   * Authorisation record for request_key().
3e30148c3   David Howells   [PATCH] Keys: Mak...
172
173
174
   */
  struct request_key_auth {
  	struct key		*target_key;
8bbf4976b   David Howells   KEYS: Alter use o...
175
  	struct key		*dest_keyring;
d84f4f992   David Howells   CRED: Inaugurate ...
176
  	const struct cred	*cred;
4a38e122e   David Howells   keys: allow the c...
177
178
  	void			*callout_info;
  	size_t			callout_len;
3e30148c3   David Howells   [PATCH] Keys: Mak...
179
180
181
182
183
  	pid_t			pid;
  };
  
  extern struct key_type key_type_request_key_auth;
  extern struct key *request_key_auth_new(struct key *target,
4a38e122e   David Howells   keys: allow the c...
184
  					const void *callout_info,
8bbf4976b   David Howells   KEYS: Alter use o...
185
186
  					size_t callout_len,
  					struct key *dest_keyring);
3e30148c3   David Howells   [PATCH] Keys: Mak...
187
188
  
  extern struct key *key_get_instantiation_authkey(key_serial_t target_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
  
  /*
973c9f4f4   David Howells   KEYS: Fix up comm...
191
   * keyctl() functions
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
   */
  extern long keyctl_get_keyring_ID(key_serial_t, int);
  extern long keyctl_join_session_keyring(const char __user *);
  extern long keyctl_update_key(key_serial_t, const void __user *, size_t);
  extern long keyctl_revoke_key(key_serial_t);
  extern long keyctl_keyring_clear(key_serial_t);
  extern long keyctl_keyring_link(key_serial_t, key_serial_t);
  extern long keyctl_keyring_unlink(key_serial_t, key_serial_t);
  extern long keyctl_describe_key(key_serial_t, char __user *, size_t);
  extern long keyctl_keyring_search(key_serial_t, const char __user *,
  				  const char __user *, key_serial_t);
  extern long keyctl_read_key(key_serial_t, char __user *, size_t);
  extern long keyctl_chown_key(key_serial_t, uid_t, gid_t);
  extern long keyctl_setperm_key(key_serial_t, key_perm_t);
  extern long keyctl_instantiate_key(key_serial_t, const void __user *,
  				   size_t, key_serial_t);
  extern long keyctl_negate_key(key_serial_t, unsigned, key_serial_t);
3e30148c3   David Howells   [PATCH] Keys: Mak...
209
  extern long keyctl_set_reqkey_keyring(int);
017679c4d   David Howells   [PATCH] keys: Per...
210
  extern long keyctl_set_timeout(key_serial_t, unsigned);
b5f545c88   David Howells   [PATCH] keys: Per...
211
  extern long keyctl_assume_authority(key_serial_t);
70a5bb72b   David Howells   keys: add keyctl ...
212
213
  extern long keyctl_get_security(key_serial_t keyid, char __user *buffer,
  				size_t buflen);
ee18d64c1   David Howells   KEYS: Add a keyct...
214
  extern long keyctl_session_to_parent(void);
fdd1b9458   David Howells   KEYS: Add a new k...
215
  extern long keyctl_reject_key(key_serial_t, unsigned, unsigned, key_serial_t);
ee009e4a0   David Howells   KEYS: Add an iove...
216
217
218
219
220
221
222
  extern long keyctl_instantiate_key_iov(key_serial_t,
  				       const struct iovec __user *,
  				       unsigned, key_serial_t);
  
  extern long keyctl_instantiate_key_common(key_serial_t,
  					  const struct iovec __user *,
  					  unsigned, size_t, key_serial_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
224
  
  /*
973c9f4f4   David Howells   KEYS: Fix up comm...
225
   * Debugging key validation
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
   */
  #ifdef KEY_DEBUGGING
  extern void __key_check(const struct key *);
  
  static inline void key_check(const struct key *key)
  {
  	if (key && (IS_ERR(key) || key->magic != KEY_DEBUG_MAGIC))
  		__key_check(key);
  }
  
  #else
  
  #define key_check(key) do {} while(0)
  
  #endif
  
  #endif /* _INTERNAL_H */