Merge branch 'maint-0.4.8'
[tor.git] / src / test / test_channelpadding.c
blob63c9a3b7535e0cf35588a026407ee2e41cf77ff0
1 /* Copyright (c) 2016-2021, The Tor Project, Inc. */
2 /* See LICENSE for licensing information */
4 #define CHANNEL_OBJECT_PRIVATE
5 #define MAINLOOP_PRIVATE
6 #define NETWORKSTATUS_PRIVATE
7 #define TOR_TIMERS_PRIVATE
8 #include "core/or/or.h"
9 #include "test/test.h"
10 #include "lib/testsupport/testsupport.h"
11 #include "core/mainloop/connection.h"
12 #include "core/or/connection_or.h"
13 #include "core/or/channel.h"
14 #include "core/or/channeltls.h"
15 #include "core/or/channelpadding.h"
16 #include "lib/evloop/compat_libevent.h"
17 #include "app/config/config.h"
18 #include "lib/time/compat_time.h"
19 #include "core/mainloop/mainloop.h"
20 #include "feature/nodelist/networkstatus.h"
21 #include "test/log_test_helpers.h"
22 #include "lib/tls/tortls.h"
23 #include "lib/evloop/timers.h"
24 #include "lib/buf/buffers.h"
26 #include "core/or/cell_st.h"
27 #include "feature/nodelist/networkstatus_st.h"
28 #include "core/or/or_connection_st.h"
29 #include "feature/nodelist/routerstatus_st.h"
31 int channelpadding_get_netflow_inactive_timeout_ms(channel_t *chan);
32 int64_t channelpadding_compute_time_until_pad_for_netflow(channel_t *chan);
33 int channelpadding_send_disable_command(channel_t*);
34 int channelpadding_find_timerslot(channel_t *chan);
36 void test_channelpadding_timers(void *arg);
37 void test_channelpadding_consensus(void *arg);
38 void test_channelpadding_negotiation(void *arg);
39 void test_channelpadding_decide_to_pad_channel(void *arg);
40 void test_channelpadding_killonehop(void *arg);
42 void dummy_nop_timer(void);
44 #define NSEC_PER_MSEC (1000*1000)
46 /* Thing to cast to fake tor_tls_t * to appease assert_connection_ok() */
47 static int fake_tortls = 0; /* Bleh... */
49 static int dont_stop_libevent = 0;
51 // From test_channel.c
52 channel_t * new_fake_channel(void);
53 void free_fake_channel(channel_t*);
55 static int
56 mock_channel_has_queued_writes(channel_t *chan)
58 (void)chan;
59 return 0;
62 static int tried_to_write_cell = 0;
64 static channel_t *relay1_relay2;
65 static channel_t *relay2_relay1;
66 static channel_t *relay3_client;
67 static channel_t *client_relay3;
69 static int
70 mock_channel_write_cell_relay2(channel_t *chan, cell_t *cell)
72 (void)chan;
73 tried_to_write_cell++;
74 channel_tls_handle_cell(cell, ((channel_tls_t*)relay1_relay2)->conn);
75 tor_libevent_exit_loop_after_callback(tor_libevent_get_base());
76 return 0;
79 static int
80 mock_channel_write_cell_relay1(channel_t *chan, cell_t *cell)
82 (void)chan;
83 tried_to_write_cell++;
84 channel_tls_handle_cell(cell, ((channel_tls_t*)relay2_relay1)->conn);
85 tor_libevent_exit_loop_after_callback(tor_libevent_get_base());
86 return 0;
89 static int
90 mock_channel_write_cell_relay3(channel_t *chan, cell_t *cell)
92 (void)chan;
93 tried_to_write_cell++;
94 channel_tls_handle_cell(cell, ((channel_tls_t*)client_relay3)->conn);
95 tor_libevent_exit_loop_after_callback(tor_libevent_get_base());
96 return 0;
99 static int
100 mock_channel_write_cell_client(channel_t *chan, cell_t *cell)
102 (void)chan;
103 tried_to_write_cell++;
104 channel_tls_handle_cell(cell, ((channel_tls_t*)relay3_client)->conn);
105 tor_libevent_exit_loop_after_callback(tor_libevent_get_base());
106 return 0;
109 static int
110 mock_channel_write_cell(channel_t *chan, cell_t *cell)
112 tried_to_write_cell++;
113 channel_tls_handle_cell(cell, ((channel_tls_t*)chan)->conn);
114 if (!dont_stop_libevent)
115 tor_libevent_exit_loop_after_callback(tor_libevent_get_base());
116 return 0;
119 static void
120 setup_fake_connection_for_channel(channel_tls_t *chan)
122 or_connection_t *conn = (or_connection_t*)connection_new(CONN_TYPE_OR,
123 AF_INET);
125 conn->base_.conn_array_index = smartlist_len(connection_array);
126 smartlist_add(connection_array, conn);
128 conn->chan = chan;
129 chan->conn = conn;
131 conn->base_.magic = OR_CONNECTION_MAGIC;
132 conn->base_.state = OR_CONN_STATE_OPEN;
133 conn->base_.type = CONN_TYPE_OR;
134 conn->base_.socket_family = AF_INET;
135 conn->base_.address = tor_strdup("<fake>");
137 conn->base_.port = 4242;
139 conn->tls = (tor_tls_t *)((void *)(&fake_tortls));
141 conn->link_proto = MIN_LINK_PROTO_FOR_CHANNEL_PADDING;
143 connection_or_set_canonical(conn, 1);
146 static channel_tls_t *
147 new_fake_channeltls(uint8_t id)
149 channel_tls_t *chan = tor_realloc(new_fake_channel(), sizeof(channel_tls_t));
150 chan->base_.magic = TLS_CHAN_MAGIC;
151 setup_fake_connection_for_channel(chan);
152 chan->base_.channel_usage = CHANNEL_USED_FOR_FULL_CIRCS;
153 chan->base_.has_queued_writes = mock_channel_has_queued_writes;
154 chan->base_.write_cell = mock_channel_write_cell;
155 chan->base_.padding_enabled = 1;
157 chan->base_.identity_digest[0] = id;
158 channel_register(&chan->base_);
160 return chan;
163 static void
164 free_fake_channeltls(channel_tls_t *chan)
166 channel_unregister(&chan->base_);
168 tor_free(((channel_tls_t*)chan)->conn->base_.address);
169 buf_free(((channel_tls_t*)chan)->conn->base_.inbuf);
170 buf_free(((channel_tls_t*)chan)->conn->base_.outbuf);
171 tor_free(((channel_tls_t*)chan)->conn);
173 timer_free(chan->base_.padding_timer);
174 channel_handle_free(chan->base_.timer_handle);
175 channel_handles_clear(&chan->base_);
177 free_fake_channel(&chan->base_);
179 return;
182 static void
183 setup_mock_consensus(void)
185 current_md_consensus = current_ns_consensus
186 = tor_malloc_zero(sizeof(networkstatus_t));
187 current_md_consensus->net_params = smartlist_new();
188 current_md_consensus->routerstatus_list = smartlist_new();
189 channelpadding_new_consensus_params(current_md_consensus);
192 static void
193 free_mock_consensus(void)
195 SMARTLIST_FOREACH(current_md_consensus->routerstatus_list, void *, r,
196 tor_free(r));
197 smartlist_free(current_md_consensus->routerstatus_list);
198 smartlist_free(current_ns_consensus->net_params);
199 tor_free(current_ns_consensus);
202 static void
203 setup_mock_network(void)
205 routerstatus_t *relay;
206 if (!connection_array)
207 connection_array = smartlist_new();
209 relay1_relay2 = (channel_t*)new_fake_channeltls(2);
210 relay1_relay2->write_cell = mock_channel_write_cell_relay1;
211 channel_timestamp_active(relay1_relay2);
212 relay = tor_malloc_zero(sizeof(routerstatus_t));
213 relay->identity_digest[0] = 1;
214 smartlist_add(current_md_consensus->routerstatus_list, relay);
216 relay2_relay1 = (channel_t*)new_fake_channeltls(1);
217 relay2_relay1->write_cell = mock_channel_write_cell_relay2;
218 channel_timestamp_active(relay2_relay1);
219 relay = tor_malloc_zero(sizeof(routerstatus_t));
220 relay->identity_digest[0] = 2;
221 smartlist_add(current_md_consensus->routerstatus_list, relay);
223 relay3_client = (channel_t*)new_fake_channeltls(0);
224 relay3_client->write_cell = mock_channel_write_cell_relay3;
225 relay3_client->is_client = 1;
226 channel_timestamp_active(relay3_client);
227 relay = tor_malloc_zero(sizeof(routerstatus_t));
228 relay->identity_digest[0] = 3;
229 smartlist_add(current_md_consensus->routerstatus_list, relay);
231 client_relay3 = (channel_t*)new_fake_channeltls(3);
232 client_relay3->write_cell = mock_channel_write_cell_client;
233 channel_timestamp_active(client_relay3);
235 channel_do_open_actions(relay1_relay2);
236 channel_do_open_actions(relay2_relay1);
237 channel_do_open_actions(relay3_client);
238 channel_do_open_actions(client_relay3);
241 static void
242 free_mock_network(void)
244 free_fake_channeltls((channel_tls_t*)relay1_relay2);
245 free_fake_channeltls((channel_tls_t*)relay2_relay1);
246 free_fake_channeltls((channel_tls_t*)relay3_client);
247 free_fake_channeltls((channel_tls_t*)client_relay3);
249 smartlist_free(connection_array);
252 static void
253 dummy_timer_cb(tor_timer_t *t, void *arg, const monotime_t *now_mono)
255 (void)t; (void)arg; (void)now_mono;
256 tor_libevent_exit_loop_after_callback(tor_libevent_get_base());
257 return;
260 // This hack adds a dummy timer so that the libevent base loop
261 // actually returns when we don't expect any timers to fire. Otherwise,
262 // the global_timer_event gets scheduled an hour from now, and the
263 // base loop never returns.
264 void
265 dummy_nop_timer(void)
267 tor_timer_t *dummy_timer = timer_new(dummy_timer_cb, NULL);
268 struct timeval timeout;
269 timeout.tv_sec = 1;
270 timeout.tv_usec = 0;
272 timer_schedule(dummy_timer, &timeout);
274 tor_libevent_run_event_loop(tor_libevent_get_base(), 0);
276 timer_free(dummy_timer);
279 #define CHANNELPADDING_MAX_TIMERS 25
280 #define CHANNELS_TO_TEST (CHANNELPADDING_MAX_TIMERS*4)
282 * Tests to ensure that we handle more than the max number of pending
283 * timers properly.
285 void
286 test_channelpadding_timers(void *arg)
288 channelpadding_decision_t decision;
289 channel_t *chans[CHANNELS_TO_TEST];
290 (void)arg;
292 if (!connection_array)
293 connection_array = smartlist_new();
295 monotime_init();
296 monotime_enable_test_mocking();
297 uint64_t nsec_mock = 1;
298 monotime_set_mock_time_nsec(nsec_mock);
299 monotime_coarse_set_mock_time_nsec(nsec_mock);
301 timers_initialize();
302 channelpadding_new_consensus_params(NULL);
304 for (int i = 0; i < CHANNELS_TO_TEST; i++) {
305 chans[i] = (channel_t*)new_fake_channeltls(0);
306 channel_timestamp_active(chans[i]);
309 for (int j = 0; j < 2; j++) {
310 tried_to_write_cell = 0;
311 int i = 0;
313 monotime_coarse_t now;
314 monotime_coarse_get(&now);
316 /* This loop fills our timerslot array with timers of increasing time
317 * until they fire */
318 for (; i < CHANNELPADDING_MAX_TIMERS; i++) {
319 monotime_coarse_add_msec(&chans[i]->next_padding_time,
320 &now, 10 + i*4);
321 decision = channelpadding_decide_to_pad_channel(chans[i]);
322 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
323 tt_assert(chans[i]->pending_padding_callback);
324 tt_int_op(tried_to_write_cell, OP_EQ, 0);
327 /* This loop should add timers to the first position in the timerslot
328 * array, since its timeout is before all other timers. */
329 for (; i < CHANNELS_TO_TEST/3; i++) {
330 monotime_coarse_add_msec(&chans[i]->next_padding_time,
331 &now, 1);
332 decision = channelpadding_decide_to_pad_channel(chans[i]);
333 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
334 tt_assert(chans[i]->pending_padding_callback);
335 tt_int_op(tried_to_write_cell, OP_EQ, 0);
338 /* This loop should add timers to our existing lists in a weak
339 * pseudorandom pattern. It ensures that the lists can grow with multiple
340 * timers in them. */
341 for (; i < CHANNELS_TO_TEST/2; i++) {
342 monotime_coarse_add_msec(&chans[i]->next_padding_time,
343 &now, 10 + i*3 % CHANNELPADDING_MAX_TIMERS);
344 decision = channelpadding_decide_to_pad_channel(chans[i]);
345 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
346 tt_assert(chans[i]->pending_padding_callback);
347 tt_int_op(tried_to_write_cell, OP_EQ, 0);
350 /* This loop should add timers to the last position in the timerslot
351 * array, since its timeout is after all other timers. */
352 for (; i < CHANNELS_TO_TEST; i++) {
353 monotime_coarse_add_msec(&chans[i]->next_padding_time,
354 &now, 500 + i % CHANNELPADDING_MAX_TIMERS);
355 decision = channelpadding_decide_to_pad_channel(chans[i]);
356 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
357 tt_assert(chans[i]->pending_padding_callback);
358 tt_int_op(tried_to_write_cell, OP_EQ, 0);
361 // Wait for the timers and then kill the event loop.
362 nsec_mock += 1001 * NSEC_PER_MSEC;
363 monotime_coarse_set_mock_time_nsec(nsec_mock);
364 monotime_set_mock_time_nsec(nsec_mock);
365 timers_run_pending();
367 tt_int_op(tried_to_write_cell, OP_EQ, CHANNELS_TO_TEST);
369 // Test that we have no pending callbacks and all empty slots now
370 for (i = 0; i < CHANNELS_TO_TEST; i++) {
371 tt_assert(!chans[i]->pending_padding_callback);
375 done:
376 for (int i = 0; i < CHANNELS_TO_TEST; i++) {
377 free_fake_channeltls((channel_tls_t*)chans[i]);
379 smartlist_free(connection_array);
381 timers_shutdown();
382 monotime_disable_test_mocking();
383 channel_free_all();
385 return;
388 void
389 test_channelpadding_killonehop(void *arg)
391 channelpadding_decision_t decision;
392 int64_t new_time;
393 (void)arg;
395 routerstatus_t *relay = tor_malloc_zero(sizeof(routerstatus_t));
396 monotime_init();
397 monotime_enable_test_mocking();
398 monotime_set_mock_time_nsec(1);
399 monotime_coarse_set_mock_time_nsec(1);
400 new_time = 1;
402 timers_initialize();
403 setup_mock_consensus();
404 setup_mock_network();
406 /* Do we disable padding if rsos is enabled, and the consensus says don't
407 * pad? */
409 monotime_coarse_t now;
410 monotime_coarse_get(&now);
412 // First, test that padding works if either is enabled
413 smartlist_clear(current_md_consensus->net_params);
414 channelpadding_new_consensus_params(current_md_consensus);
416 relay3_client->padding_enabled = 1;
417 client_relay3->padding_enabled = 1;
419 tried_to_write_cell = 0;
420 get_options_mutable()->ORPort_set = 0;
421 get_options_mutable()->HiddenServiceSingleHopMode = 1;
422 get_options_mutable()->HiddenServiceNonAnonymousMode = 1;
424 monotime_coarse_add_msec(&client_relay3->next_padding_time, &now, 100);
425 decision = channelpadding_decide_to_pad_channel(client_relay3);
426 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
427 tt_assert(client_relay3->pending_padding_callback);
428 tt_int_op(tried_to_write_cell, OP_EQ, 0);
430 decision = channelpadding_decide_to_pad_channel(client_relay3);
431 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED);
433 // Wait for the timer
434 new_time += 101 * NSEC_PER_MSEC;
435 monotime_coarse_set_mock_time_nsec(new_time);
436 monotime_set_mock_time_nsec(new_time);
437 monotime_coarse_get(&now);
438 timers_run_pending();
439 tt_int_op(tried_to_write_cell, OP_EQ, 1);
440 tt_assert(!client_relay3->pending_padding_callback);
442 // Then test disabling each via consensus param
443 smartlist_add(current_md_consensus->net_params,
444 (void*)"nf_pad_single_onion=0");
445 channelpadding_new_consensus_params(current_md_consensus);
447 // Before the client tries to pad, the relay will still pad:
448 tried_to_write_cell = 0;
449 monotime_coarse_add_msec(&relay3_client->next_padding_time, &now, 100);
450 get_options_mutable()->ORPort_set = 1;
451 get_options_mutable()->HiddenServiceSingleHopMode = 0;
452 get_options_mutable()->HiddenServiceNonAnonymousMode = 0;
453 decision = channelpadding_decide_to_pad_channel(relay3_client);
454 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
455 tt_assert(relay3_client->pending_padding_callback);
457 // Wait for the timer
458 new_time += 101 * NSEC_PER_MSEC;
459 monotime_coarse_set_mock_time_nsec(new_time);
460 monotime_set_mock_time_nsec(new_time);
461 monotime_coarse_get(&now);
462 timers_run_pending();
463 tt_int_op(tried_to_write_cell, OP_EQ, 1);
464 tt_assert(!client_relay3->pending_padding_callback);
466 // Test client side (it should stop immediately)
467 get_options_mutable()->HiddenServiceSingleHopMode = 1;
468 get_options_mutable()->HiddenServiceNonAnonymousMode = 1;
469 /* For the relay to receive the negotiate: */
470 get_options_mutable()->ORPort_set = 1;
471 decision = channelpadding_decide_to_pad_channel(client_relay3);
472 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
473 tt_assert(!client_relay3->pending_padding_callback);
475 // Test relay side (it should have gotten the negotiation to disable)
476 get_options_mutable()->ORPort_set = 1;
477 get_options_mutable()->HiddenServiceSingleHopMode = 0;
478 get_options_mutable()->HiddenServiceNonAnonymousMode = 0;
479 tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ,
480 CHANNELPADDING_WONTPAD);
481 tt_assert(!relay3_client->padding_enabled);
483 done:
484 free_mock_consensus();
485 free_mock_network();
486 tor_free(relay);
488 timers_shutdown();
489 monotime_disable_test_mocking();
490 channel_free_all();
493 void
494 test_channelpadding_consensus(void *arg)
496 channelpadding_decision_t decision;
497 or_options_t *options = get_options_mutable();
498 int64_t val;
499 int64_t new_time;
500 (void)arg;
503 * Params tested:
504 * nf_pad_before_usage
505 * nf_pad_relays
506 * nf_ito_low
507 * nf_ito_high
509 * Plan:
510 * 1. Padding can be completely disabled via consensus
511 * 2. Negotiation can't re-enable consensus-disabled padding
512 * 3. Negotiation can't increase padding from relays beyond
513 * consensus defaults
514 * 4. Relay-to-relay padding can be enabled/disabled in consensus
515 * 5. Can enable/disable padding before actually using a connection
516 * 6. Can we control circ and TLS conn lifetime from the consensus?
518 channel_t *chan;
519 routerstatus_t *relay = tor_malloc_zero(sizeof(routerstatus_t));
520 monotime_enable_test_mocking();
521 monotime_set_mock_time_nsec(1);
522 monotime_coarse_set_mock_time_nsec(1);
523 new_time = 1;
524 monotime_coarse_t now;
525 monotime_coarse_get(&now);
526 timers_initialize();
528 if (!connection_array)
529 connection_array = smartlist_new();
530 chan = (channel_t*)new_fake_channeltls(0);
531 channel_timestamp_active(chan);
533 setup_mock_consensus();
535 get_options_mutable()->ORPort_set = 1;
537 /* Test 1: Padding can be completely disabled via consensus */
538 tried_to_write_cell = 0;
539 monotime_coarse_add_msec(&chan->next_padding_time, &now, 100);
540 decision = channelpadding_decide_to_pad_channel(chan);
541 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
542 tt_assert(chan->pending_padding_callback);
543 tt_int_op(tried_to_write_cell, OP_EQ, 0);
545 decision = channelpadding_decide_to_pad_channel(chan);
546 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED);
548 // Wait for the timer
549 new_time += 101*NSEC_PER_MSEC;
550 monotime_coarse_set_mock_time_nsec(new_time);
551 monotime_set_mock_time_nsec(new_time);
552 monotime_coarse_get(&now);
553 timers_run_pending();
554 tt_int_op(tried_to_write_cell, OP_EQ, 1);
555 tt_assert(!chan->pending_padding_callback);
557 smartlist_add(current_md_consensus->net_params,
558 (void*)"nf_ito_low=0");
559 smartlist_add(current_md_consensus->net_params,
560 (void*)"nf_ito_high=0");
561 get_options_mutable()->ConnectionPadding = 1;
562 channelpadding_new_consensus_params(current_md_consensus);
564 decision = channelpadding_decide_to_pad_channel(chan);
565 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
566 tt_assert(!chan->pending_padding_callback);
567 val = channelpadding_get_netflow_inactive_timeout_ms(chan);
568 tt_i64_op(val, OP_EQ, 0);
569 val = channelpadding_compute_time_until_pad_for_netflow(chan);
570 tt_i64_op(val, OP_EQ, -2);
572 /* Test 2: Negotiation can't re-enable consensus-disabled padding */
573 channelpadding_send_enable_command(chan, 100, 200);
574 tried_to_write_cell = 0;
575 decision = channelpadding_decide_to_pad_channel(chan);
576 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
577 tt_assert(!chan->pending_padding_callback);
578 val = channelpadding_get_netflow_inactive_timeout_ms(chan);
579 tt_i64_op(val, OP_EQ, 0);
580 val = channelpadding_compute_time_until_pad_for_netflow(chan);
581 tt_i64_op(val, OP_EQ, -2);
582 tt_assert(monotime_coarse_is_zero(&chan->next_padding_time));
584 smartlist_clear(current_md_consensus->net_params);
586 /* Test 3: Negotiation can't increase padding from relays beyond consensus
587 * values */
588 smartlist_add(current_md_consensus->net_params,
589 (void*)"nf_ito_low=100");
590 smartlist_add(current_md_consensus->net_params,
591 (void*)"nf_ito_high=200");
592 channelpadding_new_consensus_params(current_md_consensus);
594 tried_to_write_cell = 0;
595 monotime_coarse_add_msec(&chan->next_padding_time, &now, 100);
596 decision = channelpadding_decide_to_pad_channel(chan);
597 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
598 tt_assert(chan->pending_padding_callback);
599 tt_int_op(tried_to_write_cell, OP_EQ, 0);
600 val = channelpadding_get_netflow_inactive_timeout_ms(chan);
601 tt_i64_op(val, OP_GE, 100);
602 tt_i64_op(val, OP_LE, 200);
603 val = channelpadding_compute_time_until_pad_for_netflow(chan);
604 tt_i64_op(val, OP_LE, 200);
606 // Wait for the timer
607 new_time += 201*NSEC_PER_MSEC;
608 monotime_set_mock_time_nsec(new_time);
609 monotime_coarse_set_mock_time_nsec(new_time);
610 monotime_coarse_get(&now);
611 timers_run_pending();
612 tt_int_op(tried_to_write_cell, OP_EQ, 1);
613 tt_assert(!chan->pending_padding_callback);
615 smartlist_clear(current_md_consensus->net_params);
616 smartlist_add(current_md_consensus->net_params,
617 (void*)"nf_ito_low=1500");
618 smartlist_add(current_md_consensus->net_params,
619 (void*)"nf_ito_high=4500");
620 channelpadding_new_consensus_params(current_md_consensus);
622 channelpadding_send_enable_command(chan, 100, 200);
623 tried_to_write_cell = 0;
624 decision = channelpadding_decide_to_pad_channel(chan);
625 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER);
626 tt_assert(!chan->pending_padding_callback);
627 val = channelpadding_get_netflow_inactive_timeout_ms(chan);
628 tt_i64_op(val, OP_GE, 1500);
629 tt_i64_op(val, OP_LE, 4500);
630 val = channelpadding_compute_time_until_pad_for_netflow(chan);
631 tt_i64_op(val, OP_LE, 4500);
633 /* Test 4: Relay-to-relay padding can be enabled/disabled in consensus */
634 /* Make this channel a relay's channel */
635 memcpy(relay->identity_digest,
636 ((channel_tls_t *)chan)->conn->identity_digest, DIGEST_LEN);
637 smartlist_add(current_md_consensus->routerstatus_list, relay);
638 relay = NULL; /* Prevent double-free */
640 tried_to_write_cell = 0;
641 decision = channelpadding_decide_to_pad_channel(chan);
642 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
643 tt_assert(!chan->pending_padding_callback);
645 smartlist_add(current_md_consensus->net_params,
646 (void*)"nf_pad_relays=1");
647 channelpadding_new_consensus_params(current_md_consensus);
649 decision = channelpadding_decide_to_pad_channel(chan);
650 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER);
651 tt_assert(!chan->pending_padding_callback);
652 val = channelpadding_get_netflow_inactive_timeout_ms(chan);
653 tt_i64_op(val, OP_GE, 1500);
654 tt_i64_op(val, OP_LE, 4500);
655 val = channelpadding_compute_time_until_pad_for_netflow(chan);
656 tt_i64_op(val, OP_LE, 4500);
658 /* Test 5: If we disable padding before channel usage, does that work? */
659 smartlist_add(current_md_consensus->net_params,
660 (void*)"nf_pad_before_usage=0");
661 channelpadding_new_consensus_params(current_md_consensus);
662 tried_to_write_cell = 0;
663 decision = channelpadding_decide_to_pad_channel(chan);
664 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
665 tt_assert(!chan->pending_padding_callback);
667 /* Test 6: Can we control circ and TLS conn lifetime from the consensus? */
668 val = channelpadding_get_channel_idle_timeout(NULL, 0);
669 tt_i64_op(val, OP_GE, 180);
670 tt_i64_op(val, OP_LE, 180+90);
671 val = channelpadding_get_channel_idle_timeout(chan, 0);
672 tt_i64_op(val, OP_GE, 180);
673 tt_i64_op(val, OP_LE, 180+90);
674 options->ReducedConnectionPadding = 1;
675 val = channelpadding_get_channel_idle_timeout(chan, 0);
676 tt_i64_op(val, OP_GE, 180/2);
677 tt_i64_op(val, OP_LE, (180+90)/2);
679 options->ReducedConnectionPadding = 0;
680 options->ORPort_set = 1;
681 smartlist_add(current_md_consensus->net_params,
682 (void*)"nf_conntimeout_relays=600");
683 channelpadding_new_consensus_params(current_md_consensus);
684 val = channelpadding_get_channel_idle_timeout(chan, 1);
685 tt_i64_op(val, OP_GE, 450);
686 tt_i64_op(val, OP_LE, 750);
688 val = channelpadding_get_circuits_available_timeout();
689 tt_i64_op(val, OP_GE, 30*60);
690 tt_i64_op(val, OP_LE, 30*60*2);
692 options->ReducedConnectionPadding = 1;
693 smartlist_add(current_md_consensus->net_params,
694 (void*)"nf_conntimeout_clients=600");
695 channelpadding_new_consensus_params(current_md_consensus);
696 val = channelpadding_get_circuits_available_timeout();
697 tt_i64_op(val, OP_GE, 600/2);
698 tt_i64_op(val, OP_LE, 600*2/2);
700 options->ReducedConnectionPadding = 0;
701 options->CircuitsAvailableTimeout = 24*60*60;
702 val = channelpadding_get_circuits_available_timeout();
703 tt_i64_op(val, OP_GE, 24*60*60);
704 tt_i64_op(val, OP_LE, 24*60*60*2);
706 done:
707 tor_free(relay);
709 free_mock_consensus();
710 free_fake_channeltls((channel_tls_t*)chan);
711 smartlist_free(connection_array);
713 timers_shutdown();
714 monotime_disable_test_mocking();
715 channel_free_all();
717 return;
720 void
721 test_channelpadding_negotiation(void *arg)
723 channelpadding_negotiate_t disable;
724 cell_t cell;
725 channelpadding_decision_t decision;
726 int val;
727 (void)arg;
729 /* Plan:
730 * 1. Clients reject negotiation, relays accept it.
731 * * Bridges accept negotiation from their clients,
732 * but not from relays.
733 * 2. Torrc options can override client-side negotiation
734 * 3. Test a version issue in channelpadidng cell
735 * 4. Test channelpadding_reduced_padding
737 monotime_init();
738 monotime_enable_test_mocking();
739 monotime_set_mock_time_nsec(1);
740 monotime_coarse_set_mock_time_nsec(1);
741 timers_initialize();
742 setup_mock_consensus();
743 setup_mock_network();
745 /* Test case #1: Do the right things ignore negotiation? */
746 /* relay-to-client case: */
747 channelpadding_send_disable_command(relay3_client);
748 tt_assert(client_relay3->padding_enabled);
750 /* client-to-relay case: */
751 get_options_mutable()->ORPort_set = 1;
752 channelpadding_disable_padding_on_channel(client_relay3);
753 tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ,
754 CHANNELPADDING_WONTPAD);
755 tt_assert(!relay3_client->padding_enabled);
756 relay3_client->padding_enabled = 1;
757 client_relay3->padding_enabled = 1;
759 /* Bridge case from relay */
760 get_options_mutable()->BridgeRelay = 1;
761 channelpadding_disable_padding_on_channel(relay2_relay1);
762 tt_assert(relay1_relay2->padding_enabled);
764 /* Bridge case from client */
765 channelpadding_disable_padding_on_channel(client_relay3);
766 tt_assert(!relay3_client->padding_enabled);
767 tt_int_op(channelpadding_decide_to_pad_channel(relay3_client), OP_EQ,
768 CHANNELPADDING_WONTPAD);
769 relay3_client->padding_enabled = 1;
770 client_relay3->padding_enabled = 1;
771 get_options_mutable()->BridgeRelay = 0;
772 get_options_mutable()->ORPort_set = 0;
774 /* Test case #2: Torrc options */
775 /* ConnectionPadding auto; Relay doesn't support us */
776 ((channel_tls_t*)relay3_client)->conn->link_proto = 4;
777 relay3_client->padding_enabled = 0;
778 tried_to_write_cell = 0;
779 decision = channelpadding_decide_to_pad_channel(relay3_client);
780 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
781 tt_assert(!relay3_client->pending_padding_callback);
782 tt_int_op(tried_to_write_cell, OP_EQ, 0);
783 ((channel_tls_t*)relay3_client)->conn->link_proto = 5;
784 relay3_client->padding_enabled = 1;
786 /* ConnectionPadding 1; Relay doesn't support us */
787 get_options_mutable()->ConnectionPadding = 1;
788 tried_to_write_cell = 0;
789 decision = channelpadding_decide_to_pad_channel(client_relay3);
790 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER);
791 tt_assert(!client_relay3->pending_padding_callback);
792 tt_int_op(tried_to_write_cell, OP_EQ, 0);
793 get_options_mutable()->ConnectionPadding = 0;
795 /* Test case #3: Test a version issue in channelpadding cell */
796 get_options_mutable()->ORPort_set = 1;
797 client_relay3->padding_enabled = 1;
798 relay3_client->padding_enabled = 1;
799 memset(&cell, 0, sizeof(cell_t));
800 memset(&disable, 0, sizeof(channelpadding_negotiate_t));
801 cell.command = CELL_PADDING_NEGOTIATE;
803 channelpadding_negotiate_set_command(&disable, CHANNELPADDING_COMMAND_STOP);
804 disable.version = 1;
805 channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, &disable);
806 client_relay3->write_cell(client_relay3, &cell);
807 tt_assert(relay3_client->padding_enabled);
808 tt_int_op(channelpadding_update_padding_for_channel(client_relay3, &disable),
809 OP_EQ, -1);
810 tt_assert(client_relay3->padding_enabled);
812 disable.version = 0;
813 channelpadding_negotiate_encode(cell.payload, CELL_PAYLOAD_SIZE, &disable);
814 client_relay3->write_cell(client_relay3, &cell);
815 tt_assert(!relay3_client->padding_enabled);
817 /* Test case 4: Reducing padding actually reduces it */
818 relay3_client->padding_enabled = 1;
819 client_relay3->padding_enabled = 1;
821 decision = channelpadding_decide_to_pad_channel(relay3_client);
822 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER);
824 channelpadding_reduce_padding_on_channel(client_relay3);
826 tried_to_write_cell = 0;
827 decision = channelpadding_decide_to_pad_channel(relay3_client);
828 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
830 get_options_mutable()->ORPort_set = 0;
831 decision = channelpadding_decide_to_pad_channel(client_relay3);
832 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER);
834 tt_assert(!client_relay3->pending_padding_callback);
835 val = channelpadding_get_netflow_inactive_timeout_ms(client_relay3);
836 tt_int_op(val, OP_GE, 9000);
837 tt_int_op(val, OP_LE, 14000);
838 int64_t val64 =
839 channelpadding_compute_time_until_pad_for_netflow(client_relay3);
840 tt_i64_op(val64, OP_LE, 14000);
842 done:
843 free_mock_network();
844 free_mock_consensus();
846 timers_shutdown();
847 monotime_disable_test_mocking();
848 channel_free_all();
850 return;
853 void
854 test_channelpadding_decide_to_pad_channel(void *arg)
856 channelpadding_decision_t decision;
858 * Test case plan:
860 * 1. Channel that has "sent a packet" before the timeout.
861 * + We should decide to pad later
862 * 2. Channel that has not "sent a packet" before the timeout:
863 * 2a. Not within 1.1s of the timeout.
864 * + We should decide to pad later
865 * 2b. Within 1.1s of the timeout.
866 * + We should schedule padding
867 * + We should get feedback that we wrote a cell
868 * 2c. Within 0.1s of the timeout.
869 * + We should schedule padding
870 * + We should get feedback that we wrote a cell
871 * 2d. Channel that asks to pad while timeout is scheduled
872 * + We should schedule padding
873 * + We should get feedback that we wrote a cell
874 * 2e. 0s of the timeout
875 * + We should send padding immediately
876 * + We should get feedback that we wrote a cell
877 * 2f. <0s of the timeout
878 * + We should send padding immediately
879 * + We should get feedback that we wrote a cell
880 * 3. Channel that sends a packet while timeout is scheduled
881 * + We should not get feedback that we wrote a cell
882 * 4. Channel that closes while timeout is scheduled
883 * + We should not get feedback that we wrote a cell
884 * 5. Make sure the channel still would work if repaired
885 * + We should be able to schedule padding and resend
886 * 6. Channel is not used for full circuits
887 * 7. Channel that disappears while timeout is scheduled
888 * + We should not send padding
890 channel_t *chan;
891 int64_t new_time;
892 if (!connection_array)
893 connection_array = smartlist_new();
894 (void)arg;
896 monotime_init();
897 monotime_enable_test_mocking();
898 monotime_set_mock_time_nsec(1);
899 monotime_coarse_set_mock_time_nsec(1);
900 new_time = 1;
901 monotime_coarse_t now;
902 monotime_coarse_get(&now);
903 timers_initialize();
904 setup_full_capture_of_logs(LOG_WARN);
905 channelpadding_new_consensus_params(NULL);
907 chan = (channel_t*)new_fake_channeltls(0);
908 channel_timestamp_active(chan);
910 /* Test case #1: Channel that has "sent a packet" before the timeout. */
911 tried_to_write_cell = 0;
912 decision = channelpadding_decide_to_pad_channel(chan);
913 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER);
914 tt_assert(!chan->pending_padding_callback);
915 tt_int_op(tried_to_write_cell, OP_EQ, 0);
917 /* Test case #2a: > 1.1s until timeout */
918 tried_to_write_cell = 0;
919 monotime_coarse_add_msec(&chan->next_padding_time, &now, 1200);
920 decision = channelpadding_decide_to_pad_channel(chan);
921 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADLATER);
922 tt_assert(!chan->pending_padding_callback);
923 tt_int_op(tried_to_write_cell, OP_EQ, 0);
925 /* Test case #2b: >= 1.0s until timeout */
926 tried_to_write_cell = 0;
927 monotime_coarse_add_msec(&chan->next_padding_time, &now, 1000);
928 decision = channelpadding_decide_to_pad_channel(chan);
929 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
930 tt_assert(chan->pending_padding_callback);
931 tt_int_op(tried_to_write_cell, OP_EQ, 0);
933 // Set up a timer for the <0 case below.
934 monotime_coarse_t now_minus_100s;
935 monotime_coarse_add_msec(&now_minus_100s, &now, 900);
936 // Wait for the timer from case #2b
937 new_time += 1000*NSEC_PER_MSEC;
938 monotime_set_mock_time_nsec(new_time);
939 monotime_coarse_set_mock_time_nsec(new_time);
940 monotime_coarse_get(&now);
941 timers_run_pending();
942 tt_int_op(tried_to_write_cell, OP_EQ, 1);
943 tt_assert(!chan->pending_padding_callback);
945 /* Test case #2c: > 0.1s until timeout */
946 tried_to_write_cell = 0;
947 monotime_coarse_add_msec(&chan->next_padding_time, &now, 100);
948 decision = channelpadding_decide_to_pad_channel(chan);
949 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
950 tt_assert(chan->pending_padding_callback);
951 tt_int_op(tried_to_write_cell, OP_EQ, 0);
953 /* Test case #2d: Channel that asks to pad while timeout is scheduled */
954 decision = channelpadding_decide_to_pad_channel(chan);
955 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_ALREADY_SCHEDULED);
957 // Wait for the timer
958 new_time += 101*NSEC_PER_MSEC;
959 monotime_coarse_set_mock_time_nsec(new_time);
960 monotime_set_mock_time_nsec(new_time);
961 monotime_coarse_get(&now);
962 timers_run_pending();
963 tt_int_op(tried_to_write_cell, OP_EQ, 1);
964 tt_assert(!chan->pending_padding_callback);
966 /* Test case #2e: 0s until timeout */
967 tried_to_write_cell = 0;
968 monotime_coarse_add_msec(&chan->next_padding_time, &now, 0);
969 decision = channelpadding_decide_to_pad_channel(chan);
970 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SENT);
971 tt_int_op(tried_to_write_cell, OP_EQ, 1);
972 tt_assert(!chan->pending_padding_callback);
974 /* Test case #2f: <0s until timeout */
975 tried_to_write_cell = 0;
976 monotime_coarse_add_msec(&chan->next_padding_time, &now_minus_100s, 0);
977 decision = channelpadding_decide_to_pad_channel(chan);
978 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SENT);
979 tt_int_op(tried_to_write_cell, OP_EQ, 1);
980 tt_assert(!chan->pending_padding_callback);
982 /* Test case #3: Channel that sends a packet while timeout is scheduled */
983 tried_to_write_cell = 0;
984 monotime_coarse_add_msec(&chan->next_padding_time, &now, 100);
985 decision = channelpadding_decide_to_pad_channel(chan);
986 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
987 tt_int_op(tried_to_write_cell, OP_EQ, 0);
988 tt_assert(chan->pending_padding_callback);
990 // Pretend the channel sent a packet
991 channel_timestamp_active(chan);
993 // We don't expect any timer callbacks here. Make a dummy one to be sure.
994 // Wait for the timer
995 new_time += 101*NSEC_PER_MSEC;
996 monotime_coarse_set_mock_time_nsec(new_time);
997 monotime_set_mock_time_nsec(new_time);
998 monotime_coarse_get(&now);
999 timers_run_pending();
1001 tt_int_op(tried_to_write_cell, OP_EQ, 0);
1002 tt_assert(!chan->pending_padding_callback);
1004 /* Test case #4: Channel that closes while a timeout is scheduled */
1005 tried_to_write_cell = 0;
1006 monotime_coarse_add_msec(&chan->next_padding_time, &now, 100);
1007 decision = channelpadding_decide_to_pad_channel(chan);
1008 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
1009 tt_int_op(tried_to_write_cell, OP_EQ, 0);
1010 tt_assert(chan->pending_padding_callback);
1012 // Pretend the channel is temporarily down
1013 chan->state = CHANNEL_STATE_MAINT;
1015 // We don't expect any timer callbacks here. Make a dummy one to be sure.
1016 new_time += 101*NSEC_PER_MSEC;
1017 monotime_coarse_set_mock_time_nsec(new_time);
1018 monotime_set_mock_time_nsec(new_time);
1019 monotime_coarse_get(&now);
1020 timers_run_pending();
1022 tt_int_op(tried_to_write_cell, OP_EQ, 0);
1023 tt_assert(!chan->pending_padding_callback);
1024 chan->state = CHANNEL_STATE_OPEN;
1026 /* Test case #5: Make sure previous test case didn't break everything */
1027 tried_to_write_cell = 0;
1028 monotime_coarse_add_msec(&chan->next_padding_time, &now, 100);
1029 decision = channelpadding_decide_to_pad_channel(chan);
1030 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
1031 tt_assert(chan->pending_padding_callback);
1032 tt_int_op(tried_to_write_cell, OP_EQ, 0);
1034 // Wait for the timer
1035 new_time += 101*NSEC_PER_MSEC;
1036 monotime_coarse_set_mock_time_nsec(new_time);
1037 monotime_set_mock_time_nsec(new_time);
1038 monotime_coarse_get(&now);
1039 timers_run_pending();
1041 tt_int_op(tried_to_write_cell, OP_EQ, 1);
1042 tt_assert(!chan->pending_padding_callback);
1044 /* Test case #6. Channel is not used for full circuits */
1045 chan->channel_usage = CHANNEL_USED_NOT_USED_FOR_FULL_CIRCS;
1046 decision = channelpadding_decide_to_pad_channel(chan);
1047 tt_int_op(decision, OP_EQ, CHANNELPADDING_WONTPAD);
1048 tt_assert(!chan->pending_padding_callback);
1049 chan->channel_usage = CHANNEL_USED_FOR_FULL_CIRCS;
1051 /* Test case #7. Channel is closed while timeout is scheduled.
1053 * NOTE: This test deliberately breaks the channel callback mechanism.
1054 * It must be last.
1056 tried_to_write_cell = 0;
1057 monotime_coarse_add_msec(&chan->next_padding_time, &now, 100);
1058 decision = channelpadding_decide_to_pad_channel(chan);
1059 tt_int_op(decision, OP_EQ, CHANNELPADDING_PADDING_SCHEDULED);
1060 tt_int_op(tried_to_write_cell, OP_EQ, 0);
1061 tt_assert(chan->pending_padding_callback);
1063 // Close the connection while the timer is scheduled
1064 free_fake_channeltls((channel_tls_t*)chan);
1066 // We don't expect any timer callbacks here. Make a dummy one to be sure.
1067 new_time = 101*NSEC_PER_MSEC;
1068 monotime_coarse_set_mock_time_nsec(new_time);
1069 monotime_set_mock_time_nsec(new_time);
1070 monotime_coarse_get(&now);
1071 timers_run_pending();
1073 tt_int_op(tried_to_write_cell, OP_EQ, 0);
1075 done:
1076 smartlist_free(connection_array);
1078 teardown_capture_of_logs();
1079 monotime_disable_test_mocking();
1080 timers_shutdown();
1081 channel_free_all();
1083 return;
1086 #define TEST_CHANNELPADDING(name, flags) \
1087 { #name, test_##name, (flags), NULL, NULL }
1089 struct testcase_t channelpadding_tests[] = {
1090 //TEST_CHANNELPADDING(channelpadding_decide_to_pad_channel, 0),
1091 TEST_CHANNELPADDING(channelpadding_decide_to_pad_channel, TT_FORK),
1092 TEST_CHANNELPADDING(channelpadding_negotiation, TT_FORK),
1093 TEST_CHANNELPADDING(channelpadding_consensus, TT_FORK),
1094 TEST_CHANNELPADDING(channelpadding_killonehop, TT_FORK),
1095 TEST_CHANNELPADDING(channelpadding_timers, TT_FORK),
1096 END_OF_TESTCASES