tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 5c88bea84c3535ed908d51d2ed2e9beaa58ee607
parent 933e4b4788982d35414d5ecfe54a94479513b136
Author: Mike Perry <mikeperry-git@torproject.org>
Date:   Thu, 17 Feb 2022 00:04:41 +0000

Add test for circuit_sendme_cell_is_next() when sendme_inc is 100.

This ensures compatibility with old tor.

Diffstat:
Msrc/core/or/sendme.c | 2+-
Msrc/core/or/sendme.h | 2++
Msrc/test/test_sendme.c | 25+++++++++++++++++++++++++
3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/core/or/sendme.c b/src/core/or/sendme.c @@ -338,7 +338,7 @@ record_cell_digest_on_circ(circuit_t *circ, const uint8_t *sendme_digest) * low in the stack when decrypting or encrypting a cell. The window is only * updated once the cell is actually put in the outbuf. */ -static bool +STATIC bool circuit_sendme_cell_is_next(int deliver_window, int sendme_inc) { /* Are we at the limit of the increment and if not, we don't expect next diff --git a/src/core/or/sendme.h b/src/core/or/sendme.h @@ -73,6 +73,8 @@ STATIC ssize_t build_cell_payload_v1(const uint8_t *cell_digest, STATIC bool sendme_is_valid(const circuit_t *circ, const uint8_t *cell_payload, size_t cell_payload_len); +STATIC bool circuit_sendme_cell_is_next(int deliver_window, + int sendme_inc); #endif /* defined(TOR_UNIT_TESTS) */ diff --git a/src/test/test_sendme.c b/src/test/test_sendme.c @@ -348,6 +348,30 @@ test_package_payload_len(void *arg) tor_free(c); } +/* Check that circuit_sendme_is_next works with a window of 1000, + * and a sendme_inc of 100 (old school tor compat) */ +static void +test_sendme_is_next1000(void *arg) +{ + (void)arg; + tt_int_op(circuit_sendme_cell_is_next(1000, 100), OP_EQ, 0); + tt_int_op(circuit_sendme_cell_is_next(999, 100), OP_EQ, 0); + tt_int_op(circuit_sendme_cell_is_next(901, 100), OP_EQ, 1); + + tt_int_op(circuit_sendme_cell_is_next(900, 100), OP_EQ, 0); + tt_int_op(circuit_sendme_cell_is_next(899, 100), OP_EQ, 0); + tt_int_op(circuit_sendme_cell_is_next(801, 100), OP_EQ, 1); + + tt_int_op(circuit_sendme_cell_is_next(101, 100), OP_EQ, 1); + tt_int_op(circuit_sendme_cell_is_next(100, 100), OP_EQ, 0); + tt_int_op(circuit_sendme_cell_is_next(99, 100), OP_EQ, 0); + tt_int_op(circuit_sendme_cell_is_next(1, 100), OP_EQ, 1); + tt_int_op(circuit_sendme_cell_is_next(0, 100), OP_EQ, 0); + +done: + ; +} + struct testcase_t sendme_tests[] = { { "v1_record_digest", test_v1_record_digest, TT_FORK, NULL, NULL }, @@ -360,6 +384,7 @@ struct testcase_t sendme_tests[] = { { "cell_version_validation", test_cell_version_validation, TT_FORK, NULL, NULL }, { "package_payload_len", test_package_payload_len, 0, NULL, NULL }, + { "sendme_is_next1000", test_sendme_is_next1000, 0, NULL, NULL }, END_OF_TESTCASES };