blob: 26893400825732a2c16d4051ca890a48c417bf5d [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, Regents of the University of California
*
* This file is part of NDN DeLorean, An Authentication System for Data Archives in
* Named Data Networking. See AUTHORS.md for complete list of NDN DeLorean authors
* and contributors.
*
* NDN DeLorean is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* NDN DeLorean is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with NDN
* DeLorean, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#include "tree-generator.hpp"
#include <ndn-cxx/util/digest.hpp>
namespace nsl {
namespace tests {
const Name TreeGenerator::LOGGER_NAME("/logger/name");
ndn::ConstBufferPtr TreeGenerator::LEAF_HASH;
ndn::ConstBufferPtr
TreeGenerator::getHash(const Node::Index& idx,
const NonNegativeInteger& nextLeafSeqNo,
bool useEmpty)
{
if (idx.level == 0) {
if (useEmpty)
return Node::getEmptyHash();
return Node::getEmptyHash();
}
NonNegativeInteger leftChildSeqNo = idx.seqNo;
NonNegativeInteger rightChildSeqNo = idx.seqNo + (idx.range >> 1);
if (idx.seqNo == 0 && nextLeafSeqNo <= rightChildSeqNo) {
BOOST_ASSERT(false);
}
ndn::util::Sha256 sha256;
sha256 << idx.level << idx.seqNo;
auto hash1 = getHash(Node::Index(leftChildSeqNo, idx.level - 1),
nextLeafSeqNo,
useEmpty);
sha256.update(hash1->buf(), hash1->size());
if (nextLeafSeqNo > rightChildSeqNo) {
auto hash2 = getHash(Node::Index(rightChildSeqNo, idx.level - 1),
nextLeafSeqNo,
useEmpty);
sha256.update(hash2->buf(), hash2->size());
}
else {
auto hash2 = Node::getEmptyHash();
sha256.update(hash2->buf(), hash2->size());
}
return sha256.computeDigest();
}
shared_ptr<SubTreeBinary>
TreeGenerator::getSubTreeBinary(const Node::Index& index,
const NonNegativeInteger& nextLeafSeqNo,
bool useEmpty)
{
auto subtree = make_shared<SubTreeBinary>(LOGGER_NAME, index,
[&] (const Node::Index&) {},
[&] (const Node::Index&,
const NonNegativeInteger&,
ndn::ConstBufferPtr) {});
size_t leafLevel = index.level + 1 - SubTreeBinary::SUB_TREE_DEPTH;
NonNegativeInteger step = 1 << leafLevel;
for (NonNegativeInteger i = index.seqNo; i < nextLeafSeqNo - step; i += step) {
auto node = make_shared<Node>(i, leafLevel, i + step,
getHash(Node::Index(i, leafLevel),
i + step,
useEmpty));
subtree->addLeaf(node);
}
NonNegativeInteger childSeqNo = ((nextLeafSeqNo - 1) >> leafLevel) << leafLevel;
auto node = make_shared<Node>(childSeqNo, leafLevel, nextLeafSeqNo,
getHash(Node::Index(childSeqNo, leafLevel),
nextLeafSeqNo,
useEmpty));
subtree->addLeaf(node);
return subtree;
}
ndn::ConstBufferPtr
TreeGenerator::getLeafHash()
{
if (LEAF_HASH == nullptr) {
ndn::util::Sha256 sha256;
sha256 << 1;
LEAF_HASH = sha256.computeDigest();
}
return LEAF_HASH;
}
} // namespace tests
} // namespace nsl