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 }