internal.h revision 7e047ef5fe2d52e83020e856b1bf2556a6a2ce98
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* internal.h: authentication token and access key management internal defs
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
33e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Written by David Howells (dhowells@redhat.com)
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modify it under the terms of the GNU General Public License
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as published by the Free Software Foundation; either version
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2 of the License, or (at your option) any later version.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _INTERNAL_H
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _INTERNAL_H
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/key.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/key-ui.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
183e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#if 0
193e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#define kenter(FMT, a...)	printk("==> %s("FMT")\n",__FUNCTION__ , ## a)
203e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#define kleave(FMT, a...)	printk("<== %s()"FMT"\n",__FUNCTION__ , ## a)
213e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#define kdebug(FMT, a...)	printk(FMT"\n" , ## a)
223e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#else
233e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#define kenter(FMT, a...)	do {} while(0)
243e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#define kleave(FMT, a...)	do {} while(0)
253e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#define kdebug(FMT, a...)	do {} while(0)
263e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells#endif
273e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct key_type key_type_user;
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * keep track of keys for a user
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - this needs to be separate to user_struct to avoid a refcount-loop
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   (user_struct pins some keyrings which pin this struct)
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - this also keeps track of keys under request from userspace for this UID
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct key_user {
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct rb_node		node;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head	consq;		/* construction queue */
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t		lock;
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_t		usage;		/* for accessing qnkeys & qnbytes */
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_t		nkeys;		/* number of keys */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_t		nikeys;		/* number of instantiated keys */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	uid_t			uid;
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			qnkeys;		/* number of keys allocated to this user */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int			qnbytes;	/* number of bytes allocated to this user */
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define KEYQUOTA_MAX_KEYS	100
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define KEYQUOTA_MAX_BYTES	10000
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define KEYQUOTA_LINK_BYTES	4		/* a link in a keyring is worth 4 bytes */
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct rb_root	key_user_tree;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern spinlock_t	key_user_lock;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct key_user	root_key_user;
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct key_user *key_user_lookup(uid_t uid);
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void key_user_put(struct key_user *user);
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct rb_root key_serial_tree;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern spinlock_t key_serial_lock;
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct semaphore key_alloc_sem;
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct rw_semaphore key_construction_sem;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern wait_queue_head_t request_key_conswq;
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void keyring_publish_name(struct key *keyring);
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int __key_link(struct key *keyring, struct key *key);
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
73664cceb0093b755739e56572b836a99104ee8a75David Howellsextern key_ref_t __keyring_search_one(key_ref_t keyring_ref,
74664cceb0093b755739e56572b836a99104ee8a75David Howells				      const struct key_type *type,
75664cceb0093b755739e56572b836a99104ee8a75David Howells				      const char *description,
76664cceb0093b755739e56572b836a99104ee8a75David Howells				      key_perm_t perm);
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
783e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsextern struct key *keyring_search_instkey(struct key *keyring,
793e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells					  key_serial_t target_id);
803e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef int (*key_match_func_t)(const struct key *, const void *);
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83664cceb0093b755739e56572b836a99104ee8a75David Howellsextern key_ref_t keyring_search_aux(key_ref_t keyring_ref,
84664cceb0093b755739e56572b836a99104ee8a75David Howells				    struct task_struct *tsk,
85664cceb0093b755739e56572b836a99104ee8a75David Howells				    struct key_type *type,
86664cceb0093b755739e56572b836a99104ee8a75David Howells				    const void *description,
87664cceb0093b755739e56572b836a99104ee8a75David Howells				    key_match_func_t match);
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
89664cceb0093b755739e56572b836a99104ee8a75David Howellsextern key_ref_t search_process_keyrings(struct key_type *type,
90664cceb0093b755739e56572b836a99104ee8a75David Howells					 const void *description,
91664cceb0093b755739e56572b836a99104ee8a75David Howells					 key_match_func_t match,
92664cceb0093b755739e56572b836a99104ee8a75David Howells					 struct task_struct *tsk);
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct key *find_keyring_by_name(const char *name, key_serial_t bound);
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int install_thread_keyring(struct task_struct *tsk);
973e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsextern int install_process_keyring(struct task_struct *tsk);
983e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells
993e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsextern struct key *request_key_and_link(struct key_type *type,
1003e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells					const char *description,
1013e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells					const char *callout_info,
1027e047ef5fe2d52e83020e856b1bf2556a6a2ce98David Howells					struct key *dest_keyring,
1037e047ef5fe2d52e83020e856b1bf2556a6a2ce98David Howells					unsigned long flags);
1043e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells
1053e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells/*
1063e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells * request_key authorisation
1073e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells */
1083e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsstruct request_key_auth {
1093e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells	struct key		*target_key;
1103e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells	struct task_struct	*context;
111b5f545c880a2a47947ba2118b2509644ab7a2969David Howells	const char		*callout_info;
1123e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells	pid_t			pid;
1133e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells};
1143e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells
1153e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsextern struct key_type key_type_request_key_auth;
1163e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsextern struct key *request_key_auth_new(struct key *target,
117b5f545c880a2a47947ba2118b2509644ab7a2969David Howells					const char *callout_info);
1183e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howells
1193e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsextern struct key *key_get_instantiation_authkey(key_serial_t target_id);
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * keyctl functions
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_get_keyring_ID(key_serial_t, int);
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_join_session_keyring(const char __user *);
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_update_key(key_serial_t, const void __user *, size_t);
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_revoke_key(key_serial_t);
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_keyring_clear(key_serial_t);
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_keyring_link(key_serial_t, key_serial_t);
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_keyring_unlink(key_serial_t, key_serial_t);
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_describe_key(key_serial_t, char __user *, size_t);
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_keyring_search(key_serial_t, const char __user *,
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				  const char __user *, key_serial_t);
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_read_key(key_serial_t, char __user *, size_t);
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_chown_key(key_serial_t, uid_t, gid_t);
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_setperm_key(key_serial_t, key_perm_t);
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_instantiate_key(key_serial_t, const void __user *,
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   size_t, key_serial_t);
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern long keyctl_negate_key(key_serial_t, unsigned, key_serial_t);
1403e30148c3d524a9c1c63ca28261bc24c457eb07aDavid Howellsextern long keyctl_set_reqkey_keyring(int);
141017679c4d45783158dba1dd6f79e712c22bb3d9aDavid Howellsextern long keyctl_set_timeout(key_serial_t, unsigned);
142b5f545c880a2a47947ba2118b2509644ab7a2969David Howellsextern long keyctl_assume_authority(key_serial_t);
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * debugging key validation
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef KEY_DEBUGGING
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void __key_check(const struct key *);
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void key_check(const struct key *key)
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (key && (IS_ERR(key) || key->magic != KEY_DEBUG_MAGIC))
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__key_check(key);
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define key_check(key) do {} while(0)
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _INTERNAL_H */
164