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 }