github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/whisper/whisperv6/message_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  package whisperv6
    26  
    27  import (
    28  	"bytes"
    29  	"crypto/aes"
    30  	"crypto/cipher"
    31  	mrand "math/rand"
    32  	"testing"
    33  
    34  	"github.com/ethereum/go-ethereum/common/hexutil"
    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.ValidateAndParse() {
   105  		t.Fatalf("failed to validate with seed %d, symmetric = %v.", seed, symmetric)
   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  
   189  	env := NewEnvelope(params.TTL, params.Topic, msg)
   190  	if err != nil {
   191  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   192  	}
   193  
   194  env.Expiry = uint32(seed) //
   195  	target := 32.0
   196  	params.WorkTime = 4
   197  	params.PoW = target
   198  	env.Seal(params)
   199  
   200  	env.calculatePoW(0)
   201  	pow := env.PoW()
   202  	if pow < target {
   203  		t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target)
   204  	}
   205  
   206  	params.WorkTime = 1
   207  	params.PoW = 1000000000.0
   208  	env.Seal(params)
   209  	env.calculatePoW(0)
   210  	pow = env.PoW()
   211  	if pow < 2*target {
   212  		t.Fatalf("failed Wrap with seed %d: pow too small %f.", seed, pow)
   213  	}
   214  }
   215  
   216  func TestEnvelopeOpen(t *testing.T) {
   217  	InitSingleTest()
   218  
   219  	var symmetric bool
   220  	for i := 0; i < 32; i++ {
   221  		singleEnvelopeOpenTest(t, symmetric)
   222  		symmetric = !symmetric
   223  	}
   224  }
   225  
   226  func singleEnvelopeOpenTest(t *testing.T, symmetric bool) {
   227  	params, err := generateMessageParams()
   228  	if err != nil {
   229  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   230  	}
   231  
   232  	key, err := crypto.GenerateKey()
   233  	if err != nil {
   234  		t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err)
   235  	}
   236  
   237  	if !symmetric {
   238  		params.KeySym = nil
   239  		params.Dst = &key.PublicKey
   240  	}
   241  
   242  	text := make([]byte, 0, 512)
   243  	text = append(text, params.Payload...)
   244  
   245  	msg, err := NewSentMessage(params)
   246  	if err != nil {
   247  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   248  	}
   249  	env, err := msg.Wrap(params)
   250  	if err != nil {
   251  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   252  	}
   253  
   254  	var f Filter
   255  	if symmetric {
   256  		f = Filter{KeySym: params.KeySym}
   257  	} else {
   258  		f = Filter{KeyAsym: key}
   259  	}
   260  	decrypted := env.Open(&f)
   261  	if decrypted == nil {
   262  		t.Fatalf("failed to open with seed %d.", seed)
   263  	}
   264  
   265  	if !bytes.Equal(text, decrypted.Payload) {
   266  		t.Fatalf("failed with seed %d: compare payload.", seed)
   267  	}
   268  	if !isMessageSigned(decrypted.Raw[0]) {
   269  		t.Fatalf("failed with seed %d: unsigned.", seed)
   270  	}
   271  	if len(decrypted.Signature) != signatureLength {
   272  		t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature))
   273  	}
   274  	if !IsPubKeyEqual(decrypted.Src, &params.Src.PublicKey) {
   275  		t.Fatalf("failed with seed %d: signature mismatch.", seed)
   276  	}
   277  	if decrypted.isAsymmetricEncryption() == symmetric {
   278  		t.Fatalf("failed with seed %d: asymmetric %v vs. %v.", seed, decrypted.isAsymmetricEncryption(), symmetric)
   279  	}
   280  	if decrypted.isSymmetricEncryption() != symmetric {
   281  		t.Fatalf("failed with seed %d: symmetric %v vs. %v.", seed, decrypted.isSymmetricEncryption(), symmetric)
   282  	}
   283  	if !symmetric {
   284  		if decrypted.Dst == nil {
   285  			t.Fatalf("failed with seed %d: dst is nil.", seed)
   286  		}
   287  		if !IsPubKeyEqual(decrypted.Dst, &key.PublicKey) {
   288  			t.Fatalf("failed with seed %d: Dst.", seed)
   289  		}
   290  	}
   291  }
   292  
   293  func TestEncryptWithZeroKey(t *testing.T) {
   294  	InitSingleTest()
   295  
   296  	params, err := generateMessageParams()
   297  	if err != nil {
   298  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   299  	}
   300  	msg, err := NewSentMessage(params)
   301  	if err != nil {
   302  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   303  	}
   304  	params.KeySym = make([]byte, aesKeyLength)
   305  	_, err = msg.Wrap(params)
   306  	if err == nil {
   307  		t.Fatalf("wrapped with zero key, seed: %d.", seed)
   308  	}
   309  
   310  	params, err = generateMessageParams()
   311  	if err != nil {
   312  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   313  	}
   314  	msg, err = NewSentMessage(params)
   315  	if err != nil {
   316  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   317  	}
   318  	params.KeySym = make([]byte, 0)
   319  	_, err = msg.Wrap(params)
   320  	if err == nil {
   321  		t.Fatalf("wrapped with empty key, seed: %d.", seed)
   322  	}
   323  
   324  	params, err = generateMessageParams()
   325  	if err != nil {
   326  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   327  	}
   328  	msg, err = NewSentMessage(params)
   329  	if err != nil {
   330  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   331  	}
   332  	params.KeySym = nil
   333  	_, err = msg.Wrap(params)
   334  	if err == nil {
   335  		t.Fatalf("wrapped with nil key, seed: %d.", seed)
   336  	}
   337  }
   338  
   339  func TestRlpEncode(t *testing.T) {
   340  	InitSingleTest()
   341  
   342  	params, err := generateMessageParams()
   343  	if err != nil {
   344  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   345  	}
   346  	msg, err := NewSentMessage(params)
   347  	if err != nil {
   348  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   349  	}
   350  	env, err := msg.Wrap(params)
   351  	if err != nil {
   352  		t.Fatalf("wrapped with zero key, seed: %d.", seed)
   353  	}
   354  
   355  	raw, err := rlp.EncodeToBytes(env)
   356  	if err != nil {
   357  		t.Fatalf("RLP encode failed: %s.", err)
   358  	}
   359  
   360  	var decoded Envelope
   361  	rlp.DecodeBytes(raw, &decoded)
   362  	if err != nil {
   363  		t.Fatalf("RLP decode failed: %s.", err)
   364  	}
   365  
   366  	he := env.Hash()
   367  	hd := decoded.Hash()
   368  
   369  	if he != hd {
   370  		t.Fatalf("Hashes are not equal: %x vs. %x", he, hd)
   371  	}
   372  }
   373  
   374  func singlePaddingTest(t *testing.T, padSize int) {
   375  	params, err := generateMessageParams()
   376  	if err != nil {
   377  		t.Fatalf("failed generateMessageParams with seed %d and sz=%d: %s.", seed, padSize, err)
   378  	}
   379  	params.Padding = make([]byte, padSize)
   380  	params.PoW = 0.0000000001
   381  	pad := make([]byte, padSize)
   382  	_, err = mrand.Read(pad)
   383  	if err != nil {
   384  		t.Fatalf("padding is not generated (seed %d): %s", seed, err)
   385  	}
   386  	n := copy(params.Padding, pad)
   387  	if n != padSize {
   388  		t.Fatalf("padding is not copied (seed %d): %s", seed, err)
   389  	}
   390  	msg, err := NewSentMessage(params)
   391  	if err != nil {
   392  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   393  	}
   394  	env, err := msg.Wrap(params)
   395  	if err != nil {
   396  		t.Fatalf("failed to wrap, seed: %d and sz=%d.", seed, padSize)
   397  	}
   398  	f := Filter{KeySym: params.KeySym}
   399  	decrypted := env.Open(&f)
   400  	if decrypted == nil {
   401  		t.Fatalf("failed to open, seed and sz=%d: %d.", seed, padSize)
   402  	}
   403  	if !bytes.Equal(pad, decrypted.Padding) {
   404  		t.Fatalf("padding is not retireved as expected with seed %d and sz=%d:\n[%x]\n[%x].", seed, padSize, pad, decrypted.Padding)
   405  	}
   406  }
   407  
   408  func TestPadding(t *testing.T) {
   409  	InitSingleTest()
   410  
   411  	for i := 1; i < 260; i++ {
   412  		singlePaddingTest(t, i)
   413  	}
   414  
   415  	lim := 256 * 256
   416  	for i := lim - 5; i < lim+2; i++ {
   417  		singlePaddingTest(t, i)
   418  	}
   419  
   420  	for i := 0; i < 256; i++ {
   421  		n := mrand.Intn(256*254) + 256
   422  		singlePaddingTest(t, n)
   423  	}
   424  
   425  	for i := 0; i < 256; i++ {
   426  		n := mrand.Intn(256*1024) + 256*256
   427  		singlePaddingTest(t, n)
   428  	}
   429  }
   430  
   431  func TestPaddingAppendedToSymMessagesWithSignature(t *testing.T) {
   432  	params := &MessageParams{
   433  		Payload: make([]byte, 246),
   434  		KeySym:  make([]byte, aesKeyLength),
   435  	}
   436  
   437  	pSrc, err := crypto.GenerateKey()
   438  
   439  	if err != nil {
   440  		t.Fatalf("Error creating the signature key %v", err)
   441  		return
   442  	}
   443  	params.Src = pSrc
   444  
   445  //
   446  //
   447  //
   448  	msg := sentMessage{}
   449  	const payloadSizeFieldMinSize = 1
   450  	msg.Raw = make([]byte, flagsLength+payloadSizeFieldMinSize+len(params.Payload))
   451  
   452  	err = msg.appendPadding(params)
   453  
   454  	if err != nil {
   455  		t.Fatalf("Error appending padding to message %v", err)
   456  		return
   457  	}
   458  
   459  	if len(msg.Raw) != 512-signatureLength {
   460  		t.Errorf("Invalid size %d != 512", len(msg.Raw))
   461  	}
   462  }
   463  
   464  func TestAesNonce(t *testing.T) {
   465  	key := hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31")
   466  	block, err := aes.NewCipher(key)
   467  	if err != nil {
   468  		t.Fatalf("NewCipher failed: %s", err)
   469  	}
   470  	aesgcm, err := cipher.NewGCM(block)
   471  	if err != nil {
   472  		t.Fatalf("NewGCM failed: %s", err)
   473  	}
   474  //
   475  //
   476  	if aesgcm.NonceSize() != aesNonceLength {
   477  		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.")
   478  	}
   479  }