1*4f75eab0Syuzexi // SPDX-License-Identifier: BSD-2-Clause
2*4f75eab0Syuzexi /*
3*4f75eab0Syuzexi * Copyright (c) 2022-2024, HiSilicon Technologies Co., Ltd.
4*4f75eab0Syuzexi * Kunpeng hardware accelerator hpre rsa algorithm implementation.
5*4f75eab0Syuzexi */
6*4f75eab0Syuzexi
7*4f75eab0Syuzexi #include <crypto/crypto_impl.h>
8*4f75eab0Syuzexi #include <drvcrypt.h>
9*4f75eab0Syuzexi #include <drvcrypt_acipher.h>
10*4f75eab0Syuzexi #include <drvcrypt_math.h>
11*4f75eab0Syuzexi #include <initcall.h>
12*4f75eab0Syuzexi #include <malloc.h>
13*4f75eab0Syuzexi #include <mbedtls/rsa.h>
14*4f75eab0Syuzexi #include <rng_support.h>
15*4f75eab0Syuzexi #include <stdlib_ext.h>
16*4f75eab0Syuzexi #include <string.h>
17*4f75eab0Syuzexi #include <string_ext.h>
18*4f75eab0Syuzexi #include <tee/tee_cryp_utl.h>
19*4f75eab0Syuzexi #include <trace.h>
20*4f75eab0Syuzexi
21*4f75eab0Syuzexi #include "hpre_main.h"
22*4f75eab0Syuzexi #include "hpre_rsa.h"
23*4f75eab0Syuzexi
hpre_rsa_fill_addr_params(struct hpre_rsa_msg * msg,struct hpre_sqe * sqe)24*4f75eab0Syuzexi static enum hisi_drv_status hpre_rsa_fill_addr_params(struct hpre_rsa_msg *msg,
25*4f75eab0Syuzexi struct hpre_sqe *sqe)
26*4f75eab0Syuzexi {
27*4f75eab0Syuzexi switch (msg->alg_type) {
28*4f75eab0Syuzexi case HPRE_ALG_NC_NCRT:
29*4f75eab0Syuzexi case HPRE_ALG_NC_CRT:
30*4f75eab0Syuzexi if (msg->is_private) {
31*4f75eab0Syuzexi /* DECRYPT */
32*4f75eab0Syuzexi sqe->key = msg->prikey_dma;
33*4f75eab0Syuzexi sqe->in = msg->in_dma;
34*4f75eab0Syuzexi sqe->out = msg->out_dma;
35*4f75eab0Syuzexi } else {
36*4f75eab0Syuzexi /* ENCRYPT */
37*4f75eab0Syuzexi sqe->key = msg->pubkey_dma;
38*4f75eab0Syuzexi sqe->in = msg->in_dma;
39*4f75eab0Syuzexi sqe->out = msg->out_dma;
40*4f75eab0Syuzexi }
41*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_NO_ERR;
42*4f75eab0Syuzexi default:
43*4f75eab0Syuzexi EMSG("Invalid alg_type[%"PRIu32"]", msg->alg_type);
44*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_IN_EPARA;
45*4f75eab0Syuzexi }
46*4f75eab0Syuzexi }
47*4f75eab0Syuzexi
hpre_rsa_fill_sqe(void * bd,void * info)48*4f75eab0Syuzexi static enum hisi_drv_status hpre_rsa_fill_sqe(void *bd, void *info)
49*4f75eab0Syuzexi {
50*4f75eab0Syuzexi struct hpre_rsa_msg *msg = info;
51*4f75eab0Syuzexi struct hpre_sqe *sqe = bd;
52*4f75eab0Syuzexi
53*4f75eab0Syuzexi sqe->w0 = msg->alg_type | SHIFT_U32(0x1, HPRE_DONE_SHIFT);
54*4f75eab0Syuzexi sqe->task_len1 = TASK_LENGTH(msg->key_bytes);
55*4f75eab0Syuzexi
56*4f75eab0Syuzexi return hpre_rsa_fill_addr_params(msg, sqe);
57*4f75eab0Syuzexi }
58*4f75eab0Syuzexi
hpre_rsa_parse_sqe(void * bd,void * info __unused)59*4f75eab0Syuzexi static enum hisi_drv_status hpre_rsa_parse_sqe(void *bd, void *info __unused)
60*4f75eab0Syuzexi {
61*4f75eab0Syuzexi struct hpre_sqe *sqe = bd;
62*4f75eab0Syuzexi uint16_t err = 0;
63*4f75eab0Syuzexi uint16_t done = 0;
64*4f75eab0Syuzexi
65*4f75eab0Syuzexi err = HPRE_TASK_ETYPE(sqe->w0);
66*4f75eab0Syuzexi done = HPRE_TASK_DONE(sqe->w0);
67*4f75eab0Syuzexi if (done != HPRE_HW_TASK_DONE || err) {
68*4f75eab0Syuzexi EMSG("HPRE do rsa fail! done=0x%"PRIX16", etype=0x%"PRIX16,
69*4f75eab0Syuzexi done, err);
70*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_IN_EPARA;
71*4f75eab0Syuzexi }
72*4f75eab0Syuzexi
73*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_NO_ERR;
74*4f75eab0Syuzexi }
75*4f75eab0Syuzexi
hpre_rsa_do_task(void * msg)76*4f75eab0Syuzexi static TEE_Result hpre_rsa_do_task(void *msg)
77*4f75eab0Syuzexi {
78*4f75eab0Syuzexi struct hisi_qp *rsa_qp = NULL;
79*4f75eab0Syuzexi TEE_Result res = TEE_SUCCESS;
80*4f75eab0Syuzexi enum hisi_drv_status ret = HISI_QM_DRVCRYPT_NO_ERR;
81*4f75eab0Syuzexi
82*4f75eab0Syuzexi rsa_qp = hpre_create_qp(HISI_QM_CHANNEL_TYPE0);
83*4f75eab0Syuzexi if (!rsa_qp) {
84*4f75eab0Syuzexi EMSG("Fail to create rsa qp");
85*4f75eab0Syuzexi return TEE_ERROR_BUSY;
86*4f75eab0Syuzexi }
87*4f75eab0Syuzexi
88*4f75eab0Syuzexi rsa_qp->fill_sqe = hpre_rsa_fill_sqe;
89*4f75eab0Syuzexi rsa_qp->parse_sqe = hpre_rsa_parse_sqe;
90*4f75eab0Syuzexi ret = hisi_qp_send(rsa_qp, msg);
91*4f75eab0Syuzexi if (ret) {
92*4f75eab0Syuzexi EMSG("Fail to send task, ret=%x"PRIx32, ret);
93*4f75eab0Syuzexi res = TEE_ERROR_BAD_STATE;
94*4f75eab0Syuzexi goto done_proc;
95*4f75eab0Syuzexi }
96*4f75eab0Syuzexi
97*4f75eab0Syuzexi ret = hisi_qp_recv_sync(rsa_qp, msg);
98*4f75eab0Syuzexi if (ret) {
99*4f75eab0Syuzexi EMSG("Recv task error, ret=%x"PRIx32, ret);
100*4f75eab0Syuzexi res = TEE_ERROR_BAD_STATE;
101*4f75eab0Syuzexi goto done_proc;
102*4f75eab0Syuzexi }
103*4f75eab0Syuzexi
104*4f75eab0Syuzexi done_proc:
105*4f75eab0Syuzexi hisi_qm_release_qp(rsa_qp);
106*4f75eab0Syuzexi
107*4f75eab0Syuzexi return res;
108*4f75eab0Syuzexi }
109*4f75eab0Syuzexi
mgf_process(size_t digest_size,uint8_t * seed,size_t seed_len,uint8_t * mask,size_t mask_len,struct drvcrypt_rsa_ed * rsa_data)110*4f75eab0Syuzexi static TEE_Result mgf_process(size_t digest_size, uint8_t *seed,
111*4f75eab0Syuzexi size_t seed_len, uint8_t *mask, size_t mask_len,
112*4f75eab0Syuzexi struct drvcrypt_rsa_ed *rsa_data)
113*4f75eab0Syuzexi {
114*4f75eab0Syuzexi struct drvcrypt_rsa_mgf mgf = { };
115*4f75eab0Syuzexi
116*4f75eab0Syuzexi if (!rsa_data->mgf) {
117*4f75eab0Syuzexi EMSG("mgf function is NULL");
118*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
119*4f75eab0Syuzexi }
120*4f75eab0Syuzexi
121*4f75eab0Syuzexi mgf.hash_algo = rsa_data->hash_algo;
122*4f75eab0Syuzexi mgf.digest_size = digest_size;
123*4f75eab0Syuzexi mgf.seed.data = seed;
124*4f75eab0Syuzexi mgf.seed.length = seed_len;
125*4f75eab0Syuzexi mgf.mask.data = mask;
126*4f75eab0Syuzexi mgf.mask.length = mask_len;
127*4f75eab0Syuzexi
128*4f75eab0Syuzexi return rsa_data->mgf(&mgf);
129*4f75eab0Syuzexi }
130*4f75eab0Syuzexi
xor_process(uint8_t * a,uint8_t * b,uint8_t * out,size_t len)131*4f75eab0Syuzexi static TEE_Result xor_process(uint8_t *a, uint8_t *b, uint8_t *out, size_t len)
132*4f75eab0Syuzexi {
133*4f75eab0Syuzexi struct drvcrypt_mod_op xor_mod = { };
134*4f75eab0Syuzexi
135*4f75eab0Syuzexi xor_mod.n.length = len;
136*4f75eab0Syuzexi xor_mod.a.data = a;
137*4f75eab0Syuzexi xor_mod.a.length = len;
138*4f75eab0Syuzexi xor_mod.b.data = b;
139*4f75eab0Syuzexi xor_mod.b.length = len;
140*4f75eab0Syuzexi xor_mod.result.data = out;
141*4f75eab0Syuzexi xor_mod.result.length = len;
142*4f75eab0Syuzexi
143*4f75eab0Syuzexi return drvcrypt_xor_mod_n(&xor_mod);
144*4f75eab0Syuzexi }
145*4f75eab0Syuzexi
hpre_rsa_get_hw_kbytes(size_t key_bits)146*4f75eab0Syuzexi static size_t hpre_rsa_get_hw_kbytes(size_t key_bits)
147*4f75eab0Syuzexi {
148*4f75eab0Syuzexi size_t size = 0;
149*4f75eab0Syuzexi
150*4f75eab0Syuzexi if (key_bits <= 1024)
151*4f75eab0Syuzexi size = BITS_TO_BYTES(1024);
152*4f75eab0Syuzexi else if (key_bits <= 2048)
153*4f75eab0Syuzexi size = BITS_TO_BYTES(2048);
154*4f75eab0Syuzexi else if (key_bits <= 3072)
155*4f75eab0Syuzexi size = BITS_TO_BYTES(3072);
156*4f75eab0Syuzexi else if (key_bits <= 4096)
157*4f75eab0Syuzexi size = BITS_TO_BYTES(4096);
158*4f75eab0Syuzexi else
159*4f75eab0Syuzexi EMSG("Invalid key_bits[%zu]", key_bits);
160*4f75eab0Syuzexi
161*4f75eab0Syuzexi return size;
162*4f75eab0Syuzexi }
163*4f75eab0Syuzexi
hpre_rsa_params_free(struct hpre_rsa_msg * msg)164*4f75eab0Syuzexi static void hpre_rsa_params_free(struct hpre_rsa_msg *msg)
165*4f75eab0Syuzexi {
166*4f75eab0Syuzexi switch (msg->alg_type) {
167*4f75eab0Syuzexi case HPRE_ALG_NC_NCRT:
168*4f75eab0Syuzexi if (msg->is_private)
169*4f75eab0Syuzexi free_wipe(msg->prikey);
170*4f75eab0Syuzexi else
171*4f75eab0Syuzexi free(msg->pubkey);
172*4f75eab0Syuzexi break;
173*4f75eab0Syuzexi case HPRE_ALG_NC_CRT:
174*4f75eab0Syuzexi if (msg->is_private)
175*4f75eab0Syuzexi free_wipe(msg->prikey);
176*4f75eab0Syuzexi break;
177*4f75eab0Syuzexi default:
178*4f75eab0Syuzexi EMSG("Invalid alg_type[%"PRIu32"]", msg->alg_type);
179*4f75eab0Syuzexi break;
180*4f75eab0Syuzexi }
181*4f75eab0Syuzexi }
182*4f75eab0Syuzexi
hpre_rsa_encrypt_alloc(struct hpre_rsa_msg * msg)183*4f75eab0Syuzexi static enum hisi_drv_status hpre_rsa_encrypt_alloc(struct hpre_rsa_msg *msg)
184*4f75eab0Syuzexi {
185*4f75eab0Syuzexi uint32_t size = HPRE_RSA_NCRT_TOTAL_BUF_SIZE(msg->key_bytes);
186*4f75eab0Syuzexi uint8_t *data = NULL;
187*4f75eab0Syuzexi
188*4f75eab0Syuzexi data = calloc(1, size);
189*4f75eab0Syuzexi if (!data) {
190*4f75eab0Syuzexi EMSG("Fail to alloc rsa ncrt buf");
191*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_ENOMEM;
192*4f75eab0Syuzexi }
193*4f75eab0Syuzexi
194*4f75eab0Syuzexi msg->pubkey = data;
195*4f75eab0Syuzexi msg->pubkey_dma = virt_to_phys(msg->pubkey);
196*4f75eab0Syuzexi
197*4f75eab0Syuzexi msg->in = data + (msg->key_bytes * 2);
198*4f75eab0Syuzexi msg->in_dma = msg->pubkey_dma + (msg->key_bytes * 2);
199*4f75eab0Syuzexi
200*4f75eab0Syuzexi msg->out = msg->in + msg->key_bytes;
201*4f75eab0Syuzexi msg->out_dma = msg->in_dma + msg->key_bytes;
202*4f75eab0Syuzexi
203*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_NO_ERR;
204*4f75eab0Syuzexi }
205*4f75eab0Syuzexi
206*4f75eab0Syuzexi static enum hisi_drv_status
hpre_rsa_encrypt_bn2bin(struct hpre_rsa_msg * msg,struct drvcrypt_rsa_ed * rsa_data)207*4f75eab0Syuzexi hpre_rsa_encrypt_bn2bin(struct hpre_rsa_msg *msg,
208*4f75eab0Syuzexi struct drvcrypt_rsa_ed *rsa_data)
209*4f75eab0Syuzexi {
210*4f75eab0Syuzexi struct rsa_public_key *key = rsa_data->key.key;
211*4f75eab0Syuzexi uint32_t e_len = 0;
212*4f75eab0Syuzexi uint32_t n_len = 0;
213*4f75eab0Syuzexi enum hisi_drv_status ret = HISI_QM_DRVCRYPT_NO_ERR;
214*4f75eab0Syuzexi uint8_t *n = NULL;
215*4f75eab0Syuzexi
216*4f75eab0Syuzexi n = msg->pubkey + msg->key_bytes;
217*4f75eab0Syuzexi
218*4f75eab0Syuzexi crypto_bignum_bn2bin(key->e, msg->pubkey);
219*4f75eab0Syuzexi crypto_bignum_bn2bin(key->n, n);
220*4f75eab0Syuzexi e_len = crypto_bignum_num_bytes(key->e);
221*4f75eab0Syuzexi n_len = crypto_bignum_num_bytes(key->n);
222*4f75eab0Syuzexi
223*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(msg->pubkey, msg->pubkey,
224*4f75eab0Syuzexi msg->key_bytes, e_len);
225*4f75eab0Syuzexi if (ret) {
226*4f75eab0Syuzexi EMSG("Fail to transfer rsa ncrt e from crypto_bin to hpre_bin");
227*4f75eab0Syuzexi return ret;
228*4f75eab0Syuzexi }
229*4f75eab0Syuzexi
230*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(n, n, msg->key_bytes, n_len);
231*4f75eab0Syuzexi if (ret) {
232*4f75eab0Syuzexi EMSG("Fail to transfer rsa ncrt n from crypto_bin to hpre_bin");
233*4f75eab0Syuzexi return ret;
234*4f75eab0Syuzexi }
235*4f75eab0Syuzexi
236*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(msg->in, rsa_data->message.data,
237*4f75eab0Syuzexi msg->key_bytes,
238*4f75eab0Syuzexi rsa_data->message.length);
239*4f75eab0Syuzexi if (ret)
240*4f75eab0Syuzexi EMSG("Fail to transfer rsa plaintext from crypto_bin to hpre_bin");
241*4f75eab0Syuzexi
242*4f75eab0Syuzexi return ret;
243*4f75eab0Syuzexi }
244*4f75eab0Syuzexi
hpre_rsa_encrypt_init(struct hpre_rsa_msg * msg,struct drvcrypt_rsa_ed * rsa_data)245*4f75eab0Syuzexi static TEE_Result hpre_rsa_encrypt_init(struct hpre_rsa_msg *msg,
246*4f75eab0Syuzexi struct drvcrypt_rsa_ed *rsa_data)
247*4f75eab0Syuzexi {
248*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
249*4f75eab0Syuzexi enum hisi_drv_status ret = HISI_QM_DRVCRYPT_NO_ERR;
250*4f75eab0Syuzexi
251*4f75eab0Syuzexi msg->alg_type = HPRE_ALG_NC_NCRT;
252*4f75eab0Syuzexi msg->is_private = rsa_data->key.isprivate;
253*4f75eab0Syuzexi msg->key_bytes = hpre_rsa_get_hw_kbytes(BYTES_TO_BITS(n_bytes));
254*4f75eab0Syuzexi if (!msg->key_bytes)
255*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
256*4f75eab0Syuzexi
257*4f75eab0Syuzexi ret = hpre_rsa_encrypt_alloc(msg);
258*4f75eab0Syuzexi if (ret)
259*4f75eab0Syuzexi return TEE_ERROR_OUT_OF_MEMORY;
260*4f75eab0Syuzexi
261*4f75eab0Syuzexi ret = hpre_rsa_encrypt_bn2bin(msg, rsa_data);
262*4f75eab0Syuzexi if (ret) {
263*4f75eab0Syuzexi hpre_rsa_params_free(msg);
264*4f75eab0Syuzexi return TEE_ERROR_BAD_STATE;
265*4f75eab0Syuzexi }
266*4f75eab0Syuzexi
267*4f75eab0Syuzexi return TEE_SUCCESS;
268*4f75eab0Syuzexi }
269*4f75eab0Syuzexi
rsa_nopad_encrypt(struct drvcrypt_rsa_ed * rsa_data)270*4f75eab0Syuzexi static TEE_Result rsa_nopad_encrypt(struct drvcrypt_rsa_ed *rsa_data)
271*4f75eab0Syuzexi {
272*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
273*4f75eab0Syuzexi struct hpre_rsa_msg msg = { };
274*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
275*4f75eab0Syuzexi
276*4f75eab0Syuzexi if (rsa_data->message.length > n_bytes) {
277*4f75eab0Syuzexi EMSG("Invalid msg length[%zu]", rsa_data->message.length);
278*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
279*4f75eab0Syuzexi }
280*4f75eab0Syuzexi
281*4f75eab0Syuzexi ret = hpre_rsa_encrypt_init(&msg, rsa_data);
282*4f75eab0Syuzexi if (ret) {
283*4f75eab0Syuzexi EMSG("Fail to init rsa msg");
284*4f75eab0Syuzexi return ret;
285*4f75eab0Syuzexi }
286*4f75eab0Syuzexi
287*4f75eab0Syuzexi ret = hpre_rsa_do_task(&msg);
288*4f75eab0Syuzexi if (ret)
289*4f75eab0Syuzexi goto encrypt_deinit;
290*4f75eab0Syuzexi
291*4f75eab0Syuzexi /* Ciphertext can have valid zero data in NOPAD MODE */
292*4f75eab0Syuzexi memcpy(rsa_data->cipher.data, msg.out + msg.key_bytes - n_bytes,
293*4f75eab0Syuzexi n_bytes);
294*4f75eab0Syuzexi rsa_data->cipher.length = n_bytes;
295*4f75eab0Syuzexi
296*4f75eab0Syuzexi encrypt_deinit:
297*4f75eab0Syuzexi hpre_rsa_params_free(&msg);
298*4f75eab0Syuzexi
299*4f75eab0Syuzexi return ret;
300*4f75eab0Syuzexi }
301*4f75eab0Syuzexi
pkcs_v1_5_fill_ps(uint8_t * ps,size_t ps_len)302*4f75eab0Syuzexi static TEE_Result pkcs_v1_5_fill_ps(uint8_t *ps, size_t ps_len)
303*4f75eab0Syuzexi {
304*4f75eab0Syuzexi size_t i = 0;
305*4f75eab0Syuzexi
306*4f75eab0Syuzexi if (hw_get_random_bytes(ps, ps_len)) {
307*4f75eab0Syuzexi EMSG("Fail to get ps data");
308*4f75eab0Syuzexi return TEE_ERROR_NO_DATA;
309*4f75eab0Syuzexi }
310*4f75eab0Syuzexi
311*4f75eab0Syuzexi for (i = 0; i < ps_len; i++) {
312*4f75eab0Syuzexi if (ps[i] == 0)
313*4f75eab0Syuzexi ps[i] = PKCS_V1_5_PS_DATA;
314*4f75eab0Syuzexi }
315*4f75eab0Syuzexi
316*4f75eab0Syuzexi return TEE_SUCCESS;
317*4f75eab0Syuzexi }
318*4f75eab0Syuzexi
rsaes_pkcs_v1_5_encode(struct drvcrypt_rsa_ed * rsa_data,uint8_t * out)319*4f75eab0Syuzexi static TEE_Result rsaes_pkcs_v1_5_encode(struct drvcrypt_rsa_ed *rsa_data,
320*4f75eab0Syuzexi uint8_t *out)
321*4f75eab0Syuzexi {
322*4f75eab0Syuzexi size_t msg_len = rsa_data->message.length;
323*4f75eab0Syuzexi size_t out_len = rsa_data->cipher.length;
324*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
325*4f75eab0Syuzexi uint8_t *ps = out + PKCS_V1_5_PS_POS;
326*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
327*4f75eab0Syuzexi size_t ps_len = 0;
328*4f75eab0Syuzexi
329*4f75eab0Syuzexi /* PKCS_V1.5 format 0x00 || 0x02 || PS non-zero || 0x00 || M */
330*4f75eab0Syuzexi if ((msg_len + PKCS_V1_5_MSG_MIN_LEN) > n_bytes || out_len < n_bytes) {
331*4f75eab0Syuzexi EMSG("Invalid pkcs_v1.5 encode parameter");
332*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
333*4f75eab0Syuzexi }
334*4f75eab0Syuzexi
335*4f75eab0Syuzexi ps_len = n_bytes - PKCS_V1_5_FIXED_LEN - msg_len;
336*4f75eab0Syuzexi ret = pkcs_v1_5_fill_ps(ps, ps_len);
337*4f75eab0Syuzexi if (ret)
338*4f75eab0Syuzexi return ret;
339*4f75eab0Syuzexi
340*4f75eab0Syuzexi out[0] = 0;
341*4f75eab0Syuzexi out[1] = ENCRYPT_PAD;
342*4f75eab0Syuzexi out[PKCS_V1_5_FIXED_LEN + ps_len - 1] = 0;
343*4f75eab0Syuzexi memcpy(out + PKCS_V1_5_FIXED_LEN + ps_len, rsa_data->message.data,
344*4f75eab0Syuzexi msg_len);
345*4f75eab0Syuzexi
346*4f75eab0Syuzexi return TEE_SUCCESS;
347*4f75eab0Syuzexi }
348*4f75eab0Syuzexi
rsa_pkcs_encrypt(struct drvcrypt_rsa_ed * rsa_data)349*4f75eab0Syuzexi static TEE_Result rsa_pkcs_encrypt(struct drvcrypt_rsa_ed *rsa_data)
350*4f75eab0Syuzexi {
351*4f75eab0Syuzexi uint32_t n_bytes = rsa_data->key.n_size;
352*4f75eab0Syuzexi struct drvcrypt_rsa_ed rsa_enc_info = *rsa_data;
353*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
354*4f75eab0Syuzexi
355*4f75eab0Syuzexi /* Alloc pkcs_v1.5 encode message data buf */
356*4f75eab0Syuzexi rsa_enc_info.message.data = malloc(n_bytes);
357*4f75eab0Syuzexi if (!rsa_enc_info.message.data) {
358*4f75eab0Syuzexi EMSG("Fail to alloc message data buf");
359*4f75eab0Syuzexi return TEE_ERROR_OUT_OF_MEMORY;
360*4f75eab0Syuzexi }
361*4f75eab0Syuzexi
362*4f75eab0Syuzexi rsa_enc_info.message.length = n_bytes;
363*4f75eab0Syuzexi ret = rsaes_pkcs_v1_5_encode(rsa_data, rsa_enc_info.message.data);
364*4f75eab0Syuzexi if (ret) {
365*4f75eab0Syuzexi EMSG("Fail to get pkcs_v1.5 encode message data");
366*4f75eab0Syuzexi goto free_data;
367*4f75eab0Syuzexi }
368*4f75eab0Syuzexi
369*4f75eab0Syuzexi ret = rsa_nopad_encrypt(&rsa_enc_info);
370*4f75eab0Syuzexi if (ret)
371*4f75eab0Syuzexi goto free_data;
372*4f75eab0Syuzexi
373*4f75eab0Syuzexi memcpy(rsa_data->cipher.data, rsa_enc_info.cipher.data,
374*4f75eab0Syuzexi rsa_enc_info.cipher.length);
375*4f75eab0Syuzexi rsa_data->cipher.length = rsa_enc_info.cipher.length;
376*4f75eab0Syuzexi
377*4f75eab0Syuzexi free_data:
378*4f75eab0Syuzexi free(rsa_enc_info.message.data);
379*4f75eab0Syuzexi
380*4f75eab0Syuzexi return ret;
381*4f75eab0Syuzexi }
382*4f75eab0Syuzexi
rsa_oaep_fill_db(struct drvcrypt_rsa_ed * rsa_data,uint8_t * db)383*4f75eab0Syuzexi static TEE_Result rsa_oaep_fill_db(struct drvcrypt_rsa_ed *rsa_data,
384*4f75eab0Syuzexi uint8_t *db)
385*4f75eab0Syuzexi {
386*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
387*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
388*4f75eab0Syuzexi size_t db_len = n_bytes - lhash_len - 1;
389*4f75eab0Syuzexi size_t ps_len = 0;
390*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
391*4f75eab0Syuzexi
392*4f75eab0Syuzexi /* oaep db format lhash || ps zero || 01 || M */
393*4f75eab0Syuzexi ret = tee_hash_createdigest(rsa_data->hash_algo, rsa_data->label.data,
394*4f75eab0Syuzexi rsa_data->label.length, db, lhash_len);
395*4f75eab0Syuzexi if (ret) {
396*4f75eab0Syuzexi EMSG("Fail to get label hash");
397*4f75eab0Syuzexi return ret;
398*4f75eab0Syuzexi }
399*4f75eab0Syuzexi
400*4f75eab0Syuzexi ps_len = db_len - lhash_len - rsa_data->message.length - 1;
401*4f75eab0Syuzexi db[lhash_len + ps_len] = 1;
402*4f75eab0Syuzexi memcpy(db + lhash_len + ps_len + 1, rsa_data->message.data,
403*4f75eab0Syuzexi rsa_data->message.length);
404*4f75eab0Syuzexi
405*4f75eab0Syuzexi return TEE_SUCCESS;
406*4f75eab0Syuzexi }
407*4f75eab0Syuzexi
rsa_oaep_fill_maskdb(struct drvcrypt_rsa_ed * rsa_data,uint8_t * seed,uint8_t * db,uint8_t * mask_db)408*4f75eab0Syuzexi static TEE_Result rsa_oaep_fill_maskdb(struct drvcrypt_rsa_ed *rsa_data,
409*4f75eab0Syuzexi uint8_t *seed, uint8_t *db,
410*4f75eab0Syuzexi uint8_t *mask_db)
411*4f75eab0Syuzexi {
412*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
413*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
414*4f75eab0Syuzexi size_t db_len = n_bytes - lhash_len - 1;
415*4f75eab0Syuzexi uint8_t seed_mgf[OAEP_MAX_DB_LEN] = { };
416*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
417*4f75eab0Syuzexi
418*4f75eab0Syuzexi ret = mgf_process(lhash_len, seed, lhash_len, seed_mgf, db_len,
419*4f75eab0Syuzexi rsa_data);
420*4f75eab0Syuzexi if (ret) {
421*4f75eab0Syuzexi EMSG("Fail to get seed_mgf");
422*4f75eab0Syuzexi return ret;
423*4f75eab0Syuzexi }
424*4f75eab0Syuzexi
425*4f75eab0Syuzexi return xor_process(db, seed_mgf, mask_db, db_len);
426*4f75eab0Syuzexi }
427*4f75eab0Syuzexi
rsa_oaep_fill_maskseed(struct drvcrypt_rsa_ed * rsa_data,uint8_t * seed,uint8_t * em)428*4f75eab0Syuzexi static TEE_Result rsa_oaep_fill_maskseed(struct drvcrypt_rsa_ed *rsa_data,
429*4f75eab0Syuzexi uint8_t *seed, uint8_t *em)
430*4f75eab0Syuzexi {
431*4f75eab0Syuzexi uint8_t mask_db_mgf[OAEP_MAX_HASH_LEN] = { 0 };
432*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
433*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
434*4f75eab0Syuzexi size_t db_len = n_bytes - lhash_len - 1;
435*4f75eab0Syuzexi uint8_t *mask_db = em + lhash_len + 1;
436*4f75eab0Syuzexi uint8_t *mask_seed = em + 1;
437*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
438*4f75eab0Syuzexi
439*4f75eab0Syuzexi ret = mgf_process(lhash_len, mask_db, db_len, mask_db_mgf, lhash_len,
440*4f75eab0Syuzexi rsa_data);
441*4f75eab0Syuzexi if (ret) {
442*4f75eab0Syuzexi EMSG("Fail to get mask_db_mgf");
443*4f75eab0Syuzexi return ret;
444*4f75eab0Syuzexi }
445*4f75eab0Syuzexi
446*4f75eab0Syuzexi return xor_process(seed, mask_db_mgf, mask_seed, lhash_len);
447*4f75eab0Syuzexi }
448*4f75eab0Syuzexi
rsa_oaep_encode(struct drvcrypt_rsa_ed * rsa_data,uint8_t * em)449*4f75eab0Syuzexi static TEE_Result rsa_oaep_encode(struct drvcrypt_rsa_ed *rsa_data,
450*4f75eab0Syuzexi uint8_t *em)
451*4f75eab0Syuzexi {
452*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
453*4f75eab0Syuzexi uint8_t db[OAEP_MAX_DB_LEN] = { };
454*4f75eab0Syuzexi uint8_t seed[OAEP_MAX_HASH_LEN] = { };
455*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
456*4f75eab0Syuzexi
457*4f75eab0Syuzexi /* oaep format 00 || maskedseed || maskeddb */
458*4f75eab0Syuzexi em[0] = 0;
459*4f75eab0Syuzexi
460*4f75eab0Syuzexi ret = rsa_oaep_fill_db(rsa_data, db);
461*4f75eab0Syuzexi if (ret)
462*4f75eab0Syuzexi return ret;
463*4f75eab0Syuzexi
464*4f75eab0Syuzexi ret = hw_get_random_bytes(seed, lhash_len);
465*4f75eab0Syuzexi if (ret)
466*4f75eab0Syuzexi return ret;
467*4f75eab0Syuzexi
468*4f75eab0Syuzexi ret = rsa_oaep_fill_maskdb(rsa_data, seed, db, em + lhash_len + 1);
469*4f75eab0Syuzexi if (ret)
470*4f75eab0Syuzexi return ret;
471*4f75eab0Syuzexi
472*4f75eab0Syuzexi return rsa_oaep_fill_maskseed(rsa_data, seed, em);
473*4f75eab0Syuzexi }
474*4f75eab0Syuzexi
rsa_oaep_encrypt(struct drvcrypt_rsa_ed * rsa_data)475*4f75eab0Syuzexi static TEE_Result rsa_oaep_encrypt(struct drvcrypt_rsa_ed *rsa_data)
476*4f75eab0Syuzexi {
477*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
478*4f75eab0Syuzexi struct drvcrypt_rsa_ed rsa_enc_info = *rsa_data;
479*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
480*4f75eab0Syuzexi
481*4f75eab0Syuzexi /* Alloc oaep encode message data buf */
482*4f75eab0Syuzexi rsa_enc_info.message.data = malloc(n_bytes);
483*4f75eab0Syuzexi if (!rsa_enc_info.message.data) {
484*4f75eab0Syuzexi EMSG("Fail to alloc message data buf");
485*4f75eab0Syuzexi return TEE_ERROR_OUT_OF_MEMORY;
486*4f75eab0Syuzexi }
487*4f75eab0Syuzexi
488*4f75eab0Syuzexi rsa_enc_info.message.length = n_bytes;
489*4f75eab0Syuzexi ret = rsa_oaep_encode(rsa_data, rsa_enc_info.message.data);
490*4f75eab0Syuzexi if (ret) {
491*4f75eab0Syuzexi EMSG("Fail to get oaep encode message data");
492*4f75eab0Syuzexi goto free_data;
493*4f75eab0Syuzexi }
494*4f75eab0Syuzexi
495*4f75eab0Syuzexi ret = rsa_nopad_encrypt(&rsa_enc_info);
496*4f75eab0Syuzexi if (ret)
497*4f75eab0Syuzexi goto free_data;
498*4f75eab0Syuzexi
499*4f75eab0Syuzexi memcpy(rsa_data->cipher.data, rsa_enc_info.cipher.data,
500*4f75eab0Syuzexi rsa_enc_info.cipher.length);
501*4f75eab0Syuzexi rsa_data->cipher.length = rsa_enc_info.cipher.length;
502*4f75eab0Syuzexi
503*4f75eab0Syuzexi free_data:
504*4f75eab0Syuzexi free(rsa_enc_info.message.data);
505*4f75eab0Syuzexi
506*4f75eab0Syuzexi return ret;
507*4f75eab0Syuzexi }
508*4f75eab0Syuzexi
hpre_rsa_encrypt(struct drvcrypt_rsa_ed * rsa_data)509*4f75eab0Syuzexi static TEE_Result hpre_rsa_encrypt(struct drvcrypt_rsa_ed *rsa_data)
510*4f75eab0Syuzexi {
511*4f75eab0Syuzexi if (!rsa_data) {
512*4f75eab0Syuzexi EMSG("Invalid rsa encrypt input parameter");
513*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
514*4f75eab0Syuzexi }
515*4f75eab0Syuzexi
516*4f75eab0Syuzexi switch (rsa_data->rsa_id) {
517*4f75eab0Syuzexi case DRVCRYPT_RSA_NOPAD:
518*4f75eab0Syuzexi case DRVCRYPT_RSASSA_PKCS_V1_5:
519*4f75eab0Syuzexi case DRVCRYPT_RSASSA_PSS:
520*4f75eab0Syuzexi return rsa_nopad_encrypt(rsa_data);
521*4f75eab0Syuzexi case DRVCRYPT_RSA_PKCS_V1_5:
522*4f75eab0Syuzexi return rsa_pkcs_encrypt(rsa_data);
523*4f75eab0Syuzexi case DRVCRYPT_RSA_OAEP:
524*4f75eab0Syuzexi return rsa_oaep_encrypt(rsa_data);
525*4f75eab0Syuzexi default:
526*4f75eab0Syuzexi EMSG("Invalid rsa id");
527*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
528*4f75eab0Syuzexi }
529*4f75eab0Syuzexi }
530*4f75eab0Syuzexi
hpre_rsa_crt_decrypt_alloc(struct hpre_rsa_msg * msg)531*4f75eab0Syuzexi static enum hisi_drv_status hpre_rsa_crt_decrypt_alloc(struct hpre_rsa_msg *msg)
532*4f75eab0Syuzexi {
533*4f75eab0Syuzexi uint32_t size = HPRE_RSA_CRT_TOTAL_BUF_SIZE(msg->key_bytes);
534*4f75eab0Syuzexi uint8_t *data = NULL;
535*4f75eab0Syuzexi
536*4f75eab0Syuzexi data = calloc(1, size);
537*4f75eab0Syuzexi if (!data) {
538*4f75eab0Syuzexi EMSG("Fail to alloc rsa crt total buf");
539*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_ENOMEM;
540*4f75eab0Syuzexi }
541*4f75eab0Syuzexi
542*4f75eab0Syuzexi msg->prikey = data;
543*4f75eab0Syuzexi msg->prikey_dma = virt_to_phys(msg->prikey);
544*4f75eab0Syuzexi
545*4f75eab0Syuzexi msg->in = data + (msg->key_bytes * 2) + (msg->key_bytes >> 1);
546*4f75eab0Syuzexi msg->in_dma = msg->prikey_dma + (msg->key_bytes * 2) +
547*4f75eab0Syuzexi (msg->key_bytes >> 1);
548*4f75eab0Syuzexi
549*4f75eab0Syuzexi msg->out = msg->in + msg->key_bytes;
550*4f75eab0Syuzexi msg->out_dma = msg->in_dma + msg->key_bytes;
551*4f75eab0Syuzexi
552*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_NO_ERR;
553*4f75eab0Syuzexi }
554*4f75eab0Syuzexi
555*4f75eab0Syuzexi static enum hisi_drv_status
hpre_rsa_ncrt_decrypt_alloc(struct hpre_rsa_msg * msg)556*4f75eab0Syuzexi hpre_rsa_ncrt_decrypt_alloc(struct hpre_rsa_msg *msg)
557*4f75eab0Syuzexi {
558*4f75eab0Syuzexi uint32_t size = HPRE_RSA_NCRT_TOTAL_BUF_SIZE(msg->key_bytes);
559*4f75eab0Syuzexi uint8_t *data = NULL;
560*4f75eab0Syuzexi
561*4f75eab0Syuzexi data = calloc(1, size);
562*4f75eab0Syuzexi if (!data) {
563*4f75eab0Syuzexi EMSG("Fail to alloc rsa ncrt buf");
564*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_ENOMEM;
565*4f75eab0Syuzexi }
566*4f75eab0Syuzexi
567*4f75eab0Syuzexi msg->prikey = data;
568*4f75eab0Syuzexi msg->prikey_dma = virt_to_phys(msg->prikey);
569*4f75eab0Syuzexi
570*4f75eab0Syuzexi msg->in = data + (msg->key_bytes * 2);
571*4f75eab0Syuzexi msg->in_dma = msg->prikey_dma + (msg->key_bytes * 2);
572*4f75eab0Syuzexi
573*4f75eab0Syuzexi msg->out = msg->in + msg->key_bytes;
574*4f75eab0Syuzexi msg->out_dma = msg->in_dma + msg->key_bytes;
575*4f75eab0Syuzexi
576*4f75eab0Syuzexi return HISI_QM_DRVCRYPT_NO_ERR;
577*4f75eab0Syuzexi }
578*4f75eab0Syuzexi
579*4f75eab0Syuzexi static enum hisi_drv_status
hpre_rsa_crt_decrypt_bn2bin(struct hpre_rsa_msg * msg,struct drvcrypt_rsa_ed * rsa_data)580*4f75eab0Syuzexi hpre_rsa_crt_decrypt_bn2bin(struct hpre_rsa_msg *msg,
581*4f75eab0Syuzexi struct drvcrypt_rsa_ed *rsa_data)
582*4f75eab0Syuzexi {
583*4f75eab0Syuzexi struct rsa_keypair *key = rsa_data->key.key;
584*4f75eab0Syuzexi uint32_t p_bytes = msg->key_bytes >> 1;
585*4f75eab0Syuzexi uint32_t dq_len = crypto_bignum_num_bytes(key->dq);
586*4f75eab0Syuzexi uint32_t dp_len = crypto_bignum_num_bytes(key->dp);
587*4f75eab0Syuzexi uint32_t q_len = crypto_bignum_num_bytes(key->q);
588*4f75eab0Syuzexi uint32_t p_len = crypto_bignum_num_bytes(key->p);
589*4f75eab0Syuzexi uint32_t qp_len = crypto_bignum_num_bytes(key->qp);
590*4f75eab0Syuzexi uint8_t *dq = msg->prikey;
591*4f75eab0Syuzexi uint8_t *dp = msg->prikey + p_bytes;
592*4f75eab0Syuzexi uint8_t *q = dp + p_bytes;
593*4f75eab0Syuzexi uint8_t *p = q + p_bytes;
594*4f75eab0Syuzexi uint8_t *qp = p + p_bytes;
595*4f75eab0Syuzexi enum hisi_drv_status ret = HISI_QM_DRVCRYPT_NO_ERR;
596*4f75eab0Syuzexi
597*4f75eab0Syuzexi crypto_bignum_bn2bin(key->dq, dq);
598*4f75eab0Syuzexi crypto_bignum_bn2bin(key->dp, dp);
599*4f75eab0Syuzexi crypto_bignum_bn2bin(key->q, q);
600*4f75eab0Syuzexi crypto_bignum_bn2bin(key->p, p);
601*4f75eab0Syuzexi crypto_bignum_bn2bin(key->qp, qp);
602*4f75eab0Syuzexi
603*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(dq, dq, p_bytes, dq_len);
604*4f75eab0Syuzexi if (ret) {
605*4f75eab0Syuzexi EMSG("Fail to transfer rsa crt dq from crypto_bin to hpre_bin");
606*4f75eab0Syuzexi return ret;
607*4f75eab0Syuzexi }
608*4f75eab0Syuzexi
609*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(dp, dp, p_bytes, dp_len);
610*4f75eab0Syuzexi if (ret) {
611*4f75eab0Syuzexi EMSG("Fail to transfer rsa crt dp from crypto_bin to hpre_bin");
612*4f75eab0Syuzexi return ret;
613*4f75eab0Syuzexi }
614*4f75eab0Syuzexi
615*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(q, q, p_bytes, q_len);
616*4f75eab0Syuzexi if (ret) {
617*4f75eab0Syuzexi EMSG("Fail to transfer rsa crt q from crypto_bin to hpre_bin");
618*4f75eab0Syuzexi return ret;
619*4f75eab0Syuzexi }
620*4f75eab0Syuzexi
621*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(p, p, p_bytes, p_len);
622*4f75eab0Syuzexi if (ret) {
623*4f75eab0Syuzexi EMSG("Fail to transfer rsa crt p from crypto_bin to hpre_bin");
624*4f75eab0Syuzexi return ret;
625*4f75eab0Syuzexi }
626*4f75eab0Syuzexi
627*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(qp, qp, p_bytes, qp_len);
628*4f75eab0Syuzexi if (ret) {
629*4f75eab0Syuzexi EMSG("Fail to transfer rsa crt qinv from crypto_bin to hpre_bin");
630*4f75eab0Syuzexi return ret;
631*4f75eab0Syuzexi }
632*4f75eab0Syuzexi
633*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(msg->in, rsa_data->cipher.data,
634*4f75eab0Syuzexi msg->key_bytes, rsa_data->cipher.length);
635*4f75eab0Syuzexi if (ret)
636*4f75eab0Syuzexi EMSG("Fail to transfer rsa ciphertext from crypto_bin to hpre_bin");
637*4f75eab0Syuzexi
638*4f75eab0Syuzexi return ret;
639*4f75eab0Syuzexi }
640*4f75eab0Syuzexi
641*4f75eab0Syuzexi static enum hisi_drv_status
hpre_rsa_ncrt_decrypt_bn2bin(struct hpre_rsa_msg * msg,struct drvcrypt_rsa_ed * rsa_data)642*4f75eab0Syuzexi hpre_rsa_ncrt_decrypt_bn2bin(struct hpre_rsa_msg *msg,
643*4f75eab0Syuzexi struct drvcrypt_rsa_ed *rsa_data)
644*4f75eab0Syuzexi {
645*4f75eab0Syuzexi struct rsa_keypair *key = rsa_data->key.key;
646*4f75eab0Syuzexi uint32_t d_len = 0;
647*4f75eab0Syuzexi uint32_t n_len = 0;
648*4f75eab0Syuzexi enum hisi_drv_status ret = HISI_QM_DRVCRYPT_NO_ERR;
649*4f75eab0Syuzexi uint8_t *n = NULL;
650*4f75eab0Syuzexi
651*4f75eab0Syuzexi n = msg->prikey + msg->key_bytes;
652*4f75eab0Syuzexi
653*4f75eab0Syuzexi crypto_bignum_bn2bin(key->d, msg->prikey);
654*4f75eab0Syuzexi crypto_bignum_bn2bin(key->n, n);
655*4f75eab0Syuzexi d_len = crypto_bignum_num_bytes(key->d);
656*4f75eab0Syuzexi n_len = crypto_bignum_num_bytes(key->n);
657*4f75eab0Syuzexi
658*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(msg->prikey, msg->prikey, msg->key_bytes,
659*4f75eab0Syuzexi d_len);
660*4f75eab0Syuzexi if (ret) {
661*4f75eab0Syuzexi EMSG("Fail to transfer rsa ncrt d from crypto_bin to hpre_bin");
662*4f75eab0Syuzexi return ret;
663*4f75eab0Syuzexi }
664*4f75eab0Syuzexi
665*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(n, n, msg->key_bytes, n_len);
666*4f75eab0Syuzexi if (ret) {
667*4f75eab0Syuzexi EMSG("Fail to transfer rsa ncrt n from crypto_bin to hpre_bin");
668*4f75eab0Syuzexi return ret;
669*4f75eab0Syuzexi }
670*4f75eab0Syuzexi
671*4f75eab0Syuzexi ret = hpre_bin_from_crypto_bin(msg->in, rsa_data->cipher.data,
672*4f75eab0Syuzexi msg->key_bytes, rsa_data->cipher.length);
673*4f75eab0Syuzexi if (ret)
674*4f75eab0Syuzexi EMSG("Fail to transfer rsa ciphertext from crypto_bin to hpre_bin");
675*4f75eab0Syuzexi
676*4f75eab0Syuzexi return ret;
677*4f75eab0Syuzexi }
678*4f75eab0Syuzexi
hpre_rsa_is_crt_mod(struct rsa_keypair * key)679*4f75eab0Syuzexi static bool hpre_rsa_is_crt_mod(struct rsa_keypair *key)
680*4f75eab0Syuzexi {
681*4f75eab0Syuzexi if (key->p && crypto_bignum_num_bits(key->p) &&
682*4f75eab0Syuzexi key->q && crypto_bignum_num_bits(key->q) &&
683*4f75eab0Syuzexi key->dp && crypto_bignum_num_bits(key->dp) &&
684*4f75eab0Syuzexi key->dq && crypto_bignum_num_bits(key->dq) &&
685*4f75eab0Syuzexi key->qp && crypto_bignum_num_bits(key->qp))
686*4f75eab0Syuzexi return true;
687*4f75eab0Syuzexi
688*4f75eab0Syuzexi return false;
689*4f75eab0Syuzexi }
690*4f75eab0Syuzexi
hpre_rsa_decrypt_init(struct hpre_rsa_msg * msg,struct drvcrypt_rsa_ed * rsa_data)691*4f75eab0Syuzexi static TEE_Result hpre_rsa_decrypt_init(struct hpre_rsa_msg *msg,
692*4f75eab0Syuzexi struct drvcrypt_rsa_ed *rsa_data)
693*4f75eab0Syuzexi {
694*4f75eab0Syuzexi struct rsa_keypair *key = rsa_data->key.key;
695*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
696*4f75eab0Syuzexi bool is_crt = false;
697*4f75eab0Syuzexi enum hisi_drv_status ret = HISI_QM_DRVCRYPT_NO_ERR;
698*4f75eab0Syuzexi
699*4f75eab0Syuzexi msg->is_private = rsa_data->key.isprivate;
700*4f75eab0Syuzexi msg->key_bytes = hpre_rsa_get_hw_kbytes(BYTES_TO_BITS(n_bytes));
701*4f75eab0Syuzexi if (!msg->key_bytes)
702*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
703*4f75eab0Syuzexi
704*4f75eab0Syuzexi is_crt = hpre_rsa_is_crt_mod(key);
705*4f75eab0Syuzexi if (is_crt) {
706*4f75eab0Syuzexi msg->alg_type = HPRE_ALG_NC_CRT;
707*4f75eab0Syuzexi ret = hpre_rsa_crt_decrypt_alloc(msg);
708*4f75eab0Syuzexi if (ret)
709*4f75eab0Syuzexi return TEE_ERROR_OUT_OF_MEMORY;
710*4f75eab0Syuzexi
711*4f75eab0Syuzexi ret = hpre_rsa_crt_decrypt_bn2bin(msg, rsa_data);
712*4f75eab0Syuzexi if (ret) {
713*4f75eab0Syuzexi hpre_rsa_params_free(msg);
714*4f75eab0Syuzexi return TEE_ERROR_BAD_STATE;
715*4f75eab0Syuzexi }
716*4f75eab0Syuzexi } else {
717*4f75eab0Syuzexi msg->alg_type = HPRE_ALG_NC_NCRT;
718*4f75eab0Syuzexi ret = hpre_rsa_ncrt_decrypt_alloc(msg);
719*4f75eab0Syuzexi if (ret)
720*4f75eab0Syuzexi return TEE_ERROR_OUT_OF_MEMORY;
721*4f75eab0Syuzexi
722*4f75eab0Syuzexi ret = hpre_rsa_ncrt_decrypt_bn2bin(msg, rsa_data);
723*4f75eab0Syuzexi if (ret) {
724*4f75eab0Syuzexi hpre_rsa_params_free(msg);
725*4f75eab0Syuzexi return TEE_ERROR_BAD_STATE;
726*4f75eab0Syuzexi }
727*4f75eab0Syuzexi }
728*4f75eab0Syuzexi
729*4f75eab0Syuzexi return TEE_SUCCESS;
730*4f75eab0Syuzexi }
731*4f75eab0Syuzexi
rsa_nopad_decrypt(struct drvcrypt_rsa_ed * rsa_data)732*4f75eab0Syuzexi static TEE_Result rsa_nopad_decrypt(struct drvcrypt_rsa_ed *rsa_data)
733*4f75eab0Syuzexi {
734*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
735*4f75eab0Syuzexi struct hpre_rsa_msg msg = { };
736*4f75eab0Syuzexi uint32_t offset = 0;
737*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
738*4f75eab0Syuzexi uint8_t *pos = NULL;
739*4f75eab0Syuzexi
740*4f75eab0Syuzexi if (rsa_data->cipher.length > n_bytes) {
741*4f75eab0Syuzexi EMSG("Invalid cipher length[%zu]", rsa_data->cipher.length);
742*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
743*4f75eab0Syuzexi }
744*4f75eab0Syuzexi
745*4f75eab0Syuzexi ret = hpre_rsa_decrypt_init(&msg, rsa_data);
746*4f75eab0Syuzexi if (ret) {
747*4f75eab0Syuzexi EMSG("Fail to init rsa msg");
748*4f75eab0Syuzexi return ret;
749*4f75eab0Syuzexi }
750*4f75eab0Syuzexi
751*4f75eab0Syuzexi ret = hpre_rsa_do_task(&msg);
752*4f75eab0Syuzexi if (ret)
753*4f75eab0Syuzexi goto decrypt_deinit;
754*4f75eab0Syuzexi
755*4f75eab0Syuzexi pos = msg.out + msg.key_bytes - n_bytes;
756*4f75eab0Syuzexi if (rsa_data->rsa_id == DRVCRYPT_RSA_NOPAD) {
757*4f75eab0Syuzexi /* Plaintext can not have valid zero data in NOPAD MODE */
758*4f75eab0Syuzexi while ((offset < n_bytes - 1) && (pos[offset] == 0))
759*4f75eab0Syuzexi offset++;
760*4f75eab0Syuzexi }
761*4f75eab0Syuzexi
762*4f75eab0Syuzexi rsa_data->message.length = n_bytes - offset;
763*4f75eab0Syuzexi memcpy(rsa_data->message.data, pos + offset, rsa_data->message.length);
764*4f75eab0Syuzexi
765*4f75eab0Syuzexi decrypt_deinit:
766*4f75eab0Syuzexi hpre_rsa_params_free(&msg);
767*4f75eab0Syuzexi
768*4f75eab0Syuzexi return ret;
769*4f75eab0Syuzexi }
770*4f75eab0Syuzexi
rsaes_pkcs_v1_5_decode(struct drvcrypt_rsa_ed * rsa_data,uint8_t * out,size_t * out_len)771*4f75eab0Syuzexi static TEE_Result rsaes_pkcs_v1_5_decode(struct drvcrypt_rsa_ed *rsa_data,
772*4f75eab0Syuzexi uint8_t *out, size_t *out_len)
773*4f75eab0Syuzexi {
774*4f75eab0Syuzexi size_t em_len = rsa_data->message.length;
775*4f75eab0Syuzexi uint8_t *em = rsa_data->message.data;
776*4f75eab0Syuzexi size_t ps_len = 0;
777*4f75eab0Syuzexi size_t i = 0;
778*4f75eab0Syuzexi
779*4f75eab0Syuzexi /* PKCS_V1.5 EM format 0x00 || 0x02 || PS non-zero || 0x00 || M */
780*4f75eab0Syuzexi if (em_len < PKCS_V1_5_MSG_MIN_LEN || em[0] != 0 ||
781*4f75eab0Syuzexi em[1] != ENCRYPT_PAD) {
782*4f75eab0Syuzexi EMSG("Invalid pkcs_v1.5 decode parameter");
783*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
784*4f75eab0Syuzexi }
785*4f75eab0Syuzexi
786*4f75eab0Syuzexi for (i = PKCS_V1_5_PS_POS; i < em_len; i++) {
787*4f75eab0Syuzexi if (em[i] == 0)
788*4f75eab0Syuzexi break;
789*4f75eab0Syuzexi }
790*4f75eab0Syuzexi
791*4f75eab0Syuzexi if (i >= em_len) {
792*4f75eab0Syuzexi EMSG("Fail to find zero pos");
793*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
794*4f75eab0Syuzexi }
795*4f75eab0Syuzexi
796*4f75eab0Syuzexi ps_len = i - PKCS_V1_5_PS_POS;
797*4f75eab0Syuzexi if (em_len - ps_len - PKCS_V1_5_FIXED_LEN > *out_len ||
798*4f75eab0Syuzexi ps_len < PKCS_V1_5_PS_MIN_LEN) {
799*4f75eab0Syuzexi EMSG("Invalid pkcs_v1.5 decode ps_len");
800*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
801*4f75eab0Syuzexi }
802*4f75eab0Syuzexi
803*4f75eab0Syuzexi *out_len = em_len - ps_len - PKCS_V1_5_FIXED_LEN;
804*4f75eab0Syuzexi memcpy(out, em + ps_len + PKCS_V1_5_FIXED_LEN, *out_len);
805*4f75eab0Syuzexi
806*4f75eab0Syuzexi return TEE_SUCCESS;
807*4f75eab0Syuzexi }
808*4f75eab0Syuzexi
rsa_pkcs_decrypt(struct drvcrypt_rsa_ed * rsa_data)809*4f75eab0Syuzexi static TEE_Result rsa_pkcs_decrypt(struct drvcrypt_rsa_ed *rsa_data)
810*4f75eab0Syuzexi {
811*4f75eab0Syuzexi uint32_t n_bytes = rsa_data->key.n_size;
812*4f75eab0Syuzexi struct drvcrypt_rsa_ed rsa_dec_info = *rsa_data;
813*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
814*4f75eab0Syuzexi
815*4f75eab0Syuzexi /* Alloc pkcs_v1.5 encode message data buf */
816*4f75eab0Syuzexi rsa_dec_info.message.data = malloc(n_bytes);
817*4f75eab0Syuzexi if (!rsa_dec_info.message.data) {
818*4f75eab0Syuzexi EMSG("Fail to alloc message data buf");
819*4f75eab0Syuzexi return TEE_ERROR_OUT_OF_MEMORY;
820*4f75eab0Syuzexi }
821*4f75eab0Syuzexi
822*4f75eab0Syuzexi rsa_dec_info.message.length = n_bytes;
823*4f75eab0Syuzexi ret = rsa_nopad_decrypt(&rsa_dec_info);
824*4f75eab0Syuzexi if (ret)
825*4f75eab0Syuzexi goto free_data;
826*4f75eab0Syuzexi
827*4f75eab0Syuzexi ret = rsaes_pkcs_v1_5_decode(&rsa_dec_info, rsa_data->message.data,
828*4f75eab0Syuzexi &rsa_data->message.length);
829*4f75eab0Syuzexi if (ret)
830*4f75eab0Syuzexi EMSG("Fail to get pkcs_v1.5 decode message data");
831*4f75eab0Syuzexi
832*4f75eab0Syuzexi free_data:
833*4f75eab0Syuzexi free(rsa_dec_info.message.data);
834*4f75eab0Syuzexi
835*4f75eab0Syuzexi return ret;
836*4f75eab0Syuzexi }
837*4f75eab0Syuzexi
rsa_oaep_get_seed(struct drvcrypt_rsa_ed * rsa_data,uint8_t * mask_db,uint8_t * seed)838*4f75eab0Syuzexi static TEE_Result rsa_oaep_get_seed(struct drvcrypt_rsa_ed *rsa_data,
839*4f75eab0Syuzexi uint8_t *mask_db, uint8_t *seed)
840*4f75eab0Syuzexi {
841*4f75eab0Syuzexi size_t db_len = rsa_data->key.n_size - rsa_data->digest_size - 1;
842*4f75eab0Syuzexi uint8_t mask_db_mgf[OAEP_MAX_HASH_LEN] = { };
843*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
844*4f75eab0Syuzexi uint8_t *mask_seed = NULL;
845*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
846*4f75eab0Syuzexi
847*4f75eab0Syuzexi mask_seed = rsa_data->message.data + 1;
848*4f75eab0Syuzexi
849*4f75eab0Syuzexi ret = mgf_process(lhash_len, mask_db, db_len, mask_db_mgf, lhash_len,
850*4f75eab0Syuzexi rsa_data);
851*4f75eab0Syuzexi if (ret) {
852*4f75eab0Syuzexi EMSG("Fail to get mask_db mgf result");
853*4f75eab0Syuzexi return ret;
854*4f75eab0Syuzexi }
855*4f75eab0Syuzexi
856*4f75eab0Syuzexi return xor_process(mask_seed, mask_db_mgf, seed, lhash_len);
857*4f75eab0Syuzexi }
858*4f75eab0Syuzexi
rsa_oaep_get_db(struct drvcrypt_rsa_ed * rsa_data,uint8_t * mask_db,uint8_t * seed,uint8_t * db)859*4f75eab0Syuzexi static TEE_Result rsa_oaep_get_db(struct drvcrypt_rsa_ed *rsa_data,
860*4f75eab0Syuzexi uint8_t *mask_db, uint8_t *seed, uint8_t *db)
861*4f75eab0Syuzexi {
862*4f75eab0Syuzexi size_t db_len = rsa_data->key.n_size - rsa_data->digest_size - 1;
863*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
864*4f75eab0Syuzexi uint8_t seed_mgf[OAEP_MAX_DB_LEN] = { };
865*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
866*4f75eab0Syuzexi
867*4f75eab0Syuzexi ret = mgf_process(lhash_len, seed, lhash_len, seed_mgf, db_len,
868*4f75eab0Syuzexi rsa_data);
869*4f75eab0Syuzexi if (ret) {
870*4f75eab0Syuzexi EMSG("Fail to get seed mgf result");
871*4f75eab0Syuzexi return ret;
872*4f75eab0Syuzexi }
873*4f75eab0Syuzexi
874*4f75eab0Syuzexi return xor_process(mask_db, seed_mgf, db, db_len);
875*4f75eab0Syuzexi }
876*4f75eab0Syuzexi
rsa_oaep_get_msg(struct drvcrypt_rsa_ed * rsa_data,uint8_t * db,uint8_t * out,size_t * out_len)877*4f75eab0Syuzexi static TEE_Result rsa_oaep_get_msg(struct drvcrypt_rsa_ed *rsa_data,
878*4f75eab0Syuzexi uint8_t *db, uint8_t *out, size_t *out_len)
879*4f75eab0Syuzexi {
880*4f75eab0Syuzexi size_t db_len = rsa_data->key.n_size - rsa_data->digest_size - 1;
881*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
882*4f75eab0Syuzexi uint8_t hash[OAEP_MAX_HASH_LEN] = { };
883*4f75eab0Syuzexi size_t msg_len = 0;
884*4f75eab0Syuzexi size_t lp_len = 0;
885*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
886*4f75eab0Syuzexi
887*4f75eab0Syuzexi /* oaep db format lhash || ps zero || 01 || M */
888*4f75eab0Syuzexi ret = tee_hash_createdigest(rsa_data->hash_algo, rsa_data->label.data,
889*4f75eab0Syuzexi rsa_data->label.length, hash, lhash_len);
890*4f75eab0Syuzexi if (ret) {
891*4f75eab0Syuzexi EMSG("Fail to get label hash");
892*4f75eab0Syuzexi return ret;
893*4f75eab0Syuzexi }
894*4f75eab0Syuzexi
895*4f75eab0Syuzexi if (memcmp(hash, db, lhash_len)) {
896*4f75eab0Syuzexi EMSG("Hash is not equal");
897*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
898*4f75eab0Syuzexi }
899*4f75eab0Syuzexi
900*4f75eab0Syuzexi for (lp_len = lhash_len; lp_len < db_len; lp_len++) {
901*4f75eab0Syuzexi if (db[lp_len] != 0)
902*4f75eab0Syuzexi break;
903*4f75eab0Syuzexi }
904*4f75eab0Syuzexi
905*4f75eab0Syuzexi if (lp_len == db_len) {
906*4f75eab0Syuzexi EMSG("Fail to find fixed 01 in db");
907*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
908*4f75eab0Syuzexi }
909*4f75eab0Syuzexi
910*4f75eab0Syuzexi msg_len = db_len - lp_len - 1;
911*4f75eab0Syuzexi if (msg_len > rsa_data->message.length) {
912*4f75eab0Syuzexi DMSG("Message space is not enough");
913*4f75eab0Syuzexi *out_len = msg_len;
914*4f75eab0Syuzexi return TEE_ERROR_SHORT_BUFFER;
915*4f75eab0Syuzexi }
916*4f75eab0Syuzexi
917*4f75eab0Syuzexi *out_len = msg_len;
918*4f75eab0Syuzexi memcpy(out, db + lp_len + 1, msg_len);
919*4f75eab0Syuzexi
920*4f75eab0Syuzexi return TEE_SUCCESS;
921*4f75eab0Syuzexi }
922*4f75eab0Syuzexi
rsa_oaep_decode(struct drvcrypt_rsa_ed * rsa_data,uint8_t * out,size_t * out_len)923*4f75eab0Syuzexi static TEE_Result rsa_oaep_decode(struct drvcrypt_rsa_ed *rsa_data,
924*4f75eab0Syuzexi uint8_t *out, size_t *out_len)
925*4f75eab0Syuzexi {
926*4f75eab0Syuzexi size_t lhash_len = rsa_data->digest_size;
927*4f75eab0Syuzexi uint8_t seed[OAEP_MAX_HASH_LEN] = { };
928*4f75eab0Syuzexi uint8_t db[OAEP_MAX_DB_LEN] = { };
929*4f75eab0Syuzexi uint8_t *mask_db = NULL;
930*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
931*4f75eab0Syuzexi
932*4f75eab0Syuzexi /* oaep format 00 || maskedseed || maskeddb */
933*4f75eab0Syuzexi mask_db = rsa_data->message.data + lhash_len + 1;
934*4f75eab0Syuzexi ret = rsa_oaep_get_seed(rsa_data, mask_db, seed);
935*4f75eab0Syuzexi if (ret)
936*4f75eab0Syuzexi return ret;
937*4f75eab0Syuzexi
938*4f75eab0Syuzexi ret = rsa_oaep_get_db(rsa_data, mask_db, seed, db);
939*4f75eab0Syuzexi if (ret)
940*4f75eab0Syuzexi return ret;
941*4f75eab0Syuzexi
942*4f75eab0Syuzexi return rsa_oaep_get_msg(rsa_data, db, out, out_len);
943*4f75eab0Syuzexi }
944*4f75eab0Syuzexi
rsa_oaep_decrypt(struct drvcrypt_rsa_ed * rsa_data)945*4f75eab0Syuzexi static TEE_Result rsa_oaep_decrypt(struct drvcrypt_rsa_ed *rsa_data)
946*4f75eab0Syuzexi {
947*4f75eab0Syuzexi size_t n_bytes = rsa_data->key.n_size;
948*4f75eab0Syuzexi struct drvcrypt_rsa_ed rsa_dec_info = *rsa_data;
949*4f75eab0Syuzexi TEE_Result ret = TEE_SUCCESS;
950*4f75eab0Syuzexi
951*4f75eab0Syuzexi /* Alloc oaep encode message data buf */
952*4f75eab0Syuzexi rsa_dec_info.message.data = malloc(n_bytes);
953*4f75eab0Syuzexi if (!rsa_dec_info.message.data) {
954*4f75eab0Syuzexi EMSG("Fail to alloc message data buf");
955*4f75eab0Syuzexi return TEE_ERROR_OUT_OF_MEMORY;
956*4f75eab0Syuzexi }
957*4f75eab0Syuzexi
958*4f75eab0Syuzexi rsa_dec_info.message.length = n_bytes;
959*4f75eab0Syuzexi ret = rsa_nopad_decrypt(&rsa_dec_info);
960*4f75eab0Syuzexi if (ret)
961*4f75eab0Syuzexi goto free_data;
962*4f75eab0Syuzexi
963*4f75eab0Syuzexi ret = rsa_oaep_decode(&rsa_dec_info, rsa_data->message.data,
964*4f75eab0Syuzexi &rsa_data->message.length);
965*4f75eab0Syuzexi if (ret)
966*4f75eab0Syuzexi EMSG("Fail to get oaep decode message data");
967*4f75eab0Syuzexi
968*4f75eab0Syuzexi free_data:
969*4f75eab0Syuzexi free(rsa_dec_info.message.data);
970*4f75eab0Syuzexi
971*4f75eab0Syuzexi return ret;
972*4f75eab0Syuzexi }
973*4f75eab0Syuzexi
hpre_rsa_decrypt(struct drvcrypt_rsa_ed * rsa_data)974*4f75eab0Syuzexi static TEE_Result hpre_rsa_decrypt(struct drvcrypt_rsa_ed *rsa_data)
975*4f75eab0Syuzexi {
976*4f75eab0Syuzexi if (!rsa_data) {
977*4f75eab0Syuzexi EMSG("Invalid rsa decrypt input parameter");
978*4f75eab0Syuzexi return TEE_ERROR_BAD_PARAMETERS;
979*4f75eab0Syuzexi }
980*4f75eab0Syuzexi
981*4f75eab0Syuzexi switch (rsa_data->rsa_id) {
982*4f75eab0Syuzexi case DRVCRYPT_RSA_NOPAD:
983*4f75eab0Syuzexi case DRVCRYPT_RSASSA_PKCS_V1_5:
984*4f75eab0Syuzexi case DRVCRYPT_RSASSA_PSS:
985*4f75eab0Syuzexi return rsa_nopad_decrypt(rsa_data);
986*4f75eab0Syuzexi case DRVCRYPT_RSA_PKCS_V1_5:
987*4f75eab0Syuzexi return rsa_pkcs_decrypt(rsa_data);
988*4f75eab0Syuzexi case DRVCRYPT_RSA_OAEP:
989*4f75eab0Syuzexi return rsa_oaep_decrypt(rsa_data);
990*4f75eab0Syuzexi default:
991*4f75eab0Syuzexi EMSG("Invalid rsa id");
992*4f75eab0Syuzexi return TEE_ERROR_NOT_SUPPORTED;
993*4f75eab0Syuzexi }
994*4f75eab0Syuzexi }
995*4f75eab0Syuzexi
996*4f75eab0Syuzexi static const struct drvcrypt_rsa driver_rsa = {
997*4f75eab0Syuzexi .alloc_keypair = sw_crypto_acipher_alloc_rsa_keypair,
998*4f75eab0Syuzexi .alloc_publickey = sw_crypto_acipher_alloc_rsa_public_key,
999*4f75eab0Syuzexi .free_publickey = sw_crypto_acipher_free_rsa_public_key,
1000*4f75eab0Syuzexi .free_keypair = sw_crypto_acipher_free_rsa_keypair,
1001*4f75eab0Syuzexi .gen_keypair = sw_crypto_acipher_gen_rsa_key,
1002*4f75eab0Syuzexi .encrypt = hpre_rsa_encrypt,
1003*4f75eab0Syuzexi .decrypt = hpre_rsa_decrypt,
1004*4f75eab0Syuzexi .optional = {
1005*4f75eab0Syuzexi /*
1006*4f75eab0Syuzexi * If ssa_sign or verify is NULL, the framework will fill
1007*4f75eab0Syuzexi * data format directly by soft calculation. Then call api
1008*4f75eab0Syuzexi * encrypt or decrypt.
1009*4f75eab0Syuzexi */
1010*4f75eab0Syuzexi .ssa_sign = NULL,
1011*4f75eab0Syuzexi .ssa_verify = NULL,
1012*4f75eab0Syuzexi },
1013*4f75eab0Syuzexi };
1014*4f75eab0Syuzexi
hpre_rsa_init(void)1015*4f75eab0Syuzexi static TEE_Result hpre_rsa_init(void)
1016*4f75eab0Syuzexi {
1017*4f75eab0Syuzexi TEE_Result ret = drvcrypt_register_rsa(&driver_rsa);
1018*4f75eab0Syuzexi
1019*4f75eab0Syuzexi if (ret != TEE_SUCCESS)
1020*4f75eab0Syuzexi EMSG("hpre rsa register to crypto fail");
1021*4f75eab0Syuzexi
1022*4f75eab0Syuzexi return ret;
1023*4f75eab0Syuzexi }
1024*4f75eab0Syuzexi
1025*4f75eab0Syuzexi driver_init(hpre_rsa_init);
1026