From eda3da648b7c1faa8918879d2d7b34f3ebd1b3f6 Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 11:12:51 -0700 Subject: RSA*Numbers class definitions. --- cryptography/hazmat/primitives/asymmetric/rsa.py | 53 ++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py index 5d3bb36c..3ddecf99 100644 --- a/cryptography/hazmat/primitives/asymmetric/rsa.py +++ b/cryptography/hazmat/primitives/asymmetric/rsa.py @@ -257,3 +257,56 @@ class RSAPrivateKey(object): @property def n(self): return self.modulus + + +class RSAPrivateNumbers(object): + def __init__(self, p, q, d, dmp1, dmq1, iqmp, + public_numbers): + self._p = p + self._q = q + self._d = d + self._dmp1 = dmp1 + self._dmpq1 = dmq1 + self._iqmp = iqmp + self._public_numbers = public_numbers + + @property + def p(self): + return self._p + + @property + def q(self): + return self._q + + @property + def d(self): + return self._d + + @property + def dmp1(self): + return self._dmp1 + + @property + def dmq1(self): + return self._dmq1 + + @property + def iqmp(self): + return self._iqmp + + def public_numbers(self): + return self._public_numbers + + +class RSAPublicNumbers(object): + def __init__(self, e, n): + self._e = e + self._n = n + + @property + def e(self): + return self._e + + @property + def n(self): + return self._n -- cgit v1.2.3 From 2fc16f548c2a9e4e82ff1f42abd17583c0bcfb73 Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 13:44:36 -0700 Subject: Most basic numbers documentation. --- docs/hazmat/primitives/asymmetric/rsa.rst | 66 +++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/docs/hazmat/primitives/asymmetric/rsa.rst b/docs/hazmat/primitives/asymmetric/rsa.rst index 68ad089d..d66a339a 100644 --- a/docs/hazmat/primitives/asymmetric/rsa.rst +++ b/docs/hazmat/primitives/asymmetric/rsa.rst @@ -329,6 +329,72 @@ RSA ) +.. class:: RSAPublicNumbers(e, n) + + .. versionadded:: 0.5 + + .. attribute:: n + + :type: int + + The public modulus. + + .. attribute:: e + + :type: int + + The public exponent. + + +.. class:: RSAPrivateNumbers(p, q, d, dmp1, dmq1, iqmp, public_numbers) + + .. versionadded:: 0.5 + + + .. method:: public_numbers() + + :return: :class:`~cryptography.hazmat.primitives.rsa.RSAPublicNumbers` + + .. attribute:: p + + :type: int + + ``p``, one of the two primes composing the :attr:`modulus`. + + .. attribute:: q + + :type: int + + ``q``, one of the two primes composing the :attr:`modulus`. + + .. attribute:: d + + :type: int + + The private exponent. Alias for :attr:`private_exponent`. + + .. attribute:: dmp1 + + :type: int + + A `Chinese remainder theorem`_ coefficient used to speed up RSA + operations. Calculated as: d mod (p-1) + + .. attribute:: dmq1 + + :type: int + + A `Chinese remainder theorem`_ coefficient used to speed up RSA + operations. Calculated as: d mod (q-1) + + .. attribute:: iqmp + + :type: int + + A `Chinese remainder theorem`_ coefficient used to speed up RSA + operations. Calculated as: q\ :sup:`-1` mod p + + Handling partial RSA private keys --------------------------------- -- cgit v1.2.3 From 716b6bc323e1bc1b39614ebaf880ae5c32102a3b Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 15:18:44 -0700 Subject: More RSA*Numbers documentation, gosh these descriptions are bad. --- docs/hazmat/primitives/asymmetric/rsa.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/hazmat/primitives/asymmetric/rsa.rst b/docs/hazmat/primitives/asymmetric/rsa.rst index d66a339a..34e15a73 100644 --- a/docs/hazmat/primitives/asymmetric/rsa.rst +++ b/docs/hazmat/primitives/asymmetric/rsa.rst @@ -333,6 +333,9 @@ RSA .. versionadded:: 0.5 + An RSAPublicNumbers instance represents the constituent parts of an + RSA Public key as integers. + .. attribute:: n :type: int @@ -350,6 +353,8 @@ RSA .. versionadded:: 0.5 + An RSAPrivateNumbers instance represents the constituent parts of an + RSA Private key as integers. .. method:: public_numbers() -- cgit v1.2.3 From 483df727eee61d9ab9dcbcd534ff41559e819714 Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 15:50:26 -0700 Subject: Rewrite some descriptions to not be self-referential and rewrite the private numbers description to be a little bit scary. --- docs/hazmat/primitives/asymmetric/rsa.rst | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/hazmat/primitives/asymmetric/rsa.rst b/docs/hazmat/primitives/asymmetric/rsa.rst index 34e15a73..de7ad4bc 100644 --- a/docs/hazmat/primitives/asymmetric/rsa.rst +++ b/docs/hazmat/primitives/asymmetric/rsa.rst @@ -333,8 +333,7 @@ RSA .. versionadded:: 0.5 - An RSAPublicNumbers instance represents the constituent parts of an - RSA Public key as integers. + The colleciton of integers that make up an RSA public key. .. attribute:: n @@ -353,8 +352,15 @@ RSA .. versionadded:: 0.5 - An RSAPrivateNumbers instance represents the constituent parts of an - RSA Private key as integers. + The collection of integers that make up an RSA private key. + + .. warning:: + + With the exception of the integers contained in the + :class:`RSAPublicNumbers` returned by the :meth:`public_numbers` + method, all attributes of this class must be kept secret. Revealing + them will compromise the security of any cryptographic operations + performed with a key derived from them. .. method:: public_numbers() -- cgit v1.2.3 From 216d263a07d8e830e6fd3cee5617870d9a773b9f Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 15:59:48 -0700 Subject: Fix typos. --- docs/hazmat/primitives/asymmetric/rsa.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hazmat/primitives/asymmetric/rsa.rst b/docs/hazmat/primitives/asymmetric/rsa.rst index de7ad4bc..5e6037de 100644 --- a/docs/hazmat/primitives/asymmetric/rsa.rst +++ b/docs/hazmat/primitives/asymmetric/rsa.rst @@ -333,7 +333,7 @@ RSA .. versionadded:: 0.5 - The colleciton of integers that make up an RSA public key. + The collection of integers that make up an RSA public key. .. attribute:: n -- cgit v1.2.3 From 8d9e98fd5036021184e0bca268de5a02d07b24a3 Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 16:47:57 -0700 Subject: Failing tests. --- tests/hazmat/primitives/test_rsa.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/hazmat/primitives/test_rsa.py b/tests/hazmat/primitives/test_rsa.py index 63d62657..9d696238 100644 --- a/tests/hazmat/primitives/test_rsa.py +++ b/tests/hazmat/primitives/test_rsa.py @@ -1483,3 +1483,30 @@ class TestRSAEncryption(object): ), backend ) + + +class TestRSANumbers(object): + def test_RSAPublicNumbers(self): + public_numbers = rsa.RSAPublicNumbers(e=1, n=15) + assert public_numbers.e == 1 + assert public_numbers.n == 15 + + def test_RSAPrivateNumbers(self): + public_numbers = rsa.RSAPublicNumbers(e=1, n=15) + private_numbers = rsa.RSAPrivateNumbers( + p=3, + q=5, + d=1, + dmp1=1, + dmq1=1, + iqmp=2, + public_numbers=public_numbers + ) + + assert private_numbers.p == 3 + assert private_numbers.q == 5 + assert private_numbers.d == 1 + assert private_numbers.dmp1 == 1 + assert private_numbers.dmq1 == 1 + assert private_numbers.iqmp == 2 + assert private_numbers.public_numbers() == public_numbers -- cgit v1.2.3 From 66e377aea7d4391371ff8b1b8fa0420a10bbfa08 Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 16:49:54 -0700 Subject: Passing tests. --- cryptography/hazmat/primitives/asymmetric/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py index 3ddecf99..e84472c7 100644 --- a/cryptography/hazmat/primitives/asymmetric/rsa.py +++ b/cryptography/hazmat/primitives/asymmetric/rsa.py @@ -266,7 +266,7 @@ class RSAPrivateNumbers(object): self._q = q self._d = d self._dmp1 = dmp1 - self._dmpq1 = dmq1 + self._dmq1 = dmq1 self._iqmp = iqmp self._public_numbers = public_numbers -- cgit v1.2.3 From b0f2b674640ee126d0cc63849f77c4ea480d67fd Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 30 Apr 2014 18:30:25 -0700 Subject: Pep8 --- tests/hazmat/primitives/test_rsa.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/hazmat/primitives/test_rsa.py b/tests/hazmat/primitives/test_rsa.py index 9d696238..e60bfabf 100644 --- a/tests/hazmat/primitives/test_rsa.py +++ b/tests/hazmat/primitives/test_rsa.py @@ -1486,12 +1486,12 @@ class TestRSAEncryption(object): class TestRSANumbers(object): - def test_RSAPublicNumbers(self): + def test_rsa_public_numbers(self): public_numbers = rsa.RSAPublicNumbers(e=1, n=15) assert public_numbers.e == 1 assert public_numbers.n == 15 - def test_RSAPrivateNumbers(self): + def test_rsa_private_numbers(self): public_numbers = rsa.RSAPublicNumbers(e=1, n=15) private_numbers = rsa.RSAPrivateNumbers( p=3, -- cgit v1.2.3 From 6994ff0da7076ab161c91bfa5df09290faf1cec4 Mon Sep 17 00:00:00 2001 From: David Reid Date: Thu, 1 May 2014 12:57:35 -0700 Subject: Make public_numbers a property. --- cryptography/hazmat/primitives/asymmetric/rsa.py | 1 + docs/hazmat/primitives/asymmetric/rsa.rst | 14 ++++++++------ tests/hazmat/primitives/test_rsa.py | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py index e84472c7..18fcac26 100644 --- a/cryptography/hazmat/primitives/asymmetric/rsa.py +++ b/cryptography/hazmat/primitives/asymmetric/rsa.py @@ -294,6 +294,7 @@ class RSAPrivateNumbers(object): def iqmp(self): return self._iqmp + @property def public_numbers(self): return self._public_numbers diff --git a/docs/hazmat/primitives/asymmetric/rsa.rst b/docs/hazmat/primitives/asymmetric/rsa.rst index 5e6037de..8c34497e 100644 --- a/docs/hazmat/primitives/asymmetric/rsa.rst +++ b/docs/hazmat/primitives/asymmetric/rsa.rst @@ -357,14 +357,16 @@ RSA .. warning:: With the exception of the integers contained in the - :class:`RSAPublicNumbers` returned by the :meth:`public_numbers` - method, all attributes of this class must be kept secret. Revealing - them will compromise the security of any cryptographic operations - performed with a key derived from them. + :class:`RSAPublicNumbers` all attributes of this class must be kept + secret. Revealing them will compromise the security of any + cryptographic operations performed with a key loaded from them. - .. method:: public_numbers() + .. attribute:: public_numbers - :return: :class:`~cryptography.hazmat.primitives.rsa.RSAPublicNumbers` + :type: :class:`~cryptography.hazmat.primitives.rsa.RSAPublicNumbers` + + The :class:`RSAPublicNumbers` which makes up the RSA public key + associated with this RSA private key. .. attribute:: p diff --git a/tests/hazmat/primitives/test_rsa.py b/tests/hazmat/primitives/test_rsa.py index e60bfabf..6d3bf2ec 100644 --- a/tests/hazmat/primitives/test_rsa.py +++ b/tests/hazmat/primitives/test_rsa.py @@ -1509,4 +1509,4 @@ class TestRSANumbers(object): assert private_numbers.dmp1 == 1 assert private_numbers.dmq1 == 1 assert private_numbers.iqmp == 2 - assert private_numbers.public_numbers() == public_numbers + assert private_numbers.public_numbers == public_numbers -- cgit v1.2.3 From 2d50118e682703a564a01c1c00ad5f414e2eee74 Mon Sep 17 00:00:00 2001 From: David Reid Date: Tue, 6 May 2014 21:39:15 -0700 Subject: Check types. --- cryptography/hazmat/primitives/asymmetric/rsa.py | 40 +++++++++++ tests/hazmat/primitives/test_rsa.py | 88 ++++++++++++++++++++++++ 2 files changed, 128 insertions(+) diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py index 18fcac26..024f1103 100644 --- a/cryptography/hazmat/primitives/asymmetric/rsa.py +++ b/cryptography/hazmat/primitives/asymmetric/rsa.py @@ -262,6 +262,40 @@ class RSAPrivateKey(object): class RSAPrivateNumbers(object): def __init__(self, p, q, d, dmp1, dmq1, iqmp, public_numbers): + if not isinstance(p, six.integer_types): + raise TypeError( + "RSAPrivateNumbers' p argument must be an integer." + ) + if not isinstance(q, six.integer_types): + raise TypeError( + "RSAPrivateNumbers' q argument must be an integer." + ) + + if not isinstance(d, six.integer_types): + raise TypeError( + "RSAPrivateNumbers' d argument must be an integer." + ) + + if not isinstance(dmp1, six.integer_types): + raise TypeError( + "RSAPrivateNumbers' dmp1 argument must be an integer." + ) + if not isinstance(dmq1, six.integer_types): + raise TypeError( + "RSAPrivateNumbers' dmq1 argument must be an integer." + ) + + if not isinstance(iqmp, six.integer_types): + raise TypeError( + "RSAPrivateNumbers' iqmp argument must be an integer." + ) + + if not isinstance(public_numbers, RSAPublicNumbers): + raise TypeError( + "RSAPrivateNumbers' public_numbers must be an RSAPublicNumbers" + " instance." + ) + self._p = p self._q = q self._d = d @@ -301,6 +335,12 @@ class RSAPrivateNumbers(object): class RSAPublicNumbers(object): def __init__(self, e, n): + if ( + not isinstance(e, six.integer_types) or + not isinstance(n, six.integer_types) + ): + raise TypeError("RSAPrivateNumbers arguments must be integers.") + self._e = e self._n = n diff --git a/tests/hazmat/primitives/test_rsa.py b/tests/hazmat/primitives/test_rsa.py index 6d3bf2ec..b9011e1e 100644 --- a/tests/hazmat/primitives/test_rsa.py +++ b/tests/hazmat/primitives/test_rsa.py @@ -1510,3 +1510,91 @@ class TestRSANumbers(object): assert private_numbers.dmq1 == 1 assert private_numbers.iqmp == 2 assert private_numbers.public_numbers == public_numbers + + def test_public_numbers_invalid_types(self): + with pytest.raises(TypeError): + rsa.RSAPublicNumbers(e=None, n=15) + + with pytest.raises(TypeError): + rsa.RSAPublicNumbers(e=1, n=None) + + def test_private_numbers_invalid_types(self): + public_numbers = rsa.RSAPublicNumbers(e=1, n=15) + + with pytest.raises(TypeError): + rsa.RSAPrivateNumbers( + p=None, + q=5, + d=1, + dmp1=1, + dmq1=1, + iqmp=2, + public_numbers=public_numbers + ) + + with pytest.raises(TypeError): + rsa.RSAPrivateNumbers( + p=3, + q=None, + d=1, + dmp1=1, + dmq1=1, + iqmp=2, + public_numbers=public_numbers + ) + + with pytest.raises(TypeError): + rsa.RSAPrivateNumbers( + p=3, + q=5, + d=None, + dmp1=1, + dmq1=1, + iqmp=2, + public_numbers=public_numbers + ) + + with pytest.raises(TypeError): + rsa.RSAPrivateNumbers( + p=3, + q=5, + d=1, + dmp1=None, + dmq1=1, + iqmp=2, + public_numbers=public_numbers + ) + + with pytest.raises(TypeError): + rsa.RSAPrivateNumbers( + p=3, + q=5, + d=1, + dmp1=1, + dmq1=None, + iqmp=2, + public_numbers=public_numbers + ) + + with pytest.raises(TypeError): + rsa.RSAPrivateNumbers( + p=3, + q=5, + d=1, + dmp1=1, + dmq1=1, + iqmp=None, + public_numbers=public_numbers + ) + + with pytest.raises(TypeError): + rsa.RSAPrivateNumbers( + p=3, + q=5, + d=1, + dmp1=1, + dmq1=1, + iqmp=2, + public_numbers=None + ) + -- cgit v1.2.3 From 5f23ee8ac40a9bf76c08c9ebdbf4947a9e5158bc Mon Sep 17 00:00:00 2001 From: David Reid Date: Tue, 6 May 2014 22:06:15 -0700 Subject: Pep8 --- tests/hazmat/primitives/test_rsa.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/hazmat/primitives/test_rsa.py b/tests/hazmat/primitives/test_rsa.py index b9011e1e..8953db5b 100644 --- a/tests/hazmat/primitives/test_rsa.py +++ b/tests/hazmat/primitives/test_rsa.py @@ -1597,4 +1597,3 @@ class TestRSANumbers(object): iqmp=2, public_numbers=None ) - -- cgit v1.2.3 From ce15f99aeb904ac308717fa522784a8dfb22ce82 Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 7 May 2014 11:28:31 -0700 Subject: Use one error message for all integer typeerrors. --- cryptography/hazmat/primitives/asymmetric/rsa.py | 35 +++++++----------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py index 024f1103..b656d06c 100644 --- a/cryptography/hazmat/primitives/asymmetric/rsa.py +++ b/cryptography/hazmat/primitives/asymmetric/rsa.py @@ -262,32 +262,17 @@ class RSAPrivateKey(object): class RSAPrivateNumbers(object): def __init__(self, p, q, d, dmp1, dmq1, iqmp, public_numbers): - if not isinstance(p, six.integer_types): - raise TypeError( - "RSAPrivateNumbers' p argument must be an integer." - ) - if not isinstance(q, six.integer_types): - raise TypeError( - "RSAPrivateNumbers' q argument must be an integer." - ) - - if not isinstance(d, six.integer_types): - raise TypeError( - "RSAPrivateNumbers' d argument must be an integer." - ) - - if not isinstance(dmp1, six.integer_types): - raise TypeError( - "RSAPrivateNumbers' dmp1 argument must be an integer." - ) - if not isinstance(dmq1, six.integer_types): - raise TypeError( - "RSAPrivateNumbers' dmq1 argument must be an integer." - ) - - if not isinstance(iqmp, six.integer_types): + if ( + not isinstance(p, six.integer_types) or + not isinstance(q, six.integer_types) or + not isinstance(d, six.integer_types) or + not isinstance(dmp1, six.integer_types) or + not isinstance(dmq1, six.integer_types) or + not isinstance(iqmp, six.integer_types) + ): raise TypeError( - "RSAPrivateNumbers' iqmp argument must be an integer." + "RSAPrivateNumbers' p, q, d, dmp1, dmq1, iqmp arguments must" + " all be an integers." ) if not isinstance(public_numbers, RSAPublicNumbers): -- cgit v1.2.3 From c9430bd2a150a26bfff3e06065b5f529378ea40a Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 7 May 2014 14:04:23 -0700 Subject: Fix Private->Public --- cryptography/hazmat/primitives/asymmetric/rsa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py index b656d06c..2ee96f84 100644 --- a/cryptography/hazmat/primitives/asymmetric/rsa.py +++ b/cryptography/hazmat/primitives/asymmetric/rsa.py @@ -324,7 +324,7 @@ class RSAPublicNumbers(object): not isinstance(e, six.integer_types) or not isinstance(n, six.integer_types) ): - raise TypeError("RSAPrivateNumbers arguments must be integers.") + raise TypeError("RSAPublicNumbers arguments must be integers.") self._e = e self._n = n -- cgit v1.2.3 From d2a69d27d0440d37eb00578527058fc535d621ba Mon Sep 17 00:00:00 2001 From: David Reid Date: Mon, 12 May 2014 13:20:39 -0700 Subject: No apostrophe here. --- cryptography/hazmat/primitives/asymmetric/rsa.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py index 2ee96f84..d23f8046 100644 --- a/cryptography/hazmat/primitives/asymmetric/rsa.py +++ b/cryptography/hazmat/primitives/asymmetric/rsa.py @@ -271,13 +271,13 @@ class RSAPrivateNumbers(object): not isinstance(iqmp, six.integer_types) ): raise TypeError( - "RSAPrivateNumbers' p, q, d, dmp1, dmq1, iqmp arguments must" + "RSAPrivateNumbers p, q, d, dmp1, dmq1, iqmp arguments must" " all be an integers." ) if not isinstance(public_numbers, RSAPublicNumbers): raise TypeError( - "RSAPrivateNumbers' public_numbers must be an RSAPublicNumbers" + "RSAPrivateNumbers public_numbers must be an RSAPublicNumbers" " instance." ) -- cgit v1.2.3