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