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