hs_common.c (62196B)
1 /* Copyright (c) 2016-2021, The Tor Project, Inc. */ 2 /* See LICENSE for licensing information */ 3 4 /** 5 * \file hs_common.c 6 * \brief Contains code shared between different HS protocol version as well 7 * as useful data structures and accessors used by other subsystems. 8 **/ 9 10 #define HS_COMMON_PRIVATE 11 12 #include "core/or/or.h" 13 14 #include "app/config/config.h" 15 #include "core/or/circuitbuild.h" 16 #include "core/or/policies.h" 17 #include "core/or/extendinfo.h" 18 #include "feature/dirauth/shared_random_state.h" 19 #include "feature/hs/hs_cache.h" 20 #include "feature/hs/hs_circuitmap.h" 21 #include "feature/hs/hs_client.h" 22 #include "feature/hs/hs_common.h" 23 #include "feature/hs/hs_dos.h" 24 #include "feature/hs/hs_ob.h" 25 #include "feature/hs/hs_ident.h" 26 #include "feature/hs/hs_service.h" 27 #include "feature/hs_common/shared_random_client.h" 28 #include "feature/nodelist/describe.h" 29 #include "feature/nodelist/microdesc.h" 30 #include "feature/nodelist/networkstatus.h" 31 #include "feature/nodelist/nodelist.h" 32 #include "feature/nodelist/routerset.h" 33 #include "feature/rend/rendcommon.h" 34 #include "feature/relay/routermode.h" 35 #include "lib/crypt_ops/crypto_rand.h" 36 #include "lib/crypt_ops/crypto_util.h" 37 #include "lib/net/resolve.h" 38 39 #include "core/or/edge_connection_st.h" 40 #include "feature/nodelist/networkstatus_st.h" 41 #include "feature/nodelist/node_st.h" 42 #include "core/or/origin_circuit_st.h" 43 #include "feature/nodelist/routerstatus_st.h" 44 45 /* Trunnel */ 46 #include "trunnel/ed25519_cert.h" 47 48 /** Ed25519 Basepoint value. Taken from section 5 of 49 * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03 */ 50 static const char *str_ed25519_basepoint = 51 "(15112221349535400772501151409588531511" 52 "454012693041857206046113283949847762202, " 53 "463168356949264781694283940034751631413" 54 "07993866256225615783033603165251855960)"; 55 56 #ifdef HAVE_SYS_UN_H 57 58 /** Given <b>ports</b>, a smartlist containing hs_port_config_t, 59 * add the given <b>p</b>, a AF_UNIX port to the list. Return 0 on success 60 * else return -ENOSYS if AF_UNIX is not supported (see function in the 61 * #else statement below). */ 62 static int 63 add_unix_port(smartlist_t *ports, hs_port_config_t *p) 64 { 65 tor_assert(ports); 66 tor_assert(p); 67 tor_assert(p->is_unix_addr); 68 69 smartlist_add(ports, p); 70 return 0; 71 } 72 73 /** Given <b>conn</b> set it to use the given port <b>p</b> values. Return 0 74 * on success else return -ENOSYS if AF_UNIX is not supported (see function 75 * in the #else statement below). */ 76 static int 77 set_unix_port(edge_connection_t *conn, hs_port_config_t *p) 78 { 79 tor_assert(conn); 80 tor_assert(p); 81 tor_assert(p->is_unix_addr); 82 83 conn->base_.socket_family = AF_UNIX; 84 tor_addr_make_unspec(&conn->base_.addr); 85 conn->base_.port = 1; 86 conn->base_.address = tor_strdup(p->unix_addr); 87 return 0; 88 } 89 90 #else /* !defined(HAVE_SYS_UN_H) */ 91 92 static int 93 set_unix_port(edge_connection_t *conn, hs_port_config_t *p) 94 { 95 (void) conn; 96 (void) p; 97 return -ENOSYS; 98 } 99 100 static int 101 add_unix_port(smartlist_t *ports, hs_port_config_t *p) 102 { 103 (void) ports; 104 (void) p; 105 return -ENOSYS; 106 } 107 108 #endif /* defined(HAVE_SYS_UN_H) */ 109 110 /** Helper function: The key is a digest that we compare to a node_t object 111 * current hsdir_index. */ 112 static int 113 compare_digest_to_fetch_hsdir_index(const void *_key, const void **_member) 114 { 115 const char *key = _key; 116 const node_t *node = *_member; 117 return tor_memcmp(key, node->hsdir_index.fetch, DIGEST256_LEN); 118 } 119 120 /** Helper function: The key is a digest that we compare to a node_t object 121 * next hsdir_index. */ 122 static int 123 compare_digest_to_store_first_hsdir_index(const void *_key, 124 const void **_member) 125 { 126 const char *key = _key; 127 const node_t *node = *_member; 128 return tor_memcmp(key, node->hsdir_index.store_first, DIGEST256_LEN); 129 } 130 131 /** Helper function: The key is a digest that we compare to a node_t object 132 * next hsdir_index. */ 133 static int 134 compare_digest_to_store_second_hsdir_index(const void *_key, 135 const void **_member) 136 { 137 const char *key = _key; 138 const node_t *node = *_member; 139 return tor_memcmp(key, node->hsdir_index.store_second, DIGEST256_LEN); 140 } 141 142 /** Helper function: Compare two node_t objects current hsdir_index. */ 143 static int 144 compare_node_fetch_hsdir_index(const void **a, const void **b) 145 { 146 const node_t *node1= *a; 147 const node_t *node2 = *b; 148 return tor_memcmp(node1->hsdir_index.fetch, 149 node2->hsdir_index.fetch, 150 DIGEST256_LEN); 151 } 152 153 /** Helper function: Compare two node_t objects next hsdir_index. */ 154 static int 155 compare_node_store_first_hsdir_index(const void **a, const void **b) 156 { 157 const node_t *node1= *a; 158 const node_t *node2 = *b; 159 return tor_memcmp(node1->hsdir_index.store_first, 160 node2->hsdir_index.store_first, 161 DIGEST256_LEN); 162 } 163 164 /** Helper function: Compare two node_t objects next hsdir_index. */ 165 static int 166 compare_node_store_second_hsdir_index(const void **a, const void **b) 167 { 168 const node_t *node1= *a; 169 const node_t *node2 = *b; 170 return tor_memcmp(node1->hsdir_index.store_second, 171 node2->hsdir_index.store_second, 172 DIGEST256_LEN); 173 } 174 175 /** Allocate and return a string containing the path to filename in directory. 176 * This function will never return NULL. The caller must free this path. */ 177 char * 178 hs_path_from_filename(const char *directory, const char *filename) 179 { 180 char *file_path = NULL; 181 182 tor_assert(directory); 183 tor_assert(filename); 184 185 tor_asprintf(&file_path, "%s%s%s", directory, PATH_SEPARATOR, filename); 186 return file_path; 187 } 188 189 /** Make sure that the directory for <b>service</b> is private, using the 190 * config <b>username</b>. 191 * 192 * If <b>create</b> is true: 193 * - if the directory exists, change permissions if needed, 194 * - if the directory does not exist, create it with the correct permissions. 195 * If <b>create</b> is false: 196 * - if the directory exists, check permissions, 197 * - if the directory does not exist, check if we think we can create it. 198 * Return 0 on success, -1 on failure. */ 199 int 200 hs_check_service_private_dir(const char *username, const char *path, 201 unsigned int dir_group_readable, 202 unsigned int create) 203 { 204 cpd_check_t check_opts = CPD_NONE; 205 206 tor_assert(path); 207 208 if (create) { 209 check_opts |= CPD_CREATE; 210 } else { 211 check_opts |= CPD_CHECK_MODE_ONLY; 212 check_opts |= CPD_CHECK; 213 } 214 if (dir_group_readable) { 215 check_opts |= CPD_GROUP_READ; 216 } 217 /* Check/create directory */ 218 if (check_private_dir(path, check_opts, username) < 0) { 219 return -1; 220 } 221 return 0; 222 } 223 224 /* Default, minimum, and maximum values for the maximum rendezvous failures 225 * consensus parameter. */ 226 #define MAX_REND_FAILURES_DEFAULT 2 227 #define MAX_REND_FAILURES_MIN 1 228 #define MAX_REND_FAILURES_MAX 10 229 230 /** How many times will a hidden service operator attempt to connect to 231 * a requested rendezvous point before giving up? */ 232 int 233 hs_get_service_max_rend_failures(void) 234 { 235 return networkstatus_get_param(NULL, "hs_service_max_rdv_failures", 236 MAX_REND_FAILURES_DEFAULT, 237 MAX_REND_FAILURES_MIN, 238 MAX_REND_FAILURES_MAX); 239 } 240 241 /** Get the default HS time period length in minutes from the consensus. */ 242 STATIC uint64_t 243 get_time_period_length(void) 244 { 245 /* If we are on a test network, make the time period smaller than normal so 246 that we actually see it rotate. Specifically, make it the same length as 247 an SRV protocol run. */ 248 if (get_options()->TestingTorNetwork) { 249 unsigned run_duration = sr_state_get_protocol_run_duration(); 250 /* An SRV run should take more than a minute (it's 24 rounds) */ 251 tor_assert_nonfatal(run_duration > 60); 252 /* Turn it from seconds to minutes before returning: */ 253 return sr_state_get_protocol_run_duration() / 60; 254 } 255 256 int32_t time_period_length = networkstatus_get_param(NULL, "hsdir_interval", 257 HS_TIME_PERIOD_LENGTH_DEFAULT, 258 HS_TIME_PERIOD_LENGTH_MIN, 259 HS_TIME_PERIOD_LENGTH_MAX); 260 /* Make sure it's a positive value. */ 261 tor_assert(time_period_length > 0); 262 /* uint64_t will always be able to contain a positive int32_t */ 263 return (uint64_t) time_period_length; 264 } 265 266 /** Get the HS time period number at time <b>now</b>. If <b>now</b> is not set, 267 * we try to get the time ourselves from a live consensus. */ 268 uint64_t 269 hs_get_time_period_num(time_t now) 270 { 271 uint64_t time_period_num; 272 time_t current_time; 273 274 /* If no time is specified, set current time based on consensus time, and 275 * only fall back to system time if that fails. */ 276 if (now != 0) { 277 current_time = now; 278 } else { 279 networkstatus_t *ns = 280 networkstatus_get_reasonably_live_consensus(approx_time(), 281 usable_consensus_flavor()); 282 current_time = ns ? ns->valid_after : approx_time(); 283 } 284 285 /* Start by calculating minutes since the epoch */ 286 uint64_t time_period_length = get_time_period_length(); 287 uint64_t minutes_since_epoch = current_time / 60; 288 289 /* Apply the rotation offset as specified by prop224 (section 290 * [TIME-PERIODS]), so that new time periods synchronize nicely with SRV 291 * publication */ 292 unsigned int time_period_rotation_offset = sr_state_get_phase_duration(); 293 time_period_rotation_offset /= 60; /* go from seconds to minutes */ 294 tor_assert(minutes_since_epoch > time_period_rotation_offset); 295 minutes_since_epoch -= time_period_rotation_offset; 296 297 /* Calculate the time period */ 298 time_period_num = minutes_since_epoch / time_period_length; 299 return time_period_num; 300 } 301 302 /** Get the number of the _upcoming_ HS time period, given that the current 303 * time is <b>now</b>. If <b>now</b> is not set, we try to get the time from a 304 * live consensus. */ 305 uint64_t 306 hs_get_next_time_period_num(time_t now) 307 { 308 return hs_get_time_period_num(now) + 1; 309 } 310 311 /** Get the number of the _previous_ HS time period, given that the current 312 * time is <b>now</b>. If <b>now</b> is not set, we try to get the time from a 313 * live consensus. */ 314 uint64_t 315 hs_get_previous_time_period_num(time_t now) 316 { 317 return hs_get_time_period_num(now) - 1; 318 } 319 320 /** Return the start time of the upcoming time period based on <b>now</b>. If 321 * <b>now</b> is not set, we try to get the time ourselves from a live 322 * consensus. */ 323 time_t 324 hs_get_start_time_of_next_time_period(time_t now) 325 { 326 uint64_t time_period_length = get_time_period_length(); 327 328 /* Get start time of next time period */ 329 uint64_t next_time_period_num = hs_get_next_time_period_num(now); 330 uint64_t start_of_next_tp_in_mins = next_time_period_num *time_period_length; 331 332 /* Apply rotation offset as specified by prop224 section [TIME-PERIODS] */ 333 unsigned int time_period_rotation_offset = sr_state_get_phase_duration(); 334 return (time_t)(start_of_next_tp_in_mins * 60 + time_period_rotation_offset); 335 } 336 337 /** Using the given time period number, compute the disaster shared random 338 * value and put it in srv_out. It MUST be at least DIGEST256_LEN bytes. */ 339 static void 340 compute_disaster_srv(uint64_t time_period_num, uint8_t *srv_out) 341 { 342 crypto_digest_t *digest; 343 344 tor_assert(srv_out); 345 346 digest = crypto_digest256_new(DIGEST_SHA3_256); 347 348 /* Start setting up payload: 349 * H("shared-random-disaster" | INT_8(period_length) | INT_8(period_num)) */ 350 crypto_digest_add_bytes(digest, HS_SRV_DISASTER_PREFIX, 351 HS_SRV_DISASTER_PREFIX_LEN); 352 353 /* Setup INT_8(period_length) | INT_8(period_num) */ 354 { 355 uint64_t time_period_length = get_time_period_length(); 356 char period_stuff[sizeof(uint64_t)*2]; 357 size_t offset = 0; 358 set_uint64(period_stuff, tor_htonll(time_period_length)); 359 offset += sizeof(uint64_t); 360 set_uint64(period_stuff+offset, tor_htonll(time_period_num)); 361 offset += sizeof(uint64_t); 362 tor_assert(offset == sizeof(period_stuff)); 363 364 crypto_digest_add_bytes(digest, period_stuff, sizeof(period_stuff)); 365 } 366 367 crypto_digest_get_digest(digest, (char *) srv_out, DIGEST256_LEN); 368 crypto_digest_free(digest); 369 } 370 371 /** Due to the high cost of computing the disaster SRV and that potentially we 372 * would have to do it thousands of times in a row, we always cache the 373 * computer disaster SRV (and its corresponding time period num) in case we 374 * want to reuse it soon after. We need to cache two SRVs, one for each active 375 * time period. 376 */ 377 static uint8_t cached_disaster_srv[2][DIGEST256_LEN]; 378 static uint64_t cached_time_period_nums[2] = {0}; 379 380 /** Compute the disaster SRV value for this <b>time_period_num</b> and put it 381 * in <b>srv_out</b> (of size at least DIGEST256_LEN). First check our caches 382 * to see if we have already computed it. */ 383 STATIC void 384 get_disaster_srv(uint64_t time_period_num, uint8_t *srv_out) 385 { 386 if (time_period_num == cached_time_period_nums[0]) { 387 memcpy(srv_out, cached_disaster_srv[0], DIGEST256_LEN); 388 return; 389 } else if (time_period_num == cached_time_period_nums[1]) { 390 memcpy(srv_out, cached_disaster_srv[1], DIGEST256_LEN); 391 return; 392 } else { 393 int replace_idx; 394 // Replace the lower period number. 395 if (cached_time_period_nums[0] <= cached_time_period_nums[1]) { 396 replace_idx = 0; 397 } else { 398 replace_idx = 1; 399 } 400 cached_time_period_nums[replace_idx] = time_period_num; 401 compute_disaster_srv(time_period_num, cached_disaster_srv[replace_idx]); 402 memcpy(srv_out, cached_disaster_srv[replace_idx], DIGEST256_LEN); 403 return; 404 } 405 } 406 407 #ifdef TOR_UNIT_TESTS 408 409 /** Get the first cached disaster SRV. Only used by unittests. */ 410 STATIC uint8_t * 411 get_first_cached_disaster_srv(void) 412 { 413 return cached_disaster_srv[0]; 414 } 415 416 /** Get the second cached disaster SRV. Only used by unittests. */ 417 STATIC uint8_t * 418 get_second_cached_disaster_srv(void) 419 { 420 return cached_disaster_srv[1]; 421 } 422 423 #endif /* defined(TOR_UNIT_TESTS) */ 424 425 /** When creating a blinded key, we need a parameter which construction is as 426 * follow: H(pubkey | [secret] | ed25519-basepoint | nonce). 427 * 428 * The nonce has a pre-defined format which uses the time period number 429 * period_num and the start of the period in second start_time_period. 430 * 431 * The secret of size secret_len is optional meaning that it can be NULL and 432 * thus will be ignored for the param construction. 433 * 434 * The result is put in param_out. */ 435 STATIC void 436 build_blinded_key_param(const ed25519_public_key_t *pubkey, 437 const uint8_t *secret, size_t secret_len, 438 uint64_t period_num, uint64_t period_length, 439 uint8_t *param_out) 440 { 441 size_t offset = 0; 442 const char blind_str[] = "Derive temporary signing key"; 443 uint8_t nonce[HS_KEYBLIND_NONCE_LEN]; 444 crypto_digest_t *digest; 445 446 tor_assert(pubkey); 447 tor_assert(param_out); 448 449 /* Create the nonce N. The construction is as follow: 450 * N = "key-blind" || INT_8(period_num) || INT_8(period_length) */ 451 memcpy(nonce, HS_KEYBLIND_NONCE_PREFIX, HS_KEYBLIND_NONCE_PREFIX_LEN); 452 offset += HS_KEYBLIND_NONCE_PREFIX_LEN; 453 set_uint64(nonce + offset, tor_htonll(period_num)); 454 offset += sizeof(uint64_t); 455 set_uint64(nonce + offset, tor_htonll(period_length)); 456 offset += sizeof(uint64_t); 457 tor_assert(offset == HS_KEYBLIND_NONCE_LEN); 458 459 /* Generate the parameter h and the construction is as follow: 460 * h = H(BLIND_STRING | pubkey | [secret] | ed25519-basepoint | N) */ 461 digest = crypto_digest256_new(DIGEST_SHA3_256); 462 crypto_digest_add_bytes(digest, blind_str, sizeof(blind_str)); 463 crypto_digest_add_bytes(digest, (char *) pubkey, ED25519_PUBKEY_LEN); 464 /* Optional secret. */ 465 if (secret) { 466 crypto_digest_add_bytes(digest, (char *) secret, secret_len); 467 } 468 crypto_digest_add_bytes(digest, str_ed25519_basepoint, 469 strlen(str_ed25519_basepoint)); 470 crypto_digest_add_bytes(digest, (char *) nonce, sizeof(nonce)); 471 472 /* Extract digest and put it in the param. */ 473 crypto_digest_get_digest(digest, (char *) param_out, DIGEST256_LEN); 474 crypto_digest_free(digest); 475 476 memwipe(nonce, 0, sizeof(nonce)); 477 } 478 479 /** Using an ed25519 public key and version to build the checksum of an 480 * address. Put in checksum_out. Format is: 481 * SHA3-256(".onion checksum" || PUBKEY || VERSION) 482 * 483 * checksum_out must be large enough to receive 32 bytes (DIGEST256_LEN). */ 484 static void 485 build_hs_checksum(const ed25519_public_key_t *key, uint8_t version, 486 uint8_t *checksum_out) 487 { 488 size_t offset = 0; 489 char data[HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN]; 490 491 /* Build checksum data. */ 492 memcpy(data, HS_SERVICE_ADDR_CHECKSUM_PREFIX, 493 HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN); 494 offset += HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN; 495 memcpy(data + offset, key->pubkey, ED25519_PUBKEY_LEN); 496 offset += ED25519_PUBKEY_LEN; 497 set_uint8(data + offset, version); 498 offset += sizeof(version); 499 tor_assert(offset == HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN); 500 501 /* Hash the data payload to create the checksum. */ 502 crypto_digest256((char *) checksum_out, data, sizeof(data), 503 DIGEST_SHA3_256); 504 } 505 506 /** Using an ed25519 public key, checksum and version to build the binary 507 * representation of a service address. Put in addr_out. Format is: 508 * addr_out = PUBKEY || CHECKSUM || VERSION 509 * 510 * addr_out must be large enough to receive HS_SERVICE_ADDR_LEN bytes. */ 511 static void 512 build_hs_address(const ed25519_public_key_t *key, const uint8_t *checksum, 513 uint8_t version, char *addr_out) 514 { 515 size_t offset = 0; 516 517 tor_assert(key); 518 tor_assert(checksum); 519 520 memcpy(addr_out, key->pubkey, ED25519_PUBKEY_LEN); 521 offset += ED25519_PUBKEY_LEN; 522 memcpy(addr_out + offset, checksum, HS_SERVICE_ADDR_CHECKSUM_LEN_USED); 523 offset += HS_SERVICE_ADDR_CHECKSUM_LEN_USED; 524 set_uint8(addr_out + offset, version); 525 offset += sizeof(uint8_t); 526 tor_assert(offset == HS_SERVICE_ADDR_LEN); 527 } 528 529 /** Helper for hs_parse_address(): Using a binary representation of a service 530 * address, parse its content into the key_out, checksum_out and version_out. 531 * Any out variable can be NULL in case the caller would want only one field. 532 * checksum_out MUST at least be 2 bytes long. address must be at least 533 * HS_SERVICE_ADDR_LEN bytes but doesn't need to be NUL terminated. */ 534 static void 535 hs_parse_address_impl(const char *address, ed25519_public_key_t *key_out, 536 uint8_t *checksum_out, uint8_t *version_out) 537 { 538 size_t offset = 0; 539 540 tor_assert(address); 541 542 if (key_out) { 543 /* First is the key. */ 544 memcpy(key_out->pubkey, address, ED25519_PUBKEY_LEN); 545 } 546 offset += ED25519_PUBKEY_LEN; 547 if (checksum_out) { 548 /* Followed by a 2 bytes checksum. */ 549 memcpy(checksum_out, address + offset, HS_SERVICE_ADDR_CHECKSUM_LEN_USED); 550 } 551 offset += HS_SERVICE_ADDR_CHECKSUM_LEN_USED; 552 if (version_out) { 553 /* Finally, version value is 1 byte. */ 554 *version_out = get_uint8(address + offset); 555 } 556 offset += sizeof(uint8_t); 557 /* Extra safety. */ 558 tor_assert(offset == HS_SERVICE_ADDR_LEN); 559 } 560 561 /** Using the given identity public key and a blinded public key, compute the 562 * subcredential and put it in subcred_out. 563 * This can't fail. */ 564 void 565 hs_get_subcredential(const ed25519_public_key_t *identity_pk, 566 const ed25519_public_key_t *blinded_pk, 567 hs_subcredential_t *subcred_out) 568 { 569 uint8_t credential[DIGEST256_LEN]; 570 crypto_digest_t *digest; 571 572 tor_assert(identity_pk); 573 tor_assert(blinded_pk); 574 tor_assert(subcred_out); 575 576 /* First, build the credential. Construction is as follow: 577 * credential = H("credential" | public-identity-key) */ 578 digest = crypto_digest256_new(DIGEST_SHA3_256); 579 crypto_digest_add_bytes(digest, HS_CREDENTIAL_PREFIX, 580 HS_CREDENTIAL_PREFIX_LEN); 581 crypto_digest_add_bytes(digest, (const char *) identity_pk->pubkey, 582 ED25519_PUBKEY_LEN); 583 crypto_digest_get_digest(digest, (char *) credential, DIGEST256_LEN); 584 crypto_digest_free(digest); 585 586 /* Now, compute the subcredential. Construction is as follow: 587 * subcredential = H("subcredential" | credential | blinded-public-key). */ 588 digest = crypto_digest256_new(DIGEST_SHA3_256); 589 crypto_digest_add_bytes(digest, HS_SUBCREDENTIAL_PREFIX, 590 HS_SUBCREDENTIAL_PREFIX_LEN); 591 crypto_digest_add_bytes(digest, (const char *) credential, 592 sizeof(credential)); 593 crypto_digest_add_bytes(digest, (const char *) blinded_pk->pubkey, 594 ED25519_PUBKEY_LEN); 595 crypto_digest_get_digest(digest, (char *) subcred_out->subcred, 596 SUBCRED_LEN); 597 crypto_digest_free(digest); 598 599 memwipe(credential, 0, sizeof(credential)); 600 } 601 602 /** From the given list of hidden service ports, find the ones that match the 603 * given edge connection conn, pick one at random and use it to set the 604 * connection address. Return 0 on success or -1 if none. */ 605 int 606 hs_set_conn_addr_port(const smartlist_t *ports, edge_connection_t *conn) 607 { 608 hs_port_config_t *chosen_port; 609 unsigned int warn_once = 0; 610 smartlist_t *matching_ports; 611 612 tor_assert(ports); 613 tor_assert(conn); 614 615 matching_ports = smartlist_new(); 616 SMARTLIST_FOREACH_BEGIN(ports, hs_port_config_t *, p) { 617 if (TO_CONN(conn)->port != p->virtual_port) { 618 continue; 619 } 620 if (!(p->is_unix_addr)) { 621 smartlist_add(matching_ports, p); 622 } else { 623 if (add_unix_port(matching_ports, p)) { 624 if (!warn_once) { 625 /* Unix port not supported so warn only once. */ 626 log_warn(LD_REND, "Saw AF_UNIX virtual port mapping for port %d " 627 "which is unsupported on this platform. " 628 "Ignoring it.", 629 TO_CONN(conn)->port); 630 } 631 warn_once++; 632 } 633 } 634 } SMARTLIST_FOREACH_END(p); 635 636 chosen_port = smartlist_choose(matching_ports); 637 smartlist_free(matching_ports); 638 if (chosen_port) { 639 if (conn->hs_ident) { 640 /* There is always a connection identifier at this point. Regardless of a 641 * Unix or TCP port, note the virtual port. */ 642 conn->hs_ident->orig_virtual_port = chosen_port->virtual_port; 643 } 644 645 if (!(chosen_port->is_unix_addr)) { 646 /* Get a non-AF_UNIX connection ready for connection_exit_connect() */ 647 tor_addr_copy(&TO_CONN(conn)->addr, &chosen_port->real_addr); 648 TO_CONN(conn)->port = chosen_port->real_port; 649 } else { 650 if (set_unix_port(conn, chosen_port)) { 651 /* Simply impossible to end up here else we were able to add a Unix 652 * port without AF_UNIX support... ? */ 653 tor_assert(0); 654 } 655 } 656 } 657 return (chosen_port) ? 0 : -1; 658 } 659 660 /** Return a new hs_port_config_t with its path set to 661 * <b>socket_path</b> or empty if <b>socket_path</b> is NULL */ 662 static hs_port_config_t * 663 hs_port_config_new(const char *socket_path) 664 { 665 if (!socket_path) 666 return tor_malloc_zero(sizeof(hs_port_config_t) + 1); 667 668 const size_t pathlen = strlen(socket_path) + 1; 669 hs_port_config_t *conf = 670 tor_malloc_zero(sizeof(hs_port_config_t) + pathlen); 671 memcpy(conf->unix_addr, socket_path, pathlen); 672 conf->is_unix_addr = 1; 673 return conf; 674 } 675 676 /** Parses a virtual-port to real-port/socket mapping separated by 677 * the provided separator and returns a new hs_port_config_t, 678 * or NULL and an optional error string on failure. 679 * 680 * The format is: VirtualPort SEP (IP|RealPort|IP:RealPort|'socket':path)? 681 * 682 * IP defaults to 127.0.0.1; RealPort defaults to VirtualPort. 683 */ 684 hs_port_config_t * 685 hs_parse_port_config(const char *string, const char *sep, 686 char **err_msg_out) 687 { 688 smartlist_t *sl; 689 int virtport; 690 int realport = 0; 691 uint16_t p; 692 tor_addr_t addr; 693 hs_port_config_t *result = NULL; 694 unsigned int is_unix_addr = 0; 695 const char *socket_path = NULL; 696 char *err_msg = NULL; 697 char *addrport = NULL; 698 699 sl = smartlist_new(); 700 smartlist_split_string(sl, string, sep, 701 SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2); 702 if (smartlist_len(sl) < 1 || BUG(smartlist_len(sl) > 2)) { 703 err_msg = tor_strdup("Bad syntax in hidden service port configuration."); 704 goto err; 705 } 706 virtport = (int)tor_parse_long(smartlist_get(sl,0), 10, 1, 65535, NULL,NULL); 707 if (!virtport) { 708 tor_asprintf(&err_msg, "Missing or invalid port %s in hidden service " 709 "port configuration", escaped(smartlist_get(sl,0))); 710 711 goto err; 712 } 713 if (smartlist_len(sl) == 1) { 714 /* No addr:port part; use default. */ 715 realport = virtport; 716 tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */ 717 } else { 718 int ret; 719 720 const char *addrport_element = smartlist_get(sl,1); 721 const char *rest = NULL; 722 int is_unix; 723 ret = port_cfg_line_extract_addrport(addrport_element, &addrport, 724 &is_unix, &rest); 725 726 if (ret < 0) { 727 tor_asprintf(&err_msg, "Couldn't process address <%s> from hidden " 728 "service configuration", addrport_element); 729 goto err; 730 } 731 732 if (rest && strlen(rest)) { 733 err_msg = tor_strdup("HiddenServicePort parse error: invalid port " 734 "mapping"); 735 goto err; 736 } 737 738 if (is_unix) { 739 socket_path = addrport; 740 is_unix_addr = 1; 741 } else if (strchr(addrport, ':') || strchr(addrport, '.')) { 742 /* else try it as an IP:port pair if it has a : or . in it */ 743 if (tor_addr_port_lookup(addrport, &addr, &p)<0) { 744 err_msg = tor_strdup("Unparseable address in hidden service port " 745 "configuration."); 746 goto err; 747 } 748 realport = p?p:virtport; 749 } else { 750 /* No addr:port, no addr -- must be port. */ 751 realport = (int)tor_parse_long(addrport, 10, 1, 65535, NULL, NULL); 752 if (!realport) { 753 tor_asprintf(&err_msg, "Unparseable or out-of-range port %s in " 754 "hidden service port configuration.", 755 escaped(addrport)); 756 goto err; 757 } 758 tor_addr_from_ipv4h(&addr, 0x7F000001u); /* Default to 127.0.0.1 */ 759 } 760 } 761 762 /* Allow room for unix_addr */ 763 result = hs_port_config_new(socket_path); 764 result->virtual_port = virtport; 765 result->is_unix_addr = is_unix_addr; 766 if (!is_unix_addr) { 767 result->real_port = realport; 768 tor_addr_copy(&result->real_addr, &addr); 769 result->unix_addr[0] = '\0'; 770 } 771 772 err: 773 tor_free(addrport); 774 if (err_msg_out != NULL) { 775 *err_msg_out = err_msg; 776 } else { 777 tor_free(err_msg); 778 } 779 SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); 780 smartlist_free(sl); 781 782 return result; 783 } 784 785 /** Release all storage held in a hs_port_config_t. */ 786 void 787 hs_port_config_free_(hs_port_config_t *p) 788 { 789 tor_free(p); 790 } 791 792 /** Using a base32 representation of a service address, parse its content into 793 * the key_out, checksum_out and version_out. Any out variable can be NULL in 794 * case the caller would want only one field. checksum_out MUST at least be 2 795 * bytes long. 796 * 797 * Return 0 if parsing went well; return -1 in case of error and if errmsg is 798 * non NULL, a human readable string message is set. */ 799 int 800 hs_parse_address_no_log(const char *address, ed25519_public_key_t *key_out, 801 uint8_t *checksum_out, uint8_t *version_out, 802 const char **errmsg) 803 { 804 char decoded[HS_SERVICE_ADDR_LEN]; 805 806 tor_assert(address); 807 808 if (errmsg) { 809 *errmsg = NULL; 810 } 811 812 /* Obvious length check. */ 813 if (strlen(address) != HS_SERVICE_ADDR_LEN_BASE32) { 814 if (errmsg) { 815 *errmsg = "Invalid length"; 816 } 817 goto invalid; 818 } 819 820 /* Decode address so we can extract needed fields. */ 821 if (base32_decode(decoded, sizeof(decoded), address, strlen(address)) 822 != sizeof(decoded)) { 823 if (errmsg) { 824 *errmsg = "Unable to base32 decode"; 825 } 826 goto invalid; 827 } 828 829 /* Parse the decoded address into the fields we need. */ 830 hs_parse_address_impl(decoded, key_out, checksum_out, version_out); 831 832 return 0; 833 invalid: 834 return -1; 835 } 836 837 /** Same has hs_parse_address_no_log() but emits a log warning on parsing 838 * failure. */ 839 int 840 hs_parse_address(const char *address, ed25519_public_key_t *key_out, 841 uint8_t *checksum_out, uint8_t *version_out) 842 { 843 const char *errmsg = NULL; 844 int ret = hs_parse_address_no_log(address, key_out, checksum_out, 845 version_out, &errmsg); 846 if (ret < 0) { 847 log_warn(LD_REND, "Service address %s failed to be parsed: %s", 848 escaped_safe_str(address), errmsg); 849 } 850 return ret; 851 } 852 853 /** Validate a given onion address. The length, the base32 decoding, and 854 * checksum are validated. Return 1 if valid else 0. */ 855 int 856 hs_address_is_valid(const char *address) 857 { 858 uint8_t version; 859 uint8_t checksum[HS_SERVICE_ADDR_CHECKSUM_LEN_USED]; 860 uint8_t target_checksum[DIGEST256_LEN]; 861 ed25519_public_key_t service_pubkey; 862 863 /* Parse the decoded address into the fields we need. */ 864 if (hs_parse_address(address, &service_pubkey, checksum, &version) < 0) { 865 goto invalid; 866 } 867 868 /* Get the checksum it's supposed to be and compare it with what we have 869 * encoded in the address. */ 870 build_hs_checksum(&service_pubkey, version, target_checksum); 871 if (tor_memcmp(checksum, target_checksum, sizeof(checksum))) { 872 log_warn(LD_REND, "Service address %s invalid checksum.", 873 escaped_safe_str(address)); 874 goto invalid; 875 } 876 877 /* Validate that this pubkey does not have a torsion component. We need to do 878 * this on the prop224 client-side so that attackers can't give equivalent 879 * forms of an onion address to users. */ 880 if (ed25519_validate_pubkey(&service_pubkey) < 0) { 881 log_warn(LD_REND, "Service address %s has bad pubkey .", 882 escaped_safe_str(address)); 883 goto invalid; 884 } 885 886 /* Valid address. */ 887 return 1; 888 invalid: 889 return 0; 890 } 891 892 /** Build a service address using an ed25519 public key and a given version. 893 * The returned address is base32 encoded and put in addr_out. The caller MUST 894 * make sure the addr_out is at least HS_SERVICE_ADDR_LEN_BASE32 + 1 long. 895 * 896 * Format is as follows: 897 * base32(PUBKEY || CHECKSUM || VERSION) 898 * CHECKSUM = H(".onion checksum" || PUBKEY || VERSION) 899 * */ 900 void 901 hs_build_address(const ed25519_public_key_t *key, uint8_t version, 902 char *addr_out) 903 { 904 uint8_t checksum[DIGEST256_LEN]; 905 char address[HS_SERVICE_ADDR_LEN]; 906 907 tor_assert(key); 908 tor_assert(addr_out); 909 910 /* Get the checksum of the address. */ 911 build_hs_checksum(key, version, checksum); 912 /* Get the binary address representation. */ 913 build_hs_address(key, checksum, version, address); 914 915 /* Encode the address. addr_out will be NUL terminated after this. */ 916 base32_encode(addr_out, HS_SERVICE_ADDR_LEN_BASE32 + 1, address, 917 sizeof(address)); 918 /* Validate what we just built. */ 919 tor_assert(hs_address_is_valid(addr_out)); 920 } 921 922 /** From a given ed25519 public key pk and an optional secret, compute a 923 * blinded public key and put it in blinded_pk_out. This is only useful to 924 * the client side because the client only has access to the identity public 925 * key of the service. */ 926 void 927 hs_build_blinded_pubkey(const ed25519_public_key_t *pk, 928 const uint8_t *secret, size_t secret_len, 929 uint64_t time_period_num, 930 ed25519_public_key_t *blinded_pk_out) 931 { 932 /* Our blinding key API requires a 32 bytes parameter. */ 933 uint8_t param[DIGEST256_LEN]; 934 935 tor_assert(pk); 936 tor_assert(blinded_pk_out); 937 tor_assert(!fast_mem_is_zero((char *) pk, ED25519_PUBKEY_LEN)); 938 939 build_blinded_key_param(pk, secret, secret_len, 940 time_period_num, get_time_period_length(), param); 941 ed25519_public_blind(blinded_pk_out, pk, param); 942 943 memwipe(param, 0, sizeof(param)); 944 } 945 946 /** From a given ed25519 keypair kp and an optional secret, compute a blinded 947 * keypair for the current time period and put it in blinded_kp_out. This is 948 * only useful by the service side because the client doesn't have access to 949 * the identity secret key. */ 950 void 951 hs_build_blinded_keypair(const ed25519_keypair_t *kp, 952 const uint8_t *secret, size_t secret_len, 953 uint64_t time_period_num, 954 ed25519_keypair_t *blinded_kp_out) 955 { 956 /* Our blinding key API requires a 32 bytes parameter. */ 957 uint8_t param[DIGEST256_LEN]; 958 959 tor_assert(kp); 960 tor_assert(blinded_kp_out); 961 /* Extra safety. A zeroed key is bad. */ 962 tor_assert(!fast_mem_is_zero((char *) &kp->pubkey, ED25519_PUBKEY_LEN)); 963 tor_assert(!fast_mem_is_zero((char *) &kp->seckey, ED25519_SECKEY_LEN)); 964 965 build_blinded_key_param(&kp->pubkey, secret, secret_len, 966 time_period_num, get_time_period_length(), param); 967 ed25519_keypair_blind(blinded_kp_out, kp, param); 968 969 memwipe(param, 0, sizeof(param)); 970 } 971 972 /** Return true if we are currently in the time segment between a new time 973 * period and a new SRV (in the real network that happens between 12:00 and 974 * 00:00 UTC). Here is a diagram showing exactly when this returns true: 975 * 976 * +------------------------------------------------------------------+ 977 * | | 978 * | 00:00 12:00 00:00 12:00 00:00 12:00 | 979 * | SRV#1 TP#1 SRV#2 TP#2 SRV#3 TP#3 | 980 * | | 981 * | $==========|-----------$===========|-----------$===========| | 982 * | ^^^^^^^^^^^^ ^^^^^^^^^^^^ | 983 * | | 984 * +------------------------------------------------------------------+ 985 */ 986 MOCK_IMPL(int, 987 hs_in_period_between_tp_and_srv,(const networkstatus_t *consensus, time_t now)) 988 { 989 time_t valid_after; 990 time_t srv_start_time, tp_start_time; 991 992 if (!consensus) { 993 consensus = networkstatus_get_reasonably_live_consensus(now, 994 usable_consensus_flavor()); 995 if (!consensus) { 996 return 0; 997 } 998 } 999 1000 /* Get start time of next TP and of current SRV protocol run, and check if we 1001 * are between them. */ 1002 valid_after = consensus->valid_after; 1003 srv_start_time = sr_state_get_start_time_of_current_protocol_run(); 1004 tp_start_time = hs_get_start_time_of_next_time_period(srv_start_time); 1005 1006 if (valid_after >= srv_start_time && valid_after < tp_start_time) { 1007 return 0; 1008 } 1009 1010 return 1; 1011 } 1012 1013 /** Return 1 if any virtual port in ports needs a circuit with good uptime. 1014 * Else return 0. */ 1015 int 1016 hs_service_requires_uptime_circ(const smartlist_t *ports) 1017 { 1018 tor_assert(ports); 1019 1020 SMARTLIST_FOREACH_BEGIN(ports, hs_port_config_t *, p) { 1021 if (smartlist_contains_int_as_string(get_options()->LongLivedPorts, 1022 p->virtual_port)) { 1023 return 1; 1024 } 1025 } SMARTLIST_FOREACH_END(p); 1026 return 0; 1027 } 1028 1029 /** Build hs_index which is used to find the responsible hsdirs. This index 1030 * value is used to select the responsible HSDir where their hsdir_index is 1031 * closest to this value. 1032 * SHA3-256("store-at-idx" | blinded_public_key | 1033 * INT_8(replicanum) | INT_8(period_length) | INT_8(period_num) ) 1034 * 1035 * hs_index_out must be large enough to receive DIGEST256_LEN bytes. */ 1036 void 1037 hs_build_hs_index(uint64_t replica, const ed25519_public_key_t *blinded_pk, 1038 uint64_t period_num, uint8_t *hs_index_out) 1039 { 1040 crypto_digest_t *digest; 1041 1042 tor_assert(blinded_pk); 1043 tor_assert(hs_index_out); 1044 1045 /* Build hs_index. See construction at top of function comment. */ 1046 digest = crypto_digest256_new(DIGEST_SHA3_256); 1047 crypto_digest_add_bytes(digest, HS_INDEX_PREFIX, HS_INDEX_PREFIX_LEN); 1048 crypto_digest_add_bytes(digest, (const char *) blinded_pk->pubkey, 1049 ED25519_PUBKEY_LEN); 1050 1051 /* Now setup INT_8(replicanum) | INT_8(period_length) | INT_8(period_num) */ 1052 { 1053 uint64_t period_length = get_time_period_length(); 1054 char buf[sizeof(uint64_t)*3]; 1055 size_t offset = 0; 1056 set_uint64(buf, tor_htonll(replica)); 1057 offset += sizeof(uint64_t); 1058 set_uint64(buf+offset, tor_htonll(period_length)); 1059 offset += sizeof(uint64_t); 1060 set_uint64(buf+offset, tor_htonll(period_num)); 1061 offset += sizeof(uint64_t); 1062 tor_assert(offset == sizeof(buf)); 1063 1064 crypto_digest_add_bytes(digest, buf, sizeof(buf)); 1065 } 1066 1067 crypto_digest_get_digest(digest, (char *) hs_index_out, DIGEST256_LEN); 1068 crypto_digest_free(digest); 1069 } 1070 1071 /** Build hsdir_index which is used to find the responsible hsdirs. This is the 1072 * index value that is compare to the hs_index when selecting an HSDir. 1073 * SHA3-256("node-idx" | node_identity | 1074 * shared_random_value | INT_8(period_length) | INT_8(period_num) ) 1075 * 1076 * hsdir_index_out must be large enough to receive DIGEST256_LEN bytes. */ 1077 void 1078 hs_build_hsdir_index(const ed25519_public_key_t *identity_pk, 1079 const uint8_t *srv_value, uint64_t period_num, 1080 uint8_t *hsdir_index_out) 1081 { 1082 crypto_digest_t *digest; 1083 1084 tor_assert(identity_pk); 1085 tor_assert(srv_value); 1086 tor_assert(hsdir_index_out); 1087 1088 /* Build hsdir_index. See construction at top of function comment. */ 1089 digest = crypto_digest256_new(DIGEST_SHA3_256); 1090 crypto_digest_add_bytes(digest, HSDIR_INDEX_PREFIX, HSDIR_INDEX_PREFIX_LEN); 1091 crypto_digest_add_bytes(digest, (const char *) identity_pk->pubkey, 1092 ED25519_PUBKEY_LEN); 1093 crypto_digest_add_bytes(digest, (const char *) srv_value, DIGEST256_LEN); 1094 1095 { 1096 uint64_t time_period_length = get_time_period_length(); 1097 char period_stuff[sizeof(uint64_t)*2]; 1098 size_t offset = 0; 1099 set_uint64(period_stuff, tor_htonll(period_num)); 1100 offset += sizeof(uint64_t); 1101 set_uint64(period_stuff+offset, tor_htonll(time_period_length)); 1102 offset += sizeof(uint64_t); 1103 tor_assert(offset == sizeof(period_stuff)); 1104 1105 crypto_digest_add_bytes(digest, period_stuff, sizeof(period_stuff)); 1106 } 1107 1108 crypto_digest_get_digest(digest, (char *) hsdir_index_out, DIGEST256_LEN); 1109 crypto_digest_free(digest); 1110 } 1111 1112 /** Return a newly allocated buffer containing the current shared random value 1113 * or if not present, a disaster value is computed using the given time period 1114 * number. If a consensus is provided in <b>ns</b>, use it to get the SRV 1115 * value. This function can't fail. */ 1116 uint8_t * 1117 hs_get_current_srv(uint64_t time_period_num, const networkstatus_t *ns) 1118 { 1119 uint8_t *sr_value = tor_malloc_zero(DIGEST256_LEN); 1120 const sr_srv_t *current_srv = sr_get_current(ns); 1121 1122 if (current_srv) { 1123 memcpy(sr_value, current_srv->value, sizeof(current_srv->value)); 1124 } else { 1125 /* Disaster mode. */ 1126 get_disaster_srv(time_period_num, sr_value); 1127 } 1128 return sr_value; 1129 } 1130 1131 /** Return a newly allocated buffer containing the previous shared random 1132 * value or if not present, a disaster value is computed using the given time 1133 * period number. This function can't fail. */ 1134 uint8_t * 1135 hs_get_previous_srv(uint64_t time_period_num, const networkstatus_t *ns) 1136 { 1137 uint8_t *sr_value = tor_malloc_zero(DIGEST256_LEN); 1138 const sr_srv_t *previous_srv = sr_get_previous(ns); 1139 1140 if (previous_srv) { 1141 memcpy(sr_value, previous_srv->value, sizeof(previous_srv->value)); 1142 } else { 1143 /* Disaster mode. */ 1144 get_disaster_srv(time_period_num, sr_value); 1145 } 1146 return sr_value; 1147 } 1148 1149 /** Return the number of replicas defined by a consensus parameter or the 1150 * default value. */ 1151 int32_t 1152 hs_get_hsdir_n_replicas(void) 1153 { 1154 /* The [1,16] range is a specification requirement. */ 1155 return networkstatus_get_param(NULL, "hsdir_n_replicas", 1156 HS_DEFAULT_HSDIR_N_REPLICAS, 1, 16); 1157 } 1158 1159 /** Return the spread fetch value defined by a consensus parameter or the 1160 * default value. */ 1161 int32_t 1162 hs_get_hsdir_spread_fetch(void) 1163 { 1164 /* The [1,128] range is a specification requirement. */ 1165 return networkstatus_get_param(NULL, "hsdir_spread_fetch", 1166 HS_DEFAULT_HSDIR_SPREAD_FETCH, 1, 128); 1167 } 1168 1169 /** Return the spread store value defined by a consensus parameter or the 1170 * default value. */ 1171 int32_t 1172 hs_get_hsdir_spread_store(void) 1173 { 1174 /* The [1,128] range is a specification requirement. */ 1175 return networkstatus_get_param(NULL, "hsdir_spread_store", 1176 HS_DEFAULT_HSDIR_SPREAD_STORE, 1, 128); 1177 } 1178 1179 /** <b>node</b> is an HSDir so make sure that we have assigned an hsdir index. 1180 * Return 0 if everything is as expected, else return -1. */ 1181 static int 1182 node_has_hsdir_index(const node_t *node) 1183 { 1184 tor_assert(node_supports_v3_hsdir(node)); 1185 1186 /* A node can't have an HSDir index without a descriptor since we need desc 1187 * to get its ed25519 key. for_direct_connect should be zero, since we 1188 * always use the consensus-indexed node's keys to build the hash ring, even 1189 * if some of the consensus-indexed nodes are also bridges. */ 1190 if (!node_has_preferred_descriptor(node, 0)) { 1191 return 0; 1192 } 1193 1194 /* At this point, since the node has a desc, this node must also have an 1195 * hsdir index. If not, something went wrong, so BUG out. */ 1196 if (BUG(fast_mem_is_zero((const char*)node->hsdir_index.fetch, 1197 DIGEST256_LEN))) { 1198 return 0; 1199 } 1200 if (BUG(fast_mem_is_zero((const char*)node->hsdir_index.store_first, 1201 DIGEST256_LEN))) { 1202 return 0; 1203 } 1204 if (BUG(fast_mem_is_zero((const char*)node->hsdir_index.store_second, 1205 DIGEST256_LEN))) { 1206 return 0; 1207 } 1208 1209 return 1; 1210 } 1211 1212 /** For a given blinded key and time period number, get the responsible HSDir 1213 * and put their routerstatus_t object in the responsible_dirs list. If 1214 * 'use_second_hsdir_index' is true, use the second hsdir_index of the node_t 1215 * is used. If 'for_fetching' is true, the spread fetch consensus parameter is 1216 * used else the spread store is used which is only for upload. This function 1217 * can't fail but it is possible that the responsible_dirs list contains fewer 1218 * nodes than expected. 1219 * 1220 * This function goes over the latest consensus routerstatus list and sorts it 1221 * by their node_t hsdir_index then does a binary search to find the closest 1222 * node. All of this makes it a bit CPU intensive so use it wisely. */ 1223 void 1224 hs_get_responsible_hsdirs(const ed25519_public_key_t *blinded_pk, 1225 uint64_t time_period_num, int use_second_hsdir_index, 1226 int for_fetching, smartlist_t *responsible_dirs) 1227 { 1228 smartlist_t *sorted_nodes; 1229 /* The compare function used for the smartlist bsearch. We have two 1230 * different depending on is_next_period. */ 1231 int (*cmp_fct)(const void *, const void **); 1232 1233 tor_assert(blinded_pk); 1234 tor_assert(responsible_dirs); 1235 1236 sorted_nodes = smartlist_new(); 1237 1238 /* Make sure we actually have a live consensus */ 1239 networkstatus_t *c = 1240 networkstatus_get_reasonably_live_consensus(approx_time(), 1241 usable_consensus_flavor()); 1242 if (!c || smartlist_len(c->routerstatus_list) == 0) { 1243 log_warn(LD_REND, "No live consensus so we can't get the responsible " 1244 "hidden service directories."); 1245 goto done; 1246 } 1247 1248 /* Ensure the nodelist is fresh, since it contains the HSDir indices. */ 1249 nodelist_ensure_freshness(c); 1250 1251 /* Add every node_t that support HSDir v3 for which we do have a valid 1252 * hsdir_index already computed for them for this consensus. */ 1253 { 1254 SMARTLIST_FOREACH_BEGIN(c->routerstatus_list, const routerstatus_t *, rs) { 1255 /* Even though this node_t object won't be modified and should be const, 1256 * we can't add const object in a smartlist_t. */ 1257 node_t *n = node_get_mutable_by_id(rs->identity_digest); 1258 tor_assert(n); 1259 if (node_supports_v3_hsdir(n) && rs->is_hs_dir) { 1260 if (!node_has_hsdir_index(n)) { 1261 log_info(LD_GENERAL, "Node %s was found without hsdir index.", 1262 node_describe(n)); 1263 continue; 1264 } 1265 smartlist_add(sorted_nodes, n); 1266 } 1267 } SMARTLIST_FOREACH_END(rs); 1268 } 1269 if (smartlist_len(sorted_nodes) == 0) { 1270 log_warn(LD_REND, "No nodes found to be HSDir or supporting v3."); 1271 goto done; 1272 } 1273 1274 /* First thing we have to do is sort all node_t by hsdir_index. The 1275 * is_next_period tells us if we want the current or the next one. Set the 1276 * bsearch compare function also while we are at it. */ 1277 if (for_fetching) { 1278 smartlist_sort(sorted_nodes, compare_node_fetch_hsdir_index); 1279 cmp_fct = compare_digest_to_fetch_hsdir_index; 1280 } else if (use_second_hsdir_index) { 1281 smartlist_sort(sorted_nodes, compare_node_store_second_hsdir_index); 1282 cmp_fct = compare_digest_to_store_second_hsdir_index; 1283 } else { 1284 smartlist_sort(sorted_nodes, compare_node_store_first_hsdir_index); 1285 cmp_fct = compare_digest_to_store_first_hsdir_index; 1286 } 1287 1288 /* For all replicas, we'll select a set of HSDirs using the consensus 1289 * parameters and the sorted list. The replica starting at value 1 is 1290 * defined by the specification. */ 1291 for (int replica = 1; replica <= hs_get_hsdir_n_replicas(); replica++) { 1292 int idx, start, found, n_added = 0; 1293 uint8_t hs_index[DIGEST256_LEN] = {0}; 1294 /* Number of node to add to the responsible dirs list depends on if we are 1295 * trying to fetch or store. A client always fetches. */ 1296 int n_to_add = (for_fetching) ? hs_get_hsdir_spread_fetch() : 1297 hs_get_hsdir_spread_store(); 1298 1299 /* Get the index that we should use to select the node. */ 1300 hs_build_hs_index(replica, blinded_pk, time_period_num, hs_index); 1301 /* The compare function pointer has been set correctly earlier. */ 1302 start = idx = smartlist_bsearch_idx(sorted_nodes, hs_index, cmp_fct, 1303 &found); 1304 /* Getting the length of the list if no member is greater than the key we 1305 * are looking for so start at the first element. */ 1306 if (idx == smartlist_len(sorted_nodes)) { 1307 start = idx = 0; 1308 } 1309 while (n_added < n_to_add) { 1310 const node_t *node = smartlist_get(sorted_nodes, idx); 1311 /* If the node has already been selected which is possible between 1312 * replicas, the specification says to skip over. */ 1313 if (!smartlist_contains(responsible_dirs, node->rs)) { 1314 smartlist_add(responsible_dirs, node->rs); 1315 ++n_added; 1316 } 1317 if (++idx == smartlist_len(sorted_nodes)) { 1318 /* Wrap if we've reached the end of the list. */ 1319 idx = 0; 1320 } 1321 if (idx == start) { 1322 /* We've gone over the whole list, stop and avoid infinite loop. */ 1323 break; 1324 } 1325 } 1326 } 1327 1328 done: 1329 smartlist_free(sorted_nodes); 1330 } 1331 1332 /*********************** HSDir request tracking ***************************/ 1333 1334 /** Return the period for which a hidden service directory cannot be queried 1335 * for the same descriptor ID again, taking TestingTorNetwork into account. */ 1336 time_t 1337 hs_hsdir_requery_period(const or_options_t *options) 1338 { 1339 tor_assert(options); 1340 1341 if (options->TestingTorNetwork) { 1342 return REND_HID_SERV_DIR_REQUERY_PERIOD_TESTING; 1343 } else { 1344 return REND_HID_SERV_DIR_REQUERY_PERIOD; 1345 } 1346 } 1347 1348 /** Tracks requests for fetching hidden service descriptors. It's used by 1349 * hidden service clients, to avoid querying HSDirs that have already failed 1350 * giving back a descriptor. The same data structure is used to track v3 HS 1351 * descriptor requests. 1352 * 1353 * The string map is a key/value store that contains the last request times to 1354 * hidden service directories for certain queries. Specifically: 1355 * 1356 * key = base32(hsdir_identity) + base32(hs_identity) 1357 * value = time_t of last request for that hs_identity to that HSDir 1358 * 1359 * where 'hsdir_identity' is the identity digest of the HSDir node, and 1360 * 'hs_identity' is the ed25519 blinded public key of the HS for v3. */ 1361 static strmap_t *last_hid_serv_requests_ = NULL; 1362 1363 /** Returns last_hid_serv_requests_, initializing it to a new strmap if 1364 * necessary. */ 1365 STATIC strmap_t * 1366 get_last_hid_serv_requests(void) 1367 { 1368 if (!last_hid_serv_requests_) 1369 last_hid_serv_requests_ = strmap_new(); 1370 return last_hid_serv_requests_; 1371 } 1372 1373 /** Look up the last request time to hidden service directory <b>hs_dir</b> 1374 * for descriptor request key <b>req_key_str</b> which is the blinded key for 1375 * v3. If <b>set</b> is non-zero, assign the current time <b>now</b> and 1376 * return that. Otherwise, return the most recent request time, or 0 if no 1377 * such request has been sent before. */ 1378 time_t 1379 hs_lookup_last_hid_serv_request(routerstatus_t *hs_dir, 1380 const char *req_key_str, 1381 time_t now, int set) 1382 { 1383 char hsdir_id_base32[BASE32_DIGEST_LEN + 1]; 1384 char *hsdir_desc_comb_id = NULL; 1385 time_t *last_request_ptr; 1386 strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); 1387 1388 /* Create the key */ 1389 base32_encode(hsdir_id_base32, sizeof(hsdir_id_base32), 1390 hs_dir->identity_digest, DIGEST_LEN); 1391 tor_asprintf(&hsdir_desc_comb_id, "%s%s", hsdir_id_base32, req_key_str); 1392 1393 if (set) { 1394 time_t *oldptr; 1395 last_request_ptr = tor_malloc_zero(sizeof(time_t)); 1396 *last_request_ptr = now; 1397 oldptr = strmap_set(last_hid_serv_requests, hsdir_desc_comb_id, 1398 last_request_ptr); 1399 tor_free(oldptr); 1400 } else { 1401 last_request_ptr = strmap_get(last_hid_serv_requests, 1402 hsdir_desc_comb_id); 1403 } 1404 1405 tor_free(hsdir_desc_comb_id); 1406 return (last_request_ptr) ? *last_request_ptr : 0; 1407 } 1408 1409 /** Clean the history of request times to hidden service directories, so that 1410 * it does not contain requests older than REND_HID_SERV_DIR_REQUERY_PERIOD 1411 * seconds any more. */ 1412 void 1413 hs_clean_last_hid_serv_requests(time_t now) 1414 { 1415 strmap_iter_t *iter; 1416 time_t cutoff = now - hs_hsdir_requery_period(get_options()); 1417 strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); 1418 for (iter = strmap_iter_init(last_hid_serv_requests); 1419 !strmap_iter_done(iter); ) { 1420 const char *key; 1421 void *val; 1422 time_t *ent; 1423 strmap_iter_get(iter, &key, &val); 1424 ent = (time_t *) val; 1425 if (*ent < cutoff) { 1426 iter = strmap_iter_next_rmv(last_hid_serv_requests, iter); 1427 tor_free(ent); 1428 } else { 1429 iter = strmap_iter_next(last_hid_serv_requests, iter); 1430 } 1431 } 1432 } 1433 1434 /** Remove all requests related to the descriptor request key string 1435 * <b>req_key_str</b> from the history of times of requests to hidden service 1436 * directories. 1437 * 1438 * This is called from purge_hid_serv_request(), which must be idempotent, so 1439 * any future changes to this function must leave it idempotent too. */ 1440 void 1441 hs_purge_hid_serv_from_last_hid_serv_requests(const char *req_key_str) 1442 { 1443 strmap_iter_t *iter; 1444 strmap_t *last_hid_serv_requests = get_last_hid_serv_requests(); 1445 1446 for (iter = strmap_iter_init(last_hid_serv_requests); 1447 !strmap_iter_done(iter); ) { 1448 const char *key; 1449 void *val; 1450 strmap_iter_get(iter, &key, &val); 1451 1452 /* XXX: The use of REND_DESC_ID_V2_LEN_BASE32 is very wrong in terms of 1453 * semantic, see #23305. */ 1454 1455 /* This strmap contains variable-sized elements so this is a basic length 1456 * check on the strings we are about to compare. The key is variable sized 1457 * since it's composed as follows: 1458 * key = base32(hsdir_identity) + base32(req_key_str) 1459 * where 'req_key_str' is the ed25519 blinded public key of the HS v3. */ 1460 if (strlen(key) < REND_DESC_ID_V2_LEN_BASE32 + strlen(req_key_str)) { 1461 iter = strmap_iter_next(last_hid_serv_requests, iter); 1462 continue; 1463 } 1464 1465 /* Check if the tracked request matches our request key */ 1466 if (tor_memeq(key + REND_DESC_ID_V2_LEN_BASE32, req_key_str, 1467 strlen(req_key_str))) { 1468 iter = strmap_iter_next_rmv(last_hid_serv_requests, iter); 1469 tor_free(val); 1470 } else { 1471 iter = strmap_iter_next(last_hid_serv_requests, iter); 1472 } 1473 } 1474 } 1475 1476 /** Purge the history of request times to hidden service directories, 1477 * so that future lookups of an HS descriptor will not fail because we 1478 * accessed all of the HSDir relays responsible for the descriptor 1479 * recently. */ 1480 void 1481 hs_purge_last_hid_serv_requests(void) 1482 { 1483 /* Don't create the table if it doesn't exist yet (and it may very 1484 * well not exist if the user hasn't accessed any HSes)... */ 1485 strmap_t *old_last_hid_serv_requests = last_hid_serv_requests_; 1486 /* ... and let get_last_hid_serv_requests re-create it for us if 1487 * necessary. */ 1488 last_hid_serv_requests_ = NULL; 1489 1490 if (old_last_hid_serv_requests != NULL) { 1491 log_info(LD_REND, "Purging client last-HS-desc-request-time table"); 1492 strmap_free(old_last_hid_serv_requests, tor_free_); 1493 } 1494 } 1495 1496 /***********************************************************************/ 1497 1498 /** Given the list of responsible HSDirs in <b>responsible_dirs</b>, pick the 1499 * one that we should use to fetch a descriptor right now. Take into account 1500 * previous failed attempts at fetching this descriptor from HSDirs using the 1501 * string identifier <b>req_key_str</b>. We return whether we are rate limited 1502 * into *<b>is_rate_limited_out</b> if it is not NULL. 1503 * 1504 * Steals ownership of <b>responsible_dirs</b>. 1505 * 1506 * Return the routerstatus of the chosen HSDir if successful, otherwise return 1507 * NULL if no HSDirs are worth trying right now. */ 1508 routerstatus_t * 1509 hs_pick_hsdir(smartlist_t *responsible_dirs, const char *req_key_str, 1510 bool *is_rate_limited_out) 1511 { 1512 smartlist_t *usable_responsible_dirs = smartlist_new(); 1513 const or_options_t *options = get_options(); 1514 routerstatus_t *hs_dir; 1515 time_t now = time(NULL); 1516 int excluded_some; 1517 bool rate_limited = false; 1518 int rate_limited_count = 0; 1519 int responsible_dirs_count = smartlist_len(responsible_dirs); 1520 1521 tor_assert(req_key_str); 1522 1523 /* Clean outdated request history first. */ 1524 hs_clean_last_hid_serv_requests(now); 1525 1526 /* Only select those hidden service directories to which we did not send a 1527 * request recently and for which we have a router descriptor here. 1528 * 1529 * Use for_direct_connect==0 even if we will be connecting to the node 1530 * directly, since we always use the key information in the 1531 * consensus-indexed node descriptors for building the index. 1532 **/ 1533 SMARTLIST_FOREACH_BEGIN(responsible_dirs, routerstatus_t *, dir) { 1534 time_t last = hs_lookup_last_hid_serv_request(dir, req_key_str, 0, 0); 1535 const node_t *node = node_get_by_id(dir->identity_digest); 1536 if (last + hs_hsdir_requery_period(options) >= now || 1537 !node || !node_has_preferred_descriptor(node, 0)) { 1538 SMARTLIST_DEL_CURRENT(responsible_dirs, dir); 1539 rate_limited_count++; 1540 continue; 1541 } 1542 if (!routerset_contains_node(options->ExcludeNodes, node)) { 1543 smartlist_add(usable_responsible_dirs, dir); 1544 } 1545 } SMARTLIST_FOREACH_END(dir); 1546 1547 if (rate_limited_count > 0 || responsible_dirs_count > 0) { 1548 rate_limited = rate_limited_count == responsible_dirs_count; 1549 } 1550 1551 excluded_some = 1552 smartlist_len(usable_responsible_dirs) < smartlist_len(responsible_dirs); 1553 1554 hs_dir = smartlist_choose(usable_responsible_dirs); 1555 if (!hs_dir && !options->StrictNodes) { 1556 hs_dir = smartlist_choose(responsible_dirs); 1557 } 1558 1559 smartlist_free(responsible_dirs); 1560 smartlist_free(usable_responsible_dirs); 1561 if (!hs_dir) { 1562 const char *warn_str = (rate_limited) ? "we are rate limited." : 1563 "we requested them all recently without success"; 1564 log_info(LD_REND, "Could not pick one of the responsible hidden " 1565 "service directories, because %s.", warn_str); 1566 if (options->StrictNodes && excluded_some) { 1567 log_warn(LD_REND, "Could not pick a hidden service directory for the " 1568 "requested hidden service: they are all either down or " 1569 "excluded, and StrictNodes is set."); 1570 } 1571 } else { 1572 /* Remember that we are requesting a descriptor from this hidden service 1573 * directory now. */ 1574 hs_lookup_last_hid_serv_request(hs_dir, req_key_str, now, 1); 1575 } 1576 1577 if (is_rate_limited_out != NULL) { 1578 *is_rate_limited_out = rate_limited; 1579 } 1580 1581 return hs_dir; 1582 } 1583 1584 /** Given a list of link specifiers lspecs, a curve 25519 onion_key, and 1585 * a direct connection boolean direct_conn (true for single onion services), 1586 * return a newly allocated extend_info_t object. 1587 * 1588 * This function always returns an extend info with a valid IP address and 1589 * ORPort, or NULL. If direct_conn is false, the IP address is always IPv4. 1590 * 1591 * It performs the following checks: 1592 * if there is no usable IP address, or legacy ID is missing, return NULL. 1593 * if direct_conn, and we can't reach any IP address, return NULL. 1594 */ 1595 extend_info_t * 1596 hs_get_extend_info_from_lspecs(const smartlist_t *lspecs, 1597 const curve25519_public_key_t *onion_key, 1598 int direct_conn) 1599 { 1600 int have_v4 = 0, have_legacy_id = 0, have_ed25519_id = 0; 1601 char legacy_id[DIGEST_LEN] = {0}; 1602 ed25519_public_key_t ed25519_pk; 1603 extend_info_t *info = NULL; 1604 tor_addr_port_t ap; 1605 1606 tor_addr_make_null(&ap.addr, AF_UNSPEC); 1607 ap.port = 0; 1608 1609 if (lspecs == NULL) { 1610 log_warn(LD_BUG, "Specified link specifiers is null"); 1611 goto done; 1612 } 1613 1614 if (onion_key == NULL) { 1615 log_warn(LD_BUG, "Specified onion key is null"); 1616 goto done; 1617 } 1618 1619 if (smartlist_len(lspecs) == 0) { 1620 log_fn(LOG_PROTOCOL_WARN, LD_REND, "Empty link specifier list."); 1621 /* Return NULL. */ 1622 goto done; 1623 } 1624 1625 SMARTLIST_FOREACH_BEGIN(lspecs, const link_specifier_t *, ls) { 1626 switch (link_specifier_get_ls_type(ls)) { 1627 case LS_IPV4: 1628 /* Skip if we already seen a v4. If direct_conn is true, we skip this 1629 * block because reachable_addr_choose_from_ls() will set ap. If 1630 * direct_conn is false, set ap to the first IPv4 address and port in 1631 * the link specifiers.*/ 1632 if (have_v4 || direct_conn) continue; 1633 tor_addr_from_ipv4h(&ap.addr, 1634 link_specifier_get_un_ipv4_addr(ls)); 1635 ap.port = link_specifier_get_un_ipv4_port(ls); 1636 have_v4 = 1; 1637 break; 1638 case LS_LEGACY_ID: 1639 /* Make sure we do have enough bytes for the legacy ID. */ 1640 if (link_specifier_getlen_un_legacy_id(ls) < sizeof(legacy_id)) { 1641 break; 1642 } 1643 memcpy(legacy_id, link_specifier_getconstarray_un_legacy_id(ls), 1644 sizeof(legacy_id)); 1645 have_legacy_id = 1; 1646 break; 1647 case LS_ED25519_ID: 1648 memcpy(ed25519_pk.pubkey, 1649 link_specifier_getconstarray_un_ed25519_id(ls), 1650 ED25519_PUBKEY_LEN); 1651 have_ed25519_id = 1; 1652 break; 1653 default: 1654 /* Ignore unknown. */ 1655 break; 1656 } 1657 } SMARTLIST_FOREACH_END(ls); 1658 1659 /* Choose a preferred address first, but fall back to an allowed address. */ 1660 if (direct_conn) 1661 reachable_addr_choose_from_ls(lspecs, 0, &ap); 1662 1663 /* Legacy ID is mandatory, and we require an IP address. */ 1664 if (!tor_addr_port_is_valid_ap(&ap, 0)) { 1665 /* If we're missing the IP address, log a warning and return NULL. */ 1666 log_info(LD_NET, "Unreachable or invalid IP address in link state"); 1667 goto done; 1668 } 1669 if (!have_legacy_id) { 1670 /* If we're missing the legacy ID, log a warning and return NULL. */ 1671 log_warn(LD_PROTOCOL, "Missing Legacy ID in link state"); 1672 goto done; 1673 } 1674 1675 /* We will add support for falling back to a 3-hop path in a later 1676 * release. */ 1677 1678 /* We'll validate now that the address we've picked isn't a private one. If 1679 * it is, are we allowed to extend to private addresses? */ 1680 if (!extend_info_addr_is_allowed(&ap.addr)) { 1681 log_fn(LOG_PROTOCOL_WARN, LD_REND, 1682 "Requested address is private and we are not allowed to extend to " 1683 "it: %s:%u", safe_str(fmt_addr(&ap.addr)), ap.port); 1684 goto done; 1685 } 1686 1687 /* We do have everything for which we think we can connect successfully. */ 1688 info = extend_info_new(NULL, legacy_id, 1689 (have_ed25519_id) ? &ed25519_pk : NULL, 1690 onion_key, &ap.addr, ap.port, NULL, false); 1691 done: 1692 return info; 1693 } 1694 1695 /***********************************************************************/ 1696 1697 /** Initialize the entire HS subsystem. This is called in tor_init() before any 1698 * torrc options are loaded. Only for >= v3. */ 1699 void 1700 hs_init(void) 1701 { 1702 hs_circuitmap_init(); 1703 hs_service_init(); 1704 hs_cache_init(); 1705 } 1706 1707 /** Release and cleanup all memory of the HS subsystem (all version). This is 1708 * called by tor_free_all(). */ 1709 void 1710 hs_free_all(void) 1711 { 1712 hs_circuitmap_free_all(); 1713 hs_service_free_all(); 1714 hs_cache_free_all(); 1715 hs_client_free_all(); 1716 hs_ob_free_all(); 1717 } 1718 1719 /** For the given origin circuit circ, decrement the number of rendezvous 1720 * stream counter. This handles every hidden service version. */ 1721 void 1722 hs_dec_rdv_stream_counter(origin_circuit_t *circ) 1723 { 1724 tor_assert(circ); 1725 1726 if (circ->hs_ident) { 1727 circ->hs_ident->num_rdv_streams--; 1728 } else { 1729 /* Should not be called if this circuit is not for hidden service. */ 1730 tor_assert_nonfatal_unreached(); 1731 } 1732 } 1733 1734 /** For the given origin circuit circ, increment the number of rendezvous 1735 * stream counter. This handles every hidden service version. */ 1736 void 1737 hs_inc_rdv_stream_counter(origin_circuit_t *circ) 1738 { 1739 tor_assert(circ); 1740 1741 if (circ->hs_ident) { 1742 circ->hs_ident->num_rdv_streams++; 1743 } else { 1744 /* Should not be called if this circuit is not for hidden service. */ 1745 tor_assert_nonfatal_unreached(); 1746 } 1747 } 1748 1749 /** Return a newly allocated link specifier object that is a copy of dst. */ 1750 link_specifier_t * 1751 link_specifier_dup(const link_specifier_t *src) 1752 { 1753 link_specifier_t *dup = NULL; 1754 uint8_t *buf = NULL; 1755 1756 if (BUG(!src)) { 1757 goto err; 1758 } 1759 1760 ssize_t encoded_len_alloc = link_specifier_encoded_len(src); 1761 if (BUG(encoded_len_alloc < 0)) { 1762 goto err; 1763 } 1764 1765 buf = tor_malloc_zero(encoded_len_alloc); 1766 ssize_t encoded_len_data = link_specifier_encode(buf, 1767 encoded_len_alloc, 1768 src); 1769 if (BUG(encoded_len_data < 0)) { 1770 goto err; 1771 } 1772 1773 ssize_t parsed_len = link_specifier_parse(&dup, buf, encoded_len_alloc); 1774 if (BUG(parsed_len < 0)) { 1775 goto err; 1776 } 1777 1778 goto done; 1779 1780 err: 1781 dup = NULL; 1782 1783 done: 1784 tor_free(buf); 1785 return dup; 1786 }