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

commit ba630119da869bf65f9c6f8bd8443f3041b7228c Author: Damian Johnson <atagar@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
participants (1)
-
atagar@torproject.org