xref: /OK3568_Linux_fs/external/security/rk_tee_user/v2/ta/rk_public_api/rk_crypto_api.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
4  */
5 
6 #ifndef RK_CRYPTO_API_H
7 #define RK_CRYPTO_API_H
8 
9 #include <stdint.h>
10 
11 #define DES_BLOCK_SIZE		8
12 #define AES_BLOCK_SIZE		16
13 #define SM4_BLOCK_SIZE		16
14 #define SHA1_HASH_SIZE		20
15 #define SHA224_HASH_SIZE	28
16 #define SHA256_HASH_SIZE	32
17 #define SHA384_HASH_SIZE	48
18 #define SHA512_HASH_SIZE	64
19 #define MD5_HASH_SIZE		16
20 #define SM3_HASH_SIZE		32
21 #define AES_AE_DATA_BLOCK	128
22 #define MAX_HASH_BLOCK_SIZE	128 /* SHA-512 is the longest so far */
23 
24 typedef enum {
25 	PKCS7_PADDING = 0,
26 	NO_PADDING  = 1,
27 } rk_padding_t;
28 
29 typedef enum {
30 	SIGN_DIGEST = 0,
31 	SIGN_DATA  = 1,
32 } rk_sign_type_t;
33 
34 typedef enum {
35 	RK_MAC_SIGN = 3,
36 	RK_MAC_VERIFY = 13,
37 } rk_mac_mode_t;
38 
39 typedef enum {
40 	RK_AE_UPDATE_DATA = 0,
41 	RK_AE_UPDATE_AAD = 1,
42 } rk_ae_update_type_t;
43 
44 typedef struct crypto_context {
45 	TEE_OperationHandle op;
46 	TEE_ObjectHandle obj;
47 	TEE_ObjectHandle obj_2; //for those one operation with two keys, such as aes-xts
48 	TEE_OperationMode mode;
49 	uint32_t algo;
50 	uint32_t padding;
51 	uint32_t sign_mode;
52 	uint8_t buffer[16];
53 	uint32_t buffer_offs;
54 } crypto_ctx_t;
55 
56 /*
57  * ecc key max size is 521 bits, so 66 bytes is enough.
58  * set buffer to 68 bytes for 4 byte alignment.
59  */
60 typedef struct EC_KEY {
61 	uint32_t d_len;
62 	uint32_t x_len;
63 	uint32_t y_len;
64 	uint32_t curve;
65 	uint32_t key_len;
66 	uint8_t d[68];
67 	uint8_t x[68];
68 	uint8_t y[68];
69 } ec_key_t;
70 
71 typedef struct EC_PUB_KEY {
72 	uint32_t x_len;
73 	uint32_t y_len;
74 	uint32_t curve;
75 	uint32_t key_len;
76 	uint8_t x[68];
77 	uint8_t y[68];
78 } ec_pub_key_t;
79 
80 typedef struct RSA_KEY {
81 	uint16_t key_len;
82 	uint16_t d_len;
83 	uint16_t e_len;
84 	uint16_t p_len;
85 	uint16_t q_len;
86 	uint16_t dp_len;
87 	uint16_t dq_len;
88 	uint16_t iq_len;
89 	uint8_t n[512];
90 	uint8_t e[8];
91 	uint8_t d[512];
92 	uint8_t p[256];
93 	uint8_t q[256];
94 	uint8_t dp[256];
95 	uint8_t dq[256];
96 	uint8_t iq[256];
97 } rsa_key_t;
98 
99 #define RK_MAX_SM2_KEP_ID_SIZE		32
100 typedef struct {
101 	ec_key_t	my_key;
102 	ec_key_t	my_eph_key;	/* ephemeral key */
103 	ec_pub_key_t	pub_B;
104 	ec_pub_key_t	eph_pub_B;	/* ephemeral public key */
105 	uint8_t		id_a[RK_MAX_SM2_KEP_ID_SIZE];
106 	uint32_t	id_a_len;
107 	uint8_t		id_b[RK_MAX_SM2_KEP_ID_SIZE];
108 	uint32_t	id_b_len;
109 	uint8_t		conf_in[SM3_HASH_SIZE];
110 	uint32_t	conf_in_len;
111 	uint32_t	is_initiator;
112 } rk_sm2_kep_parms;
113 
114 
115 crypto_ctx_t *rk_crypto_malloc_ctx(void);
116 void rk_crypto_free_ctx(crypto_ctx_t **ctx);
117 
118 TEE_Result rk_hash_crypto(uint8_t *in, uint8_t *out, uint32_t in_len,
119 			  uint32_t out_len, uint32_t algo);
120 TEE_Result rk_hash_begin(crypto_ctx_t *ctx, uint32_t algo);
121 TEE_Result rk_hash_update(crypto_ctx_t *ctx, uint8_t *in, uint32_t in_len);
122 TEE_Result rk_hash_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out,
123 			  uint32_t in_len, uint32_t *out_len);
124 
125 TEE_Result rk_cipher_crypto(uint8_t *in, uint8_t *out, uint32_t len,
126 			    uint8_t *key, uint32_t key_len, uint8_t *iv,
127 			    uint32_t algo, TEE_OperationMode mode);
128 TEE_Result rk_set_padding(crypto_ctx_t *ctx, int padding);
129 TEE_Result rk_cipher_begin(crypto_ctx_t *ctx, uint8_t *key, uint32_t key_len,
130 			   uint8_t *iv, uint32_t algo, TEE_OperationMode mode);
131 TEE_Result rk_cipher_update(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out,
132 			    uint32_t in_len, uint32_t *out_len);
133 TEE_Result rk_cipher_finish(crypto_ctx_t *ctx, uint8_t *out, uint32_t *out_len);
134 
135 TEE_Result rk_ae_begin(crypto_ctx_t *ctx, uint8_t *key, uint32_t key_len,
136 		       uint8_t *iv, uint32_t iv_len, uint32_t add_len, uint32_t tag_len,
137 		       uint32_t payload_len, uint32_t algo, TEE_OperationMode mode);
138 TEE_Result rk_ae_update(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out,
139 			uint32_t in_len, uint32_t *out_len, rk_ae_update_type_t is_add);
140 TEE_Result rk_ae_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out,
141 			uint8_t *tag, uint32_t in_len, uint32_t *out_len, uint32_t *tag_len);
142 
143 TEE_Result rk_gen_rsa_key(rsa_key_t *rsa_key, uint32_t key_len,
144 			  uint64_t public_exponent);
145 TEE_Result rk_rsa_crypto(uint8_t *in, uint8_t *out, uint32_t len,
146 			 rsa_key_t *key, uint32_t algo, TEE_OperationMode mode);
147 TEE_Result rk_rsa_sign(uint8_t *digest, uint8_t *signature, uint32_t digest_len,
148 		       uint32_t *signature_len, rsa_key_t *key, uint32_t salt_len,
149 		       uint32_t algo, TEE_OperationMode mode);
150 TEE_Result rk_set_sign_mode(crypto_ctx_t *ctx, unsigned int mode);
151 TEE_Result rk_rsa_begin(crypto_ctx_t *ctx, rsa_key_t *key, uint32_t algo,
152 			TEE_OperationMode mode);
153 TEE_Result rk_rsa_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out,
154 			 uint32_t in_len,
155 			 uint32_t *out_len, uint32_t salt_len);
156 
157 TEE_Result rk_gen_ec_key(ec_key_t *ec_key, uint32_t key_len, uint32_t curve);
158 TEE_Result rk_ecdh_genkey(uint8_t *private, uint8_t *publicx, uint32_t *publicy,
159 			  uint32_t algo,  uint32_t curve, uint32_t keysize, uint8_t *out);
160 TEE_Result rk_ecdsa_sign(uint8_t *digest, uint8_t *signature,
161 			 uint32_t digest_len, uint32_t *signature_len,
162 			 ec_key_t *key, uint32_t algo, TEE_OperationMode mode);
163 TEE_Result rk_ecdsa_begin(crypto_ctx_t *ctx, ec_key_t *key, uint32_t algo,
164 			  TEE_OperationMode mode);
165 TEE_Result rk_ecdsa_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *out,
166 			   uint32_t in_len, uint32_t *out_len);
167 
168 TEE_Result rk_sm2_pke(uint8_t *in, uint32_t in_len, uint8_t *out,
169 		      uint32_t *out_len, ec_key_t *key, uint32_t algo,
170 		      TEE_OperationMode mode);
171 TEE_Result rk_sm2_dsa_sm3(uint8_t *digest, uint32_t digest_len,
172 			  uint8_t *signature, uint32_t *signature_len,
173 			  ec_key_t *key, uint32_t algo, TEE_OperationMode mode);
174 TEE_Result rk_sm2_kep_genkey(rk_sm2_kep_parms *kep_parms, uint8_t *share_key,
175 			     uint32_t share_key_len, uint8_t *conf_out);
176 
177 TEE_Result rk_mac_crypto(uint8_t *in, uint8_t *out, uint32_t in_len,
178 			 uint32_t *out_len, uint8_t *key, uint32_t key_len,
179 			 uint8_t *iv, uint32_t algo);
180 TEE_Result rk_mac_begin(crypto_ctx_t *ctx, uint8_t *key, uint32_t key_len,
181 			uint8_t *iv, uint32_t algo);
182 TEE_Result rk_mac_update(crypto_ctx_t *ctx, uint8_t *in, uint32_t in_len);
183 TEE_Result rk_mac_finish(crypto_ctx_t *ctx, uint8_t *in, uint8_t *mac,
184 			 uint32_t in_len, uint32_t *mac_len, rk_mac_mode_t mode);
185 
186 TEE_Result rk_hkdf_genkey(uint8_t *ikm, uint32_t ikm_len,
187 			  uint8_t *salt, uint32_t salt_len, uint32_t *info, uint32_t info_len,
188 			  uint32_t algo, uint32_t okm_len, uint8_t *okm);
189 TEE_Result rk_pkcs5_pbkdf2_hmac(uint8_t *password, uint32_t password_len,
190 				uint8_t *salt, uint32_t salt_len, uint32_t iterations,
191 				uint32_t algo, uint32_t key_len, uint8_t *out_key);
192 
193 #endif /* RK_CRYPTO_API_H */
194