xref: /OK3568_Linux_fs/external/security/librkcrypto/include/rkcrypto_common.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun #ifndef _RKCRYPTO_COMMON_H_
5*4882a593Smuzhiyun #define _RKCRYPTO_COMMON_H_
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <stdint.h>
8*4882a593Smuzhiyun #include <stdbool.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun typedef uint32_t RK_RES;
11*4882a593Smuzhiyun typedef uint32_t rk_handle;
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define STR_HELPER(x)	#x
14*4882a593Smuzhiyun #define STR(x)		STR_HELPER(x)
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* RK_CRYPTO api verison */
17*4882a593Smuzhiyun #define RK_CRYPTO_API_MAJOR_VERSION	1
18*4882a593Smuzhiyun #define RK_CRYPTO_API_MINOR_VERSION	2
19*4882a593Smuzhiyun #define RK_CRYPTO_API_REVISION_VERSION	0
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define RK_CRYPTO_API_VERSION STR(RK_CRYPTO_API_MAJOR_VERSION) "." \
22*4882a593Smuzhiyun 			      STR(RK_CRYPTO_API_MINOR_VERSION) "." \
23*4882a593Smuzhiyun 			      STR(RK_CRYPTO_API_REVISION_VERSION)
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define RK_CRYPTO_API_FULL_VERSION "rkcrypto api version " RK_CRYPTO_API_VERSION
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* API return codes */
28*4882a593Smuzhiyun #define RK_CRYPTO_SUCCESS		0x00000000
29*4882a593Smuzhiyun #define RK_CRYPTO_ERR_GENERIC		0xF0000000
30*4882a593Smuzhiyun #define RK_CRYPTO_ERR_PARAMETER		0xF0000001
31*4882a593Smuzhiyun #define RK_CRYPTO_ERR_STATE		0xF0000002
32*4882a593Smuzhiyun #define RK_CRYPTO_ERR_NOT_SUPPORTED	0xF0000003
33*4882a593Smuzhiyun #define RK_CRYPTO_ERR_OUT_OF_MEMORY	0xF0000004
34*4882a593Smuzhiyun #define RK_CRYPTO_ERR_ACCESS_DENIED	0xF0000005
35*4882a593Smuzhiyun #define RK_CRYPTO_ERR_BUSY		0xF0000006
36*4882a593Smuzhiyun #define RK_CRYPTO_ERR_TIMEOUT		0xF0000007
37*4882a593Smuzhiyun #define RK_CRYPTO_ERR_UNINITED		0xF0000008
38*4882a593Smuzhiyun #define RK_CRYPTO_ERR_KEY		0xF0000009
39*4882a593Smuzhiyun #define RK_CRYPTO_ERR_VERIFY		0xF000000A
40*4882a593Smuzhiyun #define RK_CRYPTO_ERR_PADDING		0xF000000B
41*4882a593Smuzhiyun #define RK_CRYPTO_ERR_PADDING_OVERFLOW	0xF000000C
42*4882a593Smuzhiyun #define RK_CRYPTO_ERR_MAC_INVALID	0xF000000D
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* Algorithm operation */
45*4882a593Smuzhiyun #define RK_OP_CIPHER_ENC		1
46*4882a593Smuzhiyun #define RK_OP_CIPHER_DEC		0
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /* Algorithm block length */
49*4882a593Smuzhiyun #define DES_BLOCK_SIZE			8
50*4882a593Smuzhiyun #define AES_BLOCK_SIZE			16
51*4882a593Smuzhiyun #define SM4_BLOCK_SIZE			16
52*4882a593Smuzhiyun #define SHA1_HASH_SIZE			20
53*4882a593Smuzhiyun #define SHA224_HASH_SIZE		28
54*4882a593Smuzhiyun #define SHA256_HASH_SIZE		32
55*4882a593Smuzhiyun #define SHA384_HASH_SIZE		48
56*4882a593Smuzhiyun #define SHA512_HASH_SIZE		64
57*4882a593Smuzhiyun #define SHA512_224_HASH_SIZE		28
58*4882a593Smuzhiyun #define SHA512_256_HASH_SIZE		32
59*4882a593Smuzhiyun #define MD5_HASH_SIZE			16
60*4882a593Smuzhiyun #define SM3_HASH_SIZE			32
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define SM3_BLOCK_SIZE			64
63*4882a593Smuzhiyun #define SHA1_BLOCK_SIZE			64
64*4882a593Smuzhiyun #define MD5_BLOCK_SIZE			64
65*4882a593Smuzhiyun #define SHA224_BLOCK_SIZE		64
66*4882a593Smuzhiyun #define SHA256_BLOCK_SIZE		64
67*4882a593Smuzhiyun #define SHA384_BLOCK_SIZE		128
68*4882a593Smuzhiyun #define SHA512_BLOCK_SIZE		128
69*4882a593Smuzhiyun #define SHA512_224_BLOCK_SIZE		128
70*4882a593Smuzhiyun #define SHA512_256_BLOCK_SIZE		128
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define AES_AE_DATA_BLOCK		128
73*4882a593Smuzhiyun #define MAX_HASH_BLOCK_SIZE		128
74*4882a593Smuzhiyun #define MAX_TDES_KEY_SIZE		24
75*4882a593Smuzhiyun #define MAX_AES_KEY_SIZE		32
76*4882a593Smuzhiyun #define MAX_AE_TAG_SIZE			16
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define RSA_BITS_1024			1024
79*4882a593Smuzhiyun #define RSA_BITS_2048			2048
80*4882a593Smuzhiyun #define RSA_BITS_3072			3072
81*4882a593Smuzhiyun #define RSA_BITS_4096			4096
82*4882a593Smuzhiyun #define MAX_RSA_KEY_BITS		RSA_BITS_4096
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define RK_CRYPTO_MAX_DATA_LEN		(1 * 1024 * 1024)
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /* Crypto algorithm */
87*4882a593Smuzhiyun enum RK_CRYPTO_ALGO {
88*4882a593Smuzhiyun 	RK_ALGO_CIPHER_TOP = 0x00,
89*4882a593Smuzhiyun 	RK_ALGO_AES,
90*4882a593Smuzhiyun 	RK_ALGO_DES,
91*4882a593Smuzhiyun 	RK_ALGO_TDES,
92*4882a593Smuzhiyun 	RK_ALGO_SM4,
93*4882a593Smuzhiyun 	RK_ALGO_CIPHER_BUTT,
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	RK_ALGO_HASH_TOP = 0x10,
96*4882a593Smuzhiyun 	RK_ALGO_MD5,
97*4882a593Smuzhiyun 	RK_ALGO_SHA1,
98*4882a593Smuzhiyun 	RK_ALGO_SHA256,
99*4882a593Smuzhiyun 	RK_ALGO_SHA224,
100*4882a593Smuzhiyun 	RK_ALGO_SHA512,
101*4882a593Smuzhiyun 	RK_ALGO_SHA384,
102*4882a593Smuzhiyun 	RK_ALGO_SHA512_224,
103*4882a593Smuzhiyun 	RK_ALGO_SHA512_256,
104*4882a593Smuzhiyun 	RK_ALGO_SM3,
105*4882a593Smuzhiyun 	RK_ALGO_HASH_BUTT,
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	RK_ALGO_HMAC_TOP = 0x20,
108*4882a593Smuzhiyun 	RK_ALGO_HMAC_MD5,
109*4882a593Smuzhiyun 	RK_ALGO_HMAC_SHA1,
110*4882a593Smuzhiyun 	RK_ALGO_HMAC_SHA256,
111*4882a593Smuzhiyun 	RK_ALGO_HMAC_SHA512,
112*4882a593Smuzhiyun 	RK_ALGO_HMAC_SM3,
113*4882a593Smuzhiyun 	RK_ALGO_CMAC_AES,
114*4882a593Smuzhiyun 	RK_ALGO_CBCMAC_AES,
115*4882a593Smuzhiyun 	RK_ALGO_CMAC_SM4,
116*4882a593Smuzhiyun 	RK_ALGO_CBCMAC_SM4,
117*4882a593Smuzhiyun 	RK_ALGO_HMAC_BUTT,
118*4882a593Smuzhiyun };
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* Crypto mode */
121*4882a593Smuzhiyun enum RK_CIPIHER_MODE {
122*4882a593Smuzhiyun 	RK_CIPHER_MODE_ECB = 0,
123*4882a593Smuzhiyun 	RK_CIPHER_MODE_CBC,
124*4882a593Smuzhiyun 	RK_CIPHER_MODE_CTS,
125*4882a593Smuzhiyun 	RK_CIPHER_MODE_CTR,
126*4882a593Smuzhiyun 	RK_CIPHER_MODE_CFB,
127*4882a593Smuzhiyun 	RK_CIPHER_MODE_OFB,
128*4882a593Smuzhiyun 	RK_CIPHER_MODE_XTS,
129*4882a593Smuzhiyun 	RK_CIPHER_MODE_CCM,
130*4882a593Smuzhiyun 	RK_CIPHER_MODE_GCM,
131*4882a593Smuzhiyun 	RK_CIPHER_MODE_MAX
132*4882a593Smuzhiyun };
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun enum RK_OEM_OTP_KEYID {
135*4882a593Smuzhiyun 	RK_OEM_OTP_KEY0 = 0,
136*4882a593Smuzhiyun 	RK_OEM_OTP_KEY1 = 1,
137*4882a593Smuzhiyun 	RK_OEM_OTP_KEY2 = 2,
138*4882a593Smuzhiyun 	RK_OEM_OTP_KEY3 = 3,
139*4882a593Smuzhiyun 	RK_OEM_OTP_KEY_FW = 10,		// keyid of fw_encryption_key
140*4882a593Smuzhiyun 	RK_OEM_OTP_KEYMAX
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun enum RK_RSA_KEY_TYPE {
144*4882a593Smuzhiyun 	RK_RSA_KEY_TYPE_PLAIN = 0,
145*4882a593Smuzhiyun 	RK_RSA_KEY_TYPE_KEY0_ENC = RK_OEM_OTP_KEY0 +1,
146*4882a593Smuzhiyun 	RK_RSA_KEY_TYPE_KEY1_ENC,
147*4882a593Smuzhiyun 	RK_RSA_KEY_TYPE_KEY2_ENC,
148*4882a593Smuzhiyun 	RK_RSA_KEY_TYPE_KEY3_ENC,
149*4882a593Smuzhiyun 	RK_RSA_KEY_TYPE_MAX,
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun enum RK_RSA_CRYPT_PADDING {
153*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_NONE = 0x00,	/* without padding */
154*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_BLOCK_TYPE_0,	/* PKCS#1 block type 0 padding*/
155*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_BLOCK_TYPE_1,	/* PKCS#1 block type 1padding*/
156*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_BLOCK_TYPE_2,	/* PKCS#1 block type 2 padding*/
157*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_OAEP_SHA1,		/* PKCS#1 RSAES-OAEP-SHA1 padding*/
158*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_OAEP_SHA224,	/* PKCS#1 RSAES-OAEP-SHA224 padding*/
159*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_OAEP_SHA256,	/* PKCS#1 RSAES-OAEP-SHA256   padding*/
160*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_OAEP_SHA384,	/* PKCS#1 RSAES-OAEP-SHA384   padding*/
161*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_OAEP_SHA512,	/* PKCS#1 RSAES-OAEP-SHA512   padding*/
162*4882a593Smuzhiyun 	RK_RSA_CRYPT_PADDING_PKCS1_V1_5,	/* PKCS#1 RSAES-PKCS1_V1_5    padding*/
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun enum RK_RSA_SIGN_PADDING {
166*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA1 = 0x100,/* PKCS#1 RSASSA_PKCS1_V15_SHA1 signature*/
167*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA224,	/* PKCS#1 RSASSA_PKCS1_V15_SHA224 signature*/
168*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA256,	/* PKCS#1 RSASSA_PKCS1_V15_SHA256 signature*/
169*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA384,	/* PKCS#1 RSASSA_PKCS1_V15_SHA384 signature*/
170*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_V15_SHA512,	/* PKCS#1 RSASSA_PKCS1_V15_SHA512 signature*/
171*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA1,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA1 signature*/
172*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA224,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA224 signature*/
173*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA256,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA256 signature*/
174*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA384,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA1 signature*/
175*4882a593Smuzhiyun 	RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA512,	/* PKCS#1 RSASSA_PKCS1_PSS_SHA256 signature*/
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun typedef struct {
179*4882a593Smuzhiyun 	uint32_t	algo;
180*4882a593Smuzhiyun 	uint32_t	mode;
181*4882a593Smuzhiyun 	uint32_t	operation;
182*4882a593Smuzhiyun 	uint8_t		key[64];
183*4882a593Smuzhiyun 	uint32_t	key_len;
184*4882a593Smuzhiyun 	uint8_t		iv[16];
185*4882a593Smuzhiyun 	void		*reserved;
186*4882a593Smuzhiyun } rk_cipher_config;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun typedef struct {
189*4882a593Smuzhiyun 	uint32_t	algo;
190*4882a593Smuzhiyun 	uint32_t	mode;
191*4882a593Smuzhiyun 	uint32_t	operation;
192*4882a593Smuzhiyun 	uint8_t		key[32];
193*4882a593Smuzhiyun 	uint32_t	key_len;
194*4882a593Smuzhiyun 	uint8_t		iv[16];
195*4882a593Smuzhiyun 	uint32_t	iv_len;
196*4882a593Smuzhiyun 	uint32_t	tag_len;
197*4882a593Smuzhiyun 	uint32_t	aad_len;
198*4882a593Smuzhiyun 	uint32_t	payload_len;
199*4882a593Smuzhiyun 	void		*reserved;
200*4882a593Smuzhiyun } rk_ae_config;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun typedef struct {
203*4882a593Smuzhiyun 	uint32_t	algo;
204*4882a593Smuzhiyun 	uint8_t		*key;
205*4882a593Smuzhiyun 	uint32_t	key_len;
206*4882a593Smuzhiyun } rk_hash_config;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun typedef struct {
209*4882a593Smuzhiyun 	const uint8_t		*n;
210*4882a593Smuzhiyun 	const uint8_t		*e;
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	uint16_t		n_len;
213*4882a593Smuzhiyun 	uint16_t		e_len;
214*4882a593Smuzhiyun } rk_rsa_pub_key;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun typedef struct {
217*4882a593Smuzhiyun 	enum RK_RSA_KEY_TYPE	key_type;
218*4882a593Smuzhiyun 	rk_rsa_pub_key		key;
219*4882a593Smuzhiyun } rk_rsa_pub_key_pack;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun typedef struct {
222*4882a593Smuzhiyun 	const uint8_t		*n;
223*4882a593Smuzhiyun 	const uint8_t		*e;
224*4882a593Smuzhiyun 	const uint8_t		*d;
225*4882a593Smuzhiyun 	const uint8_t		*p;
226*4882a593Smuzhiyun 	const uint8_t		*q;
227*4882a593Smuzhiyun 	const uint8_t		*dp;
228*4882a593Smuzhiyun 	const uint8_t		*dq;
229*4882a593Smuzhiyun 	const uint8_t		*qp;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	uint16_t		n_len;
232*4882a593Smuzhiyun 	uint16_t		e_len;
233*4882a593Smuzhiyun 	uint16_t		d_len;
234*4882a593Smuzhiyun 	uint16_t		p_len;
235*4882a593Smuzhiyun 	uint16_t		q_len;
236*4882a593Smuzhiyun 	uint16_t		dp_len;
237*4882a593Smuzhiyun 	uint16_t		dq_len;
238*4882a593Smuzhiyun 	uint16_t		qp_len;
239*4882a593Smuzhiyun } rk_rsa_priv_key;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun typedef struct {
242*4882a593Smuzhiyun 	enum RK_RSA_KEY_TYPE	key_type;
243*4882a593Smuzhiyun 	rk_rsa_priv_key		key;
244*4882a593Smuzhiyun } rk_rsa_priv_key_pack;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun #endif /* _RKCRYPTO_COMMON_H_ */
247