[tor-commits] [stem/master] Support sha256 extrainfo digests
atagar at torproject.org
atagar at torproject.org
Tue Apr 11 00:31:21 UTC 2017
commit f487454259537fe37adea2ba90d7990475e789fd
Author: Damian Johnson <atagar at torproject.org>
Date: Mon Apr 10 17:25:45 2017 -0700
Support sha256 extrainfo digests
Server descriptors now include both a hex digest along with the base64 encoded
sha256. Including this new attribute in our parser.
---
docs/change_log.rst | 3 ++-
stem/descriptor/server_descriptor.py | 13 ++++++++-----
test/unit/descriptor/server_descriptor.py | 14 ++++++++++++++
3 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst
index d5c9755..e9b6323 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -56,7 +56,8 @@ The following are only available within Stem's `git repository
* Support and validation for `ed25519 certificates <api/descriptor/certificate.html>`_ (`spec <https://gitweb.torproject.org/torspec.git/tree/cert-spec.txt>`_, :trac:`21558`)
* Moved from the deprecated `pycrypto <https://www.dlitz.net/software/pycrypto/>`_ module to `cryptography <https://pypi.python.org/pypi/cryptography>`_ for validating signatures (:trac:`21086`)
* Sped descriptor reading by ~25% by deferring defaulting when validating
- * Support for protocol descriptor fields (:spec:`eb4fb3c`)
+ * Added server descriptor's new extra_info_sha256_digest attribute (:spec:`0f03581`)
+ * Added server descriptor's new protocol attribute (:spec:`eb4fb3c`)
* Shared randomness properties weren't being read in votes (:trac:`21102`)
* **Utilities**
diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index 1cedbe5..ddc1149 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -279,12 +279,13 @@ def _parse_fingerprint_line(descriptor, entries):
def _parse_extrainfo_digest_line(descriptor, entries):
value = _value('extra-info-digest', entries)
- value = value.split(' ')[0] # lines have additional content from propsal 228, waiting for it to be documented: #16227
+ digest_comp = value.split(' ')
- if not stem.util.tor_tools.is_hex_digits(value, 40):
- raise ValueError('extra-info-digest should be 40 hex characters: %s' % value)
+ if not stem.util.tor_tools.is_hex_digits(digest_comp[0], 40):
+ raise ValueError('extra-info-digest should be 40 hex characters: %s' % digest_comp[0])
- descriptor.extra_info_digest = value
+ descriptor.extra_info_digest = digest_comp[0]
+ descriptor.extra_info_sha256_digest = digest_comp[1] if len(digest_comp) >= 2 else None
def _parse_hibernating_line(descriptor, entries):
@@ -457,6 +458,7 @@ class ServerDescriptor(Descriptor):
requests are accepted
:var bool extra_info_cache: **\*** flag if a mirror for extra-info documents
:var str extra_info_digest: upper-case hex encoded digest of our extra-info document
+ :var str extra_info_sha256_digest: base64 encoded sha256 digest of our extra-info document
:var bool eventdns: flag for evdns backend (**deprecated**, always unset)
:var str ntor_onion_key: base64 key used to encrypt EXTEND in the ntor protocol
:var list or_addresses: **\*** alternative for our address/or_port
@@ -481,7 +483,7 @@ class ServerDescriptor(Descriptor):
Added the allow_tunneled_dir_requests attribute.
.. versionchanged:: 1.6.0
- Added the protocols attribute.
+ Added the extra_info_sha256_digest and protocols attributes.
"""
ATTRIBUTES = {
@@ -515,6 +517,7 @@ class ServerDescriptor(Descriptor):
'protocols': ({}, _parse_proto_line),
'extra_info_cache': (False, _parse_caches_extra_info_line),
'extra_info_digest': (None, _parse_extrainfo_digest_line),
+ 'extra_info_sha256_digest': (None, _parse_extrainfo_digest_line),
'hidden_service_dir': (None, _parse_hidden_service_dir_line),
'eventdns': (None, _parse_eventdns_line),
'ntor_onion_key': (None, _parse_ntor_onion_key_line),
diff --git a/test/unit/descriptor/server_descriptor.py b/test/unit/descriptor/server_descriptor.py
index 42fa392..747600c 100644
--- a/test/unit/descriptor/server_descriptor.py
+++ b/test/unit/descriptor/server_descriptor.py
@@ -129,6 +129,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
self.assertEqual(False, desc.allow_tunneled_dir_requests)
self.assertEqual(False, desc.extra_info_cache)
self.assertEqual('D225B728768D7EA4B5587C13A7A9D22EBBEE6E66', desc.extra_info_digest)
+ self.assertEqual(None, desc.extra_info_sha256_digest)
self.assertEqual(['2'], desc.hidden_service_dir)
self.assertEqual(expected_family, desc.family)
self.assertEqual(153600, desc.average_bandwidth)
@@ -187,6 +188,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
self.assertEqual(False, desc.allow_tunneled_dir_requests)
self.assertEqual(False, desc.extra_info_cache)
self.assertEqual(None, desc.extra_info_digest)
+ self.assertEqual(None, desc.extra_info_sha256_digest)
self.assertEqual(None, desc.hidden_service_dir)
self.assertEqual(set(), desc.family)
self.assertEqual(102400, desc.average_bandwidth)
@@ -234,6 +236,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
self.assertEqual(False, desc.allow_tunneled_dir_requests)
self.assertEqual(False, desc.extra_info_cache)
self.assertEqual('56403D838DE152421CD401B8E57DAD4483A3D56B', desc.extra_info_digest)
+ self.assertEqual(None, desc.extra_info_sha256_digest)
self.assertEqual(['2'], desc.hidden_service_dir)
self.assertEqual(set(), desc.family)
self.assertEqual(102400, desc.average_bandwidth)
@@ -303,6 +306,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
self.assertEqual(False, desc.allow_tunneled_dir_requests)
self.assertEqual(False, desc.extra_info_cache)
self.assertEqual('44E9B679AF0B4EB09296985BAF4066AE9CA5BB93', desc.extra_info_digest)
+ self.assertEqual('r+roMxhsjd1GPpn5knQoBvtE9Rhsv8zQHCqiYL6u2CA', desc.extra_info_sha256_digest)
self.assertEqual(['2'], desc.hidden_service_dir)
self.assertEqual(family, desc.family)
self.assertEqual(149715200, desc.average_bandwidth)
@@ -413,6 +417,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
self.assertEqual(False, desc.allow_tunneled_dir_requests)
self.assertEqual(True, desc.extra_info_cache)
self.assertEqual('BB1F13AA431421BEA29B840A2E33BB1C31C2990B', desc.extra_info_digest)
+ self.assertEqual(None, desc.extra_info_sha256_digest)
self.assertEqual(None, desc.hidden_service_dir)
self.assertEqual(set(), desc.family)
self.assertEqual(3220480, desc.average_bandwidth)
@@ -687,6 +692,15 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
desc = get_relay_server_descriptor({'ipv6-policy': 'accept 22-23,53,80,110'})
self.assertEqual(expected, desc.exit_policy_v6)
+ def test_extrainfo_sha256_digest(self):
+ """
+ Extrainfo descriptor line with both a hex and base64 encoded sha256 digest.
+ """
+
+ desc = get_relay_server_descriptor({'extra-info-digest': '03272BF7C68484AFBDA508DAE3734D809E4A5BC4 DWMz1AEdqPlcroubwx3lPEoGbT+oX7S2BH653sPIqfI'})
+ self.assertEqual('03272BF7C68484AFBDA508DAE3734D809E4A5BC4', desc.extra_info_digest)
+ self.assertEqual('DWMz1AEdqPlcroubwx3lPEoGbT+oX7S2BH653sPIqfI', desc.extra_info_sha256_digest)
+
def test_protocols(self):
"""
Checks a 'proto' line.
More information about the tor-commits
mailing list