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