github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/whisper/whisperv5/message_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:51</date>
    10  //</624342689130745856>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  
    28  package whisperv5
    29  
    30  import (
    31  	"bytes"
    32  	mrand "math/rand"
    33  	"testing"
    34  
    35  	"github.com/ethereum/go-ethereum/crypto"
    36  	"github.com/ethereum/go-ethereum/rlp"
    37  )
    38  
    39  func generateMessageParams() (*MessageParams, error) {
    40  //
    41  
    42  	buf := make([]byte, 4)
    43  	mrand.Read(buf)
    44  	sz := mrand.Intn(400)
    45  
    46  	var p MessageParams
    47  	p.PoW = 0.01
    48  	p.WorkTime = 1
    49  	p.TTL = uint32(mrand.Intn(1024))
    50  	p.Payload = make([]byte, sz)
    51  	p.KeySym = make([]byte, aesKeyLength)
    52  	mrand.Read(p.Payload)
    53  	mrand.Read(p.KeySym)
    54  	p.Topic = BytesToTopic(buf)
    55  
    56  	var err error
    57  	p.Src, err = crypto.GenerateKey()
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	return &p, nil
    63  }
    64  
    65  func singleMessageTest(t *testing.T, symmetric bool) {
    66  	params, err := generateMessageParams()
    67  	if err != nil {
    68  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
    69  	}
    70  
    71  	key, err := crypto.GenerateKey()
    72  	if err != nil {
    73  		t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err)
    74  	}
    75  
    76  	if !symmetric {
    77  		params.KeySym = nil
    78  		params.Dst = &key.PublicKey
    79  	}
    80  
    81  	text := make([]byte, 0, 512)
    82  	text = append(text, params.Payload...)
    83  
    84  	msg, err := NewSentMessage(params)
    85  	if err != nil {
    86  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
    87  	}
    88  	env, err := msg.Wrap(params)
    89  	if err != nil {
    90  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
    91  	}
    92  
    93  	var decrypted *ReceivedMessage
    94  	if symmetric {
    95  		decrypted, err = env.OpenSymmetric(params.KeySym)
    96  	} else {
    97  		decrypted, err = env.OpenAsymmetric(key)
    98  	}
    99  
   100  	if err != nil {
   101  		t.Fatalf("failed to encrypt with seed %d: %s.", seed, err)
   102  	}
   103  
   104  	if !decrypted.Validate() {
   105  		t.Fatalf("failed to validate with seed %d.", seed)
   106  	}
   107  
   108  	if !bytes.Equal(text, decrypted.Payload) {
   109  		t.Fatalf("failed with seed %d: compare payload.", seed)
   110  	}
   111  	if !isMessageSigned(decrypted.Raw[0]) {
   112  		t.Fatalf("failed with seed %d: unsigned.", seed)
   113  	}
   114  	if len(decrypted.Signature) != signatureLength {
   115  		t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature))
   116  	}
   117  	if !IsPubKeyEqual(decrypted.Src, &params.Src.PublicKey) {
   118  		t.Fatalf("failed with seed %d: signature mismatch.", seed)
   119  	}
   120  }
   121  
   122  func TestMessageEncryption(t *testing.T) {
   123  	InitSingleTest()
   124  
   125  	var symmetric bool
   126  	for i := 0; i < 256; i++ {
   127  		singleMessageTest(t, symmetric)
   128  		symmetric = !symmetric
   129  	}
   130  }
   131  
   132  func TestMessageWrap(t *testing.T) {
   133  	seed = int64(1777444222)
   134  	mrand.Seed(seed)
   135  	target := 128.0
   136  
   137  	params, err := generateMessageParams()
   138  	if err != nil {
   139  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   140  	}
   141  
   142  	msg, err := NewSentMessage(params)
   143  	if err != nil {
   144  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   145  	}
   146  	params.TTL = 1
   147  	params.WorkTime = 12
   148  	params.PoW = target
   149  	env, err := msg.Wrap(params)
   150  	if err != nil {
   151  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   152  	}
   153  
   154  	pow := env.PoW()
   155  	if pow < target {
   156  		t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target)
   157  	}
   158  
   159  //
   160  	msg2, err := NewSentMessage(params)
   161  	if err != nil {
   162  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   163  	}
   164  	params.TTL = 1000000
   165  	params.WorkTime = 1
   166  	params.PoW = 10000000.0
   167  	_, err = msg2.Wrap(params)
   168  	if err == nil {
   169  		t.Fatalf("unexpectedly reached the PoW target with seed %d.", seed)
   170  	}
   171  }
   172  
   173  func TestMessageSeal(t *testing.T) {
   174  //
   175  	seed = int64(1976726903)
   176  	mrand.Seed(seed)
   177  
   178  	params, err := generateMessageParams()
   179  	if err != nil {
   180  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   181  	}
   182  
   183  	msg, err := NewSentMessage(params)
   184  	if err != nil {
   185  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   186  	}
   187  	params.TTL = 1
   188  	aesnonce := make([]byte, 12)
   189  	mrand.Read(aesnonce)
   190  
   191  	env := NewEnvelope(params.TTL, params.Topic, aesnonce, msg)
   192  	if err != nil {
   193  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   194  	}
   195  
   196  env.Expiry = uint32(seed) //
   197  	target := 32.0
   198  	params.WorkTime = 4
   199  	params.PoW = target
   200  	env.Seal(params)
   201  
   202  	env.calculatePoW(0)
   203  	pow := env.PoW()
   204  	if pow < target {
   205  		t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target)
   206  	}
   207  
   208  	params.WorkTime = 1
   209  	params.PoW = 1000000000.0
   210  	env.Seal(params)
   211  	env.calculatePoW(0)
   212  	pow = env.PoW()
   213  	if pow < 2*target {
   214  		t.Fatalf("failed Wrap with seed %d: pow too small %f.", seed, pow)
   215  	}
   216  }
   217  
   218  func TestEnvelopeOpen(t *testing.T) {
   219  	InitSingleTest()
   220  
   221  	var symmetric bool
   222  	for i := 0; i < 256; i++ {
   223  		singleEnvelopeOpenTest(t, symmetric)
   224  		symmetric = !symmetric
   225  	}
   226  }
   227  
   228  func singleEnvelopeOpenTest(t *testing.T, symmetric bool) {
   229  	params, err := generateMessageParams()
   230  	if err != nil {
   231  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   232  	}
   233  
   234  	key, err := crypto.GenerateKey()
   235  	if err != nil {
   236  		t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err)
   237  	}
   238  
   239  	if !symmetric {
   240  		params.KeySym = nil
   241  		params.Dst = &key.PublicKey
   242  	}
   243  
   244  	text := make([]byte, 0, 512)
   245  	text = append(text, params.Payload...)
   246  
   247  	msg, err := NewSentMessage(params)
   248  	if err != nil {
   249  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   250  	}
   251  	env, err := msg.Wrap(params)
   252  	if err != nil {
   253  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   254  	}
   255  
   256  	f := Filter{KeyAsym: key, KeySym: params.KeySym}
   257  	decrypted := env.Open(&f)
   258  	if decrypted == nil {
   259  		t.Fatalf("failed to open with seed %d.", seed)
   260  	}
   261  
   262  	if !bytes.Equal(text, decrypted.Payload) {
   263  		t.Fatalf("failed with seed %d: compare payload.", seed)
   264  	}
   265  	if !isMessageSigned(decrypted.Raw[0]) {
   266  		t.Fatalf("failed with seed %d: unsigned.", seed)
   267  	}
   268  	if len(decrypted.Signature) != signatureLength {
   269  		t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature))
   270  	}
   271  	if !IsPubKeyEqual(decrypted.Src, &params.Src.PublicKey) {
   272  		t.Fatalf("failed with seed %d: signature mismatch.", seed)
   273  	}
   274  	if decrypted.isAsymmetricEncryption() == symmetric {
   275  		t.Fatalf("failed with seed %d: asymmetric %v vs. %v.", seed, decrypted.isAsymmetricEncryption(), symmetric)
   276  	}
   277  	if decrypted.isSymmetricEncryption() != symmetric {
   278  		t.Fatalf("failed with seed %d: symmetric %v vs. %v.", seed, decrypted.isSymmetricEncryption(), symmetric)
   279  	}
   280  	if !symmetric {
   281  		if decrypted.Dst == nil {
   282  			t.Fatalf("failed with seed %d: dst is nil.", seed)
   283  		}
   284  		if !IsPubKeyEqual(decrypted.Dst, &key.PublicKey) {
   285  			t.Fatalf("failed with seed %d: Dst.", seed)
   286  		}
   287  	}
   288  }
   289  
   290  func TestEncryptWithZeroKey(t *testing.T) {
   291  	InitSingleTest()
   292  
   293  	params, err := generateMessageParams()
   294  	if err != nil {
   295  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   296  	}
   297  	msg, err := NewSentMessage(params)
   298  	if err != nil {
   299  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   300  	}
   301  	params.KeySym = make([]byte, aesKeyLength)
   302  	_, err = msg.Wrap(params)
   303  	if err == nil {
   304  		t.Fatalf("wrapped with zero key, seed: %d.", seed)
   305  	}
   306  
   307  	params, err = generateMessageParams()
   308  	if err != nil {
   309  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   310  	}
   311  	msg, err = NewSentMessage(params)
   312  	if err != nil {
   313  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   314  	}
   315  	params.KeySym = make([]byte, 0)
   316  	_, err = msg.Wrap(params)
   317  	if err == nil {
   318  		t.Fatalf("wrapped with empty key, seed: %d.", seed)
   319  	}
   320  
   321  	params, err = generateMessageParams()
   322  	if err != nil {
   323  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   324  	}
   325  	msg, err = NewSentMessage(params)
   326  	if err != nil {
   327  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   328  	}
   329  	params.KeySym = nil
   330  	_, err = msg.Wrap(params)
   331  	if err == nil {
   332  		t.Fatalf("wrapped with nil key, seed: %d.", seed)
   333  	}
   334  }
   335  
   336  func TestRlpEncode(t *testing.T) {
   337  	InitSingleTest()
   338  
   339  	params, err := generateMessageParams()
   340  	if err != nil {
   341  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   342  	}
   343  	msg, err := NewSentMessage(params)
   344  	if err != nil {
   345  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   346  	}
   347  	env, err := msg.Wrap(params)
   348  	if err != nil {
   349  		t.Fatalf("wrapped with zero key, seed: %d.", seed)
   350  	}
   351  
   352  	raw, err := rlp.EncodeToBytes(env)
   353  	if err != nil {
   354  		t.Fatalf("RLP encode failed: %s.", err)
   355  	}
   356  
   357  	var decoded Envelope
   358  	rlp.DecodeBytes(raw, &decoded)
   359  	if err != nil {
   360  		t.Fatalf("RLP decode failed: %s.", err)
   361  	}
   362  
   363  	he := env.Hash()
   364  	hd := decoded.Hash()
   365  
   366  	if he != hd {
   367  		t.Fatalf("Hashes are not equal: %x vs. %x", he, hd)
   368  	}
   369  }
   370  
   371  func singlePaddingTest(t *testing.T, padSize int) {
   372  	params, err := generateMessageParams()
   373  	if err != nil {
   374  		t.Fatalf("failed generateMessageParams with seed %d and sz=%d: %s.", seed, padSize, err)
   375  	}
   376  	params.Padding = make([]byte, padSize)
   377  	params.PoW = 0.0000000001
   378  	pad := make([]byte, padSize)
   379  	_, err = mrand.Read(pad)
   380  	if err != nil {
   381  		t.Fatalf("padding is not generated (seed %d): %s", seed, err)
   382  	}
   383  	n := copy(params.Padding, pad)
   384  	if n != padSize {
   385  		t.Fatalf("padding is not copied (seed %d): %s", seed, err)
   386  	}
   387  	msg, err := NewSentMessage(params)
   388  	if err != nil {
   389  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   390  	}
   391  	env, err := msg.Wrap(params)
   392  	if err != nil {
   393  		t.Fatalf("failed to wrap, seed: %d and sz=%d.", seed, padSize)
   394  	}
   395  	f := Filter{KeySym: params.KeySym}
   396  	decrypted := env.Open(&f)
   397  	if decrypted == nil {
   398  		t.Fatalf("failed to open, seed and sz=%d: %d.", seed, padSize)
   399  	}
   400  	if !bytes.Equal(pad, decrypted.Padding) {
   401  		t.Fatalf("padding is not retireved as expected with seed %d and sz=%d:\n[%x]\n[%x].", seed, padSize, pad, decrypted.Padding)
   402  	}
   403  }
   404  
   405  func TestPadding(t *testing.T) {
   406  	InitSingleTest()
   407  
   408  	for i := 1; i < 260; i++ {
   409  		singlePaddingTest(t, i)
   410  	}
   411  
   412  	lim := 256 * 256
   413  	for i := lim - 5; i < lim+2; i++ {
   414  		singlePaddingTest(t, i)
   415  	}
   416  
   417  	for i := 0; i < 256; i++ {
   418  		n := mrand.Intn(256*254) + 256
   419  		singlePaddingTest(t, n)
   420  	}
   421  
   422  	for i := 0; i < 256; i++ {
   423  		n := mrand.Intn(256*1024) + 256*256
   424  		singlePaddingTest(t, n)
   425  	}
   426  }
   427