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#include "merkle_tree_extension.h" 1654aa6d63Sopenharmony_ci 1754aa6d63Sopenharmony_cinamespace OHOS { 1854aa6d63Sopenharmony_cinamespace SignatureTools { 1954aa6d63Sopenharmony_ci 2054aa6d63Sopenharmony_ciMerkleTreeExtension::MerkleTreeExtension() 2154aa6d63Sopenharmony_ci : Extension(MERKLE_TREE_INLINED, MERKLE_TREE_EXTENSION_DATA_SIZE) 2254aa6d63Sopenharmony_ci{ 2354aa6d63Sopenharmony_ci merkleTreeSize = 0; 2454aa6d63Sopenharmony_ci merkleTreeOffset = 0; 2554aa6d63Sopenharmony_ci} 2654aa6d63Sopenharmony_ci 2754aa6d63Sopenharmony_ciMerkleTreeExtension::MerkleTreeExtension(int64_t merkleTreeSize, int64_t merkleTreeOffset, 2854aa6d63Sopenharmony_ci const std::vector<int8_t> rootHash) : Extension(MERKLE_TREE_INLINED, MERKLE_TREE_EXTENSION_DATA_SIZE) 2954aa6d63Sopenharmony_ci{ 3054aa6d63Sopenharmony_ci this->merkleTreeSize = merkleTreeSize; 3154aa6d63Sopenharmony_ci this->merkleTreeOffset = merkleTreeOffset; 3254aa6d63Sopenharmony_ci this->rootHash = rootHash; 3354aa6d63Sopenharmony_ci} 3454aa6d63Sopenharmony_ci 3554aa6d63Sopenharmony_ciMerkleTreeExtension::~MerkleTreeExtension() 3654aa6d63Sopenharmony_ci{ 3754aa6d63Sopenharmony_ci} 3854aa6d63Sopenharmony_ci 3954aa6d63Sopenharmony_ciint32_t MerkleTreeExtension::GetSize() 4054aa6d63Sopenharmony_ci{ 4154aa6d63Sopenharmony_ci return Extension::EXTENSION_HEADER_SIZE + MERKLE_TREE_EXTENSION_DATA_SIZE; 4254aa6d63Sopenharmony_ci} 4354aa6d63Sopenharmony_ci 4454aa6d63Sopenharmony_ciint64_t MerkleTreeExtension::GetMerkleTreeSize() 4554aa6d63Sopenharmony_ci{ 4654aa6d63Sopenharmony_ci return merkleTreeSize; 4754aa6d63Sopenharmony_ci} 4854aa6d63Sopenharmony_ci 4954aa6d63Sopenharmony_ciint64_t MerkleTreeExtension::GetMerkleTreeOffset() 5054aa6d63Sopenharmony_ci{ 5154aa6d63Sopenharmony_ci return merkleTreeOffset; 5254aa6d63Sopenharmony_ci} 5354aa6d63Sopenharmony_ci 5454aa6d63Sopenharmony_civoid MerkleTreeExtension::SetMerkleTreeOffset(int64_t offset) 5554aa6d63Sopenharmony_ci{ 5654aa6d63Sopenharmony_ci merkleTreeOffset = offset; 5754aa6d63Sopenharmony_ci} 5854aa6d63Sopenharmony_ci 5954aa6d63Sopenharmony_civoid MerkleTreeExtension::ToByteArray(std::vector<int8_t>& ret) 6054aa6d63Sopenharmony_ci{ 6154aa6d63Sopenharmony_ci std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer>(ByteBuffer( 6254aa6d63Sopenharmony_ci Extension::EXTENSION_HEADER_SIZE + MERKLE_TREE_EXTENSION_DATA_SIZE)); 6354aa6d63Sopenharmony_ci std::vector<int8_t> extByteArr; 6454aa6d63Sopenharmony_ci Extension::ToByteArray(extByteArr); 6554aa6d63Sopenharmony_ci bf->PutData(extByteArr.data(), extByteArr.size()); 6654aa6d63Sopenharmony_ci bf->PutInt64(merkleTreeSize); 6754aa6d63Sopenharmony_ci bf->PutInt64(merkleTreeOffset); 6854aa6d63Sopenharmony_ci bf->PutData(rootHash.data(), rootHash.size()); 6954aa6d63Sopenharmony_ci ret = std::vector<int8_t>(bf->GetBufferPtr(), bf->GetBufferPtr() + bf->GetCapacity()); 7054aa6d63Sopenharmony_ci} 7154aa6d63Sopenharmony_ci 7254aa6d63Sopenharmony_ciMerkleTreeExtension* MerkleTreeExtension::FromByteArray(std::vector<int8_t>& bytes) 7354aa6d63Sopenharmony_ci{ 7454aa6d63Sopenharmony_ci std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer>(ByteBuffer(bytes.size())); 7554aa6d63Sopenharmony_ci bf->PutData(bytes.data(), bytes.size()); 7654aa6d63Sopenharmony_ci bf->Flip(); 7754aa6d63Sopenharmony_ci int64_t inMerkleTreeSize = 0; 7854aa6d63Sopenharmony_ci bool flag = bf->GetInt64(inMerkleTreeSize); 7954aa6d63Sopenharmony_ci if (!flag || (inMerkleTreeSize % PAGE_SIZE_4K != 0)) { 8054aa6d63Sopenharmony_ci PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR, 8154aa6d63Sopenharmony_ci "The merkletree size must be an integer multiple of 4096"); 8254aa6d63Sopenharmony_ci return nullptr; 8354aa6d63Sopenharmony_ci } 8454aa6d63Sopenharmony_ci int64_t inMerkleTreeOffset = 0; 8554aa6d63Sopenharmony_ci flag = bf->GetInt64(inMerkleTreeOffset); 8654aa6d63Sopenharmony_ci if (!flag || (inMerkleTreeOffset % PAGE_SIZE_4K != 0)) { 8754aa6d63Sopenharmony_ci PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR, 8854aa6d63Sopenharmony_ci "The merkletree offset must be an integer multiple of 4096"); 8954aa6d63Sopenharmony_ci return nullptr; 9054aa6d63Sopenharmony_ci } 9154aa6d63Sopenharmony_ci std::vector<int8_t> inRootHash(ROOT_HASH_SIZE); 9254aa6d63Sopenharmony_ci bf->GetByte(inRootHash.data(), inRootHash.size()); 9354aa6d63Sopenharmony_ci return new MerkleTreeExtension(inMerkleTreeSize, inMerkleTreeOffset, inRootHash); 9454aa6d63Sopenharmony_ci} 9554aa6d63Sopenharmony_ci 9654aa6d63Sopenharmony_ci} 9754aa6d63Sopenharmony_ci}