• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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