xref: /linux/security/keys/keyctl.c (revision 4f1933620f57145212cdbb1ac6ce099eeeb21c5a)
1 /* keyctl.c: userspace keyctl operations
2  *
3  * Copyright (C) 2004-5 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 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/sched.h>
15 #include <linux/slab.h>
16 #include <linux/syscalls.h>
17 #include <linux/keyctl.h>
18 #include <linux/fs.h>
19 #include <linux/capability.h>
20 #include <linux/err.h>
21 #include <asm/uaccess.h>
22 #include "internal.h"
23 
24 /*****************************************************************************/
25 /*
26  * extract the description of a new key from userspace and either add it as a
27  * new key to the specified keyring or update a matching key in that keyring
28  * - the keyring must be writable
29  * - returns the new key's serial number
30  * - implements add_key()
31  */
32 asmlinkage long sys_add_key(const char __user *_type,
33 			    const char __user *_description,
34 			    const void __user *_payload,
35 			    size_t plen,
36 			    key_serial_t ringid)
37 {
38 	key_ref_t keyring_ref, key_ref;
39 	char type[32], *description;
40 	void *payload;
41 	long dlen, ret;
42 
43 	ret = -EINVAL;
44 	if (plen > 32767)
45 		goto error;
46 
47 	/* draw all the data into kernel space */
48 	ret = strncpy_from_user(type, _type, sizeof(type) - 1);
49 	if (ret < 0)
50 		goto error;
51 	type[31] = '\0';
52 
53 	ret = -EPERM;
54 	if (type[0] == '.')
55 		goto error;
56 
57 	ret = -EFAULT;
58 	dlen = strnlen_user(_description, PAGE_SIZE - 1);
59 	if (dlen <= 0)
60 		goto error;
61 
62 	ret = -EINVAL;
63 	if (dlen > PAGE_SIZE - 1)
64 		goto error;
65 
66 	ret = -ENOMEM;
67 	description = kmalloc(dlen + 1, GFP_KERNEL);
68 	if (!description)
69 		goto error;
70 	description[dlen] = '\0';
71 
72 	ret = -EFAULT;
73 	if (copy_from_user(description, _description, dlen) != 0)
74 		goto error2;
75 
76 	/* pull the payload in if one was supplied */
77 	payload = NULL;
78 
79 	if (_payload) {
80 		ret = -ENOMEM;
81 		payload = kmalloc(plen, GFP_KERNEL);
82 		if (!payload)
83 			goto error2;
84 
85 		ret = -EFAULT;
86 		if (copy_from_user(payload, _payload, plen) != 0)
87 			goto error3;
88 	}
89 
90 	/* find the target keyring (which must be writable) */
91 	keyring_ref = lookup_user_key(NULL, ringid, 1, 0, KEY_WRITE);
92 	if (IS_ERR(keyring_ref)) {
93 		ret = PTR_ERR(keyring_ref);
94 		goto error3;
95 	}
96 
97 	/* create or update the requested key and add it to the target
98 	 * keyring */
99 	key_ref = key_create_or_update(keyring_ref, type, description,
100 				       payload, plen, 0);
101 	if (!IS_ERR(key_ref)) {
102 		ret = key_ref_to_ptr(key_ref)->serial;
103 		key_ref_put(key_ref);
104 	}
105 	else {
106 		ret = PTR_ERR(key_ref);
107 	}
108 
109 	key_ref_put(keyring_ref);
110  error3:
111 	kfree(payload);
112  error2:
113 	kfree(description);
114  error:
115 	return ret;
116 
117 } /* end sys_add_key() */
118 
119 /*****************************************************************************/
120 /*
121  * search the process keyrings for a matching key
122  * - nested keyrings may also be searched if they have Search permission
123  * - if a key is found, it will be attached to the destination keyring if
124  *   there's one specified
125  * - /sbin/request-key will be invoked if _callout_info is non-NULL
126  *   - the _callout_info string will be passed to /sbin/request-key
127  *   - if the _callout_info string is empty, it will be rendered as "-"
128  * - implements request_key()
129  */
130 asmlinkage long sys_request_key(const char __user *_type,
131 				const char __user *_description,
132 				const char __user *_callout_info,
133 				key_serial_t destringid)
134 {
135 	struct key_type *ktype;
136 	struct key *key;
137 	key_ref_t dest_ref;
138 	char type[32], *description, *callout_info;
139 	long dlen, ret;
140 
141 	/* pull the type into kernel space */
142 	ret = strncpy_from_user(type, _type, sizeof(type) - 1);
143 	if (ret < 0)
144 		goto error;
145 	type[31] = '\0';
146 
147 	ret = -EPERM;
148 	if (type[0] == '.')
149 		goto error;
150 
151 	/* pull the description into kernel space */
152 	ret = -EFAULT;
153 	dlen = strnlen_user(_description, PAGE_SIZE - 1);
154 	if (dlen <= 0)
155 		goto error;
156 
157 	ret = -EINVAL;
158 	if (dlen > PAGE_SIZE - 1)
159 		goto error;
160 
161 	ret = -ENOMEM;
162 	description = kmalloc(dlen + 1, GFP_KERNEL);
163 	if (!description)
164 		goto error;
165 	description[dlen] = '\0';
166 
167 	ret = -EFAULT;
168 	if (copy_from_user(description, _description, dlen) != 0)
169 		goto error2;
170 
171 	/* pull the callout info into kernel space */
172 	callout_info = NULL;
173 	if (_callout_info) {
174 		ret = -EFAULT;
175 		dlen = strnlen_user(_callout_info, PAGE_SIZE - 1);
176 		if (dlen <= 0)
177 			goto error2;
178 
179 		ret = -EINVAL;
180 		if (dlen > PAGE_SIZE - 1)
181 			goto error2;
182 
183 		ret = -ENOMEM;
184 		callout_info = kmalloc(dlen + 1, GFP_KERNEL);
185 		if (!callout_info)
186 			goto error2;
187 		callout_info[dlen] = '\0';
188 
189 		ret = -EFAULT;
190 		if (copy_from_user(callout_info, _callout_info, dlen) != 0)
191 			goto error3;
192 	}
193 
194 	/* get the destination keyring if specified */
195 	dest_ref = NULL;
196 	if (destringid) {
197 		dest_ref = lookup_user_key(NULL, destringid, 1, 0, KEY_WRITE);
198 		if (IS_ERR(dest_ref)) {
199 			ret = PTR_ERR(dest_ref);
200 			goto error3;
201 		}
202 	}
203 
204 	/* find the key type */
205 	ktype = key_type_lookup(type);
206 	if (IS_ERR(ktype)) {
207 		ret = PTR_ERR(ktype);
208 		goto error4;
209 	}
210 
211 	/* do the search */
212 	key = request_key_and_link(ktype, description, callout_info,
213 				   key_ref_to_ptr(dest_ref));
214 	if (IS_ERR(key)) {
215 		ret = PTR_ERR(key);
216 		goto error5;
217 	}
218 
219 	ret = key->serial;
220 
221  	key_put(key);
222  error5:
223 	key_type_put(ktype);
224  error4:
225 	key_ref_put(dest_ref);
226  error3:
227 	kfree(callout_info);
228  error2:
229 	kfree(description);
230  error:
231 	return ret;
232 
233 } /* end sys_request_key() */
234 
235 /*****************************************************************************/
236 /*
237  * get the ID of the specified process keyring
238  * - the keyring must have search permission to be found
239  * - implements keyctl(KEYCTL_GET_KEYRING_ID)
240  */
241 long keyctl_get_keyring_ID(key_serial_t id, int create)
242 {
243 	key_ref_t key_ref;
244 	long ret;
245 
246 	key_ref = lookup_user_key(NULL, id, create, 0, KEY_SEARCH);
247 	if (IS_ERR(key_ref)) {
248 		ret = PTR_ERR(key_ref);
249 		goto error;
250 	}
251 
252 	ret = key_ref_to_ptr(key_ref)->serial;
253 	key_ref_put(key_ref);
254  error:
255 	return ret;
256 
257 } /* end keyctl_get_keyring_ID() */
258 
259 /*****************************************************************************/
260 /*
261  * join the session keyring
262  * - implements keyctl(KEYCTL_JOIN_SESSION_KEYRING)
263  */
264 long keyctl_join_session_keyring(const char __user *_name)
265 {
266 	char *name;
267 	long nlen, ret;
268 
269 	/* fetch the name from userspace */
270 	name = NULL;
271 	if (_name) {
272 		ret = -EFAULT;
273 		nlen = strnlen_user(_name, PAGE_SIZE - 1);
274 		if (nlen <= 0)
275 			goto error;
276 
277 		ret = -EINVAL;
278 		if (nlen > PAGE_SIZE - 1)
279 			goto error;
280 
281 		ret = -ENOMEM;
282 		name = kmalloc(nlen + 1, GFP_KERNEL);
283 		if (!name)
284 			goto error;
285 		name[nlen] = '\0';
286 
287 		ret = -EFAULT;
288 		if (copy_from_user(name, _name, nlen) != 0)
289 			goto error2;
290 	}
291 
292 	/* join the session */
293 	ret = join_session_keyring(name);
294 
295  error2:
296 	kfree(name);
297  error:
298 	return ret;
299 
300 } /* end keyctl_join_session_keyring() */
301 
302 /*****************************************************************************/
303 /*
304  * update a key's data payload
305  * - the key must be writable
306  * - implements keyctl(KEYCTL_UPDATE)
307  */
308 long keyctl_update_key(key_serial_t id,
309 		       const void __user *_payload,
310 		       size_t plen)
311 {
312 	key_ref_t key_ref;
313 	void *payload;
314 	long ret;
315 
316 	ret = -EINVAL;
317 	if (plen > PAGE_SIZE)
318 		goto error;
319 
320 	/* pull the payload in if one was supplied */
321 	payload = NULL;
322 	if (_payload) {
323 		ret = -ENOMEM;
324 		payload = kmalloc(plen, GFP_KERNEL);
325 		if (!payload)
326 			goto error;
327 
328 		ret = -EFAULT;
329 		if (copy_from_user(payload, _payload, plen) != 0)
330 			goto error2;
331 	}
332 
333 	/* find the target key (which must be writable) */
334 	key_ref = lookup_user_key(NULL, id, 0, 0, KEY_WRITE);
335 	if (IS_ERR(key_ref)) {
336 		ret = PTR_ERR(key_ref);
337 		goto error2;
338 	}
339 
340 	/* update the key */
341 	ret = key_update(key_ref, payload, plen);
342 
343 	key_ref_put(key_ref);
344  error2:
345 	kfree(payload);
346  error:
347 	return ret;
348 
349 } /* end keyctl_update_key() */
350 
351 /*****************************************************************************/
352 /*
353  * revoke a key
354  * - the key must be writable
355  * - implements keyctl(KEYCTL_REVOKE)
356  */
357 long keyctl_revoke_key(key_serial_t id)
358 {
359 	key_ref_t key_ref;
360 	long ret;
361 
362 	key_ref = lookup_user_key(NULL, id, 0, 0, KEY_WRITE);
363 	if (IS_ERR(key_ref)) {
364 		ret = PTR_ERR(key_ref);
365 		goto error;
366 	}
367 
368 	key_revoke(key_ref_to_ptr(key_ref));
369 	ret = 0;
370 
371 	key_ref_put(key_ref);
372  error:
373 	return ret;
374 
375 } /* end keyctl_revoke_key() */
376 
377 /*****************************************************************************/
378 /*
379  * clear the specified process keyring
380  * - the keyring must be writable
381  * - implements keyctl(KEYCTL_CLEAR)
382  */
383 long keyctl_keyring_clear(key_serial_t ringid)
384 {
385 	key_ref_t keyring_ref;
386 	long ret;
387 
388 	keyring_ref = lookup_user_key(NULL, ringid, 1, 0, KEY_WRITE);
389 	if (IS_ERR(keyring_ref)) {
390 		ret = PTR_ERR(keyring_ref);
391 		goto error;
392 	}
393 
394 	ret = keyring_clear(key_ref_to_ptr(keyring_ref));
395 
396 	key_ref_put(keyring_ref);
397  error:
398 	return ret;
399 
400 } /* end keyctl_keyring_clear() */
401 
402 /*****************************************************************************/
403 /*
404  * link a key into a keyring
405  * - the keyring must be writable
406  * - the key must be linkable
407  * - implements keyctl(KEYCTL_LINK)
408  */
409 long keyctl_keyring_link(key_serial_t id, key_serial_t ringid)
410 {
411 	key_ref_t keyring_ref, key_ref;
412 	long ret;
413 
414 	keyring_ref = lookup_user_key(NULL, ringid, 1, 0, KEY_WRITE);
415 	if (IS_ERR(keyring_ref)) {
416 		ret = PTR_ERR(keyring_ref);
417 		goto error;
418 	}
419 
420 	key_ref = lookup_user_key(NULL, id, 1, 0, KEY_LINK);
421 	if (IS_ERR(key_ref)) {
422 		ret = PTR_ERR(key_ref);
423 		goto error2;
424 	}
425 
426 	ret = key_link(key_ref_to_ptr(keyring_ref), key_ref_to_ptr(key_ref));
427 
428 	key_ref_put(key_ref);
429  error2:
430 	key_ref_put(keyring_ref);
431  error:
432 	return ret;
433 
434 } /* end keyctl_keyring_link() */
435 
436 /*****************************************************************************/
437 /*
438  * unlink the first attachment of a key from a keyring
439  * - the keyring must be writable
440  * - we don't need any permissions on the key
441  * - implements keyctl(KEYCTL_UNLINK)
442  */
443 long keyctl_keyring_unlink(key_serial_t id, key_serial_t ringid)
444 {
445 	key_ref_t keyring_ref, key_ref;
446 	long ret;
447 
448 	keyring_ref = lookup_user_key(NULL, ringid, 0, 0, KEY_WRITE);
449 	if (IS_ERR(keyring_ref)) {
450 		ret = PTR_ERR(keyring_ref);
451 		goto error;
452 	}
453 
454 	key_ref = lookup_user_key(NULL, id, 0, 0, 0);
455 	if (IS_ERR(key_ref)) {
456 		ret = PTR_ERR(key_ref);
457 		goto error2;
458 	}
459 
460 	ret = key_unlink(key_ref_to_ptr(keyring_ref), key_ref_to_ptr(key_ref));
461 
462 	key_ref_put(key_ref);
463  error2:
464 	key_ref_put(keyring_ref);
465  error:
466 	return ret;
467 
468 } /* end keyctl_keyring_unlink() */
469 
470 /*****************************************************************************/
471 /*
472  * describe a user key
473  * - the key must have view permission
474  * - if there's a buffer, we place up to buflen bytes of data into it
475  * - unless there's an error, we return the amount of description available,
476  *   irrespective of how much we may have copied
477  * - the description is formatted thus:
478  *	type;uid;gid;perm;description<NUL>
479  * - implements keyctl(KEYCTL_DESCRIBE)
480  */
481 long keyctl_describe_key(key_serial_t keyid,
482 			 char __user *buffer,
483 			 size_t buflen)
484 {
485 	struct key *key, *instkey;
486 	key_ref_t key_ref;
487 	char *tmpbuf;
488 	long ret;
489 
490 	key_ref = lookup_user_key(NULL, keyid, 0, 1, KEY_VIEW);
491 	if (IS_ERR(key_ref)) {
492 		/* viewing a key under construction is permitted if we have the
493 		 * authorisation token handy */
494 		if (PTR_ERR(key_ref) == -EACCES) {
495 			instkey = key_get_instantiation_authkey(keyid);
496 			if (!IS_ERR(instkey)) {
497 				key_put(instkey);
498 				key_ref = lookup_user_key(NULL, keyid,
499 							  0, 1, 0);
500 				if (!IS_ERR(key_ref))
501 					goto okay;
502 			}
503 		}
504 
505 		ret = PTR_ERR(key_ref);
506 		goto error;
507 	}
508 
509 okay:
510 	/* calculate how much description we're going to return */
511 	ret = -ENOMEM;
512 	tmpbuf = kmalloc(PAGE_SIZE, GFP_KERNEL);
513 	if (!tmpbuf)
514 		goto error2;
515 
516 	key = key_ref_to_ptr(key_ref);
517 
518 	ret = snprintf(tmpbuf, PAGE_SIZE - 1,
519 		       "%s;%d;%d;%08x;%s",
520 		       key_ref_to_ptr(key_ref)->type->name,
521 		       key_ref_to_ptr(key_ref)->uid,
522 		       key_ref_to_ptr(key_ref)->gid,
523 		       key_ref_to_ptr(key_ref)->perm,
524 		       key_ref_to_ptr(key_ref)->description ?
525 		       key_ref_to_ptr(key_ref)->description : ""
526 		       );
527 
528 	/* include a NUL char at the end of the data */
529 	if (ret > PAGE_SIZE - 1)
530 		ret = PAGE_SIZE - 1;
531 	tmpbuf[ret] = 0;
532 	ret++;
533 
534 	/* consider returning the data */
535 	if (buffer && buflen > 0) {
536 		if (buflen > ret)
537 			buflen = ret;
538 
539 		if (copy_to_user(buffer, tmpbuf, buflen) != 0)
540 			ret = -EFAULT;
541 	}
542 
543 	kfree(tmpbuf);
544  error2:
545 	key_ref_put(key_ref);
546  error:
547 	return ret;
548 
549 } /* end keyctl_describe_key() */
550 
551 /*****************************************************************************/
552 /*
553  * search the specified keyring for a matching key
554  * - the start keyring must be searchable
555  * - nested keyrings may also be searched if they are searchable
556  * - only keys with search permission may be found
557  * - if a key is found, it will be attached to the destination keyring if
558  *   there's one specified
559  * - implements keyctl(KEYCTL_SEARCH)
560  */
561 long keyctl_keyring_search(key_serial_t ringid,
562 			   const char __user *_type,
563 			   const char __user *_description,
564 			   key_serial_t destringid)
565 {
566 	struct key_type *ktype;
567 	key_ref_t keyring_ref, key_ref, dest_ref;
568 	char type[32], *description;
569 	long dlen, ret;
570 
571 	/* pull the type and description into kernel space */
572 	ret = strncpy_from_user(type, _type, sizeof(type) - 1);
573 	if (ret < 0)
574 		goto error;
575 	type[31] = '\0';
576 
577 	ret = -EFAULT;
578 	dlen = strnlen_user(_description, PAGE_SIZE - 1);
579 	if (dlen <= 0)
580 		goto error;
581 
582 	ret = -EINVAL;
583 	if (dlen > PAGE_SIZE - 1)
584 		goto error;
585 
586 	ret = -ENOMEM;
587 	description = kmalloc(dlen + 1, GFP_KERNEL);
588 	if (!description)
589 		goto error;
590 	description[dlen] = '\0';
591 
592 	ret = -EFAULT;
593 	if (copy_from_user(description, _description, dlen) != 0)
594 		goto error2;
595 
596 	/* get the keyring at which to begin the search */
597 	keyring_ref = lookup_user_key(NULL, ringid, 0, 0, KEY_SEARCH);
598 	if (IS_ERR(keyring_ref)) {
599 		ret = PTR_ERR(keyring_ref);
600 		goto error2;
601 	}
602 
603 	/* get the destination keyring if specified */
604 	dest_ref = NULL;
605 	if (destringid) {
606 		dest_ref = lookup_user_key(NULL, destringid, 1, 0, KEY_WRITE);
607 		if (IS_ERR(dest_ref)) {
608 			ret = PTR_ERR(dest_ref);
609 			goto error3;
610 		}
611 	}
612 
613 	/* find the key type */
614 	ktype = key_type_lookup(type);
615 	if (IS_ERR(ktype)) {
616 		ret = PTR_ERR(ktype);
617 		goto error4;
618 	}
619 
620 	/* do the search */
621 	key_ref = keyring_search(keyring_ref, ktype, description);
622 	if (IS_ERR(key_ref)) {
623 		ret = PTR_ERR(key_ref);
624 
625 		/* treat lack or presence of a negative key the same */
626 		if (ret == -EAGAIN)
627 			ret = -ENOKEY;
628 		goto error5;
629 	}
630 
631 	/* link the resulting key to the destination keyring if we can */
632 	if (dest_ref) {
633 		ret = key_permission(key_ref, KEY_LINK);
634 		if (ret < 0)
635 			goto error6;
636 
637 		ret = key_link(key_ref_to_ptr(dest_ref), key_ref_to_ptr(key_ref));
638 		if (ret < 0)
639 			goto error6;
640 	}
641 
642 	ret = key_ref_to_ptr(key_ref)->serial;
643 
644  error6:
645 	key_ref_put(key_ref);
646  error5:
647 	key_type_put(ktype);
648  error4:
649 	key_ref_put(dest_ref);
650  error3:
651 	key_ref_put(keyring_ref);
652  error2:
653 	kfree(description);
654  error:
655 	return ret;
656 
657 } /* end keyctl_keyring_search() */
658 
659 /*****************************************************************************/
660 /*
661  * read a user key's payload
662  * - the keyring must be readable or the key must be searchable from the
663  *   process's keyrings
664  * - if there's a buffer, we place up to buflen bytes of data into it
665  * - unless there's an error, we return the amount of data in the key,
666  *   irrespective of how much we may have copied
667  * - implements keyctl(KEYCTL_READ)
668  */
669 long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen)
670 {
671 	struct key *key;
672 	key_ref_t key_ref;
673 	long ret;
674 
675 	/* find the key first */
676 	key_ref = lookup_user_key(NULL, keyid, 0, 0, 0);
677 	if (IS_ERR(key_ref)) {
678 		ret = -ENOKEY;
679 		goto error;
680 	}
681 
682 	key = key_ref_to_ptr(key_ref);
683 
684 	/* see if we can read it directly */
685 	ret = key_permission(key_ref, KEY_READ);
686 	if (ret == 0)
687 		goto can_read_key;
688 	if (ret != -EACCES)
689 		goto error;
690 
691 	/* we can't; see if it's searchable from this process's keyrings
692 	 * - we automatically take account of the fact that it may be
693 	 *   dangling off an instantiation key
694 	 */
695 	if (!is_key_possessed(key_ref)) {
696 		ret = -EACCES;
697 		goto error2;
698 	}
699 
700 	/* the key is probably readable - now try to read it */
701  can_read_key:
702 	ret = key_validate(key);
703 	if (ret == 0) {
704 		ret = -EOPNOTSUPP;
705 		if (key->type->read) {
706 			/* read the data with the semaphore held (since we
707 			 * might sleep) */
708 			down_read(&key->sem);
709 			ret = key->type->read(key, buffer, buflen);
710 			up_read(&key->sem);
711 		}
712 	}
713 
714  error2:
715 	key_put(key);
716  error:
717 	return ret;
718 
719 } /* end keyctl_read_key() */
720 
721 /*****************************************************************************/
722 /*
723  * change the ownership of a key
724  * - the keyring owned by the changer
725  * - if the uid or gid is -1, then that parameter is not changed
726  * - implements keyctl(KEYCTL_CHOWN)
727  */
728 long keyctl_chown_key(key_serial_t id, uid_t uid, gid_t gid)
729 {
730 	struct key *key;
731 	key_ref_t key_ref;
732 	long ret;
733 
734 	ret = 0;
735 	if (uid == (uid_t) -1 && gid == (gid_t) -1)
736 		goto error;
737 
738 	key_ref = lookup_user_key(NULL, id, 1, 1, KEY_SETATTR);
739 	if (IS_ERR(key_ref)) {
740 		ret = PTR_ERR(key_ref);
741 		goto error;
742 	}
743 
744 	key = key_ref_to_ptr(key_ref);
745 
746 	/* make the changes with the locks held to prevent chown/chown races */
747 	ret = -EACCES;
748 	down_write(&key->sem);
749 
750 	if (!capable(CAP_SYS_ADMIN)) {
751 		/* only the sysadmin can chown a key to some other UID */
752 		if (uid != (uid_t) -1 && key->uid != uid)
753 			goto no_access;
754 
755 		/* only the sysadmin can set the key's GID to a group other
756 		 * than one of those that the current process subscribes to */
757 		if (gid != (gid_t) -1 && gid != key->gid && !in_group_p(gid))
758 			goto no_access;
759 	}
760 
761 	/* change the UID (have to update the quotas) */
762 	if (uid != (uid_t) -1 && uid != key->uid) {
763 		/* don't support UID changing yet */
764 		ret = -EOPNOTSUPP;
765 		goto no_access;
766 	}
767 
768 	/* change the GID */
769 	if (gid != (gid_t) -1)
770 		key->gid = gid;
771 
772 	ret = 0;
773 
774  no_access:
775 	up_write(&key->sem);
776 	key_put(key);
777  error:
778 	return ret;
779 
780 } /* end keyctl_chown_key() */
781 
782 /*****************************************************************************/
783 /*
784  * change the permission mask on a key
785  * - the keyring owned by the changer
786  * - implements keyctl(KEYCTL_SETPERM)
787  */
788 long keyctl_setperm_key(key_serial_t id, key_perm_t perm)
789 {
790 	struct key *key;
791 	key_ref_t key_ref;
792 	long ret;
793 
794 	ret = -EINVAL;
795 	if (perm & ~(KEY_POS_ALL | KEY_USR_ALL | KEY_GRP_ALL | KEY_OTH_ALL))
796 		goto error;
797 
798 	key_ref = lookup_user_key(NULL, id, 1, 1, KEY_SETATTR);
799 	if (IS_ERR(key_ref)) {
800 		ret = PTR_ERR(key_ref);
801 		goto error;
802 	}
803 
804 	key = key_ref_to_ptr(key_ref);
805 
806 	/* make the changes with the locks held to prevent chown/chmod races */
807 	ret = -EACCES;
808 	down_write(&key->sem);
809 
810 	/* if we're not the sysadmin, we can only change a key that we own */
811 	if (capable(CAP_SYS_ADMIN) || key->uid == current->fsuid) {
812 		key->perm = perm;
813 		ret = 0;
814 	}
815 
816 	up_write(&key->sem);
817 	key_put(key);
818 error:
819 	return ret;
820 
821 } /* end keyctl_setperm_key() */
822 
823 /*****************************************************************************/
824 /*
825  * instantiate the key with the specified payload, and, if one is given, link
826  * the key into the keyring
827  */
828 long keyctl_instantiate_key(key_serial_t id,
829 			    const void __user *_payload,
830 			    size_t plen,
831 			    key_serial_t ringid)
832 {
833 	struct request_key_auth *rka;
834 	struct key *instkey;
835 	key_ref_t keyring_ref;
836 	void *payload;
837 	long ret;
838 
839 	ret = -EINVAL;
840 	if (plen > 32767)
841 		goto error;
842 
843 	/* the appropriate instantiation authorisation key must have been
844 	 * assumed before calling this */
845 	ret = -EPERM;
846 	instkey = current->request_key_auth;
847 	if (!instkey)
848 		goto error;
849 
850 	rka = instkey->payload.data;
851 	if (rka->target_key->serial != id)
852 		goto error;
853 
854 	/* pull the payload in if one was supplied */
855 	payload = NULL;
856 
857 	if (_payload) {
858 		ret = -ENOMEM;
859 		payload = kmalloc(plen, GFP_KERNEL);
860 		if (!payload)
861 			goto error;
862 
863 		ret = -EFAULT;
864 		if (copy_from_user(payload, _payload, plen) != 0)
865 			goto error2;
866 	}
867 
868 	/* find the destination keyring amongst those belonging to the
869 	 * requesting task */
870 	keyring_ref = NULL;
871 	if (ringid) {
872 		keyring_ref = lookup_user_key(rka->context, ringid, 1, 0,
873 					      KEY_WRITE);
874 		if (IS_ERR(keyring_ref)) {
875 			ret = PTR_ERR(keyring_ref);
876 			goto error2;
877 		}
878 	}
879 
880 	/* instantiate the key and link it into a keyring */
881 	ret = key_instantiate_and_link(rka->target_key, payload, plen,
882 				       key_ref_to_ptr(keyring_ref), instkey);
883 
884 	key_ref_put(keyring_ref);
885 
886 	/* discard the assumed authority if it's just been disabled by
887 	 * instantiation of the key */
888 	if (ret == 0) {
889 		key_put(current->request_key_auth);
890 		current->request_key_auth = NULL;
891 	}
892 
893 error2:
894 	kfree(payload);
895 error:
896 	return ret;
897 
898 } /* end keyctl_instantiate_key() */
899 
900 /*****************************************************************************/
901 /*
902  * negatively instantiate the key with the given timeout (in seconds), and, if
903  * one is given, link the key into the keyring
904  */
905 long keyctl_negate_key(key_serial_t id, unsigned timeout, key_serial_t ringid)
906 {
907 	struct request_key_auth *rka;
908 	struct key *instkey;
909 	key_ref_t keyring_ref;
910 	long ret;
911 
912 	/* the appropriate instantiation authorisation key must have been
913 	 * assumed before calling this */
914 	ret = -EPERM;
915 	instkey = current->request_key_auth;
916 	if (!instkey)
917 		goto error;
918 
919 	rka = instkey->payload.data;
920 	if (rka->target_key->serial != id)
921 		goto error;
922 
923 	/* find the destination keyring if present (which must also be
924 	 * writable) */
925 	keyring_ref = NULL;
926 	if (ringid) {
927 		keyring_ref = lookup_user_key(NULL, ringid, 1, 0, KEY_WRITE);
928 		if (IS_ERR(keyring_ref)) {
929 			ret = PTR_ERR(keyring_ref);
930 			goto error;
931 		}
932 	}
933 
934 	/* instantiate the key and link it into a keyring */
935 	ret = key_negate_and_link(rka->target_key, timeout,
936 				  key_ref_to_ptr(keyring_ref), instkey);
937 
938 	key_ref_put(keyring_ref);
939 
940 	/* discard the assumed authority if it's just been disabled by
941 	 * instantiation of the key */
942 	if (ret == 0) {
943 		key_put(current->request_key_auth);
944 		current->request_key_auth = NULL;
945 	}
946 
947 error:
948 	return ret;
949 
950 } /* end keyctl_negate_key() */
951 
952 /*****************************************************************************/
953 /*
954  * set the default keyring in which request_key() will cache keys
955  * - return the old setting
956  */
957 long keyctl_set_reqkey_keyring(int reqkey_defl)
958 {
959 	int ret;
960 
961 	switch (reqkey_defl) {
962 	case KEY_REQKEY_DEFL_THREAD_KEYRING:
963 		ret = install_thread_keyring(current);
964 		if (ret < 0)
965 			return ret;
966 		goto set;
967 
968 	case KEY_REQKEY_DEFL_PROCESS_KEYRING:
969 		ret = install_process_keyring(current);
970 		if (ret < 0)
971 			return ret;
972 
973 	case KEY_REQKEY_DEFL_DEFAULT:
974 	case KEY_REQKEY_DEFL_SESSION_KEYRING:
975 	case KEY_REQKEY_DEFL_USER_KEYRING:
976 	case KEY_REQKEY_DEFL_USER_SESSION_KEYRING:
977 	set:
978 		current->jit_keyring = reqkey_defl;
979 
980 	case KEY_REQKEY_DEFL_NO_CHANGE:
981 		return current->jit_keyring;
982 
983 	case KEY_REQKEY_DEFL_GROUP_KEYRING:
984 	default:
985 		return -EINVAL;
986 	}
987 
988 } /* end keyctl_set_reqkey_keyring() */
989 
990 /*****************************************************************************/
991 /*
992  * set or clear the timeout for a key
993  */
994 long keyctl_set_timeout(key_serial_t id, unsigned timeout)
995 {
996 	struct timespec now;
997 	struct key *key;
998 	key_ref_t key_ref;
999 	time_t expiry;
1000 	long ret;
1001 
1002 	key_ref = lookup_user_key(NULL, id, 1, 1, KEY_SETATTR);
1003 	if (IS_ERR(key_ref)) {
1004 		ret = PTR_ERR(key_ref);
1005 		goto error;
1006 	}
1007 
1008 	key = key_ref_to_ptr(key_ref);
1009 
1010 	/* make the changes with the locks held to prevent races */
1011 	down_write(&key->sem);
1012 
1013 	expiry = 0;
1014 	if (timeout > 0) {
1015 		now = current_kernel_time();
1016 		expiry = now.tv_sec + timeout;
1017 	}
1018 
1019 	key->expiry = expiry;
1020 
1021 	up_write(&key->sem);
1022 	key_put(key);
1023 
1024 	ret = 0;
1025 error:
1026 	return ret;
1027 
1028 } /* end keyctl_set_timeout() */
1029 
1030 /*****************************************************************************/
1031 /*
1032  * assume the authority to instantiate the specified key
1033  */
1034 long keyctl_assume_authority(key_serial_t id)
1035 {
1036 	struct key *authkey;
1037 	long ret;
1038 
1039 	/* special key IDs aren't permitted */
1040 	ret = -EINVAL;
1041 	if (id < 0)
1042 		goto error;
1043 
1044 	/* we divest ourselves of authority if given an ID of 0 */
1045 	if (id == 0) {
1046 		key_put(current->request_key_auth);
1047 		current->request_key_auth = NULL;
1048 		ret = 0;
1049 		goto error;
1050 	}
1051 
1052 	/* attempt to assume the authority temporarily granted to us whilst we
1053 	 * instantiate the specified key
1054 	 * - the authorisation key must be in the current task's keyrings
1055 	 *   somewhere
1056 	 */
1057 	authkey = key_get_instantiation_authkey(id);
1058 	if (IS_ERR(authkey)) {
1059 		ret = PTR_ERR(authkey);
1060 		goto error;
1061 	}
1062 
1063 	key_put(current->request_key_auth);
1064 	current->request_key_auth = authkey;
1065 	ret = authkey->serial;
1066 
1067 error:
1068 	return ret;
1069 
1070 } /* end keyctl_assume_authority() */
1071 
1072 /*****************************************************************************/
1073 /*
1074  * the key control system call
1075  */
1076 asmlinkage long sys_keyctl(int option, unsigned long arg2, unsigned long arg3,
1077 			   unsigned long arg4, unsigned long arg5)
1078 {
1079 	switch (option) {
1080 	case KEYCTL_GET_KEYRING_ID:
1081 		return keyctl_get_keyring_ID((key_serial_t) arg2,
1082 					     (int) arg3);
1083 
1084 	case KEYCTL_JOIN_SESSION_KEYRING:
1085 		return keyctl_join_session_keyring((const char __user *) arg2);
1086 
1087 	case KEYCTL_UPDATE:
1088 		return keyctl_update_key((key_serial_t) arg2,
1089 					 (const void __user *) arg3,
1090 					 (size_t) arg4);
1091 
1092 	case KEYCTL_REVOKE:
1093 		return keyctl_revoke_key((key_serial_t) arg2);
1094 
1095 	case KEYCTL_DESCRIBE:
1096 		return keyctl_describe_key((key_serial_t) arg2,
1097 					   (char __user *) arg3,
1098 					   (unsigned) arg4);
1099 
1100 	case KEYCTL_CLEAR:
1101 		return keyctl_keyring_clear((key_serial_t) arg2);
1102 
1103 	case KEYCTL_LINK:
1104 		return keyctl_keyring_link((key_serial_t) arg2,
1105 					   (key_serial_t) arg3);
1106 
1107 	case KEYCTL_UNLINK:
1108 		return keyctl_keyring_unlink((key_serial_t) arg2,
1109 					     (key_serial_t) arg3);
1110 
1111 	case KEYCTL_SEARCH:
1112 		return keyctl_keyring_search((key_serial_t) arg2,
1113 					     (const char __user *) arg3,
1114 					     (const char __user *) arg4,
1115 					     (key_serial_t) arg5);
1116 
1117 	case KEYCTL_READ:
1118 		return keyctl_read_key((key_serial_t) arg2,
1119 				       (char __user *) arg3,
1120 				       (size_t) arg4);
1121 
1122 	case KEYCTL_CHOWN:
1123 		return keyctl_chown_key((key_serial_t) arg2,
1124 					(uid_t) arg3,
1125 					(gid_t) arg4);
1126 
1127 	case KEYCTL_SETPERM:
1128 		return keyctl_setperm_key((key_serial_t) arg2,
1129 					  (key_perm_t) arg3);
1130 
1131 	case KEYCTL_INSTANTIATE:
1132 		return keyctl_instantiate_key((key_serial_t) arg2,
1133 					      (const void __user *) arg3,
1134 					      (size_t) arg4,
1135 					      (key_serial_t) arg5);
1136 
1137 	case KEYCTL_NEGATE:
1138 		return keyctl_negate_key((key_serial_t) arg2,
1139 					 (unsigned) arg3,
1140 					 (key_serial_t) arg4);
1141 
1142 	case KEYCTL_SET_REQKEY_KEYRING:
1143 		return keyctl_set_reqkey_keyring(arg2);
1144 
1145 	case KEYCTL_SET_TIMEOUT:
1146 		return keyctl_set_timeout((key_serial_t) arg2,
1147 					  (unsigned) arg3);
1148 
1149 	case KEYCTL_ASSUME_AUTHORITY:
1150 		return keyctl_assume_authority((key_serial_t) arg2);
1151 
1152 	default:
1153 		return -EOPNOTSUPP;
1154 	}
1155 
1156 } /* end sys_keyctl() */
1157