]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/linux/key.h
keys: don't generate user and user session keyrings unless they're accessed
[linux-2.6-omap-h63xx.git] / include / linux / key.h
index a9220e75782ec821a8144a198e8630ef634dbca4..2effd031a817db384ca6df1de31e44237111d7cc 100644 (file)
@@ -1,6 +1,6 @@
-/* key.h: authentication token and access key management
+/* Authentication token and access key management
  *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
+ * Copyright (C) 2004, 2007 Red Hat, Inc. All Rights Reserved.
  * Written by David Howells (dhowells@redhat.com)
  *
  * This program is free software; you can redistribute it and/or
@@ -67,6 +67,8 @@ struct key;
 #define KEY_OTH_SETATTR        0x00000020
 #define KEY_OTH_ALL    0x0000003f
 
+#define KEY_PERM_UNDEF 0xffffffff
+
 struct seq_file;
 struct user_struct;
 struct signal_struct;
@@ -175,78 +177,6 @@ struct key {
        } payload;
 };
 
-/*****************************************************************************/
-/*
- * kernel managed key type definition
- */
-typedef int (*request_key_actor_t)(struct key *key, struct key *authkey,
-                                  const char *op, void *aux);
-
-struct key_type {
-       /* name of the type */
-       const char *name;
-
-       /* default payload length for quota precalculation (optional)
-        * - this can be used instead of calling key_payload_reserve(), that
-        *   function only needs to be called if the real datalen is different
-        */
-       size_t def_datalen;
-
-       /* instantiate a key of this type
-        * - this method should call key_payload_reserve() to determine if the
-        *   user's quota will hold the payload
-        */
-       int (*instantiate)(struct key *key, const void *data, size_t datalen);
-
-       /* update a key of this type (optional)
-        * - this method should call key_payload_reserve() to recalculate the
-        *   quota consumption
-        * - the key must be locked against read when modifying
-        */
-       int (*update)(struct key *key, const void *data, size_t datalen);
-
-       /* match a key against a description */
-       int (*match)(const struct key *key, const void *desc);
-
-       /* clear some of the data from a key on revokation (optional)
-        * - the key's semaphore will be write-locked by the caller
-        */
-       void (*revoke)(struct key *key);
-
-       /* clear the data from a key (optional) */
-       void (*destroy)(struct key *key);
-
-       /* describe a key */
-       void (*describe)(const struct key *key, struct seq_file *p);
-
-       /* read a key's data (optional)
-        * - permission checks will be done by the caller
-        * - the key's semaphore will be readlocked by the caller
-        * - should return the amount of data that could be read, no matter how
-        *   much is copied into the buffer
-        * - shouldn't do the copy if the buffer is NULL
-        */
-       long (*read)(const struct key *key, char __user *buffer, size_t buflen);
-
-       /* handle request_key() for this type instead of invoking
-        * /sbin/request-key (optional)
-        * - key is the key to instantiate
-        * - authkey is the authority to assume when instantiating this key
-        * - op is the operation to be done, usually "create"
-        * - the call must not return until the instantiation process has run
-        *   its course
-        */
-       request_key_actor_t request_key;
-
-       /* internal fields */
-       struct list_head        link;           /* link in types list */
-};
-
-extern struct key_type key_type_keyring;
-
-extern int register_key_type(struct key_type *ktype);
-extern void unregister_key_type(struct key_type *ktype);
-
 extern struct key *key_alloc(struct key_type *type,
                             const char *desc,
                             uid_t uid, gid_t gid,
@@ -259,16 +189,6 @@ extern struct key *key_alloc(struct key_type *type,
 #define KEY_ALLOC_QUOTA_OVERRUN        0x0001  /* add to quota, permit even if overrun */
 #define KEY_ALLOC_NOT_IN_QUOTA 0x0002  /* not in quota */
 
-extern int key_payload_reserve(struct key *key, size_t datalen);
-extern int key_instantiate_and_link(struct key *key,
-                                   const void *data,
-                                   size_t datalen,
-                                   struct key *keyring,
-                                   struct key *instkey);
-extern int key_negate_and_link(struct key *key,
-                              unsigned timeout,
-                              struct key *keyring,
-                              struct key *instkey);
 extern void key_revoke(struct key *key);
 extern void key_put(struct key *key);
 
@@ -290,9 +210,23 @@ extern struct key *request_key(struct key_type *type,
 
 extern struct key *request_key_with_auxdata(struct key_type *type,
                                            const char *description,
-                                           const char *callout_info,
+                                           const void *callout_info,
+                                           size_t callout_len,
                                            void *aux);
 
+extern struct key *request_key_async(struct key_type *type,
+                                    const char *description,
+                                    const void *callout_info,
+                                    size_t callout_len);
+
+extern struct key *request_key_async_with_auxdata(struct key_type *type,
+                                                 const char *description,
+                                                 const void *callout_info,
+                                                 size_t callout_len,
+                                                 void *aux);
+
+extern int wait_for_key_construction(struct key *key, bool intr);
+
 extern int key_validate(struct key *key);
 
 extern key_ref_t key_create_or_update(key_ref_t keyring,
@@ -300,6 +234,7 @@ extern key_ref_t key_create_or_update(key_ref_t keyring,
                                      const char *description,
                                      const void *payload,
                                      size_t plen,
+                                     key_perm_t perm,
                                      unsigned long flags);
 
 extern int key_update(key_ref_t key,
@@ -328,16 +263,11 @@ extern int keyring_add_key(struct key *keyring,
 
 extern struct key *key_lookup(key_serial_t id);
 
-extern void keyring_replace_payload(struct key *key, void *replacement);
-
 #define key_serial(key) ((key) ? (key)->serial : 0)
 
 /*
  * the userspace interface
  */
-extern struct key root_user_keyring, root_session_keyring;
-extern int alloc_uid_keyring(struct user_struct *user,
-                            struct task_struct *ctx);
 extern void switch_uid_keyring(struct user_struct *new_user);
 extern int copy_keys(unsigned long clone_flags, struct task_struct *tsk);
 extern int copy_thread_group_keys(struct task_struct *tsk);
@@ -363,10 +293,9 @@ extern void key_init(void);
 #define key_get(k)                     ({ NULL; })
 #define key_put(k)                     do { } while(0)
 #define key_ref_put(k)                 do { } while(0)
-#define make_key_ref(k)                        ({ NULL; })
+#define make_key_ref(k, p)                     ({ NULL; })
 #define key_ref_to_ptr(k)              ({ NULL; })
 #define is_key_possessed(k)            0
-#define alloc_uid_keyring(u,c)         0
 #define switch_uid_keyring(u)          do { } while(0)
 #define __install_session_keyring(t, k)        ({ NULL; })
 #define copy_keys(f,t)                 0
@@ -379,10 +308,6 @@ extern void key_init(void);
 #define key_fsgid_changed(t)           do { } while(0)
 #define key_init()                     do { } while(0)
 
-/* Initial keyrings */
-extern struct key root_user_keyring;
-extern struct key root_session_keyring;
-
 #endif /* CONFIG_KEYS */
 #endif /* __KERNEL__ */
 #endif /* _LINUX_KEY_H */