xref: /optee_os/ta/pkcs11/src/processing.h (revision 45d40bda652aece0c348d316b0170992f781c99a)
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 /**
49*45d40bdaSValerii Chubar  * RSA AES key wrap processing context
50*45d40bdaSValerii Chubar  *
51*45d40bdaSValerii Chubar  * @hash_alg: Hash algorithm mechanism
52*45d40bdaSValerii Chubar  * @mgf_type: Mask generator function
53*45d40bdaSValerii Chubar  * @aes_key_bits: Length of AES key in bits
54*45d40bdaSValerii Chubar  * @source_type: Type of source.
55*45d40bdaSValerii Chubar  * @source_data_len: Length of the source data.
56*45d40bdaSValerii Chubar  * @source_data: Source data.
57*45d40bdaSValerii Chubar  */
58*45d40bdaSValerii Chubar struct rsa_aes_key_wrap_processing_ctx {
59*45d40bdaSValerii Chubar 	enum pkcs11_mechanism_id hash_alg;
60*45d40bdaSValerii Chubar 	enum pkcs11_mgf_id mgf_type;
61*45d40bdaSValerii Chubar 	uint32_t aes_key_bits;
62*45d40bdaSValerii Chubar 	uint32_t source_type;
63*45d40bdaSValerii Chubar 	uint32_t source_data_len;
64*45d40bdaSValerii Chubar 	uint8_t source_data[];
65*45d40bdaSValerii Chubar };
66*45d40bdaSValerii Chubar 
67*45d40bdaSValerii 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 
139*45d40bdaSValerii Chubar enum pkcs11_rc wrap_data_by_asymm_enc(struct pkcs11_session *session,
140*45d40bdaSValerii Chubar 				      void *data, uint32_t data_sz,
141*45d40bdaSValerii Chubar 				      void *out_buf, uint32_t *out_sz);
142*45d40bdaSValerii Chubar 
143*45d40bdaSValerii Chubar enum pkcs11_rc unwrap_key_by_asymm(struct pkcs11_session *session, void *data,
144*45d40bdaSValerii Chubar 				   uint32_t data_sz, void **out_buf,
145*45d40bdaSValerii Chubar 				   uint32_t *out_sz);
146*45d40bdaSValerii Chubar 
147512cbf1dSJens Wiklander /*
148512cbf1dSJens Wiklander  * Symmetric crypto algorithm specific functions
149512cbf1dSJens Wiklander  */
150512cbf1dSJens Wiklander bool processing_is_tee_symm(uint32_t 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 
1769e91a619SVesa Jääskeläinen /* Digest specific functions */
1779e91a619SVesa Jääskeläinen bool processing_is_tee_digest(enum pkcs11_mechanism_id mecha_id);
1789e91a619SVesa Jääskeläinen 
1799e91a619SVesa Jääskeläinen enum pkcs11_rc
1809e91a619SVesa Jääskeläinen init_digest_operation(struct pkcs11_session *session,
1819e91a619SVesa Jääskeläinen 		      struct pkcs11_attribute_head *proc_params);
1829e91a619SVesa Jääskeläinen 
1839e91a619SVesa Jääskeläinen enum pkcs11_rc step_digest_operation(struct pkcs11_session *session,
1849e91a619SVesa Jääskeläinen 				     enum processing_step step,
1859e91a619SVesa Jääskeläinen 				     struct pkcs11_object *obj,
1869e91a619SVesa Jääskeläinen 				     uint32_t ptypes, TEE_Param *params);
1879e91a619SVesa Jääskeläinen 
18802b16804SVesa Jääskeläinen /*
18902b16804SVesa Jääskeläinen  * Elliptic curve crypto algorithm specific functions
19002b16804SVesa Jääskeläinen  */
191fb279d8bSVesa Jääskeläinen enum pkcs11_rc load_tee_ec_key_attrs(TEE_Attribute **tee_attrs,
192fb279d8bSVesa Jääskeläinen 				     size_t *tee_count,
193fb279d8bSVesa Jääskeläinen 				     struct pkcs11_object *obj);
194fb279d8bSVesa Jääskeläinen 
19503e07432SValerii Chubar enum pkcs11_rc load_tee_eddsa_key_attrs(TEE_Attribute **tee_attrs,
19603e07432SValerii Chubar 					size_t *tee_count,
19703e07432SValerii Chubar 					struct pkcs11_object *obj);
19803e07432SValerii Chubar 
19902b16804SVesa Jääskeläinen size_t ec_params2tee_keysize(void *attr, size_t size);
20002b16804SVesa Jääskeläinen 
20102b16804SVesa Jääskeläinen uint32_t ec_params2tee_curve(void *attr, size_t size);
20202b16804SVesa Jääskeläinen 
203fb279d8bSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_ecdsa(uint32_t *tee_id,
204fb279d8bSVesa Jääskeläinen 				   struct pkcs11_attribute_head *proc_params,
205fb279d8bSVesa Jääskeläinen 				   struct pkcs11_object *obj);
206fb279d8bSVesa Jääskeläinen 
20702b16804SVesa Jääskeläinen enum pkcs11_rc generate_ec_keys(struct pkcs11_attribute_head *proc_params,
20802b16804SVesa Jääskeläinen 				struct obj_attrs **pub_head,
20902b16804SVesa Jääskeläinen 				struct obj_attrs **priv_head);
21002b16804SVesa Jääskeläinen 
21103e07432SValerii Chubar enum pkcs11_rc generate_eddsa_keys(struct pkcs11_attribute_head *proc_params,
21203e07432SValerii Chubar 				   struct obj_attrs **pub_head,
21303e07432SValerii Chubar 				   struct obj_attrs **priv_head);
21403e07432SValerii Chubar 
215fb279d8bSVesa Jääskeläinen size_t ecdsa_get_input_max_byte_size(TEE_OperationHandle op);
216fb279d8bSVesa Jääskeläinen 
21786922832SVesa Jääskeläinen /*
21886922832SVesa Jääskeläinen  * RSA crypto algorithm specific functions
21986922832SVesa Jääskeläinen  */
2200442c956SVesa Jääskeläinen enum pkcs11_rc load_tee_rsa_key_attrs(TEE_Attribute **tee_attrs,
2210442c956SVesa Jääskeläinen 				      size_t *tee_count,
2220442c956SVesa Jääskeläinen 				      struct pkcs11_object *obj);
2230442c956SVesa Jääskeläinen 
224d9af50bcSVesa Jääskeläinen enum pkcs11_rc
225d9af50bcSVesa Jääskeläinen pkcs2tee_proc_params_rsa_pss(struct active_processing *proc,
226d9af50bcSVesa Jääskeläinen 			     struct pkcs11_attribute_head *proc_params);
227d9af50bcSVesa Jääskeläinen 
228d9af50bcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_validate_rsa_pss(struct active_processing *proc,
229d9af50bcSVesa Jääskeläinen 					 struct pkcs11_object *obj);
230d9af50bcSVesa Jääskeläinen 
231d9af50bcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_rsa_pss(uint32_t *tee_id,
232d9af50bcSVesa Jääskeläinen 				     struct pkcs11_attribute_head *params);
233d9af50bcSVesa Jääskeläinen 
234dc8c77fcSVesa Jääskeläinen enum pkcs11_rc
235dc8c77fcSVesa Jääskeläinen pkcs2tee_proc_params_rsa_oaep(struct active_processing *proc,
236dc8c77fcSVesa Jääskeläinen 			      struct pkcs11_attribute_head *proc_params);
237dc8c77fcSVesa Jääskeläinen 
23803e07432SValerii Chubar enum pkcs11_rc
239*45d40bdaSValerii Chubar pkcs2tee_proc_params_rsa_aes_wrap(struct active_processing *proc,
240*45d40bdaSValerii Chubar 				  struct pkcs11_attribute_head *proc_params);
241*45d40bdaSValerii Chubar 
242*45d40bdaSValerii Chubar enum pkcs11_rc
24303e07432SValerii Chubar pkcs2tee_proc_params_eddsa(struct active_processing *proc,
24403e07432SValerii Chubar 			   struct pkcs11_attribute_head *proc_params);
24503e07432SValerii Chubar 
246dc8c77fcSVesa Jääskeläinen enum pkcs11_rc pkcs2tee_algo_rsa_oaep(uint32_t *tee_id, uint32_t *tee_hash_id,
247dc8c77fcSVesa Jääskeläinen 				      struct pkcs11_attribute_head *params);
248dc8c77fcSVesa Jääskeläinen 
249*45d40bdaSValerii Chubar enum pkcs11_rc
250*45d40bdaSValerii Chubar pkcs2tee_algo_rsa_aes_wrap(uint32_t *tee_id, uint32_t *tee_hash_id,
251*45d40bdaSValerii Chubar 			   struct pkcs11_attribute_head *params);
252*45d40bdaSValerii Chubar 
25386922832SVesa Jääskeläinen enum pkcs11_rc generate_rsa_keys(struct pkcs11_attribute_head *proc_params,
25486922832SVesa Jääskeläinen 				 struct obj_attrs **pub_head,
25586922832SVesa Jääskeläinen 				 struct obj_attrs **priv_head);
25686922832SVesa Jääskeläinen 
2570442c956SVesa Jääskeläinen size_t rsa_get_input_max_byte_size(TEE_OperationHandle op);
2580442c956SVesa Jääskeläinen 
259cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc do_asymm_derivation(struct pkcs11_session *session,
260cc062b46SJorge Ramirez-Ortiz 				   struct pkcs11_attribute_head *proc_params,
261cc062b46SJorge Ramirez-Ortiz 				   struct obj_attrs **head);
262cc062b46SJorge Ramirez-Ortiz 
263cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc pkcs2tee_param_ecdh(struct pkcs11_attribute_head *proc_params,
264cc062b46SJorge Ramirez-Ortiz 				   void **pub_data, size_t *pub_size);
265cc062b46SJorge Ramirez-Ortiz 
266cc062b46SJorge Ramirez-Ortiz enum pkcs11_rc pkcs2tee_algo_ecdh(uint32_t *tee_id,
267cc062b46SJorge Ramirez-Ortiz 				  struct pkcs11_attribute_head *proc_params,
268cc062b46SJorge Ramirez-Ortiz 				  struct pkcs11_object *obj);
269cc062b46SJorge Ramirez-Ortiz 
270512cbf1dSJens Wiklander #endif /*PKCS11_TA_PROCESSING_H*/
271