xref: /optee_os/ta/pkcs11/src/processing.h (revision e02f17f374b6ce856b8569543e2066bfbaa64c59)
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