def test_push_subtree_1(self):
     for i in range(len(TreeHasherTest.test_vector_leaves)):
         test_vector = TreeHasherTest.test_vector_leaves[:i + 1]
         self.tree = compact_merkle_tree.CompactMerkleTree()
         self.tree.extend(test_vector)
         self.tree._push_subtree([b"test leaf"])
         self.assertEqual(len(self.tree), len(test_vector) + 1)
 def test_extend_from_empty(self):
     for i in range(len(TreeHasherTest.test_vector_leaves)):
         test_vector = TreeHasherTest.test_vector_leaves[:i + 1]
         expected_hash = TreeHasherTest.test_vector_hashes[i]
         self.tree = compact_merkle_tree.CompactMerkleTree()
         self.tree.extend(test_vector)
         root = hexlify(self.tree.root_hash)
         self.assertEqual(root, expected_hash)
 def test_extend_from_partial(self):
     z = len(TreeHasherTest.test_vector_leaves)
     for i in range(z):
         self.tree = compact_merkle_tree.CompactMerkleTree()
         # add up to i
         test_vector = TreeHasherTest.test_vector_leaves[:i + 1]
         expected_hash = TreeHasherTest.test_vector_hashes[i]
         self.tree.extend(test_vector)
         self.assertEqual(self.tree.root_hash_hex, expected_hash)
         # add up to z
         test_vector = TreeHasherTest.test_vector_leaves[i + 1:]
         expected_hash = TreeHasherTest.test_vector_hashes[z - 1]
         self.tree.extend(test_vector)
         self.assertEqual(self.tree.root_hash_hex, expected_hash)
 def test_verify_leaf_inclusion_all_nodes_all_tree_sizes_up_to_4(self):
     leaves = ["aa", "bb", "cc", "dd"]
     hh = HexTreeHasher()
     leaf_hashes = [hh.hash_leaf(l) for l in leaves]
     hc = hh.hash_children
     proofs_per_tree_size = {
         1: [[]],
         2: [[leaf_hashes[1]], [leaf_hashes[0]]],
         3: [
             [leaf_hashes[1], leaf_hashes[2]],  # leaf 0
             [leaf_hashes[0], leaf_hashes[2]],  # leaf 1
             [hc(leaf_hashes[0], leaf_hashes[1])]
         ],  # leaf 2
         4: [
             [leaf_hashes[1],
              hc(leaf_hashes[2], leaf_hashes[3])],  # leaf 0
             [leaf_hashes[0],
              hc(leaf_hashes[2], leaf_hashes[3])],  # leaf 1
             [leaf_hashes[3],
              hc(leaf_hashes[0], leaf_hashes[1])],  # leaf 2
             [leaf_hashes[2],
              hc(leaf_hashes[0], leaf_hashes[1])],  # leaf 3
         ]
     }
     tree = compact_merkle_tree.CompactMerkleTree(hasher=HexTreeHasher())
     verifier = ledger.merkle_verifier.MerkleVerifier(HexTreeHasher())
     # Increase the tree by one leaf each time
     for i in range(4):
         tree.append(leaves[i])
         tree_size = i + 1
         # ... and check inclusion proof validates for each node
         # of the tree
         for j in range(tree_size):
             proof = proofs_per_tree_size[tree_size][j]
             sth = self.STH(tree.root_hash, tree_size)
             self.assertTrue(
                 verifier.verify_leaf_inclusion(leaves[j], j, proof, sth))
 def setUp(self):
     self.tree = compact_merkle_tree.CompactMerkleTree(HexTreeHasher())