In various cases, including Merkle Trees, it is useful to tag and encode the inputs to your secure hashes to prevent security flaws due to ambiguous meanings of hash values.
--- /dev/null
+from allmydata.Crypto.Hash import SHA256
+
+def netstring(s):
+ return "%d:%s," % (len(s), s,)
+
+def tagged_hash(tag, val):
+ s = SHA256.new()
+ s.update(netstring(tag))
+ s.update(val)
+ return s.digest()
+
+def tagged_pair_hash(tag, val1, val2):
+ s = SHA256.new()
+ s.update(netstring(tag))
+ s.update(netstring(val1))
+ s.update(netstring(val2))
+ return s.digest()
+