[tor-commits] [stem/master] Add CANNOT_DIRECTLY_UNPACK facility; set True for existing RelayCell

atagar at torproject.org atagar at torproject.org
Sun Aug 26 20:49:21 UTC 2018


commit 77310c9cb96c0367412afbc6535ea54fe25fc442
Author: Dave Rolek <dmr-x at riseup.net>
Date:   Tue Aug 7 21:45:26 2018 +0000

    Add CANNOT_DIRECTLY_UNPACK facility; set True for existing RelayCell
    
    Since RELAY cells come across the wire encrypted, they cannot be
    directly unpacked - their payload must first be decrypted.
    
    Note that this breaks unpacking RelayCell in the interim.
---
 stem/client/cell.py      | 5 +++--
 test/unit/client/cell.py | 2 ++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/stem/client/cell.py b/stem/client/cell.py
index a4fb1a67..dcebc544 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -109,7 +109,7 @@ class Cell(object):
     """
 
     for _, cls in inspect.getmembers(sys.modules[__name__]):
-      if name == getattr(cls, 'NAME', UNDEFINED):
+      if name == getattr(cls, 'NAME', UNDEFINED) and not getattr(cls, 'CANNOT_DIRECTLY_UNPACK', False):
         return cls
 
     raise ValueError("'%s' isn't a valid cell type" % name)
@@ -125,7 +125,7 @@ class Cell(object):
     """
 
     for _, cls in inspect.getmembers(sys.modules[__name__]):
-      if value == getattr(cls, 'VALUE', UNDEFINED):
+      if value == getattr(cls, 'VALUE', UNDEFINED) and not getattr(cls, 'CANNOT_DIRECTLY_UNPACK', False):
         return cls
 
     raise ValueError("'%s' isn't a valid cell value" % value)
@@ -371,6 +371,7 @@ class RelayCell(CircuitCell):
   NAME = 'RELAY'
   VALUE = 3
   IS_FIXED_SIZE = True
+  CANNOT_DIRECTLY_UNPACK = True
 
   def __init__(self, circ_id, command, data, digest = 0, stream_id = 0, recognized = 0, unused = b''):
     if 'HASH' in str(type(digest)):
diff --git a/test/unit/client/cell.py b/test/unit/client/cell.py
index a6ddf3ea..b8fe58df 100644
--- a/test/unit/client/cell.py
+++ b/test/unit/client/cell.py
@@ -220,6 +220,8 @@ class TestCell(unittest.TestCase):
       self.assertRaisesWith(ValueError, expected_message_format % payload_len, BaseRelayCell, arbitrary_circ_id, ZERO * payload_len)
 
   def test_relay_cell(self):
+    self.assertEquals(True, RelayCell.CANNOT_DIRECTLY_UNPACK)
+
     for cell_bytes, (command, command_int, circ_id, stream_id, data, digest, unused, link_protocol) in RELAY_CELLS.items():
       if not unused.strip(ZERO):
         self.assertEqual(cell_bytes, RelayCell(circ_id, command, data, digest, stream_id).pack(link_protocol))





More information about the tor-commits mailing list