diff options
author | Paul Kehrer <paul.l.kehrer@gmail.com> | 2014-04-30 09:07:27 -0500 |
---|---|---|
committer | Paul Kehrer <paul.l.kehrer@gmail.com> | 2014-04-30 09:07:27 -0500 |
commit | 3fc686ea06d4c2dcaf6b363ec1c54a72d995df88 (patch) | |
tree | c599bb3bbb31e38ca9074eebcabe55fbbf5cc7bb /tests | |
parent | 26f2d5352911ff99c9c7650c926eaa73c432064e (diff) | |
download | cryptography-3fc686ea06d4c2dcaf6b363ec1c54a72d995df88.tar.gz cryptography-3fc686ea06d4c2dcaf6b363ec1c54a72d995df88.tar.bz2 cryptography-3fc686ea06d4c2dcaf6b363ec1c54a72d995df88.zip |
dss_sig_value: Pure python conversion of (r, s) to byte stream
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_utils.py | 36 | ||||
-rw-r--r-- | tests/utils.py | 27 |
2 files changed, 58 insertions, 5 deletions
diff --git a/tests/test_utils.py b/tests/test_utils.py index 7a0b9e74..7b3ffbc3 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -27,11 +27,11 @@ from cryptography.exceptions import UnsupportedAlgorithm, _Reasons import cryptography_vectors from .utils import ( - check_backend_support, check_for_iface, load_cryptrec_vectors, - load_fips_dsa_key_pair_vectors, load_fips_dsa_sig_vectors, - load_fips_ecdsa_key_pair_vectors, load_fips_ecdsa_signing_vectors, - load_hash_vectors, load_nist_vectors, load_pkcs1_vectors, - load_rsa_nist_vectors, load_vectors_from_file, + check_backend_support, check_for_iface, dss_sig_value, + load_cryptrec_vectors, load_fips_dsa_key_pair_vectors, + load_fips_dsa_sig_vectors, load_fips_ecdsa_key_pair_vectors, + load_fips_ecdsa_signing_vectors, load_hash_vectors, load_nist_vectors, + load_pkcs1_vectors, load_rsa_nist_vectors, load_vectors_from_file, raises_unsupported_algorithm, select_backends ) @@ -125,6 +125,32 @@ def test_check_backend_support_no_backend(): check_backend_support(item) +def test_dss_sig_value(): + sig = dss_sig_value(1, 1) + assert sig == b"0\x06\x02\x01\x01\x02\x01\x01" + + sig2 = dss_sig_value(1037234182290683143945502320610861668562885151617, + 559776156650501990899426031439030258256861634312) + assert sig2 == ( + b'0-\x02\x15\x00\xb5\xaf0xg\xfb\x8bT9\x00\x13\xccg\x02\r\xdf\x1f,\x0b' + b'\x81\x02\x14b\r;"\xabP1D\x0c>5\xea\xb6\xf4\x81)\x8f\x9e\x9f\x08' + ) + + sig3 = dss_sig_value(0, 0) + assert sig3 == b"0\x06\x02\x01\x00\x02\x01\x00" + + +def test_dss_sig_value_negative(): + with pytest.raises(ValueError): + dss_sig_value(-1, 1) + + with pytest.raises(ValueError): + dss_sig_value(1, -1) + + with pytest.raises(ValueError): + dss_sig_value(-1, -1) + + def test_load_nist_vectors(): vector_data = textwrap.dedent(""" # CAVS 11.1 diff --git a/tests/utils.py b/tests/utils.py index 60b6f5a2..d8565130 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -80,6 +80,33 @@ def raises_unsupported_algorithm(reason): assert exc_info.value._reason is reason +def _int_to_asn1_int(i): + """ + Used by dss_sig_value to convert python integers to ASN.1 integer bytes. + """ + if i == 0: + return b'\x02\x01\x00' + if i < 0: + raise ValueError("This only supports positive integers right now.") + result = [] + while i: + result.append(six.int2byte(i & 0xFF)) + i >>= 8 + # ASN.1 integers are stored big endian two's complement, so add a byte if + # the ordinal value of the last byte is over 0x7f. + if ord(result[-1]) > 127: + result.append(b"\x00") + result.reverse() + packed = b''.join(result) + return b"\x02" + chr(len(packed)).encode("ascii") + packed + + +def dss_sig_value(r, s): + combined = _int_to_asn1_int(r) + _int_to_asn1_int(s) + sig = b"0" + chr(len(combined)).encode("ascii") + combined + return sig + + def load_vectors_from_file(filename, loader): with cryptography_vectors.open_vector_file(filename) as vector_file: return loader(vector_file) |