Esempio n. 1
0
        private string ComputeProposalBinding(DecodedSignedProposal decodedSignedProposal)
        {
            var nonce   = decodedSignedProposal.Proposal.Header.SignatureHeader.Nonce.ToByteArray();
            var creator = decodedSignedProposal.Proposal.Header.SignatureHeader.Creator.ToByteArray();
            var epoch   = decodedSignedProposal.Proposal.Header.ChannelHeader.Epoch;

            var epochBuffer = BitConverter.GetBytes(epoch);

            var total = nonce.Concat(creator).Concat(epochBuffer);

            using (var sha256 = SHA256.Create())
            {
                return(sha256.ComputeHash(total.ToArray()).ByteArrayToHexString());
            }
        }
Esempio n. 2
0
        private DecodedSignedProposal ValidateSignedProposal(SignedProposal signedProposal)
        {
            if (signedProposal == null)
            {
                return(null);
            }

            var decodedSignedProposal = new DecodedSignedProposal
            {
                Signature = signedProposal.Signature
            };

            try
            {
                _proposal = Proposal.Parser.ParseFrom(signedProposal.ProposalBytes);
                decodedSignedProposal.Proposal = new ChaincodeProposal();
            }
            catch (Exception ex)
            {
                throw new Exception($"Failed extracting proposal from signedProposal: {ex}");
            }

            if (_proposal.Header == null || _proposal.Header.Length == 0)
            {
                throw new Exception("Proposal header is empty");
            }

            if (_proposal.Payload == null || _proposal.Payload.Length == 0)
            {
                throw new Exception("Proposal payload is empty");
            }

            Header header;

            try
            {
                header = Header.Parser.ParseFrom(_proposal.Header);
                decodedSignedProposal.Proposal.Header = new ChaincodeProposalHeader();
            }
            catch (Exception ex)
            {
                throw new Exception($"Could not extract the header from the proposal: {ex}");
            }

            SignatureHeader signatureHeader;

            try
            {
                signatureHeader = SignatureHeader.Parser.ParseFrom(header.SignatureHeader);
                decodedSignedProposal.Proposal.Header.SignatureHeader =
                    new ChaincodeProposalHeaderSignatureHeader {
                    Nonce = signatureHeader.Nonce
                };
            }
            catch (Exception ex)
            {
                throw new Exception($"Decoding SignatureHeader failed: {ex}");
            }

            try
            {
                var creator = SerializedIdentity.Parser.ParseFrom(signatureHeader.Creator);
                decodedSignedProposal.Proposal.Header.SignatureHeader.Creator = creator;
                Creator = creator;
            }
            catch (Exception ex)
            {
                throw new Exception($"Decoding SerializedIdentity failed: {ex}");
            }

            try
            {
                var channelHeader = ChannelHeader.Parser.ParseFrom(header.ChannelHeader);
                decodedSignedProposal.Proposal.Header.ChannelHeader = channelHeader;

                TxTimestamp = channelHeader.Timestamp;
            }
            catch (Exception ex)
            {
                throw new Exception($"Decoding ChannelHeader failed: {ex}");
            }

            ChaincodeProposalPayload payload;

            try
            {
                payload = ChaincodeProposalPayload.Parser.ParseFrom(_proposal.Payload);
                decodedSignedProposal.Proposal.Payload = payload;
            }
            catch (Exception ex)
            {
                throw new Exception($"Decoding ChaincodeProposalPayload failed: {ex}");
            }

            TransientMap = payload.TransientMap;

            Binding = ComputeProposalBinding(decodedSignedProposal);

            return(decodedSignedProposal);
        }