|
2 | 2 | import sys |
3 | 3 | import hypothesis.strategies as st |
4 | 4 | from hypothesis import given, settings, note |
| 5 | +try: |
| 6 | + import unittest2 as unittest |
| 7 | +except ImportError: |
| 8 | + import unittest |
5 | 9 | import pytest |
6 | 10 | from .ecdsa import Private_key, Public_key, Signature, \ |
7 | 11 | generator_192, digest_integer, ellipticcurve, point_is_valid, \ |
|
16 | 20 | HYP_SETTINGS["deadline"] = 5000 |
17 | 21 |
|
18 | 22 |
|
19 | | -def test_ecdsa(): |
20 | | - class TestFailure(Exception): |
21 | | - pass |
22 | | - |
23 | | - print("NIST Curve P-192:") |
24 | | - |
25 | | - p192 = generator_192 |
26 | | - |
27 | | - # From X9.62: |
28 | | - |
29 | | - d = 651056770906015076056810763456358567190100156695615665659 |
30 | | - Q = d * p192 |
31 | | - if Q.x() != 0x62B12D60690CDCF330BABAB6E69763B471F994DD702D16A5: |
32 | | - raise TestFailure("*** p192 * d came out wrong.") |
33 | | - else: |
34 | | - print("p192 * d came out right.") |
35 | | - |
36 | | - k = 6140507067065001063065065565667405560006161556565665656654 |
37 | | - R = k * p192 |
38 | | - if R.x() != 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD \ |
39 | | - or R.y() != 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835: |
40 | | - raise TestFailure("*** k * p192 came out wrong.") |
41 | | - else: |
42 | | - print("k * p192 came out right.") |
43 | | - |
44 | | - u1 = 2563697409189434185194736134579731015366492496392189760599 |
45 | | - u2 = 6266643813348617967186477710235785849136406323338782220568 |
46 | | - temp = u1 * p192 + u2 * Q |
47 | | - if temp.x() != 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD \ |
48 | | - or temp.y() != 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835: |
49 | | - raise TestFailure("*** u1 * p192 + u2 * Q came out wrong.") |
50 | | - else: |
51 | | - print("u1 * p192 + u2 * Q came out right.") |
52 | | - |
53 | | - e = 968236873715988614170569073515315707566766479517 |
54 | | - pubk = Public_key(generator_192, generator_192 * d) |
55 | | - privk = Private_key(pubk, d) |
56 | | - sig = privk.sign(e, k) |
57 | | - r, s = sig.r, sig.s |
58 | | - if r != 3342403536405981729393488334694600415596881826869351677613 \ |
59 | | - or s != 5735822328888155254683894997897571951568553642892029982342: |
60 | | - raise TestFailure("*** r or s came out wrong.") |
61 | | - else: |
62 | | - print("r and s came out right.") |
63 | | - |
64 | | - valid = pubk.verifies(e, sig) |
65 | | - if valid: |
66 | | - print("Signature verified OK.") |
67 | | - else: |
68 | | - raise TestFailure("*** Signature failed verification.") |
69 | | - |
70 | | - valid = pubk.verifies(e - 1, sig) |
71 | | - if not valid: |
72 | | - print("Forgery was correctly rejected.") |
73 | | - else: |
74 | | - raise TestFailure("*** Forgery was erroneously accepted.") |
| 23 | +class TestP192FromX9_62(unittest.TestCase): |
| 24 | + """Check test vectors from X9.62""" |
| 25 | + @classmethod |
| 26 | + def setUpClass(cls): |
| 27 | + cls.d = 651056770906015076056810763456358567190100156695615665659 |
| 28 | + cls.Q = cls.d * generator_192 |
| 29 | + cls.k = 6140507067065001063065065565667405560006161556565665656654 |
| 30 | + cls.R = cls.k * generator_192 |
| 31 | + |
| 32 | + cls.msg = 968236873715988614170569073515315707566766479517 |
| 33 | + cls.pubk = Public_key(generator_192, generator_192 * cls.d) |
| 34 | + cls.privk = Private_key(cls.pubk, cls.d) |
| 35 | + cls.sig = cls.privk.sign(cls.msg, cls.k) |
| 36 | + |
| 37 | + def test_point_multiplication(self): |
| 38 | + assert self.Q.x() == 0x62B12D60690CDCF330BABAB6E69763B471F994DD702D16A5 |
| 39 | + |
| 40 | + def test_point_multiplication_2(self): |
| 41 | + assert self.R.x() == 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD |
| 42 | + assert self.R.y() == 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835 |
| 43 | + |
| 44 | + def test_mult_and_addition(self): |
| 45 | + u1 = 2563697409189434185194736134579731015366492496392189760599 |
| 46 | + u2 = 6266643813348617967186477710235785849136406323338782220568 |
| 47 | + temp = u1 * generator_192 + u2 * self.Q |
| 48 | + assert temp.x() == 0x885052380FF147B734C330C43D39B2C4A89F29B0F749FEAD |
| 49 | + assert temp.y() == 0x9CF9FA1CBEFEFB917747A3BB29C072B9289C2547884FD835 |
| 50 | + |
| 51 | + def test_signature(self): |
| 52 | + r, s = self.sig.r, self.sig.s |
| 53 | + assert r == 3342403536405981729393488334694600415596881826869351677613 |
| 54 | + assert s == 5735822328888155254683894997897571951568553642892029982342 |
| 55 | + |
| 56 | + def test_verification(self): |
| 57 | + assert self.pubk.verifies(self.msg, self.sig) |
| 58 | + |
| 59 | + def test_rejection(self): |
| 60 | + assert not self.pubk.verifies(self.msg - 1, self.sig) |
75 | 61 |
|
76 | 62 |
|
77 | 63 | # Testing point validity, as per ECDSAVS.pdf B.2.2: |
|
0 commit comments