1 /*
2 * Copyright (c) 2024 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
16 #include "hks_api_mock_helper.h"
17
18 namespace OHOS {
19 namespace Security {
20 namespace CodeSign {
21 static const uint32_t CERT_DATA_SIZE = 8192;
22 static const std::string EFFECTIVE_PEM_DATA =
23 "-----BEGIN CERTIFICATE-----\n"
24 "MIIDgzCCAm2gAwIBAgIBATALBgkqhkiG9w0BAQswfzELMAkGA1UEBhMCQ04xEzAR\n"
25 "BgNVBAgMCmhlbGxvd29ybGQxEzARBgNVBAoMCmhlbGxvd29ybGQxEzARBgNVBAsM\n"
26 "CmhlbGxvd29ybGQxFjAUBgNVBAMMDWhlbGxvd29ybGQxMTExGTAXBgkqhkiG9w0B\n"
27 "CQEWCmhlbGxvd29ybGQwHhcNMjQwNDI1MTM0NzI0WhcNMzQwNDI1MTM0NzI0WjAa\n"
28 "MRgwFgYDVQQDEw9BIEtleW1hc3RlciBLZXkwWTATBgcqhkjOPQIBBggqhkjOPQMB\n"
29 "BwNCAAS2Ke53DuesDI11IflM1ewmsMgmFODEWo91i3rJ1DN00XkDZWnbpPBC4vTU\n"
30 "ghEBJyaL0Llf8sAnOIhREXd9F3VIo4IBPDCCATgwCwYDVR0PBAQDAgeAMAgGA1Ud\n"
31 "HwQBADCCAR0GDCsGAQQBj1sCgngBAwSCAQswggEHAgEAMDQCAQAGDSsGAQQBj1sC\n"
32 "gngCAQQEIL1Mz84BeHuSz7BXsT7VV13vY+yHxj3bHm04Ts5FUzJbMCICAQIGDSsG\n"
33 "AQQBj1sCgngCAQIEDkxPQ0FMX1NJR05fS0VZMFwCAQIGDSsGAQQBj1sCgngCAQMw\n"
34 "SAYOKwYBBAGPWwKCeAIBAwEENnsicHJvY2Vzc05hbWUiOiJsb2NhbF9jb2RlX3Np\n"
35 "Z24iLCJBUEwiOiJzeXN0ZW1fYmFzaWMifTAYAgECBg0rBgEEAY9bAoJ4AgELBAQA\n"
36 "AAAAMBgCAQIGDSsGAQQBj1sCgngCAQUEBAIAAAAwFgIBAgYOKwYBBAGPWwKCeAIE\n"
37 "AQUBAf8wCwYJKoZIhvcNAQELA4IBAQB/VnD1eZWph2/JcQU4QFvdn0P1xrbsT3XP\n"
38 "dcIG4q3qWbrMBSq3DVmMWj3GZS+P+kW/Ni/ArnOzt/rUrui37yYWYylFOq9hBxcf\n"
39 "Q9tSPOgXcB6EuxKF4O0mw7lS3rsvUaPtEG299ggV2UzkTmw8T+nX3OvUt5f7VN4i\n"
40 "GY9u5Ou8DJNgr3gsF7Y1NaoC3zmnh9vAN03rUOWRBbCejf8hG6OY77TMaNIdfwwk\n"
41 "1kM3ZM0+dUfKaKjU767kxPYdAbxrp9zGCd3Nu3B9WqJIz/RD+JaZGhugY6rrQZ6S\n"
42 "ipcaNXzDYm10ccKjm/CSXoxE5PDikiUnK1vLUOPb6w3akQxwFOgZ\n"
43 "-----END CERTIFICATE-----\n";
44
PemToDer(const char * pemData,const uint32_t size,uint8_t * derData,uint32_t derLen)45 bool PemToDer(const char *pemData, const uint32_t size, uint8_t *derData, uint32_t derLen)
46 {
47 if (pemData == nullptr) {
48 LOG_ERROR("PemData is nullptr");
49 return false;
50 }
51
52 if (derData == nullptr) {
53 LOG_ERROR("Transferred in after malloc derData address.");
54 return false;
55 }
56
57 if (derLen != CERT_DATA_SIZE) {
58 LOG_ERROR("The length of derData is not equal to %{public}d", derLen);
59 return false;
60 }
61
62 BIO *mem = BIO_new_mem_buf(pemData, size);
63 if (mem == nullptr) {
64 LOG_ERROR("Fail to create bio for cert.");
65 return false;
66 }
67
68 X509 *x509 = PEM_read_bio_X509(mem, nullptr, 0, nullptr);
69 if (x509 == nullptr) {
70 LOG_ERROR("Fail to read bio");
71 BIO_free(mem);
72 return false;
73 }
74
75 uint8_t *derTemp = nullptr;
76 int32_t derTempLen = i2d_X509(x509, &derTemp);
77 if (derTempLen < 0) {
78 X509_free(x509);
79 BIO_free(mem);
80 return false;
81 }
82
83 if (memcpy_s(derData, derLen, derTemp, static_cast<uint32_t>(derTempLen)) != EOK) {
84 LOG_ERROR("Memcpy failed");
85 return false;
86 }
87
88 X509_free(x509);
89 BIO_free(mem);
90 OPENSSL_free(derTemp);
91
92 return true;
93 }
94
GetCertInDer(uint8_t * derData,uint32_t derLen)95 bool GetCertInDer(uint8_t *derData, uint32_t derLen)
96 {
97 return PemToDer(EFFECTIVE_PEM_DATA.c_str(), EFFECTIVE_PEM_DATA.size(), derData, derLen);
98 }
99 }
100 }
101 }