"""Merkle tree hasher for leaf and children nodes."""
import hashlib
from binascii import hexlify, unhexlify
[docs]class TreeHasher(object):
"""Merkle tree hasher for bytes data."""
def __init__(self, hashfunc=hashlib.sha256):
"""Initialize TreeHasher."""
self.hashfunc = hashfunc
[docs] def hash_leaf(self, data):
"""Return leaf node hash."""
hasher = self.hashfunc()
hasher.update(b"\x00" + data)
return hasher.digest()
[docs] def hash_children(self, left, right):
"""Return parent node hash corresponding to 2 child nodes."""
hasher = self.hashfunc()
hasher.update(b"\x01" + left + right)
return hasher.digest()
[docs]class HexTreeHasher(TreeHasher):
"""Merkle tree hasher for hex data."""
def __init__(self, hashfunc=hashlib.sha256):
"""Initialize HexTreeHasher."""
self.hasher = TreeHasher(hashfunc)
[docs] def hash_leaf(self, data):
"""Return leaf node hash."""
return hexlify(self.hasher.hash_leaf(unhexlify(data)))
[docs] def hash_children(self, left, right):
"""Return parent node hash corresponding to 2 child nodes."""
return hexlify(self.hasher.hash_children(unhexlify(left), unhexlify(right)))