196 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ */2/*3 * Copyright IBM Corp. 20244 *5 * Pkey base: debug feature, defines and structs6 * common to all pkey code.7 */8 9#ifndef _PKEY_BASE_H_10#define _PKEY_BASE_H_11 12#include <linux/types.h>13#include <asm/debug.h>14#include <asm/pkey.h>15 16/*17 * pkey debug feature18 */19 20extern debug_info_t *pkey_dbf_info;21 22#define PKEY_DBF_INFO(...) debug_sprintf_event(pkey_dbf_info, 5, ##__VA_ARGS__)23#define PKEY_DBF_WARN(...) debug_sprintf_event(pkey_dbf_info, 4, ##__VA_ARGS__)24#define PKEY_DBF_ERR(...) debug_sprintf_event(pkey_dbf_info, 3, ##__VA_ARGS__)25 26/*27 * common defines and common structs28 */29 30#define KEYBLOBBUFSIZE 8192 /* key buffer size used for internal processing */31#define MINKEYBLOBBUFSIZE (sizeof(struct keytoken_header))32#define PROTKEYBLOBBUFSIZE 256 /* protected key buffer size used internal */33#define MAXAPQNSINLIST 64 /* max 64 apqns within a apqn list */34#define AES_WK_VP_SIZE 32 /* Size of WK VP block appended to a prot key */35 36/* inside view of a generic protected key token */37struct protkeytoken {38 u8 type; /* 0x00 for PAES specific key tokens */39 u8 res0[3];40 u8 version; /* should be 0x01 for protected key token */41 u8 res1[3];42 u32 keytype; /* key type, one of the PKEY_KEYTYPE values */43 u32 len; /* bytes actually stored in protkey[] */44 u8 protkey[]; /* the protected key blob */45} __packed;46 47/* inside view of a protected AES key token */48struct protaeskeytoken {49 u8 type; /* 0x00 for PAES specific key tokens */50 u8 res0[3];51 u8 version; /* should be 0x01 for protected key token */52 u8 res1[3];53 u32 keytype; /* key type, one of the PKEY_KEYTYPE values */54 u32 len; /* bytes actually stored in protkey[] */55 u8 protkey[MAXPROTKEYSIZE]; /* the protected key blob */56} __packed;57 58/* inside view of a clear key token (type 0x00 version 0x02) */59struct clearkeytoken {60 u8 type; /* 0x00 for PAES specific key tokens */61 u8 res0[3];62 u8 version; /* 0x02 for clear key token */63 u8 res1[3];64 u32 keytype; /* key type, one of the PKEY_KEYTYPE_* values */65 u32 len; /* bytes actually stored in clearkey[] */66 u8 clearkey[]; /* clear key value */67} __packed;68 69/* helper function which translates the PKEY_KEYTYPE_AES_* to their keysize */70static inline u32 pkey_keytype_aes_to_size(u32 keytype)71{72 switch (keytype) {73 case PKEY_KEYTYPE_AES_128:74 return 16;75 case PKEY_KEYTYPE_AES_192:76 return 24;77 case PKEY_KEYTYPE_AES_256:78 return 32;79 default:80 return 0;81 }82}83 84/* helper function which translates AES key bit size into PKEY_KEYTYPE_AES_* */85static inline u32 pkey_aes_bitsize_to_keytype(u32 keybitsize)86{87 switch (keybitsize) {88 case 128:89 return PKEY_KEYTYPE_AES_128;90 case 192:91 return PKEY_KEYTYPE_AES_192;92 case 256:93 return PKEY_KEYTYPE_AES_256;94 default:95 return 0;96 }97}98 99/*100 * pkey_api.c:101 */102int __init pkey_api_init(void);103void __exit pkey_api_exit(void);104 105/*106 * pkey_sysfs.c:107 */108 109extern const struct attribute_group *pkey_attr_groups[];110 111/*112 * pkey handler registry113 */114 115struct pkey_handler {116 struct module *module;117 const char *name;118 /*119 * is_supported_key() and is_supported_keytype() are called120 * within an rcu_read_lock() scope and thus must not sleep!121 */122 bool (*is_supported_key)(const u8 *key, u32 keylen);123 bool (*is_supported_keytype)(enum pkey_key_type);124 int (*key_to_protkey)(const struct pkey_apqn *apqns, size_t nr_apqns,125 const u8 *key, u32 keylen,126 u8 *protkey, u32 *protkeylen, u32 *protkeytype);127 int (*slowpath_key_to_protkey)(const struct pkey_apqn *apqns,128 size_t nr_apqns,129 const u8 *key, u32 keylen,130 u8 *protkey, u32 *protkeylen,131 u32 *protkeytype);132 int (*gen_key)(const struct pkey_apqn *apqns, size_t nr_apqns,133 u32 keytype, u32 keysubtype,134 u32 keybitsize, u32 flags,135 u8 *keybuf, u32 *keybuflen, u32 *keyinfo);136 int (*clr_to_key)(const struct pkey_apqn *apqns, size_t nr_apqns,137 u32 keytype, u32 keysubtype,138 u32 keybitsize, u32 flags,139 const u8 *clrkey, u32 clrkeylen,140 u8 *keybuf, u32 *keybuflen, u32 *keyinfo);141 int (*verify_key)(const u8 *key, u32 keylen,142 u16 *card, u16 *dom,143 u32 *keytype, u32 *keybitsize, u32 *flags);144 int (*apqns_for_key)(const u8 *key, u32 keylen, u32 flags,145 struct pkey_apqn *apqns, size_t *nr_apqns);146 int (*apqns_for_keytype)(enum pkey_key_type ktype,147 u8 cur_mkvp[32], u8 alt_mkvp[32], u32 flags,148 struct pkey_apqn *apqns, size_t *nr_apqns);149 /* used internal by pkey base */150 struct list_head list;151};152 153int pkey_handler_register(struct pkey_handler *handler);154int pkey_handler_unregister(struct pkey_handler *handler);155 156/*157 * invocation function for the registered pkey handlers158 */159 160const struct pkey_handler *pkey_handler_get_keybased(const u8 *key, u32 keylen);161const struct pkey_handler *pkey_handler_get_keytypebased(enum pkey_key_type kt);162void pkey_handler_put(const struct pkey_handler *handler);163 164int pkey_handler_key_to_protkey(const struct pkey_apqn *apqns, size_t nr_apqns,165 const u8 *key, u32 keylen,166 u8 *protkey, u32 *protkeylen, u32 *protkeytype);167int pkey_handler_slowpath_key_to_protkey(const struct pkey_apqn *apqns,168 size_t nr_apqns,169 const u8 *key, u32 keylen,170 u8 *protkey, u32 *protkeylen,171 u32 *protkeytype);172int pkey_handler_gen_key(const struct pkey_apqn *apqns, size_t nr_apqns,173 u32 keytype, u32 keysubtype,174 u32 keybitsize, u32 flags,175 u8 *keybuf, u32 *keybuflen, u32 *keyinfo);176int pkey_handler_clr_to_key(const struct pkey_apqn *apqns, size_t nr_apqns,177 u32 keytype, u32 keysubtype,178 u32 keybitsize, u32 flags,179 const u8 *clrkey, u32 clrkeylen,180 u8 *keybuf, u32 *keybuflen, u32 *keyinfo);181int pkey_handler_verify_key(const u8 *key, u32 keylen,182 u16 *card, u16 *dom,183 u32 *keytype, u32 *keybitsize, u32 *flags);184int pkey_handler_apqns_for_key(const u8 *key, u32 keylen, u32 flags,185 struct pkey_apqn *apqns, size_t *nr_apqns);186int pkey_handler_apqns_for_keytype(enum pkey_key_type ktype,187 u8 cur_mkvp[32], u8 alt_mkvp[32], u32 flags,188 struct pkey_apqn *apqns, size_t *nr_apqns);189 190/*191 * Unconditional try to load all handler modules192 */193void pkey_handler_request_modules(void);194 195#endif /* _PKEY_BASE_H_ */196