commit ed496353ea2b176128ddec9e80294ca2ffb10fae Author: Damian Johnson atagar@torproject.org Date: Sun Oct 20 15:11:58 2019 -0700
Reduce Ed25519CertificateV1 constructor arguments
Why did I have a 'version' argument? The version is part of the class name - if it ever *isn't* one that's a problem. ;P
Also, having separate encoded/decoded constructor arguments for the exact same thing was silly. Decoding base64 twice is cheap, and having two arguments risks having them mismatch (which would be a frustrating headache to troubleshoot). --- stem/descriptor/certificate.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-)
diff --git a/stem/descriptor/certificate.py b/stem/descriptor/certificate.py index 90476576..042687e3 100644 --- a/stem/descriptor/certificate.py +++ b/stem/descriptor/certificate.py @@ -75,9 +75,9 @@ import datetime import hashlib import re
-import stem.prereq import stem.descriptor.hidden_service import stem.descriptor.server_descriptor +import stem.prereq import stem.util.enum import stem.util.str_tools
@@ -145,18 +145,10 @@ class Ed25519Certificate(object): if content.startswith('-----BEGIN ED25519 CERT-----\n') and content.endswith('\n-----END ED25519 CERT-----'): content = content[29:-27]
- try: - decoded = base64.b64decode(content) - - if not decoded: - raise TypeError('empty') - except (TypeError, binascii.Error) as exc: - raise ValueError("Ed25519 certificate wasn't propoerly base64 encoded (%s):\n%s" % (exc, content)) - - version = stem.util.str_tools._to_int(decoded[0:1]) + version = stem.util.str_tools._to_int(Ed25519Certificate._b64_decode(content)[0:1])
if version == 1: - return Ed25519CertificateV1(version, content, decoded) + return Ed25519CertificateV1(content) else: raise ValueError('Ed25519 certificate is version %i. Parser presently only supports version 1.' % version)
@@ -172,6 +164,18 @@ class Ed25519Certificate(object):
return _parse
+ @staticmethod + def _b64_decode(content): + try: + decoded = base64.b64decode(content) + + if not decoded: + raise TypeError('empty') + + return decoded + except (TypeError, binascii.Error) as exc: + raise ValueError("Ed25519 certificate wasn't propoerly base64 encoded (%s):\n%s" % (exc, content)) + def __str__(self): return '-----BEGIN ED25519 CERT-----\n%s\n-----END ED25519 CERT-----' % self.encoded
@@ -190,8 +194,9 @@ class Ed25519CertificateV1(Ed25519Certificate): :var bytes signature: certificate signature """
- def __init__(self, version, encoded, decoded): - super(Ed25519CertificateV1, self).__init__(version, encoded) + def __init__(self, content): + super(Ed25519CertificateV1, self).__init__(1, content) + decoded = Ed25519Certificate._b64_decode(content)
if len(decoded) < ED25519_HEADER_LENGTH + ED25519_SIGNATURE_LENGTH: raise ValueError('Ed25519 certificate was %i bytes, but should be at least %i' % (len(decoded), ED25519_HEADER_LENGTH + ED25519_SIGNATURE_LENGTH))