1 /*
2  * Copyright (C) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *    http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "rsa_openssl_common.h"
16 #include "log.h"
17 #include "openssl_adapter.h"
18 #include "openssl_common.h"
19 
DuplicateRsaPriKeyForSpec(const RSA * rsa)20 static RSA *DuplicateRsaPriKeyForSpec(const RSA *rsa)
21 {
22     RSA *tmp = OpensslRsaNew();
23     if (tmp == NULL) {
24         LOGE("malloc rsa failed");
25         return NULL;
26     }
27     const BIGNUM *n = NULL;
28     const BIGNUM *e = NULL;
29     const BIGNUM *d = NULL;
30     OpensslRsaGet0Key(rsa, &n, &e, &d);
31     if (n == NULL || e == NULL || d == NULL) {
32         LOGE("get key attribute fail");
33         OpensslRsaFree(tmp);
34         return NULL;
35     }
36     BIGNUM *dupN = OpensslBnDup(n);
37     BIGNUM *dupE = OpensslBnDup(e);
38     BIGNUM *dupD = OpensslBnDup(d);
39     if (dupN == NULL || dupE == NULL || dupD == NULL) {
40         LOGE("Duplicate key attribute fail");
41         OpensslBnFree(dupN);
42         OpensslBnFree(dupE);
43         OpensslBnClearFree(dupD);
44         OpensslRsaFree(tmp);
45         return NULL;
46     }
47     if (OpensslRsaSet0Key(tmp, dupN, dupE, dupD) != HCF_OPENSSL_SUCCESS) {
48         LOGE("assign RSA n, e, d failed");
49         OpensslBnFree(dupN);
50         OpensslBnFree(dupE);
51         OpensslBnClearFree(dupD);
52         OpensslRsaFree(tmp);
53         return NULL;
54     }
55     return tmp;
56 }
57 
DuplicateRsa(RSA * rsa,bool needPrivate,RSA ** dupRsa)58 HcfResult DuplicateRsa(RSA *rsa, bool needPrivate, RSA **dupRsa)
59 {
60     RSA *retRSA = NULL;
61     if (rsa == NULL || dupRsa == NULL) {
62         LOGE("Rsa or dupRsa is NULL.");
63         return HCF_INVALID_PARAMS;
64     }
65     if (needPrivate) {
66         retRSA = OpensslRsaPrivateKeyDup(rsa);
67         // RSAPrivateKey_dup needs p&q, it fails when the key only contains n, e, d, so it needs another func.
68         if (retRSA == NULL) {
69             retRSA = DuplicateRsaPriKeyForSpec(rsa);
70         }
71     } else {
72         retRSA = OpensslRsaPublicKeyDup(rsa);
73     }
74     if (retRSA == NULL) {
75         LOGD("[error] Duplicate RSA fail.");
76         HcfPrintOpensslError();
77         return HCF_ERR_CRYPTO_OPERATION;
78     }
79     *dupRsa = retRSA;
80     return HCF_SUCCESS;
81 }
82 
NewEvpPkeyByRsa(RSA * rsa,bool withDuplicate)83 EVP_PKEY *NewEvpPkeyByRsa(RSA *rsa, bool withDuplicate)
84 {
85     if (rsa == NULL) {
86         LOGE("RSA is NULL");
87         return NULL;
88     }
89     EVP_PKEY *pKey = OpensslEvpPkeyNew();
90     if (pKey == NULL) {
91         LOGD("[error] EVP_PKEY_new fail");
92         HcfPrintOpensslError();
93         return NULL;
94     }
95     if (withDuplicate) {
96         if (OpensslEvpPkeySet1Rsa(pKey, rsa) != HCF_OPENSSL_SUCCESS) {
97             LOGD("[error] EVP_PKEY_set1_RSA fail");
98             HcfPrintOpensslError();
99             OpensslEvpPkeyFree(pKey);
100             return NULL;
101         }
102     } else {
103         if (OpensslEvpPkeyAssignRsa(pKey, rsa) != HCF_OPENSSL_SUCCESS) {
104             LOGD("[error] EVP_PKEY_assign_RSA fail");
105             HcfPrintOpensslError();
106             OpensslEvpPkeyFree(pKey);
107             return NULL;
108         }
109     }
110     return pKey;
111 }
112