1*63f89caaSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2*63f89caaSJens Wiklander /* 3*63f89caaSJens Wiklander * Copyright (c) 2017-2020, Linaro Limited 4*63f89caaSJens Wiklander */ 5*63f89caaSJens Wiklander 6*63f89caaSJens Wiklander #ifndef PKCS11_TA_ATTRIBUTES_H 7*63f89caaSJens Wiklander #define PKCS11_TA_ATTRIBUTES_H 8*63f89caaSJens Wiklander 9*63f89caaSJens Wiklander #include <stdbool.h> 10*63f89caaSJens Wiklander #include <stddef.h> 11*63f89caaSJens Wiklander #include <stdint.h> 12*63f89caaSJens Wiklander #include <util.h> 13*63f89caaSJens Wiklander 14*63f89caaSJens Wiklander #include "pkcs11_helpers.h" 15*63f89caaSJens Wiklander 16*63f89caaSJens Wiklander /* 17*63f89caaSJens Wiklander * Boolean property attributes (BPA): bit position in a 64 bit mask 18*63f89caaSJens Wiklander * for boolean properties object can mandate as attribute, depending 19*63f89caaSJens Wiklander * on the object. These attributes are often accessed and it is 20*63f89caaSJens Wiklander * quicker to get them from a 64 bit field in the object instance 21*63f89caaSJens Wiklander * rather than searching into the object attributes. 22*63f89caaSJens Wiklander */ 23*63f89caaSJens Wiklander #define PKCS11_BOOLPROPS_BASE 0 24*63f89caaSJens Wiklander #define PKCS11_BOOLPROPS_MAX_COUNT 64 25*63f89caaSJens Wiklander 26*63f89caaSJens Wiklander enum boolprop_attr { 27*63f89caaSJens Wiklander BPA_TOKEN = 0, 28*63f89caaSJens Wiklander BPA_PRIVATE, 29*63f89caaSJens Wiklander BPA_TRUSTED, 30*63f89caaSJens Wiklander BPA_SENSITIVE, 31*63f89caaSJens Wiklander BPA_ENCRYPT, 32*63f89caaSJens Wiklander BPA_DECRYPT, 33*63f89caaSJens Wiklander BPA_WRAP, 34*63f89caaSJens Wiklander BPA_UNWRAP, 35*63f89caaSJens Wiklander BPA_SIGN, 36*63f89caaSJens Wiklander BPA_SIGN_RECOVER, 37*63f89caaSJens Wiklander BPA_VERIFY, 38*63f89caaSJens Wiklander BPA_VERIFY_RECOVER, 39*63f89caaSJens Wiklander BPA_DERIVE, 40*63f89caaSJens Wiklander BPA_EXTRACTABLE, 41*63f89caaSJens Wiklander BPA_LOCAL, 42*63f89caaSJens Wiklander BPA_NEVER_EXTRACTABLE, 43*63f89caaSJens Wiklander BPA_ALWAYS_SENSITIVE, 44*63f89caaSJens Wiklander BPA_MODIFIABLE, 45*63f89caaSJens Wiklander BPA_COPYABLE, 46*63f89caaSJens Wiklander BPA_DESTROYABLE, 47*63f89caaSJens Wiklander BPA_ALWAYS_AUTHENTICATE, 48*63f89caaSJens Wiklander BPA_WRAP_WITH_TRUSTED, 49*63f89caaSJens Wiklander }; 50*63f89caaSJens Wiklander 51*63f89caaSJens Wiklander /* 52*63f89caaSJens Wiklander * Header of a serialized memory object inside PKCS11 TA. 53*63f89caaSJens Wiklander * 54*63f89caaSJens Wiklander * @attrs_size: byte size of the serialized data 55*63f89caaSJens Wiklander * @attrs_count: number of items in the blob 56*63f89caaSJens Wiklander * @attrs: then starts the blob binary data 57*63f89caaSJens Wiklander */ 58*63f89caaSJens Wiklander struct obj_attrs { 59*63f89caaSJens Wiklander uint32_t attrs_size; 60*63f89caaSJens Wiklander uint32_t attrs_count; 61*63f89caaSJens Wiklander uint8_t attrs[]; 62*63f89caaSJens Wiklander }; 63*63f89caaSJens Wiklander 64*63f89caaSJens Wiklander /* 65*63f89caaSJens Wiklander * init_attributes_head() - Allocate a reference for serialized attributes 66*63f89caaSJens Wiklander * @head: *@head holds the retrieved pointer 67*63f89caaSJens Wiklander * 68*63f89caaSJens Wiklander * Retrieved pointer can be freed from a simple TEE_Free(reference). 69*63f89caaSJens Wiklander * 70*63f89caaSJens Wiklander * Return a PKCS11_OK on success or a PKCS11 return code. 71*63f89caaSJens Wiklander */ 72*63f89caaSJens Wiklander enum pkcs11_rc init_attributes_head(struct obj_attrs **head); 73*63f89caaSJens Wiklander 74*63f89caaSJens Wiklander /* 75*63f89caaSJens Wiklander * add_attribute() - Update serialized attributes to add an entry. 76*63f89caaSJens Wiklander * 77*63f89caaSJens Wiklander * @head: *@head points to serialized attributes, 78*63f89caaSJens Wiklander * can be reallocated as attributes are added 79*63f89caaSJens Wiklander * @attribute: Attribute ID to add 80*63f89caaSJens Wiklander * @data: Opaque data of attribute 81*63f89caaSJens Wiklander * @size: Size of data 82*63f89caaSJens Wiklander * 83*63f89caaSJens Wiklander * Return a PKCS11_OK on success or a PKCS11 return code. 84*63f89caaSJens Wiklander */ 85*63f89caaSJens Wiklander enum pkcs11_rc add_attribute(struct obj_attrs **head, uint32_t attribute, 86*63f89caaSJens Wiklander void *data, size_t size); 87*63f89caaSJens Wiklander 88*63f89caaSJens Wiklander /* 89*63f89caaSJens Wiklander * get_attribute_ptrs() - Get pointers to attributes with a given ID 90*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 91*63f89caaSJens Wiklander * @attribute: Attribute ID to look for 92*63f89caaSJens Wiklander * @attr: Array of pointers to the data inside @head 93*63f89caaSJens Wiklander * @attr_size: Array of uint32_t holding the sizes of each value pointed to 94*63f89caaSJens Wiklander * by @attr 95*63f89caaSJens Wiklander * @count: Number of elements in the arrays above 96*63f89caaSJens Wiklander * 97*63f89caaSJens Wiklander * If *count == 0, count and return in *count the number of attributes matching 98*63f89caaSJens Wiklander * the input attribute ID. 99*63f89caaSJens Wiklander * 100*63f89caaSJens Wiklander * If *count != 0, return the address and size of the attributes found, up to 101*63f89caaSJens Wiklander * the occurrence number *count. attr and attr_size are expected large 102*63f89caaSJens Wiklander * enough. attr is the output array of the values found. attr_size is the 103*63f89caaSJens Wiklander * output array of the size of each value found. 104*63f89caaSJens Wiklander * 105*63f89caaSJens Wiklander * If attr_size != NULL, return in *attr_size attribute value size. 106*63f89caaSJens Wiklander * If attr != NULL return in *attr the address of the attribute value. 107*63f89caaSJens Wiklander */ 108*63f89caaSJens Wiklander void get_attribute_ptrs(struct obj_attrs *head, uint32_t attribute, 109*63f89caaSJens Wiklander void **attr, uint32_t *attr_size, size_t *count); 110*63f89caaSJens Wiklander 111*63f89caaSJens Wiklander /* 112*63f89caaSJens Wiklander * get_attribute_ptrs() - Get pointer to the attribute of a given ID 113*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 114*63f89caaSJens Wiklander * @attribute: Attribute ID 115*63f89caaSJens Wiklander * @attr: *@attr holds the retrieved pointer to the attribute value 116*63f89caaSJens Wiklander * @attr_size: Size of the attribute value 117*63f89caaSJens Wiklander * 118*63f89caaSJens Wiklander * If no matching attributes is found return PKCS11_RV_NOT_FOUND. 119*63f89caaSJens Wiklander * If attr_size != NULL, return in *attr_size attribute value size. 120*63f89caaSJens Wiklander * If attr != NULL, return in *attr the address of the attribute value. 121*63f89caaSJens Wiklander * 122*63f89caaSJens Wiklander * Return a PKCS11_OK or PKCS11_RV_NOT_FOUND on success, or a PKCS11 return 123*63f89caaSJens Wiklander * code. 124*63f89caaSJens Wiklander */ 125*63f89caaSJens Wiklander enum pkcs11_rc get_attribute_ptr(struct obj_attrs *head, uint32_t attribute, 126*63f89caaSJens Wiklander void **attr_ptr, uint32_t *attr_size); 127*63f89caaSJens Wiklander /* 128*63f89caaSJens Wiklander * get_attribute() - Copy out the attribute of a given ID 129*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 130*63f89caaSJens Wiklander * @attribute: Attribute ID to look for 131*63f89caaSJens Wiklander * @attr: holds the retrieved attribute value 132*63f89caaSJens Wiklander * @attr_size: Size of the attribute value 133*63f89caaSJens Wiklander * 134*63f89caaSJens Wiklander * If attribute is not found, return PKCS11_RV_NOT_FOUND. 135*63f89caaSJens Wiklander * If attr_size != NULL, check *attr_size matches attributes size and return 136*63f89caaSJens Wiklander * PKCS11_CKR_BUFFER_TOO_SMALL with expected size in *attr_size. 137*63f89caaSJens Wiklander * If attr != NULL and attr_size is NULL or gives expected buffer size, 138*63f89caaSJens Wiklander * copy attribute value into attr. 139*63f89caaSJens Wiklander * 140*63f89caaSJens Wiklander * Return a PKCS11_OK or PKCS11_RV_NOT_FOUND on success, or a PKCS11 return 141*63f89caaSJens Wiklander * code. 142*63f89caaSJens Wiklander */ 143*63f89caaSJens Wiklander enum pkcs11_rc get_attribute(struct obj_attrs *head, uint32_t attribute, 144*63f89caaSJens Wiklander void *attr, uint32_t *attr_size); 145*63f89caaSJens Wiklander 146*63f89caaSJens Wiklander /* 147*63f89caaSJens Wiklander * get_u32_attribute() - Copy out the 32-bit attribute value of a given ID 148*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 149*63f89caaSJens Wiklander * @attribute: Attribute ID 150*63f89caaSJens Wiklander * @attr: holds the retrieved 32-bit attribute value 151*63f89caaSJens Wiklander * 152*63f89caaSJens Wiklander * If attribute is not found, return PKCS11_RV_NOT_FOUND. 153*63f89caaSJens Wiklander * If the retreived attribute doesn't have a 4 byte sized value 154*63f89caaSJens Wiklander * PKCS11_CKR_GENERAL_ERROR is returned. 155*63f89caaSJens Wiklander * 156*63f89caaSJens Wiklander * Return a PKCS11_OK or PKCS11_RV_NOT_FOUND on success, or a PKCS11 return 157*63f89caaSJens Wiklander * code. 158*63f89caaSJens Wiklander */ 159*63f89caaSJens Wiklander 160*63f89caaSJens Wiklander static inline enum pkcs11_rc get_u32_attribute(struct obj_attrs *head, 161*63f89caaSJens Wiklander uint32_t attribute, 162*63f89caaSJens Wiklander uint32_t *attr) 163*63f89caaSJens Wiklander { 164*63f89caaSJens Wiklander uint32_t size = sizeof(uint32_t); 165*63f89caaSJens Wiklander enum pkcs11_rc rc = get_attribute(head, attribute, attr, &size); 166*63f89caaSJens Wiklander 167*63f89caaSJens Wiklander if (!rc && size != sizeof(uint32_t)) 168*63f89caaSJens Wiklander return PKCS11_CKR_GENERAL_ERROR; 169*63f89caaSJens Wiklander 170*63f89caaSJens Wiklander return rc; 171*63f89caaSJens Wiklander } 172*63f89caaSJens Wiklander 173*63f89caaSJens Wiklander /* 174*63f89caaSJens Wiklander * get_class() - Get class ID of an object 175*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 176*63f89caaSJens Wiklander * 177*63f89caaSJens Wiklander * Returns the class ID of an object on succes or returns 178*63f89caaSJens Wiklander * PKCS11_CKO_UNDEFINED_ID on error. 179*63f89caaSJens Wiklander */ 180*63f89caaSJens Wiklander static inline enum pkcs11_class_id get_class(struct obj_attrs *head) 181*63f89caaSJens Wiklander { 182*63f89caaSJens Wiklander uint32_t class = 0; 183*63f89caaSJens Wiklander uint32_t size = sizeof(class); 184*63f89caaSJens Wiklander 185*63f89caaSJens Wiklander if (get_attribute(head, PKCS11_CKA_CLASS, &class, &size)) 186*63f89caaSJens Wiklander return PKCS11_CKO_UNDEFINED_ID; 187*63f89caaSJens Wiklander 188*63f89caaSJens Wiklander return class; 189*63f89caaSJens Wiklander } 190*63f89caaSJens Wiklander 191*63f89caaSJens Wiklander /* 192*63f89caaSJens Wiklander * get_key_type() - Get the key type of an object 193*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 194*63f89caaSJens Wiklander * 195*63f89caaSJens Wiklander * Returns the key type of an object on success or returns 196*63f89caaSJens Wiklander * PKCS11_CKK_UNDEFINED_ID on error. 197*63f89caaSJens Wiklander */ 198*63f89caaSJens Wiklander static inline enum pkcs11_key_type get_key_type(struct obj_attrs *head) 199*63f89caaSJens Wiklander { 200*63f89caaSJens Wiklander uint32_t type = 0; 201*63f89caaSJens Wiklander uint32_t size = sizeof(type); 202*63f89caaSJens Wiklander 203*63f89caaSJens Wiklander if (get_attribute(head, PKCS11_CKA_KEY_TYPE, &type, &size)) 204*63f89caaSJens Wiklander return PKCS11_CKK_UNDEFINED_ID; 205*63f89caaSJens Wiklander 206*63f89caaSJens Wiklander return type; 207*63f89caaSJens Wiklander } 208*63f89caaSJens Wiklander 209*63f89caaSJens Wiklander /* 210*63f89caaSJens Wiklander * get_mechanism_type() - Get the mechanism type of an object 211*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 212*63f89caaSJens Wiklander * 213*63f89caaSJens Wiklander * Returns the mechanism type of an object on success or returns 214*63f89caaSJens Wiklander * PKCS11_CKM_UNDEFINED_ID on error. 215*63f89caaSJens Wiklander */ 216*63f89caaSJens Wiklander static inline enum pkcs11_mechanism_id get_mechanism_type(struct obj_attrs *head) 217*63f89caaSJens Wiklander { 218*63f89caaSJens Wiklander uint32_t type = 0; 219*63f89caaSJens Wiklander uint32_t size = sizeof(type); 220*63f89caaSJens Wiklander 221*63f89caaSJens Wiklander if (get_attribute(head, PKCS11_CKA_MECHANISM_TYPE, &type, &size)) 222*63f89caaSJens Wiklander return PKCS11_CKM_UNDEFINED_ID; 223*63f89caaSJens Wiklander 224*63f89caaSJens Wiklander return type; 225*63f89caaSJens Wiklander } 226*63f89caaSJens Wiklander 227*63f89caaSJens Wiklander /* 228*63f89caaSJens Wiklander * get_bool() - Get the bool value of an attribute 229*63f89caaSJens Wiklander * @head: Pointer to serialized attributes 230*63f89caaSJens Wiklander * @attribute: Attribute ID to look for 231*63f89caaSJens Wiklander * 232*63f89caaSJens Wiklander * May assert if attribute ID isn't of the boolean type. 233*63f89caaSJens Wiklander * 234*63f89caaSJens Wiklander * Returns the bool value of the supplied attribute ID on success if found 235*63f89caaSJens Wiklander * else false. 236*63f89caaSJens Wiklander */ 237*63f89caaSJens Wiklander bool get_bool(struct obj_attrs *head, uint32_t attribute); 238*63f89caaSJens Wiklander 239*63f89caaSJens Wiklander #if CFG_TEE_TA_LOG_LEVEL > 0 240*63f89caaSJens Wiklander /* Debug: dump object attributes to IMSG() trace console */ 241*63f89caaSJens Wiklander void trace_attributes(const char *prefix, void *ref); 242*63f89caaSJens Wiklander #else 243*63f89caaSJens Wiklander static inline void trace_attributes(const char *prefix __unused, 244*63f89caaSJens Wiklander void *ref __unused) 245*63f89caaSJens Wiklander { 246*63f89caaSJens Wiklander } 247*63f89caaSJens Wiklander #endif /*CFG_TEE_TA_LOG_LEVEL*/ 248*63f89caaSJens Wiklander #endif /*PKCS11_TA_ATTRIBUTES_H*/ 249