From 74a58ac2e9cd1c882ebe4db3d3b6c1f387cf5d2e Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Sun, 22 Jun 2014 11:44:42 -0600 Subject: DSA*Numbers classes --- cryptography/hazmat/primitives/asymmetric/dsa.py | 81 ++++++++++++++++++++++++ docs/hazmat/primitives/asymmetric/dsa.rst | 74 ++++++++++++++++++++++ tests/hazmat/primitives/test_dsa.py | 77 ++++++++++++++++++++++ 3 files changed, 232 insertions(+) diff --git a/cryptography/hazmat/primitives/asymmetric/dsa.py b/cryptography/hazmat/primitives/asymmetric/dsa.py index a9ae9ecb..38012e51 100644 --- a/cryptography/hazmat/primitives/asymmetric/dsa.py +++ b/cryptography/hazmat/primitives/asymmetric/dsa.py @@ -181,3 +181,84 @@ class DSAPublicKey(object): def parameters(self): return DSAParameters(self._modulus, self._subgroup_order, self._generator) + + +class DSAParameterNumbers(object): + def __init__(self, p, q, g): + if ( + not isinstance(p, six.integer_types) or + not isinstance(q, six.integer_types) or + not isinstance(g, six.integer_types) + ): + raise TypeError( + "DSAParameterNumbers p, q, q arguments must be an integers." + ) + + self._p = p + self._q = q + self._g = g + + @property + def p(self): + return self._p + + @property + def q(self): + return self._q + + @property + def g(self): + return self._g + + +class DSAPublicNumbers(object): + def __init__(self, y, parameter_numbers): + if not isinstance(y, six.integer_types): + raise TypeError("DSAPublicNumbers y argument must be an integer.") + + if not isinstance(parameter_numbers, DSAParameterNumbers): + raise TypeError( + "parameter_numbers must be a DSAParameterNumbers instance." + ) + + self._y = y + self._parameter_numbers = parameter_numbers + + @property + def y(self): + return self._y + + @property + def parameter_numbers(self): + return self._parameter_numbers + + +class DSAPrivateNumbers(object): + def __init__(self, x, public_numbers, parameter_numbers): + if not isinstance(x, six.integer_types): + raise TypeError("DSAPrivateNumbers x argument must be an integer.") + + if not isinstance(parameter_numbers, DSAParameterNumbers): + raise TypeError( + "parameter_numbers must be a DSAParameterNumbers instance." + ) + + if not isinstance(public_numbers, DSAPublicNumbers): + raise TypeError( + "public_numbers must be a DSAPublicNumbers instance." + ) + self._parameter_numbers = parameter_numbers + self._public_numbers = public_numbers + self._x = x + + @property + def x(self): + return self._x + + @property + def parameter_numbers(self): + return self._parameter_numbers + + @property + def public_numbers(self): + return self._public_numbers diff --git a/docs/hazmat/primitives/asymmetric/dsa.rst b/docs/hazmat/primitives/asymmetric/dsa.rst index 6848d84c..713fdeb8 100644 --- a/docs/hazmat/primitives/asymmetric/dsa.rst +++ b/docs/hazmat/primitives/asymmetric/dsa.rst @@ -210,6 +210,80 @@ DSA :returns: :class:`~cryptography.hazmat.primitives.interfaces.AsymmetricVerificationContext` +.. class:: DSAParameterNumbers(p, q, g) + + .. versionadded:: 0.5 + + The collection of integers that make up a set of DSA parameters. + + .. attribute:: p + + :type: int + + The public modulus. + + .. attribute:: q + + :type: int + + The sub group order. + + .. attribute:: g + + :type: int + + The generator. + +.. class:: DSAPublicNumbers(y, parameter_numbers) + + .. versionadded:: 0.5 + + The collection of integers that make up a DSA public key. + + .. attribute:: y + + :type: int + + The public value ``y``. + + .. attribute:: parameter_numbers + + :type: :class:`~cryptography.hazmat.primitives.dsa.DSAParameterNumbers` + + The :class:`~cryptography.hazmat.primitives.dsa.DSAParameterNumbers` + associated with the public key. + +.. class:: DSAPrivateNumbers(x, public_numbers, parameter_numbers) + + .. versionadded:: 0.5 + + The collection of integers that make up a DSA private key. + + .. warning:: + + Revealing the value of ``x`` will compromise the security of any + cryptographic operations performed. + + .. attribute:: x + + :type: int + + The private value ``x``. + + .. attribute:: public_numbers + + :type: :class:`~cryptography.hazmat.primitives.dsa.DSAPublicNumbers` + + The :class:`~cryptography.hazmat.primitives.dsa.DSAPublicNumbers` + associated with the private key. + + .. attribute:: parameter_numbers + + :type: :class:`~cryptography.hazmat.primitives.dsa.DSAParameterNumbers` + + The :class:`~cryptography.hazmat.primitives.dsa.DSAParameterNumbers` + associated with the public key. + .. _`DSA`: https://en.wikipedia.org/wiki/Digital_Signature_Algorithm .. _`public-key`: https://en.wikipedia.org/wiki/Public-key_cryptography .. _`FIPS 186-4`: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf diff --git a/tests/hazmat/primitives/test_dsa.py b/tests/hazmat/primitives/test_dsa.py index cbe10e9c..37489434 100644 --- a/tests/hazmat/primitives/test_dsa.py +++ b/tests/hazmat/primitives/test_dsa.py @@ -872,3 +872,80 @@ def test_dsa_generate_invalid_backend(): with raises_unsupported_algorithm( _Reasons.BACKEND_MISSING_INTERFACE): dsa.DSAPrivateKey.generate(pretend_parameters, pretend_backend) + + +class TestDSANumbers(object): + def test_dsa_parameter_numbers(self): + parameter_numbers = dsa.DSAParameterNumbers(p=1, q=2, g=3) + assert parameter_numbers.p == 1 + assert parameter_numbers.q == 2 + assert parameter_numbers.g == 3 + + def test_dsa_parameter_numbers_invalid_types(self): + with pytest.raises(TypeError): + dsa.DSAParameterNumbers(p=None, q=2, g=3) + + with pytest.raises(TypeError): + dsa.DSAParameterNumbers(p=1, q=None, g=3) + + with pytest.raises(TypeError): + dsa.DSAParameterNumbers(p=1, q=2, g=None) + + def test_dsa_public_numbers(self): + parameter_numbers = dsa.DSAParameterNumbers(p=1, q=2, g=3) + public_numbers = dsa.DSAPublicNumbers( + y=4, + parameter_numbers=parameter_numbers + ) + assert public_numbers.y == 4 + assert public_numbers.parameter_numbers == parameter_numbers + + def test_dsa_public_numbers_invalid_types(self): + with pytest.raises(TypeError): + dsa.DSAPublicNumbers(y=4, parameter_numbers=None) + + with pytest.raises(TypeError): + parameter_numbers = dsa.DSAParameterNumbers(p=1, q=2, g=3) + dsa.DSAPublicNumbers(y=None, parameter_numbers=parameter_numbers) + + def test_dsa_private_numbers(self): + parameter_numbers = dsa.DSAParameterNumbers(p=1, q=2, g=3) + public_numbers = dsa.DSAPublicNumbers( + y=4, + parameter_numbers=parameter_numbers + ) + private_numbers = dsa.DSAPrivateNumbers( + x=5, + public_numbers=public_numbers, + parameter_numbers=parameter_numbers + ) + assert private_numbers.x == 5 + assert private_numbers.public_numbers == public_numbers + assert private_numbers.parameter_numbers == parameter_numbers + + def test_dsa_private_numbers_invalid_types(self): + parameter_numbers = dsa.DSAParameterNumbers(p=1, q=2, g=3) + public_numbers = dsa.DSAPublicNumbers( + y=4, + parameter_numbers=parameter_numbers + ) + with pytest.raises(TypeError): + dsa.DSAPrivateNumbers( + x=4, + public_numbers=public_numbers, + parameter_numbers=None + ) + + with pytest.raises(TypeError): + dsa.DSAPrivateNumbers( + x=4, + public_numbers=None, + parameter_numbers=parameter_numbers + ) + + with pytest.raises(TypeError): + dsa.DSAPrivateNumbers( + x=None, + public_numbers=public_numbers, + parameter_numbers=parameter_numbers + ) -- cgit v1.2.3 From 8c73a7bf86260dd7bd5edea99369a6ae27cc9936 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Mon, 23 Jun 2014 09:29:32 -0600 Subject: remove parameter_numbers from DSAPrivateNumbers since it's on public --- cryptography/hazmat/primitives/asymmetric/dsa.py | 12 +----------- docs/hazmat/primitives/asymmetric/dsa.rst | 9 +-------- tests/hazmat/primitives/test_dsa.py | 23 +++-------------------- 3 files changed, 5 insertions(+), 39 deletions(-) diff --git a/cryptography/hazmat/primitives/asymmetric/dsa.py b/cryptography/hazmat/primitives/asymmetric/dsa.py index 38012e51..e8c587e9 100644 --- a/cryptography/hazmat/primitives/asymmetric/dsa.py +++ b/cryptography/hazmat/primitives/asymmetric/dsa.py @@ -234,20 +234,14 @@ class DSAPublicNumbers(object): class DSAPrivateNumbers(object): - def __init__(self, x, public_numbers, parameter_numbers): + def __init__(self, x, public_numbers): if not isinstance(x, six.integer_types): raise TypeError("DSAPrivateNumbers x argument must be an integer.") - if not isinstance(parameter_numbers, DSAParameterNumbers): - raise TypeError( - "parameter_numbers must be a DSAParameterNumbers instance." - ) - if not isinstance(public_numbers, DSAPublicNumbers): raise TypeError( "public_numbers must be a DSAPublicNumbers instance." ) - self._parameter_numbers = parameter_numbers self._public_numbers = public_numbers self._x = x @@ -255,10 +249,6 @@ class DSAPrivateNumbers(object): def x(self): return self._x - @property - def parameter_numbers(self): - return self._parameter_numbers - @property def public_numbers(self): return self._public_numbers diff --git a/docs/hazmat/primitives/asymmetric/dsa.rst b/docs/hazmat/primitives/asymmetric/dsa.rst index 713fdeb8..ea913dd3 100644 --- a/docs/hazmat/primitives/asymmetric/dsa.rst +++ b/docs/hazmat/primitives/asymmetric/dsa.rst @@ -253,7 +253,7 @@ DSA The :class:`~cryptography.hazmat.primitives.dsa.DSAParameterNumbers` associated with the public key. -.. class:: DSAPrivateNumbers(x, public_numbers, parameter_numbers) +.. class:: DSAPrivateNumbers(x, public_numbers) .. versionadded:: 0.5 @@ -277,13 +277,6 @@ DSA The :class:`~cryptography.hazmat.primitives.dsa.DSAPublicNumbers` associated with the private key. - .. attribute:: parameter_numbers - - :type: :class:`~cryptography.hazmat.primitives.dsa.DSAParameterNumbers` - - The :class:`~cryptography.hazmat.primitives.dsa.DSAParameterNumbers` - associated with the public key. - .. _`DSA`: https://en.wikipedia.org/wiki/Digital_Signature_Algorithm .. _`public-key`: https://en.wikipedia.org/wiki/Public-key_cryptography .. _`FIPS 186-4`: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf diff --git a/tests/hazmat/primitives/test_dsa.py b/tests/hazmat/primitives/test_dsa.py index 37489434..51a03c48 100644 --- a/tests/hazmat/primitives/test_dsa.py +++ b/tests/hazmat/primitives/test_dsa.py @@ -916,12 +916,10 @@ class TestDSANumbers(object): ) private_numbers = dsa.DSAPrivateNumbers( x=5, - public_numbers=public_numbers, - parameter_numbers=parameter_numbers + public_numbers=public_numbers ) assert private_numbers.x == 5 assert private_numbers.public_numbers == public_numbers - assert private_numbers.parameter_numbers == parameter_numbers def test_dsa_private_numbers_invalid_types(self): parameter_numbers = dsa.DSAParameterNumbers(p=1, q=2, g=3) @@ -930,22 +928,7 @@ class TestDSANumbers(object): parameter_numbers=parameter_numbers ) with pytest.raises(TypeError): - dsa.DSAPrivateNumbers( - x=4, - public_numbers=public_numbers, - parameter_numbers=None - ) + dsa.DSAPrivateNumbers(x=4, public_numbers=None) with pytest.raises(TypeError): - dsa.DSAPrivateNumbers( - x=4, - public_numbers=None, - parameter_numbers=parameter_numbers - ) - - with pytest.raises(TypeError): - dsa.DSAPrivateNumbers( - x=None, - public_numbers=public_numbers, - parameter_numbers=parameter_numbers - ) + dsa.DSAPrivateNumbers(x=None, public_numbers=public_numbers) -- cgit v1.2.3 From 36782837676e82eac063146d6e794cb4e51a24db Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Mon, 23 Jun 2014 12:05:25 -0600 Subject: fix some language --- cryptography/hazmat/primitives/asymmetric/dsa.py | 2 +- docs/hazmat/primitives/asymmetric/dsa.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cryptography/hazmat/primitives/asymmetric/dsa.py b/cryptography/hazmat/primitives/asymmetric/dsa.py index e8c587e9..4d78679e 100644 --- a/cryptography/hazmat/primitives/asymmetric/dsa.py +++ b/cryptography/hazmat/primitives/asymmetric/dsa.py @@ -191,7 +191,7 @@ class DSAParameterNumbers(object): not isinstance(g, six.integer_types) ): raise TypeError( - "DSAParameterNumbers p, q, q arguments must be an integers." + "DSAParameterNumbers p, q, and g arguments must be integers." ) self._p = p diff --git a/docs/hazmat/primitives/asymmetric/dsa.rst b/docs/hazmat/primitives/asymmetric/dsa.rst index ea913dd3..2167e528 100644 --- a/docs/hazmat/primitives/asymmetric/dsa.rst +++ b/docs/hazmat/primitives/asymmetric/dsa.rst @@ -226,7 +226,7 @@ DSA :type: int - The sub group order. + The sub-group order. .. attribute:: g -- cgit v1.2.3