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"
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
*);
56 mock_channel_has_queued_writes(channel_t
*chan
)
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
;
70 mock_channel_write_cell_relay2(channel_t
*chan
, cell_t
*cell
)
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());
80 mock_channel_write_cell_relay1(channel_t
*chan
, cell_t
*cell
)
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());
90 mock_channel_write_cell_relay3(channel_t
*chan
, cell_t
*cell
)
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());
100 mock_channel_write_cell_client(channel_t
*chan
, cell_t
*cell
)
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());
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());
120 setup_fake_connection_for_channel(channel_tls_t
*chan
)
122 or_connection_t
*conn
= (or_connection_t
*)connection_new(CONN_TYPE_OR
,
125 conn
->base_
.conn_array_index
= smartlist_len(connection_array
);
126 smartlist_add(connection_array
, 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_
);
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_
);
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
);
193 free_mock_consensus(void)
195 SMARTLIST_FOREACH(current_md_consensus
->routerstatus_list
, void *, r
,
197 smartlist_free(current_md_consensus
->routerstatus_list
);
198 smartlist_free(current_ns_consensus
->net_params
);
199 tor_free(current_ns_consensus
);
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
);
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
);
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());
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.
265 dummy_nop_timer(void)
267 tor_timer_t
*dummy_timer
= timer_new(dummy_timer_cb
, NULL
);
268 struct timeval timeout
;
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
286 test_channelpadding_timers(void *arg
)
288 channelpadding_decision_t decision
;
289 channel_t
*chans
[CHANNELS_TO_TEST
];
292 if (!connection_array
)
293 connection_array
= smartlist_new();
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
);
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;
313 monotime_coarse_t now
;
314 monotime_coarse_get(&now
);
316 /* This loop fills our timerslot array with timers of increasing time
318 for (; i
< CHANNELPADDING_MAX_TIMERS
; i
++) {
319 monotime_coarse_add_msec(&chans
[i
]->next_padding_time
,
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
,
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
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
);
376 for (int i
= 0; i
< CHANNELS_TO_TEST
; i
++) {
377 free_fake_channeltls((channel_tls_t
*)chans
[i
]);
379 smartlist_free(connection_array
);
382 monotime_disable_test_mocking();
389 test_channelpadding_killonehop(void *arg
)
391 channelpadding_decision_t decision
;
395 routerstatus_t
*relay
= tor_malloc_zero(sizeof(routerstatus_t
));
397 monotime_enable_test_mocking();
398 monotime_set_mock_time_nsec(1);
399 monotime_coarse_set_mock_time_nsec(1);
403 setup_mock_consensus();
404 setup_mock_network();
406 /* Do we disable padding if rsos is enabled, and the consensus says don't
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
);
484 free_mock_consensus();
489 monotime_disable_test_mocking();
494 test_channelpadding_consensus(void *arg
)
496 channelpadding_decision_t decision
;
497 or_options_t
*options
= get_options_mutable();
504 * nf_pad_before_usage
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
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?
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);
524 monotime_coarse_t now
;
525 monotime_coarse_get(&now
);
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
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);
709 free_mock_consensus();
710 free_fake_channeltls((channel_tls_t
*)chan
);
711 smartlist_free(connection_array
);
714 monotime_disable_test_mocking();
721 test_channelpadding_negotiation(void *arg
)
723 channelpadding_negotiate_t disable
;
725 channelpadding_decision_t decision
;
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
738 monotime_enable_test_mocking();
739 monotime_set_mock_time_nsec(1);
740 monotime_coarse_set_mock_time_nsec(1);
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
);
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
),
810 tt_assert(client_relay3
->padding_enabled
);
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);
839 channelpadding_compute_time_until_pad_for_netflow(client_relay3
);
840 tt_i64_op(val64
, OP_LE
, 14000);
844 free_mock_consensus();
847 monotime_disable_test_mocking();
854 test_channelpadding_decide_to_pad_channel(void *arg
)
856 channelpadding_decision_t decision
;
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
892 if (!connection_array
)
893 connection_array
= smartlist_new();
897 monotime_enable_test_mocking();
898 monotime_set_mock_time_nsec(1);
899 monotime_coarse_set_mock_time_nsec(1);
901 monotime_coarse_t now
;
902 monotime_coarse_get(&now
);
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.
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);
1076 smartlist_free(connection_array
);
1078 teardown_capture_of_logs();
1079 monotime_disable_test_mocking();
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
),