[tor-commits] [stem/master] Use struct for integer => byte conversions

atagar at torproject.org atagar at torproject.org
Sun Oct 6 02:07:34 UTC 2019


commit ba630119da869bf65f9c6f8bd8443f3041b7228c
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Sep 22 17:11:55 2019 -0700

    Use struct for integer => byte conversions
    
    Neat! I didn't realize python 3.x added a to_bytes() method to the integer
    class. We can't use this just yet, but when we drop python 2.x support we will.
---
 stem/client/datatype.py        | 9 +++++++++
 stem/descriptor/hsv3_crypto.py | 8 +++++---
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/stem/client/datatype.py b/stem/client/datatype.py
index 59a0c167..fa393d30 100644
--- a/stem/client/datatype.py
+++ b/stem/client/datatype.py
@@ -381,6 +381,15 @@ class Size(Field):
       elif content < 0:
         raise ValueError('Packed values must be positive (attempted to pack %i as a %s)' % (content, self.name))
 
+    # TODO: When we drop python 2.x support this can be simplified via
+    # integer's to_bytes() method. For example...
+    #
+    #   struct.pack('>Q', my_number)
+    #
+    # ... is the same as...
+    #
+    #   my_number.to_bytes(8, 'big')
+
     try:
       packed = struct.pack(self.format, content)
     except struct.error:
diff --git a/stem/descriptor/hsv3_crypto.py b/stem/descriptor/hsv3_crypto.py
index 7c641363..1da07b1b 100644
--- a/stem/descriptor/hsv3_crypto.py
+++ b/stem/descriptor/hsv3_crypto.py
@@ -1,6 +1,8 @@
 import base64
 import binascii
 import hashlib
+import struct
+
 import stem.prereq
 
 # SHA3 requires Python 3.6+ *or* the pysha3 module...
@@ -166,8 +168,8 @@ def _ciphertext_mac_is_valid(key, salt, ciphertext, mac):
     raise ImportError(SHA3_ERROR_MSG % 'Hidden service validation')
 
   # Construct our own MAC first
-  key_len = len(key).to_bytes(8, 'big')
-  salt_len = len(salt).to_bytes(8, 'big')
+  key_len = struct.pack('>Q', len(key))
+  salt_len = struct.pack('>Q', len(salt))
 
   my_mac_body = b'%s%s%s%s%s' % (key_len, key, salt_len, salt, ciphertext)
   my_mac = hashlib.sha3_256(my_mac_body).digest()
@@ -204,7 +206,7 @@ def _decrypt_descriptor_layer(ciphertext_blob_b64, revision_counter, public_iden
   print('===')
 
   # INT_8(revision_counter)
-  rev_counter_int_8 = revision_counter.to_bytes(8, 'big')
+  rev_counter_int_8 = struct.pack('>Q', revision_counter)
   secret_input = b'%s%s%s' % (secret_data, subcredential, rev_counter_int_8)
   secret_input = secret_input
 





More information about the tor-commits mailing list