github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/lang/funcs/crypto_test.go (about) 1 package funcs 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/zclconf/go-cty/cty" 8 "golang.org/x/crypto/bcrypt" 9 ) 10 11 func TestUUID(t *testing.T) { 12 result, err := UUID() 13 if err != nil { 14 t.Fatal(err) 15 } 16 17 resultStr := result.AsString() 18 if got, want := len(resultStr), 36; got != want { 19 t.Errorf("wrong result length %d; want %d", got, want) 20 } 21 } 22 23 func TestUUIDV5(t *testing.T) { 24 tests := []struct { 25 Namespace cty.Value 26 Name cty.Value 27 Want cty.Value 28 Err bool 29 }{ 30 { 31 cty.StringVal("dns"), 32 cty.StringVal("tada"), 33 cty.StringVal("faa898db-9b9d-5b75-86a9-149e7bb8e3b8"), 34 false, 35 }, 36 { 37 cty.StringVal("url"), 38 cty.StringVal("tada"), 39 cty.StringVal("2c1ff6b4-211f-577e-94de-d978b0caa16e"), 40 false, 41 }, 42 { 43 cty.StringVal("oid"), 44 cty.StringVal("tada"), 45 cty.StringVal("61eeea26-5176-5288-87fc-232d6ed30d2f"), 46 false, 47 }, 48 { 49 cty.StringVal("x500"), 50 cty.StringVal("tada"), 51 cty.StringVal("7e12415e-f7c9-57c3-9e43-52dc9950d264"), 52 false, 53 }, 54 { 55 cty.StringVal("6ba7b810-9dad-11d1-80b4-00c04fd430c8"), 56 cty.StringVal("tada"), 57 cty.StringVal("faa898db-9b9d-5b75-86a9-149e7bb8e3b8"), 58 false, 59 }, 60 { 61 cty.StringVal("tada"), 62 cty.StringVal("tada"), 63 cty.UnknownVal(cty.String), 64 true, 65 }, 66 } 67 68 for _, test := range tests { 69 t.Run(fmt.Sprintf("uuidv5(%#v, %#v)", test.Namespace, test.Name), func(t *testing.T) { 70 got, err := UUIDV5(test.Namespace, test.Name) 71 72 if test.Err { 73 if err == nil { 74 t.Fatal("succeeded; want error") 75 } 76 return 77 } else if err != nil { 78 t.Fatalf("unexpected error: %s", err) 79 } 80 81 if !got.RawEquals(test.Want) { 82 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 83 } 84 }) 85 } 86 } 87 88 func TestBase64Sha256(t *testing.T) { 89 tests := []struct { 90 String cty.Value 91 Want cty.Value 92 Err bool 93 }{ 94 { 95 cty.StringVal("test"), 96 cty.StringVal("n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg="), 97 false, 98 }, 99 // This would differ because we're base64-encoding hex represantiation, not raw bytes. 100 // base64encode(sha256("test")) = 101 // "OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZjMTViMGYwMGEwOA==" 102 } 103 104 for _, test := range tests { 105 t.Run(fmt.Sprintf("base64sha256(%#v)", test.String), func(t *testing.T) { 106 got, err := Base64Sha256(test.String) 107 108 if test.Err { 109 if err == nil { 110 t.Fatal("succeeded; want error") 111 } 112 return 113 } else if err != nil { 114 t.Fatalf("unexpected error: %s", err) 115 } 116 117 if !got.RawEquals(test.Want) { 118 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 119 } 120 }) 121 } 122 } 123 124 func TestFileBase64Sha256(t *testing.T) { 125 tests := []struct { 126 Path cty.Value 127 Want cty.Value 128 Err bool 129 }{ 130 { 131 cty.StringVal("testdata/hello.txt"), 132 cty.StringVal("pZGm1Av0IEBKARczz7exkNYsZb8LzaMrV7J32a2fFG4="), 133 false, 134 }, 135 { 136 cty.StringVal("testdata/icon.png"), 137 cty.StringVal("47U1q9IZW093SmAzdC820Skpn8vHPvc8szud/Y3ezpo="), 138 false, 139 }, 140 { 141 cty.StringVal("testdata/missing"), 142 cty.NilVal, 143 true, // no file exists 144 }, 145 } 146 147 fileSHA256 := MakeFileBase64Sha256Func(".") 148 149 for _, test := range tests { 150 t.Run(fmt.Sprintf("filebase64sha256(%#v)", test.Path), func(t *testing.T) { 151 got, err := fileSHA256.Call([]cty.Value{test.Path}) 152 153 if test.Err { 154 if err == nil { 155 t.Fatal("succeeded; want error") 156 } 157 return 158 } else if err != nil { 159 t.Fatalf("unexpected error: %s", err) 160 } 161 162 if !got.RawEquals(test.Want) { 163 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 164 } 165 }) 166 } 167 } 168 169 func TestBase64Sha512(t *testing.T) { 170 tests := []struct { 171 String cty.Value 172 Want cty.Value 173 Err bool 174 }{ 175 { 176 cty.StringVal("test"), 177 cty.StringVal("7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2Ob1f1ACio/w=="), 178 false, 179 }, 180 // This would differ because we're base64-encoding hex represantiation, not raw bytes 181 // base64encode(sha512("test")) = 182 // "OZWUyNmIwZGQ0YWY3ZTc0OWFhMWE4ZWUzYzEwYWU5OTIzZjYxODk4MDc3MmU0NzNmODgxOWE1ZDQ5NDBlMGRiMjdhYzE4NWY4YTBlMWQ1Zjg0Zjg4YmM4ODdmZDY3YjE0MzczMmMzMDRjYzVmYTlhZDhlNmY1N2Y1MDAyOGE4ZmY=" 183 } 184 185 for _, test := range tests { 186 t.Run(fmt.Sprintf("base64sha512(%#v)", test.String), func(t *testing.T) { 187 got, err := Base64Sha512(test.String) 188 189 if test.Err { 190 if err == nil { 191 t.Fatal("succeeded; want error") 192 } 193 return 194 } else if err != nil { 195 t.Fatalf("unexpected error: %s", err) 196 } 197 198 if !got.RawEquals(test.Want) { 199 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 200 } 201 }) 202 } 203 } 204 205 func TestFileBase64Sha512(t *testing.T) { 206 tests := []struct { 207 Path cty.Value 208 Want cty.Value 209 Err bool 210 }{ 211 { 212 cty.StringVal("testdata/hello.txt"), 213 cty.StringVal("LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw=="), 214 false, 215 }, 216 { 217 cty.StringVal("testdata/icon.png"), 218 cty.StringVal("wSInO/tKEOaLGCAY2h/7gtLWMpzyLJ0ijFh95JTpYrPzXQYgviAdL9ZgpD9EAte8On+drvhFvjIFsfQUwxbNPQ=="), 219 false, 220 }, 221 { 222 cty.StringVal("testdata/missing"), 223 cty.NilVal, 224 true, // no file exists 225 }, 226 } 227 228 fileSHA512 := MakeFileBase64Sha512Func(".") 229 230 for _, test := range tests { 231 t.Run(fmt.Sprintf("filebase64sha512(%#v)", test.Path), func(t *testing.T) { 232 got, err := fileSHA512.Call([]cty.Value{test.Path}) 233 234 if test.Err { 235 if err == nil { 236 t.Fatal("succeeded; want error") 237 } 238 return 239 } else if err != nil { 240 t.Fatalf("unexpected error: %s", err) 241 } 242 243 if !got.RawEquals(test.Want) { 244 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 245 } 246 }) 247 } 248 } 249 250 func TestBcrypt(t *testing.T) { 251 // single variable test 252 p, err := Bcrypt(cty.StringVal("test")) 253 if err != nil { 254 t.Fatalf("err: %s", err) 255 } 256 257 err = bcrypt.CompareHashAndPassword([]byte(p.AsString()), []byte("test")) 258 if err != nil { 259 t.Fatalf("Error comparing hash and password: %s", err) 260 } 261 262 // testing with two parameters 263 p, err = Bcrypt(cty.StringVal("test"), cty.NumberIntVal(5)) 264 if err != nil { 265 t.Fatalf("err: %s", err) 266 } 267 268 err = bcrypt.CompareHashAndPassword([]byte(p.AsString()), []byte("test")) 269 if err != nil { 270 t.Fatalf("Error comparing hash and password: %s", err) 271 } 272 273 // Negative test for more than two parameters 274 _, err = Bcrypt(cty.StringVal("test"), cty.NumberIntVal(10), cty.NumberIntVal(11)) 275 if err == nil { 276 t.Fatal("succeeded; want error") 277 } 278 } 279 280 func TestMd5(t *testing.T) { 281 tests := []struct { 282 String cty.Value 283 Want cty.Value 284 Err bool 285 }{ 286 { 287 cty.StringVal("tada"), 288 cty.StringVal("ce47d07243bb6eaf5e1322c81baf9bbf"), 289 false, 290 }, 291 { // Confirm that we're not trimming any whitespaces 292 cty.StringVal(" tada "), 293 cty.StringVal("aadf191a583e53062de2d02c008141c4"), 294 false, 295 }, 296 { // We accept empty string too 297 cty.StringVal(""), 298 cty.StringVal("d41d8cd98f00b204e9800998ecf8427e"), 299 false, 300 }, 301 } 302 303 for _, test := range tests { 304 t.Run(fmt.Sprintf("md5(%#v)", test.String), func(t *testing.T) { 305 got, err := Md5(test.String) 306 307 if test.Err { 308 if err == nil { 309 t.Fatal("succeeded; want error") 310 } 311 return 312 } else if err != nil { 313 t.Fatalf("unexpected error: %s", err) 314 } 315 316 if !got.RawEquals(test.Want) { 317 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 318 } 319 }) 320 } 321 } 322 323 func TestFileMD5(t *testing.T) { 324 tests := []struct { 325 Path cty.Value 326 Want cty.Value 327 Err bool 328 }{ 329 { 330 cty.StringVal("testdata/hello.txt"), 331 cty.StringVal("b10a8db164e0754105b7a99be72e3fe5"), 332 false, 333 }, 334 { 335 cty.StringVal("testdata/icon.png"), 336 cty.StringVal("d7e6c283185a1078c58213beadca98b0"), 337 false, 338 }, 339 { 340 cty.StringVal("testdata/missing"), 341 cty.NilVal, 342 true, // no file exists 343 }, 344 } 345 346 fileMD5 := MakeFileMd5Func(".") 347 348 for _, test := range tests { 349 t.Run(fmt.Sprintf("filemd5(%#v)", test.Path), func(t *testing.T) { 350 got, err := fileMD5.Call([]cty.Value{test.Path}) 351 352 if test.Err { 353 if err == nil { 354 t.Fatal("succeeded; want error") 355 } 356 return 357 } else if err != nil { 358 t.Fatalf("unexpected error: %s", err) 359 } 360 361 if !got.RawEquals(test.Want) { 362 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 363 } 364 }) 365 } 366 } 367 368 func TestRsaDecrypt(t *testing.T) { 369 tests := []struct { 370 Ciphertext cty.Value 371 Privatekey cty.Value 372 Want cty.Value 373 Err string 374 }{ 375 // Base-64 encoded cipher decrypts correctly 376 { 377 cty.StringVal(CipherBase64), 378 cty.StringVal(PrivateKey), 379 cty.StringVal("message"), 380 "", 381 }, 382 // OpenSSH key format 383 { 384 cty.StringVal(CipherBase64), 385 cty.StringVal(OpenSSHPrivateKey), 386 cty.StringVal("message"), 387 "", 388 }, 389 // Wrong key 390 { 391 cty.StringVal(CipherBase64), 392 cty.StringVal(WrongPrivateKey), 393 cty.UnknownVal(cty.String), 394 "failed to decrypt: crypto/rsa: decryption error", 395 }, 396 // Bad key 397 { 398 cty.StringVal(CipherBase64), 399 cty.StringVal(BadPrivateKey), 400 cty.UnknownVal(cty.String), 401 "invalid ASN1 data in the given private key: data truncated", 402 }, 403 // Empty key 404 { 405 cty.StringVal(CipherBase64), 406 cty.StringVal(""), 407 cty.UnknownVal(cty.String), 408 "invalid private key: ssh: no key found", 409 }, 410 // Bad ciphertext 411 { 412 cty.StringVal("bad"), 413 cty.StringVal(PrivateKey), 414 cty.UnknownVal(cty.String), 415 `failed to decode input "bad": cipher text must be base64-encoded`, 416 }, 417 // Empty ciphertext 418 { 419 cty.StringVal(""), 420 cty.StringVal(PrivateKey), 421 cty.UnknownVal(cty.String), 422 "failed to decrypt: crypto/rsa: decryption error", 423 }, 424 } 425 for _, test := range tests { 426 t.Run(fmt.Sprintf("RsaDecrypt(%#v, %#v)", test.Ciphertext, test.Privatekey), func(t *testing.T) { 427 got, err := RsaDecrypt(test.Ciphertext, test.Privatekey) 428 429 if test.Err != "" { 430 if err == nil { 431 t.Fatal("succeeded; want error") 432 } else if err.Error() != test.Err { 433 t.Fatalf("wrong error\ngot: %s\nwant: %s", err.Error(), test.Err) 434 } 435 return 436 } else if err != nil { 437 t.Fatalf("unexpected error: %s", err) 438 } 439 440 if !got.RawEquals(test.Want) { 441 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 442 } 443 }) 444 } 445 } 446 447 func TestSha1(t *testing.T) { 448 tests := []struct { 449 String cty.Value 450 Want cty.Value 451 Err bool 452 }{ 453 { 454 cty.StringVal("test"), 455 cty.StringVal("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"), 456 false, 457 }, 458 } 459 460 for _, test := range tests { 461 t.Run(fmt.Sprintf("sha1(%#v)", test.String), func(t *testing.T) { 462 got, err := Sha1(test.String) 463 464 if test.Err { 465 if err == nil { 466 t.Fatal("succeeded; want error") 467 } 468 return 469 } else if err != nil { 470 t.Fatalf("unexpected error: %s", err) 471 } 472 473 if !got.RawEquals(test.Want) { 474 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 475 } 476 }) 477 } 478 } 479 480 func TestFileSHA1(t *testing.T) { 481 tests := []struct { 482 Path cty.Value 483 Want cty.Value 484 Err bool 485 }{ 486 { 487 cty.StringVal("testdata/hello.txt"), 488 cty.StringVal("0a4d55a8d778e5022fab701977c5d840bbc486d0"), 489 false, 490 }, 491 { 492 cty.StringVal("testdata/icon.png"), 493 cty.StringVal("2821bcc8379e1bd6f4f31b1e6a1fbb204b4a8be8"), 494 false, 495 }, 496 { 497 cty.StringVal("testdata/missing"), 498 cty.NilVal, 499 true, // no file exists 500 }, 501 } 502 503 fileSHA1 := MakeFileSha1Func(".") 504 505 for _, test := range tests { 506 t.Run(fmt.Sprintf("filesha1(%#v)", test.Path), func(t *testing.T) { 507 got, err := fileSHA1.Call([]cty.Value{test.Path}) 508 509 if test.Err { 510 if err == nil { 511 t.Fatal("succeeded; want error") 512 } 513 return 514 } else if err != nil { 515 t.Fatalf("unexpected error: %s", err) 516 } 517 518 if !got.RawEquals(test.Want) { 519 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 520 } 521 }) 522 } 523 } 524 525 func TestSha256(t *testing.T) { 526 tests := []struct { 527 String cty.Value 528 Want cty.Value 529 Err bool 530 }{ 531 { 532 cty.StringVal("test"), 533 cty.StringVal("9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"), 534 false, 535 }, 536 } 537 538 for _, test := range tests { 539 t.Run(fmt.Sprintf("sha256(%#v)", test.String), func(t *testing.T) { 540 got, err := Sha256(test.String) 541 542 if test.Err { 543 if err == nil { 544 t.Fatal("succeeded; want error") 545 } 546 return 547 } else if err != nil { 548 t.Fatalf("unexpected error: %s", err) 549 } 550 551 if !got.RawEquals(test.Want) { 552 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 553 } 554 }) 555 } 556 } 557 558 func TestFileSHA256(t *testing.T) { 559 tests := []struct { 560 Path cty.Value 561 Want cty.Value 562 Err bool 563 }{ 564 { 565 cty.StringVal("testdata/hello.txt"), 566 cty.StringVal("a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e"), 567 false, 568 }, 569 { 570 cty.StringVal("testdata/icon.png"), 571 cty.StringVal("e3b535abd2195b4f774a6033742f36d129299fcbc73ef73cb33b9dfd8ddece9a"), 572 false, 573 }, 574 { 575 cty.StringVal("testdata/missing"), 576 cty.NilVal, 577 true, // no file exists 578 }, 579 } 580 581 fileSHA256 := MakeFileSha256Func(".") 582 583 for _, test := range tests { 584 t.Run(fmt.Sprintf("filesha256(%#v)", test.Path), func(t *testing.T) { 585 got, err := fileSHA256.Call([]cty.Value{test.Path}) 586 587 if test.Err { 588 if err == nil { 589 t.Fatal("succeeded; want error") 590 } 591 return 592 } else if err != nil { 593 t.Fatalf("unexpected error: %s", err) 594 } 595 596 if !got.RawEquals(test.Want) { 597 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 598 } 599 }) 600 } 601 } 602 603 func TestSha512(t *testing.T) { 604 tests := []struct { 605 String cty.Value 606 Want cty.Value 607 Err bool 608 }{ 609 { 610 cty.StringVal("test"), 611 cty.StringVal("ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"), 612 false, 613 }, 614 } 615 616 for _, test := range tests { 617 t.Run(fmt.Sprintf("sha512(%#v)", test.String), func(t *testing.T) { 618 got, err := Sha512(test.String) 619 620 if test.Err { 621 if err == nil { 622 t.Fatal("succeeded; want error") 623 } 624 return 625 } else if err != nil { 626 t.Fatalf("unexpected error: %s", err) 627 } 628 629 if !got.RawEquals(test.Want) { 630 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 631 } 632 }) 633 } 634 } 635 636 func TestFileSHA512(t *testing.T) { 637 tests := []struct { 638 Path cty.Value 639 Want cty.Value 640 Err bool 641 }{ 642 { 643 cty.StringVal("testdata/hello.txt"), 644 cty.StringVal("2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b"), 645 false, 646 }, 647 { 648 cty.StringVal("testdata/icon.png"), 649 cty.StringVal("c122273bfb4a10e68b182018da1ffb82d2d6329cf22c9d228c587de494e962b3f35d0620be201d2fd660a43f4402d7bc3a7f9daef845be3205b1f414c316cd3d"), 650 false, 651 }, 652 { 653 cty.StringVal("testdata/missing"), 654 cty.NilVal, 655 true, // no file exists 656 }, 657 } 658 659 fileSHA512 := MakeFileSha512Func(".") 660 661 for _, test := range tests { 662 t.Run(fmt.Sprintf("filesha512(%#v)", test.Path), func(t *testing.T) { 663 got, err := fileSHA512.Call([]cty.Value{test.Path}) 664 665 if test.Err { 666 if err == nil { 667 t.Fatal("succeeded; want error") 668 } 669 return 670 } else if err != nil { 671 t.Fatalf("unexpected error: %s", err) 672 } 673 674 if !got.RawEquals(test.Want) { 675 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 676 } 677 }) 678 } 679 } 680 681 const ( 682 CipherBase64 = "eczGaDhXDbOFRZGhjx2etVzWbRqWDlmq0bvNt284JHVbwCgObiuyX9uV0LSAMY707IEgMkExJqXmsB4OWKxvB7epRB9G/3+F+pcrQpODlDuL9oDUAsa65zEpYF0Wbn7Oh7nrMQncyUPpyr9WUlALl0gRWytOA23S+y5joa4M34KFpawFgoqTu/2EEH4Xl1zo+0fy73fEto+nfkUY+meuyGZ1nUx/+DljP7ZqxHBFSlLODmtuTMdswUbHbXbWneW51D7Jm7xB8nSdiA2JQNK5+Sg5x8aNfgvFTt/m2w2+qpsyFa5Wjeu6fZmXSl840CA07aXbk9vN4I81WmJyblD/ZA==" 683 PrivateKey = ` 684 -----BEGIN RSA PRIVATE KEY----- 685 MIIEowIBAAKCAQEAgUElV5mwqkloIrM8ZNZ72gSCcnSJt7+/Usa5G+D15YQUAdf9 686 c1zEekTfHgDP+04nw/uFNFaE5v1RbHaPxhZYVg5ZErNCa/hzn+x10xzcepeS3KPV 687 Xcxae4MR0BEegvqZqJzN9loXsNL/c3H/B+2Gle3hTxjlWFb3F5qLgR+4Mf4ruhER 688 1v6eHQa/nchi03MBpT4UeJ7MrL92hTJYLdpSyCqmr8yjxkKJDVC2uRrr+sTSxfh7 689 r6v24u/vp/QTmBIAlNPgadVAZw17iNNb7vjV7Gwl/5gHXonCUKURaV++dBNLrHIZ 690 pqcAM8wHRph8mD1EfL9hsz77pHewxolBATV+7QIDAQABAoIBAC1rK+kFW3vrAYm3 691 +8/fQnQQw5nec4o6+crng6JVQXLeH32qXShNf8kLLG/Jj0vaYcTPPDZw9JCKkTMQ 692 0mKj9XR/5DLbBMsV6eNXXuvJJ3x4iKW5eD9WkLD4FKlNarBRyO7j8sfPTqXW7uat 693 NxWdFH7YsSRvNh/9pyQHLWA5OituidMrYbc3EUx8B1GPNyJ9W8Q8znNYLfwYOjU4 694 Wv1SLE6qGQQH9Q0WzA2WUf8jklCYyMYTIywAjGb8kbAJlKhmj2t2Igjmqtwt1PYc 695 pGlqbtQBDUiWXt5S4YX/1maIQ/49yeNUajjpbJiH3DbhJbHwFTzP3pZ9P9GHOzlG 696 kYR+wSECgYEAw/Xida8kSv8n86V3qSY/I+fYQ5V+jDtXIE+JhRnS8xzbOzz3v0WS 697 Oo5H+o4nJx5eL3Ghb3Gcm0Jn46dHrxinHbm+3RjXv/X6tlbxIYjRSQfHOTSMCTvd 698 qcliF5vC6RCLXuc7R+IWR1Ky6eDEZGtrvt3DyeYABsp9fRUFR/6NluUCgYEAqNsw 699 1aSl7WJa27F0DoJdlU9LWerpXcazlJcIdOz/S9QDmSK3RDQTdqfTxRmrxiYI9LEs 700 mkOkvzlnnOBMpnZ3ZOU5qIRfprecRIi37KDAOHWGnlC0EWGgl46YLb7/jXiWf0AG 701 Y+DfJJNd9i6TbIDWu8254/erAS6bKMhW/3q7f2kCgYAZ7Id/BiKJAWRpqTRBXlvw 702 BhXoKvjI2HjYP21z/EyZ+PFPzur/lNaZhIUlMnUfibbwE9pFggQzzf8scM7c7Sf+ 703 mLoVSdoQ/Rujz7CqvQzi2nKSsM7t0curUIb3lJWee5/UeEaxZcmIufoNUrzohAWH 704 BJOIPDM4ssUTLRq7wYM9uQKBgHCBau5OP8gE6mjKuXsZXWUoahpFLKwwwmJUp2vQ 705 pOFPJ/6WZOlqkTVT6QPAcPUbTohKrF80hsZqZyDdSfT3peFx4ZLocBrS56m6NmHR 706 UYHMvJ8rQm76T1fryHVidz85g3zRmfBeWg8yqT5oFg4LYgfLsPm1gRjOhs8LfPvI 707 OLlRAoGBAIZ5Uv4Z3s8O7WKXXUe/lq6j7vfiVkR1NW/Z/WLKXZpnmvJ7FgxN4e56 708 RXT7GwNQHIY8eDjDnsHxzrxd+raOxOZeKcMHj3XyjCX3NHfTscnsBPAGYpY/Wxzh 709 T8UYnFu6RzkixElTf2rseEav7rkdKkI3LAeIZy7B0HulKKsmqVQ7 710 -----END RSA PRIVATE KEY----- 711 ` 712 OpenSSHPrivateKey = ` 713 -----BEGIN OPENSSH PRIVATE KEY----- 714 b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn 715 NhAAAAAwEAAQAAAQEAgUElV5mwqkloIrM8ZNZ72gSCcnSJt7+/Usa5G+D15YQUAdf9c1zE 716 ekTfHgDP+04nw/uFNFaE5v1RbHaPxhZYVg5ZErNCa/hzn+x10xzcepeS3KPVXcxae4MR0B 717 EegvqZqJzN9loXsNL/c3H/B+2Gle3hTxjlWFb3F5qLgR+4Mf4ruhER1v6eHQa/nchi03MB 718 pT4UeJ7MrL92hTJYLdpSyCqmr8yjxkKJDVC2uRrr+sTSxfh7r6v24u/vp/QTmBIAlNPgad 719 VAZw17iNNb7vjV7Gwl/5gHXonCUKURaV++dBNLrHIZpqcAM8wHRph8mD1EfL9hsz77pHew 720 xolBATV+7QAAA7jbhEFk24RBZAAAAAdzc2gtcnNhAAABAQCBQSVXmbCqSWgiszxk1nvaBI 721 JydIm3v79Sxrkb4PXlhBQB1/1zXMR6RN8eAM/7TifD+4U0VoTm/VFsdo/GFlhWDlkSs0Jr 722 +HOf7HXTHNx6l5Lco9VdzFp7gxHQER6C+pmonM32Whew0v9zcf8H7YaV7eFPGOVYVvcXmo 723 uBH7gx/iu6ERHW/p4dBr+dyGLTcwGlPhR4nsysv3aFMlgt2lLIKqavzKPGQokNULa5Guv6 724 xNLF+Huvq/bi7++n9BOYEgCU0+Bp1UBnDXuI01vu+NXsbCX/mAdeicJQpRFpX750E0usch 725 mmpwAzzAdGmHyYPUR8v2GzPvukd7DGiUEBNX7tAAAAAwEAAQAAAQAtayvpBVt76wGJt/vP 726 30J0EMOZ3nOKOvnK54OiVUFy3h99ql0oTX/JCyxvyY9L2mHEzzw2cPSQipEzENJio/V0f+ 727 Qy2wTLFenjV17rySd8eIiluXg/VpCw+BSpTWqwUcju4/LHz06l1u7mrTcVnRR+2LEkbzYf 728 /ackBy1gOTorbonTK2G3NxFMfAdRjzcifVvEPM5zWC38GDo1OFr9UixOqhkEB/UNFswNll 729 H/I5JQmMjGEyMsAIxm/JGwCZSoZo9rdiII5qrcLdT2HKRpam7UAQ1Ill7eUuGF/9ZmiEP+ 730 PcnjVGo46WyYh9w24SWx8BU8z96WfT/Rhzs5RpGEfsEhAAAAgQCGeVL+Gd7PDu1il11Hv5 731 auo+734lZEdTVv2f1iyl2aZ5ryexYMTeHuekV0+xsDUByGPHg4w57B8c68Xfq2jsTmXinD 732 B4918owl9zR307HJ7ATwBmKWP1sc4U/FGJxbukc5IsRJU39q7HhGr+65HSpCNywHiGcuwd 733 B7pSirJqlUOwAAAIEAw/Xida8kSv8n86V3qSY/I+fYQ5V+jDtXIE+JhRnS8xzbOzz3v0WS 734 Oo5H+o4nJx5eL3Ghb3Gcm0Jn46dHrxinHbm+3RjXv/X6tlbxIYjRSQfHOTSMCTvdqcliF5 735 vC6RCLXuc7R+IWR1Ky6eDEZGtrvt3DyeYABsp9fRUFR/6NluUAAACBAKjbMNWkpe1iWtux 736 dA6CXZVPS1nq6V3Gs5SXCHTs/0vUA5kit0Q0E3an08UZq8YmCPSxLJpDpL85Z5zgTKZ2d2 737 TlOaiEX6a3nESIt+ygwDh1hp5QtBFhoJeOmC2+/414ln9ABmPg3ySTXfYuk2yA1rvNueP3 738 qwEumyjIVv96u39pAAAAAAEC 739 -----END OPENSSH PRIVATE KEY----- 740 ` 741 WrongPrivateKey = ` 742 -----BEGIN RSA PRIVATE KEY----- 743 MIIEowIBAAKCAQEAlrCgnEVgmNKCq7KPc+zUU5IrxPu1ClMNJS7RTsTPEkbwe5SB 744 p+6V6WtCbD/X/lDRRGbOENChh1Phulb7lViqgrdpHydgsrKoS5ah3DfSIxLFLE00 745 9Yo4TCYwgw6+s59j16ZAFVinaQ9l6Kmrb2ll136hMrz8QKh+qw+onOLd38WFgm+W 746 ZtUqSXf2LANzfzzy4OWFNyFqKaCAolSkPdTS9Nz+svtScvp002DQp8OdP1AgPO+l 747 o5N3M38Fftapwg0pCtJ5Zq0NRWIXEonXiTEMA6zy3gEZVOmDxoIFUWnmrqlMJLFy 748 5S6LDrHSdqJhCxDK6WRZj43X9j8spktk3eGhMwIDAQABAoIBAAem8ID/BOi9x+Tw 749 LFi2rhGQWqimH4tmrEQ3HGnjlKBY+d1MrUjZ1MMFr1nP5CgF8pqGnfA8p/c3Sz8r 750 K5tp5T6+EZiDZ2WrrOApxg5ox0MAsQKO6SGO40z6o3wEQ6rbbTaGOrraxaWQIpyu 751 AQanU4Sd6ZGqByVBaS1GnklZO+shCHqw73b7g1cpLEmFzcYnKHYHlUUIsstMe8E1 752 BaCY0CH7JbWBjcbiTnBVwIRZuu+EjGiQuhTilYL2OWqoMVg1WU0L2IFpR8lkf/2W 753 SBx5J6xhwbBGASOpM+qidiN580GdPzGhWYSqKGroHEzBm6xPSmV1tadNA26WFG4p 754 pthLiAECgYEA5BsPRpNYJAQLu5B0N7mj9eEp0HABVEgL/MpwiImjaKdAwp78HM64 755 IuPvJxs7r+xESiIz4JyjR8zrQjYOCKJsARYkmNlEuAz0SkHabCw1BdEBwUhjUGVB 756 efoERK6GxfAoNqmSDwsOvHFOtsmDIlbHmg7G2rUxNVpeou415BSB0B8CgYEAqR4J 757 YHKk2Ibr9rU+rBU33TcdTGw0aAkFNAVeqM9j0haWuFXmV3RArgoy09lH+2Ha6z/g 758 fTX2xSDAWV7QUlLOlBRIhurPAo2jO2yCrGHPZcWiugstrR2hTTInigaSnCmK3i7F 759 6sYmL3S7K01IcVNxSlWvGijtClT92Cl2WUCTfG0CgYAiEjyk4QtQTd5mxLvnOu5X 760 oqs5PBGmwiAwQRiv/EcRMbJFn7Oupd3xMDSflbzDmTnWDOfMy/jDl8MoH6TW+1PA 761 kcsjnYhbKWwvz0hN0giVdtOZSDO1ZXpzOrn6fEsbM7T9/TQY1SD9WrtUKCNTNL0Z 762 sM1ZC6lu+7GZCpW4HKwLJwKBgQCRT0yxQXBg1/UxwuO5ynV4rx2Oh76z0WRWIXMH 763 S0MyxdP1SWGkrS/SGtM3cg/GcHtA/V6vV0nUcWK0p6IJyjrTw2XZ/zGluPuTWJYi 764 9dvVT26Vunshrz7kbH7KuwEICy3V4IyQQHeY+QzFlR70uMS0IVFWAepCoWqHbIDT 765 CYhwNQKBgGPcLXmjpGtkZvggl0aZr9LsvCTckllSCFSI861kivL/rijdNoCHGxZv 766 dfDkLTLcz9Gk41rD9Gxn/3sqodnTAc3Z2PxFnzg1Q/u3+x6YAgBwI/g/jE2xutGW 767 H7CurtMwALQ/n/6LUKFmjRZjqbKX9SO2QSaC3grd6sY9Tu+bZjLe 768 -----END RSA PRIVATE KEY----- 769 ` 770 BadPrivateKey = ` 771 -----BEGIN RSA PRIVATE KEY----- 772 MIIEowIBAAKCAQEAgUElV5mwqkloIrM8ZNZ72gSCcnSJt7+/Usa5G+D15YQUAdf9 773 c1zEekTfHgDP+04nw/uFNFaE5v1RbHaPxhZYVg5ZErNCa/hzn+x10xzcepeS3KPV 774 Xcxae4MR0BEegvqZqJzN9loXsNL/c3H/B+2Gle3hTxjlWFb3F5qLgR+4Mf4ruhER 775 1v6eHQa/nchi03MBpT4UeJ7MrL92hTJYLdpSyCqmr8yjxkKJDVC2uRrr+sTSxfh7 776 r6v24u/vp/QTmBIAlNPgadVAZw17iNNb7vjV7Gwl/5gHXonCUKURaV++dBNLrHIZ 777 pqcAM8wHRph8mD1EfL9hsz77pHewxolBATV+7QIDAQABAoIBAC1rK+kFW3vrAYm3 778 +8/fQnQQw5nec4o6+crng6JVQXLeH32qXShNf8kLLG/Jj0vaYcTPPDZw9JCKkTMQ 779 0mKj9XR/5DLbBMsV6eNXXuvJJ3x4iKW5eD9WkLD4FKlNarBRyO7j8sfPTqXW7uat 780 NxWdFH7YsSRvNh/9pyQHLWA5OituidMrYbc3EUx8B1GPNyJ9W8Q8znNYLfwYOjU4 781 Wv1SLE6qGQQH9Q0WzA2WUf8jklCYyMYTIywAjGb8kbAJlKhmj2t2Igjmqtwt1PYc 782 pGlqbtQBDUiWXt5S4YX/1maIQ/49yeNUajjpbJiH3DbhJbHwFTzP3pZ9P9GHOzlG 783 kYR+wSECgYEAw/Xida8kSv8n86V3qSY/I+fYQ5V+jDtXIE+JhRnS8xzbOzz3v0WS 784 Oo5H+o4nJx5eL3Ghb3Gcm0Jn46dHrxinHbm+3RjXv/X6tlbxIYjRSQfHOTSMCTvd 785 qcliF5vC6RCLXuc7R+IWR1Ky6eDEZGtrvt3DyeYABsp9fRUFR/6NluUCgYEAqNsw 786 1aSl7WJa27F0DoJdlU9LWerpXcazlJcIdOz/S9QDmSK3RDQTdqfTxRmrxiYI9LEs 787 mkOkvzlnnOBMpnZ3ZOU5qIRfprecRIi37KDAOHWGnlC0EWGgl46YLb7/jXiWf0AG 788 BhXoKvjI2HjYP21z/EyZ+PFPzur/lNaZhIUlMnUfibbwE9pFggQzzf8scM7c7Sf+ 789 mLoVSdoQ/Rujz7CqvQzi2nKSsM7t0curUIb3lJWee5/UeEaxZcmIufoNUrzohAWH 790 BJOIPDM4ssUTLRq7wYM9uQKBgHCBau5OP8gE6mjKuXsZXWUoahpFLKwwwmJUp2vQ 791 pOFPJ/6WZOlqkTVT6QPAcPUbTohKrF80hsZqZyDdSfT3peFx4ZLocBrS56m6NmHR 792 UYHMvJ8rQm76T1fryHVidz85g3zRmfBeWg8yqT5oFg4LYgfLsPm1gRjOhs8LfPvI 793 OLlRAoGBAIZ5Uv4Z3s8O7WKXXUe/lq6j7vfiVkR1NW/Z/WLKXZpnmvJ7FgxN4e56 794 RXT7GwNQHIY8eDjDnsHxzrxd+raOxOZeKcMHj3XyjCX3NHfTscnsBPAGYpY/Wxzh 795 T8UYnFu6RzkixElTf2rseEav7rkdKkI3LAeIZy7B0HulKKsmqVQ7 796 -----END RSA PRIVATE KEY----- 797 ` 798 )