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#include "hap_info_segment.h" 16 17namespace OHOS { 18namespace SignatureTools { 19 20HapInfoSegment::HapInfoSegment() 21{ 22 std::vector<int8_t> emptyVector; 23 magic = HapInfoSegment::MAGIC_NUM; 24 signInfo = SignInfo(0, 0, 0, emptyVector, emptyVector); 25} 26 27HapInfoSegment::HapInfoSegment(int32_t magic, const SignInfo& signInfo) 28{ 29 this->magic = magic; 30 this->signInfo = signInfo; 31} 32 33void HapInfoSegment::SetSignInfo(const SignInfo& signInfo) 34{ 35 this->signInfo = signInfo; 36} 37 38SignInfo& HapInfoSegment::GetSignInfo() 39{ 40 return signInfo; 41} 42 43int32_t HapInfoSegment::GetSize() 44{ 45 return HapInfoSegment::MAGIC_NUM_BYTES + signInfo.GetSize(); 46} 47 48void HapInfoSegment::ToByteArray(std::vector<int8_t> &ret) 49{ 50 std::vector<int8_t> hapSignInfoByteArray; 51 signInfo.ToByteArray(hapSignInfoByteArray); 52 std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer> 53 (ByteBuffer(HapInfoSegment::MAGIC_NUM_BYTES + hapSignInfoByteArray.size())); 54 bf->PutInt32(magic); 55 bf->PutData(hapSignInfoByteArray.data(), hapSignInfoByteArray.size()); 56 ret = std::vector<int8_t>(bf->GetBufferPtr(), bf->GetBufferPtr() + bf->GetPosition()); 57 return; 58} 59 60HapInfoSegment HapInfoSegment::FromByteArray(std::vector<int8_t>& bytes) 61{ 62 std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer>(ByteBuffer(bytes.size())); 63 bf->PutData(bytes.data(), bytes.size()); 64 bf->Flip(); 65 int32_t inMagic = 0; 66 bf->GetInt32(inMagic); 67 if (inMagic != HapInfoSegment::MAGIC_NUM) { 68 PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR, 69 "The magic number of HapInfoSegment is incorrect."); 70 return HapInfoSegment(); 71 } 72 if (bytes.size() <= HapInfoSegment::MAGIC_NUM_BYTES) { 73 PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR, 74 "The bytes size of HapInfoSegment is incorrect."); 75 return HapInfoSegment(); 76 } 77 std::vector<int8_t> hapSignInfoByteArray(bytes.size() - HapInfoSegment::MAGIC_NUM_BYTES); 78 bf->GetByte(hapSignInfoByteArray.data(), hapSignInfoByteArray.size()); 79 SignInfo inHapSignInfo = SignInfo::FromByteArray(hapSignInfoByteArray); 80 if (inHapSignInfo.GetDataSize() % HapInfoSegment::CHUNK_SIZE != 0) { 81 PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR, 82 "Invalid dataSize, the dataSize must be an integer multiple of 4096."); 83 return HapInfoSegment(); 84 } 85 if (inHapSignInfo.GetExtensionNum() != SignInfo::MAX_EXTENSION_NUM) { 86 PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR, 87 "The extension number of HapInfoSegment is incorrect."); 88 return HapInfoSegment(); 89 } 90 return HapInfoSegment(inMagic, inHapSignInfo); 91} 92 93} 94}