[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [stem/master] Accept string and hash digests
commit bdc96f01bf91c3f7758e12a58e5e388b88734ad9
Author: Damian Johnson <atagar@xxxxxxxxxxxxxx>
Date: Mon Feb 5 10:14:14 2018 -0800
Accept string and hash digests
The RELAY cells actually work from a truncated digest. Only the two ends know
the full sha1 digest for the message series that has been sent. Adjusting the
RelayCell so it takes all three forms that the digest comes in.
---
stem/client/cell.py | 12 ++++++++++++
test/unit/client/cell.py | 8 ++++++++
2 files changed, 20 insertions(+)
diff --git a/stem/client/cell.py b/stem/client/cell.py
index ed8932c4..17f27202 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -308,6 +308,18 @@ class RelayCell(CircuitCell):
IS_FIXED_SIZE = True
def __init__(self, circ_id, command, data, digest = 0, stream_id = 0):
+ if 'hashlib.HASH' in str(type(digest)):
+ # Unfortunately hashlib generates from a dynamic private class so
+ # isinstance() isn't such a great option.
+
+ digest = Size.LONG.unpack(digest.digest()[:4])
+ elif isinstance(digest, str):
+ digest = Size.LONG.unpack(digest[:4])
+ elif isinstance(digest, int):
+ pass
+ else:
+ raise ValueError('RELAY cell digest must be a hash, string, or int but was a %s' % type(digest).__name__)
+
super(RelayCell, self).__init__(circ_id)
self.command, self.command_int = RelayCommand.get(command)
self.data = data
diff --git a/test/unit/client/cell.py b/test/unit/client/cell.py
index f53355dd..19744c6d 100644
--- a/test/unit/client/cell.py
+++ b/test/unit/client/cell.py
@@ -3,6 +3,7 @@ Unit tests for the stem.client.cell.
"""
import datetime
+import hashlib
import os
import unittest
@@ -153,6 +154,13 @@ class TestCell(unittest.TestCase):
self.assertEqual(digest, cell.digest)
self.assertEqual(stream_id, cell.stream_id)
+ digest = hashlib.sha1('hi')
+ self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', digest, 564346860).digest)
+ self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', digest.digest(), 564346860).digest)
+ self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', 3257622417, 564346860).digest)
+ self.assertRaisesRegexp(ValueError, 'RELAY cell digest must be a hash, string, or int but was a list', RelayCell, 5, 'RELAY_BEGIN_DIR', '', [], 564346860)
+ 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) in DESTROY_CELLS.items():
self.assertEqual(cell_bytes, DestroyCell(circ_id, reason).pack(5))
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits