aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.rst1
-rw-r--r--src/cryptography/x509/name.py8
-rw-r--r--tests/test_x509.py17
3 files changed, 26 insertions, 0 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index b64a0d18..08ac1093 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -15,6 +15,7 @@ Changelog
* Add support for AES key wrapping with
:func:`~cryptography.hazmat.primitives.keywrap.aes_key_wrap` and
:func:`~cryptography.hazmat.primitives.keywrap.aes_key_unwrap`.
+* Added an ``__hash__`` method to :class:`~cryptography.x509.Name`.
1.0.2 - 2015-09-27
~~~~~~~~~~~~~~~~~~
diff --git a/src/cryptography/x509/name.py b/src/cryptography/x509/name.py
index 992786ef..9d93ece1 100644
--- a/src/cryptography/x509/name.py
+++ b/src/cryptography/x509/name.py
@@ -40,6 +40,9 @@ class NameAttribute(object):
def __ne__(self, other):
return not self == other
+ def __hash__(self):
+ return hash((self.oid, self.value))
+
def __repr__(self):
return "<NameAttribute(oid={0.oid}, value={0.value!r})>".format(self)
@@ -60,6 +63,11 @@ class Name(object):
def __ne__(self, other):
return not self == other
+ def __hash__(self):
+ # TODO: this is relatively expensive, if this looks like a bottleneck
+ # for you, consider optimizing!
+ return hash(tuple(self._attributes))
+
def __iter__(self):
return iter(self._attributes)
diff --git a/tests/test_x509.py b/tests/test_x509.py
index cb05daf0..b9ea139b 100644
--- a/tests/test_x509.py
+++ b/tests/test_x509.py
@@ -2755,6 +2755,23 @@ class TestName(object):
assert name1 != name2
assert name1 != object()
+ def test_hash(self):
+ name1 = x509.Name([
+ x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
+ x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
+ ])
+ name2 = x509.Name([
+ x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
+ x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
+ ])
+ name3 = x509.Name([
+ x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
+ x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
+ ])
+
+ assert hash(name1) == hash(name2)
+ assert hash(name1) != hash(name3)
+
def test_repr(self):
name = x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, u'cryptography.io'),