[tor-commits] [stem/master] Reduce Ed25519CertificateV1 constructor arguments

atagar at torproject.org atagar at torproject.org
Sun Nov 17 23:40:39 UTC 2019


commit ed496353ea2b176128ddec9e80294ca2ffb10fae
Author: Damian Johnson <atagar at 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))





More information about the tor-commits mailing list