Merge pull request #7 from GarrickOllivander/fix_merkle_tree_malleability

Fix Merkle tree malleability.
This commit is contained in:
Ignotus Peverell 2016-10-30 18:18:40 -07:00 committed by GitHub
commit 2efa8ce706

View file

@ -163,13 +163,15 @@ impl Hashed for HPair {
} }
} }
/// An iterator over hashes in a vector that pairs them to build a row in a /// An iterator over hashes in a vector that pairs them to build a row in a
/// Merkle tree. If the vector has an odd number of hashes, duplicates the last. /// Merkle tree. If the vector has an odd number of hashes, it appends a zero hash
/// See https://bitcointalk.org/index.php?topic=102395.0 CVE-2012-2459 (block merkle calculation exploit)
/// for the argument against duplication of last hash
struct HPairIter(Vec<Hash>); struct HPairIter(Vec<Hash>);
impl Iterator for HPairIter { impl Iterator for HPairIter {
type Item = HPair; type Item = HPair;
fn next(&mut self) -> Option<HPair> { fn next(&mut self) -> Option<HPair> {
self.0.pop().map(|first| HPair(first, self.0.pop().unwrap_or(first))) self.0.pop().map(|first| HPair(first, self.0.pop().unwrap_or(ZERO_HASH)))
} }
} }
/// A row in a Merkle tree. Can be built from a vector of hashes. Calculates /// A row in a Merkle tree. Can be built from a vector of hashes. Calculates