summaryrefslogtreecommitdiff
path: root/fuzz/mem_hash_tree.h
diff options
context:
space:
mode:
Diffstat (limited to 'fuzz/mem_hash_tree.h')
-rw-r--r--fuzz/mem_hash_tree.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/fuzz/mem_hash_tree.h b/fuzz/mem_hash_tree.h
new file mode 100644
index 0000000000..daf1b14b2b
--- /dev/null
+++ b/fuzz/mem_hash_tree.h
@@ -0,0 +1,57 @@
+// 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.
+
+#ifndef __FUZZ_MEM_HASH_TREE_H
+#define __FUZZ_MEM_HASH_TREE_H
+#include <unistd.h>
+
+#include <array>
+#include <cstdint>
+#include <unordered_map>
+#include <vector>
+
+#include "board/host/dcrypto.h"
+#include "fuzz/span.h"
+
+// MaskedLabel.first is the label path, this is shifted to the right by the
+// (bits_per_level * level)
+// MaskedLabel.second is the level of the label (0 for leaf, height for root)
+typedef std::pair<uint64_t, uint8_t> MaskedLabel;
+
+namespace std {
+template <>
+struct hash<MaskedLabel> {
+ size_t operator()(const MaskedLabel& lbl) const {
+ static const auto hash_first = hash<uint64_t>();
+ static const auto hash_second = hash<uint8_t>();
+ return hash_first(lbl.first) * hash_second(lbl.second);
+ }
+};
+} // namespace std
+
+class MemHashTree {
+ public:
+ MemHashTree();
+
+ bool GetLeaf(uint64_t label, fuzz::span<uint8_t> leaf_hash) const;
+ // Writes the result to |path_hashes| and returns the size in bytes of the
+ // returned path for use in serializers that report how much buffer was used.
+ size_t GetPath(uint64_t label, fuzz::span<uint8_t> path_hashes) const;
+ // Updates the hashes in the path of the specified leaf. If |path_hash| is
+ // empty, the entry in hash_tree_ is deleted representing an empty leaf.
+ void UpdatePath(uint64_t label, fuzz::span<const uint8_t> path_hash);
+
+ void Reset();
+ void Reset(uint8_t bits_per_level, uint8_t height);
+
+ private:
+ uint8_t bits_per_level_;
+ uint8_t height_;
+
+ // Only contains hashes for non empty paths in the tree.
+ std::unordered_map<MaskedLabel, std::array<uint8_t, 32>> hash_tree_;
+ std::vector<std::array<uint8_t, 32>> empty_node_hashes_;
+};
+
+#endif // __FUZZ_MEM_HASH_TREE_H