[tor-commits] [stem/master] Support CERTS cell packing

atagar at torproject.org atagar at torproject.org
Sun Jan 21 02:04:04 UTC 2018


commit 9c5e228ef67f7f6dc71a927296c973fd5bcb8960
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jan 14 11:08:48 2018 -0800

    Support CERTS cell packing
---
 stem/client/cell.py      | 24 +++++++++++++++++++++++-
 test/unit/client/cell.py | 28 ++++++++++++++--------------
 2 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/stem/client/cell.py b/stem/client/cell.py
index e3793491..73c1c8f2 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -37,6 +37,7 @@ Messages communicated over a Tor relay's ORPort.
 """
 
 import inspect
+import io
 import sys
 
 from stem import UNDEFINED
@@ -278,7 +279,7 @@ class VersionsCell(Cell):
     # since VERSION cells avoid most version dependent attributes.
 
     payload = b''.join([Size.SHORT.pack(v) for v in versions])
-    return cls._pack(3, payload)
+    return cls._pack(2, payload)
 
   @classmethod
   def _unpack(cls, content, circ_id, link_version):
@@ -342,6 +343,27 @@ class CertsCell(Cell):
     self.certificates = certs
 
   @classmethod
+  def pack(cls, certs, link_version):
+    """
+    Provides the payload for a series of certificates.
+
+    :param list certs: series of :class:`~stem.client.Certificate` for the cell
+    :param int link_version: link protocol version
+
+    :returns: **bytes** with a payload for these versions
+    """
+
+    payload = io.BytesIO()
+    payload.write(Size.CHAR.pack(len(certs)))
+
+    for cert in certs:
+      payload.write(Size.CHAR.pack(cert.type))
+      payload.write(Size.SHORT.pack(len(cert.value)))
+      payload.write(cert.value)
+
+    return cls._pack(link_version, payload.getvalue())
+
+  @classmethod
   def _unpack(cls, content, circ_id, link_version):
     cert_count, content = Size.CHAR.pop(content)
     certs = []
diff --git a/test/unit/client/cell.py b/test/unit/client/cell.py
index 40b09d95..b26549e2 100644
--- a/test/unit/client/cell.py
+++ b/test/unit/client/cell.py
@@ -5,7 +5,7 @@ Unit tests for the stem.client.cell.
 import unittest
 
 from stem.client import Certificate
-from stem.client.cell import Cell, VersionsCell
+from stem.client.cell import Cell, VersionsCell, CertsCell
 from test.unit.client import test_data
 
 VERSIONS_CELLS = {
@@ -14,6 +14,12 @@ VERSIONS_CELLS = {
   '\x00\x00\x07\x00\x06\x00\x01\x00\x02\x00\x03': [1, 2, 3],
 }
 
+CERTS_CELLS = {
+  '\x00\x00\x81\x00\x01\x00': [],
+  '\x00\x00\x81\x00\x04\x01\x01\x00\x00': [Certificate(type = 1, value = '')],
+  '\x00\x00\x81\x00\x05\x01\x01\x00\x01\x08': [Certificate(type = 1, value = '\x08')],
+}
+
 
 class TestCell(unittest.TestCase):
   def test_by_name(self):
@@ -45,19 +51,13 @@ class TestCell(unittest.TestCase):
 
   def test_versions_packing(self):
     for cell_bytes, versions in VERSIONS_CELLS.items():
-      packed = VersionsCell.pack(versions)
-      self.assertEqual(cell_bytes, packed)
-      self.assertEqual(versions, Cell.unpack(packed, 2)[0].versions)
-
-  def test_certs_unpack(self):
-    test_data = {
-      '\x00\x00\x81\x00\x01\x00': [],
-      '\x00\x00\x81\x00\x04\x01\x01\x00\x00': [Certificate(type = 1, value = '')],
-      '\x00\x00\x81\x00\x05\x01\x01\x00\x01\x08': [Certificate(type = 1, value = '\x08')],
-    }
-
-    for cell_bytes, expected in test_data.items():
-      self.assertEqual(expected, Cell.unpack(cell_bytes, 2)[0].certificates)
+      self.assertEqual(cell_bytes, VersionsCell.pack(versions))
+      self.assertEqual(versions, Cell.unpack(cell_bytes, 2)[0].versions)
+
+  def test_certs_packing(self):
+    for cell_bytes, certs in CERTS_CELLS.items():
+      self.assertEqual(cell_bytes, CertsCell.pack(certs, 2))
+      self.assertEqual(certs, Cell.unpack(cell_bytes, 2)[0].certificates)
 
     # extra bytes after the last certificate should be ignored
 





More information about the tor-commits mailing list