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