mirror of
https://github.com/torproject/stem.git
synced 2025-03-04 07:57:29 +00:00
Better exception if provided with an invalid digest encoding
Our digest methods rightfully raise a NotImplementedException if I bugger up and add to the DigestEncoding enumeration without actually implementing it. But if users provide other bad data for an encoding argument we should provide a ValueError instead.
This commit is contained in:
parent
3768e1e922
commit
616026e9fb
@ -676,6 +676,8 @@ def _encode_digest(hash_value, encoding):
|
||||
return stem.util.str_tools._to_unicode(hash_value.hexdigest().upper())
|
||||
elif encoding == DigestEncoding.BASE64:
|
||||
return stem.util.str_tools._to_unicode(base64.b64encode(hash_value.digest()).rstrip(b'='))
|
||||
elif encoding not in DigestEncoding:
|
||||
raise ValueError('Digest encodings should be among our DigestEncoding enumeration (%s), not %s' % (', '.join(DigestEncoding), encoding))
|
||||
else:
|
||||
raise NotImplementedError('BUG: stem.descriptor._encode_digest should recognize all DigestEncoding, lacked %s' % encoding)
|
||||
|
||||
|
@ -4,6 +4,7 @@ Unit tests for stem.descriptor.server_descriptor.
|
||||
|
||||
import datetime
|
||||
import functools
|
||||
import hashlib
|
||||
import io
|
||||
import pickle
|
||||
import tarfile
|
||||
@ -19,6 +20,7 @@ import stem.version
|
||||
import stem.util.str_tools
|
||||
import test.require
|
||||
|
||||
from stem.descriptor import DigestHash, DigestEncoding
|
||||
from stem.descriptor.certificate import CertType, ExtensionType
|
||||
from stem.descriptor.server_descriptor import BridgeDistribution, RelayDescriptor, BridgeDescriptor
|
||||
|
||||
@ -154,7 +156,6 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
|
||||
self.assertEqual(expected_signature, desc.signature)
|
||||
self.assertEqual([], desc.get_unrecognized_lines())
|
||||
self.assertEqual('2C7B27BEAB04B4E2459D89CA6D5CD1CC5F95A689', desc.digest())
|
||||
self.assertEqual('LHsnvqsEtOJFnYnKbVzRzF+Vpok', desc.digest(encoding = stem.descriptor.DigestEncoding.BASE64))
|
||||
|
||||
self.assertEqual('@type server-descriptor 1.0', str(desc.type_annotation()))
|
||||
self.assertEqual(['2'], desc.hidden_service_dir) # obsolete field
|
||||
@ -531,6 +532,23 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
|
||||
self.assertEqual('71.35.133.197', desc.address)
|
||||
self.assertEqual(None, desc.fingerprint)
|
||||
|
||||
def test_digest(self):
|
||||
with open(get_resource('example_descriptor'), 'rb') as descriptor_file:
|
||||
desc = next(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0'))
|
||||
|
||||
self.assertEqual('2C7B27BEAB04B4E2459D89CA6D5CD1CC5F95A689', desc.digest(DigestHash.SHA1, DigestEncoding.HEX))
|
||||
self.assertEqual('55F87C93AA5C16311308D09B94315DD1435174A95020E4FD47A70F82338BE9EA', desc.digest(DigestHash.SHA256, DigestEncoding.HEX))
|
||||
|
||||
self.assertEqual('LHsnvqsEtOJFnYnKbVzRzF+Vpok', desc.digest(DigestHash.SHA1, DigestEncoding.BASE64))
|
||||
self.assertEqual('Vfh8k6pcFjETCNCblDFd0UNRdKlQIOT9R6cPgjOL6eo', desc.digest(DigestHash.SHA256, DigestEncoding.BASE64))
|
||||
|
||||
digested_content = desc._content_range(start = 'router', end = '\nrouter-signature\n')
|
||||
self.assertEqual(hashlib.sha1(digested_content).digest(), desc.digest(DigestHash.SHA1, DigestEncoding.RAW).digest())
|
||||
self.assertEqual(hashlib.sha256(digested_content).digest(), desc.digest(DigestHash.SHA256, DigestEncoding.RAW).digest())
|
||||
|
||||
self.assertRaisesWith(NotImplementedError, 'Server descriptor digests are only available in sha1 and sha256, not bad-hash', desc.digest, 'bad-hash')
|
||||
self.assertRaisesWith(ValueError, 'Digest encodings should be among our DigestEncoding enumeration (RAW, HEX, BASE64), not BAD_ENCODING', desc.digest, DigestHash.SHA1, 'BAD_ENCODING')
|
||||
|
||||
def test_with_opt(self):
|
||||
"""
|
||||
Includes an 'opt <keyword> <value>' entry.
|
||||
|
Loading…
x
Reference in New Issue
Block a user