1/*
2 * Copyright (c) 2024-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 <fstream>
17#include <algorithm>
18#include <stdexcept>
19
20#include "profile_verify.h"
21#include "hap_utils.h"
22
23namespace OHOS {
24namespace SignatureTools {
25
26const std::vector<int8_t> HapUtils::HAP_SIGNING_BLOCK_MAGIC_V2 =
27    std::vector<int8_t>{ 0x48, 0x41, 0x50, 0x20, 0x53, 0x69, 0x67, 0x20, 0x42,
28    0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x34, 0x32 };
29const std::vector<int8_t> HapUtils::HAP_SIGNING_BLOCK_MAGIC_V3 =
30    std::vector<int8_t>{ 0x3c, 0x68, 0x61, 0x70, 0x20, 0x73, 0x69, 0x67, 0x6e,
31    0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3e };
32const std::string HapUtils::HEX_CHAR_ARRAY = "0123456789ABCDEF";
33const std::string HapUtils::HAP_DEBUG_OWNER_ID = "DEBUG_LIB_ID";
34std::set<int> HapUtils::HAP_SIGNATURE_OPTIONAL_BLOCK_IDS;
35
36HapUtils::StaticConstructor::StaticConstructor()
37{
38    HAP_SIGNATURE_OPTIONAL_BLOCK_IDS.insert(HAP_PROOF_OF_ROTATION_BLOCK_ID);
39    HAP_SIGNATURE_OPTIONAL_BLOCK_IDS.insert(HAP_PROFILE_BLOCK_ID);
40    HAP_SIGNATURE_OPTIONAL_BLOCK_IDS.insert(HAP_PROPERTY_BLOCK_ID);
41}
42
43HapUtils::StaticConstructor HapUtils::staticConstructor;
44
45std::string HapUtils::GetAppIdentifier(const std::string& profileContent)
46{
47    std::pair<std::string, std::string> resultPair = ParseAppIdentifier(profileContent);
48
49    std::string ownerID = resultPair.first;
50    std::string profileType = resultPair.second;
51
52    if (profileType == "debug") {
53        return HAP_DEBUG_OWNER_ID;
54    } else if (profileType == "release") {
55        return ownerID;
56    } else {
57        return "";
58    }
59}
60
61std::pair<std::string, std::string> HapUtils::ParseAppIdentifier(const std::string& profileContent)
62{
63    std::string ownerID;
64    std::string profileType;
65
66    ProfileInfo provisionInfo;
67    ParseProfile(profileContent, provisionInfo);
68
69    if (DEBUG == provisionInfo.type) {
70        profileType = "debug";
71    } else {
72        profileType = "release";
73    }
74
75    BundleInfo bundleInfo = provisionInfo.bundleInfo;
76
77    if (!bundleInfo.appIdentifier.empty()) {
78        ownerID = bundleInfo.appIdentifier;
79    }
80
81    return std::pair(ownerID, profileType);
82}
83
84std::vector<int8_t> HapUtils::GetHapSigningBlockMagic(int compatibleVersion)
85{
86    if (compatibleVersion >= MIN_COMPATIBLE_VERSION_FOR_SCHEMA_V3) {
87        return HAP_SIGNING_BLOCK_MAGIC_V3;
88    }
89    return HAP_SIGNING_BLOCK_MAGIC_V2;
90}
91
92int HapUtils::GetHapSigningBlockVersion(int compatibleVersion)
93{
94    if (compatibleVersion >= MIN_COMPATIBLE_VERSION_FOR_SCHEMA_V3) {
95        return HAP_SIGN_SCHEME_V3_BLOCK_VERSION;
96    }
97    return HAP_SIGN_SCHEME_V2_BLOCK_VERSION;
98}
99
100bool HapUtils::ReadFileToByteBuffer(const std::string& file, ByteBuffer& buffer)
101{
102    std::string ret;
103    if (FileUtils::ReadFile(file, ret) < 0) {
104        PrintErrorNumberMsg("IO_ERROR", IO_ERROR, file + " not exist or can not read!");
105        return false;
106    }
107    buffer.SetCapacity(static_cast<int32_t>(ret.size()));
108    buffer.PutData(ret.data(), ret.size());
109    return true;
110}
111
112} // namespace SignatureTools
113} // namespace OHOS