Exemplo n.º 1
0
    public void GivenBlockChain_WhenContainerIsMemory_ShouldRoundTrip()
    {
        const string issuer  = "*****@*****.**";
        const string issuer2 = "*****@*****.**";
        const string zipPath = "$block";
        var          date    = DateTime.UtcNow;

        var issuerSignature  = new PrincipalSignature(issuer, issuer, "*****@*****.**");
        var issuerSignature2 = new PrincipalSignature(issuer2, issuer2, "*****@*****.**");

        BlockChain blockChain = new BlockChainBuilder()
                                .SetPrincipleId(issuer)
                                .Build()
                                .Sign(x => issuerSignature);

        var payload = new Payload {
            Name = "Name1", Value = 2, Price = 10.5f
        };
        var payload2 = new Payload2 {
            Last = "Last", Current = date, Author = "test"
        };

        blockChain.Add(payload, issuer);
        blockChain.Add(payload2, issuer);

        var getSignature = (string kid) =>
        {
            return(kid switch
            {
                issuer => issuerSignature,
                issuer2 => issuerSignature2,
                _ => throw new ArgumentException($"Invalid kid={kid}"),
            });
Exemplo n.º 2
0
    // ////////////////////////////////////////////////////////////////////////////////////////////
    // Contract support

    public async Task <bool> Create(BlkHeader blkHeader, CancellationToken token)
    {
        var documentId = new DocumentId(blkHeader.DocumentId);

        BlockChainModel?model = await Get(documentId, token);

        if (model != null)
        {
            return(false);
        }

        BlockChain blockChain = new BlockChainBuilder()
                                .SetPrincipleId(blkHeader.PrincipalId)
                                .Build();

        blockChain.Add(blkHeader, blkHeader.PrincipalId);

        blockChain = await Sign(blockChain, token);

        if (!blockChain.IsValid())
        {
            throw new InvalidOperationException("Blockchain is invalid");
        }

        await Set(documentId, blockChain.ToBlockChainModel(), token);

        return(true);
    }
Exemplo n.º 3
0
        public void GivenBlockChain_TwoTypes_ShouldVerify()
        {
            const string issuer  = "*****@*****.**";
            const string issuer2 = "*****@*****.**";
            var          now     = UnixDate.UtcNow;
            var          date    = DateTime.UtcNow;

            var issuerSignature  = new PrincipalSignature(issuer, issuer, "*****@*****.**");
            var issuerSignature2 = new PrincipalSignature(issuer2, issuer2, "*****@*****.**");

            BlockChain blockChain = new BlockChainBuilder()
                                    .SetPrincipleId(issuer)
                                    .Build();

            var payload = new Payload {
                Name = "Name1", Value = 2, Price = 10.5f
            };
            var payload2 = new Payload2 {
                Last = "Last", Current = date, Author = "test"
            };

            blockChain.Add(payload, issuer);
            blockChain.Add(payload2, issuer2);

            var getSignature = (string kid) => kid switch
            {
                issuer => issuerSignature,
                issuer2 => issuerSignature2,
                _ => throw new ArgumentException($"Invalid kid={kid}"),
            };

            blockChain = blockChain.Sign(getSignature);

            blockChain.Validate(getSignature);

            // Get payload of data block
            blockChain.Blocks.Count.Should().Be(3);

            DataBlock receiveBlock = blockChain.Blocks[1].DataBlock;

            TestBlockNode(receiveBlock, "Payload", "1");

            Payload p1 = receiveBlock.Data.ToObject <Payload>().VerifyNotNull("payload failed");

            (payload == p1).Should().BeTrue();

            DataBlock receiveBlock2 = blockChain.Blocks[2].DataBlock;

            TestBlockNode(receiveBlock2, "Payload2", "2");

            Payload2 p2 = receiveBlock2.Data.ToObject <Payload2>().VerifyNotNull("payload2 failed");

            (payload2 == p2).Should().BeTrue();
        }
Exemplo n.º 4
0
        public void GivenEmptyBlockChain_ShouldVerify()
        {
            const string issuer = "*****@*****.**";
            var          now    = UnixDate.UtcNow;

            IPrincipalSignature principleSignature = new PrincipalSignature(issuer, issuer, "*****@*****.**");

            BlockChain blockChain = new BlockChainBuilder()
                                    .SetPrincipleId(issuer)
                                    .Build()
                                    .Sign(x => principleSignature);

            blockChain.Validate(x => principleSignature);
        }
Exemplo n.º 5
0
        public void GivenBlockChain_AppendSingleNode_ShouldVerify()
        {
            const string issuer = "*****@*****.**";
            var          now    = DateTime.UtcNow;

            IPrincipalSignature principleSignature = new PrincipalSignature(issuer, issuer, "*****@*****.**");

            var dataPayload = new
            {
                Name   = "Name",
                Type   = "Type",
                Author = "Author",
                Data   = "Data"
            };

            string payloadJson = dataPayload.ToJson();

            DataBlock data = new DataBlockBuilder()
                             .SetTimeStamp(now)
                             .SetBlockType("blockType")
                             .SetBlockId("blockId")
                             .SetData(payloadJson)
                             .SetPrincipleId(issuer)
                             .Build();

            BlockChain blockChain = new BlockChainBuilder()
                                    .SetPrincipleId(issuer)
                                    .Build()
                                    .Add(data)
                                    .Sign(x => principleSignature);

            blockChain.Validate(x => principleSignature);

            // Get payload of data block
            blockChain.Blocks.Count.Should().Be(2);

            DataBlock receiveBlock = blockChain.Blocks[1].DataBlock;

            TestBlockNode(receiveBlock, "blockType", "blockId");

            Dictionary <string, string> receivedPayload = receiveBlock.Data.ToObject <Dictionary <string, string> >().VerifyNotNull("payload failed");

            (receivedPayload["name"] == "Name").Should().BeTrue();
            (receivedPayload["type"] == "Type").Should().BeTrue();
            (receivedPayload["author"] == "Author").Should().BeTrue();
            (receivedPayload["data"] == "Data").Should().BeTrue();
        }
Exemplo n.º 6
0
    public async Task GivenBlockChain_WhenFile_WillRoundTrip()
    {
        ContractClient client = TestApplication.GetContractClient();

        var documentId = new DocumentId("test/unit-tests-smart/contract1");

        await Delete(documentId, false);

        var blkHeader = new BlkHeader
        {
            PrincipalId = "dev/user/[email protected]",
            DocumentId  = (string)documentId,
            Creator     = "test",
            Description = "test description",
        };

        BlockChain blockChain = new BlockChainBuilder()
                                .SetPrincipleId(blkHeader.PrincipalId)
                                .Build()
                                .Add(blkHeader, blkHeader.PrincipalId);

        BlockChainModel signedBlockChainModel = await client.Sign(blockChain.ToBlockChainModel());

        signedBlockChainModel.Should().NotBeNull();

        await client.Set(documentId, signedBlockChainModel);

        BlockChainModel readBlockChainModel = await client.Get(documentId);

        readBlockChainModel.Should().NotBeNull();

        readBlockChainModel.Blocks.Count.Should().Be(signedBlockChainModel.Blocks.Count);
        readBlockChainModel.Blocks
        .Zip(signedBlockChainModel.Blocks)
        .All(x => x.First == x.Second)
        .Should().BeTrue();

        bool isValid = await client.Validate(documentId);

        isValid.Should().BeTrue();

        isValid = await client.Validate(readBlockChainModel);

        isValid.Should().BeTrue();

        await Delete(documentId, true);
    }
Exemplo n.º 7
0
    public async Task GivenBlockChain_WhenSigned_FailedWithWrongSignature()
    {
        ContractClient client = TestApplication.GetContractClient();

        var documentId = new DocumentId("test/unit-tests-smart/contract1");

        var blkHeader = new BlkHeader
        {
            PrincipalId = "dev/user/[email protected]",
            DocumentId  = (string)documentId,
            Creator     = "test",
            Description = "test description",
        };

        BlockChain blockChain = new BlockChainBuilder()
                                .SetPrincipleId(blkHeader.PrincipalId)
                                .Build()
                                .Add(blkHeader, blkHeader.PrincipalId);

        BlockChainModel signedBlockChainModel = await client.Sign(blockChain.ToBlockChainModel());

        signedBlockChainModel.Should().NotBeNull();

        bool isValid = await client.Validate(signedBlockChainModel);


        // Modify signature
        signedBlockChainModel.Blocks[1] = signedBlockChainModel.Blocks[1] with {
            DataBlock = signedBlockChainModel.Blocks[1].DataBlock with {
                JwtSignature = "junk"
            }
        };

        isValid = await client.Validate(signedBlockChainModel);

        isValid.Should().BeFalse();
    }