You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
4.2 KiB

  1. package privval
  2. import (
  3. "encoding/hex"
  4. "testing"
  5. "time"
  6. "github.com/gogo/protobuf/proto"
  7. "github.com/stretchr/testify/require"
  8. "github.com/tendermint/tendermint/crypto"
  9. "github.com/tendermint/tendermint/crypto/ed25519"
  10. cryptoenc "github.com/tendermint/tendermint/crypto/encoding"
  11. "github.com/tendermint/tendermint/crypto/tmhash"
  12. privproto "github.com/tendermint/tendermint/proto/tendermint/privval"
  13. tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
  14. "github.com/tendermint/tendermint/types"
  15. )
  16. var stamp = time.Date(2019, 10, 13, 16, 14, 44, 0, time.UTC)
  17. func exampleVote() *types.Vote {
  18. return &types.Vote{
  19. Type: tmproto.SignedMsgType(1),
  20. Height: 3,
  21. Round: 2,
  22. Timestamp: stamp,
  23. BlockID: types.BlockID{
  24. Hash: tmhash.Sum([]byte("blockID_hash")),
  25. PartSetHeader: types.PartSetHeader{
  26. Total: 1000000,
  27. Hash: tmhash.Sum([]byte("blockID_part_set_header_hash")),
  28. },
  29. },
  30. ValidatorAddress: crypto.AddressHash([]byte("validator_address")),
  31. ValidatorIndex: 56789,
  32. }
  33. }
  34. func exampleProposal() *types.Proposal {
  35. return &types.Proposal{
  36. Type: tmproto.SignedMsgType(1),
  37. Height: 3,
  38. Round: 2,
  39. Timestamp: stamp,
  40. POLRound: 2,
  41. Signature: []byte("it's a signature"),
  42. BlockID: types.BlockID{
  43. Hash: tmhash.Sum([]byte("blockID_hash")),
  44. PartSetHeader: types.PartSetHeader{
  45. Total: 1000000,
  46. Hash: tmhash.Sum([]byte("blockID_part_set_header_hash")),
  47. },
  48. },
  49. }
  50. }
  51. // nolint:lll // ignore line length for tests
  52. func TestPrivvalVectors(t *testing.T) {
  53. pk := ed25519.GenPrivKeyFromSecret([]byte("it's a secret")).PubKey()
  54. ppk, err := cryptoenc.PubKeyToProto(pk)
  55. require.NoError(t, err)
  56. // Generate a simple vote
  57. vote := exampleVote()
  58. votepb := vote.ToProto()
  59. // Generate a simple proposal
  60. proposal := exampleProposal()
  61. proposalpb := proposal.ToProto()
  62. // Create a Reuseable remote error
  63. remoteError := &privproto.RemoteSignerError{Code: 1, Description: "it's a error"}
  64. testCases := []struct {
  65. testName string
  66. msg proto.Message
  67. expBytes string
  68. }{
  69. {"ping request", &privproto.PingRequest{}, "3a00"},
  70. {"ping response", &privproto.PingResponse{}, "4200"},
  71. {"pubKey request", &privproto.PubKeyRequest{}, "0a00"},
  72. {"pubKey response", &privproto.PubKeyResponse{PubKey: &ppk, Error: nil}, "12240a220a20556a436f1218d30942efe798420f51dc9b6a311b929c578257457d05c5fcf230"},
  73. {"pubKey response with error", &privproto.PubKeyResponse{PubKey: nil, Error: remoteError}, "121212100801120c697427732061206572726f72"},
  74. {"Vote Request", &privproto.SignVoteRequest{Vote: votepb}, "1a760a74080110031802224a0a208b01023386c371778ecb6368573e539afc3cc860ec3a2f614e54fe5652f4fc80122608c0843d122072db3d959635dff1bb567bedaa70573392c5159666a3f8caf11e413aac52207a2a0608f49a8ded0532146af1f4111082efb388211bc72c55bcd61e9ac3d538d5bb03"},
  75. {"Vote Response", &privproto.SignedVoteResponse{Vote: votepb, Error: nil}, "22760a74080110031802224a0a208b01023386c371778ecb6368573e539afc3cc860ec3a2f614e54fe5652f4fc80122608c0843d122072db3d959635dff1bb567bedaa70573392c5159666a3f8caf11e413aac52207a2a0608f49a8ded0532146af1f4111082efb388211bc72c55bcd61e9ac3d538d5bb03"},
  76. {"Vote Response with error", &privproto.SignedVoteResponse{Vote: nil, Error: remoteError}, "221212100801120c697427732061206572726f72"},
  77. {"Proposal Request", &privproto.SignProposalRequest{Proposal: proposalpb}, "2a700a6e08011003180220022a4a0a208b01023386c371778ecb6368573e539afc3cc860ec3a2f614e54fe5652f4fc80122608c0843d122072db3d959635dff1bb567bedaa70573392c5159666a3f8caf11e413aac52207a320608f49a8ded053a10697427732061207369676e6174757265"},
  78. {"Proposal Response", &privproto.SignedProposalResponse{Proposal: proposalpb, Error: nil}, "32700a6e08011003180220022a4a0a208b01023386c371778ecb6368573e539afc3cc860ec3a2f614e54fe5652f4fc80122608c0843d122072db3d959635dff1bb567bedaa70573392c5159666a3f8caf11e413aac52207a320608f49a8ded053a10697427732061207369676e6174757265"},
  79. {"Proposal Response with error", &privproto.SignedProposalResponse{Proposal: nil, Error: remoteError}, "321212100801120c697427732061206572726f72"},
  80. }
  81. for _, tc := range testCases {
  82. tc := tc
  83. pm := mustWrapMsg(tc.msg)
  84. bz, err := pm.Marshal()
  85. require.NoError(t, err, tc.testName)
  86. require.Equal(t, tc.expBytes, hex.EncodeToString(bz), tc.testName)
  87. }
  88. }