move some shared logic to functions
diff --git a/cryptography/hazmat/primitives/asymmetric/rsa.py b/cryptography/hazmat/primitives/asymmetric/rsa.py
index b256ddc..4f4e257 100644
--- a/cryptography/hazmat/primitives/asymmetric/rsa.py
+++ b/cryptography/hazmat/primitives/asymmetric/rsa.py
@@ -43,6 +43,56 @@
         raise ValueError("key_size must be at least 512-bits.")
 
 
+def _check_private_key_components(p, q, private_exponent, dmp1, dmq1, iqmp,
+                                  public_exponent, modulus):
+    if modulus < 3:
+        raise ValueError("modulus must be >= 3.")
+
+    if p >= modulus:
+        raise ValueError("p must be < modulus.")
+
+    if q >= modulus:
+        raise ValueError("q must be < modulus.")
+
+    if dmp1 >= modulus:
+        raise ValueError("dmp1 must be < modulus.")
+
+    if dmq1 >= modulus:
+        raise ValueError("dmq1 must be < modulus.")
+
+    if iqmp >= modulus:
+        raise ValueError("iqmp must be < modulus.")
+
+    if private_exponent >= modulus:
+        raise ValueError("private_exponent must be < modulus.")
+
+    if public_exponent < 3 or public_exponent >= modulus:
+        raise ValueError("public_exponent must be >= 3 and < modulus.")
+
+    if public_exponent & 1 == 0:
+        raise ValueError("public_exponent must be odd.")
+
+    if dmp1 & 1 == 0:
+        raise ValueError("dmp1 must be odd.")
+
+    if dmq1 & 1 == 0:
+        raise ValueError("dmq1 must be odd.")
+
+    if p * q != modulus:
+        raise ValueError("p*q must equal modulus.")
+
+
+def _check_public_key_components(e, n):
+        if n < 3:
+            raise ValueError("n must be >= 3.")
+
+        if e < 3 or e >= n:
+            raise ValueError("e must be >= 3 and < n.")
+
+        if e & 1 == 0:
+            raise ValueError("e must be odd.")
+
+
 @utils.register_interface(interfaces.RSAPublicKey)
 class RSAPublicKey(object):
     def __init__(self, public_exponent, modulus):
@@ -52,14 +102,7 @@
         ):
             raise TypeError("RSAPublicKey arguments must be integers.")
 
-        if modulus < 3:
-            raise ValueError("modulus must be >= 3.")
-
-        if public_exponent < 3 or public_exponent >= modulus:
-            raise ValueError("public_exponent must be >= 3 and < modulus.")
-
-        if public_exponent & 1 == 0:
-            raise ValueError("public_exponent must be odd.")
+        _check_public_key_components(public_exponent, modulus)
 
         self._public_exponent = public_exponent
         self._modulus = modulus
@@ -156,41 +199,8 @@
         ):
             raise TypeError("RSAPrivateKey arguments must be integers.")
 
-        if modulus < 3:
-            raise ValueError("modulus must be >= 3.")
-
-        if p >= modulus:
-            raise ValueError("p must be < modulus.")
-
-        if q >= modulus:
-            raise ValueError("q must be < modulus.")
-
-        if dmp1 >= modulus:
-            raise ValueError("dmp1 must be < modulus.")
-
-        if dmq1 >= modulus:
-            raise ValueError("dmq1 must be < modulus.")
-
-        if iqmp >= modulus:
-            raise ValueError("iqmp must be < modulus.")
-
-        if private_exponent >= modulus:
-            raise ValueError("private_exponent must be < modulus.")
-
-        if public_exponent < 3 or public_exponent >= modulus:
-            raise ValueError("public_exponent must be >= 3 and < modulus.")
-
-        if public_exponent & 1 == 0:
-            raise ValueError("public_exponent must be odd.")
-
-        if dmp1 & 1 == 0:
-            raise ValueError("dmp1 must be odd.")
-
-        if dmq1 & 1 == 0:
-            raise ValueError("dmq1 must be odd.")
-
-        if p * q != modulus:
-            raise ValueError("p*q must equal modulus.")
+        _check_private_key_components(p, q, private_exponent, dmp1, dmq1, iqmp,
+                                      public_exponent, modulus)
 
         self._p = p
         self._q = q
@@ -304,6 +314,8 @@
                 " instance."
             )
 
+        _check_private_key_components(p, q, d, dmp1, dmq1, iqmp,
+                                      public_numbers.e, public_numbers.n)
         self._p = p
         self._q = q
         self._d = d
@@ -349,6 +361,8 @@
         ):
             raise TypeError("RSAPublicNumbers arguments must be integers.")
 
+        _check_public_key_components(e, n)
+
         self._e = e
         self._n = n
 
diff --git a/tests/hazmat/primitives/test_rsa.py b/tests/hazmat/primitives/test_rsa.py
index 8f10fb1..cfb51b0 100644
--- a/tests/hazmat/primitives/test_rsa.py
+++ b/tests/hazmat/primitives/test_rsa.py
@@ -1681,12 +1681,12 @@
 @pytest.mark.rsa
 class TestRSANumbers(object):
     def test_rsa_public_numbers(self):
-        public_numbers = rsa.RSAPublicNumbers(e=1, n=15)
-        assert public_numbers.e == 1
+        public_numbers = rsa.RSAPublicNumbers(e=3, n=15)
+        assert public_numbers.e == 3
         assert public_numbers.n == 15
 
     def test_rsa_private_numbers(self):
-        public_numbers = rsa.RSAPublicNumbers(e=1, n=15)
+        public_numbers = rsa.RSAPublicNumbers(e=3, n=15)
         private_numbers = rsa.RSAPrivateNumbers(
             p=3,
             q=5,
@@ -1713,7 +1713,7 @@
             rsa.RSAPublicNumbers(e=1, n=None)
 
     def test_private_numbers_invalid_types(self):
-        public_numbers = rsa.RSAPublicNumbers(e=1, n=15)
+        public_numbers = rsa.RSAPublicNumbers(e=3, n=15)
 
         with pytest.raises(TypeError):
             rsa.RSAPrivateNumbers(