154aa6d63Sopenharmony_ci/*
254aa6d63Sopenharmony_ci * Copyright (c) 2024-2024 Huawei Device Co., Ltd.
354aa6d63Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
454aa6d63Sopenharmony_ci * you may not use this file except in compliance with the License.
554aa6d63Sopenharmony_ci * You may obtain a copy of the License at
654aa6d63Sopenharmony_ci *
754aa6d63Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
854aa6d63Sopenharmony_ci *
954aa6d63Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1054aa6d63Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1154aa6d63Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1254aa6d63Sopenharmony_ci * See the License for the specific language governing permissions and
1354aa6d63Sopenharmony_ci * limitations under the License.
1454aa6d63Sopenharmony_ci */
1554aa6d63Sopenharmony_ci
1654aa6d63Sopenharmony_ci#include <fstream>
1754aa6d63Sopenharmony_ci#include <algorithm>
1854aa6d63Sopenharmony_ci#include <stdexcept>
1954aa6d63Sopenharmony_ci
2054aa6d63Sopenharmony_ci#include "profile_verify.h"
2154aa6d63Sopenharmony_ci#include "hap_utils.h"
2254aa6d63Sopenharmony_ci
2354aa6d63Sopenharmony_cinamespace OHOS {
2454aa6d63Sopenharmony_cinamespace SignatureTools {
2554aa6d63Sopenharmony_ci
2654aa6d63Sopenharmony_ciconst std::vector<int8_t> HapUtils::HAP_SIGNING_BLOCK_MAGIC_V2 =
2754aa6d63Sopenharmony_ci    std::vector<int8_t>{ 0x48, 0x41, 0x50, 0x20, 0x53, 0x69, 0x67, 0x20, 0x42,
2854aa6d63Sopenharmony_ci    0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x34, 0x32 };
2954aa6d63Sopenharmony_ciconst std::vector<int8_t> HapUtils::HAP_SIGNING_BLOCK_MAGIC_V3 =
3054aa6d63Sopenharmony_ci    std::vector<int8_t>{ 0x3c, 0x68, 0x61, 0x70, 0x20, 0x73, 0x69, 0x67, 0x6e,
3154aa6d63Sopenharmony_ci    0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3e };
3254aa6d63Sopenharmony_ciconst std::string HapUtils::HEX_CHAR_ARRAY = "0123456789ABCDEF";
3354aa6d63Sopenharmony_ciconst std::string HapUtils::HAP_DEBUG_OWNER_ID = "DEBUG_LIB_ID";
3454aa6d63Sopenharmony_cistd::set<int> HapUtils::HAP_SIGNATURE_OPTIONAL_BLOCK_IDS;
3554aa6d63Sopenharmony_ci
3654aa6d63Sopenharmony_ciHapUtils::StaticConstructor::StaticConstructor()
3754aa6d63Sopenharmony_ci{
3854aa6d63Sopenharmony_ci    HAP_SIGNATURE_OPTIONAL_BLOCK_IDS.insert(HAP_PROOF_OF_ROTATION_BLOCK_ID);
3954aa6d63Sopenharmony_ci    HAP_SIGNATURE_OPTIONAL_BLOCK_IDS.insert(HAP_PROFILE_BLOCK_ID);
4054aa6d63Sopenharmony_ci    HAP_SIGNATURE_OPTIONAL_BLOCK_IDS.insert(HAP_PROPERTY_BLOCK_ID);
4154aa6d63Sopenharmony_ci}
4254aa6d63Sopenharmony_ci
4354aa6d63Sopenharmony_ciHapUtils::StaticConstructor HapUtils::staticConstructor;
4454aa6d63Sopenharmony_ci
4554aa6d63Sopenharmony_cistd::string HapUtils::GetAppIdentifier(const std::string& profileContent)
4654aa6d63Sopenharmony_ci{
4754aa6d63Sopenharmony_ci    std::pair<std::string, std::string> resultPair = ParseAppIdentifier(profileContent);
4854aa6d63Sopenharmony_ci
4954aa6d63Sopenharmony_ci    std::string ownerID = resultPair.first;
5054aa6d63Sopenharmony_ci    std::string profileType = resultPair.second;
5154aa6d63Sopenharmony_ci
5254aa6d63Sopenharmony_ci    if (profileType == "debug") {
5354aa6d63Sopenharmony_ci        return HAP_DEBUG_OWNER_ID;
5454aa6d63Sopenharmony_ci    } else if (profileType == "release") {
5554aa6d63Sopenharmony_ci        return ownerID;
5654aa6d63Sopenharmony_ci    } else {
5754aa6d63Sopenharmony_ci        return "";
5854aa6d63Sopenharmony_ci    }
5954aa6d63Sopenharmony_ci}
6054aa6d63Sopenharmony_ci
6154aa6d63Sopenharmony_cistd::pair<std::string, std::string> HapUtils::ParseAppIdentifier(const std::string& profileContent)
6254aa6d63Sopenharmony_ci{
6354aa6d63Sopenharmony_ci    std::string ownerID;
6454aa6d63Sopenharmony_ci    std::string profileType;
6554aa6d63Sopenharmony_ci
6654aa6d63Sopenharmony_ci    ProfileInfo provisionInfo;
6754aa6d63Sopenharmony_ci    ParseProfile(profileContent, provisionInfo);
6854aa6d63Sopenharmony_ci
6954aa6d63Sopenharmony_ci    if (DEBUG == provisionInfo.type) {
7054aa6d63Sopenharmony_ci        profileType = "debug";
7154aa6d63Sopenharmony_ci    } else {
7254aa6d63Sopenharmony_ci        profileType = "release";
7354aa6d63Sopenharmony_ci    }
7454aa6d63Sopenharmony_ci
7554aa6d63Sopenharmony_ci    BundleInfo bundleInfo = provisionInfo.bundleInfo;
7654aa6d63Sopenharmony_ci
7754aa6d63Sopenharmony_ci    if (!bundleInfo.appIdentifier.empty()) {
7854aa6d63Sopenharmony_ci        ownerID = bundleInfo.appIdentifier;
7954aa6d63Sopenharmony_ci    }
8054aa6d63Sopenharmony_ci
8154aa6d63Sopenharmony_ci    return std::pair(ownerID, profileType);
8254aa6d63Sopenharmony_ci}
8354aa6d63Sopenharmony_ci
8454aa6d63Sopenharmony_cistd::vector<int8_t> HapUtils::GetHapSigningBlockMagic(int compatibleVersion)
8554aa6d63Sopenharmony_ci{
8654aa6d63Sopenharmony_ci    if (compatibleVersion >= MIN_COMPATIBLE_VERSION_FOR_SCHEMA_V3) {
8754aa6d63Sopenharmony_ci        return HAP_SIGNING_BLOCK_MAGIC_V3;
8854aa6d63Sopenharmony_ci    }
8954aa6d63Sopenharmony_ci    return HAP_SIGNING_BLOCK_MAGIC_V2;
9054aa6d63Sopenharmony_ci}
9154aa6d63Sopenharmony_ci
9254aa6d63Sopenharmony_ciint HapUtils::GetHapSigningBlockVersion(int compatibleVersion)
9354aa6d63Sopenharmony_ci{
9454aa6d63Sopenharmony_ci    if (compatibleVersion >= MIN_COMPATIBLE_VERSION_FOR_SCHEMA_V3) {
9554aa6d63Sopenharmony_ci        return HAP_SIGN_SCHEME_V3_BLOCK_VERSION;
9654aa6d63Sopenharmony_ci    }
9754aa6d63Sopenharmony_ci    return HAP_SIGN_SCHEME_V2_BLOCK_VERSION;
9854aa6d63Sopenharmony_ci}
9954aa6d63Sopenharmony_ci
10054aa6d63Sopenharmony_cibool HapUtils::ReadFileToByteBuffer(const std::string& file, ByteBuffer& buffer)
10154aa6d63Sopenharmony_ci{
10254aa6d63Sopenharmony_ci    std::string ret;
10354aa6d63Sopenharmony_ci    if (FileUtils::ReadFile(file, ret) < 0) {
10454aa6d63Sopenharmony_ci        PrintErrorNumberMsg("IO_ERROR", IO_ERROR, file + " not exist or can not read!");
10554aa6d63Sopenharmony_ci        return false;
10654aa6d63Sopenharmony_ci    }
10754aa6d63Sopenharmony_ci    buffer.SetCapacity(static_cast<int32_t>(ret.size()));
10854aa6d63Sopenharmony_ci    buffer.PutData(ret.data(), ret.size());
10954aa6d63Sopenharmony_ci    return true;
11054aa6d63Sopenharmony_ci}
11154aa6d63Sopenharmony_ci
11254aa6d63Sopenharmony_ci} // namespace SignatureTools
11354aa6d63Sopenharmony_ci} // namespace OHOS