commit 9c5e228ef67f7f6dc71a927296c973fd5bcb8960 Author: Damian Johnson atagar@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
tor-commits@lists.torproject.org