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 "merkle_tree_extension.h"
16
17 namespace OHOS {
18 namespace SignatureTools {
19
MerkleTreeExtension()20 MerkleTreeExtension::MerkleTreeExtension()
21 : Extension(MERKLE_TREE_INLINED, MERKLE_TREE_EXTENSION_DATA_SIZE)
22 {
23 merkleTreeSize = 0;
24 merkleTreeOffset = 0;
25 }
26
MerkleTreeExtension(int64_t merkleTreeSize, int64_t merkleTreeOffset, const std::vector<int8_t> rootHash)27 MerkleTreeExtension::MerkleTreeExtension(int64_t merkleTreeSize, int64_t merkleTreeOffset,
28 const std::vector<int8_t> rootHash) : Extension(MERKLE_TREE_INLINED, MERKLE_TREE_EXTENSION_DATA_SIZE)
29 {
30 this->merkleTreeSize = merkleTreeSize;
31 this->merkleTreeOffset = merkleTreeOffset;
32 this->rootHash = rootHash;
33 }
34
~MerkleTreeExtension()35 MerkleTreeExtension::~MerkleTreeExtension()
36 {
37 }
38
GetSize()39 int32_t MerkleTreeExtension::GetSize()
40 {
41 return Extension::EXTENSION_HEADER_SIZE + MERKLE_TREE_EXTENSION_DATA_SIZE;
42 }
43
GetMerkleTreeSize()44 int64_t MerkleTreeExtension::GetMerkleTreeSize()
45 {
46 return merkleTreeSize;
47 }
48
GetMerkleTreeOffset()49 int64_t MerkleTreeExtension::GetMerkleTreeOffset()
50 {
51 return merkleTreeOffset;
52 }
53
SetMerkleTreeOffset(int64_t offset)54 void MerkleTreeExtension::SetMerkleTreeOffset(int64_t offset)
55 {
56 merkleTreeOffset = offset;
57 }
58
ToByteArray(std::vector<int8_t>& ret)59 void MerkleTreeExtension::ToByteArray(std::vector<int8_t>& ret)
60 {
61 std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer>(ByteBuffer(
62 Extension::EXTENSION_HEADER_SIZE + MERKLE_TREE_EXTENSION_DATA_SIZE));
63 std::vector<int8_t> extByteArr;
64 Extension::ToByteArray(extByteArr);
65 bf->PutData(extByteArr.data(), extByteArr.size());
66 bf->PutInt64(merkleTreeSize);
67 bf->PutInt64(merkleTreeOffset);
68 bf->PutData(rootHash.data(), rootHash.size());
69 ret = std::vector<int8_t>(bf->GetBufferPtr(), bf->GetBufferPtr() + bf->GetCapacity());
70 }
71
FromByteArray(std::vector<int8_t>& bytes)72 MerkleTreeExtension* MerkleTreeExtension::FromByteArray(std::vector<int8_t>& bytes)
73 {
74 std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer>(ByteBuffer(bytes.size()));
75 bf->PutData(bytes.data(), bytes.size());
76 bf->Flip();
77 int64_t inMerkleTreeSize = 0;
78 bool flag = bf->GetInt64(inMerkleTreeSize);
79 if (!flag || (inMerkleTreeSize % PAGE_SIZE_4K != 0)) {
80 PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR,
81 "The merkletree size must be an integer multiple of 4096");
82 return nullptr;
83 }
84 int64_t inMerkleTreeOffset = 0;
85 flag = bf->GetInt64(inMerkleTreeOffset);
86 if (!flag || (inMerkleTreeOffset % PAGE_SIZE_4K != 0)) {
87 PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR,
88 "The merkletree offset must be an integer multiple of 4096");
89 return nullptr;
90 }
91 std::vector<int8_t> inRootHash(ROOT_HASH_SIZE);
92 bf->GetByte(inRootHash.data(), inRootHash.size());
93 return new MerkleTreeExtension(inMerkleTreeSize, inMerkleTreeOffset, inRootHash);
94 }
95
96 }
97 }