|
13 | 13 | import pytest |
14 | 14 | import hashlib |
15 | 15 |
|
16 | | -from .keys import VerifyingKey, SigningKey, MalformedPointError |
| 16 | +from .keys import ( |
| 17 | + VerifyingKey, |
| 18 | + SigningKey, |
| 19 | + MalformedPointError, |
| 20 | + BadSignatureError, |
| 21 | +) |
17 | 22 | from .der import ( |
18 | 23 | unpem, |
19 | 24 | UnexpectedDER, |
@@ -120,6 +125,10 @@ def test_bytearray_compressed(self): |
120 | 125 |
|
121 | 126 | self.assertEqual(self.vk.to_string(), vk.to_string()) |
122 | 127 |
|
| 128 | + def test_ed25519_VerifyingKey_from_string_imported(self): |
| 129 | + with self.assertRaises(MalformedPointError): |
| 130 | + VerifyingKey.from_string(b"AAA", Ed25519) |
| 131 | + |
123 | 132 |
|
124 | 133 | class TestVerifyingKeyFromDer(unittest.TestCase): |
125 | 134 | """ |
@@ -405,6 +414,28 @@ def test_ed25519_sig_verify(self): |
405 | 414 |
|
406 | 415 | self.assertTrue(vk.verify(sig, data)) |
407 | 416 |
|
| 417 | + def test_ed25519_sig_verify_malformed(self): |
| 418 | + vk_pem = ( |
| 419 | + "-----BEGIN PUBLIC KEY-----\n" |
| 420 | + "MCowBQYDK2VwAyEAIwBQ0NZkIiiO41WJfm5BV42u3kQm7lYnvIXmCy8qy2U=\n" |
| 421 | + "-----END PUBLIC KEY-----\n" |
| 422 | + ) |
| 423 | + |
| 424 | + vk = VerifyingKey.from_pem(vk_pem) |
| 425 | + |
| 426 | + data = b"data\n" |
| 427 | + |
| 428 | + # modified signature from test_ed25519_sig_verify |
| 429 | + sig = ( |
| 430 | + b"\xAA\x47\xab\x6a\x33\xcd\x79\x45\xad\x98\x11\x6c\xb9\xf2\x20\xeb" |
| 431 | + b"\x90\xd6\x50\xe3\xc7\x8f\x9f\x60\x10\xec\x75\xe0\x2f\x27\xd3\x96" |
| 432 | + b"\xda\xe8\x58\x7f\xe0\xfe\x46\x5c\x81\xef\x50\xec\x29\x9f\xae\xd5" |
| 433 | + b"\xad\x46\x3c\x91\x68\x83\x4d\xea\x8d\xa8\x19\x04\x04\x79\x03\x0b" |
| 434 | + ) |
| 435 | + |
| 436 | + with self.assertRaises(BadSignatureError): |
| 437 | + vk.verify(sig, data) |
| 438 | + |
408 | 439 | def test_ed448_from_pem(self): |
409 | 440 | pem_str = ( |
410 | 441 | "-----BEGIN PUBLIC KEY-----\n" |
@@ -517,6 +548,17 @@ def setUpClass(cls): |
517 | 548 | ) |
518 | 549 | cls.sk2 = SigningKey.from_pem(prv_key_str) |
519 | 550 |
|
| 551 | + def test_to_der_pkcs8(self): |
| 552 | + self.assertEqual( |
| 553 | + self.sk1.to_der(format="pkcs8"), |
| 554 | + b"0o\x02\x01\x010\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H" |
| 555 | + b"\xce=\x03\x01\x01\x04U0S\x02\x01\x01\x04\x18^\xc8B\x0b\xd6\xef" |
| 556 | + b"\x92R\xa9B\xe9\x89\x04<\xa2\x9fV\x1f\xa5%w\x0e\xb1\xc5\xa14\x03" |
| 557 | + b"2\x00\x04\xb8\x81w\xd0\x84\xef\x17\xf5\xe4V9@\x80(6\x0f\x9fY" |
| 558 | + b"\xb4\xa4\xd7&Nb\xda\x06Q\xdc\xe4z5\xa4\xc5\xb4\\\xf5\x15\x93B:" |
| 559 | + b"\x8bU{\x9c \x99\xf3l", |
| 560 | + ) |
| 561 | + |
520 | 562 | def test_decoding_explicit_curve_parameters(self): |
521 | 563 | prv_key_str = ( |
522 | 564 | "-----BEGIN PRIVATE KEY-----\n" |
@@ -626,6 +668,71 @@ def test_ed25519_from_pem(self): |
626 | 668 |
|
627 | 669 | self.assertEqual(sk, sk_str) |
628 | 670 |
|
| 671 | + def test_ed25519_sign(self): |
| 672 | + sk_str = SigningKey.from_string( |
| 673 | + b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C" |
| 674 | + b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4", |
| 675 | + Ed25519, |
| 676 | + ) |
| 677 | + |
| 678 | + msg = b"message" |
| 679 | + |
| 680 | + sig = sk_str.sign(msg, sigencode=sigencode_der) |
| 681 | + |
| 682 | + self.assertEqual( |
| 683 | + sig, |
| 684 | + b"\xe1,v\xc9>%\xda\xd2~>\xc3&\na\xf4@|\x9e`X\x11\x13@<\x987\xd4" |
| 685 | + b"\r\xb1\xf5\xb3\x15\x7f%i{\xdf}\xdd\xb1\xf3\x02\x7f\x80\x02\xc2" |
| 686 | + b'|\xe5\xd6\x06\xc4\n\xa3\xb0\xf6}\xc0\xed)"+E\xaf\x00', |
| 687 | + ) |
| 688 | + |
| 689 | + def test_ed25519_sign_digest_deterministic(self): |
| 690 | + sk_str = SigningKey.from_string( |
| 691 | + b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C" |
| 692 | + b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4", |
| 693 | + Ed25519, |
| 694 | + ) |
| 695 | + with self.assertRaises(ValueError) as e: |
| 696 | + sk_str.sign_digest_deterministic(b"a" * 20) |
| 697 | + |
| 698 | + self.assertIn("Method unsupported for Edwards", str(e.exception)) |
| 699 | + |
| 700 | + def test_ed25519_sign_digest(self): |
| 701 | + sk_str = SigningKey.from_string( |
| 702 | + b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C" |
| 703 | + b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4", |
| 704 | + Ed25519, |
| 705 | + ) |
| 706 | + with self.assertRaises(ValueError) as e: |
| 707 | + sk_str.sign_digest(b"a" * 20) |
| 708 | + |
| 709 | + self.assertIn("Method unsupported for Edwards", str(e.exception)) |
| 710 | + |
| 711 | + def test_ed25519_sign_number(self): |
| 712 | + sk_str = SigningKey.from_string( |
| 713 | + b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C" |
| 714 | + b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4", |
| 715 | + Ed25519, |
| 716 | + ) |
| 717 | + with self.assertRaises(ValueError) as e: |
| 718 | + sk_str.sign_number(20) |
| 719 | + |
| 720 | + self.assertIn("Method unsupported for Edwards", str(e.exception)) |
| 721 | + |
| 722 | + def test_ed25519_to_der_ssleay(self): |
| 723 | + pem_str = ( |
| 724 | + "-----BEGIN PRIVATE KEY-----\n" |
| 725 | + "MC4CAQAwBQYDK2VwBCIEIDS6x9FO1PG8T4xIPg8Zd0z8uL6sVGZFEZrX17gHC/XU\n" |
| 726 | + "-----END PRIVATE KEY-----\n" |
| 727 | + ) |
| 728 | + |
| 729 | + sk = SigningKey.from_pem(pem_str) |
| 730 | + |
| 731 | + with self.assertRaises(ValueError) as e: |
| 732 | + sk.to_der(format="ssleay") |
| 733 | + |
| 734 | + self.assertIn("Only PKCS#8 format", str(e.exception)) |
| 735 | + |
629 | 736 | def test_ed25519_to_pem(self): |
630 | 737 | sk = SigningKey.from_string( |
631 | 738 | b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C" |
@@ -667,6 +774,12 @@ def test_ed25519_to_and_from_pem(self): |
667 | 774 |
|
668 | 775 | self.assertEqual(sk, decoded) |
669 | 776 |
|
| 777 | + def test_ed25519_from_secret_exponent(self): |
| 778 | + with self.assertRaises(ValueError) as e: |
| 779 | + SigningKey.from_secret_exponent(1234567890, curve=Ed25519) |
| 780 | + |
| 781 | + self.assertIn("don't support setting the secret", str(e.exception)) |
| 782 | + |
670 | 783 | def test_ed448_from_pem(self): |
671 | 784 | pem_str = ( |
672 | 785 | "-----BEGIN PRIVATE KEY-----\n" |
|
0 commit comments