|
12 | 12 | import six |
13 | 13 | import sys |
14 | 14 | import pytest |
| 15 | +import hashlib |
15 | 16 |
|
16 | | -from .keys import VerifyingKey |
| 17 | +from .keys import VerifyingKey, SigningKey |
17 | 18 | from .der import unpem |
| 19 | +from .util import sigencode_string, sigencode_der, sigencode_strings, \ |
| 20 | + sigdecode_string, sigdecode_der, sigdecode_strings |
18 | 21 |
|
19 | 22 |
|
20 | 23 | class TestVerifyingKeyFromString(unittest.TestCase): |
@@ -153,3 +156,70 @@ def test_array_array_of_bytes_memoryview(self): |
153 | 156 | vk = VerifyingKey.from_der(buffer(arr)) |
154 | 157 |
|
155 | 158 | self.assertEqual(self.vk.to_string(), vk.to_string()) |
| 159 | + |
| 160 | + |
| 161 | +# test VerifyingKey.verify() |
| 162 | +prv_key_str = ( |
| 163 | + "-----BEGIN EC PRIVATE KEY-----\n" |
| 164 | + "MF8CAQEEGF7IQgvW75JSqULpiQQ8op9WH6Uldw6xxaAKBggqhkjOPQMBAaE0AzIA\n" |
| 165 | + "BLiBd9CE7xf15FY5QIAoNg+fWbSk1yZOYtoGUdzkejWkxbRc9RWTQjqLVXucIJnz\n" |
| 166 | + "bA==\n" |
| 167 | + "-----END EC PRIVATE KEY-----\n") |
| 168 | +key_bytes = unpem(prv_key_str) |
| 169 | +assert isinstance(key_bytes, bytes) |
| 170 | +sk = SigningKey.from_der(key_bytes) |
| 171 | +vk = sk.verifying_key |
| 172 | + |
| 173 | +data = (b"some string for signing" |
| 174 | + b"contents don't really matter" |
| 175 | + b"but do include also some crazy values: " |
| 176 | + b"\x00\x01\t\r\n\x00\x00\x00\xff\xf0") |
| 177 | +assert len(data) % 4 == 0 |
| 178 | +sha1 = hashlib.sha1() |
| 179 | +sha1.update(data) |
| 180 | +data_hash = sha1.digest() |
| 181 | + |
| 182 | +sig_raw = sk.sign(data, sigencode=sigencode_string) |
| 183 | +assert isinstance(sig_raw, bytes) |
| 184 | +sig_der = sk.sign(data, sigencode=sigencode_der) |
| 185 | +assert isinstance(sig_der, bytes) |
| 186 | +sig_strings = sk.sign(data, sigencode=sigencode_strings) |
| 187 | +assert isinstance(sig_strings[0], bytes) |
| 188 | + |
| 189 | +verifiers = [] |
| 190 | +for modifier, fun in [ |
| 191 | + ("bytes", lambda x: x), |
| 192 | + ("bytes memoryview", lambda x: buffer(x)), |
| 193 | + ("bytearray", lambda x: bytearray(x)), |
| 194 | + ("bytearray memoryview", lambda x: buffer(bytearray(x))), |
| 195 | + ("array.array of bytes", lambda x: array.array('B', x)), |
| 196 | + ("array.array of bytes memoryview", lambda x: buffer(array.array('B', x))), |
| 197 | + ("array.array of ints", lambda x: array.array('I', x)), |
| 198 | + ("array.array of ints memoryview", lambda x: buffer(array.array('I', x))) |
| 199 | + ]: |
| 200 | + if "ints" in modifier: |
| 201 | + conv = lambda x: x |
| 202 | + else: |
| 203 | + conv = fun |
| 204 | + for sig_format, signature, decoder, mod_apply in [ |
| 205 | + ("raw", sig_raw, sigdecode_string, lambda x: conv(x)), |
| 206 | + ("der", sig_der, sigdecode_der, lambda x: conv(x)), |
| 207 | + ("strings", sig_strings, sigdecode_strings, lambda x: |
| 208 | + tuple(conv(i) for i in x)) |
| 209 | + ]: |
| 210 | + for method_name, vrf_mthd, vrf_data in [ |
| 211 | + ("verify", vk.verify, data), |
| 212 | + ("verify_digest", vk.verify_digest, data_hash) |
| 213 | + ]: |
| 214 | + verifiers.append(pytest.param( |
| 215 | + signature, decoder, mod_apply, fun, vrf_mthd, vrf_data, |
| 216 | + id="{2}-{0}-{1}".format(modifier, sig_format, method_name))) |
| 217 | + |
| 218 | +@pytest.mark.parametrize( |
| 219 | + "signature,decoder,mod_apply,fun,vrf_mthd,vrf_data", |
| 220 | + verifiers) |
| 221 | +def test_VerifyingKey_verify( |
| 222 | + signature, decoder, mod_apply, fun, vrf_mthd, vrf_data): |
| 223 | + sig = mod_apply(signature) |
| 224 | + |
| 225 | + assert vrf_mthd(sig, fun(vrf_data), sigdecode=decoder) |
0 commit comments