commit 7eb31ce4acfe000d475a76b0b6ea21187fabfed4
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sat Jun 23 12:17:21 2018 -0700
Adjust to use new 'unused' attribute
Great catch. Just adjusting this to populate the 'unused' attribute I added.
---
stem/client/cell.py | 37 +++++++++++++++----------------------
test/unit/client/cell.py | 33 ++++++++++++++++-----------------
2 files changed, 31 insertions(+), 39 deletions(-)
diff --git a/stem/client/cell.py b/stem/client/cell.py
index 756788e9..f000347d 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -392,8 +392,8 @@ class DestroyCell(CircuitCell):
VALUE = 4
IS_FIXED_SIZE = True
- def __init__(self, circ_id, reason = CloseReason.NONE):
- super(DestroyCell, self).__init__(circ_id)
+ def __init__(self, circ_id, reason = CloseReason.NONE, unused = b''):
+ super(DestroyCell, self).__init__(circ_id, unused)
self.reason, self.reason_int = CloseReason.get(reason)
def pack(self, link_protocol):
@@ -401,11 +401,8 @@ class DestroyCell(CircuitCell):
@classmethod
def _unpack(cls, content, circ_id, link_protocol):
- reason, _ = Size.CHAR.pop(content)
-
- # remaining content (if any) is thrown out (ignored)
-
- return DestroyCell(circ_id, reason)
+ reason, unused = Size.CHAR.pop(content)
+ return DestroyCell(circ_id, reason, unused)
def __hash__(self):
return _hash_attr(self, 'circ_id', 'reason_int')
@@ -423,13 +420,13 @@ class CreateFastCell(CircuitCell):
VALUE = 5
IS_FIXED_SIZE = True
- def __init__(self, circ_id, key_material = None):
+ def __init__(self, circ_id, key_material = None, unused = b''):
if not key_material:
key_material = os.urandom(HASH_LEN)
elif len(key_material) != HASH_LEN:
raise ValueError('Key material should be %i bytes, but was %i' % (HASH_LEN, len(key_material)))
- super(CreateFastCell, self).__init__(circ_id)
+ super(CreateFastCell, self).__init__(circ_id, unused)
self.key_material = key_material
def pack(self, link_protocol):
@@ -437,14 +434,12 @@ class CreateFastCell(CircuitCell):
@classmethod
def _unpack(cls, content, circ_id, link_protocol):
- key_material, _ = split(content, HASH_LEN)
-
- # remaining content (if any) is thrown out (ignored)
+ key_material, unused = split(content, HASH_LEN)
if len(key_material) != HASH_LEN:
raise ValueError('Key material should be %i bytes, but was %i' % (HASH_LEN, len(key_material)))
- return CreateFastCell(circ_id, key_material)
+ return CreateFastCell(circ_id, key_material, unused)
def __hash__(self):
return _hash_attr(self, 'circ_id', 'key_material')
@@ -462,7 +457,7 @@ class CreatedFastCell(CircuitCell):
VALUE = 6
IS_FIXED_SIZE = True
- def __init__(self, circ_id, derivative_key, key_material = None):
+ def __init__(self, circ_id, derivative_key, key_material = None, unused = b''):
if not key_material:
key_material = os.urandom(HASH_LEN)
elif len(key_material) != HASH_LEN:
@@ -471,7 +466,7 @@ class CreatedFastCell(CircuitCell):
if len(derivative_key) != HASH_LEN:
raise ValueError('Derivatived key should be %i bytes, but was %i' % (HASH_LEN, len(derivative_key)))
- super(CreatedFastCell, self).__init__(circ_id)
+ super(CreatedFastCell, self).__init__(circ_id, unused)
self.key_material = key_material
self.derivative_key = derivative_key
@@ -480,15 +475,13 @@ class CreatedFastCell(CircuitCell):
@classmethod
def _unpack(cls, content, circ_id, link_protocol):
- content_to_parse, _ = split(content, HASH_LEN * 2)
-
- # remaining content (if any) is thrown out (ignored)
+ if len(content) < HASH_LEN * 2:
+ raise ValueError('Key material and derivatived key should be %i bytes, but was %i' % (HASH_LEN * 2, len(content)))
- if len(content_to_parse) != HASH_LEN * 2:
- raise ValueError('Key material and derivatived key should be %i bytes, but was %i' % (HASH_LEN * 2, len(content_to_parse)))
+ key_material, content = split(content, HASH_LEN)
+ derivative_key, content = split(content, HASH_LEN)
- key_material, derivative_key = split(content_to_parse, HASH_LEN)
- return CreatedFastCell(circ_id, derivative_key, key_material)
+ return CreatedFastCell(circ_id, derivative_key, key_material, content)
def __hash__(self):
return _hash_attr(self, 'circ_id', 'derivative_key', 'key_material')
diff --git a/test/unit/client/cell.py b/test/unit/client/cell.py
index 7b5695a2..93468318 100644
--- a/test/unit/client/cell.py
+++ b/test/unit/client/cell.py
@@ -39,9 +39,9 @@ RELAY_CELLS = {
}
DESTROY_CELLS = {
- b'\x80\x00\x00\x00\x04\x00' + ZERO * 508: (2147483648, CloseReason.NONE, 0, True, True),
- b'\x80\x00\x00\x00\x04\x03' + ZERO * 508: (2147483648, CloseReason.REQUESTED, 3, True, True),
- b'\x80\x00\x00\x00\x04\x01' + b'\x01' + ZERO * 507: (2147483648, CloseReason.PROTOCOL, 1, True, False),
+ b'\x80\x00\x00\x00\x04\x00' + ZERO * 508: (2147483648, CloseReason.NONE, 0, ZERO * 508),
+ b'\x80\x00\x00\x00\x04\x03' + ZERO * 508: (2147483648, CloseReason.REQUESTED, 3, ZERO * 508),
+ b'\x80\x00\x00\x00\x04\x01' + b'\x01' + ZERO * 507: (2147483648, CloseReason.PROTOCOL, 1, b'\x01' + ZERO * 507),
}
CREATE_FAST_CELLS = {
@@ -189,7 +189,7 @@ class TestCell(unittest.TestCase):
self.assertEqual(data, cell.data)
self.assertEqual(digest, cell.digest)
self.assertEqual(stream_id, cell.stream_id)
- self.assertEqual(b'\x00' * (498 - len(cell.data)), cell.unused)
+ self.assertEqual(ZERO * (498 - len(cell.data)), cell.unused)
digest = hashlib.sha1(b'hi')
self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', digest, 564346860).digest)
@@ -199,20 +199,19 @@ class TestCell(unittest.TestCase):
self.assertRaisesRegexp(ValueError, "Invalid enumeration 'NO_SUCH_COMMAND', options are RELAY_BEGIN, RELAY_DATA", RelayCell, 5, 'NO_SUCH_COMMAND', '', 5, 564346860)
def test_destroy_cell(self):
- for cell_bytes, (circ_id, reason, reason_int, test_unpack, test_recreate_exactly) in DESTROY_CELLS.items():
- if test_recreate_exactly:
+ for cell_bytes, (circ_id, reason, reason_int, unused) in DESTROY_CELLS.items():
+ # Packed cells always pad with zeros, so if we're testing something with
+ # non-zero padding then skip this check.
+
+ if not unused.strip(ZERO):
self.assertEqual(cell_bytes, DestroyCell(circ_id, reason).pack(5))
self.assertEqual(cell_bytes, DestroyCell(circ_id, reason_int).pack(5))
- if test_unpack:
- cell = Cell.pop(cell_bytes, 5)[0]
- self.assertEqual(circ_id, cell.circ_id)
- self.assertEqual(reason, cell.reason)
- self.assertEqual(reason_int, cell.reason_int)
- self.assertEqual(b'', cell.unused)
-
- if not any((test_unpack, test_recreate_exactly)):
- self.fail('Must test something!')
+ cell = Cell.pop(cell_bytes, 5)[0]
+ self.assertEqual(circ_id, cell.circ_id)
+ self.assertEqual(reason, cell.reason)
+ self.assertEqual(reason_int, cell.reason_int)
+ self.assertEqual(unused, cell.unused)
def test_create_fast_cell(self):
for cell_bytes, (circ_id, key_material) in CREATE_FAST_CELLS.items():
@@ -221,7 +220,7 @@ class TestCell(unittest.TestCase):
cell = Cell.pop(cell_bytes, 5)[0]
self.assertEqual(circ_id, cell.circ_id)
self.assertEqual(key_material, cell.key_material)
- self.assertEqual(b'', cell.unused)
+ self.assertEqual(ZERO * 489, cell.unused)
self.assertRaisesRegexp(ValueError, 'Key material should be 20 bytes, but was 3', CreateFastCell, 5, 'boo')
@@ -233,7 +232,7 @@ class TestCell(unittest.TestCase):
self.assertEqual(circ_id, cell.circ_id)
self.assertEqual(key_material, cell.key_material)
self.assertEqual(derivative_key, cell.derivative_key)
- self.assertEqual(b'', cell.unused)
+ self.assertEqual(ZERO * 469, cell.unused)
self.assertRaisesRegexp(ValueError, 'Key material should be 20 bytes, but was 3', CreateFastCell, 5, 'boo')