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 4803e07432SValerii Chubar /** 4945d40bdaSValerii Chubar * RSA AES key wrap processing context 5045d40bdaSValerii Chubar * 5145d40bdaSValerii Chubar * @hash_alg: Hash algorithm mechanism 5245d40bdaSValerii Chubar * @mgf_type: Mask generator function 5345d40bdaSValerii Chubar * @aes_key_bits: Length of AES key in bits 5445d40bdaSValerii Chubar * @source_type: Type of source. 5545d40bdaSValerii Chubar * @source_data_len: Length of the source data. 5645d40bdaSValerii Chubar * @source_data: Source data. 5745d40bdaSValerii Chubar */ 5845d40bdaSValerii Chubar struct rsa_aes_key_wrap_processing_ctx { 5945d40bdaSValerii Chubar enum pkcs11_mechanism_id hash_alg; 6045d40bdaSValerii Chubar enum pkcs11_mgf_id mgf_type; 6145d40bdaSValerii Chubar uint32_t aes_key_bits; 6245d40bdaSValerii Chubar uint32_t source_type; 6345d40bdaSValerii Chubar uint32_t source_data_len; 6445d40bdaSValerii Chubar uint8_t source_data[]; 6545d40bdaSValerii Chubar }; 6645d40bdaSValerii Chubar 6745d40bdaSValerii Chubar /** 6803e07432SValerii Chubar * EDDSA processing context 6903e07432SValerii Chubar * 7003e07432SValerii Chubar * @flag: Prehash flag 7103e07432SValerii Chubar * @ctx_len: Length of the context data 7203e07432SValerii Chubar * @ctx: Context data 7303e07432SValerii Chubar */ 7403e07432SValerii Chubar struct eddsa_processing_ctx { 7503e07432SValerii Chubar uint32_t flag; 7603e07432SValerii Chubar uint32_t ctx_len; 7703e07432SValerii Chubar uint8_t ctx[]; 7803e07432SValerii Chubar }; 7903e07432SValerii Chubar 80512cbf1dSJens Wiklander /* 81512cbf1dSJens Wiklander * Entry points from PKCS11 TA invocation commands 82512cbf1dSJens Wiklander */ 83512cbf1dSJens Wiklander 84fa247a2aSRuchika Gupta enum pkcs11_rc entry_generate_secret(struct pkcs11_client *client, 85fa247a2aSRuchika Gupta uint32_t ptypes, TEE_Param *params); 86fa247a2aSRuchika Gupta 87013934d8SVesa Jääskeläinen enum pkcs11_rc entry_generate_key_pair(struct pkcs11_client *client, 88013934d8SVesa Jääskeläinen uint32_t ptypes, TEE_Param *params); 89013934d8SVesa Jääskeläinen 90512cbf1dSJens Wiklander enum pkcs11_rc entry_processing_init(struct pkcs11_client *client, 91512cbf1dSJens Wiklander uint32_t ptypes, TEE_Param *params, 92512cbf1dSJens Wiklander enum processing_func function); 93512cbf1dSJens Wiklander 94512cbf1dSJens Wiklander enum pkcs11_rc entry_processing_step(struct pkcs11_client *client, 95512cbf1dSJens Wiklander uint32_t ptypes, TEE_Param *params, 96512cbf1dSJens Wiklander enum processing_func function, 97512cbf1dSJens Wiklander enum processing_step step); 98512cbf1dSJens Wiklander 994dad6642SRuchika Gupta enum pkcs11_rc entry_processing_key(struct pkcs11_client *client, 1004dad6642SRuchika Gupta uint32_t ptypes, TEE_Param *params, 1014dad6642SRuchika Gupta enum processing_func function); 10248799892SRuchika Gupta 103eb6141b6SVesa Jääskeläinen enum pkcs11_rc entry_release_active_processing(struct pkcs11_client *client, 104eb6141b6SVesa Jääskeläinen uint32_t ptypes, 105eb6141b6SVesa Jääskeläinen TEE_Param *params); 106eb6141b6SVesa Jääskeläinen 1075f80f270SRuchika Gupta enum pkcs11_rc entry_wrap_key(struct pkcs11_client *client, 1085f80f270SRuchika Gupta uint32_t ptypes, TEE_Param *params); 1095f80f270SRuchika Gupta 110512cbf1dSJens Wiklander /* 111512cbf1dSJens Wiklander * Util 112512cbf1dSJens Wiklander */ 113512cbf1dSJens Wiklander size_t get_object_key_bit_size(struct pkcs11_object *obj); 114512cbf1dSJens Wiklander 115512cbf1dSJens Wiklander void release_active_processing(struct pkcs11_session *session); 116512cbf1dSJens Wiklander 117013934d8SVesa Jääskeläinen enum pkcs11_rc alloc_get_tee_attribute_data(TEE_ObjectHandle tee_obj, 118013934d8SVesa Jääskeläinen uint32_t attribute, 119013934d8SVesa Jääskeläinen void **data, size_t *size); 120013934d8SVesa Jääskeläinen 121013934d8SVesa Jääskeläinen enum pkcs11_rc tee2pkcs_add_attribute(struct obj_attrs **head, 122013934d8SVesa Jääskeläinen uint32_t pkcs11_id, 123013934d8SVesa Jääskeläinen TEE_ObjectHandle tee_obj, 124013934d8SVesa Jääskeläinen uint32_t tee_id); 125013934d8SVesa Jääskeläinen 126fb279d8bSVesa Jääskeläinen /* Asymmetric key operations util */ 127fb279d8bSVesa Jääskeläinen bool processing_is_tee_asymm(uint32_t proc_id); 128fb279d8bSVesa Jääskeläinen 129fb279d8bSVesa Jääskeläinen enum pkcs11_rc init_asymm_operation(struct pkcs11_session *session, 130fb279d8bSVesa Jääskeläinen enum processing_func function, 131fb279d8bSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params, 132fb279d8bSVesa Jääskeläinen struct pkcs11_object *obj); 133fb279d8bSVesa Jääskeläinen 134fb279d8bSVesa Jääskeläinen enum pkcs11_rc step_asymm_operation(struct pkcs11_session *session, 135fb279d8bSVesa Jääskeläinen enum processing_func function, 136fb279d8bSVesa Jääskeläinen enum processing_step step, 137fb279d8bSVesa Jääskeläinen uint32_t ptypes, TEE_Param *params); 138fb279d8bSVesa Jääskeläinen 13945d40bdaSValerii Chubar enum pkcs11_rc wrap_data_by_asymm_enc(struct pkcs11_session *session, 14045d40bdaSValerii Chubar void *data, uint32_t data_sz, 14145d40bdaSValerii Chubar void *out_buf, uint32_t *out_sz); 14245d40bdaSValerii Chubar 14345d40bdaSValerii Chubar enum pkcs11_rc unwrap_key_by_asymm(struct pkcs11_session *session, void *data, 14445d40bdaSValerii Chubar uint32_t data_sz, void **out_buf, 14545d40bdaSValerii Chubar uint32_t *out_sz); 14645d40bdaSValerii Chubar 147512cbf1dSJens Wiklander /* 148512cbf1dSJens Wiklander * Symmetric crypto algorithm specific functions 149512cbf1dSJens Wiklander */ 1505d6b6c79SJose Quaresma bool processing_is_tee_symm(enum pkcs11_mechanism_id proc_id); 151512cbf1dSJens Wiklander 152512cbf1dSJens Wiklander enum pkcs11_rc init_symm_operation(struct pkcs11_session *session, 153512cbf1dSJens Wiklander enum processing_func function, 154512cbf1dSJens Wiklander struct pkcs11_attribute_head *proc_params, 155512cbf1dSJens Wiklander struct pkcs11_object *key); 156512cbf1dSJens Wiklander 157512cbf1dSJens Wiklander enum pkcs11_rc step_symm_operation(struct pkcs11_session *session, 158512cbf1dSJens Wiklander enum processing_func function, 159512cbf1dSJens Wiklander enum processing_step step, 160512cbf1dSJens Wiklander uint32_t ptypes, TEE_Param *params); 161512cbf1dSJens Wiklander 162512cbf1dSJens Wiklander enum pkcs11_rc tee_init_ctr_operation(struct active_processing *processing, 163512cbf1dSJens Wiklander void *proc_params, size_t params_size); 16448799892SRuchika Gupta 16548799892SRuchika Gupta enum pkcs11_rc derive_key_by_symm_enc(struct pkcs11_session *session, 1668c499324SRuchika Gupta void **out_buf, uint32_t *out_sz); 16748799892SRuchika Gupta 1685f80f270SRuchika Gupta enum pkcs11_rc wrap_data_by_symm_enc(struct pkcs11_session *session, 1695f80f270SRuchika Gupta void *data, uint32_t data_sz, 1705f80f270SRuchika Gupta void *out_buf, uint32_t *out_sz); 1715f80f270SRuchika Gupta 1723668310bSRuchika Gupta enum pkcs11_rc unwrap_key_by_symm(struct pkcs11_session *session, void *data, 1733668310bSRuchika Gupta uint32_t data_sz, void **out_buf, 1743668310bSRuchika Gupta uint32_t *out_sz); 1753668310bSRuchika Gupta 17663778faaSEtienne Carriere enum pkcs11_rc tee_ae_decrypt_update(struct pkcs11_session *session, 17763778faaSEtienne Carriere void *in, size_t in_size); 17863778faaSEtienne Carriere 17963778faaSEtienne Carriere enum pkcs11_rc tee_ae_decrypt_final(struct pkcs11_session *session, 18063778faaSEtienne Carriere void *out, size_t *out_size); 18163778faaSEtienne Carriere 18263778faaSEtienne Carriere enum pkcs11_rc tee_ae_encrypt_final(struct pkcs11_session *session, 18363778faaSEtienne Carriere void *out, size_t *out_size); 18463778faaSEtienne Carriere 18563778faaSEtienne Carriere void tee_release_gcm_operation(struct pkcs11_session *session); 18663778faaSEtienne Carriere 18763778faaSEtienne Carriere enum pkcs11_rc tee_init_gcm_operation(struct pkcs11_session *session, 18863778faaSEtienne Carriere void *proc_params, size_t params_size); 18963778faaSEtienne Carriere 19063778faaSEtienne Carriere enum pkcs11_rc tee_ae_reinit_gcm_operation(struct pkcs11_session *session); 19163778faaSEtienne Carriere 1929e91a619SVesa Jääskeläinen /* Digest specific functions */ 1939e91a619SVesa Jääskeläinen bool processing_is_tee_digest(enum pkcs11_mechanism_id mecha_id); 1949e91a619SVesa Jääskeläinen 1959e91a619SVesa Jääskeläinen enum pkcs11_rc 1969e91a619SVesa Jääskeläinen init_digest_operation(struct pkcs11_session *session, 1979e91a619SVesa Jääskeläinen struct pkcs11_attribute_head *proc_params); 1989e91a619SVesa Jääskeläinen 1999e91a619SVesa Jääskeläinen enum pkcs11_rc step_digest_operation(struct pkcs11_session *session, 2009e91a619SVesa Jääskeläinen enum processing_step step, 2019e91a619SVesa Jääskeläinen struct pkcs11_object *obj, 2029e91a619SVesa Jääskeläinen uint32_t ptypes, TEE_Param *params); 2039e91a619SVesa Jääskeläinen 20402b16804SVesa Jääskeläinen /* 20502b16804SVesa Jääskeläinen * Elliptic curve crypto algorithm specific functions 20602b16804SVesa Jääskeläinen */ 207fb279d8bSVesa Jääskeläinen enum pkcs11_rc load_tee_ec_key_attrs(TEE_Attribute **tee_attrs, 208fb279d8bSVesa Jääskeläinen size_t *tee_count, 209fb279d8bSVesa Jääskeläinen struct pkcs11_object *obj); 210fb279d8bSVesa Jääskeläinen 21103e07432SValerii Chubar enum pkcs11_rc load_tee_eddsa_key_attrs(TEE_Attribute **tee_attrs, 21203e07432SValerii Chubar size_t *tee_count, 21303e07432SValerii Chubar struct pkcs11_object *obj); 21403e07432SValerii Chubar 21502b16804SVesa Jääskeläinen size_t ec_params2tee_keysize(void *attr, size_t size); 21602b16804SVesa Jääskeläinen 21702b16804SVesa Jääskeläinen uint32_t ec_params2tee_curve(void *attr, size_t size); 21802b16804SVesa Jääskeläinen 219fb279d8bSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_ecdsa(uint32_t *tee_id, 220fb279d8bSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params, 221fb279d8bSVesa Jääskeläinen struct pkcs11_object *obj); 222fb279d8bSVesa Jääskeläinen 22302b16804SVesa Jääskeläinen enum pkcs11_rc generate_ec_keys(struct pkcs11_attribute_head *proc_params, 22402b16804SVesa Jääskeläinen struct obj_attrs **pub_head, 22502b16804SVesa Jääskeläinen struct obj_attrs **priv_head); 22602b16804SVesa Jääskeläinen 22703e07432SValerii Chubar enum pkcs11_rc generate_eddsa_keys(struct pkcs11_attribute_head *proc_params, 22803e07432SValerii Chubar struct obj_attrs **pub_head, 22903e07432SValerii Chubar struct obj_attrs **priv_head); 23003e07432SValerii Chubar 231fb279d8bSVesa Jääskeläinen size_t ecdsa_get_input_max_byte_size(TEE_OperationHandle op); 232fb279d8bSVesa Jääskeläinen 23386922832SVesa Jääskeläinen /* 23486922832SVesa Jääskeläinen * RSA crypto algorithm specific functions 23586922832SVesa Jääskeläinen */ 2360442c956SVesa Jääskeläinen enum pkcs11_rc load_tee_rsa_key_attrs(TEE_Attribute **tee_attrs, 2370442c956SVesa Jääskeläinen size_t *tee_count, 2380442c956SVesa Jääskeläinen struct pkcs11_object *obj); 2390442c956SVesa Jääskeläinen 240d9af50bcSVesa Jääskeläinen enum pkcs11_rc 241d9af50bcSVesa Jääskeläinen pkcs2tee_proc_params_rsa_pss(struct active_processing *proc, 242d9af50bcSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params); 243d9af50bcSVesa Jääskeläinen 244d9af50bcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_validate_rsa_pss(struct active_processing *proc, 245d9af50bcSVesa Jääskeläinen struct pkcs11_object *obj); 246d9af50bcSVesa Jääskeläinen 247d9af50bcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_rsa_pss(uint32_t *tee_id, 248d9af50bcSVesa Jääskeläinen struct pkcs11_attribute_head *params); 249d9af50bcSVesa Jääskeläinen 250dc8c77fcSVesa Jääskeläinen enum pkcs11_rc 251dc8c77fcSVesa Jääskeläinen pkcs2tee_proc_params_rsa_oaep(struct active_processing *proc, 252dc8c77fcSVesa Jääskeläinen struct pkcs11_attribute_head *proc_params); 253dc8c77fcSVesa Jääskeläinen 25403e07432SValerii Chubar enum pkcs11_rc 25545d40bdaSValerii Chubar pkcs2tee_proc_params_rsa_aes_wrap(struct active_processing *proc, 25645d40bdaSValerii Chubar struct pkcs11_attribute_head *proc_params); 25745d40bdaSValerii Chubar 25845d40bdaSValerii Chubar enum pkcs11_rc 25903e07432SValerii Chubar pkcs2tee_proc_params_eddsa(struct active_processing *proc, 26003e07432SValerii Chubar struct pkcs11_attribute_head *proc_params); 26103e07432SValerii Chubar 262dc8c77fcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_rsa_oaep(uint32_t *tee_id, uint32_t *tee_hash_id, 263dc8c77fcSVesa Jääskeläinen struct pkcs11_attribute_head *params); 264dc8c77fcSVesa Jääskeläinen 26545d40bdaSValerii Chubar enum pkcs11_rc 26645d40bdaSValerii Chubar pkcs2tee_algo_rsa_aes_wrap(uint32_t *tee_id, uint32_t *tee_hash_id, 26745d40bdaSValerii Chubar struct pkcs11_attribute_head *params); 26845d40bdaSValerii Chubar 26986922832SVesa Jääskeläinen enum pkcs11_rc generate_rsa_keys(struct pkcs11_attribute_head *proc_params, 27086922832SVesa Jääskeläinen struct obj_attrs **pub_head, 27186922832SVesa Jääskeläinen struct obj_attrs **priv_head); 27286922832SVesa Jääskeläinen 2730442c956SVesa Jääskeläinen size_t rsa_get_input_max_byte_size(TEE_OperationHandle op); 2740442c956SVesa Jääskeläinen 275cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc do_asymm_derivation(struct pkcs11_session *session, 276cc062b46SJorge Ramirez-Ortiz struct pkcs11_attribute_head *proc_params, 277cc062b46SJorge Ramirez-Ortiz struct obj_attrs **head); 278cc062b46SJorge Ramirez-Ortiz 279cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc pkcs2tee_param_ecdh(struct pkcs11_attribute_head *proc_params, 280cc062b46SJorge Ramirez-Ortiz void **pub_data, size_t *pub_size); 281cc062b46SJorge Ramirez-Ortiz 282cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc pkcs2tee_algo_ecdh(uint32_t *tee_id, 283cc062b46SJorge Ramirez-Ortiz struct pkcs11_attribute_head *proc_params, 284cc062b46SJorge Ramirez-Ortiz struct pkcs11_object *obj); 285cc062b46SJorge Ramirez-Ortiz 286*e02f17f3SAlexandre Marechal enum pkcs11_rc pkcs2tee_rsa_nopad_context(struct active_processing *proc); 287*e02f17f3SAlexandre Marechal 288512cbf1dSJens Wiklander #endif /*PKCS11_TA_PROCESSING_H*/ 289