1 /*
2 * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3 * Licensed under the Mulan PSL v2.
4 * You can use this software according to the terms and conditions of the Mulan PSL v2.
5 * You may obtain a copy of Mulan PSL v2 at:
6 * http://license.coscl.org.cn/MulanPSL2
7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9 * PURPOSE.
10 * See the Mulan PSL v2 for more details.
11 */
12
13 #include "crypto_hal_rsa.h"
14 #include <tee_log.h>
15 #include <tee_crypto_hal.h>
16 #include "crypto_manager.h"
17 #include "soft_rsa_api.h"
18
19 #define HALF_LENGTH 2
20 #define MAX_KEY_SIZE 512
21 #define BITS_OF_BYTE 8
22
tee_crypto_rsa_generate_keypair(uint32_t key_size,const struct memref_t * e_value,bool crt_mode,struct rsa_priv_key_t * key_pair,uint32_t engine)23 int32_t tee_crypto_rsa_generate_keypair(uint32_t key_size, const struct memref_t *e_value, bool crt_mode,
24 struct rsa_priv_key_t *key_pair, uint32_t engine)
25 {
26 if ((e_value == NULL) || (key_pair == NULL)) {
27 tloge("Invalid params\n");
28 return CRYPTO_BAD_PARAMETERS;
29 }
30
31 key_pair->e_len = e_value->size;
32 key_pair->n_len = key_size;
33 key_pair->d_len = key_size;
34 key_pair->p_len = key_size / HALF_LENGTH;
35 key_pair->q_len = key_size / HALF_LENGTH;
36 key_pair->dp_len = key_size / HALF_LENGTH;
37 key_pair->dq_len = key_size / HALF_LENGTH;
38 key_pair->qinv_len = key_size / HALF_LENGTH;
39
40 if (engine == SOFT_CRYPTO)
41 return soft_crypto_rsa_generate_keypair(key_size, e_value, crt_mode, key_pair);
42
43 if (key_size > MAX_KEY_SIZE) {
44 tloge("key is too long\n");
45 return CRYPTO_BAD_PARAMETERS;
46 }
47 key_size *= BITS_OF_BYTE;
48 return crypto_driver_rsa_generate_keypair(key_size, e_value, crt_mode, key_pair, engine);
49 }
50
tee_crypto_rsa_encrypt(uint32_t alg_type,const struct rsa_pub_key_t * public_key,const struct asymmetric_params_t * rsa_params,const struct memref_t * data_in,struct memref_t * data_out,uint32_t engine)51 int32_t tee_crypto_rsa_encrypt(uint32_t alg_type, const struct rsa_pub_key_t *public_key,
52 const struct asymmetric_params_t *rsa_params, const struct memref_t *data_in,
53 struct memref_t *data_out, uint32_t engine)
54 {
55 bool check = ((public_key == NULL) || (data_in == NULL) || (data_out == NULL));
56 if (check) {
57 tloge("Invalid params\n");
58 return CRYPTO_BAD_PARAMETERS;
59 }
60
61 if (engine == SOFT_CRYPTO)
62 return soft_crypto_rsa_encrypt(alg_type, public_key, rsa_params, data_in, data_out);
63 return crypto_driver_rsa_encrypt(alg_type, public_key, rsa_params, data_in, data_out, engine);
64 }
65
tee_crypto_rsa_decrypt(uint32_t alg_type,const struct rsa_priv_key_t * private_key,const struct asymmetric_params_t * rsa_params,const struct memref_t * data_in,struct memref_t * data_out,uint32_t engine)66 int32_t tee_crypto_rsa_decrypt(uint32_t alg_type, const struct rsa_priv_key_t *private_key,
67 const struct asymmetric_params_t *rsa_params, const struct memref_t *data_in,
68 struct memref_t *data_out, uint32_t engine)
69 {
70 if ((private_key == NULL) || (data_in == NULL) || (data_out == NULL)) {
71 tloge("Invalid params\n");
72 return CRYPTO_BAD_PARAMETERS;
73 }
74 if (engine == SOFT_CRYPTO)
75 return soft_crypto_rsa_decrypt(alg_type, private_key, rsa_params, data_in, data_out);
76 return crypto_driver_rsa_decrypt(alg_type, private_key, rsa_params, data_in, data_out, engine);
77 }
78
tee_crypto_rsa_sign_digest(uint32_t alg_type,const struct rsa_priv_key_t * private_key,const struct asymmetric_params_t * rsa_params,const struct memref_t * digest,struct memref_t * signature,uint32_t engine)79 int32_t tee_crypto_rsa_sign_digest(uint32_t alg_type, const struct rsa_priv_key_t *private_key,
80 const struct asymmetric_params_t *rsa_params, const struct memref_t *digest,
81 struct memref_t *signature, uint32_t engine)
82 {
83 if ((private_key == NULL) || (digest == NULL) || (signature == NULL)) {
84 tloge("Invalid params\n");
85 return CRYPTO_BAD_PARAMETERS;
86 }
87 if (engine == SOFT_CRYPTO)
88 return soft_crypto_rsa_sign_digest(alg_type, private_key, rsa_params, digest, signature);
89 return crypto_driver_rsa_sign_digest(alg_type, private_key, rsa_params, digest, signature, engine);
90 }
91
tee_crypto_rsa_verify_digest(uint32_t alg_type,const struct rsa_pub_key_t * public_key,const struct asymmetric_params_t * rsa_params,const struct memref_t * digest,const struct memref_t * signature,uint32_t engine)92 int32_t tee_crypto_rsa_verify_digest(uint32_t alg_type, const struct rsa_pub_key_t *public_key,
93 const struct asymmetric_params_t *rsa_params, const struct memref_t *digest,
94 const struct memref_t *signature, uint32_t engine)
95 {
96 if ((public_key == NULL) || (digest == NULL) || (signature == NULL)) {
97 tloge("Invalid params\n");
98 return CRYPTO_BAD_PARAMETERS;
99 }
100 if (engine == SOFT_CRYPTO)
101 return soft_crypto_rsa_verify_digest(alg_type, public_key, rsa_params, digest, signature);
102 return crypto_driver_rsa_verify_digest(alg_type, public_key, rsa_params, digest, signature, engine);
103 }
104