Skip to content

Commit 06d460e

Browse files
committed
f - avoid re-hashing tags
1 parent 1b3618c commit 06d460e

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

lightning/src/offers/merkle.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ pub(super) fn root_hash(data: &[u8]) -> sha256::Hash {
2222
engine.input(record.as_ref());
2323
}
2424
}
25-
let nonce_tag = sha256::Hash::from_engine(engine);
26-
let leaf_tag = sha256::Hash::hash("LnLeaf".as_bytes());
27-
let branch_tag = sha256::Hash::hash("LnBranch".as_bytes());
25+
let nonce_tag = tagged_hash_engine(sha256::Hash::from_engine(engine));
26+
let leaf_tag = tagged_hash_engine(sha256::Hash::hash("LnLeaf".as_bytes()));
27+
let branch_tag = tagged_hash_engine(sha256::Hash::hash("LnBranch".as_bytes()));
2828

2929
let mut leaves = Vec::new();
3030
for record in TlvStream::new(&data[..]) {
3131
if !SIGNATURE_TYPES.contains(&record.r#type.0) {
32-
leaves.push(tagged_hash(leaf_tag, &record));
33-
leaves.push(tagged_hash(nonce_tag, &record));
32+
leaves.push(tagged_hash_from_engine(leaf_tag.clone(), &record));
33+
leaves.push(tagged_hash_from_engine(nonce_tag.clone(), &record));
3434
}
3535
}
3636

@@ -43,7 +43,7 @@ pub(super) fn root_hash(data: &[u8]) -> sha256::Hash {
4343
}
4444

4545
for (i, j) in (0..num_leaves).step_by(step).zip((offset..num_leaves).step_by(step)) {
46-
leaves[i] = tagged_branch_hash(branch_tag, leaves[i], leaves[j]);
46+
leaves[i] = tagged_branch_hash_from_engine(branch_tag.clone(), leaves[i], leaves[j]);
4747
}
4848
}
4949

@@ -52,17 +52,25 @@ pub(super) fn root_hash(data: &[u8]) -> sha256::Hash {
5252
}
5353

5454
pub(super) fn tagged_hash<T: AsRef<[u8]>>(tag: sha256::Hash, msg: T) -> sha256::Hash {
55+
let engine = tagged_hash_engine(tag);
56+
tagged_hash_from_engine(engine, msg)
57+
}
58+
59+
fn tagged_hash_engine(tag: sha256::Hash) -> sha256::HashEngine {
5560
let mut engine = sha256::Hash::engine();
5661
engine.input(tag.as_ref());
5762
engine.input(tag.as_ref());
63+
engine
64+
}
65+
66+
fn tagged_hash_from_engine<T: AsRef<[u8]>>(mut engine: sha256::HashEngine, msg: T) -> sha256::Hash {
5867
engine.input(msg.as_ref());
5968
sha256::Hash::from_engine(engine)
6069
}
6170

62-
fn tagged_branch_hash(tag: sha256::Hash, leaf1: sha256::Hash, leaf2: sha256::Hash) -> sha256::Hash {
63-
let mut engine = sha256::Hash::engine();
64-
engine.input(tag.as_ref());
65-
engine.input(tag.as_ref());
71+
fn tagged_branch_hash_from_engine(
72+
mut engine: sha256::HashEngine, leaf1: sha256::Hash, leaf2: sha256::Hash,
73+
) -> sha256::Hash {
6674
if leaf1 < leaf2 {
6775
engine.input(leaf1.as_ref());
6876
engine.input(leaf2.as_ref());

0 commit comments

Comments
 (0)