mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Merge branch 'bug20638_029_v2_squashed' into maint-0.2.9
This commit is contained in:
+95
-29
@@ -542,16 +542,16 @@ test_single_onion_poisoning(void *arg)
|
||||
char *dir2 = tor_strdup(get_fname_rnd("test_hs_dir2"));
|
||||
smartlist_t *services = smartlist_new();
|
||||
|
||||
/* No services, no problem! */
|
||||
/* No services, no service to verify, no problem! */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_config_services(mock_options, 1);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Either way, no problem. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_config_services(mock_options, 1);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Create the data directory, and, if the correct bit in arg is set,
|
||||
@@ -571,42 +571,86 @@ test_single_onion_poisoning(void *arg)
|
||||
|
||||
service_1->directory = dir1;
|
||||
service_2->directory = dir2;
|
||||
/* The services own the directory pointers now */
|
||||
dir1 = dir2 = NULL;
|
||||
smartlist_add(services, service_1);
|
||||
/* But don't add the second service yet. */
|
||||
/* Add port to service 1 */
|
||||
service_1->ports = smartlist_new();
|
||||
service_2->ports = smartlist_new();
|
||||
char *err_msg = NULL;
|
||||
rend_service_port_config_t *port1 = rend_service_parse_port_config("80", " ",
|
||||
&err_msg);
|
||||
tt_assert(port1);
|
||||
tt_assert(!err_msg);
|
||||
smartlist_add(service_1->ports, port1);
|
||||
|
||||
/* Service directories, but no previous keys, no problem! */
|
||||
rend_service_port_config_t *port2 = rend_service_parse_port_config("90", " ",
|
||||
&err_msg);
|
||||
/* Add port to service 2 */
|
||||
tt_assert(port2);
|
||||
tt_assert(!err_msg);
|
||||
smartlist_add(service_2->ports, port2);
|
||||
|
||||
/* No services, a service to verify, no problem! */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Either way, no problem. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Add the first service */
|
||||
ret = rend_service_check_dir_and_add(services, mock_options, service_1, 0);
|
||||
tt_assert(ret == 0);
|
||||
/* But don't add the second service yet. */
|
||||
|
||||
/* Service directories, but no previous keys, no problem! */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Either way, no problem. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Poison! Poison! Poison!
|
||||
* This can only be done in HiddenServiceSingleHopMode. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_poison_new_single_onion_dirs(services);
|
||||
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
/* Poisoning twice is a no-op. */
|
||||
ret = rend_service_poison_new_single_onion_dirs(services);
|
||||
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Poisoned service directories, but no previous keys, no problem! */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Either way, no problem. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Now add some keys, and we'll have a problem. */
|
||||
@@ -616,38 +660,48 @@ test_single_onion_poisoning(void *arg)
|
||||
/* Poisoned service directories with previous keys are not allowed. */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret < 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* But they are allowed if we're in non-anonymous mode. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Re-poisoning directories with existing keys is a no-op, because
|
||||
* directories with existing keys are ignored. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_poison_new_single_onion_dirs(services);
|
||||
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
/* And it keeps the poison. */
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Now add the second service: it has no key and no poison file */
|
||||
smartlist_add(services, service_2);
|
||||
ret = rend_service_check_dir_and_add(services, mock_options, service_2, 0);
|
||||
|
||||
/* A new service, and an existing poisoned service. Not ok. */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret < 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* But ok to add in non-anonymous mode. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Now remove the poisoning from the first service, and we have the opposite
|
||||
@@ -661,50 +715,62 @@ test_single_onion_poisoning(void *arg)
|
||||
* directories. */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* But the existing unpoisoned key is not ok in non-anonymous mode, even if
|
||||
* there is an empty service. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret < 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Poisoning directories with existing keys is a no-op, because directories
|
||||
* with existing keys are ignored. But the new directory should poison. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_poison_new_single_onion_dirs(services);
|
||||
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_poison_new_single_onion_dir(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
/* And the old directory remains unpoisoned. */
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret < 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* And the new directory should be ignored, because it has no key. */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Re-poisoning directories without existing keys is a no-op. */
|
||||
mock_options->HiddenServiceSingleHopMode = 1;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 1;
|
||||
ret = rend_service_poison_new_single_onion_dirs(services);
|
||||
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
ret = rend_service_poison_new_single_onion_dir(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
/* And the old directory remains unpoisoned. */
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
|
||||
tt_assert(ret < 0);
|
||||
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
done:
|
||||
/* The test harness deletes the directories at exit */
|
||||
smartlist_free(services);
|
||||
rend_service_free(service_1);
|
||||
rend_service_free(service_2);
|
||||
smartlist_free(services);
|
||||
UNMOCK(get_options);
|
||||
tor_free(mock_options->DataDirectory);
|
||||
tor_free(dir1);
|
||||
tor_free(dir2);
|
||||
}
|
||||
|
||||
struct testcase_t hs_tests[] = {
|
||||
|
||||
Reference in New Issue
Block a user