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}