xref: /optee_os/core/drivers/crypto/caam/ae/local.h (revision a75d305d48d89d70c813266fac3b0b337e42b9e7)
1faaf0c59SOlivier Masse /* SPDX-License-Identifier: BSD-2-Clause */
2faaf0c59SOlivier Masse /*
3faaf0c59SOlivier Masse  * Copyright 2024 NXP
4faaf0c59SOlivier Masse  */
5faaf0c59SOlivier Masse #ifndef __LOCAL_H__
6faaf0c59SOlivier Masse #define __LOCAL_H__
7faaf0c59SOlivier Masse 
8faaf0c59SOlivier Masse #include <caam_utils_dmaobj.h>
9faaf0c59SOlivier Masse #include <drvcrypt.h>
10faaf0c59SOlivier Masse #include <drvcrypt_authenc.h>
11faaf0c59SOlivier Masse 
12faaf0c59SOlivier Masse /* Maximum AAD size */
13faaf0c59SOlivier Masse #define AAD_LENGTH_OVERFLOW 0xFF00
14faaf0c59SOlivier Masse 
15faaf0c59SOlivier Masse /*
16faaf0c59SOlivier Masse  * Cipher Algorithm definition
17faaf0c59SOlivier Masse  * @type:		Algo type for operation
18faaf0c59SOlivier Masse  * @size_block:		Computing block size
19faaf0c59SOlivier Masse  * @size_ctx:		CAAM Context Register size
20faaf0c59SOlivier Masse  * @ctx_offset:		CAAM Context Register offset
21faaf0c59SOlivier Masse  * @def_key:		Define accepted key size
22faaf0c59SOlivier Masse  * @initialize:		Initialize function
23faaf0c59SOlivier Masse  * @final:		Final function
24faaf0c59SOlivier Masse  */
25faaf0c59SOlivier Masse struct cipheralg {
26faaf0c59SOlivier Masse 	uint32_t type;
27faaf0c59SOlivier Masse 	uint8_t size_block;
28faaf0c59SOlivier Masse 	uint8_t size_ctx;
29faaf0c59SOlivier Masse 	uint8_t ctx_offset;
30faaf0c59SOlivier Masse 	struct caamdefkey def_key;
31faaf0c59SOlivier Masse 
32faaf0c59SOlivier Masse 	TEE_Result (*initialize)(struct drvcrypt_authenc_init *dinit);
33faaf0c59SOlivier Masse 	TEE_Result (*final)(struct drvcrypt_authenc_final *dfinal);
34faaf0c59SOlivier Masse };
35faaf0c59SOlivier Masse 
36faaf0c59SOlivier Masse /*
37faaf0c59SOlivier Masse  * CAAM Authenticated Encryption Context
38faaf0c59SOlivier Masse  *
39faaf0c59SOlivier Masse  * @descriptor:		Job descriptor
40faaf0c59SOlivier Masse  * @tag_length:		Hash tag length
41faaf0c59SOlivier Masse  * @aad_length:		Additional data length
42faaf0c59SOlivier Masse  * @payload_length:	Data length
43faaf0c59SOlivier Masse  * @encrypt:		Encrypt direction
44faaf0c59SOlivier Masse  * @key:		Cipher key
45faaf0c59SOlivier Masse  * @initial_ctx:	Initial CCM context
46faaf0c59SOlivier Masse  * @ctx:		Saved context for multi-part update
47faaf0c59SOlivier Masse  * @nonce:		Initial GCM Nonce value
48faaf0c59SOlivier Masse  * @buf_add:		Additional Data buffer if needed
49faaf0c59SOlivier Masse  * @blockbuf:		Temporary Block buffer
50faaf0c59SOlivier Masse  * @do_block:		Block Encryption operation function
51faaf0c59SOlivier Masse  * @alg:		Reference to the algo constants
52faaf0c59SOlivier Masse  */
53faaf0c59SOlivier Masse struct caam_ae_ctx {
54faaf0c59SOlivier Masse 	uint32_t *descriptor;
55faaf0c59SOlivier Masse 
56faaf0c59SOlivier Masse 	size_t tag_length;
57faaf0c59SOlivier Masse 	size_t aad_length;
58faaf0c59SOlivier Masse 	size_t payload_length;
59faaf0c59SOlivier Masse 
60faaf0c59SOlivier Masse 	bool encrypt;
61faaf0c59SOlivier Masse 
62faaf0c59SOlivier Masse 	struct caambuf key;
63faaf0c59SOlivier Masse 	struct caambuf initial_ctx;
64faaf0c59SOlivier Masse 	struct caambuf ctx;
65faaf0c59SOlivier Masse 	struct caambuf nonce;
66faaf0c59SOlivier Masse 
67faaf0c59SOlivier Masse 	struct caamblock buf_aad;
68faaf0c59SOlivier Masse 	struct caamblock blockbuf;
69faaf0c59SOlivier Masse 
70faaf0c59SOlivier Masse 	bool (*do_block)(struct caam_ae_ctx *caam_ctx, bool encrypt,
71faaf0c59SOlivier Masse 			 struct caamdmaobj *src, struct caamdmaobj *dst,
72faaf0c59SOlivier Masse 			 bool final);
73faaf0c59SOlivier Masse 
74faaf0c59SOlivier Masse 	const struct cipheralg *alg;
75faaf0c59SOlivier Masse };
76faaf0c59SOlivier Masse 
77faaf0c59SOlivier Masse /*
78faaf0c59SOlivier Masse  * Update of the Authenticated Encryption Operation.
79faaf0c59SOlivier Masse  *
80faaf0c59SOlivier Masse  * @ctx      AE Cipher context
81faaf0c59SOlivier Masse  * @src      Source data to encrypt/decrypt
82faaf0c59SOlivier Masse  * @dst      [out] Destination data encrypted/decrypted
83faaf0c59SOlivier Masse  * @last     Last update flag
84faaf0c59SOlivier Masse  */
85faaf0c59SOlivier Masse TEE_Result caam_ae_do_update(struct caam_ae_ctx *ctx, struct drvcrypt_buf *src,
86faaf0c59SOlivier Masse 			     struct drvcrypt_buf *dst, bool last);
87faaf0c59SOlivier Masse 
88faaf0c59SOlivier Masse /*
89faaf0c59SOlivier Masse  * Initialization of the AES GCM operation
90faaf0c59SOlivier Masse  *
91faaf0c59SOlivier Masse  * @dinit  Data initialization object
92faaf0c59SOlivier Masse  */
93faaf0c59SOlivier Masse TEE_Result caam_ae_initialize_gcm(struct drvcrypt_authenc_init *dinit);
94faaf0c59SOlivier Masse 
95faaf0c59SOlivier Masse /*
96faaf0c59SOlivier Masse  * Finalize the AES GCM operation
97faaf0c59SOlivier Masse  *
98faaf0c59SOlivier Masse  * @dfinal  Last data object
99faaf0c59SOlivier Masse  */
100faaf0c59SOlivier Masse TEE_Result caam_ae_final_gcm(struct drvcrypt_authenc_final *dfinal);
101faaf0c59SOlivier Masse 
102*a75d305dSOlivier Masse /*
103*a75d305dSOlivier Masse  * Initialization of the AES CCM operation
104*a75d305dSOlivier Masse  *
105*a75d305dSOlivier Masse  * @dinit  Data initialization object
106*a75d305dSOlivier Masse  */
107*a75d305dSOlivier Masse TEE_Result caam_ae_initialize_ccm(struct drvcrypt_authenc_init *dinit);
108*a75d305dSOlivier Masse 
109*a75d305dSOlivier Masse /*
110*a75d305dSOlivier Masse  * Finalize the AES CCM operation
111*a75d305dSOlivier Masse  *
112*a75d305dSOlivier Masse  * @dfinal  Last data object
113*a75d305dSOlivier Masse  */
114*a75d305dSOlivier Masse TEE_Result caam_ae_final_ccm(struct drvcrypt_authenc_final *dfinal);
115*a75d305dSOlivier Masse 
116faaf0c59SOlivier Masse #endif /* __LOCAL_H__ */
117