rlpx_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package p2p
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io/ioutil"
  6. "strings"
  7. "testing"
  8. "github.com/ethereum/go-ethereum/crypto"
  9. "github.com/ethereum/go-ethereum/crypto/sha3"
  10. "github.com/ethereum/go-ethereum/rlp"
  11. )
  12. func TestRlpxFrameFake(t *testing.T) {
  13. buf := new(bytes.Buffer)
  14. hash := fakeHash([]byte{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1})
  15. rw := newRlpxFrameRW(buf, secrets{
  16. AES: crypto.Sha3(),
  17. MAC: crypto.Sha3(),
  18. IngressMAC: hash,
  19. EgressMAC: hash,
  20. })
  21. golden := unhex(`
  22. 00828ddae471818bb0bfa6b551d1cb42
  23. 01010101010101010101010101010101
  24. ba628a4ba590cb43f7848f41c4382885
  25. 01010101010101010101010101010101
  26. `)
  27. // Check WriteMsg. This puts a message into the buffer.
  28. if err := Send(rw, 8, []uint{1, 2, 3, 4}); err != nil {
  29. t.Fatalf("WriteMsg error: %v", err)
  30. }
  31. written := buf.Bytes()
  32. if !bytes.Equal(written, golden) {
  33. t.Fatalf("output mismatch:\n got: %x\n want: %x", written, golden)
  34. }
  35. // Check ReadMsg. It reads the message encoded by WriteMsg, which
  36. // is equivalent to the golden message above.
  37. msg, err := rw.ReadMsg()
  38. if err != nil {
  39. t.Fatalf("ReadMsg error: %v", err)
  40. }
  41. if msg.Size != 5 {
  42. t.Errorf("msg size mismatch: got %d, want %d", msg.Size, 5)
  43. }
  44. if msg.Code != 8 {
  45. t.Errorf("msg code mismatch: got %d, want %d", msg.Code, 8)
  46. }
  47. payload, _ := ioutil.ReadAll(msg.Payload)
  48. wantPayload := unhex("C401020304")
  49. if !bytes.Equal(payload, wantPayload) {
  50. t.Errorf("msg payload mismatch:\ngot %x\nwant %x", payload, wantPayload)
  51. }
  52. }
  53. type fakeHash []byte
  54. func (fakeHash) Write(p []byte) (int, error) { return len(p), nil }
  55. func (fakeHash) Reset() {}
  56. func (fakeHash) BlockSize() int { return 0 }
  57. func (h fakeHash) Size() int { return len(h) }
  58. func (h fakeHash) Sum(b []byte) []byte { return append(b, h...) }
  59. func TestRlpxFrameRW(t *testing.T) {
  60. var (
  61. aesSecret = make([]byte, 16)
  62. macSecret = make([]byte, 16)
  63. egressMACinit = make([]byte, 32)
  64. ingressMACinit = make([]byte, 32)
  65. )
  66. for _, s := range [][]byte{aesSecret, macSecret, egressMACinit, ingressMACinit} {
  67. rand.Read(s)
  68. }
  69. conn := new(bytes.Buffer)
  70. s1 := secrets{
  71. AES: aesSecret,
  72. MAC: macSecret,
  73. EgressMAC: sha3.NewKeccak256(),
  74. IngressMAC: sha3.NewKeccak256(),
  75. }
  76. s1.EgressMAC.Write(egressMACinit)
  77. s1.IngressMAC.Write(ingressMACinit)
  78. rw1 := newRlpxFrameRW(conn, s1)
  79. s2 := secrets{
  80. AES: aesSecret,
  81. MAC: macSecret,
  82. EgressMAC: sha3.NewKeccak256(),
  83. IngressMAC: sha3.NewKeccak256(),
  84. }
  85. s2.EgressMAC.Write(ingressMACinit)
  86. s2.IngressMAC.Write(egressMACinit)
  87. rw2 := newRlpxFrameRW(conn, s2)
  88. // send some messages
  89. for i := 0; i < 10; i++ {
  90. // write message into conn buffer
  91. wmsg := []interface{}{"foo", "bar", strings.Repeat("test", i)}
  92. err := Send(rw1, uint64(i), wmsg)
  93. if err != nil {
  94. t.Fatalf("WriteMsg error (i=%d): %v", i, err)
  95. }
  96. // read message that rw1 just wrote
  97. msg, err := rw2.ReadMsg()
  98. if err != nil {
  99. t.Fatalf("ReadMsg error (i=%d): %v", i, err)
  100. }
  101. if msg.Code != uint64(i) {
  102. t.Fatalf("msg code mismatch: got %d, want %d", msg.Code, i)
  103. }
  104. payload, _ := ioutil.ReadAll(msg.Payload)
  105. wantPayload, _ := rlp.EncodeToBytes(wmsg)
  106. if !bytes.Equal(payload, wantPayload) {
  107. t.Fatalf("msg payload mismatch:\ngot %x\nwant %x", payload, wantPayload)
  108. }
  109. }
  110. }