github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/crypto/ecies/ecies_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  //版权所有(c)2013 Kyle Isom<kyle@tyrfingr.is>
    10  //版权所有(c)2012 The Go作者。版权所有。
    11  //
    12  //以源和二进制形式重新分配和使用,有或无
    13  //允许修改,前提是以下条件
    14  //遇见:
    15  //
    16  //*源代码的再分配必须保留上述版权。
    17  //注意,此条件列表和以下免责声明。
    18  //*二进制形式的再分配必须复制上述内容
    19  //版权声明、此条件列表和以下免责声明
    20  //在提供的文件和/或其他材料中,
    21  //分布。
    22  //*无论是谷歌公司的名称还是其
    23  //贡献者可用于支持或推广源自
    24  //本软件未经事先明确书面许可。
    25  //
    26  //本软件由版权所有者和贡献者提供。
    27  //“原样”和任何明示或暗示的保证,包括但不包括
    28  //仅限于对适销性和适用性的暗示保证
    29  //不承认特定目的。在任何情况下,版权
    30  //所有人或出资人对任何直接、间接、附带的,
    31  //特殊、惩戒性或后果性损害(包括但不包括
    32  //仅限于采购替代货物或服务;使用损失,
    33  //数据或利润;或业务中断),无论如何引起的
    34  //责任理论,无论是合同责任、严格责任还是侵权责任。
    35  //(包括疏忽或其他)因使用不当而引起的
    36  //即使已告知此类损坏的可能性。
    37  
    38  package ecies
    39  
    40  import (
    41  	"bytes"
    42  	"crypto/elliptic"
    43  	"crypto/rand"
    44  	"crypto/sha256"
    45  	"encoding/hex"
    46  	"flag"
    47  	"fmt"
    48  	"math/big"
    49  	"testing"
    50  
    51  	"github.com/ethereum/go-ethereum/crypto"
    52  )
    53  
    54  var dumpEnc bool
    55  
    56  func init() {
    57  	flDump := flag.Bool("dump", false, "write encrypted test message to file")
    58  	flag.Parse()
    59  	dumpEnc = *flDump
    60  }
    61  
    62  //确保KDF生成大小适当的密钥。
    63  func TestKDF(t *testing.T) {
    64  	msg := []byte("Hello, world")
    65  	h := sha256.New()
    66  
    67  	k, err := concatKDF(h, msg, nil, 64)
    68  	if err != nil {
    69  		fmt.Println(err.Error())
    70  		t.FailNow()
    71  	}
    72  	if len(k) != 64 {
    73  		fmt.Printf("KDF: generated key is the wrong size (%d instead of 64\n", len(k))
    74  		t.FailNow()
    75  	}
    76  }
    77  
    78  var ErrBadSharedKeys = fmt.Errorf("ecies: shared keys don't match")
    79  
    80  //cmpfarams比较一组ecies参数。我们假设,根据
    81  //文档,认为AES是唯一支持的对称加密算法。
    82  func cmpParams(p1, p2 *ECIESParams) bool {
    83  	return p1.hashAlgo == p2.hashAlgo &&
    84  		p1.KeyLen == p2.KeyLen &&
    85  		p1.BlockSize == p2.BlockSize
    86  }
    87  
    88  //如果两个公钥表示相同的pojnt,则cmppublic返回true。
    89  func cmpPublic(pub1, pub2 PublicKey) bool {
    90  	if pub1.X == nil || pub1.Y == nil {
    91  		fmt.Println(ErrInvalidPublicKey.Error())
    92  		return false
    93  	}
    94  	if pub2.X == nil || pub2.Y == nil {
    95  		fmt.Println(ErrInvalidPublicKey.Error())
    96  		return false
    97  	}
    98  	pub1Out := elliptic.Marshal(pub1.Curve, pub1.X, pub1.Y)
    99  	pub2Out := elliptic.Marshal(pub2.Curve, pub2.X, pub2.Y)
   100  
   101  	return bytes.Equal(pub1Out, pub2Out)
   102  }
   103  
   104  //如果两个私钥相同,则cmprivate返回true。
   105  func cmpPrivate(prv1, prv2 *PrivateKey) bool {
   106  	if prv1 == nil || prv1.D == nil {
   107  		return false
   108  	} else if prv2 == nil || prv2.D == nil {
   109  		return false
   110  	} else if prv1.D.Cmp(prv2.D) != 0 {
   111  		return false
   112  	} else {
   113  		return cmpPublic(prv1.PublicKey, prv2.PublicKey)
   114  	}
   115  }
   116  
   117  //验证ECDH组件。
   118  func TestSharedKey(t *testing.T) {
   119  	prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   120  	if err != nil {
   121  		fmt.Println(err.Error())
   122  		t.FailNow()
   123  	}
   124  	skLen := MaxSharedKeyLength(&prv1.PublicKey) / 2
   125  
   126  	prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   127  	if err != nil {
   128  		fmt.Println(err.Error())
   129  		t.FailNow()
   130  	}
   131  
   132  	sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen)
   133  	if err != nil {
   134  		fmt.Println(err.Error())
   135  		t.FailNow()
   136  	}
   137  
   138  	sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen)
   139  	if err != nil {
   140  		fmt.Println(err.Error())
   141  		t.FailNow()
   142  	}
   143  
   144  	if !bytes.Equal(sk1, sk2) {
   145  		fmt.Println(ErrBadSharedKeys.Error())
   146  		t.FailNow()
   147  	}
   148  }
   149  
   150  func TestSharedKeyPadding(t *testing.T) {
   151  //清醒检查
   152  	prv0 := hexKey("1adf5c18167d96a1f9a0b1ef63be8aa27eaf6032c233b2b38f7850cf5b859fd9")
   153  	prv1 := hexKey("0097a076fc7fcd9208240668e31c9abee952cbb6e375d1b8febc7499d6e16f1a")
   154  	x0, _ := new(big.Int).SetString("1a8ed022ff7aec59dc1b440446bdda5ff6bcb3509a8b109077282b361efffbd8", 16)
   155  	x1, _ := new(big.Int).SetString("6ab3ac374251f638d0abb3ef596d1dc67955b507c104e5f2009724812dc027b8", 16)
   156  	y0, _ := new(big.Int).SetString("e040bd480b1deccc3bc40bd5b1fdcb7bfd352500b477cb9471366dbd4493f923", 16)
   157  	y1, _ := new(big.Int).SetString("8ad915f2b503a8be6facab6588731fefeb584fd2dfa9a77a5e0bba1ec439e4fa", 16)
   158  
   159  	if prv0.PublicKey.X.Cmp(x0) != 0 {
   160  		t.Errorf("mismatched prv0.X:\nhave: %x\nwant: %x\n", prv0.PublicKey.X.Bytes(), x0.Bytes())
   161  	}
   162  	if prv0.PublicKey.Y.Cmp(y0) != 0 {
   163  		t.Errorf("mismatched prv0.Y:\nhave: %x\nwant: %x\n", prv0.PublicKey.Y.Bytes(), y0.Bytes())
   164  	}
   165  	if prv1.PublicKey.X.Cmp(x1) != 0 {
   166  		t.Errorf("mismatched prv1.X:\nhave: %x\nwant: %x\n", prv1.PublicKey.X.Bytes(), x1.Bytes())
   167  	}
   168  	if prv1.PublicKey.Y.Cmp(y1) != 0 {
   169  		t.Errorf("mismatched prv1.Y:\nhave: %x\nwant: %x\n", prv1.PublicKey.Y.Bytes(), y1.Bytes())
   170  	}
   171  
   172  //测试共享秘密生成
   173  	sk1, err := prv0.GenerateShared(&prv1.PublicKey, 16, 16)
   174  	if err != nil {
   175  		fmt.Println(err.Error())
   176  	}
   177  
   178  	sk2, err := prv1.GenerateShared(&prv0.PublicKey, 16, 16)
   179  	if err != nil {
   180  		t.Fatal(err.Error())
   181  	}
   182  
   183  	if !bytes.Equal(sk1, sk2) {
   184  		t.Fatal(ErrBadSharedKeys.Error())
   185  	}
   186  }
   187  
   188  //验证当密钥数据太多时密钥生成代码是否失败
   189  //请求。
   190  func TestTooBigSharedKey(t *testing.T) {
   191  	prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   192  	if err != nil {
   193  		fmt.Println(err.Error())
   194  		t.FailNow()
   195  	}
   196  
   197  	prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   198  	if err != nil {
   199  		fmt.Println(err.Error())
   200  		t.FailNow()
   201  	}
   202  
   203  	_, err = prv1.GenerateShared(&prv2.PublicKey, 32, 32)
   204  	if err != ErrSharedKeyTooBig {
   205  		fmt.Println("ecdh: shared key should be too large for curve")
   206  		t.FailNow()
   207  	}
   208  
   209  	_, err = prv2.GenerateShared(&prv1.PublicKey, 32, 32)
   210  	if err != ErrSharedKeyTooBig {
   211  		fmt.Println("ecdh: shared key should be too large for curve")
   212  		t.FailNow()
   213  	}
   214  }
   215  
   216  //对p256密钥的生成进行基准测试。
   217  func BenchmarkGenerateKeyP256(b *testing.B) {
   218  	for i := 0; i < b.N; i++ {
   219  		if _, err := GenerateKey(rand.Reader, elliptic.P256(), nil); err != nil {
   220  			fmt.Println(err.Error())
   221  			b.FailNow()
   222  		}
   223  	}
   224  }
   225  
   226  //基准测试p256共享密钥的生成。
   227  func BenchmarkGenSharedKeyP256(b *testing.B) {
   228  	prv, err := GenerateKey(rand.Reader, elliptic.P256(), nil)
   229  	if err != nil {
   230  		fmt.Println(err.Error())
   231  		b.FailNow()
   232  	}
   233  	b.ResetTimer()
   234  	for i := 0; i < b.N; i++ {
   235  		_, err := prv.GenerateShared(&prv.PublicKey, 16, 16)
   236  		if err != nil {
   237  			fmt.Println(err.Error())
   238  			b.FailNow()
   239  		}
   240  	}
   241  }
   242  
   243  //对S256共享密钥的生成进行基准测试。
   244  func BenchmarkGenSharedKeyS256(b *testing.B) {
   245  	prv, err := GenerateKey(rand.Reader, crypto.S256(), nil)
   246  	if err != nil {
   247  		fmt.Println(err.Error())
   248  		b.FailNow()
   249  	}
   250  	b.ResetTimer()
   251  	for i := 0; i < b.N; i++ {
   252  		_, err := prv.GenerateShared(&prv.PublicKey, 16, 16)
   253  		if err != nil {
   254  			fmt.Println(err.Error())
   255  			b.FailNow()
   256  		}
   257  	}
   258  }
   259  
   260  //验证加密邮件是否可以成功解密。
   261  func TestEncryptDecrypt(t *testing.T) {
   262  	prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   263  	if err != nil {
   264  		fmt.Println(err.Error())
   265  		t.FailNow()
   266  	}
   267  
   268  	prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   269  	if err != nil {
   270  		fmt.Println(err.Error())
   271  		t.FailNow()
   272  	}
   273  
   274  	message := []byte("Hello, world.")
   275  	ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil)
   276  	if err != nil {
   277  		fmt.Println(err.Error())
   278  		t.FailNow()
   279  	}
   280  
   281  	pt, err := prv2.Decrypt(ct, nil, nil)
   282  	if err != nil {
   283  		fmt.Println(err.Error())
   284  		t.FailNow()
   285  	}
   286  
   287  	if !bytes.Equal(pt, message) {
   288  		fmt.Println("ecies: plaintext doesn't match message")
   289  		t.FailNow()
   290  	}
   291  
   292  	_, err = prv1.Decrypt(ct, nil, nil)
   293  	if err == nil {
   294  		fmt.Println("ecies: encryption should not have succeeded")
   295  		t.FailNow()
   296  	}
   297  }
   298  
   299  func TestDecryptShared2(t *testing.T) {
   300  	prv, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   301  	if err != nil {
   302  		t.Fatal(err)
   303  	}
   304  	message := []byte("Hello, world.")
   305  	shared2 := []byte("shared data 2")
   306  	ct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, shared2)
   307  	if err != nil {
   308  		t.Fatal(err)
   309  	}
   310  
   311  //检查使用正确的共享数据进行解密是否有效。
   312  	pt, err := prv.Decrypt(ct, nil, shared2)
   313  	if err != nil {
   314  		t.Fatal(err)
   315  	}
   316  	if !bytes.Equal(pt, message) {
   317  		t.Fatal("ecies: plaintext doesn't match message")
   318  	}
   319  
   320  //在没有共享数据或共享数据不正确的情况下解密失败。
   321  	if _, err = prv.Decrypt(ct, nil, nil); err == nil {
   322  		t.Fatal("ecies: decrypting without shared data didn't fail")
   323  	}
   324  	if _, err = prv.Decrypt(ct, nil, []byte("garbage")); err == nil {
   325  		t.Fatal("ecies: decrypting with incorrect shared data didn't fail")
   326  	}
   327  }
   328  
   329  type testCase struct {
   330  	Curve    elliptic.Curve
   331  	Name     string
   332  	Expected *ECIESParams
   333  }
   334  
   335  var testCases = []testCase{
   336  	{
   337  		Curve:    elliptic.P256(),
   338  		Name:     "P256",
   339  		Expected: ECIES_AES128_SHA256,
   340  	},
   341  	{
   342  		Curve:    elliptic.P384(),
   343  		Name:     "P384",
   344  		Expected: ECIES_AES256_SHA384,
   345  	},
   346  	{
   347  		Curve:    elliptic.P521(),
   348  		Name:     "P521",
   349  		Expected: ECIES_AES256_SHA512,
   350  	},
   351  }
   352  
   353  //每条曲线的测试参数选择,P224自动失效
   354  //参数选择(有关p224的讨论,请参阅自述文件)。确保
   355  //为给定曲线自动选择一组参数会起作用。
   356  func TestParamSelection(t *testing.T) {
   357  	for _, c := range testCases {
   358  		testParamSelection(t, c)
   359  	}
   360  }
   361  
   362  func testParamSelection(t *testing.T, c testCase) {
   363  	params := ParamsFromCurve(c.Curve)
   364  	if params == nil && c.Expected != nil {
   365  		fmt.Printf("%s (%s)\n", ErrInvalidParams.Error(), c.Name)
   366  		t.FailNow()
   367  	} else if params != nil && !cmpParams(params, c.Expected) {
   368  		fmt.Printf("ecies: parameters should be invalid (%s)\n",
   369  			c.Name)
   370  		t.FailNow()
   371  	}
   372  
   373  	prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   374  	if err != nil {
   375  		fmt.Printf("%s (%s)\n", err.Error(), c.Name)
   376  		t.FailNow()
   377  	}
   378  
   379  	prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   380  	if err != nil {
   381  		fmt.Printf("%s (%s)\n", err.Error(), c.Name)
   382  		t.FailNow()
   383  	}
   384  
   385  	message := []byte("Hello, world.")
   386  	ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil)
   387  	if err != nil {
   388  		fmt.Printf("%s (%s)\n", err.Error(), c.Name)
   389  		t.FailNow()
   390  	}
   391  
   392  	pt, err := prv2.Decrypt(ct, nil, nil)
   393  	if err != nil {
   394  		fmt.Printf("%s (%s)\n", err.Error(), c.Name)
   395  		t.FailNow()
   396  	}
   397  
   398  	if !bytes.Equal(pt, message) {
   399  		fmt.Printf("ecies: plaintext doesn't match message (%s)\n",
   400  			c.Name)
   401  		t.FailNow()
   402  	}
   403  
   404  	_, err = prv1.Decrypt(ct, nil, nil)
   405  	if err == nil {
   406  		fmt.Printf("ecies: encryption should not have succeeded (%s)\n",
   407  			c.Name)
   408  		t.FailNow()
   409  	}
   410  
   411  }
   412  
   413  //确保解密操作中的基本公钥验证
   414  //作品。
   415  func TestBasicKeyValidation(t *testing.T) {
   416  	badBytes := []byte{0, 1, 5, 6, 7, 8, 9}
   417  
   418  	prv, err := GenerateKey(rand.Reader, DefaultCurve, nil)
   419  	if err != nil {
   420  		fmt.Println(err.Error())
   421  		t.FailNow()
   422  	}
   423  
   424  	message := []byte("Hello, world.")
   425  	ct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, nil)
   426  	if err != nil {
   427  		fmt.Println(err.Error())
   428  		t.FailNow()
   429  	}
   430  
   431  	for _, b := range badBytes {
   432  		ct[0] = b
   433  		_, err := prv.Decrypt(ct, nil, nil)
   434  		if err != ErrInvalidPublicKey {
   435  			fmt.Println("ecies: validated an invalid key")
   436  			t.FailNow()
   437  		}
   438  	}
   439  }
   440  
   441  func TestBox(t *testing.T) {
   442  	prv1 := hexKey("4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f")
   443  	prv2 := hexKey("d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a")
   444  	pub2 := &prv2.PublicKey
   445  
   446  	message := []byte("Hello, world.")
   447  	ct, err := Encrypt(rand.Reader, pub2, message, nil, nil)
   448  	if err != nil {
   449  		t.Fatal(err)
   450  	}
   451  
   452  	pt, err := prv2.Decrypt(ct, nil, nil)
   453  	if err != nil {
   454  		t.Fatal(err)
   455  	}
   456  	if !bytes.Equal(pt, message) {
   457  		t.Fatal("ecies: plaintext doesn't match message")
   458  	}
   459  	if _, err = prv1.Decrypt(ct, nil, nil); err == nil {
   460  		t.Fatal("ecies: encryption should not have succeeded")
   461  	}
   462  }
   463  
   464  //验证GenerateShared与静态值的对比-在
   465  //调试基础libs中的更改
   466  func TestSharedKeyStatic(t *testing.T) {
   467  	prv1 := hexKey("7ebbc6a8358bc76dd73ebc557056702c8cfc34e5cfcd90eb83af0347575fd2ad")
   468  	prv2 := hexKey("6a3d6396903245bba5837752b9e0348874e72db0c4e11e9c485a81b4ea4353b9")
   469  
   470  	skLen := MaxSharedKeyLength(&prv1.PublicKey) / 2
   471  
   472  	sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen)
   473  	if err != nil {
   474  		fmt.Println(err.Error())
   475  		t.FailNow()
   476  	}
   477  
   478  	sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen)
   479  	if err != nil {
   480  		fmt.Println(err.Error())
   481  		t.FailNow()
   482  	}
   483  
   484  	if !bytes.Equal(sk1, sk2) {
   485  		fmt.Println(ErrBadSharedKeys.Error())
   486  		t.FailNow()
   487  	}
   488  
   489  	sk, _ := hex.DecodeString("167ccc13ac5e8a26b131c3446030c60fbfac6aa8e31149d0869f93626a4cdf62")
   490  	if !bytes.Equal(sk1, sk) {
   491  		t.Fatalf("shared secret mismatch: want: %x have: %x", sk, sk1)
   492  	}
   493  }
   494  
   495  func hexKey(prv string) *PrivateKey {
   496  	key, err := crypto.HexToECDSA(prv)
   497  	if err != nil {
   498  		panic(err)
   499  	}
   500  	return ImportECDSA(key)
   501  }