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