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