diff --git a/core/src/core/mod.rs b/core/src/core/mod.rs index cffccadb2..1095c70aa 100644 --- a/core/src/core/mod.rs +++ b/core/src/core/mod.rs @@ -163,13 +163,15 @@ impl Hashed for HPair { } } /// 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); impl Iterator for HPairIter { type Item = HPair; fn next(&mut self) -> Option { - 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