162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* Authentication token and access key management internal defs 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2003-5, 2007 Red Hat, Inc. All Rights Reserved. 562306a36Sopenharmony_ci * Written by David Howells (dhowells@redhat.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _INTERNAL_H 962306a36Sopenharmony_ci#define _INTERNAL_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/sched.h> 1262306a36Sopenharmony_ci#include <linux/wait_bit.h> 1362306a36Sopenharmony_ci#include <linux/cred.h> 1462306a36Sopenharmony_ci#include <linux/key-type.h> 1562306a36Sopenharmony_ci#include <linux/task_work.h> 1662306a36Sopenharmony_ci#include <linux/keyctl.h> 1762306a36Sopenharmony_ci#include <linux/refcount.h> 1862306a36Sopenharmony_ci#include <linux/watch_queue.h> 1962306a36Sopenharmony_ci#include <linux/compat.h> 2062306a36Sopenharmony_ci#include <linux/mm.h> 2162306a36Sopenharmony_ci#include <linux/vmalloc.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct iovec; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#ifdef __KDEBUG 2662306a36Sopenharmony_ci#define kenter(FMT, ...) \ 2762306a36Sopenharmony_ci printk(KERN_DEBUG "==> %s("FMT")\n", __func__, ##__VA_ARGS__) 2862306a36Sopenharmony_ci#define kleave(FMT, ...) \ 2962306a36Sopenharmony_ci printk(KERN_DEBUG "<== %s()"FMT"\n", __func__, ##__VA_ARGS__) 3062306a36Sopenharmony_ci#define kdebug(FMT, ...) \ 3162306a36Sopenharmony_ci printk(KERN_DEBUG " "FMT"\n", ##__VA_ARGS__) 3262306a36Sopenharmony_ci#else 3362306a36Sopenharmony_ci#define kenter(FMT, ...) \ 3462306a36Sopenharmony_ci no_printk(KERN_DEBUG "==> %s("FMT")\n", __func__, ##__VA_ARGS__) 3562306a36Sopenharmony_ci#define kleave(FMT, ...) \ 3662306a36Sopenharmony_ci no_printk(KERN_DEBUG "<== %s()"FMT"\n", __func__, ##__VA_ARGS__) 3762306a36Sopenharmony_ci#define kdebug(FMT, ...) \ 3862306a36Sopenharmony_ci no_printk(KERN_DEBUG FMT"\n", ##__VA_ARGS__) 3962306a36Sopenharmony_ci#endif 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ciextern struct key_type key_type_dead; 4262306a36Sopenharmony_ciextern struct key_type key_type_user; 4362306a36Sopenharmony_ciextern struct key_type key_type_logon; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/*****************************************************************************/ 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * Keep track of keys for a user. 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci * This needs to be separate to user_struct to avoid a refcount-loop 5062306a36Sopenharmony_ci * (user_struct pins some keyrings which pin this struct). 5162306a36Sopenharmony_ci * 5262306a36Sopenharmony_ci * We also keep track of keys under request from userspace for this UID here. 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_cistruct key_user { 5562306a36Sopenharmony_ci struct rb_node node; 5662306a36Sopenharmony_ci struct mutex cons_lock; /* construction initiation lock */ 5762306a36Sopenharmony_ci spinlock_t lock; 5862306a36Sopenharmony_ci refcount_t usage; /* for accessing qnkeys & qnbytes */ 5962306a36Sopenharmony_ci atomic_t nkeys; /* number of keys */ 6062306a36Sopenharmony_ci atomic_t nikeys; /* number of instantiated keys */ 6162306a36Sopenharmony_ci kuid_t uid; 6262306a36Sopenharmony_ci int qnkeys; /* number of keys allocated to this user */ 6362306a36Sopenharmony_ci int qnbytes; /* number of bytes allocated to this user */ 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciextern struct rb_root key_user_tree; 6762306a36Sopenharmony_ciextern spinlock_t key_user_lock; 6862306a36Sopenharmony_ciextern struct key_user root_key_user; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ciextern struct key_user *key_user_lookup(kuid_t uid); 7162306a36Sopenharmony_ciextern void key_user_put(struct key_user *user); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* 7462306a36Sopenharmony_ci * Key quota limits. 7562306a36Sopenharmony_ci * - root has its own separate limits to everyone else 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_ciextern unsigned key_quota_root_maxkeys; 7862306a36Sopenharmony_ciextern unsigned key_quota_root_maxbytes; 7962306a36Sopenharmony_ciextern unsigned key_quota_maxkeys; 8062306a36Sopenharmony_ciextern unsigned key_quota_maxbytes; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define KEYQUOTA_LINK_BYTES 4 /* a link in a keyring is worth 4 bytes */ 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ciextern struct kmem_cache *key_jar; 8662306a36Sopenharmony_ciextern struct rb_root key_serial_tree; 8762306a36Sopenharmony_ciextern spinlock_t key_serial_lock; 8862306a36Sopenharmony_ciextern struct mutex key_construction_mutex; 8962306a36Sopenharmony_ciextern wait_queue_head_t request_key_conswq; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciextern void key_set_index_key(struct keyring_index_key *index_key); 9262306a36Sopenharmony_ciextern struct key_type *key_type_lookup(const char *type); 9362306a36Sopenharmony_ciextern void key_type_put(struct key_type *ktype); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciextern int __key_link_lock(struct key *keyring, 9662306a36Sopenharmony_ci const struct keyring_index_key *index_key); 9762306a36Sopenharmony_ciextern int __key_move_lock(struct key *l_keyring, struct key *u_keyring, 9862306a36Sopenharmony_ci const struct keyring_index_key *index_key); 9962306a36Sopenharmony_ciextern int __key_link_begin(struct key *keyring, 10062306a36Sopenharmony_ci const struct keyring_index_key *index_key, 10162306a36Sopenharmony_ci struct assoc_array_edit **_edit); 10262306a36Sopenharmony_ciextern int __key_link_check_live_key(struct key *keyring, struct key *key); 10362306a36Sopenharmony_ciextern void __key_link(struct key *keyring, struct key *key, 10462306a36Sopenharmony_ci struct assoc_array_edit **_edit); 10562306a36Sopenharmony_ciextern void __key_link_end(struct key *keyring, 10662306a36Sopenharmony_ci const struct keyring_index_key *index_key, 10762306a36Sopenharmony_ci struct assoc_array_edit *edit); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ciextern key_ref_t find_key_to_update(key_ref_t keyring_ref, 11062306a36Sopenharmony_ci const struct keyring_index_key *index_key); 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ciextern struct key *keyring_search_instkey(struct key *keyring, 11362306a36Sopenharmony_ci key_serial_t target_id); 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ciextern int iterate_over_keyring(const struct key *keyring, 11662306a36Sopenharmony_ci int (*func)(const struct key *key, void *data), 11762306a36Sopenharmony_ci void *data); 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct keyring_search_context { 12062306a36Sopenharmony_ci struct keyring_index_key index_key; 12162306a36Sopenharmony_ci const struct cred *cred; 12262306a36Sopenharmony_ci struct key_match_data match_data; 12362306a36Sopenharmony_ci unsigned flags; 12462306a36Sopenharmony_ci#define KEYRING_SEARCH_NO_STATE_CHECK 0x0001 /* Skip state checks */ 12562306a36Sopenharmony_ci#define KEYRING_SEARCH_DO_STATE_CHECK 0x0002 /* Override NO_STATE_CHECK */ 12662306a36Sopenharmony_ci#define KEYRING_SEARCH_NO_UPDATE_TIME 0x0004 /* Don't update times */ 12762306a36Sopenharmony_ci#define KEYRING_SEARCH_NO_CHECK_PERM 0x0008 /* Don't check permissions */ 12862306a36Sopenharmony_ci#define KEYRING_SEARCH_DETECT_TOO_DEEP 0x0010 /* Give an error on excessive depth */ 12962306a36Sopenharmony_ci#define KEYRING_SEARCH_SKIP_EXPIRED 0x0020 /* Ignore expired keys (intention to replace) */ 13062306a36Sopenharmony_ci#define KEYRING_SEARCH_RECURSE 0x0040 /* Search child keyrings also */ 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci int (*iterator)(const void *object, void *iterator_data); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* Internal stuff */ 13562306a36Sopenharmony_ci int skipped_ret; 13662306a36Sopenharmony_ci bool possessed; 13762306a36Sopenharmony_ci key_ref_t result; 13862306a36Sopenharmony_ci time64_t now; 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ciextern bool key_default_cmp(const struct key *key, 14262306a36Sopenharmony_ci const struct key_match_data *match_data); 14362306a36Sopenharmony_ciextern key_ref_t keyring_search_rcu(key_ref_t keyring_ref, 14462306a36Sopenharmony_ci struct keyring_search_context *ctx); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ciextern key_ref_t search_cred_keyrings_rcu(struct keyring_search_context *ctx); 14762306a36Sopenharmony_ciextern key_ref_t search_process_keyrings_rcu(struct keyring_search_context *ctx); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ciextern struct key *find_keyring_by_name(const char *name, bool uid_keyring); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ciextern int look_up_user_keyrings(struct key **, struct key **); 15262306a36Sopenharmony_ciextern struct key *get_user_session_keyring_rcu(const struct cred *); 15362306a36Sopenharmony_ciextern int install_thread_keyring_to_cred(struct cred *); 15462306a36Sopenharmony_ciextern int install_process_keyring_to_cred(struct cred *); 15562306a36Sopenharmony_ciextern int install_session_keyring_to_cred(struct cred *, struct key *); 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ciextern struct key *request_key_and_link(struct key_type *type, 15862306a36Sopenharmony_ci const char *description, 15962306a36Sopenharmony_ci struct key_tag *domain_tag, 16062306a36Sopenharmony_ci const void *callout_info, 16162306a36Sopenharmony_ci size_t callout_len, 16262306a36Sopenharmony_ci void *aux, 16362306a36Sopenharmony_ci struct key *dest_keyring, 16462306a36Sopenharmony_ci unsigned long flags); 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ciextern bool lookup_user_key_possessed(const struct key *key, 16762306a36Sopenharmony_ci const struct key_match_data *match_data); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ciextern long join_session_keyring(const char *name); 17062306a36Sopenharmony_ciextern void key_change_session_keyring(struct callback_head *twork); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ciextern struct work_struct key_gc_work; 17362306a36Sopenharmony_ciextern unsigned key_gc_delay; 17462306a36Sopenharmony_ciextern void keyring_gc(struct key *keyring, time64_t limit); 17562306a36Sopenharmony_ciextern void keyring_restriction_gc(struct key *keyring, 17662306a36Sopenharmony_ci struct key_type *dead_type); 17762306a36Sopenharmony_civoid key_set_expiry(struct key *key, time64_t expiry); 17862306a36Sopenharmony_ciextern void key_schedule_gc(time64_t gc_at); 17962306a36Sopenharmony_ciextern void key_schedule_gc_links(void); 18062306a36Sopenharmony_ciextern void key_gc_keytype(struct key_type *ktype); 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ciextern int key_task_permission(const key_ref_t key_ref, 18362306a36Sopenharmony_ci const struct cred *cred, 18462306a36Sopenharmony_ci enum key_need_perm need_perm); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic inline void notify_key(struct key *key, 18762306a36Sopenharmony_ci enum key_notification_subtype subtype, u32 aux) 18862306a36Sopenharmony_ci{ 18962306a36Sopenharmony_ci#ifdef CONFIG_KEY_NOTIFICATIONS 19062306a36Sopenharmony_ci struct key_notification n = { 19162306a36Sopenharmony_ci .watch.type = WATCH_TYPE_KEY_NOTIFY, 19262306a36Sopenharmony_ci .watch.subtype = subtype, 19362306a36Sopenharmony_ci .watch.info = watch_sizeof(n), 19462306a36Sopenharmony_ci .key_id = key_serial(key), 19562306a36Sopenharmony_ci .aux = aux, 19662306a36Sopenharmony_ci }; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci post_watch_notification(key->watchers, &n.watch, current_cred(), 19962306a36Sopenharmony_ci n.key_id); 20062306a36Sopenharmony_ci#endif 20162306a36Sopenharmony_ci} 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci/* 20462306a36Sopenharmony_ci * Check to see whether permission is granted to use a key in the desired way. 20562306a36Sopenharmony_ci */ 20662306a36Sopenharmony_cistatic inline int key_permission(const key_ref_t key_ref, 20762306a36Sopenharmony_ci enum key_need_perm need_perm) 20862306a36Sopenharmony_ci{ 20962306a36Sopenharmony_ci return key_task_permission(key_ref, current_cred(), need_perm); 21062306a36Sopenharmony_ci} 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ciextern struct key_type key_type_request_key_auth; 21362306a36Sopenharmony_ciextern struct key *request_key_auth_new(struct key *target, 21462306a36Sopenharmony_ci const char *op, 21562306a36Sopenharmony_ci const void *callout_info, 21662306a36Sopenharmony_ci size_t callout_len, 21762306a36Sopenharmony_ci struct key *dest_keyring); 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ciextern struct key *key_get_instantiation_authkey(key_serial_t target_id); 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/* 22262306a36Sopenharmony_ci * Determine whether a key is dead. 22362306a36Sopenharmony_ci */ 22462306a36Sopenharmony_cistatic inline bool key_is_dead(const struct key *key, time64_t limit) 22562306a36Sopenharmony_ci{ 22662306a36Sopenharmony_ci time64_t expiry = key->expiry; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci if (expiry != TIME64_MAX) { 22962306a36Sopenharmony_ci if (!(key->type->flags & KEY_TYPE_INSTANT_REAP)) 23062306a36Sopenharmony_ci expiry += key_gc_delay; 23162306a36Sopenharmony_ci if (expiry <= limit) 23262306a36Sopenharmony_ci return true; 23362306a36Sopenharmony_ci } 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci return 23662306a36Sopenharmony_ci key->flags & ((1 << KEY_FLAG_DEAD) | 23762306a36Sopenharmony_ci (1 << KEY_FLAG_INVALIDATED)) || 23862306a36Sopenharmony_ci key->domain_tag->removed; 23962306a36Sopenharmony_ci} 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci/* 24262306a36Sopenharmony_ci * keyctl() functions 24362306a36Sopenharmony_ci */ 24462306a36Sopenharmony_ciextern long keyctl_get_keyring_ID(key_serial_t, int); 24562306a36Sopenharmony_ciextern long keyctl_join_session_keyring(const char __user *); 24662306a36Sopenharmony_ciextern long keyctl_update_key(key_serial_t, const void __user *, size_t); 24762306a36Sopenharmony_ciextern long keyctl_revoke_key(key_serial_t); 24862306a36Sopenharmony_ciextern long keyctl_keyring_clear(key_serial_t); 24962306a36Sopenharmony_ciextern long keyctl_keyring_link(key_serial_t, key_serial_t); 25062306a36Sopenharmony_ciextern long keyctl_keyring_move(key_serial_t, key_serial_t, key_serial_t, unsigned int); 25162306a36Sopenharmony_ciextern long keyctl_keyring_unlink(key_serial_t, key_serial_t); 25262306a36Sopenharmony_ciextern long keyctl_describe_key(key_serial_t, char __user *, size_t); 25362306a36Sopenharmony_ciextern long keyctl_keyring_search(key_serial_t, const char __user *, 25462306a36Sopenharmony_ci const char __user *, key_serial_t); 25562306a36Sopenharmony_ciextern long keyctl_read_key(key_serial_t, char __user *, size_t); 25662306a36Sopenharmony_ciextern long keyctl_chown_key(key_serial_t, uid_t, gid_t); 25762306a36Sopenharmony_ciextern long keyctl_setperm_key(key_serial_t, key_perm_t); 25862306a36Sopenharmony_ciextern long keyctl_instantiate_key(key_serial_t, const void __user *, 25962306a36Sopenharmony_ci size_t, key_serial_t); 26062306a36Sopenharmony_ciextern long keyctl_negate_key(key_serial_t, unsigned, key_serial_t); 26162306a36Sopenharmony_ciextern long keyctl_set_reqkey_keyring(int); 26262306a36Sopenharmony_ciextern long keyctl_set_timeout(key_serial_t, unsigned); 26362306a36Sopenharmony_ciextern long keyctl_assume_authority(key_serial_t); 26462306a36Sopenharmony_ciextern long keyctl_get_security(key_serial_t keyid, char __user *buffer, 26562306a36Sopenharmony_ci size_t buflen); 26662306a36Sopenharmony_ciextern long keyctl_session_to_parent(void); 26762306a36Sopenharmony_ciextern long keyctl_reject_key(key_serial_t, unsigned, unsigned, key_serial_t); 26862306a36Sopenharmony_ciextern long keyctl_instantiate_key_iov(key_serial_t, 26962306a36Sopenharmony_ci const struct iovec __user *, 27062306a36Sopenharmony_ci unsigned, key_serial_t); 27162306a36Sopenharmony_ciextern long keyctl_invalidate_key(key_serial_t); 27262306a36Sopenharmony_ciextern long keyctl_restrict_keyring(key_serial_t id, 27362306a36Sopenharmony_ci const char __user *_type, 27462306a36Sopenharmony_ci const char __user *_restriction); 27562306a36Sopenharmony_ci#ifdef CONFIG_PERSISTENT_KEYRINGS 27662306a36Sopenharmony_ciextern long keyctl_get_persistent(uid_t, key_serial_t); 27762306a36Sopenharmony_ciextern unsigned persistent_keyring_expiry; 27862306a36Sopenharmony_ci#else 27962306a36Sopenharmony_cistatic inline long keyctl_get_persistent(uid_t uid, key_serial_t destring) 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci return -EOPNOTSUPP; 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci#endif 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci#ifdef CONFIG_KEY_DH_OPERATIONS 28662306a36Sopenharmony_ciextern long keyctl_dh_compute(struct keyctl_dh_params __user *, char __user *, 28762306a36Sopenharmony_ci size_t, struct keyctl_kdf_params __user *); 28862306a36Sopenharmony_ciextern long __keyctl_dh_compute(struct keyctl_dh_params __user *, char __user *, 28962306a36Sopenharmony_ci size_t, struct keyctl_kdf_params *); 29062306a36Sopenharmony_ci#ifdef CONFIG_COMPAT 29162306a36Sopenharmony_ciextern long compat_keyctl_dh_compute(struct keyctl_dh_params __user *params, 29262306a36Sopenharmony_ci char __user *buffer, size_t buflen, 29362306a36Sopenharmony_ci struct compat_keyctl_kdf_params __user *kdf); 29462306a36Sopenharmony_ci#endif 29562306a36Sopenharmony_ci#define KEYCTL_KDF_MAX_OUTPUT_LEN 1024 /* max length of KDF output */ 29662306a36Sopenharmony_ci#define KEYCTL_KDF_MAX_OI_LEN 64 /* max length of otherinfo */ 29762306a36Sopenharmony_ci#else 29862306a36Sopenharmony_cistatic inline long keyctl_dh_compute(struct keyctl_dh_params __user *params, 29962306a36Sopenharmony_ci char __user *buffer, size_t buflen, 30062306a36Sopenharmony_ci struct keyctl_kdf_params __user *kdf) 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci return -EOPNOTSUPP; 30362306a36Sopenharmony_ci} 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci#ifdef CONFIG_COMPAT 30662306a36Sopenharmony_cistatic inline long compat_keyctl_dh_compute( 30762306a36Sopenharmony_ci struct keyctl_dh_params __user *params, 30862306a36Sopenharmony_ci char __user *buffer, size_t buflen, 30962306a36Sopenharmony_ci struct keyctl_kdf_params __user *kdf) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci return -EOPNOTSUPP; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci#endif 31462306a36Sopenharmony_ci#endif 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci#ifdef CONFIG_ASYMMETRIC_KEY_TYPE 31762306a36Sopenharmony_ciextern long keyctl_pkey_query(key_serial_t, 31862306a36Sopenharmony_ci const char __user *, 31962306a36Sopenharmony_ci struct keyctl_pkey_query __user *); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ciextern long keyctl_pkey_verify(const struct keyctl_pkey_params __user *, 32262306a36Sopenharmony_ci const char __user *, 32362306a36Sopenharmony_ci const void __user *, const void __user *); 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ciextern long keyctl_pkey_e_d_s(int, 32662306a36Sopenharmony_ci const struct keyctl_pkey_params __user *, 32762306a36Sopenharmony_ci const char __user *, 32862306a36Sopenharmony_ci const void __user *, void __user *); 32962306a36Sopenharmony_ci#else 33062306a36Sopenharmony_cistatic inline long keyctl_pkey_query(key_serial_t id, 33162306a36Sopenharmony_ci const char __user *_info, 33262306a36Sopenharmony_ci struct keyctl_pkey_query __user *_res) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci return -EOPNOTSUPP; 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic inline long keyctl_pkey_verify(const struct keyctl_pkey_params __user *params, 33862306a36Sopenharmony_ci const char __user *_info, 33962306a36Sopenharmony_ci const void __user *_in, 34062306a36Sopenharmony_ci const void __user *_in2) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci return -EOPNOTSUPP; 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cistatic inline long keyctl_pkey_e_d_s(int op, 34662306a36Sopenharmony_ci const struct keyctl_pkey_params __user *params, 34762306a36Sopenharmony_ci const char __user *_info, 34862306a36Sopenharmony_ci const void __user *_in, 34962306a36Sopenharmony_ci void __user *_out) 35062306a36Sopenharmony_ci{ 35162306a36Sopenharmony_ci return -EOPNOTSUPP; 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci#endif 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ciextern long keyctl_capabilities(unsigned char __user *_buffer, size_t buflen); 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci#ifdef CONFIG_KEY_NOTIFICATIONS 35862306a36Sopenharmony_ciextern long keyctl_watch_key(key_serial_t, int, int); 35962306a36Sopenharmony_ci#else 36062306a36Sopenharmony_cistatic inline long keyctl_watch_key(key_serial_t key_id, int watch_fd, int watch_id) 36162306a36Sopenharmony_ci{ 36262306a36Sopenharmony_ci return -EOPNOTSUPP; 36362306a36Sopenharmony_ci} 36462306a36Sopenharmony_ci#endif 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/* 36762306a36Sopenharmony_ci * Debugging key validation 36862306a36Sopenharmony_ci */ 36962306a36Sopenharmony_ci#ifdef KEY_DEBUGGING 37062306a36Sopenharmony_ciextern void __key_check(const struct key *); 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cistatic inline void key_check(const struct key *key) 37362306a36Sopenharmony_ci{ 37462306a36Sopenharmony_ci if (key && (IS_ERR(key) || key->magic != KEY_DEBUG_MAGIC)) 37562306a36Sopenharmony_ci __key_check(key); 37662306a36Sopenharmony_ci} 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci#else 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci#define key_check(key) do {} while(0) 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci#endif 38362306a36Sopenharmony_ci#endif /* _INTERNAL_H */ 384