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()); } }
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); }