Example #1
0
        public async Task VerifyInclusion_Generated()
        {
            var leafHashes = new List <byte[]>();
            var tree       = CreateMerkleTree();

            for (ulong i = 0; i < 128; i++)
            {
                var leaf = new byte[32];
                Array.Fill(leaf, (byte)i);
                await tree.AppendAsync(leaf);

                leafHashes.Add(_hasher.HashLeaf(leaf));
            }

            var verifier = new MerkleTreeVerifier(_hasher, new TestLogger <MerkleTreeVerifier>());

            for (ulong i = 1; i < 16; i++)
            {
                var rootHash = await tree.GetRootHashAsync(i);

                var treeHead = new SignedTreeHead(rootHash, new byte[0], i, "");
                for (ulong j = 0; j < i; j++)
                {
                    var auditPath = await tree.GetInclusionProofAsync(j, i);

                    var result = verifier.VerifyInclusion(leafHashes[(int)j], j, auditPath.ToArray(), treeHead);

                    Assert.Equal(IntegrityStatus.Success, result.Status);
                }
            }
        }
Example #2
0
        public async Task VerifyConsistency_Generated()
        {
            var tree = CreateMerkleTree();

            for (ulong i = 0; i < 128; i++)
            {
                var leaf = new byte[32];
                Array.Fill(leaf, (byte)i);
                await tree.AppendAsync(leaf);
            }

            var verifier = new MerkleTreeVerifier(_hasher, new TestLogger <MerkleTreeVerifier>());

            for (ulong i = 1; i < 16; i++)
            {
                var root = await tree.GetRootHashAsync(i);

                for (ulong j = 0; j < i; j++)
                {
                    var consistency_proof = await tree.GetConsistencyProofAsync(j, i);

                    var result = verifier.VerifyConsistency(j, i, await tree.GetRootHashAsync(j), root, consistency_proof.ToArray());
                    Assert.Equal(IntegrityStatus.Success, result.Status);
                }
            }
        }
Example #3
0
        public void VerifyConsistency_Precomputed(ulong treeSize1, ulong treeSize2, string root1, string root2, string[] proof)
        {
            var verifier = new MerkleTreeVerifier(_hasher, new TestLogger <MerkleTreeVerifier>());
            var result   = verifier.VerifyConsistency(
                treeSize1,
                treeSize2,
                root1.HexToByteArray(),
                root2.HexToByteArray(),
                proof.Select(p => p.HexToByteArray()).ToArray());

            Assert.Equal(IntegrityStatus.Success, result.Status);
        }
Example #4
0
        public async Task VerifyInclusion_Precomputed(ulong leaf, ulong treeSizeSnapshot, ulong pathLength, string[] path)
        {
            var tree = await CreateMerkleTreeAsync(TestVector);

            var auditPath = await tree.GetInclusionProofAsync(leaf, treeSizeSnapshot);

            Assert.Equal(auditPath.Count, (int)pathLength);
            Assert.Equal(auditPath.Select(p => p.ByteToHex()).ToArray(), path);

            var leafData = TestVector[(int)leaf];
            var leafHash = _hasher.HashLeaf(leafData.HexToByteArray());
            var hash     = await tree.GetRootHashAsync(treeSizeSnapshot);

            var treeHead = new SignedTreeHead(hash, new byte[0], treeSizeSnapshot, "");

            var verifier = new MerkleTreeVerifier(_hasher, new TestLogger <MerkleTreeVerifier>());

            if (treeSizeSnapshot > 0)
            {
                verifier.VerifyInclusion(leafHash, leaf, auditPath.ToArray(), treeHead);
            }
        }