commit a2c6b6184f39a12607b9b10fca6fae298e2c29b2 Author: Damian Johnson <ata...@torproject.org> Date: Tue Jun 27 10:35:32 2017 -0700
Randomize created extrainfo descirptor fields --- stem/descriptor/__init__.py | 12 +++++--- stem/descriptor/extrainfo_descriptor.py | 42 +++++++++++++--------------- stem/descriptor/server_descriptor.py | 2 +- test/unit/descriptor/extrainfo_descriptor.py | 10 ++----- 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/stem/descriptor/__init__.py b/stem/descriptor/__init__.py index ac9367b..f78de9a 100644 --- a/stem/descriptor/__init__.py +++ b/stem/descriptor/__init__.py @@ -1038,6 +1038,14 @@ def _append_router_signature(content, private_key): return content + b'\n'.join([b'-----BEGIN SIGNATURE-----'] + stem.util.str_tools._split_by_length(signature, 64) + [b'-----END SIGNATURE-----\n']) +def _random_nickname(): + return ('Unnamed%i' % random.randint(0, sys.maxint))[:20] + + +def _random_fingerprint(): + return ('%040x' % random.randrange(16 ** 40)).upper() + + def _random_ipv4_address(): return '%i.%i.%i.%i' % (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) @@ -1059,10 +1067,6 @@ def _random_crypto_blob(block_type = None): return crypto_blob -def _random_nickname(): - return ('Unnamed%i' % random.randint(0, sys.maxint))[:19] - - def _descriptor_components(raw_contents, validate, extra_keywords = (), non_ascii_fields = ()): """ Initial breakup of the server descriptor contents to make parsing easier. diff --git a/stem/descriptor/extrainfo_descriptor.py b/stem/descriptor/extrainfo_descriptor.py index 3a4a0f8..08a07ab 100644 --- a/stem/descriptor/extrainfo_descriptor.py +++ b/stem/descriptor/extrainfo_descriptor.py @@ -77,7 +77,6 @@ import stem.util.enum import stem.util.str_tools from stem.descriptor import ( - CRYPTO_BLOB, PGP_BLOCK_END, Descriptor, create_signing_key, @@ -91,6 +90,10 @@ from stem.descriptor import ( _parse_forty_character_hex, _parse_key_block, _append_router_signature, + _random_nickname, + _random_fingerprint, + _random_date, + _random_crypto_blob, ) try: @@ -159,25 +162,6 @@ SINGLE_FIELDS = ( 'exit-streams-opened', ) -RELAY_EXTRAINFO_HEADER = ( - ('extra-info', 'ninja B2289C3EAB83ECD6EB916A2F481A02E6B76A0A48'), - ('published', '2012-05-05 17:03:50'), -) - -RELAY_EXTRAINFO_FOOTER = ( - ('router-signature', '\n-----BEGIN SIGNATURE-----%s-----END SIGNATURE-----' % CRYPTO_BLOB), -) - -BRIDGE_EXTRAINFO_HEADER = ( - ('extra-info', 'ec2bridgereaac65a3 1EC248422B57D9C0BD751892FE787585407479A4'), - ('published', '2012-05-05 17:03:50'), -) - -BRIDGE_EXTRAINFO_FOOTER = ( - ('router-digest', '006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4'), -) - - _timestamp_re = re.compile('^(.*) \(([0-9]+) s\)( .*)?$') _locale_re = re.compile('^[a-zA-Z0-9\?]{2}$') @@ -976,6 +960,11 @@ class RelayExtraInfoDescriptor(ExtraInfoDescriptor): @classmethod def content(cls, attr = None, exclude = (), sign = False, signing_key = None): + base_header = ( + ('extra-info', '%s %s' % (_random_nickname(), _random_fingerprint())), + ('published', _random_date()), + ) + if signing_key: sign = True @@ -986,10 +975,12 @@ class RelayExtraInfoDescriptor(ExtraInfoDescriptor): if signing_key is None: signing_key = create_signing_key() - content = _descriptor_content(attr, exclude, sign, RELAY_EXTRAINFO_HEADER) + b'\nrouter-signature\n' + content = _descriptor_content(attr, exclude, sign, base_header) + b'\nrouter-signature\n' return _append_router_signature(content, signing_key.private) else: - return _descriptor_content(attr, exclude, sign, RELAY_EXTRAINFO_HEADER, RELAY_EXTRAINFO_FOOTER) + return _descriptor_content(attr, exclude, sign, base_header, ( + ('router-signature', _random_crypto_blob('SIGNATURE')), + )) @classmethod def create(cls, attr = None, exclude = (), validate = True, sign = False, signing_key = None): @@ -1032,7 +1023,12 @@ class BridgeExtraInfoDescriptor(ExtraInfoDescriptor): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) - return _descriptor_content(attr, exclude, sign, BRIDGE_EXTRAINFO_HEADER, BRIDGE_EXTRAINFO_FOOTER) + return _descriptor_content(attr, exclude, sign, ( + ('extra-info', 'ec2bridgereaac65a3 %s' % _random_fingerprint()), + ('published', _random_date()), + ), ( + ('router-digest', _random_fingerprint()), + )) def digest(self): return self._digest diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py index edd1612..793cb8d 100644 --- a/stem/descriptor/server_descriptor.py +++ b/stem/descriptor/server_descriptor.py @@ -68,10 +68,10 @@ from stem.descriptor import ( _parse_protocol_line, _parse_key_block, _append_router_signature, + _random_nickname, _random_ipv4_address, _random_date, _random_crypto_blob, - _random_nickname, ) try: diff --git a/test/unit/descriptor/extrainfo_descriptor.py b/test/unit/descriptor/extrainfo_descriptor.py index 1f91e72..aa14b46 100644 --- a/test/unit/descriptor/extrainfo_descriptor.py +++ b/test/unit/descriptor/extrainfo_descriptor.py @@ -23,8 +23,8 @@ from test.unit.descriptor import ( base_expect_invalid_attr_for_text, ) -expect_invalid_attr = functools.partial(base_expect_invalid_attr, RelayExtraInfoDescriptor, 'nickname', 'ninja') -expect_invalid_attr_for_text = functools.partial(base_expect_invalid_attr_for_text, RelayExtraInfoDescriptor, 'nickname', 'ninja') +expect_invalid_attr = functools.partial(base_expect_invalid_attr, RelayExtraInfoDescriptor, 'nickname', 'Unnamed') +expect_invalid_attr_for_text = functools.partial(base_expect_invalid_attr_for_text, RelayExtraInfoDescriptor, 'nickname', 'Unnamed') class TestExtraInfoDescriptor(unittest.TestCase): @@ -201,9 +201,7 @@ k0d2aofcVbHr4fPQOSST0LXDrhFl5Fqo5um296zpJGvRUeO6S44U/EfJAGShtqWw """ desc = RelayExtraInfoDescriptor.create() - self.assertEqual('ninja', desc.nickname) - self.assertEqual('B2289C3EAB83ECD6EB916A2F481A02E6B76A0A48', desc.fingerprint) - self.assertTrue(stem.descriptor.CRYPTO_BLOB in desc.signature) + self.assertTrue(desc.nickname.startswith('Unnamed')) def test_unrecognized_line(self): """ @@ -721,8 +719,6 @@ k0d2aofcVbHr4fPQOSST0LXDrhFl5Fqo5um296zpJGvRUeO6S44U/EfJAGShtqWw desc = BridgeExtraInfoDescriptor.create() self.assertEqual('ec2bridgereaac65a3', desc.nickname) - self.assertEqual('1EC248422B57D9C0BD751892FE787585407479A4', desc.fingerprint) - self.assertEqual('006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4', desc.digest()) self.assertEqual([], desc.get_unrecognized_lines()) # check that we don't have crypto fields _______________________________________________ tor-commits mailing list tor-commits@lists.torproject.org https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits