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 }