1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Copyright (c) 2018-2020, Linaro Limited 4 */ 5 6 #ifndef PKCS11_HELPERS_H 7 #define PKCS11_HELPERS_H 8 9 #include <pkcs11_ta.h> 10 #include <stdint.h> 11 #include <stddef.h> 12 #include <tee_internal_api.h> 13 14 #include <pkcs11_attributes.h> 15 #include <token_capabilities.h> 16 17 struct pkcs11_object; 18 19 /* 20 * TEE invocation parameter#0 is an in/out buffer of at least 32bit 21 * to store the TA PKCS#11 compliant return value. 22 */ 23 #define TEE_PARAM0_SIZE_MIN sizeof(uint32_t) 24 25 /* GPD TEE to PKCS11 status conversion */ 26 enum pkcs11_rc tee2pkcs_error(TEE_Result res); 27 28 /* 29 * Return true if and only if attribute ID with companion attribute value 30 * size do match a valid attribute identifier. 31 * 32 * @attribute_id - Target PKCS11 attribute ID 33 * @size - Byte size of the attribute value, 0 if non-constant size 34 */ 35 bool valid_pkcs11_attribute_id(uint32_t attribute_id, uint32_t size); 36 37 /* 38 * Return type attribute byte size if @attribute_id is the ID of a type 39 * attribute or 0 if not. 40 */ 41 size_t pkcs11_attr_is_type(uint32_t attribute_id); 42 43 /* Return true if the attribute has indirect attributes */ 44 bool pkcs11_attr_has_indirect_attributes(uint32_t attribute_id); 45 46 /* Return true if the object class is related to a type-in-class */ 47 bool pkcs11_class_has_type(uint32_t class_id); 48 49 /* Return true if the object class relates to a key */ 50 bool pkcs11_attr_class_is_key(uint32_t class_id); 51 52 /* Return true if the key type @key_type_id relates to a symmetric key */ 53 bool key_type_is_symm_key(uint32_t key_type_id); 54 55 /* Return true if the key type @key_type_id relates to an asymmetric key */ 56 bool key_type_is_asymm_key(uint32_t key_type_id); 57 58 /* Boolprop flag shift position if @attribute_id is boolean, else -1 */ 59 int pkcs11_attr2boolprop_shift(uint32_t attribute_id); 60 61 /* Convert PKCS11 TA function ID into a TEE crypto operation mode */ 62 void pkcs2tee_mode(uint32_t *tee_id, enum processing_func function); 63 64 /* Load TEE operation attributes from a PKCS11 object, return false on error */ 65 bool pkcs2tee_load_attr(TEE_Attribute *tee_ref, uint32_t tee_id, 66 struct pkcs11_object *obj, 67 enum pkcs11_attr_id pkcs11_id); 68 69 /* Hash and load TEE operation attributes from a PKCS11 object */ 70 enum pkcs11_rc pkcs2tee_load_hashed_attr(TEE_Attribute *tee_ref, 71 uint32_t tee_id, 72 struct pkcs11_object *obj, 73 enum pkcs11_attr_id pkcs11_id, 74 uint32_t tee_algo, void *hash_ptr, 75 uint32_t *hash_size); 76 77 /* Return true if attribute is a boolean, false otherwise */ 78 static inline bool pkcs11_attr_is_boolean(enum pkcs11_attr_id id) 79 { 80 return pkcs11_attr2boolprop_shift(id) >= 0; 81 } 82 83 #if CFG_TEE_TA_LOG_LEVEL > 0 84 /* Id-to-string conversions only for trace support */ 85 const char *id2str_ta_cmd(uint32_t id); 86 const char *id2str_rc(uint32_t id); 87 const char *id2str_slot_flag(uint32_t id); 88 const char *id2str_token_flag(uint32_t id); 89 const char *id2str_session_flag(uint32_t id); 90 const char *id2str_session_state(uint32_t id); 91 const char *id2str_attr(uint32_t id); 92 const char *id2str_class(uint32_t id); 93 const char *id2str_type(uint32_t id, uint32_t class); 94 const char *id2str_key_type(uint32_t id); 95 const char *id2str_certificate_type(uint32_t id); 96 const char *id2str_attr_value(uint32_t id, size_t size, void *value); 97 const char *id2str_proc(uint32_t id); 98 const char *id2str_function(uint32_t id); 99 100 static inline const char *id2str_mechanism(enum pkcs11_mechanism_id id) 101 { 102 return mechanism_string_id(id); 103 } 104 #endif /* CFG_TEE_TA_LOG_LEVEL > 0 */ 105 #endif /*PKCS11_HELPERS_H*/ 106