summaryrefslogtreecommitdiff
path: root/fuzz/mem_hash_tree.cc
diff options
context:
space:
mode:
Diffstat (limited to 'fuzz/mem_hash_tree.cc')
-rw-r--r--fuzz/mem_hash_tree.cc130
1 files changed, 0 insertions, 130 deletions
diff --git a/fuzz/mem_hash_tree.cc b/fuzz/mem_hash_tree.cc
deleted file mode 100644
index 15c9de4142..0000000000
--- a/fuzz/mem_hash_tree.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2018 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "fuzz/mem_hash_tree.h"
-
-#include <algorithm>
-#include <cassert>
-
-MemHashTree::MemHashTree() : bits_per_level_(0), height_(0) {}
-
-bool MemHashTree::GetLeaf(uint64_t label, fuzz::span<uint8_t> leaf_hash) const {
- assert(leaf_hash.size() >= SHA256_DIGEST_SIZE);
- auto itr = hash_tree_.find(MaskedLabel(label, 0));
- if (itr == hash_tree_.end()) {
- std::fill(leaf_hash.begin(), leaf_hash.end(), 0);
- return false;
- }
-
- std::copy(itr->second.begin(), itr->second.end(), leaf_hash.begin());
- return true;
-}
-
-size_t MemHashTree::GetPath(uint64_t label,
- fuzz::span<uint8_t> path_hashes) const {
- uint8_t fan_out = 1 << bits_per_level_;
- uint8_t num_siblings = fan_out - 1;
- assert(path_hashes.size() >= num_siblings * height_ * SHA256_DIGEST_SIZE);
- // num_siblings and child_index_mask have the same value, but were named
- // differently to help convey how they are used.
- uint64_t child_index_mask = fan_out - 1;
- uint64_t shifted_parent_label = label;
- uint8_t* dest_itr = path_hashes.begin();
- for (uint8_t level = 0; level < height_; ++level) {
- uint8_t label_index = shifted_parent_label & child_index_mask;
- shifted_parent_label &= ~child_index_mask;
- for (uint8_t index = 0; index < fan_out; ++index) {
- // Only include hashes for sibling nodes.
- if (index == label_index) {
- continue;
- }
- auto src_itr =
- hash_tree_.find(MaskedLabel(shifted_parent_label | index, level));
- if (src_itr == hash_tree_.end()) {
- std::copy(empty_node_hashes_[level].begin(),
- empty_node_hashes_[level].end(), dest_itr);
- } else {
- std::copy(src_itr->second.begin(), src_itr->second.end(), dest_itr);
- }
- dest_itr += SHA256_DIGEST_SIZE;
- }
- shifted_parent_label = shifted_parent_label >> bits_per_level_;
- }
- return dest_itr - path_hashes.begin();
-}
-
-void MemHashTree::UpdatePath(uint64_t label,
- fuzz::span<const uint8_t> path_hash) {
- std::array<uint8_t, SHA256_DIGEST_SIZE> hash;
- if (path_hash.empty()) {
- std::fill(hash.begin(), hash.end(), 0);
- hash_tree_.erase(MaskedLabel(label, 0));
- } else {
- assert(path_hash.size() == SHA256_DIGEST_SIZE);
- std::copy(path_hash.begin(), path_hash.end(), hash.begin());
- hash_tree_[MaskedLabel(label, 0)] = hash;
- }
-
- uint8_t fan_out = 1 << bits_per_level_;
- uint64_t child_index_mask = fan_out - 1;
- uint64_t shifted_parent_label = label;
- for (int level = 0; level < height_; ++level) {
- shifted_parent_label &= ~child_index_mask;
-
- LITE_SHA256_CTX ctx;
- DCRYPTO_SHA256_init(&ctx, 1);
- int empty_nodes = 0;
- for (int index = 0; index < fan_out; ++index) {
- auto itr =
- hash_tree_.find(MaskedLabel(shifted_parent_label | index, level));
- if (itr == hash_tree_.end()) {
- HASH_update(&ctx, empty_node_hashes_[level].data(),
- empty_node_hashes_[level].size());
- ++empty_nodes;
- } else {
- HASH_update(&ctx, itr->second.data(), itr->second.size());
- }
- }
- shifted_parent_label = shifted_parent_label >> bits_per_level_;
-
- const uint8_t* temp = HASH_final(&ctx);
- std::copy(temp, temp + SHA256_DIGEST_SIZE, hash.begin());
- MaskedLabel node_key(shifted_parent_label, level + 1);
- if (empty_nodes == fan_out) {
- hash_tree_.erase(node_key);
- } else {
- hash_tree_[node_key] = hash;
- }
- }
-}
-
-void MemHashTree::Reset() {
- bits_per_level_ = 0;
- height_ = 0;
- empty_node_hashes_.clear();
- hash_tree_.clear();
-}
-
-void MemHashTree::Reset(uint8_t bits_per_level, uint8_t height) {
- bits_per_level_ = bits_per_level;
- height_ = height;
- hash_tree_.clear();
- empty_node_hashes_.resize(height);
-
- std::array<uint8_t, SHA256_DIGEST_SIZE> hash;
- std::fill(hash.begin(), hash.end(), 0);
- empty_node_hashes_[0] = hash;
-
- uint8_t fan_out = 1 << bits_per_level;
- for (int level = 1; level < height; ++level) {
- LITE_SHA256_CTX ctx;
- DCRYPTO_SHA256_init(&ctx, 1);
- for (int index = 0; index < fan_out; ++index) {
- HASH_update(&ctx, hash.data(), hash.size());
- }
- const uint8_t* temp = HASH_final(&ctx);
- std::copy(temp, temp + SHA256_DIGEST_SIZE, hash.begin());
- empty_node_hashes_[level] = hash;
- }
-}