[tor-commits] [stem/master] Add apply_digest instance method to RelayCell

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


commit 8023618ea74b4fb7b2cb1fca1694f6bff412b45a
Author: Dave Rolek <dmr-x at riseup.net>
Date:   Fri Aug 10 20:59:04 2018 +0000

    Add apply_digest instance method to RelayCell
    
    This method - currently unused - allows moving some of the
    digest-application logic into the Cell abstraction layer.
    
    It is a bit weird for it to have side-effects on a parameter (digest),
    but it's documented and works fairly logically.
---
 stem/client/cell.py | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/stem/client/cell.py b/stem/client/cell.py
index 39a729f1..c1751ed6 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -456,6 +456,35 @@ class RelayCell(CircuitCell):
 
     return command, recognized, stream_id, digest, data_len, data, unused
 
+  def apply_digest(self, digest, prep_cell = True):
+    """
+    Calculates, updates, and applies the digest to the cell payload.
+
+    :param HASH digest: running digest held with the relay
+    :param bool prep_cell: preps the cell payload according to the spec, if **True** (default)
+      if **False**, the digest will be calculated as-is, namely:
+        the 'recognized' field will not be set to 0,
+        the digest field will not be set to 0,
+        and any 'unused' padding will be taken as-is.
+      Use with caution.
+
+    :sideeffect digest: this object will be updated via digest.update(payload)
+    :sideeffect self.recognized: this will be set to 0, if prep_cell is **True**
+    :sideeffect self.digest: this will be updated with the calculated digest
+    :sideeffect self.unused: this will be treated as padding and overwritten, if prep_cell is **True**
+    """
+
+    if prep_cell:
+      self.recognized = 0
+      self.digest = 0
+      self.unused = b''
+
+    payload_without_updated_digest = self.pack_payload()
+    digest.update(payload_without_updated_digest)
+    self.digest = RelayCell._coerce_digest(digest)
+
+    return
+
   def pack_payload(self, **kwargs):
     """
     Convenience method for running _pack_payload on self.





More information about the tor-commits mailing list