xref: /optee_os/core/drivers/crypto/hisilicon/sec_authenc.h (revision 0c05871e02644e1f1f326d8c961eb8ab27e7e6dd)
1*0c05871eSleisen /* SPDX-License-Identifier: BSD-2-Clause */
2*0c05871eSleisen /* Copyright (c) 2022-2024 HiSilicon Limited. */
3*0c05871eSleisen 
4*0c05871eSleisen #ifndef __SEC_AUTHENC_H__
5*0c05871eSleisen #define __SEC_AUTHENC_H__
6*0c05871eSleisen 
7*0c05871eSleisen #include <stdbool.h>
8*0c05871eSleisen #include <stdint.h>
9*0c05871eSleisen 
10*0c05871eSleisen #include "hisi_qm.h"
11*0c05871eSleisen 
12*0c05871eSleisen #define SEC_MAX_AEAD_LENGTH		16777199
13*0c05871eSleisen #define SEC_MIN_AEAD_LENGTH		4
14*0c05871eSleisen #define SEC_TAG_ERR			0x2
15*0c05871eSleisen #define SEC_MIN_GCM_TAG_LEN		8
16*0c05871eSleisen #define SEC_MIN_CCM_TAG_LEN		4
17*0c05871eSleisen #define SEC_MAX_TAG_LEN			16
18*0c05871eSleisen #define SEC_CIPHER_THEN_DIGEST		0
19*0c05871eSleisen #define SEC_DIGEST_THEN_CIPHER		1
20*0c05871eSleisen 
21*0c05871eSleisen #define MAX_GCM_AAD_SIZE		65535
22*0c05871eSleisen #define MAX_CCM_AAD_SIZE		65279
23*0c05871eSleisen #define GCM_IV_SIZE			12
24*0c05871eSleisen #define MAX_CCM_NONCE_SIZE		12
25*0c05871eSleisen #define MIN_CCM_NONCE_SIZE		7
26*0c05871eSleisen #define TAG_ALIGN			2
27*0c05871eSleisen #define MAX_KEY_SIZE			32
28*0c05871eSleisen #define MAX_IV_SIZE			16
29*0c05871eSleisen #define NONCE_OFFSET			1
30*0c05871eSleisen #define IV_LAST_BYTE1			15
31*0c05871eSleisen #define IV_LAST_BYTE2			14
32*0c05871eSleisen #define IV_LAST_BYTE3			13
33*0c05871eSleisen #define IV_CTR_INIT			1
34*0c05871eSleisen #define IV_CL_CAL_NUM			14
35*0c05871eSleisen #define IV_CM_CAL_NUM			2
36*0c05871eSleisen #define IV_CL_MASK			0x7
37*0c05871eSleisen #define IV_FLAGS_OFFSET			0x6
38*0c05871eSleisen #define IV_CM_OFFSET			0x3
39*0c05871eSleisen #define IV_LAST_BYTE_MASK		0xFF
40*0c05871eSleisen #define IV_BYTE_OFFSET			0x8
41*0c05871eSleisen #define AAD_NOT_NULL			1
42*0c05871eSleisen 
43*0c05871eSleisen struct authenc_ctx {
44*0c05871eSleisen 	struct hisi_qp *qp;
45*0c05871eSleisen 	bool encrypt;
46*0c05871eSleisen 	uint8_t civ[MAX_IV_SIZE];
47*0c05871eSleisen 	uint8_t aiv[MAX_IV_SIZE];
48*0c05871eSleisen 	uint8_t key[MAX_KEY_SIZE];
49*0c05871eSleisen 	uint8_t tag[SEC_MAX_TAG_LEN];
50*0c05871eSleisen 	struct drvcrypt_buf aad;
51*0c05871eSleisen 	struct drvcrypt_buf src;
52*0c05871eSleisen 	struct drvcrypt_buf dst;
53*0c05871eSleisen 
54*0c05871eSleisen 	uint8_t algo;
55*0c05871eSleisen 	uint8_t mode;
56*0c05871eSleisen 	uint32_t result;
57*0c05871eSleisen 	bool is_hw_supported;
58*0c05871eSleisen 	struct crypto_authenc_ctx *ae_soft_ctx;
59*0c05871eSleisen 	size_t src_offset;
60*0c05871eSleisen 	size_t payload_len;
61*0c05871eSleisen 	size_t key_len;
62*0c05871eSleisen 	size_t civ_len;
63*0c05871eSleisen 	size_t tag_len;
64*0c05871eSleisen 	uint8_t c_key_len;
65*0c05871eSleisen 
66*0c05871eSleisen 	/* aead dma */
67*0c05871eSleisen 	paddr_t key_dma;
68*0c05871eSleisen 	paddr_t civ_dma;
69*0c05871eSleisen 	paddr_t aiv_dma;
70*0c05871eSleisen 	paddr_t src_dma;
71*0c05871eSleisen 	paddr_t dst_dma;
72*0c05871eSleisen 	paddr_t tag_dma;
73*0c05871eSleisen };
74*0c05871eSleisen #endif /* __SEC_AUTHENC_H__ */
75