#ifndef _LINUX_KEY_H
#define _LINUX_KEY_H
#include <linux/types.h>
#include <linux/list.h>
#include <linux/rbtree.h>
#include <linux/rcupdate.h>
#include <linux/sysctl.h>
#include <linux/rwsem.h>
#include <linux/atomic.h>
#include <linux/assoc_array.h>
#include <linux/refcount.h>
#include <linux/time64.h>
#ifdef __KERNEL__
#include <linux/uidgid.h>
key_serial_t;
key_perm_t;
struct key;
struct net;
#ifdef CONFIG_KEYS
#undef KEY_DEBUGGING
#define KEY_POS_VIEW …
#define KEY_POS_READ …
#define KEY_POS_WRITE …
#define KEY_POS_SEARCH …
#define KEY_POS_LINK …
#define KEY_POS_SETATTR …
#define KEY_POS_ALL …
#define KEY_USR_VIEW …
#define KEY_USR_READ …
#define KEY_USR_WRITE …
#define KEY_USR_SEARCH …
#define KEY_USR_LINK …
#define KEY_USR_SETATTR …
#define KEY_USR_ALL …
#define KEY_GRP_VIEW …
#define KEY_GRP_READ …
#define KEY_GRP_WRITE …
#define KEY_GRP_SEARCH …
#define KEY_GRP_LINK …
#define KEY_GRP_SETATTR …
#define KEY_GRP_ALL …
#define KEY_OTH_VIEW …
#define KEY_OTH_READ …
#define KEY_OTH_WRITE …
#define KEY_OTH_SEARCH …
#define KEY_OTH_LINK …
#define KEY_OTH_SETATTR …
#define KEY_OTH_ALL …
#define KEY_PERM_UNDEF …
enum key_need_perm { … };
enum key_lookup_flag { … };
struct seq_file;
struct user_struct;
struct signal_struct;
struct cred;
struct key_type;
struct key_owner;
struct key_tag;
struct keyring_list;
struct keyring_name;
struct key_tag { … };
struct keyring_index_key { … };
key_payload;
key_ref_t;
static inline key_ref_t make_key_ref(const struct key *key,
bool possession)
{ … }
static inline struct key *key_ref_to_ptr(const key_ref_t key_ref)
{ … }
static inline bool is_key_possessed(const key_ref_t key_ref)
{ … }
key_restrict_link_func_t;
struct key_restriction { … };
enum key_state { … };
struct key { … };
extern struct key *key_alloc(struct key_type *type,
const char *desc,
kuid_t uid, kgid_t gid,
const struct cred *cred,
key_perm_t perm,
unsigned long flags,
struct key_restriction *restrict_link);
#define KEY_ALLOC_IN_QUOTA …
#define KEY_ALLOC_QUOTA_OVERRUN …
#define KEY_ALLOC_NOT_IN_QUOTA …
#define KEY_ALLOC_BUILT_IN …
#define KEY_ALLOC_BYPASS_RESTRICTION …
#define KEY_ALLOC_UID_KEYRING …
#define KEY_ALLOC_SET_KEEP …
extern void key_revoke(struct key *key);
extern void key_invalidate(struct key *key);
extern void key_put(struct key *key);
extern bool key_put_tag(struct key_tag *tag);
extern void key_remove_domain(struct key_tag *domain_tag);
static inline struct key *__key_get(struct key *key)
{ … }
static inline struct key *key_get(struct key *key)
{ … }
static inline void key_ref_put(key_ref_t key_ref)
{ … }
extern struct key *request_key_tag(struct key_type *type,
const char *description,
struct key_tag *domain_tag,
const char *callout_info);
extern struct key *request_key_rcu(struct key_type *type,
const char *description,
struct key_tag *domain_tag);
extern struct key *request_key_with_auxdata(struct key_type *type,
const char *description,
struct key_tag *domain_tag,
const void *callout_info,
size_t callout_len,
void *aux);
static inline struct key *request_key(struct key_type *type,
const char *description,
const char *callout_info)
{ … }
#ifdef CONFIG_NET
#define request_key_net(type, description, net, callout_info) …
#define request_key_net_rcu(type, description, net) …
#endif
extern int wait_for_key_construction(struct key *key, bool intr);
extern int key_validate(const struct key *key);
extern key_ref_t key_create(key_ref_t keyring,
const char *type,
const char *description,
const void *payload,
size_t plen,
key_perm_t perm,
unsigned long flags);
extern key_ref_t key_create_or_update(key_ref_t keyring,
const char *type,
const char *description,
const void *payload,
size_t plen,
key_perm_t perm,
unsigned long flags);
extern int key_update(key_ref_t key,
const void *payload,
size_t plen);
extern int key_link(struct key *keyring,
struct key *key);
extern int key_move(struct key *key,
struct key *from_keyring,
struct key *to_keyring,
unsigned int flags);
extern int key_unlink(struct key *keyring,
struct key *key);
extern struct key *keyring_alloc(const char *description, kuid_t uid, kgid_t gid,
const struct cred *cred,
key_perm_t perm,
unsigned long flags,
struct key_restriction *restrict_link,
struct key *dest);
extern int restrict_link_reject(struct key *keyring,
const struct key_type *type,
const union key_payload *payload,
struct key *restriction_key);
extern int keyring_clear(struct key *keyring);
extern key_ref_t keyring_search(key_ref_t keyring,
struct key_type *type,
const char *description,
bool recurse);
extern int keyring_restrict(key_ref_t keyring, const char *type,
const char *restriction);
extern struct key *key_lookup(key_serial_t id);
static inline key_serial_t key_serial(const struct key *key)
{ … }
extern void key_set_timeout(struct key *, unsigned);
extern key_ref_t lookup_user_key(key_serial_t id, unsigned long flags,
enum key_need_perm need_perm);
extern void key_free_user_ns(struct user_namespace *);
static inline short key_read_state(const struct key *key)
{ … }
static inline bool key_is_positive(const struct key *key)
{ … }
static inline bool key_is_negative(const struct key *key)
{ … }
#define dereference_key_rcu(KEY) …
#define dereference_key_locked(KEY) …
#define rcu_assign_keypointer(KEY, PAYLOAD) …
extern int install_thread_keyring_to_cred(struct cred *cred);
extern void key_fsuid_changed(struct cred *new_cred);
extern void key_fsgid_changed(struct cred *new_cred);
extern void key_init(void);
#else
#define key_validate …
#define key_serial …
#define key_get …
#define key_revoke …
#define key_invalidate …
#define key_put …
#define key_ref_put …
#define make_key_ref …
#define key_ref_to_ptr …
#define is_key_possessed …
#define key_fsuid_changed …
#define key_fsgid_changed …
#define key_init …
#define key_free_user_ns …
#define key_remove_domain …
#define key_lookup …
#endif
#endif
#endif