diff options
Diffstat (limited to 'verity/hash_tree_builder.cpp')
-rw-r--r-- | verity/hash_tree_builder.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/verity/hash_tree_builder.cpp b/verity/hash_tree_builder.cpp index c5d64f87..a776572f 100644 --- a/verity/hash_tree_builder.cpp +++ b/verity/hash_tree_builder.cpp @@ -219,6 +219,34 @@ bool HashTreeBuilder::BuildHashTree() { return true; } +bool HashTreeBuilder::CheckHashTree( + const std::vector<unsigned char>& hash_tree) const { + size_t offset = 0; + // Reads reversely to output the verity tree top-down. + for (size_t i = verity_tree_.size(); i > 0; i--) { + const auto& level_blocks = verity_tree_[i - 1]; + if (offset + level_blocks.size() > hash_tree.size()) { + LOG(ERROR) << "Hash tree too small: " << hash_tree.size(); + return false; + } + auto iter = std::mismatch(level_blocks.begin(), level_blocks.end(), + hash_tree.begin() + offset) + .first; + if (iter != level_blocks.end()) { + LOG(ERROR) << "Mismatch found at the hash tree level " << i << " offset " + << std::distance(level_blocks.begin(), iter); + return false; + } + offset += level_blocks.size(); + } + if (offset != hash_tree.size()) { + LOG(ERROR) << "Hash tree size mismatch: " << hash_tree.size() + << " != " << offset; + return false; + } + return true; +} + bool HashTreeBuilder::WriteHashTreeToFile(const std::string& output) const { android::base::unique_fd output_fd( open(output.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666)); |