1512cbf1dSJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2512cbf1dSJens Wiklander /* 3512cbf1dSJens Wiklander * Copyright (c) 2017-2020, Linaro Limited 4512cbf1dSJens Wiklander */ 5512cbf1dSJens Wiklander 6512cbf1dSJens Wiklander #ifndef PKCS11_TA_PROCESSING_H 7512cbf1dSJens Wiklander #define PKCS11_TA_PROCESSING_H 8512cbf1dSJens Wiklander 9512cbf1dSJens Wiklander #include <pkcs11_attributes.h> 10d9af50bcSVesa Jääskeläinen #include <pkcs11_ta.h> 11512cbf1dSJens Wiklander #include <tee_internal_api.h> 12512cbf1dSJens Wiklander 13512cbf1dSJens Wiklander struct pkcs11_client; 14512cbf1dSJens Wiklander struct pkcs11_session; 15512cbf1dSJens Wiklander struct pkcs11_object; 16512cbf1dSJens Wiklander struct active_processing; 17512cbf1dSJens Wiklander 18d9af50bcSVesa Jääskeläinen /** 19d9af50bcSVesa Jääskeläinen * RSA PSS processing context 20d9af50bcSVesa Jääskeläinen * 21d9af50bcSVesa Jääskeläinen * @hash_alg: Hash algorithm mechanism 22d9af50bcSVesa Jääskeläinen * @mgf_type: Mask generator function 23d9af50bcSVesa Jääskeläinen * @salt_len: Length of the salt in bytes 24d9af50bcSVesa Jääskeläinen */ 25d9af50bcSVesa Jääskeläinen struct rsa_pss_processing_ctx { 26d9af50bcSVesa Jääskeläinen enum pkcs11_mechanism_id hash_alg; 27d9af50bcSVesa Jääskeläinen enum pkcs11_mgf_id mgf_type; 28d9af50bcSVesa Jääskeläinen uint32_t salt_len; 29d9af50bcSVesa Jääskeläinen }; 30d9af50bcSVesa Jääskeläinen 31dc8c77fcSVesa Jääskeläinen /** 32dc8c77fcSVesa Jääskeläinen * RSA OAEP processing context 33dc8c77fcSVesa Jääskeläinen * 34dc8c77fcSVesa Jääskeläinen * @hash_alg: Hash algorithm mechanism 35dc8c77fcSVesa Jääskeläinen * @mgf_type: Mask generator function 36dc8c77fcSVesa Jääskeläinen * @source_type: Type of source. 37dc8c77fcSVesa Jääskeläinen * @source_data_len: Length of the source data. 38dc8c77fcSVesa Jääskeläinen * @source_data: Source data. 39dc8c77fcSVesa Jääskeläinen */ 40dc8c77fcSVesa Jääskeläinen struct rsa_oaep_processing_ctx { 41dc8c77fcSVesa Jääskeläinen enum pkcs11_mechanism_id hash_alg; 42dc8c77fcSVesa Jääskeläinen enum pkcs11_mgf_id mgf_type; 43dc8c77fcSVesa Jääskeläinen uint32_t source_type; 44dc8c77fcSVesa Jääskeläinen uint32_t source_data_len; 45dc8c77fcSVesa Jääskeläinen uint8_t source_data[]; 46dc8c77fcSVesa Jääskeläinen }; 47dc8c77fcSVesa Jääskeläinen 48*03e07432SValerii Chubar /** 49*03e07432SValerii Chubar * EDDSA processing context 50*03e07432SValerii Chubar * 51*03e07432SValerii Chubar * @flag: Prehash flag 52*03e07432SValerii Chubar * @ctx_len: Length of the context data 53*03e07432SValerii Chubar * @ctx: Context data 54*03e07432SValerii Chubar */ 55*03e07432SValerii Chubar struct eddsa_processing_ctx { 56*03e07432SValerii Chubar uint32_t flag; 57*03e07432SValerii Chubar uint32_t ctx_len; 58*03e07432SValerii Chubar uint8_t ctx[]; 59*03e07432SValerii Chubar }; 60*03e07432SValerii Chubar 61512cbf1dSJens Wiklander /* 62512cbf1dSJens Wiklander * Entry points from PKCS11 TA invocation commands 63512cbf1dSJens Wiklander */ 64512cbf1dSJens Wiklander 65fa247a2aSRuchika Gupta enum pkcs11_rc entry_generate_secret(struct pkcs11_client *client, 66fa247a2aSRuchika Gupta uint32_t ptypes, TEE_Param *params); 67fa247a2aSRuchika Gupta 68013934d8SVesa Jääskeläinen enum pkcs11_rc entry_generate_key_pair(struct pkcs11_client *client, 69013934d8SVesa Jääskeläinen uint32_t ptypes, TEE_Param *params); 70013934d8SVesa Jääskeläinen 71512cbf1dSJens Wiklander enum pkcs11_rc entry_processing_init(struct pkcs11_client *client, 72512cbf1dSJens Wiklander uint32_t ptypes, TEE_Param *params, 73512cbf1dSJens Wiklander enum processing_func function); 74512cbf1dSJens Wiklander 75512cbf1dSJens Wiklander enum pkcs11_rc entry_processing_step(struct pkcs11_client *client, 76512cbf1dSJens Wiklander uint32_t ptypes, TEE_Param *params, 77512cbf1dSJens Wiklander enum processing_func function, 78512cbf1dSJens Wiklander enum processing_step step); 79512cbf1dSJens Wiklander 804dad6642SRuchika Gupta enum pkcs11_rc entry_processing_key(struct pkcs11_client *client, 814dad6642SRuchika Gupta uint32_t ptypes, TEE_Param *params, 824dad6642SRuchika Gupta enum processing_func function); 8348799892SRuchika Gupta 84eb6141b6SVesa Jääskeläinen enum pkcs11_rc entry_release_active_processing(struct pkcs11_client *client, 85eb6141b6SVesa Jääskeläinen uint32_t ptypes, 86eb6141b6SVesa Jääskeläinen TEE_Param *params); 87eb6141b6SVesa Jääskeläinen 885f80f270SRuchika Gupta enum pkcs11_rc entry_wrap_key(struct pkcs11_client *client, 895f80f270SRuchika Gupta uint32_t ptypes, TEE_Param *params); 905f80f270SRuchika Gupta 91512cbf1dSJens Wiklander /* 92512cbf1dSJens Wiklander * Util 93512cbf1dSJens Wiklander */ 94512cbf1dSJens Wiklander size_t get_object_key_bit_size(struct pkcs11_object *obj); 95512cbf1dSJens Wiklander 96512cbf1dSJens Wiklander void release_active_processing(struct pkcs11_session *session); 97512cbf1dSJens Wiklander 98013934d8SVesa Jääskeläinen enum pkcs11_rc alloc_get_tee_attribute_data(TEE_ObjectHandle tee_obj, 99013934d8SVesa Jääskeläinen uint32_t attribute, 100013934d8SVesa Jääskeläinen void **data, size_t *size); 101013934d8SVesa Jääskeläinen 102013934d8SVesa Jääskeläinen enum pkcs11_rc tee2pkcs_add_attribute(struct obj_attrs **head, 103013934d8SVesa Jääskeläinen uint32_t pkcs11_id, 104013934d8SVesa Jääskeläinen TEE_ObjectHandle tee_obj, 105013934d8SVesa Jääskeläinen uint32_t tee_id); 106013934d8SVesa Jääskeläinen 107fb279d8bSVesa Jääskeläinen /* Asymmetric key operations util */ 108fb279d8bSVesa Jääskeläinen bool processing_is_tee_asymm(uint32_t proc_id); 109fb279d8bSVesa Jääskeläinen 110fb279d8bSVesa Jääskeläinen enum pkcs11_rc init_asymm_operation(struct pkcs11_session *session, 111fb279d8bSVesa Jääskeläinen enum processing_func function, 112fb279d8bSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params, 113fb279d8bSVesa Jääskeläinen struct pkcs11_object *obj); 114fb279d8bSVesa Jääskeläinen 115fb279d8bSVesa Jääskeläinen enum pkcs11_rc step_asymm_operation(struct pkcs11_session *session, 116fb279d8bSVesa Jääskeläinen enum processing_func function, 117fb279d8bSVesa Jääskeläinen enum processing_step step, 118fb279d8bSVesa Jääskeläinen uint32_t ptypes, TEE_Param *params); 119fb279d8bSVesa Jääskeläinen 120512cbf1dSJens Wiklander /* 121512cbf1dSJens Wiklander * Symmetric crypto algorithm specific functions 122512cbf1dSJens Wiklander */ 123512cbf1dSJens Wiklander bool processing_is_tee_symm(uint32_t proc_id); 124512cbf1dSJens Wiklander 125512cbf1dSJens Wiklander enum pkcs11_rc init_symm_operation(struct pkcs11_session *session, 126512cbf1dSJens Wiklander enum processing_func function, 127512cbf1dSJens Wiklander struct pkcs11_attribute_head *proc_params, 128512cbf1dSJens Wiklander struct pkcs11_object *key); 129512cbf1dSJens Wiklander 130512cbf1dSJens Wiklander enum pkcs11_rc step_symm_operation(struct pkcs11_session *session, 131512cbf1dSJens Wiklander enum processing_func function, 132512cbf1dSJens Wiklander enum processing_step step, 133512cbf1dSJens Wiklander uint32_t ptypes, TEE_Param *params); 134512cbf1dSJens Wiklander 135512cbf1dSJens Wiklander enum pkcs11_rc tee_init_ctr_operation(struct active_processing *processing, 136512cbf1dSJens Wiklander void *proc_params, size_t params_size); 13748799892SRuchika Gupta 13848799892SRuchika Gupta enum pkcs11_rc derive_key_by_symm_enc(struct pkcs11_session *session, 1398c499324SRuchika Gupta void **out_buf, uint32_t *out_sz); 14048799892SRuchika Gupta 1415f80f270SRuchika Gupta enum pkcs11_rc wrap_data_by_symm_enc(struct pkcs11_session *session, 1425f80f270SRuchika Gupta void *data, uint32_t data_sz, 1435f80f270SRuchika Gupta void *out_buf, uint32_t *out_sz); 1445f80f270SRuchika Gupta 1453668310bSRuchika Gupta enum pkcs11_rc unwrap_key_by_symm(struct pkcs11_session *session, void *data, 1463668310bSRuchika Gupta uint32_t data_sz, void **out_buf, 1473668310bSRuchika Gupta uint32_t *out_sz); 1483668310bSRuchika Gupta 1499e91a619SVesa Jääskeläinen /* Digest specific functions */ 1509e91a619SVesa Jääskeläinen bool processing_is_tee_digest(enum pkcs11_mechanism_id mecha_id); 1519e91a619SVesa Jääskeläinen 1529e91a619SVesa Jääskeläinen enum pkcs11_rc 1539e91a619SVesa Jääskeläinen init_digest_operation(struct pkcs11_session *session, 1549e91a619SVesa Jääskeläinen struct pkcs11_attribute_head *proc_params); 1559e91a619SVesa Jääskeläinen 1569e91a619SVesa Jääskeläinen enum pkcs11_rc step_digest_operation(struct pkcs11_session *session, 1579e91a619SVesa Jääskeläinen enum processing_step step, 1589e91a619SVesa Jääskeläinen struct pkcs11_object *obj, 1599e91a619SVesa Jääskeläinen uint32_t ptypes, TEE_Param *params); 1609e91a619SVesa Jääskeläinen 16102b16804SVesa Jääskeläinen /* 16202b16804SVesa Jääskeläinen * Elliptic curve crypto algorithm specific functions 16302b16804SVesa Jääskeläinen */ 164fb279d8bSVesa Jääskeläinen enum pkcs11_rc load_tee_ec_key_attrs(TEE_Attribute **tee_attrs, 165fb279d8bSVesa Jääskeläinen size_t *tee_count, 166fb279d8bSVesa Jääskeläinen struct pkcs11_object *obj); 167fb279d8bSVesa Jääskeläinen 168*03e07432SValerii Chubar enum pkcs11_rc load_tee_eddsa_key_attrs(TEE_Attribute **tee_attrs, 169*03e07432SValerii Chubar size_t *tee_count, 170*03e07432SValerii Chubar struct pkcs11_object *obj); 171*03e07432SValerii Chubar 17202b16804SVesa Jääskeläinen size_t ec_params2tee_keysize(void *attr, size_t size); 17302b16804SVesa Jääskeläinen 17402b16804SVesa Jääskeläinen uint32_t ec_params2tee_curve(void *attr, size_t size); 17502b16804SVesa Jääskeläinen 176fb279d8bSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_ecdsa(uint32_t *tee_id, 177fb279d8bSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params, 178fb279d8bSVesa Jääskeläinen struct pkcs11_object *obj); 179fb279d8bSVesa Jääskeläinen 18002b16804SVesa Jääskeläinen enum pkcs11_rc generate_ec_keys(struct pkcs11_attribute_head *proc_params, 18102b16804SVesa Jääskeläinen struct obj_attrs **pub_head, 18202b16804SVesa Jääskeläinen struct obj_attrs **priv_head); 18302b16804SVesa Jääskeläinen 184*03e07432SValerii Chubar enum pkcs11_rc generate_eddsa_keys(struct pkcs11_attribute_head *proc_params, 185*03e07432SValerii Chubar struct obj_attrs **pub_head, 186*03e07432SValerii Chubar struct obj_attrs **priv_head); 187*03e07432SValerii Chubar 188fb279d8bSVesa Jääskeläinen size_t ecdsa_get_input_max_byte_size(TEE_OperationHandle op); 189fb279d8bSVesa Jääskeläinen 19086922832SVesa Jääskeläinen /* 19186922832SVesa Jääskeläinen * RSA crypto algorithm specific functions 19286922832SVesa Jääskeläinen */ 1930442c956SVesa Jääskeläinen enum pkcs11_rc load_tee_rsa_key_attrs(TEE_Attribute **tee_attrs, 1940442c956SVesa Jääskeläinen size_t *tee_count, 1950442c956SVesa Jääskeläinen struct pkcs11_object *obj); 1960442c956SVesa Jääskeläinen 197d9af50bcSVesa Jääskeläinen enum pkcs11_rc 198d9af50bcSVesa Jääskeläinen pkcs2tee_proc_params_rsa_pss(struct active_processing *proc, 199d9af50bcSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params); 200d9af50bcSVesa Jääskeläinen 201d9af50bcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_validate_rsa_pss(struct active_processing *proc, 202d9af50bcSVesa Jääskeläinen struct pkcs11_object *obj); 203d9af50bcSVesa Jääskeläinen 204d9af50bcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_rsa_pss(uint32_t *tee_id, 205d9af50bcSVesa Jääskeläinen struct pkcs11_attribute_head *params); 206d9af50bcSVesa Jääskeläinen 207dc8c77fcSVesa Jääskeläinen enum pkcs11_rc 208dc8c77fcSVesa Jääskeläinen pkcs2tee_proc_params_rsa_oaep(struct active_processing *proc, 209dc8c77fcSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params); 210dc8c77fcSVesa Jääskeläinen 211*03e07432SValerii Chubar enum pkcs11_rc 212*03e07432SValerii Chubar pkcs2tee_proc_params_eddsa(struct active_processing *proc, 213*03e07432SValerii Chubar struct pkcs11_attribute_head *proc_params); 214*03e07432SValerii Chubar 215dc8c77fcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_rsa_oaep(uint32_t *tee_id, uint32_t *tee_hash_id, 216dc8c77fcSVesa Jääskeläinen struct pkcs11_attribute_head *params); 217dc8c77fcSVesa Jääskeläinen 21886922832SVesa Jääskeläinen enum pkcs11_rc generate_rsa_keys(struct pkcs11_attribute_head *proc_params, 21986922832SVesa Jääskeläinen struct obj_attrs **pub_head, 22086922832SVesa Jääskeläinen struct obj_attrs **priv_head); 22186922832SVesa Jääskeläinen 2220442c956SVesa Jääskeläinen size_t rsa_get_input_max_byte_size(TEE_OperationHandle op); 2230442c956SVesa Jääskeläinen 224cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc do_asymm_derivation(struct pkcs11_session *session, 225cc062b46SJorge Ramirez-Ortiz struct pkcs11_attribute_head *proc_params, 226cc062b46SJorge Ramirez-Ortiz struct obj_attrs **head); 227cc062b46SJorge Ramirez-Ortiz 228cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc pkcs2tee_param_ecdh(struct pkcs11_attribute_head *proc_params, 229cc062b46SJorge Ramirez-Ortiz void **pub_data, size_t *pub_size); 230cc062b46SJorge Ramirez-Ortiz 231cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc pkcs2tee_algo_ecdh(uint32_t *tee_id, 232cc062b46SJorge Ramirez-Ortiz struct pkcs11_attribute_head *proc_params, 233cc062b46SJorge Ramirez-Ortiz struct pkcs11_object *obj); 234cc062b46SJorge Ramirez-Ortiz 235512cbf1dSJens Wiklander #endif /*PKCS11_TA_PROCESSING_H*/ 236