Implemented __hash__ function for key objects.
Overriding __eq__ blocks inheritance of __hash__ in Python 3.
Fixes issue #55
diff --git a/rsa/key.py b/rsa/key.py
index a5afced..73494b9 100644
--- a/rsa/key.py
+++ b/rsa/key.py
@@ -228,6 +228,9 @@
def __ne__(self, other):
return not (self == other)
+ def __hash__(self):
+ return hash((self.n, self.e))
+
@classmethod
def _load_pkcs1_der(cls, keyfile):
"""Loads a key in PKCS#1 DER format.
@@ -430,6 +433,9 @@
def __ne__(self, other):
return not (self == other)
+ def __hash__(self):
+ return hash((self.n, self.e, self.d, self.p, self.q, self.exp1, self.exp2, self.coef))
+
def blinded_decrypt(self, encrypted):
"""Decrypts the message using blinding to prevent side-channel attacks.
diff --git a/tests/test_key.py b/tests/test_key.py
index 833a6aa..afefa3a 100644
--- a/tests/test_key.py
+++ b/tests/test_key.py
@@ -59,3 +59,14 @@
exponent=exponent)
self.assertEqual(39317, p)
self.assertEqual(33107, q)
+
+
+class HashTest(unittest.TestCase):
+ """Test hashing of keys"""
+
+ def test_hash_possible(self):
+ priv, pub = rsa.key.newkeys(16)
+
+ # This raises a TypeError when hashing isn't possible.
+ hash(priv)
+ hash(pub)