| /* Definitions for key type implementations | 
 |  * | 
 |  * Copyright (C) 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 | 
 |  * modify it under the terms of the GNU General Public Licence | 
 |  * as published by the Free Software Foundation; either version | 
 |  * 2 of the Licence, or (at your option) any later version. | 
 |  */ | 
 |  | 
 | #ifndef _LINUX_KEY_TYPE_H | 
 | #define _LINUX_KEY_TYPE_H | 
 |  | 
 | #include <linux/key.h> | 
 |  | 
 | #ifdef CONFIG_KEYS | 
 |  | 
 | /* | 
 |  * key under-construction record | 
 |  * - passed to the request_key actor if supplied | 
 |  */ | 
 | struct key_construction { | 
 | 	struct key	*key;	/* key being constructed */ | 
 | 	struct key	*authkey;/* authorisation for key being constructed */ | 
 | }; | 
 |  | 
 | typedef int (*request_key_actor_t)(struct key_construction *key, | 
 | 				   const char *op, void *aux); | 
 |  | 
 | /* | 
 |  * kernel managed key type definition | 
 |  */ | 
 | 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 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 complete_request_key(struct key_construction *cons, int error); | 
 |  | 
 | #endif /* CONFIG_KEYS */ | 
 | #endif /* _LINUX_KEY_TYPE_H */ |