diff options
445 files changed, 27422 insertions, 10130 deletions
diff --git a/.gitignore b/.gitignore index d33b79736d..68bad5f113 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ .dirstamp *.trs *.log +# Calltool stuff +.*.graph # Stuff made by our makefiles *.bak # Python droppings @@ -123,6 +125,9 @@ uptime-*.json /src/Makefile /src/Makefile.in +# /src/trace +/src/trace/libor-trace.a + # /src/common/ /src/common/Makefile /src/common/Makefile.in @@ -179,6 +184,7 @@ uptime-*.json /src/test/test-child /src/test/test-memwipe /src/test/test-ntor-cl +/src/test/test-hs-ntor-cl /src/test/test-switch-id /src/test/test-timers /src/test/test_workqueue @@ -187,6 +193,7 @@ uptime-*.json /src/test/test-bt-cl.exe /src/test/test-child.exe /src/test/test-ntor-cl.exe +/src/test/test-hs-ntor-cl.exe /src/test/test-memwipe.exe /src/test/test-switch-id.exe /src/test/test-timers.exe @@ -1,4 +1,734 @@ -Changes in version 0.3.0.4-??? - 2017-02-?? +Changes in version 0.3.1.1-alpha - 2017-??-?? + + +Changes in version 0.3.0.6 - 2017-04-26 + Tor 0.3.0.6 is the first stable release of the Tor 0.3.0 series. + + With the 0.3.0 series, clients and relays now use Ed25519 keys to + authenticate their link connections to relays, rather than the old + RSA1024 keys that they used before. (Circuit crypto has been + Curve25519-authenticated since 0.2.4.8-alpha.) We have also replaced + the guard selection and replacement algorithm to behave more robustly + in the presence of unreliable networks, and to resist guard- + capture attacks. + + This series also includes numerous other small features and bugfixes, + along with more groundwork for the upcoming hidden-services revamp. + + Per our stable release policy, we plan to support the Tor 0.3.0 + release series for at least the next nine months, or for three months + after the first stable release of the 0.3.1 series: whichever is + longer. If you need a release with long-term support, we recommend + that you stay with the 0.2.9 series. + + Below are the changes since 0.3.0.5-rc. For a list of all changes + since 0.2.9, see the ReleaseNotes file. + + o Minor features (geoip): + - Update geoip and geoip6 to the April 4 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfixes (control port): + - The GETINFO extra-info/digest/<digest> command was broken because + of a wrong base16 decode return value check, introduced when + refactoring that API. Fixes bug 22034; bugfix on 0.2.9.1-alpha. + + o Minor bugfixes (crash prevention): + - Fix a (currently untriggerable, but potentially dangerous) crash + bug when base32-encoding inputs whose sizes are not a multiple of + 5. Fixes bug 21894; bugfix on 0.2.9.1-alpha. + + +Changes in version 0.3.0.5-rc - 2017-04-05 + Tor 0.3.0.5-rc fixes a few remaining bugs, large and small, in the + 0.3.0 release series. + + This is the second release candidate in the Tor 0.3.0 series, and has + much fewer changes than the first. If we find no new bugs or + regressions here, the first stable 0.3.0 release will be nearly + identical to it. + + o Major bugfixes (crash, directory connections): + - Fix a rare crash when sending a begin cell on a circuit whose + linked directory connection had already been closed. Fixes bug + 21576; bugfix on 0.2.9.3-alpha. Reported by Alec Muffett. + + o Major bugfixes (guard selection): + - Fix a guard selection bug where Tor would refuse to bootstrap in + some cases if the user swapped a bridge for another bridge in + their configuration file. Fixes bug 21771; bugfix on 0.3.0.1-alpha. + Reported by "torvlnt33r". + + o Minor features (geoip): + - Update geoip and geoip6 to the March 7 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfix (compilation): + - Fix a warning when compiling hs_service.c. Previously, it had no + exported symbols when compiled for libor.a, resulting in a + compilation warning from clang. Fixes bug 21825; bugfix + on 0.3.0.1-alpha. + + o Minor bugfixes (hidden services): + - Make hidden services check for failed intro point connections, + even when they have exceeded their intro point creation limit. + Fixes bug 21596; bugfix on 0.2.7.2-alpha. Reported by Alec Muffett. + - Make hidden services with 8 to 10 introduction points check for + failed circuits immediately after startup. Previously, they would + wait for 5 minutes before performing their first checks. Fixes bug + 21594; bugfix on 0.2.3.9-alpha. Reported by Alec Muffett. + + o Minor bugfixes (memory leaks): + - Fix a memory leak when using GETCONF on a port option. Fixes bug + 21682; bugfix on 0.3.0.3-alpha. + + o Minor bugfixes (relay): + - Avoid a double-marked-circuit warning that could happen when we + receive DESTROY cells under heavy load. Fixes bug 20059; bugfix + on 0.1.0.1-rc. + + o Minor bugfixes (tests): + - Run the entry_guard_parse_from_state_full() test with the time set + to a specific date. (The guard state that this test was parsing + contained guards that had expired since the test was first + written.) Fixes bug 21799; bugfix on 0.3.0.1-alpha. + + o Documentation: + - Update the description of the directory server options in the + manual page, to clarify that a relay no longer needs to set + DirPort in order to be a directory cache. Closes ticket 21720. + + + +Changes in version 0.2.8.13 - 2017-03-03 + Tor 0.2.8.13 backports a security fix from later Tor + releases. Anybody running Tor 0.2.8.12 or earlier should upgrade to this + this release, if for some reason they cannot upgrade to a later + release series, and if they build Tor with the --enable-expensive-hardening + option. + + Note that support for Tor 0.2.8.x is ending next year: we will not issue + any fixes for the Tor 0.2.8.x series after 1 Jan 2018. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + +Changes in version 0.2.7.7 - 2017-03-03 + Tor 0.2.7.7 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.7.6 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.7.x is ending this year: we will not issue + any fixes for the Tor 0.2.7.x series after 1 August 2017. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): + - Stop a crash that could occur when a client running with DNSPort + received a query with multiple address types, and the first + address type was not supported. Found and fixed by Scott Dial. + Fixes bug 18710; bugfix on 0.2.5.4-alpha. + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + +Changes in version 0.2.6.11 - 2017-03-03 + Tor 0.2.6.11 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.6.10 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.6.x is ending this year: we will not issue + any fixes for the Tor 0.2.6.x series after 1 August 2017. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major features (security fixes, backport from 0.2.9.4-alpha): + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): + - Stop a crash that could occur when a client running with DNSPort + received a query with multiple address types, and the first + address type was not supported. Found and fixed by Scott Dial. + Fixes bug 18710; bugfix on 0.2.5.4-alpha. + + o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): + - Fix an error that could cause us to read 4 bytes before the + beginning of an openssl string. This bug could be used to cause + Tor to crash on systems with unusual malloc implementations, or + systems with unusual hardening installed. Fixes bug 17404; bugfix + on 0.2.3.6-alpha. + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (guard selection, backport from 0.2.7.6): + - Actually look at the Guard flag when selecting a new directory + guard. When we implemented the directory guard design, we + accidentally started treating all relays as if they have the Guard + flag during guard selection, leading to weaker anonymity and worse + performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered + by Mohsen Imani. + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfixes (compilation, backport from 0.2.7.6): + - Fix a compilation warning with Clang 3.6: Do not check the + presence of an address which can never be NULL. Fixes bug 17781. + + +Changes in version 0.2.5.13 - 2017-03-03 + Tor 0.2.5.13 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.5.13 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.5.x is ending next year: we will not issue + any fixes for the Tor 0.2.5.x series after 1 May 2018. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major features (security fixes, backport from 0.2.9.4-alpha): + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): + - Stop a crash that could occur when a client running with DNSPort + received a query with multiple address types, and the first + address type was not supported. Found and fixed by Scott Dial. + Fixes bug 18710; bugfix on 0.2.5.4-alpha. + + o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): + - Fix an error that could cause us to read 4 bytes before the + beginning of an openssl string. This bug could be used to cause + Tor to crash on systems with unusual malloc implementations, or + systems with unusual hardening installed. Fixes bug 17404; bugfix + on 0.2.3.6-alpha. + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (guard selection, backport from 0.2.7.6): + - Actually look at the Guard flag when selecting a new directory + guard. When we implemented the directory guard design, we + accidentally started treating all relays as if they have the Guard + flag during guard selection, leading to weaker anonymity and worse + performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered + by Mohsen Imani. + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfixes (compilation, backport from 0.2.7.6): + - Fix a compilation warning with Clang 3.6: Do not check the + presence of an address which can never be NULL. Fixes bug 17781. + + o Minor bugfixes (crypto error-handling, backport from 0.2.7.2-alpha): + - Check for failures from crypto_early_init, and refuse to continue. + A previous typo meant that we could keep going with an + uninitialized crypto library, and would have OpenSSL initialize + its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced + when implementing ticket 4900. Patch by "teor". + + o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha): + - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on + a client authorized hidden service. Fixes bug 15823; bugfix + on 0.2.1.6-alpha. + + +Changes in version 0.2.4.28 - 2017-03-03 + Tor 0.2.4.28 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.4.27 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.4.x is ending soon: we will not issue + any fixes for the Tor 0.2.4.x series after 1 August 2017. If you need + a Tor release series with long-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major features (security fixes, backport from 0.2.9.4-alpha): + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): + - Fix an error that could cause us to read 4 bytes before the + beginning of an openssl string. This bug could be used to cause + Tor to crash on systems with unusual malloc implementations, or + systems with unusual hardening installed. Fixes bug 17404; bugfix + on 0.2.3.6-alpha. + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (guard selection, backport from 0.2.7.6): + - Actually look at the Guard flag when selecting a new directory + guard. When we implemented the directory guard design, we + accidentally started treating all relays as if they have the Guard + flag during guard selection, leading to weaker anonymity and worse + performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered + by Mohsen Imani. + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (DoS-resistance, backport from 0.2.7.1-alpha): + - Make it harder for attackers to overload hidden services with + introductions, by blocking multiple introduction requests on the + same circuit. Resolves ticket 15515. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfixes (compilation, backport from 0.2.7.6): + - Fix a compilation warning with Clang 3.6: Do not check the + presence of an address which can never be NULL. Fixes bug 17781. + + o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha): + - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on + a client authorized hidden service. Fixes bug 15823; bugfix + on 0.2.1.6-alpha. + + +Changes in version 0.3.0.4-rc - 2017-03-01 + Tor 0.3.0.4-rc fixes some remaining bugs, large and small, in the + 0.3.0 release series, and introduces a few reliability features to + keep them from coming back. + + This is the first release candidate in the Tor 0.3.0 series. If we + find no new bugs or regressions here, the first stable 0.3.0 release + will be nearly identical to it. + + o Major bugfixes (bridges): + - When the same bridge is configured multiple times with the same + identity, but at different address:port combinations, treat those + bridge instances as separate guards. This fix restores the ability + of clients to configure the same bridge with multiple pluggable + transports. Fixes bug 21027; bugfix on 0.3.0.1-alpha. + + o Major bugfixes (hidden service directory v3): + - Stop crashing on a failed v3 hidden service descriptor lookup + failure. Fixes bug 21471; bugfixes on tor-0.3.0.1-alpha. + + o Major bugfixes (parsing): + - When parsing a malformed content-length field from an HTTP + message, do not read off the end of the buffer. This bug was a + potential remote denial-of-service attack against Tor clients and + relays. A workaround was released in October 2016, to prevent this + bug from crashing Tor. This is a fix for the underlying issue, + which should no longer matter (if you applied the earlier patch). + Fixes bug 20894; bugfix on 0.2.0.16-alpha. Bug found by fuzzing + using AFL (http://lcamtuf.coredump.cx/afl/). + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor feature (protocol versioning): + - Add new protocol version for proposal 224. HSIntro now advertises + version "3-4" and HSDir version "1-2". Fixes ticket 20656. + + o Minor features (directory authorities): + - Directory authorities now reject descriptors that claim to be + malformed versions of Tor. Helps prevent exploitation of + bug 21278. + - Reject version numbers with components that exceed INT32_MAX. + Otherwise 32-bit and 64-bit platforms would behave inconsistently. + Fixes bug 21450; bugfix on 0.0.8pre1. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor features (reliability, crash): + - Try better to detect problems in buffers where they might grow (or + think they have grown) over 2 GB in size. Diagnostic for + bug 21369. + + o Minor features (testing): + - During 'make test-network-all', if tor logs any warnings, ask + chutney to output them. Requires a recent version of chutney with + the 21572 patch. Implements 21570. + + o Minor bugfixes (certificate expiration time): + - Avoid using link certificates that don't become valid till some + time in the future. Fixes bug 21420; bugfix on 0.2.4.11-alpha + + o Minor bugfixes (code correctness): + - Repair a couple of (unreachable or harmless) cases of the risky + comparison-by-subtraction pattern that caused bug 21278. + - Remove a redundant check for the UseEntryGuards option from the + options_transition_affects_guards() function. Fixes bug 21492; + bugfix on 0.3.0.1-alpha. + + o Minor bugfixes (directory mirrors): + - Allow relays to use directory mirrors without a DirPort: these + relays need to be contacted over their ORPorts using a begindir + connection. Fixes one case of bug 20711; bugfix on 0.2.8.2-alpha. + - Clarify the message logged when a remote relay is unexpectedly + missing an ORPort or DirPort: users were confusing this with a + local port. Fixes another case of bug 20711; bugfix + on 0.2.8.2-alpha. + + o Minor bugfixes (guards): + - Don't warn about a missing guard state on timeout-measurement + circuits: they aren't supposed to be using guards. Fixes an + instance of bug 21007; bugfix on 0.3.0.1-alpha. + - Silence a BUG() warning when attempting to use a guard whose + descriptor we don't know, and make this scenario less likely to + happen. Fixes bug 21415; bugfix on 0.3.0.1-alpha. + + o Minor bugfixes (hidden service): + - Pass correct buffer length when encoding legacy ESTABLISH_INTRO + cells. Previously, we were using sizeof() on a pointer, instead of + the real destination buffer. Fortunately, that value was only used + to double-check that there was enough room--which was already + enforced elsewhere. Fixes bug 21553; bugfix on 0.3.0.1-alpha. + + o Minor bugfixes (testing): + - Fix Raspbian build issues related to missing socket errno in + test_util.c. Fixes bug 21116; bugfix on tor-0.2.8.2. Patch + by "hein". + - Rename "make fuzz" to "make test-fuzz-corpora", since it doesn't + actually fuzz anything. Fixes bug 21447; bugfix on 0.3.0.3-alpha. + - Use bash in src/test/test-network.sh. This ensures we reliably + call chutney's newer tools/test-network.sh when available. Fixes + bug 21562; bugfix on 0.2.9.1-alpha. + + o Documentation: + - Small fixes to the fuzzing documentation. Closes ticket 21472. + + +Changes in version 0.2.9.10 - 2017-03-01 + Tor 0.2.9.10 backports a security fix from later Tor release. It also + includes fixes for some major issues affecting directory authorities, + LibreSSL compatibility, and IPv6 correctness. + + The Tor 0.2.9.x release series is now marked as a long-term-support + series. We intend to backport security fixes to 0.2.9.x until at + least January of 2020. + + o Major bugfixes (directory authority, 0.3.0.3-alpha): + - During voting, when marking a relay as a probable sybil, do not + clear its BadExit flag: sybils can still be bad in other ways + too. (We still clear the other flags.) Fixes bug 21108; bugfix + on 0.2.0.13-alpha. + + o Major bugfixes (IPv6 Exits, backport from 0.3.0.3-alpha): + - Stop rejecting all IPv6 traffic on Exits whose exit policy rejects + any IPv6 addresses. Instead, only reject a port over IPv6 if the + exit policy rejects that port on more than an IPv6 /16 of + addresses. This bug was made worse by 17027 in 0.2.8.1-alpha, + which rejected a relay's own IPv6 address by default. Fixes bug + 21357; bugfix on commit 004f3f4e53 in 0.2.4.7-alpha. + + o Major bugfixes (parsing, also in 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (directory authorities, also in 0.3.0.4-rc): + - Directory authorities now reject descriptors that claim to be + malformed versions of Tor. Helps prevent exploitation of + bug 21278. + - Reject version numbers with components that exceed INT32_MAX. + Otherwise 32-bit and 64-bit platforms would behave inconsistently. + Fixes bug 21450; bugfix on 0.0.8pre1. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor features (portability, compilation, backport from 0.3.0.3-alpha): + - Autoconf now checks to determine if OpenSSL structures are opaque, + instead of explicitly checking for OpenSSL version numbers. Part + of ticket 21359. + - Support building with recent LibreSSL code that uses opaque + structures. Closes ticket 21359. + + o Minor bugfixes (code correctness, also in 0.3.0.4-rc): + - Repair a couple of (unreachable or harmless) cases of the risky + comparison-by-subtraction pattern that caused bug 21278. + + o Minor bugfixes (tor-resolve, backport from 0.3.0.3-alpha): + - The tor-resolve command line tool now rejects hostnames over 255 + characters in length. Previously, it would silently truncate them, + which could lead to bugs. Fixes bug 21280; bugfix on 0.0.9pre5. + Patch by "junglefowl". Changes in version 0.3.0.3-alpha - 2017-02-03 @@ -13,7 +13,7 @@ Tor is distributed under this license: Copyright (c) 2001-2004, Roger Dingledine Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -Copyright (c) 2007-2016, The Tor Project, Inc. +Copyright (c) 2007-2017, The Tor Project, Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/Makefile.am b/Makefile.am index 631b44e7f5..be1dc7f7ef 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ # Copyright (c) 2001-2004, Roger Dingledine # Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -# Copyright (c) 2007-2015, The Tor Project, Inc. +# Copyright (c) 2007-2017, The Tor Project, Inc. # See LICENSE for licensing information ACLOCAL_AMFLAGS = -I m4 @@ -16,7 +16,7 @@ noinst_PROGRAMS= DISTCLEANFILES= bin_SCRIPTS= AM_CPPFLAGS= -AM_CFLAGS=@TOR_SYSTEMD_CFLAGS@ @CFLAGS_BUGTRAP@ +AM_CFLAGS=@TOR_SYSTEMD_CFLAGS@ @CFLAGS_BUGTRAP@ @TOR_LZMA_CFLAGS@ @TOR_ZSTD_CFLAGS@ SHELL=@SHELL@ if COVERAGE_ENABLED @@ -54,6 +54,7 @@ TEST_CFLAGS= TEST_CPPFLAGS=-DTOR_UNIT_TESTS TEST_NETWORK_FLAGS=--hs-multi-client 1 endif +TEST_NETWORK_WARNING_FLAGS=--quiet --only-warnings if LIBFUZZER_ENABLED TEST_CFLAGS += -fsanitize-coverage=trace-pc-guard,trace-cmp,trace-div @@ -135,6 +136,7 @@ test-network-all: need-chutney-path test-driver $(TESTING_TOR_BINARY) src/tools/ done; \ for f in $$flavors; do \ $(SHELL) $(top_srcdir)/test-driver --test-name $$f --log-file $(TEST_NETWORK_ALL_LOG_DIR)/$$f.log --trs-file $(TEST_NETWORK_ALL_LOG_DIR)/$$f.trs $(TEST_NETWORK_ALL_DRIVER_FLAGS) $(top_srcdir)/src/test/test-network.sh --flavor $$f $(TEST_NETWORK_FLAGS); \ + $(top_srcdir)/src/test/test-network.sh $(TEST_NETWORK_WARNING_FLAGS); \ done; \ echo "Log and result files are available in $(TEST_NETWORK_ALL_LOG_DIR)."; \ ! grep -q FAIL test_network_log/*.trs diff --git a/ReleaseNotes b/ReleaseNotes index d6adbe5f9b..ca5a30dd43 100644 --- a/ReleaseNotes +++ b/ReleaseNotes @@ -2,6 +2,1119 @@ This document summarizes new features and bugfixes in each stable release of Tor. If you want to see more detailed descriptions of the changes in each development snapshot, see the ChangeLog file. + +Changes in version 0.3.0.6 - 2017-04-26 + Tor 0.3.0.6 is the first stable release of the Tor 0.3.0 series. + + With the 0.3.0 series, clients and relays now use Ed25519 keys to + authenticate their link connections to relays, rather than the old + RSA1024 keys that they used before. (Circuit crypto has been + Curve25519-authenticated since 0.2.4.8-alpha.) We have also replaced + the guard selection and replacement algorithm to behave more robustly + in the presence of unreliable networks, and to resist guard- + capture attacks. + + This series also includes numerous other small features and bugfixes, + along with more groundwork for the upcoming hidden-services revamp. + + Per our stable release policy, we plan to support the Tor 0.3.0 + release series for at least the next nine months, or for three months + after the first stable release of the 0.3.1 series: whichever is + longer. If you need a release with long-term support, we recommend + that you stay with the 0.2.9 series. + + Below are the changes since 0.2.9.10. For a list of only the changes + since 0.3.0.5-rc, see the ChangeLog file. + + o Major features (directory authority, security): + - The default for AuthDirPinKeys is now 1: directory authorities + will reject relays where the RSA identity key matches a previously + seen value, but the Ed25519 key has changed. Closes ticket 18319. + + o Major features (guard selection algorithm): + - Tor's guard selection algorithm has been redesigned from the + ground up, to better support unreliable networks and restrictive + sets of entry nodes, and to better resist guard-capture attacks by + hostile local networks. Implements proposal 271; closes + ticket 19877. + + o Major features (next-generation hidden services): + - Relays can now handle v3 ESTABLISH_INTRO cells as specified by + prop224 aka "Next Generation Hidden Services". Service and clients + don't use this functionality yet. Closes ticket 19043. Based on + initial code by Alec Heifetz. + - Relays now support the HSDir version 3 protocol, so that they can + can store and serve v3 descriptors. This is part of the next- + generation onion service work detailled in proposal 224. Closes + ticket 17238. + + o Major features (protocol, ed25519 identity keys): + - Clients now support including Ed25519 identity keys in the EXTEND2 + cells they generate. By default, this is controlled by a consensus + parameter, currently disabled. You can turn this feature on for + testing by setting ExtendByEd25519ID in your configuration. This + might make your traffic appear different than the traffic + generated by other users, however. Implements part of ticket + 15056; part of proposal 220. + - Relays now understand requests to extend to other relays by their + Ed25519 identity keys. When an Ed25519 identity key is included in + an EXTEND2 cell, the relay will only extend the circuit if the + other relay can prove ownership of that identity. Implements part + of ticket 15056; part of proposal 220. + - Relays now use Ed25519 to prove their Ed25519 identities and to + one another, and to clients. This algorithm is faster and more + secure than the RSA-based handshake we've been doing until now. + Implements the second big part of proposal 220; Closes + ticket 15055. + + o Major features (security): + - Change the algorithm used to decide DNS TTLs on client and server + side, to better resist DNS-based correlation attacks like the + DefecTor attack of Greschbach, Pulls, Roberts, Winter, and + Feamster. Now relays only return one of two possible DNS TTL + values, and clients are willing to believe DNS TTL values up to 3 + hours long. Closes ticket 19769. + + o Major bugfixes (client, onion service, also in 0.2.9.9): + - Fix a client-side onion service reachability bug, where multiple + socks requests to an onion service (or a single slow request) + could cause us to mistakenly mark some of the service's + introduction points as failed, and we cache that failure so + eventually we run out and can't reach the service. Also resolves a + mysterious "Remote server sent bogus reason code 65021" log + warning. The bug was introduced in ticket 17218, where we tried to + remember the circuit end reason as a uint16_t, which mangled + negative values. Partially fixes bug 21056 and fixes bug 20307; + bugfix on 0.2.8.1-alpha. + + o Major bugfixes (crash, directory connections): + - Fix a rare crash when sending a begin cell on a circuit whose + linked directory connection had already been closed. Fixes bug + 21576; bugfix on 0.2.9.3-alpha. Reported by Alec Muffett. + + o Major bugfixes (directory authority): + - During voting, when marking a relay as a probable sybil, do not + clear its BadExit flag: sybils can still be bad in other ways + too. (We still clear the other flags.) Fixes bug 21108; bugfix + on 0.2.0.13-alpha. + + o Major bugfixes (DNS): + - Fix a bug that prevented exit nodes from caching DNS records for + more than 60 seconds. Fixes bug 19025; bugfix on 0.2.4.7-alpha. + + o Major bugfixes (IPv6 Exits): + - Stop rejecting all IPv6 traffic on Exits whose exit policy rejects + any IPv6 addresses. Instead, only reject a port over IPv6 if the + exit policy rejects that port on more than an IPv6 /16 of + addresses. This bug was made worse by 17027 in 0.2.8.1-alpha, + which rejected a relay's own IPv6 address by default. Fixes bug + 21357; bugfix on commit 004f3f4e53 in 0.2.4.7-alpha. + + o Major bugfixes (parsing): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + - When parsing a malformed content-length field from an HTTP + message, do not read off the end of the buffer. This bug was a + potential remote denial-of-service attack against Tor clients and + relays. A workaround was released in October 2016, to prevent this + bug from crashing Tor. This is a fix for the underlying issue, + which should no longer matter (if you applied the earlier patch). + Fixes bug 20894; bugfix on 0.2.0.16-alpha. Bug found by fuzzing + using AFL (http://lcamtuf.coredump.cx/afl/). + + o Major bugfixes (scheduler): + - Actually compare circuit policies in ewma_cmp_cmux(). This bug + caused the channel scheduler to behave more or less randomly, + rather than preferring channels with higher-priority circuits. + Fixes bug 20459; bugfix on 0.2.6.2-alpha. + + o Major bugfixes (security, also in 0.2.9.9): + - Downgrade the "-ftrapv" option from "always on" to "only on when + --enable-expensive-hardening is provided." This hardening option, + like others, can turn survivable bugs into crashes--and having it + on by default made a (relatively harmless) integer overflow bug + into a denial-of-service bug. Fixes bug 21278 (TROVE-2017-001); + bugfix on 0.2.9.1-alpha. + + o Minor feature (client): + - Enable IPv6 traffic on the SocksPort by default. To disable this, + a user will have to specify "NoIPv6Traffic". Closes ticket 21269. + + o Minor feature (fallback scripts): + - Add a check_existing mode to updateFallbackDirs.py, which checks + if fallbacks in the hard-coded list are working. Closes ticket + 20174. Patch by haxxpop. + + o Minor feature (protocol versioning): + - Add new protocol version for proposal 224. HSIntro now advertises + version "3-4" and HSDir version "1-2". Fixes ticket 20656. + + o Minor features (ciphersuite selection): + - Allow relays to accept a wider range of ciphersuites, including + chacha20-poly1305 and AES-CCM. Closes the other part of 15426. + - Clients now advertise a list of ciphersuites closer to the ones + preferred by Firefox. Closes part of ticket 15426. + + o Minor features (controller): + - Add "GETINFO sr/current" and "GETINFO sr/previous" keys, to expose + shared-random values to the controller. Closes ticket 19925. + - When HSFETCH arguments cannot be parsed, say "Invalid argument" + rather than "unrecognized." Closes ticket 20389; patch from + Ivan Markin. + + o Minor features (controller, configuration): + - Each of the *Port options, such as SocksPort, ORPort, ControlPort, + and so on, now comes with a __*Port variant that will not be saved + to the torrc file by the controller's SAVECONF command. This + change allows TorBrowser to set up a single-use domain socket for + each time it launches Tor. Closes ticket 20956. + - The GETCONF command can now query options that may only be + meaningful in context-sensitive lists. This allows the controller + to query the mixed SocksPort/__SocksPort style options introduced + in feature 20956. Implements ticket 21300. + + o Minor features (diagnostic, directory client): + - Warn when we find an unexpected inconsistency in directory + download status objects. Prevents some negative consequences of + bug 20593. + + o Minor features (directory authorities): + - Directory authorities now reject descriptors that claim to be + malformed versions of Tor. Helps prevent exploitation of + bug 21278. + - Reject version numbers with components that exceed INT32_MAX. + Otherwise 32-bit and 64-bit platforms would behave inconsistently. + Fixes bug 21450; bugfix on 0.0.8pre1. + + o Minor features (directory authority): + - Add a new authority-only AuthDirTestEd25519LinkKeys option (on by + default) to control whether authorities should try to probe relays + by their Ed25519 link keys. This option will go away in a few + releases--unless we encounter major trouble in our ed25519 link + protocol rollout, in which case it will serve as a safety option. + + o Minor features (directory cache): + - Relays and bridges will now refuse to serve the consensus they + have if they know it is too old for a client to use. Closes + ticket 20511. + + o Minor features (ed25519 link handshake): + - Advertise support for the ed25519 link handshake using the + subprotocol-versions mechanism, so that clients can tell which + relays can identity themselves by Ed25519 ID. Closes ticket 20552. + + o Minor features (entry guards): + - Add UseEntryGuards to TEST_OPTIONS_DEFAULT_VALUES in order to not + break regression tests. + - Require UseEntryGuards when UseBridges is set, in order to make + sure bridges aren't bypassed. Resolves ticket 20502. + + o Minor features (fallback directories): + - Allow 3 fallback relays per operator, which is safe now that we + are choosing 200 fallback relays. Closes ticket 20912. + - Annotate updateFallbackDirs.py with the bandwidth and consensus + weight for each candidate fallback. Closes ticket 20878. + - Display the relay fingerprint when downloading consensuses from + fallbacks. Closes ticket 20908. + - Exclude relays affected by bug 20499 from the fallback list. + Exclude relays from the fallback list if they are running versions + known to be affected by bug 20499, or if in our tests they deliver + a stale consensus (i.e. one that expired more than 24 hours ago). + Closes ticket 20539. + - Make it easier to change the output sort order of fallbacks. + Closes ticket 20822. + - Reduce the minimum fallback bandwidth to 1 MByte/s. Part of + ticket 18828. + - Require fallback directories to have the same address and port for + 7 days (now that we have enough relays with this stability). + Relays whose OnionOO stability timer is reset on restart by bug + 18050 should upgrade to Tor 0.2.8.7 or later, which has a fix for + this issue. Closes ticket 20880; maintains short-term fix + in 0.2.8.2-alpha. + - Require fallbacks to have flags for 90% of the time (weighted + decaying average), rather than 95%. This allows at least 73% of + clients to bootstrap in the first 5 seconds without contacting an + authority. Part of ticket 18828. + - Select 200 fallback directories for each release. Closes + ticket 20881. + + o Minor features (fingerprinting resistence, authentication): + - Extend the length of RSA keys used for TLS link authentication to + 2048 bits. (These weren't used for forward secrecy; for forward + secrecy, we used P256.) Closes ticket 13752. + + o Minor features (geoip): + - Update geoip and geoip6 to the April 4 2017 Maxmind GeoLite2 + Country database. + + o Minor features (geoip, also in 0.2.9.9): + - Update geoip and geoip6 to the January 4 2017 Maxmind GeoLite2 + Country database. + + o Minor features (infrastructure): + - Implement smartlist_add_strdup() function. Replaces the use of + smartlist_add(sl, tor_strdup(str)). Closes ticket 20048. + + o Minor features (linting): + - Enhance the changes file linter to warn on Tor versions that are + prefixed with "tor-". Closes ticket 21096. + + o Minor features (logging): + - In several places, describe unset ed25519 keys as "<unset>", + rather than the scary "AAAAAAAA...AAA". Closes ticket 21037. + + o Minor features (portability, compilation): + - Autoconf now checks to determine if OpenSSL structures are opaque, + instead of explicitly checking for OpenSSL version numbers. Part + of ticket 21359. + - Support building with recent LibreSSL code that uses opaque + structures. Closes ticket 21359. + + o Minor features (relay): + - We now allow separation of exit and relay traffic to different + source IP addresses, using the OutboundBindAddressExit and + OutboundBindAddressOR options respectively. Closes ticket 17975. + Written by Michael Sonntag. + + o Minor features (reliability, crash): + - Try better to detect problems in buffers where they might grow (or + think they have grown) over 2 GB in size. Diagnostic for + bug 21369. + + o Minor features (testing): + - During 'make test-network-all', if tor logs any warnings, ask + chutney to output them. Requires a recent version of chutney with + the 21572 patch. Implements 21570. + + o Minor bugfix (control protocol): + - The reply to a "GETINFO config/names" request via the control + protocol now spells the type "Dependent" correctly. This is a + breaking change in the control protocol. (The field seems to be + ignored by the most common known controllers.) Fixes bug 18146; + bugfix on 0.1.1.4-alpha. + - The GETINFO extra-info/digest/<digest> command was broken because + of a wrong base16 decode return value check, introduced when + refactoring that API. Fixes bug 22034; bugfix on 0.2.9.1-alpha. + + o Minor bugfix (logging): + - Don't recommend the use of Tor2web in non-anonymous mode. + Recommending Tor2web is a bad idea because the client loses all + anonymity. Tor2web should only be used in specific cases by users + who *know* and understand the issues. Fixes bug 21294; bugfix + on 0.2.9.3-alpha. + + o Minor bugfixes (bug resilience): + - Fix an unreachable size_t overflow in base64_decode(). Fixes bug + 19222; bugfix on 0.2.0.9-alpha. Found by Guido Vranken; fixed by + Hans Jerry Illikainen. + + o Minor bugfixes (build): + - Replace obsolete Autoconf macros with their modern equivalent and + prevent similar issues in the future. Fixes bug 20990; bugfix + on 0.1.0.1-rc. + + o Minor bugfixes (certificate expiration time): + - Avoid using link certificates that don't become valid till some + time in the future. Fixes bug 21420; bugfix on 0.2.4.11-alpha + + o Minor bugfixes (client): + - Always recover from failures in extend_info_from_node(), in an + attempt to prevent any recurrence of bug 21242. Fixes bug 21372; + bugfix on 0.2.3.1-alpha. + - When clients that use bridges start up with a cached consensus on + disk, they were ignoring it and downloading a new one. Now they + use the cached one. Fixes bug 20269; bugfix on 0.2.3.12-alpha. + + o Minor bugfixes (code correctness): + - Repair a couple of (unreachable or harmless) cases of the risky + comparison-by-subtraction pattern that caused bug 21278. + + o Minor bugfixes (config): + - Don't assert on startup when trying to get the options list and + LearnCircuitBuildTimeout is set to 0: we are currently parsing the + options so of course they aren't ready yet. Fixes bug 21062; + bugfix on 0.2.9.3-alpha. + + o Minor bugfixes (configuration): + - Accept non-space whitespace characters after the severity level in + the `Log` option. Fixes bug 19965; bugfix on 0.2.1.1-alpha. + - Support "TByte" and "TBytes" units in options given in bytes. + "TB", "terabyte(s)", "TBit(s)" and "terabit(s)" were already + supported. Fixes bug 20622; bugfix on 0.2.0.14-alpha. + + o Minor bugfixes (configure, autoconf): + - Rename the configure option --enable-expensive-hardening to + --enable-fragile-hardening. Expensive hardening makes the tor + daemon abort when some kinds of issues are detected. Thus, it + makes tor more at risk of remote crashes but safer against RCE or + heartbleed bug category. We now try to explain this issue in a + message from the configure script. Fixes bug 21290; bugfix + on 0.2.5.4-alpha. + + o Minor bugfixes (consensus weight): + - Add new consensus method that initializes bw weights to 1 instead + of 0. This prevents a zero weight from making it all the way to + the end (happens in small testing networks) and causing an error. + Fixes bug 14881; bugfix on 0.2.2.17-alpha. + + o Minor bugfixes (crash prevention): + - Fix an (currently untriggerable, but potentially dangerous) crash + bug when base32-encoding inputs whose sizes are not a multiple of + 5. Fixes bug 21894; bugfix on 0.2.9.1-alpha. + + o Minor bugfixes (dead code): + - Remove a redundant check for PidFile changes at runtime in + options_transition_allowed(): this check is already performed + regardless of whether the sandbox is active. Fixes bug 21123; + bugfix on 0.2.5.4-alpha. + + o Minor bugfixes (descriptors): + - Correctly recognise downloaded full descriptors as valid, even + when using microdescriptors as circuits. This affects clients with + FetchUselessDescriptors set, and may affect directory authorities. + Fixes bug 20839; bugfix on 0.2.3.2-alpha. + + o Minor bugfixes (directory mirrors): + - Allow relays to use directory mirrors without a DirPort: these + relays need to be contacted over their ORPorts using a begindir + connection. Fixes one case of bug 20711; bugfix on 0.2.8.2-alpha. + - Clarify the message logged when a remote relay is unexpectedly + missing an ORPort or DirPort: users were confusing this with a + local port. Fixes another case of bug 20711; bugfix + on 0.2.8.2-alpha. + + o Minor bugfixes (directory system): + - Bridges and relays now use microdescriptors (like clients do) + rather than old-style router descriptors. Now bridges will blend + in with clients in terms of the circuits they build. Fixes bug + 6769; bugfix on 0.2.3.2-alpha. + - Download all consensus flavors, descriptors, and authority + certificates when FetchUselessDescriptors is set, regardless of + whether tor is a directory cache or not. Fixes bug 20667; bugfix + on all recent tor versions. + + o Minor bugfixes (documentation): + - Update the tor manual page to document every option that can not + be changed while tor is running. Fixes bug 21122. + + o Minor bugfixes (ed25519 certificates): + - Correctly interpret ed25519 certificates that would expire some + time after 19 Jan 2038. Fixes bug 20027; bugfix on 0.2.7.2-alpha. + + o Minor bugfixes (fallback directories): + - Avoid checking fallback candidates' DirPorts if they are down in + OnionOO. When a relay operator has multiple relays, this + prioritizes relays that are up over relays that are down. Fixes + bug 20926; bugfix on 0.2.8.3-alpha. + - Stop failing when OUTPUT_COMMENTS is True in updateFallbackDirs.py. + Fixes bug 20877; bugfix on 0.2.8.3-alpha. + - Stop failing when a relay has no uptime data in + updateFallbackDirs.py. Fixes bug 20945; bugfix on 0.2.8.1-alpha. + + o Minor bugfixes (hidden service): + - Clean up the code for expiring intro points with no associated + circuits. It was causing, rarely, a service with some expiring + introduction points to not open enough additional introduction + points. Fixes part of bug 21302; bugfix on 0.2.7.2-alpha. + - Resolve two possible underflows which could lead to creating and + closing a lot of introduction point circuits in a non-stop loop. + Fixes bug 21302; bugfix on 0.2.7.2-alpha. + - Stop setting the torrc option HiddenServiceStatistics to "0" just + because we're not a bridge or relay. Instead, we preserve whatever + value the user set (or didn't set). Fixes bug 21150; bugfix + on 0.2.6.2-alpha. + + o Minor bugfixes (hidden services): + - Make hidden services check for failed intro point connections, + even when they have exceeded their intro point creation limit. + Fixes bug 21596; bugfix on 0.2.7.2-alpha. Reported by Alec Muffett. + - Make hidden services with 8 to 10 introduction points check for + failed circuits immediately after startup. Previously, they would + wait for 5 minutes before performing their first checks. Fixes bug + 21594; bugfix on 0.2.3.9-alpha. Reported by Alec Muffett. + - Stop ignoring misconfigured hidden services. Instead, refuse to + start tor until the misconfigurations have been corrected. Fixes + bug 20559; bugfix on multiple commits in 0.2.7.1-alpha + and earlier. + + o Minor bugfixes (IPv6): + - Make IPv6-using clients try harder to find an IPv6 directory + server. Fixes bug 20999; bugfix on 0.2.8.2-alpha. + - When IPv6 addresses have not been downloaded yet (microdesc + consensus documents don't list relay IPv6 addresses), use hard- + coded addresses for authorities, fallbacks, and configured + bridges. Now IPv6-only clients can use microdescriptors. Fixes bug + 20996; bugfix on b167e82 from 19608 in 0.2.8.5-alpha. + + o Minor bugfixes (memory leak at exit): + - Fix a small harmless memory leak at exit of the previously unused + RSA->Ed identity cross-certificate. Fixes bug 17779; bugfix + on 0.2.7.2-alpha. + + o Minor bugfixes (onion services): + - Allow the number of introduction points to be as low as 0, rather + than as low as 3. Fixes bug 21033; bugfix on 0.2.7.2-alpha. + + o Minor bugfixes (portability): + - Use "OpenBSD" compiler macro instead of "OPENBSD" or "__OpenBSD__". + It is supported by OpenBSD itself, and also by most OpenBSD + variants (such as Bitrig). Fixes bug 20980; bugfix + on 0.1.2.1-alpha. + + o Minor bugfixes (portability, also in 0.2.9.9): + - Avoid crashing when Tor is built using headers that contain + CLOCK_MONOTONIC_COARSE, but then tries to run on an older kernel + without CLOCK_MONOTONIC_COARSE. Fixes bug 21035; bugfix + on 0.2.9.1-alpha. + - Fix Libevent detection on platforms without Libevent 1 headers + installed. Fixes bug 21051; bugfix on 0.2.9.1-alpha. + + o Minor bugfixes (relay): + - Avoid a double-marked-circuit warning that could happen when we + receive DESTROY cells under heavy load. Fixes bug 20059; bugfix + on 0.1.0.1-rc. + - Honor DataDirectoryGroupReadable when tor is a relay. Previously, + initializing the keys would reset the DataDirectory to 0700 + instead of 0750 even if DataDirectoryGroupReadable was set to 1. + Fixes bug 19953; bugfix on 0.0.2pre16. Patch by "redfish". + + o Minor bugfixes (testing): + - Fix Raspbian build issues related to missing socket errno in + test_util.c. Fixes bug 21116; bugfix on 0.2.8.2. Patch by "hein". + - Remove undefined behavior from the backtrace generator by removing + its signal handler. Fixes bug 21026; bugfix on 0.2.5.2-alpha. + - Use bash in src/test/test-network.sh. This ensures we reliably + call chutney's newer tools/test-network.sh when available. Fixes + bug 21562; bugfix on 0.2.9.1-alpha. + + o Minor bugfixes (tor-resolve): + - The tor-resolve command line tool now rejects hostnames over 255 + characters in length. Previously, it would silently truncate them, + which could lead to bugs. Fixes bug 21280; bugfix on 0.0.9pre5. + Patch by "junglefowl". + + o Minor bugfixes (unit tests): + - Allow the unit tests to pass even when DNS lookups of bogus + addresses do not fail as expected. Fixes bug 20862 and 20863; + bugfix on unit tests introduced in 0.2.8.1-alpha + through 0.2.9.4-alpha. + + o Minor bugfixes (util): + - When finishing writing a file to disk, if we were about to replace + the file with the temporary file created before and we fail to + replace it, remove the temporary file so it doesn't stay on disk. + Fixes bug 20646; bugfix on 0.2.0.7-alpha. Patch by fk. + + o Minor bugfixes (Windows services): + - Be sure to initialize the monotonic time subsystem before using + it, even when running as an NT service. Fixes bug 21356; bugfix + on 0.2.9.1-alpha. + + o Minor bugfixes (Windows): + - Check for getpagesize before using it to mmap files. This fixes + compilation in some MinGW environments. Fixes bug 20530; bugfix on + 0.1.2.1-alpha. Reported by "ice". + + o Code simplification and refactoring: + - Abolish all global guard context in entrynodes.c; replace with new + guard_selection_t structure as preparation for proposal 271. + Closes ticket 19858. + - Extract magic numbers in circuituse.c into defined variables. + - Introduce rend_service_is_ephemeral() that tells if given onion + service is ephemeral. Replace unclear NULL-checkings for service + directory with this function. Closes ticket 20526. + - Refactor circuit_is_available_for_use to remove unnecessary check. + - Refactor circuit_predict_and_launch_new for readability and + testability. Closes ticket 18873. + - Refactor code to manipulate global_origin_circuit_list into + separate functions. Closes ticket 20921. + - Refactor large if statement in purpose_needs_anonymity to use + switch statement instead. Closes part of ticket 20077. + - Refactor the hashing API to return negative values for errors, as + is done as throughout the codebase. Closes ticket 20717. + - Remove data structures that were used to index or_connection + objects by their RSA identity digests. These structures are fully + redundant with the similar structures used in the + channel abstraction. + - Remove duplicate code in the channel_write_*cell() functions. + Closes ticket 13827; patch from Pingl. + - Remove redundant behavior of is_sensitive_dir_purpose, refactor to + use only purpose_needs_anonymity. Closes part of ticket 20077. + - The code to generate and parse EXTEND and EXTEND2 cells has been + replaced with code automatically generated by the + "trunnel" utility. + + o Documentation (formatting): + - Clean up formatting of tor.1 man page and HTML doc, where <pre> + blocks were incorrectly appearing. Closes ticket 20885. + + o Documentation (man page): + - Clarify many options in tor.1 and add some min/max values for + HiddenService options. Closes ticket 21058. + + o Documentation: + - Change '1' to 'weight_scale' in consensus bw weights calculation + comments, as that is reality. Closes ticket 20273. Patch + from pastly. + - Clarify that when ClientRejectInternalAddresses is enabled (which + is the default), multicast DNS hostnames for machines on the local + network (of the form *.local) are also rejected. Closes + ticket 17070. + - Correct the value for AuthDirGuardBWGuarantee in the manpage, from + 250 KBytes to 2 MBytes. Fixes bug 20435; bugfix on 0.2.5.6-alpha. + - Include the "TBits" unit in Tor's man page. Fixes part of bug + 20622; bugfix on 0.2.5.1-alpha. + - Small fixes to the fuzzing documentation. Closes ticket 21472. + - Stop the man page from incorrectly stating that HiddenServiceDir + must already exist. Fixes 20486. + - Update the description of the directory server options in the + manual page, to clarify that a relay no longer needs to set + DirPort in order to be a directory cache. Closes ticket 21720. + + o Removed features: + - The AuthDirMaxServersPerAuthAddr option no longer exists: The same + limit for relays running on a single IP applies to authority IP + addresses as well as to non-authority IP addresses. Closes + ticket 20960. + - The UseDirectoryGuards torrc option no longer exists: all users + that use entry guards will also use directory guards. Related to + proposal 271; implements part of ticket 20831. + + o Testing: + - Add tests for networkstatus_compute_bw_weights_v10. + - Add unit tests circuit_predict_and_launch_new. + - Extract dummy_origin_circuit_new so it can be used by other + test functions. + - New unit tests for tor_htonll(). Closes ticket 19563. Patch + from "overcaffeinated". + - Perform the coding style checks when running the tests and fail + when coding style violations are found. Closes ticket 5500. + + +Changes in version 0.2.8.13 - 2017-03-03 + Tor 0.2.8.13 backports a security fix from later Tor + releases. Anybody running Tor 0.2.8.12 or earlier should upgrade to this + this release, if for some reason they cannot upgrade to a later + release series, and if they build Tor with the --enable-expensive-hardening + option. + + Note that support for Tor 0.2.8.x is ending next year: we will not issue + any fixes for the Tor 0.2.8.x series after 1 Jan 2018. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + +Changes in version 0.2.7.7 - 2017-03-03 + Tor 0.2.7.7 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.7.6 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.7.x is ending this year: we will not issue + any fixes for the Tor 0.2.7.x series after 1 August 2017. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): + - Stop a crash that could occur when a client running with DNSPort + received a query with multiple address types, and the first + address type was not supported. Found and fixed by Scott Dial. + Fixes bug 18710; bugfix on 0.2.5.4-alpha. + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + +Changes in version 0.2.6.11 - 2017-03-03 + Tor 0.2.6.11 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.6.10 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.6.x is ending this year: we will not issue + any fixes for the Tor 0.2.6.x series after 1 August 2017. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major features (security fixes, backport from 0.2.9.4-alpha): + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): + - Stop a crash that could occur when a client running with DNSPort + received a query with multiple address types, and the first + address type was not supported. Found and fixed by Scott Dial. + Fixes bug 18710; bugfix on 0.2.5.4-alpha. + + o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): + - Fix an error that could cause us to read 4 bytes before the + beginning of an openssl string. This bug could be used to cause + Tor to crash on systems with unusual malloc implementations, or + systems with unusual hardening installed. Fixes bug 17404; bugfix + on 0.2.3.6-alpha. + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (guard selection, backport from 0.2.7.6): + - Actually look at the Guard flag when selecting a new directory + guard. When we implemented the directory guard design, we + accidentally started treating all relays as if they have the Guard + flag during guard selection, leading to weaker anonymity and worse + performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered + by Mohsen Imani. + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfixes (compilation, backport from 0.2.7.6): + - Fix a compilation warning with Clang 3.6: Do not check the + presence of an address which can never be NULL. Fixes bug 17781. + + +Changes in version 0.2.5.13 - 2017-03-03 + Tor 0.2.5.13 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.5.13 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.5.x is ending next year: we will not issue + any fixes for the Tor 0.2.5.x series after 1 May 2018. If you need + a Tor release series with longer-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major features (security fixes, backport from 0.2.9.4-alpha): + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, client, DNS proxy, backport from 0.2.8.3-alpha): + - Stop a crash that could occur when a client running with DNSPort + received a query with multiple address types, and the first + address type was not supported. Found and fixed by Scott Dial. + Fixes bug 18710; bugfix on 0.2.5.4-alpha. + + o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): + - Fix an error that could cause us to read 4 bytes before the + beginning of an openssl string. This bug could be used to cause + Tor to crash on systems with unusual malloc implementations, or + systems with unusual hardening installed. Fixes bug 17404; bugfix + on 0.2.3.6-alpha. + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (guard selection, backport from 0.2.7.6): + - Actually look at the Guard flag when selecting a new directory + guard. When we implemented the directory guard design, we + accidentally started treating all relays as if they have the Guard + flag during guard selection, leading to weaker anonymity and worse + performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered + by Mohsen Imani. + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfixes (compilation, backport from 0.2.7.6): + - Fix a compilation warning with Clang 3.6: Do not check the + presence of an address which can never be NULL. Fixes bug 17781. + + o Minor bugfixes (crypto error-handling, backport from 0.2.7.2-alpha): + - Check for failures from crypto_early_init, and refuse to continue. + A previous typo meant that we could keep going with an + uninitialized crypto library, and would have OpenSSL initialize + its own PRNG. Fixes bug 16360; bugfix on 0.2.5.2-alpha, introduced + when implementing ticket 4900. Patch by "teor". + + o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha): + - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on + a client authorized hidden service. Fixes bug 15823; bugfix + on 0.2.1.6-alpha. + + +Changes in version 0.2.4.28 - 2017-03-03 + Tor 0.2.4.28 backports a number of security fixes from later Tor + releases. Anybody running Tor 0.2.4.27 or earlier should upgrade to + this release, if for some reason they cannot upgrade to a later + release series. + + Note that support for Tor 0.2.4.x is ending soon: we will not issue + any fixes for the Tor 0.2.4.x series after 1 August 2017. If you need + a Tor release series with long-term support, we recommend Tor 0.2.9.x. + + o Directory authority changes (backport from 0.2.8.5-rc): + - Urras is no longer a directory authority. Closes ticket 19271. + + o Directory authority changes (backport from 0.2.9.2-alpha): + - The "Tonga" bridge authority has been retired; the new bridge + authority is "Bifroest". Closes tickets 19728 and 19690. + + o Directory authority key updates (backport from 0.2.8.1-alpha): + - Update the V3 identity key for the dannenberg directory authority: + it was changed on 18 November 2015. Closes task 17906. Patch + by "teor". + + o Major features (security fixes, backport from 0.2.9.4-alpha): + - Prevent a class of security bugs caused by treating the contents + of a buffer chunk as if they were a NUL-terminated string. At + least one such bug seems to be present in all currently used + versions of Tor, and would allow an attacker to remotely crash + most Tor instances, especially those compiled with extra compiler + hardening. With this defense in place, such bugs can't crash Tor, + though we should still fix them as they occur. Closes ticket + 20384 (TROVE-2016-10-001). + + o Major bugfixes (parsing, security, backport from 0.2.9.8): + - Fix a bug in parsing that could cause clients to read a single + byte past the end of an allocated region. This bug could be used + to cause hardened clients (built with --enable-expensive-hardening) + to crash if they tried to visit a hostile hidden service. Non- + hardened clients are only affected depending on the details of + their platform's memory allocator. Fixes bug 21018; bugfix on + 0.2.0.8-alpha. Found by using libFuzzer. Also tracked as TROVE- + 2016-12-002 and as CVE-2016-1254. + + o Major bugfixes (security, correctness, backport from 0.2.7.4-rc): + - Fix an error that could cause us to read 4 bytes before the + beginning of an openssl string. This bug could be used to cause + Tor to crash on systems with unusual malloc implementations, or + systems with unusual hardening installed. Fixes bug 17404; bugfix + on 0.2.3.6-alpha. + + o Major bugfixes (security, pointers, backport from 0.2.8.2-alpha): + - Avoid a difficult-to-trigger heap corruption attack when extending + a smartlist to contain over 16GB of pointers. Fixes bug 18162; + bugfix on 0.1.1.11-alpha, which fixed a related bug incompletely. + Reported by Guido Vranken. + + o Major bugfixes (dns proxy mode, crash, backport from 0.2.8.2-alpha): + - Avoid crashing when running as a DNS proxy. Fixes bug 16248; + bugfix on 0.2.0.1-alpha. Patch from "cypherpunks". + + o Major bugfixes (guard selection, backport from 0.2.7.6): + - Actually look at the Guard flag when selecting a new directory + guard. When we implemented the directory guard design, we + accidentally started treating all relays as if they have the Guard + flag during guard selection, leading to weaker anonymity and worse + performance. Fixes bug 17772; bugfix on 0.2.4.8-alpha. Discovered + by Mohsen Imani. + + o Major bugfixes (key management, backport from 0.2.8.3-alpha): + - If OpenSSL fails to generate an RSA key, do not retain a dangling + pointer to the previous (uninitialized) key value. The impact here + should be limited to a difficult-to-trigger crash, if OpenSSL is + running an engine that makes key generation failures possible, or + if OpenSSL runs out of memory. Fixes bug 19152; bugfix on + 0.2.1.10-alpha. Found by Yuan Jochen Kang, Suman Jana, and + Baishakhi Ray. + + o Major bugfixes (parsing, backported from 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (security, memory erasure, backport from 0.2.8.1-alpha): + - Make memwipe() do nothing when passed a NULL pointer or buffer of + zero size. Check size argument to memwipe() for underflow. Fixes + bug 18089; bugfix on 0.2.3.25 and 0.2.4.6-alpha. Reported by "gk", + patch by "teor". + + o Minor features (bug-resistance, backport from 0.2.8.2-alpha): + - Make Tor survive errors involving connections without a + corresponding event object. Previously we'd fail with an + assertion; now we produce a log message. Related to bug 16248. + + o Minor features (DoS-resistance, backport from 0.2.7.1-alpha): + - Make it harder for attackers to overload hidden services with + introductions, by blocking multiple introduction requests on the + same circuit. Resolves ticket 15515. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor bugfixes (compilation, backport from 0.2.7.6): + - Fix a compilation warning with Clang 3.6: Do not check the + presence of an address which can never be NULL. Fixes bug 17781. + + o Minor bugfixes (hidden service, backport from 0.2.7.1-alpha): + - Fix an out-of-bounds read when parsing invalid INTRODUCE2 cells on + a client authorized hidden service. Fixes bug 15823; bugfix + on 0.2.1.6-alpha. + + +Changes in version 0.2.9.10 - 2017-03-01 + Tor 0.2.9.10 backports a security fix from later Tor release. It also + includes fixes for some major issues affecting directory authorities, + LibreSSL compatibility, and IPv6 correctness. + + The Tor 0.2.9.x release series is now marked as a long-term-support + series. We intend to backport security fixes to 0.2.9.x until at + least January of 2020. + + o Major bugfixes (directory authority, 0.3.0.3-alpha): + - During voting, when marking a relay as a probable sybil, do not + clear its BadExit flag: sybils can still be bad in other ways + too. (We still clear the other flags.) Fixes bug 21108; bugfix + on 0.2.0.13-alpha. + + o Major bugfixes (IPv6 Exits, backport from 0.3.0.3-alpha): + - Stop rejecting all IPv6 traffic on Exits whose exit policy rejects + any IPv6 addresses. Instead, only reject a port over IPv6 if the + exit policy rejects that port on more than an IPv6 /16 of + addresses. This bug was made worse by 17027 in 0.2.8.1-alpha, + which rejected a relay's own IPv6 address by default. Fixes bug + 21357; bugfix on commit 004f3f4e53 in 0.2.4.7-alpha. + + o Major bugfixes (parsing, also in 0.3.0.4-rc): + - Fix an integer underflow bug when comparing malformed Tor + versions. This bug could crash Tor when built with + --enable-expensive-hardening, or on Tor 0.2.9.1-alpha through Tor + 0.2.9.8, which were built with -ftrapv by default. In other cases + it was harmless. Part of TROVE-2017-001. Fixes bug 21278; bugfix + on 0.0.8pre1. Found by OSS-Fuzz. + + o Minor features (directory authorities, also in 0.3.0.4-rc): + - Directory authorities now reject descriptors that claim to be + malformed versions of Tor. Helps prevent exploitation of + bug 21278. + - Reject version numbers with components that exceed INT32_MAX. + Otherwise 32-bit and 64-bit platforms would behave inconsistently. + Fixes bug 21450; bugfix on 0.0.8pre1. + + o Minor features (geoip): + - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 + Country database. + + o Minor features (portability, compilation, backport from 0.3.0.3-alpha): + - Autoconf now checks to determine if OpenSSL structures are opaque, + instead of explicitly checking for OpenSSL version numbers. Part + of ticket 21359. + - Support building with recent LibreSSL code that uses opaque + structures. Closes ticket 21359. + + o Minor bugfixes (code correctness, also in 0.3.0.4-rc): + - Repair a couple of (unreachable or harmless) cases of the risky + comparison-by-subtraction pattern that caused bug 21278. + + o Minor bugfixes (tor-resolve, backport from 0.3.0.3-alpha): + - The tor-resolve command line tool now rejects hostnames over 255 + characters in length. Previously, it would silently truncate them, + which could lead to bugs. Fixes bug 21280; bugfix on 0.0.9pre5. + Patch by "junglefowl". + + Changes in version 0.2.9.9 - 2017-01-23 Tor 0.2.9.9 fixes a denial-of-service bug where an attacker could cause relays and clients to crash, even if they were not built with diff --git a/acinclude.m4 b/acinclude.m4 index 193d3a7a08..49d4f14471 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -2,7 +2,7 @@ dnl Helper macros for Tor configure.ac dnl Copyright (c) 2001-2004, Roger Dingledine dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson dnl Copyright (c) 2007-2008, Roger Dingledine, Nick Mathewson -dnl Copyright (c) 2007-2015, The Tor Project, Inc. +dnl Copyright (c) 2007-2017, The Tor Project, Inc. dnl See LICENSE for licensing information AC_DEFUN([TOR_EXTEND_CODEPATH], diff --git a/changes/17868 b/changes/17868 new file mode 100644 index 0000000000..77a8ba1c9d --- /dev/null +++ b/changes/17868 @@ -0,0 +1,4 @@ + o Code simplification and refactoring: + - Our base64 decoding functions no longer overestimate the output + space that they will need when parsing unpadded inputs. + Closes ticket 17868. diff --git a/changes/21662_21663_21664 b/changes/21662_21663_21664 new file mode 100644 index 0000000000..6712b0faf4 --- /dev/null +++ b/changes/21662_21663_21664 @@ -0,0 +1,12 @@ + o Major features: + - Tor's compression module now includes support for the zstd and lzma2 + compression algorithms, if the libzstd and liblzma libraries are + available when Tor is compiled. Once these features are exposed in the + directory module, they will enable Tor to provide better compression + ratios on directory documents. Part of an implementation for proposal + 278; closes ticket 21662. + + o Code simplification and refactoring: + - Tor's compression module now supports multiple backends. Part of + an implementation of proposal 278; closes ticket 21663. + diff --git a/changes/21873 b/changes/21873 new file mode 100644 index 0000000000..24dc82455e --- /dev/null +++ b/changes/21873 @@ -0,0 +1,3 @@ + o Documentation: + - Clarify the behavior of the KeepAliveIsolateSOCKSAuth sub-option. + Closes ticket 21873. diff --git a/changes/bug16706 b/changes/bug16706 new file mode 100644 index 0000000000..9c1e315321 --- /dev/null +++ b/changes/bug16706 @@ -0,0 +1,3 @@ + o Minor bugfixes (hidden service): + - Stop printing cryptic warning when a client tries to connect on an + invalid port of the service. Fixes #16706.; bugfix on tor-0.2.6.3-alpha. diff --git a/changes/bug17170 b/changes/bug17170 new file mode 100644 index 0000000000..24a9b94fcf --- /dev/null +++ b/changes/bug17170 @@ -0,0 +1,3 @@ + o Documentation: + - Note that bandwidth-limiting options don't affect TCP headers or DNS. + Closes ticket 17170. diff --git a/changes/bug19699 b/changes/bug19699 new file mode 100644 index 0000000000..8bfe66210e --- /dev/null +++ b/changes/bug19699 @@ -0,0 +1,5 @@ + o Minor bugfixes (testing): + - Make test-network.sh always call chutney's test-network.sh. + Previously, this only worked on systems which had bash installed, due to + some bash-specific code in the script. + Fixes bug 19699; follow-up to 21581. diff --git a/changes/bug20341 b/changes/bug20341 new file mode 100644 index 0000000000..399ee509e6 --- /dev/null +++ b/changes/bug20341 @@ -0,0 +1,3 @@ + o Documentation: + - Document key=value pluggable transport arguments for Bridge lines in + torrc. Fixes bug 20341; feature first appeared in 0.2.5.1-alpha. diff --git a/changes/bug20894 b/changes/bug20894 deleted file mode 100644 index 2dbf9b9aa9..0000000000 --- a/changes/bug20894 +++ /dev/null @@ -1,9 +0,0 @@ - o Major bugfixes (HTTP, parsing): - - When parsing a malformed content-length field from an HTTP message, - do not read off the end of the buffer. This bug was a potential - remote denial-of-service attack against Tor clients and relays. - A workaround was released in October 2016, which prevents this - bug from crashing Tor. This is a fix for the underlying issue, - which should no longer matter (if you applied the earlier patch). - Fixes bug 20894; bugfix on 0.2.0.16-alpha. Bug found by fuzzing - using AFL (http://lcamtuf.coredump.cx/afl/). diff --git a/changes/bug21116 b/changes/bug21116 deleted file mode 100644 index 2304ab0fd6..0000000000 --- a/changes/bug21116 +++ /dev/null @@ -1,3 +0,0 @@ - o Minor bugfixes (test): - - Fix Raspbian build missing socket errno in test util. Fixes bug 21116.; - bugfix on tor-0.2.8.2. Patch by "hein". diff --git a/changes/bug21155 b/changes/bug21155 new file mode 100644 index 0000000000..f2a34dbd0f --- /dev/null +++ b/changes/bug21155 @@ -0,0 +1,5 @@ + o Minor bugfixes (hidden service, logging): + - Warn user if multiple entries in EntryNodes and at least one + HiddenService are used together. Pinning EntryNodes along with an hidden + service can be possibly harmful for instance see ticket 14917 or 21155. + Closes bug 21155. diff --git a/changes/bug21278_extras b/changes/bug21278_extras deleted file mode 100644 index ffdf4a047b..0000000000 --- a/changes/bug21278_extras +++ /dev/null @@ -1,3 +0,0 @@ - o Minor bugfixes (code correctness): - - Repair a couple of (unreachable or harmless) cases of the risky - comparison-by-subtraction pattern that caused bug 21278. diff --git a/changes/bug21278_prevention b/changes/bug21278_prevention deleted file mode 100644 index e07f0a670c..0000000000 --- a/changes/bug21278_prevention +++ /dev/null @@ -1,4 +0,0 @@ - o Minor features (directory authority): - - Directory authorities now reject descriptors that claim to be - malformed versions of Tor. Helps prevent exploitation of bug 21278. - diff --git a/changes/bug21293 b/changes/bug21293 new file mode 100644 index 0000000000..23a7547951 --- /dev/null +++ b/changes/bug21293 @@ -0,0 +1,5 @@ + o Minor bugfixes (cell, logging): + - Downgrade a log statement from bug to protocol warning because there is + at least one use case where it can be triggered by a buggy tor + implementation on the Internet for instance. Fixes bug 21293; bugfix on + tor-0.1.1.14-alpha. diff --git a/changes/bug21407 b/changes/bug21407 new file mode 100644 index 0000000000..8d0d917439 --- /dev/null +++ b/changes/bug21407 @@ -0,0 +1,4 @@ + o Minor features (defaults, security): + - The default value for UseCreateFast is now 0: clients which haven't yet + received a consensus document will nonetheless use a proper handshake + to talk to their directory servers (when they can). Closes ticket 21407. diff --git a/changes/bug21439 b/changes/bug21439 new file mode 100644 index 0000000000..3acc53bfb7 --- /dev/null +++ b/changes/bug21439 @@ -0,0 +1,7 @@ + o Minor features (testing): + - Add a "--disable-memory-sentinels" feature to help with fuzzing. + When Tor is compiled with this option, we disable a number of + redundant memory-safety failsafes that are intended to stop + bugs from becoming security issues. This makes it easier to hunt + for bugs that would be security issues without the failsafes + turned on. Closes ticket 21439. diff --git a/changes/bug21447 b/changes/bug21447 deleted file mode 100644 index c025b92313..0000000000 --- a/changes/bug21447 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor bugfixes (testing): - - Rename "make fuzz" to "make test-fuzz-corpora", since it doesn't - actually fuzz anything. Fixes bug 21447; bugfix on 0.3.0.3-alpha. - diff --git a/changes/bug21450 b/changes/bug21450 deleted file mode 100644 index a1cf89ab41..0000000000 --- a/changes/bug21450 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor bugfixes (voting consistency): - - Reject version numbers with components that exceed INT32_MAX. - Otherwise 32-bit and 64-bit platforms would behave inconsistently. - Fixes bug 21450; bugfix on 0.0.8pre1. diff --git a/changes/bug21471 b/changes/bug21471 deleted file mode 100644 index 684035b19c..0000000000 --- a/changes/bug21471 +++ /dev/null @@ -1,5 +0,0 @@ - o Major bugfixes (hidden service directory v3): - - When a descriptor lookup was done and it was not found in the directory - cache, it would crash on a NULL pointer instead of returning the 404 - code back to the client like it was suppose to. Fixes bug 21471.; - bugfixes on tor-0.3.0.1-alpha. diff --git a/changes/bug21492 b/changes/bug21492 deleted file mode 100644 index 2ed7947771..0000000000 --- a/changes/bug21492 +++ /dev/null @@ -1,5 +0,0 @@ - o Minor bugfixes (correctness): - - Remove a redundant check for the UseEntryGuards option from the - options_transition_affects_guards() function. Fixes bug 21492; - bugfix on 0.3.0.1-alpha. - diff --git a/changes/bug21496 b/changes/bug21496 new file mode 100644 index 0000000000..24ac85a769 --- /dev/null +++ b/changes/bug21496 @@ -0,0 +1,4 @@ + o Minor features (safety): + - Add an explict check to extrainfo_parse_entry_from_string() for NULL + inputs. We don't believe this can actually happen, but it may help + silence a warning from the Clang analyzer. Closes ticket 21496. diff --git a/changes/bug21507 b/changes/bug21507 new file mode 100644 index 0000000000..f83e291b63 --- /dev/null +++ b/changes/bug21507 @@ -0,0 +1,5 @@ + o Minor bugfixes (voting consistency): + - Reject version numbers with non-numeric prefixes (such as +, -, and + whitespace). Disallowing whitespace prevents differential version + parsing between POSIX-based and Windows platforms. + Fixes bug 21507 and part of 21508; bugfix on 0.0.8pre1. diff --git a/changes/bug21510 b/changes/bug21510 new file mode 100644 index 0000000000..31c3e1ada9 --- /dev/null +++ b/changes/bug21510 @@ -0,0 +1,4 @@ + o Minor bugfixes (unit tests): + - Make display of captured unit test log messages consistent. + Fixes bug 21510; bugfix on 0.2.9.3-alpha. + diff --git a/changes/bug21540 b/changes/bug21540 new file mode 100644 index 0000000000..0cf684b7f2 --- /dev/null +++ b/changes/bug21540 @@ -0,0 +1,4 @@ + o Minor bugfixes (windows, relay): + - Resolve "Failure from drain_fd: No error" warnings on Windows + relays. Fixes bug 21540; bugfix on 0.2.6.3-alpha. + diff --git a/changes/bug21586 b/changes/bug21586 new file mode 100644 index 0000000000..200d55a8e8 --- /dev/null +++ b/changes/bug21586 @@ -0,0 +1,4 @@ + o Minor bugfix (directory authority): + - Prevent the shared randomness subsystem from asserting when initialized + by a bridge authority with an incomplete configuration file. Fixes bug + #21856; bugfix on 0.2.9.8. diff --git a/changes/bug21599 b/changes/bug21599 new file mode 100644 index 0000000000..fe0f21a740 --- /dev/null +++ b/changes/bug21599 @@ -0,0 +1,4 @@ + o Minor bugfixes (hidden services): + - Simplify hidden service descriptor creation by using an existing flag + to check if an introduction point is established. + Fixes bug 21599; bugfix on 0.2.7.2-alpha. diff --git a/changes/bug21641 b/changes/bug21641 new file mode 100644 index 0000000000..96fdf5fe22 --- /dev/null +++ b/changes/bug21641 @@ -0,0 +1,5 @@ + o Minor feature (defaults, directory): + - Onion key rotation and expiry intervals are now defined as a network + consensus parameter as per proposal #274. The default lifetime of an + onion key is bumped from 7 to 28 days. Old onion keys will expire after 7 + days by default. Fixes bug #21641. diff --git a/changes/bug21654 b/changes/bug21654 new file mode 100644 index 0000000000..fd1c650710 --- /dev/null +++ b/changes/bug21654 @@ -0,0 +1,4 @@ + o Code simplifications and refactoring + - Use unbuffered I/O for utility functions around the process_handle_t + type. This fixes unit test failures reported on OpenBSD and FreeBSD. + Fixes bug 21654. diff --git a/changes/bug21703 b/changes/bug21703 new file mode 100644 index 0000000000..3034fc5e4b --- /dev/null +++ b/changes/bug21703 @@ -0,0 +1,4 @@ + o Minor features (controller): + - Warn the first time that a controller requests data in the + long-deprecated 'GETINFO network-status' format. Closes ticket 21703. + diff --git a/changes/bug21715 b/changes/bug21715 new file mode 100644 index 0000000000..ad9d8bfdaf --- /dev/null +++ b/changes/bug21715 @@ -0,0 +1,5 @@ + o Documentation (man page): + - Default of NumEntryGuards is 1 if the consensus parameter + guard-n-primary-guards-to-use isn't set. Default of NumDirectoryGuards + is 3 if the consensus parameter guard-n-primary-dir-guards-to-use isn't + set. Fixes bug 21715. diff --git a/changes/bug21788 b/changes/bug21788 new file mode 100644 index 0000000000..48deec2bb7 --- /dev/null +++ b/changes/bug21788 @@ -0,0 +1,3 @@ + o Minor bugfixes: + - Fix a small memory leak at exit from the backtrace handler code. + Fixes bug 21788; bugfix on 0.2.5.2-alpha. Patch from Daniel Pinto. diff --git a/changes/bug22042 b/changes/bug22042 new file mode 100644 index 0000000000..c1188df478 --- /dev/null +++ b/changes/bug22042 @@ -0,0 +1,5 @@ + o Minor bugfixes (control, hidden service client): + - Trigger HS descriptor events on the control port when the client is + unable to pick a suitable hidden service directory. This can happen if + they are all in the ExcludeNodes list or they all have been queried + inside the allowed 15 minutes. Fixes bug 22042. diff --git a/changes/bug22096 b/changes/bug22096 new file mode 100644 index 0000000000..83dac9c3f5 --- /dev/null +++ b/changes/bug22096 @@ -0,0 +1,6 @@ + o Minor features (linux seccomp2 sandbox): + - Increase the maximum allowed size passed to mprotect(PROT_WRITE) + from 1MB to 16MB. This was necessary with the glibc allocator in + order to allow worker threads to allocate more memory -- which in + turn is necessary because of our new use of worker threads for + compression. Closes ticket 22096. diff --git a/changes/consdiff_21643 b/changes/consdiff_21643 new file mode 100644 index 0000000000..38d465673b --- /dev/null +++ b/changes/consdiff_21643 @@ -0,0 +1,5 @@ + o Major features (internals): + - Add an ed diff/patch backend, optimized for consensus documents. + This backend will be the basis of our consensus diff implementation. + Most of the work here was done + by Daniel MartÃ. Closes ticket 21643. diff --git a/changes/data_dir_default_doc b/changes/data_dir_default_doc new file mode 100644 index 0000000000..6b49bb2a65 --- /dev/null +++ b/changes/data_dir_default_doc @@ -0,0 +1,3 @@ + o Documentation: + - Correct the documentation about the default DataDirectory value. + Closes ticket 21151. diff --git a/changes/faster-keccak b/changes/faster-keccak new file mode 100644 index 0000000000..45fc1526a8 --- /dev/null +++ b/changes/faster-keccak @@ -0,0 +1,4 @@ + o Minor features (performance): + - The minimal keccak implementation we include now accesses memory + more efficiently, especially on little-endian systems. + Closes ticket 21737. diff --git a/changes/feature21598 b/changes/feature21598 new file mode 100644 index 0000000000..317ace4bcf --- /dev/null +++ b/changes/feature21598 @@ -0,0 +1,4 @@ + o Minor feature (hidden services): + - Log a message when a hidden service descriptor has fewer introduction + points than specified in HiddenServiceNumIntroductionPoints. + Closes ticket 21598. diff --git a/changes/feature21622 b/changes/feature21622 new file mode 100644 index 0000000000..163b90b724 --- /dev/null +++ b/changes/feature21622 @@ -0,0 +1,8 @@ + o Minor feature (hidden services): + - Log a message when a hidden service reaches its introduction point + circuit limit, and when that limit is reset. + Follow up to ticket 21594, closes ticket 21622. + - Add more information to the message logged when a hidden service + descriptor has fewer introduction points than specified in + HiddenServiceNumIntroductionPoints. + Follow up to tickets 21598 and 21599, closes ticket 21622. diff --git a/changes/geoip-february2017 b/changes/geoip-february2017 deleted file mode 100644 index ec54b6122a..0000000000 --- a/changes/geoip-february2017 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor features: - - Update geoip and geoip6 to the February 8 2017 Maxmind GeoLite2 - Country database. - diff --git a/changes/new_spooling_backend b/changes/new_spooling_backend new file mode 100644 index 0000000000..a100688900 --- /dev/null +++ b/changes/new_spooling_backend @@ -0,0 +1,7 @@ + o Code simplification and refactoring: + - The logic that directory caches use to spool request to clients, + serving them one part at a time so as not to allocate too much memory, + has been refactored for consistency. Previously there was a separate + spooling implementation per type of spoolable data. Now there + is one common spooling implementation, with extensible data types. + Closes ticket 21651. diff --git a/changes/storagedir b/changes/storagedir new file mode 100644 index 0000000000..afaaab397f --- /dev/null +++ b/changes/storagedir @@ -0,0 +1,5 @@ + o Minor features (infrastructure, seccomp2 sandbox): + - We now have a document storage backend compatible with the Linux + seccomp2 sandbox. The long-term plan is to use this backend for + consensus documents and for storing unparseable directory + material. Closes ticket 21645. diff --git a/changes/test21470 b/changes/test21470 new file mode 100644 index 0000000000..8bb78dffc9 --- /dev/null +++ b/changes/test21470 @@ -0,0 +1,5 @@ + o Minor enhancements (unit tests): + - Improve version parsing tests: add tests for typical version components, + add tests for invalid versions, including numeric range and non-numeric + prefixes. + Unit tests 21278, 21450, and 21507. Partially implements 21470. diff --git a/changes/ticket13802 b/changes/ticket13802 new file mode 100644 index 0000000000..35cd2b5b68 --- /dev/null +++ b/changes/ticket13802 @@ -0,0 +1,7 @@ + o Minor features (testing): + - Add a general event-tracing instrumentation support to Tor. This + subsystem will enable developers and researchers to add fine-grained + instrumentation to their Tor instances, for use when examining Tor + network performance issues. There are no trace events yet, and + event-tracing is off by default unless enabled at compile time. + Implements ticket 13802. diff --git a/changes/ticket20656 b/changes/ticket20656 deleted file mode 100644 index 28192e8978..0000000000 --- a/changes/ticket20656 +++ /dev/null @@ -1,3 +0,0 @@ - o Minor feature (protover): - - Add new protocol version for proposal 224. HSIntro now advertises - version "3-4" and HSDir version "1-2". Fixes ticket 20656. diff --git a/changes/ticket21646 b/changes/ticket21646 new file mode 100644 index 0000000000..a0e4fb6352 --- /dev/null +++ b/changes/ticket21646 @@ -0,0 +1,6 @@ + o Code simplification and refactoring: + - Our API to launch directory requests has been greatly simplified + to become more extensible and less error-prone. We'll be using + this to improve support for adding extra headers to directory + requests. Closes ticket 21646. + diff --git a/changes/ticket21729 b/changes/ticket21729 new file mode 100644 index 0000000000..51d117311b --- /dev/null +++ b/changes/ticket21729 @@ -0,0 +1,7 @@ + o Minor features (logging): + - Log files are no longer created world-readable by default. + (Previously, most distributors would store the logs in a + non-world-readable location to prevent inappropriate access. This + change is an extra precaution.) Closes ticket 21729; patch from + toralf. + diff --git a/changes/ticket21841 b/changes/ticket21841 new file mode 100644 index 0000000000..08c7406725 --- /dev/null +++ b/changes/ticket21841 @@ -0,0 +1,4 @@ + o Code simplification and refactoring: + - Isolate our usage of the openssl headers so that they are only + used from our crypto wrapper modules, and from tests that examing those + modules' internals. Closes ticket 21841. diff --git a/changes/ticket21842 b/changes/ticket21842 new file mode 100644 index 0000000000..4b039c61f9 --- /dev/null +++ b/changes/ticket21842 @@ -0,0 +1,6 @@ + o Removed features: + - We've removed the tor-checkkey tool from src/tools. Long ago, we + used it to help people detect RSA keys that were generated by + versions of Debian affected by CVE-2008-0166. But those keys + have been out of circulation for ages, and this tool is no + longer required. Closes ticket 21842. diff --git a/changes/trove-2017-001.2 b/changes/trove-2017-001.2 deleted file mode 100644 index 3ef073cf9f..0000000000 --- a/changes/trove-2017-001.2 +++ /dev/null @@ -1,8 +0,0 @@ - o Major bugfixes (parsing): - - Fix an integer underflow bug when comparing malformed Tor versions. - This bug is harmless, except when Tor has been built with - --enable-expensive-hardening, which would turn it into a crash; - or on Tor 0.2.9.1-alpha through Tor 0.2.9.8, which were built with - -ftrapv by default. - Part of TROVE-2017-001. Fixes bug 21278; bugfix on - 0.0.8pre1. Found by OSS-Fuzz. diff --git a/configure.ac b/configure.ac index 59da60c6c4..aa1eda655e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Copyright (c) 2001-2004, Roger Dingledine dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -dnl Copyright (c) 2007-2015, The Tor Project, Inc. +dnl Copyright (c) 2007-2017, The Tor Project, Inc. dnl See LICENSE for licensing information AC_PREREQ([2.63]) @@ -53,6 +53,8 @@ AC_ARG_ENABLE(libfuzzer, AS_HELP_STRING(--enable-libfuzzer, [build extra fuzzers based on 'libfuzzer'])) AC_ARG_ENABLE(oss-fuzz, AS_HELP_STRING(--enable-oss-fuzz, [build extra fuzzers based on 'oss-fuzz' environment])) +AC_ARG_ENABLE(memory-sentinels, + AS_HELP_STRING(--disable-memory-sentinels, [disable code that tries to prevent some kinds of memory access bugs. For fuzzing only.])) if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then AC_MSG_ERROR([Can't disable assertions outside of coverage build]) @@ -76,6 +78,11 @@ if test "$enable_system_torrc" = "no"; then [Defined if we're not going to look for a torrc in SYSCONF]) fi +if test "$enable_memory_sentinels" = "no"; then + AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1, + [Defined if we're turning off memory safety code to look for bugs]) +fi + AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes") AC_ARG_ENABLE(asciidoc, @@ -182,6 +189,16 @@ AC_ARG_ENABLE(seccomp, AC_ARG_ENABLE(libscrypt, AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt])) +dnl Enable event tracing which are transformed to debug log statement. +AC_ARG_ENABLE(event-tracing-debug, + AS_HELP_STRING(--enable-event-tracing-debug, [build with event tracing to debug log])) +AM_CONDITIONAL([USE_EVENT_TRACING_DEBUG], [test "x$enable_event_tracing_debug" = "xyes"]) + +if test x$enable_event_tracing_debug = xyes; then + AC_DEFINE([USE_EVENT_TRACING_DEBUG], [1], [Tracing framework to log debug]) + AC_DEFINE([TOR_EVENT_TRACING_ENABLED], [1], [Compile the event tracing instrumentation]) +fi + dnl check for the correct "ar" when cross-compiling. dnl (AM_PROG_AR was new in automake 1.11.2, which we do not yet require, dnl so kludge up a replacement for the case where it isn't there yet.) @@ -725,6 +742,70 @@ else fi AC_SUBST(TOR_ZLIB_LIBS) +dnl ------------------------------------------------------ +dnl Where we do we find lzma? + +AC_ARG_ENABLE(lzma, + AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]), + [case "${enableval}" in + "yes") lzma=true ;; + "no") lzma=false ;; + * ) AC_MSG_ERROR(bad value for --enable-lzma) ;; + esac], [lzma=auto]) + +if test "x$enable_lzma" = "xno"; then + have_lzma=no; +else + PKG_CHECK_MODULES([LZMA], + [liblzma], + have_lzma=yes, + have_lzma=no) + + if test "x$have_lzma" = "xno" ; then + AC_MSG_WARN([Unable to find liblzma.]) + fi +fi + +if test "x$have_lzma" = "xyes"; then + AC_DEFINE(HAVE_LZMA,1,[Have LZMA]) + TOR_LZMA_CFLAGS="${LZMA_CFLAGS}" + TOR_LZMA_LIBS="${LZMA_LIBS}" +fi +AC_SUBST(TOR_LZMA_CFLAGS) +AC_SUBST(TOR_LZMA_LIBS) + +dnl ------------------------------------------------------ +dnl Where we do we find zstd? + +AC_ARG_ENABLE(zstd, + AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]), + [case "${enableval}" in + "yes") zstd=true ;; + "no") zstd=false ;; + * ) AC_MSG_ERROR(bad value for --enable-zstd) ;; + esac], [zstd=auto]) + +if test "x$enable_zstd" = "xno"; then + have_zstd=no; +else + PKG_CHECK_MODULES([ZSTD], + [libzstd], + have_zstd=yes, + have_zstd=no) + + if test "x$have_zstd" = "xno" ; then + AC_MSG_WARN([Unable to find libzstd.]) + fi +fi + +if test "x$have_zstd" = "xyes"; then + AC_DEFINE(HAVE_ZSTD,1,[Have Zstd]) + TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}" + TOR_ZSTD_LIBS="${ZSTD_LIBS}" +fi +AC_SUBST(TOR_ZSTD_CFLAGS) +AC_SUBST(TOR_ZSTD_LIBS) + dnl ---------------------------------------------------------------------- dnl Check if libcap is available for capabilities. diff --git a/doc/HACKING/CodingStandards.md b/doc/HACKING/CodingStandards.md index 01212a9919..c7787a72cc 100644 --- a/doc/HACKING/CodingStandards.md +++ b/doc/HACKING/CodingStandards.md @@ -4,9 +4,10 @@ Coding conventions for Tor tl;dr: - Run configure with `--enable-fatal-warnings` - - Run `make check-spaces` to catch whitespace errors - Document your functions - Write unit tests + - Run `make test-full` to test against all unit and integration tests. + - Run `make distcheck` to ensure the distribution works - Add a file in `changes` for your branch. Patch checklist @@ -22,10 +23,12 @@ preference) Did you remember... - To build your code while configured with `--enable-fatal-warnings`? - - To run `make check-spaces` on your code? - To run `make check-docs` to see whether all new options are on the manpage? - To write unit tests, as possible? + - To run `make test-full` to test against all unit and integration tests (or + `make test-full-online` if you have a working connection to the internet)? + - To test that the distribution will actually work via `make distcheck`? - To base your code on the appropriate branch? - To include a file in the `changes` directory as appropriate? diff --git a/doc/HACKING/Fuzzing.md b/doc/HACKING/Fuzzing.md index 16b0b6b000..2039d6a4c0 100644 --- a/doc/HACKING/Fuzzing.md +++ b/doc/HACKING/Fuzzing.md @@ -64,14 +64,14 @@ To Build: make cd ../tor PATH=$PATH:../afl/ CC="../afl/afl-gcc" ./configure --enable-expensive-hardening - AFL_HARDEN=1 make clean fuzz + AFL_HARDEN=1 make clean fuzzers To Find The ASAN Memory Limit: (64-bit only) -On 64-bit platforms, afl needs to know how much memory ASAN uses. -Or, you can configure tor without --enable-expensive-hardening, then use - make fuzz -to run the generated test cases through an ASAN-enabled fuzz-http. +On 64-bit platforms, afl needs to know how much memory ASAN uses, +because ASAN tends to allocate a ridiculous amount of virtual memory, +and then not actually use it. + Read afl/docs/notes_for_asan.txt for more details. Download recidivm from http://jwilk.net/software/recidivm @@ -80,7 +80,7 @@ Read afl/docs/notes_for_asan.txt for more details. tar xvzf recidivm*.tar.gz cd recidivm* make - /path/to/recidivm -v src/test/fuzz_dir + /path/to/recidivm -v src/test/fuzz/fuzz-http Use the final "ok" figure as the input to -m when calling afl-fuzz (Normally, recidivm would output a figure automatically, but in some cases, the fuzzing harness will hang when the memory limit is too small.) diff --git a/doc/HACKING/ReleasingTor.md b/doc/HACKING/ReleasingTor.md index 4761ca9a37..809cd03bf3 100644 --- a/doc/HACKING/ReleasingTor.md +++ b/doc/HACKING/ReleasingTor.md @@ -98,7 +98,12 @@ new Tor release: to a release-0.2.x branch, manually commit the changelogs to the later git branches too. -3. If you're doing the first stable release in a series, you need to +3. If there are changes that require or suggest operator intervention + before or during the update, mail operators (either dirauth or relays + list) with a headline that indicates that an action is required or + appreciated. + +4. If you're doing the first stable release in a series, you need to create a ReleaseNotes for the series as a whole. To get started there, copy all of the Changelog entries from the series into a new file, and run `./scripts/maint/sortChanges.py` on it. That will diff --git a/doc/HACKING/Tracing.md b/doc/HACKING/Tracing.md new file mode 100644 index 0000000000..a5fb5165e2 --- /dev/null +++ b/doc/HACKING/Tracing.md @@ -0,0 +1,91 @@ +# Tracing # + +This document describes how the event tracing subsystem works in tor so +developers can add events to the code base but also hook them to an event +tracing framework. + +## Basics ### + +Event tracing is seperated in two concepts, trace events and a tracer. The +tracing subsystem can be found in `src/trace`. The `events.h` header file is +the main file that maps the different tracers to trace events. + +### Events ### + +A trace event is basically a function from which we can pass any data that +we want to collect. In addition, we specify a context for the event such as +a subsystem and an event name. + +A trace event in tor has the following standard format: + + tor_trace(subsystem, event\_name, args...) + +The `subsystem` parameter is the name of the subsytem the trace event is in. +For example that could be "scheduler" or "vote" or "hs". The idea is to add +some context to the event so when we collect them we know where it's coming +from. The `event_name` is the name of the event which helps a lot with +adding some semantic to the event. Finally, `args` is any number of +arguments we want to collect. + +Here is an example of a possible tracepoint in main(): + + tor_trace(main, init_phase, argc) + +The above is a tracepoint in the `main` subsystem with `init_phase` as the +event name and the `int argc` is passed to the event as well. + +How `argc` is collected or used has nothing to do with the instrumentation +(adding trace events to the code). It is the work of the tracer so this is why +the trace events and collection framework (tracer) are decoupled. You _can_ +have trace events without a tracer. + +### Tracer ### + +In `src/trace/events.h`, we map the `tor_trace()` function to the right +tracer. A tracer support is only enabled at compile time. For instance, the +file `src/trace/debug.h` contains the mapping of the generic tracing function +`tor_trace()` to the `log_debug()` function. More specialized function can be +mapped depending on the tracepoint. + +## Build System ## + +This section describes how it is integrated into the build system of tor. + +By default, every tracing events are disabled in tor that is `tor_trace()` +is a NOP. + +To enable a tracer, there is a configure option on the form of: + + --enable-tracing-<tracer> + +We have an option that will send every trace events to a `log_debug()` (as +mentionned above) which will print you the subsystem and name of the event but +not the arguments for technical reasons. This is useful if you want to quickly +see if your trace event is being hit or well written. To do so, use this +configure option: + + --enable-tracing-debug + +## Instrument Tor ## + +This is pretty easy. Let's say you want to add a trace event in +`src/or/rendcache.c`, you only have to add this include statement: + + #include "trace/events.h" + +Once done, you can add as many as you want `tor_trace()` that you need. +Please use the right subsystem (here it would be `hs`) and a unique name that +tells what the event is for. For example: + + tor_trace(hs, store_desc_as_client, desc, desc_id); + +If you look in `src/trace/events.h`, you'll see that if tracing is enabled it +will be mapped to a function called: + + tor_trace_hs_store_desc_as_client(desc, desc_id) + +And the point of all this is for that function to be defined in a new file +that you might want to add named `src/trace/hs.{c|h}` which would defined how +to collect the data for the `tor_trace_hs_store_desc_as_client()` function +like for instance sending it to a `log_debug()` or do more complex operations +or use a userspace tracer like LTTng (https://lttng.org). diff --git a/doc/tor.1.txt b/doc/tor.1.txt index de2e2b4a04..276052c799 100644 --- a/doc/tor.1.txt +++ b/doc/tor.1.txt @@ -185,6 +185,9 @@ GENERAL OPTIONS course, more is better; we recommend at least 250 KBytes (2 mbits) if possible. (Default: 1 GByte) + + + Note that this option, and other bandwidth-limiting options, apply to TCP + data only: They do not count TCP headers or DNS traffic. + + + With this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as @@ -391,7 +394,9 @@ GENERAL OPTIONS [[DataDirectory]] **DataDirectory** __DIR__:: Store working data in DIR. Can not be changed while tor is running. - (Default: @LOCALSTATEDIR@/lib/tor) + (Default: ~/.tor if your home directory is not /; otherwise, + @LOCALSTATEDIR@/lib/tor. On Windows, the default is + your ApplicationData folder.) [[DataDirectoryGroupReadable]] **DataDirectoryGroupReadable** **0**|**1**:: If this option is set to 0, don't allow the filesystem group to read the @@ -641,7 +646,7 @@ GENERAL OPTIONS (127.0.0.0/8 and ::1). [[OutboundBindAddressOR]] **OutboundBindAddressOR** __IP__:: - Make all outbound non-exit (=relay and other) connections originate from the IP + Make all outbound non-exit (=relay and other) connections originate from the IP address specified. This option overrides **OutboundBindAddress** for the same IP version. This option may be used twice, once with an IPv4 address and once with an IPv6 address. This setting will be ignored for connections to the @@ -783,7 +788,7 @@ The following options are useful only for clients (that is, if so using these relays might make your client stand out. (Default: 1) -[[Bridge]] **Bridge** [__transport__] __IP__:__ORPort__ [__fingerprint__]:: +[[Bridge]] **Bridge** [__transport__] __IP__:__ORPort__ [__fingerprint__] [__key__=__val__...]:: When set along with UseBridges, instructs Tor to use the relay at "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" is provided (using the same format as for DirAuthority), we will verify that @@ -796,7 +801,12 @@ The following options are useful only for clients (that is, if rather than connecting to the bridge directly. Some transports use a transport-specific method to work out the remote address to connect to. These transports typically ignore the "IP:ORPort" specified in the bridge - line. + line. + + + + Tor passes any "key=val" settings to the pluggable transport proxy as + per-connection arguments when connecting to the bridge. Consult + the documentation of the pluggable transport for details of what + arguments it supports. [[LearnCircuitBuildTimeout]] **LearnCircuitBuildTimeout** **0**|**1**:: If 0, CircuitBuildTimeout adaptive learning is disabled. (Default: 1) @@ -1050,7 +1060,8 @@ The following options are useful only for clients (that is, if but never attach a new stream to a circuit that is too old. For hidden services, this applies to the __last__ time a circuit was used, not the first. Circuits with streams constructed with SOCKS authentication via - SocksPorts that have **KeepAliveIsolateSOCKSAuth** ignore this value. + SocksPorts that have **KeepAliveIsolateSOCKSAuth** also remain alive + for MaxCircuitDirtiness seconds after carrying the last such stream. (Default: 10 minutes) [[MaxClientCircuitsPending]] **MaxClientCircuitsPending** __NUM__:: @@ -1112,8 +1123,9 @@ The following options are useful only for clients (that is, if Don't share circuits with streams targeting a different destination address. **KeepAliveIsolateSOCKSAuth**;; - If **IsolateSOCKSAuth** is enabled, keep alive circuits that have - streams with SOCKS authentication set indefinitely. + If **IsolateSOCKSAuth** is enabled, keep alive circuits while they have + at least one stream with SOCKS authentication active. After such a circuit + is idle for more than MaxCircuitDirtiness seconds, it can be closed. **SessionGroup=**__INT__;; If no other isolation rules would prevent it, allow streams on this port to share circuits with streams from every other @@ -1267,16 +1279,16 @@ The following options are useful only for clients (that is, if [[NumEntryGuards]] **NumEntryGuards** __NUM__:: If UseEntryGuards is set to 1, we will try to pick a total of NUM routers - as long-term entries for our circuits. If NUM is 0, we try to learn - the number from the NumEntryGuards consensus parameter, and default - to 3 if the consensus parameter isn't set. (Default: 0) + as long-term entries for our circuits. If NUM is 0, we try to learn the + number from the guard-n-primary-guards-to-use consensus parameter, and + default to 1 if the consensus parameter isn't set. (Default: 0) [[NumDirectoryGuards]] **NumDirectoryGuards** __NUM__:: - If UseEntryGuardsAsDirectoryGuards is enabled, we try to make sure we - have at least NUM routers to use as directory guards. If this option - is set to 0, use the value from the NumDirectoryGuards consensus - parameter, falling back to the value from NumEntryGuards if the - consensus parameter is 0 or isn't set. (Default: 0) + If UseEntryGuardsAsDirectoryGuards is enabled, we try to make sure we have + at least NUM routers to use as directory guards. If this option is set to + 0, use the value from the guard-n-primary-dir-guards-to-use consensus + parameter, and default to 3 if the consensus parameter isn't set. + (Default: 0) [[GuardLifetime]] **GuardLifetime** __N__ **days**|**weeks**|**months**:: If nonzero, and UseEntryGuards is set, minimum time to keep a guard before @@ -2121,8 +2133,9 @@ is non-zero): DIRECTORY SERVER OPTIONS ------------------------ -The following options are useful only for directory servers (that is, -if DirPort is non-zero): +The following options are useful only for directory servers. (Relays with +enough bandwidth automatically become directory servers; see DirCache for +details.) [[DirPortFrontPage]] **DirPortFrontPage** __FILENAME__:: When this option is set, it takes an HTML file and publishes it as "/" on diff --git a/doc/torrc_format.txt b/doc/torrc_format.txt index 7a809901d9..b175b9fb15 100644 --- a/doc/torrc_format.txt +++ b/doc/torrc_format.txt @@ -175,7 +175,7 @@ and\ friends # Backslashes in the middle of a line are included as-is. The key of -# this one is "Too" and the value is "Many\\Backsl\ashes here" (with +# this one is "Too" and the value is "Many\\Backsl\ashes \here" (with # backslashes in that last string as-is) Too \ Many\\\ @@ -185,7 +185,7 @@ here # And here's the really yucky part. If a comment appears in a multi-line # entry, the entry is still able to continue on the next line, as in the # following, where the key is "This" and the value is -# "entry and some are silly" +# "entry and some are silly" This entry \ # has comments \ and some \ diff --git a/scripts/codegen/fuzzing_include_am.py b/scripts/codegen/fuzzing_include_am.py new file mode 100755 index 0000000000..91e9e5f3f6 --- /dev/null +++ b/scripts/codegen/fuzzing_include_am.py @@ -0,0 +1,154 @@ + + +FUZZERS = """ + consensus + descriptor + diff + diff-apply + extrainfo + hsdescv2 + http + iptsv2 + microdesc + vrs +""" + + +PREAMBLE = r""" +FUZZING_CPPFLAGS = \ + $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) +FUZZING_CFLAGS = \ + $(AM_CFLAGS) $(TEST_CFLAGS) +FUZZING_LDFLAG = \ + @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@ +FUZZING_LIBS = \ + src/or/libtor-testing.a \ + src/common/libor-crypto-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/trunnel/libor-trunnel-testing.a \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_LIBEVENT_LIBS@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_SYSTEMD_LIBS@ + +oss-fuzz-prereqs: \ + src/or/libtor-testing.a \ + src/common/libor-crypto-testing.a \ + $(LIBKECCAK_TINY) \ + $(LIBDONNA) \ + src/common/libor-testing.a \ + src/common/libor-ctime-testing.a \ + src/common/libor-event-testing.a \ + src/trunnel/libor-trunnel-testing.a + +noinst_HEADERS += \ + src/test/fuzz/fuzzing.h + +LIBFUZZER = /home/nickm/build/libfuzz/libFuzzer.a +LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) +LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) +LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ + +LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) +""" + +POSTAMBLE = r""" +noinst_PROGRAMS += $(FUZZERS) $(LIBFUZZER_FUZZERS) +noinst_LIBRARIES += $(OSS_FUZZ_FUZZERS) +oss-fuzz-fuzzers: oss-fuzz-prereqs $(OSS_FUZZ_FUZZERS) +fuzzers: $(FUZZERS) $(LIBFUZZER_FUZZERS) + +test-fuzz-corpora: $(FUZZERS) + $(top_srcdir)/src/test/fuzz_static_testcases.sh +""" + +########### No user serviceable parts will follow. + +PREAMBLE = PREAMBLE.strip() +POSTAMBLE = POSTAMBLE.strip() # If I use it, it's a word! +FUZZERS = FUZZERS.split() +FUZZERS.sort() + +WARNING = """ +# This file was generated by fuzzing_include_am.py; do not hand-edit unless +# you enjoy having your changes erased. +""".strip() + +print(WARNING) + +print(PREAMBLE) + +print("\n# ===== AFL fuzzers") + +def get_id_name(s): + return s.replace("-", "_") + +for fuzzer in FUZZERS: + idname = get_id_name(fuzzer) + print("""\ +src_test_fuzz_fuzz_{name}_SOURCES = \\ + src/test/fuzz/fuzzing_common.c \\ + src/test/fuzz/fuzz_{name}.c +src_test_fuzz_fuzz_{name}_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_{name}_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_{name}_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_{name}_LDADD = $(FUZZING_LIBS) +""".format(name=idname)) + +print("FUZZERS = \\") +print(" \\\n".join("\tsrc/test/fuzz/fuzz-{name}".format(name=fuzzer) + for fuzzer in FUZZERS)) + +print("\n# ===== libfuzzer") +print("\nif LIBFUZZER_ENABLED") + +for fuzzer in FUZZERS: + idname = get_id_name(fuzzer) + print("""\ +src_test_fuzz_lf_fuzz_{name}_SOURCES = \\ + $(src_test_fuzz_fuzz_{name}_SOURCES) +src_test_fuzz_lf_fuzz_{name}_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_{name}_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_{name}_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_{name}_LDADD = $(LIBFUZZER_LIBS) +""".format(name=idname)) + +print("LIBFUZZER_FUZZERS = \\") +print(" \\\n".join("\tsrc/test/fuzz/lf-fuzz-{name}".format(name=fuzzer) + for fuzzer in FUZZERS)) + +print(""" +else +LIBFUZZER_FUZZERS = +endif""") + +print("\n# ===== oss-fuzz\n") +print("if OSS_FUZZ_ENABLED") + +for fuzzer in FUZZERS: + idname = get_id_name(fuzzer) + print("""\ +src_test_fuzz_liboss_fuzz_{name}_a_SOURCES = \\ + $(src_test_fuzz_fuzz_{name}_SOURCES) +src_test_fuzz_liboss_fuzz_{name}_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_{name}_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) +""".format(name=idname)) + +print("OSS_FUZZ_FUZZERS = \\") +print(" \\\n".join("\tsrc/test/fuzz/liboss-fuzz-{name}.a".format(name=fuzzer) + for fuzzer in FUZZERS)) + +print(""" +else +OSS_FUZZ_FUZZERS = +endif""") + +print("") + +print(POSTAMBLE) diff --git a/scripts/codegen/gen_server_ciphers.py b/scripts/codegen/gen_server_ciphers.py index 7470f8a025..7ea39c540d 100755 --- a/scripts/codegen/gen_server_ciphers.py +++ b/scripts/codegen/gen_server_ciphers.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2014-2015, The Tor Project, Inc +# Copyright 2014-2017, The Tor Project, Inc # See LICENSE for licensing information # This script parses openssl headers to find ciphersuite names, determines diff --git a/scripts/codegen/get_mozilla_ciphers.py b/scripts/codegen/get_mozilla_ciphers.py index b07746c2e2..946957ac77 100755 --- a/scripts/codegen/get_mozilla_ciphers.py +++ b/scripts/codegen/get_mozilla_ciphers.py @@ -1,6 +1,6 @@ #!/usr/bin/python # coding=utf-8 -# Copyright 2011-2015, The Tor Project, Inc +# Copyright 2011-2017, The Tor Project, Inc # original version by Arturo Filastò # See LICENSE for licensing information diff --git a/scripts/codegen/makedesc.py b/scripts/codegen/makedesc.py index d4ba21efae..8d9d4edaaf 100644 --- a/scripts/codegen/makedesc.py +++ b/scripts/codegen/makedesc.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2014-2015, The Tor Project, Inc. +# Copyright 2014-2017, The Tor Project, Inc. # See LICENSE for license information # This is a kludgey python script that uses ctypes and openssl to sign diff --git a/scripts/maint/format_changelog.py b/scripts/maint/format_changelog.py index e909fc550a..c5a0cfc81b 100755 --- a/scripts/maint/format_changelog.py +++ b/scripts/maint/format_changelog.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright (c) 2014-2015, The Tor Project, Inc. +# Copyright (c) 2014-2017, The Tor Project, Inc. # See LICENSE for licensing information # # This script reformats a section of the changelog to wrap everything to @@ -205,6 +205,8 @@ def head_score(s): score = -300 elif lw.startswith("deprecated version"): score = -200 + elif lw.startswith("directory auth"): + score = -150 elif (('new' in lw and 'requirement' in lw) or ('new' in lw and 'dependenc' in lw) or ('build' in lw and 'requirement' in lw) or diff --git a/scripts/maint/redox.py b/scripts/maint/redox.py index 43f5b6eb16..12aed6463a 100755 --- a/scripts/maint/redox.py +++ b/scripts/maint/redox.py @@ -1,6 +1,6 @@ #!/usr/bin/python # -# Copyright (c) 2008-2015, The Tor Project, Inc. +# Copyright (c) 2008-2017, The Tor Project, Inc. # See LICENSE for licensing information. # # Hi! diff --git a/scripts/maint/sortChanges.py b/scripts/maint/sortChanges.py index d6ec0e269d..22e40fd369 100755 --- a/scripts/maint/sortChanges.py +++ b/scripts/maint/sortChanges.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright (c) 2014-2015, The Tor Project, Inc. +# Copyright (c) 2014-2017, The Tor Project, Inc. # See LICENSE for licensing information """This script sorts a bunch of changes files listed on its command diff --git a/scripts/maint/updateCopyright.pl b/scripts/maint/updateCopyright.pl index 8bd6a18210..beb0b8f26e 100755 --- a/scripts/maint/updateCopyright.pl +++ b/scripts/maint/updateCopyright.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl -i -w -p -$NEWYEAR=2016; +$NEWYEAR=2017; -s/Copyright(.*) (201[^6]), The Tor Project/Copyright$1 $2-${NEWYEAR}, The Tor Project/; +s/Copyright(.*) (201[^7]), The Tor Project/Copyright$1 $2-${NEWYEAR}, The Tor Project/; s/Copyright(.*)-(20..), The Tor Project/Copyright$1-${NEWYEAR}, The Tor Project/; diff --git a/scripts/test/cov-exclude b/scripts/test/cov-exclude index 5117f11ec4..5cb9b1282d 100755 --- a/scripts/test/cov-exclude +++ b/scripts/test/cov-exclude @@ -26,3 +26,9 @@ if ($excluding or $exclude_this) { s{^\s*\#\#+:}{ x:}; s{^ (\s*)(\d+):}{$1!!!$2:}; } + +if (eof and $excluding) { + warn "Runaway LCOV_EXCL_START in $ARGV"; + $excluding = 0; +} + diff --git a/src/common/Makefile.nmake b/src/common/Makefile.nmake index b8c5dd4fea..a1c819fffa 100644 --- a/src/common/Makefile.nmake +++ b/src/common/Makefile.nmake @@ -7,8 +7,8 @@ LIBOR_OBJECTS = address.obj backtrace.obj compat.obj container.obj di_ops.obj \ log.obj memarea.obj mempool.obj procmon.obj sandbox.obj util.obj \ util_codedigest.obj -LIBOR_CRYPTO_OBJECTS = aes.obj crypto.obj crypto_format.obj torgzip.obj tortls.obj \ - crypto_curve25519.obj curve25519-donna.obj +LIBOR_CRYPTO_OBJECTS = aes.obj crypto.obj crypto_format.obj compress.obj compress_zlib.obj \ + tortls.obj crypto_curve25519.obj curve25519-donna.obj LIBOR_EVENT_OBJECTS = compat_libevent.obj diff --git a/src/common/address.c b/src/common/address.c index 2693239146..c5d0e918ca 100644 --- a/src/common/address.c +++ b/src/common/address.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1198,7 +1198,7 @@ tor_addr_hash(const tor_addr_t *addr) /* LCOV_EXCL_START */ tor_fragile_assert(); return 0; - /* LCOV_EXCL_END */ + /* LCOV_EXCL_STOP */ } } diff --git a/src/common/address.h b/src/common/address.h index 0dc6edae37..ce85b3d81d 100644 --- a/src/common/address.h +++ b/src/common/address.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/aes.c b/src/common/aes.c index 35c2d1e3a5..73abef143e 100644 --- a/src/common/aes.c +++ b/src/common/aes.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/aes.h b/src/common/aes.h index 1cda53f2fa..6fd9c3ea16 100644 --- a/src/common/aes.h +++ b/src/common/aes.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Implements a minimal interface to counter-mode AES. */ diff --git a/src/common/backtrace.c b/src/common/backtrace.c index 61096952d8..0f0fa857bf 100644 --- a/src/common/backtrace.c +++ b/src/common/backtrace.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/backtrace.h b/src/common/backtrace.h index b53fd2c668..8cd1dcf06c 100644 --- a/src/common/backtrace.h +++ b/src/common/backtrace.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_BACKTRACE_H diff --git a/src/common/compat.c b/src/common/compat.c index 0dbede6bed..390cff7dba 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat.h b/src/common/compat.h index ee1c9454de..68fad9b598 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_H diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c index 4a3b1af922..1146d02168 100644 --- a/src/common/compat_libevent.c +++ b/src/common/compat_libevent.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Tor Project, Inc. */ +/* Copyright (c) 2009-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_libevent.h b/src/common/compat_libevent.h index c2e34764e4..96c48d53a1 100644 --- a/src/common/compat_libevent.h +++ b/src/common/compat_libevent.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Tor Project, Inc. */ +/* Copyright (c) 2009-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_LIBEVENT_H diff --git a/src/common/compat_openssl.h b/src/common/compat_openssl.h index 1bfe188075..2b94fe5b4e 100644 --- a/src/common/compat_openssl.h +++ b/src/common/compat_openssl.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_OPENSSL_H diff --git a/src/common/compat_pthreads.c b/src/common/compat_pthreads.c index c1ae66c1d2..8e4b833573 100644 --- a/src/common/compat_pthreads.c +++ b/src/common/compat_pthreads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c index f4809060d6..c593e9af8d 100644 --- a/src/common/compat_threads.c +++ b/src/common/compat_threads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -94,51 +94,73 @@ in_main_thread(void) } #if defined(HAVE_EVENTFD) || defined(HAVE_PIPE) -/* As write(), but retry on EINTR */ +/* As write(), but retry on EINTR, and return the negative error code on + * error. */ static int write_ni(int fd, const void *buf, size_t n) { int r; again: r = (int) write(fd, buf, n); - if (r < 0 && errno == EINTR) - goto again; + if (r < 0) { + if (errno == EINTR) + goto again; + else + return -errno; + } return r; } -/* As read(), but retry on EINTR */ +/* As read(), but retry on EINTR, and return the negative error code on error. + */ static int read_ni(int fd, void *buf, size_t n) { int r; again: r = (int) read(fd, buf, n); - if (r < 0 && errno == EINTR) - goto again; + if (r < 0) { + if (errno == EINTR) + goto again; + else + return -errno; + } return r; } #endif -/** As send(), but retry on EINTR. */ +/** As send(), but retry on EINTR, and return the negative error code on + * error. */ static int send_ni(int fd, const void *buf, size_t n, int flags) { int r; again: r = (int) send(fd, buf, n, flags); - if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd))) - goto again; + if (r < 0) { + int error = tor_socket_errno(fd); + if (ERRNO_IS_EINTR(error)) + goto again; + else + return -error; + } return r; } -/** As recv(), but retry on EINTR. */ +/** As recv(), but retry on EINTR, and return the negative error code on + * error. */ static int recv_ni(int fd, void *buf, size_t n, int flags) { int r; again: r = (int) recv(fd, buf, n, flags); - if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd))) - goto again; + if (r < 0) { + int error = tor_socket_errno(fd); + if (ERRNO_IS_EINTR(error)) + goto again; + else + return -error; + } return r; } @@ -149,7 +171,7 @@ eventfd_alert(int fd) { uint64_t u = 1; int r = write_ni(fd, (void*)&u, sizeof(u)); - if (r < 0 && errno != EAGAIN) + if (r < 0 && -r != EAGAIN) return -1; return 0; } @@ -160,8 +182,8 @@ eventfd_drain(int fd) { uint64_t u = 0; int r = read_ni(fd, (void*)&u, sizeof(u)); - if (r < 0 && errno != EAGAIN) - return -1; + if (r < 0 && -r != EAGAIN) + return r; return 0; } #endif @@ -172,8 +194,8 @@ static int pipe_alert(int fd) { ssize_t r = write_ni(fd, "x", 1); - if (r < 0 && errno != EAGAIN) - return -1; + if (r < 0 && -r != EAGAIN) + return (int)r; return 0; } @@ -188,7 +210,7 @@ pipe_drain(int fd) r = read_ni(fd, buf, sizeof(buf)); } while (r > 0); if (r < 0 && errno != EAGAIN) - return -1; + return -errno; /* A value of r = 0 means EOF on the fd so successfully drained. */ return 0; } @@ -200,13 +222,13 @@ static int sock_alert(tor_socket_t fd) { ssize_t r = send_ni(fd, "x", 1, 0); - if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd))) - return -1; + if (r < 0 && !ERRNO_IS_EAGAIN(-r)) + return (int)r; return 0; } /** Drain all the input from a socket <b>fd</b>, and ignore it. Return 0 on - * success, -1 on error. */ + * success, -errno on error. */ static int sock_drain(tor_socket_t fd) { @@ -215,8 +237,8 @@ sock_drain(tor_socket_t fd) do { r = recv_ni(fd, buf, sizeof(buf), 0); } while (r > 0); - if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd))) - return -1; + if (r < 0 && !ERRNO_IS_EAGAIN(-r)) + return (int)r; /* A value of r = 0 means EOF on the fd so successfully drained. */ return 0; } @@ -330,3 +352,49 @@ alert_sockets_close(alert_sockets_t *socks) socks->read_fd = socks->write_fd = -1; } +/* + * XXXX We might be smart to move to compiler intrinsics or real atomic + * XXXX operations at some point. But not yet. + * + */ + +/** Initialize a new atomic counter with the value 0 */ +void +atomic_counter_init(atomic_counter_t *counter) +{ + memset(counter, 0, sizeof(*counter)); + tor_mutex_init_nonrecursive(&counter->mutex); +} +/** Clean up all resources held by an atomic counter. */ +void +atomic_counter_destroy(atomic_counter_t *counter) +{ + tor_mutex_uninit(&counter->mutex); + memset(counter, 0, sizeof(*counter)); +} +/** Add a value to an atomic counter. */ +void +atomic_counter_add(atomic_counter_t *counter, size_t add) +{ + tor_mutex_acquire(&counter->mutex); + counter->val += add; + tor_mutex_release(&counter->mutex); +} +/** Subtract a value from an atomic counter. */ +void +atomic_counter_sub(atomic_counter_t *counter, size_t sub) +{ + // this relies on unsigned overflow, but that's fine. + atomic_counter_add(counter, -sub); +} +/** Return the current value of an atomic counter */ +size_t +atomic_counter_get(atomic_counter_t *counter) +{ + size_t val; + tor_mutex_acquire(&counter->mutex); + val = counter->val; + tor_mutex_release(&counter->mutex); + return val; +} + diff --git a/src/common/compat_threads.h b/src/common/compat_threads.h index 171a9f93ff..9fa3d0d0b7 100644 --- a/src/common/compat_threads.h +++ b/src/common/compat_threads.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_THREADS_H @@ -147,5 +147,19 @@ void *tor_threadlocal_get(tor_threadlocal_t *threadlocal); */ void tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value); +/** + * Atomic counter type; holds a size_t value. + */ +typedef struct atomic_counter_t { + tor_mutex_t mutex; + size_t val; +} atomic_counter_t; + +void atomic_counter_init(atomic_counter_t *counter); +void atomic_counter_destroy(atomic_counter_t *counter); +void atomic_counter_add(atomic_counter_t *counter, size_t add); +void atomic_counter_sub(atomic_counter_t *counter, size_t sub); +size_t atomic_counter_get(atomic_counter_t *counter); + #endif diff --git a/src/common/compat_time.c b/src/common/compat_time.c index d044bbe1d7..2ccaa36e49 100644 --- a/src/common/compat_time.c +++ b/src/common/compat_time.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_time.h b/src/common/compat_time.h index 2262446e57..90194c5ebc 100644 --- a/src/common/compat_time.h +++ b/src/common/compat_time.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_winthreads.c b/src/common/compat_winthreads.c index 735be4ad17..915368b94f 100644 --- a/src/common/compat_winthreads.c +++ b/src/common/compat_winthreads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compress.c b/src/common/compress.c new file mode 100644 index 0000000000..6fe4569868 --- /dev/null +++ b/src/common/compress.c @@ -0,0 +1,593 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress.c + * \brief Common compression API. + **/ + +#include "orconfig.h" + +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <string.h> +#include "torint.h" + +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_lzma.h" +#include "compress_none.h" +#include "compress_zlib.h" +#include "compress_zstd.h" + +/** Total number of bytes allocated for compression state overhead. */ +static atomic_counter_t total_compress_allocation; + +/** @{ */ +/* These macros define the maximum allowable compression factor. Anything of + * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to + * have an uncompression factor (uncompressed size:compressed size ratio) of + * any greater than MAX_UNCOMPRESSION_FACTOR. + * + * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to + * be small to limit the attack multiplier, but we also want it to be large + * enough so that no legitimate document --even ones we might invent in the + * future -- ever compresses by a factor of greater than + * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably + * large range of possible values. IMO, anything over 8 is probably safe; IMO + * anything under 50 is probably sufficient. + */ +#define MAX_UNCOMPRESSION_FACTOR 25 +#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64) +/** @} */ + +/** Return true if uncompressing an input of size <b>in_size</b> to an input of + * size at least <b>size_out</b> looks like a compression bomb. */ +int +tor_compress_is_compression_bomb(size_t size_in, size_t size_out) +{ + if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER) + return 0; + + return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR); +} + +/** Guess the size that <b>in_len</b> will be after compression or + * decompression. */ +static size_t +guess_compress_size(int compress, compress_method_t method, + compression_level_t compression_level, + size_t in_len) +{ + // ignore these for now. + (void)compression_level; + if (method == NO_METHOD) { + /* Guess that we'll need an extra byte, to avoid a needless realloc + * for nul-termination */ + return (in_len < SIZE_MAX) ? in_len + 1 : in_len; + } + + /* Always guess a factor of 2. */ + if (compress) { + in_len /= 2; + } else { + if (in_len < SIZE_T_CEILING/2) + in_len *= 2; + } + return MAX(in_len, 1024); +} + +/** Internal function to implement tor_compress/tor_uncompress, depending on + * whether <b>compress</b> is set. All arguments are as for tor_compress or + * tor_uncompress. */ +static int +tor_compress_impl(int compress, + char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + compression_level_t compression_level, + int complete_only, + int protocol_warn_level) +{ + tor_compress_state_t *stream; + int rv; + + stream = tor_compress_new(compress, method, compression_level); + + if (stream == NULL) + return -1; + + size_t in_len_orig = in_len; + size_t out_remaining, out_alloc; + char *outptr; + + out_remaining = out_alloc = + guess_compress_size(compress, method, compression_level, in_len); + *out = outptr = tor_malloc(out_remaining); + + const int finish = complete_only || compress; + + while (1) { + switch (tor_compress_process(stream, + &outptr, &out_remaining, + &in, &in_len, finish)) { + case TOR_COMPRESS_DONE: + if (in_len == 0 || compress) { + goto done; + } else { + // More data is present, and we're decompressing. So we may need to + // reinitialize the stream if we are handling multiple concatenated + // inputs. + tor_compress_free(stream); + stream = tor_compress_new(compress, method, compression_level); + } + break; + case TOR_COMPRESS_OK: + if (compress || complete_only) { + goto err; + } else { + goto done; + } + break; + case TOR_COMPRESS_BUFFER_FULL: { + if (!compress && outptr < *out+out_alloc) { + // A buffer error in this case means that we have a problem + // with our input. + log_fn(protocol_warn_level, LD_PROTOCOL, + "Possible truncated or corrupt compressed data"); + goto err; + } + if (out_alloc >= SIZE_T_CEILING / 2) { + log_warn(LD_GENERAL, "While %scompresing data: ran out of space.", + compress?"":"un"); + goto err; + } + if (!compress && + tor_compress_is_compression_bomb(in_len_orig, out_alloc)) { + // This should already have been caught down in the backend logic. + // LCOV_EXCL_START + tor_assert_nonfatal_unreached(); + goto err; + // LCOV_EXCL_STOP + } + const size_t offset = outptr - *out; + out_alloc *= 2; + *out = tor_realloc(*out, out_alloc); + outptr = *out + offset; + out_remaining = out_alloc - offset; + break; + } + case TOR_COMPRESS_ERROR: + log_fn(protocol_warn_level, LD_GENERAL, + "Error while %scompresing data: bad input?", + compress?"":"un"); + goto err; // bad data. + default: + // LCOV_EXCL_START + tor_assert_nonfatal_unreached(); + goto err; + // LCOV_EXCL_STOP + } + } + done: + *out_len = outptr - *out; + if (compress && tor_compress_is_compression_bomb(*out_len, in_len_orig)) { + log_warn(LD_BUG, "We compressed something and got an insanely high " + "compression factor; other Tors would think this was a " + "compression bomb."); + goto err; + } + if (!compress) { + // NUL-terminate our output. + if (out_alloc == *out_len) + *out = tor_realloc(*out, out_alloc + 1); + (*out)[*out_len] = '\0'; + } + rv = 0; + goto out; + + err: + tor_free(*out); + *out_len = 0; + rv = -1; + goto out; + + out: + tor_compress_free(stream); + return rv; +} + +/** Given <b>in_len</b> bytes at <b>in</b>, compress them into a newly + * allocated buffer, using the method described in <b>method</b>. Store the + * compressed string in *<b>out</b>, and its length in *<b>out_len</b>. + * Return 0 on success, -1 on failure. + */ +int +tor_compress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method) +{ + return tor_compress_impl(1, out, out_len, in, in_len, method, + BEST_COMPRESSION, + 1, LOG_WARN); +} + +/** Given zero or more compressed strings of total length <b>in_len</b> bytes + * at <b>in</b>, uncompress them into a newly allocated buffer, using the + * method described in <b>method</b>. Store the uncompressed string in + * *<b>out</b>, and its length in *<b>out_len</b>. Return 0 on success, -1 on + * failure. + * + * If any bytes are written to <b>out</b>, an extra byte NUL is always + * written at the end, but not counted in <b>out_len</b>. This is a + * safety feature to ensure that the output can be treated as a + * NUL-terminated string -- though of course, callers should check + * out_len anyway. + * + * If <b>complete_only</b> is true, we consider a truncated input as a + * failure; otherwise we decompress as much as we can. Warn about truncated + * or corrupt inputs at <b>protocol_warn_level</b>. + */ +int +tor_uncompress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + int complete_only, + int protocol_warn_level) +{ + return tor_compress_impl(0, out, out_len, in, in_len, method, + BEST_COMPRESSION, + complete_only, protocol_warn_level); +} + +/** Try to tell whether the <b>in_len</b>-byte string in <b>in</b> is likely + * to be compressed or not. If it is, return the likeliest compression method. + * Otherwise, return UNKNOWN_METHOD. + */ +compress_method_t +detect_compression_method(const char *in, size_t in_len) +{ + if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) { + return GZIP_METHOD; + } else if (in_len > 2 && (in[0] & 0x0f) == 8 && + (ntohs(get_uint16(in)) % 31) == 0) { + return ZLIB_METHOD; + } else if (in_len > 2 && + fast_memeq(in, "\x5d\x00\x00", 3)) { + return LZMA_METHOD; + } else if (in_len > 3 && + fast_memeq(in, "\x28\xb5\x2f\xfd", 4)) { + return ZSTD_METHOD; + } else { + return UNKNOWN_METHOD; + } +} + +/** Return 1 if a given <b>method</b> is supported; otherwise 0. */ +int +tor_compress_supports_method(compress_method_t method) +{ + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_method_supported(); + case LZMA_METHOD: + return tor_lzma_method_supported(); + case ZSTD_METHOD: + return tor_zstd_method_supported(); + case NO_METHOD: + return 1; + case UNKNOWN_METHOD: + default: + return 0; + } +} + +/** + * Return a bitmask of the supported compression types, where 1<<m is + * set in the bitmask if and only if compression with method <b>m</b> is + * supported. + */ +unsigned +tor_compress_get_supported_method_bitmask(void) +{ + static unsigned supported = 0; + if (supported == 0) { + compress_method_t m; + for (m = NO_METHOD; m <= UNKNOWN_METHOD; ++m) { + if (tor_compress_supports_method(m)) { + supported |= (1u << m); + } + } + } + return supported; +} + +/** Table of compression method names. These should have an "x-" prefix, + * if they are not listed in the IANA content coding registry. */ +static const struct { + const char *name; + compress_method_t method; +} compression_method_names[] = { + { "gzip", GZIP_METHOD }, + { "deflate", ZLIB_METHOD }, + // We call this "x-tor-lzma" rather than "x-lzma", because we impose a + // lower maximum memory usage on the decoding side. + { "x-tor-lzma", LZMA_METHOD }, + { "x-zstd" , ZSTD_METHOD }, + { "identity", NO_METHOD }, + + /* Later entries in this table are not canonical; these are recognized but + * not emitted. */ + { "x-gzip", GZIP_METHOD }, +}; + +/** Return the canonical string representation of the compression method + * <b>method</b>, or NULL if the method isn't recognized. */ +const char * +compression_method_get_name(compress_method_t method) +{ + unsigned i; + for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) { + if (method == compression_method_names[i].method) + return compression_method_names[i].name; + } + return NULL; +} + +/** Return the compression method represented by the string <b>name</b>, or + * UNKNOWN_METHOD if the string isn't recognized. */ +compress_method_t +compression_method_get_by_name(const char *name) +{ + unsigned i; + for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) { + if (!strcmp(compression_method_names[i].name, name)) + return compression_method_names[i].method; + } + return UNKNOWN_METHOD; +} + +/** Return a string representation of the version of the library providing the + * compression method given in <b>method</b>. Returns NULL if <b>method</b> is + * unknown or unsupported. */ +const char * +tor_compress_version_str(compress_method_t method) +{ + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_get_version_str(); + case LZMA_METHOD: + return tor_lzma_get_version_str(); + case ZSTD_METHOD: + return tor_zstd_get_version_str(); + case NO_METHOD: + case UNKNOWN_METHOD: + default: + return NULL; + } +} + +/** Return a string representation of the version of the library, found at + * compile time, providing the compression method given in <b>method</b>. + * Returns NULL if <b>method</b> is unknown or unsupported. */ +const char * +tor_compress_header_version_str(compress_method_t method) +{ + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_get_header_version_str(); + case LZMA_METHOD: + return tor_lzma_get_header_version_str(); + case ZSTD_METHOD: + return tor_zstd_get_header_version_str(); + case NO_METHOD: + case UNKNOWN_METHOD: + default: + return NULL; + } +} + +/** Return the approximate number of bytes allocated for all + * supported compression schemas. */ +size_t +tor_compress_get_total_allocation(void) +{ + return atomic_counter_get(&total_compress_allocation) + + tor_zlib_get_total_allocation() + + tor_lzma_get_total_allocation() + + tor_zstd_get_total_allocation(); +} + +/** Internal state for an incremental compression/decompression. The body of + * this struct is not exposed. */ +struct tor_compress_state_t { + compress_method_t method; /**< The compression method. */ + + union { + tor_zlib_compress_state_t *zlib_state; + tor_lzma_compress_state_t *lzma_state; + tor_zstd_compress_state_t *zstd_state; + } u; /**< Compression backend state. */ +}; + +/** Construct and return a tor_compress_state_t object using <b>method</b>. If + * <b>compress</b>, it's for compression; otherwise it's for decompression. */ +tor_compress_state_t * +tor_compress_new(int compress, compress_method_t method, + compression_level_t compression_level) +{ + tor_compress_state_t *state; + + state = tor_malloc_zero(sizeof(tor_compress_state_t)); + state->method = method; + + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: { + tor_zlib_compress_state_t *zlib_state = + tor_zlib_compress_new(compress, method, compression_level); + + if (zlib_state == NULL) + goto err; + + state->u.zlib_state = zlib_state; + break; + } + case LZMA_METHOD: { + tor_lzma_compress_state_t *lzma_state = + tor_lzma_compress_new(compress, method, compression_level); + + if (lzma_state == NULL) + goto err; + + state->u.lzma_state = lzma_state; + break; + } + case ZSTD_METHOD: { + tor_zstd_compress_state_t *zstd_state = + tor_zstd_compress_new(compress, method, compression_level); + + if (zstd_state == NULL) + goto err; + + state->u.zstd_state = zstd_state; + break; + } + case NO_METHOD: { + break; + } + case UNKNOWN_METHOD: + goto err; + } + + atomic_counter_add(&total_compress_allocation, + sizeof(tor_compress_state_t)); + return state; + + err: + tor_free(state); + return NULL; +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_compress_process(tor_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + tor_assert(state != NULL); + + switch (state->method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_compress_process(state->u.zlib_state, + out, out_len, in, in_len, + finish); + case LZMA_METHOD: + return tor_lzma_compress_process(state->u.lzma_state, + out, out_len, in, in_len, + finish); + case ZSTD_METHOD: + return tor_zstd_compress_process(state->u.zstd_state, + out, out_len, in, in_len, + finish); + case NO_METHOD: + return tor_cnone_compress_process(out, out_len, in, in_len, + finish); + case UNKNOWN_METHOD: + goto err; + } + + err: + return TOR_COMPRESS_ERROR; +} + +/** Deallocate <b>state</b>. */ +void +tor_compress_free(tor_compress_state_t *state) +{ + if (state == NULL) + return; + + switch (state->method) { + case GZIP_METHOD: + case ZLIB_METHOD: + tor_zlib_compress_free(state->u.zlib_state); + break; + case LZMA_METHOD: + tor_lzma_compress_free(state->u.lzma_state); + break; + case ZSTD_METHOD: + tor_zstd_compress_free(state->u.zstd_state); + break; + case NO_METHOD: + break; + case UNKNOWN_METHOD: + break; + } + + atomic_counter_sub(&total_compress_allocation, + sizeof(tor_compress_state_t)); + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_compress_state_size(const tor_compress_state_t *state) +{ + tor_assert(state != NULL); + + size_t size = sizeof(tor_compress_state_t); + + switch (state->method) { + case GZIP_METHOD: + case ZLIB_METHOD: + size += tor_zlib_compress_state_size(state->u.zlib_state); + break; + case LZMA_METHOD: + size += tor_lzma_compress_state_size(state->u.lzma_state); + break; + case ZSTD_METHOD: + size += tor_zstd_compress_state_size(state->u.zstd_state); + break; + case NO_METHOD: + case UNKNOWN_METHOD: + break; + } + + return size; +} + +/** Initialize all compression modules. */ +void +tor_compress_init(void) +{ + atomic_counter_init(&total_compress_allocation); + + tor_zlib_init(); + tor_lzma_init(); + tor_zstd_init(); +} + diff --git a/src/common/compress.h b/src/common/compress.h new file mode 100644 index 0000000000..5b47c5d458 --- /dev/null +++ b/src/common/compress.h @@ -0,0 +1,88 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress.h + * \brief Headers for compress.c + **/ + +#ifndef TOR_COMPRESS_H +#define TOR_COMPRESS_H + +/** Enumeration of what kind of compression to use. Only ZLIB_METHOD and + * GZIP_METHOD is guaranteed to be supported by the compress/uncompress + * functions here. Call tor_compress_supports_method() to check if a given + * compression schema is supported by Tor. */ +typedef enum { + NO_METHOD=0, // This method must be first. + GZIP_METHOD=1, + ZLIB_METHOD=2, + LZMA_METHOD=3, + ZSTD_METHOD=4, + UNKNOWN_METHOD=5, // This method must be last. Add new ones in the middle. +} compress_method_t; + +/** + * Enumeration to define tradeoffs between memory usage and compression level. + * BEST_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most + * memory. + **/ +typedef enum { + BEST_COMPRESSION, HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION +} compression_level_t; + +int tor_compress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method); + +int tor_uncompress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + int complete_only, + int protocol_warn_level); + +compress_method_t detect_compression_method(const char *in, size_t in_len); + +int tor_compress_is_compression_bomb(size_t size_in, size_t size_out); + +int tor_compress_supports_method(compress_method_t method); +unsigned tor_compress_get_supported_method_bitmask(void); +const char * compression_method_get_name(compress_method_t method); +compress_method_t compression_method_get_by_name(const char *name); + +const char *tor_compress_version_str(compress_method_t method); + +const char *tor_compress_header_version_str(compress_method_t method); + +size_t tor_compress_get_total_allocation(void); + +/** Return values from tor_compress_process; see that function's documentation + * for details. */ +typedef enum { + TOR_COMPRESS_OK, + TOR_COMPRESS_DONE, + TOR_COMPRESS_BUFFER_FULL, + TOR_COMPRESS_ERROR +} tor_compress_output_t; + +/** Internal state for an incremental compression/decompression. */ +typedef struct tor_compress_state_t tor_compress_state_t; + +tor_compress_state_t *tor_compress_new(int compress, + compress_method_t method, + compression_level_t level); + +tor_compress_output_t tor_compress_process(tor_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); +void tor_compress_free(tor_compress_state_t *state); + +size_t tor_compress_state_size(const tor_compress_state_t *state); + +void tor_compress_init(void); + +#endif // TOR_COMPRESS_H. + diff --git a/src/common/compress_lzma.c b/src/common/compress_lzma.c new file mode 100644 index 0000000000..b5393a6ba6 --- /dev/null +++ b/src/common/compress_lzma.c @@ -0,0 +1,351 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_lzma.c + * \brief Compression backend for LZMA. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_lzma.h" + +#ifdef HAVE_LZMA +#include <lzma.h> +#endif + +/** The maximum amount of memory we allow the LZMA decoder to use, in bytes. */ +#define MEMORY_LIMIT (16 * 1024 * 1024) + +/** Total number of bytes allocated for LZMA state. */ +static atomic_counter_t total_lzma_allocation; + +#ifdef HAVE_LZMA +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case BEST_COMPRESSION: + case HIGH_COMPRESSION: return 6; + case MEDIUM_COMPRESSION: return 4; + case LOW_COMPRESSION: return 2; + } +} + +/** Convert a given <b>error</b> to a human readable error string. */ +static const char * +lzma_error_str(lzma_ret error) +{ + switch (error) { + case LZMA_OK: + return "Operation completed successfully"; + case LZMA_STREAM_END: + return "End of stream"; + case LZMA_NO_CHECK: + return "Input stream lacks integrity check"; + case LZMA_UNSUPPORTED_CHECK: + return "Unable to calculate integrity check"; + case LZMA_GET_CHECK: + return "Integrity check available"; + case LZMA_MEM_ERROR: + return "Unable to allocate memory"; + case LZMA_MEMLIMIT_ERROR: + return "Memory limit reached"; + case LZMA_FORMAT_ERROR: + return "Unknown file format"; + case LZMA_OPTIONS_ERROR: + return "Unsupported options"; + case LZMA_DATA_ERROR: + return "Corrupt input data"; + case LZMA_BUF_ERROR: + return "Unable to progress"; + case LZMA_PROG_ERROR: + return "Programming error"; + default: + return "Unknown LZMA error"; + } +} +#endif // HAVE_LZMA. + +/** Return 1 if LZMA compression is supported; otherwise 0. */ +int +tor_lzma_method_supported(void) +{ +#ifdef HAVE_LZMA + return 1; +#else + return 0; +#endif +} + +/** Return a string representation of the version of the currently running + * version of liblzma. Returns NULL if LZMA is unsupported. */ +const char * +tor_lzma_get_version_str(void) +{ +#ifdef HAVE_LZMA + return lzma_version_string(); +#else + return NULL; +#endif +} + +/** Return a string representation of the version of liblzma used at + * compilation time. Returns NULL if LZMA is unsupported. */ +const char * +tor_lzma_get_header_version_str(void) +{ +#ifdef HAVE_LZMA + return LZMA_VERSION_STRING; +#else + return NULL; +#endif +} + +/** Internal LZMA state for incremental compression/decompression. + * The body of this struct is not exposed. */ +struct tor_lzma_compress_state_t { +#ifdef HAVE_LZMA + lzma_stream stream; /**< The LZMA stream. */ +#endif + + int compress; /**< True if we are compressing; false if we are inflating */ + + /** Number of bytes read so far. Used to detect compression bombs. */ + size_t input_so_far; + /** Number of bytes written so far. Used to detect compression bombs. */ + size_t output_so_far; + + /** Approximate number of bytes allocated for this object. */ + size_t allocation; +}; + +#ifdef HAVE_LZMA +/** Return an approximate number of bytes stored in memory to hold the LZMA + * encoder/decoder state. */ +static size_t +tor_lzma_state_size_precalc(int compress, compression_level_t level) +{ + uint64_t memory_usage; + + if (compress) + memory_usage = lzma_easy_encoder_memusage(memory_level(level)); + else + memory_usage = lzma_easy_decoder_memusage(memory_level(level)); + + if (memory_usage == UINT64_MAX) { + log_warn(LD_GENERAL, "Unsupported compression level passed to LZMA %s", + compress ? "encoder" : "decoder"); + goto err; + } + + if (memory_usage + sizeof(tor_lzma_compress_state_t) > SIZE_MAX) + memory_usage = SIZE_MAX; + else + memory_usage += sizeof(tor_lzma_compress_state_t); + + return (size_t)memory_usage; + + err: + return 0; +} +#endif // HAVE_LZMA. + +/** Construct and return a tor_lzma_compress_state_t object using + * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for + * decompression. */ +tor_lzma_compress_state_t * +tor_lzma_compress_new(int compress, + compress_method_t method, + compression_level_t level) +{ + tor_assert(method == LZMA_METHOD); + +#ifdef HAVE_LZMA + tor_lzma_compress_state_t *result; + lzma_ret retval; + lzma_options_lzma stream_options; + + // Note that we do not explicitly initialize the lzma_stream object here, + // since the LZMA_STREAM_INIT "just" initializes all members to 0, which is + // also what `tor_malloc_zero()` does. + result = tor_malloc_zero(sizeof(tor_lzma_compress_state_t)); + result->compress = compress; + result->allocation = tor_lzma_state_size_precalc(compress, level); + + if (compress) { + lzma_lzma_preset(&stream_options, memory_level(level)); + + retval = lzma_alone_encoder(&result->stream, &stream_options); + + if (retval != LZMA_OK) { + log_warn(LD_GENERAL, "Error from LZMA encoder: %s (%u).", + lzma_error_str(retval), retval); + goto err; + } + } else { + retval = lzma_alone_decoder(&result->stream, MEMORY_LIMIT); + + if (retval != LZMA_OK) { + log_warn(LD_GENERAL, "Error from LZMA decoder: %s (%u).", + lzma_error_str(retval), retval); + goto err; + } + } + + atomic_counter_add(&total_lzma_allocation, result->allocation); + return result; + + err: + tor_free(result); + return NULL; +#else // HAVE_LZMA. + (void)compress; + (void)method; + (void)level; + + return NULL; +#endif // HAVE_LZMA. +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_lzma_compress_process(tor_lzma_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ +#ifdef HAVE_LZMA + lzma_ret retval; + lzma_action action; + + tor_assert(state != NULL); + tor_assert(*in_len <= UINT_MAX); + tor_assert(*out_len <= UINT_MAX); + + state->stream.next_in = (unsigned char *)*in; + state->stream.avail_in = *in_len; + state->stream.next_out = (unsigned char *)*out; + state->stream.avail_out = *out_len; + + action = finish ? LZMA_FINISH : LZMA_RUN; + + retval = lzma_code(&state->stream, action); + + state->input_so_far += state->stream.next_in - ((unsigned char *)*in); + state->output_so_far += state->stream.next_out - ((unsigned char *)*out); + + *out = (char *)state->stream.next_out; + *out_len = state->stream.avail_out; + *in = (const char *)state->stream.next_in; + *in_len = state->stream.avail_in; + + if (! state->compress && + tor_compress_is_compression_bomb(state->input_so_far, + state->output_so_far)) { + log_warn(LD_DIR, "Possible compression bomb; abandoning stream."); + return TOR_COMPRESS_ERROR; + } + + switch (retval) { + case LZMA_OK: + if (state->stream.avail_out == 0 || finish) + return TOR_COMPRESS_BUFFER_FULL; + + return TOR_COMPRESS_OK; + + case LZMA_BUF_ERROR: + if (state->stream.avail_in == 0 && !finish) + return TOR_COMPRESS_OK; + + return TOR_COMPRESS_BUFFER_FULL; + + case LZMA_STREAM_END: + return TOR_COMPRESS_DONE; + + // We list all the possible values of `lzma_ret` here to silence the + // `switch-enum` warning and to detect if a new member was added. + case LZMA_NO_CHECK: + case LZMA_UNSUPPORTED_CHECK: + case LZMA_GET_CHECK: + case LZMA_MEM_ERROR: + case LZMA_MEMLIMIT_ERROR: + case LZMA_FORMAT_ERROR: + case LZMA_OPTIONS_ERROR: + case LZMA_DATA_ERROR: + case LZMA_PROG_ERROR: + default: + log_warn(LD_GENERAL, "LZMA %s didn't finish: %s.", + state->compress ? "compression" : "decompression", + lzma_error_str(retval)); + return TOR_COMPRESS_ERROR; + } +#else // HAVE_LZMA. + (void)state; + (void)out; + (void)out_len; + (void)in; + (void)in_len; + (void)finish; + return TOR_COMPRESS_ERROR; +#endif // HAVE_LZMA. +} + +/** Deallocate <b>state</b>. */ +void +tor_lzma_compress_free(tor_lzma_compress_state_t *state) +{ + if (state == NULL) + return; + + atomic_counter_sub(&total_lzma_allocation, state->allocation); + +#ifdef HAVE_LZMA + lzma_end(&state->stream); +#endif + + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state) +{ + tor_assert(state != NULL); + return state->allocation; +} + +/** Return the approximate number of bytes allocated for all LZMA states. */ +size_t +tor_lzma_get_total_allocation(void) +{ + return atomic_counter_get(&total_lzma_allocation); +} + +/** Initialize the lzma module */ +void +tor_lzma_init(void) +{ + atomic_counter_init(&total_lzma_allocation); +} + diff --git a/src/common/compress_lzma.h b/src/common/compress_lzma.h new file mode 100644 index 0000000000..1433c89f88 --- /dev/null +++ b/src/common/compress_lzma.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_lzma.h + * \brief Header for compress_lzma.c + **/ + +#ifndef TOR_COMPRESS_LZMA_H +#define TOR_COMPRESS_LZMA_H + +int tor_lzma_method_supported(void); + +const char *tor_lzma_get_version_str(void); + +const char *tor_lzma_get_header_version_str(void); + +/** Internal state for an incremental LZMA compression/decompression. */ +typedef struct tor_lzma_compress_state_t tor_lzma_compress_state_t; + +tor_lzma_compress_state_t * +tor_lzma_compress_new(int compress, + compress_method_t method, + compression_level_t compression_level); + +tor_compress_output_t +tor_lzma_compress_process(tor_lzma_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +void tor_lzma_compress_free(tor_lzma_compress_state_t *state); + +size_t tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state); + +size_t tor_lzma_get_total_allocation(void); + +void tor_lzma_init(void); + +#endif // TOR_COMPRESS_LZMA_H. + diff --git a/src/common/compress_none.c b/src/common/compress_none.c new file mode 100644 index 0000000000..b76e6010ec --- /dev/null +++ b/src/common/compress_none.c @@ -0,0 +1,53 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_lzma.c + * \brief Compression backend for identity compression. + * + * We actually define this backend so that we can treat the identity transform + * as another case of compression. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_none.h" + +/** Transfer some bytes using the identity transformation. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_cnone_compress_process(char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + size_t n_to_copy = MIN(*in_len, *out_len); + + memcpy(*out, *in, n_to_copy); + *out += n_to_copy; + *in += n_to_copy; + *out_len -= n_to_copy; + *in_len -= n_to_copy; + if (*in_len == 0) { + return finish ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK; + } else { + return TOR_COMPRESS_BUFFER_FULL; + } +} + diff --git a/src/common/compress_none.h b/src/common/compress_none.h new file mode 100644 index 0000000000..d1ebb4b625 --- /dev/null +++ b/src/common/compress_none.h @@ -0,0 +1,20 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_none.h + * \brief Header for compress_none.c + **/ + +#ifndef TOR_COMPRESS_NONE_H +#define TOR_COMPRESS_NONE_H + +tor_compress_output_t +tor_cnone_compress_process(char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +#endif // TOR_COMPRESS_NONE_H. + diff --git a/src/common/compress_zlib.c b/src/common/compress_zlib.c new file mode 100644 index 0000000000..284542e885 --- /dev/null +++ b/src/common/compress_zlib.c @@ -0,0 +1,304 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zlib.c + * \brief Compression backend for gzip and zlib. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_zlib.h" + +/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of + saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory + that nobody will care if the compile outputs a no-such-identifier warning. + + Sorry, but we like -Werror over here, so I guess we need to define these. + I hope that zlib 1.2.6 doesn't break these too. +*/ +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE 0 +#endif +#ifndef _LFS64_LARGEFILE +#define _LFS64_LARGEFILE 0 +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 0 +#endif +#ifndef off64_t +#define off64_t int64_t +#endif + +#include <zlib.h> + +#if defined ZLIB_VERNUM && ZLIB_VERNUM < 0x1200 +#error "We require zlib version 1.2 or later." +#endif + +static size_t tor_zlib_state_size_precalc(int inflate, + int windowbits, int memlevel); + +/** Total number of bytes allocated for zlib state */ +static atomic_counter_t total_zlib_allocation; + +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case BEST_COMPRESSION: return 9; + case HIGH_COMPRESSION: return 8; + case MEDIUM_COMPRESSION: return 7; + case LOW_COMPRESSION: return 6; + } +} + +/** Return the 'bits' value to tell zlib to use <b>method</b>.*/ +static inline int +method_bits(compress_method_t method, compression_level_t level) +{ + /* Bits+16 means "use gzip" in zlib >= 1.2 */ + const int flag = method == GZIP_METHOD ? 16 : 0; + switch (level) { + default: + case BEST_COMPRESSION: + case HIGH_COMPRESSION: return flag + 15; + case MEDIUM_COMPRESSION: return flag + 13; + case LOW_COMPRESSION: return flag + 11; + } +} + +/** Return 1 if zlib/gzip compression is supported; otherwise 0. */ +int +tor_zlib_method_supported(void) +{ + /* We currently always support zlib/gzip, but we keep this function around in + * case we some day decide to deprecate zlib/gzip support. + */ + return 1; +} + +/** Return a string representation of the version of the currently running + * version of zlib. */ +const char * +tor_zlib_get_version_str(void) +{ + return zlibVersion(); +} + +/** Return a string representation of the version of the version of zlib +* used at compilation. */ +const char * +tor_zlib_get_header_version_str(void) +{ + return ZLIB_VERSION; +} + +/** Internal zlib state for an incremental compression/decompression. + * The body of this struct is not exposed. */ +struct tor_zlib_compress_state_t { + struct z_stream_s stream; /**< The zlib stream */ + int compress; /**< True if we are compressing; false if we are inflating */ + + /** Number of bytes read so far. Used to detect zlib bombs. */ + size_t input_so_far; + /** Number of bytes written so far. Used to detect zlib bombs. */ + size_t output_so_far; + + /** Approximate number of bytes allocated for this object. */ + size_t allocation; +}; + +/** Return an approximate number of bytes used in RAM to hold a state with + * window bits <b>windowBits</b> and compression level 'memlevel' */ +static size_t +tor_zlib_state_size_precalc(int inflate_, int windowbits, int memlevel) +{ + windowbits &= 15; + +#define A_FEW_KILOBYTES 2048 + + if (inflate_) { + /* From zconf.h: + + "The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects." + */ + return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) + + (1 << 15) + A_FEW_KILOBYTES; + } else { + /* Also from zconf.h: + + "The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + ... plus a few kilobytes for small objects." + */ + return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) + + (1 << (windowbits + 2)) + (1 << (memlevel + 9)) + A_FEW_KILOBYTES; + } +#undef A_FEW_KILOBYTES +} + +/** Construct and return a tor_zlib_compress_state_t object using + * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for + * decompression. */ +tor_zlib_compress_state_t * +tor_zlib_compress_new(int compress_, + compress_method_t method, + compression_level_t compression_level) +{ + tor_zlib_compress_state_t *out; + int bits, memlevel; + + if (! compress_) { + /* use this setting for decompression, since we might have the + * max number of window bits */ + compression_level = BEST_COMPRESSION; + } + + out = tor_malloc_zero(sizeof(tor_zlib_compress_state_t)); + out->stream.zalloc = Z_NULL; + out->stream.zfree = Z_NULL; + out->stream.opaque = NULL; + out->compress = compress_; + bits = method_bits(method, compression_level); + memlevel = memory_level(compression_level); + if (compress_) { + if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, + bits, memlevel, + Z_DEFAULT_STRATEGY) != Z_OK) + goto err; // LCOV_EXCL_LINE + } else { + if (inflateInit2(&out->stream, bits) != Z_OK) + goto err; // LCOV_EXCL_LINE + } + out->allocation = tor_zlib_state_size_precalc(!compress_, bits, memlevel); + + atomic_counter_add(&total_zlib_allocation, out->allocation); + + return out; + + err: + tor_free(out); + return NULL; +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_zlib_compress_process(tor_zlib_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + int err; + tor_assert(state != NULL); + if (*in_len > UINT_MAX || + *out_len > UINT_MAX) { + return TOR_COMPRESS_ERROR; + } + + state->stream.next_in = (unsigned char*) *in; + state->stream.avail_in = (unsigned int)*in_len; + state->stream.next_out = (unsigned char*) *out; + state->stream.avail_out = (unsigned int)*out_len; + + if (state->compress) { + err = deflate(&state->stream, finish ? Z_FINISH : Z_NO_FLUSH); + } else { + err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH); + } + + state->input_so_far += state->stream.next_in - ((unsigned char*)*in); + state->output_so_far += state->stream.next_out - ((unsigned char*)*out); + + *out = (char*) state->stream.next_out; + *out_len = state->stream.avail_out; + *in = (const char *) state->stream.next_in; + *in_len = state->stream.avail_in; + + if (! state->compress && + tor_compress_is_compression_bomb(state->input_so_far, + state->output_so_far)) { + log_warn(LD_DIR, "Possible zlib bomb; abandoning stream."); + return TOR_COMPRESS_ERROR; + } + + switch (err) + { + case Z_STREAM_END: + return TOR_COMPRESS_DONE; + case Z_BUF_ERROR: + if (state->stream.avail_in == 0 && !finish) + return TOR_COMPRESS_OK; + return TOR_COMPRESS_BUFFER_FULL; + case Z_OK: + if (state->stream.avail_out == 0 || finish) + return TOR_COMPRESS_BUFFER_FULL; + return TOR_COMPRESS_OK; + default: + log_warn(LD_GENERAL, "Gzip returned an error: %s", + state->stream.msg ? state->stream.msg : "<no message>"); + return TOR_COMPRESS_ERROR; + } +} + +/** Deallocate <b>state</b>. */ +void +tor_zlib_compress_free(tor_zlib_compress_state_t *state) +{ + if (state == NULL) + return; + + atomic_counter_sub(&total_zlib_allocation, state->allocation); + + if (state->compress) + deflateEnd(&state->stream); + else + inflateEnd(&state->stream); + + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state) +{ + tor_assert(state != NULL); + return state->allocation; +} + +/** Return the approximate number of bytes allocated for all zlib states. */ +size_t +tor_zlib_get_total_allocation(void) +{ + return atomic_counter_get(&total_zlib_allocation); +} + +/** Set up global state for the zlib module */ +void +tor_zlib_init(void) +{ + atomic_counter_init(&total_zlib_allocation); +} + diff --git a/src/common/compress_zlib.h b/src/common/compress_zlib.h new file mode 100644 index 0000000000..df5c196ac7 --- /dev/null +++ b/src/common/compress_zlib.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zlib.h + * \brief Header for compress_zlib.c + **/ + +#ifndef TOR_COMPRESS_ZLIB_H +#define TOR_COMPRESS_ZLIB_H + +int tor_zlib_method_supported(void); + +const char *tor_zlib_get_version_str(void); + +const char *tor_zlib_get_header_version_str(void); + +/** Internal state for an incremental zlib/gzip compression/decompression. */ +typedef struct tor_zlib_compress_state_t tor_zlib_compress_state_t; + +tor_zlib_compress_state_t * +tor_zlib_compress_new(int compress, + compress_method_t method, + compression_level_t compression_level); + +tor_compress_output_t +tor_zlib_compress_process(tor_zlib_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +void tor_zlib_compress_free(tor_zlib_compress_state_t *state); + +size_t tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state); + +size_t tor_zlib_get_total_allocation(void); + +void tor_zlib_init(void); + +#endif // TOR_COMPRESS_ZLIB_H. + diff --git a/src/common/compress_zstd.c b/src/common/compress_zstd.c new file mode 100644 index 0000000000..99d05c37bd --- /dev/null +++ b/src/common/compress_zstd.c @@ -0,0 +1,401 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zstd.c + * \brief Compression backend for Zstandard. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_zstd.h" + +#ifdef HAVE_ZSTD +#include <zstd.h> +#endif + +/** Total number of bytes allocated for Zstandard state. */ +static atomic_counter_t total_zstd_allocation; + +#ifdef HAVE_ZSTD +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case BEST_COMPRESSION: + case HIGH_COMPRESSION: return 9; + case MEDIUM_COMPRESSION: return 8; + case LOW_COMPRESSION: return 7; + } +} +#endif // HAVE_ZSTD. + +/** Return 1 if Zstandard compression is supported; otherwise 0. */ +int +tor_zstd_method_supported(void) +{ +#ifdef HAVE_ZSTD + return 1; +#else + return 0; +#endif +} + +/** Return a string representation of the version of the currently running + * version of libzstd. Returns NULL if Zstandard is unsupported. */ +const char * +tor_zstd_get_version_str(void) +{ +#ifdef HAVE_ZSTD + static char version_str[16]; + size_t version_number; + + version_number = ZSTD_versionNumber(); + tor_snprintf(version_str, sizeof(version_str), + "%lu.%lu.%lu", + version_number / 10000 % 100, + version_number / 100 % 100, + version_number % 100); + + return version_str; +#else + return NULL; +#endif +} + +/** Return a string representation of the version of the version of libzstd + * used at compilation time. Returns NULL if Zstandard is unsupported. */ +const char * +tor_zstd_get_header_version_str(void) +{ +#ifdef HAVE_ZSTD + return ZSTD_VERSION_STRING; +#else + return NULL; +#endif +} + +/** Internal Zstandard state for incremental compression/decompression. + * The body of this struct is not exposed. */ +struct tor_zstd_compress_state_t { +#ifdef HAVE_ZSTD + union { + /** Compression stream. Used when <b>compress</b> is true. */ + ZSTD_CStream *compress_stream; + /** Decompression stream. Used when <b>compress</b> is false. */ + ZSTD_DStream *decompress_stream; + } u; /**< Zstandard stream objects. */ +#endif // HAVE_ZSTD. + + int compress; /**< True if we are compressing; false if we are inflating */ + + /** Number of bytes read so far. Used to detect compression bombs. */ + size_t input_so_far; + /** Number of bytes written so far. Used to detect compression bombs. */ + size_t output_so_far; + + /** Approximate number of bytes allocated for this object. */ + size_t allocation; +}; + +#ifdef HAVE_ZSTD +/** Return an approximate number of bytes stored in memory to hold the + * Zstandard compression/decompression state. */ +static size_t +tor_zstd_state_size_precalc(int compress, int preset) +{ + tor_assert(preset > 0); + + size_t memory_usage = sizeof(tor_zstd_compress_state_t); + + // The Zstandard library provides a number of functions that would be useful + // here, but they are, unfortunately, still considered experimental and are + // thus only available in libzstd if we link against the library statically. + // + // The code in this function tries to approximate the calculations without + // being able to use the following: + // + // - We do not have access to neither the internal members of ZSTD_CStream + // and ZSTD_DStream and their internal context objects. + // + // - We cannot use ZSTD_sizeof_CStream() and ZSTD_sizeof_DStream() since they + // are unexposed. + // + // In the future it might be useful to check if libzstd have started + // providing these functions in a stable manner and simplify this function. + if (compress) { + // We try to approximate the ZSTD_sizeof_CStream(ZSTD_CStream *stream) + // function here. This function uses the following fields to make its + // estimate: + + // - sizeof(ZSTD_CStream): Around 192 bytes on a 64-bit machine: + memory_usage += 192; + + // - ZSTD_sizeof_CCtx(stream->cctx): This function requires access to + // variables that are not exposed via the public API. We use a _very_ + // simplified function to calculate the estimated amount of bytes used in + // this struct. + // memory_usage += (preset - 0.5) * 1024 * 1024; + memory_usage += (preset * 1024 * 1024) - (512 * 1024); + // - ZSTD_sizeof_CDict(stream->cdictLocal): Unused in Tor: 0 bytes. + // - stream->outBuffSize: 128 KB: + memory_usage += 128 * 1024; + // - stream->inBuffSize: 2048 KB: + memory_usage += 2048 * 1024; + } else { + // We try to approximate the ZSTD_sizeof_DStream(ZSTD_DStream *stream) + // function here. This function uses the following fields to make its + // estimate: + + // - sizeof(ZSTD_DStream): Around 208 bytes on a 64-bit machine: + memory_usage += 208; + // - ZSTD_sizeof_DCtx(stream->dctx): Around 150 KB. + memory_usage += 150 * 1024; + + // - ZSTD_sizeof_DDict(stream->ddictLocal): Unused in Tor: 0 bytes. + // - stream->inBuffSize: 0 KB. + // - stream->outBuffSize: 0 KB. + } + + return memory_usage; +} +#endif // HAVE_ZSTD. + +/** Construct and return a tor_zstd_compress_state_t object using + * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for + * decompression. */ +tor_zstd_compress_state_t * +tor_zstd_compress_new(int compress, + compress_method_t method, + compression_level_t level) +{ + tor_assert(method == ZSTD_METHOD); + +#ifdef HAVE_ZSTD + const int preset = memory_level(level); + tor_zstd_compress_state_t *result; + size_t retval; + + result = tor_malloc_zero(sizeof(tor_zstd_compress_state_t)); + result->compress = compress; + result->allocation = tor_zstd_state_size_precalc(compress, preset); + + if (compress) { + result->u.compress_stream = ZSTD_createCStream(); + + if (result->u.compress_stream == NULL) { + log_warn(LD_GENERAL, "Error while creating Zstandard stream"); + goto err; + } + + retval = ZSTD_initCStream(result->u.compress_stream, preset); + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard stream initialization error: %s", + ZSTD_getErrorName(retval)); + goto err; + } + } else { + result->u.decompress_stream = ZSTD_createDStream(); + + if (result->u.decompress_stream == NULL) { + log_warn(LD_GENERAL, "Error while creating Zstandard stream"); + goto err; + } + + retval = ZSTD_initDStream(result->u.decompress_stream); + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard stream initialization error: %s", + ZSTD_getErrorName(retval)); + goto err; + } + } + + atomic_counter_add(&total_zstd_allocation, result->allocation); + return result; + + err: + if (compress) { + ZSTD_freeCStream(result->u.compress_stream); + } else { + ZSTD_freeDStream(result->u.decompress_stream); + } + + tor_free(result); + return NULL; +#else // HAVE_ZSTD. + (void)compress; + (void)method; + (void)level; + + return NULL; +#endif // HAVE_ZSTD. +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_zstd_compress_process(tor_zstd_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ +#ifdef HAVE_ZSTD + size_t retval; + + tor_assert(state != NULL); + tor_assert(*in_len <= UINT_MAX); + tor_assert(*out_len <= UINT_MAX); + + ZSTD_inBuffer input = { *in, *in_len, 0 }; + ZSTD_outBuffer output = { *out, *out_len, 0 }; + + if (state->compress) { + retval = ZSTD_compressStream(state->u.compress_stream, + &output, &input); + } else { + retval = ZSTD_decompressStream(state->u.decompress_stream, + &output, &input); + } + + state->input_so_far += input.pos; + state->output_so_far += output.pos; + + *out = (char *)output.dst + output.pos; + *out_len = output.size - output.pos; + *in = (char *)input.src + input.pos; + *in_len = input.size - input.pos; + + if (! state->compress && + tor_compress_is_compression_bomb(state->input_so_far, + state->output_so_far)) { + log_warn(LD_DIR, "Possible compression bomb; abandoning stream."); + return TOR_COMPRESS_ERROR; + } + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard %s didn't finish: %s.", + state->compress ? "compression" : "decompression", + ZSTD_getErrorName(retval)); + return TOR_COMPRESS_ERROR; + } + + if (state->compress && !finish) { + retval = ZSTD_flushStream(state->u.compress_stream, &output); + + *out = (char *)output.dst + output.pos; + *out_len = output.size - output.pos; + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard compression unable to flush: %s.", + ZSTD_getErrorName(retval)); + return TOR_COMPRESS_ERROR; + } + + if (retval > 0) + return TOR_COMPRESS_BUFFER_FULL; + } + + if (!finish) { + // We're not done with the input, so no need to flush. + return TOR_COMPRESS_OK; + } else if (state->compress && finish) { + retval = ZSTD_endStream(state->u.compress_stream, &output); + + *out = (char *)output.dst + output.pos; + *out_len = output.size - output.pos; + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard compression unable to write " + "epilogue: %s.", + ZSTD_getErrorName(retval)); + return TOR_COMPRESS_ERROR; + } + + // endStream returns the number of bytes that is needed to write the + // epilogue. + if (retval > 0) + return TOR_COMPRESS_BUFFER_FULL; + + return TOR_COMPRESS_DONE; + } else { + // ZSTD_flushStream returns 0 if the frame is done, or >0 if it + // is incomplete. + return (retval == 0) ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK; + } + +#else // HAVE_ZSTD. + (void)state; + (void)out; + (void)out_len; + (void)in; + (void)in_len; + (void)finish; + + return TOR_COMPRESS_ERROR; +#endif // HAVE_ZSTD. +} + +/** Deallocate <b>state</b>. */ +void +tor_zstd_compress_free(tor_zstd_compress_state_t *state) +{ + if (state == NULL) + return; + + atomic_counter_sub(&total_zstd_allocation, state->allocation); + +#ifdef HAVE_ZSTD + if (state->compress) { + ZSTD_freeCStream(state->u.compress_stream); + } else { + ZSTD_freeDStream(state->u.decompress_stream); + } +#endif // HAVE_ZSTD. + + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state) +{ + tor_assert(state != NULL); + return state->allocation; +} + +/** Return the approximate number of bytes allocated for all Zstandard + * states. */ +size_t +tor_zstd_get_total_allocation(void) +{ + return atomic_counter_get(&total_zstd_allocation); +} + +/** Initialize the zstd module */ +void +tor_zstd_init(void) +{ + atomic_counter_init(&total_zstd_allocation); +} + diff --git a/src/common/compress_zstd.h b/src/common/compress_zstd.h new file mode 100644 index 0000000000..d3e65c2f16 --- /dev/null +++ b/src/common/compress_zstd.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zstd.h + * \brief Header for compress_zstd.c + **/ + +#ifndef TOR_COMPRESS_ZSTD_H +#define TOR_COMPRESS_ZSTD_H + +int tor_zstd_method_supported(void); + +const char *tor_zstd_get_version_str(void); + +const char *tor_zstd_get_header_version_str(void); + +/** Internal state for an incremental Zstandard compression/decompression. */ +typedef struct tor_zstd_compress_state_t tor_zstd_compress_state_t; + +tor_zstd_compress_state_t * +tor_zstd_compress_new(int compress, + compress_method_t method, + compression_level_t compression_level); + +tor_compress_output_t +tor_zstd_compress_process(tor_zstd_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +void tor_zstd_compress_free(tor_zstd_compress_state_t *state); + +size_t tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state); + +size_t tor_zstd_get_total_allocation(void); + +void tor_zstd_init(void); + +#endif // TOR_COMPRESS_ZSTD_H. + diff --git a/src/common/confline.c b/src/common/confline.c new file mode 100644 index 0000000000..d4468f80ea --- /dev/null +++ b/src/common/confline.c @@ -0,0 +1,338 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "compat.h" +#include "confline.h" +#include "torlog.h" +#include "util.h" + +/** Helper: allocate a new configuration option mapping 'key' to 'val', + * append it to *<b>lst</b>. */ +void +config_line_append(config_line_t **lst, + const char *key, + const char *val) +{ + tor_assert(lst); + + config_line_t *newline; + + newline = tor_malloc_zero(sizeof(config_line_t)); + newline->key = tor_strdup(key); + newline->value = tor_strdup(val); + newline->next = NULL; + while (*lst) + lst = &((*lst)->next); + + (*lst) = newline; +} + +/** Helper: allocate a new configuration option mapping 'key' to 'val', + * and prepend it to *<b>lst</b> */ +void +config_line_prepend(config_line_t **lst, + const char *key, + const char *val) +{ + tor_assert(lst); + + config_line_t *newline; + + newline = tor_malloc_zero(sizeof(config_line_t)); + newline->key = tor_strdup(key); + newline->value = tor_strdup(val); + newline->next = *lst; + *lst = newline; +} + +/** Return the first line in <b>lines</b> whose key is exactly <b>key</b>, or + * NULL if no such key exists. + * + * (In options parsing, this is for handling commandline-only options only; + * other options should be looked up in the appropriate data structure.) */ +const config_line_t * +config_line_find(const config_line_t *lines, + const char *key) +{ + const config_line_t *cl; + for (cl = lines; cl; cl = cl->next) { + if (!strcmp(cl->key, key)) + return cl; + } + return NULL; +} + +/** Helper: parse the config string and strdup into key/value + * strings. Set *result to the list, or NULL if parsing the string + * failed. Return 0 on success, -1 on failure. Warn and ignore any + * misformatted lines. + * + * If <b>extended</b> is set, then treat keys beginning with / and with + as + * indicating "clear" and "append" respectively. */ +int +config_get_lines(const char *string, config_line_t **result, int extended) +{ + config_line_t *list = NULL, **next; + char *k, *v; + const char *parse_err; + + next = &list; + do { + k = v = NULL; + string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err); + if (!string) { + log_warn(LD_CONFIG, "Error while parsing configuration: %s", + parse_err?parse_err:"<unknown>"); + config_free_lines(list); + tor_free(k); + tor_free(v); + return -1; + } + if (k && v) { + unsigned command = CONFIG_LINE_NORMAL; + if (extended) { + if (k[0] == '+') { + char *k_new = tor_strdup(k+1); + tor_free(k); + k = k_new; + command = CONFIG_LINE_APPEND; + } else if (k[0] == '/') { + char *k_new = tor_strdup(k+1); + tor_free(k); + k = k_new; + tor_free(v); + v = tor_strdup(""); + command = CONFIG_LINE_CLEAR; + } + } + /* This list can get long, so we keep a pointer to the end of it + * rather than using config_line_append over and over and getting + * n^2 performance. */ + *next = tor_malloc_zero(sizeof(config_line_t)); + (*next)->key = k; + (*next)->value = v; + (*next)->next = NULL; + (*next)->command = command; + next = &((*next)->next); + } else { + tor_free(k); + tor_free(v); + } + } while (*string); + + *result = list; + return 0; +} + +/** + * Free all the configuration lines on the linked list <b>front</b>. + */ +void +config_free_lines(config_line_t *front) +{ + config_line_t *tmp; + + while (front) { + tmp = front; + front = tmp->next; + + tor_free(tmp->key); + tor_free(tmp->value); + tor_free(tmp); + } +} + +/** Return a newly allocated deep copy of the lines in <b>inp</b>. */ +config_line_t * +config_lines_dup(const config_line_t *inp) +{ + return config_lines_dup_and_filter(inp, NULL); +} + +/** Return a newly allocated deep copy of the lines in <b>inp</b>, + * but only the ones that match <b>key</b>. */ +config_line_t * +config_lines_dup_and_filter(const config_line_t *inp, + const char *key) +{ + config_line_t *result = NULL; + config_line_t **next_out = &result; + while (inp) { + if (key && strcasecmpstart(inp->key, key)) { + inp = inp->next; + continue; + } + *next_out = tor_malloc_zero(sizeof(config_line_t)); + (*next_out)->key = tor_strdup(inp->key); + (*next_out)->value = tor_strdup(inp->value); + inp = inp->next; + next_out = &((*next_out)->next); + } + (*next_out) = NULL; + return result; +} + +/** Return true iff a and b contain identical keys and values in identical + * order. */ +int +config_lines_eq(config_line_t *a, config_line_t *b) +{ + while (a && b) { + if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value)) + return 0; + a = a->next; + b = b->next; + } + if (a || b) + return 0; + return 1; +} + +/** Return the number of lines in <b>a</b> whose key is <b>key</b>. */ +int +config_count_key(const config_line_t *a, const char *key) +{ + int n = 0; + while (a) { + if (!strcasecmp(a->key, key)) { + ++n; + } + a = a->next; + } + return n; +} + +/** Given a string containing part of a configuration file or similar format, + * advance past comments and whitespace and try to parse a single line. If we + * parse a line successfully, set *<b>key_out</b> to a new string holding the + * key portion and *<b>value_out</b> to a new string holding the value portion + * of the line, and return a pointer to the start of the next line. If we run + * out of data, return a pointer to the end of the string. If we encounter an + * error, return NULL and set *<b>err_out</b> (if provided) to an error + * message. + */ +const char * +parse_config_line_from_str_verbose(const char *line, char **key_out, + char **value_out, + const char **err_out) +{ + /* + See torrc_format.txt for a description of the (silly) format this parses. + */ + const char *key, *val, *cp; + int continuation = 0; + + tor_assert(key_out); + tor_assert(value_out); + + *key_out = *value_out = NULL; + key = val = NULL; + /* Skip until the first keyword. */ + while (1) { + while (TOR_ISSPACE(*line)) + ++line; + if (*line == '#') { + while (*line && *line != '\n') + ++line; + } else { + break; + } + } + + if (!*line) { /* End of string? */ + *key_out = *value_out = NULL; + return line; + } + + /* Skip until the next space or \ followed by newline. */ + key = line; + while (*line && !TOR_ISSPACE(*line) && *line != '#' && + ! (line[0] == '\\' && line[1] == '\n')) + ++line; + *key_out = tor_strndup(key, line-key); + + /* Skip until the value. */ + while (*line == ' ' || *line == '\t') + ++line; + + val = line; + + /* Find the end of the line. */ + if (*line == '\"') { // XXX No continuation handling is done here + if (!(line = unescape_string(line, value_out, NULL))) { + if (err_out) + *err_out = "Invalid escape sequence in quoted string"; + return NULL; + } + while (*line == ' ' || *line == '\t') + ++line; + if (*line == '\r' && *(++line) == '\n') + ++line; + if (*line && *line != '#' && *line != '\n') { + if (err_out) + *err_out = "Excess data after quoted string"; + return NULL; + } + } else { + /* Look for the end of the line. */ + while (*line && *line != '\n' && (*line != '#' || continuation)) { + if (*line == '\\' && line[1] == '\n') { + continuation = 1; + line += 2; + } else if (*line == '#') { + do { + ++line; + } while (*line && *line != '\n'); + if (*line == '\n') + ++line; + } else { + ++line; + } + } + + if (*line == '\n') { + cp = line++; + } else { + cp = line; + } + /* Now back cp up to be the last nonspace character */ + while (cp>val && TOR_ISSPACE(*(cp-1))) + --cp; + + tor_assert(cp >= val); + + /* Now copy out and decode the value. */ + *value_out = tor_strndup(val, cp-val); + if (continuation) { + char *v_out, *v_in; + v_out = v_in = *value_out; + while (*v_in) { + if (*v_in == '#') { + do { + ++v_in; + } while (*v_in && *v_in != '\n'); + if (*v_in == '\n') + ++v_in; + } else if (v_in[0] == '\\' && v_in[1] == '\n') { + v_in += 2; + } else { + *v_out++ = *v_in++; + } + } + *v_out = '\0'; + } + } + + if (*line == '#') { + do { + ++line; + } while (*line && *line != '\n'); + } + while (TOR_ISSPACE(*line)) ++line; + + return line; +} + diff --git a/src/common/confline.h b/src/common/confline.h new file mode 100644 index 0000000000..477c6929a2 --- /dev/null +++ b/src/common/confline.h @@ -0,0 +1,49 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONFLINE_H +#define TOR_CONFLINE_H + +/** Ordinary configuration line. */ +#define CONFIG_LINE_NORMAL 0 +/** Appends to previous configuration for the same option, even if we + * would ordinary replace it. */ +#define CONFIG_LINE_APPEND 1 +/* Removes all previous configuration for an option. */ +#define CONFIG_LINE_CLEAR 2 + +/** A linked list of lines in a config file, or elsewhere */ +typedef struct config_line_t { + char *key; + char *value; + struct config_line_t *next; + + /** What special treatment (if any) does this line require? */ + unsigned int command:2; + /** If true, subsequent assignments to this linelist should replace + * it, not extend it. Set only on the first item in a linelist in an + * or_options_t. */ + unsigned int fragile:1; +} config_line_t; + +void config_line_append(config_line_t **lst, + const char *key, const char *val); +void config_line_prepend(config_line_t **lst, + const char *key, const char *val); +config_line_t *config_lines_dup(const config_line_t *inp); +config_line_t *config_lines_dup_and_filter(const config_line_t *inp, + const char *key); +const config_line_t *config_line_find(const config_line_t *lines, + const char *key); +int config_lines_eq(config_line_t *a, config_line_t *b); +int config_count_key(const config_line_t *a, const char *key); +int config_get_lines(const char *string, config_line_t **result, int extended); +void config_free_lines(config_line_t *front); +const char *parse_config_line_from_str_verbose(const char *line, + char **key_out, char **value_out, + const char **err_out); +#endif + diff --git a/src/common/container.c b/src/common/container.c index 1448ab403c..689e7e55e9 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/container.h b/src/common/container.h index 00c3ca81ad..db68d892f5 100644 --- a/src/common/container.h +++ b/src/common/container.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONTAINER_H @@ -224,6 +224,7 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, #define SMARTLIST_FOREACH_END(var) \ var = NULL; \ + (void) var ## _sl_idx; \ } STMT_END /** diff --git a/src/common/crypto.c b/src/common/crypto.c index 7cb3330bde..a68510103e 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -467,7 +467,7 @@ crypto_new_pk_from_rsa_(RSA *rsa) return env; } -/** Helper, used by tor-checkkey.c and tor-gencert.c. Return the RSA from a +/** Helper, used by tor-gencert.c. Return the RSA from a * crypto_pk_t. */ RSA * crypto_pk_get_rsa_(crypto_pk_t *env) @@ -3459,3 +3459,15 @@ crypto_global_cleanup(void) /** @} */ +#ifdef USE_DMALLOC +/** Tell the crypto library to use Tor's allocation functions rather than + * calling libc's allocation functions directly. Return 0 on success, -1 + * on failure. */ +int +crypto_use_tor_alloc_functions(void) +{ + int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); + return r ? 0 : -1; +} +#endif + diff --git a/src/common/crypto.h b/src/common/crypto.h index 42345f80e8..c70d91c262 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -131,6 +131,10 @@ int crypto_early_init(void) ATTR_WUR; int crypto_global_init(int hardwareAccel, const char *accelName, const char *accelPath) ATTR_WUR; +#ifdef USE_DMALLOC +int crypto_use_tor_alloc_functions(void); +#endif + void crypto_thread_cleanup(void); int crypto_global_cleanup(void); diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c index 5f328e124c..b99f13a93b 100644 --- a/src/common/crypto_curve25519.c +++ b/src/common/crypto_curve25519.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_curve25519.h b/src/common/crypto_curve25519.h index 4011820949..e7790edac0 100644 --- a/src/common/crypto_curve25519.h +++ b/src/common/crypto_curve25519.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_CURVE25519_H diff --git a/src/common/crypto_ed25519.c b/src/common/crypto_ed25519.c index 525d25a3e0..188e18c710 100644 --- a/src/common/crypto_ed25519.c +++ b/src/common/crypto_ed25519.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,8 +32,6 @@ #include "ed25519/ref10/ed25519_ref10.h" #include "ed25519/donna/ed25519_donna_tor.h" -#include <openssl/sha.h> - static void pick_ed25519_impl(void); /** An Ed25519 implementation, as a set of function pointers. */ @@ -442,14 +440,16 @@ ed25519_keypair_from_curve25519_keypair(ed25519_keypair_t *out, { const char string[] = "Derive high part of ed25519 key from curve25519 key"; ed25519_public_key_t pubkey_check; - SHA512_CTX ctx; - uint8_t sha512_output[64]; + crypto_digest_t *ctx; + uint8_t sha512_output[DIGEST512_LEN]; memcpy(out->seckey.seckey, inp->seckey.secret_key, 32); - SHA512_Init(&ctx); - SHA512_Update(&ctx, out->seckey.seckey, 32); - SHA512_Update(&ctx, string, sizeof(string)); - SHA512_Final(sha512_output, &ctx); + + ctx = crypto_digest512_new(DIGEST_SHA512); + crypto_digest_add_bytes(ctx, (const char*)out->seckey.seckey, 32); + crypto_digest_add_bytes(ctx, (const char*)string, sizeof(string)); + crypto_digest_get_digest(ctx, (char *)sha512_output, sizeof(sha512_output)); + crypto_digest_free(ctx); memcpy(out->seckey.seckey + 32, sha512_output, 32); ed25519_public_key_generate(&out->pubkey, &out->seckey); diff --git a/src/common/crypto_ed25519.h b/src/common/crypto_ed25519.h index f4a4adad68..77a3313adc 100644 --- a/src/common/crypto_ed25519.h +++ b/src/common/crypto_ed25519.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_ED25519_H diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c index aa2a9d1fb0..1d090a8770 100644 --- a/src/common/crypto_format.c +++ b/src/common/crypto_format.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_format.h b/src/common/crypto_format.h index 86c29d319c..390916cf04 100644 --- a/src/common/crypto_format.h +++ b/src/common/crypto_format.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_FORMAT_H diff --git a/src/common/crypto_pwbox.c b/src/common/crypto_pwbox.c index 31e37c007d..db8892e376 100644 --- a/src/common/crypto_pwbox.c +++ b/src/common/crypto_pwbox.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_s2k.c b/src/common/crypto_s2k.c index 5dbd2ad91f..076df815a9 100644 --- a/src/common/crypto_s2k.c +++ b/src/common/crypto_s2k.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_s2k.h b/src/common/crypto_s2k.h index 9b186450b1..04212b868a 100644 --- a/src/common/crypto_s2k.h +++ b/src/common/crypto_s2k.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_S2K_H_INCLUDED diff --git a/src/common/di_ops.c b/src/common/di_ops.c index 4ed49e1164..e47998107d 100644 --- a/src/common/di_ops.c +++ b/src/common/di_ops.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/di_ops.h b/src/common/di_ops.h index 0a154302bf..e174fcc4e4 100644 --- a/src/common/di_ops.h +++ b/src/common/di_ops.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/handles.h b/src/common/handles.h index 1ee2322579..6d7262ab80 100644 --- a/src/common/handles.h +++ b/src/common/handles.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/include.am b/src/common/include.am index 40c463c9d9..51b7da65f5 100644 --- a/src/common/include.am +++ b/src/common/include.am @@ -84,6 +84,7 @@ LIBOR_A_SRC = \ src/common/compat.c \ src/common/compat_threads.c \ src/common/compat_time.c \ + src/common/confline.c \ src/common/container.c \ src/common/log.c \ src/common/memarea.c \ @@ -93,6 +94,7 @@ LIBOR_A_SRC = \ src/common/util_format.c \ src/common/util_process.c \ src/common/sandbox.c \ + src/common/storagedir.c \ src/common/workqueue.c \ $(libor_extra_source) \ $(threads_impl_source) \ @@ -103,11 +105,15 @@ src/common/src_common_libor_testing_a-log.$(OBJEXT) \ LIBOR_CRYPTO_A_SRC = \ src/common/aes.c \ + src/common/compress.c \ + src/common/compress_lzma.c \ + src/common/compress_none.c \ + src/common/compress_zlib.c \ + src/common/compress_zstd.c \ src/common/crypto.c \ src/common/crypto_pwbox.c \ src/common/crypto_s2k.c \ src/common/crypto_format.c \ - src/common/torgzip.c \ src/common/tortls.c \ src/common/crypto_curve25519.c \ src/common/crypto_ed25519.c @@ -143,6 +149,12 @@ COMMONHEADERS = \ src/common/compat_openssl.h \ src/common/compat_threads.h \ src/common/compat_time.h \ + src/common/compress.h \ + src/common/compress_lzma.h \ + src/common/compress_none.h \ + src/common/compress_zlib.h \ + src/common/compress_zstd.h \ + src/common/confline.h \ src/common/container.h \ src/common/crypto.h \ src/common/crypto_curve25519.h \ @@ -157,9 +169,9 @@ COMMONHEADERS = \ src/common/procmon.h \ src/common/pubsub.h \ src/common/sandbox.h \ + src/common/storagedir.h \ src/common/testsupport.h \ src/common/timers.h \ - src/common/torgzip.h \ src/common/torint.h \ src/common/torlog.h \ src/common/tortls.h \ diff --git a/src/common/log.c b/src/common/log.c index 5f7151bf0c..6a5819064a 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1086,7 +1086,7 @@ add_file_log(const log_severity_list_t *severity, const char *filename, int open_flags = O_WRONLY|O_CREAT; open_flags |= truncate_log ? O_TRUNC : O_APPEND; - fd = tor_open_cloexec(filename, open_flags, 0644); + fd = tor_open_cloexec(filename, open_flags, 0640); if (fd<0) return -1; if (tor_fd_seekend(fd)<0) { @@ -1177,7 +1177,7 @@ static const char *domain_list[] = { "GENERAL", "CRYPTO", "NET", "CONFIG", "FS", "PROTOCOL", "MM", "HTTP", "APP", "CONTROL", "CIRC", "REND", "BUG", "DIR", "DIRSERV", "OR", "EDGE", "ACCT", "HIST", "HANDSHAKE", "HEARTBEAT", "CHANNEL", - "SCHED", "GUARD", NULL + "SCHED", "GUARD", "CONSDIFF", NULL }; /** Return a bitmask for the log domain for which <b>domain</b> is the name, diff --git a/src/common/memarea.c b/src/common/memarea.c index 7d16b702e3..659d1edf54 100644 --- a/src/common/memarea.c +++ b/src/common/memarea.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Tor Project, Inc. */ +/* Copyright (c) 2008-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** \file memarea.c @@ -12,6 +12,9 @@ #include "util.h" #include "compat.h" #include "torlog.h" +#include "container.h" + +#ifndef DISABLE_MEMORY_SENTINELS /** If true, we try to detect any attempts to write beyond the length of a * memarea. */ @@ -304,3 +307,91 @@ memarea_assert_ok(memarea_t *area) } } +#else + +struct memarea_t { + smartlist_t *pieces; +}; + +memarea_t * +memarea_new(void) +{ + memarea_t *ma = tor_malloc_zero(sizeof(memarea_t)); + ma->pieces = smartlist_new(); + return ma; +} +void +memarea_drop_all(memarea_t *area) +{ + memarea_clear(area); + smartlist_free(area->pieces); + tor_free(area); +} +void +memarea_clear(memarea_t *area) +{ + SMARTLIST_FOREACH(area->pieces, void *, p, tor_free_(p)); + smartlist_clear(area->pieces); +} +int +memarea_owns_ptr(const memarea_t *area, const void *ptr) +{ + SMARTLIST_FOREACH(area->pieces, const void *, p, if (ptr == p) return 1;); + return 0; +} + +void * +memarea_alloc(memarea_t *area, size_t sz) +{ + void *result = tor_malloc(sz); + smartlist_add(area->pieces, result); + return result; +} + +void * +memarea_alloc_zero(memarea_t *area, size_t sz) +{ + void *result = tor_malloc_zero(sz); + smartlist_add(area->pieces, result); + return result; +} +void * +memarea_memdup(memarea_t *area, const void *s, size_t n) +{ + void *r = memarea_alloc(area, n); + memcpy(r, s, n); + return r; +} +char * +memarea_strdup(memarea_t *area, const char *s) +{ + size_t n = strlen(s); + char *r = memarea_alloc(area, n+1); + memcpy(r, s, n); + r[n] = 0; + return r; +} +char * +memarea_strndup(memarea_t *area, const char *s, size_t n) +{ + size_t ln = strnlen(s, n); + char *r = memarea_alloc(area, ln+1); + memcpy(r, s, ln); + r[ln] = 0; + return r; +} +void +memarea_get_stats(memarea_t *area, + size_t *allocated_out, size_t *used_out) +{ + (void)area; + *allocated_out = *used_out = 128; +} +void +memarea_assert_ok(memarea_t *area) +{ + (void)area; +} + +#endif + diff --git a/src/common/memarea.h b/src/common/memarea.h index 85bca51ad3..85012c1c34 100644 --- a/src/common/memarea.h +++ b/src/common/memarea.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Tor Project, Inc. */ +/* Copyright (c) 2008-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Tor dependencies */ diff --git a/src/common/procmon.c b/src/common/procmon.c index c485c760c7..d49e7f18f5 100644 --- a/src/common/procmon.c +++ b/src/common/procmon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/procmon.h b/src/common/procmon.h index 49ead24092..b07cff2c4a 100644 --- a/src/common/procmon.h +++ b/src/common/procmon.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/pubsub.c b/src/common/pubsub.c index b3faf40e00..336e8a6e7f 100644 --- a/src/common/pubsub.c +++ b/src/common/pubsub.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/pubsub.h b/src/common/pubsub.h index bbb4f02a42..6f4ce08754 100644 --- a/src/common/pubsub.h +++ b/src/common/pubsub.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/sandbox.c b/src/common/sandbox.c index 8e72ebf137..ab2de52592 100644 --- a/src/common/sandbox.c +++ b/src/common/sandbox.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -20,7 +20,7 @@ #endif /** Malloc mprotect limit in bytes. */ -#define MALLOC_MP_LIM 1048576 +#define MALLOC_MP_LIM (16*1024*1024) #include <stdio.h> #include <string.h> diff --git a/src/common/sandbox.h b/src/common/sandbox.h index c5963e3119..a6b83153af 100644 --- a/src/common/sandbox.h +++ b/src/common/sandbox.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/storagedir.c b/src/common/storagedir.c new file mode 100644 index 0000000000..309d42db17 --- /dev/null +++ b/src/common/storagedir.c @@ -0,0 +1,542 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "container.h" +#include "compat.h" +#include "confline.h" +#include "memarea.h" +#include "sandbox.h" +#include "storagedir.h" +#include "torlog.h" +#include "util.h" + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#define FNAME_MIN_NUM 1000 + +/** A storage_dir_t represents a directory full of similar cached + * files. Filenames are decimal integers. Files can be cleaned as needed + * to limit total disk usage. */ +struct storage_dir_t { + /** Directory holding the files for this storagedir. */ + char *directory; + /** Either NULL, or a directory listing of the directory (as a smartlist + * of strings */ + smartlist_t *contents; + /** The largest number of non-temporary files we'll place in the + * directory. */ + int max_files; + /** If true, then 'usage' has been computed. */ + int usage_known; + /** The total number of bytes used in this directory */ + uint64_t usage; +}; + +/** Create or open a new storage directory at <b>dirname</b>, with + * capacity for up to <b>max_files</b> files. + */ +storage_dir_t * +storage_dir_new(const char *dirname, int max_files) +{ + if (check_private_dir(dirname, CPD_CREATE, NULL) < 0) + return NULL; + + storage_dir_t *d = tor_malloc_zero(sizeof(storage_dir_t)); + d->directory = tor_strdup(dirname); + d->max_files = max_files; + return d; +} + +/** + * Drop all in-RAM storage for <b>d</b>. Does not delete any files. + */ +void +storage_dir_free(storage_dir_t *d) +{ + if (d == NULL) + return; + tor_free(d->directory); + if (d->contents) { + SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp)); + smartlist_free(d->contents); + } + tor_free(d); +} + +/** + * Tell the sandbox (if any) configured by <b>cfg</b> to allow the + * operations that <b>d</b> will need. + * + * The presence of this function is why we need an upper limit on the + * number of filers in a storage_dir_t: we need to approve file + * operaitons one by one. + */ +int +storage_dir_register_with_sandbox(storage_dir_t *d, sandbox_cfg_t **cfg) +{ + int problems = 0; + int idx; + for (idx = FNAME_MIN_NUM; idx < FNAME_MIN_NUM + d->max_files; ++idx) { + char *path = NULL, *tmppath = NULL; + tor_asprintf(&path, "%s/%d", d->directory, idx); + tor_asprintf(&tmppath, "%s/%d.tmp", d->directory, idx); + + problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(path)); + problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(tmppath)); + problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(path)); + problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(tmppath)); + problems += sandbox_cfg_allow_rename(cfg, + tor_strdup(tmppath), tor_strdup(path)); + + tor_free(path); + tor_free(tmppath); + } + + return problems ? -1 : 0; +} + +/** + * Remove all files in <b>d</b> whose names end with ".tmp". + * + * Requires that the contents field of <b>d</b> is set. + */ +static void +storage_dir_clean_tmpfiles(storage_dir_t *d) +{ + if (!d->contents) + return; + SMARTLIST_FOREACH_BEGIN(d->contents, char *, fname) { + if (strcmpend(fname, ".tmp")) + continue; + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + if (unlink(sandbox_intern_string(path))) { + log_warn(LD_FS, "Unable to unlink %s", escaped(path)); + tor_free(path); + continue; + } + tor_free(path); + SMARTLIST_DEL_CURRENT(d->contents, fname); + tor_free(fname); + } SMARTLIST_FOREACH_END(fname); + + d->usage_known = 0; +} + +/** + * Re-scan the directory <b>d</b> to learn its contents. + */ +static int +storage_dir_rescan(storage_dir_t *d) +{ + if (d->contents) { + SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp)); + smartlist_free(d->contents); + } + d->usage = 0; + d->usage_known = 0; + if (NULL == (d->contents = tor_listdir(d->directory))) { + return -1; + } + storage_dir_clean_tmpfiles(d); + return 0; +} + +/** + * Return a smartlist containing the filenames within <b>d</b>. + */ +const smartlist_t * +storage_dir_list(storage_dir_t *d) +{ + if (! d->contents) + storage_dir_rescan(d); + return d->contents; +} + +/** + * Return the total number of bytes used for storage in <b>d</b>. + */ +uint64_t +storage_dir_get_usage(storage_dir_t *d) +{ + if (d->usage_known) + return d->usage; + + uint64_t total = 0; + SMARTLIST_FOREACH_BEGIN(storage_dir_list(d), const char *, cp) { + char *path = NULL; + struct stat st; + tor_asprintf(&path, "%s/%s", d->directory, cp); + if (stat(sandbox_intern_string(path), &st) == 0) { + total += st.st_size; + } + tor_free(path); + } SMARTLIST_FOREACH_END(cp); + + d->usage = total; + d->usage_known = 1; + return d->usage; +} + +/** Mmap a specified file within <b>d</b>. */ +tor_mmap_t * +storage_dir_map(storage_dir_t *d, const char *fname) +{ + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + tor_mmap_t *result = tor_mmap_file(path); + tor_free(path); + return result; +} + +/** Read a file within <b>d</b> into a newly allocated buffer. Set + * *<b>sz_out</b> to its size. */ +uint8_t * +storage_dir_read(storage_dir_t *d, const char *fname, int bin, size_t *sz_out) +{ + const int flags = bin ? RFTS_BIN : 0; + + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + struct stat st; + char *contents = read_file_to_str(path, flags, &st); + if (contents && sz_out) { + // it fits in RAM, so we know its size is less than SIZE_MAX + tor_assert((uint64_t)st.st_size <= SIZE_MAX); + *sz_out = (size_t) st.st_size; + } + + tor_free(path); + return (uint8_t *) contents; +} + +/** Helper: Find an unused filename within the directory */ +static char * +find_unused_fname(storage_dir_t *d) +{ + if (!d->contents) { + if (storage_dir_rescan(d) < 0) + return NULL; + } + + char buf[16]; + int i; + /* Yuck; this is quadratic. Fortunately, that shouldn't matter much, + * since disk writes are more expensive by a lot. */ + for (i = FNAME_MIN_NUM; i < FNAME_MIN_NUM + d->max_files; ++i) { + tor_snprintf(buf, sizeof(buf), "%d", i); + if (!smartlist_contains_string(d->contents, buf)) { + return tor_strdup(buf); + } + } + return NULL; +} + +/** Helper: As storage_dir_save_bytes_to_file, but store a smartlist of + * sized_chunk_t rather than a single byte array. */ +static int +storage_dir_save_chunks_to_file(storage_dir_t *d, + const smartlist_t *chunks, + int binary, + char **fname_out) +{ + uint64_t total_length = 0; + char *fname = find_unused_fname(d); + if (!fname) + return -1; + + SMARTLIST_FOREACH(chunks, const sized_chunk_t *, ch, + total_length += ch->len); + + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + + int r = write_chunks_to_file(path, chunks, binary, 0); + if (r == 0) { + if (d->usage_known) + d->usage += total_length; + if (fname_out) { + *fname_out = tor_strdup(fname); + } + if (d->contents) + smartlist_add(d->contents, tor_strdup(fname)); + } + tor_free(fname); + tor_free(path); + return r; +} + +/** Try to write the <b>length</b> bytes at <b>data</b> into a new file + * in <b>d</b>. On success, return 0 and set *<b>fname_out</b> to a + * newly allocated string containing the filename. On failure, return + * -1. */ +int +storage_dir_save_bytes_to_file(storage_dir_t *d, + const uint8_t *data, + size_t length, + int binary, + char **fname_out) +{ + smartlist_t *chunks = smartlist_new(); + sized_chunk_t chunk = { (const char *)data, length }; + smartlist_add(chunks, &chunk); + int r = storage_dir_save_chunks_to_file(d, chunks, binary, fname_out); + smartlist_free(chunks); + return r; +} + +/** + * As storage_dir_save_bytes_to_file, but saves a NUL-terminated string + * <b>str</b>. + */ +int +storage_dir_save_string_to_file(storage_dir_t *d, + const char *str, + int binary, + char **fname_out) +{ + return storage_dir_save_bytes_to_file(d, + (const uint8_t*)str, strlen(str), binary, fname_out); +} + +/** + * As storage_dir_save_bytes_to_file, but associates the data with the + * key-value pairs in <b>labels</b>. Files + * stored in this format can be recovered with storage_dir_map_labeled + * or storage_dir_read_labeled(). + */ +int +storage_dir_save_labeled_to_file(storage_dir_t *d, + const config_line_t *labels, + const uint8_t *data, + size_t length, + char **fname_out) +{ + /* + * The storage format is to prefix the data with the key-value pairs in + * <b>labels</b>, and a single NUL separator. But code outside this module + * MUST NOT rely on that format. + */ + + smartlist_t *chunks = smartlist_new(); + memarea_t *area = memarea_new(); + const config_line_t *line; + for (line = labels; line; line = line->next) { + sized_chunk_t *sz = memarea_alloc(area, sizeof(sized_chunk_t)); + sz->len = strlen(line->key) + 1 + strlen(line->value) + 1; + const size_t allocated = sz->len + 1; + char *bytes = memarea_alloc(area, allocated); + tor_snprintf(bytes, allocated, "%s %s\n", line->key, line->value); + sz->bytes = bytes; + smartlist_add(chunks, sz); + } + + sized_chunk_t *nul = memarea_alloc(area, sizeof(sized_chunk_t)); + nul->len = 1; + nul->bytes = "\0"; + smartlist_add(chunks, nul); + + sized_chunk_t *datachunk = memarea_alloc(area, sizeof(sized_chunk_t)); + datachunk->bytes = (const char *)data; + datachunk->len = length; + smartlist_add(chunks, datachunk); + + int r = storage_dir_save_chunks_to_file(d, chunks, 1, fname_out); + smartlist_free(chunks); + memarea_drop_all(area); + return r; +} + +/** + * Map a file that was created with storage_dir_save_labeled(). On failure, + * return NULL. On success, write a set of newly allocated labels into to + * *<b>labels_out</b>, a pointer to the into *<b>data_out</b>, and the data's + * into *<b>sz_out</b>. On success, also return a tor_mmap_t object whose + * contents should not be used -- it needs to be kept around, though, for as + * long as <b>data_out</b> is going to be valid. + */ +tor_mmap_t * +storage_dir_map_labeled(storage_dir_t *dir, + const char *fname, + config_line_t **labels_out, + const uint8_t **data_out, + size_t *sz_out) +{ + tor_mmap_t *m = storage_dir_map(dir, fname); + if (! m) + goto err; + const char *nulp = memchr(m->data, '\0', m->size); + if (! nulp) + goto err; + if (labels_out && config_get_lines(m->data, labels_out, 0) < 0) + goto err; + size_t offset = nulp - m->data + 1; + tor_assert(offset <= m->size); + *data_out = (const uint8_t *)(m->data + offset); + *sz_out = m->size - offset; + + return m; + err: + tor_munmap_file(m); + return NULL; +} + +/** As storage_dir_map_labeled, but return a new byte array containing the + * data. */ +uint8_t * +storage_dir_read_labeled(storage_dir_t *dir, + const char *fname, + config_line_t **labels_out, + size_t *sz_out) +{ + const uint8_t *data = NULL; + tor_mmap_t *m = storage_dir_map_labeled(dir, fname, labels_out, + &data, sz_out); + if (m == NULL) + return NULL; + uint8_t *result = tor_memdup(data, *sz_out); + tor_munmap_file(m); + return result; +} + +/** + * Remove the file called <b>fname</b> from <b>d</b>. + */ +void +storage_dir_remove_file(storage_dir_t *d, + const char *fname) +{ + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + const char *ipath = sandbox_intern_string(path); + + uint64_t size = 0; + if (d->usage_known) { + struct stat st; + if (stat(ipath, &st) == 0) { + size = st.st_size; + } + } + if (unlink(ipath) == 0) { + d->usage -= size; + } else { + log_warn(LD_FS, "Unable to unlink %s", escaped(path)); + tor_free(path); + return; + } + if (d->contents) { + smartlist_string_remove(d->contents, fname); + } + + tor_free(path); +} + +/** Helper type: used to sort the members of storage directory by mtime. */ +typedef struct shrinking_dir_entry_t { + time_t mtime; + uint64_t size; + char *path; +} shrinking_dir_entry_t; + +/** Helper: use with qsort to sort shrinking_dir_entry_t structs. */ +static int +shrinking_dir_entry_compare(const void *a_, const void *b_) +{ + const shrinking_dir_entry_t *a = a_; + const shrinking_dir_entry_t *b = b_; + + if (a->mtime < b->mtime) + return -1; + else if (a->mtime > b->mtime) + return 1; + else + return 0; +} + +/** + * Try to free space by removing the oldest files in <b>d</b>. Delete + * until no more than <b>target_size</b> bytes are left, and at least + * <b>min_to_remove</b> files have been removed... or until there is + * nothing left to remove. + * + * Return 0 on success; -1 on failure. + */ +int +storage_dir_shrink(storage_dir_t *d, + uint64_t target_size, + int min_to_remove) +{ + if (d->usage_known && d->usage <= target_size && !min_to_remove) { + /* Already small enough. */ + return 0; + } + + if (storage_dir_rescan(d) < 0) + return -1; + + const uint64_t orig_usage = storage_dir_get_usage(d); + if (orig_usage <= target_size && !min_to_remove) { + /* Okay, small enough after rescan! */ + return 0; + } + + const int n = smartlist_len(d->contents); + shrinking_dir_entry_t *ents = tor_calloc(n, sizeof(shrinking_dir_entry_t)); + SMARTLIST_FOREACH_BEGIN(d->contents, const char *, fname) { + shrinking_dir_entry_t *ent = &ents[fname_sl_idx]; + struct stat st; + tor_asprintf(&ent->path, "%s/%s", d->directory, fname); + if (stat(sandbox_intern_string(ent->path), &st) == 0) { + ent->mtime = st.st_mtime; + ent->size = st.st_size; + } + } SMARTLIST_FOREACH_END(fname); + + qsort(ents, n, sizeof(shrinking_dir_entry_t), shrinking_dir_entry_compare); + + int idx = 0; + while ((d->usage > target_size || min_to_remove > 0) && idx < n) { + if (unlink(sandbox_intern_string(ents[idx].path)) == 0) { + if (! BUG(d->usage < ents[idx].size)) { + d->usage -= ents[idx].size; + } + --min_to_remove; + } + ++idx; + } + + for (idx = 0; idx < n; ++idx) { + tor_free(ents[idx].path); + } + tor_free(ents); + + storage_dir_rescan(d); + + return 0; +} + +/** Remove all files in <b>d</b>. */ +int +storage_dir_remove_all(storage_dir_t *d) +{ + return storage_dir_shrink(d, 0, d->max_files); +} + +/** + * Return the largest number of non-temporary files we're willing to + * store in <b>d</b>. + */ +int +storage_dir_get_max_files(storage_dir_t *d) +{ + return d->max_files; +} + diff --git a/src/common/storagedir.h b/src/common/storagedir.h new file mode 100644 index 0000000000..db25057e65 --- /dev/null +++ b/src/common/storagedir.h @@ -0,0 +1,51 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_STORAGEDIR_H +#define TOR_STORAGEDIR_H + +typedef struct storage_dir_t storage_dir_t; +struct config_line_t; +struct sandbox_cfg_elem; + +storage_dir_t * storage_dir_new(const char *dirname, int n_files); +void storage_dir_free(storage_dir_t *d); +int storage_dir_register_with_sandbox(storage_dir_t *d, + struct sandbox_cfg_elem **cfg); +const smartlist_t *storage_dir_list(storage_dir_t *d); +uint64_t storage_dir_get_usage(storage_dir_t *d); +tor_mmap_t *storage_dir_map(storage_dir_t *d, const char *fname); +uint8_t *storage_dir_read(storage_dir_t *d, const char *fname, int bin, + size_t *sz_out); +int storage_dir_save_bytes_to_file(storage_dir_t *d, + const uint8_t *data, + size_t length, + int binary, + char **fname_out); +int storage_dir_save_string_to_file(storage_dir_t *d, + const char *data, + int binary, + char **fname_out); +int storage_dir_save_labeled_to_file(storage_dir_t *d, + const struct config_line_t *labels, + const uint8_t *data, + size_t length, + char **fname_out); +tor_mmap_t *storage_dir_map_labeled(storage_dir_t *dir, + const char *fname, + struct config_line_t **labels_out, + const uint8_t **data_out, + size_t *size_out); +uint8_t *storage_dir_read_labeled(storage_dir_t *d, const char *fname, + struct config_line_t **labels_out, + size_t *sz_out); +void storage_dir_remove_file(storage_dir_t *d, + const char *fname); +int storage_dir_shrink(storage_dir_t *d, + uint64_t target_size, + int min_to_remove); +int storage_dir_remove_all(storage_dir_t *d); +int storage_dir_get_max_files(storage_dir_t *d); + +#endif + diff --git a/src/common/testsupport.h b/src/common/testsupport.h index 9ad2ba77e0..9fc96199b4 100644 --- a/src/common/testsupport.h +++ b/src/common/testsupport.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TESTSUPPORT_H diff --git a/src/common/timers.c b/src/common/timers.c index e1ad47b15b..6f4a6c30f0 100644 --- a/src/common/timers.c +++ b/src/common/timers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/timers.h b/src/common/timers.h index c5246a3335..e816630e6d 100644 --- a/src/common/timers.h +++ b/src/common/timers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TIMERS_H diff --git a/src/common/torgzip.c b/src/common/torgzip.c deleted file mode 100644 index 04ae353cf4..0000000000 --- a/src/common/torgzip.c +++ /dev/null @@ -1,584 +0,0 @@ -/* Copyright (c) 2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file torgzip.c - * \brief A simple in-memory gzip implementation. - **/ - -#include "orconfig.h" - -#include <stdlib.h> -#include <stdio.h> -#include <assert.h> -#include <string.h> -#include "torint.h" - -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - -#include "util.h" -#include "torlog.h" -#include "torgzip.h" - -/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of - saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory - that nobody will care if the compile outputs a no-such-identifier warning. - - Sorry, but we like -Werror over here, so I guess we need to define these. - I hope that zlib 1.2.6 doesn't break these too. -*/ -#ifndef _LARGEFILE64_SOURCE -#define _LARGEFILE64_SOURCE 0 -#endif -#ifndef _LFS64_LARGEFILE -#define _LFS64_LARGEFILE 0 -#endif -#ifndef _FILE_OFFSET_BITS -#define _FILE_OFFSET_BITS 0 -#endif -#ifndef off64_t -#define off64_t int64_t -#endif - -#include <zlib.h> - -#if defined ZLIB_VERNUM && ZLIB_VERNUM < 0x1200 -#error "We require zlib version 1.2 or later." -#endif - -static size_t tor_zlib_state_size_precalc(int inflate, - int windowbits, int memlevel); - -/** Total number of bytes allocated for zlib state */ -static size_t total_zlib_allocation = 0; - -/** Return a string representation of the version of the currently running - * version of zlib. */ -const char * -tor_zlib_get_version_str(void) -{ - return zlibVersion(); -} - -/** Return a string representation of the version of the version of zlib -* used at compilation. */ -const char * -tor_zlib_get_header_version_str(void) -{ - return ZLIB_VERSION; -} - -/** Return the 'bits' value to tell zlib to use <b>method</b>.*/ -static inline int -method_bits(compress_method_t method, zlib_compression_level_t level) -{ - /* Bits+16 means "use gzip" in zlib >= 1.2 */ - const int flag = method == GZIP_METHOD ? 16 : 0; - switch (level) { - default: - case HIGH_COMPRESSION: return flag + 15; - case MEDIUM_COMPRESSION: return flag + 13; - case LOW_COMPRESSION: return flag + 11; - } -} - -static inline int -get_memlevel(zlib_compression_level_t level) -{ - switch (level) { - default: - case HIGH_COMPRESSION: return 8; - case MEDIUM_COMPRESSION: return 7; - case LOW_COMPRESSION: return 6; - } -} - -/** @{ */ -/* These macros define the maximum allowable compression factor. Anything of - * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to - * have an uncompression factor (uncompressed size:compressed size ratio) of - * any greater than MAX_UNCOMPRESSION_FACTOR. - * - * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to - * be small to limit the attack multiplier, but we also want it to be large - * enough so that no legitimate document --even ones we might invent in the - * future -- ever compresses by a factor of greater than - * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably - * large range of possible values. IMO, anything over 8 is probably safe; IMO - * anything under 50 is probably sufficient. - */ -#define MAX_UNCOMPRESSION_FACTOR 25 -#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64) -/** @} */ - -/** Return true if uncompressing an input of size <b>in_size</b> to an input - * of size at least <b>size_out</b> looks like a compression bomb. */ -static int -is_compression_bomb(size_t size_in, size_t size_out) -{ - if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER) - return 0; - - return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR); -} - -/** Given <b>in_len</b> bytes at <b>in</b>, compress them into a newly - * allocated buffer, using the method described in <b>method</b>. Store the - * compressed string in *<b>out</b>, and its length in *<b>out_len</b>. - * Return 0 on success, -1 on failure. - */ -int -tor_gzip_compress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method) -{ - struct z_stream_s *stream = NULL; - size_t out_size, old_size; - off_t offset; - - tor_assert(out); - tor_assert(out_len); - tor_assert(in); - tor_assert(in_len < UINT_MAX); - - *out = NULL; - - stream = tor_malloc_zero(sizeof(struct z_stream_s)); - stream->zalloc = Z_NULL; - stream->zfree = Z_NULL; - stream->opaque = NULL; - stream->next_in = (unsigned char*) in; - stream->avail_in = (unsigned int)in_len; - - if (deflateInit2(stream, Z_BEST_COMPRESSION, Z_DEFLATED, - method_bits(method, HIGH_COMPRESSION), - get_memlevel(HIGH_COMPRESSION), - Z_DEFAULT_STRATEGY) != Z_OK) { - //LCOV_EXCL_START -- we can only provoke failure by giving junk arguments. - log_warn(LD_GENERAL, "Error from deflateInit2: %s", - stream->msg?stream->msg:"<no message>"); - goto err; - //LCOV_EXCL_STOP - } - - /* Guess 50% compression. */ - out_size = in_len / 2; - if (out_size < 1024) out_size = 1024; - *out = tor_malloc(out_size); - stream->next_out = (unsigned char*)*out; - stream->avail_out = (unsigned int)out_size; - - while (1) { - switch (deflate(stream, Z_FINISH)) - { - case Z_STREAM_END: - goto done; - case Z_OK: - /* In case zlib doesn't work as I think .... */ - if (stream->avail_out >= stream->avail_in+16) - break; - case Z_BUF_ERROR: - offset = stream->next_out - ((unsigned char*)*out); - old_size = out_size; - out_size *= 2; - if (out_size < old_size) { - log_warn(LD_GENERAL, "Size overflow in compression."); - goto err; - } - *out = tor_realloc(*out, out_size); - stream->next_out = (unsigned char*)(*out + offset); - if (out_size - offset > UINT_MAX) { - log_warn(LD_BUG, "Ran over unsigned int limit of zlib while " - "uncompressing."); - goto err; - } - stream->avail_out = (unsigned int)(out_size - offset); - break; - default: - log_warn(LD_GENERAL, "Gzip compression didn't finish: %s", - stream->msg ? stream->msg : "<no message>"); - goto err; - } - } - done: - *out_len = stream->total_out; -#if defined(OpenBSD) - /* "Hey Rocky! Watch me change an unsigned field to a signed field in a - * third-party API!" - * "Oh, that trick will just make people do unsafe casts to the unsigned - * type in their cross-platform code!" - * "Don't be foolish. I'm _sure_ they'll have the good sense to make sure - * the newly unsigned field isn't negative." */ - tor_assert(stream->total_out >= 0); -#endif - if (deflateEnd(stream)!=Z_OK) { - // LCOV_EXCL_START -- unreachable if we handled the zlib structure right - tor_assert_nonfatal_unreached(); - log_warn(LD_BUG, "Error freeing gzip structures"); - goto err; - // LCOV_EXCL_STOP - } - tor_free(stream); - - if (is_compression_bomb(*out_len, in_len)) { - log_warn(LD_BUG, "We compressed something and got an insanely high " - "compression factor; other Tors would think this was a zlib bomb."); - goto err; - } - - return 0; - err: - if (stream) { - deflateEnd(stream); - tor_free(stream); - } - tor_free(*out); - return -1; -} - -/** Given zero or more zlib-compressed or gzip-compressed strings of - * total length - * <b>in_len</b> bytes at <b>in</b>, uncompress them into a newly allocated - * buffer, using the method described in <b>method</b>. Store the uncompressed - * string in *<b>out</b>, and its length in *<b>out_len</b>. Return 0 on - * success, -1 on failure. - * - * If <b>complete_only</b> is true, we consider a truncated input as a - * failure; otherwise we decompress as much as we can. Warn about truncated - * or corrupt inputs at <b>protocol_warn_level</b>. - */ -int -tor_gzip_uncompress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method, - int complete_only, - int protocol_warn_level) -{ - struct z_stream_s *stream = NULL; - size_t out_size, old_size; - off_t offset; - int r; - - tor_assert(out); - tor_assert(out_len); - tor_assert(in); - tor_assert(in_len < UINT_MAX); - - *out = NULL; - - stream = tor_malloc_zero(sizeof(struct z_stream_s)); - stream->zalloc = Z_NULL; - stream->zfree = Z_NULL; - stream->opaque = NULL; - stream->next_in = (unsigned char*) in; - stream->avail_in = (unsigned int)in_len; - - if (inflateInit2(stream, - method_bits(method, HIGH_COMPRESSION)) != Z_OK) { - // LCOV_EXCL_START -- can only hit this if we give bad inputs. - log_warn(LD_GENERAL, "Error from inflateInit2: %s", - stream->msg?stream->msg:"<no message>"); - goto err; - // LCOV_EXCL_STOP - } - - out_size = in_len * 2; /* guess 50% compression. */ - if (out_size < 1024) out_size = 1024; - if (out_size >= SIZE_T_CEILING || out_size > UINT_MAX) - goto err; - - *out = tor_malloc(out_size); - stream->next_out = (unsigned char*)*out; - stream->avail_out = (unsigned int)out_size; - - while (1) { - switch (inflate(stream, complete_only ? Z_FINISH : Z_SYNC_FLUSH)) - { - case Z_STREAM_END: - if (stream->avail_in == 0) - goto done; - /* There may be more compressed data here. */ - if ((r = inflateEnd(stream)) != Z_OK) { - log_warn(LD_BUG, "Error freeing gzip structures"); - goto err; - } - if (inflateInit2(stream, - method_bits(method,HIGH_COMPRESSION)) != Z_OK) { - log_warn(LD_GENERAL, "Error from second inflateInit2: %s", - stream->msg?stream->msg:"<no message>"); - goto err; - } - break; - case Z_OK: - if (!complete_only && stream->avail_in == 0) - goto done; - /* In case zlib doesn't work as I think.... */ - if (stream->avail_out >= stream->avail_in+16) - break; - case Z_BUF_ERROR: - if (stream->avail_out > 0) { - log_fn(protocol_warn_level, LD_PROTOCOL, - "possible truncated or corrupt zlib data"); - goto err; - } - offset = stream->next_out - (unsigned char*)*out; - old_size = out_size; - out_size *= 2; - if (out_size < old_size) { - log_warn(LD_GENERAL, "Size overflow in uncompression."); - goto err; - } - if (is_compression_bomb(in_len, out_size)) { - log_warn(LD_GENERAL, "Input looks like a possible zlib bomb; " - "not proceeding."); - goto err; - } - if (out_size >= SIZE_T_CEILING) { - log_warn(LD_BUG, "Hit SIZE_T_CEILING limit while uncompressing."); - goto err; - } - *out = tor_realloc(*out, out_size); - stream->next_out = (unsigned char*)(*out + offset); - if (out_size - offset > UINT_MAX) { - log_warn(LD_BUG, "Ran over unsigned int limit of zlib while " - "uncompressing."); - goto err; - } - stream->avail_out = (unsigned int)(out_size - offset); - break; - default: - log_warn(LD_GENERAL, "Gzip decompression returned an error: %s", - stream->msg ? stream->msg : "<no message>"); - goto err; - } - } - done: - *out_len = stream->next_out - (unsigned char*)*out; - r = inflateEnd(stream); - tor_free(stream); - if (r != Z_OK) { - log_warn(LD_BUG, "Error freeing gzip structures"); - goto err; - } - - /* NUL-terminate output. */ - if (out_size == *out_len) - *out = tor_realloc(*out, out_size + 1); - (*out)[*out_len] = '\0'; - - return 0; - err: - if (stream) { - inflateEnd(stream); - tor_free(stream); - } - if (*out) { - tor_free(*out); - } - return -1; -} - -/** Try to tell whether the <b>in_len</b>-byte string in <b>in</b> is likely - * to be compressed or not. If it is, return the likeliest compression method. - * Otherwise, return UNKNOWN_METHOD. - */ -compress_method_t -detect_compression_method(const char *in, size_t in_len) -{ - if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) { - return GZIP_METHOD; - } else if (in_len > 2 && (in[0] & 0x0f) == 8 && - (ntohs(get_uint16(in)) % 31) == 0) { - return ZLIB_METHOD; - } else { - return UNKNOWN_METHOD; - } -} - -/** Internal state for an incremental zlib compression/decompression. The - * body of this struct is not exposed. */ -struct tor_zlib_state_t { - struct z_stream_s stream; /**< The zlib stream */ - int compress; /**< True if we are compressing; false if we are inflating */ - - /** Number of bytes read so far. Used to detect zlib bombs. */ - size_t input_so_far; - /** Number of bytes written so far. Used to detect zlib bombs. */ - size_t output_so_far; - - /** Approximate number of bytes allocated for this object. */ - size_t allocation; -}; - -/** Construct and return a tor_zlib_state_t object using <b>method</b>. If - * <b>compress</b>, it's for compression; otherwise it's for - * decompression. */ -tor_zlib_state_t * -tor_zlib_new(int compress_, compress_method_t method, - zlib_compression_level_t compression_level) -{ - tor_zlib_state_t *out; - int bits, memlevel; - - if (! compress_) { - /* use this setting for decompression, since we might have the - * max number of window bits */ - compression_level = HIGH_COMPRESSION; - } - - out = tor_malloc_zero(sizeof(tor_zlib_state_t)); - out->stream.zalloc = Z_NULL; - out->stream.zfree = Z_NULL; - out->stream.opaque = NULL; - out->compress = compress_; - bits = method_bits(method, compression_level); - memlevel = get_memlevel(compression_level); - if (compress_) { - if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, - bits, memlevel, - Z_DEFAULT_STRATEGY) != Z_OK) - goto err; // LCOV_EXCL_LINE - } else { - if (inflateInit2(&out->stream, bits) != Z_OK) - goto err; // LCOV_EXCL_LINE - } - out->allocation = tor_zlib_state_size_precalc(!compress_, bits, memlevel); - - total_zlib_allocation += out->allocation; - - return out; - - err: - tor_free(out); - return NULL; -} - -/** Compress/decompress some bytes using <b>state</b>. Read up to - * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes - * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, - * we've reached the end of the input. - * - * Return TOR_ZLIB_DONE if we've finished the entire compression/decompression. - * Return TOR_ZLIB_OK if we're processed everything from the input. - * Return TOR_ZLIB_BUF_FULL if we're out of space on <b>out</b>. - * Return TOR_ZLIB_ERR if the stream is corrupt. - */ -tor_zlib_output_t -tor_zlib_process(tor_zlib_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish) -{ - int err; - tor_assert(*in_len <= UINT_MAX); - tor_assert(*out_len <= UINT_MAX); - state->stream.next_in = (unsigned char*) *in; - state->stream.avail_in = (unsigned int)*in_len; - state->stream.next_out = (unsigned char*) *out; - state->stream.avail_out = (unsigned int)*out_len; - - if (state->compress) { - err = deflate(&state->stream, finish ? Z_FINISH : Z_NO_FLUSH); - } else { - err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH); - } - - state->input_so_far += state->stream.next_in - ((unsigned char*)*in); - state->output_so_far += state->stream.next_out - ((unsigned char*)*out); - - *out = (char*) state->stream.next_out; - *out_len = state->stream.avail_out; - *in = (const char *) state->stream.next_in; - *in_len = state->stream.avail_in; - - if (! state->compress && - is_compression_bomb(state->input_so_far, state->output_so_far)) { - log_warn(LD_DIR, "Possible zlib bomb; abandoning stream."); - return TOR_ZLIB_ERR; - } - - switch (err) - { - case Z_STREAM_END: - return TOR_ZLIB_DONE; - case Z_BUF_ERROR: - if (state->stream.avail_in == 0 && !finish) - return TOR_ZLIB_OK; - return TOR_ZLIB_BUF_FULL; - case Z_OK: - if (state->stream.avail_out == 0 || finish) - return TOR_ZLIB_BUF_FULL; - return TOR_ZLIB_OK; - default: - log_warn(LD_GENERAL, "Gzip returned an error: %s", - state->stream.msg ? state->stream.msg : "<no message>"); - return TOR_ZLIB_ERR; - } -} - -/** Deallocate <b>state</b>. */ -void -tor_zlib_free(tor_zlib_state_t *state) -{ - if (!state) - return; - - total_zlib_allocation -= state->allocation; - - if (state->compress) - deflateEnd(&state->stream); - else - inflateEnd(&state->stream); - - tor_free(state); -} - -/** Return an approximate number of bytes used in RAM to hold a state with - * window bits <b>windowBits</b> and compression level 'memlevel' */ -static size_t -tor_zlib_state_size_precalc(int inflate_, int windowbits, int memlevel) -{ - windowbits &= 15; - -#define A_FEW_KILOBYTES 2048 - - if (inflate_) { - /* From zconf.h: - - "The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects." - */ - return sizeof(tor_zlib_state_t) + sizeof(struct z_stream_s) + - (1 << 15) + A_FEW_KILOBYTES; - } else { - /* Also from zconf.h: - - "The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - ... plus a few kilobytes for small objects." - */ - return sizeof(tor_zlib_state_t) + sizeof(struct z_stream_s) + - (1 << (windowbits + 2)) + (1 << (memlevel + 9)) + A_FEW_KILOBYTES; - } -#undef A_FEW_KILOBYTES -} - -/** Return the approximate number of bytes allocated for <b>state</b>. */ -size_t -tor_zlib_state_size(const tor_zlib_state_t *state) -{ - return state->allocation; -} - -/** Return the approximate number of bytes allocated for all zlib states. */ -size_t -tor_zlib_get_total_allocation(void) -{ - return total_zlib_allocation; -} - diff --git a/src/common/torgzip.h b/src/common/torgzip.h deleted file mode 100644 index 00f62dcb45..0000000000 --- a/src/common/torgzip.h +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file torgzip.h - * \brief Headers for torgzip.h - **/ - -#ifndef TOR_TORGZIP_H -#define TOR_TORGZIP_H - -/** Enumeration of what kind of compression to use. Only ZLIB_METHOD is - * guaranteed to be supported by the compress/uncompress functions here; - * GZIP_METHOD may be supported if we built against zlib version 1.2 or later - * and is_gzip_supported() returns true. */ -typedef enum { - NO_METHOD=0, GZIP_METHOD=1, ZLIB_METHOD=2, UNKNOWN_METHOD=3 -} compress_method_t; - -/** - * Enumeration to define tradeoffs between memory usage and compression level. - * HIGH_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most - * memory. - **/ -typedef enum { - HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION -} zlib_compression_level_t; - -int -tor_gzip_compress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method); -int -tor_gzip_uncompress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method, - int complete_only, - int protocol_warn_level); - -int is_gzip_supported(void); - -const char * -tor_zlib_get_version_str(void); - -const char * -tor_zlib_get_header_version_str(void); - -compress_method_t detect_compression_method(const char *in, size_t in_len); - -/** Return values from tor_zlib_process; see that function's documentation for - * details. */ -typedef enum { - TOR_ZLIB_OK, TOR_ZLIB_DONE, TOR_ZLIB_BUF_FULL, TOR_ZLIB_ERR -} tor_zlib_output_t; -/** Internal state for an incremental zlib compression/decompression. */ -typedef struct tor_zlib_state_t tor_zlib_state_t; -tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method, - zlib_compression_level_t level); - -tor_zlib_output_t tor_zlib_process(tor_zlib_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish); -void tor_zlib_free(tor_zlib_state_t *state); - -size_t tor_zlib_state_size(const tor_zlib_state_t *state); -size_t tor_zlib_get_total_allocation(void); - -#endif - diff --git a/src/common/torint.h b/src/common/torint.h index 58c30f41a8..ee31459e94 100644 --- a/src/common/torint.h +++ b/src/common/torint.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/torlog.h b/src/common/torlog.h index bc957858d9..6e374b1c11 100644 --- a/src/common/torlog.h +++ b/src/common/torlog.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -101,8 +101,10 @@ #define LD_SCHED (1u<<22) /** Guard nodes */ #define LD_GUARD (1u<<23) +/** Generation and application of consensus diffs. */ +#define LD_CONSDIFF (1u<<24) /** Number of logging domains in the code. */ -#define N_LOGGING_DOMAINS 24 +#define N_LOGGING_DOMAINS 25 /** This log message is not safe to send to a callback-based logger * immediately. Used as a flag, not a log domain. */ diff --git a/src/common/tortls.c b/src/common/tortls.c index 1fe91edf0e..fadf52fa0a 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -17,6 +17,7 @@ #include "orconfig.h" #define TORTLS_PRIVATE +#define TORTLS_OPENSSL_PRIVATE #include <assert.h> #ifdef _WIN32 /*wrkard for dtls1.h >= 0.9.8m of "#include <winsock.h>"*/ @@ -483,8 +484,22 @@ MOCK_IMPL(STATIC X509 *, * then we might pick a time where we're about to expire. Lastly, be * sure to start on a day boundary. */ time_t now = time(NULL); - start_time = crypto_rand_time_range(now - cert_lifetime, now) + 2*24*3600; - start_time -= start_time % (24*3600); + /* Our certificate lifetime will be cert_lifetime no matter what, but if we + * start cert_lifetime in the past, we'll have 0 real lifetime. instead we + * start up to (cert_lifetime - min_real_lifetime - start_granularity) in + * the past. */ + const time_t min_real_lifetime = 24*3600; + const time_t start_granularity = 24*3600; + time_t earliest_start_time = now - cert_lifetime + min_real_lifetime + + start_granularity; + /* Don't actually start in the future! */ + if (earliest_start_time >= now) + earliest_start_time = now - 1; + start_time = crypto_rand_time_range(earliest_start_time, now); + /* Round the start time back to the start of a day. */ + start_time -= start_time % start_granularity; + + end_time = start_time + cert_lifetime; tor_assert(rsa); tor_assert(cname); @@ -518,7 +533,6 @@ MOCK_IMPL(STATIC X509 *, if (!X509_time_adj(X509_get_notBefore(x509),0,&start_time)) goto error; - end_time = start_time + cert_lifetime; if (!X509_time_adj(X509_get_notAfter(x509),0,&end_time)) goto error; if (!X509_set_pubkey(x509, pkey)) @@ -2250,6 +2264,24 @@ check_cert_lifetime_internal(int severity, const X509 *cert, return 0; } +#ifdef TOR_UNIT_TESTS +/* Testing only: return a new x509 cert with the same contents as <b>inp</b>, + but with the expiration time <b>new_expiration_time</b>, signed with + <b>signing_key</b>. */ +STATIC tor_x509_cert_t * +tor_x509_cert_replace_expiration(const tor_x509_cert_t *inp, + time_t new_expiration_time, + crypto_pk_t *signing_key) +{ + X509 *newc = X509_dup(inp->cert); + X509_time_adj(X509_get_notAfter(newc), 0, &new_expiration_time); + EVP_PKEY *pk = crypto_pk_get_evp_pkey_(signing_key, 1); + tor_assert(X509_sign(newc, pk, EVP_sha256())); + EVP_PKEY_free(pk); + return tor_x509_cert_new(newc); +} +#endif + /** Return the number of bytes available for reading from <b>tls</b>. */ int diff --git a/src/common/tortls.h b/src/common/tortls.h index 6510fdbe64..fd0186cf90 100644 --- a/src/common/tortls.h +++ b/src/common/tortls.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TORTLS_H @@ -63,12 +63,17 @@ typedef enum { } tor_tls_state_t; #define tor_tls_state_bitfield_t ENUM_BF(tor_tls_state_t) +struct x509_st; +struct ssl_st; +struct ssl_ctx_st; +struct ssl_session_st; + /** Holds a SSL_CTX object and related state used to configure TLS * connections. */ typedef struct tor_tls_context_t { int refcnt; - SSL_CTX *ctx; + struct ssl_ctx_st *ctx; tor_x509_cert_t *my_link_cert; tor_x509_cert_t *my_id_cert; tor_x509_cert_t *my_auth_cert; @@ -78,7 +83,7 @@ typedef struct tor_tls_context_t { /** Structure that we use for a single certificate. */ struct tor_x509_cert_t { - X509 *cert; + struct x509_st *cert; uint8_t *encoded; size_t encoded_len; unsigned pkey_digests_set : 1; @@ -92,7 +97,7 @@ struct tor_x509_cert_t { struct tor_tls_t { uint32_t magic; tor_tls_context_t *context; /** A link to the context object for this tls. */ - SSL *ssl; /**< An OpenSSL SSL object. */ + struct ssl_st *ssl; /**< An OpenSSL SSL object. */ int socket; /**< The underlying file descriptor for this TLS connection. */ char *address; /**< An address to log when describing this connection. */ tor_tls_state_bitfield_t state : 3; /**< The current SSL state, @@ -128,35 +133,45 @@ struct tor_tls_t { STATIC int tor_errno_to_tls_error(int e); STATIC int tor_tls_get_error(tor_tls_t *tls, int r, int extra, const char *doing, int severity, int domain); -STATIC tor_tls_t *tor_tls_get_by_ssl(const SSL *ssl); +STATIC tor_tls_t *tor_tls_get_by_ssl(const struct ssl_st *ssl); STATIC void tor_tls_allocate_tor_tls_object_ex_data_index(void); +#ifdef TORTLS_OPENSSL_PRIVATE STATIC int always_accept_verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx); -STATIC int tor_tls_classify_client_ciphers(const SSL *ssl, +STATIC int tor_tls_classify_client_ciphers(const struct ssl_st *ssl, STACK_OF(SSL_CIPHER) *peer_ciphers); -STATIC int tor_tls_client_is_using_v2_ciphers(const SSL *ssl); +#endif +STATIC int tor_tls_client_is_using_v2_ciphers(const struct ssl_st *ssl); MOCK_DECL(STATIC void, try_to_extract_certs_from_tls, - (int severity, tor_tls_t *tls, X509 **cert_out, X509 **id_cert_out)); + (int severity, tor_tls_t *tls, struct x509_st **cert_out, + struct x509_st **id_cert_out)); #ifndef HAVE_SSL_SESSION_GET_MASTER_KEY -STATIC size_t SSL_SESSION_get_master_key(SSL_SESSION *s, uint8_t *out, +STATIC size_t SSL_SESSION_get_master_key(struct ssl_session_st *s, + uint8_t *out, size_t len); #endif -STATIC void tor_tls_debug_state_callback(const SSL *ssl, int type, int val); -STATIC void tor_tls_server_info_callback(const SSL *ssl, int type, int val); -STATIC int tor_tls_session_secret_cb(SSL *ssl, void *secret, +STATIC void tor_tls_debug_state_callback(const struct ssl_st *ssl, + int type, int val); +STATIC void tor_tls_server_info_callback(const struct ssl_st *ssl, + int type, int val); +#ifdef TORTLS_OPENSSL_PRIVATE +STATIC int tor_tls_session_secret_cb(struct ssl_st *ssl, void *secret, int *secret_len, STACK_OF(SSL_CIPHER) *peer_ciphers, CONST_IF_OPENSSL_1_1_API SSL_CIPHER **cipher, void *arg); STATIC int find_cipher_by_id(const SSL *ssl, const SSL_METHOD *m, uint16_t cipher); -MOCK_DECL(STATIC X509*, tor_tls_create_certificate,(crypto_pk_t *rsa, +#endif +MOCK_DECL(STATIC struct x509_st *, tor_tls_create_certificate, + (crypto_pk_t *rsa, crypto_pk_t *rsa_sign, const char *cname, const char *cname_sign, unsigned int cert_lifetime)); STATIC tor_tls_context_t *tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, unsigned flags, int is_client); -MOCK_DECL(STATIC tor_x509_cert_t *, tor_x509_cert_new,(X509 *x509_cert)); +MOCK_DECL(STATIC tor_x509_cert_t *, tor_x509_cert_new, + (struct x509_st *x509_cert)); STATIC int tor_tls_context_init_one(tor_tls_context_t **ppcontext, crypto_pk_t *identity, unsigned int key_lifetime, @@ -172,6 +187,11 @@ extern tor_tls_context_t *client_tls_context; extern uint16_t v2_cipher_list[]; extern uint64_t total_bytes_written_over_tls; extern uint64_t total_bytes_written_by_tls; + +STATIC tor_x509_cert_t *tor_x509_cert_replace_expiration( + const tor_x509_cert_t *inp, + time_t new_expiration_time, + crypto_pk_t *signing_key); #endif #endif /* endif TORTLS_PRIVATE */ diff --git a/src/common/util.c b/src/common/util.c index f980fa296c..ca2a0c4a9c 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -2118,7 +2118,7 @@ read_all(tor_socket_t fd, char *buf, size_t count, int isSocket) return -1; } - while (numread != count) { + while (numread < count) { if (isSocket) result = tor_socket_recv(fd, buf+numread, count-numread, 0); else @@ -3045,137 +3045,6 @@ unescape_string(const char *s, char **result, size_t *size_out) } } -/** Given a string containing part of a configuration file or similar format, - * advance past comments and whitespace and try to parse a single line. If we - * parse a line successfully, set *<b>key_out</b> to a new string holding the - * key portion and *<b>value_out</b> to a new string holding the value portion - * of the line, and return a pointer to the start of the next line. If we run - * out of data, return a pointer to the end of the string. If we encounter an - * error, return NULL and set *<b>err_out</b> (if provided) to an error - * message. - */ -const char * -parse_config_line_from_str_verbose(const char *line, char **key_out, - char **value_out, - const char **err_out) -{ - /* - See torrc_format.txt for a description of the (silly) format this parses. - */ - const char *key, *val, *cp; - int continuation = 0; - - tor_assert(key_out); - tor_assert(value_out); - - *key_out = *value_out = NULL; - key = val = NULL; - /* Skip until the first keyword. */ - while (1) { - while (TOR_ISSPACE(*line)) - ++line; - if (*line == '#') { - while (*line && *line != '\n') - ++line; - } else { - break; - } - } - - if (!*line) { /* End of string? */ - *key_out = *value_out = NULL; - return line; - } - - /* Skip until the next space or \ followed by newline. */ - key = line; - while (*line && !TOR_ISSPACE(*line) && *line != '#' && - ! (line[0] == '\\' && line[1] == '\n')) - ++line; - *key_out = tor_strndup(key, line-key); - - /* Skip until the value. */ - while (*line == ' ' || *line == '\t') - ++line; - - val = line; - - /* Find the end of the line. */ - if (*line == '\"') { // XXX No continuation handling is done here - if (!(line = unescape_string(line, value_out, NULL))) { - if (err_out) - *err_out = "Invalid escape sequence in quoted string"; - return NULL; - } - while (*line == ' ' || *line == '\t') - ++line; - if (*line == '\r' && *(++line) == '\n') - ++line; - if (*line && *line != '#' && *line != '\n') { - if (err_out) - *err_out = "Excess data after quoted string"; - return NULL; - } - } else { - /* Look for the end of the line. */ - while (*line && *line != '\n' && (*line != '#' || continuation)) { - if (*line == '\\' && line[1] == '\n') { - continuation = 1; - line += 2; - } else if (*line == '#') { - do { - ++line; - } while (*line && *line != '\n'); - if (*line == '\n') - ++line; - } else { - ++line; - } - } - - if (*line == '\n') { - cp = line++; - } else { - cp = line; - } - /* Now back cp up to be the last nonspace character */ - while (cp>val && TOR_ISSPACE(*(cp-1))) - --cp; - - tor_assert(cp >= val); - - /* Now copy out and decode the value. */ - *value_out = tor_strndup(val, cp-val); - if (continuation) { - char *v_out, *v_in; - v_out = v_in = *value_out; - while (*v_in) { - if (*v_in == '#') { - do { - ++v_in; - } while (*v_in && *v_in != '\n'); - if (*v_in == '\n') - ++v_in; - } else if (v_in[0] == '\\' && v_in[1] == '\n') { - v_in += 2; - } else { - *v_out++ = *v_in++; - } - } - *v_out = '\0'; - } - } - - if (*line == '#') { - do { - ++line; - } while (*line && *line != '\n'); - } - while (TOR_ISSPACE(*line)) ++line; - - return line; -} - /** Expand any homedir prefix on <b>filename</b>; return a newly allocated * string. */ char * @@ -4175,10 +4044,10 @@ tor_process_get_stdout_pipe(process_handle_t *process_handle) } #else /* DOCDOC tor_process_get_stdout_pipe */ -FILE * +int tor_process_get_stdout_pipe(process_handle_t *process_handle) { - return process_handle->stdout_handle; + return process_handle->stdout_pipe; } #endif @@ -4609,10 +4478,6 @@ tor_spawn_background(const char *const filename, const char **argv, log_warn(LD_GENERAL, "Failed to set stderror/stdout/stdin pipes " "nonblocking in parent process: %s", strerror(errno)); } - /* Open the buffered IO streams */ - process_handle->stdout_handle = fdopen(process_handle->stdout_pipe, "r"); - process_handle->stderr_handle = fdopen(process_handle->stderr_pipe, "r"); - process_handle->stdin_handle = fdopen(process_handle->stdin_pipe, "r"); *process_handle_out = process_handle; return process_handle->status; @@ -4659,14 +4524,9 @@ tor_process_handle_destroy,(process_handle_t *process_handle, if (process_handle->stdin_pipe) CloseHandle(process_handle->stdin_pipe); #else - if (process_handle->stdout_handle) - fclose(process_handle->stdout_handle); - - if (process_handle->stderr_handle) - fclose(process_handle->stderr_handle); - - if (process_handle->stdin_handle) - fclose(process_handle->stdin_handle); + close(process_handle->stdout_pipe); + close(process_handle->stderr_pipe); + close(process_handle->stdin_pipe); clear_waitpid_callback(process_handle->waitpid_cb); #endif @@ -4952,7 +4812,7 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count, if (count > SIZE_T_CEILING || count > SSIZE_MAX) return -1; - while (numread != count) { + while (numread < count) { /* Check if there is anything to read */ retval = PeekNamedPipe(h, NULL, 0, NULL, &byte_count, NULL); if (!retval) { @@ -4998,19 +4858,19 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count, return (ssize_t)numread; } #else -/** Read from a handle <b>h</b> into <b>buf</b>, up to <b>count</b> bytes. If +/** Read from a handle <b>fd</b> into <b>buf</b>, up to <b>count</b> bytes. If * <b>process</b> is NULL, the function will return immediately if there is * nothing more to read. Otherwise data will be read until end of file, or * <b>count</b> bytes are read. Returns the number of bytes read, or -1 on * error. Sets <b>eof</b> to true if <b>eof</b> is not NULL and the end of the * file has been reached. */ ssize_t -tor_read_all_handle(FILE *h, char *buf, size_t count, +tor_read_all_handle(int fd, char *buf, size_t count, const process_handle_t *process, int *eof) { size_t numread = 0; - char *retval; + ssize_t result; if (eof) *eof = 0; @@ -5018,34 +4878,28 @@ tor_read_all_handle(FILE *h, char *buf, size_t count, if (count > SIZE_T_CEILING || count > SSIZE_MAX) return -1; - while (numread != count) { - /* Use fgets because that is what we use in log_from_pipe() */ - retval = fgets(buf+numread, (int)(count-numread), h); - if (NULL == retval) { - if (feof(h)) { - log_debug(LD_GENERAL, "fgets() reached end of file"); - if (eof) - *eof = 1; + while (numread < count) { + result = read(fd, buf+numread, count-numread); + + if (result == 0) { + log_debug(LD_GENERAL, "read() reached end of file"); + if (eof) + *eof = 1; + break; + } else if (result < 0 && errno == EAGAIN) { + if (process) + continue; + else break; - } else { - if (EAGAIN == errno) { - if (process) - continue; - else - break; - } else { - log_warn(LD_GENERAL, "fgets() from handle failed: %s", - strerror(errno)); - return -1; - } - } + } else if (result < 0) { + log_warn(LD_GENERAL, "read() failed: %s", strerror(errno)); + return -1; } - tor_assert(retval != NULL); - tor_assert(strlen(retval) + numread <= count); - numread += strlen(retval); + + numread += result; } - log_debug(LD_GENERAL, "fgets() read %d bytes from handle", (int)numread); + log_debug(LD_GENERAL, "read() read %d bytes from handle", (int)numread); return (ssize_t)numread; } #endif @@ -5059,7 +4913,7 @@ tor_read_all_from_process_stdout(const process_handle_t *process_handle, return tor_read_all_handle(process_handle->stdout_pipe, buf, count, process_handle); #else - return tor_read_all_handle(process_handle->stdout_handle, buf, count, + return tor_read_all_handle(process_handle->stdout_pipe, buf, count, process_handle, NULL); #endif } @@ -5073,7 +4927,7 @@ tor_read_all_from_process_stderr(const process_handle_t *process_handle, return tor_read_all_handle(process_handle->stderr_pipe, buf, count, process_handle); #else - return tor_read_all_handle(process_handle->stderr_handle, buf, count, + return tor_read_all_handle(process_handle->stderr_pipe, buf, count, process_handle, NULL); #endif } @@ -5267,11 +5121,10 @@ log_from_handle(HANDLE *pipe, int severity) #else /** Return a smartlist containing lines outputted from - * <b>handle</b>. Return NULL on error, and set + * <b>fd</b>. Return NULL on error, and set * <b>stream_status_out</b> appropriately. */ MOCK_IMPL(smartlist_t *, -tor_get_lines_from_handle, (FILE *handle, - enum stream_status *stream_status_out)) +tor_get_lines_from_handle, (int fd, enum stream_status *stream_status_out)) { enum stream_status stream_status; char stdout_buf[400]; @@ -5280,13 +5133,13 @@ tor_get_lines_from_handle, (FILE *handle, while (1) { memset(stdout_buf, 0, sizeof(stdout_buf)); - stream_status = get_string_from_pipe(handle, + stream_status = get_string_from_pipe(fd, stdout_buf, sizeof(stdout_buf) - 1); if (stream_status != IO_STREAM_OKAY) goto done; if (!lines) lines = smartlist_new(); - smartlist_add_strdup(lines, stdout_buf); + smartlist_split_string(lines, stdout_buf, "\n", 0, 0); } done: @@ -5294,20 +5147,20 @@ tor_get_lines_from_handle, (FILE *handle, return lines; } -/** Read from stream, and send lines to log at the specified log level. +/** Read from fd, and send lines to log at the specified log level. * Returns 1 if stream is closed normally, -1 if there is a error reading, and * 0 otherwise. Handles lines from tor-fw-helper and * tor_spawn_background() specially. */ static int -log_from_pipe(FILE *stream, int severity, const char *executable, +log_from_pipe(int fd, int severity, const char *executable, int *child_status) { char buf[256]; enum stream_status r; for (;;) { - r = get_string_from_pipe(stream, buf, sizeof(buf) - 1); + r = get_string_from_pipe(fd, buf, sizeof(buf) - 1); if (r == IO_STREAM_CLOSED) { return 1; @@ -5332,7 +5185,7 @@ log_from_pipe(FILE *stream, int severity, const char *executable, } #endif -/** Reads from <b>stream</b> and stores input in <b>buf_out</b> making +/** Reads from <b>fd</b> and stores input in <b>buf_out</b> making * sure it's below <b>count</b> bytes. * If the string has a trailing newline, we strip it off. * @@ -5348,52 +5201,28 @@ log_from_pipe(FILE *stream, int severity, const char *executable, * IO_STREAM_OKAY: If everything went okay and we got a string * in <b>buf_out</b>. */ enum stream_status -get_string_from_pipe(FILE *stream, char *buf_out, size_t count) +get_string_from_pipe(int fd, char *buf_out, size_t count) { - char *retval; - size_t len; + ssize_t ret; tor_assert(count <= INT_MAX); - retval = fgets(buf_out, (int)count, stream); + ret = read(fd, buf_out, count); - if (!retval) { - if (feof(stream)) { - /* Program has closed stream (probably it exited) */ - /* TODO: check error */ - return IO_STREAM_CLOSED; - } else { - if (EAGAIN == errno) { - /* Nothing more to read, try again next time */ - return IO_STREAM_EAGAIN; - } else { - /* There was a problem, abandon this child process */ - return IO_STREAM_TERM; - } - } - } else { - len = strlen(buf_out); - if (len == 0) { - /* this probably means we got a NUL at the start of the string. */ - return IO_STREAM_EAGAIN; - } + if (ret == 0) + return IO_STREAM_CLOSED; + else if (ret < 0 && errno == EAGAIN) + return IO_STREAM_EAGAIN; + else if (ret < 0) + return IO_STREAM_TERM; - if (buf_out[len - 1] == '\n') { - /* Remove the trailing newline */ - buf_out[len - 1] = '\0'; - } else { - /* No newline; check whether we overflowed the buffer */ - if (!feof(stream)) - log_info(LD_GENERAL, - "Line from stream was truncated: %s", buf_out); - /* TODO: What to do with this error? */ - } - - return IO_STREAM_OKAY; - } + if (buf_out[ret - 1] == '\n') { + /* Remove the trailing newline */ + buf_out[ret - 1] = '\0'; + } else + buf_out[ret] = '\0'; - /* We should never get here */ - return IO_STREAM_TERM; + return IO_STREAM_OKAY; } /** Parse a <b>line</b> from tor-fw-helper and issue an appropriate @@ -5630,7 +5459,7 @@ tor_check_port_forwarding(const char *filename, #ifdef _WIN32 stderr_status = log_from_handle(child_handle->stderr_pipe, LOG_INFO); #else - stderr_status = log_from_pipe(child_handle->stderr_handle, + stderr_status = log_from_pipe(child_handle->stderr_pipe, LOG_INFO, filename, &retval); #endif if (handle_fw_helper_output(filename, child_handle) < 0) { diff --git a/src/common/util.h b/src/common/util.h index 13fcc5142d..18eb57f1bc 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -163,9 +163,9 @@ int64_t clamp_double_to_int64(double number); void simplify_fraction64(uint64_t *numer, uint64_t *denom); /* Compute the CEIL of <b>a</b> divided by <b>b</b>, for nonnegative <b>a</b> - * and positive <b>b</b>. Works on integer types only. Not defined if a+b can - * overflow. */ -#define CEIL_DIV(a,b) (((a)+(b)-1)/(b)) + * and positive <b>b</b>. Works on integer types only. Not defined if a+(b-1) + * can overflow. */ +#define CEIL_DIV(a,b) (((a)+((b)-1))/(b)) /* Return <b>v</b> if it's between <b>min</b> and <b>max</b>. Otherwise * return <b>min</b> if <b>v</b> is smaller than <b>min</b>, or <b>max</b> if @@ -322,7 +322,7 @@ enum stream_status { const char *stream_status_to_string(enum stream_status stream_status); -enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count); +enum stream_status get_string_from_pipe(int fd, char *buf, size_t count); MOCK_DECL(int,tor_unlink,(const char *pathname)); @@ -389,9 +389,6 @@ char *read_file_to_str_until_eof(int fd, size_t max_bytes_to_read, size_t *sz_out) ATTR_MALLOC; const char *unescape_string(const char *s, char **result, size_t *size_out); -const char *parse_config_line_from_str_verbose(const char *line, - char **key_out, char **value_out, - const char **err_out); char *expand_filename(const char *filename); MOCK_DECL(struct smartlist_t *, tor_listdir, (const char *dirname)); int path_is_relative(const char *filename); @@ -463,9 +460,6 @@ struct process_handle_t { int stdin_pipe; int stdout_pipe; int stderr_pipe; - FILE *stdin_handle; - FILE *stdout_handle; - FILE *stderr_handle; pid_t pid; /** If the process has not given us a SIGCHLD yet, this has the * waitpid_callback_t that gets invoked once it has. Otherwise this @@ -488,7 +482,7 @@ int tor_split_lines(struct smartlist_t *sl, char *buf, int len); ssize_t tor_read_all_handle(HANDLE h, char *buf, size_t count, const process_handle_t *process); #else -ssize_t tor_read_all_handle(FILE *h, char *buf, size_t count, +ssize_t tor_read_all_handle(int fd, char *buf, size_t count, const process_handle_t *process, int *eof); #endif @@ -502,7 +496,7 @@ int tor_process_get_pid(process_handle_t *process_handle); #ifdef _WIN32 HANDLE tor_process_get_stdout_pipe(process_handle_t *process_handle); #else -FILE *tor_process_get_stdout_pipe(process_handle_t *process_handle); +int tor_process_get_stdout_pipe(process_handle_t *process_handle); #endif #ifdef _WIN32 @@ -511,7 +505,7 @@ tor_get_lines_from_handle,(HANDLE *handle, enum stream_status *stream_status)); #else MOCK_DECL(struct smartlist_t *, -tor_get_lines_from_handle,(FILE *handle, +tor_get_lines_from_handle,(int fd, enum stream_status *stream_status)); #endif diff --git a/src/common/util_bug.c b/src/common/util_bug.c index c7bfdefe80..3d990e3700 100644 --- a/src/common/util_bug.c +++ b/src/common/util_bug.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/util_bug.h b/src/common/util_bug.h index e02778110b..7879f880ec 100644 --- a/src/common/util_bug.h +++ b/src/common/util_bug.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/util_format.c b/src/common/util_format.c index 6e0a04586a..1f7b8b03aa 100644 --- a/src/common/util_format.c +++ b/src/common/util_format.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -22,13 +22,16 @@ #include <stdlib.h> /* Return the base32 encoded size in bytes using the source length srclen. - * The NUL terminated byte is added as well since every base32 encoding - * requires enough space for it. */ + * + * (WATCH OUT: This API counts the terminating NUL byte, but + * base64_encode_size does not.) + */ size_t base32_encoded_size(size_t srclen) { size_t enclen; - enclen = CEIL_DIV(srclen*8, 5) + 1; + tor_assert(srclen < SIZE_T_CEILING / 8); + enclen = BASE32_NOPAD_BUFSIZE(srclen); tor_assert(enclen < INT_MAX && enclen > srclen); return enclen; } @@ -41,7 +44,6 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen) size_t nbits = srclen * 8; size_t bit; - tor_assert(srclen < SIZE_T_CEILING/8); /* We need enough space for the encoded data and the extra NUL byte. */ tor_assert(base32_encoded_size(srclen) <= destlen); tor_assert(destlen < SIZE_T_CEILING); @@ -51,9 +53,10 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen) for (i=0,bit=0; bit < nbits; ++i, bit+=5) { /* set v to the 16-bit value starting at src[bits/8], 0-padded. */ - v = ((uint8_t)src[bit/8]) << 8; - if (bit+5<nbits) - v += (uint8_t)src[(bit/8)+1]; + size_t idx = bit / 8; + v = ((uint8_t)src[idx]) << 8; + if (idx+1 < srclen) + v += (uint8_t)src[idx+1]; /* set u to the 5-bit value at the bit'th bit of buf. */ u = (v >> (11-(bit%8))) & 0x1F; dest[i] = BASE32_CHARS[u]; @@ -133,6 +136,9 @@ base32_decode(char *dest, size_t destlen, const char *src, size_t srclen) /** Return the Base64 encoded size of <b>srclen</b> bytes of data in * bytes. * + * (WATCH OUT: This API <em>does not</em> count the terminating NUL byte, + * but base32_encoded_size does.) + * * If <b>flags</b>&BASE64_ENCODE_MULTILINE is true, return the size * of the encoded output as multiline output (64 character, `\n' terminated * lines). @@ -141,19 +147,16 @@ size_t base64_encode_size(size_t srclen, int flags) { size_t enclen; + + /* Use INT_MAX for overflow checking because base64_encode() returns int. */ tor_assert(srclen < INT_MAX); + tor_assert(CEIL_DIV(srclen, 3) < INT_MAX / 4); - if (srclen == 0) - return 0; + enclen = BASE64_LEN(srclen); + if (flags & BASE64_ENCODE_MULTILINE) + enclen += CEIL_DIV(enclen, BASE64_OPENSSL_LINELEN); - enclen = ((srclen - 1) / 3) * 4 + 4; - if (flags & BASE64_ENCODE_MULTILINE) { - size_t remainder = enclen % BASE64_OPENSSL_LINELEN; - enclen += enclen / BASE64_OPENSSL_LINELEN; - if (remainder) - enclen++; - } - tor_assert(enclen < INT_MAX && enclen > srclen); + tor_assert(enclen < INT_MAX && (enclen == 0 || enclen > srclen)); return enclen; } @@ -310,39 +313,6 @@ base64_encode_nopad(char *dest, size_t destlen, return (int)(out - dest); } -/** As base64_decode, but do not require any padding on the input */ -int -base64_decode_nopad(uint8_t *dest, size_t destlen, - const char *src, size_t srclen) -{ - if (srclen > SIZE_T_CEILING - 4) - return -1; - char *buf = tor_malloc(srclen + 4); - memcpy(buf, src, srclen+1); - size_t buflen; - switch (srclen % 4) - { - case 0: - default: - buflen = srclen; - break; - case 1: - tor_free(buf); - return -1; - case 2: - memcpy(buf+srclen, "==", 3); - buflen = srclen + 2; - break; - case 3: - memcpy(buf+srclen, "=", 2); - buflen = srclen + 1; - break; - } - int n = base64_decode((char*)dest, destlen, buf, buflen); - tor_free(buf); - return n; -} - #undef BASE64_OPENSSL_LINELEN /** @{ */ @@ -392,15 +362,9 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) const char *eos = src+srclen; uint32_t n=0; int n_idx=0; - char *dest_orig = dest; + size_t di = 0; - /* Max number of bits == srclen*6. - * Number of bytes required to hold all bits == (srclen*6)/8. - * Yes, we want to round down: anything that hangs over the end of a - * byte is padding. */ - if (!size_mul_check(srclen, 3) || destlen < (srclen*3)/4) - return -1; - if (destlen > SIZE_T_CEILING) + if (destlen > INT_MAX) return -1; /* Make sure we leave no uninitialized data in the destination buffer. */ @@ -428,9 +392,11 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) n = (n<<6) | v; if ((++n_idx) == 4) { /* We've accumulated 24 bits in n. Flush them. */ - *dest++ = (n>>16); - *dest++ = (n>>8) & 0xff; - *dest++ = (n) & 0xff; + if (destlen < 3 || di > destlen - 3) + return -1; + dest[di++] = (n>>16); + dest[di++] = (n>>8) & 0xff; + dest[di++] = (n) & 0xff; n_idx = 0; n = 0; } @@ -448,18 +414,21 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) return -1; case 2: /* 12 leftover bits: The last 4 are padding and the first 8 are data. */ - *dest++ = n >> 4; + if (destlen < 1 || di > destlen - 1) + return -1; + dest[di++] = n >> 4; break; case 3: /* 18 leftover bits: The last 2 are padding and the first 16 are data. */ - *dest++ = n >> 10; - *dest++ = n >> 2; + if (destlen < 2 || di > destlen - 2) + return -1; + dest[di++] = n >> 10; + dest[di++] = n >> 2; } - tor_assert((dest-dest_orig) <= (ssize_t)destlen); - tor_assert((dest-dest_orig) <= INT_MAX); + tor_assert(di <= destlen); - return (int)(dest-dest_orig); + return (int)di; } #undef X #undef SP @@ -475,7 +444,8 @@ base16_encode(char *dest, size_t destlen, const char *src, size_t srclen) const char *end; char *cp; - tor_assert(destlen >= srclen*2+1); + tor_assert(srclen < SIZE_T_CEILING / 2 - 1); + tor_assert(destlen >= BASE16_BUFSIZE(srclen)); tor_assert(destlen < SIZE_T_CEILING); /* Make sure we leave no uninitialized data in the destination buffer. */ diff --git a/src/common/util_format.h b/src/common/util_format.h index 20ac711d10..adf48c0077 100644 --- a/src/common/util_format.h +++ b/src/common/util_format.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_UTIL_FORMAT_H @@ -10,6 +10,26 @@ #include "testsupport.h" #include "torint.h" +/** @{ */ +/** These macros don't check for overflow. Use them only for constant inputs + * (like array declarations). The *_LEN macros are the raw encoding lengths + * (without terminating NUL), while the *_BUFSIZE macros count the terminating + * NUL. */ +#define BASE64_LEN(n) (CEIL_DIV((n), 3) * 4) +#define BASE32_LEN(n) (CEIL_DIV((n), 5) * 8) +#define BASE16_LEN(n) ((n) * 2) + +#define BASE64_BUFSIZE(n) (BASE64_LEN(n) + 1) +#define BASE32_BUFSIZE(n) (BASE32_LEN(n) + 1) +#define BASE16_BUFSIZE(n) (BASE16_LEN(n) + 1) + +#define BASE64_NOPAD_LEN(n) (CEIL_DIV((n) * 4, 3) +#define BASE32_NOPAD_LEN(n) (CEIL_DIV((n) * 8, 5) + +#define BASE64_NOPAD_BUFSIZE(n) (BASE64_NOPAD_LEN(n) + 1)) +#define BASE32_NOPAD_BUFSIZE(n) (BASE32_NOPAD_LEN(n) + 1)) +/** @} */ + #define BASE64_ENCODE_MULTILINE 1 size_t base64_encode_size(size_t srclen, int flags); int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen, @@ -17,8 +37,6 @@ int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen, int base64_decode(char *dest, size_t destlen, const char *src, size_t srclen); int base64_encode_nopad(char *dest, size_t destlen, const uint8_t *src, size_t srclen); -int base64_decode_nopad(uint8_t *dest, size_t destlen, - const char *src, size_t srclen); /** Characters that can appear (case-insensitively) in a base32 encoding. */ #define BASE32_CHARS "abcdefghijklmnopqrstuvwxyz234567" diff --git a/src/common/util_process.c b/src/common/util_process.c index abda63720c..9e9679b099 100644 --- a/src/common/util_process.c +++ b/src/common/util_process.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/util_process.h b/src/common/util_process.h index d38301a354..c3a63498b5 100644 --- a/src/common/util_process.h +++ b/src/common/util_process.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/workqueue.c b/src/common/workqueue.c index e1fb663a2a..ec6e257b4c 100644 --- a/src/common/workqueue.c +++ b/src/common/workqueue.c @@ -510,12 +510,13 @@ replyqueue_get_socket(replyqueue_t *rq) void replyqueue_process(replyqueue_t *queue) { - if (queue->alert.drain_fn(queue->alert.read_fd) < 0) { + int r = queue->alert.drain_fn(queue->alert.read_fd); + if (r < 0) { //LCOV_EXCL_START static ratelim_t warn_limit = RATELIM_INIT(7200); log_fn_ratelim(&warn_limit, LOG_WARN, LD_GENERAL, "Failure from drain_fd: %s", - tor_socket_strerror(tor_socket_errno(queue->alert.read_fd))); + tor_socket_strerror(-r)); //LCOV_EXCL_STOP } diff --git a/src/common/workqueue.h b/src/common/workqueue.h index 54276767b0..7b483eb7ac 100644 --- a/src/common/workqueue.h +++ b/src/common/workqueue.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_WORKQUEUE_H @@ -16,7 +16,7 @@ typedef struct threadpool_s threadpool_t; typedef struct workqueue_entry_s workqueue_entry_t; /** Possible return value from a work function: */ -typedef enum { +typedef enum workqueue_reply_t { WQ_RPL_REPLY = 0, /** indicates success */ WQ_RPL_ERROR = 1, /** indicates fatal error */ WQ_RPL_SHUTDOWN = 2, /** indicates thread is shutting down */ diff --git a/src/config/geoip b/src/config/geoip index 90e7f4c43e..4be9acd55a 100644 --- a/src/config/geoip +++ b/src/config/geoip @@ -1,4 +1,4 @@ -# Last updated based on February 8 2017 Maxmind GeoLite2 Country +# Last updated based on April 4 2017 Maxmind GeoLite2 Country # wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz # gunzip GeoLite2-Country.mmdb.gz # python mmdb-convert.py GeoLite2-Country.mmdb @@ -39,17 +39,23 @@ 18219008,18350079,IN 18350080,18874367,CN 18874368,18907135,MY -18907136,18924031,SG +18907136,18923519,SG +18923520,18924031,HK 18924032,18924287,TW -18924288,18924799,SG +18924288,18924799,HK 18924800,18925055,TW -18925056,18926079,SG +18925056,18925567,HK +18925568,18926079,SG 18926080,18926207,TW 18926208,18926335,SG 18926336,18926463,TW 18926464,18926591,SG 18926592,18926719,TW -18926720,18939903,SG +18926720,18927615,SG +18927616,18929663,TW +18929664,18931711,KR +18931712,18933759,JP +18933760,18939903,SG 18939904,19005439,JP 19005440,19005440,CN 19005441,19136511,TW @@ -167,11 +173,17 @@ 48234496,49283071,IT 49283072,49807359,DE 49807360,50331647,SE -50331648,68182079,US +50331648,68118783,US +68118784,68119039,CA +68119040,68169727,US +68169728,68171775,CA +68171776,68182079,US 68182080,68182095,GB 68182096,68305407,US 68305408,68305919,MX -68305920,69342463,US +68305920,68978687,US +68978688,68980735,CA +68980736,69342463,US 69342464,69342719,GB 69342720,69370367,US 69370368,69370373,CA @@ -221,7 +233,8 @@ 84418560,84418815,UA 84418816,84419071,RU 84419072,84419327,UA -84419328,84420607,RU +84419328,84419583,NL +84419584,84420607,RU 84420608,84421631,GB 84421632,84421759,MX 84421760,84421887,PA @@ -298,7 +311,7 @@ 85395456,85395711,TR 85395968,85396223,LU 85396480,85397503,ES -85398528,85398783,SA +85398528,85399039,SA 85399552,85400063,FR 85400576,85400583,ES 85401600,85403647,IT @@ -596,7 +609,9 @@ 86467208,86467211,IE 86467212,86467320,FR 86467321,86467321,FI -86467322,86467999,FR +86467322,86467535,FR +86467536,86467543,IT +86467544,86467999,FR 86468000,86468003,PL 86468004,86468055,FR 86468056,86468056,DE @@ -678,9 +693,7 @@ 86497280,86499327,NL 86499328,86503423,FR 86503424,86505471,DE -86505472,86505727,GB -86505728,86505983,US -86505984,86507519,GB +86505472,86507519,GB 86507520,86573055,ES 86573056,86638591,SA 86638592,86671359,RU @@ -702,7 +715,9 @@ 86769664,86773759,RU 86773760,86777855,GB 86777856,86779903,AZ -86779904,86786047,RU +86779904,86781183,RU +86781184,86781439,NL +86781440,86786047,RU 86786048,86788095,NO 86788096,86790143,NL 86790144,86794239,TR @@ -814,7 +829,9 @@ 87755520,87755775,KG 87755776,87756799,RU 87756800,87758847,ES -87758848,87761919,RU +87758848,87761407,RU +87761408,87761663,CZ +87761664,87761919,RU 87761920,87762431,FR 87762432,87762943,UA 87762944,87763967,KZ @@ -852,7 +869,9 @@ 87959552,87960063,DE 87960064,87960575,GB 87960576,87962111,US -87962112,87965695,GB +87962112,87962623,GB +87962624,87963647,CZ +87963648,87965695,GB 87965696,87967743,DE 87967744,87969791,IT 87969792,87970815,IM @@ -934,15 +953,12 @@ 90503168,90505215,IL 90505216,90515455,RU 90515456,90516479,GB -90516480,90516735,DE +90516480,90516735,DK 90516736,90516991,RO -90516992,90517503,NL +90516992,90517503,FR 90517504,90518527,GB 90518528,90529791,RU -90529792,90533119,NL -90533120,90533375,DE -90533376,90533631,NL -90533632,90533887,GB +90529792,90533887,NL 90533888,90537983,EE 90537984,90540031,RU 90540032,90544127,GB @@ -1269,9 +1285,11 @@ 92750912,92750943,PT 92750944,92751243,FR 92751244,92751247,ES -92751248,92751711,FR -92751712,92751712,DE -92751713,92752031,FR +92751248,92751631,FR +92751632,92751647,CH +92751648,92751711,FR +92751712,92751807,DE +92751808,92752031,FR 92752032,92752063,FI 92752064,92753079,FR 92753080,92753087,ES @@ -1320,7 +1338,9 @@ 92762056,92762059,GB 92762060,92762127,FR 92762128,92762135,ES -92762136,92762383,FR +92762136,92762279,FR +92762280,92762283,GB +92762284,92762383,FR 92762384,92762391,ES 92762392,92762719,FR 92762720,92762751,PT @@ -1428,7 +1448,9 @@ 92794692,92794695,ES 92794696,92795631,FR 92795632,92795639,CZ -92795640,92796687,FR +92795640,92796575,FR +92796576,92796579,GB +92796580,92796687,FR 92796688,92796691,DE 92796692,92796879,FR 92796880,92796895,FI @@ -1459,7 +1481,8 @@ 93417472,93419519,IR 93419520,93421567,IT 93421568,93425663,DE -93425664,93426687,GI +93425664,93426183,SE +93426184,93426687,GI 93426688,93427085,DE 93427087,93427711,DE 93427712,93429759,NO @@ -1495,7 +1518,9 @@ 93715968,93716479,NL 93716480,93749247,GB 93749248,93753343,IT -93753344,93765631,GB +93753344,93756415,GB +93756416,93757439,FR +93757440,93765631,GB 93765632,93774847,SE 93774848,93775871,NO 93775872,93782015,SE @@ -1547,7 +1572,9 @@ 94043136,94044159,RO 94044160,94109695,SY 94109696,94175231,SA -94175232,94176511,SE +94175232,94175487,SE +94175488,94175743,CZ +94175744,94176511,SE 94176512,94176767,US 94176768,94177535,SE 94177536,94177791,IT @@ -1564,7 +1591,9 @@ 94183424,94183935,RU 94183936,94184191,SE 94184192,94184447,RU -94184448,94187007,SE +94184448,94186239,SE +94186240,94186495,IT +94186496,94187007,SE 94187008,94187263,GB 94187264,94187775,SE 94187776,94188031,NO @@ -1775,10 +1804,15 @@ 96172800,96173055,GP 96173056,96174079,MF 96174080,96206847,HU -96206848,96247807,RU +96206848,96245759,RU +96245760,96246783,KZ +96246784,96247807,RU 96247808,96248831,NL -96248832,96258047,RU -96258048,96260095,NL +96248832,96259071,RU +96259072,96259327,NL +96259328,96259583,RO +96259584,96259839,US +96259840,96260095,NL 96260096,96262143,RU 96262144,96262399,NL 96262400,96264191,RU @@ -1809,12 +1843,15 @@ 96325632,96327679,RU 96327680,96327935,NL 96327936,96328191,RO -96328192,96329727,RU +96328192,96328447,US +96328448,96328703,UA +96328704,96329727,RU 96329728,96333823,GB 96333824,96335871,RU 96335872,96336895,NL -96336896,96337151,US -96337152,96337919,NL +96336896,96337151,CZ +96337152,96337663,NL +96337664,96337919,US 96337920,96403455,IR 96403456,96468991,AZ 96468992,96731135,AE @@ -1885,7 +1922,11 @@ 96764384,96764399,FI 96764400,96766063,FR 96766064,96766079,ES -96766080,96766911,FR +96766080,96766259,FR +96766260,96766263,ES +96766264,96766267,FR +96766268,96766271,ES +96766272,96766911,FR 96766912,96766915,GB 96766916,96767031,FR 96767032,96767035,GB @@ -2044,7 +2085,9 @@ 97437696,97439743,AT 97439744,97444863,NL 97444864,97445887,PT -97445888,97447935,RS +97445888,97446911,RS +97446912,97447167,XK +97447168,97447935,RS 97447936,97452031,PL 97452032,97517567,UA 97517568,98566143,IR @@ -2227,7 +2270,9 @@ 100559872,100559935,US 100559936,100560127,RO 100560128,100560383,US -100560384,100560639,RO +100560384,100560455,RO +100560456,100560463,US +100560464,100560639,RO 100560640,100560643,US 100560644,100560727,RO 100560728,100560751,US @@ -2267,18 +2312,37 @@ 100663296,121195295,US 121195296,121195327,IT 121195328,134221823,US -134221824,134221824,DE -134221825,134222335,US -134222336,134222336,DE -134222337,134223871,US -134223872,134223872,GB -134223873,134224383,US -134224384,134224384,GB -134224385,134247423,US +134221824,134222079,DE +134222080,134222335,US +134222336,134222379,DE +134222380,134222380,US +134222381,134222404,DE +134222405,134222405,US +134222406,134222452,DE +134222453,134222453,US +134222454,134222476,DE +134222477,134222477,US +134222478,134222523,DE +134222524,134222524,US +134222525,134222526,DE +134222527,134222527,US +134222528,134222538,DE +134222539,134222539,US +134222540,134222556,DE +134222557,134222557,US +134222558,134222591,DE +134222592,134223871,US +134223872,134224127,GB +134224128,134224383,US +134224384,134224639,GB +134224640,134227967,US +134227968,134228223,SG +134228224,134228479,JP +134228480,134247423,US 134247424,134247424,DE -134247425,134445823,US -134445824,134445887,GU -134445888,134738943,US +134247425,134443007,US +134443008,134447103,GU +134447104,134738943,US 134738944,134739199,CA 134739200,135192575,US 135192576,135200767,MX @@ -2302,13 +2366,17 @@ 135776256,135778303,GU 135778304,135792639,US 135792640,135794687,CA -135794688,135945727,US +135794688,135925759,US +135925760,135926783,VI +135926784,135945727,US 135945728,135945983,CA 135945984,136054015,US 136054016,136054271,GB 136054272,136175615,US 136175616,136175871,CA -136175872,136237055,US +136175872,136176383,US +136176384,136176639,CA +136176640,136237055,US 136237056,136239103,CA 136239104,136404991,US 136404992,136407039,CA @@ -2335,9 +2403,7 @@ 204047872,204047999,PR 204048000,204048031,US 204048032,204048047,PR -204048048,208304383,US -208304384,208304639,CA -208304640,209921023,US +204048048,209921023,US 209921024,209921279,AU 209921280,212086271,US 212086272,212086527,AR @@ -2349,10 +2415,16 @@ 214698304,214698311,VI 214698312,214777855,US 214777856,214782975,PR -214782976,219187465,US +214782976,214787583,US +214787584,214787711,PR +214787712,214787839,US +214787840,214788095,PR +214788096,219187465,US 219187468,219249919,US 219249920,219250175,GB -219250176,221642751,US +219250176,219512063,US +219512064,219512319,GB +219512320,221642751,US 221642752,221773823,AU 221773824,222494719,US 222494720,222527487,SG @@ -2440,11 +2512,24 @@ 225080896,225081855,US 225081856,225082367,AU 225082368,225082879,GB -225082880,225443839,US +225082880,225084415,US +225084416,225085439,FR +225085440,225085951,NL +225085952,225086463,FR +225086464,225086975,NL +225086976,225087487,FR +225087488,225088511,US +225088512,225089023,SG +225089024,225089535,IE +225089536,225443839,US 225443840,225705983,JP 225705984,226230271,US 226230272,226295807,KR -226295808,234881023,US +226295808,231866367,US +231866368,231997439,AU +231997440,233046015,US +233046016,233177087,SG +233177088,234881023,US 234881024,234883071,CN 234883072,234884095,JP 234884096,234885119,CN @@ -2466,7 +2551,7 @@ 234950656,234951679,AU 234951680,234952703,HK 234952704,234953727,CN -234953728,234954751,SG +234953728,234954751,US 234954752,234958591,NZ 234958592,234958847,AU 234958848,234971135,NZ @@ -2815,19 +2900,11 @@ 385939968,385940479,NL 385940480,385942527,US 385942528,385943551,NL -385943552,385950719,US -385950720,385951743,NL -385951744,385957887,US +385943552,385957887,US 385957888,385961983,NL -385961984,386002431,US -386002432,386002943,NL -386002944,386003199,US +385961984,386003199,US 386003200,386003967,NL -386003968,386006015,US -386006016,386007039,NL -386007040,386010623,US -386010624,386011135,NL -386011136,386012159,US +386003968,386012159,US 386012160,386012671,NL 386012672,386013183,US 386013184,386013695,NL @@ -2849,13 +2926,9 @@ 386088960,386089983,NL 386089984,386095615,US 386095616,386096127,NL -386096128,386100735,US -386100736,386101247,NL -386101248,386109439,US +386096128,386109439,US 386109440,386113535,NL -386113536,386125823,US -386125824,386134015,NL -386134016,386191359,US +386113536,386191359,US 386191360,386195455,NL 386195456,386201599,US 386201600,386203135,NL @@ -2870,20 +2943,14 @@ 386245632,386247679,US 386247680,386248703,NL 386248704,386297855,US -386297856,386301951,NL +386297856,386298879,NL +386298880,386300415,US +386300416,386301951,NL 386301952,386383871,US 386383872,386387967,NL -386387968,386398207,US -386398208,386398719,NL -386398720,386398975,US -386398976,386399231,NL -386399232,386400255,US +386387968,386400255,US 386400256,386404351,NL -386404352,386408447,US -386408448,386412543,NL -386412544,386453503,US -386453504,386457599,NL -386457600,386465791,US +386404352,386465791,US 386465792,386469887,NL 386469888,386498559,US 386498560,386502655,NL @@ -2892,26 +2959,22 @@ 386523136,386593279,US 386593280,386594815,NL 386594816,386595071,US -386595072,386596095,NL -386596096,386613247,US -386613248,386617343,NL -386617344,386656255,US +386595072,386595327,NL +386595328,386595583,US +386595584,386596095,NL +386596096,386656255,US 386656256,386656511,NL 386656512,386662399,US -386662400,386670591,NL -386670592,386682879,US +386662400,386666495,NL +386666496,386682879,US 386682880,386691071,NL -386691072,386711551,US -386711552,386715647,NL -386715648,386736127,US -386736128,386744319,NL -386744320,386774527,US +386691072,386736127,US +386736128,386740223,NL +386740224,386774527,US 386774528,386775039,NL 386775040,386783231,US 386783232,386783743,NL -386783744,386784255,US -386784256,386785279,NL -386785280,386789375,US +386783744,386789375,US 386789376,386797567,NL 386797568,386816511,US 386816512,386818047,NL @@ -2919,22 +2982,16 @@ 386826752,386827263,NL 386827264,386828287,US 386828288,386829311,NL -386829312,386842623,US -386842624,386846719,NL -386846720,386862079,US +386829312,386862079,US 386862080,386862335,JP 386862336,386862591,KR 386862592,386868735,US 386868736,386868991,NL 386868992,386875391,US 386875392,386879487,NL -386879488,386887679,US -386887680,386891775,NL -386891776,386892799,US +386879488,386892799,US 386892800,386893311,NL -386893312,386904063,US -386904064,386905087,NL -386905088,386923519,US +386893312,386923519,US 386923520,386924543,NL 386924544,387055615,CA 387055616,387121151,PR @@ -2943,11 +3000,11 @@ 387833856,387975167,US 387975168,387976191,NL 387976192,387976703,US -387976704,387978751,NL -387978752,387979263,US -387979264,387980799,NL -387980800,387985407,US -387985408,387996159,NL +387976704,387977727,NL +387977728,387979263,US +387979264,387980287,NL +387980288,387994623,US +387994624,387996159,NL 387996160,387997695,US 387997696,388005887,NL 388005888,388029439,US @@ -2972,27 +3029,25 @@ 388206592,388207103,NL 388207104,388207871,US 388207872,388208127,NL -388208128,388222975,US -388222976,388227071,NL -388227072,388272127,US +388208128,388223999,US +388224000,388225023,NL +388225024,388272127,US 388272128,388284415,NL 388284416,388288511,US 388288512,388293631,NL 388293632,388294143,US -388294144,388300799,NL -388300800,388308991,US +388294144,388296703,NL +388296704,388308991,US 388308992,388317183,NL 388317184,388325375,US 388325376,388329471,NL 388329472,388341759,US 388341760,388345855,NL -388345856,388354047,US -388354048,388358143,NL -388358144,388366335,US +388345856,388366335,US 388366336,388392447,NL 388392448,388397055,US -388397056,388399103,NL -388399104,388419583,US +388397056,388398079,NL +388398080,388419583,US 388419584,388423679,NL 388423680,388440063,US 388440064,388444159,NL @@ -3004,11 +3059,7 @@ 388481024,388485119,NL 388485120,388493311,US 388493312,388501503,NL -388501504,388513791,US -388513792,388514915,NL -388514916,388514916,US -388514917,388517887,NL -388517888,388526079,US +388501504,388526079,US 388526080,388530175,NL 388530176,388538367,US 388538368,388542463,NL @@ -3032,17 +3083,15 @@ 388788224,388792319,NL 388792320,388812799,US 388812800,388816895,NL -388816896,388842239,US -388842240,388842495,NL -388842496,388843519,US +388816896,388843519,US 388843520,388844543,NL -388844544,388844799,US -388844800,388845055,NL -388845056,388849663,US +388844544,388849663,US 388849664,388853759,NL 388853760,388857855,US -388857856,388878335,NL -388878336,388885503,US +388857856,388863999,NL +388864000,388866047,US +388866048,388870143,NL +388870144,388885503,US 388885504,388890623,NL 388890624,388893695,US 388893696,388894719,NL @@ -3064,13 +3113,11 @@ 389044224,389045247,NL 389045248,389060607,US 389060608,389061631,NL -389061632,389070847,US -389070848,389078015,NL +389061632,389074943,US +389074944,389078015,NL 389078016,389079039,US 389079040,389083135,NL -389083136,389090303,US -389090304,389091327,NL -389091328,389102079,US +389083136,389102079,US 389102080,389102591,NL 389102592,389136383,US 389136384,389140479,NL @@ -3082,37 +3129,33 @@ 389185536,389201919,NL 389201920,389242879,US 389242880,389251071,NL -389251072,389259263,US -389259264,389267455,NL -389267456,389271551,US -389271552,389292031,NL +389251072,389273599,US +389273600,389283839,NL +389283840,389287935,US +389287936,389292031,NL 389292032,389296127,US 389296128,389300223,NL 389300224,389319167,US 389319168,389319679,NL 389319680,389320191,US 389320192,389320447,NL -389320448,389328895,US -389328896,389341183,NL +389320448,389332991,US +389332992,389341183,NL 389341184,389349375,US 389349376,389365759,NL -389365760,389390335,US -389390336,389398527,NL -389398528,389402623,US -389402624,389419007,NL +389365760,389410815,US +389410816,389419007,NL 389419008,389435391,US -389435392,389455871,NL -389455872,389480447,US -389480448,389484543,NL -389484544,389495295,US +389435392,389443583,NL +389443584,389447679,US +389447680,389455871,NL +389455872,389495295,US 389495296,389495807,NL 389495808,389509119,US 389509120,389513215,NL 389513216,389515263,US 389515264,389521407,NL -389521408,389537791,US -389537792,389541887,NL -389541888,389554175,US +389521408,389554175,US 389554176,389562367,NL 389562368,389611519,US 389611520,389619711,NL @@ -3120,19 +3163,17 @@ 389628416,389628927,NL 389628928,389631999,US 389632000,389641215,NL -389641216,389701119,US -389701120,389701631,NL -389701632,389730303,US +389641216,389730303,US 389730304,389734399,NL -389734400,389754879,US -389754880,389765631,NL +389734400,389764095,US +389764096,389765631,NL 389765632,389767167,US 389767168,389775359,NL 389775360,389812223,US 389812224,389816319,NL 389816320,389825791,US -389825792,389826559,NL -389826560,389852159,US +389825792,389826047,NL +389826048,389852159,US 389852160,389853183,NL 389853184,389857279,US 389857280,389873663,NL @@ -3142,17 +3183,13 @@ 389924864,389925375,NL 389925376,389926911,US 389926912,389936127,NL -389936128,389937151,US -389937152,389937663,NL -389937664,389937919,US -389937920,389938175,NL -389938176,389938687,US -389938688,389940223,NL +389936128,389937407,US +389937408,389937663,NL +389937664,389939711,US +389939712,389940223,NL 389940224,389941503,US 389941504,389941759,NL -389941760,389952767,US -389952768,389953023,NL -389953024,389954815,US +389941760,389954815,US 389954816,389955071,NL 389955072,389964287,US 389964288,389966335,NL @@ -3169,12 +3206,10 @@ 389992448,389996543,US 389996544,389996799,NL 389996800,389996800,SG -389996801,389999871,US -389999872,390000127,NL -390000128,390011903,US -390011904,390012927,NL -390012928,390021119,US -390021120,390030847,NL +389996801,390026751,US +390026752,390029311,NL +390029312,390029823,US +390029824,390030847,NL 390030848,390033407,US 390033408,390043135,NL 390043136,390063615,US @@ -3195,9 +3230,7 @@ 390143232,390148095,NL 390148096,390165503,US 390165504,390166527,NL -390166528,390181887,US -390181888,390182143,NL -390182144,390184959,US +390166528,390184959,US 390184960,390193151,NL 390193152,390205439,US 390205440,390209535,NL @@ -3212,8 +3245,8 @@ 390279168,390284799,US 390284800,390285311,NL 390285312,390286847,US -390286848,390295551,NL -390295552,390299647,US +390286848,390291455,NL +390291456,390299647,US 390299648,390304767,NL 390304768,390332159,US 390332160,390332415,GB @@ -3221,9 +3254,7 @@ 390731776,390732031,NL 390732032,390732287,US 390732288,390732799,NL -390732800,390733823,US -390733824,390737919,NL -390737920,390746111,US +390732800,390746111,US 390746112,390758399,NL 390758400,390767615,US 390767616,390768639,NL @@ -3233,15 +3264,9 @@ 390972928,390973951,NL 390973952,390975487,US 390975488,390976511,NL -390976512,390980607,US -390980608,390981631,NL -390981632,390985727,US -390985728,390987775,NL -390987776,390995967,US +390976512,390995967,US 390995968,391020543,NL -391020544,391081983,US -391081984,391086079,NL -391086080,391110655,US +391020544,391110655,US 391110656,391110911,IL 391110912,391111167,GB 391111168,391111935,US @@ -3262,11 +3287,9 @@ 391937536,391937791,CA 391937792,391938047,IE 391938048,391946239,CA -391946240,391960639,US -391960640,391960647,RO -391960648,391961711,US -391961712,391961719,RO -391961720,392044351,US +391946240,391960335,US +391960336,391960351,GB +391960352,392044351,US 392044352,392044359,CA 392044360,392054271,US 392054272,392054527,CA @@ -3274,7 +3297,11 @@ 392055944,392055951,GB 392055952,392073319,US 392073320,392073327,CA -392073328,392114895,US +392073328,392103471,US +392103472,392103479,GB +392103480,392112815,US +392112816,392112823,GB +392112824,392114895,US 392114896,392114903,TH 392114904,392245247,US 392245248,392249343,SG @@ -3363,11 +3390,9 @@ 392675040,392675071,SG 392675072,392684479,US 392684480,392684511,IE -392684512,392684527,NL -392684528,392684543,US +392684512,392684543,NL 392684544,392684575,IE -392684576,392684591,NL -392684592,392684607,US +392684576,392684607,NL 392684608,392684639,IE 392684640,392684655,NL 392684656,392684671,US @@ -3393,8 +3418,7 @@ 392685088,392685103,NL 392685104,392685119,US 392685120,392685151,IE -392685152,392685167,NL -392685168,392686607,US +392685152,392686607,US 392686608,392686623,AT 392686624,392686639,FI 392686640,392686655,IE @@ -3495,7 +3519,8 @@ 392689888,392689903,AT 392689904,392689919,IE 392689920,392689983,US -392689984,392690015,SG +392689984,392689999,SG +392690000,392690015,HK 392690016,392690031,KR 392690032,392690047,MY 392690048,392690079,US @@ -3531,18 +3556,34 @@ 394270720,394271231,NL 394296320,394296831,NL 394297344,394297599,US -394330112,394854399,US +394330112,394788863,US +394821632,394821887,US 394854400,394854655,CA -394919936,395051007,US +394887168,394887423,US +394919936,394920191,US +394952704,394952959,CA +394985472,394985727,US +395018240,395018495,CA 395051008,395051263,CA +395083776,395084031,US 395116544,395116799,US +395149312,395149567,CA 395182080,395182335,CA -395247616,395247871,US -395313152,395706367,US -395706368,395837439,CA -395837440,395968511,US -395968512,395969023,CA +395214848,395215103,US +395247616,395313407,US +395345920,395346175,CA +395378688,395576319,US +395608064,395608319,CA +395640832,395641087,US +395673600,395673855,CA +395706368,395706623,CA +395739136,395739391,US +395771904,395837439,CA +395837440,395903231,US +395935744,395935999,CA +395968512,396034047,CA 396034048,396034303,US +396066816,396067071,CA 396099584,396754943,US 396754944,396755199,CA 396820480,396820735,US @@ -3566,15 +3607,9 @@ 398532608,398536703,NL 398536704,398566911,US 398566912,398567423,NL -398567424,398617599,US -398617600,398618623,NL -398618624,398635007,US -398635008,398644223,NL -398644224,398644735,US +398567424,398644735,US 398644736,398645247,NL -398645248,398647295,US -398647296,398656511,NL -398656512,398657535,US +398645248,398657535,US 398657536,398658559,NL 398658560,398667775,US 398667776,398675967,NL @@ -3606,9 +3641,7 @@ 399032320,399036415,NL 399036416,399055871,US 399055872,399056383,NL -399056384,399075839,US -399075840,399076863,NL -399076864,399087615,US +399056384,399087615,US 399087616,399088639,NL 399088640,399089663,US 399089664,399114239,NL @@ -3617,8 +3650,8 @@ 399126016,399143935,US 399143936,399145471,NL 399145472,399147007,US -399147008,399159295,NL -399159296,399175679,US +399147008,399155199,NL +399155200,399175679,US 399175680,399179775,NL 399179776,399280127,US 399280128,399280639,NL @@ -3626,16 +3659,16 @@ 399280896,399281151,NL 399281152,399331327,US 399331328,399339519,NL -399339520,399342335,US -399342336,399342591,NL -399342592,399353855,US +399339520,399353855,US 399353856,399354879,NL 399354880,399355391,US 399355392,399359999,NL -399360000,399365119,US -399365120,399366143,NL -399366144,399367167,US -399367168,399378943,NL +399360000,399367167,US +399367168,399367679,NL +399367680,399368191,US +399368192,399372287,NL +399372288,399376383,US +399376384,399378943,NL 399378944,399380479,US 399380480,399388671,NL 399388672,399396863,US @@ -3648,45 +3681,39 @@ 399486976,399491071,NL 399491072,399495167,US 399495168,399503359,NL -399503360,399591935,US -399591936,399593471,NL -399593472,399601663,US -399601664,399619583,NL -399619584,399621631,US -399621632,399639551,NL -399639552,399688191,US +399503360,399622143,US +399622144,399630335,NL +399630336,399688191,US 399688192,399688703,NL 399688704,399734527,US 399734528,399735807,NL 399735808,399738879,US -399738880,399739647,NL +399738880,399739135,NL +399739136,399739391,US +399739392,399739647,NL 399739648,399740927,US 399740928,399749119,NL 399749120,399797247,US 399797248,399797759,NL -399797760,399818751,US -399818752,399822847,NL -399822848,399870975,US +399797760,399870975,US 399870976,399871999,NL 399872000,399908863,US 399908864,399919615,NL 399919616,399921151,US -399921152,399958015,NL +399921152,399949823,NL +399949824,399953919,US +399953920,399958015,NL 399958016,399969279,US 399969280,399969535,NL 399969536,399970303,US 399970304,399980031,NL 399980032,399981567,US 399981568,399982079,NL -399982080,399990783,US -399990784,399991295,NL -399991296,399998975,US +399982080,399998975,US 399998976,399999487,NL 399999488,400021247,US 400021248,400021503,NL -400021504,400033279,US -400033280,400033791,NL -400033792,400034815,US +400021504,400034815,US 400034816,400035327,NL 400035328,400047103,US 400047104,400047615,NL @@ -3695,8 +3722,8 @@ 400064512,400083455,US 400083456,400084991,NL 400084992,400093183,US -400093184,400101375,NL -400101376,400111103,US +400093184,400097279,NL +400097280,400111103,US 400111104,400111615,NL 400111616,400112639,US 400112640,400113663,NL @@ -3726,18 +3753,18 @@ 400263168,400263679,NL 400263680,400264703,US 400264704,400265215,NL -400265216,400270847,US -400270848,400271359,NL -400271360,400283647,US +400265216,400283647,US 400283648,400284671,NL 400284672,400293887,US 400293888,400302079,NL 400302080,400400383,US 400400384,400430079,NL -400430080,400431103,US -400431104,400442367,NL +400430080,400432639,US +400432640,400442367,NL 400442368,400482303,US -400482304,400527359,NL +400482304,400486399,NL +400486400,400494591,US +400494592,400527359,NL 400527360,400543743,US 400543744,400551935,NL 400551936,400623615,US @@ -3845,7 +3872,11 @@ 401387008,401387263,RU 401387264,401400871,US 401400872,401400879,NO -401400880,401547263,US +401400880,401419775,US +401419776,401420031,CA +401420032,401420287,US +401420288,401420543,CA +401420544,401547263,US 401547264,401555455,CA 401555456,402096639,US 402096640,402096895,FR @@ -4082,9 +4113,7 @@ 412958720,413007871,CA 413007872,413908991,US 413908992,413925375,PR -413925376,414503135,US -414503136,414503167,CA -414503168,415760383,US +413925376,415760383,US 415760384,416022527,CA 416022528,416059391,US 416059392,416063487,CA @@ -4113,7 +4142,7 @@ 417775616,417796095,CA 417796096,417800191,US 417800192,417808383,BS -417808384,417816575,CA +417808384,417820671,CA 417820672,417857535,US 417857536,417923071,AR 417923072,418060287,US @@ -4175,7 +4204,9 @@ 455245824,455258111,JP 455258112,455258623,SG 455258624,455258688,KH -455258689,455260671,SG +455258689,455260416,SG +455260417,455260430,KH +455260431,455260671,SG 455260672,455260674,KH 455260675,455260927,SG 455260928,455260960,KH @@ -4194,7 +4225,7 @@ 456265728,456269823,ID 456269824,456271871,HK 456271872,456273919,CN -456273920,456278015,SG +456273920,456278015,HK 456278016,456286207,AU 456286208,456294399,JP 456294400,456327167,CN @@ -4237,8 +4268,8 @@ 459541504,459542527,IN 459542528,459543295,HK 459543296,459543551,TW -459543552,459543807,MO -459543808,459544575,HK +459543552,459544063,MO +459544064,459544575,HK 459544576,459545599,IN 459545600,459547647,JP 459547648,459548159,AU @@ -4383,7 +4414,9 @@ 461111296,461127679,IN 461127680,461131775,PH 461131776,461135871,ID -461135872,461144063,AU +461135872,461143329,AU +461143330,461143331,US +461143332,461144063,AU 461144064,461209599,KR 461209600,461225983,SG 461225984,461227007,WF @@ -4559,7 +4592,8 @@ 520882176,520884223,IT 520884224,520888319,MK 520888320,520896511,DE -520896512,520898559,BE +520896512,520898303,BE +520898304,520898559,US 520900608,520902655,GB 520902656,520902784,NL 520902785,520912895,GB @@ -4839,7 +4873,7 @@ 523024896,523025407,DE 523025408,523025663,UA 523025664,523025919,CH -523025920,523026175,BG +523025920,523026175,UA 523026176,523026431,GB 523026432,523030527,TR 523030528,523034623,FR @@ -4853,9 +4887,7 @@ 523190272,523192319,FI 523192320,523194367,ES 523194368,523196415,DE -523196416,523197183,AE -523197184,523197695,DE -523197696,523198463,AE +523196416,523198463,AE 523198464,523202559,CZ 523202560,523223039,RU 523223040,523225087,AM @@ -4972,11 +5004,12 @@ 529800704,529800959,CZ 529800960,529806079,RU 529806080,529809407,UA -529809408,529817599,RU -529817600,529818623,CZ +529809408,529817855,RU +529817856,529818623,CZ 529818624,529826303,RU 529826304,529826815,CZ -529826816,529829887,RU +529826816,529828863,RU +529828864,529829887,KZ 529829888,529830911,UZ 529830912,529831935,RU 529831936,529833983,SY @@ -4984,9 +5017,9 @@ 529838080,529842175,UA 529842176,529843199,ES 529843200,529843711,RU -529843712,529845503,CZ -529845504,529845759,UA -529845760,529846271,CZ +529843712,529844735,CZ +529844736,529845503,RU +529845504,529846271,UA 529846272,529847295,UZ 529847296,529848319,GB 529848320,529848575,NL @@ -5087,8 +5120,8 @@ 531428200,531428263,GB 531428264,531428271,IT 531428272,531428279,GB -531428280,531428295,IT -531428296,531428351,GB +531428280,531428287,IT +531428288,531428351,GB 531428352,531428359,IT 531428360,531428439,GB 531428440,531428447,IT @@ -5177,7 +5210,9 @@ 532344320,532344371,FR 532344372,532344372,GB 532344373,532344575,FR -532344576,532347391,GB +532344576,532346367,GB +532346368,532346623,NL +532346624,532347391,GB 532347392,532347903,DE 532347904,532348927,GB 532348928,532365311,IE @@ -5198,7 +5233,7 @@ 532368640,532370431,DE 532370432,532371455,FI 532371456,532372479,DE -532372480,532372735,LU +532372480,532372735,NL 532372736,532372767,GB 532372768,532372783,CA 532372784,532372799,BR @@ -5234,8 +5269,8 @@ 532738048,532740095,GB 532740096,532742143,KG 532742144,532746239,GB -532746240,532750335,IT -532750336,532750847,SM +532746240,532750591,IT +532750592,532750847,SM 532750848,532752383,IT 532752384,532754431,BE 532754432,532756479,FR @@ -5365,7 +5400,7 @@ 534157312,534157567,TR 534157568,534157823,DE 534157824,534158079,IR -534158080,534158591,DE +534158080,534158591,ES 534158592,534158847,NL 534158848,534161407,DE 534161408,534163455,IR @@ -5378,7 +5413,9 @@ 534181888,534183935,IR 534183936,534249471,AE 534249472,534253567,GB -534253568,534257663,FR +534253568,534254607,FR +534254608,534254623,US +534254624,534257663,FR 534257664,534259711,SE 534259712,534261759,CH 534261760,534263807,GB @@ -5397,7 +5434,9 @@ 534347776,534348031,US 534348032,534348287,GB 534348288,534348543,US -534348544,534355967,GB +534348544,534349071,GB +534349072,534349079,US +534349080,534355967,GB 534355968,534364159,GR 534364160,534366207,FI 534366208,534368255,IT @@ -5536,9 +5575,9 @@ 540825348,540825348,CA 540825349,540826383,US 540826384,540826399,CA -540826400,540832575,US -540832576,540832591,CA -540832592,543690751,US +540826400,540831743,US +540831744,540833791,CA +540833792,543690751,US 543690752,543691007,AR 543691008,543691263,US 543691264,543691775,BR @@ -5640,7 +5679,8 @@ 620781568,620783615,GB 620783616,620785663,ES 620785664,620785919,DE -620785920,620786687,US +620785920,620786175,GB +620786176,620786687,DE 620786688,620787199,IE 620787200,620787711,DE 620787712,620789503,RU @@ -5715,11 +5755,13 @@ 621427712,621427967,GB 621427968,621428735,NL 621428736,621429759,IR -621429760,621430527,DE +621429760,621430271,DE +621430272,621430527,ES 621430528,621430783,GB 621430784,621432831,ES 621432832,621436927,IT -621436928,621440255,DE +621436928,621439999,DE +621440000,621440255,ES 621440256,621440511,IR 621440512,621442047,DE 621442048,621442303,ES @@ -5820,12 +5862,9 @@ 622510080,622512127,PL 622512128,622514175,DE 622514176,622518271,NO -622518272,622518783,GB -622518784,622519281,NL -622519282,622519282,GB -622519283,622519295,NL +622518272,622519295,GB 622519296,622519551,FR -622519552,622520319,NL +622519552,622520319,GB 622520320,622522367,RU 622522368,622524415,FR 622524416,622526463,ES @@ -5930,9 +5969,7 @@ 623822592,623822847,DE 623822848,623824895,GB 623824896,623826943,CZ -623826944,623827967,UA -623827968,623828991,MD -623828992,623837183,UA +623826944,623837183,UA 623837184,623902719,PL 623902720,623919103,CZ 623919104,623935487,NL @@ -6008,9 +6045,7 @@ 624643244,624643247,ES 624643248,624643423,FR 624643424,624643459,ES -624643460,624643999,FR -624644000,624644015,GB -624644016,624644031,FR +624643460,624644031,FR 624644032,624644063,FI 624644064,624644095,ES 624644096,624644115,FR @@ -6160,7 +6195,9 @@ 624665612,624665615,ES 624665616,624665663,FR 624665664,624665695,ES -624665696,624666167,FR +624665696,624665999,FR +624666000,624666015,GB +624666016,624666167,FR 624666168,624666175,GB 624666176,624666219,FR 624666220,624666223,DE @@ -6386,9 +6423,7 @@ 624687784,624687791,PT 624687792,624687827,FR 624687828,624687831,ES -624687832,624687903,FR -624687904,624687919,ES -624687920,624687923,FR +624687832,624687923,FR 624687924,624687927,ES 624687928,624688007,FR 624688008,624688015,ES @@ -6482,7 +6517,8 @@ 625519104,625520135,NL 625520136,625520447,US 625520448,625520495,NL -625520496,625520639,US +625520496,625520511,US +625520512,625520639,NL 625520640,625522687,RU 625522688,625523455,SE 625523456,625523711,NO @@ -6571,7 +6607,7 @@ 628029440,628031487,GB 628031488,628064255,MM 628064256,628080639,PK -628080640,628097023,HU +628080640,628097023,BD 628097024,628230143,RU 628230144,628232191,IT 628232192,628236287,RU @@ -6779,7 +6815,8 @@ 630820096,630820351,RO 630820352,630820607,ES 630820608,630820863,US -630820864,630828031,RO +630820864,630827007,RO +630827008,630828031,NL 630828032,630828543,SE 630828544,630829055,BG 630829056,630833151,IR @@ -6832,13 +6869,14 @@ 631036416,631036543,GB 631036544,631037951,RO 631037952,631038207,BG -631038208,631039999,RO +631038208,631038975,RO +631038976,631039999,NL 631040000,631043071,IR 631043072,631043583,RO 631043584,631043839,TR 631043840,631044095,MD 631044096,631045119,IR -631045120,631046143,RO +631045120,631046143,NL 631046144,631048191,DK 631048192,631050239,FR 631050240,631054335,RU @@ -7008,7 +7046,9 @@ 635200168,635200175,IT 635200176,635200263,GB 635200264,635200271,IT -635200272,635200335,GB +635200272,635200279,GB +635200280,635200287,IT +635200288,635200335,GB 635200336,635200343,IT 635200344,635200431,GB 635200432,635200439,IT @@ -7022,13 +7062,13 @@ 635200912,635200919,IT 635200920,635200991,GB 635200992,635200999,IT -635201000,635201159,GB +635201000,635201103,GB +635201104,635201111,IT +635201112,635201159,GB 635201160,635201167,IT 635201168,635201183,GB 635201184,635201191,IT -635201192,635201263,GB -635201264,635201271,IT -635201272,635201295,GB +635201192,635201295,GB 635201296,635201303,IT 635201304,635203583,GB 635203584,635207679,JO @@ -7068,8 +7108,8 @@ 635725824,635727871,US 635727872,635729919,RU 635729920,635731967,DE -635731968,635732223,SC -635732224,635732735,DE +635731968,635732479,SC +635732480,635732735,DE 635732736,635732991,IR 635732992,635733209,DE 635733210,635733210,PT @@ -7096,7 +7136,9 @@ 635865856,635866111,US 635866112,635871487,RU 635871488,635871743,UA -635871744,635893503,RU +635871744,635891967,RU +635891968,635892223,GB +635892224,635893503,RU 635893504,635893759,AZ 635893760,635894527,RU 635894528,635894783,KZ @@ -7120,8 +7162,7 @@ 636168192,636170239,GB 636170240,636170495,PL 636170496,636170751,IS -636170752,636171007,CH -636171008,636171263,AT +636170752,636171263,CH 636171264,636171519,CL 636171520,636171775,ES 636171776,636172031,GB @@ -7141,7 +7182,14 @@ 636190720,636223487,RU 636223488,636485631,IQ 636485632,636747775,SA -636747776,636764159,FR +636747776,636753407,FR +636753408,636753919,US +636753920,636753938,NL +636753939,636753941,DE +636753942,636754072,NL +636754073,636754075,DE +636754076,636754175,NL +636754176,636764159,FR 636764160,636780543,GB 636780544,636813311,HR 636813312,636878847,AE @@ -7217,41 +7265,63 @@ 637337088,637337599,RU 637337600,637403135,NO 637403136,637534207,IR -637534208,639242239,US +637534208,638910463,US +638910464,638918655,CA +638918656,639242239,US 639242240,639246335,CA 639246336,639442943,US 639442944,639451135,CA -639451136,641738239,US +639451136,639459327,US +639459328,639467519,CA +639467520,641738239,US 641738240,641738495,CA 641738496,641761535,US 641761536,641761791,CA -641761792,641765375,US -641765376,641765887,CA -641765888,641769471,US -641769472,641769983,CA +641761792,641763327,US +641763328,641767423,CA +641767424,641768447,US +641768448,641769983,CA 641769984,641770495,US -641770496,641771839,CA -641771840,641773055,US -641773056,641775615,CA -641775616,641779199,US +641770496,641772543,CA +641772544,641773055,US +641773056,641776639,CA +641776640,641777663,US +641777664,641777919,CA +641777920,641778175,US +641778176,641778687,CA +641778688,641779199,US 641779200,641779327,CA 641779328,641779711,US -641779712,641780223,CA -641780224,641781503,US -641781504,641781759,CA -641781760,641826815,US +641779712,641781759,CA +641781760,641789951,US +641789952,641790975,CA +641790976,641826815,US 641826816,641827839,MX 641827840,641828351,US 641828352,641830911,MX -641830912,642094335,US -642094336,642095103,CA +641830912,642089471,US +642089472,642089727,CA +642089728,642092543,US +642092544,642092799,CA +642092800,642093055,US +642093056,642095103,CA 642095104,642096127,US 642096128,642096639,CA -642096640,642113535,US +642096640,642097151,US +642097152,642105343,CA +642105344,642113535,US 642113536,642115583,AU 642115584,642387967,US 642387968,642392063,CA -642392064,643219519,US +642392064,642394111,US +642394112,642396159,CA +642396160,642793471,US +642793472,642794495,CA +642794496,642797567,US +642797568,642797823,CA +642797824,642799615,US +642799616,642801663,CA +642801664,643219519,US 643219520,643219523,CA 643219524,643219526,US 643219527,643219527,CA @@ -7262,70 +7332,103 @@ 643294208,643294719,US 643294720,643294975,RU 643294976,643295231,DE -643295232,643296767,US +643295232,643295487,PR +643295488,643295743,US +643295744,643295999,PR +643296000,643296255,US +643296256,643296511,PR +643296512,643296767,US 643296768,643297023,PR 643297024,643299583,US 643299584,643299839,HK -643299840,643318847,US -643318848,643318911,CA -643318912,643321855,US -643321856,643325951,CA -643325952,644051967,US +643299840,643302911,US +643302912,643303423,CA +643303424,643317759,US +643317760,643325951,CA +643325952,643346431,US +643346432,643346943,CA +643346944,643362815,US +643362816,643363327,CA +643363328,644051967,US 644051968,644052479,MF 644052480,644052735,GP 644052736,644052991,MF 644052992,644055039,US 644055040,644055807,CA 644055808,644056063,US -644056064,644057087,CA -644057088,644058623,US -644058624,644058879,CA +644056064,644057599,CA +644057600,644058111,US +644058112,644058879,CA 644058880,644059135,US 644059136,644059647,CA 644059648,644060159,US -644060160,644061183,CA -644061184,644067327,US -644067328,644069375,CA -644069376,644070143,US -644070144,644070399,CA -644070400,644070911,US -644070912,644071167,CA -644071168,644084479,US +644060160,644061631,CA +644061632,644061663,US +644061664,644062719,CA +644062720,644062975,US +644062976,644065023,CA +644065024,644065055,US +644065056,644065279,CA +644065280,644066303,US +644066304,644066815,CA +644066816,644067327,US +644067328,644071423,CA +644071424,644084479,US 644084480,644084735,GU 644084736,644239615,US 644239616,644239871,CA -644239872,644323391,US -644323392,644323407,CA -644323408,644403199,US -644403200,644403327,CA -644403328,644422911,US +644239872,644247551,US +644247552,644249599,CA +644249600,644323327,US +644323328,644325375,CA +644325376,644388863,US +644388864,644389375,CA +644389376,644389503,US +644389504,644390911,CA +644390912,644399103,US +644399104,644399359,CA +644399360,644403199,US +644403200,644403711,CA +644403712,644407807,US +644407808,644408319,CA +644408320,644413439,US +644413440,644414463,CA +644414464,644422911,US 644422912,644423423,JP -644423424,644634367,US +644423424,644569087,US +644569088,644571135,PR +644571136,644629759,US +644629760,644630015,CA +644630016,644634367,US 644634368,644636671,CA -644636672,644718847,US -644718848,644718911,CA -644718912,644719103,RU +644636672,644718719,US +644718720,644718783,CA +644718784,644718847,US +644718848,644718943,CA +644718944,644719103,RU 644719104,644719359,US -644719360,644719615,CA -644719616,644720127,US -644720128,644720639,CA +644719360,644720639,CA 644720640,644759551,US -644759552,644760575,CA -644760576,644761087,US -644761088,644761343,CA -644761344,644763903,US -644763904,644764159,CA -644764160,644765439,US -644765440,644765695,CA -644765696,644767878,US +644759552,644761599,CA +644761600,644763647,US +644763648,644767743,CA +644767744,644767878,US 644767879,644767879,CA -644767880,644835071,US +644767880,644773887,US +644773888,644775935,CA +644775936,644833279,US +644833280,644834815,CA +644834816,644834817,US +644834818,644834818,CA +644834819,644835071,US 644835072,644835327,CA -644835328,644838143,US -644838144,644838399,CA -644838400,644838911,US -644838912,644839679,CA -644839680,644845839,US +644835328,644836351,US +644836352,644837375,CA +644837376,644838143,US +644838144,644839679,CA +644839680,644840447,US +644840448,644841471,CA +644841472,644845839,US 644845840,644845840,RU 644845841,644845841,US 644845842,644845855,RU @@ -7333,39 +7436,55 @@ 644845864,644846079,RU 644846080,644874495,US 644874496,644874751,CA -644874752,644877311,US +644874752,644875007,US +644875008,644875263,CA +644875264,644877311,US 644877312,644877439,CA -644877440,644897791,US -644897792,644898047,CA -644898048,644900863,US -644900864,644902911,CA -644902912,644980735,US +644877440,644896767,US +644896768,644902911,CA +644902912,644903170,US +644903171,644903171,CA +644903172,644903423,US +644903424,644903935,CA +644903936,644980735,US 644980736,644980991,CA 644980992,644981759,US -644981760,644982783,CA +644981760,644982399,CA +644982400,644982527,US +644982528,644982783,CA 644982784,644986111,US 644986112,644986367,CA -644986368,645187071,US -645187072,645187327,CA -645187328,645221119,US +644986368,644987135,US +644987136,644987903,CA +644987904,645185535,US +645185536,645193727,CA +645193728,645221119,US 645221120,645222399,CA -645222400,645227775,US -645227776,645228031,CA -645228032,645481405,US -645481406,645481406,CA -645481407,645485567,US -645485568,645485695,CA -645485696,645485823,US -645485824,645486079,CA -645486080,645486591,US -645486592,645486847,CA -645486848,645487103,US -645487104,645487615,CA -645487616,645487871,US -645487872,645487935,CA -645487936,645547399,US +645222400,645223935,US +645223936,645224191,CA +645224192,645224959,US +645224960,645225215,CA +645225216,645225471,US +645225472,645225983,CA +645225984,645227519,US +645227520,645228031,CA +645228032,645229055,US +645229056,645230079,CA +645230080,645480447,US +645480448,645482495,CA +645482496,645484543,US +645484544,645488639,CA +645488640,645525503,US +645525504,645529599,CA +645529600,645539839,US +645539840,645540863,CA +645540864,645547399,US 645547400,645547407,CA -645547408,645611519,US +645547408,645576703,US +645576704,645576997,CA +645576998,645576998,US +645576999,645577215,CA +645577216,645611519,US 645611520,645615615,MX 645615616,645644351,US 645644352,645644415,MX @@ -7384,38 +7503,42 @@ 645713920,645744639,US 645744640,645745663,GB 645745664,645873663,US -645873664,645873919,CA -645873920,645984255,US +645873664,645877759,CA +645877760,645980159,US +645980160,645982719,CA +645982720,645984255,US 645984256,645988351,CA 645988352,645989450,US 645989451,645989451,CA -645989452,646084097,US -646084098,646084098,CA -646084099,646160383,US +645989452,646082559,US +646082560,646083583,CA +646083584,646084095,US +646084096,646084351,CA +646084352,646084607,US +646084608,646086655,CA +646086656,646160383,US 646160384,646164479,CA -646164480,646195560,US -646195561,646195561,CA -646195562,646197247,US -646197248,646197759,CA -646197760,646198032,US -646198033,646198033,CA -646198034,646198042,US -646198043,646198043,CA -646198044,646198271,US -646198272,646198783,CA -646198784,646199384,US -646199385,646199385,CA -646199386,646199807,US -646199808,646200319,CA -646200320,646250495,US -646250496,646256639,CA -646256640,646711807,US +646164480,646193151,US +646193152,646194943,CA +646194944,646195199,US +646195200,646198783,CA +646198784,646199295,US +646199296,646201343,CA +646201344,646250495,US +646250496,646258687,CA +646258688,646262783,US +646262784,646264831,CA +646264832,646711807,US 646711808,646712319,CA -646712320,646735103,US -646735104,646735231,CA -646735232,646765839,US +646712320,646734847,US +646734848,646735359,CA +646735360,646764543,US +646764544,646765823,CA +646765824,646765839,US 646765840,646765847,CA -646765848,653434879,US +646765848,646766079,US +646766080,646766591,CA +646766592,653434879,US 653434880,653443071,CA 653443072,654311423,US 654311424,654311679,CN @@ -7439,7 +7562,9 @@ 675447168,675447295,HK 675447296,675447423,US 675447424,675447551,BR -675447552,675545087,US +675447552,675448575,US +675448576,675449087,GB +675449088,675545087,US 675545088,675610623,NL 675610624,675635199,IE 675635200,675643391,CA @@ -7458,7 +7583,9 @@ 676176192,676176255,US 676176256,676176383,HK 676176384,676176639,IE -676176640,676192767,US +676176640,676179455,US +676179456,676179711,IE +676179712,676192767,US 676192768,676192895,HK 676192896,676193023,IE 676193024,676193535,US @@ -7496,7 +7623,11 @@ 677020192,677020479,US 677020480,677020543,GB 677020544,677020607,KR -677020608,677021951,US +677020608,677020927,US +677020928,677020959,NL +677020960,677020991,BR +677020992,677021023,IE +677021024,677021951,US 677021952,677021983,JP 677021984,677022079,US 677022080,677022143,IN @@ -7511,22 +7642,35 @@ 677022464,677022527,US 677022528,677022591,GB 677022592,677022655,KR -677022656,677023103,US -677023104,677023111,IE -677023112,677380095,US +677022656,677023007,US +677023008,677023039,NL +677023040,677023071,BR +677023072,677023135,IE +677023136,677023167,NL +677023168,677023935,US +677023936,677023967,NL +677023968,677023999,BR +677024000,677024031,IE +677024032,677380095,US 677380096,677380127,AU 677380128,677380159,IE 677380160,677380191,NL 677380192,677380543,US -677380544,677380719,SG -677380720,677380895,KR +677380544,677380583,SG +677380584,677380591,US +677380592,677380719,SG +677380720,677380759,KR +677380760,677380767,US +677380768,677380895,KR 677380896,677380927,AU 677380928,677380943,IN 677380944,677380959,FI 677380960,677380991,AU 677380992,677381055,US 677381056,677381071,FI -677381072,677381247,HK +677381072,677381111,HK +677381112,677381119,US +677381120,677381247,HK 677381248,677381375,US 677381376,677381407,AT 677381408,677381423,NL @@ -7598,7 +7742,7 @@ 677385984,677385999,FI 677386000,677386015,US 677386016,677386047,IN -677386048,677386063,CA +677386048,677386063,HK 677386064,677386095,US 677386096,677386111,BR 677386112,677386127,CA @@ -7633,12 +7777,12 @@ 677387320,677387327,FI 677387328,677387455,AT 677387456,677387487,FI -677387488,677387663,SG +677387488,677387663,US 677387664,677387839,HK 677387840,677387863,AT 677387864,677387967,US 677387968,677388007,FI -677388008,677388183,KR +677388008,677388183,US 677388184,677388223,FI 677388224,677388351,US 677388352,677388527,MY @@ -7682,7 +7826,7 @@ 677393744,677393759,NL 677393760,677393855,US 677393856,677393863,FI -677393864,677393927,BR +677393864,677393927,US 677393928,677394279,JP 677394280,677394287,FI 677394288,677394303,AU @@ -7724,18 +7868,13 @@ 677655552,677678079,US 677678080,677678591,IN 677678592,677679103,US -677679104,677679263,AU -677679264,677679327,US -677679328,677679615,AU +677679104,677679615,AU 677679616,677680639,US -677680640,677680767,AU -677680768,677680831,US -677680832,677681119,AU -677681120,677681151,US +677680640,677681151,AU 677681152,677683199,JP 677683200,677685247,CA -677685248,677686271,GB -677686272,677707775,US +677685248,677687295,GB +677687296,677707775,US 677707776,677708799,NL 677708800,677709823,AT 677709824,677713919,NL @@ -7799,12 +7938,27 @@ 677839328,677839343,FI 677839344,677839359,AT 677839360,677840319,US -677840320,677840639,NL +677840320,677840335,NL +677840336,677840367,IE +677840368,677840383,AT +677840384,677840399,NL +677840400,677840431,IE +677840432,677840447,AT +677840448,677840463,NL +677840464,677840495,IE +677840496,677840511,AT +677840512,677840543,NL +677840544,677840559,IE +677840560,677840575,AT +677840576,677840591,NL +677840592,677840623,IE +677840624,677840639,AT 677840640,677841919,US 677841920,677841935,FI 677841936,677841951,IE 677841952,677841967,AT -677841968,677841999,FI +677841968,677841983,NL +677841984,677841999,FI 677842000,677842015,IE 677842016,677842031,AT 677842032,677842047,NL @@ -8016,14 +8170,21 @@ 678202368,678203135,IE 678203136,678203391,NL 678203392,678205183,US -678205184,678205439,NL -678205440,678205695,US +678205184,678205695,NL 678205696,678205951,KR 678205952,678206463,CA 678206464,678206719,KR 678206720,678206975,IE 678206976,678207487,AU -678207488,678428671,US +678207488,678207999,IE +678208000,678208255,US +678208256,678208511,GB +678208512,678209023,IE +678209024,678209279,GB +678209280,678209791,IE +678209792,678211583,US +678211584,678212607,NL +678212608,678428671,US 678428672,678436863,IE 678436864,678437887,US 678437888,678438015,IE @@ -8042,9 +8203,7 @@ 678543360,678592511,US 678592512,678623193,NL 678623194,678623194,US -678623195,678625279,NL -678625280,678633471,IE -678633472,678641663,NL +678623195,678641663,NL 678641664,678649855,AU 678649856,678658047,IE 678658048,678690815,JP @@ -8206,8 +8365,8 @@ 692932608,692934655,CM 692934656,692936703,BW 692936704,692940799,ZA -692940800,692941055,MA -692941056,692941567,CA +692940800,692941311,MA +692941312,692941567,CA 692941568,692942847,MA 692942848,692944895,GA 692944896,692946943,MZ @@ -8568,8 +8727,8 @@ 701458176,701458831,KE 701458832,701458847,CG 701458848,701462783,KE -701462784,701463039,CG -701463040,701463807,KE +701462784,701463295,CG +701463296,701463807,KE 701463808,701464063,CG 701464064,701464319,KE 701464320,701464351,CG @@ -8632,8 +8791,9 @@ 702066688,702066943,PL 702066944,702067199,NL 702067200,702067711,PL -702067712,702070527,CM -702070528,702070783,RU +702067712,702068735,NL +702068736,702070271,CM +702070272,702070783,RU 702070784,702074879,ZA 702074880,702076927,BW 702076928,702078975,TZ @@ -8988,9 +9148,9 @@ 736188416,736189439,JP 736189440,736190463,IN 736190464,736191487,PK -736191488,736192511,HK +736191488,736193535,HK 736193536,736194559,MY -736194560,736195583,AU +736194560,736195583,NZ 736195584,736196607,IN 736196608,736198655,CN 736198656,736199679,AU @@ -9135,7 +9295,6 @@ 736482304,736483327,HK 736483328,736485375,CN 736485376,736486399,IN -736486400,736487423,NP 736487424,736489471,CN 736489472,736491519,JP 736491520,736493567,ID @@ -9164,9 +9323,9 @@ 736518144,736519167,HK 736519168,736520191,AU 736520192,736521215,IN -736521216,736521747,AU +736521216,736521747,PH 736521748,736521748,US -736521749,736522239,AU +736521749,736522239,PH 736522240,736524287,HK 736524288,736525311,BD 736525312,736526335,CN @@ -9193,7 +9352,7 @@ 736559104,736560127,HK 736560128,736561151,MY 736561152,736562175,HK -736562176,736563199,CN +736562176,736563199,SG 736563200,736564223,HK 736564224,736565247,BD 736565248,736566271,AU @@ -9290,7 +9449,7 @@ 737179648,737180671,AU 737180672,737184767,CN 737184768,737185791,VU -737185792,737186815,HK +737185792,737186815,AU 737186816,737187839,ID 737187840,737188863,TW 737188864,737206271,CN @@ -9329,9 +9488,7 @@ 737264640,737265663,CN 737265664,737266687,AU 737266688,737267711,HK -737267712,737276927,CN -737276928,737277951,IN -737277952,737279999,CN +737267712,737279999,CN 737280000,737281023,BD 737281024,737282047,SG 737282048,737288191,CN @@ -9386,7 +9543,9 @@ 737369088,737370111,HK 737370112,737371135,NP 737371136,737375231,HK -737375232,737376255,AU +737375232,737375743,AU +737375744,737375999,SG +737376000,737376255,AU 737376256,737377279,HK 737377280,737378303,PH 737378304,737379327,CN @@ -9428,9 +9587,7 @@ 737484800,737485823,KH 737485824,737487871,AU 737487872,737488895,MM -737488896,737489151,AU -737489152,737489407,SG -737489408,737489919,HK +737488896,737489919,AU 737489920,737490943,NZ 737490944,737491967,FJ 737491968,737492447,SG @@ -9446,9 +9603,7 @@ 737502208,737503231,IN 737503232,737505279,SG 737505280,737506303,AU -737506304,737507327,BD -737507328,737507583,AU -737507584,737508351,BD +737506304,737508351,BD 737508352,737509375,MY 737509376,737510399,PK 737510400,737511423,AU @@ -9475,7 +9630,8 @@ 737530880,737531903,NC 737531904,737532927,KH 737532928,737533183,HK -737533184,737533439,PH +737533184,737533184,PH +737533185,737533439,MY 737533440,737533695,VN 737533696,737533951,TW 737533952,737534975,AU @@ -9875,12 +10031,73 @@ 738193408,738194431,TH 738194432,738195455,CN 738195456,738197503,KR -738197504,747175935,US +738197504,746786303,US +746786304,746786559,GB +746786560,747175935,US 747175936,747241471,NL -747241472,755105791,US +747241472,747671807,US +747671808,747672063,GB +747672064,755105791,US 755105792,755179519,CA 755179520,755236863,US +755236864,755237673,CL 755237674,755237674,US +755237675,755237887,CL +755237888,755258367,BR +755258368,755259391,HN +755259392,755260415,EC +755260416,755261439,AR +755261440,755261695,BR +755261696,755261951,AR +755261952,755262463,BO +755262464,755263487,AR +755263488,755269631,BR +755269632,755270655,HN +755270656,755271679,BR +755271680,755272703,HN +755272704,755277823,BR +755277824,755279871,AR +755279872,755280895,CL +755280896,755281919,HN +755281920,755287039,BR +755287040,755288063,HN +755288064,755289087,EC +755289088,755290111,HN +755290112,755292159,BR +755292160,755293183,AR +755293184,755301375,BR +755301376,755303423,AR +755305728,755305983,BO +755305984,755306239,BR +755306240,755306495,AR +755306496,755307519,BR +755307520,755309567,AR +755310592,755315711,BR +755315712,755316735,MX +755316736,755317759,PE +755317760,755318783,CR +755318784,755319807,HN +755319808,755320831,PE +755320832,755321855,BR +755321856,755322879,HN +755322880,755325951,BR +755325952,755326975,MX +755326976,755332095,BR +755332096,755333119,GT +755333120,755335167,CL +755335168,755340287,BR +755341312,755342335,AR +755342336,755343359,BR +755351552,755357695,BR +755357696,755358719,NI +755358720,755368959,BR +755368960,755369983,AR +755371008,755376127,BR +755381248,755383295,BR +755383296,755384319,MX +755385344,755386367,AR +755386368,755387391,BR +755390464,755400703,BR 756023296,757071871,US 757071872,757071911,NL 757071912,757071919,US @@ -9961,7 +10178,9 @@ 757716736,757716991,NZ 757716992,757721599,US 757721600,757721855,PH -757721856,757729279,US +757721856,757727231,US +757727232,757728255,VI +757728256,757729279,US 757729280,757731327,CA 757731328,757733375,US 757733376,757734399,CA @@ -10055,9 +10274,7 @@ 757792768,757793279,CA 757793280,757793791,US 757793792,757794047,CA -757794048,757794815,US -757794816,757795071,CY -757795072,757795839,US +757794048,757795839,US 757795840,757796351,CA 757796352,757796863,US 757796864,757797375,CA @@ -10115,9 +10332,7 @@ 758702080,758710271,NL 758710272,758747391,US 758747392,758747647,LT -758747648,758750463,US -758750464,758750719,IN -758750720,758752199,US +758747648,758752199,US 758752200,758752207,FI 758752208,758779903,US 758779904,758783999,CA @@ -10313,7 +10528,13 @@ 759693960,759693975,GR 759693976,759726079,US 759726080,759791615,CA -759791616,759824639,US +759791616,759799807,US +759799808,759801855,IL +759801856,759802367,US +759802368,759803391,CA +759803392,759803903,US +759803904,759804927,GB +759804928,759824639,US 759824640,759824895,SA 759824896,759825151,CR 759825152,759825407,US @@ -10361,11 +10582,15 @@ 759848960,759955455,CA 759955456,759963647,US 759963648,759965759,NL -759965760,759975935,US +759965760,759966719,US +759966720,759967231,FR +759967232,759975935,US 759975936,759977471,DE 759977472,759977983,US 759977984,759979007,DE -759979008,759980031,US +759979008,759979124,US +759979125,759979125,DE +759979126,759980031,US 759980032,759984127,JP 759984128,759985151,AU 759985152,759988223,US @@ -10373,8 +10598,10 @@ 759990784,759992319,US 759992320,759996415,SG 759996416,760004607,US -760004608,760006967,JP -760006968,760007039,US +760004608,760006983,JP +760006984,760006987,US +760006988,760007007,JP +760007008,760007039,US 760007040,760012799,JP 760012800,760111103,US 760111104,760119295,CA @@ -10437,7 +10664,8 @@ 762398720,762399743,CN 762399744,762400767,IN 762400768,762401023,HK -762401024,762401791,US +762401024,762401279,US +762401280,762401791,HK 762401792,762402815,TH 762402816,762403839,IN 762403840,762404863,AU @@ -10753,7 +10981,7 @@ 762884096,762885119,JP 762885120,762887167,HK 762887168,762888191,IN -762888192,762890239,JP +762888192,762889215,JP 762890240,762890495,KR 762890496,762890751,TW 762890752,762891007,HK @@ -10903,7 +11131,7 @@ 763182080,763183103,IN 763183104,763183615,HK 763183616,763183871,LT -763183872,763184127,HK +763183872,763184127,JP 763184128,763185151,IN 763186176,763194367,CN 763194368,763196415,HK @@ -10913,7 +11141,9 @@ 763200512,763201535,IN 763201536,763202559,CN 763202560,763207679,IN -763207680,763209727,HK +763207680,763208703,HK +763208704,763208959,US +763208960,763209727,HK 763209728,763210751,NZ 763210752,763214847,IN 763214848,763215871,JP @@ -10972,7 +11202,9 @@ 763280384,763281407,IN 763281408,763282431,AU 763282432,763285503,IN -763285504,763286527,SG +763285504,763286017,SG +763286018,763286018,US +763286019,763286527,SG 763286528,763287551,CN 763287552,763288575,HK 763288576,763289599,CN @@ -10988,6 +11220,7 @@ 763299840,763301887,CN 763301888,763304959,IN 763304960,763305983,JP +763305984,763307007,SG 763307008,763308031,CN 763308032,763310079,IN 763310080,763311103,BD @@ -11022,7 +11255,10 @@ 763343872,763344895,AU 763344896,763345919,HK 763345920,763353087,IN -763353088,763354111,CN +763353088,763353343,HK +763353344,763353599,CN +763353600,763353855,TW +763353856,763354111,CN 763354112,763360255,IN 763360256,763362303,BD 763362304,763363327,VN @@ -11037,6 +11273,7 @@ 768868352,769130495,ZM 769130496,769392639,MA 769392640,769404927,ZA +769404928,769405183,TZ 769405184,769405439,ZA 769405440,769405951,CI 769405952,769406975,GN @@ -11214,7 +11451,8 @@ 771683840,771684095,MV 771684096,771684351,MH 771684352,771685375,CN -771685376,771686399,HK +771685376,771685631,JP +771685632,771686399,HK 771686400,771719167,CN 771719168,771720191,US 771720192,771750911,CN @@ -11229,9 +11467,7 @@ 772282624,772282879,KZ 772282880,772283391,RU 772283392,772283647,ES -772283648,772284159,RU -772284160,772284415,UZ -772284416,772284927,RU +772283648,772284927,RU 772284928,772285183,UA 772285184,772285439,UZ 772285440,772285695,RU @@ -11701,7 +11937,8 @@ 774162739,774162743,UA 774162744,774162778,US 774162779,774162784,CA -774162785,774162788,UA +774162785,774162787,UA +774162788,774162788,VA 774162789,774162798,CA 774162799,774162803,BN 774162804,774162808,TM @@ -11893,9 +12130,9 @@ 778304306,778304306,SI 778304307,778305535,AL 778305536,778371071,IR -778371072,778388893,GB -778388894,778388894,DE -778388895,778395647,GB +778371072,778388479,GB +778388480,778389503,DE +778389504,778395647,GB 778395648,778436607,DE 778436608,778461183,RO 778461184,778461439,TR @@ -11908,7 +12145,7 @@ 778466304,778467327,RO 778467328,778473471,IR 778473472,778474495,RO -778474496,778475519,GB +778474496,778475519,US 778475520,778475775,CH 778475776,778476031,RO 778476032,778476287,MD @@ -11916,7 +12153,9 @@ 778477568,778477695,NL 778477696,778480639,RO 778480640,778480895,MD -778480896,778481663,RO +778480896,778481151,RO +778481152,778481407,GB +778481408,778481663,RO 778481664,778481919,MD 778481920,778482943,GB 778482944,778483199,MD @@ -11983,9 +12222,7 @@ 778666880,778666943,GB 778666944,778667175,FR 778667176,778667179,ES -778667180,778667295,FR -778667296,778667311,GB -778667312,778667347,FR +778667180,778667347,FR 778667348,778667351,GB 778667352,778667499,FR 778667500,778667503,GB @@ -12369,7 +12606,9 @@ 781975552,782106623,NO 782106624,782254079,RU 782254080,782270463,UA -782270464,782313471,RU +782270464,782311167,RU +782311168,782311423,UA +782311424,782313471,RU 782313472,782313727,UA 782313728,782317567,RU 782317568,782317695,IN @@ -12424,9 +12663,7 @@ 782667776,782671871,NL 782671872,782672655,LT 782672656,782672663,VG -782672664,782672783,LT -782672784,782672791,CH -782672792,782672871,LT +782672664,782672871,LT 782672872,782672879,IL 782672880,782673935,LT 782673936,782673943,EE @@ -12775,15 +13012,11 @@ 786919880,786919887,IT 786919888,786920191,GB 786920192,786920199,IT -786920200,786920223,GB -786920224,786920231,IT -786920232,786920615,GB +786920200,786920615,GB 786920616,786920623,IT 786920624,786920839,GB 786920840,786920847,IT -786920848,786920855,GB -786920856,786920863,IT -786920864,786920999,GB +786920848,786920999,GB 786921000,786921007,IT 786921008,786921087,GB 786921088,786921095,IT @@ -12939,8 +13172,7 @@ 787711488,787711999,GB 787712000,787712255,MT 787712256,787712511,MA -787712512,787712767,DE -787712768,787713023,IT +787712512,787713023,DE 787713024,787713279,LV 787713280,787713535,SE 787713536,787713791,BG @@ -12954,13 +13186,16 @@ 787715584,787715839,BH 787715840,787718143,NL 787718144,787718655,RU -787718656,787720191,NL -787720192,787722239,RU +787718656,787719167,NL +787719168,787722239,RU 787722240,787722751,NL 787722752,787725311,RU -787725312,787742207,NL -787742208,787742463,RU -787742464,787750143,NL +787725312,787741695,NL +787741696,787741951,RU +787741952,787742207,NL +787742208,787742719,RU +787742720,787749887,NL +787749888,787750143,US 787750144,787750159,BD 787750160,787750175,BT 787750176,787750191,BN @@ -12977,7 +13212,9 @@ 787750336,787750351,PK 787750352,787750367,PG 787750368,787750383,LK -787750384,787750911,NL +787750384,787750399,NL +787750400,787750655,US +787750656,787750911,NL 787750912,787755007,GB 787755008,787759103,NL 787759104,787767295,PS @@ -13069,7 +13306,9 @@ 788261376,788261631,GB 788261632,788262143,DE 788262144,788262399,IR -788262400,788267007,DE +788262400,788265215,DE +788265216,788265727,ES +788265728,788267007,DE 788267008,788271103,SE 788271104,788275199,DE 788275200,788279295,AL @@ -13173,9 +13412,7 @@ 789577728,790102015,US 790102016,790429695,CA 790429696,790626303,IN -790626304,790841343,US -790841344,790841599,CA -790841600,792002559,US +790626304,792002559,US 792002560,792068095,IT 792068096,792199167,CA 792199168,792330239,US @@ -13183,14 +13420,17 @@ 792723456,793247743,DE 793247744,793313279,NZ 793313280,793378815,DE -793378816,794329087,US +793378816,793395199,JP +793395200,794329087,US 794329088,794361855,SG 794361856,794369288,HK 794369289,794369289,CN 794369290,794378239,HK 794378240,794427391,US 794427392,794460159,HK -794460160,794558463,US +794460160,794492927,US +794492928,794501119,JP +794501120,794558463,US 794558464,796917759,CN 796917760,797442047,CA 797442048,800522240,US @@ -13280,7 +13520,7 @@ 832312320,832313343,ID 832313344,832315391,AU 832315392,832319487,KH -832319488,832320511,NU +832319488,832320511,NZ 832320512,832321535,VN 832321536,832323583,ID 832323584,832348159,IN @@ -13349,7 +13589,8 @@ 839348480,839348735,AT 839348736,839348991,GB 839348992,839349247,AT -839349248,839350271,DE +839349248,839349759,DE +839349760,839350271,US 839350272,839351295,NL 839351296,839352063,DE 839352064,839357439,NL @@ -13457,7 +13698,9 @@ 871038976,871104511,SA 871104512,872153087,GB 872153088,872284159,SA -872284160,872286871,FR +872284160,872286271,FR +872286272,872286335,ES +872286336,872286871,FR 872286872,872286875,CZ 872286876,872288159,FR 872288160,872288191,ES @@ -13515,7 +13758,9 @@ 872304832,872304895,ES 872304896,872305439,FR 872305440,872305471,GB -872305472,872306183,FR +872305472,872305655,FR +872305656,872305663,GB +872305664,872306183,FR 872306184,872306191,US 872306192,872306367,FR 872306368,872306399,GB @@ -13552,7 +13797,9 @@ 872316799,872321183,FR 872321184,872321215,FI 872321216,872321279,ES -872321280,872322943,FR +872321280,872321379,FR +872321380,872321383,GB +872321384,872322943,FR 872322944,872323071,GB 872323072,872323135,FR 872323136,872323199,ES @@ -13618,7 +13865,9 @@ 872346816,872346879,ES 872346880,872346978,FR 872346979,872346979,DE -872346980,872347063,FR +872346980,872347039,FR +872347040,872347055,GB +872347056,872347063,FR 872347064,872347067,PT 872347068,872348959,FR 872348960,872348975,GB @@ -13669,9 +13918,7 @@ 872374592,872374655,ES 872374656,872375007,FR 872375008,872375039,PT -872375040,872375215,FR -872375216,872375231,ES -872375232,872375295,FR +872375040,872375295,FR 872375296,872375423,NL 872375424,872375807,FR 872375808,872375871,GB @@ -13828,7 +14075,9 @@ 878579456,878579711,GB 878579712,878579967,US 878579968,878580223,DE -878580224,878581759,US +878580224,878580735,US +878580736,878580991,IN +878580992,878581759,US 878581760,878582783,IE 878582784,878583807,US 878583808,878591999,GB @@ -13884,7 +14133,8 @@ 878657536,878666751,IN 878666752,878667775,US 878667776,878668799,IE -878668800,878669823,US +878668800,878669567,US +878669568,878669823,KR 878669824,878673919,IE 878673920,878675967,AU 878675968,878676735,BR @@ -13917,9 +14167,13 @@ 878706512,878706559,US 878706560,878706575,DE 878706576,878706591,CN -878706592,879763583,US +878706592,879757055,US +879757056,879757311,CA +879757312,879763583,US 879763584,879763711,CA -879763712,879788031,US +879763712,879772543,US +879772544,879772671,CA +879772672,879788031,US 879788032,879788159,NL 879788160,879788287,IE 879788288,879788543,GB @@ -13953,7 +14207,10 @@ 879821440,879821567,HK 879821568,879821695,SG 879821696,879821823,KR -879821824,879829119,US +879821824,879822079,JP +879822080,879822335,AU +879822336,879822591,IN +879822592,879829119,US 879829120,879829247,SG 879829248,879829375,JP 879829376,879829503,HK @@ -13969,7 +14226,10 @@ 879837504,879837567,HK 879837568,879837631,SG 879837632,879837695,KR -879837696,879841343,US +879837696,879837823,JP +879837824,879837951,AU +879837952,879838079,IN +879838080,879841343,US 879841344,879841407,SG 879841408,879841471,JP 879841472,879841535,HK @@ -13979,7 +14239,9 @@ 879841792,879841919,KR 879841920,880216831,US 880216832,880217087,CA -880217088,880269311,US +880217088,880263167,US +880263168,880264191,IE +880264192,880269311,US 880269312,880271359,JP 880271360,880543743,US 880543744,880545791,CA @@ -14000,14 +14262,58 @@ 880879234,880879234,CA 880879235,880881663,US 880881664,880885759,PR -880885760,881859327,US +880885760,881360895,US +881360896,881377279,GB +881377280,881410047,NL +881410048,881459199,US +881459200,881475583,CA +881475584,881491967,US +881491968,881524735,IE +881524736,881557503,CA +881557504,881573887,HK +881573888,881590271,SG +881590272,881639423,IN +881639424,881655807,JP +881655808,881672191,KR +881672192,881737727,US +881737728,881754111,IE +881754112,881770495,GB +881770496,881786879,NL +881786880,881819647,US +881819648,881836031,FR +881836032,881859327,US 881859328,881859583,CA 881859584,881868799,US 881868800,881876991,IT -881876992,882843337,US +881876992,882130943,US +882130944,882147327,SG +882147328,882163711,US +882163712,882180095,NL +882180096,882196479,US +882196480,882212863,NL +882212864,882327551,US +882327552,882343935,GB +882343936,882573311,US +882573312,882581503,CA +882581504,882589695,US +882589696,882597887,IE +882597888,882606079,JP +882606080,882638847,IE +882638848,882647039,CA +882647040,882655231,JP +882655232,882679807,US +882679808,882687999,AU +882688000,882704383,IE +882704384,882720767,US +882720768,882769919,NL +882769920,882802687,IE +882802688,882810879,AU +882810880,882843337,US 882843340,882843751,US -882843754,882851942,US -882851944,883097599,US +882843754,882851839,US +882851840,882851942,IN +882851944,882860031,IN +882860032,883097599,US 883097600,883163135,SG 883163136,883228671,IE 883228672,883294207,US @@ -14070,7 +14376,10 @@ 887652352,887654399,CA 887654400,887656447,AU 887656448,887656959,KR -887656960,887685119,US +887656960,887657215,US +887657216,887657471,NL +887657472,887657727,IE +887657728,887685119,US 887685120,887701503,CA 887701504,887717887,US 887717888,887750655,NL @@ -14097,7 +14406,14 @@ 888116288,888116351,CA 888116352,888120447,US 888120448,888120511,CA -888120512,888274943,US +888120512,888120735,US +888120736,888120767,KR +888120768,888120831,GB +888120832,888126207,US +888126208,888126335,GB +888126336,888126719,IN +888126720,888127103,CA +888127104,888274943,US 888274944,888291327,CA 888291328,888348671,US 888348672,888356863,JP @@ -14117,7 +14433,12 @@ 888488960,888491007,US 888491008,888492031,IN 888492032,888493055,SG -888493056,888569855,US +888493056,888494079,IN +888494080,888495103,IE +888495104,888496127,JP +888496128,888497151,IN +888497152,888498175,KR +888498176,888569855,US 888569856,888573951,HK 888573952,888578047,US 888578048,888586239,JP @@ -14126,9 +14447,19 @@ 888758272,889016319,US 889016320,889020415,SG 889020416,889028607,JP -889028608,889061375,US -889061376,889094143,JP -889094144,889192447,US +889028608,889036799,US +889036800,889039871,IN +889039872,889041919,JP +889041920,889042943,NL +889042944,889043967,IE +889043968,889046015,KR +889046016,889048063,CA +889048064,889050111,AU +889050112,889051135,SG +889051136,889052159,HK +889052160,889135103,US +889135104,889143295,AU +889143296,889192447,US 889192448,897238054,DE 897238056,905969663,DE 905969664,910163967,US @@ -14156,7 +14487,9 @@ 916191011,916193279,IE 916193280,916979711,US 916979712,917045247,JP -917045248,917110783,SG +917045248,917089018,SG +917089019,917089019,IN +917089020,917110783,SG 917110784,917241855,IE 917241856,917635071,US 917635072,917700607,JP @@ -14202,9 +14535,7 @@ 921657344,921657599,JP 921657600,921658111,US 921658112,921658879,IE -921658880,921661951,US -921661952,921662207,IE -921662208,921662463,US +921658880,921662463,US 921662464,921665535,KR 921665536,921747455,US 921747456,921748479,AU @@ -14220,10 +14551,7 @@ 921755648,921755903,US 921755904,921756159,JP 921756160,921756671,SG -921756672,921758719,US -921758720,921759743,KR -921759744,921759999,DE -921760000,921760767,US +921756672,921760767,US 921760768,921761791,BR 921761792,922091519,US 922091520,922189311,IE @@ -14523,8 +14851,8 @@ 962854912,962856959,SG 962856960,964689919,FR 964689920,968753151,BE -968753152,968761343,NL -968761344,968818687,CH +968753152,968757247,NL +968757248,968818687,CH 968818688,968819711,DE 968819712,968851455,BE 968851456,968852479,US @@ -14912,7 +15240,9 @@ 1026408448,1026416639,JP 1026416640,1026420735,CN 1026420736,1026422783,JP -1026422784,1026424831,AU +1026422784,1026423039,AU +1026423040,1026423295,SG +1026423296,1026424831,AU 1026424832,1026490623,JP 1026490624,1026491135,SG 1026491136,1026491903,JP @@ -15006,7 +15336,9 @@ 1040449536,1040457727,FR 1040457728,1040465919,ME 1040465920,1040474111,DE -1040474112,1040482303,CZ +1040474112,1040477183,CZ +1040477184,1040477184,KG +1040477185,1040482303,CZ 1040482304,1040515071,BE 1040515072,1040547839,GB 1040547840,1040580607,RU @@ -15150,10 +15482,11 @@ 1043897344,1043897855,NG 1043897856,1043899391,GB 1043899392,1043899647,CG -1043899648,1043907071,GB -1043907072,1043907327,NG -1043907328,1043910143,GB -1043910400,1043919442,GB +1043899648,1043902463,GB +1043902464,1043908607,US +1043908608,1043910143,DE +1043910400,1043910655,DE +1043910656,1043919442,GB 1043919443,1043919443,SS 1043919444,1043920895,GB 1043920896,1043921919,UG @@ -15202,7 +15535,9 @@ 1044589056,1044589311,DE 1044589312,1044625631,GB 1044625632,1044625647,RS -1044625648,1044636671,GB +1044625648,1044627391,GB +1044627392,1044627455,ES +1044627456,1044636671,GB 1044636672,1044637695,DE 1044637696,1044638463,GB 1044638464,1044638719,DE @@ -15222,7 +15557,9 @@ 1044692423,1044692423,IM 1044692424,1044692991,GG 1044692992,1044697087,AT -1044697088,1044699135,DE +1044697088,1044697343,DE +1044697344,1044698111,AT +1044698112,1044699135,DE 1044699136,1044701183,AT 1044701184,1044709375,EG 1044709376,1044717567,RU @@ -15320,7 +15657,8 @@ 1045323776,1045364735,FI 1045364736,1045430271,DK 1045430272,1045446655,DE -1045446656,1045454847,SK +1045446656,1045453823,HU +1045453824,1045454847,SK 1045454848,1045460991,DE 1045460992,1045461503,FR 1045461504,1045461631,DE @@ -15346,9 +15684,7 @@ 1045755904,1045757951,UA 1045757952,1045790719,LV 1045790720,1045798911,FR -1045798912,1045824355,IT -1045824356,1045824359,SI -1045824360,1045889023,IT +1045798912,1045889023,IT 1045889024,1045921791,ES 1045921792,1045954559,PL 1045954560,1045987327,BE @@ -15393,7 +15729,9 @@ 1046482952,1046482952,DE 1046482953,1046483199,GB 1046483200,1046483231,DE -1046483232,1046485303,GB +1046483232,1046484711,GB +1046484712,1046484719,DE +1046484720,1046485303,GB 1046485304,1046485311,DE 1046485312,1046485903,GB 1046485904,1046485911,DE @@ -15455,11 +15793,7 @@ 1046498688,1046498695,DE 1046498696,1046498799,GB 1046498800,1046498807,DE -1046498808,1046499255,GB -1046499256,1046499263,DE -1046499264,1046499367,GB -1046499368,1046499375,DE -1046499376,1046502106,GB +1046498808,1046502106,GB 1046502107,1046502108,DE 1046502109,1046503095,GB 1046503096,1046503103,DE @@ -15493,7 +15827,9 @@ 1046525952,1046527999,DE 1046528000,1046528335,GB 1046528336,1046528383,DE -1046528384,1046528535,GB +1046528384,1046528505,GB +1046528506,1046528506,DE +1046528507,1046528535,GB 1046528536,1046528543,DE 1046528544,1046529023,GB 1046529024,1046530047,DE @@ -15507,8 +15843,8 @@ 1046533538,1046533538,DE 1046533539,1046533615,GB 1046533616,1046533631,DE -1046533632,1046535439,GB -1046535440,1046535448,DE +1046533632,1046535447,GB +1046535448,1046535448,DE 1046535449,1046535623,GB 1046535624,1046535631,DE 1046535632,1046535665,GB @@ -15552,10 +15888,10 @@ 1046773760,1046781951,FR 1046781952,1046791167,GB 1046791168,1046792191,IT -1046792192,1046793215,IN +1046792192,1046793215,US 1046793216,1046794239,GB -1046794240,1046794495,US -1046794496,1046796287,GB +1046794240,1046795007,US +1046795008,1046796287,GB 1046796288,1046797311,US 1046797312,1046798335,GB 1046798336,1046806527,HU @@ -15759,6 +16095,7 @@ 1048981248,1048981503,GB 1048987480,1048987487,DE 1048991960,1048991967,DE +1048992528,1048992535,DE 1049006080,1049006335,DE 1049008128,1049009151,DE 1049016320,1049018367,DE @@ -15797,14 +16134,10 @@ 1049493504,1049559039,FI 1049559040,1049698303,DE 1049698304,1049699071,NL -1049699328,1049699583,NL -1049699584,1049699839,BW -1049699840,1049700351,NL +1049699328,1049700351,NL 1049700352,1049702399,DE 1049702400,1049706495,NL -1049706496,1049716735,GB -1049716736,1049717759,IQ -1049717760,1049722879,GB +1049706496,1049722879,GB 1049722880,1049731071,IS 1049731072,1049739263,FI 1049739264,1049755647,NL @@ -15919,7 +16252,7 @@ 1051984752,1051984767,DE 1051990016,1051991039,DE 1052001280,1052002303,DE -1052011264,1052012031,DE +1052011264,1052012287,DE 1052017536,1052017567,DE 1052041216,1052041471,DE 1052041472,1052043215,GB @@ -17006,9 +17339,7 @@ 1056874752,1056874943,IE 1056874944,1056874975,GB 1056874976,1056875007,IE -1056875008,1056875663,GB -1056875664,1056875671,IE -1056875672,1056964607,GB +1056875008,1056964607,GB 1056964608,1061227263,US 1061227264,1061227519,BO 1061227520,1061558271,US @@ -17067,7 +17398,11 @@ 1064221952,1064222207,MX 1064222208,1064445183,US 1064445184,1064445439,PK -1064445440,1065493759,US +1064445440,1065372927,US +1065372928,1065372959,PR +1065372960,1065372991,US +1065372992,1065373055,PR +1065373056,1065493759,US 1065493760,1065494015,GB 1065494016,1065506047,US 1065506048,1065506559,GB @@ -17151,7 +17486,9 @@ 1068017664,1068018175,YE 1068018176,1068123135,US 1068123136,1068123647,BB -1068123648,1068175871,US +1068123648,1068157847,US +1068157848,1068157851,CA +1068157852,1068175871,US 1068175872,1068176383,YE 1068176384,1068199935,US 1068199936,1068204031,CA @@ -17455,21 +17792,23 @@ 1074937856,1074946047,CA 1074946048,1074962431,US 1074962432,1074970623,CA -1074970624,1075265535,US +1074970624,1074976703,US +1074976704,1074976735,GB +1074976736,1075265535,US 1075265536,1075269631,KR 1075269632,1075421183,US 1075421184,1075429375,CA 1075429376,1075478527,US 1075478528,1075494911,CA -1075494912,1075576831,US +1075494912,1075558655,US +1075558656,1075558911,VI +1075558912,1075576831,US 1075576832,1075576895,NO 1075576896,1075576896,SE 1075576897,1075585023,NO 1075585024,1075609599,US 1075609600,1075613695,TT -1075617792,1075769343,US -1075769344,1075773439,CA -1075773440,1075855359,US +1075617792,1075855359,US 1075855360,1075871743,DO 1075871744,1075904511,US 1075904512,1075920895,JP @@ -17535,9 +17874,7 @@ 1076005632,1076006399,US 1076006400,1076006655,CA 1076006656,1076006911,US -1076006912,1076007167,CA -1076007168,1076007423,US -1076007424,1076007935,CA +1076006912,1076007935,CA 1076007936,1076008447,US 1076008448,1076009215,CA 1076009216,1076009727,US @@ -17601,14 +17938,13 @@ 1076424704,1076428799,CA 1076428800,1076543487,US 1076543488,1076559871,CA -1076559872,1076625407,US -1076690944,1076756479,US +1076559872,1076756479,US 1076756480,1076772863,CA 1076772864,1076823009,US 1076823010,1076823011,CR 1076823012,1076850687,US -1076850688,1076850943,CA -1076850944,1076855044,US +1076850688,1076851711,CA +1076851712,1076855044,US 1076855045,1076855045,MX 1076855046,1076879505,US 1076879506,1076879507,CA @@ -17658,9 +17994,7 @@ 1077977088,1077985279,CA 1077985280,1077993471,US 1077993472,1078001663,CA -1078001664,1078065039,US -1078065040,1078065047,CA -1078065048,1078067199,US +1078001664,1078067199,US 1078067200,1078071295,BS 1078071296,1078075391,CA 1078075392,1078124543,US @@ -17735,7 +18069,9 @@ 1078517760,1078525951,CA 1078525952,1078575359,US 1078575360,1078575615,CA -1078575616,1078722559,US +1078575616,1078594815,US +1078594816,1078594943,HK +1078594944,1078722559,US 1078722560,1078734847,AR 1078734848,1078737919,CO 1078737920,1078738943,EC @@ -17765,9 +18101,7 @@ 1079320576,1079322831,CA 1079322832,1079322839,US 1079322840,1079328767,CA -1079328768,1079378175,US -1079378176,1079378943,CA -1079378944,1079379199,US +1079328768,1079379199,US 1079379200,1079379455,CA 1079379456,1079383039,US 1079383040,1079383295,VG @@ -17840,15 +18174,13 @@ 1079567360,1079567615,AU 1079567616,1079574527,US 1079574528,1079578623,PR -1079582720,1079623679,US +1079578624,1079623679,US 1079623680,1079627775,PR 1079627776,1079664639,US 1079664640,1079668735,CA 1079668736,1079669247,US 1079669248,1079669759,NL -1079669760,1079675903,US -1079675904,1079676415,CA -1079676416,1079861247,US +1079669760,1079861247,US 1079861248,1079865343,CA 1079865344,1079917055,US 1079917056,1079917311,KY @@ -17909,7 +18241,9 @@ 1081037312,1081037567,CA 1081037568,1081038335,US 1081038336,1081040895,CA -1081040896,1081212927,US +1081040896,1081129983,US +1081129984,1081130495,CA +1081130496,1081212927,US 1081212928,1081278463,CA 1081278464,1081369599,US 1081369600,1081370111,CO @@ -17983,7 +18317,9 @@ 1082945536,1082949631,CA 1082949632,1082982399,US 1082982400,1083015167,CA -1083015168,1083267583,US +1083015168,1083142399,US +1083142400,1083142655,IN +1083142656,1083267583,US 1083267584,1083268095,JP 1083268096,1083396095,US 1083396096,1083400191,BM @@ -18040,7 +18376,9 @@ 1087405408,1087405423,MX 1087405424,1087413895,US 1087413896,1087413903,DE -1087413904,1087416985,US +1087413904,1087414783,US +1087414784,1087415039,CA +1087415040,1087416985,US 1087416986,1087416986,GB 1087416987,1087418367,US 1087418368,1087419391,GB @@ -18059,7 +18397,7 @@ 1087466888,1087496703,US 1087496704,1087496959,CA 1087496960,1087501471,US -1087501472,1087501479,GB +1087501472,1087501479,HK 1087501480,1087501535,US 1087501536,1087501695,HK 1087501696,1087501775,US @@ -18094,19 +18432,21 @@ 1087725568,1087726015,GB 1087726016,1087726047,FR 1087726048,1087727615,GB -1087727616,1087741951,US +1087727616,1087735743,US +1087735744,1087735807,CA +1087735808,1087741951,US 1087741952,1087743569,FR 1087743570,1087743570,GB 1087743571,1087743597,FR 1087743598,1087743598,US 1087743599,1087746047,FR 1087746048,1087758335,US -1087758336,1087761919,PR -1087761920,1087762431,US -1087762432,1087766527,PR +1087758336,1087766527,PR 1087766528,1087798943,US 1087798944,1087798975,CA -1087798976,1087837359,US +1087798976,1087821567,US +1087821568,1087821823,GB +1087821824,1087837359,US 1087837360,1087837367,BR 1087837368,1087837695,US 1087837696,1087837951,BR @@ -18127,9 +18467,7 @@ 1087950120,1088012767,US 1088012768,1088012775,PR 1088012776,1088684031,US -1088684032,1088740351,CA -1088740352,1088741375,US -1088741376,1088946175,CA +1088684032,1088946175,CA 1088946176,1089055999,US 1089056256,1089057279,US 1089057536,1089151231,US @@ -18138,7 +18476,9 @@ 1089152256,1089152511,NL 1089152512,1089153279,US 1089153280,1089153535,SG -1089153536,1089167359,US +1089153536,1089154303,US +1089154304,1089154559,SG +1089154560,1089167359,US 1089167360,1089171455,CA 1089171456,1089183231,US 1089183232,1089183487,GB @@ -18176,14 +18516,8 @@ 1089462528,1089462783,US 1089462784,1089463039,CA 1089463040,1089463295,US -1089463296,1089464319,CA -1089464320,1089465855,US -1089465856,1089466367,GB -1089466368,1089526783,US -1089526784,1089527039,VE -1089527040,1089579519,US -1089579520,1089580031,VE -1089580032,1089881599,US +1089463296,1089465343,CA +1089465344,1089881599,US 1089881600,1089882111,GB 1089882112,1089882623,US 1089882624,1089883135,GB @@ -18274,8 +18608,8 @@ 1093120416,1093120431,CA 1093120432,1093120511,US 1093120512,1093120767,GB -1093120768,1093121023,US -1093121024,1093122047,CA +1093120768,1093121535,US +1093121536,1093122047,CA 1093122048,1093122175,US 1093122176,1093122303,CA 1093122304,1093122751,US @@ -18286,13 +18620,13 @@ 1093123952,1093123967,CA 1093123968,1093126143,US 1093126144,1093126399,CA -1093126400,1093126911,US -1093126912,1093127167,CA -1093127168,1093128447,US -1093128448,1093129215,CA +1093126400,1093128447,US +1093128448,1093128703,CA +1093128704,1093128959,US +1093128960,1093129215,CA 1093129216,1093130751,US -1093130752,1093131007,CA -1093131008,1093132543,US +1093130752,1093131263,CA +1093131264,1093132543,US 1093132544,1093133055,CA 1093133056,1093135359,US 1093135360,1093135615,CA @@ -18347,12 +18681,7 @@ 1094064872,1094064887,IE 1094064888,1094065087,US 1094065088,1094065119,IE -1094065120,1094065151,US -1094065152,1094065535,NL -1094065536,1094065855,US -1094065856,1094066047,NL -1094066048,1094066159,US -1094066160,1094066175,NL +1094065120,1094066175,US 1094066176,1094066407,IE 1094066408,1094066415,US 1094066416,1094066431,IE @@ -18390,7 +18719,9 @@ 1094124544,1094124799,IE 1094124800,1094139039,US 1094139040,1094139051,IE -1094139052,1094146047,US +1094139052,1094139063,US +1094139064,1094139067,CN +1094139068,1094146047,US 1094146048,1094146079,KR 1094146080,1094146111,HK 1094146112,1094146143,SG @@ -18435,20 +18766,18 @@ 1097785344,1097830399,US 1097830400,1097834495,CA 1097834496,1097896191,US -1097896192,1097896447,VI -1097896448,1097896959,US -1097896960,1097897215,VI -1097897216,1097948415,US -1097948416,1097948927,VI -1097948928,1097951743,US -1097951744,1097951999,VI -1097952000,1097952255,US -1097952256,1097953279,VI +1097896192,1097897471,VI +1097897472,1097947135,US +1097947136,1097949183,VI +1097949184,1097951231,US +1097951232,1097953279,VI 1097953280,1098070271,US 1098070272,1098070279,GR 1098070280,1098070295,US 1098070296,1098070303,BE -1098070304,1098178383,US +1098070304,1098096287,US +1098096288,1098096295,BR +1098096296,1098178383,US 1098178384,1098178391,CA 1098178392,1098891623,US 1098891624,1098891631,AU @@ -18480,9 +18809,7 @@ 1101425920,1101426175,EC 1101426176,1101459455,US 1101459456,1101461503,BB -1101461504,1101469695,US -1101469696,1101471743,HN -1101471744,1101475839,US +1101461504,1101475839,US 1101475840,1101479935,CO 1101479936,1101484031,US 1101484032,1101488127,CO @@ -18514,9 +18841,7 @@ 1101869056,1101869567,GH 1101869568,1101871103,US 1101871104,1101873151,BO -1101873152,1101905407,US -1101905408,1101905663,GH -1101905664,1101992063,US +1101873152,1101992063,US 1101992064,1101992191,NL 1101992192,1102004735,US 1102004736,1102004991,IN @@ -18637,7 +18962,9 @@ 1109934592,1109934847,GB 1109934848,1110126591,US 1110126592,1110130687,CA -1110130688,1110270207,US +1110130688,1110248623,US +1110248624,1110248631,CA +1110248632,1110270207,US 1110270208,1110270335,CA 1110270336,1110310911,US 1110310912,1110376447,CA @@ -18677,11 +19004,13 @@ 1110473984,1110474239,CA 1110474240,1110540287,US 1110540288,1110573055,CA -1110573056,1110587391,PR -1110587392,1110595776,US -1110595777,1110598655,PR -1110598656,1110599167,US -1110599168,1110638591,PR +1110573056,1110591487,PR +1110591488,1110593023,US +1110593024,1110593279,PR +1110593280,1110593535,US +1110593536,1110595583,PR +1110595584,1110595776,US +1110595777,1110638591,PR 1110638592,1110642687,US 1110642688,1110644735,CA 1110644736,1110654463,US @@ -18712,19 +19041,21 @@ 1111228416,1111244799,AR 1111244800,1111982079,US 1111982080,1111998463,IT -1111998464,1112424447,US +1111998464,1112408063,US +1112408064,1112410111,IL +1112410112,1112412671,US +1112412672,1112413183,NL +1112413184,1112413695,CH +1112413696,1112414207,CA +1112414208,1112424447,US 1112432640,1112440831,CA 1112440832,1112498175,US -1112498176,1112500223,IR -1112500224,1112500735,US -1112500736,1112501247,IR -1112501248,1112502271,US -1112502272,1112502527,IR -1112502528,1112502783,US -1112502784,1112504319,IR -1112504320,1112530943,US +1112498176,1112506367,IR +1112506368,1112530943,US 1112530944,1112539135,CA -1112539136,1112867327,US +1112539136,1112653823,US +1112653824,1112657919,VG +1112657920,1112867327,US 1112867328,1112867583,BS 1112867584,1112869887,US 1112869888,1112870143,CA @@ -18738,8 +19069,7 @@ 1112907776,1112907783,CA 1112907784,1112931327,US 1112931328,1112931839,CA -1112931840,1112932095,US -1112932352,1113591807,US +1112931840,1113591807,US 1113591808,1113595903,CA 1113595904,1113596415,CL 1113596416,1113596927,GT @@ -18763,9 +19093,9 @@ 1113661440,1113669631,US 1113669632,1113677823,CA 1113677824,1113681919,US -1113686016,1113696575,US -1113696576,1113696639,CA -1113696640,1113718783,US +1113686016,1113697279,US +1113697280,1113697791,BM +1113697792,1113718783,US 1113718784,1113743359,DO 1113743360,1113854207,US 1113854208,1113854463,CA @@ -18794,8 +19124,8 @@ 1114513408,1114513471,SA 1114513472,1114513571,US 1114513572,1114513599,SA -1114513600,1114514687,US -1114514688,1114515455,SA +1114513600,1114514719,US +1114514720,1114515455,SA 1114515456,1114515463,US 1114515464,1114515471,CA 1114515472,1114517503,US @@ -18819,9 +19149,7 @@ 1114681344,1114685439,CA 1114685440,1114730495,US 1114730496,1114734591,CA -1114734592,1114877183,US -1114877184,1114877439,CY -1114877440,1115112575,US +1114734592,1115112575,US 1115112576,1115112607,IN 1115112608,1115113471,US 1115113472,1115114495,HN @@ -18829,9 +19157,7 @@ 1115114752,1115115007,GT 1115115008,1115115519,US 1115115520,1115116543,HN -1115116544,1115117055,US -1115117056,1115117311,GB -1115117312,1115117567,US +1115116544,1115117567,US 1115117568,1115118591,HN 1115118592,1115119615,SV 1115119616,1115127807,US @@ -18933,9 +19259,7 @@ 1118141184,1118141439,CA 1118141440,1118141695,US 1118141696,1118141951,CA -1118141952,1118155183,US -1118155184,1118155199,CA -1118155200,1118158847,US +1118141952,1118158847,US 1118158848,1118167039,CA 1118167040,1118474239,US 1118474240,1118478335,CA @@ -18990,7 +19314,9 @@ 1118989312,1118989823,KE 1118989824,1118994175,US 1118994176,1118994431,LR -1118994432,1119109119,US +1118994432,1119072255,US +1119072256,1119073279,CA +1119073280,1119109119,US 1119109120,1119109375,CA 1119109376,1119109631,US 1119109632,1119109887,CA @@ -19171,16 +19497,19 @@ 1121005568,1121009663,CA 1121009664,1121038335,US 1121038336,1121042431,CA -1121042432,1121230847,US +1121042432,1121203199,US +1121203200,1121204223,JM +1121204224,1121205247,US +1121205248,1121205759,PR +1121205760,1121206271,VC +1121206272,1121230847,US 1121230848,1121239039,CA 1121239040,1121247231,US 1121247232,1121250303,CA 1121250304,1121250815,BZ 1121250816,1121252863,CA 1121252864,1121253119,BZ -1121253120,1121253887,CA -1121253888,1121254143,BZ -1121254144,1121255423,CA +1121253120,1121255423,CA 1121255424,1121763327,US 1121763328,1121767423,CA 1121767424,1121878015,US @@ -19208,14 +19537,18 @@ 1122476032,1122480127,PR 1122480128,1122493439,US 1122493440,1122493951,PR -1122493952,1122497327,US +1122493952,1122494463,US +1122494464,1122496511,PR +1122496512,1122497327,US 1122497328,1122497343,BR 1122497344,1122533375,US 1122533376,1122535423,GB 1122535424,1122538495,KR 1122538496,1122635775,US 1122635776,1122639871,CA -1122639872,1123123199,US +1122639872,1122667071,US +1122667072,1122667135,CH +1122667136,1123123199,US 1123123200,1123127295,CA 1123127296,1123180543,US 1123180544,1123184639,CA @@ -19346,7 +19679,9 @@ 1128817408,1128817663,NL 1128817664,1130535935,US 1130535936,1130536191,FR -1130536192,1133461247,US +1130536192,1130536959,US +1130536960,1130539007,GU +1130539008,1133461247,US 1133461248,1133461503,CA 1133461504,1133785351,US 1133785352,1133785359,IE @@ -19387,16 +19722,17 @@ 1137524736,1137541119,CA 1137541120,1137623039,US 1137623040,1137639423,PR -1137639424,1137681583,US +1137639424,1137656831,US +1137656832,1137657855,GB +1137657856,1137658879,DE +1137658880,1137681583,US 1137681584,1137681599,AR 1137681600,1137704959,US 1137704960,1137712383,CA 1137712384,1137712639,US 1137712640,1137713151,CA 1137713152,1137717247,US -1137721344,1137758207,US -1137758208,1137758463,GB -1137758464,1137836031,US +1137721344,1137836031,US 1137840128,1137840383,CA 1137840384,1137840895,US 1137840896,1137841151,DE @@ -19437,7 +19773,9 @@ 1138180096,1138184191,US 1138184192,1138184447,SG 1138184448,1138184703,US -1138184704,1138184959,HK +1138184704,1138184714,CN +1138184715,1138184715,HK +1138184716,1138184959,CN 1138184960,1138185215,AU 1138185216,1138185727,CA 1138185728,1138185983,ZA @@ -19448,10 +19786,16 @@ 1138204672,1138212863,US 1138212864,1138216959,CA 1138216960,1138372607,US -1138372608,1138372863,AS -1138372864,1138374655,US -1138374656,1138374911,AS -1138374912,1138419711,US +1138372608,1138373631,AS +1138373632,1138373887,US +1138373888,1138374143,AS +1138374144,1138374399,US +1138374400,1138374911,AS +1138374912,1138375423,US +1138375424,1138375679,AS +1138375680,1138417407,US +1138417408,1138417663,CA +1138417664,1138419711,US 1138419712,1138419967,DE 1138419968,1138474239,US 1138474240,1138474751,CA @@ -19481,7 +19825,9 @@ 1138774016,1138778111,CA 1138778112,1138780671,US 1138780672,1138780679,CA -1138780680,1138786303,US +1138780680,1138781183,US +1138781184,1138781695,CA +1138781696,1138786303,US 1138786304,1138819071,PR 1138819072,1138851839,CA 1138851840,1138917375,US @@ -19501,7 +19847,9 @@ 1139167744,1139168767,PR 1139168768,1139169279,US 1139169280,1139169791,PR -1139169792,1139176447,US +1139169792,1139170303,US +1139170304,1139171327,PR +1139171328,1139176447,US 1139176448,1139176703,PR 1139176704,1139179519,US 1139179520,1139195903,CA @@ -19509,15 +19857,7 @@ 1139216384,1139220479,CA 1139220480,1139265535,US 1139265536,1139269631,CA -1139269632,1143258367,US -1143258368,1143258495,CA -1143258496,1144098815,US -1144098816,1144099071,CA -1144099072,1144796287,US -1144796288,1144796799,CA -1144796800,1144866687,US -1144866688,1144866815,CA -1144866816,1145099519,US +1139269632,1145099519,US 1145099520,1145099697,SA 1145099698,1145099699,US 1145099700,1145099775,SA @@ -19586,9 +19926,7 @@ 1157755248,1157755263,GR 1157755264,1157758207,US 1157758208,1157758463,RU -1157758464,1157913215,US -1157913216,1157913279,CA -1157913280,1157914194,US +1157758464,1157914194,US 1157914195,1157914202,IN 1157914203,1157931007,US 1157931008,1157935103,BS @@ -19605,10 +19943,8 @@ 1158152192,1158183467,US 1158183468,1158183468,GB 1158183469,1158234111,US -1158234112,1158242047,CA -1158242048,1158242303,US -1158242304,1158249727,CA -1158249728,1158295807,US +1158234112,1158250495,CA +1158250496,1158295807,US 1158295808,1158296063,GB 1158296064,1158316031,US 1158316032,1158318847,CA @@ -19939,21 +20275,13 @@ 1163542016,1163542527,CA 1163542528,1163543295,US 1163543296,1163543551,CA -1163543552,1163544831,US -1163544832,1163545087,CA -1163545088,1163546015,US +1163543552,1163544575,US +1163544576,1163545599,CA +1163545600,1163546015,US 1163546016,1163546031,CA 1163546032,1163546623,US -1163546624,1163546879,CA -1163546880,1163547135,US -1163547136,1163547391,CA -1163547392,1163547647,US -1163547648,1163547903,CA -1163547904,1163548159,US -1163548160,1163549695,CA -1163549696,1163549951,US -1163549952,1163550207,CA -1163550208,1163550815,US +1163546624,1163550719,CA +1163550720,1163550815,US 1163550816,1163550831,CA 1163550832,1163550847,US 1163550848,1163550975,CA @@ -19986,10 +20314,8 @@ 1163565312,1163567103,US 1163567104,1163568127,CA 1163568128,1163571199,US -1163571200,1163571967,CA -1163571968,1163572223,US -1163572224,1163572479,CA -1163572480,1163573439,US +1163571200,1163573247,CA +1163573248,1163573439,US 1163573440,1163573503,IN 1163573504,1163575039,US 1163575040,1163575295,IN @@ -20022,7 +20348,8 @@ 1163588864,1163589631,CA 1163589632,1167851519,US 1167851520,1168113663,CA -1168113664,1168138239,US +1168113664,1168121855,MM +1168121856,1168138239,US 1168138240,1168146431,JM 1168146432,1168211967,US 1168211968,1168220159,CA @@ -20035,8 +20362,10 @@ 1168424960,1168461823,US 1168461824,1168465919,CA 1168465920,1168474111,US -1168474112,1168488447,CA -1168488448,1168490495,US +1168474112,1168488703,CA +1168488704,1168489471,US +1168489472,1168489983,CA +1168489984,1168490495,US 1168490496,1168506879,CA 1168506880,1168510975,US 1168510976,1168515071,CA @@ -20194,8 +20523,8 @@ 1177033728,1177059327,US 1177059328,1177061375,CA 1177061376,1177062143,US -1177062144,1177075455,CA -1177075456,1177164415,US +1177062144,1177075711,CA +1177075712,1177164415,US 1177164416,1177164543,CA 1177164544,1177164863,US 1177164864,1177164895,CA @@ -20333,11 +20662,7 @@ 1210420480,1210421503,US 1210421504,1210421551,CA 1210421552,1210449919,US -1210449920,1210545471,CA -1210545472,1210545503,US -1210545504,1210557823,CA -1210557824,1210557951,US -1210557952,1210580991,CA +1210449920,1210580991,CA 1210580992,1210865262,US 1210865263,1210865270,MY 1210865271,1210925055,US @@ -20348,9 +20673,7 @@ 1211032272,1211032287,DO 1211032288,1211033087,US 1211033088,1211033599,CO -1211033600,1211035711,US -1211035712,1211035775,CA -1211035776,1211038007,US +1211033600,1211038007,US 1211038008,1211038011,TT 1211038012,1211038063,US 1211038064,1211038079,TT @@ -20399,8 +20722,7 @@ 1211391217,1211391217,IT 1211391218,1211432959,US 1211432960,1211473919,CA -1211473920,1211482111,US -1211498496,1211596799,US +1211473920,1211596799,US 1211596800,1211605999,CA 1211606000,1211606003,US 1211606004,1211613183,CA @@ -20425,23 +20747,13 @@ 1224091904,1224092159,NL 1224092160,1224094463,US 1224094464,1224094719,NL -1224094720,1224095231,US -1224095232,1224095487,NL -1224095488,1224104959,US -1224104960,1224105471,NL -1224105472,1224107007,US -1224107008,1224107519,NL -1224107520,1224112127,US -1224112128,1224113151,NL -1224113152,1224118271,US +1224094720,1224118271,US 1224118272,1224119807,NL 1224119808,1224124415,US 1224124416,1224126463,NL 1224126464,1224138751,US 1224138752,1224140799,NL -1224140800,1224151039,US -1224151040,1224152575,NL -1224152576,1224157695,US +1224140800,1224157695,US 1224157696,1224158207,NL 1224158208,1224167935,US 1224167936,1224169471,NL @@ -20463,9 +20775,7 @@ 1224200192,1224200959,NL 1224200960,1224201215,US 1224201216,1224202239,NL -1224202240,1224210431,US -1224210432,1224212479,NL -1224212480,1224327167,US +1224202240,1224327167,US 1224327168,1224327295,NL 1224327296,1224327935,US 1224327936,1224327943,CA @@ -20491,9 +20801,7 @@ 1224523559,1224523559,JM 1224523560,1224523775,US 1224523776,1224540159,JM -1224540160,1237189631,US -1237189632,1237189759,CA -1237189760,1241743359,US +1224540160,1241743359,US 1241743360,1241759743,CA 1241759744,1242300415,US 1242300416,1242562559,CA @@ -20554,7 +20862,9 @@ 1248946176,1248947199,VG 1248947200,1248964607,US 1248964608,1248966655,CA -1248966656,1248997375,US +1248966656,1248979711,US +1248979712,1248979967,IE +1248979968,1248997375,US 1248997376,1248998399,ID 1248999424,1249003519,US 1249003520,1249005567,CA @@ -20591,7 +20901,9 @@ 1249142016,1249142271,GB 1249142272,1249146879,US 1249146880,1249147903,CA -1249147904,1249163263,US +1249147904,1249160703,US +1249160704,1249161215,GB +1249161216,1249163263,US 1249163264,1249165311,CA 1249165312,1249171455,US 1249171456,1249173503,CA @@ -20675,12 +20987,11 @@ 1249710144,1249710207,CN 1249710208,1249710271,NL 1249710272,1249710591,BE -1249710592,1249710847,NL -1249710848,1249716479,US +1249710592,1249716479,US 1249716480,1249716735,TW 1249716736,1249717759,US 1249717760,1249718015,FI -1249718016,1249718271,NL +1249718016,1249718271,BE 1249718272,1249720319,US 1249720320,1249720351,AU 1249720352,1249720367,JP @@ -20754,10 +21065,16 @@ 1249721836,1249722111,US 1249722112,1249722367,IN 1249722368,1249724671,US -1249724672,1249724694,NL -1249724696,1249724927,NL +1249724672,1249724694,BE +1249724696,1249724927,BE 1249724928,1249725183,FI -1249725184,1249736959,US +1249725184,1249726207,US +1249726208,1249726463,FI +1249726464,1249726719,US +1249726720,1249726975,IE +1249726976,1249734655,US +1249734656,1249734911,FI +1249734912,1249736959,US 1249737472,1249752319,US 1249752320,1249752575,BE 1249752576,1249754111,US @@ -20822,9 +21139,7 @@ 1256054400,1256054783,CZ 1256054784,1256079359,US 1256079360,1256087551,KY -1256087552,1262783886,US -1262783887,1262783887,CA -1262783888,1263525887,US +1256087552,1263525887,US 1263525888,1263534079,CA 1263534080,1264717823,US 1264717824,1264718079,CA @@ -20861,9 +21176,7 @@ 1275674624,1275707391,US 1275707392,1275711487,CA 1275711488,1275712511,US -1275712512,1275714047,CA -1275714048,1275714559,US -1275714560,1275715583,CA +1275712512,1275715583,CA 1275715584,1275756543,US 1275756544,1275772927,CA 1275772928,1275789311,US @@ -20911,10 +21224,8 @@ 1279974016,1279975423,US 1279975424,1279976959,CA 1279976960,1279977215,US -1279977216,1279977471,CA -1279977472,1279977727,US -1279977728,1279977983,CA -1279977984,1279979775,US +1279977216,1279978495,CA +1279978496,1279979775,US 1279979776,1279980031,CA 1279980032,1279980287,US 1279980288,1279981567,CA @@ -20939,8 +21250,8 @@ 1280126976,1280131071,JP 1280131072,1280139263,CA 1280139264,1280242175,US -1280242176,1280242687,CA -1280242688,1291845631,US +1280242176,1280243199,CA +1280243200,1291845631,US 1291845632,1292894207,DE 1292894208,1293156351,NO 1293156352,1293549567,DE @@ -21002,13 +21313,7 @@ 1296237056,1296237311,FR 1296237312,1296237439,IE 1296237440,1296237567,IT -1296237568,1296237823,IE -1296237824,1296237824,GB -1296237825,1296237825,IE -1296237826,1296237826,GB -1296237827,1296237878,IE -1296237879,1296237879,GB -1296237880,1296238591,IE +1296237568,1296238591,GB 1296238592,1296239103,NL 1296239104,1296239231,IE 1296239232,1296239359,NL @@ -21038,8 +21343,7 @@ 1296248448,1296248575,DE 1296248576,1296248703,IE 1296248704,1296248831,FR -1296248832,1296248959,IE -1296248960,1296249023,DE +1296248832,1296249023,IE 1296249024,1296249087,GB 1296249088,1296249279,IE 1296249280,1296249343,DE @@ -21143,7 +21447,9 @@ 1296578560,1296580607,FI 1296580608,1296582655,CH 1296582656,1296584703,IE -1296584704,1296586751,RU +1296584704,1296585215,RU +1296585216,1296585983,GB +1296585984,1296586751,RU 1296586752,1296588799,FR 1296588800,1296590847,SE 1296590848,1296592895,ES @@ -21282,7 +21588,9 @@ 1297072128,1297088511,PL 1297088512,1297121279,AT 1297121280,1297154047,SE -1297154048,1297154815,RO +1297154048,1297154303,RO +1297154304,1297154559,US +1297154560,1297154815,RO 1297154816,1297155071,MD 1297155072,1297155583,RO 1297155584,1297156095,SE @@ -21314,7 +21622,7 @@ 1297184768,1297185279,BZ 1297185280,1297185791,RO 1297185792,1297185919,NL -1297185920,1297186815,RO +1297185920,1297186815,US 1297186816,1297188863,IR 1297188864,1297190143,RO 1297190144,1297190399,ES @@ -21322,7 +21630,8 @@ 1297190656,1297190911,IT 1297190912,1297195007,IR 1297195008,1297195135,NL -1297195136,1297196799,RO +1297195136,1297196031,US +1297196032,1297196799,RO 1297196800,1297197055,CN 1297197056,1297202175,RO 1297202176,1297202687,SE @@ -21463,11 +21772,9 @@ 1298137088,1298661375,GB 1298661376,1298677759,FR 1298677760,1298694143,IR -1298694144,1298705663,US -1298705664,1298706175,GB -1298706176,1298709503,US -1298709504,1298710271,IT -1298710272,1298710527,US +1298694144,1298708991,US +1298708992,1298709247,IT +1298709248,1298710527,US 1298710528,1298726911,CZ 1298726912,1298743295,RS 1298743296,1298757631,FI @@ -21508,12 +21815,13 @@ 1299103744,1299120127,NO 1299120128,1299136511,SI 1299136512,1299169279,HU -1299169280,1299172863,GB -1299172864,1299173375,NL +1299169280,1299171327,GB +1299171328,1299172351,US +1299172352,1299173375,GB 1299173376,1299174399,FR 1299174400,1299178495,GB -1299178496,1299179519,CH -1299179520,1299185663,FR +1299178496,1299180543,CH +1299180544,1299185663,FR 1299185664,1299447807,PL 1299447808,1299709951,AT 1299709952,1299783679,UA @@ -21522,7 +21830,9 @@ 1299955712,1299963903,RU 1299963904,1299972095,UA 1299972096,1300234239,IL -1300234240,1300889599,FR +1300234240,1300824063,FR +1300824064,1300874239,IL +1300874240,1300889599,FR 1300889600,1301020671,IL 1301020672,1302331391,FR 1302331392,1303379967,NL @@ -21591,7 +21901,8 @@ 1307192064,1307192319,GB 1307192320,1307192575,US 1307192576,1307192831,DE -1307192832,1307193343,CZ +1307192832,1307193087,US +1307193088,1307193343,CZ 1307193344,1307195391,NO 1307195392,1307197439,CH 1307197440,1307205631,HU @@ -21746,7 +22057,8 @@ 1307819432,1307819439,FI 1307819440,1307819447,LU 1307819448,1307819519,NL -1307819520,1307820031,GB +1307819520,1307819775,GB +1307819776,1307820031,BE 1307820032,1307824127,ES 1307824128,1307828223,HU 1307828224,1307832319,NL @@ -21800,7 +22112,9 @@ 1308020736,1308024831,BG 1308024832,1308030975,RU 1308030976,1308033023,UA -1308033024,1308037119,DE +1308033024,1308035427,DE +1308035428,1308035428,GB +1308035429,1308037119,DE 1308037120,1308041215,UA 1308041216,1308049407,RU 1308049408,1308053503,DK @@ -21826,7 +22140,9 @@ 1309314048,1309314303,CZ 1309314304,1309409279,PL 1309409280,1309671423,IT -1309671424,1309933567,IE +1309671424,1309862911,IE +1309862912,1309863167,GB +1309863168,1309933567,IE 1309933568,1310195711,BE 1310195712,1310197759,RU 1310197760,1310199807,CZ @@ -21936,7 +22252,9 @@ 1311253448,1311253455,IT 1311253456,1311253479,GB 1311253480,1311253487,IT -1311253488,1311254007,GB +1311253488,1311253831,GB +1311253832,1311253839,IT +1311253840,1311254007,GB 1311254008,1311254015,IT 1311254016,1311254527,GB 1311254528,1311256575,SE @@ -22040,6 +22358,7 @@ 1315729408,1315729663,IE 1315730176,1315730431,NL 1315731712,1315731967,DE +1315731968,1315732223,IE 1315732224,1315732991,DE 1315732992,1315733247,NL 1315733504,1315737599,NL @@ -22187,7 +22506,10 @@ 1317680000,1317680063,GB 1317680064,1317680071,AO 1317680072,1317683199,GB -1317683200,1317699583,DE +1317683200,1317685247,DE +1317685248,1317686271,BE +1317686272,1317687295,NL +1317687296,1317699583,DE 1317699584,1317715967,RU 1317715968,1317732351,SA 1317732352,1317748735,HU @@ -22238,7 +22560,9 @@ 1318682624,1318690815,RU 1318690816,1318699007,DK 1318699008,1318707199,IE -1318707200,1318715391,FR +1318707200,1318708223,FR +1318708224,1318708479,GB +1318708480,1318715391,FR 1318715392,1318723583,BG 1318723584,1318731775,IR 1318731776,1318739967,PL @@ -22394,7 +22718,7 @@ 1332616192,1332616319,GB 1332616320,1332616447,US 1332616448,1332616703,CZ -1332616704,1332616959,UA +1332616704,1332616959,NL 1332616960,1332617087,RU 1332617088,1332617215,CA 1332617216,1332621311,CZ @@ -22434,11 +22758,10 @@ 1334091776,1334099967,LT 1334099968,1334108159,IR 1334108160,1334116351,BE -1334116352,1334117631,FI -1334117632,1334117887,AX -1334117888,1334118399,FI -1334118400,1334118655,AX -1334118656,1334124543,FI +1334116352,1334123519,AX +1334123520,1334123903,FI +1334123904,1334124031,AX +1334124032,1334124543,FI 1334124544,1334125055,AT 1334125056,1334127359,DE 1334127360,1334127615,AT @@ -22467,8 +22790,8 @@ 1334296576,1334304767,UA 1334304768,1334312959,RU 1334312960,1334316031,SE -1334316032,1334316159,NO -1334316160,1334345727,SE +1334316032,1334316095,NO +1334316096,1334345727,SE 1334345728,1334378495,RU 1334378496,1334379023,FR 1334379024,1334379039,FI @@ -22478,7 +22801,9 @@ 1334379972,1334379975,DE 1334379976,1334380031,FR 1334380032,1334380287,PL -1334380288,1334382975,FR +1334380288,1334381983,FR +1334381984,1334382015,FI +1334382016,1334382975,FR 1334382976,1334383103,GB 1334383104,1334383679,FR 1334383680,1334383743,ES @@ -22515,7 +22840,9 @@ 1334392848,1334392863,FI 1334392864,1334392895,FR 1334392896,1334392959,GB -1334392960,1334411263,FR +1334392960,1334409599,FR +1334409600,1334409607,DE +1334409608,1334411263,FR 1334411264,1334444031,RU 1334444032,1334503935,SE 1334503936,1334504191,DK @@ -22623,7 +22950,9 @@ 1334833152,1334837247,FR 1334837248,1335885823,ES 1335885824,1336016895,NO -1336016896,1336147967,PL +1336016896,1336049663,PL +1336049664,1336066047,ES +1336066048,1336147967,PL 1336147968,1336279039,RU 1336279040,1336410111,GR 1336410112,1336541183,PT @@ -22734,14 +23063,12 @@ 1342753792,1342754047,FR 1342754048,1342756863,YT 1342756864,1342757119,FR -1342757120,1342758143,YT -1342758144,1342758399,FR -1342758400,1342758655,YT +1342757120,1342758655,YT 1342758656,1342758911,FR 1342758912,1342759935,YT 1342759936,1342760447,FR -1342760448,1342760703,YT -1342760704,1342761215,FR +1342760448,1342760959,YT +1342760960,1342761215,FR 1342761216,1342761471,YT 1342761472,1342761727,FR 1342761728,1342761983,YT @@ -22761,7 +23088,11 @@ 1342834688,1342842879,JO 1342842880,1342844927,FR 1342844928,1342853119,JO -1342853120,1342959049,FR +1342853120,1342869503,FR +1342869504,1342871551,JO +1342871552,1342875647,FR +1342875648,1342877695,JO +1342877696,1342959049,FR 1342959050,1342959050,RE 1342959051,1342988287,FR 1342988288,1342989055,US @@ -22808,7 +23139,11 @@ 1343225856,1343750143,IT 1343750144,1344798719,ES 1344798720,1345323007,GB -1345323008,1345847295,PL +1345323008,1345404927,PL +1345404928,1345421311,ES +1345421312,1345601535,PL +1345601536,1345617919,ES +1345617920,1345847295,PL 1345847296,1345978367,NL 1345978368,1346109439,ES 1346109440,1346240511,NL @@ -23313,7 +23648,8 @@ 1347534848,1347538943,DE 1347538944,1347543039,RU 1347543040,1347547135,SK -1347547136,1347551231,DE +1347547136,1347551167,DE +1347551168,1347551231,PL 1347551232,1347555327,IT 1347555328,1347559423,PL 1347559424,1347567615,RU @@ -23353,7 +23689,9 @@ 1347674112,1347682303,RU 1347682304,1347686399,DE 1347690496,1347694591,SE -1347694592,1347706879,GB +1347694592,1347696375,GB +1347696376,1347696383,US +1347696384,1347706879,GB 1347706880,1347710975,IT 1347710976,1347715071,RU 1347715072,1347717375,ES @@ -23675,7 +24013,9 @@ 1353312448,1353312479,CH 1353312480,1353312511,GB 1353312512,1353312767,CH -1353312768,1353315327,GB +1353312768,1353313167,GB +1353313168,1353313175,IT +1353313176,1353315327,GB 1353315328,1353316351,ES 1353316352,1353318399,GB 1353318400,1353383935,SE @@ -23721,7 +24061,9 @@ 1356464128,1356513497,CH 1356513498,1356513498,US 1356513499,1356595199,CH -1356595200,1356857343,FI +1356595200,1356789759,FI +1356789760,1356790271,AX +1356790272,1356857343,FI 1356857344,1356922879,ES 1356922880,1356988415,GB 1356988416,1357053951,DE @@ -23755,7 +24097,9 @@ 1357323008,1357323015,CG 1357323264,1357323775,GB 1357323776,1357323791,FI -1357323792,1357324287,GB +1357323792,1357323807,GB +1357323808,1357323839,NO +1357323840,1357324287,GB 1357324288,1357324295,RU 1357324296,1357324327,PL 1357326336,1357326337,ES @@ -23768,6 +24112,7 @@ 1357328696,1357328703,IT 1357328704,1357328711,IE 1357328896,1357329159,NL +1357329168,1357329183,NL 1357329408,1357329415,BE 1357330944,1357331199,GB 1357335808,1357336063,IT @@ -23804,6 +24149,7 @@ 1357368352,1357368383,NL 1357368576,1357368831,NL 1357369344,1357369599,RO +1357370368,1357370623,SA 1357371392,1357371647,GB 1357372416,1357372927,GB 1357373468,1357373471,GB @@ -23815,6 +24161,7 @@ 1357375216,1357375223,ES 1357375224,1357375423,GB 1357375424,1357375487,IE +1357375504,1357375535,GB 1357377536,1357378647,FR 1357378656,1357378671,FR 1357378816,1357379071,FR @@ -23907,7 +24254,9 @@ 1357979648,1357983743,KZ 1357983744,1357983919,GB 1357983920,1357983927,IT -1357983928,1357984103,GB +1357983928,1357984087,GB +1357984088,1357984095,IT +1357984096,1357984103,GB 1357984104,1357984111,IT 1357984112,1357984167,GB 1357984168,1357984175,IT @@ -24048,7 +24397,10 @@ 1358512128,1358516223,DZ 1358516224,1358520319,BY 1358520320,1358524415,GB -1358528512,1358536703,RU +1358528512,1358530815,RU +1358530816,1358532607,KZ +1358532608,1358534655,RU +1358534656,1358536703,KZ 1358536704,1358540799,HU 1358540800,1358548991,RU 1358548992,1358551039,NL @@ -24191,7 +24543,8 @@ 1359119104,1359119199,ES 1359119200,1359119231,NL 1359119232,1359119359,ES -1359119360,1359121407,DE +1359119360,1359120383,IT +1359120384,1359121407,DE 1359121408,1359122431,ES 1359122432,1359123967,DE 1359123968,1359124479,ES @@ -24294,7 +24647,9 @@ 1360211200,1360211967,CZ 1360211968,1360216063,GB 1360216064,1360224255,RU -1360224256,1360228351,ES +1360224256,1360224767,ES +1360224768,1360224895,FR +1360224896,1360228351,ES 1360228352,1360232447,FI 1360232448,1360236543,RU 1360236544,1360240639,AT @@ -24892,12 +25247,8 @@ 1371996928,1372000255,GB 1372000256,1372001279,UG 1372001280,1372012543,GB -1372012544,1372013567,ZM -1372013568,1372014079,GB -1372014080,1372014335,NG -1372014336,1372016127,GB -1372016128,1372016383,GH -1372016384,1372017583,GB +1372012544,1372016639,DE +1372016640,1372017583,GB 1372017584,1372017599,CD 1372017600,1372020735,GB 1372020736,1372022783,CD @@ -24957,6 +25308,7 @@ 1372684544,1372684799,DE 1372685664,1372685679,DE 1372688384,1372689407,DE +1372689920,1372690175,DE 1372690432,1372691455,DE 1372693504,1372694015,DE 1372697344,1372697599,DE @@ -25035,9 +25387,7 @@ 1380188160,1380450303,GB 1380450304,1380712447,NL 1380712448,1380974591,RO -1380974592,1381084671,IL -1381084672,1381085183,SY -1381085184,1381105663,IL +1380974592,1381105663,IL 1381105664,1381236735,DE 1381236736,1381367807,IT 1381367808,1381498879,ES @@ -25130,7 +25480,9 @@ 1383243776,1383251967,YE 1383251968,1383260159,CZ 1383260160,1383268351,RU -1383268352,1383272191,IR +1383268352,1383268607,IR +1383268608,1383269375,NL +1383269376,1383272191,IR 1383272192,1383272447,NL 1383272448,1383276543,IR 1383276544,1383284735,KZ @@ -25179,7 +25531,9 @@ 1383514112,1383522303,FI 1383522304,1383523839,BG 1383523840,1383524095,GB -1383524096,1383530495,BG +1383524096,1383524863,BG +1383524864,1383525119,GB +1383525120,1383530495,BG 1383530496,1383538687,DE 1383538688,1383546879,IT 1383546880,1383555071,BG @@ -25297,7 +25651,9 @@ 1385290632,1385290632,IS 1385291344,1385291344,IS 1385291776,1385299967,TR -1385299968,1385308159,BG +1385299968,1385303039,BG +1385303040,1385303551,DK +1385303552,1385308159,BG 1385308160,1385316351,RU 1385316352,1385324543,NO 1385324544,1385332735,BE @@ -25363,8 +25719,7 @@ 1386283008,1386348543,NL 1386348544,1386414079,RU 1386414080,1386422271,GB -1386422272,1386422783,IT -1386422784,1386423295,GB +1386422272,1386423295,IT 1386423296,1386424319,FR 1386424320,1386424575,NL 1386424576,1386425087,GB @@ -25396,7 +25751,7 @@ 1386449396,1386449399,PT 1386449400,1386449403,RU 1386449404,1386449407,DE -1386449408,1386449663,IL +1386449408,1386449663,GB 1386449664,1386449919,HK 1386449920,1386449920,US 1386449921,1386450175,IL @@ -25472,8 +25827,6 @@ 1388587520,1388588031,GB 1388589056,1388589823,GB 1388591104,1388591359,AU -1388591616,1388591631,US -1388591648,1388591663,US 1388593152,1388601343,RU 1388601344,1388609535,SE 1388609536,1388617727,RU @@ -25564,14 +25917,18 @@ 1388796683,1388796687,GB 1388796688,1388797951,NL 1388797952,1388806143,RU -1388806144,1388806783,DE +1388806144,1388806399,CH +1388806400,1388806655,DE +1388806656,1388806783,CH 1388806784,1388806911,GB -1388806912,1388807839,DE -1388807840,1388807855,CH -1388807856,1388814335,DE +1388806912,1388811775,CH +1388811776,1388812031,DE +1388812032,1388814335,CH 1388814336,1388816383,FI 1388816384,1388818431,AX -1388818432,1388822527,SE +1388818432,1388819455,SE +1388819456,1388820479,AX +1388820480,1388822527,SE 1388822528,1388830719,AM 1388830720,1388838911,FI 1388838912,1388871679,RU @@ -25749,6 +26106,7 @@ 1401094144,1401159679,HR 1401159680,1401225215,PT 1401225216,1401241599,DE +1401242632,1401242632,DE 1401246720,1401257983,DE 1401271296,1401274367,DE 1401278464,1401283583,DE @@ -26051,7 +26409,9 @@ 1403581952,1403582207,US 1403582208,1403584511,SE 1403584512,1403600895,DE -1403600896,1403617279,FR +1403600896,1403601519,FR +1403601520,1403601535,MC +1403601536,1403617279,FR 1403617280,1403633663,DE 1403633664,1403650047,RU 1403650048,1403666431,DE @@ -26079,8 +26439,8 @@ 1404026880,1404043263,ES 1404043264,1404051455,EE 1404051456,1404059647,HR -1404059648,1404076543,SE -1404076544,1404084223,LV +1404059648,1404076031,SE +1404076032,1404084223,LV 1404084224,1404099327,LT 1404099328,1404099583,SE 1404099584,1404103167,LT @@ -26104,9 +26464,7 @@ 1404194816,1404198911,LT 1404198912,1404200959,SE 1404200960,1404207103,HR -1404207104,1404209151,LV -1404209152,1404210175,SE -1404210176,1404212223,LV +1404207104,1404212223,LV 1404212224,1404215295,SE 1404215296,1404219391,LV 1404219392,1404220415,SE @@ -26115,8 +26473,8 @@ 1404222464,1404222975,LV 1404222976,1404225535,SE 1404225536,1404231679,LV -1404231680,1404232703,SE -1404232704,1404233215,LV +1404231680,1404231935,SE +1404231936,1404233215,LV 1404233216,1404234239,SE 1404234240,1404239871,HR 1404239872,1404242687,EE @@ -26177,7 +26535,8 @@ 1404875776,1404876799,LT 1404876800,1404887039,SE 1404887040,1404895231,LT -1404895232,1404921855,NL +1404895232,1404903423,SE +1404903424,1404921855,NL 1404921856,1404927999,LT 1404928000,1404944383,SE 1404944384,1404960767,LT @@ -26254,9 +26613,7 @@ 1405855232,1405855487,FR 1405855488,1405855743,MQ 1405855744,1405855999,FR -1405856000,1405857279,MQ -1405857280,1405857791,FR -1405857792,1405860607,MQ +1405856000,1405860607,MQ 1405860608,1405860863,FR 1405860864,1405862911,MQ 1405862912,1405863423,FR @@ -26264,8 +26621,8 @@ 1405863936,1405865471,FR 1405865472,1405869311,MQ 1405869312,1405869567,FR -1405869568,1405872895,MQ -1405872896,1405873407,FR +1405869568,1405873151,MQ +1405873152,1405873407,FR 1405873408,1405878271,MQ 1405878272,1406140415,FR 1406140416,1406205951,CZ @@ -26275,7 +26632,9 @@ 1406402560,1406468095,GR 1406468096,1406533631,ES 1406533632,1406599167,FR -1406599168,1406664703,AT +1406599168,1406652671,AT +1406652672,1406652927,DE +1406652928,1406664703,AT 1406664704,1406672895,FI 1406672896,1406681087,HU 1406681088,1406689279,GB @@ -26325,9 +26684,9 @@ 1406926848,1406935039,IT 1406935040,1406951423,RU 1406951424,1406959615,PL -1406959616,1406964351,DE -1406964352,1406964479,NL -1406964480,1406967807,DE +1406959616,1406964223,DE +1406964224,1406964735,NL +1406964736,1406967807,DE 1406967808,1406975999,RU 1406976000,1406984191,IE 1406984192,1407000575,RU @@ -26589,9 +26948,11 @@ 1410711552,1410719743,BG 1410719744,1410727935,RU 1410727936,1410736127,BG -1410736128,1410739455,RS -1410739456,1410739711,XK -1410739712,1410744319,RS +1410736128,1410737151,XK +1410737152,1410739199,RS +1410739200,1410740479,XK +1410740480,1410744063,RS +1410744064,1410744319,XK 1410744320,1410745087,FR 1410745344,1410747391,FR 1410747392,1410747647,GP @@ -26705,9 +27066,7 @@ 1412413952,1412414719,RU 1412414720,1412414975,RO 1412414976,1412415487,RU -1412415488,1412423679,IR -1412423680,1412425727,AE -1412425728,1412431871,IR +1412415488,1412431871,IR 1412431872,1412562943,NO 1412562944,1412628479,EE 1412628480,1412644863,TR @@ -26855,7 +27214,7 @@ 1424619856,1424619863,BE 1424619864,1424621567,GB 1424621568,1424625663,PL -1424625664,1424629759,GB +1424625664,1424629759,US 1424629760,1424633855,PL 1424633856,1424637951,MD 1424637952,1424642047,FI @@ -26872,7 +27231,9 @@ 1424818176,1424850943,RU 1424850944,1424883711,LV 1424883712,1424916479,DK -1424916480,1424949247,BG +1424916480,1424928767,BG +1424928768,1424929279,DK +1424929280,1424949247,BG 1424949248,1424965631,RO 1424965632,1424982015,FR 1424982016,1425014783,FI @@ -26929,13 +27290,15 @@ 1425478912,1425479679,RO 1425479680,1425480703,BG 1425480704,1425481727,RO -1425481728,1425482751,GB +1425481728,1425482751,US 1425482752,1425484799,RO 1425484800,1425485311,MD 1425485312,1425485823,BG 1425485824,1425486847,RO 1425486848,1425487359,MD -1425487360,1425489407,RO +1425487360,1425488639,RO +1425488640,1425488895,US +1425488896,1425489407,RO 1425489408,1425489663,NL 1425489664,1425506303,RO 1425506304,1425509887,NO @@ -27047,11 +27410,7 @@ 1428142080,1428144127,DE 1428144128,1428152319,FR 1428152320,1428160511,PL -1428160512,1428183111,IT -1428183112,1428183119,SI -1428183120,1428183143,IT -1428183144,1428183151,SI -1428183152,1428260863,IT +1428160512,1428260863,IT 1428260864,1428261119,GB 1428261120,1429209087,IT 1429209088,1430257663,ES @@ -27093,7 +27452,9 @@ 1432024064,1432025087,DE 1432025088,1432027135,GB 1432027136,1432035327,IE -1432035328,1432043519,GB +1432035328,1432038399,GB +1432038400,1432039423,NL +1432039424,1432043519,GB 1432043520,1432051711,ES 1432051712,1432054015,RU 1432054016,1432054271,RO @@ -27179,7 +27540,9 @@ 1433600000,1433608191,DE 1433608192,1433608447,TR 1433608448,1433608703,NL -1433608704,1433610239,GB +1433608704,1433609215,GB +1433609216,1433609727,SE +1433609728,1433610239,GB 1433610240,1433611263,US 1433611264,1433614335,GB 1433614336,1433615027,DE @@ -27359,17 +27722,15 @@ 1437335552,1437597695,RU 1437597696,1438121983,DE 1438121984,1438126079,NL -1438126080,1438127359,CZ -1438127360,1438127615,SE -1438127616,1438127871,BE -1438127872,1438130175,CZ +1438126080,1438130175,CZ 1438130176,1438138367,NL 1438138368,1438146559,FR 1438146560,1438154751,MT 1438154752,1438171135,DK 1438171136,1438173183,GB 1438173184,1438179327,IM -1438179328,1438181375,NL +1438179328,1438180351,ES +1438180352,1438181375,NL 1438181376,1438183423,SA 1438183424,1438184447,PS 1438184448,1438185471,CH @@ -27383,7 +27744,9 @@ 1438384128,1438400511,FI 1438400512,1438433279,SE 1438433280,1438515199,GB -1438515200,1438553855,DE +1438515200,1438539775,DE +1438539776,1438547967,NL +1438547968,1438553855,DE 1438553856,1438554111,BR 1438554112,1438554623,US 1438554624,1438555135,DE @@ -27553,7 +27916,9 @@ 1439459328,1439459839,IR 1439459840,1439460607,RO 1439460608,1439460863,MD -1439460864,1439462655,RO +1439460864,1439461375,RO +1439461376,1439462399,IT +1439462400,1439462655,RO 1439462656,1439462911,MD 1439462912,1439463167,RO 1439463168,1439463423,IT @@ -27567,7 +27932,10 @@ 1439468544,1439469567,ES 1439469568,1439470335,RO 1439470336,1439470591,IT -1439470592,1439475711,RO +1439470592,1439471615,US +1439471616,1439473663,RO +1439473664,1439474687,US +1439474688,1439475711,RO 1439475712,1439475967,IN 1439475968,1439476735,RO 1439476736,1439477759,IN @@ -27627,8 +27995,8 @@ 1440251904,1440284671,SK 1440284672,1440317439,FI 1440317440,1440322559,BG -1440322560,1440323071,DE -1440323072,1440325631,BG +1440322560,1440322815,DE +1440322816,1440325631,BG 1440325632,1440326655,DE 1440326656,1440328703,BG 1440328704,1440329727,DE @@ -27819,7 +28187,8 @@ 1449706496,1449707519,MD 1449707520,1449709567,SE 1449709568,1449709823,GB -1449709824,1449710591,RO +1449709824,1449710079,US +1449710080,1449710591,RO 1449710592,1449711103,GB 1449711104,1449713151,RO 1449713152,1449714175,GB @@ -27838,7 +28207,8 @@ 1449724928,1449725439,GB 1449725440,1449726463,RO 1449726464,1449726719,NL -1449726720,1449727999,RO +1449726720,1449726975,RO +1449726976,1449727999,NO 1449728000,1449728255,MD 1449728256,1449729023,RO 1449729024,1449730047,ES @@ -27849,7 +28219,7 @@ 1449738240,1449742335,RO 1449742336,1449744383,MD 1449744384,1449748479,RO -1449748480,1449749503,GB +1449748480,1449749503,US 1449749504,1449750527,RO 1449750528,1449752575,SE 1449752576,1449754623,RO @@ -27962,7 +28332,8 @@ 1449879168,1449879295,TH 1449879296,1449880319,RO 1449880320,1449880575,MD -1449880576,1449883647,RO +1449880576,1449881087,US +1449881088,1449883647,RO 1449883648,1449885695,BE 1449885696,1449889791,GB 1449889792,1449893887,IR @@ -28122,13 +28493,7 @@ 1467432960,1467449343,BG 1467449344,1467457535,SI 1467457536,1467465727,EE -1467465728,1467465759,NL -1467465760,1467465791,DE -1467465792,1467465799,NL -1467465800,1467465983,DE -1467465984,1467466015,NL -1467466016,1467466495,DE -1467466496,1467466751,NL +1467465728,1467466751,NL 1467466752,1467472895,DE 1467472896,1467473919,NL 1467473920,1467482111,RU @@ -28151,7 +28516,9 @@ 1467584512,1467593727,BG 1467593728,1467597823,DE 1467597824,1467604991,BG -1467604992,1467744255,DE +1467604992,1467611135,DE +1467611136,1467613183,BG +1467613184,1467744255,DE 1467744256,1467777023,GB 1467777024,1467875327,ES 1467875328,1467940863,BG @@ -28438,7 +28805,8 @@ 1475870720,1475878911,NO 1475878912,1475887103,IT 1475887104,1475895295,PL -1475895296,1475903487,GB +1475895296,1475901439,GB +1475901440,1475903487,CH 1475903488,1475911679,IR 1475911680,1475919871,MD 1475919872,1475928063,IT @@ -28531,13 +28899,7 @@ 1476378624,1476386815,KZ 1476386816,1476395007,RU 1476395008,1478492159,ES -1478492160,1479738383,IT -1479738384,1479738391,SI -1479738392,1479738479,IT -1479738480,1479738487,SI -1479738488,1480413711,IT -1480413712,1480413719,SI -1480413720,1480589311,IT +1478492160,1480589311,IT 1480589312,1481637887,DE 1481637888,1481646079,SE 1481646080,1481654271,RU @@ -28570,7 +28932,9 @@ 1481834496,1481842687,GL 1481842688,1481843007,SE 1481843008,1481843039,NO -1481843040,1481850879,SE +1481843040,1481844959,SE +1481844960,1481844991,NO +1481844992,1481850879,SE 1481850880,1481859071,DK 1481859072,1481867263,GB 1481867264,1481875455,SE @@ -28583,9 +28947,13 @@ 1481908224,1481916415,NO 1481916416,1481924607,ES 1481924608,1481932799,SA -1481932800,1481937183,GB +1481932800,1481936959,GB +1481936960,1481936975,FR +1481936976,1481937183,GB 1481937184,1481937199,NL -1481937200,1481940991,GB +1481937200,1481937207,GB +1481937208,1481937215,FR +1481937216,1481940991,GB 1481940992,1481949183,NO 1481949184,1481957375,RU 1481957376,1481965567,SE @@ -28621,9 +28989,7 @@ 1483210752,1483735039,GB 1483735040,1483997183,FI 1483997184,1484128255,AT -1484128256,1484237823,LT -1484237824,1484238847,PK -1484238848,1484259327,LT +1484128256,1484259327,LT 1484259328,1484783615,FR 1484783616,1484849151,DE 1484849152,1484914687,SE @@ -28652,7 +29018,711 @@ 1486159872,1486192639,IS 1486192640,1486225407,IT 1486225408,1486258175,DE -1486258176,1486292991,GB +1486258176,1486258463,GB +1486258464,1486258477,US +1486258478,1486258479,GB +1486258480,1486258495,US +1486258496,1486258543,GB +1486258544,1486258551,US +1486258552,1486258567,GB +1486258568,1486258583,US +1486258584,1486258591,GB +1486258592,1486258607,US +1486258608,1486258671,GB +1486258672,1486258751,US +1486258752,1486258815,GB +1486258816,1486258847,US +1486258848,1486258863,GB +1486258864,1486258895,US +1486258896,1486258911,GB +1486258912,1486258943,US +1486258944,1486258959,GB +1486258960,1486258967,US +1486258968,1486258975,GB +1486258976,1486258999,US +1486259000,1486259039,GB +1486259040,1486259071,US +1486259072,1486259087,GB +1486259088,1486259095,US +1486259096,1486259183,GB +1486259184,1486259207,US +1486259208,1486259231,GB +1486259232,1486259239,US +1486259240,1486259287,GB +1486259288,1486259295,US +1486259296,1486259455,GB +1486259456,1486259471,US +1486259472,1486259503,GB +1486259504,1486259511,US +1486259512,1486259559,GB +1486259560,1486259567,US +1486259568,1486259575,GB +1486259576,1486259583,US +1486259584,1486259631,GB +1486259632,1486259639,US +1486259640,1486259663,GB +1486259664,1486259679,US +1486259680,1486259711,GB +1486259712,1486259775,US +1486259776,1486259807,GB +1486259808,1486259871,US +1486259872,1486259999,GB +1486260000,1486260031,US +1486260032,1486260095,GB +1486260096,1486260119,US +1486260120,1486260135,GB +1486260136,1486260143,US +1486260144,1486260183,GB +1486260184,1486260191,US +1486260192,1486260239,GB +1486260240,1486260287,US +1486260288,1486260327,GB +1486260328,1486260335,US +1486260336,1486260383,GB +1486260384,1486260401,US +1486260402,1486260402,GB +1486260403,1486260407,US +1486260408,1486260415,GB +1486260416,1486260431,US +1486260432,1486260435,GB +1486260436,1486260437,US +1486260438,1486260463,GB +1486260464,1486260479,US +1486260480,1486260735,GB +1486260736,1486260767,US +1486260768,1486260863,GB +1486260864,1486261023,US +1486261024,1486261135,GB +1486261136,1486261139,US +1486261140,1486261151,GB +1486261152,1486261247,US +1486261248,1486263295,GB +1486263296,1486263311,US +1486263312,1486263327,GB +1486263328,1486263391,US +1486263392,1486263423,GB +1486263424,1486263439,US +1486263440,1486263463,GB +1486263464,1486263471,US +1486263472,1486263487,GB +1486263488,1486263583,US +1486263584,1486263599,GB +1486263600,1486263631,US +1486263632,1486263663,GB +1486263664,1486263823,US +1486263824,1486263947,GB +1486263948,1486263959,US +1486263960,1486263983,GB +1486263984,1486264015,US +1486264016,1486264031,GB +1486264032,1486264063,US +1486264064,1486264143,GB +1486264144,1486264145,US +1486264146,1486264223,GB +1486264224,1486264255,US +1486264256,1486264319,GB +1486264320,1486264351,US +1486264352,1486264399,GB +1486264400,1486264407,US +1486264408,1486264409,GB +1486264410,1486264411,US +1486264412,1486264447,GB +1486264448,1486264479,US +1486264480,1486264703,GB +1486264704,1486264711,US +1486264712,1486264751,GB +1486264752,1486264767,US +1486264768,1486269439,GB +1486269440,1486269455,US +1486269456,1486269487,GB +1486269488,1486269519,US +1486269520,1486269535,GB +1486269536,1486269567,US +1486269568,1486269583,GB +1486269584,1486269615,US +1486269616,1486269631,GB +1486269632,1486269647,US +1486269648,1486269663,GB +1486269664,1486269679,US +1486269680,1486269711,GB +1486269712,1486269719,US +1486269720,1486269735,GB +1486269736,1486269743,US +1486269744,1486269751,GB +1486269752,1486269791,US +1486269792,1486269799,GB +1486269800,1486269815,US +1486269816,1486269823,GB +1486269824,1486269855,US +1486269856,1486269871,GB +1486269872,1486269903,US +1486269904,1486269919,GB +1486269920,1486269954,US +1486269955,1486269955,GB +1486269956,1486269975,US +1486269976,1486269983,GB +1486269984,1486269999,US +1486270000,1486270015,GB +1486270016,1486270031,US +1486270032,1486270039,GB +1486270040,1486270079,US +1486270080,1486270143,GB +1486270144,1486270159,US +1486270160,1486270175,GB +1486270176,1486270351,US +1486270352,1486270367,GB +1486270368,1486270375,US +1486270376,1486270391,GB +1486270392,1486270399,US +1486270400,1486270415,GB +1486270416,1486270431,US +1486270432,1486270447,GB +1486270448,1486270455,US +1486270456,1486270991,GB +1486270992,1486270999,US +1486271000,1486271103,GB +1486271104,1486271159,US +1486271160,1486271167,GB +1486271168,1486271175,US +1486271176,1486271199,GB +1486271200,1486271215,US +1486271216,1486271751,GB +1486271752,1486271759,US +1486271760,1486271775,GB +1486271776,1486271791,US +1486271792,1486271807,GB +1486271808,1486271815,US +1486271816,1486271823,GB +1486271824,1486271831,US +1486271832,1486271871,GB +1486271872,1486271935,US +1486271936,1486271943,GB +1486271944,1486271983,US +1486271984,1486272047,GB +1486272048,1486272063,US +1486272064,1486272079,GB +1486272080,1486272127,US +1486272128,1486272263,GB +1486272264,1486272279,US +1486272280,1486272287,GB +1486272288,1486272295,US +1486272296,1486272303,GB +1486272304,1486272311,US +1486272312,1486272351,GB +1486272352,1486272359,US +1486272360,1486272367,GB +1486272368,1486272383,US +1486272384,1486272399,GB +1486272400,1486272431,US +1486272432,1486272439,GB +1486272440,1486272447,US +1486272448,1486272455,GB +1486272456,1486272463,US +1486272464,1486272479,GB +1486272480,1486272503,US +1486272504,1486272505,GB +1486272506,1486272583,US +1486272584,1486272623,GB +1486272624,1486272639,US +1486272640,1486272663,GB +1486272664,1486272671,US +1486272672,1486272687,GB +1486272688,1486272695,US +1486272696,1486272703,GB +1486272704,1486272799,US +1486272800,1486272815,GB +1486272816,1486272831,US +1486272832,1486272839,GB +1486272840,1486272879,US +1486272880,1486272911,GB +1486272912,1486272959,US +1486272960,1486272975,GB +1486272976,1486272983,US +1486272984,1486272999,GB +1486273000,1486273015,US +1486273016,1486273023,GB +1486273024,1486273031,US +1486273032,1486273033,GB +1486273034,1486273035,US +1486273036,1486273087,GB +1486273088,1486273103,US +1486273104,1486273111,GB +1486273112,1486273119,US +1486273120,1486273127,GB +1486273128,1486273135,US +1486273136,1486273143,GB +1486273144,1486273151,US +1486273152,1486273159,GB +1486273160,1486273183,US +1486273184,1486273199,GB +1486273200,1486273295,US +1486273296,1486273303,GB +1486273304,1486273311,US +1486273312,1486273319,GB +1486273320,1486273327,US +1486273328,1486273335,GB +1486273336,1486273343,US +1486273344,1486273367,GB +1486273368,1486273375,US +1486273376,1486273383,GB +1486273384,1486273391,US +1486273392,1486273399,GB +1486273400,1486273439,US +1486273440,1486273447,GB +1486273448,1486273463,US +1486273464,1486273503,GB +1486273504,1486273535,US +1486273536,1486273543,GB +1486273544,1486273551,US +1486273552,1486273559,GB +1486273560,1486273567,US +1486273568,1486273583,GB +1486273584,1486273599,US +1486273600,1486273631,GB +1486273632,1486273863,US +1486273864,1486273879,GB +1486273880,1486273887,US +1486273888,1486273919,GB +1486273920,1486274047,US +1486274048,1486274079,GB +1486274080,1486274095,US +1486274096,1486274111,GB +1486274112,1486274143,US +1486274144,1486274175,GB +1486274176,1486274191,US +1486274192,1486274223,GB +1486274224,1486274231,US +1486274232,1486274255,GB +1486274256,1486274263,US +1486274264,1486274271,GB +1486274272,1486274295,US +1486274296,1486274335,GB +1486274336,1486274351,US +1486274352,1486274359,GB +1486274360,1486274367,US +1486274368,1486274399,GB +1486274400,1486274455,US +1486274456,1486274463,GB +1486274464,1486274487,US +1486274488,1486274495,GB +1486274496,1486274519,US +1486274520,1486274527,GB +1486274528,1486274543,US +1486274544,1486274551,GB +1486274552,1486274623,US +1486274624,1486274631,GB +1486274632,1486274639,US +1486274640,1486274655,GB +1486274656,1486274671,US +1486274672,1486274679,GB +1486274680,1486274687,US +1486274688,1486274719,GB +1486274720,1486274751,US +1486274752,1486274763,GB +1486274764,1486274767,US +1486274768,1486274799,GB +1486274800,1486274815,US +1486274816,1486275071,GB +1486275072,1486275079,US +1486275080,1486275095,GB +1486275096,1486275119,US +1486275120,1486275127,GB +1486275128,1486275207,US +1486275208,1486275223,GB +1486275224,1486275279,US +1486275280,1486275311,GB +1486275312,1486275327,US +1486275328,1486275335,GB +1486275336,1486275351,US +1486275352,1486275359,GB +1486275360,1486275367,US +1486275368,1486275383,GB +1486275384,1486275399,US +1486275400,1486275407,GB +1486275408,1486275415,US +1486275416,1486275431,GB +1486275432,1486275447,US +1486275448,1486275519,GB +1486275520,1486275583,US +1486275584,1486275591,GB +1486275592,1486275607,US +1486275608,1486275647,GB +1486275648,1486275695,US +1486275696,1486275775,GB +1486275776,1486275815,US +1486275816,1486275823,GB +1486275824,1486275839,US +1486275840,1486275887,GB +1486275888,1486275919,US +1486275920,1486275951,GB +1486275952,1486275999,US +1486276000,1486276047,GB +1486276048,1486276095,US +1486276096,1486276103,GB +1486276104,1486276111,US +1486276112,1486276135,GB +1486276136,1486276183,US +1486276184,1486276191,GB +1486276192,1486276199,US +1486276200,1486276319,GB +1486276320,1486276375,US +1486276376,1486276399,GB +1486276400,1486276407,US +1486276408,1486276479,GB +1486276480,1486276551,US +1486276552,1486276575,GB +1486276576,1486276607,US +1486276608,1486276671,GB +1486276672,1486276703,US +1486276704,1486276711,GB +1486276712,1486276719,US +1486276720,1486276735,GB +1486276736,1486276751,US +1486276752,1486276767,GB +1486276768,1486276783,US +1486276784,1486276791,GB +1486276792,1486276839,US +1486276840,1486276863,GB +1486276864,1486276879,US +1486276880,1486276895,GB +1486276896,1486276903,US +1486276904,1486276911,GB +1486276912,1486276919,US +1486276920,1486276943,GB +1486276944,1486276951,US +1486276952,1486276975,GB +1486276976,1486276983,US +1486276984,1486276991,GB +1486276992,1486277055,US +1486277056,1486277063,GB +1486277064,1486277079,US +1486277080,1486277087,GB +1486277088,1486277095,US +1486277096,1486277111,GB +1486277112,1486277127,US +1486277128,1486277135,GB +1486277136,1486277167,US +1486277168,1486277175,GB +1486277176,1486277183,US +1486277184,1486277187,GB +1486277188,1486277191,US +1486277192,1486277207,GB +1486277208,1486277215,US +1486277216,1486277231,GB +1486277232,1486277263,US +1486277264,1486277279,GB +1486277280,1486277311,US +1486277312,1486277343,GB +1486277344,1486277351,US +1486277352,1486277359,GB +1486277360,1486277367,US +1486277368,1486277375,GB +1486277376,1486277423,US +1486277424,1486277431,GB +1486277432,1486277439,US +1486277440,1486277503,GB +1486277504,1486277511,US +1486277512,1486277527,GB +1486277528,1486277535,US +1486277536,1486277559,GB +1486277560,1486277583,US +1486277584,1486277591,GB +1486277592,1486277599,US +1486277600,1486277607,GB +1486277608,1486277727,US +1486277728,1486277735,GB +1486277736,1486277743,US +1486277744,1486277759,GB +1486277760,1486277775,US +1486277776,1486277783,GB +1486277784,1486277807,US +1486277808,1486277815,GB +1486277816,1486277823,US +1486277824,1486277863,GB +1486277864,1486277871,US +1486277872,1486277895,GB +1486277896,1486277935,US +1486277936,1486277943,GB +1486277944,1486277951,US +1486277952,1486277991,GB +1486277992,1486278039,US +1486278040,1486278055,GB +1486278056,1486278079,US +1486278080,1486278095,GB +1486278096,1486278143,US +1486278144,1486278399,GB +1486278400,1486278511,US +1486278512,1486278527,GB +1486278528,1486278551,US +1486278552,1486278567,GB +1486278568,1486278575,US +1486278576,1486278583,GB +1486278584,1486278623,US +1486278624,1486278639,GB +1486278640,1486278663,US +1486278664,1486278679,GB +1486278680,1486278687,US +1486278688,1486278695,GB +1486278696,1486278743,US +1486278744,1486278791,GB +1486278792,1486278799,US +1486278800,1486278815,GB +1486278816,1486278943,US +1486278944,1486278951,GB +1486278952,1486279039,US +1486279040,1486279103,GB +1486279104,1486279151,US +1486279152,1486279161,GB +1486279162,1486279163,US +1486279164,1486279295,GB +1486279296,1486279319,US +1486279320,1486279327,GB +1486279328,1486279343,US +1486279344,1486279359,GB +1486279360,1486279375,US +1486279376,1486279383,GB +1486279384,1486279407,US +1486279408,1486279479,GB +1486279480,1486279583,US +1486279584,1486279599,GB +1486279600,1486279623,US +1486279624,1486279631,GB +1486279632,1486279647,US +1486279648,1486279663,GB +1486279664,1486279671,US +1486279672,1486279679,GB +1486279680,1486279687,US +1486279688,1486279703,GB +1486279704,1486279727,US +1486279728,1486279735,GB +1486279736,1486279751,US +1486279752,1486279775,GB +1486279776,1486279791,US +1486279792,1486279799,GB +1486279800,1486279807,US +1486279808,1486279839,GB +1486279840,1486279855,US +1486279856,1486279887,GB +1486279888,1486279935,US +1486279936,1486279991,GB +1486279992,1486279999,US +1486280000,1486280023,GB +1486280024,1486280151,US +1486280152,1486280159,GB +1486280160,1486280167,US +1486280168,1486280191,GB +1486280192,1486280319,US +1486280320,1486280335,GB +1486280336,1486280367,US +1486280368,1486280383,GB +1486280384,1486280391,US +1486280392,1486280399,GB +1486280400,1486280415,US +1486280416,1486280423,GB +1486280424,1486280447,US +1486280448,1486280455,GB +1486280456,1486280463,US +1486280464,1486280487,GB +1486280488,1486280495,US +1486280496,1486280511,GB +1486280512,1486280537,US +1486280538,1486280539,GB +1486280540,1486280541,US +1486280542,1486280543,GB +1486280544,1486280559,US +1486280560,1486280567,GB +1486280568,1486280647,US +1486280648,1486280655,GB +1486280656,1486280679,US +1486280680,1486280687,GB +1486280688,1486280695,US +1486280696,1486281983,GB +1486281984,1486282111,US +1486282112,1486282143,GB +1486282144,1486282159,US +1486282160,1486282263,GB +1486282264,1486282271,US +1486282272,1486282279,GB +1486282280,1486282287,US +1486282288,1486282303,GB +1486282304,1486282383,US +1486282384,1486282415,GB +1486282416,1486282423,US +1486282424,1486282431,GB +1486282432,1486282559,US +1486282560,1486282567,GB +1486282568,1486282575,US +1486282576,1486282591,GB +1486282592,1486282599,US +1486282600,1486282639,GB +1486282640,1486282719,US +1486282720,1486283007,GB +1486283008,1486283023,US +1486283024,1486283031,GB +1486283032,1486283095,US +1486283096,1486283263,GB +1486283264,1486283271,US +1486283272,1486283279,GB +1486283280,1486283295,US +1486283296,1486283391,GB +1486283392,1486283455,US +1486283456,1486283495,GB +1486283496,1486283511,US +1486283512,1486283647,GB +1486283648,1486283695,US +1486283696,1486283711,GB +1486283712,1486283775,US +1486283776,1486283831,GB +1486283832,1486283839,US +1486283840,1486283855,GB +1486283856,1486283871,US +1486283872,1486283903,GB +1486283904,1486283911,US +1486283912,1486283927,GB +1486283928,1486283935,US +1486283936,1486283951,GB +1486283952,1486283991,US +1486283992,1486284007,GB +1486284008,1486284023,US +1486284024,1486284039,GB +1486284040,1486284047,US +1486284048,1486284063,GB +1486284064,1486284167,US +1486284168,1486284191,GB +1486284192,1486284215,US +1486284216,1486284223,GB +1486284224,1486284543,US +1486284544,1486284599,GB +1486284600,1486284623,US +1486284624,1486284647,GB +1486284648,1486284655,US +1486284656,1486284671,GB +1486284672,1486284735,US +1486284736,1486284743,GB +1486284744,1486284799,US +1486284800,1486284815,GB +1486284816,1486284823,US +1486284824,1486284831,GB +1486284832,1486284839,US +1486284840,1486284855,GB +1486284856,1486284871,US +1486284872,1486284879,GB +1486284880,1486284895,US +1486284896,1486284903,GB +1486284904,1486284919,US +1486284920,1486284959,GB +1486284960,1486284983,US +1486284984,1486284991,GB +1486284992,1486284999,US +1486285000,1486285023,GB +1486285024,1486285039,US +1486285040,1486285055,GB +1486285056,1486285071,US +1486285072,1486285095,GB +1486285096,1486285103,US +1486285104,1486285135,GB +1486285136,1486285143,US +1486285144,1486285151,GB +1486285152,1486285153,US +1486285154,1486285167,GB +1486285168,1486285223,US +1486285224,1486285231,GB +1486285232,1486285439,US +1486285440,1486285447,GB +1486285448,1486285471,US +1486285472,1486285487,GB +1486285488,1486285519,US +1486285520,1486285535,GB +1486285536,1486285599,US +1486285600,1486285631,GB +1486285632,1486285663,US +1486285664,1486285695,GB +1486285696,1486285703,US +1486285704,1486285711,GB +1486285712,1486285727,US +1486285728,1486285735,GB +1486285736,1486285743,US +1486285744,1486285759,GB +1486285760,1486285823,US +1486285824,1486285951,GB +1486285952,1486286079,US +1486286080,1486286351,GB +1486286352,1486286391,US +1486286392,1486286399,GB +1486286400,1486286415,US +1486286416,1486286431,GB +1486286432,1486286447,US +1486286448,1486286455,GB +1486286456,1486286463,US +1486286464,1486286495,GB +1486286496,1486286527,US +1486286528,1486286575,GB +1486286576,1486286583,US +1486286584,1486286591,GB +1486286592,1486286687,US +1486286688,1486286719,GB +1486286720,1486286735,US +1486286736,1486286743,GB +1486286744,1486286751,US +1486286752,1486286759,GB +1486286760,1486286767,US +1486286768,1486286815,GB +1486286816,1486286847,US +1486286848,1486287831,GB +1486287832,1486287847,US +1486287848,1486288079,GB +1486288080,1486288087,US +1486288088,1486288095,GB +1486288096,1486288151,US +1486288152,1486288167,GB +1486288168,1486288183,US +1486288184,1486288215,GB +1486288216,1486288223,US +1486288224,1486288271,GB +1486288272,1486288319,US +1486288320,1486288351,GB +1486288352,1486288383,US +1486288384,1486288639,GB +1486288640,1486288663,US +1486288664,1486288679,GB +1486288680,1486288687,US +1486288688,1486288703,GB +1486288704,1486288735,US +1486288736,1486288751,GB +1486288752,1486288759,US +1486288760,1486288767,GB +1486288768,1486288791,US +1486288792,1486288799,GB +1486288800,1486288823,US +1486288824,1486288903,GB +1486288904,1486288905,US +1486288906,1486288907,GB +1486288908,1486288909,US +1486288910,1486288911,GB +1486288912,1486288935,US +1486288936,1486288943,GB +1486288944,1486288951,US +1486288952,1486288991,GB +1486288992,1486288999,US +1486289000,1486289015,GB +1486289016,1486289023,US +1486289024,1486289535,GB +1486289536,1486289567,US +1486289568,1486289583,GB +1486289584,1486289599,US +1486289600,1486289615,GB +1486289616,1486289631,US +1486289632,1486289767,GB +1486289768,1486289791,US +1486289792,1486289823,GB +1486289824,1486289839,US +1486289840,1486289863,GB +1486289864,1486289871,US +1486289872,1486289883,GB +1486289884,1486289919,US +1486289920,1486290623,GB +1486290624,1486290943,US +1486290944,1486292991,GB 1486292992,1486295039,RU 1486295040,1486297087,ES 1486297088,1486299135,IE @@ -28788,7 +29858,11 @@ 1490305024,1490321407,DK 1490321408,1490325503,GB 1490325504,1490328575,FR -1490328576,1490337791,GB +1490328576,1490336767,GB +1490336768,1490337023,ES +1490337024,1490337279,GB +1490337280,1490337535,ES +1490337536,1490337791,GB 1490337792,1490354175,RU 1490354176,1490386943,SA 1490386944,1490403327,CH @@ -28940,6 +30014,7 @@ 1495160240,1495160255,FR 1495160256,1495160263,GB 1495160320,1495160575,FR +1495160576,1495160831,CN 1495162112,1495162367,DE 1495162496,1495162499,DE 1495162608,1495162623,GB @@ -29168,7 +30243,8 @@ 1495467008,1495468031,RO 1495468032,1495470079,MD 1495470080,1495472127,NL -1495472128,1495474175,RO +1495472128,1495473151,RO +1495473152,1495474175,GB 1495474176,1495474431,NL 1495474432,1495474687,RO 1495474688,1495474943,MD @@ -29177,8 +30253,7 @@ 1495478272,1495479295,RO 1495479296,1495479551,TR 1495479552,1495480319,RO -1495480320,1495480575,NL -1495480576,1495480831,RO +1495480320,1495480831,NL 1495480832,1495481343,IR 1495481344,1495482367,RO 1495482368,1495484415,IR @@ -29234,8 +30309,8 @@ 1495531520,1495535615,RO 1495535616,1495536127,IR 1495536128,1495537663,RO -1495539712,1495540735,RO -1495540736,1495540991,NL +1495539712,1495540735,US +1495540736,1495540991,GB 1495540992,1495541247,RO 1495541248,1495541759,GB 1495541760,1495543807,RO @@ -29282,8 +30357,8 @@ 1495589376,1495589887,IR 1495589888,1495590143,IT 1495590144,1495590655,RO -1495590656,1495591935,US -1495591936,1495596031,RO +1495590656,1495592959,US +1495592960,1495596031,RO 1495596032,1495596543,IR 1495596544,1495596799,RO 1495596800,1495597055,MD @@ -29298,9 +30373,12 @@ 1495607552,1495607807,RO 1495607808,1495608319,IR 1495608320,1495609343,MD -1495609344,1495617535,RO +1495609344,1495613439,RO +1495613440,1495614463,GB +1495614464,1495617535,RO 1495617536,1495618559,ES -1495618560,1495620607,RO +1495618560,1495619583,BE +1495619584,1495620607,RO 1495620608,1495621375,GB 1495621376,1495621631,RO 1495621632,1495621887,GB @@ -29332,17 +30410,20 @@ 1495654400,1495654911,RO 1495654912,1495655167,NL 1495655168,1495655423,BG -1495655424,1495656959,RO +1495655424,1495656447,US +1495656448,1495656959,RO 1495656960,1495657215,GB -1495657216,1495658495,RO +1495657216,1495657471,RO +1495657472,1495658495,US 1495658496,1495662591,IR 1495662592,1495668735,RO 1495668736,1495669247,IR 1495669248,1495669503,GB -1495669504,1495670783,RO +1495669504,1495669759,RO +1495669760,1495670783,IL 1495670784,1495671807,MD 1495671808,1495672319,RO -1495672320,1495672575,NL +1495672320,1495672575,GB 1495672576,1495672831,MD 1495672832,1495674879,ES 1495674880,1495677951,RO @@ -29412,7 +30493,8 @@ 1495767040,1495769087,ES 1495769088,1495771135,RO 1495771136,1495772159,PL -1495772160,1495775743,RO +1495772160,1495772671,US +1495772672,1495775743,RO 1495775744,1495776255,IR 1495776256,1495782399,RO 1495782400,1495782911,GB @@ -29523,7 +30605,8 @@ 1495931648,1495931903,BG 1495931904,1495932159,RO 1495932160,1495932415,US -1495932416,1495932927,RO +1495932416,1495932671,RO +1495932672,1495932927,GB 1495932928,1495933439,IR 1495933440,1495934975,RO 1495934976,1495935231,GB @@ -29569,7 +30652,8 @@ 1495976960,1495977983,KZ 1495977984,1495979007,RO 1495979008,1495979263,NL -1495979264,1495979775,RO +1495979264,1495979519,US +1495979520,1495979775,RO 1495979776,1495980031,GB 1495980032,1495982079,RO 1495982080,1495983103,MD @@ -29712,7 +30796,9 @@ 1496182784,1496183039,ES 1496183040,1496183551,US 1496183552,1496184063,ES -1496184064,1496184831,US +1496184064,1496184740,US +1496184741,1496184741,ES +1496184742,1496184831,US 1496184832,1496188927,RO 1496188928,1496189951,ES 1496189952,1496190975,RO @@ -29721,8 +30807,8 @@ 1496197120,1496197631,MD 1496197632,1496198143,RO 1496198144,1496198655,IR -1496198656,1496198911,NL -1496198912,1496199167,GB +1496198656,1496198656,US +1496198657,1496199167,GB 1496199168,1496202239,RO 1496202240,1496202751,IR 1496202752,1496203263,RO @@ -29749,11 +30835,13 @@ 1496238080,1496240127,IQ 1496240128,1496242175,RO 1496242176,1496243199,IR -1496243200,1496248595,RO -1496248596,1496248596,MD -1496248597,1496253439,RO +1496243200,1496248575,RO +1496248576,1496248831,MD +1496248832,1496253439,RO 1496253440,1496254463,ES -1496254464,1496260607,RO +1496254464,1496256255,RO +1496256256,1496256511,NL +1496256512,1496260607,RO 1496260608,1496261119,IT 1496261120,1496262655,RO 1496262656,1496263167,BG @@ -29993,13 +31081,9 @@ 1503895664,1503895671,FR 1503895672,1503895679,DE 1503895680,1503895687,IT -1503895688,1503895927,DE -1503895928,1503895935,DK -1503895936,1503896159,DE +1503895688,1503896159,DE 1503896160,1503896175,CH -1503896176,1503896343,DE -1503896344,1503896351,AT -1503896352,1503896411,DE +1503896176,1503896411,DE 1503896412,1503896415,AT 1503896416,1503897367,DE 1503897368,1503897375,BE @@ -30059,9 +31143,11 @@ 1504051200,1504083967,FI 1504083968,1504116735,DE 1504116736,1504149503,PL -1504149504,1504149693,GB +1504149504,1504149691,GB +1504149692,1504149693,US 1504149694,1504149694,IE -1504149695,1504149759,GB +1504149695,1504149695,US +1504149696,1504149759,GB 1504149760,1504150015,ES 1504150016,1504150271,GB 1504150272,1504150527,DE @@ -30138,13 +31224,7 @@ 1505646848,1505647103,PL 1505647104,1505648639,CZ 1505648640,1505656831,LT -1505665024,1505669491,IT -1505669492,1505669495,SI -1505669496,1505670159,IT -1505670160,1505670163,SI -1505670164,1505672239,IT -1505672240,1505672243,SI -1505672244,1505673215,IT +1505665024,1505673215,IT 1505673216,1505681407,BG 1505681408,1505689599,RU 1505689600,1505697791,NO @@ -30153,7 +31233,7 @@ 1505714176,1505722367,LV 1505722368,1505738751,PL 1505738752,1505746943,GB -1505746944,1505751039,IL +1505746944,1505751039,UA 1505751040,1505755135,RU 1505755136,1506017279,GB 1506017280,1506082815,IR @@ -30403,9 +31483,7 @@ 1508830720,1508831487,SK 1508831488,1508835327,RO 1508835328,1508843519,CZ -1508843520,1508847615,GB -1508847616,1508849663,CZ -1508849664,1508851711,GB +1508843520,1508851711,GB 1508851712,1508868095,PL 1508868096,1508884479,RU 1508884480,1508900863,DK @@ -30513,8 +31591,8 @@ 1510616832,1510617087,FR 1510617088,1510618111,RE 1510618112,1510618367,FR -1510618368,1510618879,RE -1510618880,1510619391,FR +1510618368,1510619135,RE +1510619136,1510619391,FR 1510619392,1510619647,RE 1510619648,1510619903,FR 1510619904,1510621183,RE @@ -30648,8 +31726,8 @@ 1512327680,1512328959,GP 1512328960,1512329215,FR 1512329216,1512332287,GP -1512332288,1512333055,FR -1512333056,1512333567,GP +1512332288,1512332799,FR +1512332800,1512333567,GP 1512333568,1512335615,FR 1512335616,1512336383,GP 1512336384,1512336639,FR @@ -30752,7 +31830,8 @@ 1518476288,1518476799,EE 1518476800,1518477311,SE 1518477312,1518481407,EE -1518481408,1518501887,SE +1518481408,1518493695,SE +1518493696,1518501887,LV 1518501888,1518503935,EE 1518503936,1518510079,LT 1518510080,1518516223,LV @@ -30767,10 +31846,10 @@ 1518565376,1518567423,SE 1518567424,1518583807,LV 1518583808,1518600191,HR -1518600192,1518633215,SE -1518633216,1518633471,NL -1518633472,1518641151,SE -1518641152,1518649343,NL +1518600192,1518641151,SE +1518641152,1518645247,NL +1518645248,1518647295,SE +1518647296,1518649343,NL 1518649344,1518665727,SE 1518665728,1518723071,LV 1518723072,1518727167,EE @@ -30801,7 +31880,8 @@ 1519208704,1519210495,LV 1519210496,1519214591,LT 1519214592,1519222783,LV -1519222784,1519271935,SE +1519222784,1519263743,SE +1519263744,1519271935,LV 1519271936,1519288319,NL 1519288320,1519292415,SE 1519292416,1519294463,LT @@ -30836,9 +31916,7 @@ 1520009216,1520041983,SY 1520041984,1520074751,RU 1520074752,1520107519,BG -1520107520,1520139767,GB -1520139768,1520139775,IE -1520139776,1520140287,GB +1520107520,1520140287,GB 1520140288,1520173055,RU 1520173056,1520205823,PL 1520205824,1520230399,RU @@ -30889,14 +31967,13 @@ 1532675072,1532682239,UA 1532682240,1532690431,LV 1532690432,1532755967,FR -1532755968,1532756991,DE -1532756992,1532774143,BG +1532755968,1532774143,BG 1532774144,1532774399,CH 1532774400,1532784639,BG 1532784640,1532785151,TR 1532785152,1532787711,BG -1532787712,1532789759,DE -1532789760,1532795903,BG +1532787712,1532788735,DE +1532788736,1532795903,BG 1532795904,1532796927,DE 1532796928,1532797951,BG 1532797952,1532798975,DE @@ -31030,7 +32107,9 @@ 1533819904,1533820927,RU 1533820928,1533829119,DE 1533829120,1533833215,NO -1533833216,1533845503,IR +1533833216,1533835263,IR +1533835264,1533836287,US +1533836288,1533845503,IR 1533845504,1533847551,GB 1533847552,1533849599,RU 1533849600,1533851135,SE @@ -31165,7 +32244,9 @@ 1534717344,1534717359,GB 1534717360,1534717739,FR 1534717740,1534717743,GB -1534717744,1534717995,FR +1534717744,1534717887,FR +1534717888,1534717895,GB +1534717896,1534717995,FR 1534717996,1534717999,GB 1534718000,1534718087,FR 1534718088,1534718091,ES @@ -31234,7 +32315,9 @@ 1534988288,1535049727,ES 1535049728,1535115263,SK 1535115264,1535116287,AT -1535116288,1535148031,SE +1535116288,1535123455,SE +1535123456,1535131647,LV +1535131648,1535148031,SE 1535148032,1535197183,AT 1535197184,1535203359,EE 1535203360,1535205375,SE @@ -31364,7 +32447,9 @@ 1535563372,1535563375,FI 1535563376,1535563455,FR 1535563456,1535563519,IE -1535563520,1535566143,FR +1535563520,1535564351,FR +1535564352,1535564415,IE +1535564416,1535566143,FR 1535566144,1535566159,ES 1535566160,1535566563,FR 1535566564,1535566567,GB @@ -31623,7 +32708,7 @@ 1539186688,1539194879,LV 1539194880,1539203071,RU 1539203072,1539204095,NL -1539204096,1539205119,IN +1539204096,1539205119,US 1539205120,1539206143,NL 1539206144,1539207167,GB 1539207168,1539211263,RU @@ -31907,7 +32992,8 @@ 1539530240,1539530751,AT 1539530752,1539531263,UA 1539531264,1539531775,RO -1539531776,1539532799,RU +1539531776,1539532543,RU +1539532544,1539532799,CZ 1539532800,1539533311,DE 1539533312,1539533823,CZ 1539533824,1539534335,PL @@ -32211,7 +33297,6 @@ 1539745024,1539745279,GB 1539745280,1539745535,GI 1539745792,1539746303,DK -1539746816,1539747071,DK 1539747072,1539747327,CH 1539747328,1539747583,NL 1539747584,1539747839,UA @@ -32323,8 +33408,7 @@ 1539779840,1539780095,NL 1539780096,1539780351,RU 1539780608,1539780863,PL -1539780864,1539781119,RO -1539781120,1539781375,NL +1539780864,1539781375,RO 1539781376,1539781631,PL 1539781632,1539781887,HU 1539781888,1539782143,IL @@ -32355,7 +33439,6 @@ 1539788544,1539788799,HR 1539788800,1539789055,RU 1539789568,1539789823,DE -1539789824,1539790079,NL 1539790080,1539790335,CH 1539790336,1539790591,LV 1539790848,1539791103,DE @@ -32808,7 +33891,10 @@ 1540217856,1540218879,GB 1540218880,1540219903,RU 1540219904,1540220927,PL -1540220928,1540221951,US +1540220928,1540220991,US +1540220992,1540221439,NL +1540221440,1540221567,US +1540221568,1540221951,NL 1540221952,1540223999,RU 1540224000,1540225023,PL 1540225024,1540226047,GB @@ -33152,7 +34238,6 @@ 1540396032,1540396287,NO 1540396288,1540396543,AM 1540396544,1540396799,PL -1540396800,1540397055,RU 1540397056,1540397311,IT 1540397312,1540397823,UA 1540397824,1540398079,DE @@ -33232,7 +34317,6 @@ 1540421376,1540421631,PL 1540421632,1540422143,RU 1540422144,1540422399,PL -1540422400,1540422655,UA 1540422656,1540422911,GB 1540422912,1540423423,RU 1540423424,1540423679,BA @@ -33496,8 +34580,8 @@ 1540554752,1540555775,SE 1540555776,1540556799,UZ 1540556800,1540557823,DE -1540557824,1540559871,UA -1540559872,1540562943,RU +1540557824,1540558848,UA +1540558849,1540562943,RU 1540562944,1540563967,AT 1540563968,1540564991,RU 1540564992,1540566015,DE @@ -34343,7 +35427,7 @@ 1540981504,1540981759,DE 1540981760,1540982015,PL 1540982016,1540982271,DK -1540982272,1540982783,GB +1540982272,1540982527,GB 1540982784,1540983295,RU 1540983296,1540983551,ME 1540983808,1540984063,FR @@ -35032,8 +36116,8 @@ 1541362944,1541363199,DK 1541363200,1541363455,UA 1541363456,1541363711,IE -1541363712,1541364223,UA -1541364224,1541364479,RU +1541363712,1541363967,UA +1541363968,1541364479,RU 1541364480,1541364735,AT 1541364736,1541364991,SE 1541364992,1541365247,RU @@ -35299,7 +36383,8 @@ 1541476352,1541477375,GB 1541477376,1541479423,RU 1541479424,1541480447,PL -1541480448,1541481471,RO +1541480448,1541480959,US +1541480960,1541481471,RO 1541481472,1541485567,UA 1541485568,1541486591,IR 1541486592,1541487615,UA @@ -35388,9 +36473,7 @@ 1541568000,1541568511,SE 1541568512,1541569535,RU 1541569536,1541570559,NL -1541570560,1541571583,RU -1541571584,1541572607,UA -1541572608,1541573119,RU +1541570560,1541573119,RU 1541573120,1541573631,UA 1541573632,1541574655,RU 1541574656,1541575167,SE @@ -36057,7 +37140,7 @@ 1541963520,1541964031,UA 1541964288,1541964543,NL 1541964544,1541965823,RU -1541965824,1541966847,NL +1541965824,1541966847,US 1541966848,1541967871,PL 1541967872,1541968895,RU 1541968896,1541969919,GB @@ -36730,7 +37813,6 @@ 1542378496,1542378751,DK 1542379008,1542379519,GB 1542379520,1542379775,PL -1542379776,1542380031,RU 1542380032,1542380287,RO 1542380288,1542380543,BE 1542380544,1542380799,FR @@ -36974,7 +38056,6 @@ 1542507520,1542508543,NO 1542508544,1542509567,RU 1542509568,1542510079,CY -1542510080,1542510335,RU 1542510592,1542510847,SI 1542510848,1542511103,DE 1542511104,1542511871,RU @@ -37196,8 +38277,9 @@ 1542904320,1542904575,IL 1542904576,1542904831,RU 1542904832,1542914047,UA -1542914048,1542922239,RU -1542922240,1542930431,UA +1542914048,1542923263,RU +1542923264,1542923775,BG +1542923776,1542930431,UA 1542930432,1542930943,CZ 1542930944,1542931455,IR 1542931456,1542932479,RU @@ -37242,9 +38324,7 @@ 1545863168,1545895935,RU 1545895936,1545928703,BA 1545928704,1545961471,SI -1545961472,1545994751,RU -1545994752,1545995007,CZ -1545995008,1545995519,RU +1545961472,1545995519,RU 1545995520,1545996287,CZ 1545996288,1545998335,RU 1545998336,1546000383,CZ @@ -37316,7 +38396,15 @@ 1546276864,1546278911,IT 1546278912,1546280959,RU 1546280960,1546283007,IT -1546283008,1546285055,DE +1546283008,1546283463,DE +1546283464,1546283471,FR +1546283472,1546283827,DE +1546283828,1546283835,FR +1546283836,1546284287,DE +1546284288,1546284291,FR +1546284292,1546284469,DE +1546284470,1546284471,FR +1546284472,1546285055,DE 1546285056,1546287103,PL 1546287104,1546289151,GB 1546289152,1546291199,RU @@ -37599,11 +38687,17 @@ 1550996224,1550996479,AU 1550996480,1550998527,RO 1550998528,1550998783,IT -1550998784,1551007743,RO +1550998784,1551000575,RO +1551000576,1551001599,NL +1551001600,1551007743,RO 1551007744,1551106047,MD 1551106048,1551237119,DE 1551237120,1551302655,GR -1551368192,1551499263,NL +1551368192,1551450111,NL +1551450112,1551452159,SG +1551452160,1551454207,NL +1551454208,1551456255,US +1551456256,1551499263,NL 1551503360,1551504383,GB 1551504384,1551505407,FR 1551516672,1551517695,IT @@ -37651,7 +38745,9 @@ 1558079872,1558079887,GB 1558079888,1558081175,FR 1558081176,1558081183,BE -1558081184,1558082943,FR +1558081184,1558082139,FR +1558082140,1558082143,ES +1558082144,1558082943,FR 1558082944,1558082959,PL 1558082960,1558083775,FR 1558083776,1558083791,DE @@ -37665,7 +38761,9 @@ 1558084656,1558084659,BE 1558084660,1558085055,FR 1558085056,1558085071,GB -1558085072,1558091351,FR +1558085072,1558088319,FR +1558088320,1558088323,ES +1558088324,1558091351,FR 1558091352,1558091352,ES 1558091353,1558093531,FR 1558093532,1558093532,HR @@ -37704,7 +38802,14 @@ 1558126592,1558128639,RU 1558128640,1558129663,LU 1558129664,1558130687,US -1558130688,1558138879,LU +1558130688,1558131199,AU +1558131200,1558131711,LU +1558131712,1558132223,HK +1558132224,1558137087,LU +1558137088,1558137343,KR +1558137344,1558137855,LU +1558137856,1558138367,HK +1558138368,1558138879,AU 1558138880,1558139135,RU 1558139136,1558139391,NL 1558139392,1558139903,US @@ -37715,9 +38820,16 @@ 1558140928,1558141439,LU 1558141440,1558141695,CY 1558141696,1558141951,RU -1558141952,1558142463,LU -1558142464,1558142719,US -1558142720,1558147583,LU +1558141952,1558142719,LU +1558142720,1558142975,SG +1558142976,1558143231,US +1558143232,1558143743,LU +1558143744,1558143999,RU +1558144000,1558144255,LU +1558144256,1558144767,RU +1558144768,1558146306,LU +1558146307,1558146307,RU +1558146308,1558147583,LU 1558147584,1558147839,RU 1558147840,1558148095,LU 1558148096,1558148351,SG @@ -37806,7 +38918,11 @@ 1559838720,1559855103,UA 1559855104,1559887871,HU 1559887872,1559920639,PT -1559920640,1559932927,LU +1559920640,1559921407,LU +1559921408,1559921663,FR +1559921664,1559932159,LU +1559932160,1559932415,FR +1559932416,1559932927,LU 1559932928,1559934975,DE 1559934976,1559937023,LU 1559937024,1559943167,DE @@ -37829,10 +38945,9 @@ 1560117248,1560125439,CZ 1560125440,1560135679,RU 1560135680,1560135807,UA -1560135808,1560135935,CZ -1560135936,1560139775,GB -1560139776,1560141823,CZ -1560141824,1560143871,GB +1560135808,1560136447,CZ +1560136448,1560139775,GB +1560139776,1560143871,CZ 1560143872,1560145919,FR 1560145920,1560150015,CZ 1560150016,1560182783,NL @@ -37840,7 +38955,11 @@ 1560215552,1560281087,RU 1560281088,1562378239,FR 1562378240,1564999679,IT -1564999680,1565239295,UA +1564999680,1565224959,UA +1565224960,1565227007,BG +1565227008,1565227519,UA +1565227520,1565229055,BG +1565229056,1565239295,UA 1565239296,1565241343,RU 1565241344,1565294591,UA 1565294592,1565302783,PT @@ -37854,7 +38973,9 @@ 1565786112,1565917183,BY 1565917184,1565934591,RS 1565934592,1565935103,XK -1565935104,1566048255,RS +1565935104,1566019583,RS +1566019584,1566020095,XK +1566020096,1566048255,RS 1566048256,1566052351,RU 1566056448,1566060543,IT 1566060544,1566064639,UA @@ -37950,7 +39071,8 @@ 1566384128,1566386175,CZ 1566386176,1566388223,FR 1566388224,1566388479,HK -1566388480,1566390271,LU +1566388480,1566390015,LU +1566390016,1566390271,US 1566390272,1566392319,LT 1566392320,1566394367,ES 1566394368,1566394528,NO @@ -38198,7 +39320,7 @@ 1567826432,1567827455,RO 1567827456,1567827711,BG 1567827712,1567830015,RO -1567830016,1567831039,DE +1567830016,1567831039,US 1567831040,1567832831,RO 1567832832,1567833087,GB 1567833088,1567833599,NL @@ -38219,7 +39341,8 @@ 1567850496,1567852543,RO 1567852544,1567854591,MD 1567854592,1567856639,IR -1567856640,1567857663,RO +1567856640,1567857407,RO +1567857408,1567857663,US 1567857664,1567858687,ES 1567858688,1567860735,SE 1567860736,1567861247,BE @@ -38412,8 +39535,8 @@ 1571426048,1571426303,UA 1571426304,1571428351,RU 1571428352,1571428607,CZ -1571428608,1571428863,UA -1571428864,1571429375,CZ +1571428608,1571429119,UA +1571429120,1571429375,CZ 1571429376,1571430399,BY 1571430400,1571430911,UA 1571430912,1571431167,BY @@ -38863,6 +39986,7 @@ 1572835328,1572837375,IE 1572837376,1572839423,DK 1572839424,1572841471,DE +1572841728,1572841983,GB 1572842752,1572843007,NL 1572843520,1572845567,JO 1572845568,1572847615,FR @@ -39053,7 +40177,9 @@ 1578614496,1578614511,DE 1578614512,1578614583,FR 1578614584,1578614591,GB -1578614592,1578631167,FR +1578614592,1578615915,FR +1578615916,1578615916,GB +1578615917,1578631167,FR 1578631168,1578637311,IR 1578637312,1578651647,RO 1578651648,1578657791,IR @@ -39116,10 +40242,7 @@ 1580125952,1580126207,GB 1580126208,1580128255,CY 1580128256,1580129279,NL -1580129280,1580129535,GB -1580129536,1580130079,US -1580130080,1580130095,GB -1580130096,1580130303,US +1580129280,1580130303,GB 1580130304,1580134399,CY 1580134400,1580135423,SE 1580135424,1580136447,GB @@ -39128,7 +40251,11 @@ 1580137472,1580138495,SE 1580138496,1580150783,IT 1580150784,1580154879,SY -1580154880,1580204031,IT +1580154880,1580199935,IT +1580199936,1580200959,SY +1580200960,1580201983,IT +1580201984,1580203007,SY +1580203008,1580204031,IT 1580204032,1580335103,SA 1580335104,1580466175,RU 1580466176,1580597247,RO @@ -39167,9 +40294,7 @@ 1582252032,1582268415,TR 1582268416,1582284799,DE 1582284800,1582301183,BH -1582301184,1583089271,IT -1583089272,1583089279,SI -1583089280,1583349759,IT +1582301184,1583349759,IT 1583349760,1583611903,SA 1583611904,1583615999,LV 1583616000,1583617791,NL @@ -39227,8 +40352,8 @@ 1583780432,1583780447,GB 1583780448,1583780455,IT 1583780456,1583780743,GB -1583780744,1583780759,IT -1583780760,1583780767,GB +1583780744,1583780751,IT +1583780752,1583780767,GB 1583780768,1583780775,IT 1583780776,1583780791,GB 1583780792,1583780799,IT @@ -39242,9 +40367,7 @@ 1583781672,1583781679,IT 1583781680,1583781863,GB 1583781864,1583781871,IT -1583781872,1583782239,GB -1583782240,1583782247,IT -1583782248,1583782415,GB +1583781872,1583782415,GB 1583782416,1583782423,IT 1583782424,1583782431,GB 1583782432,1583782439,IT @@ -39332,7 +40455,9 @@ 1585258496,1585260543,GB 1585260544,1585264639,RU 1585264640,1585265663,MT -1585265664,1585266687,IM +1585265664,1585265967,IM +1585265968,1585265983,FR +1585265984,1585266687,IM 1585266688,1585270783,DE 1585270784,1585272831,IT 1585272832,1585274879,RU @@ -39558,7 +40683,8 @@ 1588594688,1588602879,IR 1588602880,1588603135,RO 1588603136,1588603391,BG -1588603392,1588604927,RO +1588603392,1588603903,RO +1588603904,1588604927,IT 1588604928,1588609023,IR 1588609024,1588613119,MD 1588613120,1588617215,IR @@ -39577,11 +40703,14 @@ 1588640768,1588641279,LT 1588641280,1588641535,RO 1588641536,1588641791,GB -1588641792,1588643839,ES +1588641792,1588642303,ES +1588642304,1588642559,DK +1588642560,1588642815,NL +1588642816,1588643839,ES 1588643840,1588649983,RO 1588649984,1588652031,SE 1588652032,1588652159,NL -1588652160,1588654079,RO +1588652160,1588654079,LT 1588654080,1588658175,DE 1588658176,1588659199,RO 1588659200,1588659711,GB @@ -39598,7 +40727,10 @@ 1588665088,1588665343,GB 1588665344,1588673535,RO 1588673536,1588674559,BG -1588674560,1588676607,RO +1588674560,1588674815,RO +1588674816,1588675071,US +1588675072,1588675583,RO +1588675584,1588676607,IT 1588676608,1588678655,IR 1588678656,1588680703,RO 1588680704,1588682751,LU @@ -39649,8 +40781,9 @@ 1589551104,1589560319,BG 1589560320,1589561343,GI 1589561344,1589563391,NL -1589563392,1589573631,BG -1589573632,1589574655,GB +1589563392,1589569535,HK +1589569536,1589573631,BG +1589573632,1589574655,US 1589574656,1589575679,BG 1589575680,1589608447,RU 1589608448,1589616639,SE @@ -39824,7 +40957,11 @@ 1592577024,1592590335,BG 1592590336,1592594431,FI 1592594432,1592598527,DE -1592598528,1592623103,FI +1592598528,1592600575,FI +1592600576,1592601599,NL +1592601600,1592606719,FI +1592606720,1592608767,SG +1592608768,1592623103,FI 1592623104,1592655871,RU 1592655872,1592786943,FR 1592786944,1592803327,PL @@ -40003,7 +41140,10 @@ 1596888064,1596889599,RU 1596889600,1596889855,KG 1596889856,1596890111,UA -1596890112,1596890623,RU +1596890112,1596890367,RU +1596890368,1596890619,UA +1596890620,1596890620,RU +1596890621,1596890623,UA 1596890624,1596890879,CZ 1596890880,1596891135,RU 1596891136,1596892159,UA @@ -40213,8 +41353,7 @@ 1602291712,1602293759,SA 1602293760,1602295807,GB 1602295808,1602297855,NL -1602297856,1602299391,IL -1602299392,1602299903,GB +1602297856,1602299903,IL 1602299904,1602301951,GR 1602301952,1602303999,DE 1602304000,1602306047,RU @@ -40514,9 +41653,7 @@ 1605099520,1605107711,RU 1605107712,1605108247,GB 1605108248,1605108255,IT -1605108256,1605108583,GB -1605108584,1605108591,IT -1605108592,1605109079,GB +1605108256,1605109079,GB 1605109080,1605109087,IT 1605109088,1605109223,GB 1605109224,1605109231,IT @@ -40524,9 +41661,7 @@ 1605109352,1605109359,IT 1605109360,1605109495,GB 1605109496,1605109503,IT -1605109504,1605110183,GB -1605110184,1605110191,IT -1605110192,1605110263,GB +1605109504,1605110263,GB 1605110264,1605110271,IT 1605110272,1605110303,GB 1605110304,1605110311,IT @@ -40769,9 +41904,7 @@ 1611005952,1611007999,NL 1611008000,1611009023,US 1611009024,1611010047,NL -1611010048,1611016703,US -1611016704,1611016959,NL -1611016960,1611036671,US +1611010048,1611036671,US 1611036672,1611037183,NL 1611037184,1611042815,US 1611042816,1611046911,NL @@ -40856,9 +41989,7 @@ 1632305152,1632321535,CA 1632321536,1632354303,US 1632354304,1632362495,CA -1632362496,1632979455,US -1632979456,1632979583,CA -1632979584,1634414591,US +1632362496,1634414591,US 1634414592,1634418687,CA 1634418688,1634447359,US 1634447360,1634451455,CA @@ -40894,9 +42025,7 @@ 1654554624,1654558719,CA 1654558720,1654648831,US 1654648832,1654652927,CA -1654652928,1660561023,US -1660561024,1660561151,CA -1660561152,1673527295,US +1654652928,1673527295,US 1673527296,1673560063,CA 1673560064,1673986047,US 1673986048,1674051583,CA @@ -40964,7 +42093,9 @@ 1699618816,1699627007,CN 1699627008,1699643391,SG 1699643392,1699676159,HK -1699676160,1699741695,KR +1699676160,1699714047,KR +1699714048,1699714815,AU +1699714816,1699741695,KR 1699741696,1700793343,CN 1700793344,1700794367,VN 1700794368,1700798463,CN @@ -41041,7 +42172,9 @@ 1710882816,1710948351,KR 1710948352,1710949375,CN 1710949376,1710950399,NP -1710950400,1711210495,CN +1710950400,1710972824,CN +1710972825,1710972825,TW +1710972826,1711210495,CN 1711210496,1711276031,ID 1724715556,1724715556,MU 1728053248,1728120063,AU @@ -41194,11 +42327,10 @@ 1728345088,1728346111,BD 1728346112,1728346367,AU 1728346368,1728346623,NZ -1728346624,1728347135,AU -1728347136,1728347147,SG -1728347149,1728347416,SG -1728347418,1728347421,SG -1728347423,1728348159,SG +1728346624,1728347147,AU +1728347149,1728347416,AU +1728347418,1728347421,AU +1728347423,1728348159,AU 1728348160,1728349183,VN 1728349184,1728350207,AU 1728350208,1728351231,NZ @@ -41362,7 +42494,6 @@ 1728488192,1728488447,MY 1728488448,1728488703,IN 1728488704,1728488959,TH -1728488960,1728489215,HK 1728489216,1728490495,IN 1728490496,1728491519,KR 1728491520,1728492543,HK @@ -41431,7 +42562,7 @@ 1728549632,1728549887,AU 1728549888,1728550911,IN 1728550912,1728551935,JP -1728551936,1728552959,MY +1728551936,1728552959,SG 1728552960,1728553983,HK 1728553984,1728555007,AU 1728555008,1728556031,NZ @@ -41737,7 +42868,6 @@ 1728836608,1728837631,HK 1728837632,1728838655,KR 1728838656,1728839679,ID -1728839680,1728839935,MN 1728839936,1728840191,IN 1728840192,1728840447,SG 1728840448,1728842751,AU @@ -41779,8 +42909,7 @@ 1728872448,1728873471,AU 1728873472,1728874495,IN 1728874496,1728875519,CN -1728875520,1728876543,HK -1728876544,1728877567,MY +1728875520,1728877567,MY 1728877568,1728878591,HK 1728878592,1728879615,MY 1728879616,1728880127,IN @@ -41976,7 +43105,6 @@ 1729042944,1729044479,HK 1729044480,1729045503,JP 1729045504,1729046015,ID -1729046016,1729046271,HK 1729046272,1729046527,JP 1729046528,1729047551,BD 1729047552,1729048575,AU @@ -42265,7 +43393,7 @@ 1729314816,1729317887,CN 1729317888,1729319423,ID 1729319424,1729319935,SG -1729319936,1729320959,HK +1729319936,1729320959,US 1729320960,1729321983,IN 1729321984,1729323007,AU 1729323008,1729324031,VN @@ -42443,7 +43571,7 @@ 1729532928,1729533951,MY 1729533952,1729534975,JP 1729534976,1729535999,TW -1729536000,1729537023,HK +1729536000,1729537023,MY 1729537024,1729537791,ID 1729537792,1729538047,JP 1729538048,1729538559,ID @@ -42518,7 +43646,6 @@ 1729600512,1729601535,VN 1729601536,1729603583,CN 1729603584,1729604607,HK -1729604608,1729605119,IN 1729605120,1729605375,AU 1729605376,1729605631,ID 1729605632,1729606655,CN @@ -43103,7 +44230,7 @@ 1730377728,1730378239,IN 1730378240,1730378495,HK 1730378496,1730378751,IN -1730378752,1730379775,HK +1730378752,1730379775,US 1730379776,1730380799,AU 1730380800,1730381823,IN 1730381824,1730382847,MY @@ -43277,8 +44404,7 @@ 1730594816,1730596863,IN 1730597888,1730598911,PH 1730599424,1730599935,VU -1730599936,1730604031,CN -1730604032,1730605055,NP +1730599936,1730605055,CN 1730605056,1730607103,IN 1730608128,1730609151,CN 1730609152,1730610687,IN @@ -43392,7 +44518,7 @@ 1730768640,1730768895,BD 1730769920,1730770943,HK 1730770944,1730771967,ID -1730771968,1730772991,CN +1730771968,1730772991,HK 1730772992,1730774015,SG 1730774016,1730775039,HK 1730775040,1730776063,JP @@ -43501,7 +44627,7 @@ 1730895872,1730898943,CN 1730898944,1730899967,MO 1730899968,1730900991,IN -1730900992,1730901247,HK +1730900992,1730901247,AU 1730901248,1730901503,SG 1730901504,1730901759,DE 1730901760,1730902015,AU @@ -43557,7 +44683,7 @@ 1730948608,1730949119,AU 1730949120,1730951167,IN 1730951168,1730952191,CN -1730952192,1730953215,HK +1730952192,1730954239,HK 1730954240,1730955263,SG 1730955264,1730957311,BD 1730957312,1730958335,CN @@ -43711,7 +44837,7 @@ 1731206656,1731206911,PH 1731206912,1731207167,JP 1731207168,1731208191,IN -1731208192,1731210239,JP +1731208192,1731209215,JP 1731210240,1731211263,IN 1731211264,1731211775,HK 1731211776,1731212287,IN @@ -43887,7 +45013,7 @@ 1731429120,1731429375,ID 1731429376,1731431423,IN 1731431424,1731431935,TR -1731431936,1731432191,TW +1731431936,1731432191,HK 1731432192,1731432447,TR 1731432448,1731433471,HK 1731433472,1731435519,IN @@ -43934,12 +45060,12 @@ 1731484672,1731485695,VN 1731485696,1731488767,CN 1731488768,1731489791,JP -1731489792,1731490815,HK +1731489792,1731490559,HK +1731490560,1731490815,TW 1731490816,1731491839,AU 1731491840,1731492863,ID 1731492864,1731493887,IN 1731493888,1731495167,JP -1731495168,1731495423,SG 1731495424,1731495935,BD 1731495936,1731496959,IN 1731496960,1731497983,BD @@ -44045,8 +45171,7 @@ 1731608576,1731609599,IN 1731609600,1731610623,AU 1731610624,1731611647,KR -1731611648,1731612159,PK -1731612672,1731614719,PK +1731611648,1731614719,PK 1731614720,1731615743,JP 1731615744,1731616767,ID 1731616768,1731620351,IN @@ -44222,7 +45347,8 @@ 1731804160,1731805183,KR 1731806208,1731806463,AU 1731806464,1731807231,IN -1731807232,1731807999,SG +1731807232,1731807743,SG +1731807744,1731807999,JP 1731808000,1731808255,DK 1731808256,1731809279,CN 1731809280,1731811583,IN @@ -44325,7 +45451,6 @@ 1731957760,1731958783,CN 1731958784,1731959807,IN 1731959808,1731960831,KR -1731960832,1731961855,AU 1731961856,1731962879,CN 1731962880,1731963903,BD 1731963904,1731964927,KH @@ -44394,7 +45519,12 @@ 1732043776,1732044799,CN 1732044800,1732045823,HK 1732045824,1732046847,CN -1732046848,1732047871,AU +1732046848,1732046943,AU +1732046944,1732046951,CN +1732046952,1732046959,GB +1732046960,1732046967,AU +1732046968,1732046975,GB +1732046976,1732047871,AU 1732047872,1732048895,IN 1732048896,1732049919,HK 1732049920,1732050943,PH @@ -44534,7 +45664,10 @@ 1732318208,1732318719,IN 1732318720,1732318975,AU 1732318976,1732322303,IN -1732322304,1732324351,CN +1732322304,1732322815,CN +1732322816,1732323327,HK +1732323328,1732323839,CN +1732323840,1732324351,HK 1732324352,1732325375,JP 1732325376,1732337663,CN 1732337664,1732338175,ID @@ -44611,7 +45744,9 @@ 1732422400,1732422655,JP 1732422656,1732423679,IN 1732423680,1732424703,BD -1732424704,1732425727,HK +1732424704,1732424705,HK +1732424706,1732424707,CN +1732424708,1732425727,HK 1732425728,1732426751,KH 1732426752,1732428799,KR 1732428800,1732429823,ID @@ -44660,12 +45795,12 @@ 1732501504,1732502527,HK 1732502528,1732503551,PH 1732503552,1732504063,IN -1732504064,1732504575,AU +1732504064,1732504575,PH 1732504576,1732505599,IN 1732505600,1732506623,ID 1732506624,1732507647,IN -1732507648,1732507648,PH -1732507649,1732508671,AU +1732507648,1732507903,PH +1732507904,1732508671,AU 1732508672,1732509695,CN 1732509696,1732510719,ID 1732510720,1732511743,BD @@ -44687,16 +45822,15 @@ 1732536832,1732537087,AU 1732537088,1732537343,MN 1732537344,1732537855,AT -1732537856,1732538367,BZ +1732537856,1732538111,BZ +1732538112,1732538367,LT 1732538368,1732539391,IN 1732539392,1732540415,BD 1732540416,1732541439,US 1732541440,1732541695,AU 1732541696,1732542463,SG 1732542464,1732543487,CN -1732543488,1732543743,SG -1732543744,1732543999,IL -1732544000,1732544511,SG +1732543488,1732544511,SG 1732544512,1732545023,ID 1732545024,1732545279,TW 1732545280,1732545535,MM @@ -44704,7 +45838,8 @@ 1732546560,1732547583,JP 1732547584,1732549631,KR 1732549632,1732550655,PH -1732550656,1732552703,AU +1732550656,1732551679,AU +1732551680,1732552703,SG 1732552704,1732554751,HK 1732554752,1732555263,IN 1732555264,1732555775,AU @@ -44843,7 +45978,7 @@ 1732710400,1732712447,IN 1732712448,1732712703,HK 1732712704,1732712959,AF -1732712960,1732713215,US +1732712960,1732713215,SG 1732713216,1732713471,AU 1732713472,1732714495,HK 1732714496,1732715519,CN @@ -44922,7 +46057,7 @@ 1732811776,1732812799,IN 1732812800,1732813311,HK 1732813312,1732813823,MY -1732813824,1732814847,MO +1732813824,1732814847,CN 1732814848,1732815871,IN 1732815872,1732816895,CN 1732816896,1732817919,IN @@ -44948,12 +46083,12 @@ 1732852480,1732852735,AU 1732852736,1732853759,ID 1732853760,1732854271,AU -1732854272,1732854783,US +1732854272,1732854783,HK 1732854784,1732855807,PH 1732855808,1732857855,ID 1732857856,1732858367,KI 1732858368,1732859903,AU -1732859904,1732860927,HK +1732859904,1732860927,CN 1732860928,1732861951,IN 1732861952,1732862975,CN 1732862976,1732863999,PK @@ -45066,7 +46201,7 @@ 1732995072,1732998143,CN 1732998144,1732998399,AU 1732998400,1732998655,HK -1732998656,1732998911,SG +1732998656,1732998911,JP 1732998912,1732999167,CA 1732999168,1733000191,CN 1733000192,1733001215,IN @@ -45128,7 +46263,10 @@ 1733057280,1733057535,IN 1733057536,1733058559,CN 1733058560,1733060607,IN -1733060608,1733061631,CN +1733060608,1733060863,CN +1733060864,1733061119,US +1733061120,1733061375,CN +1733061376,1733061631,US 1733061632,1733062655,IN 1733062656,1733063679,HK 1733063680,1733064703,TH @@ -45464,10 +46602,7 @@ 1733406720,1733407743,JP 1733407744,1733407999,TH 1733408000,1733408511,IN -1733408512,1733408767,CN -1733408768,1733409279,HK -1733409280,1733409535,DE -1733409536,1733409791,CN +1733408512,1733409791,CN 1733409792,1733411327,IN 1733411328,1733411839,ID 1733411840,1733412863,BD @@ -45490,7 +46625,7 @@ 1733425152,1733425663,ID 1733425664,1733427199,IN 1733427200,1733428223,GB -1733428224,1733428735,HK +1733428224,1733428735,US 1733428736,1733429247,ID 1733429248,1733430271,BD 1733430272,1733431295,ID @@ -45643,14 +46778,15 @@ 1733585920,1733586943,CN 1733586944,1733587967,GB 1733587968,1733588991,ID -1733588992,1733590015,AU +1733588992,1733590015,IN 1733590016,1733591039,JP 1733591040,1733592063,IN 1733592064,1733592319,MV 1733592320,1733592575,BD 1733592576,1733592831,MV 1733592832,1733593087,AU -1733593088,1733594111,CN +1733593088,1733593343,HK +1733593344,1733594111,CN 1733594112,1733596159,ID 1733596160,1733597183,PK 1733597184,1733598207,US @@ -45675,15 +46811,271 @@ 1733616640,1733618687,ID 1733618688,1733620735,IN 1733620736,1733621759,BD -1733621760,1733622015,MY 1733622016,1733622271,ID -1733622272,1733622527,IN +1733622272,1733622783,IN 1733622784,1733623807,BD 1733623808,1733624831,NZ 1733624832,1733625855,ID 1733625856,1733626879,IN 1733626880,1733627903,ID 1733627904,1733628927,IN +1733628928,1733630975,CN +1733630976,1733631999,NZ +1733632000,1733633023,BD +1733633024,1733634047,AU +1733634048,1733634559,IN +1733634560,1733635071,US +1733635072,1733639167,CN +1733639168,1733641215,ID +1733641216,1733642239,PH +1733642240,1733643263,HK +1733643264,1733644287,IN +1733644288,1733645311,KR +1733645312,1733646335,CN +1733646336,1733647871,IN +1733647872,1733648383,ID +1733648384,1733650431,IN +1733650432,1733651455,MM +1733651456,1733652479,MY +1733652480,1733653503,BD +1733653504,1733654015,ID +1733654016,1733654527,IN +1733654528,1733655551,ID +1733655552,1733656575,IN +1733656576,1733657599,PK +1733657600,1733657855,MN +1733657856,1733658111,IN +1733658112,1733658367,PH +1733658368,1733658623,AU +1733658624,1733659647,CN +1733659648,1733660671,IN +1733660672,1733661695,CN +1733661696,1733662719,ID +1733662720,1733663231,PK +1733663232,1733663487,IN +1733663488,1733663743,NZ +1733663744,1733665791,BD +1733665792,1733669887,CN +1733669888,1733670911,IN +1733670912,1733671679,SG +1733671680,1733671935,US +1733671936,1733672959,HK +1733672960,1733676031,BD +1733676032,1733678079,IN +1733678080,1733678335,HK +1733678336,1733678591,SG +1733678592,1733679103,AU +1733679104,1733680127,BD +1733680128,1733681151,ID +1733681152,1733682175,CN +1733682176,1733683199,IN +1733683200,1733686271,BD +1733686272,1733687295,CN +1733687296,1733688319,AU +1733688320,1733689343,HK +1733689344,1733691391,IN +1733691392,1733692415,PK +1733692416,1733695487,IN +1733695488,1733695999,ID +1733696000,1733696255,IN +1733696256,1733696511,AU +1733696512,1733698559,CN +1733698560,1733699583,PK +1733699584,1733700607,IN +1733700608,1733701631,CN +1733701632,1733702655,TH +1733702656,1733703679,PK +1733703680,1733704191,NP +1733704192,1733704703,AU +1733704704,1733705727,CN +1733705728,1733706751,HK +1733706752,1733707007,JP +1733707008,1733707775,CN +1733707776,1733709823,HK +1733709824,1733710847,CN +1733710848,1733711615,KR +1733711616,1733712895,CN +1733712896,1733713407,AU +1733713408,1733713663,ID +1733713664,1733713919,IN +1733713920,1733714943,PA +1733714944,1733715455,ID +1733715456,1733715711,AU +1733715712,1733715967,ID +1733715968,1733716991,IN +1733716992,1733718015,BD +1733718016,1733719039,AU +1733719040,1733720063,IN +1733720064,1733721087,PH +1733721088,1733722111,AF +1733722112,1733722367,AU +1733722368,1733722623,CN +1733722624,1733723135,MY +1733723136,1733724159,PK +1733724160,1733724415,AU +1733724416,1733724671,IN +1733724672,1733731327,ID +1733731328,1733732351,IN +1733732352,1733733375,AU +1733733376,1733734911,IN +1733734912,1733735423,MY +1733735424,1733736447,IN +1733736448,1733737471,PH +1733737472,1733738495,AU +1733738496,1733741567,BD +1733741568,1733756927,CN +1733756928,1733757951,HK +1733757952,1733758975,LK +1733758976,1733759999,ID +1733760000,1733761023,CN +1733761024,1733763071,IN +1733763072,1733764095,CN +1733764096,1733764351,BD +1733764352,1733764607,ID +1733764608,1733765119,AU +1733765120,1733770239,IN +1733770240,1733771263,ID +1733771264,1733771775,IN +1733771776,1733772287,ID +1733772288,1733772543,AU +1733772544,1733772799,MN +1733772800,1733773311,ID +1733773312,1733774335,CN +1733774336,1733777407,ID +1733777408,1733777663,AF +1733777664,1733778175,IN +1733778176,1733778431,AU +1733778432,1733779455,IN +1733779456,1733780479,CN +1733780480,1733782527,IN +1733782528,1733783551,US +1733783552,1733784575,BD +1733784576,1733785599,KR +1733785600,1733785855,IN +1733785856,1733786111,NZ +1733786112,1733786623,IN +1733786624,1733787647,LK +1733787648,1733788671,IN +1733788672,1733789695,CN +1733789696,1733790719,BD +1733790720,1733791743,IN +1733791744,1733792767,JP +1733793792,1733794815,ID +1733794816,1733795839,HK +1733795840,1733796351,ID +1733796352,1733796607,PK +1733796608,1733796863,AU +1733796864,1733799935,IN +1733799936,1733800959,JP +1733800960,1733801983,CN +1733801984,1733803007,ID +1733803008,1733803263,MV +1733803264,1733804031,SG +1733804032,1733805055,PK +1733805056,1733806079,ID +1733806080,1733806335,IN +1733806336,1733806591,ID +1733806592,1733806847,IN +1733806848,1733807103,AU +1733807104,1733808127,IN +1733808128,1733809151,AU +1733809152,1733810175,BD +1733810176,1733810431,AU +1733810432,1733810687,TH +1733810688,1733811199,AU +1733811200,1733812223,VN +1733812224,1733813247,CN +1733813248,1733814271,ID +1733814272,1733816063,BD +1733816064,1733816319,NZ +1733816320,1733817343,HK +1733817344,1733819391,BD +1733819392,1733819903,IN +1733819904,1733820159,AU +1733820160,1733820415,MN +1733820416,1733821439,IN +1733821440,1733826559,CN +1733826560,1733827583,BD +1733827584,1733828607,IN +1733828608,1733830655,CN +1733830656,1733831167,IN +1733831168,1733831423,PH +1733831424,1733831679,SG +1733831680,1733832703,JP +1733832704,1733833727,MM +1733833728,1733835775,IN +1733835776,1733837823,CN +1733837824,1733838847,PH +1733838848,1733839871,CN +1733839872,1733840383,IN +1733840384,1733840639,AU +1733840640,1733840895,SG +1733840896,1733843967,IN +1733843968,1733844991,HK +1733844992,1733847039,CN +1733847040,1733848063,NZ +1733848064,1733852159,VN +1733852160,1733855231,IN +1733855232,1733855743,BD +1733855744,1733855999,IN +1733856000,1733856255,CN +1733856256,1733857279,BD +1733857280,1733859327,AU +1733859328,1733859839,CN +1733859840,1733860095,AU +1733860096,1733860351,KH +1733860352,1733861887,IN +1733861888,1733862143,KH +1733862144,1733862399,NC +1733862400,1733863423,CN +1733863424,1733864447,ID +1733864448,1733865471,IN +1733865472,1733866495,CN +1733866496,1733867007,AU +1733867008,1733867263,IN +1733867264,1733867519,AU +1733867520,1733869567,CN +1733869568,1733870591,AF +1733870592,1733874687,ID +1733874688,1733875711,CN +1733875712,1733879039,IN +1733879040,1733879295,ID +1733879296,1733879807,NZ +1733879808,1733880831,BD +1733880832,1733882879,IN +1733882880,1733887999,ID +1733888000,1733888255,IN +1733888256,1733889023,AU +1733889024,1733890047,PH +1733890048,1733890559,IN +1733890560,1733891071,NZ +1733891072,1733892095,TW +1733892096,1733893119,BD +1733893120,1733894143,CN +1733894144,1733895167,ID +1733895168,1733895679,IN +1733895680,1733896191,AU +1733896192,1733897215,IN +1733897216,1733898239,KR +1733898240,1733899263,MM +1733899264,1733903359,IN +1733903360,1733904383,US +1733904384,1733904639,HK +1733904640,1733904895,AU +1733904896,1733905407,IN +1733905408,1733906431,ID +1733906432,1733907455,AU +1733907456,1733910527,VN +1733910528,1733916671,CN +1733916672,1733917695,VN +1733917696,1733918719,ID +1733918720,1733919743,HK +1733919744,1733920767,GB +1733920768,1733921023,IN +1733921280,1733921791,ID +1733921792,1733922815,SG +1733922816,1733923839,HK +1733923840,1733924863,CN 1740636160,1740644351,CN 1740644352,1740645375,IN 1740645376,1740647423,HK @@ -45775,8 +47167,7 @@ 1740771328,1740772351,CN 1740772352,1740776447,IN 1740776448,1740777471,HK -1740777472,1740777983,JP -1740777984,1740778239,MO +1740777472,1740778239,JP 1740778240,1740778495,HK 1740778496,1740779519,IN 1740779520,1740780543,AU @@ -45817,7 +47208,7 @@ 1740822016,1740822527,AU 1740822528,1740825599,IN 1740825856,1740826111,AU -1740826112,1740826623,CN +1740826112,1740826623,SG 1740826624,1740827647,IN 1740827648,1740828671,HK 1740828672,1740829695,IN @@ -45832,8 +47223,7 @@ 1740837376,1740837887,ID 1740837888,1740838911,MY 1740838912,1740839935,IN -1740839936,1740840191,SG -1740840192,1740840959,ID +1740839936,1740840959,ID 1740840960,1740841983,SG 1740841984,1740845055,IN 1740845056,1740846079,HK @@ -45866,6 +47256,7 @@ 1740876288,1740876799,AU 1740876800,1740880639,IN 1740880640,1740880895,HK +1740880896,1740881919,SG 1740881920,1740882943,CN 1740882944,1740884991,IN 1740884992,1740885503,BD @@ -45922,9 +47313,10 @@ 1740951552,1740957695,IN 1740957696,1740958719,BD 1740958720,1740959743,VN -1740959744,1740960255,NL -1740960256,1740960767,IN -1740960768,1740962815,VN +1740959744,1740960767,NL +1740960768,1740962303,VN +1740962304,1740962559,TW +1740962560,1740962815,VN 1740962816,1740964863,SG 1740964864,1740965887,HK 1740965888,1740966399,IN @@ -46098,8 +47490,10 @@ 1741178880,1741183999,IN 1741184000,1741185023,BD 1741185024,1741186047,JP -1741186048,1741188095,IN -1741188096,1741191167,HK +1741186048,1741188607,IN +1741188608,1741188863,US +1741188864,1741189119,IN +1741189120,1741191167,HK 1741191168,1741192191,VN 1741192192,1741193215,HK 1741193216,1741194239,ID @@ -46208,7 +47602,9 @@ 1741456384,1741457407,IN 1741457408,1741462527,CN 1741462528,1741466623,IN -1741466624,1741467647,JP +1741466624,1741466879,JP +1741466880,1741467391,HK +1741467392,1741467647,JP 1741467648,1741469695,HK 1741469696,1741472767,IN 1741472768,1741473791,CN @@ -46240,7 +47636,6 @@ 1741493248,1741494271,HK 1741494272,1741495295,KH 1741495296,1741497343,AU -1741497344,1741497855,PH 1741497856,1741498111,NZ 1741498112,1741498367,IN 1741498368,1741500415,CN @@ -46352,7 +47747,7 @@ 1741631488,1741632511,CN 1741632512,1741636607,IN 1741636608,1741637631,HK -1741637632,1741638655,PH +1741637632,1741638655,MY 1741638656,1741639679,NZ 1741639680,1741640703,NP 1741640704,1741641727,PK @@ -46461,7 +47856,10 @@ 1741765632,1741766655,HK 1741766656,1741768703,IN 1741768704,1741769727,AU -1741769728,1741770751,PK +1741769728,1741769983,PK +1741769984,1741770239,DK +1741770240,1741770495,PK +1741770496,1741770751,PR 1741770752,1741771775,BD 1741771776,1741772799,PK 1741772800,1741774591,IN @@ -46471,7 +47869,6 @@ 1741775616,1741775871,IN 1741775872,1741776895,HK 1741776896,1741777919,MY -1741777920,1741778431,AU 1741778432,1741778943,IN 1741778944,1741779967,CN 1741779968,1741780991,JP @@ -46512,8 +47909,8 @@ 1741815808,1741816831,CN 1741816832,1741817855,PK 1741817856,1741818367,PH -1741818368,1741818879,AU -1741818880,1741819903,US +1741818368,1741819902,AU +1741819903,1741819903,PK 1741819904,1741820927,BD 1741820928,1741821951,PH 1741821952,1741822975,AU @@ -46680,7 +48077,7 @@ 1741989888,1741990143,GB 1741990144,1741990911,SG 1741991936,1741992191,MY -1741992192,1741992959,IN +1741992192,1741992447,IN 1741992960,1741993983,TH 1741993984,1741995007,HK 1741995008,1741996031,JP @@ -46750,7 +48147,8 @@ 1742093312,1742095359,IN 1742095360,1742095615,KR 1742095616,1742095871,US -1742095872,1742096383,MM +1742095872,1742096127,LT +1742096128,1742096383,MM 1742096384,1742097407,JP 1742097408,1742098431,NP 1742098432,1742099455,BD @@ -47309,7 +48707,6 @@ 1742990336,1742991359,IN 1742991360,1742992383,ID 1742992384,1742993407,LK -1742993408,1742994431,JP 1742994432,1742995455,ID 1742995456,1742996479,BD 1742996480,1742997503,TH @@ -47464,7 +48861,6 @@ 1743145984,1743147007,NZ 1743147008,1743147263,AU 1743147264,1743147519,NZ -1743147520,1743147775,MN 1743147776,1743148031,ID 1743148032,1743149055,IN 1743149056,1743150079,KR @@ -47555,7 +48951,8 @@ 1743240192,1743241215,SG 1743241216,1743242239,JP 1743242240,1743244287,ID -1743244288,1743245311,AU +1743244288,1743244799,AU +1743244800,1743245311,AF 1743245312,1743248383,IN 1743248384,1743248895,SG 1743248896,1743249407,IN @@ -47572,8 +48969,7 @@ 1743258624,1743259647,CN 1743259648,1743260671,IN 1743260672,1743261703,JP -1743261704,1743261711,PH -1743261712,1743262719,HK +1743261704,1743262719,PH 1743262720,1743264767,IN 1743264768,1743265279,MY 1743265280,1743265535,ID @@ -48279,7 +49675,6 @@ 1744097280,1744098303,JP 1744098304,1744099327,NZ 1744099328,1744101375,JP -1744101376,1744102399,HK 1744102400,1744103423,FJ 1744103424,1744104447,CN 1744104448,1744105471,AU @@ -48606,7 +50001,8 @@ 1744411648,1744412671,LA 1744412672,1744413695,TW 1744413696,1744417791,CN -1744417792,1744418815,IN +1744417792,1744418559,IN +1744418560,1744418815,AU 1744418816,1744419839,JP 1744419840,1744421887,CN 1744421888,1744422911,HK @@ -48832,7 +50228,7 @@ 1744655872,1744656383,ID 1744656384,1744657407,VN 1744657408,1744658431,AU -1744658432,1744659455,HK +1744658432,1744659455,CA 1744659456,1744660479,JP 1744660480,1744660735,IN 1744660736,1744660991,MY @@ -48889,7 +50285,9 @@ 1744712448,1744712703,ID 1744712704,1744714751,IN 1744714752,1744715775,JP -1744715776,1744719871,CN +1744715776,1744717823,CN +1744717824,1744718591,HK +1744718592,1744719871,CN 1744719872,1744720895,IN 1744720896,1744721919,BD 1744721920,1744723455,AU @@ -48900,7 +50298,6 @@ 1744727040,1744728063,HK 1744728064,1744729087,CN 1744730112,1744731135,MN -1744731136,1744731647,IN 1744731648,1744732159,ID 1744732160,1744733183,IN 1744733184,1744734207,NZ @@ -48924,7 +50321,6 @@ 1744750080,1744750591,US 1744750592,1744752639,IN 1744752640,1744753663,HK -1744753664,1744754687,SG 1744754688,1744755711,VN 1744755712,1744756735,HK 1744756736,1744757759,PF @@ -48955,7 +50351,6 @@ 1744778752,1744779263,AU 1744779264,1744780287,CN 1744780288,1744781311,HK -1744781312,1744782335,JP 1744782336,1744783359,CN 1744783360,1744786431,IN 1744786432,1744787455,VN @@ -49059,12 +50454,12 @@ 1747736864,1747736895,SG 1747736896,1747737055,US 1747737056,1747737119,GB -1747737120,1747737183,US -1747737184,1747737215,AU -1747737216,1747737247,US +1747737120,1747737215,AU +1747737216,1747737247,SG 1747737248,1747737279,KR 1747737280,1747737311,NL -1747737312,1747737407,US +1747737312,1747737343,HK +1747737344,1747737407,US 1747737408,1747737439,IE 1747737440,1747737535,US 1747737536,1747737567,HK @@ -49161,7 +50556,9 @@ 1747770816,1747770943,US 1747770944,1747771007,SE 1747771008,1747771135,AU -1747771136,1747777679,US +1747771136,1747772459,US +1747772460,1747772491,FR +1747772492,1747777679,US 1747777680,1747777743,CA 1747777744,1747777791,NL 1747777792,1747779071,US @@ -49195,7 +50592,11 @@ 1747912704,1747912959,NL 1747912960,1747913215,US 1747913216,1747913471,IE -1747913472,1747915775,US +1747913472,1747913727,US +1747913728,1747913983,IE +1747913984,1747914239,FI +1747914240,1747914495,AT +1747914496,1747915775,US 1747915776,1747916287,GB 1747916288,1747926015,US 1747926016,1747926527,CA @@ -49246,7 +50647,11 @@ 1749450240,1749465087,US 1749465088,1749465599,NL 1749465600,1749476863,US -1749476864,1749496319,NL +1749476864,1749483519,NL +1749483520,1749487615,US +1749487616,1749491711,NL +1749491712,1749495807,US +1749495808,1749496319,NL 1749496320,1749497855,US 1749497856,1749499391,NL 1749499392,1749508095,US @@ -49269,7 +50674,9 @@ 1749618176,1749618687,NL 1749618688,1749635071,US 1749635072,1749636095,NL -1749636096,1749685247,US +1749636096,1749647359,US +1749647360,1749655551,NL +1749655552,1749685247,US 1749685248,1749686783,NL 1749686784,1749696511,US 1749696512,1749698047,NL @@ -49308,9 +50715,17 @@ 1750080512,1750096383,US 1750096384,1750106111,NL 1750106112,1750123007,US -1750123008,1750153727,NL +1750123008,1750126079,NL +1750126080,1750126591,US +1750126592,1750142975,NL +1750142976,1750147071,US +1750147072,1750151167,NL +1750151168,1750152191,US +1750152192,1750153727,NL 1750153728,1750154239,US -1750154240,1750172671,NL +1750154240,1750159359,NL +1750159360,1750163455,US +1750163456,1750172671,NL 1750172672,1750174719,US 1750174720,1750175743,NL 1750175744,1750192127,US @@ -49322,10 +50737,16 @@ 1750224384,1750224895,US 1750224896,1750252543,NL 1750252544,1750253055,US -1750253056,1750321663,NL +1750253056,1750294015,NL +1750294016,1750294527,US +1750294528,1750310911,NL +1750310912,1750315007,US +1750315008,1750320127,NL +1750320128,1750321151,US +1750321152,1750321663,NL 1750321664,1750323199,US -1750323200,1750331391,NL -1750331392,1750350847,US +1750323200,1750327295,NL +1750327296,1750350847,US 1750350848,1750351871,NL 1750351872,1750368255,US 1750368256,1750373375,NL @@ -49340,12 +50761,18 @@ 1750425600,1750443519,US 1750443520,1750444031,NL 1750444032,1750463487,US -1750463488,1750494207,NL +1750463488,1750482943,NL +1750482944,1750492159,US +1750492160,1750492671,NL +1750492672,1750493183,US +1750493184,1750494207,NL 1750494208,1750494719,US 1750494720,1750514687,NL 1750514688,1750515199,US -1750515200,1750552575,NL -1750552576,1750573055,US +1750515200,1750534655,NL +1750534656,1750536191,US +1750536192,1750544383,NL +1750544384,1750573055,US 1750573056,1750597631,NL 1750597632,1750664191,US 1750664192,1750665727,NL @@ -49586,11 +51013,14 @@ 1753491456,1753493503,GB 1753493504,1753494527,US 1753494528,1753494783,IL -1753494784,1753497407,US +1753494784,1753496575,US +1753496576,1753497407,CA 1753497408,1753497455,PH -1753497456,1753499391,US +1753497456,1753497599,CA +1753497600,1753499391,US 1753499392,1753499647,PH -1753499648,1753511167,US +1753499648,1753499903,AE +1753499904,1753511167,US 1753511168,1753511423,FR 1753511424,1753512703,US 1753512704,1753512959,SG @@ -49602,9 +51032,9 @@ 1753517568,1753517823,NO 1753517824,1753518591,US 1753518592,1753518847,JP -1753518848,1753520447,US -1753520448,1753520495,GB -1753520496,1753522431,US +1753518848,1753520383,US +1753520384,1753520639,GB +1753520640,1753522431,US 1753522432,1753522687,FR 1753522688,1753526015,US 1753526016,1753526271,DE @@ -49647,7 +51077,9 @@ 1754210304,1754223615,US 1754223616,1754223623,MX 1754223624,1754223631,AU -1754223632,1754251519,US +1754223632,1754226687,US +1754226688,1754228735,IL +1754228736,1754251519,US 1754251520,1754251775,LY 1754251776,1754252031,US 1754252032,1754252287,MR @@ -50061,7 +51493,11 @@ 1755839744,1755839999,ER 1755840000,1755840255,AL 1755840256,1755840511,RU -1755840512,1756049407,US +1755840512,1755846623,US +1755846624,1755846631,GB +1755846632,1755863327,US +1755863328,1755863335,GB +1755863336,1756049407,US 1756049408,1756053503,CA 1756053504,1756086271,US 1756086272,1756090367,CA @@ -50127,7 +51563,9 @@ 1757996544,1758002431,US 1758002432,1758002687,GB 1758002688,1758199807,US -1758199808,1758330879,CA +1758199808,1758204415,CA +1758204416,1758204671,US +1758204672,1758330879,CA 1758330880,1758412799,US 1758412800,1758413055,BG 1758413056,1758413311,SE @@ -50325,7 +51763,8 @@ 1759526400,1759526655,JE 1759526656,1759526911,FO 1759526912,1759528959,IL -1759528960,1759535103,US +1759528960,1759531007,US +1759531008,1759535103,SG 1759535104,1759543295,CA 1759543296,1759547391,US 1759547392,1759548415,NL @@ -50398,8 +51837,7 @@ 1760819200,1760819455,IT 1760819456,1760819711,GB 1760819712,1760819967,MA -1760819968,1760820223,HK -1760820224,1760820479,US +1760819968,1760820479,US 1760820480,1760820735,CA 1760820736,1760823295,US 1760823296,1760824319,PT @@ -50503,8 +51941,10 @@ 1761214464,1761222655,MF 1761222656,1761230847,US 1761230848,1761239039,CA -1761239040,1761255423,US -1761255424,1761255679,CN +1761239040,1761241343,US +1761241344,1761241599,ID +1761241600,1761255423,US +1761255424,1761255679,CO 1761255680,1761255935,NZ 1761255936,1761256191,DK 1761256192,1761256447,HR @@ -50574,7 +52014,8 @@ 1761519616,1761521663,PR 1761521664,1761522687,US 1761522688,1761523711,CA -1761523712,1761526783,US +1761523712,1761524735,US +1761525760,1761526783,US 1761526784,1761527807,CA 1761527808,1761544191,US 1761544192,1761546239,CA @@ -50658,7 +52099,9 @@ 1763402240,1763402751,KE 1763402752,1763405823,MU 1763405824,1763407871,ZA -1763407872,1763418111,MU +1763407872,1763413503,MU +1763413504,1763414015,ZA +1763414016,1763418111,MU 1763418112,1763429887,ZA 1763429888,1763438591,KE 1763438592,1763442687,UG @@ -50675,7 +52118,7 @@ 1763581952,1763598335,MU 1763598336,1763602431,IN 1763602432,1763606527,NL -1763606528,1763610623,MU +1763606528,1763610623,SE 1763610624,1763614719,DE 1763614720,1763631103,MU 1763631104,1763635199,AE @@ -50898,10 +52341,8 @@ 1805737984,1805742079,CA 1805742080,1805752575,US 1805752576,1805753087,CA -1805753088,1805754111,US -1805754112,1805754129,CA -1805754130,1805754130,US -1805754131,1805754367,CA +1805753088,1805754175,US +1805754176,1805754367,CA 1805754368,1805756415,US 1805756928,1806131199,US 1806132224,1806132479,US @@ -50942,7 +52383,13 @@ 1806263552,1806263807,KR 1806263808,1806401535,US 1806401536,1806434303,CA -1806434304,1806925823,US +1806434304,1806514463,US +1806514464,1806514495,GB +1806514496,1806515231,US +1806515232,1806515263,GB +1806515264,1806532927,US +1806532928,1806532959,GB +1806532960,1806925823,US 1806925824,1806958591,CA 1806958592,1807056895,US 1807056896,1807057151,AU @@ -50951,7 +52398,6 @@ 1807058688,1807058943,US 1807058944,1807059199,GB 1807059200,1807059455,NL -1807060992,1807062015,CA 1807062016,1807062271,US 1807063040,1807072255,US 1807072256,1807073023,CA @@ -50977,7 +52423,9 @@ 1807694848,1807695359,JP 1807695360,1807695871,FR 1807695872,1807699967,VI -1807699968,1807707311,US +1807699968,1807706793,US +1807706794,1807706794,CN +1807706795,1807707311,US 1807707312,1807707312,JP 1807707313,1807732735,US 1807732736,1807736831,GP @@ -51052,9 +52500,7 @@ 1816001792,1816002559,NL 1816002560,1816068095,US 1816068096,1816133631,CA -1816133632,1816542463,US -1816542464,1816542719,CA -1816542720,1819976622,US +1816133632,1819976622,US 1819976623,1819976623,RE 1819976624,1822429183,US 1822429184,1822433279,CA @@ -51121,7 +52567,9 @@ 1823356160,1823356415,NL 1823356416,1823356671,US 1823356672,1823356927,NL -1823356928,1823361791,US +1823356928,1823358799,US +1823358800,1823358807,GB +1823358808,1823361791,US 1823361792,1823362303,CA 1823362304,1823375359,US 1823375360,1823379455,CA @@ -51145,7 +52593,9 @@ 1831337984,1831862271,DE 1831862272,1832124415,PT 1832124416,1832386559,IT -1832386560,1832448895,DK +1832386560,1832435711,DK +1832435712,1832435967,SE +1832435968,1832448895,DK 1832448896,1832449023,SE 1832449024,1832449535,DK 1832449536,1832449663,SE @@ -51153,8 +52603,10 @@ 1832460288,1832460799,SE 1832460800,1832484351,DK 1832484352,1832484607,SE -1832484608,1832554495,DK -1832554496,1832555007,SE +1832484608,1832496127,DK +1832496128,1832496383,SE +1832496384,1832550399,DK +1832550400,1832555007,SE 1832555008,1832648703,DK 1832648704,1832681471,HR 1832681472,1832714239,RU @@ -51185,11 +52637,7 @@ 1832799232,1832800255,FR 1832800256,1832800767,MQ 1832800768,1832801279,FR -1832801280,1832802303,MQ -1832802304,1832803583,FR -1832803584,1832803839,MQ -1832803840,1832804351,FR -1832804352,1832806399,MQ +1832801280,1832806399,MQ 1832806400,1832808447,GP 1832808448,1832812543,FR 1832812544,1832845311,RU @@ -51499,9 +52947,7 @@ 1835913216,1835917311,RU 1835917312,1835917919,GB 1835917920,1835917935,IT -1835917936,1835917959,GB -1835917960,1835917967,IT -1835917968,1835918439,GB +1835917936,1835918439,GB 1835918440,1835918447,IT 1835918448,1835918519,GB 1835918520,1835918527,IT @@ -51517,11 +52963,7 @@ 1835919512,1835919519,IT 1835919520,1835919751,GB 1835919752,1835919759,IT -1835919760,1835919983,GB -1835919984,1835919991,IT -1835919992,1835921079,GB -1835921080,1835921087,IT -1835921088,1835921111,GB +1835919760,1835921111,GB 1835921112,1835921127,IT 1835921128,1835921159,GB 1835921160,1835921167,IT @@ -51535,8 +52977,8 @@ 1835922672,1835922679,IT 1835922680,1835923151,GB 1835923152,1835923159,IT -1835923160,1835923511,GB -1835923512,1835923527,IT +1835923160,1835923519,GB +1835923520,1835923527,IT 1835923528,1835923679,GB 1835923680,1835923687,IT 1835923688,1835923719,GB @@ -51545,17 +52987,15 @@ 1835924288,1835924295,IT 1835924296,1835924375,GB 1835924376,1835924383,IT -1835924384,1835925007,GB +1835924384,1835924815,GB +1835924816,1835924823,IT +1835924824,1835925007,GB 1835925008,1835925015,IT 1835925016,1835925111,GB 1835925112,1835925119,IT -1835925120,1835925159,GB -1835925160,1835925167,IT -1835925168,1835925191,GB +1835925120,1835925191,GB 1835925192,1835925199,IT -1835925200,1835925327,GB -1835925328,1835925335,IT -1835925336,1835925383,GB +1835925200,1835925383,GB 1835925384,1835925391,IT 1835925392,1835925479,GB 1835925480,1835925487,IT @@ -51885,7 +53325,8 @@ 1839529984,1839562751,RU 1839562752,1839595519,BA 1839595520,1839603711,SA -1839603712,1839618047,RO +1839603712,1839609855,RO +1839609856,1839618047,KZ 1839618048,1839628287,SA 1839628288,1839661055,RO 1839661056,1839693823,ES @@ -52000,7 +53441,11 @@ 1841926101,1841930239,NL 1841930240,1841938431,KG 1841938432,1841946623,RU -1841946624,1841954815,UA +1841946624,1841946658,PT +1841946659,1841946659,UA +1841946660,1841948671,PT +1841948672,1841948927,UA +1841948928,1841954815,PT 1841954816,1841971199,RU 1841971200,1841979391,CZ 1841979392,1841982975,NL @@ -52146,12 +53591,12 @@ 1843843584,1843843839,AT 1843843840,1843844863,DE 1843844864,1843845119,GB -1843845120,1843845631,DE +1843845120,1843845631,ES 1843845632,1843845887,GB 1843845888,1843846143,DE 1843846144,1843846399,GB 1843846400,1843846655,IR -1843846656,1843846911,DE +1843846656,1843846911,ES 1843846912,1843847167,IR 1843847168,1843851775,DE 1843851776,1843852031,IR @@ -52178,8 +53623,7 @@ 1843943424,1843945471,CH 1843945472,1843947519,FR 1843947520,1843949567,RU -1843949568,1843950591,ES -1843950592,1843951615,BY +1843949568,1843951615,ES 1843951616,1843955711,DE 1843955712,1843957759,IT 1843957760,1843959807,CZ @@ -52316,11 +53760,7 @@ 1844310016,1844318207,FR 1844318208,1844322303,IT 1844322304,1844326399,CZ -1844326400,1844330239,DK -1844330240,1844330303,LU -1844330304,1844330423,DK -1844330424,1844330439,LU -1844330440,1844330495,DK +1844326400,1844330495,DK 1844330496,1844334591,GB 1844334592,1844342783,RU 1844342784,1844346879,IT @@ -52423,8 +53863,7 @@ 1847853056,1848115199,PK 1848115200,1848377343,CN 1848377344,1848378367,BD -1848378368,1848379391,HK -1848379392,1848380415,IN +1848378368,1848380415,IN 1848380416,1848381439,CN 1848381440,1848382463,NZ 1848382464,1848383487,JP @@ -52461,7 +53900,9 @@ 1848832000,1848836095,JP 1848836096,1849032703,CN 1849032704,1849065471,JP -1849065472,1849163775,PH +1849065472,1849092607,PH +1849092608,1849092863,US +1849092864,1849163775,PH 1849163776,1849819135,CN 1849819136,1849950207,JP 1849950208,1850212351,KR @@ -52759,8 +54200,8 @@ 1886978048,1886986239,KR 1886986240,1886990335,TW 1886990336,1886994431,IN -1886994432,1887005695,TW -1887005696,1887010815,HK +1886994432,1887006719,TW +1887006720,1887010815,HK 1887010816,1887019007,TH 1887019008,1887027199,HK 1887027200,1887043583,KR @@ -52845,7 +54286,8 @@ 1897175040,1897176063,JP 1897176064,1897176319,SG 1897176320,1897176575,HK -1897176576,1897177087,SG +1897176576,1897176831,JP +1897176832,1897177087,US 1897177088,1897201663,JP 1897201664,1897209855,KR 1897209856,1897213951,AU @@ -52885,7 +54327,9 @@ 1897743616,1897744575,SI 1897744576,1897744607,SG 1897744608,1897746176,SI -1897746177,1897758719,US +1897746177,1897748511,US +1897748512,1897748514,HK +1897748515,1897758719,US 1897758720,1897779199,KR 1897779200,1897781247,AU 1897781248,1897783295,JP @@ -52983,10 +54427,11 @@ 1909481472,1909587967,CN 1909587968,1909719039,MY 1909719040,1909735423,CN +1909735424,1909736713,IN +1909736715,1909743615,IN 1909743616,1909744639,AU 1909744640,1909745663,CN 1909745664,1909746687,JP -1909746688,1909747711,MY 1909747712,1909751807,ID 1909751808,1909759999,JP 1909760000,1909762047,ID @@ -53495,9 +54940,7 @@ 1958845952,1958846463,HK 1958846464,1958847487,IN 1958847488,1958848511,CN -1958848512,1958849023,BD -1958849024,1958849535,HK -1958849536,1958850559,ID +1958848512,1958850559,BD 1958850560,1958852607,CN 1958852608,1958853631,AU 1958853632,1958854655,ID @@ -53536,7 +54979,42 @@ 1959661568,1959662591,IN 1959662592,1959663615,LK 1959663616,1959664639,SG -1959664640,1959665663,ID +1959664640,1959668735,ID +1959668736,1959670783,BD +1959670784,1959671807,HK +1959671808,1959673855,BD +1959673856,1959674879,PK +1959674880,1959675903,JP +1959675904,1959676927,US +1959676928,1959677951,SG +1959677952,1959678975,AU +1959678976,1959679999,PK +1959680000,1959681023,BD +1959681024,1959682047,CN +1959682048,1959683071,IN +1959683072,1959684095,CN +1959684096,1959685119,SC +1959685120,1959686143,PH +1959686144,1959687167,TH +1959687168,1959688191,HK +1959688192,1959689215,JP +1959689216,1959690239,TH +1959690240,1959691263,AU +1959691264,1959692287,BD +1959692288,1959693311,MM +1959693312,1959694335,PK +1959694336,1959698431,IN +1959698432,1959699455,NZ +1959699456,1959700479,PK +1959700480,1959701503,SE +1959701504,1959702527,NZ +1959702528,1959703551,CN +1959703552,1959704575,LK +1959704576,1959705599,AU +1959705600,1959707647,BD +1959707648,1959708671,ID +1959708672,1959709695,IN +1959709696,1959710719,SG 1959723008,1960050687,CN 1960050688,1960058879,KR 1960058880,1960067071,VN @@ -53571,8 +55049,8 @@ 1960211904,1960211967,SG 1960211968,1960212479,AU 1960212480,1960212582,IN -1960212584,1960212735,IN -1960212736,1960214015,SG +1960212584,1960212991,IN +1960212992,1960214015,SG 1960214016,1960214271,IN 1960214272,1960214527,SG 1960214528,1960574975,CN @@ -53618,7 +55096,7 @@ 1964146688,1964171263,JP 1964171264,1964173311,BD 1964173568,1964173823,JP -1964173824,1964174079,HK +1964173824,1964174079,US 1964174080,1964174335,AU 1964174336,1964174591,SG 1964174621,1964174621,TW @@ -53766,7 +55244,7 @@ 1984135168,1984151551,KR 1984151552,1984153599,NZ 1984153600,1984155647,KH -1984155648,1984159743,BD +1984155648,1984159743,AU 1984159744,1984167935,IN 1984167936,1984430079,VN 1984430080,1985085439,CN @@ -54047,67 +55525,8 @@ 2001829888,2001841247,HK 2001841248,2001841248,SA 2001841249,2001846271,HK -2001846272,2001855231,SG -2001855232,2001855263,US -2001855264,2001855743,SG -2001855744,2001855999,HK -2001856000,2001856127,SG -2001856128,2001856151,CZ -2001856152,2001856155,SG -2001856156,2001856159,CZ -2001856160,2001856191,SG -2001856192,2001856199,CZ -2001856200,2001857279,SG -2001857280,2001857535,HK -2001857536,2001857791,SG -2001857792,2001858047,HK -2001858048,2001858319,SG -2001858320,2001858335,US -2001858336,2001858639,SG -2001858640,2001858655,US -2001858656,2001859071,SG -2001859072,2001859327,HK -2001859328,2001860143,SG -2001860144,2001860159,US -2001860160,2001860351,SG -2001860352,2001860607,HK -2001860608,2001860655,SG -2001860656,2001860659,US -2001860660,2001860661,HK -2001860662,2001860664,US -2001860665,2001860665,HK -2001860666,2001860667,US -2001860668,2001860668,HK -2001860669,2001860671,US -2001860672,2001860991,SG -2001860992,2001860995,US -2001860996,2001860997,HK -2001860998,2001861001,US -2001861002,2001861003,HK -2001861004,2001861007,US -2001861008,2001861263,SG -2001861264,2001861265,US -2001861266,2001861267,HK -2001861268,2001861268,US -2001861269,2001861269,HK -2001861270,2001861271,US -2001861272,2001861272,HK -2001861273,2001861273,US -2001861274,2001861274,HK -2001861275,2001861279,US -2001861280,2001862079,SG -2001862080,2001862101,US -2001862102,2001862102,HK -2001862103,2001862116,US -2001862117,2001862118,HK -2001862119,2001862124,US -2001862125,2001862125,HK -2001862126,2001862128,US -2001862129,2001862131,HK -2001862132,2001862143,US -2001862144,2001862303,SG -2001862304,2001862335,HK -2001862336,2001862655,SG +2001846272,2001854463,SG +2001854464,2001862655,HK 2001862656,2001864703,AU 2001864704,2001870847,JP 2001870848,2001879039,KR @@ -54620,10 +56039,10 @@ 2063085568,2063089663,CN 2063089664,2063097855,JP 2063097856,2063106047,MM -2063106048,2063107071,SG -2063107328,2063107655,SG +2063106048,2063107071,AU +2063107328,2063107655,AU 2063107656,2063107663,HK -2063107664,2063108095,SG +2063107664,2063108095,AU 2063108096,2063110143,HK 2063110144,2063111167,JP 2063111168,2063114239,AU @@ -55042,7 +56461,9 @@ 2097610752,2097643519,AU 2097643520,2097676287,KR 2097676288,2098200575,JP -2098200576,2098724863,IN +2098200576,2098593791,IN +2098593792,2098594303,SG +2098594304,2098724863,IN 2098724864,2098987007,TH 2098987008,2099183615,JP 2099183616,2099199999,MO @@ -55163,8 +56584,8 @@ 2147497216,2147497471,RO 2147497472,2147498239,DE 2147498240,2147498495,RO -2147498496,2147500287,DE -2147500288,2147501055,NL +2147498496,2147500031,DE +2147500032,2147501055,NL 2147501056,2147501311,SK 2147501312,2147501823,NL 2147501824,2147502079,US @@ -55296,9 +56717,7 @@ 2155827200,2155831295,PL 2155831296,2155833343,RU 2155833344,2155833855,SE -2155833856,2155834371,NL -2155834372,2155834373,SE -2155834374,2155834623,NL +2155833856,2155834623,NL 2155834624,2155834879,LU 2155834880,2155835391,NL 2155835392,2155839487,RO @@ -55332,7 +56751,9 @@ 2156920832,2156986367,CA 2156986368,2159017983,US 2159017984,2159083519,DE -2159083520,2159149055,US +2159083520,2159110463,US +2159110464,2159110495,CA +2159110496,2159149055,US 2159149056,2159280127,CH 2159280128,2159542271,US 2159542272,2159607807,AU @@ -55385,7 +56806,9 @@ 2166030336,2166095871,AT 2166095872,2166292479,US 2166292480,2166358015,GB -2166358016,2166571007,US +2166358016,2166472703,US +2166472704,2166473727,CA +2166473728,2166571007,US 2166571008,2166575103,GB 2166575104,2166594563,US 2166594564,2166594564,DE @@ -55609,7 +57032,9 @@ 2188718162,2188718162,SI 2188718338,2188718338,AT 2188718474,2188718474,AT -2188719380,2188719380,NL +2188719360,2188719615,NL +2188719616,2188719743,FR +2188719744,2188719871,DE 2188724464,2188724464,NL 2188725248,2188725503,NL 2188726272,2188730367,ES @@ -55619,7 +57044,13 @@ 2188740608,2188741631,DE 2188749056,2188749311,US 2188754432,2188754687,RU -2188763136,2188771327,IT +2188763136,2188769471,IT +2188769472,2188769503,DE +2188769504,2188769599,IT +2188769600,2188769631,DE +2188769632,2188769663,IT +2188769664,2188770175,DE +2188770176,2188771327,IT 2188771328,2188836863,US 2188901754,2188901754,GB 2188902400,2188967935,FR @@ -55694,7 +57125,9 @@ 2193223424,2193223679,GB 2193223680,2193226495,BG 2193226496,2193226751,GB -2193226752,2193227775,BG +2193226752,2193227263,BG +2193227264,2193227519,BZ +2193227520,2193227775,BG 2193227776,2193293311,IT 2193293312,2193358847,US 2193358848,2193424383,FI @@ -55713,17 +57146,13 @@ 2193707656,2193707663,IT 2193707664,2193707751,GB 2193707752,2193707759,IT -2193707760,2193707767,GB -2193707768,2193707775,IT -2193707776,2193707791,GB +2193707760,2193707791,GB 2193707792,2193707799,IT 2193707800,2193707839,GB 2193707840,2193707847,IT 2193707848,2193708375,GB 2193708376,2193708383,IT -2193708384,2193708863,GB -2193708864,2193708871,IT -2193708872,2193709199,GB +2193708384,2193709199,GB 2193709200,2193709215,IT 2193709216,2193711103,GB 2193711104,2193713151,DE @@ -55794,7 +57223,7 @@ 2197798912,2197815295,IR 2197815296,2197816319,BO 2197816320,2197828607,BR -2197828608,2197829631,CL +2197828608,2197829631,AR 2197829632,2197833727,BR 2197833728,2197834751,CR 2197834752,2197841919,BR @@ -55806,9 +57235,7 @@ 2197849088,2197850111,BR 2197850112,2197851135,CO 2197851136,2197858303,BR -2197858304,2197858431,CO -2197858432,2197858447,CW -2197858448,2197859327,CO +2197858304,2197859327,CO 2197859328,2197860351,CL 2197860352,2197865471,BR 2197865472,2197866495,ES @@ -55850,9 +57277,7 @@ 2204172288,2204237823,SE 2204237824,2204303359,US 2204303360,2204368895,DE -2204368896,2204369407,PA -2204369408,2204369663,US -2204369664,2204369919,PA +2204368896,2204369919,PA 2204369920,2204376063,BR 2204376064,2204377087,CL 2204377088,2204378111,BR @@ -55883,18 +57308,13 @@ 2204893184,2204894207,AR 2204894208,2204895231,PA 2204895232,2204897279,BR -2204897280,2204897447,HN -2204897448,2204897455,CA -2204897456,2204898095,HN -2204898096,2204898111,CR -2204898112,2204898303,HN +2204897280,2204898303,HN 2204898304,2204899327,PA 2204899328,2204902399,BR 2204902400,2204903423,CR 2204903424,2204904447,AR 2204904448,2204910591,BR -2204910592,2204910847,AR -2204910848,2204911615,CL +2204910592,2204911615,CL 2204911616,2204913663,BR 2204913664,2204914687,AR 2204914688,2204929023,BR @@ -55906,9 +57326,7 @@ 2204943360,2204946431,BR 2204946432,2204947455,CL 2204947456,2204952575,BR -2204952576,2204952767,HN -2204952768,2204952775,US -2204952776,2204953599,HN +2204952576,2204953599,HN 2204953600,2204958719,BR 2204958720,2205089791,US 2205089792,2205155327,GB @@ -55957,7 +57375,9 @@ 2207776768,2207842303,CH 2207842304,2207846399,US 2207846400,2207848447,NL -2207848448,2207907839,US +2207848448,2207852543,US +2207852544,2207853055,RS +2207853056,2207907839,US 2207907840,2207973375,IT 2207973376,2208038911,NL 2208038912,2208235519,US @@ -55995,8 +57415,8 @@ 2209087488,2209153023,AU 2209153024,2209218559,DE 2209218560,2209284095,NL -2209284096,2209349631,IT -2209349632,2209411839,US +2209284096,2209349632,IT +2209349633,2209411839,US 2209411840,2209412095,NL 2209412096,2209415167,US 2209415168,2209480703,FI @@ -56094,11 +57514,15 @@ 2214068224,2214133759,JP 2214133760,2214264831,US 2214264832,2214330367,GB -2214330368,2214399047,US +2214330368,2214398975,US +2214398976,2214398983,CN +2214398984,2214399047,US 2214399048,2214399055,IE -2214399056,2214399071,US +2214399056,2214399071,CN 2214399072,2214399135,SG -2214399136,2214399295,US +2214399136,2214399215,US +2214399216,2214399223,CN +2214399224,2214399295,US 2214399296,2214399303,SG 2214399304,2214399331,US 2214399332,2214399339,HK @@ -56150,9 +57574,7 @@ 2214460416,2214461439,NL 2214461440,2214526975,FR 2214526976,2214527999,BR -2214528000,2214528333,AR -2214528334,2214528334,NL -2214528335,2214529023,AR +2214528000,2214529023,AR 2214529024,2214530047,BR 2214530048,2214531071,AR 2214531072,2214537215,BR @@ -56239,20 +57661,27 @@ 2230649728,2230653063,US 2230653064,2230653135,BR 2230653136,2230655559,US -2230655560,2230655711,IE +2230655560,2230655575,IE +2230655576,2230655583,US +2230655584,2230655711,IE 2230655712,2230655775,US 2230655776,2230655791,IE 2230655792,2230656351,US 2230656352,2230656423,AT -2230656424,2230656495,FI +2230656424,2230656431,US +2230656432,2230656495,FI 2230656496,2230656983,US 2230656984,2230656991,IE 2230656992,2230657007,US 2230657008,2230657023,IE 2230657024,2230657215,US -2230657216,2230657343,FI +2230657216,2230657231,FI +2230657232,2230657239,US +2230657240,2230657343,FI 2230657344,2230657559,US -2230657560,2230657727,IE +2230657560,2230657591,IE +2230657592,2230657599,US +2230657600,2230657727,IE 2230657728,2230657775,US 2230657776,2230657815,FI 2230657816,2230657879,US @@ -56306,7 +57735,9 @@ 2230664192,2230664647,US 2230664648,2230664703,AT 2230664704,2230664727,US -2230664728,2230664871,IE +2230664728,2230664735,IE +2230664736,2230664743,US +2230664744,2230664871,IE 2230664872,2230665087,US 2230665088,2230665183,AT 2230665184,2230665295,US @@ -56426,7 +57857,9 @@ 2230713936,2230713983,SG 2230713984,2230714047,KR 2230714048,2230714079,BR -2230714080,2230714255,MY +2230714080,2230714119,MY +2230714120,2230714127,US +2230714128,2230714255,MY 2230714256,2230714287,BR 2230714288,2230714303,US 2230714304,2230714311,CL @@ -56450,11 +57883,7 @@ 2231333888,2231335935,BR 2231335936,2231336959,MX 2231336960,2231337983,BR -2231337984,2231338639,HN -2231338640,2231338647,US -2231338648,2231338695,HN -2231338696,2231338703,US -2231338704,2231339007,HN +2231337984,2231339007,HN 2231339008,2231346175,BR 2231346176,2231347199,PY 2231347200,2231355391,BR @@ -56569,7 +57998,9 @@ 2255880192,2255945727,US 2255945728,2255998975,DE 2255998976,2256003071,FR -2256003072,2256011263,DE +2256003072,2256006655,DE +2256006656,2256006911,FR +2256006912,2256011263,DE 2256011264,2256535551,US 2256535552,2256543743,GB 2256543744,2256551935,US @@ -56790,7 +58221,9 @@ 2259304976,2259304991,US 2259304992,2259305407,NL 2259305408,2259305439,US -2259305440,2259306431,NL +2259305440,2259306239,NL +2259306240,2259306367,US +2259306368,2259306431,NL 2259306432,2259308543,US 2259308544,2259312639,IE 2259312640,2259314687,NL @@ -56810,9 +58243,7 @@ 2259342848,2259343359,IE 2259343360,2259343615,HK 2259343616,2259343871,BR -2259343872,2259348479,US -2259348480,2259348991,NL -2259348992,2259352575,US +2259343872,2259352575,US 2259352576,2259353343,IE 2259353344,2259353599,US 2259353600,2259419135,DE @@ -56853,7 +58284,9 @@ 2262040576,2262106111,FR 2262106112,2262171647,GB 2262171648,2262237183,FR -2262237184,2262499327,US +2262237184,2262414335,US +2262414336,2262415359,IN +2262415360,2262499327,US 2262499328,2262630399,GB 2262630400,2262722809,NL 2262722811,2262724071,NL @@ -56884,13 +58317,18 @@ 2264909312,2264909567,DE 2264909568,2264909823,TR 2264909824,2264911871,IR -2264911872,2264920575,DE -2264920576,2264920831,ES +2264911872,2264912383,DE +2264912384,2264912895,ES +2264912896,2264913663,DE +2264913664,2264913919,ES +2264913920,2264920319,DE +2264920320,2264920831,ES 2264920832,2264921343,DE 2264921344,2264921855,IR 2264921856,2264922111,DE 2264922112,2264922623,IR -2264922624,2264924159,DE +2264922624,2264922879,ES +2264922880,2264924159,DE 2264924160,2264989695,CA 2264989696,2265605887,US 2265605888,2265606143,GB @@ -56957,7 +58395,9 @@ 2282264832,2283151359,US 2283151360,2283159551,IN 2283159552,2291142655,US -2291142656,2291204095,NL +2291142656,2291154943,NL +2291154944,2291171327,GB +2291171328,2291204095,NL 2291204096,2291269631,PR 2291269632,2291281919,US 2291281920,2291286015,JP @@ -57112,9 +58552,13 @@ 2303343488,2303343615,IE 2303343616,2303343827,FR 2303343828,2303343831,DE -2303343832,2303344639,FR +2303343832,2303344471,FR +2303344472,2303344479,IE +2303344480,2303344639,FR 2303344640,2303344895,GB -2303344896,2303349119,FR +2303344896,2303348863,FR +2303348864,2303348991,GB +2303348992,2303349119,FR 2303349120,2303349247,ES 2303349248,2303349383,FR 2303349384,2303349391,NL @@ -57122,7 +58566,9 @@ 2303350784,2303351039,ES 2303351040,2303351055,FR 2303351056,2303351071,GB -2303351072,2303353215,FR +2303351072,2303352523,FR +2303352524,2303352524,GB +2303352525,2303353215,FR 2303353216,2303353343,GB 2303353344,2303353783,FR 2303353784,2303353787,GB @@ -57158,7 +58604,9 @@ 2303385088,2303385103,FI 2303385104,2303388415,FR 2303388416,2303388543,ES -2303388544,2303392843,FR +2303388544,2303391007,FR +2303391008,2303391039,IE +2303391040,2303392843,FR 2303392844,2303392847,FI 2303392848,2303393535,FR 2303393536,2303393567,PT @@ -57286,7 +58734,8 @@ 2315257856,2315258879,AR 2315258880,2315259903,CL 2315259904,2315266047,BR -2315266048,2315267071,VE +2315266048,2315266559,VE +2315266560,2315267071,CO 2315267072,2315270143,BR 2315270144,2315271167,AR 2315271168,2315278335,BR @@ -57332,7 +58781,8 @@ 2317395968,2317396223,NO 2317396224,2317398015,US 2317398016,2317398271,GB -2317398272,2317413375,US +2317398272,2317412351,US +2317412352,2317413375,CA 2317413376,2317413631,ID 2317413632,2317414655,US 2317414656,2317414911,AU @@ -57356,9 +58806,7 @@ 2317638656,2317639679,HN 2317639680,2317640703,AR 2317640704,2317649919,BR -2317649920,2317649991,HN -2317649992,2317649999,US -2317650000,2317650943,HN +2317649920,2317650943,HN 2317650944,2317651967,BR 2317651968,2317652991,PE 2317652992,2317654015,AR @@ -57381,9 +58829,7 @@ 2318598144,2318663679,CA 2318663680,2319122431,US 2319122432,2319123455,AR -2319123456,2319123999,HN -2319124000,2319124007,US -2319124008,2319124479,HN +2319123456,2319124479,HN 2319124480,2319125503,VE 2319125504,2319126527,UY 2319126528,2319127551,CR @@ -57406,9 +58852,7 @@ 2319165440,2319167487,AR 2319167488,2319168511,HN 2319169536,2319174655,BR -2319174656,2319175647,HN -2319175648,2319175663,BR -2319175664,2319175679,HN +2319174656,2319175679,HN 2319175680,2319184895,BR 2319184896,2319185919,AR 2319185920,2319187967,BR @@ -57418,10 +58862,12 @@ 2319450112,2319581183,US 2319581184,2319646719,IT 2319646720,2319728639,US -2319728640,2319740927,DE -2319740928,2319745023,US -2319745024,2319757311,GB -2319757312,2319843327,US +2319728640,2319741951,DE +2319741952,2319742975,US +2319742976,2319743999,NL +2319744000,2319745023,DE +2319745024,2319761407,GB +2319761408,2319843327,US 2319843328,2319908863,IT 2319908864,2319974399,AU 2319974400,2320039935,US @@ -57445,20 +58891,18 @@ 2321420288,2321430527,BR 2321430528,2321431551,CR 2321431552,2321446911,BR -2321446912,2321447263,HN -2321447264,2321447279,NL -2321447280,2321447647,HN -2321447648,2321447679,NL -2321447680,2321447727,HN -2321447728,2321447743,NL -2321447744,2321447935,HN +2321446912,2321447935,HN 2321447936,2321452031,BR 2321452032,2321453055,MX -2321453056,2321454079,HN +2321453056,2321453359,HN +2321453360,2321453367,NL +2321453368,2321454079,HN 2321454080,2321467136,BR 2321467137,2321467137,US 2321467138,2321471487,BR -2321471488,2321472511,HN +2321471488,2321472391,HN +2321472392,2321472399,UY +2321472400,2321472511,HN 2321472512,2321477631,BR 2321477632,2321478655,TT 2321478656,2321479679,SV @@ -57490,13 +58934,7 @@ 2321743872,2321744895,SV 2321744896,2321745919,AR 2321745920,2321753087,BR -2321753088,2321753359,HN -2321753360,2321753375,NL -2321753376,2321753599,HN -2321753600,2321753607,NL -2321753608,2321753927,HN -2321753928,2321753935,NL -2321753936,2321754111,HN +2321753088,2321754111,HN 2321754112,2321755135,BR 2321755136,2321756159,UY 2321756160,2321769471,BR @@ -57729,9 +59167,9 @@ 2327472128,2327476223,BR 2327476224,2327477247,CL 2327477248,2327480319,BR -2327480320,2327481055,HN -2327481056,2327481071,US -2327481072,2327481343,HN +2327480320,2327481135,HN +2327481136,2327481143,US +2327481144,2327481343,HN 2327481344,2327482367,AR 2327482368,2327483391,BR 2327483392,2327485439,AR @@ -57744,11 +59182,9 @@ 2327494656,2327496703,BR 2327496704,2327497727,MX 2327497728,2327498751,BR -2327498752,2327499055,HN -2327499056,2327499063,CL -2327499064,2327499655,HN -2327499656,2327499663,CL -2327499664,2327499775,HN +2327498752,2327499623,HN +2327499624,2327499631,CL +2327499632,2327499775,HN 2327499776,2327501823,AR 2327501824,2327507967,BR 2327507968,2327508991,AR @@ -57759,8 +59195,8 @@ 2327969792,2328035327,AU 2328035328,2328100863,FR 2328100864,2328199167,US -2328199168,2328207359,CA -2328207360,2328231935,US +2328199168,2328211455,CA +2328211456,2328231935,US 2328231936,2328297471,GB 2328313856,2328317951,NL 2328342528,2328342783,DE @@ -57865,7 +59301,7 @@ 2331508736,2331574271,GB 2331574272,2331639807,FI 2331639808,2331770879,GB -2331770880,2331836415,AU +2331770880,2331836415,HK 2331836416,2331901951,GB 2331901952,2331967487,US 2331967488,2331980799,BR @@ -57961,14 +59397,12 @@ 2335768576,2335834111,CA 2335834112,2335899647,SE 2335899648,2335924223,IN -2335924224,2335928319,SG -2335928320,2335932415,IN +2335924224,2335932415,SG 2335932416,2335940607,DE 2335940608,2335948799,GB -2335948800,2335951266,SG -2335951267,2335951267,GB -2335951268,2335952895,SG -2335952896,2335954943,DE +2335948800,2335949823,SG +2335949824,2335951871,GB +2335951872,2335954943,DE 2335954944,2335965183,SG 2335965184,2335994879,US 2335994880,2335995903,CA @@ -58022,7 +59456,9 @@ 2340683776,2340749311,AU 2340749312,2340814847,GB 2340814848,2340880383,AU -2340880384,2341273599,US +2340880384,2341126143,US +2341126144,2341134335,CY +2341134336,2341273599,US 2341273600,2341339135,KW 2341339136,2341404671,CA 2341404672,2341470207,GB @@ -58101,8 +59537,7 @@ 2354053120,2354118655,CA 2354184192,2354249727,US 2354249728,2354315263,AU -2354315264,2354380799,US -2354380800,2354446335,NL +2354315264,2354446335,US 2354446336,2354511871,FR 2354511872,2354839551,US 2354839552,2354905087,TW @@ -58166,7 +59601,7 @@ 2364407808,2364538879,US 2364538880,2364604415,CN 2364604416,2364671487,US -2364671488,2364671743,MO +2364671488,2364671743,HK 2364671744,2364675839,US 2364675840,2364676095,CA 2364676096,2364676863,US @@ -58265,7 +59700,8 @@ 2372225024,2372225791,US 2372225792,2372226303,NL 2372226304,2372226559,SG -2372226560,2372227583,SE +2372226560,2372227071,US +2372227072,2372227583,SE 2372227584,2372228607,KR 2372228608,2372229119,US 2372229120,2372229375,FR @@ -58427,7 +59863,15 @@ 2379284480,2380201983,US 2380201984,2380267519,KR 2380267520,2380398591,US -2380398592,2380434431,IL +2380398592,2380420095,IL +2380420096,2380420863,GB +2380420864,2380430847,IL +2380430848,2380431103,GB +2380431104,2380431615,IL +2380431616,2380431871,US +2380431872,2380432127,TH +2380432128,2380432383,US +2380432384,2380434431,IL 2380434432,2380435455,US 2380435456,2380464127,IL 2380464128,2380464639,FR @@ -58578,7 +60022,8 @@ 2392025088,2392063999,US 2392064000,2392096767,CA 2392096768,2392129535,US -2392129536,2392489983,CA +2392129536,2392457215,CA +2392457216,2392489983,RO 2392489984,2392514559,US 2392514560,2394947583,CA 2394947584,2395013119,US @@ -58595,9 +60040,7 @@ 2398945280,2399010815,CA 2399010816,2399109119,US 2399109120,2399141887,PR -2399141888,2399148031,BR -2399148032,2399149055,DO -2399149056,2399150079,BR +2399141888,2399150079,BR 2399150080,2399151103,BQ 2399151104,2399158271,BR 2399158272,2399159295,AR @@ -58688,33 +60131,7 @@ 2408182784,2408183807,AR 2408183808,2408185855,BR 2408185856,2409562111,US -2409562112,2409563135,GB -2409563136,2409564159,US -2409564160,2409565695,GB -2409565696,2409566207,US -2409566208,2409569791,GB -2409569792,2409570047,US -2409570048,2409570559,GB -2409570560,2409570815,US -2409570816,2409571327,GB -2409571328,2409572351,US -2409572352,2409576447,GB -2409576448,2409576959,US -2409576960,2409580543,GB -2409580544,2409580799,US -2409580800,2409581311,GB -2409581312,2409581567,US -2409581568,2409585151,GB -2409585152,2409585407,US -2409585408,2409585535,GB -2409585536,2409586175,US -2409586176,2409587199,GB -2409587200,2409588735,US -2409588736,2409616383,GB -2409616384,2409616895,US -2409616896,2409618175,GB -2409618176,2409618431,US -2409618432,2409627647,GB +2409562112,2409627647,GB 2409627648,2409693183,ZA 2409693184,2409758719,AT 2409758720,2409824255,US @@ -59024,7 +60441,7 @@ 2419082240,2419083263,HK 2419083264,2419085311,IN 2419085312,2419086079,MM -2419086080,2419086335,HK +2419086080,2419086335,AU 2419086336,2419087359,BD 2419087360,2419088383,CN 2419088384,2419089407,KR @@ -59034,8 +60451,7 @@ 2419090432,2419091455,KR 2419091456,2419091711,US 2419091712,2419091967,SG -2419091968,2419092223,US -2419092224,2419092479,SG +2419091968,2419092479,US 2419092480,2419094527,BD 2419094528,2419095551,AU 2419095552,2419096575,PK @@ -59178,12 +60594,17 @@ 2432630784,2432696319,CN 2432696320,2433247231,NL 2433247232,2433247487,GB -2433247488,2433646591,NL +2433247488,2433630207,NL +2433630208,2433638399,GB +2433638400,2433646591,SE 2433646592,2433647615,DE -2433647616,2433648639,US +2433647616,2433648639,CA 2433648640,2433650687,DE 2433650688,2433654783,US -2433654784,2433679359,DE +2433654784,2433662975,IT +2433662976,2433675263,DE +2433675264,2433677311,PL +2433677312,2433679359,AT 2433679360,2433810431,NL 2433810432,2433875967,GB 2433875968,2435055615,NL @@ -59193,8 +60614,8 @@ 2436366336,2436628479,NL 2436628480,2436630527,BE 2436630528,2436632575,NL -2436632576,2436633599,DK -2436633600,2436694015,BE +2436632576,2436634623,DK +2436634624,2436694015,BE 2436694016,2436759551,NL 2436759552,2436767743,GB 2436768000,2436775935,GB @@ -59338,7 +60759,8 @@ 2453864448,2453929983,CH 2453929984,2454061055,US 2454061056,2454126591,GB -2454126592,2454150655,US +2454126592,2454149631,US +2454149632,2454150655,CA 2454150656,2454151167,AE 2454151168,2454192127,US 2454192128,2454257663,NO @@ -59371,8 +60793,8 @@ 2455175168,2455240703,GB 2455240704,2455244799,US 2455244800,2455244943,AU -2455244944,2455244944,US -2455244945,2455245055,AU +2455244944,2455244945,US +2455244946,2455245055,AU 2455245056,2455245311,US 2455245312,2455245567,AU 2455245568,2455245823,NL @@ -59469,11 +60891,17 @@ 2457379840,2457380095,CZ 2457380096,2457380863,RU 2457380864,2457381631,UA -2457381632,2457382911,CZ -2457382912,2457389055,RU -2457389056,2457391103,CZ -2457391104,2457393151,RU -2457393152,2457396223,CZ +2457381632,2457381887,CZ +2457381888,2457382399,RU +2457382400,2457382911,CZ +2457382912,2457383935,RU +2457383936,2457384959,UA +2457384960,2457388031,RU +2457388032,2457388543,CZ +2457388544,2457388799,UA +2457388800,2457391103,CZ +2457391104,2457392127,RU +2457392128,2457396223,CZ 2457396224,2457397247,DE 2457397248,2457403391,RU 2457403392,2457520895,US @@ -59576,47 +61004,23 @@ 2462350336,2462351359,CN 2462351360,2462384127,GM 2462384128,2462449663,US -2462449664,2462460415,GB -2462460416,2462460799,US -2462460800,2462463487,GB -2462463488,2462464895,US -2462464896,2462465023,GB -2462465024,2462465535,US -2462465536,2462467583,GB -2462467584,2462468351,US -2462468352,2462469375,GB -2462469376,2462471167,US -2462471168,2462472447,GB +2462449664,2462463999,GB +2462464000,2462464767,US +2462464768,2462467583,GB +2462467584,2462468095,US +2462468096,2462469631,GB +2462469632,2462470143,US +2462470144,2462472447,GB 2462472448,2462472703,US 2462472704,2462473471,GB 2462473472,2462473727,US -2462473728,2462474239,GB -2462474240,2462474751,US -2462474752,2462475007,GB -2462475008,2462475135,US -2462475136,2462476031,GB -2462476032,2462476287,US -2462476288,2462477311,GB +2462473728,2462477311,GB 2462477312,2462478335,US -2462478336,2462479359,GB -2462479360,2462479871,US -2462479872,2462500351,GB +2462478336,2462500351,GB 2462500352,2462500863,US -2462500864,2462503167,GB -2462503168,2462503679,US -2462503680,2462503935,GB -2462503936,2462504191,US -2462504192,2462505471,GB -2462505472,2462507519,US -2462507520,2462507775,GB -2462507776,2462508031,US -2462508032,2462509823,GB -2462509824,2462510079,US -2462510080,2462510847,GB -2462510848,2462511103,US -2462511104,2462514175,GB -2462514176,2462515199,US -2462515200,2462526602,GB +2462500864,2462506495,GB +2462506496,2462507007,US +2462507008,2462526602,GB 2462526603,2462526603,US 2462526604,2462580736,GB 2462580737,2462582015,US @@ -59655,7 +61059,9 @@ 2462607104,2462607359,GB 2462607360,2462609919,US 2462609920,2462610175,GB -2462610176,2462614527,US +2462610176,2462610943,US +2462610944,2462611199,GB +2462611200,2462614527,US 2462614528,2462614783,GB 2462614784,2462615551,US 2462615552,2462615807,GB @@ -59827,7 +61233,9 @@ 2472083456,2472148991,GB 2472148992,2472214527,US 2472214528,2472280063,RS -2472280064,2472312831,US +2472280064,2472296447,US +2472296448,2472300543,CA +2472300544,2472312831,US 2472312832,2472345599,JP 2472345600,2472411135,BE 2472411136,2472476671,FR @@ -59952,7 +61360,9 @@ 2486928896,2486929151,CA 2486929152,2486929407,US 2486929408,2486929663,CA -2486929664,2486946815,US +2486929664,2486945535,US +2486945536,2486945551,CA +2486945552,2486946815,US 2486946816,2486947327,CA 2486947328,2486949887,US 2486949888,2486951423,CA @@ -59972,7 +61382,9 @@ 2487549952,2487615487,PT 2487615488,2487681023,US 2487681024,2487746559,PT -2487746560,2488205311,US +2487746560,2488066047,US +2488066048,2488074239,IL +2488074240,2488205311,US 2488205312,2488270847,GB 2488270848,2488336383,US 2488336384,2488401919,PL @@ -60052,13 +61464,7 @@ 2496004096,2496069631,AT 2496069632,2496135167,US 2496135168,2496200703,NL -2496200704,2497682431,MX -2497682432,2497683455,EC -2497683456,2498475007,MX -2498475008,2498476031,EC -2498476032,2499110519,MX -2499110520,2499110527,NI -2499110528,2499477503,MX +2496200704,2499477503,MX 2499477504,2499543039,DE 2499543040,2499545087,GB 2499545088,2499547135,IE @@ -60095,9 +61501,15 @@ 2500144896,2500145151,IE 2500145152,2500149247,US 2500149248,2500150271,GB -2500150272,2500150655,US +2500150272,2500150559,US +2500150560,2500150591,GB +2500150592,2500150655,US 2500150656,2500150719,GB -2500150720,2500155647,US +2500150720,2500154751,US +2500154752,2500154815,GB +2500154816,2500155199,US +2500155200,2500155391,GB +2500155392,2500155647,US 2500155648,2500155903,GB 2500155904,2500161023,US 2500161024,2500161535,GB @@ -60105,16 +61517,18 @@ 2500161792,2500162047,GB 2500162048,2500162559,US 2500162560,2500163071,GB -2500163072,2500166207,US -2500166208,2500166223,GB -2500166224,2500170751,US +2500163072,2500165631,US +2500165632,2500169727,GB +2500169728,2500170751,US 2500170752,2500170752,FI 2500170753,2500177935,US 2500177936,2500177943,PL 2500177944,2500180735,US 2500180736,2500180991,HR 2500180992,2500182015,US -2500182016,2500188679,GB +2500182016,2500188223,GB +2500188224,2500188287,CH +2500188288,2500188679,GB 2500188680,2500188687,CH 2500188688,2500190207,GB 2500190208,2500190975,US @@ -60160,18 +61574,20 @@ 2500238048,2500238055,FR 2500238056,2500239359,IT 2500239360,2500243455,FR -2500243456,2500247551,US +2500243456,2500245503,US +2500245504,2500246015,GB +2500246016,2500246271,US +2500246272,2500246527,GB +2500246528,2500247551,US 2500247552,2500255743,ES 2500255744,2500268031,US 2500268032,2500272127,ES 2500272128,2500273407,GB -2500273408,2500275455,US -2500275456,2500275711,GB -2500275712,2500276223,US -2500276224,2500276735,GB +2500273408,2500275199,US +2500275200,2500276735,GB 2500276736,2500276991,US -2500276992,2500277055,GB -2500277056,2500278751,US +2500276992,2500277247,GB +2500277248,2500278751,US 2500278752,2500279295,GB 2500279296,2500288511,US 2500288512,2500290815,FR @@ -60195,9 +61611,9 @@ 2500535374,2500535374,IE 2500535375,2500535399,US 2500535400,2500535407,IE -2500535408,2500537687,US -2500537688,2500537695,GB -2500537696,2500542751,US +2500535408,2500536319,US +2500536320,2500538367,GB +2500538368,2500542751,US 2500542752,2500542755,NL 2500542756,2500544767,US 2500544768,2500545023,GR @@ -60207,9 +61623,9 @@ 2500549272,2500549279,ES 2500549280,2500550143,US 2500550144,2500550655,UA -2500550656,2500553759,US -2500553760,2500553767,GB -2500553768,2500554379,US +2500550656,2500553727,US +2500553728,2500554239,GB +2500554240,2500554379,US 2500554380,2500554487,DE 2500554488,2500556295,US 2500556296,2500556303,CZ @@ -60246,7 +61662,9 @@ 2500665344,2500666111,US 2500666368,2500666463,US 2500666464,2500666471,LU -2500666472,2500680447,US +2500666472,2500674623,US +2500674624,2500674687,DE +2500674688,2500680447,US 2500680448,2500680703,SE 2500680704,2500681759,US 2500681760,2500681767,PL @@ -60258,7 +61676,9 @@ 2500687872,2500689919,FR 2500689920,2500694015,US 2500694016,2500697087,IT -2500697088,2500719103,US +2500697088,2500702719,US +2500702720,2500702975,NL +2500702976,2500719103,US 2500719104,2500721151,IE 2500721152,2500723799,US 2500723800,2500723807,ES @@ -60279,9 +61699,7 @@ 2500748800,2500755455,US 2500755456,2500763647,GB 2500763648,2500984831,US -2500984832,2500997119,GB -2500997120,2500999167,US -2500999168,2501033983,GB +2500984832,2501033983,GB 2501033984,2501574655,US 2501574656,2501640191,KZ 2501640192,2502033407,US @@ -60295,7 +61713,9 @@ 2502164480,2502165503,GB 2502165504,2502173695,US 2502173696,2502174207,DE -2502174208,2502221823,US +2502174208,2502180863,US +2502180864,2502181119,FI +2502181120,2502221823,US 2502221824,2502222591,ES 2502222592,2502222847,US 2502222848,2502223871,ES @@ -60414,7 +61834,11 @@ 2506530816,2506555391,ES 2506555392,2507124735,US 2507124736,2507124991,IN -2507124992,2508062719,US +2507124992,2507145215,US +2507173888,2507174143,US +2507175936,2507177983,CA +2507183360,2507183615,US +2507210752,2508062719,US 2508062720,2508064767,CH 2508064768,2508066815,ES 2508066816,2508068863,RU @@ -60479,7 +61903,7 @@ 2509936640,2509937919,AT 2509937920,2509938175,IT 2509938176,2509938431,US -2509938432,2509938687,AT +2509938432,2509938687,DE 2509938688,2509942783,GB 2509942784,2509946879,UA 2509946880,2509963263,BE @@ -60625,7 +62049,9 @@ 2513764352,2514419711,DE 2514419712,2514485247,GB 2514485248,2514681599,DE -2514681856,2515189759,DE +2514681856,2515140607,DE +2515140608,2515142655,US +2515142656,2515189759,DE 2515189760,2515206143,US 2515206144,2515271679,GB 2515271680,2515599359,DE @@ -60679,7 +62105,9 @@ 2522813440,2522814463,TH 2522814464,2522815487,SG 2522815488,2522816511,TH -2522816512,2523201535,JP +2522816512,2522824703,JP +2522824704,2522841087,SG +2522841088,2523201535,JP 2523201536,2523267071,AU 2523267072,2523463679,US 2523463680,2523529215,CA @@ -60876,14 +62304,14 @@ 2533294080,2533359615,CN 2533359616,2533375999,UA 2533376000,2533392383,HU -2533392384,2534823255,IT -2534823256,2534823263,SI -2534823264,2538602495,IT +2533392384,2538602495,IT 2538602496,2538604967,FR 2538604968,2538604975,ES 2538604976,2538605271,FR 2538605272,2538605279,ES -2538605280,2538605471,FR +2538605280,2538605375,FR +2538605376,2538605379,GB +2538605380,2538605471,FR 2538605472,2538605503,PT 2538605504,2538605903,FR 2538605904,2538605919,ES @@ -60928,7 +62356,9 @@ 2538633552,2538633567,IE 2538633568,2538634227,FR 2538634228,2538634231,DE -2538634232,2538634559,FR +2538634232,2538634331,FR +2538634332,2538634335,DE +2538634336,2538634559,FR 2538634560,2538634623,GB 2538634624,2538634879,FR 2538634880,2538635007,GB @@ -60993,7 +62423,9 @@ 2538657136,2538657139,RO 2538657140,2538657439,FR 2538657440,2538657443,ES -2538657444,2538657967,FR +2538657444,2538657855,FR +2538657856,2538657919,ES +2538657920,2538657967,FR 2538657968,2538657983,IE 2538657984,2538658327,FR 2538658328,2538658331,IE @@ -61064,42 +62496,19 @@ 2548563968,2548826111,IR 2548826112,2548829695,AT 2548829696,2548829951,NL -2548829952,2548829973,AT -2548829974,2548829974,DE -2548829975,2548830035,AT -2548830036,2548830036,DE -2548830037,2548830736,AT -2548830737,2548830737,IT -2548830738,2548830949,AT -2548830950,2548830950,IT -2548830951,2548830975,AT +2548829952,2548830207,DE +2548830208,2548830463,US +2548830464,2548830719,DE +2548830720,2548830975,IT 2548830976,2548831231,GB -2548831232,2548831297,AT -2548831298,2548831298,HK -2548831299,2548831383,AT -2548831384,2548831384,HK -2548831385,2548831404,AT -2548831405,2548831405,HK -2548831406,2548831501,AT -2548831502,2548831502,FR -2548831503,2548831505,AT -2548831506,2548831506,FR -2548831507,2548831534,AT -2548831535,2548831535,FR -2548831536,2548831735,AT -2548831736,2548831736,FR -2548831737,2548831963,AT -2548831964,2548831964,US -2548831965,2548832017,AT -2548832018,2548832018,ES -2548832019,2548832049,AT -2548832050,2548832050,ES -2548832051,2548832628,AT -2548832629,2548832629,PL -2548832630,2548832767,AT +2548831232,2548831487,HK +2548831488,2548831743,FR +2548831744,2548831999,US +2548832000,2548832255,ES +2548832256,2548832511,IS +2548832512,2548832767,PL 2548832768,2548833279,CH -2548833280,2548833535,AT -2548833536,2548833791,NL +2548833280,2548833791,NL 2548833792,2548834303,AT 2548834304,2548842495,GB 2548842496,2548848639,RU @@ -61263,7 +62672,9 @@ 2557673472,2557739007,DK 2557739008,2557870079,US 2557870080,2557935615,ID -2557935616,2558918655,US +2557935616,2558658499,US +2558658500,2558658500,PR +2558658501,2558918655,US 2558918656,2558984191,GB 2558984192,2559246335,US 2559246336,2559311871,CL @@ -61330,7 +62741,8 @@ 2572681216,2572746751,SE 2572746752,2572944127,US 2572944128,2572944383,LT -2572944384,2572947455,US +2572944384,2572945407,US +2572945408,2572947455,ID 2572947456,2572950271,PL 2572950272,2572950527,ES 2572950528,2572951551,DE @@ -61715,11 +63127,7 @@ 2586957312,2586968127,US 2586968128,2586968319,FR 2586968320,2587018239,US -2587018240,2587018495,IE -2587018496,2587018671,US -2587018672,2587018687,IE -2587018688,2587019263,US -2587019264,2587020799,IE +2587018240,2587020799,IE 2587020800,2587021823,US 2587021824,2587022847,IE 2587022848,2587050239,US @@ -61762,10 +63170,10 @@ 2587481970,2587481970,LB 2587481971,2587484159,US 2587484160,2587492351,GB -2587492352,2587496447,ES -2587496448,2587498495,US -2587498496,2587498751,ES -2587498752,2587504639,US +2587492352,2587497471,ES +2587497472,2587498495,US +2587498496,2587499007,ES +2587499008,2587504639,US 2587504640,2587508735,ES 2587508736,2587525119,GB 2587525120,2587541503,US @@ -61778,7 +63186,9 @@ 2587594256,2587594751,GB 2587594752,2587596799,US 2587596800,2587598847,GB -2587598848,2587623423,US +2587598848,2587607295,US +2587607296,2587607551,DE +2587607552,2587623423,US 2587623424,2587631615,BG 2587631616,2587631871,US 2587631872,2587632127,ES @@ -61788,9 +63198,9 @@ 2587648512,2587649023,ES 2587649024,2587674623,US 2587674624,2587676671,IT -2587676672,2587681279,US -2587681280,2587682815,ES -2587682816,2587697151,US +2587676672,2587680767,US +2587680768,2587683839,ES +2587683840,2587697151,US 2587697152,2587697407,GB 2587697408,2587698175,US 2587698176,2587699199,GB @@ -61801,10 +63211,8 @@ 2587714560,2587926527,US 2587926528,2587930623,BG 2587930624,2587938815,US -2587938816,2587939839,PR -2587939840,2587940607,US -2587940608,2587940863,PR -2587940864,2587951103,US +2587938816,2587942911,PR +2587942912,2587951103,US 2587951104,2587952127,ZA 2587952128,2587953151,NG 2587953152,2587954175,MU @@ -62018,11 +63426,14 @@ 2592047104,2592079871,AO 2592079872,2593128447,EG 2593652736,2594177023,KE +2594177024,2595225599,GH +2595225600,2596274175,EG 2596274176,2596339711,SC 2596339712,2597322751,ZA 2597322752,2598371327,US 2598371328,2598895615,UG 2598895616,2599157759,CI +2599157760,2599419903,EG 2599419904,2600468479,DZ 2600468480,2600534015,ZM 2600534016,2600665087,US @@ -62293,7 +63704,9 @@ 2618028544,2618029055,GB 2618029056,2618032127,CA 2618032128,2618097663,US -2618097664,2618163199,NZ +2618097664,2618115583,NZ +2618115584,2618116095,SG +2618116096,2618163199,NZ 2618163200,2618228735,IT 2618228736,2618294271,US 2618359808,2618425343,PL @@ -62312,6 +63725,7 @@ 2619539456,2619604991,ES 2619604992,2619735295,US 2619735552,2619736063,US +2619768832,2619801599,ZA 2619801600,2620063743,US 2620063744,2620129279,GB 2620129280,2620194815,CA @@ -62537,6 +63951,7 @@ 2627141632,2627354706,US 2627354707,2627354707,HK 2627354708,2627403775,US +2627403776,2627469311,ZA 2627469312,2627731455,TZ 2627731456,2631925759,EG 2631925760,2632450047,ZA @@ -62571,12 +63986,11 @@ 2637629024,2637629311,IE 2637629312,2637629375,US 2637629376,2637629439,IE -2637629440,2637629503,US -2637629504,2637629567,NL +2637629440,2637629567,NL 2637629568,2637629583,US 2637629584,2637629599,NL 2637629600,2637629631,IE -2637629632,2637629663,US +2637629632,2637629663,NL 2637629664,2637629807,IE 2637629808,2637629823,US 2637629824,2637629951,IE @@ -62584,7 +63998,9 @@ 2637630112,2637630119,IE 2637630120,2637630127,US 2637630128,2637630143,IE -2637630144,2637630479,US +2637630144,2637630207,US +2637630208,2637630335,NL +2637630336,2637630479,US 2637630480,2637630495,IE 2637630496,2637630655,US 2637630656,2637630783,IE @@ -62602,9 +64018,7 @@ 2637638672,2637638815,IE 2637638816,2637638879,US 2637638880,2637638911,IE -2637638912,2637639167,US -2637639168,2637639199,IE -2637639200,2637639359,US +2637638912,2637639359,US 2637639360,2637639423,IE 2637639424,2637639551,US 2637639552,2637639679,IE @@ -62634,13 +64048,13 @@ 2637686512,2637686527,IE 2637686528,2637686655,US 2637686656,2637686783,IE -2637686784,2637686847,US -2637686848,2637686975,IE +2637686784,2637686855,US +2637686856,2637686975,IE 2637686976,2637687215,US 2637687216,2637687615,IE 2637687616,2637687679,US -2637687680,2637688447,IE -2637688448,2637688479,US +2637687680,2637688319,IE +2637688320,2637688479,US 2637688480,2637688831,IE 2637688832,2637722143,US 2637722144,2637722175,IE @@ -62657,17 +64071,19 @@ 2637746176,2637746183,FI 2637746184,2637746191,IE 2637746192,2637746199,NL -2637746200,2637746223,US +2637746200,2637746207,FI +2637746208,2637746215,IE +2637746216,2637746223,US 2637746224,2637746231,AT -2637746232,2637746687,US +2637746232,2637746247,US +2637746248,2637746255,FI +2637746256,2637746687,US 2637746688,2637746695,KR 2637746696,2637746743,US 2637746744,2637746751,HK 2637746752,2637746759,SG -2637746760,2637756687,US -2637756688,2637756703,NL -2637756704,2637757423,US -2637757424,2637757439,NL +2637746760,2637756415,US +2637756416,2637757439,NL 2637757440,2637758463,IE 2637758464,2637997055,US 2637997056,2637997311,AU @@ -62704,9 +64120,10 @@ 2640408576,2640410623,NL 2640410624,2640411135,US 2640411136,2640411391,MX -2640411392,2640411647,NL -2640411648,2640412671,US -2640412672,2640423935,NL +2640411392,2640412671,US +2640412672,2640417023,NL +2640417024,2640417279,CA +2640417280,2640423935,NL 2640423936,2640429055,ES 2640429056,2640445439,NL 2640445440,2640510975,US @@ -62919,7 +64336,9 @@ 2650603520,2650669055,CO 2650669056,2650734591,US 2650734592,2650800127,CN -2650800128,2652528639,US +2650800128,2652512255,US +2652512256,2652520447,CA +2652520448,2652528639,US 2652528640,2652528895,AR 2652528896,2652537607,US 2652537616,2652541183,US @@ -63106,7 +64525,8 @@ 2666070016,2666135551,SE 2666135552,2666201087,GB 2666201088,2667053055,US -2667053056,2667118591,NO +2667053056,2667085823,NO +2667085824,2667118591,DK 2667118592,2667184127,HU 2667184128,2667249663,RU 2667249664,2667315199,CL @@ -63124,7 +64544,9 @@ 2667534336,2667536383,PL 2667536384,2667536575,AT 2667536576,2667536583,FR -2667536584,2667537087,AT +2667536584,2667536615,AT +2667536616,2667536623,FR +2667536624,2667537087,AT 2667537088,2667537119,FR 2667537120,2667537151,AT 2667537152,2667537215,FR @@ -63150,9 +64572,7 @@ 2667565431,2667566335,AT 2667566336,2667566591,US 2667566592,2667566847,DE -2667566848,2667566925,AT -2667566926,2667566926,FR -2667566927,2667567103,AT +2667566848,2667567103,FR 2667567104,2667569151,SE 2667569152,2667571199,GB 2667571200,2667573247,ES @@ -63285,10 +64705,12 @@ 2675245056,2675255295,NZ 2675255296,2675257343,PH 2675257344,2675261439,US -2675261440,2675269631,NZ +2675261440,2675269631,TW 2675269632,2675271679,PH 2675271680,2675279871,NZ -2675279872,2675281919,MY +2675279872,2675280383,MY +2675280384,2675280895,TH +2675280896,2675281919,ID 2675281920,2675286015,NZ 2675286016,2675294207,US 2675294208,2675296255,NL @@ -63301,14 +64723,16 @@ 2675574240,2675574271,IT 2675574272,2675574895,US 2675574896,2675574903,NL -2675574904,2675576703,US +2675574904,2675575951,US +2675575952,2675575953,SA +2675575954,2675576703,US 2675576704,2675576711,JO 2675576712,2675589119,US 2675589120,2675605503,DE 2675605504,2675605791,US -2675605792,2675605799,CZ +2675605792,2675605799,IT 2675605800,2675605807,US -2675605808,2675605811,CZ +2675605808,2675605811,IT 2675605812,2675605951,US 2675605952,2675605961,CZ 2675605962,2675605962,DE @@ -63317,9 +64741,13 @@ 2675605965,2675605967,CZ 2675605968,2675606271,US 2675606272,2675606527,IT -2675606528,2675606975,US +2675606528,2675606571,US +2675606572,2675606575,IT +2675606576,2675606975,US 2675606976,2675607039,IT -2675607040,2675608751,US +2675607040,2675608735,US +2675608736,2675608739,IT +2675608740,2675608751,US 2675608752,2675608767,HK 2675608768,2675608983,US 2675608984,2675608991,AU @@ -63380,9 +64808,13 @@ 2677622784,2677623039,IE 2677623040,2677635071,US 2677635072,2677636095,CN -2677636096,2677642239,US +2677636096,2677639167,US +2677639168,2677639679,CA +2677639680,2677641215,US +2677641216,2677641471,CA +2677641472,2677642239,US 2677642240,2677642495,ES -2677642496,2677642751,US +2677642496,2677642751,CA 2677642752,2677643007,SE 2677643008,2677644347,US 2677644348,2677644348,GB @@ -63636,6 +65068,9 @@ 2684344320,2684346367,NL 2684346368,2684354559,FI 2684354560,2684387327,MU +2684387328,2684403711,SN +2684403712,2684411903,ZA +2684411904,2684420095,BJ 2684420096,2684616703,US 2684616704,2684682239,NZ 2684682240,2684747775,GB @@ -63645,18 +65080,26 @@ 2684944384,2685009919,GB 2685009920,2685075455,US 2685075456,2685599743,JP -2685599744,2685607935,US -2685612032,2685613055,MO +2685599744,2685603839,US +2685604864,2685605887,PK +2685605888,2685607935,US +2685612032,2685613055,CN 2685613056,2685614079,TW +2685616128,2685617151,ID +2685626368,2685627391,US 2685628416,2685632511,ZA +2685640704,2685641727,US 2685652992,2685656063,CN 2685656064,2685657087,IN +2685657088,2685658111,ID 2685665280,2685668351,IN 2685668352,2685669375,SG 2685675520,2685676543,PH 2685676544,2685677567,JP 2685677568,2685678591,CN 2685678592,2685681663,HK +2685683712,2685684735,BD +2685718528,2685719551,US 2685724672,2685726719,CA 2685730816,2685796351,JP 2685861888,2686320639,JP @@ -63675,7 +65118,8 @@ 2688221184,2688286719,CH 2688286720,2688352255,DE 2688352256,2688418825,CH -2688418827,2688420351,CH +2688418827,2688420095,CH +2688420096,2688420351,US 2688420352,2688420607,CN 2688420608,2688420863,CH 2688420864,2688421119,AU @@ -63742,7 +65186,16 @@ 2691301376,2691366911,CA 2691366912,2691760127,US 2691825664,2691891199,HU -2691891200,2692218879,ZA +2691891200,2692153343,ZA +2692173824,2692175871,ZA +2692182016,2692184063,MZ +2692185088,2692186111,NG +2692194304,2692202495,GA +2692205568,2692206591,GH +2692206592,2692207615,SZ +2692209664,2692214783,ZA +2692215808,2692216319,KE +2692216832,2692218879,ZA 2692218880,2692284415,CI 2692284416,2692546559,ZA 2692546560,2694316031,US @@ -63810,7 +65263,12 @@ 2699362304,2699624447,US 2699624448,2699689983,JP 2699755520,2699821055,JP -2699886592,2699968511,JP +2699886592,2699955199,JP +2699955200,2699956223,TH +2699956224,2699957247,BD +2699957248,2699957503,JP +2699959808,2699960063,JP +2699960320,2699968511,JP 2699968512,2699969535,CN 2699969536,2699972607,IN 2699972608,2699973631,NZ @@ -63824,19 +65282,11 @@ 2700279808,2700935167,JP 2700935168,2701066239,US 2701066240,2701131775,BG -2701131776,2701131807,HN -2701131808,2701131823,CA -2701131824,2701132159,HN -2701132160,2701132175,CR -2701132176,2701132543,HN -2701132544,2701132559,CR -2701132560,2701134447,HN -2701134448,2701134463,US -2701134464,2701136047,HN -2701136048,2701136055,US -2701136056,2701139135,HN -2701139136,2701139151,UY -2701139152,2701139967,HN +2701131776,2701132391,HN +2701132392,2701132399,CR +2701132400,2701137903,HN +2701137904,2701137911,BR +2701137912,2701139967,HN 2701139968,2701148159,NI 2701148160,2701149183,AR 2701149184,2701150207,HN @@ -63874,8 +65324,7 @@ 2702573568,2702581759,AR 2702581760,2702583807,VE 2702583808,2702585855,MX -2702585856,2702586367,PA -2702586368,2702587903,CW +2702585856,2702587903,CW 2702587904,2702589951,BR 2702589952,2702606335,GF 2702606336,2702639103,BO @@ -64028,9 +65477,7 @@ 2714238976,2714304511,TH 2714304512,2714370263,US 2714370264,2714370271,SG -2714370272,2714370799,US -2714370800,2714370815,PH -2714370816,2714370895,US +2714370272,2714370895,US 2714370896,2714370911,CN 2714370912,2714371679,US 2714371680,2714371711,CA @@ -64054,7 +65501,11 @@ 2714378464,2714378495,HK 2714378496,2714379103,US 2714379104,2714379135,HK -2714379136,2714381951,US +2714379136,2714380031,US +2714380032,2714380287,HK +2714380288,2714381311,US +2714381312,2714381567,HK +2714381568,2714381951,US 2714381952,2714381983,HK 2714381984,2714382530,US 2714382531,2714382531,HK @@ -64066,15 +65517,15 @@ 2714403997,2714403997,JP 2714403998,2714404789,US 2714404790,2714404790,JP -2714404791,2714405071,US -2714405072,2714405087,JP -2714405088,2714405151,US +2714404791,2714405151,US 2714405152,2714405167,JP 2714405168,2714405311,US 2714405312,2714405327,CA 2714405328,2714405727,US 2714405728,2714405759,JP -2714405760,2714407113,US +2714405760,2714405829,US +2714405830,2714405831,JP +2714405832,2714407113,US 2714407114,2714407114,JP 2714407115,2714407160,US 2714407161,2714407161,JP @@ -64084,15 +65535,11 @@ 2714408704,2714408719,JP 2714408720,2714408959,US 2714408960,2714408991,JP -2714408992,2714412655,US -2714412656,2714412671,VN -2714412672,2714413343,US +2714408992,2714413343,US 2714413344,2714413359,PH 2714413360,2714417215,US 2714417216,2714417247,JP -2714417248,2714419079,US -2714419080,2714419087,MU -2714419088,2714419743,US +2714417248,2714419743,US 2714419744,2714419775,SG 2714419776,2714419871,US 2714419872,2714419903,SG @@ -64106,9 +65553,17 @@ 2714422880,2714422911,SG 2714422912,2714428767,US 2714428768,2714428783,JP -2714428784,2714433295,US +2714428784,2714429532,US +2714429533,2714429533,JP +2714429534,2714430301,US +2714430302,2714430303,JP +2714430304,2714432775,US +2714432776,2714432783,JP +2714432784,2714433295,US 2714433296,2714433311,JP -2714433312,2714697727,US +2714433312,2714433535,US +2714433536,2714433791,JP +2714433792,2714697727,US 2714697728,2714763263,CN 2714763264,2715025407,US 2715025408,2715090943,VE @@ -64125,14 +65580,22 @@ 2716729344,2716794879,CL 2716794880,2717253631,US 2717253632,2717319167,TH -2717319168,2717646847,US +2717319168,2717384703,US +2717450240,2717646847,US 2717646848,2717712383,KW 2717712384,2717843455,US 2717843456,2717908991,VE 2717908992,2717974527,CA 2717974528,2718629887,US 2718629888,2718695423,GB -2718695424,2718752767,US +2718695424,2718745599,US +2718748672,2718749695,PK +2718749696,2718750719,BD +2718750720,2718750975,US +2718750976,2718751231,BL +2718751232,2718751487,US +2718751744,2718752767,US +2718752768,2718754815,PR 2718755840,2718756863,US 2718756864,2718758911,IN 2718758912,2718760959,US @@ -64235,8 +65698,7 @@ 2728288256,2728289279,AE 2728289280,2728290303,PL 2728290304,2728291327,US -2728291328,2728291839,NL -2728291840,2728292351,US +2728291328,2728292351,NL 2728292352,2728293375,DE 2728293376,2728294399,JP 2728294400,2728295423,US @@ -64251,8 +65713,8 @@ 2728304640,2728306687,SG 2728306688,2728308735,US 2728308736,2728309759,HK -2728309760,2728310783,SE -2728310784,2728311807,US +2728309760,2728310015,RU +2728310016,2728311807,US 2728311808,2728312831,KR 2728312832,2728313087,FR 2728313088,2728313855,US @@ -64294,8 +65756,8 @@ 2731682816,2731685887,US 2731685888,2731686911,CA 2731686912,2731688959,US -2731688960,2731689983,VG -2731689984,2731711487,US +2731688960,2731689471,VG +2731689472,2731711487,US 2731711488,2731712511,AG 2731712512,2731714559,CA 2731714560,2731717631,US @@ -64308,13 +65770,7 @@ 2731765760,2731767807,CA 2731767808,2731768079,US 2731768080,2731768083,CA -2731768084,2731768183,US -2731768184,2731768191,CA -2731768192,2731768383,US -2731768384,2731768391,CA -2731768392,2731769391,US -2731769392,2731769399,CA -2731769400,2731769471,US +2731768084,2731769471,US 2731769472,2731769475,CA 2731769476,2731771903,US 2731771904,2731772927,KY @@ -64377,7 +65833,8 @@ 2732131328,2732132351,CA 2732132352,2732189695,US 2732189696,2732192767,CA -2732192768,2732201983,US +2732192768,2732194559,US +2732194816,2732201983,US 2732201984,2732203007,VG 2732203008,2732204031,US 2732204032,2732206079,CA @@ -64402,7 +65859,8 @@ 2732321024,2732321279,BM 2732321280,2732321535,CA 2732321536,2732321791,GB -2732321792,2732322815,CA +2732321792,2732322047,US +2732322048,2732322815,CA 2732322816,2732336127,US 2732336128,2732337151,CA 2732337152,2732349439,US @@ -64417,7 +65875,7 @@ 2732375040,2732376063,CA 2732376064,2732379135,US 2732379136,2732380159,CA -2732380160,2732389631,US +2732380160,2732389375,US 2732389888,2732390143,IT 2732390144,2732390399,US 2732390400,2732391423,CA @@ -64458,9 +65916,7 @@ 2732549120,2732550143,CA 2732550144,2732580863,US 2732580864,2732582911,CA -2732582912,2733882879,US -2733882880,2733883135,CA -2733883136,2733903871,US +2732582912,2733903871,US 2733903872,2733904895,PR 2733904896,2733907967,CA 2733907968,2733911039,US @@ -64493,7 +65949,9 @@ 2733953024,2733954047,CA 2733954048,2733958143,US 2733958144,2733959167,CA -2733959168,2733963263,US +2733959168,2733960191,US +2733960192,2733961215,CA +2733961216,2733963263,US 2733963264,2733964287,CA 2733964288,2733979647,US 2733979648,2733980671,CA @@ -64555,7 +66013,10 @@ 2734206976,2734209023,CA 2734209024,2734218239,US 2734218240,2734218751,CA -2734218752,2734229503,US +2734218752,2734219263,US +2734221312,2734224415,US +2734224416,2734224431,GB +2734224432,2734229503,US 2734229504,2734230527,CA 2734230528,2734237695,US 2734237696,2734238719,CA @@ -64571,9 +66032,7 @@ 2734296064,2734297087,CA 2734297088,2734304255,US 2734304256,2734305279,CA -2734305280,2734330367,US -2734330368,2734330431,IT -2734330432,2734330623,US +2734305280,2734330623,US 2734330624,2734330879,IT 2734330880,2734335999,US 2734336000,2734338047,CA @@ -64777,7 +66236,7 @@ 2738210816,2738214911,IN 2738214912,2738215935,HK 2738215936,2738216959,CN -2738216960,2738217983,HK +2738216960,2738217983,MY 2738217984,2738220031,AU 2738221056,2738222079,CN 2738222080,2738223103,MO @@ -64919,9 +66378,7 @@ 2756313088,2756378623,US 2756378624,2756444159,AU 2756444160,2756509695,US -2756509696,2756556543,CL -2756556544,2756557311,PE -2756557312,2756575231,CL +2756509696,2756575231,CL 2756575232,2756640767,SG 2756640768,2756706303,US 2756706304,2756771839,AU @@ -65100,7 +66557,9 @@ 2760168128,2760168191,IE 2760168192,2760168319,FR 2760168320,2760168447,GB -2760168448,2760169679,FR +2760168448,2760169471,FR +2760169472,2760169503,FI +2760169504,2760169679,FR 2760169680,2760169695,ES 2760169696,2760170047,FR 2760170048,2760170111,FI @@ -65319,12 +66778,8 @@ 2780037120,2780039167,ZA 2780039168,2780043263,US 2780043264,2780075007,ZA -2780075008,2780075263,US -2780075264,2780075394,ZA -2780075395,2780075395,US -2780075396,2780075449,ZA -2780075450,2780075450,US -2780075451,2780102655,ZA +2780075008,2780075519,US +2780075520,2780102655,ZA 2780102656,2780168191,US 2780168192,2780299263,CL 2780299264,2780364799,US @@ -65413,7 +66868,7 @@ 2783008256,2783008767,IT 2783008768,2783009279,BE 2783009280,2783010815,US -2783010944,2783011071,PH +2783010944,2783011071,HK 2783011072,2783011327,US 2783011328,2783011839,AU 2783011840,2783012351,JP @@ -65426,8 +66881,8 @@ 2783313920,2783379455,US 2783379456,2783380991,SC 2783380992,2783381503,NZ -2783381504,2783382527,SC -2783382528,2783383551,US +2783381504,2783383039,SC +2783383040,2783383551,US 2783383552,2783387647,CA 2783387648,2783391743,GB 2783391744,2783395839,US @@ -65550,7 +67005,9 @@ 2807237632,2807259647,US 2807260160,2807271679,US 2807271680,2807271935,AU -2807271936,2807496703,US +2807271936,2807288345,US +2807288346,2807288346,PR +2807288347,2807496703,US 2807496704,2807562239,DE 2807562240,2807566335,US 2807566336,2807574527,CA @@ -65678,9 +67135,7 @@ 2815988416,2815988863,US 2815988864,2815988895,GB 2815988896,2816159743,US -2816159744,2816159999,IN -2816160000,2816162815,US -2816162816,2816163839,IN +2816159744,2816163839,IN 2816163840,2816262143,US 2816262144,2816263167,IE 2816263168,2816264191,GB @@ -65706,9 +67161,10 @@ 2817061120,2817277951,US 2817277952,2817294335,NL 2817294336,2817325055,US -2817325312,2817933056,US -2817933057,2817933057,CA -2817933058,2817986303,US +2817325312,2817933055,US +2817933056,2817933311,CA +2817933312,2817933567,PR +2817933568,2817986303,US 2817986560,2818002943,US 2818002944,2818003722,GB 2818003724,2818004991,GB @@ -65759,9 +67215,7 @@ 2818229248,2818231295,BR 2818231296,2818232319,PE 2818232320,2818233343,AR -2818233344,2818234095,HN -2818234096,2818234111,IT -2818234112,2818234367,HN +2818233344,2818234367,HN 2818234368,2818235391,BR 2818235392,2818236415,GT 2818236416,2818244607,BR @@ -65779,20 +67233,22 @@ 2818620416,2818623487,BR 2818623488,2818625535,AR 2818625536,2818626559,BR -2818626560,2818626783,HN -2818626784,2818626799,BR -2818626800,2818627583,HN +2818626560,2818627583,HN 2818627584,2818628607,BR 2818628608,2818629631,MX 2818629632,2818634751,BR 2818634752,2818635775,CO 2818635776,2818637823,BR 2818637824,2818670591,AU -2818670592,2818687299,US +2818670592,2818671423,US +2818671424,2818671439,AU +2818671440,2818687299,US 2818687300,2818687303,JP 2818687304,2818688903,US 2818688904,2818688927,NL -2818688928,2822584319,US +2818688928,2818689479,US +2818689480,2818689487,AU +2818689488,2822584319,US 2822584320,2822586367,NL 2822586368,2822590463,US 2822590464,2822591629,IE @@ -65813,19 +67269,7 @@ 2822733824,2822734143,HK 2822734144,2822734159,US 2822734160,2822742015,HK -2822742016,2822742079,SG -2822742080,2822742111,US -2822742112,2822742175,SG -2822742176,2822742207,US -2822742208,2822742319,SG -2822742320,2822742335,US -2822742336,2822742687,SG -2822742688,2822742703,US -2822742704,2822742975,SG -2822742976,2822743007,US -2822743008,2822747391,SG -2822747392,2822747439,US -2822747440,2822750207,SG +2822742016,2822750207,SG 2822750208,2822758399,HK 2822758400,2822766591,SG 2822766592,2822848997,US @@ -65855,14 +67299,12 @@ 2824489984,2824492031,BR 2824492032,2824493055,AR 2824493056,2824494079,BR -2824494080,2824495103,VE -2824495104,2824495263,HN -2824495264,2824495279,DE -2824495280,2824496087,HN -2824496088,2824496095,NL -2824496096,2824496127,HN +2824494080,2824495103,CO +2824495104,2824496127,HN 2824496128,2824498175,BR -2824498176,2824499199,HN +2824498176,2824498527,HN +2824498528,2824498535,FR +2824498536,2824499199,HN 2824499200,2824503295,BR 2824503296,2824504319,AR 2824504320,2824510463,BR @@ -65935,7 +67377,9 @@ 2826978048,2826985471,ZA 2826985472,2826987519,NZ 2826987520,2826989567,GB -2826989568,2827026431,ZA +2826989568,2827024895,ZA +2827024896,2827025407,US +2827025408,2827026431,ZA 2827026432,2827091967,US 2827091968,2827157503,AU 2827157504,2827223039,KR @@ -65997,7 +67441,9 @@ 2830441472,2830445567,BR 2830445568,2830446591,AR 2830446592,2830447615,BR -2830447616,2830448639,HN +2830447616,2830447647,HN +2830447648,2830447655,US +2830447656,2830448639,HN 2830448640,2830452735,BR 2830452736,2830453759,AR 2830453760,2830454783,MX @@ -66016,7 +67462,10 @@ 2830482432,2830486527,BR 2830486528,2830488575,AR 2830488576,2830492671,BR -2830492672,2830493695,HN +2830492672,2830492895,HN +2830492896,2830492927,UY +2830492928,2830492935,US +2830492936,2830493695,HN 2830493696,2830499839,BR 2830499840,2830586879,US 2830587136,2830761983,US @@ -66257,7 +67706,9 @@ 2834030592,2834034687,CA 2834034688,2834497535,US 2834497536,2834563071,SV -2834563072,2834825215,US +2834563072,2834690047,US +2834690048,2834694143,CA +2834694144,2834825215,US 2834825216,2834956287,KR 2834956288,2835087359,US 2835087360,2835152895,AU @@ -66288,15 +67739,15 @@ 2837970944,2838036479,US 2838036480,2838233087,CH 2838233088,2838237183,GB -2838237184,2838247551,US -2838247552,2838247583,NL -2838247584,2838255167,US +2838237184,2838255167,US 2838255168,2838255199,JP 2838255200,2838260095,US 2838260096,2838260127,IE 2838260128,2838261759,US 2838261760,2838265855,GB -2838265856,2838298623,US +2838265856,2838276159,US +2838276160,2838276191,NL +2838276192,2838298623,US 2838298624,2838298655,NL 2838298656,2838298687,US 2838298688,2838298975,NL @@ -66313,7 +67764,9 @@ 2838300672,2838300927,US 2838300928,2838301119,NL 2838301120,2838301183,US -2838301184,2838301695,NL +2838301184,2838301191,NL +2838301192,2838301199,US +2838301200,2838301695,NL 2838301696,2838301951,US 2838301952,2838304127,NL 2838304128,2838304159,US @@ -66326,24 +67779,24 @@ 2838304512,2838304703,NL 2838304704,2838304767,US 2838304768,2838305119,NL -2838305120,2838305151,US -2838305152,2838305247,NL +2838305120,2838305159,US +2838305160,2838305247,NL 2838305248,2838305279,US -2838305280,2838305503,NL -2838305504,2838305535,US -2838305536,2838307055,NL +2838305280,2838307055,NL 2838307056,2838307063,US 2838307064,2838307135,NL -2838307136,2838307167,US -2838307168,2838307199,NL -2838307200,2838307231,US -2838307232,2838307295,NL +2838307136,2838307183,US +2838307184,2838307295,NL 2838307296,2838307303,US 2838307304,2838307311,NL 2838307312,2838307327,US -2838307328,2838307903,NL -2838307904,2838307967,US -2838307968,2838315023,NL +2838307328,2838307647,NL +2838307648,2838307679,US +2838307680,2838307903,NL +2838307904,2838307999,US +2838308000,2838308191,NL +2838308192,2838308223,US +2838308224,2838315023,NL 2838315024,2838315039,US 2838315040,2838315279,NL 2838315280,2838315295,US @@ -66357,9 +67810,7 @@ 2838315741,2838315741,US 2838315742,2838315799,NL 2838315800,2838315801,US -2838315802,2838315839,NL -2838315840,2838315871,US -2838315872,2838316063,NL +2838315802,2838316063,NL 2838316064,2838316079,US 2838316080,2838316591,NL 2838316592,2838316607,US @@ -66373,9 +67824,7 @@ 2838318512,2838318527,US 2838318528,2838318655,NL 2838318656,2838318687,US -2838318688,2838319135,NL -2838319136,2838319167,US -2838319168,2838320191,NL +2838318688,2838320191,NL 2838320192,2838320192,US 2838320193,2838320543,NL 2838320544,2838320551,US @@ -66390,22 +67839,24 @@ 2838323104,2838323535,NL 2838323536,2838323551,US 2838323552,2838324039,NL -2838324040,2838324047,US -2838324048,2838324063,NL +2838324040,2838324055,US +2838324056,2838324063,NL 2838324064,2838324065,US 2838324066,2838324415,NL 2838324416,2838324423,US -2838324424,2838325343,NL +2838324424,2838324735,NL +2838324736,2838324767,US +2838324768,2838325343,NL 2838325344,2838325375,US 2838325376,2838325439,NL 2838325440,2838325471,JP 2838325472,2838325983,NL 2838325984,2838326015,US -2838326016,2838327087,NL -2838327088,2838327103,US -2838327104,2838328079,NL -2838328080,2838328095,US -2838328096,2838328159,NL +2838326016,2838327623,NL +2838327624,2838327631,US +2838327632,2838328079,NL +2838328080,2838328111,US +2838328112,2838328159,NL 2838328160,2838328167,US 2838328168,2838328259,NL 2838328260,2838328260,US @@ -66425,17 +67876,19 @@ 2838331568,2838331583,US 2838331584,2838331655,NL 2838331656,2838331663,US -2838331664,2838331807,NL +2838331664,2838331711,NL +2838331712,2838331727,US +2838331728,2838331807,NL 2838331808,2838331839,US 2838331840,2838333903,NL 2838333904,2838333919,US 2838333920,2838334335,NL 2838334336,2838334351,US -2838334352,2838337279,NL +2838334352,2838337239,NL +2838337240,2838337247,US +2838337248,2838337279,NL 2838337280,2838337295,US -2838337296,2838337375,NL -2838337376,2838337407,US -2838337408,2838337759,NL +2838337296,2838337759,NL 2838337760,2838337761,IN 2838337762,2838337763,US 2838337764,2838338271,NL @@ -66467,15 +67920,15 @@ 2838341952,2838341967,US 2838341968,2838343071,NL 2838343072,2838343103,US -2838343104,2838343711,NL -2838343712,2838343743,US -2838343744,2838344451,NL +2838343104,2838344451,NL 2838344452,2838344455,US 2838344456,2838344457,NL 2838344458,2838344459,US 2838344460,2838344463,NL 2838344464,2838344479,US -2838344480,2838344919,NL +2838344480,2838344917,NL +2838344918,2838344918,US +2838344919,2838344919,NL 2838344920,2838344927,US 2838344928,2838345215,NL 2838345216,2838345231,US @@ -66494,8 +67947,10 @@ 2838346720,2838347031,NL 2838347032,2838347039,US 2838347040,2838347231,NL -2838347232,2838347271,US -2838347272,2838347487,NL +2838347232,2838347263,US +2838347264,2838347279,NL +2838347280,2838347295,US +2838347296,2838347487,NL 2838347488,2838347519,US 2838347520,2838348063,NL 2838348064,2838348079,US @@ -66517,11 +67972,11 @@ 2838350912,2838350927,US 2838350928,2838351295,NL 2838351296,2838351327,US -2838351328,2838351623,NL -2838351624,2838351631,US -2838351632,2838351711,NL +2838351328,2838351711,NL 2838351712,2838351743,CO -2838351744,2838352575,NL +2838351744,2838352143,NL +2838352144,2838352159,US +2838352160,2838352575,NL 2838352576,2838352583,US 2838352584,2838352591,NL 2838352592,2838352599,US @@ -66538,8 +67993,8 @@ 2838357384,2838358687,NL 2838358688,2838358719,US 2838358720,2838358975,NL -2838358976,2838359007,US -2838359008,2838360047,NL +2838358976,2838358991,US +2838358992,2838360047,NL 2838360048,2838360063,US 2838360064,2838360639,NL 2838360640,2838360735,US @@ -66575,7 +68030,9 @@ 2838400704,2838400735,US 2838400736,2838400895,NL 2838400896,2838400959,US -2838400960,2838401023,NL +2838400960,2838400991,NL +2838400992,2838401007,US +2838401008,2838401023,NL 2838401024,2838405119,GB 2838405120,2838405183,NL 2838405184,2838405215,US @@ -66587,17 +68044,15 @@ 2838406088,2838406095,US 2838406096,2838406271,NL 2838406272,2838406279,US -2838406280,2838406463,NL -2838406464,2838406495,US -2838406496,2838408143,NL -2838408144,2838408159,US -2838408160,2838408735,NL +2838406280,2838406959,NL +2838406960,2838406967,US +2838406968,2838408591,NL +2838408592,2838408599,US +2838408600,2838408735,NL 2838408736,2838408767,US 2838408768,2838408799,NL 2838408800,2838408831,US -2838408832,2838408863,NL -2838408864,2838408895,US -2838408896,2838409439,NL +2838408832,2838409439,NL 2838409440,2838409471,US 2838409472,2838409479,NL 2838409480,2838409503,US @@ -66609,7 +68064,14 @@ 2838410896,2838410911,US 2838410912,2838411327,NL 2838411328,2838411359,US -2838411360,2838415391,NL +2838411360,2838414207,NL +2838414208,2838414271,US +2838414272,2838414783,NL +2838414784,2838414879,US +2838414880,2838414911,JP +2838414912,2838415167,NL +2838415168,2838415183,US +2838415184,2838415391,NL 2838415392,2838415487,US 2838415488,2838415655,NL 2838415656,2838415663,US @@ -66619,9 +68081,13 @@ 2838416424,2838416431,US 2838416432,2838416479,NL 2838416480,2838416511,US -2838416512,2838418143,NL +2838416512,2838416623,NL +2838416624,2838416639,AF +2838416640,2838418143,NL 2838418144,2838418175,US -2838418176,2838429983,NL +2838418176,2838419455,NL +2838419456,2838421503,US +2838421504,2838429983,NL 2838429984,2838430015,US 2838430016,2838431039,NL 2838431040,2838431135,US @@ -66641,15 +68107,13 @@ 2838433920,2838433951,US 2838433952,2838435519,NL 2838435520,2838435551,US -2838435552,2838436031,NL -2838436032,2838436063,US -2838436064,2838436815,NL +2838435552,2838436815,NL 2838436816,2838436831,US 2838436832,2838437359,NL 2838437360,2838437361,US -2838437362,2838437631,NL -2838437632,2838437663,US -2838437664,2838438127,NL +2838437362,2838437471,NL +2838437472,2838437503,US +2838437504,2838438127,NL 2838438128,2838438135,US 2838438136,2838439935,NL 2838439936,2838439943,US @@ -66667,27 +68131,73 @@ 2838444096,2838444159,US 2838444160,2838444223,NL 2838444224,2838444255,US -2838444256,2838445695,NL -2838445696,2838445727,US -2838445728,2838445951,NL +2838444256,2838445951,NL 2838445952,2838445983,US -2838445984,2838478975,NL +2838445984,2838446079,NL +2838446080,2838446087,US +2838446088,2838446095,NL +2838446096,2838446111,US +2838446112,2838446143,NL +2838446144,2838446175,US +2838446176,2838446223,NL +2838446224,2838446239,US +2838446240,2838446319,NL +2838446320,2838446327,US +2838446328,2838446431,NL +2838446432,2838446439,US +2838446440,2838446559,NL +2838446560,2838446623,US +2838446624,2838446631,NL +2838446632,2838446639,US +2838446640,2838446783,NL +2838446784,2838446787,US +2838446788,2838446847,NL +2838446848,2838446911,US +2838446912,2838447127,NL +2838447128,2838447135,US +2838447136,2838447167,NL +2838447168,2838447183,US +2838447184,2838447335,NL +2838447336,2838447343,US +2838447344,2838447471,NL +2838447472,2838447487,US +2838447488,2838447647,NL +2838447648,2838447663,US +2838447664,2838447759,NL +2838447760,2838447775,US +2838447776,2838447887,NL +2838447888,2838447903,US +2838447904,2838448223,NL +2838448224,2838448239,US +2838448240,2838461535,NL +2838461536,2838461567,US +2838461568,2838461727,NL +2838461728,2838461759,US +2838461760,2838461823,NL +2838461824,2838461855,US +2838461856,2838461951,NL +2838461952,2838461983,US +2838461984,2838462111,NL +2838462112,2838462119,US +2838462120,2838463583,NL +2838463584,2838463615,US +2838463616,2838466063,NL +2838466064,2838466079,US +2838466080,2838478975,NL 2838478976,2838479007,US 2838479008,2838479455,NL 2838479456,2838479487,US 2838479488,2838480127,NL 2838480128,2838480159,US -2838480160,2838480223,NL -2838480224,2838480255,US -2838480256,2838480319,NL +2838480160,2838480319,NL 2838480320,2838480323,IE 2838480324,2838480335,NL 2838480336,2838480351,US -2838480352,2838481807,NL -2838481808,2838481823,US -2838481824,2838481855,NL +2838480352,2838481855,NL 2838481856,2838481887,US -2838481888,2838482959,NL +2838481888,2838482695,NL +2838482696,2838482703,US +2838482704,2838482959,NL 2838482960,2838482967,IE 2838482968,2838482975,US 2838482976,2838482991,NL @@ -66702,7 +68212,45 @@ 2838483328,2838483335,US 2838483336,2838483487,NL 2838483488,2838483519,US -2838483520,2838560767,NL +2838483520,2838484839,NL +2838484840,2838484843,US +2838484844,2838485151,NL +2838485152,2838485183,US +2838485184,2838485375,NL +2838485376,2838485407,US +2838485408,2838485695,NL +2838485696,2838485727,US +2838485728,2838486463,NL +2838486464,2838486495,US +2838486496,2838487263,NL +2838487264,2838487295,US +2838487296,2838487647,NL +2838487648,2838487679,US +2838487680,2838487743,NL +2838487744,2838487807,US +2838487808,2838489647,NL +2838489648,2838489663,US +2838489664,2838491943,NL +2838491944,2838491951,US +2838491952,2838493711,NL +2838493712,2838493727,US +2838493728,2838495359,NL +2838495360,2838495375,US +2838495376,2838526977,NL +2838526978,2838526979,US +2838526980,2838526983,NL +2838526984,2838527039,US +2838527040,2838527055,NL +2838527056,2838527071,US +2838527072,2838527223,NL +2838527224,2838527247,US +2838527248,2838527279,NL +2838527280,2838527295,US +2838527296,2838527439,NL +2838527440,2838527455,US +2838527456,2838527535,NL +2838527536,2838527551,US +2838527552,2838560767,NL 2838560768,2838626303,CH 2838626304,2838626399,US 2838626400,2838626431,SA @@ -66710,9 +68258,7 @@ 2838626576,2838626591,CN 2838626592,2838628319,US 2838628320,2838628351,DE -2838628352,2838629331,US -2838629332,2838629333,SA -2838629334,2838631367,US +2838628352,2838631367,US 2838631368,2838631375,SA 2838631376,2838631871,US 2838631872,2838631903,DE @@ -66753,7 +68299,9 @@ 2838658608,2838658623,NL 2838658624,2838659007,US 2838659008,2838659023,GB -2838659024,2838663167,US +2838659024,2838659431,US +2838659432,2838659439,GB +2838659440,2838663167,US 2838663168,2838663175,NL 2838663176,2838663807,US 2838663808,2838663809,BO @@ -66769,7 +68317,13 @@ 2838669520,2838669535,NL 2838669536,2838670623,US 2838670624,2838670655,NL -2838670656,2838708223,US +2838670656,2838676703,US +2838676704,2838676719,GB +2838676720,2838678319,US +2838678320,2838678327,GB +2838678328,2838680639,US +2838680640,2838680655,GB +2838680656,2838708223,US 2838708224,2838724607,NO 2838724608,2838757375,US 2838757376,2838822911,CH @@ -66780,9 +68334,9 @@ 2838843328,2838859777,US 2838859778,2838859779,HK 2838859780,2838865007,US -2838865008,2838865015,CZ +2838865008,2838865015,CA 2838865016,2838865019,US -2838865020,2838865023,CZ +2838865020,2838865023,CA 2838865024,2838866247,US 2838866248,2838866255,CA 2838866256,2838867855,US @@ -66815,9 +68369,7 @@ 2838931014,2838931015,CZ 2838931016,2838931016,US 2838931017,2838931023,CZ -2838931024,2838931667,US -2838931668,2838931671,CZ -2838931672,2838933919,US +2838931024,2838933919,US 2838933920,2838933951,NL 2838933952,2838938991,US 2838938992,2838939007,AU @@ -66825,25 +68377,27 @@ 2838946736,2838946751,CA 2838946752,2838957535,US 2838957536,2838957551,HK -2838957552,2838958991,US -2838958992,2838958999,CZ -2838959000,2838960815,US +2838957552,2838960815,US 2838960816,2838960819,CZ 2838960820,2838960821,US 2838960822,2838960827,CZ 2838960828,2838960829,US 2838960830,2838960831,CZ -2838960832,2838961023,US -2838961024,2838961031,CZ -2838961032,2838968671,US +2838960832,2838968671,US 2838968672,2838968687,CN 2838968688,2838969167,US 2838969168,2838969183,AF -2838969184,2838969535,US +2838969184,2838969456,US +2838969457,2838969457,HK +2838969458,2838969535,US 2838969536,2838969536,IL 2838969537,2838969587,US 2838969588,2838969588,AF -2838969589,2838969737,US +2838969589,2838969591,US +2838969592,2838969592,HK +2838969593,2838969710,US +2838969711,2838969711,HK +2838969712,2838969737,US 2838969738,2838969738,ES 2838969739,2838969828,US 2838969829,2838969829,NL @@ -66865,9 +68419,24 @@ 2838999408,2838999423,AF 2838999424,2839001263,US 2839001264,2839001279,CA -2839001280,2839010815,US -2839010816,2839010847,NL -2839010848,2839035903,US +2839001280,2839019519,US +2839019520,2839019535,CN +2839019536,2839019551,US +2839019552,2839019567,JP +2839019568,2839019583,CN +2839019584,2839019599,KR +2839019600,2839019615,JP +2839019616,2839019647,CA +2839019648,2839019663,CN +2839019664,2839019679,US +2839019680,2839019687,HK +2839019688,2839019711,JP +2839019712,2839019775,CA +2839019776,2839019791,JP +2839019792,2839019807,US +2839019808,2839019839,HK +2839019840,2839019903,CN +2839019904,2839035903,US 2839035904,2839052287,KR 2839052288,2839085055,US 2839085056,2839117823,MX @@ -67001,7 +68570,9 @@ 2852107264,2852108287,NG 2852108288,2852109311,TZ 2852109312,2852110335,CD -2852110336,2852112383,ZA +2852110336,2852111103,ZA +2852111104,2852111359,NG +2852111360,2852112383,ZA 2852112384,2852113407,KE 2852113408,2852114431,CD 2852114432,2852115455,NG @@ -67044,9 +68615,11 @@ 2855288832,2855305215,GB 2855305216,2855309311,HK 2855309312,2855469055,US -2855469056,2855484671,PY -2855484672,2855485439,AR -2855485440,2855501823,UY +2855469056,2855481343,PY +2855481344,2855483391,AR +2855483392,2855484415,PY +2855484416,2855485183,AR +2855485184,2855501823,UY 2855501824,2855534591,AR 2855534592,2855706623,US 2855706880,2856058879,US @@ -67066,7 +68639,9 @@ 2857082880,2857086975,CA 2857086976,2857140223,US 2857140224,2857140735,CA -2857140736,2857238527,US +2857140736,2857152511,US +2857152512,2857153535,HK +2857153536,2857238527,US 2857238528,2857248767,BR 2857248768,2857249791,CO 2857249792,2857250815,AR @@ -67207,7 +68782,10 @@ 2857574400,2857575423,AR 2857575424,2857579519,BR 2857579520,2857580543,AR -2857580544,2857585663,BR +2857580544,2857581055,BR +2857581056,2857581311,AR +2857581312,2857581567,CO +2857581568,2857585663,BR 2857585664,2857586687,VE 2857586688,2857593855,BR 2857593856,2857594879,AR @@ -67439,8 +69017,12 @@ 2867851264,2867852287,BR 2867852288,2867853311,AR 2867853312,2867855359,BR -2867855360,2868117503,US -2868117504,2868127743,BR +2867855360,2868057087,US +2868057088,2868058111,BR +2868058112,2868117503,US +2868117504,2868122623,BR +2868122624,2868123647,GB +2868123648,2868127743,BR 2868127744,2868128767,HN 2868128768,2868129791,BR 2868129792,2868130815,AR @@ -67470,7 +69052,10 @@ 2868178944,2868179967,HN 2868179968,2868183039,BR 2868183040,2868184063,CW -2868184064,2868193279,BR +2868184064,2868191743,BR +2868191744,2868191999,VE +2868192000,2868192255,BO +2868192256,2868193279,BR 2868193280,2868194303,HN 2868194304,2868195327,BR 2868195328,2868196351,CL @@ -67478,7 +69063,7 @@ 2868197376,2868198399,HN 2868198400,2868205567,BR 2868205568,2868206591,MX -2868206592,2868223999,BR +2868206592,2868225023,BR 2868225024,2868226047,DO 2868226048,2868227071,AR 2868227072,2868230143,BR @@ -67489,27 +69074,74 @@ 2868242432,2868243455,AR 2868243456,2868244479,BR 2868244480,2868245503,CR -2868245504,2868247551,BR -2868248576,2868253695,BR +2868245504,2868253695,BR 2868253696,2868254719,AR 2868254720,2868257791,BR 2868257792,2868259839,AR +2868259840,2868260863,BR 2868260864,2868261887,AR -2868261888,2868262911,HN +2868261888,2868263935,HN 2868263936,2868264959,BR +2868264960,2868265983,CL 2868265984,2868268031,BR +2868268032,2868268287,AR +2868268288,2868268543,VE 2868268544,2868268799,AR +2868268800,2868269055,VE 2868269056,2868270079,BR +2868270080,2868271103,EC 2868271104,2868272127,AR 2868272128,2868273151,VE -2868273152,2868277247,BR +2868273152,2868274175,BR +2868274176,2868275199,CR +2868275200,2868277247,BR 2868277248,2868278271,CO -2868281344,2868283391,BR -2868294656,2868295679,AR -2868295680,2868305919,BR -2868307968,2868310015,BR +2868278272,2868286463,BR +2868286464,2868287487,CR +2868287488,2868288511,NI +2868288512,2868289535,CR +2868289536,2868290559,TT +2868290560,2868292607,BR +2868292608,2868293631,CL +2868293632,2868295679,AR +2868295680,2868304895,BR +2868304896,2868305919,PA +2868305920,2868311039,BR 2868311040,2868312063,AR 2868312064,2868314111,BR +2868314112,2868315135,CO +2868315136,2868328447,BR +2868328448,2868329471,AR +2868329472,2868333567,BR +2868333568,2868334591,AR +2868334592,2868335615,BR +2868335616,2868336639,HN +2868336640,2868337663,AR +2868337664,2868338687,CL +2868338688,2868339711,AR +2868339712,2868344831,BR +2868344832,2868345855,AR +2868345856,2868346879,BR +2868346880,2868348927,MX +2868348928,2868349951,CL +2868349952,2868350975,AR +2868350976,2868353023,BR +2868353024,2868354047,PA +2868354048,2868355071,BR +2868355072,2868356095,BO +2868356096,2868357119,CL +2868357120,2868358143,UY +2868358144,2868360191,MX +2868360192,2868361215,BR +2868361216,2868363263,MX +2868363264,2868366335,BR +2868366336,2868367359,CL +2868367360,2868368383,BR +2868368384,2868369407,VE +2868369408,2868370431,CL +2868370432,2868371455,BZ +2868371456,2868373503,MX +2868373504,2868379647,BR 2868379648,2868380159,IN 2868380160,2868380671,BR 2868380672,2868380927,US @@ -67563,7 +69195,8 @@ 2868578816,2868579327,IN 2868579328,2868581375,US 2868581376,2868581887,IN -2868581888,2868586495,US +2868581888,2868584447,US +2868584448,2868586495,GB 2868586496,2868588543,IN 2868588544,2868591615,US 2868591616,2868592639,IN @@ -67579,9 +69212,8 @@ 2868662528,2868673023,US 2868673024,2868673279,FR 2868673280,2868673535,ZA -2868673536,2868674336,US -2868674337,2868674337,SE -2868674338,2868674559,US +2868673536,2868674303,US +2868674304,2868674559,SE 2868674560,2868682751,AU 2868682752,2868682752,US 2868682754,2868688895,US @@ -67734,14 +69366,26 @@ 2890162176,2890163199,PA 2890163200,2890164223,PT 2890164224,2890165247,TH -2890165248,2890168319,AU +2890165248,2890166271,DE +2890166272,2890168319,AU 2890168320,2890169343,CW -2890169344,2890170367,AU -2890170368,2890172415,US +2890169344,2890170367,AM +2890170368,2890171391,DJ +2890171392,2890172415,US 2890172416,2890173439,PL 2890173440,2890174463,US -2890174464,2890174719,SG -2890174720,2890956799,US +2890174464,2890175231,SG +2890175232,2890176511,US +2890176512,2890177535,RS +2890177536,2890182655,US +2890182656,2890183679,EC +2890183680,2890184703,SE +2890184704,2890185727,ZA +2890185728,2890187775,US +2890187776,2890188799,IT +2890188800,2890191871,US +2890191872,2890192895,CZ +2890192896,2890956799,US 2890956800,2890989567,AE 2890989568,2891017215,US 2891017216,2891017471,JP @@ -67754,7 +69398,11 @@ 2891059200,2891120639,US 2891251712,2891272191,US 2891272192,2891274239,CA -2891274240,2891282431,US +2891274240,2891277823,US +2891277824,2891278079,GB +2891278080,2891279103,US +2891279104,2891279359,GB +2891279360,2891282431,US 2891282432,2891283455,PR 2891283456,2891284479,CA 2891284480,2891364351,US @@ -67763,7 +69411,11 @@ 2891378688,2891380735,CA 2891380736,2891403263,US 2891403264,2891407359,CA -2891407360,2891796479,US +2891407360,2891780095,US +2891780096,2891784191,CA +2891784192,2891790335,US +2891790336,2891791359,CA +2891791360,2891796479,US 2891796480,2891800575,CA 2891800576,2891807231,US 2891807232,2891807487,GB @@ -67774,31 +69426,44 @@ 2891841792,2891842303,US 2891842304,2891843327,GB 2891843328,2891844095,US -2891844096,2891844351,FR +2891844096,2891844351,CL 2891844352,2891845119,US 2891845120,2891845631,DE 2891845632,2891845887,US 2891845888,2891846399,DE -2891846400,2891846655,CH +2891846400,2891846655,NL 2891846656,2891846911,US 2891846912,2891847167,NL 2891847168,2891848447,US -2891848448,2891848959,JP +2891848448,2891848703,JP +2891848704,2891848959,AR 2891848960,2891849215,BN 2891849216,2891850239,US 2891850240,2891850495,TH -2891850496,2891850751,SG -2891850752,2891853567,US +2891850496,2891850751,AM +2891850752,2891851263,US +2891851264,2891851519,AM +2891851520,2891853567,US 2891853568,2891853823,SG 2891853824,2891854335,US 2891854336,2891855615,NL 2891855616,2891856127,SE 2891856128,2891856383,LU -2891856384,2891857919,US +2891856384,2891856895,US +2891856896,2891857151,CU +2891857152,2891857919,US 2891857920,2891858175,ES 2891858176,2891858431,TR 2891858432,2891858687,CA -2891858688,2891862527,US +2891858688,2891859455,US +2891859456,2891859711,NO +2891859712,2891859967,AT +2891859968,2891860223,ES +2891860224,2891860479,NL +2891860480,2891860735,CH +2891860736,2891861247,GB +2891861248,2891861503,AU +2891861504,2891862527,US 2891862528,2891863039,KR 2891863040,2891863295,FR 2891863296,2891863551,AU @@ -67825,8 +69490,10 @@ 2891974656,2891976703,CA 2891976704,2891982847,US 2891982848,2891984895,CA -2891984896,2892021759,US -2892021760,2892038143,CA +2891984896,2892015615,US +2892015616,2892016639,PR +2892016640,2892017663,US +2892017664,2892038143,CA 2892038144,2892040191,US 2892040192,2892042239,CA 2892042240,2892050431,US @@ -67906,7 +69573,8 @@ 2892496896,2892505087,US 2892505088,2892513279,SG 2892513280,2892529663,JP -2892529664,2892906495,US +2892529664,2892537855,DE +2892537856,2892906495,US 2892906496,2892910591,CA 2892910592,2892943743,US 2892943744,2892943871,LR @@ -67939,7 +69607,8 @@ 2892989696,2892989951,VE 2892989952,2892990207,US 2892990208,2892990463,CA -2892990464,2892990975,IT +2892990464,2892990719,US +2892990720,2892990975,IT 2892990976,2892991231,GB 2892991232,2892991487,US 2892991488,2892991999,GB @@ -68039,9 +69708,7 @@ 2896301500,2896301500,DE 2896301501,2896429280,US 2896429281,2896429281,CA -2896429282,2896691455,US -2896691456,2896691711,BR -2896691712,2897018879,US +2896429282,2897018879,US 2897018880,2897149951,DE 2897149952,2897215487,US 2897215488,2897739775,DE @@ -68062,7 +69729,9 @@ 2899968000,2900099071,CA 2900099072,2901740455,US 2901740456,2901740463,CA -2901740464,2902200319,US +2901740464,2901751295,US +2901751296,2901751551,GB +2901751552,2902200319,US 2902200320,2902204415,CN 2902204416,2902208511,US 2902208512,2902212607,CN @@ -68086,8 +69755,7 @@ 2904817664,2904981503,US 2904981504,2905002152,NL 2905002153,2905002153,US -2905002154,2905005087,NL -2905005096,2905014271,NL +2905002154,2905014271,NL 2905014272,2905038847,IN 2905038848,2905047039,SG 2905047040,2905079807,HK @@ -68099,9 +69767,15 @@ 2905348096,2905348351,PH 2905348352,2905348863,US 2905348864,2905349119,NZ -2905349120,2905387519,US +2905349120,2905376207,US +2905376208,2905376223,GB +2905376224,2905387519,US 2905387520,2905388031,CA -2905388032,2905401855,US +2905388032,2905390879,US +2905390880,2905390895,GB +2905390896,2905391599,US +2905391600,2905391615,GB +2905391616,2905401855,US 2905401856,2905402111,CA 2905402112,2905402519,US 2905402520,2905402527,IN @@ -68124,11 +69798,16 @@ 2915106560,2915195647,US 2915195648,2915195903,CL 2915195904,2915196159,NL -2915196160,2915196927,US +2915196160,2915196415,TW +2915196416,2915196927,US 2915196928,2915197183,IE 2915197184,2915197439,US 2915197440,2915197695,FI -2915197696,2915250175,US +2915197696,2915215359,US +2915215360,2915215615,JP +2915215616,2915216127,NL +2915216128,2915216383,TW +2915216384,2915250175,US 2915250176,2915254271,CA 2915254272,2915516415,US 2915516416,2915516671,NL @@ -68173,9 +69852,7 @@ 2915894592,2915958783,US 2915958784,2916024319,CA 2916024320,2916163583,US -2916163584,2916167375,CA -2916167376,2916167383,US -2916167384,2916168159,CA +2916163584,2916168159,CA 2916168160,2916168167,US 2916168168,2916171775,CA 2916171776,2916184063,US @@ -68183,21 +69860,17 @@ 2916196352,2916253695,US 2916253696,2916286463,CA 2916286464,2916294655,US -2916294656,2916295679,IL -2916295680,2916319231,US +2916294656,2916296703,IL +2916296704,2916302847,US +2916302848,2916303359,CA +2916303360,2916303871,DE +2916303872,2916304895,US +2916304896,2916305919,GB +2916305920,2916319231,US 2916319232,2916335615,PR 2916335616,2916368383,US 2916368384,2916401151,CA -2916401152,2916401407,US -2916401408,2916402175,DE -2916402176,2916402431,US -2916402432,2916407295,DE -2916407296,2916407551,US -2916407552,2916409343,DE -2916409344,2916409599,US -2916409600,2916410879,DE -2916410880,2916411135,GB -2916411136,2916417535,DE +2916401152,2916417535,DE 2916417536,2916515839,US 2916515840,2916519935,CA 2916519936,2916581375,US @@ -68226,19 +69899,13 @@ 2917099520,2917100543,NL 2917100544,2917101567,US 2917101568,2917106175,NL -2917106176,2917106431,US -2917106432,2917106687,NL -2917106688,2917112831,US +2917106176,2917112831,US 2917112832,2917113855,NL 2917113856,2917115903,US 2917115904,2917116927,NL -2917116928,2917117951,US -2917117952,2917122047,NL -2917122048,2917167905,US +2917116928,2917167905,US 2917167906,2917167906,BZ -2917167907,2917170854,US -2917170855,2917170855,UA -2917170856,2917171199,US +2917167907,2917171199,US 2917171200,2917175295,CA 2917175296,2917195775,US 2917195776,2917203967,CA @@ -68289,9 +69956,17 @@ 2917656832,2917657087,CN 2917657088,2917660671,US 2917660672,2917661183,GB -2917661184,2917676031,US -2917676032,2917676287,CA -2917676288,2917699839,US +2917661184,2917675263,US +2917675264,2917675519,CN +2917675520,2917676031,US +2917676032,2917676287,IN +2917676288,2917687295,US +2917687296,2917687551,RO +2917687552,2917688063,US +2917688064,2917688319,RO +2917688320,2917693951,US +2917693952,2917694207,CN +2917694208,2917699839,US 2917699840,2917700351,CA 2917700352,2917700959,US 2917700960,2917700967,CN @@ -68303,7 +69978,9 @@ 2917710592,2917710847,CA 2917710848,2917713919,US 2917713920,2917714175,CA -2917714176,2917842175,US +2917714176,2917828351,US +2917828352,2917828479,IN +2917828480,2917842175,US 2917842176,2917842431,CA 2917842432,2918014975,US 2918014976,2918023167,CA @@ -68352,7 +70029,9 @@ 2918473216,2918473727,CA 2918473728,2918477823,US 2918477824,2918481919,CA -2918481920,2918502911,US +2918481920,2918498535,US +2918498536,2918498539,JP +2918498540,2918502911,US 2918502912,2918503167,SG 2918503168,2918527231,US 2918527232,2918527487,FR @@ -68431,8 +70110,8 @@ 2921512960,2921530367,US 2921530368,2921530879,DE 2921530880,2921541119,US -2921541120,2921541375,DE -2921541376,2921542143,US +2921541120,2921541631,DE +2921541632,2921542143,US 2921542144,2921542399,CA 2921542400,2921545215,US 2921545216,2921545727,DE @@ -68497,7 +70176,9 @@ 2928261712,2928261887,CA 2928261888,2928263167,US 2928263168,2928279551,CA -2928279552,2928312319,US +2928279552,2928304127,US +2928304128,2928305151,NL +2928305152,2928312319,US 2928312320,2928316415,CA 2928316416,2928320511,HK 2928320512,2928328703,US @@ -68697,7 +70378,8 @@ 2953461760,2953465855,ES 2953465856,2953466127,GB 2953466368,2953466879,GB -2953467392,2953467647,GB +2953466880,2953467135,RO +2953467392,2953467903,GB 2953467904,2953469951,BE 2953469952,2953478143,CH 2953478144,2953503551,SE @@ -68737,9 +70419,7 @@ 2954822592,2954822599,GB 2954822600,2954822927,FR 2954822928,2954822931,DE -2954822932,2954823215,FR -2954823216,2954823223,IE -2954823224,2954823259,FR +2954822932,2954823259,FR 2954823260,2954823263,GB 2954823264,2954823687,FR 2954823688,2954823695,NL @@ -68885,9 +70565,7 @@ 2954835444,2954835447,ES 2954835448,2954835451,FR 2954835452,2954835455,ES -2954835456,2954835475,FR -2954835476,2954835479,ES -2954835480,2954835511,FR +2954835456,2954835511,FR 2954835512,2954835519,ES 2954835520,2954835619,FR 2954835620,2954835620,ES @@ -69194,9 +70872,7 @@ 2954878608,2954878623,FI 2954878624,2954878695,FR 2954878696,2954878703,IE -2954878704,2954878707,FR -2954878708,2954878711,GB -2954878712,2954878855,FR +2954878704,2954878855,FR 2954878856,2954878863,IE 2954878864,2954878899,FR 2954878900,2954878903,GB @@ -69308,7 +70984,11 @@ 2956602368,2956602623,NL 2956602624,2956602879,SE 2956602880,2956603135,GB -2956603136,2956607487,RU +2956603136,2956604671,RU +2956604672,2956604927,NL +2956604928,2956605439,RU +2956605440,2956605695,DE +2956605696,2956607487,RU 2956607488,2956611583,PS 2956611584,2956613631,IT 2956613632,2956614911,GB @@ -69771,7 +71451,8 @@ 2960932864,2960933887,IR 2960933888,2960934655,GB 2960934656,2960934911,NL -2960934912,2960941055,RO +2960934912,2960936959,RO +2960936960,2960941055,KZ 2960941056,2960943103,AM 2960943104,2960945151,RO 2960945152,2960945663,GB @@ -69818,9 +71499,8 @@ 2961065216,2961065471,AU 2961065472,2961065727,SE 2961065728,2961066239,HK -2961066240,2961066751,DE -2961066752,2961067007,BG -2961067008,2961067519,DE +2961066240,2961067263,DE +2961067264,2961067519,US 2961067520,2961067775,GB 2961067776,2961068543,DE 2961068544,2961068799,NL @@ -69913,7 +71593,9 @@ 2967446016,2967446527,RO 2967446528,2967446783,IT 2967446784,2967447039,DE -2967447040,2967451647,RO +2967447040,2967450879,RO +2967450880,2967451135,US +2967451136,2967451647,RO 2967451648,2967452671,KZ 2967452672,2967453183,RO 2967453184,2967453439,GB @@ -69974,15 +71656,11 @@ 2984615936,2984935423,MX 2984935424,2984936447,AR 2984936448,2984937471,BR -2984937472,2984937607,HN -2984937608,2984937615,US -2984937616,2984938079,HN -2984938080,2984938095,US -2984938096,2984938239,HN -2984938240,2984938255,US -2984938256,2984938847,HN -2984938848,2984938863,CA -2984938864,2984939519,HN +2984937472,2984937503,HN +2984937504,2984937511,US +2984937512,2984938759,HN +2984938760,2984938767,CA +2984938768,2984939519,HN 2984939520,2984951807,BR 2984951808,2984968191,EC 2984968192,2985033727,BR @@ -70282,7 +71960,9 @@ 2988459648,2988459679,GB 2988459680,2988459687,FR 2988459688,2988459691,PL -2988459692,2988459715,FR +2988459692,2988459695,FR +2988459696,2988459699,IE +2988459700,2988459715,FR 2988459716,2988459719,FI 2988459720,2988459863,FR 2988459864,2988459867,ES @@ -70309,9 +71989,7 @@ 2988461704,2988461707,GB 2988461708,2988461799,FR 2988461800,2988461807,ES -2988461808,2988462159,FR -2988462160,2988462167,ES -2988462168,2988462331,FR +2988461808,2988462331,FR 2988462332,2988462335,ES 2988462336,2988462747,FR 2988462748,2988462751,ES @@ -70357,7 +72035,9 @@ 2988466088,2988466095,PT 2988466096,2988466098,FR 2988466099,2988466099,BE -2988466100,2988474687,FR +2988466100,2988474535,FR +2988474536,2988474543,GB +2988474544,2988474687,FR 2988474688,2988474703,FI 2988474704,2988474959,FR 2988474960,2988474975,FI @@ -70512,9 +72192,7 @@ 2988488992,2988489023,ES 2988489024,2988489167,FR 2988489168,2988489175,PT -2988489176,2988489367,FR -2988489368,2988489371,GB -2988489372,2988489375,FR +2988489176,2988489375,FR 2988489376,2988489379,ES 2988489380,2988489475,FR 2988489476,2988489479,GB @@ -70619,7 +72297,9 @@ 2988504984,2988504987,ES 2988504988,2988505151,FR 2988505152,2988505167,GB -2988505168,2988505279,FR +2988505168,2988505215,FR +2988505216,2988505247,ES +2988505248,2988505279,FR 2988505280,2988505311,ES 2988505312,2988505375,FR 2988505376,2988505391,GB @@ -70682,9 +72362,7 @@ 2988511024,2988511027,GB 2988511028,2988511747,FR 2988511748,2988511751,GB -2988511752,2988511955,FR -2988511956,2988511959,ES -2988511960,2988512127,FR +2988511752,2988512127,FR 2988512128,2988512143,ES 2988512144,2988512199,FR 2988512200,2988512207,ES @@ -70827,7 +72505,9 @@ 2988529824,2988529855,ES 2988529856,2988530047,FR 2988530048,2988530049,GB -2988530050,2988530087,FR +2988530050,2988530067,FR +2988530068,2988530071,DE +2988530072,2988530087,FR 2988530088,2988530091,NL 2988530092,2988530399,FR 2988530400,2988530403,ES @@ -70912,7 +72592,9 @@ 2988544768,2988544775,ES 2988544776,2988544799,FR 2988544800,2988544831,FI -2988544832,2988545515,FR +2988544832,2988544835,FR +2988544836,2988544843,ES +2988544844,2988545515,FR 2988545516,2988545519,GB 2988545520,2988545579,FR 2988545580,2988545583,ES @@ -71036,9 +72718,7 @@ 2988554036,2988554039,ES 2988554040,2988554239,FR 2988554240,2988554495,ES -2988554496,2988554539,FR -2988554540,2988554543,GB -2988554544,2988554815,FR +2988554496,2988554815,FR 2988554816,2988554879,GB 2988554880,2988554931,FR 2988554932,2988554935,ES @@ -71371,7 +73051,7 @@ 2997521152,2997521407,US 2997521408,2997521663,UY 2997521664,2997521919,IN -2997521920,2997522175,US +2997521920,2997522175,NL 2997522176,2997522431,GB 2997522432,2997522687,IT 2997522688,2997522943,BE @@ -71607,7 +73287,9 @@ 3000759552,3000760607,RU 3000760608,3000760623,UA 3000760624,3000762367,RU -3000762368,3001004031,RS +3000762368,3000865279,RS +3000865280,3000865791,XK +3000865792,3001004031,RS 3001004032,3001005567,XK 3001005568,3001024511,RS 3001024512,3001548799,NL @@ -71775,7 +73457,9 @@ 3002650624,3002652671,FR 3002652672,3002654719,DE 3002654720,3002656767,NL -3002656768,3002658815,RU +3002656768,3002657068,RU +3002657069,3002657069,EE +3002657070,3002658815,RU 3002658816,3002660863,DE 3002660864,3002662911,CZ 3002662912,3002664959,DE @@ -71938,43 +73622,10 @@ 3003129088,3003129343,CO 3003129344,3003129599,BO 3003129600,3003129855,HN -3003129856,3003130111,MX -3003130112,3003130367,CR -3003130368,3003130623,MX -3003130624,3003131647,CR -3003131648,3003133183,MX -3003133184,3003133695,CR -3003133696,3003134719,MX -3003134720,3003134975,CR -3003134976,3003135487,MX -3003135488,3003136255,CR -3003136256,3003137279,MX -3003137280,3003137791,CR -3003137792,3003138047,MX -3003138048,3003138559,HN -3003138560,3003139071,PA -3003139072,3003139583,HN -3003139584,3003140351,PA -3003140352,3003140607,HN -3003140608,3003141375,PA -3003141376,3003141631,HN -3003141632,3003141887,PA -3003141888,3003143679,HN -3003143680,3003144447,PA -3003144448,3003146239,HN -3003146240,3003146495,PA -3003146496,3003147007,GT -3003147008,3003147263,PA -3003147264,3003148031,GT -3003148032,3003148543,PA -3003148544,3003148799,GT -3003148800,3003149311,PA -3003149312,3003150335,GT -3003150336,3003151871,SV -3003151872,3003152383,PA -3003152384,3003152639,SV -3003152640,3003152895,PA -3003152896,3003154431,SV +3003129856,3003138047,MX +3003138048,3003146239,HN +3003146240,3003150335,CR +3003150336,3003154431,SV 3003154432,3003154687,CL 3003154688,3003154943,EC 3003154944,3003159039,AR @@ -71982,8 +73633,7 @@ 3003159296,3003160575,AR 3003160576,3003160831,CL 3003160832,3003161087,PE -3003161088,3003161343,CO -3003161344,3003161599,CL +3003161088,3003161599,CL 3003161600,3003162623,UY 3003162624,3003170815,CR 3003170816,3003171071,GT @@ -71998,9 +73648,7 @@ 3003174400,3003174911,BR 3003174912,3003179007,CR 3003179008,3003187199,AR -3003187200,3003189215,CO -3003189216,3003189247,AT -3003189248,3003252735,CO +3003187200,3003252735,CO 3003252736,3003449343,CL 3003449344,3003514879,SV 3003514880,3003645951,PE @@ -72014,57 +73662,24 @@ 3005218816,3005349887,CO 3005349888,3005480959,BR 3005480960,3005874175,AR -3005874176,3005875455,PA -3005875456,3005875711,CO -3005875712,3005879807,PA -3005879808,3005880063,CO -3005880064,3005881343,PA -3005881344,3005881599,CO -3005881600,3005883135,PA -3005883136,3005883391,CO -3005883392,3005886975,PA -3005886976,3005887487,CO -3005887488,3005887999,PA -3005888000,3005888255,CO -3005888256,3005890047,PA -3005890048,3005890303,CO -3005890304,3005890559,PA -3005890560,3005891583,CO -3005891584,3005891839,PA -3005891840,3005892095,CO -3005892096,3005893119,PA -3005893120,3005893631,CO -3005893632,3005893887,PA -3005893888,3005894911,CO -3005894912,3005895167,PA -3005895168,3005895935,CO -3005895936,3005896703,PA -3005896704,3005898495,CO -3005898496,3005898751,PA -3005898752,3005900799,CO -3005900800,3005901055,PA -3005901056,3005901311,CO -3005901312,3005901567,PA -3005901568,3005902079,CO -3005902080,3005902335,PA -3005902336,3005905407,CO -3005905408,3005905663,PA -3005905664,3005906943,CO -3005906944,3005911039,PA -3005911040,3005911295,CO -3005911296,3005911551,PA -3005911552,3005911807,CO -3005911808,3005912063,PA -3005912064,3005912575,CO -3005912576,3005912831,PA -3005912832,3005913087,CO -3005913088,3005913343,PA -3005913344,3005915135,CO +3005874176,3005898495,PA +3005898496,3005898751,CO +3005898752,3005901823,PA +3005901824,3005902335,CO +3005902336,3005902591,PA +3005902592,3005902847,CO +3005902848,3005903615,PA +3005903616,3005903871,CO +3005903872,3005905663,PA +3005905664,3005905919,CO +3005905920,3005906431,PA +3005906432,3005906687,CO +3005906688,3005914879,PA +3005914880,3005915135,CO 3005915136,3005918207,AR 3005918208,3005919231,CO 3005919232,3005923327,AR 3005923328,3005939711,BZ -3005939712,3005956095,CR 3005956096,3005960191,AR 3005960192,3005965311,PE 3005965312,3005966335,AR @@ -72073,54 +73688,24 @@ 3005972480,3005988863,CH 3005988864,3006005247,DO 3006005248,3006267391,VE -3006267392,3006267647,PA -3006267648,3006267903,NI -3006267904,3006268671,PA -3006268672,3006268927,NI -3006268928,3006271231,PA -3006271232,3006271487,NI -3006271488,3006273535,PA -3006273536,3006273791,NI -3006273792,3006275583,PA -3006275584,3006275839,NI -3006275840,3006276095,PA -3006276096,3006276351,NI -3006276352,3006277887,PA -3006277888,3006278143,NI -3006278144,3006279167,PA -3006279168,3006279423,NI -3006279424,3006283519,PA -3006283520,3006283775,NI -3006283776,3006286335,CR -3006286336,3006286847,PA -3006286848,3006287615,CR -3006287616,3006287871,PA -3006287872,3006288127,CR -3006288128,3006288383,PA -3006288384,3006289151,CR -3006289152,3006289407,PA -3006289408,3006290687,CR -3006290688,3006290943,PA -3006290944,3006291967,CR -3006291968,3006308351,PA -3006308352,3006308863,CR -3006308864,3006309631,PA -3006309632,3006310655,CR -3006310656,3006310911,PA -3006310912,3006312447,CR -3006312448,3006312703,PA -3006312704,3006315007,CR -3006315008,3006315263,PA -3006315264,3006315775,CR -3006315776,3006316031,PA -3006316032,3006316543,CR -3006316544,3006321151,PA -3006321152,3006321407,CR -3006321408,3006321663,PA -3006321664,3006324735,CR -3006324736,3006328831,PA -3006328832,3006330623,NI -3006330624,3006330879,PA +3006267392,3006286335,PA +3006286336,3006286591,CR +3006286592,3006288895,PA +3006288896,3006289151,CR +3006289152,3006291455,PA +3006291456,3006291711,CR +3006291712,3006308351,PA +3006308352,3006308607,CR +3006308608,3006314239,PA +3006314240,3006314751,CR +3006314752,3006320639,PA +3006320640,3006320895,CR +3006320896,3006323967,PA +3006323968,3006324223,CR +3006324224,3006328831,PA +3006328832,3006329343,NI +3006329344,3006330623,PA +3006330624,3006330879,NI 3006330880,3006331903,CR 3006331904,3006332927,AR 3006332928,3006349311,EC @@ -72136,27 +73721,8 @@ 3006480384,3006484479,DO 3006484480,3006488575,AR 3006488576,3006496767,CO -3006496768,3006500351,CR -3006500352,3006500607,MX -3006500608,3006506239,CR -3006506240,3006506495,MX -3006506496,3006506751,CR -3006506752,3006507007,MX -3006507008,3006507519,CR -3006507520,3006507775,MX -3006507776,3006512895,CR -3006512896,3006513151,MX -3006513152,3006513663,PA -3006513664,3006514431,CR -3006514432,3006514687,PA -3006514688,3006516479,CR -3006516480,3006516735,PA -3006516736,3006517503,CR -3006517504,3006517759,NI -3006517760,3006518527,CR -3006518528,3006519295,NI -3006519296,3006521343,CR -3006521344,3006528511,AR +3006496768,3006521343,CR +3006521344,3006527487,AR 3006528512,3006529535,BZ 3006529536,3006660607,DO 3006660608,3006791679,BR @@ -72168,7 +73734,6 @@ 3007070208,3007078399,CL 3007078400,3007082495,AR 3007082496,3007086591,BO -3007086592,3007090687,PA 3007090688,3007091199,NL 3007091200,3007092223,RU 3007092224,3007092479,VE @@ -72176,28 +73741,14 @@ 3007092736,3007094783,AR 3007094784,3007096831,CR 3007096832,3007098879,AR -3007098880,3007099463,HN -3007099464,3007099471,IN -3007099472,3007099631,HN -3007099632,3007099639,GB -3007099640,3007100055,HN -3007100056,3007100063,BR -3007100064,3007100407,HN -3007100408,3007100415,PH -3007100416,3007100647,HN -3007100648,3007100655,MX -3007100656,3007100887,HN -3007100888,3007100895,PH -3007100896,3007100927,HN +3007098880,3007100927,HN 3007100928,3007102975,AR 3007102976,3007103999,US 3007104000,3007106047,AR 3007106048,3007107071,PE 3007107072,3007108095,AR 3007108096,3007109119,TT -3007109120,3007111167,AR -3007111168,3007112191,PE -3007112192,3007115263,AR +3007109120,3007115263,AR 3007115264,3007116287,CO 3007116288,3007117311,EC 3007117312,3007122431,AR @@ -72212,13 +73763,18 @@ 3007153168,3007153183,DE 3007153184,3007153279,CL 3007153280,3007153407,US -3007153408,3007153919,DE +3007153408,3007153663,DE +3007153664,3007153679,CL +3007153680,3007153695,DE +3007153696,3007153919,CL 3007153920,3007154175,US 3007154176,3007154191,CL 3007154192,3007154207,DE 3007154208,3007154303,CL 3007154304,3007154687,US -3007154688,3007154943,DE +3007154688,3007154703,CL +3007154704,3007154719,DE +3007154720,3007154943,CL 3007154944,3007155199,US 3007155200,3007155327,DE 3007155328,3007155711,US @@ -72341,25 +73897,28 @@ 3007171856,3007171871,US 3007171872,3007171873,BR 3007171874,3007171875,CL -3007171876,3007171903,BR -3007171904,3007172095,CL +3007171876,3007172095,BR 3007172096,3007172351,US 3007172352,3007172383,FR 3007172384,3007172415,BE -3007172416,3007172607,CL +3007172416,3007172479,CL +3007172480,3007172607,BR 3007172608,3007172863,US -3007172864,3007172991,BR +3007172864,3007172991,CL 3007172992,3007173023,IS 3007173024,3007173055,NZ -3007173056,3007173119,BR +3007173056,3007173059,CL +3007173060,3007173071,BR +3007173072,3007173119,CL 3007173120,3007173375,US 3007173376,3007173407,NO 3007173408,3007173439,SE -3007173440,3007173631,BR +3007173440,3007173443,CL +3007173444,3007173491,BR +3007173492,3007173631,CL 3007173632,3007173663,NO 3007173664,3007173695,NZ -3007173696,3007173887,BR -3007173888,3007174015,US +3007173696,3007174015,BR 3007174016,3007174047,NL 3007174048,3007174079,FR 3007174080,3007174271,BR @@ -72373,10 +73932,10 @@ 3007175680,3007175935,GB 3007175936,3007175967,NZ 3007175968,3007175999,BE -3007176000,3007176319,BR +3007176000,3007176319,CL 3007176320,3007176351,SE 3007176352,3007176383,FR -3007176384,3007176447,BR +3007176384,3007176447,CL 3007176448,3007176703,US 3007176704,3007177727,IN 3007177728,3007181055,US @@ -72407,55 +73966,11 @@ 3007184128,3007184383,KW 3007184384,3007184895,BR 3007184896,3007250431,AR -3007250432,3007268095,CR -3007268096,3007268607,PA -3007268608,3007269631,CR -3007269632,3007270143,PA -3007270144,3007270911,CR -3007270912,3007271167,PA -3007271168,3007272191,CR -3007272192,3007272447,PA -3007272448,3007272959,CR -3007272960,3007273215,PA -3007273216,3007273727,CR -3007273728,3007274239,PA -3007274240,3007274751,CR -3007274752,3007275007,PA -3007275008,3007279359,CR -3007279360,3007279871,PA -3007279872,3007280639,CR -3007280640,3007280895,PA -3007280896,3007281151,CR -3007281152,3007281919,PA -3007281920,3007283199,CR -3007283200,3007284479,PA -3007284480,3007284991,CR -3007284992,3007285247,PA -3007285248,3007285759,CR -3007285760,3007286271,PA -3007286272,3007286783,CR -3007286784,3007287295,PA -3007287296,3007287551,CR -3007287552,3007288063,MX -3007288064,3007289087,CR -3007289088,3007289343,MX -3007289344,3007290367,CR -3007290368,3007290623,PA -3007290624,3007291135,CR -3007291136,3007291391,PA -3007291392,3007292415,CR -3007292416,3007292671,MX -3007292672,3007293439,CR -3007293440,3007293951,MX -3007293952,3007294207,CR -3007294208,3007294463,MX -3007294464,3007294719,CR -3007294720,3007294975,MX -3007294976,3007296255,CR -3007296256,3007296511,MX -3007296512,3007296767,CR -3007296768,3007297023,MX -3007297024,3007299583,CR +3007250432,3007284735,CR +3007284736,3007284991,PA +3007284992,3007286783,CR +3007286784,3007287039,PA +3007287040,3007299583,CR 3007299584,3007301631,PA 3007301632,3007305727,AR 3007305728,3007307775,BZ @@ -72485,7 +74000,9 @@ 3025603216,3025603231,CN 3025603232,3025603247,HK 3025603248,3025603257,CN -3025603258,3025603327,IN +3025603258,3025603259,IN +3025603260,3025603271,HK +3025603272,3025603327,IN 3025603328,3025603335,GU 3025603336,3025603583,IN 3025603584,3025603839,SG @@ -72508,13 +74025,9 @@ 3025612800,3025612815,IN 3025612816,3025612831,SG 3025612832,3025612895,IN -3025612896,3025613067,SG -3025613068,3025613071,IN -3025613072,3025613087,SG +3025612896,3025613087,SG 3025613088,3025613119,IN -3025613120,3025613175,SG -3025613176,3025613183,IN -3025613184,3025613311,SG +3025613120,3025613311,SG 3025613312,3025616895,IN 3025616896,3025617439,SG 3025617440,3025617447,IN @@ -72540,8 +74053,8 @@ 3025621760,3025622015,IN 3025622016,3025622275,SG 3025622276,3025622279,IN -3025622280,3025622351,SG -3025622352,3025623055,IN +3025622280,3025622399,SG +3025622400,3025623055,IN 3025623056,3025623103,SG 3025623104,3025623247,IN 3025623248,3025623251,HK @@ -72550,7 +74063,9 @@ 3025623552,3025623807,SG 3025623808,3025624063,IN 3025624064,3025624319,TW -3025624320,3025625343,IN +3025624320,3025624335,IN +3025624336,3025624343,HK +3025624344,3025625343,IN 3025625344,3025625375,SG 3025625376,3025625391,IN 3025625392,3025625395,CA @@ -72585,9 +74100,7 @@ 3025631776,3025631839,HK 3025631840,3025631999,IN 3025632000,3025632255,HK -3025632256,3025632427,SG -3025632428,3025632431,IN -3025632432,3025632439,SG +3025632256,3025632439,SG 3025632440,3025632447,IN 3025632448,3025632463,SG 3025632464,3025632479,HK @@ -72612,9 +74125,14 @@ 3025638028,3025638031,IN 3025638032,3025638047,HK 3025638048,3025638063,MY -3025638064,3025638279,IN -3025638280,3025638287,SG -3025638288,3025638399,IN +3025638064,3025638143,IN +3025638144,3025638175,MY +3025638176,3025638183,SG +3025638184,3025638199,IN +3025638200,3025638207,SG +3025638208,3025638279,IN +3025638280,3025638303,SG +3025638304,3025638399,IN 3025638400,3025638655,SG 3025638656,3025638783,IN 3025638784,3025638791,HK @@ -72638,11 +74156,15 @@ 3025640000,3025640191,IN 3025640192,3025640447,JP 3025640448,3025640835,MY -3025640836,3025641727,IN +3025640836,3025640839,IN +3025640840,3025640855,MY +3025640856,3025640863,IN +3025640864,3025640895,MY +3025640896,3025641727,IN 3025641728,3025641751,HK 3025641752,3025641759,IN -3025641760,3025641775,HK -3025641776,3025641983,IN +3025641760,3025641779,HK +3025641780,3025641983,IN 3025641984,3025642495,HK 3025642496,3025642751,SG 3025642752,3025647103,IN @@ -72692,9 +74214,7 @@ 3026087936,3026089983,AU 3026089984,3026092031,CN 3026092032,3026108415,MO -3026108416,3026114559,JP -3026114560,3026115583,SG -3026115584,3026116607,AU +3026108416,3026116607,JP 3026116608,3026118655,HK 3026118656,3026120703,AU 3026120704,3026124799,JP @@ -72858,7 +74378,8 @@ 3034492928,3034497023,JP 3034497024,3034499071,AU 3034499072,3034500095,HK -3034500096,3034501119,TW +3034500096,3034501118,PH +3034501119,3034501119,TW 3034501120,3034502143,VU 3034502144,3034503167,IN 3034503168,3034504191,ID @@ -72870,7 +74391,8 @@ 3035193344,3035197439,JP 3035197440,3035198463,SG 3035198464,3035198719,KR -3035198720,3035199487,HK +3035198720,3035198975,SG +3035198976,3035199487,HK 3035199488,3035200511,IN 3035200512,3035202559,AU 3035202560,3035205631,JP @@ -72923,7 +74445,8 @@ 3039395840,3039396351,US 3039396352,3039396607,NL 3039396608,3039412223,US -3039412224,3039412479,CL +3039412224,3039412351,CL +3039412352,3039412479,BR 3039412480,3039412735,SG 3039412736,3039412991,TW 3039412992,3039413503,US @@ -72935,16 +74458,15 @@ 3039415296,3039415551,US 3039415552,3039415807,BR 3039415808,3039416575,US -3039416576,3039416591,CL +3039416576,3039416591,BR 3039416592,3039416607,SG -3039416608,3039416713,CL +3039416608,3039416713,BR 3039416714,3039416715,US 3039416716,3039416719,SG -3039416720,3039416735,CL +3039416720,3039416735,BR 3039416736,3039416739,US 3039416740,3039416741,SG -3039416742,3039416831,CL -3039416832,3039417087,BR +3039416742,3039417087,BR 3039417088,3039417343,DE 3039417344,3039417599,BR 3039417600,3039417855,US @@ -72952,11 +74474,12 @@ 3039418112,3039418623,US 3039418624,3039418879,BR 3039418880,3039419135,US -3039419136,3039419583,BR +3039419136,3039419391,BR +3039419392,3039419583,CL 3039419584,3039419647,SG 3039419648,3039419839,BR 3039419840,3039419903,SG -3039419904,3039420415,BR +3039419904,3039420415,CL 3039420416,3039428607,AR 3039428608,3039559679,CL 3039559680,3039821823,AR @@ -72980,9 +74503,7 @@ 3044212736,3044245503,HN 3044245504,3044278271,BO 3044278272,3044417535,AR -3044417536,3044418047,CY -3044418048,3044421631,PA -3044421632,3044425727,CY +3044417536,3044425727,PA 3044425728,3044446207,AR 3044446208,3044450303,CO 3044450304,3044454399,CL @@ -73003,65 +74524,30 @@ 3048123392,3048126463,AR 3048126464,3048128511,ES 3048128512,3048132607,AR -3048132608,3048135935,CR -3048135936,3048136447,PA -3048136448,3048144895,CR +3048132608,3048144895,CR 3048144896,3048210431,EC 3048210432,3048275967,PE 3048275968,3048292351,AR -3048292352,3048292607,BZ -3048292608,3048292799,HN -3048292800,3048292807,ES -3048292808,3048293375,HN -3048293376,3048293599,BZ -3048293600,3048293615,ES -3048293616,3048295343,BZ -3048295344,3048295351,CA -3048295352,3048295631,BZ -3048295632,3048295647,CA -3048295648,3048297407,BZ -3048297408,3048297423,CA -3048297424,3048298687,BZ -3048298688,3048298719,US -3048298720,3048298799,BZ -3048298800,3048298807,US -3048298808,3048299487,BZ -3048299488,3048299503,BR -3048299504,3048301935,BZ -3048301936,3048301951,CA -3048301952,3048302295,BZ -3048302296,3048302303,CA -3048302304,3048302815,BZ -3048302816,3048302823,NL -3048302824,3048303303,BZ -3048303304,3048303311,NL -3048303312,3048304031,BZ -3048304032,3048304047,NL -3048304048,3048304663,BZ -3048304664,3048304671,CR -3048304672,3048304919,BZ -3048304920,3048304927,CR -3048304928,3048304999,BZ -3048305000,3048305007,CR -3048305008,3048305063,BZ -3048305064,3048305071,CR -3048305072,3048305471,BZ -3048305472,3048305487,US -3048305488,3048305503,BZ -3048305504,3048305519,US -3048305520,3048305983,BZ -3048305984,3048305991,US -3048305992,3048306671,BZ -3048306672,3048306679,US -3048306680,3048307607,BZ -3048307608,3048307615,CA -3048307616,3048307967,BZ -3048307968,3048307983,CA -3048307984,3048308103,BZ -3048308104,3048308111,CA -3048308112,3048308295,BZ -3048308296,3048308303,CR -3048308304,3048308735,BZ +3048292352,3048293271,BZ +3048293272,3048293279,ES +3048293280,3048294627,BZ +3048294628,3048294631,BR +3048294632,3048296351,BZ +3048296352,3048296383,CA +3048296384,3048296751,BZ +3048296752,3048296759,CA +3048296760,3048299599,BZ +3048299600,3048299607,BR +3048299608,3048300863,BZ +3048300864,3048300895,CA +3048300896,3048301311,BZ +3048301312,3048301343,CA +3048301344,3048301471,BZ +3048301472,3048301503,CA +3048301504,3048307743,BZ +3048307744,3048307751,CA +3048307752,3048308727,BZ +3048308728,3048308735,CR 3048308736,3048325119,BO 3048325120,3048331263,AR 3048331264,3048332287,GY @@ -73081,15 +74567,9 @@ 3049111552,3049119743,AR 3049119744,3049127935,HN 3049127936,3049193471,CL -3049193472,3049255935,PA -3049255936,3049256959,US -3049256960,3049259007,PA -3049259008,3049283583,AR -3049283584,3049291775,BZ +3049259008,3049291775,AR 3049291776,3049324543,CO -3049324544,3049362175,CR -3049362176,3049362431,NI -3049362432,3049521151,CR +3049324544,3049521151,CR 3049521152,3049586687,EC 3049586688,3049635839,PA 3049635840,3049652223,AR @@ -73112,8 +74592,7 @@ 3050700816,3050701055,BR 3050701056,3050701311,DE 3050701312,3050701327,IE -3050701328,3050701439,BR -3050701440,3050701567,US +3050701328,3050701567,BR 3050701568,3050701823,DE 3050701824,3050701839,SG 3050701840,3050702079,BR @@ -73140,7 +74619,9 @@ 3050705424,3050705663,BR 3050705664,3050705919,US 3050705920,3050705935,AU -3050705936,3050706175,BR +3050705936,3050705983,BR +3050705984,3050706047,US +3050706048,3050706175,BR 3050706176,3050706431,US 3050706432,3050706447,NL 3050706448,3050706687,BR @@ -73158,37 +74639,36 @@ 3050708496,3050708735,BR 3050708736,3050708991,US 3050708992,3050709007,AT -3050709008,3050709119,BR -3050709120,3050709247,US +3050709008,3050709247,BR 3050709248,3050709503,DE 3050709504,3050709519,TH -3050709520,3050709631,BR -3050709632,3050709759,US +3050709520,3050709759,BR 3050709760,3050710015,NL 3050710016,3050710031,ES -3050710032,3050710079,BR -3050710080,3050710527,US +3050710032,3050710271,BR +3050710272,3050710527,US 3050710528,3050710543,FR -3050710544,3050710655,BR -3050710656,3050711039,US +3050710544,3050710783,BR +3050710784,3050711039,US 3050711040,3050711055,AU 3050711056,3050711295,BR 3050711296,3050711551,US 3050711552,3050711567,EE -3050711568,3050711807,BR +3050711568,3050711615,BR +3050711616,3050711679,US +3050711680,3050711807,BR 3050711808,3050712063,US 3050712064,3050712079,FR -3050712080,3050712127,BR -3050712128,3050712575,US +3050712080,3050712319,BR +3050712320,3050712575,US 3050712576,3050712591,PL 3050712592,3050712831,BR 3050712832,3050713087,US 3050713088,3050713103,LV -3050713104,3050713343,BR -3050713344,3050713599,US +3050713104,3050713215,BR +3050713216,3050713599,US 3050713600,3050713855,NL -3050713856,3050714111,BR -3050714112,3050714367,US +3050713856,3050714367,US 3050714368,3050714623,GB 3050714624,3050714879,BR 3050714880,3050715135,ES @@ -73215,8 +74695,8 @@ 3050767888,3050768127,BR 3050768128,3050768383,US 3050768384,3050768399,AT -3050768400,3050768511,BR -3050768512,3050768895,US +3050768400,3050768639,BR +3050768640,3050768895,US 3050768896,3050768911,CZ 3050768912,3050769151,BR 3050769152,3050769407,US @@ -73233,8 +74713,8 @@ 3050770960,3050771199,BR 3050771200,3050771455,US 3050771456,3050771471,SG -3050771472,3050771583,BR -3050771584,3050771967,US +3050771472,3050771711,BR +3050771712,3050771967,US 3050771968,3050771983,EE 3050771984,3050772223,BR 3050772224,3050772479,US @@ -73276,7 +74756,19 @@ 3050778368,3050778623,US 3050778624,3050778639,TR 3050778640,3050778879,BR -3050778880,3050800383,US +3050778880,3050789375,US +3050789376,3050789503,BR +3050789504,3050789631,US +3050789632,3050789759,BR +3050789760,3050789887,US +3050789888,3050790015,BR +3050790016,3050790143,US +3050790144,3050790271,BR +3050790272,3050790399,US +3050790400,3050790527,BR +3050790528,3050790655,US +3050790656,3050790783,BR +3050790784,3050800383,US 3050800384,3050800399,AL 3050800400,3050800415,AD 3050800416,3050800431,AI @@ -73371,33 +74863,23 @@ 3050805760,3050805791,DK 3050805792,3050816255,US 3050816256,3050816511,NL -3050816512,3050829567,US +3050816512,3050827263,US +3050827264,3050827519,BR +3050827520,3050829567,US 3050829568,3050829823,UA 3050829824,3050831871,US 3050831872,3051356159,BR -3051356160,3051372543,CR -3051372544,3051372799,PA -3051372800,3051373055,CR -3051373056,3051374591,PA -3051374592,3051374847,CR -3051374848,3051375871,PA -3051375872,3051376895,CR -3051376896,3051377151,PA -3051377152,3051379455,CR -3051379456,3051379711,PA -3051379712,3051380735,CR +3051356160,3051372799,CR +3051372800,3051373055,PA +3051373056,3051380735,CR 3051380736,3051388927,AR -3051388928,3051389695,US -3051389696,3051389951,NL -3051389952,3051390719,US -3051390720,3051390975,NL -3051390976,3051394047,US -3051394048,3051394303,NL -3051394304,3051395071,US -3051395072,3051395583,NL -3051395584,3051395839,PA -3051395840,3051396351,US -3051396352,3051397119,PA +3051388928,3051389695,PA +3051389696,3051390207,NL +3051390208,3051391999,PA +3051392000,3051392255,US +3051392256,3051394559,PA +3051394560,3051395071,US +3051395072,3051397119,PA 3051397120,3051398143,CO 3051398144,3051399167,AR 3051399168,3051400191,DO @@ -73416,7 +74898,6 @@ 3051454464,3051456511,SV 3051456512,3051457535,AR 3051457536,3051460607,CL -3051460608,3051462655,AR 3051462656,3051470847,PE 3051470848,3051479039,AR 3051479040,3051487231,CU @@ -73424,29 +74905,7 @@ 3051552768,3051618303,BO 3051618304,3051880447,AR 3051880448,3051913215,CO -3051913216,3051963135,CR -3051963136,3051963391,PA -3051963392,3051964671,CR -3051964672,3051964927,PA -3051964928,3051965183,CR -3051965184,3051965439,PA -3051965440,3051965695,CR -3051965696,3051965951,PA -3051965952,3051968511,CR -3051968512,3051968767,PA -3051968768,3051969535,CR -3051969536,3051969791,PA -3051969792,3051971071,CR -3051971072,3051971327,PA -3051971328,3051971839,CR -3051971840,3051972351,PA -3051972352,3051973887,CR -3051973888,3051974143,PA -3051974144,3051974399,CR -3051974400,3051974655,PA -3051974656,3051976191,CR -3051976192,3051976447,PA -3051976448,3051983871,CR +3051913216,3051983871,CR 3051983872,3051984895,BR 3051984896,3051995135,CR 3051995136,3052011519,PE @@ -73690,8 +75149,8 @@ 3078619136,3081437183,CN 3081437184,3081502719,MY 3081502720,3081764863,CN -3081764864,3081844735,JP -3081844736,3081846783,AU +3081764864,3081842687,JP +3081842688,3081846783,AU 3081846784,3081847807,TW 3081847808,3081848831,KR 3081848832,3081850879,SG @@ -73723,21 +75182,11 @@ 3088449536,3088515071,TH 3088515072,3088629759,US 3088629760,3088633855,NL -3088633856,3088654335,US -3088654336,3088658431,NL -3088658432,3088673535,US -3088673536,3088673791,NL -3088673792,3088686591,US +3088633856,3088686591,US 3088686592,3088687103,NL 3088687104,3088701439,US 3088701440,3088702463,NL -3088702464,3088708607,US -3088708608,3088709631,NL -3088709632,3088710655,US -3088710656,3088711167,NL -3088711168,3088753919,US -3088753920,3088754175,NL -3088754176,3088785407,US +3088702464,3088785407,US 3088785408,3088786431,NL 3088786432,3088812031,US 3088812032,3088812799,NL @@ -73748,24 +75197,22 @@ 3088829952,3088830463,NL 3088830464,3088830975,US 3088830976,3088831487,NL -3088831488,3088845311,US -3088845312,3088845823,NL -3088845824,3088856063,US -3088856064,3088857599,NL +3088831488,3088856063,US +3088856064,3088856575,NL +3088856576,3088857087,US +3088857088,3088857599,NL 3088857600,3088858111,US 3088858112,3088858623,NL -3088858624,3088861695,US -3088861696,3088862719,NL -3088862720,3088863231,US +3088858624,3088863231,US 3088863232,3088863743,NL 3088863744,3088863999,US 3088864000,3088864255,NL -3088864256,3088866303,US -3088866304,3088866815,NL -3088866816,3088867839,US +3088864256,3088867839,US 3088867840,3088868351,NL 3088868352,3088868607,US -3088868608,3088870143,NL +3088868608,3088868863,NL +3088868864,3088869375,US +3088869376,3088870143,NL 3088870144,3088871423,US 3088871424,3088871935,NL 3088871936,3088880639,US @@ -73776,9 +75223,7 @@ 3088902144,3088902655,NL 3088902656,3088913663,US 3088913664,3088913919,NL -3088913920,3088924671,US -3088924672,3088925695,NL -3088925696,3088998399,US +3088913920,3088998399,US 3088998400,3089002495,NL 3089002496,3089027071,US 3089027072,3089031167,NL @@ -73788,9 +75233,7 @@ 3090292224,3090292735,NL 3090292736,3090325503,US 3090325504,3090329599,NL -3090329600,3090387455,US -3090387456,3090387711,NL -3090387712,3090387967,US +3090329600,3090387967,US 3090387968,3090388479,NL 3090388480,3090389503,US 3090389504,3090389631,CA @@ -73806,15 +75249,9 @@ 3091976192,3091980287,CA 3091980288,3092381695,US 3092381696,3092447231,TH -3092447232,3092567039,US -3092567040,3092568063,NL -3092568064,3092572671,US +3092447232,3092572671,US 3092572672,3092573183,NL -3092573184,3092578303,US -3092578304,3092582399,NL -3092582400,3092615167,US -3092615168,3092619263,NL -3092619264,3092623359,US +3092573184,3092623359,US 3092623360,3092627455,NL 3092627456,3092634367,US 3092634368,3092634623,NL @@ -73841,14 +75278,14 @@ 3092692992,3092697087,US 3092697088,3092697599,NL 3092697600,3092701183,US -3092701184,3092703231,NL -3092703232,3092704255,US +3092701184,3092702207,NL +3092702208,3092704255,US 3092704256,3092705279,NL 3092705280,3092754431,US -3092754432,3092759039,NL -3092759040,3092764671,US -3092764672,3092766719,NL -3092766720,3093168127,US +3092754432,3092758527,NL +3092758528,3092764671,US +3092764672,3092766207,NL +3092766208,3093168127,US 3093168128,3093200895,CA 3093200896,3093213183,US 3093213184,3093217279,CA @@ -73891,8 +75328,8 @@ 3096969216,3097143823,US 3097143824,3097143831,BD 3097143832,3097493503,US -3097493504,3097755647,CA -3097755648,3098095615,US +3097493504,3097772031,CA +3097772032,3098095615,US 3098095616,3098099711,CA 3098099712,3098099967,US 3098099968,3098100735,SE @@ -73918,9 +75355,11 @@ 3098181632,3098185727,CA 3098185728,3098263551,US 3098263552,3098271743,CA -3098271744,3098411007,US -3098411008,3098415103,PK -3098415104,3098435583,US +3098271744,3098428415,US +3098428416,3098428927,RU +3098428928,3098429439,SE +3098429440,3098431487,GB +3098431488,3098435583,US 3098435584,3098437631,IL 3098437632,3098476543,US 3098476544,3098492927,CA @@ -74003,12 +75442,16 @@ 3103869952,3103870207,RU 3103870208,3103870463,IR 3103870464,3103870719,MD +3103870720,3103870975,SE 3103870976,3103871231,IT 3103871232,3103871487,RU 3103871488,3103871743,SE 3103871744,3103871999,CZ 3103872000,3103872511,UA 3103872512,3103872767,FI +3103872768,3103873023,HR +3103873024,3103873279,SE +3103873280,3103873535,FR 3103916032,3103917055,CH 3103917056,3103918079,IT 3103918080,3103919103,DE @@ -74175,16 +75618,7 @@ 3104078848,3104079871,FR 3104079872,3104080895,GB 3104080896,3104081919,GR -3104081920,3104082175,DK -3104082176,3104082343,LU -3104082344,3104082431,DK -3104082432,3104082687,LU -3104082688,3104082751,DK -3104082752,3104082767,LU -3104082768,3104082799,DK -3104082800,3104082815,LU -3104082816,3104082895,DK -3104082896,3104082943,LU +3104081920,3104082943,DK 3104082944,3104083967,IT 3104083968,3104084991,RU 3104084992,3104085247,NL @@ -74557,7 +75991,8 @@ 3104457984,3104458495,DE 3104458496,3104459775,IR 3104459776,3104460799,IT -3104460800,3104462847,ES +3104460800,3104461823,ES +3104461824,3104462847,CZ 3104462848,3104463871,GB 3104463872,3104464895,DE 3104464896,3104465919,NL @@ -74589,7 +76024,11 @@ 3104495616,3104496639,JO 3104496640,3104497663,DK 3104497664,3104498687,CH -3104498688,3104500735,NL +3104498688,3104498695,NL +3104498696,3104498703,US +3104498704,3104499375,NL +3104499376,3104499391,US +3104499392,3104500735,NL 3104500736,3104501759,CZ 3104501760,3104502783,LY 3104502784,3104503807,DE @@ -74651,7 +76090,7 @@ 3104558080,3104559103,GB 3104559104,3104560127,FI 3104560128,3104561151,TR -3104561152,3104562175,FR +3104561152,3104562175,NL 3104562176,3104563199,ES 3104563200,3104564223,IT 3104564224,3104565247,RU @@ -74792,7 +76231,7 @@ 3104703488,3104704511,RU 3104704512,3104705535,IT 3104705536,3104706559,DE -3104706560,3104707583,UA +3104706560,3104707583,RU 3104707584,3104708607,TR 3104708608,3104709631,ES 3104709632,3104710655,NL @@ -74802,7 +76241,6 @@ 3104714752,3104715775,DE 3104715776,3104716799,AT 3104716800,3104717823,ES -3104717824,3104718847,GB 3104718848,3104719871,TR 3104719872,3104720895,RU 3104720896,3104721919,PL @@ -74903,7 +76341,8 @@ 3104818176,3104819199,TR 3104819200,3104820223,CH 3104820224,3104821247,GB -3104821248,3104822271,RU +3104821248,3104821503,RU +3104821504,3104822271,NL 3104822272,3104823295,FI 3104823296,3104824319,NO 3104824320,3104825343,NL @@ -75316,7 +76755,7 @@ 3105233920,3105234943,IR 3105234944,3105235967,LB 3105235968,3105236991,IT -3105236992,3105238015,GB +3105236992,3105238015,FR 3105238016,3105239039,DE 3105239040,3105240063,FR 3105240064,3105241087,CH @@ -75546,7 +76985,7 @@ 3105460224,3105461247,GB 3105461248,3105462271,PL 3105462272,3105463295,RU -3105464320,3105465343,BE +3105464320,3105465343,NL 3105465344,3105466367,DE 3105466368,3105467391,BE 3105467392,3105468415,GB @@ -75581,7 +77020,7 @@ 3105496064,3105497087,RU 3105497088,3105498111,IR 3105498112,3105499135,DE -3105499136,3105501183,RU +3105499136,3105500159,RU 3105501184,3105502207,FI 3105502208,3105503231,RU 3105503232,3105504255,NL @@ -75754,7 +77193,9 @@ 3105673216,3105674239,DE 3105674240,3105675263,GB 3105675264,3105676287,ES -3105676288,3105678335,NL +3105676288,3105677055,NL +3105677056,3105677311,US +3105677312,3105678335,NL 3105678336,3105679359,DE 3105679360,3105680383,FR 3105680384,3105681407,UA @@ -75999,7 +77440,7 @@ 3105925120,3105926143,BE 3105926144,3105927167,BA 3105927168,3105928191,IL -3105928192,3105928447,ES +3105928192,3105928447,NL 3105928448,3105929215,CZ 3105929216,3105930239,RU 3105930240,3105931263,PT @@ -76056,7 +77497,8 @@ 3105970176,3105971199,FR 3105971200,3105972223,GB 3105972224,3105973247,DK -3105973248,3105974271,US +3105973248,3105974048,US +3105974049,3105974271,NL 3105974272,3105975295,MD 3105975296,3105976319,TR 3105976320,3105977343,LB @@ -76200,7 +77642,7 @@ 3106104320,3106105343,UA 3106105344,3106106367,AE 3106106368,3106106623,US -3106106624,3106107391,BG +3106106624,3106107391,DE 3106107392,3106108415,NL 3106108416,3106110463,RU 3106110464,3106111487,GB @@ -76441,7 +77883,7 @@ 3106333696,3106334719,GB 3106334720,3106335743,NL 3106335744,3106336767,NO -3106336768,3106337791,US +3106336768,3106337791,DE 3106337792,3106338815,GB 3106338816,3106339839,PL 3106339840,3106340863,IT @@ -76715,7 +78157,8 @@ 3106592768,3106593791,LU 3106593792,3106594815,GB 3106594816,3106595839,IR -3106595840,3106596863,RU +3106595840,3106596095,EE +3106596096,3106596863,RU 3106596864,3106597887,FR 3106597888,3106598911,GB 3106598912,3106599935,ES @@ -77298,7 +78741,8 @@ 3107173376,3107174399,PL 3107174400,3107175423,DE 3107175424,3107176447,HU -3107176448,3107177471,NL +3107176448,3107176703,NL +3107176704,3107177471,GB 3107177472,3107178495,AT 3107178496,3107179519,IR 3107179520,3107180543,SA @@ -77307,7 +78751,8 @@ 3107182592,3107183615,FR 3107183616,3107184639,IQ 3107184640,3107185663,SE -3107185664,3107186687,CZ +3107185664,3107186431,US +3107186432,3107186687,GB 3107186688,3107187711,NO 3107187712,3107188735,MT 3107188736,3107189759,CZ @@ -77424,7 +78869,10 @@ 3107307520,3107308543,IT 3107308544,3107310591,RO 3107310592,3107311615,DE -3107311616,3107312639,IL +3107311616,3107311871,IL +3107311872,3107312127,US +3107312128,3107312383,FR +3107312384,3107312639,IL 3107312640,3107313663,SE 3107313664,3107315711,DE 3107315712,3107316735,GB @@ -77907,7 +79355,7 @@ 3107788800,3107789823,RU 3107789824,3107791871,DE 3107791872,3107792895,RU -3107792896,3107793919,AT +3107792896,3107793919,DE 3107793920,3107794943,TR 3107794944,3107795967,LB 3107795968,3107796991,NL @@ -78109,7 +79557,7 @@ 3108001792,3108002815,GB 3108002816,3108003839,RO 3108003840,3108004863,DE -3108004864,3108005887,GB +3108004864,3108005887,US 3108005888,3108006911,LT 3108006912,3108007935,NL 3108007936,3108008959,DE @@ -78241,7 +79689,8 @@ 3108136960,3108137215,NL 3108137216,3108137471,LU 3108137472,3108137983,NL -3108137984,3108139007,RO +3108137984,3108138495,AT +3108138496,3108139007,RO 3108139008,3108141055,GB 3108141056,3108142079,PL 3108142080,3108143103,TR @@ -78254,7 +79703,9 @@ 3108149248,3108150271,FR 3108150272,3108151295,CH 3108151296,3108152319,CY -3108152320,3108153343,GB +3108152320,3108152575,GB +3108152576,3108152831,DE +3108152832,3108153343,GB 3108153344,3108154367,NL 3108154368,3108155391,ES 3108155392,3108156415,DE @@ -78333,7 +79784,7 @@ 3108237312,3108238335,LT 3108238336,3108239359,RU 3108239360,3108240383,GB -3108240384,3108240639,CZ +3108240384,3108240639,UA 3108240640,3108240895,RU 3108240896,3108241407,CZ 3108241408,3108242431,GB @@ -78546,7 +79997,8 @@ 3108457472,3108459519,RU 3108459520,3108460543,DE 3108460544,3108461567,RS -3108461568,3108462591,DE +3108461568,3108462335,DE +3108462336,3108462591,GB 3108462592,3108463615,RU 3108463616,3108464639,GB 3108464640,3108465663,HU @@ -78728,9 +80180,8 @@ 3108647936,3108648959,FR 3108648960,3108649983,IM 3108649984,3108651007,CZ -3108651008,3108651519,DE -3108651520,3108651775,US -3108651776,3108652031,DE +3108651008,3108651775,DE +3108651776,3108652031,BG 3108652032,3108653055,CH 3108653056,3108654079,GI 3108654080,3108655103,NL @@ -78912,9 +80363,7 @@ 3108850688,3108851711,PL 3108851712,3108852039,GB 3108852040,3108852047,IT -3108852048,3108852079,GB -3108852080,3108852087,IT -3108852088,3108852735,GB +3108852048,3108852735,GB 3108852736,3108853759,IT 3108853760,3108854783,TR 3108854784,3108855807,CH @@ -78944,7 +80393,11 @@ 3108873984,3108874111,SG 3108874112,3108874239,ID 3108874240,3108875263,ES -3108875264,3108876287,GB +3108875264,3108875439,GB +3108875440,3108875447,IT +3108875448,3108875623,GB +3108875624,3108875631,IT +3108875632,3108876287,GB 3108876288,3108877311,ES 3108877312,3108878335,FR 3108878336,3108879359,ES @@ -78960,8 +80413,7 @@ 3108889600,3108893695,RU 3108893696,3108894719,FI 3108894720,3108894975,IL -3108894976,3108895231,RO -3108895232,3108895743,GB +3108894976,3108895743,US 3108895744,3108896767,AT 3108896768,3108897791,ES 3108897792,3108899839,GB @@ -79369,8 +80821,7 @@ 3109280768,3109281791,IL 3109281792,3109282815,HU 3109282816,3109283839,DE -3109283840,3109284095,PL -3109284096,3109284863,IE +3109283840,3109284863,IE 3109284864,3109285887,FR 3109285888,3109286911,RU 3109286912,3109287935,TR @@ -79517,7 +80968,8 @@ 3109430272,3109431295,IR 3109431296,3109431807,IL 3109431808,3109432319,IT -3109432320,3109433343,MT +3109432320,3109432831,HK +3109432832,3109433343,MT 3109433344,3109435391,FR 3109435392,3109436415,UA 3109436416,3109437439,SM @@ -79746,8 +81198,9 @@ 3109673216,3109673439,SE 3109673451,3109673451,NO 3109673456,3109673471,SE -3109673472,3109673695,GB +3109673472,3109673703,GB 3109673704,3109673704,IN +3109673705,3109673727,GB 3109673728,3109673983,AU 3109673984,3109675007,FR 3109675008,3109677055,DE @@ -79772,7 +81225,7 @@ 3109692416,3109693439,CH 3109693440,3109694463,AT 3109694464,3109695487,CY -3109695488,3109696511,DE +3109695488,3109696511,GB 3109696512,3109697535,DK 3109697536,3109698559,PT 3109698560,3109699071,NO @@ -79838,8 +81291,7 @@ 3109763072,3109765119,IT 3109765120,3109766143,NO 3109766144,3109767167,ES -3109767168,3109767935,UA -3109767936,3109768191,NL +3109767168,3109768191,UA 3109768192,3109769215,GB 3109769216,3109770239,AT 3109770240,3109771263,GB @@ -79856,7 +81308,7 @@ 3109783552,3109784575,ES 3109784576,3109785599,HU 3109785600,3109786623,AT -3109786624,3109787647,US +3109786624,3109787647,IT 3109787648,3109788671,NO 3109788672,3109789695,BA 3109789696,3109790719,IT @@ -79885,7 +81337,9 @@ 3109818368,3109819391,NL 3109819392,3109820415,FR 3109820416,3109820671,US -3109820672,3109821439,GB +3109820672,3109820927,GB +3109820928,3109821183,CA +3109821184,3109821439,GB 3109821440,3109822463,SY 3109822464,3109823487,RU 3109823488,3109824511,FR @@ -79942,7 +81396,8 @@ 3109877760,3109878783,PL 3109878784,3109879807,GB 3109879808,3109880319,US -3109880320,3109880831,CZ +3109880320,3109880575,CZ +3109880576,3109880831,ES 3109880832,3109881855,FR 3109881856,3109882879,AT 3109882880,3109883903,NL @@ -81079,12 +82534,13 @@ 3111024640,3111025663,AT 3111025664,3111026687,DE 3111026688,3111027967,RU -3111027968,3111028223,GB -3111028224,3111028735,UA +3111027968,3111028735,UA 3111028736,3111029759,AT 3111029760,3111031807,SK 3111031808,3111032831,NO -3111032832,3111033855,DE +3111032832,3111033343,DE +3111033344,3111033599,CH +3111033600,3111033855,DE 3111033856,3111035903,ES 3111035904,3111036927,GE 3111036928,3111037951,RU @@ -81312,7 +82768,7 @@ 3111268352,3111269375,BE 3111269376,3111270399,RO 3111270400,3111271423,NO -3111271424,3111272447,NL +3111271424,3111272447,GB 3111272448,3111273471,ES 3111273472,3111274495,SA 3111274496,3111275519,IR @@ -81391,8 +82847,7 @@ 3111343104,3111344127,GB 3111344128,3111344383,NL 3111344384,3111344639,DE -3111344640,3111344895,NL -3111344896,3111345151,US +3111344640,3111345151,US 3111345152,3111346175,RO 3111346176,3111347199,RU 3111347200,3111348223,LB @@ -81485,7 +82940,7 @@ 3111444480,3111445503,SA 3111445504,3111446527,RU 3111446528,3111447551,DE -3111447552,3111447775,GB +3111447552,3111447775,NL 3111447776,3111447807,AT 3111447808,3111448063,GB 3111448064,3111448319,BG @@ -81513,9 +82968,7 @@ 3111467008,3111469055,FR 3111469056,3111470079,EE 3111470080,3111471103,AE -3111471104,3111471359,NL -3111471360,3111471615,RO -3111471616,3111473151,NL +3111471104,3111473151,NL 3111473152,3111474175,BG 3111474176,3111475199,PL 3111475200,3111475711,SE @@ -81688,7 +83141,8 @@ 3111653120,3111653375,DK 3111653376,3111654399,RO 3111654400,3111654911,GB -3111654912,3111655423,FR +3111654912,3111655167,DE +3111655168,3111655423,FR 3111655424,3111656447,NO 3111656448,3111657471,LB 3111657472,3111658239,GB @@ -81778,7 +83232,8 @@ 3111752704,3111753727,IT 3111753728,3111754751,BG 3111754752,3111755775,IT -3111755776,3111756799,NO +3111755776,3111756543,NO +3111756544,3111756799,US 3111756800,3111757823,NL 3111757824,3111758335,NZ 3111758336,3111758591,NL @@ -81787,7 +83242,7 @@ 3111759872,3111760127,IS 3111760128,3111760383,AQ 3111760384,3111760639,GB -3111760640,3111760895,IS +3111760640,3111760895,LT 3111760896,3111761919,NL 3111761920,3111762943,SY 3111762944,3111763967,NL @@ -81994,7 +83449,7 @@ 3111990272,3111991295,FR 3111991296,3111992319,RU 3111992320,3111993343,RS -3111993344,3111994367,GB +3111993344,3111994367,US 3111994368,3111995391,IT 3111995392,3111996415,RU 3111996416,3111997439,ES @@ -82289,7 +83744,7 @@ 3112268800,3112269823,IR 3112269824,3112270847,RS 3112270848,3112271871,IR -3112271872,3112272895,RU +3112271872,3112272895,UA 3112272896,3112273919,IE 3112273920,3112274943,CZ 3112274944,3112275967,IR @@ -82942,7 +84397,9 @@ 3112973312,3112973567,SE 3112973568,3112973823,DE 3112973824,3112974079,UA -3112974080,3112974335,SE +3112974080,3112974083,HU +3112974084,3112974087,AT +3112974088,3112974335,HU 3112974336,3112975359,IR 3112975360,3112977407,ES 3112977408,3112978431,FR @@ -82955,8 +84412,7 @@ 3112984576,3112985599,AE 3112985600,3112986623,PL 3112986624,3112987647,DE -3112987648,3112988671,HU -3112988672,3112988927,AT +3112987648,3112988927,HU 3112988928,3112989183,NL 3112989184,3112989439,ES 3112989440,3112989695,AT @@ -83344,7 +84800,7 @@ 3113358336,3113359359,CZ 3113359360,3113360383,FR 3113360384,3113361407,BG -3113361408,3113362431,RO +3113361408,3113362431,US 3113362432,3113363455,DE 3113363456,3113364479,FR 3113364480,3113365503,GB @@ -83406,7 +84862,9 @@ 3113425152,3113425407,SK 3113425408,3113425919,CZ 3113425920,3113426943,KW -3113426944,3113427967,IM +3113426944,3113427455,IM +3113427456,3113427711,NL +3113427712,3113427967,IM 3113427968,3113428991,RU 3113428992,3113430015,IR 3113430016,3113431039,CZ @@ -83454,8 +84912,7 @@ 3113473024,3113473279,FR 3113473280,3113473535,GB 3113473536,3113473791,ES -3113473792,3113474047,GB -3113474048,3113475071,DE +3113473792,3113475071,DE 3113475072,3113479167,FR 3113479168,3113480191,SE 3113480192,3113481215,FR @@ -83801,7 +85258,7 @@ 3113759744,3113760767,FR 3113760768,3113761791,BE 3113761792,3113762815,ES -3113762816,3113763327,SK +3113762816,3113763327,CZ 3113763328,3113763839,US 3113763840,3113764863,VA 3113764864,3113765887,IE @@ -83889,7 +85346,10 @@ 3113853952,3113854975,US 3113854976,3113855999,ES 3113856000,3113857023,GB -3113857024,3113858047,DE +3113857024,3113857279,BR +3113857280,3113857535,MX +3113857536,3113857791,US +3113857792,3113858047,CA 3113858048,3113859071,UA 3113859072,3113860095,IR 3113860096,3113861119,NL @@ -83912,8 +85372,7 @@ 3113877504,3113878527,ES 3113878528,3113879551,US 3113879552,3113880575,ES -3113880576,3113880831,NL -3113880832,3113881599,UA +3113880576,3113881599,NL 3113881600,3113882623,RO 3113882624,3113883647,RU 3113883648,3113884671,ES @@ -83956,7 +85415,7 @@ 3113922560,3113923583,DK 3113923584,3113924607,UA 3113924608,3113925631,IR -3113925632,3113926655,KW +3113925632,3113926655,DE 3113926656,3113927679,RU 3113927680,3113928703,ES 3113928704,3113929727,RU @@ -84166,7 +85625,6 @@ 3114141696,3114142719,ES 3114142720,3114143743,DE 3114143744,3114144767,AT -3114144768,3114145791,FR 3114145792,3114146815,AT 3114146816,3114147839,IT 3114147840,3114148863,SY @@ -84210,7 +85668,7 @@ 3114173680,3114173695,GB 3114173696,3114174463,DE 3114174464,3114175231,NL -3114175232,3114175487,HU +3114175232,3114175487,US 3114175488,3114176511,IT 3114176512,3114177535,NL 3114177536,3114177775,DE @@ -84243,8 +85701,7 @@ 3114199040,3114201087,IT 3114201088,3114203135,GB 3114203136,3114203391,RO -3114203392,3114203647,NL -3114203648,3114203903,GB +3114203392,3114203903,NL 3114203904,3114204159,DE 3114204160,3114205183,ES 3114205184,3114206207,IT @@ -84404,7 +85861,10 @@ 3114359808,3114360831,PL 3114360832,3114361855,ES 3114361856,3114362879,CH -3114362880,3114363903,NL +3114362880,3114363135,NL +3114363136,3114363391,DE +3114363392,3114363647,GB +3114363648,3114363903,NL 3114363904,3114364927,TR 3114364928,3114365951,IR 3114365952,3114366975,ES @@ -84429,7 +85889,9 @@ 3114384384,3114385407,GB 3114385408,3114386431,IT 3114386432,3114387455,NL -3114387456,3114388479,US +3114387456,3114387711,JP +3114387712,3114387967,AU +3114387968,3114388479,US 3114388480,3114389503,HU 3114389504,3114390527,NL 3114390528,3114391551,SE @@ -84442,11 +85904,11 @@ 3114397696,3114398719,CZ 3114398720,3114399743,AT 3114399744,3114400767,GB -3114400768,3114401023,SK -3114401024,3114401791,CZ +3114400768,3114401791,CZ 3114401792,3114402815,HU 3114402816,3114403839,CZ -3114403840,3114404863,BG +3114403840,3114404351,NL +3114404352,3114404863,BG 3114404864,3114405887,RU 3114405888,3114406911,CY 3114406912,3114407935,UA @@ -84477,9 +85939,7 @@ 3114421248,3114422271,SK 3114422272,3114423295,FR 3114423296,3114424319,MD -3114424320,3114424575,NL -3114424576,3114424831,GB -3114424832,3114425343,NL +3114424320,3114425343,NL 3114425344,3114426367,RU 3114426368,3114427391,PL 3114427392,3114428415,GB @@ -84543,7 +86003,8 @@ 3114488832,3114489855,SE 3114489856,3114490879,IR 3114490880,3114491903,CH -3114491904,3114492927,GB +3114491904,3114492159,US +3114492160,3114492927,GB 3114492928,3114493951,NL 3114493952,3114495999,RO 3114496000,3114497023,DE @@ -84832,7 +86293,7 @@ 3114782720,3114783743,CZ 3114783744,3114784767,PL 3114784768,3114785023,RU -3114785024,3114785279,BZ +3114785024,3114785279,EE 3114785280,3114785791,RU 3114785792,3114786815,FR 3114786816,3114787839,RU @@ -84909,10 +86370,10 @@ 3114862592,3114863615,AT 3114863616,3114864639,DK 3114864640,3114865663,UA -3114865664,3114866687,US +3114865664,3114866687,IR 3114866688,3114867711,IT 3114867712,3114869759,GB -3114869760,3114870783,US +3114869760,3114870783,IR 3114870784,3114871807,SE 3114871808,3114872831,IT 3114872832,3114873855,MD @@ -84958,16 +86419,17 @@ 3114915840,3114916863,RU 3114916864,3114917887,LB 3114917888,3114918911,IT -3114918912,3114919423,CH -3114919424,3114919679,UA -3114919680,3114919935,CH +3114918912,3114919935,CH 3114919936,3114920703,GB 3114920704,3114920959,NL 3114920960,3114921983,IT 3114921984,3114923007,CH 3114923008,3114924031,GB 3114924032,3114925055,HU -3114925056,3114926079,DE +3114925056,3114925311,US +3114925312,3114925567,DE +3114925568,3114925823,US +3114925824,3114926079,DE 3114926080,3114927103,RU 3114927104,3114928127,NL 3114928128,3114929151,GB @@ -85096,7 +86558,7 @@ 3115058176,3115059199,BE 3115059200,3115060223,DE 3115060224,3115062271,FR -3115062272,3115063295,GB +3115062272,3115063295,US 3115063296,3115064319,EE 3115064320,3115066367,MD 3115066368,3115067391,NL @@ -85129,10 +86591,13 @@ 3115092992,3115094015,IT 3115094016,3115094527,DE 3115094528,3115095039,NL -3115095040,3115096063,DE +3115095040,3115095551,DE +3115095552,3115096063,CH 3115096064,3115097087,FR 3115097088,3115098111,LT -3115098112,3115100159,NL +3115098112,3115099391,NL +3115099392,3115099647,US +3115099648,3115100159,NL 3115100160,3115101183,ES 3115101184,3115102207,GB 3115102208,3115103231,ES @@ -85206,9 +86671,9 @@ 3115176960,3115177983,IT 3115177984,3115179007,NL 3115179008,3115180031,SE -3115180032,3115180799,DE -3115180800,3115181055,MT -3115181056,3115182079,DE +3115180032,3115180543,DE +3115180544,3115180799,CY +3115180800,3115182079,DE 3115182080,3115183103,NL 3115183104,3115184127,IT 3115184128,3115185151,DE @@ -85222,7 +86687,8 @@ 3115192320,3115193343,HU 3115193344,3115194367,TR 3115194368,3115195391,FI -3115195392,3115196415,DE +3115195392,3115195647,TR +3115195648,3115196415,DE 3115196416,3115197439,LI 3115197440,3115198463,DE 3115198464,3115199487,NL @@ -85240,7 +86706,7 @@ 3115210752,3115211775,FR 3115211776,3115212799,CZ 3115212800,3115213823,GE -3115213824,3115214847,UA +3115213824,3115214847,US 3115214848,3115215871,CH 3115215872,3115216895,GB 3115216896,3115217919,PL @@ -85319,7 +86785,8 @@ 3115290624,3115291647,GB 3115291648,3115292671,FR 3115292672,3115293695,GB -3115293696,3115294719,RU +3115293696,3115294463,RU +3115294464,3115294719,IN 3115294720,3115295743,GB 3115295744,3115296767,NL 3115296768,3115297791,IE @@ -85389,7 +86856,7 @@ 3115366400,3115367423,SE 3115367424,3115368447,ES 3115368448,3115369471,BG -3115369472,3115370495,GB +3115369472,3115370495,MT 3115370496,3115371519,IT 3115371520,3115372543,GB 3115372544,3115373567,LB @@ -85401,19 +86868,22 @@ 3115378688,3115379711,FR 3115379712,3115380735,CH 3115380736,3115381759,GB -3115381760,3115382783,NO +3115381760,3115382271,NO +3115382272,3115382783,SE 3115382784,3115383807,GB 3115383808,3115384831,DE 3115384832,3115385855,TJ 3115385856,3115387903,SK 3115387904,3115388927,MK 3115388928,3115389951,AT -3115389952,3115391999,GB +3115389952,3115390719,GB +3115390720,3115390975,NL +3115390976,3115391999,GB 3115392000,3115393023,AL 3115393024,3115395071,IT 3115395072,3115396095,ES 3115396096,3115397119,FR -3115397120,3115398143,GB +3115397120,3115398143,MT 3115398144,3115399167,RU 3115399168,3115400191,BG 3115400192,3115401215,RU @@ -85460,7 +86930,7 @@ 3115441152,3115442175,NL 3115442176,3115443199,FR 3115443200,3115444223,GB -3115444224,3115445247,US +3115444224,3115445247,IR 3115445248,3115446271,RU 3115446272,3115447295,UA 3115447296,3115448319,IT @@ -85592,7 +87062,8 @@ 3115582464,3115583487,GB 3115583488,3115584511,NL 3115584512,3115584767,AT -3115584768,3115585535,CZ +3115584768,3115585023,US +3115585024,3115585535,CZ 3115585536,3115586559,RU 3115586560,3115587583,CH 3115587584,3115588607,DE @@ -85640,8 +87111,7 @@ 3115628544,3115629567,GB 3115629568,3115630591,RU 3115630592,3115631615,GB -3115631616,3115631871,US -3115631872,3115632639,NL +3115631616,3115632639,US 3115632640,3115633663,RU 3115633664,3115635711,PL 3115635712,3115636735,RU @@ -85713,7 +87183,7 @@ 3115708416,3115709439,RO 3115709440,3115710463,RU 3115710464,3115711487,GE -3115711488,3115714559,BG +3115711488,3115714559,ES 3115714560,3115715583,GB 3115715584,3115717631,RU 3115717632,3115718655,UA @@ -85801,8 +87271,7 @@ 3115801600,3115802623,LB 3115802624,3115802879,NL 3115802880,3115803135,RO -3115803136,3115803391,NL -3115803392,3115803647,RO +3115803136,3115803647,NL 3115803648,3115804671,GB 3115804672,3115804927,CH 3115804928,3115805183,IT @@ -85871,8 +87340,7 @@ 3115869184,3115870207,DE 3115870208,3115871231,SY 3115871232,3115872255,NL -3115872256,3115872511,PL -3115872512,3115873279,GB +3115872256,3115873279,GB 3115873280,3115874303,CH 3115874304,3115875327,GB 3115875328,3115876351,PL @@ -85889,7 +87357,9 @@ 3115886592,3115887615,UA 3115887616,3115888639,ES 3115888640,3115889663,CH -3115889664,3115890687,PL +3115889664,3115889919,PL +3115889920,3115890175,CZ +3115890176,3115890687,PL 3115890688,3115891711,FR 3115891712,3115892735,NL 3115892736,3115893759,GB @@ -85971,7 +87441,8 @@ 3115973632,3115974655,UA 3115974656,3115975679,RU 3115975680,3115976703,GB -3115976704,3115977727,NL +3115976704,3115977215,US +3115977216,3115977727,NL 3115977728,3115978751,IT 3115978752,3115980799,PL 3115980800,3115981823,DE @@ -86092,8 +87563,7 @@ 3116103680,3116104703,HU 3116104704,3116105727,SE 3116105728,3116106751,DE -3116106752,3116107007,US -3116107008,3116107263,JP +3116106752,3116107263,US 3116107264,3116107775,DE 3116107776,3116108799,ES 3116108800,3116109823,RU @@ -86105,7 +87575,9 @@ 3116114944,3116115967,TR 3116115968,3116116991,NL 3116116992,3116118015,CH -3116118016,3116120063,DE +3116118016,3116119039,DE +3116119040,3116119295,AT +3116119296,3116120063,DE 3116120064,3116121087,HU 3116121088,3116122111,GB 3116122112,3116123135,DE @@ -86140,10 +87612,546 @@ 3116153856,3116154879,SK 3116154880,3116155903,RU 3116155904,3116156927,CH +3116156928,3116157951,DE +3116157952,3116158975,RU +3116158976,3116161023,ES +3116161024,3116162047,AL +3116162048,3116163071,GB +3116163072,3116164095,SE +3116164096,3116165119,BG +3116165120,3116166143,GB +3116166144,3116167167,SK +3116167168,3116170239,DE +3116170240,3116171263,GB +3116171264,3116172287,DE +3116172288,3116173311,CZ +3116173312,3116174335,NL +3116174336,3116176383,RU +3116176384,3116177407,FR +3116177408,3116178431,DE +3116178432,3116179455,SE +3116179456,3116180479,CZ +3116180480,3116181503,RO +3116181504,3116182527,GB +3116182528,3116183551,RO +3116183552,3116184575,SE +3116184576,3116185599,TR +3116185600,3116186623,GB +3116186624,3116187647,IT +3116187648,3116188671,ES +3116188672,3116189695,MD +3116189696,3116190719,NL +3116190720,3116191743,IT +3116191744,3116192767,AT +3116192768,3116193791,SE +3116193792,3116194815,LB +3116194816,3116195839,CZ +3116195840,3116196863,DE +3116196864,3116197887,RU +3116197888,3116198911,NL +3116198912,3116199935,ES +3116199936,3116200191,DE +3116200192,3116200447,FR +3116200448,3116200703,HU +3116200704,3116200959,CZ +3116200960,3116201983,DE +3116201984,3116203007,IR +3116203008,3116204031,PL +3116204032,3116205055,TR +3116205056,3116206079,RU +3116206080,3116207103,PL +3116207104,3116208127,UA +3116208128,3116209151,GB +3116209152,3116210175,CH +3116210176,3116211199,LT +3116211200,3116212223,FR +3116212224,3116213247,NL +3116213248,3116214271,RU +3116214272,3116215295,RO +3116215296,3116216319,FR +3116216320,3116217343,ES +3116217344,3116218367,NL +3116218368,3116219391,UA +3116219392,3116220415,FR +3116220416,3116221439,RU +3116221440,3116222463,BG +3116222464,3116223487,GB +3116223488,3116224511,PL +3116224512,3116225535,GE +3116225536,3116226559,PL +3116226560,3116227583,GE +3116227584,3116228607,DE +3116228608,3116229631,ES +3116229632,3116230655,DE +3116230656,3116231679,GB +3116231680,3116232703,FR +3116232704,3116233727,NL +3116233728,3116234751,UA +3116234752,3116235775,GB +3116235776,3116238847,RU +3116238848,3116239871,UA +3116239872,3116240895,IE +3116240896,3116241151,NL +3116241152,3116241407,FR +3116241408,3116241919,TR +3116241920,3116242943,IR +3116242944,3116243967,NL +3116243968,3116244991,LB +3116244992,3116246015,CH +3116246016,3116247039,BG +3116247040,3116248063,RU +3116248064,3116249087,GB +3116249088,3116249343,AT +3116249344,3116249599,DE +3116249600,3116249855,CH +3116249856,3116250111,AT +3116250112,3116251135,DE +3116251136,3116252159,GB +3116252160,3116253183,MD +3116253184,3116254207,NL +3116254208,3116255231,DE +3116255232,3116256255,GB +3116256256,3116257279,AT +3116257280,3116257535,CR +3116257536,3116258303,AT +3116258304,3116259327,NL +3116259328,3116260351,FR +3116260352,3116260607,CN +3116260608,3116261375,NL +3116261376,3116262399,BG +3116262400,3116263423,ES +3116263424,3116264447,RU +3116264448,3116265471,NL +3116265472,3116266495,CZ +3116266496,3116268543,RU +3116268544,3116269567,DE +3116269568,3116270591,GB +3116270592,3116271615,AL +3116271616,3116272639,IT +3116272640,3116273663,DE +3116273664,3116274687,SE +3116274688,3116275711,UA +3116275712,3116276735,RS +3116276736,3116277759,DE +3116277760,3116278783,IT +3116278784,3116279807,RU +3116279808,3116281855,NO +3116281856,3116282879,ES +3116282880,3116285951,RU +3116285952,3116286975,DE +3116286976,3116287999,GB +3116288000,3116290047,IE +3116290048,3116291071,IT +3116291072,3116291327,RO +3116291328,3116294143,IT +3116294144,3116295167,US +3116295168,3116297215,NL +3116297216,3116298239,DE +3116298240,3116299263,ES +3116299264,3116300287,CH +3116300288,3116301311,CZ +3116301312,3116302335,ES +3116302336,3116303359,NL +3116303360,3116304383,PT +3116304384,3116305407,ES +3116305408,3116306431,NL +3116306432,3116307455,EE +3116307456,3116308479,ES +3116308480,3116309503,NO +3116309504,3116310527,KZ +3116310528,3116311551,RU +3116311552,3116312575,FR +3116312576,3116314623,ES +3116314624,3116315647,FR +3116315648,3116316671,TJ +3116316672,3116317695,RU +3116317696,3116318719,IT +3116318720,3116319743,ES +3116319744,3116320767,CH +3116320768,3116321791,NL +3116321792,3116322815,IR +3116322816,3116323839,UA +3116323840,3116324863,GB +3116324864,3116325887,ES +3116325888,3116326911,FR +3116326912,3116327935,IT +3116327936,3116328959,NL +3116328960,3116329983,IT +3116329984,3116331007,DE +3116331008,3116332031,UA +3116332032,3116333055,RO +3116333056,3116334079,DE +3116334080,3116335103,NL +3116335104,3116336127,BE +3116336128,3116337151,NL +3116337152,3116338175,SA +3116338176,3116339199,RU +3116339200,3116340223,CH +3116340224,3116341247,UA +3116341248,3116342271,FR +3116342272,3116343295,IE +3116343296,3116344319,GB +3116344320,3116345343,AL +3116345344,3116346367,MD +3116346368,3116347391,DE +3116347392,3116348415,UA +3116348416,3116349439,IT +3116349440,3116350463,CZ +3116350464,3116351487,HU +3116351488,3116352511,FI +3116352512,3116353535,RU +3116353536,3116354559,FR +3116354560,3116355583,IL +3116355584,3116356607,GB +3116356608,3116357631,RU +3116357632,3116358655,DE +3116358656,3116359679,GE +3116359680,3116360703,DE +3116360704,3116361727,US +3116361728,3116362751,IS +3116362752,3116363775,CH +3116363776,3116364799,NL +3116364800,3116365823,PL +3116365824,3116367871,ES +3116367872,3116368895,NL +3116368896,3116369919,GI +3116369920,3116370943,IR +3116370944,3116371967,FI +3116371968,3116372991,NL +3116372992,3116374015,RU +3116374016,3116375039,FI +3116375040,3116376063,DE +3116376064,3116377087,BE +3116377088,3116378111,DE +3116378112,3116379135,GB +3116379136,3116380159,BE +3116380160,3116381183,DE +3116381184,3116382207,LB +3116382208,3116382719,RU +3116382720,3116382975,AQ +3116382976,3116384255,RU +3116384256,3116385279,DE +3116385280,3116386047,US +3116386048,3116386303,GB +3116386304,3116387327,ES +3116387328,3116388351,DE +3116388352,3116389375,GB +3116389376,3116390399,BG +3116390400,3116391423,IE +3116391424,3116392447,GB +3116392448,3116393471,DE +3116393472,3116394495,PL +3116394496,3116395519,NL +3116395520,3116396543,RU +3116396544,3116397567,IR +3116397568,3116398591,ES +3116398592,3116399615,RO +3116399616,3116400639,NL +3116400640,3116401663,FI +3116401664,3116402687,NL +3116402688,3116403711,IT +3116403712,3116404735,DE +3116404736,3116405759,NL +3116405760,3116406783,FR +3116406784,3116407807,IE +3116407808,3116408831,RU +3116408832,3116409855,LB +3116409856,3116410879,GB +3116410880,3116412927,DE +3116412928,3116413951,GB +3116413952,3116414975,ES +3116414976,3116415231,NL +3116415232,3116415999,BE +3116416000,3116417023,NL +3116417024,3116418047,CH +3116418048,3116419071,FI +3116419072,3116420095,DE +3116420096,3116421119,BE +3116421120,3116422143,ES +3116422144,3116423167,NL +3116423168,3116424191,UA +3116424192,3116425215,ES +3116425216,3116426239,AT +3116426240,3116427263,GB +3116427264,3116428287,NO +3116428288,3116429311,KW +3116429312,3116430335,PL +3116430336,3116431359,RU +3116431360,3116432383,UA +3116432384,3116433407,HU +3116433408,3116434431,ES +3116434432,3116435455,TR +3116435456,3116436479,ES +3116436480,3116437503,AM +3116437504,3116439551,RU +3116439552,3116440575,LT +3116440576,3116441599,MD +3116441600,3116443135,GB +3116443136,3116443391,FR +3116443392,3116443647,AT +3116443648,3116444671,DE +3116444672,3116445695,FR +3116445696,3116447743,RO +3116447744,3116448767,BG +3116448768,3116449791,EE +3116449792,3116450815,DE +3116450816,3116451839,ES +3116451840,3116452863,NL +3116452864,3116453887,FI +3116453888,3116454911,DE +3116454912,3116455935,CZ +3116455936,3116456959,RU +3116456960,3116457983,NO +3116457984,3116459007,MD +3116459008,3116460031,CZ +3116460032,3116461055,ES +3116461056,3116462079,FR +3116462080,3116464127,PL +3116464128,3116465151,DK +3116465152,3116466175,SE +3116466176,3116467199,CZ +3116467200,3116468223,AZ +3116468224,3116470271,RU +3116470272,3116471295,DE +3116471296,3116472319,GB +3116472320,3116473343,AE +3116473344,3116474367,GB +3116474368,3116475391,PL +3116475392,3116476415,TR +3116476416,3116477439,GB +3116477440,3116478463,ES +3116478464,3116479487,JO +3116479488,3116480511,CH +3116480512,3116481535,NL +3116481536,3116482559,IT +3116482560,3116483583,AT +3116483584,3116484607,RU +3116484608,3116485631,ES +3116485632,3116486655,RU +3116486656,3116488703,IR +3116488704,3116489727,NL +3116489728,3116490751,HU +3116490752,3116491775,CH +3116491776,3116492799,DE +3116492800,3116493823,IR +3116493824,3116494847,DK +3116494848,3116495871,NL +3116495872,3116496895,CH +3116496896,3116497919,RU +3116497920,3116498943,IT +3116498944,3116499967,NL +3116499968,3116500991,IT +3116500992,3116502015,IQ +3116502016,3116504063,NL +3116504064,3116505087,AT +3116505088,3116507135,ES +3116507136,3116508159,RU +3116508160,3116509183,DE +3116509184,3116510207,GB +3116510208,3116511231,CZ +3116511232,3116515327,ES +3116515328,3116516351,UA +3116516352,3116517375,CZ +3116517376,3116518399,SY +3116518400,3116519423,IR +3116519424,3116520447,RU +3116520448,3116521471,BE +3116521472,3116522495,GB +3116522496,3116523519,LU +3116523520,3116524543,TR +3116524544,3116525567,ES +3116525568,3116526591,RU +3116526592,3116527615,ES +3116527616,3116528639,GB +3116528640,3116529663,NL +3116529664,3116530687,UA +3116530688,3116531711,SY +3116531712,3116532735,FR +3116532736,3116533759,SA +3116533760,3116534783,NL +3116534784,3116535807,DE +3116535808,3116536831,AT +3116536832,3116537855,DE +3116537856,3116538879,LB +3116538880,3116539903,FR +3116539904,3116540927,NL +3116540928,3116541951,FR +3116541952,3116542975,GB +3116542976,3116543999,TR +3116544000,3116545023,ES +3116545024,3116546047,CH +3116546048,3116547071,FR +3116547072,3116548095,UA +3116548096,3116549119,NL +3116549120,3116550143,TJ +3116550144,3116551167,IT +3116551168,3116552191,FR +3116552192,3116553215,ES +3116553216,3116554239,PL +3116554240,3116555263,DE +3116555264,3116557311,PL +3116557312,3116558335,NL +3116558336,3116559359,FR +3116559360,3116560383,DE +3116560384,3116561407,IL +3116561408,3116562431,IR +3116562432,3116563455,NL +3116563456,3116564479,GB +3116564480,3116565503,DK +3116565504,3116566527,MD +3116566528,3116567551,UA +3116567552,3116568575,GB +3116568576,3116569599,RO +3116569600,3116570623,EE +3116570624,3116571647,RU +3116571648,3116572671,BE +3116572672,3116573695,SA +3116573696,3116574719,ES +3116574720,3116575743,UA +3116575744,3116576767,ES +3116576768,3116577791,TR +3116577792,3116578815,HU +3116578816,3116579839,GB +3116579840,3116580863,AT +3116580864,3116581887,RO +3116581888,3116582911,CH +3116582912,3116583935,IR +3116583936,3116584959,TR +3116584960,3116587007,CZ +3116587008,3116588031,FR +3116588032,3116589055,SE +3116589056,3116590079,ES +3116590080,3116591103,DE +3116591104,3116592127,GB +3116592128,3116593151,ES +3116593152,3116594175,DE +3116594176,3116595199,GB +3116595200,3116596223,DK +3116596224,3116597247,GB +3116597248,3116598271,IT +3116598272,3116599295,GB +3116599296,3116600319,BE +3116600320,3116601343,NO +3116601344,3116602367,RU +3116602368,3116603391,DE +3116603392,3116604415,RU +3116604416,3116605439,SI +3116605440,3116606463,MD +3116606464,3116607487,GB +3116607488,3116608511,RU +3116608512,3116609535,DK +3116609536,3116610559,ES +3116610560,3116611583,DE +3116611584,3116612607,MD +3116612608,3116613631,RU +3116613632,3116614655,PL +3116614656,3116615679,CH +3116615680,3116616703,GB +3116616704,3116617727,ES +3116617728,3116618751,NO +3116618752,3116619775,NL +3116619776,3116620799,DE +3116620800,3116621823,NL +3116621824,3116622847,CZ +3116622848,3116623871,TR +3116623872,3116624895,SE +3116624896,3116625663,GL +3116625664,3116625919,NZ +3116625920,3116626943,RU +3116626944,3116627967,NL +3116627968,3116628991,FR +3116628992,3116630015,TR +3116630016,3116631039,UA +3116631040,3116632063,FI +3116632064,3116633087,CH +3116633088,3116634111,RO +3116634112,3116635135,ES +3116635136,3116636159,DE +3116636160,3116637183,US +3116637184,3116638207,NL +3116638208,3116639231,ES +3116639232,3116640255,SE +3116640256,3116641279,ES +3116641280,3116642303,NL +3116642304,3116643327,IT +3116643328,3116644351,HU +3116644352,3116645375,ES +3116645376,3116646399,NL +3116646400,3116647423,ES +3116647424,3116648447,UA +3116648448,3116649471,FR +3116649472,3116650495,DK +3116650496,3116651519,GB +3116651520,3116652543,CH +3116652544,3116653567,NO +3116653568,3116654591,NL +3116654592,3116656639,GB +3116656640,3116657663,CH +3116657664,3116658687,DE +3116658688,3116659711,ES +3116659712,3116660735,RU +3116660736,3116661759,DE +3116661760,3116662783,UA +3116662784,3116663807,CH +3116663808,3116664831,GB +3116664832,3116665855,CH +3116665856,3116667903,SY +3116667904,3116668927,IR +3116668928,3116669951,SE +3116669952,3116670975,AT +3116670976,3116673023,IT +3116673024,3116674047,RU +3116674048,3116675071,NL +3116675072,3116676095,AT +3116676096,3116677119,AL +3116677120,3116678143,RU +3116678144,3116679167,NL +3116679168,3116681215,MD +3116681216,3116682239,ES +3116682240,3116684287,GB +3116684288,3116686335,UZ +3116686336,3116687359,BZ +3116687360,3116688383,DE +3116688384,3116689407,PL +3116689408,3116690431,FI +3116690432,3116691455,RU +3116691456,3116692479,AT +3116692480,3116693503,RU +3116693504,3116696575,ES +3116696576,3116697599,MK +3116697600,3116698623,IT +3116698624,3116699647,RU +3116699648,3116700671,NL +3116700672,3116701695,SY +3116701696,3116702719,NL +3116702720,3116703743,DE +3116703744,3116704767,RU +3116704768,3116705791,BE +3116705792,3116706815,CH +3116706816,3116707839,AT +3116707840,3116708863,ES +3116708864,3116711935,GB +3116711936,3116712959,ES +3116712960,3116713983,IR +3116713984,3116715007,RU +3116715008,3116716031,ES +3116716032,3116717055,NL +3116717056,3116718079,FR +3116718080,3116719103,ES +3116719104,3116720127,SE +3116720128,3116721151,LU +3116721152,3116724223,FR +3116724224,3116725247,IR +3116725248,3116726271,NO +3116726272,3116727295,MD +3116727296,3116728319,TR +3116728320,3116729343,IT +3116729344,3116730367,CH +3116730368,3116731391,DK +3116731392,3116732415,IT 3117416448,3117417471,FR 3120562176,3120594943,CO 3120594944,3120599039,AR -3120599040,3120601087,EC 3120601088,3120602111,AR 3120602112,3120603135,BO 3120603136,3120610303,AR @@ -86160,29 +88168,22 @@ 3120691200,3120693247,CO 3120693248,3120726015,BO 3120726016,3120734207,HN -3120734208,3120735487,RU +3120734208,3120735487,BZ 3120735488,3120735743,NL -3120735744,3120735999,BZ -3120736000,3120736255,RU -3120736256,3120736511,EC -3120736512,3120736767,BZ +3120735744,3120736767,BZ 3120736768,3120737023,RU -3120737024,3120737279,BZ -3120737280,3120737535,RU -3120737536,3120738303,BZ +3120737024,3120737791,BZ +3120737792,3120738303,EC 3120738304,3120742399,CW 3120742400,3120754687,PY 3120754688,3120755711,CR 3120755712,3120756735,GF -3120757504,3120757759,BZ 3120757760,3120758783,CL 3120758784,3120824319,EC 3120824320,3120840703,CR 3120840704,3120857087,AR 3120857088,3120922623,EC -3120922624,3120922879,PA -3120922880,3120922943,CR -3120922944,3120930815,PA +3120922624,3120930815,PA 3120930816,3120934911,CR 3120934912,3120949247,AR 3120949248,3120951295,CL @@ -86198,9 +88199,7 @@ 3121872896,3122003967,CL 3122003968,3122135039,AR 3122135040,3122282495,VE -3122282496,3122290687,US -3122290688,3122292735,AR -3122292736,3122294783,US +3122282496,3122294783,AR 3122294784,3122298879,CR 3122298880,3122331647,VE 3122331648,3122364415,BO @@ -86211,30 +88210,7 @@ 3122700288,3122716671,CR 3122716672,3122722815,HN 3122722816,3122724863,SV -3122724864,3122726911,US -3122726912,3122728447,AR -3122728448,3122728959,US -3122728960,3122729471,AR -3122729472,3122729983,US -3122729984,3122731007,AR -3122731008,3122731519,US -3122731520,3122732031,AR -3122732032,3122733055,US -3122733056,3122734079,AR -3122734080,3122734591,US -3122734592,3122735103,AR -3122735104,3122735615,US -3122735616,3122736127,AR -3122736128,3122736383,US -3122736384,3122737407,AR -3122737408,3122738431,US -3122738432,3122739199,AR -3122739200,3122739455,US -3122739456,3122739711,AR -3122739712,3122740223,US -3122740224,3122740479,AR -3122740480,3122740735,US -3122740736,3122741247,AR +3122724864,3122741247,AR 3122741248,3122757631,DO 3122757632,3122774015,EC 3122774016,3122790399,AR @@ -86261,21 +88237,8 @@ 3124840448,3124842495,CL 3124842496,3124844543,AR 3124844544,3124845567,BZ -3124845568,3124846591,CR -3124846592,3124848639,AR -3124848640,3124849663,PA -3124849664,3124850687,AR -3124850688,3124851471,HN -3124851472,3124851487,CM -3124851488,3124851855,HN -3124851856,3124851863,IN -3124851864,3124852175,HN -3124852176,3124852191,PH -3124852192,3124853103,HN -3124853104,3124853119,VN -3124853120,3124853887,HN -3124853888,3124853903,FR -3124853904,3124854783,HN +3124846592,3124850687,AR +3124850688,3124854783,HN 3124854784,3124887551,CL 3124887552,3124953087,EC 3124953088,3125018623,CL @@ -86285,30 +88248,13 @@ 3125673984,3125805055,CL 3125805056,3126329343,CO 3126329344,3126853631,VE -3126853632,3126855807,AR -3126855808,3126855935,US -3126855936,3126857855,AR -3126857856,3126857983,US -3126857984,3126858495,AR -3126858496,3126858623,US -3126858624,3126860415,AR -3126860416,3126860543,US -3126860544,3126860671,AR -3126860672,3126860799,US -3126860800,3126861311,AR -3126861312,3126861439,US -3126861440,3126862591,AR -3126862592,3126862719,US -3126862720,3126863999,AR -3126864000,3126864127,US -3126864128,3126870015,AR -3126870016,3126873343,VE -3126873344,3126873599,PA -3126873600,3126874111,VE +3126853632,3126870015,AR +3126870016,3126874111,VE 3126874112,3126878207,CR -3126878208,3126882303,PA -3126882304,3126886399,US -3126886400,3126918143,AR +3126878208,3126886399,PA +3126886400,3126906879,AR +3126906880,3126910975,TT +3126910976,3126918143,AR 3126918144,3126919167,HN 3126919168,3127115775,CO 3127115776,3127181311,AR @@ -86328,17 +88274,12 @@ 3130284032,3130286079,DO 3130286080,3130290175,PA 3130290176,3130302463,AR -3130302464,3130302975,CY -3130302976,3130312703,PA +3130302464,3130310655,PA 3130312704,3130314751,AR 3130314752,3130315775,CL 3130315776,3130316799,CR -3130316800,3130317823,AW -3130317824,3130318847,CW -3130318848,3130319871,AR -3130319872,3130320639,RU -3130320640,3130320895,BR -3130320896,3130327039,AR +3130316800,3130318847,CW +3130318848,3130327039,AR 3130327040,3130458111,DO 3130458112,3130523647,GT 3130523648,3130654719,AR @@ -86358,27 +88299,23 @@ 3132096512,3132211199,CR 3132211200,3132227583,AR 3132227584,3132293119,EC -3132293120,3132295647,HN -3132295648,3132295679,UY -3132295680,3132297791,HN -3132297792,3132297807,US -3132297808,3132297839,HN -3132297840,3132297855,US -3132297856,3132297887,HN -3132297888,3132297903,US -3132297904,3132300383,HN -3132300384,3132300391,US -3132300392,3132302319,HN -3132302320,3132302335,NL -3132302336,3132302975,HN -3132302976,3132302983,NL -3132302984,3132304303,HN -3132304304,3132304311,DE -3132304312,3132306239,HN -3132306240,3132306271,DE -3132306272,3132308367,HN -3132308368,3132308375,US -3132308376,3132309503,HN +3132293120,3132298007,HN +3132298008,3132298015,US +3132298016,3132298127,HN +3132298128,3132298143,US +3132298144,3132301727,HN +3132301728,3132301743,NL +3132301744,3132304127,HN +3132304128,3132304383,US +3132304384,3132304607,HN +3132304608,3132304623,DE +3132304624,3132305143,HN +3132305144,3132305151,NL +3132305152,3132307823,HN +3132307824,3132307839,US +3132307840,3132308775,HN +3132308776,3132308783,US +3132308784,3132309503,HN 3132309504,3132313599,CR 3132313600,3132317695,CL 3132317696,3132321791,CO @@ -86391,21 +88328,24 @@ 3132588032,3132620799,CO 3132620800,3132915711,VE 3132915712,3132948479,PA -3132948480,3133014015,AR +3132948480,3132981247,AR +3132981248,3132997631,AW +3132997632,3133014015,AR 3133014016,3133046783,HT 3133046784,3133067263,AR -3133067264,3133071359,PA -3133071360,3133071871,CY -3133071872,3133073407,PA +3133067264,3133073407,PA 3133073408,3133074431,CW 3133074432,3133075455,CL 3133075456,3133079551,CW 3133079552,3133145087,AR 3133145088,3133311999,BR 3133312000,3133313023,MX -3133313024,3136985087,BR +3133313024,3133317119,BR +3133321216,3136983039,BR +3136984064,3136985087,BR 3136985088,3136986111,AR -3136986112,3140614143,BR +3136986112,3140587519,BR +3140599808,3140614143,BR 3140614144,3140616191,CR 3140616192,3145727999,BR 3145728000,3149135871,MX @@ -86451,7 +88391,9 @@ 3156672512,3156738047,GB 3156738048,3156803583,DE 3156803584,3156869119,TR -3156869120,3156901887,LU +3156869120,3156897791,LU +3156897792,3156899839,US +3156899840,3156901887,SG 3156901888,3156906239,NL 3156906240,3156907007,LU 3156907008,3156908031,RU @@ -86578,8 +88520,8 @@ 3158638592,3158704127,LT 3158704128,3158835199,KW 3158835200,3158851583,IQ -3158851584,3158852607,NL -3158852608,3158853119,ES +3158851584,3158852863,NL +3158852864,3158853119,ES 3158853120,3158853631,NL 3158853632,3158855679,RU 3158855680,3158857727,US @@ -86762,7 +88704,7 @@ 3161571328,3161587711,UZ 3161587712,3161604095,RU 3161604096,3161612287,PL -3161612288,3161613311,BR +3161612288,3161613311,US 3161613312,3161614335,IT 3161614336,3161614847,US 3161614848,3161615103,ES @@ -86990,13 +88932,9 @@ 3164946160,3164946175,GB 3164946176,3164946351,FR 3164946352,3164946367,GB -3164946368,3164946435,FR -3164946436,3164946439,PT -3164946440,3164946479,FR +3164946368,3164946479,FR 3164946480,3164946483,ES -3164946484,3164946499,FR -3164946500,3164946503,GB -3164946504,3164946527,FR +3164946484,3164946527,FR 3164946528,3164946559,FI 3164946560,3164947023,FR 3164947024,3164947039,FI @@ -87112,9 +89050,7 @@ 3164970414,3164970415,IT 3164970416,3164970631,FR 3164970632,3164970639,ES -3164970640,3164970847,FR -3164970848,3164970851,IE -3164970852,3164970927,FR +3164970640,3164970927,FR 3164970928,3164970943,ES 3164970944,3164971479,FR 3164971480,3164971483,FI @@ -87157,7 +89093,9 @@ 3164978624,3164978655,ES 3164978656,3164979151,FR 3164979152,3164979155,ES -3164979156,3164995583,FR +3164979156,3164995345,FR +3164995346,3164995346,GB +3164995347,3164995583,FR 3164995584,3165030399,NL 3165030400,3165031423,GB 3165031424,3165032447,NL @@ -87165,7 +89103,9 @@ 3165036544,3165038591,DE 3165038592,3165040639,GB 3165040640,3165044735,SG -3165044736,3165047807,NL +3165044736,3165045759,DE +3165045760,3165046783,SG +3165046784,3165047807,NL 3165047808,3165061119,SG 3165061120,3165126655,SK 3165126656,3165192191,RU @@ -87217,7 +89157,7 @@ 3165452800,3165453055,AT 3165453056,3165453311,US 3165453312,3165453567,PE -3165453568,3165453823,ES +3165453568,3165453823,US 3165453824,3165454335,AT 3165454336,3165519871,RO 3165519872,3165585407,DE @@ -87259,7 +89199,8 @@ 3167753216,3167755263,ES 3167755264,3167757311,RO 3167757312,3167757823,BE -3167757824,3167758335,US +3167757824,3167757824,US +3167757825,3167758335,GB 3167758336,3167758463,NL 3167758464,3167760383,RO 3167760384,3167762431,GB @@ -87281,7 +89222,7 @@ 3167780864,3167783935,RO 3167783936,3167784447,ES 3167784448,3167784703,CA -3167784704,3167784959,ES +3167784704,3167784959,PT 3167784960,3167797247,IR 3167797248,3167798271,MD 3167798272,3167798783,RO @@ -87349,8 +89290,7 @@ 3168005888,3168006143,NL 3168006144,3168008191,SE 3168008192,3168008447,RO -3168008448,3168008703,GB -3168008704,3168010239,US +3168008448,3168010239,DE 3168010240,3168011519,MD 3168011520,3168011775,RO 3168011776,3168012287,IR @@ -87366,7 +89306,7 @@ 3168020480,3168022527,MD 3168022528,3168035839,IR 3168035840,3168036863,RO -3168036864,3168037887,GB +3168036864,3168037887,US 3168037888,3168038399,SE 3168038400,3168038911,RO 3168038912,3168039935,MD @@ -87441,7 +89381,7 @@ 3168145408,3168147455,RO 3168147456,3168147967,FR 3168147968,3168151551,RO -3168151552,3168153599,DE +3168151552,3168153599,US 3168153600,3168154111,RO 3168154112,3168154367,SG 3168154368,3168155135,RO @@ -87586,7 +89526,8 @@ 3169851392,3169853439,NL 3169853440,3169854463,AU 3169854464,3169855487,ES -3169855488,3169856511,RO +3169855488,3169855999,US +3169856000,3169856511,RO 3169856512,3169857023,IT 3169857024,3169862911,RO 3169862912,3169863167,IT @@ -87684,7 +89625,9 @@ 3170500608,3170631679,PT 3170631680,3170664447,PL 3170664448,3170697215,HR -3170697216,3170729983,IR +3170697216,3170728959,IR +3170728960,3170729471,NL +3170729472,3170729983,IR 3170729984,3170762751,AZ 3170762752,3170795519,RU 3170795520,3170828287,BG @@ -87717,103 +89660,22 @@ 3187826688,3187834879,AR 3187834880,3187843071,CW 3187843072,3187846143,AW -3187846144,3187849215,CW -3187849216,3187849471,CO -3187849472,3187851263,CW +3187846144,3187851263,CW 3187851264,3187855359,PY -3187855360,3187855871,CY -3187855872,3187857407,PA +3187855360,3187857407,PA 3187857408,3187859455,CR 3187859456,3187863551,PA 3187863552,3187908607,AR -3187908608,3187910655,CO -3187910656,3187913727,CL -3187913728,3187913983,PT -3187913984,3187914751,CL +3187910656,3187914751,CL 3187914752,3187916799,BO 3187916800,3187933183,CO -3187933184,3187933311,HN -3187933312,3187933341,GT +3187933184,3187933341,GT 3187933342,3187933342,HN -3187933343,3187935519,GT -3187935520,3187935527,HN -3187935528,3187935543,GT -3187935544,3187935551,HN -3187935552,3187935607,GT -3187935608,3187935615,HN -3187935616,3187936047,GT -3187936048,3187936063,HN -3187936064,3187936583,GT -3187936584,3187936591,HN -3187936592,3187936711,GT -3187936712,3187936719,HN -3187936720,3187937799,GT -3187937800,3187937807,HN -3187937808,3187939847,GT -3187939848,3187939855,HN -3187939856,3187940479,GT -3187940480,3187940543,HN -3187940544,3187940823,GT -3187940824,3187940831,HN -3187940832,3187940963,GT -3187940964,3187940967,HN -3187940968,3187941207,GT -3187941208,3187941215,HN -3187941216,3187941647,GT -3187941648,3187941655,HN -3187941656,3187942271,GT -3187942272,3187942279,HN -3187942280,3187942563,GT -3187942564,3187942567,HN -3187942568,3187943055,GT -3187943056,3187943063,HN -3187943064,3187943127,GT -3187943128,3187943135,HN -3187943136,3187943399,GT -3187943400,3187943403,HN -3187943404,3187943551,GT -3187943552,3187943679,HN -3187943680,3187944383,GT -3187944384,3187944399,HN -3187944400,3187944671,GT -3187944672,3187944679,HN -3187944680,3187944773,GT +3187933343,3187944773,GT 3187944774,3187944774,HN -3187944775,3187944831,GT -3187944832,3187944835,HN -3187944836,3187944855,GT -3187944856,3187944859,HN -3187944860,3187945343,GT -3187945344,3187945471,HN -3187945472,3187945971,GT -3187945972,3187945975,HN -3187945976,3187946111,GT -3187946112,3187946239,HN -3187946240,3187946495,GT -3187946496,3187946511,HN -3187946512,3187946639,GT -3187946640,3187946647,HN -3187946648,3187946687,GT -3187946688,3187946695,HN -3187946696,3187946887,GT -3187946888,3187946895,HN -3187946896,3187946975,GT -3187946976,3187946979,HN -3187946980,3187947983,GT -3187947984,3187947987,HN -3187947988,3187947999,GT -3187948000,3187948159,HN -3187948160,3187948367,GT -3187948368,3187948375,HN -3187948376,3187948479,GT -3187948480,3187948543,HN -3187948544,3187948799,GT -3187948800,3187948927,HN -3187948928,3187949115,GT -3187949116,3187949119,HN -3187949120,3187949311,GT -3187949312,3187949439,HN -3187949440,3187949567,GT +3187944775,3187948031,GT +3187948032,3187948159,HN +3187948160,3187949567,GT 3187949568,3187950126,BQ 3187950127,3187950127,CW 3187950128,3187953663,BQ @@ -87841,23 +89703,20 @@ 3188113408,3188117503,HN 3188117504,3188121599,AR 3188121600,3188125695,TT -3188125696,3188137175,AR -3188137176,3188137183,DE -3188137184,3188146175,AR -3188146176,3188148911,CO -3188148912,3188148915,PE -3188148916,3188152171,CO -3188152172,3188152175,PE -3188152176,3188170751,CO +3188125696,3188146175,AR +3188146176,3188147623,CO +3188147624,3188147631,PE +3188147632,3188149335,CO +3188149336,3188149339,PE +3188149340,3188170751,CO 3188170752,3188174847,CR 3188174848,3188178943,BR 3188178944,3188187135,CR -3188187136,3188203519,AR +3188187136,3188199423,AR 3188203520,3188207615,DO 3188207616,3188211711,AR 3188211712,3188228095,CL 3188228096,3188236287,PE -3188236288,3188237311,PA 3188237312,3188239359,VE 3188239360,3188240383,PE 3188240384,3188241407,CO @@ -87867,17 +89726,7 @@ 3188248576,3188248703,CL 3188248704,3188260863,CO 3188260864,3188269055,AR -3188269056,3188269439,MX -3188269440,3188269567,CO -3188269568,3188269823,MX -3188269824,3188270079,PA -3188270080,3188270335,MX -3188270336,3188270719,PA -3188270720,3188270783,MX -3188270784,3188270847,PA -3188270848,3188271103,BR -3188271104,3188273151,MX -3188273152,3188275199,PA +3188269056,3188275199,PA 3188275200,3188277247,CL 3188277248,3188293631,CO 3188293632,3188301823,VE @@ -87888,33 +89737,15 @@ 3188400128,3188408319,AR 3188408320,3188416511,BO 3188416512,3188445183,AR -3188445184,3188449279,PE 3188449280,3188453375,HN 3188453376,3188473855,EC 3188473856,3188482047,PE 3188482048,3188490239,AR 3188490240,3188498431,CO -3188498432,3188511103,AR -3188511104,3188511231,US -3188511232,3188512127,AR -3188512128,3188512255,US -3188512256,3188513407,AR -3188513408,3188513535,US -3188513536,3188516095,AR -3188516096,3188516223,US -3188516224,3188517119,AR -3188517120,3188517247,US -3188517248,3188517759,AR -3188517760,3188517887,US -3188517888,3188518271,AR -3188518272,3188518399,US -3188518400,3188523007,AR +3188498432,3188523007,AR 3188523008,3188539391,CO -3188539392,3188542207,CL -3188542208,3188542463,US -3188542464,3188543487,CL -3188543488,3188543999,CY -3188544000,3188545535,PA +3188539392,3188543487,CL +3188543488,3188545535,PA 3188545536,3188547583,AR 3188547584,3188551679,CO 3188551680,3188552703,AR @@ -87936,8 +89767,7 @@ 3188662272,3188670463,BR 3188670464,3188674559,HN 3188674560,3188678655,AR -3188678656,3188682751,BR -3188682752,3188686847,AR +3188678656,3188686847,BR 3188686848,3188690943,EC 3188690944,3188695039,CU 3188695040,3188697087,EC @@ -87959,23 +89789,22 @@ 3191095296,3191099391,EC 3191099392,3191103487,AR 3191103488,3191107583,VE -3191107584,3191108271,PE -3191108272,3191108287,MX -3191108288,3191108607,PE -3191108608,3191108639,MX -3191108640,3191108959,PE +3191107584,3191108959,PE 3191108960,3191108991,CO 3191108992,3191109119,PE -3191109120,3191111167,MX -3191111168,3191111679,PE +3191109120,3191109631,MX +3191109632,3191111679,PE 3191111680,3191128063,PY 3191128064,3191132159,EC 3191132160,3191136255,AR 3191136256,3191144447,DO -3191144448,3191152639,SV -3191152640,3191155711,NI +3191144448,3191153663,SV +3191153664,3191154175,NI +3191154176,3191154687,SV +3191154688,3191155711,NI 3191155712,3191156223,SV -3191156224,3191156735,NI +3191156224,3191156479,NI +3191156480,3191156735,SV 3191156736,3191169023,HN 3191169024,3191193599,SV 3191193600,3191209983,HN @@ -87986,66 +89815,31 @@ 3191439360,3191455743,EC 3191455744,3191472127,AR 3191472128,3191603199,TT -3191603200,3191603455,CO -3191603456,3191603519,GT -3191603520,3191603583,PR -3191603584,3191603647,CO -3191603648,3191603711,SV -3191603712,3191607295,CO +3191603200,3191607295,CO 3191607296,3191607551,MX 3191607552,3191610111,CO 3191610112,3191610367,PE -3191610368,3191610623,CO -3191610624,3191611135,PE -3191611136,3191611391,CO +3191610368,3191611391,CO 3191611392,3191619583,VE -3191619584,3191619903,CL +3191619584,3191619903,CO 3191619904,3191619935,VE -3191619936,3191623679,CL -3191623680,3191625727,CO -3191625728,3191626751,CL -3191626752,3191627263,CO -3191627264,3191627519,CL -3191627520,3191635967,CO +3191619936,3191635967,CO 3191635968,3191652351,AR -3191652352,3191668991,CO -3191668992,3191669247,PY -3191669248,3191670015,CO -3191670016,3191670271,AR -3191670272,3191670783,CO -3191670784,3191672831,CL -3191672832,3191673343,CO -3191673344,3191676927,CL -3191676928,3191677951,US -3191677952,3191678207,AR -3191678208,3191678719,US -3191678720,3191678975,AR -3191678976,3191680767,US -3191680768,3191681279,AR -3191681280,3191681535,US -3191681536,3191682303,AR -3191682304,3191682559,US -3191682560,3191683071,AR -3191683072,3191685119,US -3191685120,3191693311,CO +3191652352,3191693311,CO 3191693312,3191701503,AR 3191701504,3191709695,CO 3191709696,3191709951,BR 3191709952,3191714815,CO 3191714816,3191715071,AR 3191715072,3191719935,CO -3191719936,3191720015,AR -3191720016,3191720959,CO +3191719936,3191719999,AR +3191720000,3191720959,CO 3191720960,3191721471,AR 3191721472,3191721983,CO 3191721984,3191722495,AR 3191722496,3191724799,CO 3191724800,3191725311,AR -3191725312,3191732735,CO -3191732736,3191732991,AR -3191732992,3191734079,CO -3191734080,3191734143,US -3191734144,3191734271,CO +3191725312,3191734271,CO 3191734272,3191799807,SV 3191799808,3191865343,EC 3191865344,3191930879,UY @@ -88058,120 +89852,44 @@ 3193143296,3193176063,TT 3193176064,3193307135,CO 3193307136,3193438207,SV -3193438208,3193569279,CW -3193569280,3193573087,CO -3193573088,3193573095,US -3193573096,3193575311,CO +3193438208,3193503743,CW +3193569280,3193575311,CO 3193575312,3193575327,PE -3193575328,3193579263,CO -3193579264,3193579519,EC -3193579520,3193582591,CO -3193582592,3193583103,EC -3193583104,3193589503,CO -3193589504,3193589759,EC -3193589760,3193590527,CO -3193590528,3193590655,EC -3193590656,3193591807,CO -3193591808,3193592063,EC -3193592064,3193592319,CO -3193592320,3193592575,EC -3193592576,3193595391,CO +3193575328,3193590655,CO +3193590656,3193590783,EC +3193590784,3193595391,CO 3193595392,3193595647,EC -3193595648,3193599743,CO -3193599744,3193600255,EC -3193600256,3193604351,CO -3193604352,3193604607,EC -3193604608,3193604863,CO -3193604864,3193605631,EC -3193605632,3193606143,CO -3193606144,3193606399,EC -3193606400,3193606655,CO -3193606656,3193607167,EC -3193607168,3193617151,CO -3193617152,3193617407,EC -3193617408,3193618943,CO +3193595648,3193606527,CO +3193606528,3193606655,EC +3193606656,3193618431,CO +3193618432,3193618559,US +3193618560,3193618943,CO 3193618944,3193619071,EC -3193619072,3193621759,CO -3193621760,3193623551,EC -3193623552,3193624063,CO -3193624064,3193624575,EC -3193624576,3193625599,CO +3193619072,3193625599,CO 3193625600,3193625855,EC -3193625856,3193626111,CO -3193626112,3193626623,US -3193626624,3193628927,CO -3193628928,3193629695,EC -3193629696,3193630975,CO -3193630976,3193631231,EC -3193631232,3193634559,CO -3193634560,3193634815,EC +3193625856,3193626367,CO +3193626368,3193626623,US +3193626624,3193628671,CO +3193628672,3193629183,EC +3193629184,3193631103,CO +3193631104,3193631231,EC +3193631232,3193634815,CO 3193634816,3193700351,CL -3193700352,3193722751,HN -3193722752,3193722879,GT -3193722880,3193724927,HN +3193700352,3193724927,HN 3193724928,3193729023,AR 3193729024,3193733119,CU -3193733120,3193735167,AR -3193735168,3193735935,US -3193735936,3193736191,AR -3193736192,3193736959,US -3193736960,3193737215,AR -3193737216,3193739007,US -3193739008,3193739263,AR -3193739264,3193742335,US -3193742336,3193742591,AR -3193742592,3193742847,US -3193742848,3193743231,AR -3193743232,3193743359,US -3193743360,3193743743,AR -3193743744,3193744127,US -3193744128,3193744639,AR -3193744640,3193745407,US -3193745408,3193746431,AR -3193746432,3193746687,US -3193746688,3193746751,AR -3193746752,3193746815,US -3193746816,3193746879,AR -3193746880,3193748479,US -3193748480,3193748863,AR -3193748864,3193750271,US -3193750272,3193750527,AR -3193750528,3193750783,US -3193750784,3193751039,AR -3193751040,3193751551,US -3193751552,3193751807,AR -3193751808,3193752959,US -3193752960,3193753087,AR -3193753088,3193753343,US -3193753344,3193753471,AR -3193753472,3193753599,US -3193753600,3193754111,AR -3193754112,3193754367,US -3193754368,3193754623,AR -3193754624,3193754751,US -3193754752,3193755007,AR -3193755008,3193755519,US -3193755520,3193755647,AR -3193755648,3193755775,US -3193755776,3193756415,AR -3193756416,3193756543,US -3193756544,3193756799,AR -3193756800,3193756927,US -3193756928,3193757055,AR -3193757056,3193757183,US -3193757184,3193765887,AR +3193733120,3193740543,AR +3193740544,3193740799,US +3193740800,3193765887,AR 3193765888,3193774079,TT -3193774080,3193775103,PA 3193775104,3193776127,GY 3193776128,3193777151,AR 3193777152,3193778175,VE 3193778176,3193782271,AR 3193782272,3193798655,TT 3193798656,3193806847,CO -3193806848,3193808895,CR -3193808896,3193809663,US -3193809664,3193810943,CR -3193810944,3193815039,PY +3193806848,3193810943,CR +3193810944,3193811967,PY 3193815040,3193823231,AR 3193823232,3193827327,CL 3193827328,3193828351,CR @@ -88199,37 +89917,17 @@ 3194077184,3194085375,CO 3194085376,3194093567,VE 3194093568,3194126335,SR -3194126336,3194126591,GT -3194126592,3194126847,NL -3194126848,3194126911,GT -3194126912,3194126975,PE -3194126976,3194127103,GT -3194127104,3194127359,BR -3194127360,3194127871,AR -3194127872,3194128127,PE -3194128128,3194128383,BR +3194126336,3194128383,AR 3194128384,3194129407,NI 3194129408,3194129663,AR 3194129664,3194129671,BR -3194129672,3194129919,AR -3194129920,3194130047,BR +3194129672,3194130047,AR 3194130048,3194130175,CO -3194130176,3194130303,CL -3194130304,3194130431,AR -3194130432,3194130687,BR -3194130688,3194130943,AR -3194130944,3194132991,BR -3194132992,3194133247,CL -3194133248,3194134527,BR -3194134528,3194135551,AR -3194135552,3194136319,BR -3194136320,3194136447,CO -3194136448,3194136575,GT -3194136576,3194137087,BR -3194137088,3194139647,AR -3194139648,3194139903,BR -3194139904,3194140159,AR -3194140160,3194142719,CR +3194130176,3194135551,AR +3194135552,3194136063,BR +3194136064,3194139903,AR +3194139904,3194140159,BR +3194140160,3194142719,AR 3194142720,3194159103,CL 3194159104,3194165247,HN 3194165248,3194175487,SV @@ -88249,7 +89947,8 @@ 3194368000,3194370047,BO 3194370048,3194372095,PA 3194372096,3194380287,HT -3194380288,3194388479,US +3194380288,3194384383,US +3194384384,3194388479,BZ 3194388480,3194396671,PE 3194396672,3194413055,CO 3194413056,3194421247,CL @@ -88259,19 +89958,14 @@ 3194441728,3194445823,AR 3194445824,3194449031,CO 3194449032,3194449047,CL -3194449048,3194449175,CO -3194449176,3194449183,PE -3194449184,3194454015,CO +3194449048,3194454015,CO 3194454016,3194458111,AR 3194458112,3194462207,CL 3194462208,3194466303,BR 3194466304,3194467327,AR 3194467328,3194468351,DO 3194468352,3194469375,US -3194469376,3194469631,CA -3194469632,3194469887,CR -3194469888,3194470143,US -3194470144,3194470399,CR +3194469376,3194470399,CR 3194470400,3194486783,AR 3194486784,3194494975,BO 3194494976,3194511359,AR @@ -88279,9 +89973,7 @@ 3194515456,3194519551,GT 3194519552,3194535935,PY 3194535936,3194585087,AR -3194585088,3194586623,HN -3194586624,3194586879,US -3194586880,3194589183,HN +3194585088,3194589183,HN 3194589184,3194591231,AR 3194591232,3194592255,PA 3194592256,3194593279,GY @@ -88290,7 +89982,7 @@ 3194596352,3194597375,HT 3194597376,3194601471,AR 3194601472,3194602495,CW -3194602496,3194610943,AR +3194603520,3194610943,AR 3194610944,3194611199,CO 3194611200,3194613503,AR 3194613504,3194613759,CL @@ -88303,39 +89995,16 @@ 3194640384,3194642431,BZ 3194642432,3194646527,AR 3194646528,3194648575,DO -3194648576,3194652159,AR -3194652160,3194652415,MX -3194652416,3194652671,AR -3194652672,3194652701,MX -3194652702,3194652705,AR -3194652706,3194654719,MX -3194654720,3194659839,AR -3194659840,3194660351,US -3194660352,3194661119,AR -3194661120,3194661375,US -3194661376,3194661887,AR -3194661888,3194662399,US -3194662400,3194663167,AR -3194663168,3194664447,US -3194664448,3194664959,AR -3194664960,3194665215,US -3194665216,3194665471,AR -3194665472,3194665727,US -3194665728,3194665983,AR -3194665984,3194666239,US -3194666240,3194667007,AR +3194648576,3194667007,AR 3194667008,3194675199,GT -3194675200,3194679295,PA 3194679296,3194683391,BO 3194683392,3194687487,CU 3194687488,3194691583,CO 3194691584,3194699775,BO 3194699776,3194705919,EC -3194705920,3194707711,CR -3194707712,3194707967,US +3194705920,3194707967,CR 3194707968,3194716159,AR 3194716160,3194724351,HN -3194724352,3194728447,PA 3194728448,3194729471,CL 3194729472,3194730495,PE 3194730496,3194732543,AR @@ -88359,15 +90028,8 @@ 3194804224,3194805247,AR 3194805248,3194806271,CR 3194806272,3194814463,AR -3194814464,3194818559,PA -3194818560,3194818815,CO -3194818816,3194819071,AR -3194819072,3194819583,CO -3194819584,3194819839,AR -3194819840,3194820095,CO -3194820096,3194820351,AR -3194820352,3194820607,CO -3194820608,3194830847,AR +3194814464,3194822655,CO +3194822656,3194830847,AR 3194830848,3194838015,BR 3194838016,3194839039,MX 3194839040,3194863615,CO @@ -88381,38 +90043,16 @@ 3194925056,3194929151,AR 3194929152,3194937343,EC 3194937344,3194945535,AR -3194945536,3194953215,GT -3194953216,3194953343,NI -3194953344,3194953471,GT -3194953472,3194953599,NI -3194953600,3194953727,GT -3194953728,3194959871,AR -3194959872,3194960383,US -3194960384,3194960895,AR -3194960896,3194961151,US -3194961152,3194961407,AR -3194961408,3194961919,US +3194945536,3194953727,GT +3194953728,3194961919,AR 3194961920,3194970111,EC -3194970112,3194974207,PA 3194974208,3194976255,AR 3194976256,3194977279,VE 3194977280,3194978303,AR -3194978304,3194978559,PA -3194978560,3194978687,CW -3194978688,3194982911,PA -3194982912,3194983039,US -3194983040,3194984191,PA -3194984192,3194984319,US -3194984320,3194984831,PA -3194984832,3194984959,GB -3194984960,3194985471,PA -3194985472,3194985599,US -3194985600,3194994687,PA 3194994688,3195023359,AR 3195023360,3195024383,CL 3195024384,3195025407,UY 3195025408,3195043839,AR -3195043840,3195056127,CO 3195056128,3195060223,AR 3195060224,3195061247,US 3195061248,3195062271,AR @@ -88425,22 +90065,7 @@ 3195067392,3195068415,CR 3195068416,3195076607,CW 3195076608,3195084799,CL -3195084800,3195085055,CR -3195085056,3195086335,NI -3195086336,3195087359,CR -3195087360,3195087615,NI -3195087616,3195088127,CR -3195088128,3195088639,NI -3195088640,3195088895,CR -3195088896,3195089919,NI -3195089920,3195090431,CR -3195090432,3195090687,NI -3195090688,3195091199,CR -3195091200,3195091455,NI -3195091456,3195092223,CR -3195092224,3195092479,NI -3195092480,3195092735,CR -3195092736,3195092991,NI +3195084800,3195092991,NI 3195092992,3195097087,DO 3195097088,3195099135,CR 3195099136,3195100159,GT @@ -88452,9 +90077,7 @@ 3195138048,3195139071,DO 3195139072,3195140095,CL 3195140096,3195142143,CR -3195142144,3195142399,MX -3195142400,3195142655,PA -3195142656,3195142911,VE +3195142144,3195142911,PA 3195142912,3195143039,EC 3195143040,3195143167,UY 3195143168,3195143295,GT @@ -88466,19 +90089,12 @@ 3195203584,3195205631,VE 3195205632,3195206655,PE 3195206656,3195207679,CL -3195207680,3195209687,GT -3195209688,3195209695,PR -3195209696,3195211775,GT +3195207680,3195211775,GT 3195211776,3195214988,BZ 3195214989,3195214989,RU 3195214990,3195215871,BZ 3195215872,3195224063,AR -3195224064,3195232255,PA -3195232256,3195234559,CR -3195234560,3195234815,PA -3195234816,3195235327,CR -3195235328,3195235583,PA -3195235584,3195236351,CR +3195232256,3195236351,CR 3195236352,3195240447,AR 3195240448,3195256831,HT 3195256832,3195265023,AR @@ -88517,17 +90133,12 @@ 3195721728,3195723775,VE 3195723776,3195731967,AR 3195731968,3195736063,EC -3195736064,3195736575,BQ -3195736576,3195736831,AI -3195736832,3195737087,BQ +3195736064,3195737087,BQ 3195737088,3195738111,CW 3195738112,3195740159,HN -3195740160,3195740415,US -3195740416,3195740927,PA -3195740928,3195741055,US +3195740160,3195741055,PA 3195741056,3195741087,HN -3195741088,3195741695,US -3195741696,3195744255,PA +3195741088,3195744255,PA 3195744256,3195748351,EC 3195748352,3195752447,CL 3195752448,3195763711,AR @@ -88535,38 +90146,13 @@ 3195764736,3195768831,CR 3195768832,3195772927,AR 3195772928,3195781119,VE -3195781120,3195785215,PA -3195785216,3195785311,HN -3195785312,3195785343,CA -3195785344,3195785375,HN -3195785376,3195785407,DE -3195785408,3195785815,HN -3195785816,3195785823,DE -3195785824,3195786015,HN -3195786016,3195786023,ES -3195786024,3195786191,HN -3195786192,3195786199,US -3195786200,3195786479,HN -3195786480,3195786487,CA -3195786488,3195786527,HN -3195786528,3195786543,US -3195786544,3195786991,HN -3195786992,3195787007,CA -3195787008,3195787127,HN -3195787128,3195787135,DE -3195787136,3195787215,HN -3195787216,3195787231,US -3195787232,3195787607,HN -3195787608,3195787615,DE -3195787616,3195788159,HN -3195788160,3195788167,CA -3195788168,3195788415,HN -3195788416,3195788423,US -3195788424,3195788919,HN -3195788920,3195788927,CA -3195788928,3195789087,HN -3195789088,3195789119,CA -3195789120,3195789311,HN +3195785216,3195785407,HN +3195785408,3195785439,DE +3195785440,3195785735,HN +3195785736,3195785743,GB +3195785744,3195787383,HN +3195787384,3195787391,US +3195787392,3195789311,HN 3195789312,3195793407,PA 3195793408,3195801599,AR 3195801600,3195803647,HN @@ -88574,13 +90160,7 @@ 3195804672,3195805695,VE 3195805696,3195807743,NI 3195807744,3195807871,US -3195807872,3195808383,BZ -3195808384,3195808895,US -3195808896,3195809151,BZ -3195809152,3195809279,US -3195809280,3195809407,BZ -3195809408,3195809535,US -3195809536,3195809791,BZ +3195807872,3195809791,BZ 3195809792,3195811839,PE 3195811840,3195813887,AR 3195813888,3195822079,DO @@ -88594,23 +90174,16 @@ 3195853824,3195854847,GY 3195854848,3195859967,AR 3195859968,3195862015,CR -3195862016,3195863039,AR 3195863040,3196092415,CO 3196092416,3196125183,PY 3196125184,3196190719,BO 3196190720,3196207103,HN 3196207104,3196223487,CO 3196223488,3196305407,EC -3196305408,3196316183,CO -3196316184,3196316191,CW -3196316192,3196321791,CO +3196305408,3196321791,CO 3196321792,3196583935,UY -3196583936,3196690687,AR -3196690688,3196690943,UY -3196690944,3196846079,AR -3196846080,3196874431,PA -3196874432,3196874447,PG -3196874448,3196977151,PA +3196583936,3196846079,AR +3196846080,3196977151,PA 3196977152,3197042687,VE 3197042688,3197075455,CO 3197075456,3197108223,GT @@ -88672,16 +90245,12 @@ 3200516096,3200565247,CL 3200565248,3200569343,HT 3200569344,3200573439,CL -3200573440,3200577535,AR -3200577536,3200579583,EC -3200579584,3200581631,AR +3200573440,3200581631,AR 3200581632,3200614399,BZ 3200614400,3200647167,AR 3200647168,3201302527,VE 3201302528,3201433599,CL -3201433600,3201435135,AR -3201435136,3201435263,US -3201435264,3201441791,AR +3201433600,3201441791,AR 3201441792,3201442047,US 3201442048,3201499135,AR 3201499136,3201515519,CL @@ -88710,74 +90279,91 @@ 3201851392,3201855487,EC 3201855488,3201859583,PE 3201859584,3201863679,CO -3201863680,3201865727,CL -3201865728,3201867775,CO -3201867776,3201875967,PE -3201875968,3201880063,CO +3201863680,3201864633,AR +3201864634,3201864634,CL +3201864635,3201865215,AR +3201865216,3201865471,CL +3201865472,3201866607,AR +3201866608,3201866623,CO +3201866624,3201867611,AR +3201867612,3201867615,CO +3201867616,3201867775,AR +3201867776,3201869823,PE +3201869824,3201871695,AR +3201871696,3201871703,PE +3201871704,3201872739,AR +3201872740,3201872740,PE +3201872741,3201873827,AR +3201873828,3201873831,PE +3201873832,3201875071,AR +3201875072,3201875079,PE +3201875080,3201876991,AR +3201876992,3201877247,CO +3201877248,3201877268,AR +3201877269,3201877269,CO +3201877270,3201877503,AR +3201877504,3201878015,CO +3201878016,3201878527,AR +3201878528,3201878783,CO +3201878784,3201879039,AR +3201879040,3201880063,CO 3201880064,3201884159,EC -3201884160,3201889279,VE +3201884160,3201888511,VE +3201888512,3201889263,AR +3201889264,3201889279,VE 3201889280,3201889535,US -3201889536,3201894399,VE -3201894400,3201906111,AR -3201906112,3201906175,CO -3201906176,3201906687,AR -3201906688,3201908735,CO +3201889536,3201889791,VE +3201889792,3201890097,AR +3201890098,3201890098,VE +3201890099,3201891071,AR +3201891072,3201891327,VE +3201891328,3201891583,AR +3201891584,3201891839,VE +3201891840,3201892351,AR +3201892352,3201894399,VE +3201894400,3201904639,AR +3201904640,3201906687,CO +3201906688,3201907233,AR +3201907234,3201907234,CO +3201907235,3201907265,AR +3201907266,3201907266,CO +3201907267,3201907359,AR +3201907360,3201907391,CO +3201907392,3201907667,AR +3201907668,3201907671,CO +3201907672,3201908223,AR +3201908224,3201908735,CO 3201908736,3201916927,AR 3201916928,3201917183,CO 3201917184,3201917527,AR 3201917528,3201917535,CO -3201917536,3201917951,AR -3201917952,3201918975,CO -3201918976,3201925119,AR +3201917536,3201918795,AR +3201918796,3201918799,CO +3201918800,3201918975,AR +3201918976,3201919999,CO +3201920000,3201925119,AR 3201925120,3201957887,CL 3201957888,3202088959,PA -3202088960,3202127999,AR -3202128000,3202128015,CW -3202128016,3202220031,AR +3202088960,3202220031,AR 3202220032,3202351103,PE 3202351104,3202875391,AR 3202875392,3203399679,PE 3203399680,3203465215,CO -3203465216,3203494143,CR -3203494144,3203494271,CO -3203494272,3203530751,CR -3203530752,3203531519,CO -3203531520,3203531775,PA -3203531776,3203532287,CO -3203532288,3203532543,PA -3203532544,3203532799,CO -3203532800,3203534847,PA -3203534848,3203535871,CO -3203535872,3203536383,PA -3203536384,3203536895,CO -3203536896,3203537919,HN -3203537920,3203538431,GT -3203538432,3203538687,PA -3203538688,3203538943,CO +3203465216,3203530751,CR +3203530752,3203538943,CO 3203538944,3203539967,BZ 3203539968,3203543551,CO 3203543552,3203544575,GT -3203544576,3203545087,CO -3203545088,3203545599,GT -3203545600,3203547135,CO -3203547136,3203549183,PA -3203549184,3203553279,CO -3203553280,3203553535,CR -3203553536,3203556863,CO -3203556864,3203557119,DO -3203557120,3203561471,CO -3203561472,3203562495,SV -3203562496,3203563775,CO -3203563776,3203564031,PA -3203564032,3203564543,CO +3203544576,3203548927,CO +3203548928,3203549183,PA +3203549184,3203562239,CO +3203562240,3203562495,SV +3203562496,3203564543,CO 3203564544,3203565055,DO -3203565056,3203565567,CO -3203565568,3203566079,CR -3203566080,3203566591,CO +3203565056,3203566591,CO 3203566592,3203566847,PA -3203566848,3203566975,CO -3203566976,3203567103,DO -3203567104,3203568639,CO +3203566848,3203566975,DO +3203566976,3203568639,CO 3203568640,3203569663,SV 3203569664,3203570303,CO 3203570304,3203570431,SV @@ -88786,7 +90372,9 @@ 3203661824,3203923967,AR 3203923968,3204448255,CO 3204448256,3208642559,BR -3208642560,3209691135,CO +3208642560,3209412607,CO +3209412608,3209413631,US +3209413632,3209691135,CO 3209691136,3210084351,AR 3210084352,3210215423,BR 3210215424,3210739711,CO @@ -88796,10 +90384,10 @@ 3210740480,3210740735,US 3210740736,3210742015,BR 3210742016,3210742031,IT -3210742032,3210742063,BR +3210742032,3210742047,BR +3210742048,3210742063,CL 3210742064,3210742079,US -3210742080,3210742271,BR -3210742272,3210742527,CL +3210742080,3210742527,CL 3210742528,3210742543,KR 3210742544,3210742560,CL 3210742561,3210742561,BR @@ -88817,48 +90405,52 @@ 3210743552,3210743567,TH 3210743568,3210743615,BR 3210743616,3210743679,FR -3210743680,3210743807,BR +3210743680,3210743807,CL 3210743808,3210744063,US 3210744064,3210744079,TR 3210744080,3210744095,CL 3210744096,3210744127,BR 3210744128,3210744191,FR -3210744192,3210744575,US +3210744192,3210744255,CL +3210744256,3210744319,BR +3210744320,3210744575,US 3210744576,3210744591,BE -3210744592,3210744703,BR -3210744704,3210744831,US +3210744592,3210744607,BR +3210744608,3210744831,CL 3210744832,3210744863,NZ 3210744864,3210744895,IS -3210744896,3210744959,CL -3210744960,3210745087,BR +3210744896,3210745087,BR 3210745088,3210745343,US 3210745344,3210745359,RU 3210745360,3210745375,BR -3210745376,3210745471,CL +3210745376,3210745407,CL +3210745408,3210745471,BR 3210745472,3210745599,DE 3210745600,3210745855,US 3210745856,3210745871,IT -3210745872,3210745919,BR -3210745920,3210746367,US +3210745872,3210746047,CL +3210746048,3210746111,BR +3210746112,3210746367,US 3210746368,3210746383,SE -3210746384,3210746623,BR -3210746624,3210746879,US +3210746384,3210746399,BR +3210746400,3210746495,CL +3210746496,3210746879,US 3210746880,3210746895,CH -3210746896,3210747007,CL -3210747008,3210747135,BR +3210746896,3210746943,CL +3210746944,3210747135,BR 3210747136,3210748159,US 3210748160,3210748175,JP -3210748176,3210748287,BR -3210748288,3210748415,US +3210748176,3210748191,BR +3210748192,3210748351,CL +3210748352,3210748415,BR 3210748416,3210748671,GB -3210748672,3210752255,US -3210752256,3210752511,SG +3210748672,3210749439,CL +3210749440,3210752255,US +3210752256,3210752511,CL 3210752512,3210755839,US 3210755840,3210755855,MY -3210755856,3210755871,BR -3210755872,3210755967,CL -3210755968,3210756095,BR -3210756096,3210756351,SG +3210755856,3210756095,BR +3210756096,3210756351,CL 3210756352,3210756607,US 3210756608,3210756863,DE 3210756864,3210757119,RU @@ -88868,12 +90460,11 @@ 3210764032,3210764047,IE 3210764048,3210764063,BR 3210764064,3210764095,CL -3210764096,3210764159,US -3210764160,3210764287,BR +3210764096,3210764287,BR 3210764288,3210765055,US 3210765056,3210765071,SE -3210765072,3210765311,BR -3210765312,3210765567,CL +3210765072,3210765087,BR +3210765088,3210765567,CL 3210765568,3210765823,US 3210765824,3210766079,ES 3210766080,3210766335,CL @@ -88890,57 +90481,81 @@ 3210769920,3210770175,TR 3210770176,3210771199,US 3210771200,3210771215,TH -3210771216,3210771455,CL +3210771216,3210771263,CL +3210771264,3210771455,BR 3210771456,3210772479,US 3210772480,3210772735,CL 3210772736,3210773247,US 3210773248,3210773503,MY 3210773504,3210773519,PL -3210773520,3210773759,BR +3210773520,3210773535,BR +3210773536,3210773759,CL 3210773760,3210774271,US 3210774272,3210774287,NO -3210774288,3210774527,BR +3210774288,3210774303,BR +3210774304,3210774527,CL 3210774528,3210774783,US 3210774784,3210774799,IT -3210774800,3210775039,BR +3210774800,3210774815,BR +3210774816,3210775039,CL 3210775040,3210775295,US 3210775296,3210775311,CH -3210775312,3210775551,BR +3210775312,3210775327,BR +3210775328,3210775551,CL 3210775552,3210775807,US -3210775808,3210776319,CL +3210775808,3210775935,CL +3210775936,3210776063,BR +3210776064,3210776191,CL +3210776192,3210776319,BR 3210776320,3210776575,US -3210776576,3210776831,CL +3210776576,3210776703,CL +3210776704,3210776831,BR 3210776832,3210777087,US -3210777088,3210777599,CL +3210777088,3210777215,CL +3210777216,3210777343,BR +3210777344,3210777471,CL +3210777472,3210777599,BR 3210777600,3210778367,US 3210778368,3210778623,IE 3210778624,3210781951,US 3210781952,3210782207,IT -3210782208,3210782975,US +3210782208,3210782719,CL +3210782720,3210782975,US 3210782976,3210782991,TR -3210782992,3210783231,CL +3210782992,3210783039,CL +3210783040,3210783231,BR 3210783232,3210783487,US 3210783488,3210783503,JP -3210783504,3210783743,CL +3210783504,3210783551,CL +3210783552,3210783743,BR 3210783744,3210783999,US 3210784000,3210784015,JP -3210784016,3210784255,CL +3210784016,3210784063,CL +3210784064,3210784255,BR 3210784256,3210784511,US 3210784512,3210784527,BE -3210784528,3210784767,CL +3210784528,3210784575,CL +3210784576,3210784767,BR 3210784768,3210785791,US -3210785792,3210786047,BR +3210785792,3210786047,CL 3210786048,3210786063,AU -3210786064,3210786303,CL +3210786064,3210786111,CL +3210786112,3210786303,BR 3210786304,3210786559,US 3210786560,3210786575,GR 3210786576,3210786591,BR -3210786592,3210787071,CL +3210786592,3210786623,CL +3210786624,3210786687,BR +3210786688,3210787071,CL 3210787072,3210788863,US 3210788864,3210789119,HR -3210789120,3210795007,US +3210789120,3210791935,US +3210791936,3210792447,CL +3210792448,3210795007,US 3210795008,3210796031,IL -3210796032,3210798847,US +3210796032,3210798079,US +3210798080,3210798591,CL +3210798592,3210798847,US 3210798848,3210799103,ES 3210799104,3210802431,US 3210802432,3210802687,ES @@ -88966,15 +90581,12 @@ 3210825728,3210827775,BZ 3210827776,3210829823,DO 3210829824,3210830847,AR -3210830848,3210831871,PE +3210830848,3210831359,PE +3210831360,3210831871,BR 3210831872,3210832895,DO 3210832896,3210835967,AR 3210835968,3210838015,PY -3210838016,3210868735,AR -3210868736,3210869759,US -3210869760,3210870271,AR -3210870272,3210870527,US -3210870528,3210870783,AR +3210838016,3210870783,AR 3210870784,3210903551,CO 3210903552,3210919935,PE 3210919936,3210920959,GT @@ -88989,28 +90601,30 @@ 3211071744,3211071999,DE 3211072000,3211072027,US 3211072028,3211072057,BR -3211072058,3211072287,US +3211072058,3211072127,US +3211072128,3211072255,BR +3211072256,3211072287,US 3211072288,3211072319,NZ -3211072320,3211072511,US +3211072320,3211072511,BR 3211072512,3211073023,NL 3211073024,3211073279,GB 3211073280,3211073535,FR 3211073536,3211074047,US -3211074048,3211074303,NL +3211074048,3211074303,CL 3211074304,3211074559,ES 3211074560,3211074815,NL 3211074816,3211075071,US 3211075072,3211075325,DK 3211075326,3211075326,CL 3211075327,3211075327,DK -3211075328,3211075583,NL +3211075328,3211075583,CL 3211075584,3211076095,US 3211076096,3211076607,LT 3211076608,3211079935,US 3211079936,3211080191,NG 3211080192,3211080703,US 3211080704,3211080959,GB -3211080960,3211081215,IQ +3211080960,3211081215,CL 3211081216,3211081727,CH 3211081728,3211082239,US 3211082240,3211082495,BN @@ -89021,26 +90635,22 @@ 3211083776,3211083791,RU 3211083792,3211083839,CL 3211083840,3211083855,GB -3211083856,3211083903,DE +3211083856,3211083871,DE +3211083872,3211083903,CL 3211083904,3211084031,FR -3211084032,3211084287,DE +3211084032,3211084287,CL 3211084288,3211084303,NL -3211084304,3211084351,DE +3211084304,3211084351,CL 3211084352,3211084367,GB -3211084368,3211084543,DE -3211084544,3211084559,CL +3211084368,3211084383,DE +3211084384,3211084559,CL 3211084560,3211084575,DE 3211084576,3211084671,CL 3211084672,3211084799,BY 3211084800,3211084815,AT -3211084816,3211084863,CL +3211084816,3211084863,DE 3211084864,3211084879,GB -3211084880,3211084895,DE -3211084896,3211084927,CL -3211084928,3211085055,DE -3211085056,3211085071,CL -3211085072,3211085087,DE -3211085088,3211085311,CL +3211084880,3211085311,DE 3211085312,3211085327,GB 3211085328,3211085375,CL 3211085376,3211085391,GB @@ -89050,13 +90660,19 @@ 3211085600,3211085695,CL 3211085696,3211085823,GE 3211085824,3211085839,TH -3211085840,3211085887,DE +3211085840,3211085887,CL 3211085888,3211085903,GB -3211085904,3211086335,DE +3211085904,3211085919,DE +3211085920,3211086095,CL +3211086096,3211086111,DE +3211086112,3211086335,CL 3211086336,3211086351,FR 3211086352,3211086367,DE 3211086368,3211086463,CL -3211086464,3211086847,DE +3211086464,3211086591,DE +3211086592,3211086607,CL +3211086608,3211086623,DE +3211086624,3211086847,CL 3211086848,3211086863,PL 3211086864,3211087359,DE 3211087360,3211087375,GB @@ -89112,13 +90728,13 @@ 3211096064,3211096079,GB 3211096080,3211097103,DE 3211097104,3211097151,GB -3211097152,3211097215,CL +3211097152,3211097215,DE 3211097216,3211097343,GB -3211097344,3211097359,CL -3211097360,3211097375,DE -3211097376,3211097599,CL +3211097344,3211097599,DE 3211097600,3211097855,US -3211097856,3211098111,DE +3211097856,3211097871,CL +3211097872,3211097887,DE +3211097888,3211098111,CL 3211098112,3211098367,US 3211098368,3211098383,CL 3211098384,3211098399,DE @@ -89131,11 +90747,9 @@ 3211099680,3211099711,GB 3211099712,3211099775,DE 3211099776,3211099903,GB -3211099904,3211099919,CL -3211099920,3211099935,DE -3211099936,3211100159,CL +3211099904,3211100159,DE 3211100160,3211101951,US -3211101952,3211102207,SG +3211101952,3211102207,CL 3211102208,3211102335,AU 3211102336,3211102463,BR 3211102464,3211102591,AU @@ -89144,14 +90758,16 @@ 3211102848,3211102975,BR 3211102976,3211103103,AU 3211103104,3211103231,BR -3211103232,3211104767,AU +3211103232,3211104447,AU +3211104448,3211104511,BR +3211104512,3211104703,AU +3211104704,3211104767,BR 3211104768,3211105791,US 3211105792,3211106303,ES 3211106304,3211111423,US 3211111424,3211112447,JP 3211112448,3211112959,US -3211112960,3211113215,CL -3211113216,3211113471,SG +3211112960,3211113471,CL 3211113472,3211113727,GB 3211113728,3211113983,LT 3211113984,3211114239,US @@ -89169,7 +90785,8 @@ 3211129088,3211129343,AT 3211129344,3211129599,SG 3211129600,3211129855,NL -3211129856,3211130111,CL +3211129856,3211129983,CL +3211129984,3211130111,HK 3211130112,3211130367,US 3211130368,3211130623,GR 3211130624,3211130879,TR @@ -89184,49 +90801,27 @@ 3211145216,3211147263,NI 3211147264,3211148287,CR 3211148288,3211165695,CO -3211165696,3211165951,HN -3211165952,3211165983,UY -3211165984,3211166415,HN -3211166416,3211166431,UY -3211166432,3211167487,HN -3211167488,3211167503,US -3211167504,3211167519,HN -3211167520,3211167527,US -3211167528,3211167927,HN -3211167928,3211167935,US -3211167936,3211171487,HN -3211171488,3211171503,ES -3211171504,3211171511,HN -3211171512,3211171519,ES -3211171520,3211171791,HN -3211171792,3211171807,ES -3211171808,3211172047,HN -3211172048,3211172063,NL -3211172064,3211173183,HN -3211173184,3211173199,NL -3211173200,3211173279,HN -3211173280,3211173295,NL -3211173296,3211174415,HN -3211174416,3211174431,CA -3211174432,3211174687,HN -3211174688,3211174703,CA -3211174704,3211174719,HN -3211174720,3211174735,CA -3211174736,3211175199,HN -3211175200,3211175215,BR -3211175216,3211175295,HN -3211175296,3211175327,BR -3211175328,3211177831,HN -3211177832,3211177839,CR -3211177840,3211178583,HN +3211165696,3211166559,HN +3211166560,3211166567,UY +3211166568,3211169279,HN +3211169280,3211169535,US +3211169536,3211171071,HN +3211171072,3211171327,US +3211171328,3211172271,HN +3211172272,3211172279,NL +3211172280,3211172671,HN +3211172672,3211172687,NL +3211172688,3211178583,HN 3211178584,3211178591,ES -3211178592,3211178671,HN -3211178672,3211178703,ES -3211178704,3211180887,HN -3211180888,3211180895,CR -3211180896,3211181119,HN -3211181120,3211181135,CR -3211181136,3211182079,HN +3211178592,3211179087,HN +3211179088,3211179103,US +3211179104,3211179199,HN +3211179200,3211179231,US +3211179232,3211181215,HN +3211181216,3211181231,CR +3211181232,3211181439,HN +3211181440,3211181447,CA +3211181448,3211182079,HN 3211182080,3211194367,CO 3211194368,3211195391,DO 3211195392,3211214847,AR @@ -89311,7 +90906,8 @@ 3220033536,3220037631,IE 3220037632,3220039679,US 3220039680,3220040703,NL -3220040704,3220041215,JP +3220040704,3220040959,JP +3220040960,3220041215,BR 3220041216,3220041471,HK 3220041472,3220041727,BR 3220041728,3220042239,JP @@ -89325,7 +90921,10 @@ 3220063744,3220066303,US 3220066304,3220070399,JP 3220070400,3220078591,IE -3220078592,3220127743,US +3220078592,3220080639,BR +3220080640,3220094975,US +3220094976,3220103167,BR +3220103168,3220127743,US 3220127744,3220135935,AU 3220135936,3220152319,JP 3220152320,3220161535,AU @@ -89640,10 +91239,8 @@ 3223435008,3223437311,US 3223437312,3223447551,CH 3223447552,3223447807,US -3223447808,3223448063,NL -3223448064,3223449087,US -3223449088,3223449343,NL -3223449344,3223453183,US +3223447808,3223449599,NL +3223449600,3223453183,US 3223453184,3223453439,DE 3223453440,3223458559,US 3223458560,3223458815,GB @@ -89667,7 +91264,7 @@ 3223481088,3223481343,SE 3223481344,3223483391,US 3223483392,3223483647,NL -3223483904,3223499519,US +3223483648,3223499519,US 3223499520,3223499775,FI 3223499776,3223504639,US 3223504640,3223504895,CA @@ -89807,7 +91404,7 @@ 3223906304,3223909375,CA 3223909376,3223911935,US 3223911936,3223912191,CA -3223912448,3223938815,US +3223912192,3223938815,US 3223938816,3223946239,GB 3223946240,3223947519,CH 3223947520,3223948287,US @@ -90116,8 +91713,8 @@ 3225081088,3225081343,CA 3225081344,3225082367,US 3225082368,3225082623,IT -3225082624,3225084671,US -3225084672,3225085183,NL +3225082624,3225084415,US +3225084416,3225085183,NL 3225085184,3225085439,ES 3225085440,3225089279,US 3225089280,3225089535,CA @@ -90334,7 +91931,9 @@ 3225847552,3225847807,AU 3225847808,3225848063,IT 3225848064,3225848831,US -3225848832,3225853951,DE +3225848832,3225849855,DE +3225849856,3225850111,US +3225850112,3225853951,DE 3225853952,3225857023,US 3225857024,3225857279,CA 3225857280,3225857535,US @@ -90451,9 +92050,7 @@ 3226067456,3226067711,BE 3226067712,3226068223,US 3226068224,3226068479,GB -3226068480,3226074879,US -3226074880,3226075135,AT -3226075136,3226110719,US +3226068480,3226110719,US 3226110720,3226128639,AU 3226128640,3226140927,US 3226140928,3226143487,CA @@ -90582,8 +92179,7 @@ 3226581248,3226583295,US 3226583296,3226583551,CA 3226583552,3226583807,SE -3226583808,3226585087,US -3226587136,3226590207,US +3226583808,3226590207,US 3226590208,3226591231,NL 3226591232,3226592255,CA 3226592256,3226592767,US @@ -90874,8 +92470,8 @@ 3227312384,3227320319,US 3227320320,3227362047,FR 3227362048,3227362303,US -3227362304,3227362559,GB -3227362560,3227385855,FR +3227362304,3227363327,GB +3227363328,3227385855,FR 3227385856,3227391999,US 3227392000,3227392255,PT 3227392256,3227393023,US @@ -90975,9 +92571,7 @@ 3227467776,3227468287,US 3227468288,3227468799,CA 3227468800,3227484159,US -3227484160,3227503871,CA -3227503872,3227504127,US -3227504128,3227517183,CA +3227484160,3227517183,CA 3227517184,3227518719,ZA 3227518720,3227519231,MU 3227519232,3227521279,ZA @@ -90985,8 +92579,7 @@ 3227521792,3227522559,ZA 3227522560,3227522815,MU 3227522816,3227523071,US -3227523072,3227524607,MU -3227524608,3227525119,ZA +3227523072,3227525119,ZA 3227525120,3227525375,MU 3227525376,3227526143,ZA 3227526144,3227526399,US @@ -91261,7 +92854,8 @@ 3227818496,3227818751,GB 3227818752,3227819263,MX 3227819264,3227819519,AR -3227819520,3227822847,MX +3227819520,3227822079,MX +3227822336,3227822847,MX 3227822848,3227823103,HN 3227823104,3227824383,MX 3227824384,3227824639,BR @@ -91317,9 +92911,9 @@ 3227879680,3227879935,GB 3227879936,3227880959,US 3227880960,3227881215,EG -3227881216,3227883319,US -3227883320,3227883320,CA -3227883321,3227885823,US +3227881216,3227883007,US +3227883008,3227883519,CA +3227883520,3227885823,US 3227885824,3227887871,ES 3227887872,3227888127,PR 3227888128,3227888383,BE @@ -91513,6 +93107,7 @@ 3228297984,3228298495,NL 3228298496,3228309247,US 3228309248,3228311039,DE +3228311296,3228311551,DE 3228311808,3228312063,DE 3228312320,3228316159,DE 3228316160,3228316415,US @@ -91796,7 +93391,9 @@ 3229391360,3229391615,CN 3229391616,3229391871,AT 3229391872,3229395455,US -3229395456,3229408255,RU +3229395456,3229401087,RU +3229401088,3229405183,GB +3229405184,3229408255,RU 3229408256,3229412095,US 3229412096,3229412351,DE 3229412352,3229412607,US @@ -92152,16 +93749,14 @@ 3230370560,3230370815,US 3230370816,3230372607,CA 3230372608,3230372863,US -3230372864,3230374399,CA -3230374400,3230374655,US -3230374656,3230383359,CA +3230372864,3230383359,CA 3230383360,3230383615,US 3230383616,3230384127,CA 3230384128,3230384383,MF 3230384384,3230387455,CA 3230387456,3230387711,US 3230387712,3230400255,CA -3230400256,3230400767,US +3230400256,3230402559,US 3230433280,3230436351,CN 3230436352,3230437375,AU 3230437376,3230439423,PK @@ -92779,7 +94374,8 @@ 3231737600,3231738367,US 3231738368,3231738623,NL 3231738624,3231739135,US -3231739136,3231739647,NL +3231739136,3231739391,GB +3231739392,3231739647,PL 3231739648,3231739903,BR 3231739904,3231742719,US 3231742720,3231742975,FR @@ -93115,9 +94711,7 @@ 3233487872,3233488895,CA 3233488896,3233546751,US 3233546752,3233547007,CA -3233547008,3233547519,US -3233547520,3233547775,CA -3233547776,3233548799,US +3233547008,3233548799,US 3233548800,3233549055,PT 3233549056,3233549311,BR 3233549312,3233557247,US @@ -93127,7 +94721,7 @@ 3233562368,3233562879,GB 3233562880,3233563135,FR 3233563136,3233563903,US -3233563904,3233564159,GB +3233563904,3233564159,NL 3233564160,3233564415,US 3233564416,3233564671,NZ 3233564672,3233564927,US @@ -93198,7 +94792,7 @@ 3233617664,3233617919,GB 3233617920,3233618175,JP 3233618176,3233620479,US -3233620480,3233620735,AU +3233620480,3233620735,NZ 3233620736,3233620991,US 3233620992,3233622015,CA 3233622016,3233622271,US @@ -93250,8 +94844,7 @@ 3233676288,3233677311,US 3233677312,3233677567,CA 3233677568,3233684991,US -3233684992,3233685247,MX -3233685248,3233685503,BR +3233684992,3233685503,MX 3233685504,3233688575,US 3233688576,3233688831,GB 3233688832,3233692159,US @@ -93375,7 +94968,7 @@ 3234015744,3234016255,IE 3234016256,3234019327,AU 3234019328,3234023423,US -3234023424,3234023679,PL +3234023424,3234023679,NL 3234023680,3234030079,US 3234030080,3234030335,DE 3234030336,3234031103,US @@ -93446,20 +95039,14 @@ 3234198784,3234199039,US 3234199040,3234201343,CA 3234201344,3234203647,US -3234203648,3234205183,BR -3234205184,3234205439,AR -3234205440,3234205695,BR +3234203648,3234205695,AR 3234205696,3234226431,US 3234226432,3234226687,IN 3234226688,3234226983,US 3234226984,3234226991,CA 3234226992,3234227455,US -3234227456,3234227839,CA -3234227840,3234227871,US -3234227872,3234227903,CA -3234227904,3234227935,US -3234227936,3234227951,CA -3234227952,3234228223,US +3234227456,3234227711,CA +3234227712,3234228223,US 3234228224,3234228287,CA 3234228288,3234229215,US 3234229216,3234229223,SE @@ -93506,7 +95093,7 @@ 3234557440,3234564607,US 3234564608,3234566911,KR 3234566912,3234568703,US -3234568704,3234568959,AU +3234568704,3234568959,NZ 3234568960,3234569215,US 3234569728,3234569983,CL 3234569984,3234574335,US @@ -93606,7 +95193,9 @@ 3234841600,3234841855,PT 3234841856,3234842367,AU 3234842368,3234842623,US -3234842624,3234844415,BR +3234842624,3234843647,BR +3234843648,3234844159,MX +3234844160,3234844415,BR 3234844416,3234853375,US 3234853376,3234853631,TH 3234853632,3234853887,US @@ -93625,7 +95214,9 @@ 3235044376,3235044383,GB 3235044384,3235045375,US 3235045376,3235045887,CA -3235045888,3235065343,US +3235045888,3235046831,US +3235046832,3235046847,AF +3235046848,3235065343,US 3235065344,3235065855,CA 3235065856,3235068511,US 3235068512,3235068575,IT @@ -93649,12 +95240,17 @@ 3235641856,3235642111,US 3235642112,3235643135,CA 3235643136,3235745791,US -3235745792,3235745792,DE -3235745793,3235747839,US +3235745792,3235746047,DE +3235746048,3235746303,US +3235746304,3235746559,DE +3235746560,3235747839,US 3235747840,3235748095,GB 3235748096,3235748351,US 3235748352,3235748607,GB -3235748608,3235774719,US +3235748608,3235753983,US +3235753984,3235754239,SG +3235754240,3235754495,JP +3235754496,3235774719,US 3235774720,3235776767,CA 3235776768,3235800575,US 3235800576,3235801087,CA @@ -93748,13 +95344,13 @@ 3236102400,3236106239,PH 3236106240,3236140543,US 3236140544,3236141055,CA -3236141056,3236142335,US -3236142336,3236142463,CA -3236142464,3236146195,US +3236141056,3236146195,US 3236146196,3236146199,GB 3236146200,3236147063,US 3236147064,3236147071,FR -3236147072,3236157951,US +3236147072,3236156959,US +3236156960,3236156967,GB +3236156968,3236157951,US 3236157952,3236158207,GB 3236158208,3236167935,US 3236167936,3236175871,CA @@ -93840,7 +95436,9 @@ 3236416256,3236416511,AU 3236416512,3236418559,US 3236418560,3236418815,AU -3236418816,3236427519,US +3236418816,3236424959,US +3236424960,3236425215,MU +3236425472,3236427519,US 3236427520,3236427775,CA 3236427776,3236429311,US 3236429312,3236429567,MU @@ -93953,13 +95551,7 @@ 3237036544,3237036799,CN 3237036800,3237038079,US 3237038080,3237038335,CA -3237038336,3237038847,US -3237038848,3237038863,AE -3237038864,3237038879,US -3237038880,3237038911,AE -3237038912,3237038927,US -3237038928,3237039103,AE -3237039104,3237039183,US +3237038336,3237039183,US 3237039184,3237039199,IN 3237039200,3237039215,US 3237039216,3237039295,IN @@ -93971,9 +95563,7 @@ 3237040896,3237041151,IN 3237041152,3237041183,US 3237041184,3237041199,IN -3237041200,3237041407,US -3237041408,3237041663,CA -3237041664,3237043967,US +3237041200,3237043967,US 3237043968,3237044223,CH 3237044224,3237046647,US 3237046648,3237046655,SE @@ -93981,7 +95571,8 @@ 3237047040,3237047295,FR 3237047296,3237048831,US 3237048832,3237049087,IN -3237049088,3237049599,CA +3237049088,3237049343,US +3237049344,3237049599,CA 3237049600,3237050111,US 3237050112,3237050159,GB 3237050160,3237050175,US @@ -93994,7 +95585,8 @@ 3237125312,3237154815,US 3237154816,3237155839,ES 3237155840,3237156863,AU -3237156864,3237167103,US +3237156864,3237170175,US +3237170176,3237171199,CA 3237171200,3237182463,US 3237182464,3237183487,NL 3237183488,3237205503,US @@ -94066,7 +95658,9 @@ 3237554432,3237554434,SG 3237554435,3237554435,US 3237554436,3237554463,SG -3237554464,3237568511,US +3237554464,3237554943,US +3237554944,3237555199,SG +3237555200,3237568511,US 3237568512,3237572607,CA 3237572608,3237576703,US 3237576704,3237609471,CA @@ -94116,27 +95710,8 @@ 3237773312,3237777407,CA 3237777408,3237781503,US 3237781504,3237785599,CA -3237785600,3237785647,CN -3237785648,3237785663,US -3237785664,3237785743,CN -3237785744,3237785751,US -3237785752,3237785839,CN -3237785840,3237785855,US -3237785856,3237785943,CN -3237785944,3237785951,US -3237785952,3237786047,CN -3237786048,3237786055,US -3237786056,3237786151,CN -3237786152,3237786159,US -3237786160,3237786239,CN -3237786240,3237786247,US -3237786248,3237786303,CN -3237786304,3237786319,US -3237786320,3237786415,CN -3237786416,3237786423,US -3237786424,3237786527,CN -3237786528,3237786535,US -3237786536,3237786711,CN +3237785600,3237786623,US +3237786624,3237786711,CN 3237786712,3237786719,US 3237786720,3237786759,CN 3237786760,3237786767,US @@ -94168,29 +95743,15 @@ 3237788080,3237788087,US 3237788088,3237788151,CN 3237788152,3237788159,US -3237788160,3237788223,CN -3237788224,3237788239,US -3237788240,3237788279,CN +3237788160,3237788167,CN +3237788168,3237788175,US +3237788176,3237788223,CN +3237788224,3237788263,US +3237788264,3237788279,CN 3237788280,3237788287,US -3237788288,3237788455,CN -3237788456,3237788471,US -3237788472,3237788487,CN -3237788488,3237788551,US -3237788552,3237788559,CN -3237788560,3237788583,US -3237788584,3237788591,CN -3237788592,3237788727,US -3237788728,3237788855,CN -3237788856,3237788863,US -3237788864,3237788903,CN -3237788904,3237788911,US -3237788912,3237788927,CN -3237788928,3237788935,US -3237788936,3237788943,CN -3237788944,3237788951,US -3237788952,3237789071,CN -3237789072,3237789079,US -3237789080,3237789247,CN +3237788288,3237788415,CN +3237788416,3237789183,US +3237789184,3237789247,CN 3237789248,3237789255,US 3237789256,3237789311,CN 3237789312,3237789319,US @@ -94650,7 +96211,7 @@ 3239063552,3239075839,DE 3239075840,3239076095,GB 3239076096,3239076351,DE -3239076352,3239076607,RU +3239076352,3239076607,CH 3239076608,3239076863,PL 3239076864,3239077119,NL 3239077120,3239077375,UA @@ -94666,7 +96227,7 @@ 3239088640,3239088895,DK 3239088896,3239089151,IL 3239089152,3239089407,RO -3239089408,3239089919,GB +3239089664,3239089919,GB 3239089920,3239090175,DE 3239090176,3239090431,SI 3239090432,3239090687,ES @@ -94798,7 +96359,7 @@ 3239264768,3239266303,RU 3239266816,3239267327,UA 3239267328,3239267839,FR -3239267840,3239268351,DE +3239267840,3239268351,CH 3239268352,3239268863,SE 3239268864,3239269375,RU 3239269376,3239270399,UA @@ -95834,7 +97395,7 @@ 3240855552,3240857599,IT 3240857600,3240857855,PL 3240858624,3240858879,PL -3240859136,3240859391,GB +3240859136,3240859391,NL 3240859392,3240859647,SE 3240859648,3240861183,CH 3240861184,3240861439,AT @@ -96111,7 +97672,9 @@ 3242609920,3242610047,GB 3242610048,3242610271,FR 3242610272,3242610303,FI -3242610304,3242615167,FR +3242610304,3242614527,FR +3242614528,3242614783,PL +3242614784,3242615167,FR 3242615168,3242615295,IE 3242615296,3242615871,FR 3242615872,3242615935,PL @@ -96128,7 +97691,10 @@ 3242618496,3242620223,FR 3242620224,3242620239,PT 3242620240,3242620255,ES -3242620256,3242622975,FR +3242620256,3242622915,FR +3242622916,3242622927,PL +3242622928,3242622959,FR +3242622960,3242622975,PL 3242622976,3242655743,IT 3242655744,3242721279,NO 3242721280,3242852351,CH @@ -96288,7 +97854,6 @@ 3244819456,3244819711,GB 3244819712,3244819967,RO 3244819968,3244820223,NL -3244820224,3244820479,UA 3244820480,3244820735,BE 3244820736,3244820991,DE 3244820992,3244821247,SI @@ -96555,7 +98120,7 @@ 3244897536,3244897791,RU 3244897792,3244898047,GB 3244898048,3244898303,DE -3244898304,3244898559,IR +3244898304,3244898559,KW 3244898560,3244898815,GI 3244899072,3244899327,RU 3244899328,3244899583,BG @@ -96823,7 +98388,6 @@ 3245066240,3245067263,UA 3245067264,3245068287,GB 3245069312,3245070335,PL -3245070336,3245071359,RU 3245071360,3245072383,NL 3245072384,3245073407,UA 3245073408,3245076479,RU @@ -97031,7 +98595,9 @@ 3245215744,3245217791,UA 3245217792,3245218815,DE 3245218816,3245219839,AT -3245219840,3245221887,FI +3245219840,3245220863,FI +3245220864,3245221119,SE +3245221120,3245221887,FI 3245221888,3245223935,DE 3245223936,3245225471,NL 3245225728,3245225983,NL @@ -97209,7 +98775,8 @@ 3246129152,3246131711,RU 3246131712,3246132735,SY 3246132736,3246132991,DE -3246132992,3246135807,RU +3246132992,3246134271,RU +3246134784,3246135807,RU 3246135808,3246136831,SY 3246136832,3246138879,RU 3246138880,3246139391,SY @@ -97244,7 +98811,7 @@ 3246182400,3246186495,SY 3246186496,3246187519,RU 3246187520,3246190591,SY -3246190592,3246191615,GB +3246190592,3246191615,US 3246191616,3246192639,DE 3246192640,3246193663,PS 3246193664,3246194175,SY @@ -97676,7 +99243,6 @@ 3248792320,3248792343,GB 3248792352,3248792407,GB 3248792416,3248792439,GB -3248792456,3248792463,GB 3248792480,3248792527,GB 3248792536,3248792575,GB 3248796608,3248796863,GB @@ -98305,8 +99871,7 @@ 3251114496,3251114751,RU 3251114752,3251115007,RO 3251115008,3251115263,PL -3251115264,3251115519,RU -3251115520,3251115775,UA +3251115264,3251115775,RU 3251115776,3251116031,BE 3251116288,3251116543,GB 3251117056,3251117311,BG @@ -98378,7 +99943,8 @@ 3251151104,3251151359,UA 3251151360,3251151615,DE 3251151872,3251152127,NL -3251152128,3251152639,RO +3251152128,3251152383,RO +3251152384,3251152639,GB 3251152896,3251153151,RU 3251153408,3251153663,TR 3251153664,3251153919,FR @@ -98418,7 +99984,7 @@ 3251163904,3251164159,RU 3251164160,3251164415,UA 3251164416,3251164671,IT -3251164672,3251164927,NL +3251164672,3251164927,GB 3251164928,3251165439,PL 3251165696,3251165951,DE 3251165952,3251166207,UA @@ -98658,12 +100224,10 @@ 3251634176,3251896319,FI 3251896320,3252158463,NO 3252158464,3252174847,LT -3252174848,3252176127,NL -3252176128,3252177919,SE +3252174848,3252175871,NL +3252175872,3252177919,SE 3252177920,3252178943,HR -3252178944,3252179199,SE -3252179200,3252179967,NL -3252179968,3252191231,SE +3252178944,3252191231,SE 3252191232,3252196351,HR 3252196352,3252197119,LT 3252197120,3252197375,SE @@ -98968,7 +100532,11 @@ 3253248000,3253248255,DE 3253248256,3253270527,RU 3253270528,3253271551,BY -3253271552,3253338111,RU +3253271552,3253313535,RU +3253313536,3253313791,NL +3253313792,3253317631,RU +3253317632,3253319679,GB +3253319680,3253338111,RU 3253338112,3253338367,PL 3253338368,3253380351,SE 3253380352,3253380607,GB @@ -99151,7 +100719,8 @@ 3253704704,3253705215,UA 3253705728,3253706239,DE 3253706240,3253706751,RO -3253706752,3253708799,DE +3253707264,3253707775,DE +3253707776,3253708287,MD 3253708800,3253709311,DK 3253709312,3253709823,UA 3253709824,3253710335,RO @@ -99191,129 +100760,189 @@ 3253729792,3253730303,UA 3253730304,3253730815,RO 3253730816,3253731327,UA -3253731328,3253731583,DE -3253731584,3253737215,GB +3253731328,3253731713,DE +3253731714,3253731714,GB +3253731715,3253731839,DE +3253731840,3253732351,GB +3253732352,3253733375,DE +3253733376,3253734399,GB +3253734400,3253734979,DE +3253734980,3253734980,GB +3253734981,3253735167,DE +3253735168,3253735423,GB +3253735424,3253735425,DE +3253735426,3253735426,GB +3253735427,3253735679,DE +3253735680,3253735935,GB +3253735936,3253737215,DE 3253737216,3253737471,ES -3253737472,3253737791,GB +3253737472,3253737605,DE +3253737606,3253737606,GB +3253737607,3253737791,DE 3253737792,3253737807,FR -3253737808,3253737823,GB +3253737808,3253737823,DE 3253737824,3253737831,PL 3253737832,3253737839,AT -3253737840,3253737847,GB +3253737840,3253737847,DE 3253737848,3253737855,HU -3253737856,3253738559,GB +3253737856,3253738495,DE +3253738496,3253738559,GB 3253738560,3253738567,CZ 3253738568,3253738569,BE 3253738570,3253738570,US 3253738571,3253738575,BE -3253738576,3253741679,GB +3253738576,3253740543,GB +3253740544,3253741615,DE +3253741616,3253741631,GB +3253741632,3253741679,DE 3253741680,3253741695,RU -3253741696,3253741730,GB +3253741696,3253741730,DE 3253741731,3253741731,SE -3253741732,3253742227,GB +3253741732,3253741816,DE +3253741817,3253741817,GB +3253741818,3253742079,DE +3253742080,3253742227,GB 3253742228,3253742228,US -3253742229,3253744415,GB +3253742229,3253742335,GB +3253742336,3253742591,DE +3253742592,3253744415,GB 3253744416,3253744447,CH 3253744448,3253744511,GB 3253744512,3253744512,US -3253744513,3253745983,GB +3253744513,3253744895,GB +3253744896,3253744908,DE +3253744909,3253744909,GB +3253744910,3253745919,DE +3253745920,3253745983,GB 3253745984,3253745999,SE 3253746000,3253746007,DK 3253746008,3253746015,IE 3253746016,3253746023,AT 3253746024,3253746031,CH 3253746032,3253746039,FI -3253746040,3253746047,GB +3253746040,3253746047,DE 3253746048,3253746111,IT 3253746112,3253746175,DE -3253746176,3253760511,GB +3253746176,3253746431,GB +3253746432,3253746559,DE +3253746560,3253746687,GB +3253746688,3253747711,DE +3253747712,3253759999,GB +3253760000,3253760511,DE 3253760512,3253760767,FR -3253760768,3253761407,GB +3253760768,3253761407,DE 3253761408,3253761416,ES 3253761417,3253761417,GB 3253761418,3253761471,ES -3253761472,3253762815,GB +3253761472,3253762815,DE 3253762816,3253762943,CH -3253762944,3253763071,GB +3253762944,3253762948,DE +3253762949,3253762949,GB +3253762950,3253763071,DE 3253763072,3253763327,SE -3253763328,3253765119,GB +3253763328,3253763583,DE +3253763584,3253763839,GB +3253763840,3253764095,DE +3253764096,3253765119,GB 3253765120,3253765183,ES 3253765184,3253765247,FR 3253765248,3253765279,PL 3253765280,3253765295,NL 3253765296,3253765311,BE 3253765312,3253765375,TR -3253765376,3253766463,GB +3253765376,3253766143,DE +3253766144,3253766463,GB 3253766464,3253766527,NL 3253766528,3253766655,GB 3253766656,3253766911,FR 3253766912,3253767167,GB 3253767168,3253767615,DE 3253767616,3253767675,IE -3253767676,3253767679,DE -3253767680,3253767711,GB -3253767712,3253767743,DE -3253767744,3253768369,GB +3253767676,3253767811,DE +3253767812,3253767812,GB +3253767813,3253767935,DE +3253767936,3253768369,GB 3253768370,3253768370,ES 3253768371,3253768393,GB 3253768394,3253768394,SE 3253768395,3253768565,GB 3253768566,3253768566,DE -3253768567,3253769362,GB -3253769363,3253769363,DE -3253769364,3253769455,GB -3253769456,3253769463,DE -3253769464,3253770983,GB -3253770984,3253770984,DE -3253770985,3253771199,GB +3253768567,3253768703,GB +3253768704,3253768729,DE +3253768730,3253768730,GB +3253768731,3253770657,DE +3253770658,3253770658,GB +3253770659,3253770699,DE +3253770700,3253770700,GB +3253770701,3253770991,DE +3253770992,3253770999,GB +3253771000,3253771165,DE +3253771166,3253771166,GB +3253771167,3253771199,DE 3253771200,3253771263,IE -3253771264,3253771561,GB +3253771264,3253771519,DE +3253771520,3253771561,GB 3253771562,3253771562,DE -3253771563,3253772063,GB -3253772064,3253772095,DE -3253772096,3253772519,GB -3253772520,3253772527,DE -3253772528,3253773055,GB -3253773056,3253773311,DE -3253773312,3253774583,GB -3253774584,3253774591,DE -3253774592,3253775183,GB +3253771563,3253771775,GB +3253771776,3253772191,DE +3253772192,3253772207,GB +3253772208,3253772311,DE +3253772312,3253772319,GB +3253772320,3253774335,DE +3253774336,3253774583,GB +3253774584,3253775135,DE +3253775136,3253775151,GB +3253775152,3253775183,DE 3253775184,3253775191,FR -3253775192,3253775215,GB -3253775216,3253775223,DE -3253775224,3253775586,GB -3253775587,3253775587,DE -3253775588,3253775599,GB +3253775192,3253775401,DE +3253775402,3253775402,GB +3253775403,3253775468,DE +3253775469,3253775469,GB +3253775470,3253775599,DE 3253775600,3253775607,IT -3253775608,3253775807,GB +3253775608,3253775615,DE +3253775616,3253775807,GB 3253775808,3253775823,DE -3253775824,3253776159,GB -3253776160,3253776175,DE -3253776176,3253776303,GB +3253775824,3253775871,GB +3253775872,3253776303,DE 3253776304,3253776311,ES -3253776312,3253776809,GB +3253776312,3253776383,DE +3253776384,3253776809,GB 3253776810,3253776810,CH -3253776811,3253777791,GB +3253776811,3253777407,GB +3253777408,3253777791,DE 3253777792,3253777855,FR -3253777856,3253778231,GB +3253777856,3253778231,DE 3253778232,3253778239,FR -3253778240,3253778271,GB -3253778272,3253778287,DE -3253778288,3253778391,GB +3253778240,3253778391,DE 3253778392,3253778399,IT -3253778400,3253778751,GB +3253778400,3253778751,DE 3253778752,3253778879,BE -3253778880,3253779215,GB -3253779216,3253779247,DE -3253779248,3253781247,GB -3253781248,3253781415,DE +3253778880,3253778911,DE +3253778912,3253778943,NL +3253778944,3253779135,DE +3253779136,3253779167,NL +3253779168,3253779455,DE +3253779456,3253779711,GB +3253779712,3253781415,DE 3253781416,3253781423,GB 3253781424,3253781503,DE 3253781504,3253781615,GB 3253781616,3253781631,FR -3253781632,3253783487,GB +3253781632,3253782015,GB +3253782016,3253782527,DE +3253782528,3253783487,GB 3253783488,3253783519,DE -3253783520,3253796863,GB +3253783520,3253783551,GB +3253783552,3253784803,DE +3253784804,3253784804,GB +3253784805,3253785123,DE +3253785124,3253785124,GB +3253785125,3253788079,DE +3253788080,3253788082,GB +3253788083,3253794303,DE +3253794304,3253796607,GB +3253796608,3253796863,DE 3253796864,3253862399,SE 3253862400,3253862655,GB 3253862656,3253882879,FR @@ -99727,7 +101356,6 @@ 3254893568,3254894079,CZ 3254894080,3254894335,CH 3254894336,3254894591,SK -3254894592,3254894847,DK 3254894848,3254895103,UA 3254895104,3254895359,GB 3254895360,3254895615,UA @@ -100114,9 +101742,7 @@ 3255743744,3255743999,US 3255744000,3255752959,SE 3255752960,3255753215,LI -3255753216,3255760895,SE -3255760896,3255761151,FO -3255761152,3255762431,SE +3255753216,3255762431,SE 3255762432,3255762943,BE 3255762944,3255771135,DE 3255779328,3255787519,DE @@ -100167,7 +101793,7 @@ 3256410112,3256410623,TR 3256410624,3256411135,GR 3256411136,3256411647,FR -3256411648,3256412159,DE +3256411648,3256412159,CH 3256412672,3256413183,RO 3256413184,3256413695,UA 3256413696,3256414207,PL @@ -100450,9 +102076,9 @@ 3257467904,3257468927,IT 3257469184,3257469439,IT 3257469952,3257470975,PL -3257470976,3257471999,FI +3257470976,3257471999,GB 3257472000,3257472511,SG -3257472512,3257475071,FI +3257472512,3257475071,GB 3257476864,3257477119,DE 3257481472,3257481727,DE 3257482240,3257482751,GB @@ -100702,7 +102328,10 @@ 3258230784,3258232831,NO 3258232832,3258249215,SE 3258249216,3258253311,NO -3258253312,3258269695,NL +3258253312,3258265599,NL +3258267648,3258268671,NL +3258268672,3258268927,IT +3258269184,3258269695,NL 3258271744,3258272767,NL 3258272768,3258273791,FR 3258273792,3258288127,NL @@ -100760,10 +102389,11 @@ 3258511360,3258515455,CH 3258515456,3258580991,FR 3258580992,3258587135,SY -3258587136,3258588159,GB +3258587136,3258588159,US 3258588160,3258593279,RU 3258593280,3258595327,SY -3258595328,3258599423,RU +3258595328,3258597375,RU +3258597888,3258599423,RU 3258599424,3258600959,PS 3258600960,3258613759,RU 3258613760,3258619903,SY @@ -100773,7 +102403,7 @@ 3258621952,3258630143,RU 3258630144,3258634239,SE 3258634240,3258636287,SY -3258636288,3258637311,GB +3258636288,3258637311,US 3258637312,3258637823,PS 3258637824,3258638335,RU 3258638336,3258642431,SY @@ -100931,7 +102561,6 @@ 3259302400,3259303423,CH 3259303424,3259305983,SE 3259305984,3259310079,NL -3259310336,3259311103,DK 3259311104,3259311615,DE 3259317248,3259318271,CH 3259318272,3259318343,GB @@ -100997,8 +102626,8 @@ 3259334544,3259334551,IE 3259334552,3259334655,GB 3259334656,3259338751,DE -3259338752,3259339263,GB -3259339520,3259341823,GB +3259338752,3259339007,GB +3259340800,3259341823,GB 3259342848,3259344895,CH 3259347456,3259347711,CH 3259348224,3259348479,CH @@ -101024,7 +102653,7 @@ 3259454976,3259457279,SE 3259457280,3259457535,IT 3259457536,3259466239,SE -3259466240,3259466495,LI +3259466240,3259466495,HU 3259466496,3259470847,SE 3259470848,3259471871,US 3259471872,3259479807,SE @@ -101261,7 +102890,7 @@ 3261759488,3261767679,IE 3261767680,3261775871,RS 3261775872,3261776383,PL -3261776384,3261777407,RU +3261776384,3261776895,RU 3261777408,3261777449,GB 3261777450,3261777451,NL 3261777452,3261777919,GB @@ -101350,8 +102979,8 @@ 3262034512,3262034519,AX 3262034520,3262034943,FI 3262034944,3262035199,AX -3262035200,3262036991,FI -3262036992,3262038015,AX +3262035200,3262035967,FI +3262035968,3262038015,AX 3262038016,3262038271,FR 3262038528,3262038783,IL 3262038784,3262039039,NO @@ -102274,7 +103903,7 @@ 3262477468,3262477471,AT 3262477472,3262477475,DE 3262477476,3262477479,FR -3262477480,3262477483,SE +3262477480,3262477483,DE 3262477484,3262477487,NL 3262477488,3262477503,DE 3262477504,3262477507,FR @@ -102953,8 +104582,7 @@ 3262479754,3262479754,FR 3262479755,3262479755,NL 3262479756,3262479756,FR -3262479757,3262479757,SE -3262479758,3262479763,DE +3262479757,3262479763,DE 3262479764,3262479764,FR 3262479765,3262479765,DE 3262479766,3262479766,CH @@ -103281,7 +104909,7 @@ 3263100416,3263100671,DE 3263100672,3263100927,GB 3263100928,3263101183,AT -3263101184,3263101439,SE +3263101184,3263101439,CH 3263101440,3263101695,DK 3263101952,3263102207,LT 3263102208,3263102463,GB @@ -103377,7 +105005,8 @@ 3263632384,3263632639,UA 3263632640,3263633151,RU 3263633152,3263633663,UA -3263633664,3263635455,RU +3263633664,3263633919,RU +3263634432,3263635455,RU 3263635456,3263636223,UA 3263636224,3263636479,RU 3263636480,3263636991,UA @@ -103387,7 +105016,7 @@ 3263638528,3263639039,UA 3263639040,3263639295,RU 3263639296,3263639551,DE -3263639552,3263640575,GB +3263639552,3263640575,US 3263640576,3263647743,RU 3263647744,3263651619,LT 3263651620,3263651620,RU @@ -103399,7 +105028,7 @@ 3263657472,3263657727,DE 3263657728,3263660031,RU 3263660032,3263661055,DE -3263661056,3263666175,RU +3263661568,3263666175,RU 3263666176,3263676415,AZ 3263676416,3263678463,RU 3263678464,3263680511,DE @@ -103627,7 +105256,9 @@ 3264610304,3264614399,FR 3264614400,3264614911,GB 3264614912,3264615167,SE -3264615168,3264616263,GB +3264615168,3264615575,GB +3264615576,3264615579,CH +3264615580,3264616263,GB 3264616264,3264616271,CH 3264616272,3264616335,GB 3264616336,3264616337,CH @@ -103686,7 +105317,8 @@ 3264670720,3264671231,FR 3264671232,3264671743,PL 3264671744,3264672255,DE -3264672256,3264672767,RO +3264672256,3264672511,FR +3264672512,3264672767,RO 3264672768,3264673279,CH 3264673280,3264673791,PL 3264673792,3264674303,CH @@ -103950,9 +105582,7 @@ 3265650688,3265658879,SE 3265658880,3265724415,AT 3265724416,3265789951,FR -3265789952,3265824767,GB -3265824768,3265825023,US -3265825024,3265867775,GB +3265789952,3265867775,GB 3265868288,3265868543,GB 3265868800,3265869055,DE 3265871872,3265875967,GB @@ -104594,9 +106224,7 @@ 3270672384,3270680575,GB 3270680576,3270684671,IL 3270684672,3270688767,FR -3270688768,3270716167,IT -3270716168,3270716171,SI -3270716172,3270772079,IT +3270688768,3270772079,IT 3270772080,3270772087,NL 3270772088,3270836223,IT 3270836224,3270901759,DE @@ -104849,7 +106477,7 @@ 3271744512,3271745023,AT 3271745024,3271745535,PL 3271745536,3271746047,GB -3271746048,3271746559,RO +3271746048,3271746559,CZ 3271746560,3271747071,US 3271747072,3271747583,KZ 3271747584,3271748095,RU @@ -105054,6 +106682,7 @@ 3272216912,3272216927,DE 3272216960,3272217007,GB 3272217088,3272217151,GB +3272217152,3272217159,BE 3272217216,3272217279,BE 3272217280,3272217303,DE 3272217304,3272217327,BE @@ -105473,7 +107102,7 @@ 3273340128,3273340143,DE 3273340144,3273340415,GB 3273340928,3273341711,FR -3273341760,3273341823,FR +3273341752,3273341823,FR 3273341888,3273341951,FR 3273342022,3273342022,GB 3273342034,3273342034,GB @@ -105536,7 +107165,8 @@ 3273373568,3273374847,GB 3273374856,3273374863,GB 3273374896,3273374903,GB -3273374912,3273374931,GB +3273374928,3273374931,GB +3273375136,3273375168,GB 3273375232,3273375551,DE 3273375744,3273375871,DE 3273376000,3273376255,DE @@ -105928,7 +107558,6 @@ 3274579968,3274580991,UA 3274580992,3274581503,PL 3274581504,3274581759,NL -3274581760,3274582015,RU 3274582016,3274583039,PL 3274583040,3274584063,DE 3274584064,3274585087,GB @@ -106245,6 +107874,8 @@ 3275423808,3275423839,GB 3275423872,3275424295,GB 3275424320,3275424383,GB +3275424416,3275424427,GB +3275424432,3275424439,GB 3275424480,3275424487,GB 3275424496,3275424639,GB 3275424648,3275424703,GB @@ -106368,7 +107999,8 @@ 3275475376,3275475399,GB 3275475408,3275475447,GB 3275475456,3275475791,GB -3275475800,3275475831,GB +3275475800,3275475807,GB +3275475824,3275475831,GB 3275475840,3275475871,GB 3275475876,3275475879,GB 3275475968,3275476223,GB @@ -106662,9 +108294,7 @@ 3276028384,3276028391,FR 3276028392,3276028543,GB 3276028544,3276028671,FR -3276028672,3276029375,GB -3276029376,3276029439,FR -3276029440,3276030591,GB +3276028672,3276030591,GB 3276030592,3276030607,FR 3276030608,3276031479,GB 3276031480,3276031487,FR @@ -106769,8 +108399,8 @@ 3276300288,3276304383,DE 3276304384,3276304639,BG 3276304640,3276305407,GB -3276305408,3276306943,IL -3276306944,3276308479,NL +3276305408,3276306431,IL +3276306432,3276308479,NL 3276308480,3276309503,GB 3276309504,3276310527,AT 3276310528,3276311551,PT @@ -106842,6 +108472,7 @@ 3276528128,3276528191,GB 3276530688,3276531711,NL 3276532590,3276532590,GR +3276532608,3276532608,GB 3276533248,3276533311,SI 3276536752,3276536783,HU 3276537344,3276537599,AT @@ -106867,7 +108498,8 @@ 3276687872,3276688383,KW 3276688384,3276688895,DE 3276688896,3276689407,ES -3276689408,3276690431,GB +3276689408,3276689919,GB +3276689920,3276690431,IT 3276690432,3276690943,NL 3276690944,3276691455,GR 3276691456,3276691967,RO @@ -107359,9 +108991,13 @@ 3276929024,3276931071,GB 3276931072,3276939263,KZ 3276939264,3276955647,DE -3276955648,3276958719,GB +3276955648,3276956159,GB +3276956160,3276957695,ES +3276957696,3276958719,GB 3276958720,3276959743,IL -3276959744,3276963839,GB +3276959744,3276961791,ES +3276961792,3276963327,GB +3276963328,3276963839,ES 3276963840,3276964351,IL 3276964352,3276964863,RO 3276965376,3276966399,RU @@ -107496,7 +109132,6 @@ 3277360128,3277360639,BG 3277360640,3277361151,CZ 3277361152,3277361663,PL -3277361664,3277362175,RU 3277362176,3277362687,ES 3277363200,3277363711,ES 3277363712,3277364223,RU @@ -107983,9 +109618,7 @@ 3278939356,3278939379,US 3278939380,3278939383,BR 3278939384,3278939391,US -3278939392,3278939395,DE -3278939396,3278939399,GB -3278939400,3278939403,DE +3278939392,3278939403,DE 3278939404,3278939407,CH 3278939408,3278939419,DE 3278939420,3278939423,IE @@ -108589,7 +110222,7 @@ 3278942890,3278942890,ES 3278942891,3278942894,DE 3278942895,3278942895,NL -3278942896,3278942896,GB +3278942896,3278942896,DE 3278942897,3278942897,CH 3278942898,3278942899,NL 3278942900,3278942903,DE @@ -108689,7 +110322,7 @@ 3278943050,3278943050,IT 3278943051,3278943056,DE 3278943057,3278943057,CH -3278943058,3278943058,FR +3278943058,3278943058,DE 3278943059,3278943059,CH 3278943060,3278943065,DE 3278943066,3278943066,GB @@ -109380,9 +111013,7 @@ 3278944051,3278944051,BE 3278944052,3278944052,AT 3278944053,3278944053,IT -3278944054,3278944054,DE -3278944055,3278944055,IT -3278944056,3278944058,DE +3278944054,3278944058,DE 3278944059,3278944059,ES 3278944060,3278944060,BE 3278944061,3278944061,FR @@ -110214,7 +111845,15 @@ 3280134144,3280142335,IT 3280142336,3280207871,RU 3280207872,3280273407,FR -3280273408,3280338943,RU +3280273408,3280325119,RU +3280325120,3280325631,US +3280325632,3280326655,ES +3280326656,3280327167,US +3280327168,3280327679,RU +3280327680,3280328703,ES +3280328704,3280329727,RU +3280329728,3280330751,IQ +3280330752,3280338943,RU 3280338944,3280347135,GB 3280347136,3280355327,NO 3280355328,3280371711,GR @@ -110391,7 +112030,11 @@ 3280935088,3280935095,ES 3280935096,3280935119,GB 3280935120,3280935127,FR -3280935128,3280952783,GB +3280935128,3280941387,GB +3280941388,3280941395,DE +3280941396,3280952331,GB +3280952332,3280952335,DE +3280952336,3280952783,GB 3280952784,3280952799,DE 3280952800,3280955707,GB 3280955708,3280955711,DE @@ -110451,7 +112094,9 @@ 3281028992,3281029055,GB 3281030400,3281035263,GB 3281035264,3281043455,CH -3281043456,3281059839,RU +3281043456,3281049615,RU +3281049616,3281049622,GI +3281049623,3281059839,RU 3281059840,3281062911,DE 3281063040,3281063111,DE 3281063168,3281125375,DE @@ -110610,7 +112255,7 @@ 3282194432,3282195455,UA 3282195456,3282196479,IE 3282196480,3282197503,UA -3282197504,3282198527,RU +3282198272,3282198527,HR 3282198528,3282206719,GB 3282206720,3282223103,CH 3282223104,3282231295,BE @@ -110618,7 +112263,9 @@ 3282239488,3282305023,SE 3282305024,3282370559,PL 3282370560,3282436095,FI -3282436096,3282477055,GB +3282436096,3282468095,GB +3282468096,3282468351,DE +3282468352,3282477055,GB 3282477056,3282485247,RU 3282485248,3282493439,GI 3282493440,3282501631,NG @@ -110750,7 +112397,18 @@ 3283271680,3283279871,RU 3283279872,3283288063,SE 3283288064,3283419135,DE -3283419136,3283484671,DK +3283419136,3283451903,IR +3283451904,3283460095,NO +3283460096,3283464191,GB +3283464192,3283468287,IT +3283468288,3283472383,FI +3283472384,3283476479,CZ +3283476480,3283480575,LU +3283480576,3283482623,LT +3283482624,3283483647,SK +3283483648,3283484159,ES +3283484160,3283484415,DE +3283484416,3283484671,ES 3283484672,3283484927,UA 3283484928,3283485183,NL 3283485184,3283485439,DE @@ -111305,7 +112963,8 @@ 3285406720,3285407743,UA 3285407744,3285408767,RU 3285408768,3285409791,GB -3285409792,3285412863,RU +3285409792,3285410815,UA +3285410816,3285412863,RU 3285412864,3285413887,UA 3285413888,3285414911,RU 3285414912,3285415935,UA @@ -111454,11 +113113,12 @@ 3285924992,3285924995,FR 3285924996,3285924999,CZ 3285925000,3285925007,RU -3285925008,3285925055,DE +3285925008,3285925059,DE 3285925060,3285925063,CH 3285925064,3285925071,RU 3285925072,3285925079,PL 3285925080,3285925087,IT +3285925088,3285925103,DE 3285925164,3285925171,CH 3285926432,3285926463,CH 3285926592,3285926623,DE @@ -111468,6 +113128,7 @@ 3285931528,3285931559,DE 3285931560,3285931567,HU 3285931568,3285931575,DE +3285931584,3285931599,DE 3285935872,3285936127,GB 3285936136,3285936147,FR 3285936152,3285936167,FR @@ -111479,23 +113140,24 @@ 3285941248,3285941503,ES 3285943808,3285944063,CH 3285947136,3285947159,NL +3285947168,3285947175,NL 3285949604,3285949607,CH 3285949856,3285949887,ES 3285950208,3285950463,IT 3285951648,3285951679,ES 3285953536,3285953665,GB -3285953672,3285953679,GB -3285953696,3285953727,GB +3285953672,3285953735,GB 3285953792,3285953919,GB 3285954048,3285954303,AE 3285954560,3285954567,RO 3285954568,3285954575,PL 3285954576,3285954815,GB 3285958144,3285958399,BG -3285961984,3285961991,GB +3285961984,3285961995,GB 3285962752,3285963775,DE 3285964800,3285964935,DE -3285964944,3285964959,DE +3285964944,3285964991,DE +3285964992,3285965007,HU 3285965056,3285966079,DE 3285968896,3285970943,GB 3285975040,3286013695,FR @@ -112358,7 +114020,7 @@ 3288785408,3288785663,UG 3288785664,3288785919,TZ 3288785920,3288786175,NG -3288786944,3288787967,ZA +3288786688,3288787967,ZA 3288787968,3288788223,EG 3288788224,3288792831,ZA 3288792832,3288793087,AO @@ -112535,14 +114197,15 @@ 3290171392,3290172159,ZA 3290172160,3290172415,KE 3290172416,3290181631,ZA -3290181632,3290181887,US -3290181888,3290182399,PR -3290182400,3290182655,US -3290182656,3290183423,PR +3290181632,3290181759,PR +3290181760,3290181887,US +3290181888,3290183423,PR 3290183424,3290183679,US -3290183680,3290184959,PR -3290184960,3290185215,US -3290185216,3290185727,PR +3290183680,3290185105,PR +3290185106,3290185106,US +3290185107,3290185107,PR +3290185108,3290185108,US +3290185109,3290185727,PR 3290185728,3290226687,ZA 3290226688,3290230783,MZ 3290230784,3290234879,BF @@ -112809,16 +114472,20 @@ 3291554816,3291555071,CD 3291555328,3291555583,CM 3291555840,3291556095,GN +3291556352,3291556607,SN 3291611136,3291611647,ZA 3291611648,3291611903,MU 3291611904,3291612159,ZA 3291612160,3291613183,NG 3291613184,3291615231,SN 3291615232,3291616255,ML +3291616256,3291616511,TZ +3291616768,3291617279,EG 3291617280,3291619327,GH 3291619328,3291627519,GA 3291627520,3291643903,ZA -3291676672,3291742207,ZA +3291643904,3291660287,MZ +3291660288,3291742207,ZA 3291742208,3291742463,US 3291742464,3291742591,GB 3291742592,3291742719,IE @@ -112847,8 +114514,8 @@ 3291821568,3291823103,US 3291823104,3291823359,DE 3291823360,3291824127,US -3291824128,3291824383,GB -3291824384,3291826175,US +3291824128,3291824639,GB +3291824640,3291826175,US 3291826176,3291826431,CA 3291826432,3291827199,US 3291827200,3291827455,CA @@ -113268,6 +114935,7 @@ 3292274688,3292274943,ZA 3292275712,3292275967,KE 3292276224,3292276479,GN +3292276736,3292276991,SN 3292332032,3292334079,MU 3292334080,3292336127,TZ 3292336128,3292340223,ZA @@ -113311,21 +114979,22 @@ 3301113856,3301138431,NG 3301138432,3301140479,ZA 3301140480,3301146623,NG -3301146624,3301171199,ZA +3301146624,3301163007,IN +3301163008,3301171199,ZA 3301171200,3301172223,IN 3301172224,3301173247,ZA 3301173248,3301173759,UG 3301173760,3301175295,ZA 3301175296,3301179391,EG 3301179392,3301179903,RU -3301179904,3301181183,SC -3301181184,3301185535,US +3301179904,3301181439,SC +3301181440,3301185535,US 3301185536,3301187583,GB 3301187584,3301189631,FR 3301189632,3301191679,US 3301191680,3301191935,CA -3301191936,3301192447,SE -3301192448,3301192703,CA +3301191936,3301192191,SE +3301192192,3301192703,CA 3301192704,3301192959,SE 3301192960,3301193215,CA 3301193216,3301193727,SE @@ -113567,19 +115236,7 @@ 3302496256,3302498303,EG 3302498304,3302502399,NA 3302502400,3302505471,AO -3302505472,3302505969,NA -3302505970,3302505971,AO -3302505972,3302506055,NA -3302506056,3302506057,AO -3302506058,3302506083,NA -3302506084,3302506085,AO -3302506086,3302506165,NA -3302506166,3302506167,AO -3302506168,3302506191,NA -3302506192,3302506193,AO -3302506194,3302506387,NA -3302506388,3302506391,AO -3302506392,3302506495,NA +3302505472,3302506495,NA 3302506496,3302514687,KE 3302514688,3302522879,ZA 3302522880,3302523903,KE @@ -113746,10 +115403,23 @@ 3304669184,3304685567,TZ 3304685568,3304701951,ZA 3304701952,3304718335,AO +3304718336,3304734719,ZA +3304734720,3304751103,BJ 3304751104,3304759295,ZA +3304763392,3304767487,LR +3304771584,3304773631,KE 3304775680,3304781823,ZA 3304781824,3304782847,AO 3304782848,3304783871,MU +3304783872,3304800255,ZA +3304800256,3304816639,SC +3304816640,3304820735,ZA +3304821760,3304822783,MU +3304822784,3304823807,BJ +3304824832,3304841215,ZA +3304841216,3304843263,NG +3304843264,3304845311,ZA +3304845312,3304846335,GQ 3304846336,3304847359,SC 3304847360,3304848383,ZA 3304848384,3304849407,MU @@ -113809,7 +115479,9 @@ 3315293184,3315294207,MU 3315294208,3315302399,ZA 3315302400,3315318783,ML -3315318784,3315322879,LS +3315318784,3315319935,LS +3315319936,3315320831,ZA +3315320832,3315322879,LS 3315322880,3315326975,ZA 3315326976,3315331071,ZW 3315331072,3315333119,GH @@ -114210,9 +115882,7 @@ 3322683392,3322691583,AR 3322691584,3322691607,US 3322691608,3322691615,RO -3322691616,3322691791,US -3322691792,3322691799,CA -3322691800,3322691839,US +3322691616,3322691839,US 3322691840,3322692095,SE 3322692096,3322692103,US 3322692104,3322692111,RO @@ -114293,15 +115963,9 @@ 3322768608,3322768623,IN 3322768624,3322769327,US 3322769328,3322769343,IN -3322769344,3322775551,US -3322775552,3322777599,CA -3322777600,3322785791,US -3322785792,3322796799,CA -3322796800,3322801663,US -3322801664,3322801919,CA -3322801920,3322804223,US -3322804224,3322805759,CA -3322805760,3322875903,US +3322769344,3322773503,US +3322773504,3322806271,CA +3322806272,3322875903,US 3322880000,3322888191,AU 3322888192,3322888815,US 3322888816,3322888823,IN @@ -114330,9 +115994,7 @@ 3322893984,3322893991,BR 3322893992,3322894207,US 3322894208,3322894215,CN -3322894216,3322894335,US -3322894336,3322894399,HK -3322894400,3322894703,US +3322894216,3322894703,US 3322894704,3322894719,IN 3322894720,3322897063,US 3322897064,3322897071,QA @@ -114494,10 +116156,11 @@ 3322956616,3322956623,DE 3322956624,3322962431,NL 3322962432,3322962687,GB -3322962688,3322962943,US +3322962688,3322962943,ES 3322962944,3322963455,NL 3322963456,3322964479,GB -3322964480,3322969343,US +3322964480,3322964991,NL +3322964992,3322969343,US 3322969344,3322970111,NL 3322970112,3323002879,CA 3323002880,3323013887,US @@ -114567,13 +116230,7 @@ 3323241728,3323241983,CA 3323241984,3323242511,US 3323242512,3323242527,BD -3323242528,3323242559,US -3323242560,3323242575,GB -3323242576,3323242591,US -3323242592,3323242607,GB -3323242608,3323242623,US -3323242624,3323242703,AE -3323242704,3323243087,US +3323242528,3323243087,US 3323243088,3323243095,IE 3323243096,3323243103,GB 3323243104,3323243143,US @@ -114611,9 +116268,7 @@ 3323245560,3323245567,CN 3323245568,3323246463,US 3323246464,3323246591,CN -3323246592,3323247359,US -3323247360,3323247423,CA -3323247424,3323270420,US +3323246592,3323270420,US 3323270421,3323270421,CH 3323270422,3323339263,US 3323339776,3323340031,CA @@ -114638,7 +116293,9 @@ 3323416400,3323416479,GB 3323416480,3323437823,US 3323437824,3323438079,CA -3323438080,3323441043,US +3323438080,3323440703,US +3323440704,3323440735,GB +3323440736,3323441043,US 3323441044,3323441047,GB 3323441048,3323444847,US 3323444848,3323444863,CA @@ -114836,7 +116493,9 @@ 3323684544,3323684559,US 3323684560,3323684607,CA 3323684608,3323684611,BR -3323684612,3323684695,CA +3323684612,3323684615,CA +3323684616,3323684619,US +3323684620,3323684695,CA 3323684696,3323684703,US 3323684704,3323684735,CA 3323684736,3323684739,IN @@ -115695,7 +117354,9 @@ 3325120077,3325120081,MX 3325120082,3325120423,US 3325120424,3325120431,IN -3325120432,3325128703,US +3325120432,3325122559,US +3325122560,3325123071,CA +3325123072,3325128703,US 3325128704,3325129215,TH 3325129216,3325131775,US 3325131776,3325132031,AU @@ -116345,11 +118006,14 @@ 3325217224,3325217227,AU 3325217228,3325217231,CA 3325217232,3325217235,US -3325217236,3325217247,CA +3325217236,3325217243,CA +3325217244,3325217247,US 3325217248,3325217279,BA 3325217280,3325217307,CA 3325217308,3325217311,HK -3325217312,3325217471,CA +3325217312,3325217403,CA +3325217404,3325217407,FR +3325217408,3325217471,CA 3325217472,3325217503,IE 3325217504,3325217651,CA 3325217652,3325217655,AE @@ -116364,17 +118028,15 @@ 3325217888,3325217939,CA 3325217940,3325217943,US 3325217944,3325217951,CO -3325217952,3325217975,CA -3325217976,3325217987,US -3325217988,3325218015,CA -3325218016,3325218031,ES -3325218032,3325218039,CA +3325217952,3325217971,CA +3325217972,3325217975,US +3325217976,3325217983,CA +3325217984,3325217987,US +3325217988,3325218039,CA 3325218040,3325218047,US 3325218048,3325218139,CA 3325218140,3325218147,GB -3325218148,3325218151,CA -3325218152,3325218155,US -3325218156,3325218159,CA +3325218148,3325218159,CA 3325218160,3325218167,US 3325218168,3325218207,CA 3325218208,3325218239,US @@ -116388,7 +118050,9 @@ 3325218488,3325218491,US 3325218492,3325218519,CA 3325218520,3325218523,US -3325218524,3325218559,CA +3325218524,3325218531,CA +3325218532,3325218535,US +3325218536,3325218559,CA 3325218560,3325218567,US 3325218568,3325218583,CA 3325218584,3325218591,IN @@ -116937,7 +118601,8 @@ 3325290240,3325290495,CA 3325290496,3325296383,US 3325296384,3325296639,CA -3325296640,3325304831,US +3325296640,3325304063,US +3325304064,3325304831,AS 3325304832,3325305087,CA 3325305088,3325307903,US 3325307904,3325308927,GB @@ -117658,9 +119323,13 @@ 3333783552,3333801727,US 3333801728,3333801983,CA 3333801984,3333825791,US -3333826048,3333859839,US +3333826048,3333829631,US +3333829632,3333830143,IN +3333830144,3333859839,US 3333859840,3333860095,BM -3333860096,3333939455,US +3333860096,3333871103,US +3333871104,3333871359,CA +3333871360,3333939455,US 3333939456,3333939711,CA 3333939712,3333988607,US 3333988608,3333988863,BR @@ -117716,7 +119385,9 @@ 3335005648,3335005663,US 3335005664,3335005759,CN 3335005760,3335005823,US -3335005824,3335008127,CN +3335005824,3335008071,CN +3335008072,3335008079,US +3335008080,3335008127,CN 3335008128,3335008255,US 3335008256,3335009175,CN 3335009176,3335009183,US @@ -117888,9 +119559,7 @@ 3337895616,3337895679,US 3337895680,3337895935,CN 3337895936,3337900031,PR -3337900032,3337948671,US -3337948672,3337949183,CA -3337949184,3337957375,US +3337900032,3337957375,US 3337957376,3337959423,CA 3337959424,3337960447,US 3337960448,3337961471,CA @@ -118102,7 +119771,9 @@ 3338912768,3338913023,EC 3338913024,3338916351,US 3338916352,3338916479,CN -3338916480,3338964991,US +3338916480,3338921219,US +3338921220,3338921220,PT +3338921221,3338964991,US 3338964992,3338965247,CA 3338965248,3338976767,US 3338976768,3338977023,CA @@ -118168,15 +119839,11 @@ 3339264000,3339270399,US 3339270400,3339270655,CA 3339271168,3339327999,US -3339328512,3339328783,CA -3339328784,3339328791,US -3339328792,3339328831,CA +3339328512,3339328831,CA 3339328832,3339328895,US 3339328896,3339328943,CA 3339328944,3339328959,AE -3339328960,3339329023,CA -3339329024,3339329151,GB -3339329152,3339329279,CA +3339328960,3339329279,CA 3339329280,3339329407,US 3339329408,3339329439,CA 3339329440,3339329455,GB @@ -118375,7 +120042,9 @@ 3340429824,3340430079,PA 3340430080,3340453375,US 3340453376,3340453887,BM -3340453888,3340460031,US +3340453888,3340454911,US +3340454912,3340455167,DE +3340455168,3340460031,US 3340460032,3340462079,PR 3340462080,3340481535,US 3340481536,3340482559,CA @@ -118566,12 +120235,12 @@ 3341533952,3341534207,CA 3341534720,3341535007,US 3341535008,3341535015,ID -3341535016,3341535031,US +3341535016,3341535023,GH +3341535024,3341535031,PA 3341535032,3341535039,VN 3341535040,3341535047,MA -3341535048,3341535087,US -3341535088,3341535095,BD -3341535096,3341535151,US +3341535048,3341535055,GH +3341535056,3341535151,US 3341535152,3341535171,CN 3341535172,3341535183,US 3341535184,3341535187,ID @@ -118639,7 +120308,8 @@ 3341837312,3341837743,CA 3341837744,3341837747,US 3341837748,3341838335,CA -3341838336,3341854551,US +3341838336,3341838591,GB +3341838592,3341854551,US 3341854552,3341854559,SG 3341854560,3341863935,US 3341863936,3341864447,AG @@ -118728,8 +120398,11 @@ 3342795264,3342831103,US 3342831104,3342831359,IN 3342831360,3342878967,US -3342878976,3342879551,US -3342879568,3342979587,US +3342878976,3342879231,US +3342879232,3342879487,BE +3342879488,3342879551,NL +3342879568,3342879743,NL +3342879744,3342979587,US 3342979592,3343013887,US 3343013888,3343015695,CA 3343015696,3343015727,US @@ -118862,7 +120535,9 @@ 3343653632,3343653695,CA 3343653696,3343656511,US 3343656512,3343656575,VI -3343656576,3343747583,US +3343656576,3343656703,US +3343656704,3343656959,VI +3343656960,3343747583,US 3343747584,3343748095,VE 3343748096,3343858687,US 3343858688,3343859199,VG @@ -119014,48 +120689,46 @@ 3345318944,3345318975,CY 3345318976,3345321471,US 3345321472,3345321983,GB -3345321984,3345322495,US -3345322496,3345322503,BR -3345322504,3345327103,US +3345321984,3345327103,US 3345327104,3345328127,CA 3345328128,3345332287,US -3345332288,3345332295,BR +3345332288,3345332295,GH 3345332296,3345332303,PK 3345332304,3345332311,US 3345332312,3345332319,BR 3345332320,3345332327,PT 3345332328,3345332339,US -3345332340,3345332343,BR +3345332340,3345332343,GH 3345332344,3345332347,VN 3345332348,3345332351,CY 3345332352,3345332375,US 3345332376,3345332383,CA 3345332384,3345332399,US 3345332400,3345332403,BR -3345332404,3345332411,ID +3345332404,3345332407,GH +3345332408,3345332411,ID 3345332412,3345332423,US 3345332424,3345332431,MY 3345332432,3345332435,VN 3345332436,3345332439,GB 3345332440,3345332455,US -3345332456,3345332459,MY +3345332456,3345332459,GH 3345332460,3345332463,US 3345332464,3345332471,BR -3345332472,3345332475,US -3345332476,3345332479,CN -3345332480,3345332487,US +3345332472,3345332487,US 3345332488,3345332495,AU 3345332496,3345332503,CA -3345332504,3345332511,US -3345332512,3345332519,ID +3345332504,3345332515,BR +3345332516,3345332519,GH 3345332520,3345332583,US 3345332584,3345332587,CY -3345332588,3345332591,ID +3345332588,3345332591,BR 3345332592,3345332595,US 3345332596,3345332599,BD 3345332600,3345332603,US 3345332604,3345332607,ID -3345332608,3345332655,US +3345332608,3345332647,US +3345332648,3345332655,ID 3345332656,3345332659,CY 3345332660,3345332667,US 3345332668,3345332671,ID @@ -119069,7 +120742,8 @@ 3345332864,3345333055,VN 3345333056,3345333183,US 3345333184,3345333215,IN -3345333216,3345333223,US +3345333216,3345333219,CN +3345333220,3345333223,GH 3345333224,3345333227,MX 3345333228,3345333231,CY 3345333232,3345333247,US @@ -119192,9 +120866,7 @@ 3345447680,3345448447,FR 3345448448,3345448703,BE 3345448704,3345448959,DE -3345448960,3345666567,US -3345666568,3345666591,IN -3345666592,3345666623,US +3345448960,3345666623,US 3345666624,3345666639,NO 3345666640,3345667103,US 3345667104,3345667119,IN @@ -119321,10 +120993,8 @@ 3346793472,3346793983,US 3346794496,3346923519,US 3346923520,3346989055,CA -3346989056,3347014143,US -3347014144,3347014255,CA -3347014256,3347014271,CY -3347014272,3347014399,CA +3346989056,3347013631,US +3347013632,3347014399,CA 3347014400,3347014655,US 3347014656,3347015167,CA 3347015168,3347015295,QA @@ -119402,9 +121072,9 @@ 3349648166,3349648168,NG 3349648169,3349649407,US 3349649408,3349653503,CA -3349653504,3349702623,US -3349702624,3349702655,LK -3349702656,3349723199,US +3349653504,3349723175,US +3349723176,3349723183,LK +3349723184,3349723199,US 3349723200,3349723215,PK 3349723216,3349723260,US 3349723261,3349723265,CA @@ -119648,9 +121318,7 @@ 3351058944,3351059455,CA 3351059456,3351071743,US 3351071744,3351072767,CA -3351072768,3351074260,US -3351074261,3351074261,BR -3351074262,3351074271,US +3351072768,3351074271,US 3351074272,3351074272,GT 3351074273,3351074283,US 3351074284,3351074284,BR @@ -119665,25 +121333,25 @@ 3351074376,3351074377,DE 3351074378,3351074379,US 3351074380,3351074380,DE -3351074381,3351074384,US -3351074385,3351074385,CL -3351074386,3351074386,US +3351074381,3351074381,US +3351074382,3351074382,KW +3351074383,3351074386,US 3351074387,3351074387,BR 3351074388,3351074388,DE 3351074389,3351074389,US 3351074390,3351074390,DE 3351074391,3351074391,BR 3351074392,3351074392,CL -3351074393,3351074393,US -3351074394,3351074395,UA +3351074393,3351074394,US +3351074395,3351074395,TR 3351074396,3351074396,BR -3351074397,3351074397,UA -3351074398,3351074402,US +3351074397,3351074402,US 3351074403,3351074403,BR 3351074404,3351074404,CL 3351074405,3351074405,US 3351074406,3351074406,CA -3351074407,3351074409,BR +3351074407,3351074407,US +3351074408,3351074409,BR 3351074410,3351074410,DE 3351074411,3351074411,US 3351074412,3351074413,PA @@ -119693,20 +121361,19 @@ 3351074419,3351074419,IN 3351074420,3351074422,US 3351074423,3351074423,UA -3351074424,3351074426,US +3351074424,3351074424,GB +3351074425,3351074426,US 3351074427,3351074427,DE 3351074428,3351074429,US 3351074430,3351074430,BR -3351074431,3351074439,US +3351074431,3351074434,US +3351074435,3351074435,BR +3351074436,3351074439,US 3351074440,3351074440,CA 3351074441,3351074444,US 3351074445,3351074445,CA 3351074446,3351074446,CL -3351074447,3351074451,US -3351074452,3351074452,IN -3351074453,3351074453,US -3351074454,3351074457,IN -3351074458,3351074463,US +3351074447,3351074463,US 3351074464,3351074466,BR 3351074467,3351074472,US 3351074473,3351074473,BR @@ -119728,9 +121395,7 @@ 3351074558,3351074558,CA 3351074559,3351074690,US 3351074691,3351074691,BR -3351074692,3351074708,US -3351074709,3351074709,CA -3351074710,3351074711,US +3351074692,3351074711,US 3351074712,3351074712,TR 3351074713,3351074728,US 3351074729,3351074729,EG @@ -119766,10 +121431,10 @@ 3351196672,3351197695,US 3351197696,3351197711,PT 3351197712,3351197715,EG -3351197716,3351197719,CN +3351197716,3351197719,GH 3351197720,3351197735,US 3351197736,3351197739,CY -3351197740,3351197743,BR +3351197740,3351197743,PK 3351197744,3351197751,VN 3351197752,3351197759,PT 3351197760,3351197775,US @@ -119777,8 +121442,7 @@ 3351197784,3351197787,US 3351197788,3351197791,GT 3351197792,3351197795,IN -3351197796,3351197799,BR -3351197800,3351197803,SI +3351197796,3351197803,BR 3351197804,3351197807,AE 3351197808,3351197827,US 3351197828,3351197831,VN @@ -119790,7 +121454,8 @@ 3351197860,3351197863,CY 3351197864,3351197867,VN 3351197868,3351197871,CY -3351197872,3351197887,US +3351197872,3351197879,US +3351197880,3351197887,GH 3351197888,3351197891,MX 3351197892,3351197895,VN 3351197896,3351197899,BR @@ -119798,12 +121463,16 @@ 3351197904,3351197911,VN 3351197912,3351197983,US 3351197984,3351198015,MX -3351198016,3351198031,US +3351198016,3351198023,US +3351198024,3351198031,GH 3351198032,3351198039,MD 3351198040,3351198047,AE -3351198048,3351198071,US +3351198048,3351198059,US +3351198060,3351198063,GH +3351198064,3351198071,BR 3351198072,3351198079,VN -3351198080,3351198095,US +3351198080,3351198091,US +3351198092,3351198095,GT 3351198096,3351198103,MX 3351198104,3351198111,VN 3351198112,3351198131,US @@ -119812,10 +121481,10 @@ 3351198152,3351198155,GB 3351198156,3351198159,EG 3351198160,3351198171,US -3351198172,3351198175,AU +3351198172,3351198175,GH 3351198176,3351198179,BD -3351198180,3351198187,US -3351198188,3351198191,GH +3351198180,3351198183,US +3351198184,3351198191,GH 3351198192,3351198195,CN 3351198196,3351198207,US 3351198208,3351198215,VN @@ -119823,7 +121492,8 @@ 3351198224,3351198231,US 3351198232,3351198235,CA 3351198236,3351198239,US -3351198240,3351198251,ID +3351198240,3351198247,VN +3351198248,3351198251,ID 3351198252,3351198255,GH 3351198256,3351198259,VN 3351198260,3351198263,DE @@ -119831,18 +121501,19 @@ 3351198272,3351198279,ID 3351198280,3351198335,US 3351198336,3351198351,CA -3351198352,3351198359,US +3351198352,3351198355,GT +3351198356,3351198359,US 3351198360,3351198363,GB 3351198364,3351198371,US 3351198372,3351198383,CA -3351198384,3351198387,MX +3351198384,3351198387,GH 3351198388,3351198391,US 3351198392,3351198399,TR 3351198400,3351198403,US 3351198404,3351198407,IN 3351198408,3351198411,BR 3351198412,3351198415,GB -3351198416,3351198423,CL +3351198416,3351198423,GT 3351198424,3351198427,RO 3351198428,3351198431,US 3351198432,3351198439,IN @@ -119852,16 +121523,18 @@ 3351198476,3351198479,CY 3351198480,3351198487,BR 3351198488,3351198495,US -3351198496,3351198503,VN -3351198504,3351198507,US +3351198496,3351198499,PK +3351198500,3351198507,US 3351198508,3351198511,CY 3351198512,3351198515,US -3351198516,3351198519,ID +3351198516,3351198519,BR 3351198520,3351198527,IN 3351198528,3351198535,RU 3351198536,3351198539,CY -3351198540,3351198559,US -3351198560,3351198567,LK +3351198540,3351198551,US +3351198552,3351198559,VN +3351198560,3351198563,BR +3351198564,3351198567,CN 3351198568,3351198575,US 3351198576,3351198579,CY 3351198580,3351198607,US @@ -119963,7 +121636,9 @@ 3351357440,3351359487,CA 3351359488,3351372799,US 3351372800,3351373823,BM -3351373824,3351380223,US +3351373824,3351375871,US +3351375872,3351376895,PR +3351376896,3351380223,US 3351380224,3351380479,CA 3351380480,3351380991,US 3351380992,3351381759,CA @@ -120098,14 +121773,13 @@ 3351696384,3351696639,CA 3351696640,3351697407,US 3351697408,3351698431,CA -3351698432,3351699303,US -3351699304,3351699305,CA -3351699306,3351699306,US -3351699307,3351699311,CA -3351699312,3351706367,US +3351698432,3351698943,US +3351698944,3351699455,CA +3351699456,3351706367,US 3351706368,3351706623,CA 3351706624,3351850239,US -3351850496,3351855871,US +3351850496,3351855615,US +3351855616,3351855871,GB 3351856128,3351860223,US 3351860224,3351861247,KY 3351861248,3351869439,US @@ -120203,8 +121877,8 @@ 3353335334,3353335335,US 3353335336,3353335339,NL 3353335340,3353335341,US -3353335342,3353335349,NL -3353335350,3353335353,US +3353335342,3353335347,NL +3353335348,3353335353,US 3353335354,3353335359,NL 3353335360,3353335361,US 3353335362,3353335363,NL @@ -120219,8 +121893,8 @@ 3353335391,3353335392,US 3353335393,3353335394,NL 3353335395,3353335396,US -3353335397,3353335406,NL -3353335407,3353335407,US +3353335397,3353335404,NL +3353335405,3353335407,US 3353335408,3353335411,NL 3353335412,3353335414,US 3353335415,3353335420,NL @@ -120405,24 +122079,24 @@ 3354507296,3354507299,VN 3354507300,3354507303,US 3354507304,3354507307,IN -3354507308,3354507311,MA -3354507312,3354507315,BR +3354507308,3354507315,BR 3354507316,3354507327,US -3354507328,3354507335,MD +3354507328,3354507335,RU 3354507336,3354507343,US -3354507344,3354507347,IN -3354507348,3354507351,BR +3354507344,3354507347,BR +3354507348,3354507351,CN 3354507352,3354507359,AU 3354507360,3354507363,EG 3354507364,3354507367,CY 3354507368,3354507375,CA 3354507376,3354507383,ID -3354507384,3354507387,BR -3354507388,3354507391,CN +3354507384,3354507387,CN +3354507388,3354507391,BR 3354507392,3354507399,CA 3354507400,3354507403,EG 3354507404,3354507407,CN -3354507408,3354507439,US +3354507408,3354507431,US +3354507432,3354507439,MY 3354507440,3354507443,CY 3354507444,3354507447,JO 3354507448,3354507459,US @@ -120436,26 +122110,29 @@ 3354507508,3354507511,PK 3354507512,3354507519,MA 3354507520,3354507535,US -3354507536,3354507539,CN +3354507536,3354507539,ID 3354507540,3354507543,HU 3354507544,3354507551,US -3354507552,3354507567,CN +3354507552,3354507559,NI +3354507560,3354507567,CN 3354507568,3354507575,VN 3354507576,3354507583,AE 3354507584,3354507591,US 3354507592,3354507599,CY 3354507600,3354507607,US 3354507608,3354507611,CN -3354507612,3354507615,US +3354507612,3354507615,BR 3354507616,3354507623,IN -3354507624,3354507631,EG +3354507624,3354507631,CN 3354507632,3354507639,US -3354507640,3354507647,MD -3354507648,3354507655,US -3354507656,3354507659,ID +3354507640,3354507643,CN +3354507644,3354507647,ID +3354507648,3354507655,CN +3354507656,3354507659,CA 3354507660,3354507667,CY 3354507668,3354507671,BR -3354507672,3354507683,IN +3354507672,3354507679,US +3354507680,3354507683,GH 3354507684,3354507687,PT 3354507688,3354507691,CA 3354507692,3354507703,US @@ -120472,7 +122149,8 @@ 3354507760,3354507767,LK 3354507768,3354507775,US 3354507776,3354507779,CY -3354507780,3354507787,US +3354507780,3354507783,US +3354507784,3354507787,BR 3354507788,3354507791,CY 3354507792,3354507803,US 3354507804,3354507807,CY @@ -120494,7 +122172,7 @@ 3354507928,3354507931,US 3354507932,3354507943,CY 3354507944,3354507959,US -3354507960,3354507967,AE +3354507960,3354507967,GH 3354507968,3354507983,MX 3354507984,3354507991,AE 3354507992,3354507999,PK @@ -120525,7 +122203,8 @@ 3354508140,3354508143,CY 3354508144,3354508147,MY 3354508148,3354508151,BB -3354508152,3354508163,US +3354508152,3354508159,US +3354508160,3354508163,GH 3354508164,3354508167,CY 3354508168,3354508187,US 3354508188,3354508191,VN @@ -120543,7 +122222,9 @@ 3354508248,3354508251,VN 3354508252,3354508255,US 3354508256,3354508259,EG -3354508260,3354508271,US +3354508260,3354508263,US +3354508264,3354508267,TH +3354508268,3354508271,US 3354508272,3354508275,TW 3354508276,3354508287,US 3354508288,3354508303,CY @@ -120578,7 +122259,8 @@ 3354508560,3354508571,US 3354508572,3354508575,CN 3354508576,3354508579,BR -3354508580,3354508603,US +3354508580,3354508583,AE +3354508584,3354508603,US 3354508604,3354508607,CY 3354508608,3354508623,US 3354508624,3354508639,MX @@ -120619,7 +122301,7 @@ 3354509256,3354509263,US 3354509264,3354509279,BR 3354509280,3354509283,AU -3354509284,3354509287,ID +3354509284,3354509287,GH 3354509288,3354509291,CY 3354509292,3354509295,US 3354509296,3354509299,CA @@ -120668,7 +122350,9 @@ 3354737152,3354770687,US 3354770688,3354770943,CA 3354770944,3354788095,US -3354788096,3354806383,CA +3354788096,3354789887,CA +3354789888,3354790399,US +3354790400,3354806383,CA 3354806384,3354806399,US 3354806400,3354806639,CA 3354806640,3354806655,SE @@ -120747,7 +122431,7 @@ 3355418112,3355418367,US 3355418368,3355418371,BR 3355418372,3355418375,US -3355418376,3355418379,VN +3355418376,3355418379,GH 3355418380,3355418383,BR 3355418384,3355418395,US 3355418396,3355418399,GT @@ -120780,28 +122464,23 @@ 3355449344,3355450367,CU 3355450368,3355451391,EC 3355451392,3355458559,BR -3355458560,3355458591,HN -3355458592,3355458599,US -3355458600,3355459071,HN +3355458560,3355459071,HN 3355459072,3355459327,BR 3355459328,3355459583,EC -3355459584,3355459839,PA 3355459840,3355460095,VE 3355460096,3355460351,CL 3355460352,3355460607,BR -3355460608,3355460863,UY -3355460864,3355461887,BR +3355460608,3355461119,UY +3355461120,3355461887,BR 3355461888,3355463423,EC 3355463424,3355463935,AR 3355463936,3355464191,BR 3355464192,3355464447,CL 3355464448,3355464959,MX -3355464960,3355465727,BR -3355465728,3355465983,UY +3355464960,3355465215,BR +3355465216,3355465983,UY 3355465984,3355466239,BR -3355466240,3355466751,MX -3355466752,3355467007,BR -3355467008,3355467263,MX +3355466240,3355467263,MX 3355467264,3355467519,US 3355467520,3355467775,MX 3355467776,3355468799,AR @@ -120836,7 +122515,6 @@ 3355491072,3355491327,CO 3355491328,3355494655,AR 3355494656,3355494911,CO -3355494912,3355495423,PA 3355495424,3355496447,UY 3355496448,3355498495,AR 3355498496,3355500543,US @@ -120854,9 +122532,7 @@ 3355538432,3355539199,AR 3355539200,3355539455,VE 3355539456,3355540479,CL -3355540480,3355540735,CO -3355540736,3355540991,BZ -3355540992,3355541503,CO +3355540480,3355541503,CO 3355541504,3355545599,CL 3355545600,3355547647,VE 3355547648,3355547903,NI @@ -120892,12 +122568,13 @@ 3355615232,3355623423,SR 3355623424,3355639807,CL 3355639808,3355642367,VE -3355642368,3355642879,PA 3355642880,3355643903,UY 3355643904,3355647999,BR 3355648000,3355668991,AR 3355668992,3355669247,PE -3355669248,3355672575,AR +3355669248,3355670015,AR +3355670016,3355670527,VE +3355670528,3355672575,AR 3355672576,3355677183,CO 3355677184,3355677439,GT 3355677440,3355682815,CO @@ -120907,7 +122584,7 @@ 3355688960,3355689471,CO 3355689472,3355689727,HN 3355689728,3355689983,AR -3355689984,3355693055,PA +3355691008,3355693055,PA 3355693056,3355695103,CL 3355695104,3355697151,AR 3355697152,3355701503,HN @@ -120932,8 +122609,7 @@ 3355774976,3355779071,VE 3355779072,3355781119,BR 3355781120,3355783167,VE -3355783168,3355785215,AR -3355785216,3355787263,CR +3355783168,3355787263,CR 3355787264,3355803647,AR 3355803648,3355820031,VE 3355820032,3355836415,AR @@ -120951,13 +122627,12 @@ 3355850752,3355852799,CW 3355852800,3355856639,CL 3355856640,3355856895,PA -3355856896,3355858943,EC 3355860992,3355869183,CL 3355869184,3355870719,BR 3355870720,3355871231,CR 3355871232,3355873279,BR 3355873280,3355875327,BQ -3355875328,3355877375,MX +3355875328,3355877375,PA 3355877376,3355885567,CO 3355885568,3355901951,GT 3355901952,3355902975,BR @@ -120989,7 +122664,6 @@ 3356033792,3356034047,CL 3356034048,3356035071,PY 3356035072,3356037119,MX -3356037120,3356041215,CO 3356041216,3356049407,CR 3356049408,3356049663,CL 3356049664,3356051455,BR @@ -121007,11 +122681,11 @@ 3356057856,3356059135,CL 3356059136,3356060671,BR 3356060672,3356061695,CL -3356061696,3356062463,BR +3356061696,3356062207,BR +3356062208,3356062463,CL 3356062464,3356062719,JM 3356062720,3356063743,CR -3356063744,3356063999,HN -3356064000,3356064255,BR +3356063744,3356064255,HN 3356064256,3356064511,CL 3356064512,3356065791,BR 3356065792,3356066047,CL @@ -121026,15 +122700,13 @@ 3356073472,3356073983,CO 3356073984,3356075263,BR 3356075264,3356076287,BO -3356076288,3356077055,BR -3356077056,3356077567,MX +3356076288,3356076543,AR +3356076544,3356077567,MX 3356077568,3356078079,BR 3356078080,3356078335,EC 3356078336,3356079359,CL 3356079360,3356079615,AR -3356079616,3356080127,MX -3356080128,3356080383,BR -3356080384,3356080639,MX +3356079616,3356080639,MX 3356080640,3356080895,BR 3356080896,3356082431,NI 3356082432,3356082687,CL @@ -121054,18 +122726,19 @@ 3356089088,3356089343,AR 3356089344,3356090623,BR 3356090624,3356090879,CL -3356090880,3356091135,BR +3356090880,3356091135,PE 3356091136,3356091391,AR 3356091392,3356091647,CL -3356091648,3356091903,BR -3356091904,3356092927,CL -3356092928,3356093183,BR +3356091648,3356091903,AR +3356091904,3356093183,CL 3356093184,3356093951,AR 3356093952,3356094975,CL 3356094976,3356096255,AR 3356096256,3356096511,CL 3356096512,3356096767,EC -3356096768,3356097791,BR +3356096768,3356097023,BR +3356097024,3356097535,CL +3356097536,3356097791,BR 3356097792,3356098303,AR 3356098304,3356098559,GT 3356098560,3356099583,CL @@ -121074,31 +122747,21 @@ 3356102400,3356102655,PA 3356102656,3356105727,CL 3356105728,3356106751,SV -3356106752,3356107263,HN -3356107264,3356107327,BR -3356107328,3356107519,HN -3356107520,3356107551,BR -3356107552,3356107975,HN -3356107976,3356107983,IS -3356107984,3356108063,HN -3356108064,3356108071,IT -3356108072,3356109119,HN -3356109120,3356109135,FR -3356109136,3356109263,HN -3356109264,3356109271,DE -3356109272,3356109495,HN -3356109496,3356109503,IT -3356109504,3356109687,HN -3356109688,3356109695,CA -3356109696,3356110527,HN -3356110528,3356110543,US -3356110544,3356110847,HN +3356106752,3356106975,HN +3356106976,3356107007,FR +3356107008,3356108511,HN +3356108512,3356108519,US +3356108520,3356110495,HN +3356110496,3356110503,US +3356110504,3356110847,HN 3356110848,3356113919,BR 3356113920,3356114943,UY 3356114944,3356123135,PE 3356123136,3356131839,AR 3356131840,3356132351,PE -3356132352,3356134143,BR +3356132352,3356133375,BR +3356133376,3356133887,CO +3356133888,3356134143,BR 3356134144,3356134655,AR 3356134656,3356134911,PY 3356134912,3356135167,DO @@ -121108,11 +122771,10 @@ 3356135936,3356136191,BR 3356136192,3356137471,EC 3356137472,3356137727,JM -3356137728,3356137983,BR +3356137728,3356137983,HN 3356137984,3356138239,CO 3356138240,3356138495,US -3356138496,3356138751,BR -3356138752,3356139007,BO +3356138496,3356139007,BO 3356139008,3356139263,CL 3356139264,3356139519,BR 3356139520,3356139775,US @@ -121125,7 +122787,8 @@ 3356142848,3356143103,GT 3356143104,3356143615,CO 3356143616,3356144127,CR -3356144128,3356145151,BR +3356144128,3356144639,BR +3356144640,3356145151,AR 3356145152,3356145407,CL 3356145408,3356145663,BR 3356145664,3356145919,CL @@ -121150,7 +122813,8 @@ 3356151296,3356151551,BR 3356151552,3356151807,AR 3356151808,3356152063,CL -3356152064,3356152575,BR +3356152064,3356152319,EC +3356152320,3356152575,MX 3356152576,3356152831,CL 3356152832,3356154623,MX 3356154624,3356154879,AR @@ -121176,16 +122840,12 @@ 3356171520,3356171775,AR 3356171776,3356172031,NI 3356172032,3356172287,SV -3356172288,3356172543,PE -3356172544,3356172799,AR -3356172800,3356174335,PE +3356172288,3356174335,PE 3356174336,3356176383,CO 3356176384,3356180479,PE 3356180480,3356190719,CL -3356190720,3356192767,DO 3356192768,3356194815,AR -3356196864,3356213247,KY -3356213248,3356229631,VE +3356196864,3356229631,VE 3356229632,3356233727,BR 3356233728,3356237823,CL 3356237824,3356246015,GT @@ -121198,7 +122858,6 @@ 3356265472,3356267007,CL 3356267008,3356267263,PY 3356267264,3356268799,CL -3356268800,3356269055,PA 3356269056,3356269311,AR 3356269312,3356269823,UY 3356269824,3356270079,BR @@ -121247,14 +122906,10 @@ 3356332032,3356334079,CU 3356334080,3356336127,BO 3356336128,3356336895,SV -3356336896,3356338175,HN -3356338176,3356339967,SV -3356339968,3356341247,HN -3356341248,3356341503,SV -3356341504,3356342271,HN -3356342272,3356343039,SV -3356343040,3356343551,HN -3356343552,3356344319,SV +3356336896,3356337151,HN +3356337152,3356337663,SV +3356337664,3356337919,HN +3356337920,3356344319,SV 3356344320,3356360703,CO 3356360704,3356362751,CL 3356362752,3356363519,VE @@ -121273,7 +122928,6 @@ 3356380160,3356380927,CL 3356380928,3356381183,DO 3356381184,3356381439,CL -3356381440,3356381695,PA 3356381696,3356381951,CL 3356381952,3356382207,EC 3356382208,3356389375,CL @@ -121282,17 +122936,11 @@ 3356390400,3356390655,AR 3356390656,3356391167,CL 3356391168,3356391423,PA -3356393472,3356413439,CL -3356413440,3356413951,CO -3356413952,3356419839,CL -3356419840,3356419967,CO -3356419968,3356420863,CL -3356420864,3356421375,CO -3356421376,3356421503,CL -3356421504,3356422143,CO -3356422144,3356425471,CL -3356425472,3356425599,CO -3356425600,3356426239,CL +3356393472,3356413567,CL +3356413568,3356413823,CO +3356413824,3356421119,CL +3356421120,3356421247,CO +3356421248,3356426239,CL 3356426240,3356427263,BR 3356427264,3356491775,US 3356491776,3356493823,PE @@ -121301,9 +122949,8 @@ 3356499968,3356508159,MX 3356508160,3356508671,AR 3356508672,3356509183,CR -3356509184,3356509439,VE -3356509440,3356509503,US -3356509504,3356510207,VE +3356509184,3356509695,CO +3356509696,3356510207,VE 3356510208,3356511999,AR 3356512000,3356512255,CO 3356512256,3356514303,AR @@ -121370,7 +123017,7 @@ 3357190144,3357192191,DO 3357192192,3357194239,PY 3357194240,3357196287,AR -3357196288,3357212671,CW +3357196288,3357204479,CW 3357212672,3357368319,CL 3357368320,3357376511,CO 3357376512,3357403135,CL @@ -121403,160 +123050,42 @@ 3357424640,3357425663,CL 3357425664,3357442047,CO 3357442048,3357442303,NI -3357442304,3357442319,GT -3357442320,3357442327,HN -3357442328,3357442335,GT -3357442336,3357442343,HN -3357442344,3357442391,GT -3357442392,3357442395,HN -3357442396,3357442559,GT -3357442560,3357442815,NI -3357442816,3357443071,SV -3357443072,3357443327,NI -3357443328,3357443583,GT -3357443584,3357444351,HN -3357444352,3357444479,GT -3357444480,3357444487,HN -3357444488,3357444607,GT -3357444608,3357444863,SV -3357444864,3357448407,GT -3357448408,3357448415,SV -3357448416,3357448447,GT -3357448448,3357448703,SV -3357448704,3357448959,GT -3357448960,3357449727,HN -3357449728,3357450751,GT -3357450752,3357451007,SV -3357451008,3357451119,GT -3357451120,3357451127,HN -3357451128,3357451143,GT -3357451144,3357451151,HN -3357451152,3357451263,GT -3357451264,3357451519,HN -3357451520,3357451775,NI -3357451776,3357452287,GT -3357452288,3357452799,HN -3357452800,3357453055,NI -3357453056,3357453071,GT -3357453072,3357453079,SV -3357453080,3357453135,GT -3357453136,3357453151,SV -3357453152,3357453311,GT +3357442304,3357448311,GT +3357448312,3357448319,SV +3357448320,3357449471,GT +3357449472,3357449727,HN +3357449728,3357452287,GT +3357452288,3357452543,HN +3357452544,3357453311,GT 3357453312,3357453567,HN -3357453568,3357454591,GT -3357454592,3357454847,NI -3357454848,3357455103,HN -3357455104,3357455359,SV -3357455360,3357455871,GT +3357453568,3357455871,GT 3357455872,3357456127,NI -3357456128,3357456639,GT -3357456640,3357456895,HN -3357456896,3357457711,GT -3357457712,3357457727,CR -3357457728,3357457919,GT -3357457920,3357458047,HN -3357458048,3357458431,GT +3357456128,3357457919,GT +3357457920,3357458431,HN 3357458432,3357474815,CL -3357474816,3357475015,US -3357475016,3357475019,AR -3357475020,3357475071,US -3357475072,3357475887,AR -3357475888,3357475903,VE -3357475904,3357475999,AR -3357476000,3357476015,VE -3357476016,3357476031,AR -3357476032,3357476047,VE -3357476048,3357476071,AR -3357476072,3357476079,VE -3357476080,3357476255,AR -3357476256,3357476271,VE -3357476272,3357476287,AR -3357476288,3357476351,VE -3357476352,3357476479,AR -3357476480,3357476607,EC -3357476608,3357476687,AR -3357476688,3357476703,US -3357476704,3357476735,AR -3357476736,3357476799,US -3357476800,3357476863,AR +3357474816,3357475071,US +3357475072,3357476351,AR +3357476352,3357476607,EC +3357476608,3357476863,AR 3357476864,3357477375,EC -3357477376,3357477423,AR -3357477424,3357477431,EC -3357477432,3357477543,AR -3357477544,3357477551,EC -3357477552,3357477887,AR -3357477888,3357478911,CO -3357478912,3357479063,AR -3357479064,3357479071,CO -3357479072,3357479087,AR -3357479088,3357479095,CO -3357479096,3357479135,AR -3357479136,3357479151,CO -3357479152,3357479183,AR -3357479184,3357479191,CO -3357479192,3357479215,AR -3357479216,3357479223,CO -3357479224,3357479551,AR -3357479552,3357479679,CO -3357479680,3357479863,AR -3357479864,3357479867,CO -3357479868,3357479871,AR -3357479872,3357479879,CO -3357479880,3357480031,AR -3357480032,3357480039,CO -3357480040,3357480103,AR -3357480104,3357480111,CO -3357480112,3357480159,AR -3357480160,3357480175,CO -3357480176,3357480335,AR -3357480336,3357480343,CO -3357480344,3357480359,AR -3357480360,3357480367,CO -3357480368,3357480407,AR -3357480408,3357480415,CO -3357480416,3357480463,AR -3357480464,3357480479,CO -3357480480,3357480511,AR -3357480512,3357480543,CO -3357480544,3357480703,AR -3357480704,3357480711,CO -3357480712,3357480719,AR -3357480720,3357480735,CO -3357480736,3357480751,AR -3357480752,3357480767,CO -3357480768,3357480799,AR -3357480800,3357480807,CO -3357480808,3357480959,AR -3357480960,3357483007,EC +3357477376,3357478473,AR +3357478474,3357478474,CO +3357478475,3357480423,AR +3357480424,3357480427,CO +3357480428,3357482865,AR +3357482866,3357482866,EC +3357482867,3357483007,AR 3357483008,3357491199,CL 3357491200,3357499391,CO 3357499392,3357507583,PE 3357507584,3357515775,VE 3357515776,3357523967,SV 3357523968,3357532159,CO -3357532160,3357556735,AR -3357556736,3357556991,VE -3357556992,3357557759,MX -3357557760,3357559295,EC -3357559296,3357559551,CA -3357559552,3357559807,US -3357559808,3357559935,AR -3357559936,3357560063,VE -3357560064,3357560159,AR -3357560160,3357560167,VE -3357560168,3357560175,AR -3357560176,3357560183,VE -3357560184,3357560199,AR -3357560200,3357560207,VE -3357560208,3357560247,AR -3357560248,3357560255,VE -3357560256,3357560263,AR -3357560264,3357560271,VE -3357560272,3357560319,AR -3357560320,3357560575,MX -3357560576,3357560831,US -3357560832,3357561855,CO -3357561856,3357581311,AR +3357532160,3357561167,AR +3357561168,3357561175,CO +3357561176,3357561199,AR +3357561200,3357561215,CO +3357561216,3357581311,AR 3357581312,3357589503,CL 3357589504,3357605887,BZ 3357605888,3357606911,MX @@ -121609,21 +123138,12 @@ 3357728768,3357736959,BR 3357736960,3357745151,VE 3357745152,3357753343,CO -3357753344,3357757487,VE -3357757488,3357757495,BO -3357757496,3357773823,VE -3357773824,3357775871,PA +3357753344,3357773823,VE 3357775872,3357776127,US 3357776128,3357776383,UY 3357776384,3357776895,US 3357776896,3357777919,CL -3357777920,3357778415,GT -3357778416,3357778423,SV -3357778424,3357784319,GT -3357784320,3357784335,SV -3357784336,3357784503,GT -3357784504,3357784511,SV -3357784512,3357786111,GT +3357777920,3357786111,GT 3357786112,3357802495,VE 3357802496,3357868031,MX 3357868032,3357933567,PE @@ -121632,156 +123152,76 @@ 3358023680,3358064639,MX 3358064640,3358130175,UY 3358130176,3358131199,EC -3358131200,3358131327,AR -3358131328,3358131455,CO -3358131456,3358131839,AR -3358131840,3358131967,CO -3358131968,3358131983,AR -3358131984,3358132031,CO -3358132032,3358132087,AR -3358132088,3358132095,CO -3358132096,3358132127,AR -3358132128,3358132135,CO -3358132136,3358132607,AR -3358132608,3358132735,CO -3358132736,3358132975,AR -3358132976,3358133119,EC -3358133120,3358133247,AR -3358133248,3358133759,VE -3358133760,3358142719,AR -3358142720,3358142975,US -3358142976,3358143231,CO -3358143232,3358143487,VE -3358143488,3358143999,US +3358131200,3358143999,AR 3358144000,3358144127,CL -3358144128,3358144255,AR -3358144256,3358144511,CL -3358144512,3358145023,VE -3358145024,3358149695,AR -3358149696,3358149703,CO -3358149704,3358149719,AR -3358149720,3358149727,CO -3358149728,3358150015,AR -3358150016,3358150143,CO -3358150144,3358150423,AR -3358150424,3358150431,CO -3358150432,3358150479,AR -3358150480,3358150655,CO -3358150656,3358150911,EC -3358150912,3358151039,AR -3358151040,3358151167,EC -3358151168,3358151263,AR -3358151264,3358151271,EC -3358151272,3358151423,AR -3358151424,3358151679,EC -3358151680,3358152703,PE -3358152704,3358152959,US -3358152960,3358153215,EC -3358153216,3358153279,AR -3358153280,3358153311,US -3358153312,3358153343,AR -3358153344,3358153535,US -3358153536,3358153599,AR -3358153600,3358153663,PR -3358153664,3358153703,AR -3358153704,3358153711,PR -3358153712,3358153727,AR -3358153728,3358153983,EC -3358153984,3358154239,US -3358154240,3358154751,CL -3358154752,3358158847,PE -3358158848,3358159159,AR -3358159160,3358159167,US -3358159168,3358159359,AR -3358159360,3358159615,EC -3358159616,3358159871,US -3358159872,3358160895,VE -3358160896,3358236671,AR +3358144128,3358149735,AR +3358149736,3358149743,CO +3358149744,3358151551,AR +3358151552,3358151679,EC +3358151680,3358151807,PE +3358151808,3358154495,AR +3358154496,3358154751,CL +3358154752,3358158335,AR +3358158336,3358158591,PE +3358158592,3358236671,AR 3358236672,3358244863,CL 3358244864,3358261247,DO -3358261248,3358264063,AR -3358264064,3358264319,PY -3358264320,3358326783,AR +3358261248,3358326783,AR 3358326784,3358392319,VE 3358392320,3358457855,AR -3358457856,3358523391,PA -3358523392,3358523903,VE -3358523904,3358526463,AR -3358526464,3358527487,VE -3358527488,3358530815,AR -3358530816,3358530943,VE -3358530944,3358531071,AR -3358531072,3358531583,VE -3358531584,3358531839,AR -3358531840,3358532351,VE -3358532352,3358532863,AR -3358532864,3358533631,VE -3358533632,3358533887,AR -3358533888,3358534399,VE -3358534400,3358538751,AR -3358538752,3358539519,VE -3358539520,3358543615,AR -3358543616,3358543871,VE -3358543872,3358544127,MX -3358544128,3358544383,AR -3358544384,3358545407,VE -3358545408,3358547967,AR -3358547968,3358548223,VE -3358548224,3358548479,AR -3358548480,3358548623,VE +3358457856,3358482175,PA +3358482176,3358482431,BZ +3358482432,3358523391,PA +3358523392,3358523903,AR +3358523904,3358526463,VE +3358526464,3358526719,AR +3358526720,3358527487,VE +3358527488,3358530047,AR +3358530048,3358530559,VE +3358530560,3358530815,AR +3358530816,3358534143,VE +3358534144,3358534399,AR +3358534400,3358535167,VE +3358535168,3358535679,AR +3358535680,3358536447,VE +3358536448,3358536703,AR +3358536704,3358538751,VE +3358538752,3358539263,AR +3358539264,3358539775,VE +3358539776,3358541823,AR +3358541824,3358543359,VE +3358543360,3358543615,AR +3358543616,3358545663,VE +3358545664,3358547967,AR +3358547968,3358548623,VE 3358548624,3358548639,AR -3358548640,3358549759,VE -3358549760,3358553855,AR -3358553856,3358554879,VE -3358554880,3358555135,AR -3358555136,3358556159,VE -3358556160,3358558463,AR -3358558464,3358558591,PY -3358558592,3358559231,AR -3358559232,3358560255,VE -3358560256,3358561791,AR -3358561792,3358562303,VE -3358562304,3358562399,AR -3358562400,3358562407,PE -3358562408,3358563327,AR -3358563328,3358564095,CO -3358564096,3358564351,MX -3358564352,3358566975,AR -3358566976,3358567103,VE -3358567104,3358567167,AR -3358567168,3358567231,VE -3358567232,3358567263,AR -3358567264,3358567327,VE -3358567328,3358567343,AR -3358567344,3358567375,VE -3358567376,3358567391,AR -3358567392,3358567407,VE -3358567408,3358567423,AR -3358567424,3358568959,CO -3358568960,3358569471,AR -3358569472,3358570495,VE -3358570496,3358570751,MX -3358570752,3358571263,PE -3358571264,3358572543,MX -3358572544,3358577151,AR -3358577152,3358577407,PE -3358577408,3358578431,AR -3358578432,3358578687,VE -3358578688,3358579967,CO -3358579968,3358587903,AR -3358587904,3358588927,CL +3358548640,3358550015,VE +3358550016,3358552063,AR +3358552064,3358553087,VE +3358553088,3358553599,AR +3358553600,3358554111,VE +3358554112,3358556159,AR +3358556160,3358560255,VE +3358560256,3358562303,AR +3358562304,3358564095,VE +3358564096,3358564351,AR +3358564352,3358565375,VE +3358565376,3358566399,AR +3358566400,3358566911,VE +3358566912,3358567423,AR +3358567424,3358568447,CO +3358568448,3358570495,VE +3358570496,3358578687,AR +3358578688,3358579711,CO +3358579712,3358580735,VE +3358580736,3358587903,AR +3358587904,3358588927,VE 3358588928,3358654463,PE 3358654464,3358658559,AR 3358658560,3358660607,CL 3358660608,3358662655,AR -3358662656,3358666751,BR -3358666752,3358667663,AR -3358667664,3358667671,BR -3358667672,3358668031,AR -3358668032,3358668287,BR -3358668288,3358668799,AR -3358668800,3358669055,BR -3358669056,3358695423,AR +3358662656,3358670847,BR +3358670848,3358695423,AR 3358695424,3358703615,GT 3358703616,3358715903,AR 3358715904,3358717951,EC @@ -121797,7 +123237,6 @@ 3358752768,3358756863,BB 3358756864,3358760959,CL 3358760960,3358769151,AR -3358769152,3358777343,HT 3358777344,3358779391,CR 3358779392,3358781439,EC 3358781440,3358851071,AR @@ -121805,8 +123244,8 @@ 3358855168,3358859263,BR 3358859264,3358887935,MX 3358887936,3358892031,HN -3358892032,3358918655,MX -3358918656,3358924799,BR +3358892032,3358916607,MX +3358916608,3358924799,BR 3358924800,3358965759,MX 3358965760,3358973951,BR 3358973952,3358982143,MX @@ -121815,10 +123254,7 @@ 3359080448,3359096831,CU 3359096832,3359105023,CL 3359105024,3359109119,EC -3359109120,3359109375,US -3359109376,3359110079,AR -3359110080,3359110143,GB -3359110144,3359111167,AR +3359109120,3359111167,AR 3359111168,3359113215,EC 3359113216,3359244287,MX 3359244288,3359260671,US @@ -121834,17 +123270,9 @@ 3359318016,3359356927,AR 3359356928,3359357951,VE 3359357952,3359358975,US -3359358976,3359363071,AR -3359363072,3359367167,PA -3359367168,3359375359,AR +3359358976,3359375359,AR 3359375360,3359440895,PE -3359440896,3359461951,AR -3359461952,3359462015,HN -3359462016,3359462271,AR -3359462272,3359462335,UY -3359462336,3359463399,AR -3359463400,3359463407,CO -3359463408,3359463679,AR +3359440896,3359463679,AR 3359463680,3359463743,HN 3359463744,3359477759,AR 3359477760,3359478015,UY @@ -121877,56 +123305,37 @@ 3359598592,3359599615,EC 3359599616,3359621119,AR 3359621120,3359637503,EC -3359637504,3359789583,MX -3359789584,3359789599,US -3359789600,3359789823,MX -3359789824,3359789887,US -3359789888,3359797247,MX +3359637504,3359797247,MX 3359797248,3359801343,BR 3359801344,3359899647,MX 3359899648,3359916031,CL 3359916032,3359932415,AR 3359932416,3359948799,MX -3359948800,3359989247,AR -3359989248,3359989503,US -3359989504,3359989759,AR +3359948800,3359989759,AR 3359989760,3359997951,CO 3359997952,3360006143,AR 3360006144,3360014335,EC 3360014336,3360096255,AR 3360096256,3360104447,UY -3360104448,3360116735,CO +3360104448,3360112639,CO 3360116736,3360118783,BO 3360118784,3360120831,AR -3360120832,3360124927,CO 3360124928,3360125439,US 3360125440,3360125951,VE 3360125952,3360127999,BR -3360128000,3360128319,HN -3360128320,3360128327,IT -3360128328,3360128543,HN -3360128544,3360128575,US -3360128576,3360129023,HN +3360128000,3360128775,HN +3360128776,3360128783,BE +3360128784,3360129023,HN 3360129024,3360145407,VE 3360145408,3360153599,CL 3360153600,3360157695,AR 3360157696,3360159743,VE 3360159744,3360161791,BQ -3360161792,3360229007,CL -3360229008,3360229012,US -3360229013,3360229013,CL -3360229014,3360229023,US -3360229024,3360231775,CL -3360231776,3360231807,US -3360231808,3360246783,CL -3360246784,3360247039,AR -3360247040,3360251903,CL +3360161792,3360251903,CL 3360251904,3360253951,BO 3360253952,3360255999,SV 3360256000,3360260095,CL -3360260096,3360260351,AR -3360260352,3360260607,US -3360260608,3360276479,AR +3360260096,3360276479,AR 3360276480,3360278527,VE 3360278528,3360280575,EC 3360280576,3360282623,CL @@ -121936,9 +123345,7 @@ 3360342016,3360354303,VE 3360354304,3360356351,PA 3360356352,3360358399,CR -3360358400,3360358911,CL -3360358912,3360358919,CO -3360358920,3360366591,CL +3360358400,3360366591,CL 3360366592,3360382975,CO 3360382976,3360399359,VE 3360399360,3360403455,BO @@ -121954,49 +123361,13 @@ 3360669696,3360686079,MX 3360686080,3360698367,AR 3360698368,3360699135,UY -3360699136,3360705535,AR -3360705536,3360705791,US -3360705792,3360707071,AR -3360707072,3360707327,US -3360707328,3360707583,AR -3360707584,3360708095,US -3360708096,3360708223,AR -3360708224,3360708351,US -3360708352,3360708479,AR -3360708480,3360708863,US -3360708864,3360708991,AR -3360708992,3360709247,US -3360709248,3360709631,AR -3360709632,3360709759,US -3360709760,3360710271,AR -3360710272,3360710399,US -3360710400,3360710527,AR -3360710528,3360710655,US +3360699136,3360710655,AR 3360710656,3360718847,HT 3360718848,3360763903,AR -3360763904,3360765951,GT 3360765952,3360767999,CO -3360768000,3360772351,AR -3360772352,3360772479,BO -3360772480,3360780303,AR -3360780304,3360780319,BR -3360780320,3360780399,AR -3360780400,3360780415,BR -3360780416,3360780991,AR -3360780992,3360780995,BR -3360780996,3360781055,AR -3360781056,3360781071,BR -3360781072,3360781791,AR -3360781792,3360781795,MX -3360781796,3360781839,AR -3360781840,3360781847,DO -3360781848,3360781943,AR -3360781944,3360781947,MX -3360781948,3360782167,AR -3360782168,3360782175,MX -3360782176,3360782239,AR -3360782240,3360782247,MX -3360782248,3360788479,AR +3360768000,3360781599,AR +3360781600,3360781615,BS +3360781616,3360788479,AR 3360788480,3360790527,CL 3360790528,3360849919,AR 3360849920,3360882687,VE @@ -122052,28 +123423,7 @@ 3361726464,3361734655,MX 3361734656,3362258943,BR 3362258944,3362324479,CL -3362324480,3362324735,AR -3362324736,3362324991,US -3362324992,3362326015,AR -3362326016,3362326271,US -3362326272,3362327039,AR -3362327040,3362327551,US -3362327552,3362328063,AR -3362328064,3362328575,US -3362328576,3362337279,AR -3362337280,3362338047,US -3362338048,3362338559,AR -3362338560,3362338815,US -3362338816,3362339327,AR -3362339328,3362339583,US -3362339584,3362342143,AR -3362342144,3362342399,PA -3362342400,3362343423,AR -3362343424,3362343679,US -3362343680,3362344447,AR -3362344448,3362344959,US -3362344960,3362348799,AR -3362348800,3362349055,US +3362324480,3362349055,AR 3362349056,3362351103,CR 3362351104,3362353151,AR 3362353152,3362355199,EC @@ -122081,15 +123431,13 @@ 3362357248,3362381823,BO 3362381824,3362390015,EC 3362390016,3362422783,PE -3362422784,3362426879,CO -3362426880,3362428927,PA 3362428928,3362430975,CL 3362430976,3362447359,CO -3362447360,3362448895,HN -3362448896,3362449151,SV -3362449152,3362449407,HN -3362449408,3362450175,SV -3362450176,3362451455,HN +3362447360,3362448383,SV +3362448384,3362448895,HN +3362448896,3362450175,SV +3362450176,3362450431,HN +3362450432,3362451455,SV 3362451456,3362452479,AR 3362452480,3362452991,BO 3362452992,3362453247,HN @@ -122115,19 +123463,11 @@ 3362529280,3362537471,PA 3362537472,3362545663,AR 3362545664,3362549759,PE -3362549760,3362551871,AR -3362551872,3362551887,MX -3362551888,3362552143,AR -3362552144,3362552159,PR -3362552160,3362552431,AR -3362552432,3362552447,MX -3362552448,3362553023,AR -3362553024,3362553039,PR -3362553040,3362553167,AR -3362553168,3362553183,DO -3362553184,3362553247,AR -3362553248,3362553263,CO -3362553264,3362553855,AR +3362549760,3362552575,AR +3362552576,3362552591,MX +3362552592,3362553791,AR +3362553792,3362553807,VI +3362553808,3362553855,AR 3362553856,3362557951,PY 3362557952,3362562047,AR 3362570240,3362586623,UY @@ -122149,17 +123489,13 @@ 3362711552,3362713599,EC 3362713600,3362714623,VE 3362714624,3362714879,HN -3362714880,3362716415,VE -3362716416,3362716671,CR -3362716672,3362717695,VE +3362714880,3362717695,VE 3362717696,3362815999,CL 3362816000,3362832383,AR 3362832384,3362838527,CO 3362838528,3362840575,EC 3362840576,3362897919,CL -3362897920,3362903551,HT -3362903552,3362904063,MX -3362904064,3362914303,HT +3362897920,3362914303,HT 3362914304,3362930687,CO 3362930688,3362934783,CL 3362934784,3362936831,AR @@ -122176,9 +123512,7 @@ 3362992128,3362996223,AR 3362996224,3363000319,UY 3363000320,3363004415,AR -3363012608,3363013967,PA -3363013968,3363013975,NI -3363013976,3363024895,PA +3363012608,3363024895,PA 3363024896,3363025151,HN 3363025152,3363025407,PA 3363025408,3363025663,CO @@ -122200,15 +123534,9 @@ 3363471360,3363487743,CR 3363487744,3363504127,CO 3363504128,3363512319,PE -3363512320,3363554047,AR -3363554048,3363554175,US -3363554176,3363554303,AR -3363554304,3363554431,BR -3363554432,3363554943,AR -3363554944,3363555327,US -3363555328,3363555839,AR -3363555840,3363556607,US -3363556608,3363557375,AR +3363512320,3363554175,AR +3363554176,3363554303,US +3363554304,3363557375,AR 3363557376,3363559423,BZ 3363559424,3363561471,AR 3363565568,3363569663,AR @@ -122222,45 +123550,37 @@ 3363601920,3363602175,AR 3363602176,3363602431,PA 3363602432,3363610623,CW -3363614720,3363617791,AR -3363617792,3363618815,PE +3363614720,3363618815,AR 3363618816,3363627007,UY 3363627008,3363635199,EC 3363635200,3363651583,UY 3363651584,3363667967,AR 3363667968,3363676159,EC 3363676160,3363678207,TT -3363680256,3363682303,GT 3363682304,3363684351,VE 3363684352,3363708927,EC 3363708928,3363713023,CL 3363713024,3363713279,EC 3363713280,3363714047,CL -3363714048,3363715583,PE -3363715584,3363715839,CL -3363715840,3363716607,PE +3363714048,3363715839,PE +3363715840,3363716095,CL +3363716096,3363716607,PE 3363716608,3363716863,AR 3363716864,3363717119,PE 3363717120,3363733503,CL 3363733504,3363831807,AR 3363831808,3367763967,BR -3367763968,3367774207,MX -3367774208,3367776255,BR -3367776256,3367788543,MX -3367788544,3367796735,BR -3367796736,3367804927,MX +3367763968,3367804927,MX 3367804928,3367840767,BR -3367840768,3367841023,HN -3367841024,3367841039,CA -3367841040,3367841407,HN -3367841408,3367841423,CA -3367841424,3367841791,HN +3367840768,3367841791,HN 3367841792,3368052991,BR 3368052992,3368053247,PE 3368053248,3368053503,CO 3368053504,3368086527,BR 3368086528,3368087551,CR -3368087552,3368601799,BR +3368087552,3368157183,BR +3368157184,3368173567,MX +3368173568,3368601799,BR 3368601801,3370188799,BR 3370188800,3370196991,MX 3370196992,3370214399,BR @@ -122274,7 +123594,9 @@ 3370507264,3370512383,BR 3370514432,3370515455,BR 3370515456,3370516479,AR -3370516480,3371106303,BR +3370516480,3370926079,BR +3370926080,3370942463,MX +3370942464,3371106303,BR 3371106304,3371122687,MX 3371122688,3378511871,BR 3378511872,3380506879,MX @@ -122305,7 +123627,8 @@ 3380818176,3380818431,PA 3380818432,3380818687,DO 3380818688,3380818943,PY -3380818944,3380822527,MX +3380818944,3380822015,MX +3380822272,3380822527,MX 3380822528,3380822783,NI 3380822784,3380823039,PE 3380823040,3380824063,BR @@ -122317,7 +123640,6 @@ 3380825600,3380825855,CO 3380825856,3380826111,AR 3380826112,3380828159,BR -3380828160,3380828671,MX 3380828672,3380829183,CO 3380829184,3380830207,BR 3380830208,3380830463,MX @@ -122325,7 +123647,6 @@ 3380830720,3380831231,PA 3380831232,3380831743,MX 3380831744,3380831999,AR -3380832000,3380832255,SR 3380832256,3380832767,MX 3380832768,3380833279,DO 3380833280,3380833791,MX @@ -122363,7 +123684,7 @@ 3381448704,3381452799,BR 3381452800,3381453823,AR 3381453824,3381455871,BR -3381455872,3381456895,US +3381456384,3381456895,US 3381456896,3381460991,BR 3381460992,3381944319,MX 3381944320,3381946367,BR @@ -122371,9 +123692,11 @@ 3381947392,3381952511,BR 3381952512,3381960703,MX 3381960704,3381962751,BR -3381962752,3381963559,HN -3381963560,3381963567,FR -3381963568,3381963775,HN +3381962752,3381962991,HN +3381962992,3381962999,FR +3381963000,3381963711,HN +3381963712,3381963727,CA +3381963728,3381963775,HN 3381963776,3381968895,BR 3381968896,3381972991,MX 3381972992,3381974015,BR @@ -122411,7 +123734,8 @@ 3382587392,3382588415,HN 3382588416,3382589439,PE 3382589440,3382591487,BR -3382591488,3382602751,MX +3382591488,3382599679,MX +3382601728,3382602751,MX 3382602752,3382603775,BR 3382603776,3382605823,MX 3382605824,3382607871,AR @@ -122427,17 +123751,12 @@ 3382661120,3382662143,MX 3382662144,3382665215,BR 3382665216,3382669311,MX -3382669312,3382669567,SV -3382669568,3382669823,GT -3382669824,3382670079,HN -3382670080,3382670335,GT +3382669312,3382670335,GT 3382670336,3382672383,BR 3382672384,3382677503,MX 3382677504,3382681599,BR -3382681600,3382683647,MX 3382683648,3382685695,CL -3382685696,3382686655,MX -3382686656,3382686719,US +3382685696,3382686719,MX 3382686720,3382689791,BR 3382689792,3382695935,MX 3382695936,3382696959,AR @@ -122450,14 +123769,6 @@ 3383701504,3383705599,BR 3383705600,3383754751,MX 3383754752,3384147967,AR -3384147968,3384154879,US -3384154880,3384155135,HN -3384155136,3384156159,US -3384156160,3384160255,PA -3384160256,3384164351,US -3384164352,3384183807,PA -3384183808,3384184831,VE -3384184832,3384213503,PA 3384213504,3384279039,EC 3384279040,3384410111,CO 3384410112,3384672255,CL @@ -122469,7 +123780,6 @@ 3386114048,3386245119,AR 3386245120,3386376191,CL 3386376192,3386392575,CO -3386392576,3386408959,CW 3386408960,3386425343,GT 3386425344,3386441727,AR 3386441728,3386458111,PY @@ -122486,7 +123796,9 @@ 3386548224,3386556415,CR 3386556416,3386562047,PA 3386562048,3386562303,PE -3386562304,3386572799,PA +3386562304,3386571263,PA +3386571264,3386571519,BZ +3386571520,3386572799,PA 3386572800,3386589183,EC 3386589184,3386601471,AR 3386601472,3386605567,CO @@ -122530,7 +123842,6 @@ 3386769408,3386773503,VE 3386773504,3386774527,AR 3386774528,3386777599,BR -3386777600,3386781695,CW 3386781696,3386783743,PY 3386783744,3386784767,AR 3386784768,3386785791,GT @@ -122545,16 +123856,38 @@ 3387424768,3387502599,CO 3387502600,3387502607,JP 3387502608,3387555839,CO -3387555840,3387568127,AR -3387568128,3387572223,PE +3387555840,3387568879,AR +3387568880,3387568883,PE +3387568884,3387570673,AR +3387570674,3387570674,PE +3387570675,3387570847,AR +3387570848,3387570863,PE +3387570864,3387570943,AR +3387570944,3387571071,PE +3387571072,3387571967,AR +3387571968,3387572095,PE +3387572096,3387572223,AR 3387572224,3387576319,CO 3387576320,3387578367,EC 3387578368,3387584511,AR -3387584512,3387588607,PE -3387588608,3387600895,AR +3387584512,3387585535,PE +3387585536,3387600895,AR 3387600896,3387604991,CO -3387604992,3387613183,EC -3387613184,3387617279,VE +3387604992,3387607295,AR +3387607296,3387607423,EC +3387607424,3387609959,AR +3387609960,3387609967,EC +3387609968,3387611007,AR +3387611008,3387611135,EC +3387611136,3387611547,AR +3387611548,3387611551,EC +3387611552,3387613811,AR +3387613812,3387613812,VE +3387613813,3387613831,AR +3387613832,3387613839,VE +3387613840,3387615615,AR +3387615616,3387615743,VE +3387615744,3387617279,AR 3387617280,3387619327,CO 3387619328,3387686911,AR 3387686912,3387736063,CL @@ -123155,9 +124488,7 @@ 3391192320,3391356927,JP 3391356928,3391414783,NZ 3391414784,3391415039,CN -3391415040,3391441407,NZ -3391441408,3391441663,PH -3391441664,3391444479,NZ +3391415040,3391444479,NZ 3391444480,3391444991,VN 3391444992,3391453183,NZ 3391453184,3391453439,ID @@ -123606,7 +124937,9 @@ 3391848448,3391848959,AU 3391848960,3391849471,IN 3391849472,3391851007,AU -3391851264,3391852543,AU +3391851008,3391851263,SG +3391851264,3391851519,JP +3391851520,3391852543,AU 3391852544,3391856639,CN 3391856640,3391864831,ID 3391864832,3391866879,TW @@ -123880,12 +125213,13 @@ 3392799488,3392799743,AU 3392799744,3392800767,JP 3392800768,3392802815,SG -3392802816,3392806911,JP +3392802816,3392805887,JP +3392805888,3392806911,HK 3392806912,3392815103,AU 3392815104,3392819199,ID 3392819200,3392823295,MY 3392823296,3392824319,KH -3392824320,3392824831,AU +3392824320,3392824575,AU 3392824832,3392825343,IN 3392825344,3392826367,CN 3392826368,3392827391,BD @@ -124575,7 +125909,8 @@ 3395059712,3395067903,PH 3395067904,3395076095,HK 3395076096,3395080191,ID -3395080192,3395084287,AU +3395080192,3395082239,AU +3395082240,3395084287,NZ 3395084288,3395088383,IN 3395088384,3395091455,AU 3395091456,3395093503,CN @@ -124624,6 +125959,8 @@ 3395182848,3395190783,SG 3395190784,3395198975,JP 3395198976,3395199999,IN +3395200000,3395200511,BD +3395200512,3395200767,TH 3395200768,3395201023,MY 3395201024,3395202047,TH 3395202048,3395203071,IN @@ -124663,8 +126000,7 @@ 3397027072,3397027327,PH 3397027328,3397027839,IN 3397027840,3397029887,JP -3397029888,3397031423,MY -3397031680,3397033983,MY +3397029888,3397033983,MY 3397033984,3397038079,ID 3397038080,3397058559,JP 3397058560,3397066751,MU @@ -124675,7 +126011,9 @@ 3397087232,3397088255,HK 3397088256,3397090303,CN 3397090304,3397091327,TW -3397091328,3397099519,GU +3397091328,3397093375,MP +3397093376,3397097471,GU +3397097472,3397099519,MP 3397099520,3397103615,HK 3397103616,3397105663,LA 3397105664,3397107711,JP @@ -124754,7 +126092,9 @@ 3397338040,3397338043,SG 3397338044,3397338375,HK 3397338376,3397338379,JP -3397338380,3397339647,HK +3397338380,3397338423,HK +3397338424,3397338427,JP +3397338428,3397339647,HK 3397339648,3397339687,SG 3397339688,3397340927,HK 3397340928,3397341183,TH @@ -124831,8 +126171,7 @@ 3397531648,3397532671,SG 3397532672,3397533695,JP 3397533696,3397551359,HK -3397551616,3397557247,HK -3397557252,3397557252,HK +3397551616,3397557279,HK 3397557504,3397566463,HK 3397566464,3397574655,AU 3397574656,3397582847,CN @@ -125204,7 +126543,8 @@ 3399827456,3399835647,AU 3399839744,3399841791,JP 3399841792,3399842815,HK -3399842816,3399843839,AU +3399842816,3399843583,AU +3399843584,3399843839,US 3399843840,3399852031,TW 3399852032,3399856127,JP 3399856128,3399860223,CN @@ -125227,10 +126567,7 @@ 3399924736,3399925759,PH 3399925760,3399933951,SG 3399933952,3399942143,CN -3399942144,3399945983,HK -3399945984,3399946239,AU -3399946240,3399950335,HK -3399950336,3399954943,AU +3399942144,3399954943,AU 3399954944,3399974911,US 3399974912,3399979007,HK 3399979008,3399982963,US @@ -125241,7 +126578,9 @@ 3399995392,3399999487,KR 3399999488,3400000475,JP 3400000476,3400000479,US -3400000480,3400003583,JP +3400000480,3400002303,JP +3400002304,3400002367,HK +3400002368,3400003583,JP 3400003584,3400005631,AU 3400005632,3400006143,JP 3400006400,3400007679,JP @@ -125255,8 +126594,7 @@ 3400032256,3400040447,AU 3400040448,3400044543,CN 3400044544,3400045567,IN -3400045568,3400046591,HK -3400046592,3400047615,KR +3400045568,3400047615,HK 3400047616,3400048639,IN 3400048640,3400056831,CN 3400056832,3400060927,TW @@ -125394,7 +126732,9 @@ 3400648816,3400648831,HK 3400648832,3400649943,JP 3400649944,3400649951,HK -3400649952,3400650409,JP +3400649952,3400650143,JP +3400650144,3400650159,HK +3400650160,3400650409,JP 3400650410,3400650410,AU 3400650411,3400650751,JP 3400650752,3400654847,AU @@ -125425,7 +126765,6 @@ 3400849408,3400851455,MN 3400851456,3400859647,AU 3400859648,3400860671,HK -3400860672,3400861695,IN 3400861696,3400862719,CN 3400862720,3400864767,BD 3400864768,3400865791,AU @@ -125877,7 +127216,8 @@ 3406622720,3406623743,CN 3406623744,3406625023,AU 3406625024,3406625279,NF -3406625280,3406631423,AU +3406625280,3406625791,AU +3406626816,3406631423,AU 3406631424,3406631679,CN 3406631680,3406632959,AU 3406632960,3406633215,CN @@ -125991,9 +127331,7 @@ 3406864640,3406865151,CN 3406865152,3406865663,AU 3406865664,3406865919,IN -3406865920,3406869503,AU -3406869504,3406870527,JP -3406870528,3406871039,AU +3406865920,3406871039,AU 3406871040,3406871551,CN 3406871552,3406881791,AU 3406881792,3406882047,CN @@ -126068,7 +127406,7 @@ 3406976768,3406977023,CN 3406977024,3406980095,AU 3406980096,3406980607,CN -3406980608,3406981375,AU +3406980608,3406981119,AU 3406981376,3406981631,CN 3406981632,3406981887,AU 3406981888,3406982143,CN @@ -126258,7 +127596,7 @@ 3407258368,3407258623,CN 3407258624,3407259135,AU 3407259136,3407259391,CN -3407259392,3407260159,AU +3407259648,3407260159,AU 3407260160,3407260415,CN 3407260416,3407261695,AU 3407261696,3407263743,HK @@ -126278,9 +127616,7 @@ 3407282176,3407282431,CN 3407282688,3407294207,AU 3407294208,3407294463,CN -3407294464,3407297791,AU -3407297792,3407298559,CN -3407298560,3407300863,AU +3407294464,3407300863,AU 3407300864,3407301119,CN 3407301120,3407303935,AU 3407303936,3407304191,CN @@ -127114,9 +128450,8 @@ 3409871872,3409873663,AU 3409873664,3409873919,CN 3409873920,3409875967,AU -3409875968,3409876839,JP -3409876840,3409876847,AU -3409876848,3409876991,JP +3409875968,3409876735,JP +3409876736,3409876991,AU 3409876992,3409878015,TH 3409878016,3409879295,AU 3409879296,3409879551,CN @@ -127929,7 +129264,9 @@ 3414409216,3414413311,JP 3414413312,3414417407,TH 3414417408,3414425599,HK -3414425600,3414433791,AU +3414425600,3414431743,AU +3414431744,3414432767,US +3414432768,3414433791,AU 3414433792,3414441983,CN 3414441984,3414450175,AU 3414450176,3414458367,JP @@ -127941,7 +129278,8 @@ 3414491136,3414523903,TW 3414523904,3414532095,JP 3414532096,3414540287,KR -3414540288,3414555647,JP +3414540288,3414554623,JP +3414554624,3414555647,AU 3414555648,3414556671,PK 3414556672,3414605823,AU 3414605824,3414616063,IN @@ -128144,9 +129482,7 @@ 3416514560,3416522751,IN 3416522752,3416588287,AU 3416588288,3416653823,JP -3416653824,3416667135,AU -3416667136,3416668159,US -3416668160,3416686591,AU +3416653824,3416686591,AU 3416686592,3416694783,SG 3416694784,3416702975,CN 3416702976,3416707071,ID @@ -128157,7 +129493,8 @@ 3416710144,3416711167,HK 3416711168,3416719359,AU 3416719360,3416721407,PH -3416721408,3416723455,VN +3416721408,3416723199,VN +3416723200,3416723455,TW 3416723456,3416724479,KH 3416724480,3416725503,HK 3416725504,3416726527,AU @@ -128217,7 +129554,9 @@ 3416930816,3416931327,CN 3416931328,3416932351,IN 3416932352,3416936447,PK -3416936448,3416939007,AU +3416936448,3416937215,AU +3416937216,3416937471,HK +3416937472,3416939007,AU 3416939008,3416939519,HK 3416939520,3416940543,AU 3416940544,3416948735,KR @@ -128423,8 +129762,7 @@ 3418304512,3418306559,VN 3418306560,3418308607,IN 3418308608,3418324991,CN -3418324992,3418326015,VU -3418326016,3418326271,AU +3418324992,3418326271,AU 3418326272,3418326527,CN 3418326528,3418327039,PH 3418327040,3418329087,JP @@ -128548,7 +129886,11 @@ 3419529216,3419537407,CN 3419537408,3419541503,HK 3419541504,3419553791,KR -3419553792,3419557631,AU +3419553792,3419556095,AU +3419556096,3419556351,CN +3419556352,3419556607,AU +3419556608,3419556863,CN +3419556864,3419557631,AU 3419557888,3419558399,ID 3419558400,3419558655,AU 3419558656,3419559935,ID @@ -128679,7 +130021,11 @@ 3423094784,3423095807,CA 3423095808,3423131647,US 3423131648,3423133695,PL -3423133696,3423143935,US +3423133696,3423135999,US +3423136000,3423136255,CA +3423136256,3423137023,US +3423137024,3423137279,CA +3423137280,3423143935,US 3423143936,3423145983,CA 3423145984,3423162367,US 3423162368,3423163391,CA @@ -128688,14 +130034,12 @@ 3423182848,3423184895,CA 3423184896,3423258623,US 3423258624,3423260671,CA -3423260672,3423264831,US -3423264832,3423264863,NG -3423264864,3423268863,US +3423260672,3423268863,US 3423268864,3423269887,CA 3423269888,3423285247,US 3423285248,3423287295,CA -3423287296,3423288319,VG -3423288320,3423303679,US +3423287296,3423287807,VG +3423287808,3423303679,US 3423303680,3423304703,CA 3423304704,3423311871,US 3423311872,3423313151,VI @@ -128712,7 +130056,11 @@ 3423416320,3423417343,CA 3423417344,3423430655,US 3423430656,3423431679,TC -3423431680,3423468543,US +3423431680,3423465471,US +3423465472,3423465727,VC +3423465728,3423465983,US +3423465984,3423466239,VC +3423466240,3423468543,US 3423468544,3423469567,CA 3423469568,3423473663,US 3423473664,3423474687,CA @@ -128737,7 +130085,9 @@ 3423586304,3423588351,US 3423590400,3423602687,US 3423602688,3423603711,KN -3423603712,3423626239,US +3423603712,3423614975,US +3423614976,3423615487,CA +3423615488,3423626239,US 3423626240,3423627263,CA 3423627264,3423629311,US 3423629312,3423630335,AG @@ -128750,9 +130100,7 @@ 3423705856,3423725423,US 3423725424,3423725427,CA 3423725428,3423731711,US -3423731712,3423752191,AE -3423752192,3423756287,US -3423756288,3423797247,AE +3423731712,3423797247,AE 3423797248,3423797503,US 3423797504,3423801087,CA 3423801088,3423801343,US @@ -128792,7 +130140,9 @@ 3425173504,3425304575,CA 3425304576,3425471487,US 3425471488,3425472511,CA -3425472512,3425697791,US +3425472512,3425516799,US +3425516800,3425517055,MX +3425517056,3425697791,US 3425697792,3425699839,CA 3425699840,3425714175,US 3425714176,3425722367,CA @@ -128801,12 +130151,12 @@ 3425847040,3425869167,CA 3425869168,3425869183,US 3425869184,3425894399,CA -3425894400,3425994495,US -3425994496,3425994751,CA -3425994752,3426007807,US +3425894400,3426007807,US 3426008064,3426013183,US 3426013184,3426013439,IL -3426013440,3426369023,US +3426013440,3426356991,US +3426356992,3426357247,CA +3426357248,3426369023,US 3426369024,3426369535,CA 3426369536,3426387967,US 3426387968,3426388991,MX @@ -128841,7 +130191,8 @@ 3427133184,3427408393,US 3427408395,3427487743,US 3427487744,3427487999,GB -3427488000,3427503871,US +3427488000,3427503615,US +3427503616,3427503871,AU 3427503872,3427504127,SG 3427504128,3427618303,US 3427618304,3427618559,CA @@ -128936,7 +130287,7 @@ 3427767808,3427769599,US 3427769600,3427770111,JP 3427770112,3427770367,NO -3427770368,3427770623,GB +3427770368,3427770623,US 3427770624,3427771391,CH 3427771392,3427771647,US 3427771648,3427771903,CA @@ -128951,8 +130302,7 @@ 3427774720,3427775231,DE 3427775232,3427776511,US 3427776512,3427776767,CZ -3427776768,3427777023,US -3427777024,3427777279,NL +3427776768,3427777279,US 3427777280,3427777535,DE 3427777536,3427777791,US 3427777792,3427778047,HK @@ -128963,8 +130313,7 @@ 3427779328,3427780095,US 3427780096,3427780351,GB 3427780352,3427780863,DE -3427780864,3427781375,US -3427781376,3427781631,GB +3427780864,3427781631,US 3427781632,3427781887,BE 3427781888,3427782399,US 3427782400,3427782655,GB @@ -128986,7 +130335,7 @@ 3427790080,3427790847,US 3427790848,3427791103,IT 3427791104,3427791615,DE -3427791616,3427791871,GB +3427791616,3427791871,US 3427791872,3427792383,CA 3427792384,3427792639,NL 3427792640,3427793407,SG @@ -128997,22 +130346,19 @@ 3427796992,3427831551,US 3427831552,3427831807,MX 3427831808,3427860479,US -3427860480,3428025343,CA -3428025344,3428025855,US -3428025856,3428057087,CA +3427860480,3428057087,CA 3428057088,3428286719,US 3428286720,3428286975,CA 3428286976,3428296959,US 3428296960,3428297215,CL 3428297216,3428299519,US 3428299520,3428299775,ZA -3428299776,3428302079,US -3428302080,3428302335,CA -3428302336,3428306175,US +3428299776,3428306175,US 3428306176,3428306431,PE 3428306432,3428318975,US 3428318976,3428319231,CA -3428319232,3428399359,US +3428319232,3428398079,US +3428399104,3428399359,US 3428399360,3428399615,CA 3428399616,3428434943,US 3428434944,3428435199,CA @@ -129023,16 +130369,14 @@ 3428582912,3428585215,US 3428585216,3428585471,CA 3428585472,3428585983,US -3428585984,3428586495,CA -3428586496,3428587007,US -3428587008,3428587519,CA +3428585984,3428586239,CA +3428586240,3428587263,US +3428587264,3428587519,CA 3428587520,3428587775,US -3428587776,3428588287,CA -3428588288,3428588543,US +3428587776,3428588031,CA +3428588032,3428588543,US 3428588544,3428588799,CA -3428588800,3428589311,US -3428589312,3428589567,CA -3428589568,3428591871,US +3428588800,3428591871,US 3428591872,3428592127,CA 3428592128,3428592383,US 3428592384,3428593919,CA @@ -129057,7 +130401,9 @@ 3428605184,3428607999,US 3428608000,3428609023,CA 3428609024,3428610047,US -3428610048,3428611071,CA +3428610048,3428610559,CA +3428610560,3428610815,US +3428610816,3428611071,CA 3428611072,3428612607,US 3428612608,3428613887,CA 3428613888,3428614143,US @@ -129098,9 +130444,7 @@ 3428660736,3428661503,CA 3428661504,3428743167,US 3428743168,3428744191,CA -3428744192,3428752383,US -3428752384,3428753407,GH -3428753408,3428958207,US +3428744192,3428958207,US 3428958208,3428962303,CO 3428962304,3429027839,US 3429027840,3429028351,GB @@ -129124,9 +130468,7 @@ 3429957632,3430073343,US 3430073600,3430074111,US 3430074112,3430074367,AU -3430074368,3430328831,US -3430328832,3430329087,GH -3430329088,3430354943,US +3430074368,3430354943,US 3430354944,3430356991,PR 3430356992,3430417151,US 3430417152,3430417167,BR @@ -129206,9 +130548,7 @@ 3431518144,3431520767,US 3431521024,3431526921,US 3431526923,3431596287,US -3431596288,3431602687,CA -3431602688,3431602943,US -3431602944,3431606271,CA +3431596288,3431606271,CA 3431606272,3431609343,US 3431609344,3431613439,CA 3431613440,3431613695,US @@ -129231,9 +130571,7 @@ 3431745024,3431745279,BE 3431745280,3431745791,US 3431745792,3431746047,GB -3431746048,3431746559,US -3431746560,3431746815,DE -3431746816,3431747071,US +3431746048,3431747071,US 3431747072,3431747327,LU 3431747328,3431748607,US 3431748608,3431749119,FR @@ -129246,7 +130584,9 @@ 3431755008,3431755775,NL 3431755776,3431759615,CA 3431759616,3431759871,DE -3431759872,3432004607,US +3431759872,3431851007,US +3431851008,3431851263,GB +3431851264,3432004607,US 3432004608,3432005631,CA 3432005632,3432009215,US 3432009216,3432009471,PR @@ -129258,9 +130598,7 @@ 3432133888,3432134143,GB 3432134144,3432205311,US 3432205312,3432206335,CA -3432206336,3432280063,US -3432280064,3432280319,GB -3432280320,3432324607,US +3432206336,3432324607,US 3432324608,3432324863,CA 3432324864,3432329215,US 3432329216,3432330239,DE @@ -129295,13 +130633,23 @@ 3432689152,3432689663,CA 3432689664,3432695807,US 3432695808,3432697855,CA -3432697856,3432736255,US +3432697856,3432726271,US +3432726272,3432726527,CA +3432726528,3432736255,US 3432736256,3432736511,GB 3432736512,3432737279,US 3432737280,3432737535,SG 3432737536,3432738303,US 3432738304,3432738559,GB -3432738560,3432807423,US +3432738560,3432748799,US +3432748800,3432749055,PA +3432749056,3432749311,US +3432749312,3432749567,BG +3432749568,3432749823,US +3432749824,3432750079,BG +3432750080,3432750335,US +3432750336,3432750591,BG +3432750592,3432807423,US 3432807424,3432808447,CA 3432808448,3433955583,US 3433955584,3433964799,CA @@ -129329,27 +130677,13 @@ 3434807552,3434831359,CA 3434831360,3434831615,US 3434831616,3434872575,CA -3434872576,3434913951,US -3434913952,3434913959,AG -3434913960,3434914047,US -3434914048,3434914303,DM -3434914304,3434914559,VG -3434914560,3434914815,AG -3434914816,3434915327,VG -3434915328,3434915583,DM -3434915584,3434915839,KN -3434915840,3434916095,LC -3434916096,3434916351,US -3434916352,3434916607,DM -3434916608,3434916863,AG -3434916864,3434917119,US -3434917120,3434917375,LC -3434917376,3434917887,AG -3434917888,3435069439,US +3434872576,3435069439,US 3435069440,3435134975,CA -3435134976,3435216637,US -3435216639,3435216650,US -3435216652,3435271423,US +3435134976,3435216383,US +3435216384,3435216637,DE +3435216639,3435216650,DE +3435216652,3435216895,DE +3435216896,3435271423,US 3435271424,3435271679,CA 3435271680,3435507711,US 3435507712,3435511807,CA @@ -129412,7 +130746,9 @@ 3437343232,3437343487,US 3437343488,3437350911,CA 3437350912,3437351423,US -3437351424,3437358847,CA +3437351424,3437353471,CA +3437353472,3437353727,SG +3437353728,3437358847,CA 3437358848,3437359103,US 3437359104,3437428735,CA 3437428736,3437691391,US @@ -129464,9 +130800,7 @@ 3437731584,3437731615,AF 3437731616,3437734399,US 3437734400,3437734655,SG -3437734656,3437736447,US -3437736448,3437737471,CL -3437737472,3437748223,US +3437734656,3437748223,US 3437748224,3437748479,GB 3437748480,3437748991,NL 3437748992,3437749247,US @@ -129502,7 +130836,9 @@ 3438132560,3438132575,CA 3438132576,3438137183,US 3438137184,3438137191,CA -3438137192,3438215423,US +3438137192,3438139391,US +3438139392,3438140415,GB +3438140416,3438215423,US 3438215424,3438215935,CA 3438215936,3438216191,US 3438216192,3438217983,CA @@ -129528,17 +130864,13 @@ 3438610409,3438610410,GB 3438610411,3438734335,US 3438734336,3438735359,CA -3438735360,3438813183,US -3438813184,3438814207,GH -3438814208,3438895103,US +3438735360,3438895103,US 3438895104,3438896639,HN 3438896640,3439059711,US 3439059712,3439059967,PR 3439059968,3439071103,US 3439071104,3439071135,MX -3439071136,3448303615,US -3448303616,3448303871,KY -3448303872,3448338687,US +3439071136,3448338687,US 3448338688,3448339455,GB 3448339456,3448377343,US 3448377344,3448377855,AG @@ -129576,15 +130908,7 @@ 3449100288,3449100799,HK 3449100800,3449101311,AU 3449101312,3449159679,US -3449159680,3449160703,CA -3449160704,3449161471,US -3449161472,3449163519,CA -3449163520,3449163775,US -3449163776,3449165055,CA -3449165056,3449165311,US -3449165312,3449165567,CA -3449165568,3449166079,US -3449166080,3449168639,CA +3449159680,3449168639,CA 3449168640,3449168895,US 3449168896,3449169151,CA 3449169152,3449169663,US @@ -130181,9 +131505,7 @@ 3455132160,3455133695,BO 3455133696,3455320063,US 3455320064,3455322111,FR -3455322112,3455328255,US -3455328256,3455329279,DO -3455329280,3455330815,US +3455322112,3455330815,US 3455330816,3455331327,ES 3455331328,3455333887,US 3455333888,3455334399,NL @@ -130193,11 +131515,11 @@ 3455359232,3455359487,ES 3455359488,3455418367,US 3455418368,3455418879,KY -3455418880,3455421439,US -3455421440,3455421951,BE -3455421952,3455453439,US +3455418880,3455453439,US 3455453440,3455453695,HT -3455453696,3455551999,US +3455453696,3455488103,US +3455488104,3455488111,CA +3455488112,3455551999,US 3455552000,3455552255,EC 3455552256,3455566079,US 3455566080,3455566335,EC @@ -130354,7 +131676,9 @@ 3458195456,3458196479,SG 3458196480,3458233343,US 3458233344,3458234367,CA -3458234368,3458813951,US +3458234368,3458806783,US +3458806784,3458807807,GB +3458807808,3458813951,US 3458813952,3458818047,CA 3458818048,3458820095,US 3458820096,3458820351,CA @@ -130531,7 +131855,10 @@ 3460453632,3460453887,BS 3460453888,3460507647,US 3460507648,3460507903,MX -3460507904,3460801023,US +3460507904,3460762367,US +3460762368,3460762623,CA +3460762624,3460762879,US +3460763648,3460801023,US 3460801280,3460878335,US 3460878336,3460878591,CA 3460878592,3460880383,US @@ -130675,7 +132002,9 @@ 3461515776,3461516031,CA 3461516032,3461516287,US 3461516288,3461516543,IL -3461516544,3461808127,US +3461516544,3461554175,US +3461554176,3461556223,CA +3461558272,3461808127,US 3461808128,3461873663,CA 3461873664,3461897727,US 3461897728,3461897983,CA @@ -130770,8 +132099,10 @@ 3462635008,3462635263,US 3462635264,3462635519,SG 3462635520,3462660295,US -3462660296,3462660303,GB -3462660304,3462661375,US +3462660296,3462660303,SG +3462660304,3462660327,US +3462660328,3462660335,SG +3462660336,3462661375,US 3462661376,3462661631,SG 3462661632,3463004159,US 3463004160,3463006207,CO @@ -130822,9 +132153,9 @@ 3464202240,3464202495,CA 3464202496,3464203007,US 3464203008,3464203263,SE -3464203264,3464203519,DE -3464203520,3464204799,US -3464204800,3464205311,NL +3464203264,3464204799,US +3464204800,3464205055,DK +3464205056,3464205311,NL 3464205312,3464205567,SE 3464205568,3464205823,US 3464205824,3464205951,AF @@ -131164,11 +132495,7 @@ 3468468224,3468545791,US 3468545792,3468546047,SG 3468546048,3468597759,US -3468597760,3468598015,SG -3468598016,3468598143,US -3468598144,3468598175,SG -3468598176,3468598271,US -3468598272,3468598391,SG +3468597760,3468598391,SG 3468598392,3468598399,NL 3468598400,3468599039,SG 3468599040,3468599295,HK @@ -131180,17 +132507,15 @@ 3468623872,3468656639,CA 3468656640,3468658175,US 3468658176,3468658431,KY -3468658432,3468682399,US -3468682400,3468682415,HK -3468682416,3468682447,US +3468658432,3468682447,US 3468682448,3468682463,SG 3468682464,3468682495,US 3468682496,3468682559,HK 3468682560,3468682575,US 3468682576,3468682591,HK 3468682592,3468682607,US -3468682608,3468682639,SG -3468682640,3468682735,HK +3468682608,3468682671,SG +3468682672,3468682735,HK 3468682736,3468682751,US 3468682752,3468682911,HK 3468682912,3468682927,US @@ -131248,7 +132573,9 @@ 3468688912,3468688927,NL 3468688928,3468688943,US 3468688944,3468688959,IE -3468688960,3468977919,US +3468688960,3468802303,US +3468802304,3468802559,CA +3468802560,3468977919,US 3468978176,3469032191,US 3469032448,3469055743,US 3469055744,3469055999,CA @@ -131306,8 +132633,7 @@ 3470755840,3470756095,MU 3470756096,3470761983,US 3470761984,3470770175,CA -3470770176,3470778367,US -3470786560,3470794751,US +3470770176,3470794751,US 3470794752,3470802943,PA 3470802944,3470884863,US 3470884864,3470885887,HK @@ -131332,26 +132658,14 @@ 3471558656,3471560703,CA 3471560704,3471570943,US 3471570944,3471572991,CA -3471572992,3472245759,US -3472245760,3472245760,GB -3472245761,3472246783,US -3472246784,3472246784,GB -3472246785,3472248319,US -3472248320,3472248320,GB -3472248321,3472249343,US +3471572992,3472249343,US 3472249344,3472249599,CA -3472249600,3472250367,US -3472250368,3472250368,GB -3472250369,3472252415,US -3472252416,3472252416,GB -3472252417,3472256511,US -3472256512,3472256767,GB -3472256768,3472259583,US -3472259584,3472259584,GB -3472259585,3472375807,US +3472249600,3472375807,US 3472375808,3472392191,PR 3472392192,3472408575,CA -3472408576,3472721919,US +3472408576,3472678911,US +3472678912,3472687103,PL +3472687104,3472721919,US 3472721920,3472723967,CA 3472723968,3473039359,US 3473039360,3473040639,BM @@ -131423,9 +132737,8 @@ 3475909144,3475909359,US 3475909360,3475909367,IE 3475909368,3475910655,US -3475910656,3475911167,SG -3475911296,3475911487,SG -3475911488,3475911551,HK +3475910656,3475911519,SG +3475911520,3475911551,HK 3475911552,3475912959,SG 3475912960,3475913215,US 3475913216,3475914751,SG @@ -131492,7 +132805,9 @@ 3475953024,3475953663,US 3475953664,3475953919,IE 3475953920,3475954175,SG -3475954176,3475955711,US +3475954176,3475954547,US +3475954548,3475954551,PT +3475954552,3475955711,US 3475955712,3475959807,SG 3475959808,3475996671,US 3475996672,3476029439,CA @@ -131504,7 +132819,9 @@ 3476447232,3476455423,CA 3476455424,3476881407,US 3476881408,3476946943,CA -3476946944,3477384735,US +3476946944,3477384711,US +3477384712,3477384719,CN +3477384720,3477384735,US 3477384736,3477384743,IE 3477384744,3477384783,US 3477384784,3477384799,IE @@ -131686,7 +133003,9 @@ 3481812992,3481822063,CA 3481822064,3481822079,US 3481822080,3481829375,CA -3481829376,3481937919,US +3481829376,3481843199,US +3481843200,3481843711,GB +3481843712,3481937919,US 3481937920,3481938943,GB 3481938944,3481951977,US 3481951978,3481951978,DE @@ -131790,11 +133109,7 @@ 3482048000,3482048511,US 3482048512,3482048767,CA 3482048768,3482049791,US -3482049792,3482050559,CA -3482050560,3482051327,US -3482051328,3482051583,CA -3482051584,3482051839,US -3482051840,3482052863,CA +3482049792,3482052863,CA 3482052864,3482053631,US 3482053632,3482053887,CA 3482053888,3482053999,US @@ -131810,8 +133125,8 @@ 3482779648,3482910719,US 3482910720,3482927103,CA 3482927104,3483025407,US -3483025408,3483037695,DE -3483037696,3483435007,US +3483025408,3483041791,DE +3483041792,3483435007,US 3483435008,3483533311,CA 3483533312,3483631615,US 3483631616,3483697151,CA @@ -131820,9 +133135,7 @@ 3483791624,3483791631,US 3483791632,3483791815,PR 3483791816,3483791823,US -3483791824,3483793919,PR -3483793920,3483794431,US -3483794432,3483795455,PR +3483791824,3483795455,PR 3483795456,3483828223,US 3483828224,3483836415,CA 3483836416,3483844607,US @@ -131947,9 +133260,7 @@ 3485969152,3485969152,GB 3485969153,3485969663,US 3485969664,3485969664,GB -3485969665,3485969919,US -3485969920,3485969920,GB -3485969921,3485970431,US +3485969665,3485970431,US 3485970432,3485970943,CA 3485970944,3485972991,US 3485972992,3485973247,CA @@ -132269,7 +133580,11 @@ 3489398784,3489399039,IT 3489399040,3489464319,US 3489464320,3489529855,CA -3489529856,3489562623,US +3489529856,3489535999,US +3489536000,3489538047,IE +3489538048,3489547263,US +3489547264,3489548287,IE +3489548288,3489562623,US 3489566720,3489575935,US 3489575936,3489576191,CN 3489576192,3489576703,US @@ -132305,13 +133620,11 @@ 3490265344,3490267135,CO 3490267136,3490488319,US 3490488320,3490489343,PR -3490489344,3490703615,US +3490489344,3490702847,US +3490702848,3490703103,AS +3490703104,3490703615,US 3490703616,3490703871,PR -3490703872,3490786047,US -3490786048,3490786303,PR -3490786304,3490879231,US -3490879232,3490879487,PR -3490879488,3491381247,US +3490703872,3491381247,US 3491381248,3491389439,BM 3491389440,3491476991,US 3491476992,3491478527,VI @@ -132336,7 +133649,9 @@ 3492812760,3492812763,JP 3492812764,3492845823,US 3492845824,3492846079,CH -3492846080,3492866047,US +3492846080,3492863999,US +3492864000,3492865023,CA +3492865024,3492866047,US 3492866048,3492868095,GB 3492868096,3492877954,US 3492877955,3492877955,CA @@ -132352,9 +133667,13 @@ 3492912384,3492921855,US 3492921856,3492922111,VI 3492922112,3492926079,US -3492926096,3492933376,US +3492926096,3492931583,US +3492931584,3492933119,CA +3492933120,3492933375,US +3492933376,3492933376,CA 3492933377,3492933377,CH -3492933378,3492939022,US +3492933378,3492933631,CA +3492933632,3492939022,US 3492939023,3492939023,DE 3492939024,3492944127,US 3492944128,3492944383,VE @@ -132364,13 +133683,17 @@ 3492957696,3492958207,VI 3492958208,3492962303,US 3492962304,3492963327,GB -3492963328,3492994047,US +3492963328,3492969471,US +3492969472,3492969727,VI +3492969728,3492994047,US 3492994048,3492995071,GB 3492995072,3492998655,US 3492998656,3492999136,GB 3492999137,3492999137,US 3492999138,3492999167,GB -3492999168,3493039359,US +3492999168,3493007359,US +3493007360,3493008383,GB +3493008384,3493039359,US 3493039360,3493039615,AR 3493039616,3493073151,US 3493073152,3493073407,BO @@ -132414,7 +133737,8 @@ 3494011088,3494011095,US 3494011136,3494011231,US 3494011232,3494011247,HK -3494011264,3494014975,US +3494011264,3494011903,US +3494012928,3494014975,US 3494014976,3494017023,CA 3494017024,3494043647,US 3494043648,3494045695,CA @@ -132446,9 +133770,7 @@ 3494184960,3494187007,CA 3494187008,3494191359,US 3494191360,3494191615,DE -3494191616,3494191626,US -3494191627,3494191627,GB -3494191628,3494191871,US +3494191616,3494191871,GB 3494191872,3494192127,NL 3494192128,3494192383,US 3494192384,3494192639,JP @@ -132562,19 +133884,21 @@ 3494862848,3494863871,DM 3494863872,3494866943,US 3494866944,3494867967,CA -3494867968,3494874111,US +3494867968,3494871039,US +3494872064,3494874111,US 3494874112,3494874367,ES 3494874368,3494874879,US 3494874880,3494874911,ES 3494874912,3494893567,US 3494893568,3494894591,CA 3494894592,3494917119,US -3494917120,3494917631,CA -3494917632,3494928383,US +3494917120,3494918143,CA +3494918144,3494928383,US 3494928384,3494930431,CA 3494930432,3494938623,US 3494938624,3494939647,CA -3494939648,3494950655,US +3494939648,3494948863,US +3494949888,3494950655,US 3494950656,3494950911,PH 3494950912,3494964223,US 3494964224,3494965247,PR @@ -132608,7 +133932,8 @@ 3495090176,3495091199,KY 3495091200,3495098367,US 3495098368,3495100415,CA -3495100416,3495120895,US +3495100416,3495100927,IE +3495100928,3495120895,US 3495120896,3495122943,AG 3495122944,3495153663,US 3495153664,3495155711,CA @@ -132661,7 +133986,8 @@ 3495475200,3495477247,CA 3495477248,3495478271,US 3495478272,3495479295,CA -3495479296,3495505919,US +3495479296,3495481343,US +3495483392,3495505919,US 3495505920,3495507967,CA 3495507968,3495515135,US 3495515136,3495516159,CA @@ -132683,7 +134009,9 @@ 3495618560,3495619583,CA 3495619584,3495620607,US 3495620608,3495622655,CA -3495622656,3495673855,US +3495622656,3495651327,US +3495653376,3495654399,CA +3495654400,3495673855,US 3495673856,3495674879,MF 3495674880,3495675162,VG 3495675163,3495675163,US @@ -132833,22 +134161,11 @@ 3499436032,3499436287,DE 3499436288,3499450367,US 3499450368,3499451391,IN -3499451392,3499705343,US -3499705344,3499705855,TZ +3499451392,3499705855,US 3499705856,3499706367,MG 3499706368,3499986943,US 3499986944,3499988991,KY -3499988992,3500015871,US -3500015872,3500016127,AG -3500016128,3500016383,US -3500016384,3500016639,KN -3500016640,3500016895,US -3500016896,3500017151,DM -3500017152,3500018943,US -3500018944,3500019199,LC -3500019200,3500019455,US -3500019456,3500019711,LC -3500019712,3500126207,US +3499988992,3500126207,US 3500126208,3500126463,SE 3500126464,3500126719,GB 3500126720,3500351487,US @@ -132970,7 +134287,9 @@ 3507025408,3507025663,IQ 3507025664,3507054591,US 3507054592,3507055615,CN -3507055616,3507060735,US +3507055616,3507055903,US +3507055904,3507055911,HK +3507055912,3507060735,US 3507060736,3507068927,CN 3507068928,3507290111,US 3507290112,3507355647,AR @@ -133352,11 +134671,15 @@ 3510788448,3510788479,GB 3510788480,3510844415,US 3510844416,3510844927,CA -3510844928,3511140351,US +3510844928,3510935551,US +3510935552,3510943743,CA +3510943744,3511140351,US 3511140352,3511156735,CA 3511156736,3511257855,US 3511257856,3511258111,CN -3511258112,3511812095,US +3511258112,3511314215,US +3511314216,3511314223,CA +3511314224,3511812095,US 3511812096,3511844863,CA 3511844864,3512012095,US 3512012096,3512012159,GB @@ -133454,11 +134777,7 @@ 3512397824,3512401919,CA 3512401920,3512418303,US 3512418304,3512451071,CA -3512451072,3512465407,PR -3512465408,3512465663,US -3512465664,3512466687,PR -3512466688,3512466943,US -3512466944,3512467455,PR +3512451072,3512467455,PR 3512467456,3512532991,US 3512532992,3512598527,GB 3512598528,3512647679,US @@ -133613,9 +134932,7 @@ 3517054976,3517095935,US 3517095936,3517100031,CA 3517100032,3517112319,US -3517112320,3517116159,CA -3517116160,3517116415,US -3517116416,3517120511,CA +3517112320,3517120511,CA 3517120512,3517233151,US 3517233152,3517235199,GU 3517235200,3517382655,US @@ -133627,11 +134944,7 @@ 3517385440,3517385471,US 3517385472,3517385727,CA 3517385728,3517385983,US -3517385984,3517387263,CA -3517387264,3517387519,US -3517387520,3517387775,CA -3517387776,3517388287,US -3517388288,3517388799,CA +3517385984,3517388799,CA 3517388800,3517389311,US 3517389312,3517389567,CA 3517389568,3517389823,US @@ -133864,7 +135177,9 @@ 3519901696,3519930367,US 3519934464,3519938559,CA 3519938560,3519946751,IL -3519946752,3519967231,US +3519946752,3519948287,US +3519948288,3519948799,DE +3519948800,3519967231,US 3519967232,3519969279,CA 3519969280,3519971071,US 3519971072,3519971327,CA @@ -133932,9 +135247,7 @@ 3522101248,3522109439,CA 3522109440,3522118143,US 3522118144,3522118655,GB -3522118656,3522118911,US -3522118912,3522119679,GB -3522119680,3522119935,US +3522118656,3522119935,US 3522119936,3522120191,LY 3522120192,3522120447,US 3522120448,3522121215,AE @@ -133959,7 +135272,9 @@ 3522174976,3522179071,BM 3522179072,3522195455,US 3522195456,3522199551,CA -3522199552,3522854911,US +3522199552,3522816767,US +3522816768,3522817023,CA +3522817024,3522854911,US 3522854912,3522871295,CA 3522871296,3522893823,US 3522893824,3522894847,CA @@ -134117,7 +135432,7 @@ 3524290560,3524291583,CN 3524291584,3524294655,IN 3524294656,3524295679,SG -3524295680,3524296703,PH +3524295680,3524296703,MY 3524296704,3524313087,CN 3524313088,3524329471,KR 3524329472,3524362239,TW @@ -134294,7 +135609,14 @@ 3526926336,3526934527,JP 3526934528,3526942719,CN 3526942720,3526950911,AU -3526950912,3527002111,JP +3526950912,3526951935,MY +3526951936,3526952959,JP +3526952960,3526953983,ID +3526953984,3526971439,JP +3526971440,3526971443,HK +3526971444,3526971667,JP +3526971668,3526971671,HK +3526971672,3527002111,JP 3527002112,3527003647,IN 3527003648,3527004159,JP 3527004160,3527008255,ID @@ -134351,13 +135673,15 @@ 3534758976,3534759039,PH 3534759040,3534759167,AU 3534759168,3534759215,JP -3534759216,3534760447,AU +3534759216,3534759963,AU +3534759964,3534759967,US +3534759968,3534760447,AU 3534760448,3534760959,NZ 3534760960,3534761983,AU 3534761984,3534763775,HK -3534764032,3534785279,HK -3534785280,3534785535,SG -3534785536,3534786815,HK +3534764032,3534785043,HK +3534785044,3534785047,SG +3534785048,3534786815,HK 3534786816,3534787327,MY 3534787328,3534787583,TH 3534787584,3534863443,HK @@ -134430,7 +135754,9 @@ 3541565440,3541696511,MY 3541696512,3542089727,AU 3542089728,3542847487,KR -3542847488,3542851583,US +3542847488,3542851071,US +3542851072,3542851327,DE +3542851328,3542851583,US 3542851584,3544186879,KR 3544186880,3544711167,CN 3544711168,3545235455,TW @@ -134530,7 +135856,9 @@ 3557343232,3557351423,DE 3557351424,3557356543,RU 3557356544,3557357311,NL -3557357312,3557359615,RU +3557357312,3557358079,RU +3557358080,3557358847,NL +3557358848,3557359615,RU 3557359616,3557359991,JE 3557359992,3557359999,GB 3557360000,3557360047,JE @@ -134629,7 +135957,9 @@ 3557892096,3557900287,IE 3557900288,3557916671,AT 3557916672,3557924863,NO -3557924864,3557933055,FI +3557924864,3557928959,AX +3557928960,3557931007,FI +3557931008,3557933055,AX 3557933056,3557941247,IT 3557941248,3557957631,DE 3557957632,3557965823,SI @@ -134670,8 +136000,8 @@ 3558178816,3558187007,BG 3558187008,3558195199,DE 3558195200,3558196327,GB -3558196328,3558196343,IT -3558196344,3558197247,GB +3558196328,3558196351,IT +3558196352,3558197247,GB 3558197248,3558199295,US 3558199296,3558203391,GB 3558203392,3558211583,ES @@ -134681,16 +136011,14 @@ 3558230016,3558231039,PL 3558231040,3558231551,RU 3558231552,3558231807,SK -3558231808,3558232063,FR +3558231808,3558232063,RU 3558232064,3558232575,LB 3558232576,3558236159,RU 3558236160,3558244351,GB 3558244352,3558252543,IT 3558252544,3558260735,KE 3558260736,3558268927,UA -3558268928,3558273279,GI -3558273280,3558273535,GB -3558273536,3558275839,GI +3558268928,3558275839,GI 3558275840,3558276095,HK 3558276096,3558277119,GI 3558277120,3558285951,GB @@ -134724,11 +136052,7 @@ 3558350848,3558359039,RU 3558359040,3558367231,GB 3558367232,3558371327,LT -3558371328,3558372383,AT -3558372384,3558372607,BG -3558372608,3558372735,AT -3558372736,3558372863,ES -3558372864,3558375423,AT +3558371328,3558375423,AT 3558375424,3558383615,CZ 3558383616,3558391807,HU 3558391808,3558399999,LU @@ -134784,7 +136108,9 @@ 3558842368,3558850559,SE 3558850560,3558851327,GB 3558851328,3558851335,ES -3558851336,3558854135,GB +3558851336,3558851815,GB +3558851816,3558851823,ES +3558851824,3558854135,GB 3558854136,3558854143,ES 3558854144,3558856703,GB 3558856704,3558858751,US @@ -135341,7 +136667,7 @@ 3560941088,3560941091,DE 3560941092,3560941095,BE 3560941096,3560941099,AT -3560941100,3560941103,IT +3560941100,3560941103,DE 3560941104,3560941107,FR 3560941108,3560941119,DE 3560941120,3560941123,BE @@ -135985,8 +137311,7 @@ 3560943526,3560943526,IT 3560943527,3560943529,DE 3560943530,3560943530,CH -3560943531,3560943532,DE -3560943533,3560943533,HU +3560943531,3560943533,DE 3560943534,3560943534,BY 3560943535,3560943535,FR 3560943536,3560943536,BE @@ -136959,7 +138284,9 @@ 3561609216,3561611263,FR 3561611264,3561611519,GB 3561611520,3561611775,FR -3561611776,3561615359,GB +3561611776,3561613759,GB +3561613760,3561613823,FR +3561613824,3561615359,GB 3561615360,3561617407,FR 3561617408,3561618431,IE 3561618432,3561618877,GB @@ -137455,7 +138782,9 @@ 3564733260,3564733263,DE 3564733264,3564733343,GB 3564733344,3564733351,DE -3564733352,3564734207,GB +3564733352,3564733807,GB +3564733808,3564733823,DE +3564733824,3564734207,GB 3564734458,3564734458,DE 3564734464,3564734741,GB 3564734742,3564734742,DE @@ -137507,14 +138836,12 @@ 3564882688,3564883071,GB 3564883072,3564883079,NL 3564883080,3564883199,GB -3564883200,3564883455,NL -3564883456,3564886015,GB +3564883200,3564883967,NL +3564883968,3564886015,GB 3564886016,3564886527,NL 3564886528,3564886719,GB 3564886720,3564886751,NL -3564886752,3564888479,GB -3564888480,3564888495,NL -3564888496,3564888991,GB +3564886752,3564888991,GB 3564888992,3564889007,ES 3564889008,3564889633,GB 3564889634,3564889634,NL @@ -137524,8 +138851,9 @@ 3564892160,3564896255,NL 3564896256,3564904447,RU 3564904448,3564912639,DE -3564912640,3564915711,NL -3564915712,3564916735,IN +3564912640,3564914687,NL +3564914688,3564915711,GB +3564915712,3564916735,US 3564916736,3564917759,MX 3564917760,3564918783,US 3564918784,3564920831,IT @@ -137759,7 +139087,9 @@ 3567173632,3567239167,GB 3567239168,3567241215,NL 3567241472,3567255551,NL -3567255552,3567321087,PL +3567255552,3567263743,PL +3567263744,3567271935,ES +3567271936,3567321087,PL 3567321088,3567353855,GB 3567353856,3567386623,CH 3567386624,3567388351,GB @@ -137804,7 +139134,9 @@ 3567490048,3567490303,ES 3567490304,3567499007,GB 3567499008,3567499135,ES -3567499136,3567500543,GB +3567499136,3567499519,GB +3567499520,3567499775,ES +3567499776,3567500543,GB 3567500544,3567500799,ES 3567500800,3567502615,GB 3567502616,3567502623,ES @@ -137875,9 +139207,7 @@ 3568484352,3568486655,NL 3568486912,3568492543,NL 3568492544,3568500735,RS -3568500736,3568510975,IL -3568510976,3568511487,SY -3568511488,3568566271,IL +3568500736,3568566271,IL 3568566272,3568585471,FR 3568585728,3568599039,FR 3568599040,3568631807,PL @@ -138250,8 +139580,11 @@ 3572355072,3572356095,CH 3572356096,3572357119,GB 3572357120,3572358143,NL -3572358144,3572360191,GB -3572360192,3572361215,ES +3572358144,3572359167,GB +3572359168,3572360191,US +3572360192,3572360831,ES +3572360832,3572360895,MX +3572360896,3572361215,ES 3572361216,3572362239,LT 3572362240,3572363263,ES 3572363264,3572364287,RS @@ -138324,7 +139657,9 @@ 3574174840,3574174847,ES 3574174848,3574182904,GB 3574182905,3574182905,ES -3574182906,3574186799,GB +3574182906,3574183423,GB +3574183424,3574183679,ES +3574183680,3574186799,GB 3574186800,3574186815,ES 3574186816,3574187007,GB 3574187008,3574188031,ES @@ -138347,8 +139682,8 @@ 3574530208,3574530239,DE 3574530240,3574594559,SE 3574594560,3574595583,GB -3574595584,3574596863,GP -3574596864,3574597119,MQ +3574595584,3574596607,GP +3574596608,3574597119,MQ 3574597120,3574598655,GP 3574598656,3574599679,MQ 3574599680,3574603775,GP @@ -138361,7 +139696,9 @@ 3574792192,3574824959,CZ 3574824960,3574830079,GB 3574830080,3574831103,NL -3574831104,3574842367,GB +3574831104,3574841629,GB +3574841630,3574841630,NL +3574841631,3574842367,GB 3574842368,3574842623,NL 3574842624,3574857727,GB 3574857728,3574923263,DE @@ -138418,9 +139755,7 @@ 3575658304,3575658367,FI 3575658368,3575659007,FR 3575659008,3575659071,ES -3575659072,3575659167,FR -3575659168,3575659183,FI -3575659184,3575659863,FR +3575659072,3575659863,FR 3575659864,3575659867,GB 3575659868,3575660155,FR 3575660156,3575660159,GB @@ -138747,7 +140082,10 @@ 3578363904,3578396671,NL 3578396672,3578462207,TR 3578462208,3578527743,NL -3578527744,3578658815,PL +3578527744,3578576895,PL +3578576896,3578593279,ES +3578593280,3578626047,PL +3578626048,3578658815,ES 3578658816,3578724351,GB 3578724352,3578732543,RU 3578732544,3578740735,IE @@ -138921,7 +140259,9 @@ 3579838464,3580039167,ES 3580039168,3580039199,NL 3580039200,3580039231,AT -3580039232,3580039515,ES +3580039232,3580039247,ES +3580039248,3580039423,IT +3580039424,3580039515,ES 3580039516,3580039551,NL 3580039552,3580100607,ES 3580100608,3580108799,LV @@ -138934,7 +140274,9 @@ 3580135936,3580136447,SE 3580136448,3580141567,HR 3580141568,3580142591,LV -3580142592,3580149759,SE +3580142592,3580143615,SE +3580143616,3580145663,LV +3580145664,3580149759,SE 3580149760,3580166143,EE 3580166144,3580198911,SE 3580198912,3580199935,LV @@ -138944,8 +140286,7 @@ 3580203648,3580203775,AT 3580203776,3580204031,SE 3580204032,3580204543,LT -3580204544,3580205055,NL -3580205056,3580206079,SE +3580204544,3580206079,SE 3580206080,3580207103,HR 3580207104,3580208127,LV 3580208128,3580209151,EE @@ -138971,16 +140312,14 @@ 3580244992,3580246015,LT 3580246016,3580248063,LV 3580248064,3580254207,EE -3580254208,3580259327,LV -3580259328,3580260351,SE +3580254208,3580260351,LV 3580260352,3580265471,AT 3580265472,3580265727,SE 3580265728,3580268543,EE 3580268544,3580272639,LV -3580272640,3580280831,SE -3580280832,3580289023,NL +3580272640,3580289023,SE 3580289024,3580297215,HR -3580297216,3580329983,NL +3580297216,3580329983,SE 3580329984,3580338175,EE 3580338176,3580338687,SE 3580338688,3580339199,HR @@ -139022,9 +140361,7 @@ 3580698624,3580702719,PL 3580702720,3580706815,RU 3580706816,3580708863,KG -3580708864,3580709887,RU -3580709888,3580710399,US -3580710400,3580710911,RU +3580708864,3580710911,RU 3580710912,3580715007,UA 3580715008,3580719103,RU 3580719104,3580723199,NL @@ -139072,7 +140409,9 @@ 3582074880,3582077439,GB 3582077440,3582077471,DE 3582077472,3582083071,GB -3582083072,3582091263,BG +3582083072,3582087167,BG +3582087168,3582089215,DK +3582089216,3582091263,BG 3582091264,3582099455,QA 3582099456,3582107647,GB 3582107648,3582115839,NL @@ -139190,7 +140529,9 @@ 3582861312,3582869503,RU 3582869504,3582877695,NO 3582877696,3582885887,AT -3582885888,3582894079,TR +3582885888,3582892031,TR +3582892032,3582892543,US +3582892544,3582894079,TR 3582894080,3582902271,CH 3582902272,3582910463,RU 3582910464,3582916607,SI @@ -139337,8 +140678,7 @@ 3583959040,3583967231,NO 3583967232,3583969279,TR 3583969280,3583969791,FR -3583969792,3583970815,GB -3583970816,3583971327,US +3583969792,3583971327,US 3583971328,3583973887,NL 3583973888,3583974399,IT 3583974400,3583975423,TR @@ -139545,7 +140885,9 @@ 3585523712,3585531903,LV 3585531904,3585540095,AT 3585540096,3585548287,DE -3585548288,3585553151,RU +3585548288,3585550335,RU +3585550336,3585550399,DE +3585550400,3585553151,RU 3585553152,3585553407,NL 3585553408,3585556479,RU 3585556480,3585564671,DE @@ -139729,10 +141071,7 @@ 3586596864,3586605055,GB 3586605056,3586621439,SE 3586621696,3586625535,NL -3586625536,3586628095,GB -3586628096,3586628118,NL -3586628119,3586628119,GB -3586628120,3586628127,NL +3586625536,3586628127,GB 3586628128,3586628159,AT 3586628160,3586628191,IE 3586628192,3586628223,NL @@ -139741,15 +141080,17 @@ 3586628288,3586628319,GB 3586628320,3586628351,AT 3586628352,3586629631,GB -3586629632,3586634047,IE +3586629632,3586631935,IE +3586631936,3586632191,CN +3586632192,3586634047,IE 3586634048,3586634079,NL 3586634080,3586634783,IE 3586634784,3586634815,NL 3586634816,3586634847,IE 3586634848,3586634911,NL 3586634912,3586634943,FI -3586634944,3586635263,NL -3586635264,3586635519,IE +3586634944,3586635007,NL +3586635008,3586635519,IE 3586635520,3586635775,NL 3586635776,3586637823,IE 3586637824,3586654207,PL @@ -139798,15 +141139,19 @@ 3586850816,3586867199,NO 3586867200,3586883583,FR 3586883584,3586899967,IT -3586899968,3586911007,DE -3586911008,3586911039,BE -3586911040,3586916351,DE +3586899968,3586910207,DE +3586910208,3586910719,NL +3586910720,3586911231,BE +3586911232,3586916351,DE 3586916352,3586924543,IT 3586924544,3586925695,FI 3586925696,3586925759,AX 3586925760,3586925823,FI 3586925824,3586926079,SE -3586926080,3586932735,FI +3586926080,3586926591,FI +3586926592,3586929663,AX +3586929664,3586930687,FI +3586930688,3586932735,AX 3586932736,3586949119,LB 3586949120,3586965503,SE 3586965504,3586981887,NL @@ -139858,7 +141203,9 @@ 3587242672,3587242679,NL 3587242680,3587244031,GB 3587244032,3587260415,IT -3587260416,3587284991,DE +3587260416,3587278591,DE +3587278592,3587279359,GB +3587279360,3587284991,DE 3587291136,3587292159,FR 3587293184,3587309567,IT 3587309568,3587325951,GB @@ -139983,7 +141330,19 @@ 3588751360,3588767743,TR 3588779648,3588779775,GB 3588784128,3588800511,CH -3588800512,3588816895,RU +3588800512,3588801535,RU +3588801536,3588802047,KZ +3588802048,3588802815,RU +3588802816,3588803071,KZ +3588803072,3588807167,RU +3588807168,3588808959,KZ +3588808960,3588810239,RU +3588810240,3588810751,KZ +3588810752,3588813311,RU +3588813312,3588814079,KZ +3588814080,3588814335,RU +3588814336,3588814847,KZ +3588814848,3588816895,RU 3588816896,3588833279,IT 3588833280,3588849663,RO 3588849664,3588857855,IE @@ -140097,7 +141456,9 @@ 3589849088,3589865471,GB 3589865472,3589881855,GR 3589881856,3589890047,NL -3589890048,3589931007,GB +3589890048,3589904383,GB +3589904384,3589906431,KZ +3589906432,3589931007,GB 3589931008,3589947391,SI 3589947392,3589963775,FI 3589963776,3589980159,ES @@ -140112,7 +141473,9 @@ 3589999032,3589999039,DE 3589999040,3590000191,GB 3590000192,3590000207,DE -3590000208,3590005055,GB +3590000208,3590001967,GB +3590001968,3590001983,IT +3590001984,3590005055,GB 3590005056,3590005071,DE 3590005072,3590005119,GB 3590005120,3590005135,IT @@ -140214,8 +141577,8 @@ 3624257536,3624271871,US 3624271872,3624272383,SY 3624272384,3624272447,US -3624272448,3624272451,CA -3624272452,3624272639,US +3624272448,3624272455,CA +3624272456,3624272639,US 3624272640,3624272895,DZ 3624272896,3624281087,US 3624281088,3624281343,HT @@ -140284,11 +141647,17 @@ 3624480768,3624484863,CA 3624484864,3624525823,US 3624529920,3624534015,CA -3624534016,3624587263,US +3624534016,3624536063,US +3624536064,3624538111,IL +3624538112,3624540671,US +3624540672,3624541183,GB +3624541184,3624587263,US 3624587264,3624591359,JM 3624591360,3624592383,US 3624592384,3624593919,CA -3624593920,3624714239,US +3624593920,3624595455,US +3624595456,3624599551,IN +3624599552,3624714239,US 3624714240,3624722431,SG 3624722432,3624730623,US 3624730624,3624796159,CA @@ -140318,16 +141687,14 @@ 3625295872,3625346047,US 3625346048,3625346303,AR 3625346304,3625418751,US -3625418752,3625420031,CA -3625420032,3625420543,US -3625420544,3625422591,CA -3625422592,3625422847,US -3625422848,3625426943,CA +3625418752,3625426943,CA 3625426944,3625508863,US 3625508864,3625512959,CA 3625512960,3625631743,US 3625631744,3625639935,CA -3625639936,3626091519,US +3625639936,3625959423,US +3625959424,3625963519,GB +3625963520,3626091519,US 3626091520,3626092031,AR 3626092032,3626234111,US 3626234112,3626234367,GB @@ -140350,7 +141717,9 @@ 3626926080,3626934271,CA 3626934272,3627044863,US 3627044864,3627048959,CA -3627053056,3627065343,US +3627048960,3627049983,AG +3627049984,3627050495,US +3627051008,3627065343,US 3627065344,3627069439,CA 3627069440,3627220223,US 3627220224,3627220479,CA @@ -140454,7 +141823,12 @@ 3628657920,3628658175,BS 3628658176,3628679167,US 3628679168,3628683263,CA -3628683264,3628834815,US +3628683264,3628744703,US +3628744704,3628746751,IL +3628746752,3628747775,US +3628747776,3628748287,LU +3628748288,3628748799,AU +3628748800,3628834815,US 3628834816,3628843007,CA 3628843008,3628848639,US 3628848896,3629187071,US @@ -140472,8 +141846,8 @@ 3629201936,3629201939,US 3629201940,3629202103,CA 3629202104,3629202107,US -3629202108,3629203199,CA -3629203200,3629318143,US +3629202108,3629203455,CA +3629203456,3629318143,US 3629318144,3629326335,CA 3629326336,3629539327,US 3629539328,3629547519,CA @@ -140582,9 +141956,9 @@ 3630102784,3630103807,CA 3630103808,3630104063,US 3630104064,3630104575,CA -3630104576,3630141951,US -3630141952,3630142207,CA -3630142208,3630148095,US +3630104576,3630137343,US +3630137344,3630145535,CA +3630145536,3630148095,US 3630148096,3630148607,CA 3630148608,3630148863,US 3630148864,3630149119,CA @@ -140592,11 +141966,9 @@ 3630151680,3630152191,CA 3630152192,3630152703,US 3630152704,3630152959,CA -3630152960,3630156287,US -3630156288,3630156543,CA -3630156544,3630157311,US -3630157312,3630157567,CA -3630157568,3630159615,US +3630152960,3630153727,US +3630153728,3630157823,CA +3630157824,3630159615,US 3630159616,3630159871,CA 3630159872,3630160127,US 3630160128,3630160383,CA @@ -140612,7 +141984,7 @@ 3630165504,3630166015,CA 3630166016,3630169855,US 3630169856,3630170111,CA -3630170112,3630309375,US +3630170112,3630313471,US 3630313472,3630317567,CA 3630317568,3630375423,US 3630375424,3630383103,CA @@ -140637,14 +142009,11 @@ 3630850048,3630854143,CA 3630854144,3630866431,US 3630866432,3630870527,GT -3630870528,3630895103,US -3630895104,3630895104,GB -3630895105,3630895615,US +3630870528,3630895615,US 3630895616,3630895871,CA 3630895872,3630897407,US 3630897408,3630897408,GB -3630897409,3630897663,CA -3630897664,3630900735,US +3630897409,3630900735,US 3630900736,3630900991,CA 3630900992,3630905599,US 3630905600,3630905855,CA @@ -140725,7 +142094,7 @@ 3632881664,3632889855,CA 3632889856,3632898047,US 3632898048,3632902143,CA -3632906240,3632971775,US +3632902144,3632971775,US 3632971776,3632988159,CA 3632988160,3633029119,US 3633029120,3633029631,PY @@ -140779,9 +142148,7 @@ 3633885184,3633889279,US 3633889280,3633893375,CA 3633893376,3633971199,US -3633971200,3633974527,CA -3633974528,3633974783,US -3633974784,3634020351,CA +3633971200,3634020351,CA 3634020352,3634037247,US 3634037248,3634037759,CA 3634037760,3634040063,US @@ -140813,14 +142180,14 @@ 3634749440,3634880511,US 3634880512,3634888703,CA 3634888704,3634913279,US -3634913280,3634914815,CA -3634914816,3634915071,US -3634915072,3634915663,CA +3634913280,3634915663,CA 3634915664,3634915679,US 3634915680,3634921471,CA 3634921472,3634925567,US 3634925568,3634929663,CA -3634929664,3635044351,US +3634929664,3635015935,US +3635015936,3635016191,CA +3635016192,3635044351,US 3635048448,3635051103,US 3635051104,3635051119,CA 3635051120,3635051439,US @@ -140831,10 +142198,10 @@ 3635142656,3635146751,CA 3635146752,3635159039,US 3635159040,3635163135,CA -3635163136,3635167487,US +3635163136,3635167231,US +3635167232,3635167487,NL 3635167488,3635167743,ES -3635167744,3635167999,IT -3635168000,3635171071,US +3635167744,3635171071,NL 3635171072,3635171327,CA 3635171328,3635187967,US 3635187968,3635188223,CN @@ -141006,7 +142373,9 @@ 3637665792,3637669887,CA 3637669888,3637706751,US 3637706752,3637739519,CA -3637739520,3638165503,US +3637739520,3637821439,US +3637821440,3637829631,CA +3637829632,3638165503,US 3638165504,3638181887,CA 3638181888,3638214399,US 3638214400,3638214655,GR @@ -141026,7 +142395,11 @@ 3638399744,3638399999,CH 3638400000,3638401087,US 3638401088,3638401119,CA -3638401120,3638500125,US +3638401120,3638401151,US +3638401152,3638401423,CA +3638401424,3638401443,US +3638401444,3638403071,CA +3638403072,3638500125,US 3638500126,3638500126,CA 3638500127,3638509567,US 3638509568,3638534143,CA @@ -141034,7 +142407,9 @@ 3638697984,3638706175,CA 3638706176,3638874111,US 3638874112,3638878207,CA -3638878208,3638898943,US +3638878208,3638880511,US +3638880512,3638880767,CA +3638880768,3638898943,US 3638898944,3638899455,MX 3638899456,3638984703,US 3638984704,3638992895,GT @@ -141126,9 +142501,7 @@ 3639593984,3639595007,GB 3639595008,3639607295,US 3639607296,3639611391,CA -3639611392,3639656447,US -3639656448,3639660543,CA -3639660544,3639664639,US +3639611392,3639664639,US 3639664640,3639668735,CA 3639668736,3639672831,US 3639672832,3639681023,CL @@ -141139,6 +142512,7 @@ 3639692288,3639704573,US 3639704574,3639704574,GB 3639704575,3639730175,US +3639730176,3639734271,CA 3639734272,3639736575,US 3639736576,3639736831,HK 3639736832,3639737343,US @@ -141147,7 +142521,98 @@ 3639737375,3639737599,GB 3639737600,3639737629,US 3639737630,3639737630,GB -3639737631,3639902207,US +3639737631,3639887815,US +3639887816,3639887831,CA +3639887832,3639888351,US +3639888352,3639888359,CA +3639888360,3639888687,US +3639888688,3639888695,CA +3639888696,3639888719,US +3639888720,3639888727,CA +3639888728,3639888767,US +3639888768,3639888775,CA +3639888776,3639888967,US +3639888968,3639888975,CA +3639888976,3639889047,US +3639889048,3639889055,CA +3639889056,3639889063,US +3639889064,3639889071,CA +3639889072,3639889471,US +3639889472,3639889479,CA +3639889480,3639889487,US +3639889488,3639889495,CA +3639889496,3639889647,US +3639889648,3639889655,CA +3639889656,3639889767,US +3639889768,3639889775,CA +3639889776,3639889783,US +3639889784,3639889791,CA +3639889792,3639889815,US +3639889816,3639889823,CA +3639889824,3639889943,US +3639889944,3639889951,CA +3639889952,3639889991,US +3639889992,3639889999,CA +3639890000,3639890055,US +3639890056,3639890063,CA +3639890064,3639890079,US +3639890080,3639890095,CA +3639890096,3639890135,US +3639890136,3639890143,CA +3639890144,3639890239,US +3639890240,3639890247,CA +3639890248,3639890263,US +3639890264,3639890271,CA +3639890272,3639890311,US +3639890312,3639890327,CA +3639890328,3639890399,US +3639890400,3639890415,CA +3639890416,3639890447,US +3639890448,3639890455,CA +3639890456,3639890535,US +3639890536,3639890559,CA +3639890560,3639890607,US +3639890608,3639890623,CA +3639890624,3639890799,US +3639890800,3639890815,CA +3639890816,3639890863,US +3639890864,3639890871,CA +3639890872,3639890887,US +3639890888,3639890903,CA +3639890904,3639890919,US +3639890920,3639890935,CA +3639890936,3639891063,US +3639891064,3639891071,CA +3639891072,3639891127,US +3639891128,3639891135,CA +3639891136,3639891143,US +3639891144,3639891151,CA +3639891152,3639891159,US +3639891160,3639891167,CA +3639891168,3639891359,US +3639891360,3639891367,CA +3639891368,3639891447,US +3639891448,3639891455,CA +3639891456,3639891567,US +3639891568,3639891575,CA +3639891576,3639891623,US +3639891624,3639891639,CA +3639891640,3639891767,US +3639891768,3639891775,CA +3639891776,3639891799,US +3639891800,3639891807,CA +3639891808,3639891847,US +3639891848,3639891855,CA +3639891856,3639891911,US +3639891912,3639891919,CA +3639891920,3639893471,US +3639893472,3639893487,CA +3639893488,3639893495,US +3639893496,3639893503,CA +3639893504,3639893759,ID +3639893760,3639893855,US +3639893856,3639893863,CA +3639893864,3639902207,US 3639902208,3639918591,PE 3639918592,3639934975,AR 3639934976,3640023079,US @@ -141159,9 +142624,12 @@ 3640201216,3640205311,US 3640205312,3640209407,BM 3640209408,3640213503,CA -3640213504,3640288255,US +3640213504,3640287231,US +3640287232,3640287743,HK +3640287744,3640288255,US 3640288256,3640289279,PH -3640289280,3640291327,HK +3640289280,3640290303,HK +3640290304,3640291327,CN 3640291328,3640312319,US 3640312320,3640312575,NI 3640312576,3640312831,US @@ -141355,7 +142823,9 @@ 3641888768,3641892863,IT 3641892864,3641896959,ES 3641896960,3641901055,BG -3641901056,3641905151,RO +3641901056,3641901311,RO +3641901312,3641901567,US +3641901568,3641905151,RO 3641905152,3641909247,NL 3641909248,3641913343,AT 3641913344,3641917439,FR @@ -141408,19 +142878,15 @@ 3642032128,3642036223,PS 3642036224,3642040319,HU 3642040320,3642048511,BY -3642048512,3642048767,IL +3642048512,3642048767,US 3642048768,3642049023,DE 3642049024,3642049279,CH 3642049280,3642049535,NO -3642049536,3642050047,GB -3642050048,3642050303,FR -3642050304,3642050559,GB -3642050560,3642050815,ES -3642050816,3642051071,IT -3642051072,3642051327,CA -3642051328,3642051583,JP +3642049536,3642051327,GB +3642051328,3642051583,US 3642051584,3642051839,TR -3642051840,3642056703,GB +3642051840,3642054399,DE +3642054400,3642056703,US 3642056704,3642060799,RU 3642060800,3642064895,KE 3642064896,3642068991,IT @@ -141453,7 +142919,7 @@ 3642118144,3642122239,GB 3642122240,3642126335,ES 3642126336,3642130431,IL -3642130432,3642134527,DE +3642130432,3642134527,CH 3642134528,3642138623,GB 3642138624,3642142719,RU 3642142720,3642146815,MT @@ -141564,10 +143030,10 @@ 3642535936,3642540031,IS 3642540032,3642544127,SE 3642544128,3642552319,RU -3642552320,3642553855,UA -3642553856,3642553936,RU -3642553937,3642553937,US -3642553938,3642554367,RU +3642552320,3642553343,UA +3642553344,3642553599,RU +3642553600,3642553855,UA +3642553856,3642554367,RU 3642554368,3642554623,LT 3642554624,3642554720,UA 3642554721,3642554721,LV @@ -142222,9 +143688,7 @@ 3645764052,3645764052,FR 3645764053,3645764055,DE 3645764056,3645764056,BE -3645764057,3645764057,DE -3645764058,3645764058,TR -3645764059,3645764059,DE +3645764057,3645764059,DE 3645764060,3645764060,FR 3645764061,3645764061,IT 3645764062,3645764062,SE @@ -142837,7 +144301,9 @@ 3647994880,3647995391,BE 3647995392,3647995903,DE 3647995904,3648004095,RU -3648004096,3648007167,GB +3648004096,3648004837,GB +3648004838,3648004838,RU +3648004839,3648007167,GB 3648007168,3648007679,US 3648007680,3648007935,RU 3648007936,3648008191,GB @@ -142979,7 +144445,9 @@ 3648512000,3648516095,NL 3648516096,3648519167,RS 3648519168,3648520191,MK -3648520192,3648747227,NL +3648520192,3648745820,NL +3648745821,3648745821,US +3648745822,3648747227,NL 3648747228,3648747228,US 3648747229,3648747229,NL 3648747230,3648747230,US @@ -143202,8 +144670,8 @@ 3650921391,3650922799,GB 3650922800,3650922815,FR 3650922816,3650926591,GB -3650926592,3650929663,ES -3650929664,3650929831,GB +3650926592,3650928639,ES +3650928640,3650929831,GB 3650929832,3650929839,DK 3650929840,3650929847,BE 3650929848,3650929855,FR @@ -143342,8 +144810,7 @@ 3651944448,3651948543,ES 3651948544,3651952639,FO 3651952640,3651954175,AE -3651954176,3651958783,IR -3651958784,3651960831,AE +3651954176,3651960831,IR 3651960832,3651964927,GB 3651964928,3651969023,SK 3651969024,3651977215,DE @@ -143392,7 +144859,93 @@ 3652173824,3652177919,AT 3652177920,3652182015,CY 3652182016,3652190207,DE -3652190208,3652648959,GB +3652190208,3652583423,GB +3652583424,3652583487,FR +3652583488,3652583503,NL +3652583504,3652583551,FR +3652583552,3652583583,FI +3652583584,3652584447,FR +3652584448,3652584575,GB +3652584576,3652584639,IE +3652584640,3652584895,FR +3652584896,3652584927,PT +3652584928,3652584959,FR +3652584960,3652585023,ES +3652585024,3652585087,FR +3652585088,3652585151,ES +3652585152,3652585791,FR +3652585792,3652585823,FI +3652585824,3652585983,FR +3652585984,3652586047,ES +3652586048,3652590783,FR +3652590784,3652590847,ES +3652590848,3652591615,FR +3652591616,3652591743,GB +3652591744,3652593023,FR +3652593024,3652593055,PT +3652593056,3652593215,FR +3652593216,3652593279,IE +3652593280,3652593407,FR +3652593408,3652593471,ES +3652593472,3652593631,FR +3652593632,3652593663,PT +3652593664,3652596479,FR +3652596480,3652596543,ES +3652596544,3652597887,FR +3652597888,3652597903,GB +3652597904,3652609023,FR +3652609024,3652609279,GB +3652609280,3652609503,FR +3652609504,3652609535,FI +3652609536,3652609919,FR +3652609920,3652609983,ES +3652609984,3652611231,FR +3652611232,3652611263,PT +3652611264,3652611679,FR +3652611680,3652611711,PT +3652611712,3652612223,FR +3652612224,3652612287,ES +3652612288,3652612351,FR +3652612352,3652612479,GB +3652612480,3652612543,IE +3652612544,3652613375,FR +3652613376,3652613407,FI +3652613408,3652620671,FR +3652620672,3652620735,PT +3652620736,3652620799,FR +3652620800,3652620831,PT +3652620832,3652621375,FR +3652621376,3652621439,ES +3652621440,3652622271,FR +3652622272,3652622335,GB +3652622336,3652631807,FR +3652631808,3652631823,GB +3652631824,3652638655,FR +3652638656,3652638719,ES +3652638720,3652638815,FR +3652638816,3652638847,FI +3652638848,3652638975,GB +3652638976,3652640575,FR +3652640576,3652640703,GB +3652640704,3652640767,FR +3652640768,3652640831,ES +3652640832,3652641727,FR +3652641728,3652641791,GB +3652641792,3652642111,FR +3652642112,3652642175,IE +3652642176,3652642367,FR +3652642368,3652642431,GB +3652642432,3652642719,FR +3652642720,3652642751,PT +3652642752,3652643583,FR +3652643584,3652643647,ES +3652643648,3652644199,FR +3652644200,3652644215,ES +3652644216,3652644247,FR +3652644248,3652644255,ES +3652644256,3652644351,FR +3652644352,3652644383,FI +3652644384,3652648959,FR 3652648960,3652714495,IE 3652714496,3653238783,DE 3653238784,3653369855,CH diff --git a/src/config/geoip6 b/src/config/geoip6 index 70c6f965c6..296429c03a 100644 --- a/src/config/geoip6 +++ b/src/config/geoip6 @@ -1,4 +1,4 @@ -# Last updated based on February 8 2017 Maxmind GeoLite2 Country +# Last updated based on April 4 2017 Maxmind GeoLite2 Country # wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz # gunzip GeoLite2-Country.mmdb.gz # python mmdb-convert.py GeoLite2-Country.mmdb @@ -179,13 +179,17 @@ 2001:470:1f15:b4::,2001:470:1f15:b4:ffff:ffff:ffff:ffff,NL 2001:470:1f15:b5::,2001:470:1f15:44f:ffff:ffff:ffff:ffff,RU 2001:470:1f15:450::,2001:470:1f15:450:ffff:ffff:ffff:ffff,NL -2001:470:1f15:451::,2001:470:1f15:5ab:ffff:ffff:ffff:ffff,RU +2001:470:1f15:451::,2001:470:1f15:582:ffff:ffff:ffff:ffff,RU +2001:470:1f15:583::,2001:470:1f15:583:ffff:ffff:ffff:ffff,NL +2001:470:1f15:584::,2001:470:1f15:5ab:ffff:ffff:ffff:ffff,RU 2001:470:1f15:5ac::,2001:470:1f15:5ac:ffff:ffff:ffff:ffff,NL 2001:470:1f15:5ad::,2001:470:1f15:9c5:ffff:ffff:ffff:ffff,RU 2001:470:1f15:9c6::,2001:470:1f15:9c6:ffff:ffff:ffff:ffff,AT 2001:470:1f15:9c7::,2001:470:1f15:a5e:ffff:ffff:ffff:ffff,RU 2001:470:1f15:a5f::,2001:470:1f15:a60:ffff:ffff:ffff:ffff,NL -2001:470:1f15:a61::,2001:470:1f15:110b:ffff:ffff:ffff:ffff,RU +2001:470:1f15:a61::,2001:470:1f15:10db:ffff:ffff:ffff:ffff,RU +2001:470:1f15:10dc::,2001:470:1f15:10dc:ffff:ffff:ffff:ffff,NL +2001:470:1f15:10dd::,2001:470:1f15:110b:ffff:ffff:ffff:ffff,RU 2001:470:1f15:110c::,2001:470:1f15:110c:ffff:ffff:ffff:ffff,BE 2001:470:1f15:110d::,2001:470:1f15:7fff:ffff:ffff:ffff:ffff,RU 2001:470:1f15:8000::,2001:470:1f1c:ffff:ffff:ffff:ffff:ffff,US @@ -252,7 +256,9 @@ 2001:470:785a::,2001:470:785a:ffff:ffff:ffff:ffff:ffff,AT 2001:470:785b::,2001:470:7a99:ffff:ffff:ffff:ffff:ffff,US 2001:470:7a9a::,2001:470:7a9a:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7a9b::,2001:470:7ba6:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a9b::,2001:470:7ad5:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ad6::,2001:470:7ad6:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7ad7::,2001:470:7ba6:ffff:ffff:ffff:ffff:ffff,US 2001:470:7ba7::,2001:470:7ba7:7fff:ffff:ffff:ffff:ffff,NL 2001:470:7ba7:8000::,2001:470:7baf:ffff:ffff:ffff:ffff:ffff,US 2001:470:7bb0::,2001:470:7bb0:7fff:ffff:ffff:ffff:ffff,BE @@ -260,7 +266,9 @@ 2001:470:7bc0::,2001:470:7bc0:ffff:ffff:ffff:ffff:ffff,NL 2001:470:7bc1::,2001:470:7e38:ffff:ffff:ffff:ffff:ffff,US 2001:470:7e39::,2001:470:7e39:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7e39:8000::,2001:470:8091:ffff:ffff:ffff:ffff:ffff,US +2001:470:7e39:8000::,2001:470:7ea5:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ea6::,2001:470:7ea6:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7ea7::,2001:470:8091:ffff:ffff:ffff:ffff:ffff,US 2001:470:8092::,2001:470:8092:7fff:ffff:ffff:ffff:ffff,CN 2001:470:8092:8000::,2001:470:80b6:ffff:ffff:ffff:ffff:ffff,US 2001:470:80b7::,2001:470:80b7:7fff:ffff:ffff:ffff:ffff,CN @@ -294,7 +302,9 @@ 2001:470:cd93:8000::,2001:470:cd93:ffff:ffff:ffff:ffff:ffff,FR 2001:470:cd94::,2001:470:d6b8:ffff:ffff:ffff:ffff:ffff,US 2001:470:d6b9::,2001:470:d6b9:7fff:ffff:ffff:ffff:ffff,RU -2001:470:d6b9:8000::,2001:470:da01:ffff:ffff:ffff:ffff:ffff,US +2001:470:d6b9:8000::,2001:470:d6ee:ffff:ffff:ffff:ffff:ffff,US +2001:470:d6ef::,2001:470:d6ef:ffff:ffff:ffff:ffff:ffff,FR +2001:470:d6f0::,2001:470:da01:ffff:ffff:ffff:ffff:ffff,US 2001:470:da02::,2001:470:da02:7fff:ffff:ffff:ffff:ffff,AR 2001:470:da02:8000::,2001:470:dc5c:ffff:ffff:ffff:ffff:ffff,US 2001:470:dc5d::,2001:470:dc5d:7fff:ffff:ffff:ffff:ffff,SE @@ -459,6 +469,7 @@ 2001:504:60::,2001:504:62:ffff:ffff:ffff:ffff:ffff,US 2001:504:63::,2001:504:63:ffff:ffff:ffff:ffff:ffff,DM 2001:504:64::,2001:504:68:ffff:ffff:ffff:ffff:ffff,US +2001:504:69::,2001:504:69:ffff:ffff:ffff:ffff:ffff,CA 2001:506::,2001:506:1:ffff:ffff:ffff:ffff:ffff,US 2001:506:8::,2001:506:8:ffff:ffff:ffff:ffff:ffff,US 2001:506:20::,2001:506:20:ffff:ffff:ffff:ffff:ffff,CA @@ -491,7 +502,9 @@ 2001:580::,2001:580:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:590::,2001:590:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:598::,2001:598:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:5a0::,2001:5a0:36ff:ffff:ffff:ffff:ffff:ffff,US +2001:5a0::,2001:5a0:3600:ffff:ffff:ffff:ffff:ffff,US +2001:5a0:3601::,2001:5a0:3601:ffff:ffff:ffff:ffff:ffff,CA +2001:5a0:3602::,2001:5a0:36ff:ffff:ffff:ffff:ffff:ffff,US 2001:5a0:3700::,2001:5a0:3700:ff:ffff:ffff:ffff:ffff,CA 2001:5a0:3700:100::,2001:5a0:3700:ffff:ffff:ffff:ffff:ffff,US 2001:5a0:3701::,2001:5a0:3701:ffff:ffff:ffff:ffff:ffff,CA @@ -573,6 +586,7 @@ 2001:678:9c::,2001:678:9c:ffff:ffff:ffff:ffff:ffff,SK 2001:678:a0::,2001:678:a0:ffff:ffff:ffff:ffff:ffff,FI 2001:678:a4::,2001:678:a4:ffff:ffff:ffff:ffff:ffff,AT +2001:678:a8::,2001:678:a8:ffff:ffff:ffff:ffff:ffff,DE 2001:678:ac::,2001:678:ac:ffff:ffff:ffff:ffff:ffff,SE 2001:678:b0::,2001:678:b3:ffff:ffff:ffff:ffff:ffff,IR 2001:678:c0::,2001:678:c0:ffff:ffff:ffff:ffff:ffff,DE @@ -750,6 +764,34 @@ 2001:678:384::,2001:678:384:ffff:ffff:ffff:ffff:ffff,RU 2001:678:388::,2001:678:388:ffff:ffff:ffff:ffff:ffff,PL 2001:678:38c::,2001:678:38c:ffff:ffff:ffff:ffff:ffff,PL +2001:678:390::,2001:678:390:ffff:ffff:ffff:ffff:ffff,NL +2001:678:394::,2001:678:394:ffff:ffff:ffff:ffff:ffff,SE +2001:678:398::,2001:678:398:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:39c::,2001:678:39c:ffff:ffff:ffff:ffff:ffff,SA +2001:678:3a0::,2001:678:3a0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3a4::,2001:678:3a4:ffff:ffff:ffff:ffff:ffff,SE +2001:678:3a8::,2001:678:3a8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3ac::,2001:678:3ac:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3b0::,2001:678:3b0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3b4::,2001:678:3b4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3b8::,2001:678:3b8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3bc::,2001:678:3bc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:3c0::,2001:678:3c0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3c4::,2001:678:3c4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3c8::,2001:678:3c8:ffff:ffff:ffff:ffff:ffff,GR +2001:678:3cc::,2001:678:3cc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:3d0::,2001:678:3d0:ffff:ffff:ffff:ffff:ffff,RU +2001:678:3d4::,2001:678:3d4:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3d8::,2001:678:3d8:ffff:ffff:ffff:ffff:ffff,GB +2001:678:3dc::,2001:678:3dc:ffff:ffff:ffff:ffff:ffff,AT +2001:678:3e0::,2001:678:3e0:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3e4::,2001:678:3e4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3e8::,2001:678:3e8:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3ec::,2001:678:3ec:ffff:ffff:ffff:ffff:ffff,SE +2001:678:3f0::,2001:678:3f0:ffff:ffff:ffff:ffff:ffff,NO +2001:678:3f4::,2001:678:3f4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3f8::,2001:678:3f8:ffff:ffff:ffff:ffff:ffff,UA +2001:678:3fc::,2001:678:3fc:ffff:ffff:ffff:ffff:ffff,FR 2001:67c::,2001:67c::ffff:ffff:ffff:ffff:ffff,IE 2001:67c:4::,2001:67c:4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:8::,2001:67c:8:ffff:ffff:ffff:ffff:ffff,CH @@ -814,7 +856,6 @@ 2001:67c:fc::,2001:67c:fc:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:100::,2001:67c:100:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:104::,2001:67c:104:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:108::,2001:67c:108:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:10c::,2001:67c:10c:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:110::,2001:67c:110:ffff:ffff:ffff:ffff:ffff,FI 2001:67c:114::,2001:67c:114:ffff:ffff:ffff:ffff:ffff,NL @@ -990,6 +1031,7 @@ 2001:67c:3b8::,2001:67c:3b8:ffff:ffff:ffff:ffff:ffff,IE 2001:67c:3bc::,2001:67c:3bc:ffff:ffff:ffff:ffff:ffff,DK 2001:67c:3c0::,2001:67c:3c0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:3c4::,2001:67c:3c4:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:3c8::,2001:67c:3c8:ffff:ffff:ffff:ffff:ffff,EE 2001:67c:3cc::,2001:67c:3cc:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:3d0::,2001:67c:3d0:ffff:ffff:ffff:ffff:ffff,NL @@ -1022,9 +1064,10 @@ 2001:67c:440::,2001:67c:440:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:444::,2001:67c:444:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:448::,2001:67c:448:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:44c::,2001:67c:44c:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:450::,2001:67c:450:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:454::,2001:67c:454:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:45c::,2001:67c:45c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:460::,2001:67c:460:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:464::,2001:67c:464:ffff:ffff:ffff:ffff:ffff,TR @@ -1100,7 +1143,6 @@ 2001:67c:584::,2001:67c:584:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:588::,2001:67c:588:ffff:ffff:ffff:ffff:ffff,RO 2001:67c:58c::,2001:67c:58c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:590::,2001:67c:590:ffff:ffff:ffff:ffff:ffff,NO 2001:67c:594::,2001:67c:594:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:598::,2001:67c:598:ffff:ffff:ffff:ffff:ffff,NO 2001:67c:59c::,2001:67c:59c:ffff:ffff:ffff:ffff:ffff,HU @@ -1179,6 +1221,7 @@ 2001:67c:6c4::,2001:67c:6c4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6c8::,2001:67c:6c8:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:6cc::,2001:67c:6cc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6d0::,2001:67c:6d0:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6d4::,2001:67c:6d4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6d8::,2001:67c:6d8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6dc::,2001:67c:6dc:ffff:ffff:ffff:ffff:ffff,RU @@ -1192,6 +1235,7 @@ 2001:67c:6fc::,2001:67c:6fc:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:700::,2001:67c:700:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:704::,2001:67c:704:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:708::,2001:67c:708:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:70c::,2001:67c:70c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:710::,2001:67c:710:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:714::,2001:67c:714:ffff:ffff:ffff:ffff:ffff,NO @@ -1231,7 +1275,6 @@ 2001:67c:7a0::,2001:67c:7a0:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:7a4::,2001:67c:7a4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:7a8::,2001:67c:7a8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:7ac::,2001:67c:7ac:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:7b0::,2001:67c:7b0:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:7b4::,2001:67c:7b4:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:7b8::,2001:67c:7b8:ffff:ffff:ffff:ffff:ffff,SE @@ -1359,7 +1402,6 @@ 2001:67c:11dc::,2001:67c:11dc:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:11e0::,2001:67c:11e0:ffff:ffff:ffff:ffff:ffff,BG 2001:67c:11e4::,2001:67c:11e4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:11e8::,2001:67c:11e8:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:11ec::,2001:67c:11ec:ffff:ffff:ffff:ffff:ffff,TR 2001:67c:11f0::,2001:67c:11f0:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:11f4::,2001:67c:11f4:ffff:ffff:ffff:ffff:ffff,AT @@ -1407,6 +1449,7 @@ 2001:67c:12d4::,2001:67c:12d4:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:12d8::,2001:67c:12d8:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:12dc::,2001:67c:12dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12e0::,2001:67c:12e0:ffff:ffff:ffff:ffff:ffff,KG 2001:67c:12e4::,2001:67c:12e4:ffff:ffff:ffff:ffff:ffff,SA 2001:67c:12e8::,2001:67c:12e9:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:12f0::,2001:67c:12f0:ffff:ffff:ffff:ffff:ffff,DE @@ -1635,6 +1678,7 @@ 2001:67c:1780::,2001:67c:1780:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:1784::,2001:67c:1784:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:1788::,2001:67c:1788:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:178c::,2001:67c:178c:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:1790::,2001:67c:1790:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1794::,2001:67c:1794:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:1798::,2001:67c:1798:ffff:ffff:ffff:ffff:ffff,CZ @@ -1680,7 +1724,6 @@ 2001:67c:183c::,2001:67c:183c:ffff:ffff:ffff:ffff:ffff,BE 2001:67c:1840::,2001:67c:1840:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1844::,2001:67c:1844:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1848::,2001:67c:1848:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:184c::,2001:67c:184c:ffff:ffff:ffff:ffff:ffff,FR 2001:67c:1850::,2001:67c:1850:ffff:ffff:ffff:ffff:ffff,FI 2001:67c:1854::,2001:67c:1854:ffff:ffff:ffff:ffff:ffff,RO @@ -1858,6 +1901,7 @@ 2001:67c:203c::,2001:67c:203c:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2040::,2001:67c:2040:ffff:ffff:ffff:ffff:ffff,AE 2001:67c:2044::,2001:67c:2044:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2048::,2001:67c:2048:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:204c::,2001:67c:204c:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:2050::,2001:67c:2050:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2054::,2001:67c:2054:ffff:ffff:ffff:ffff:ffff,DE @@ -1904,6 +1948,7 @@ 2001:67c:2104::,2001:67c:2104:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2108::,2001:67c:2108:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:210c::,2001:67c:210c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2110::,2001:67c:2110:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2114::,2001:67c:2114:ffff:ffff:ffff:ffff:ffff,IS 2001:67c:2118::,2001:67c:2118:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:211c::,2001:67c:211c:ffff:ffff:ffff:ffff:ffff,AT @@ -1950,6 +1995,7 @@ 2001:67c:21b8::,2001:67c:21b8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:21bc::,2001:67c:21bc:ffff:ffff:ffff:ffff:ffff,BG 2001:67c:21c0::,2001:67c:21c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:21c4::,2001:67c:21c4:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:21c8::,2001:67c:21c8:ffff:ffff:ffff:ffff:ffff,BG 2001:67c:21cc::,2001:67c:21cc:ffff:ffff:ffff:ffff:ffff,ES 2001:67c:21d0::,2001:67c:21d0:ffff:ffff:ffff:ffff:ffff,CZ @@ -2294,7 +2340,6 @@ 2001:67c:276c::,2001:67c:276c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2770::,2001:67c:2770:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2774::,2001:67c:2774:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:2778::,2001:67c:2778:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:277c::,2001:67c:277c:ffff:ffff:ffff:ffff:ffff,DK 2001:67c:2780::,2001:67c:2780:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2784::,2001:67c:2784:ffff:ffff:ffff:ffff:ffff,FI @@ -2386,6 +2431,7 @@ 2001:67c:28e0::,2001:67c:28e0:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:28e4::,2001:67c:28e4:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:28e8::,2001:67c:28e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28ec::,2001:67c:28ec:ffff:ffff:ffff:ffff:ffff,AT 2001:67c:28f0::,2001:67c:28f0:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:28f4::,2001:67c:28f4:ffff:ffff:ffff:ffff:ffff,SI 2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,LT @@ -2487,6 +2533,7 @@ 2001:67c:2b0c::,2001:67c:2b0c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2b10::,2001:67c:2b10:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:2b14::,2001:67c:2b14:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2b18::,2001:67c:2b18:ffff:ffff:ffff:ffff:ffff,FR 2001:67c:2b1c::,2001:67c:2b1c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b20::,2001:67c:2b20:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2b24::,2001:67c:2b24:ffff:ffff:ffff:ffff:ffff,SE @@ -2503,6 +2550,7 @@ 2001:67c:2b50::,2001:67c:2b50:ffff:ffff:ffff:ffff:ffff,AT 2001:67c:2b54::,2001:67c:2b54:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:2b58::,2001:67c:2b58:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b5c::,2001:67c:2b5c:ffff:ffff:ffff:ffff:ffff,SK 2001:67c:2b60::,2001:67c:2b60:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2b64::,2001:67c:2b64:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2b68::,2001:67c:2b68:ffff:ffff:ffff:ffff:ffff,RO @@ -2510,6 +2558,7 @@ 2001:67c:2b70::,2001:67c:2b70:ffff:ffff:ffff:ffff:ffff,DK 2001:67c:2b74::,2001:67c:2b74:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b78::,2001:67c:2b79:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:2b80::,2001:67c:2b80:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b84::,2001:67c:2b84:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b88::,2001:67c:2b88:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2b8c::,2001:67c:2b8c:ffff:ffff:ffff:ffff:ffff,RU @@ -2534,6 +2583,7 @@ 2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2be0::,2001:67c:2be0:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:2be4::,2001:67c:2be4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2be8::,2001:67c:2be8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2bec::,2001:67c:2bec:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:2bf0::,2001:67c:2bf0:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2bf4::,2001:67c:2bf4:ffff:ffff:ffff:ffff:ffff,RU @@ -2656,6 +2706,7 @@ 2001:67c:2df8::,2001:67c:2df8:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2dfc::,2001:67c:2dfc:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2e00::,2001:67c:2e00:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2e04::,2001:67c:2e04:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2e08::,2001:67c:2e08:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2e0c::,2001:67c:2e0c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2e10::,2001:67c:2e10:ffff:ffff:ffff:ffff:ffff,AT @@ -2812,7 +2863,7 @@ 2001:708::,2001:708:ffff:ffff:ffff:ffff:ffff:ffff,FI 2001:710::,2001:710:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:718::,2001:71f:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:720::,2001:720:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:720::,2001:727:ffff:ffff:ffff:ffff:ffff:ffff,ES 2001:728::,2001:728:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:730::,2001:737:ffff:ffff:ffff:ffff:ffff:ffff,AT 2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU @@ -2999,11 +3050,14 @@ 2001:7f8:a7::,2001:7f8:a7:ffff:ffff:ffff:ffff:ffff,RU 2001:7f8:a8::,2001:7f8:a8:ffff:ffff:ffff:ffff:ffff,IR 2001:7f8:a9::,2001:7f8:a9:ffff:ffff:ffff:ffff:ffff,MD +2001:7f8:aa::,2001:7f8:aa:ffff:ffff:ffff:ffff:ffff,SE 2001:7f8:ab::,2001:7f8:ab:ffff:ffff:ffff:ffff:ffff,IT 2001:7f8:ac::,2001:7f8:ac:ffff:ffff:ffff:ffff:ffff,RU 2001:7f8:ad::,2001:7f8:ad:ffff:ffff:ffff:ffff:ffff,SE 2001:7f8:ae::,2001:7f8:ae:ffff:ffff:ffff:ffff:ffff,CZ 2001:7f8:af::,2001:7f8:af:ffff:ffff:ffff:ffff:ffff,FI +2001:7f8:b0::,2001:7f8:b0:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:b1::,2001:7f8:b1:ffff:ffff:ffff:ffff:ffff,FR 2001:7f9:4::,2001:7f9:4:ffff:ffff:ffff:ffff:ffff,AL 2001:7f9:8::,2001:7f9:8:ffff:ffff:ffff:ffff:ffff,AM 2001:7f9:c::,2001:7f9:c:ffff:ffff:ffff:ffff:ffff,PL @@ -3021,7 +3075,6 @@ 2001:7fa:f::,2001:7fa:f:ffff:ffff:ffff:ffff:ffff,ID 2001:7fa:10::,2001:7fa:10:ffff:ffff:ffff:ffff:ffff,CN 2001:7fa:11::,2001:7fa:11:ffff:ffff:ffff:ffff:ffff,AU -2001:7fc::,2001:7fc:1:ffff:ffff:ffff:ffff:ffff,DE 2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:808::,2001:80f:ffff:ffff:ffff:ffff:ffff:ffff,PL 2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -3094,7 +3147,9 @@ 2001:978:2300::,2001:978:2300:7fff:ffff:ffff:ffff:ffff,GB 2001:978:2300:8000::,2001:978:29ff:ffff:ffff:ffff:ffff:ffff,DE 2001:978:2a00::,2001:978:2a00:ffff:ffff:ffff:ffff:ffff,IE -2001:978:2a01::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:2a01::,2001:978:73ff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:7400::,2001:978:7400:ffff:ffff:ffff:ffff:ffff,FI +2001:978:7401::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:980::,2001:987:ffff:ffff:ffff:ffff:ffff:ffff,NL 2001:988::,2001:988:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:990::,2001:990:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -3115,7 +3170,7 @@ 2001:a18::,2001:a1f:ffff:ffff:ffff:ffff:ffff:ffff,LU 2001:a20::,2001:a20:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:a30::,2001:a30:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:a38::,2001:a38:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a38::,2001:a3f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:a40::,2001:a40:ffff:ffff:ffff:ffff:ffff:ffff,PT 2001:a48::,2001:a48:ffff:ffff:ffff:ffff:ffff:ffff,PL 2001:a50::,2001:a50:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -3162,7 +3217,7 @@ 2001:b40::,2001:b40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:b48::,2001:b4f:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:b50::,2001:b50:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:b58::,2001:b58:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:b58::,2001:b5f:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:b60::,2001:b67:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:b68::,2001:b68:ffff:ffff:ffff:ffff:ffff:ffff,HR 2001:b70::,2001:b70:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -3177,7 +3232,7 @@ 2001:bc8::,2001:bc8:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:bd0::,2001:bd0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:be0::,2001:be7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:be8::,2001:be8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:be8::,2001:bef:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:bf0::,2001:bf7:130f:ffff:ffff:ffff:ffff:ffff,DE 2001:bf7:1310::,2001:bf7:1310:7fff:ffff:ffff:ffff:ffff,NL 2001:bf7:1310:8000::,2001:bf7:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -3327,7 +3382,6 @@ 2001:df0:19::,2001:df0:1d:ffff:ffff:ffff:ffff:ffff,VN 2001:df0:1e::,2001:df0:1e:ffff:ffff:ffff:ffff:ffff,TH 2001:df0:1f::,2001:df0:1f:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:20::,2001:df0:3f:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:40::,2001:df0:40:ffff:ffff:ffff:ffff:ffff,VN 2001:df0:42::,2001:df0:42:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:43::,2001:df0:43:ffff:ffff:ffff:ffff:ffff,JP @@ -3511,7 +3565,6 @@ 2001:df0:25e::,2001:df0:25e:ffff:ffff:ffff:ffff:ffff,JP 2001:df0:260::,2001:df0:260:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:261::,2001:df0:261:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:262::,2001:df0:262:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:263::,2001:df0:263:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:264::,2001:df0:264:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:265::,2001:df0:265:ffff:ffff:ffff:ffff:ffff,TH @@ -3549,7 +3602,6 @@ 2001:df0:29f::,2001:df0:29f:ffff:ffff:ffff:ffff:ffff,BD 2001:df0:2a0::,2001:df0:2a0:ffff:ffff:ffff:ffff:ffff,MY 2001:df0:2a1::,2001:df0:2a1:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2a2::,2001:df0:2a2:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:2a3::,2001:df0:2a3:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:2a4::,2001:df0:2a4:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:2a5::,2001:df0:2a5:ffff:ffff:ffff:ffff:ffff,SG @@ -3606,8 +3658,7 @@ 2001:df0:2fc::,2001:df0:2fc:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:2fd::,2001:df0:2fd:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:2fe::,2001:df0:2ff:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:300::,2001:df0:311:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:314::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:300::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG 2001:df0:400::,2001:df0:400:ffff:ffff:ffff:ffff:ffff,SG 2001:df0:401::,2001:df0:401:ffff:ffff:ffff:ffff:ffff,JP 2001:df0:402::,2001:df0:403:ffff:ffff:ffff:ffff:ffff,AU @@ -3710,7 +3761,6 @@ 2001:df0:2800::,2001:df0:2800:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:2900::,2001:df0:2900:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:2a00::,2001:df0:2a00:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:2b00::,2001:df0:2b00:ffff:ffff:ffff:ffff:ffff,BD 2001:df0:2d00::,2001:df0:2d00:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:2e00::,2001:df0:2e00:ffff:ffff:ffff:ffff:ffff,CN 2001:df0:2f00::,2001:df0:2f00:ffff:ffff:ffff:ffff:ffff,IN @@ -3730,58 +3780,115 @@ 2001:df0:3e00::,2001:df0:3e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:3f00::,2001:df0:3f00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:4000::,2001:df0:4000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:4100::,2001:df0:4100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:4200::,2001:df0:4200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4300::,2001:df0:4300:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:4400::,2001:df0:4400:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:4500::,2001:df0:4500:ffff:ffff:ffff:ffff:ffff,CN 2001:df0:4600::,2001:df0:4601:ffff:ffff:ffff:ffff:ffff,US +2001:df0:4700::,2001:df0:4700:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:4800::,2001:df0:4800:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:4a00::,2001:df0:4a00:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:4900::,2001:df0:4900:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:4b00::,2001:df0:4b00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4d00::,2001:df0:4d00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:4e00::,2001:df0:4e00:ffff:ffff:ffff:ffff:ffff,TW +2001:df0:4f00::,2001:df0:4f00:ffff:ffff:ffff:ffff:ffff,MN 2001:df0:5000::,2001:df0:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5100::,2001:df0:5100:ffff:ffff:ffff:ffff:ffff,PK 2001:df0:5200::,2001:df0:5200:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:5600::,2001:df0:5600:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:5300::,2001:df0:5300:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5500::,2001:df0:5500:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5700::,2001:df0:5700:ffff:ffff:ffff:ffff:ffff,NZ 2001:df0:5800::,2001:df0:5800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:5900::,2001:df0:5900:ffff:ffff:ffff:ffff:ffff,NP 2001:df0:5a00::,2001:df0:5a00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:5b00::,2001:df0:5b00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:5c00::,2001:df0:5c00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:5d00::,2001:df0:5d00:ffff:ffff:ffff:ffff:ffff,CN 2001:df0:5e00::,2001:df0:5e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5f00::,2001:df0:5f00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:6000::,2001:df0:6000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:6100::,2001:df0:6100:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:6200::,2001:df0:6200:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:6300::,2001:df0:6300:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:6400::,2001:df0:6400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:6500::,2001:df0:6500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:6600::,2001:df0:6600:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:6700::,2001:df0:6700:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:6800::,2001:df0:6800:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:6900::,2001:df0:6900:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:6a00::,2001:df0:6a00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:6b00::,2001:df0:6b00:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:6d00::,2001:df0:6d00:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:6e00::,2001:df0:6e00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:6f00::,2001:df0:6f00:ffff:ffff:ffff:ffff:ffff,MY 2001:df0:7000::,2001:df0:7000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7100::,2001:df0:7100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:7200::,2001:df0:7200:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7300::,2001:df0:7300:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:7400::,2001:df0:7400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:7500::,2001:df0:7500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:7600::,2001:df0:7600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:7700::,2001:df0:7700:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:7900::,2001:df0:7900:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:7a00::,2001:df0:7a00:ffff:ffff:ffff:ffff:ffff,TL +2001:df0:7b00::,2001:df0:7b00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:7c00::,2001:df0:7c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7d00::,2001:df0:7d00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:7e00::,2001:df0:7e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:7f00::,2001:df0:7f00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:8000::,2001:df0:8000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8100::,2001:df0:8100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:8200::,2001:df0:8200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:8300::,2001:df0:8300:ffff:ffff:ffff:ffff:ffff,PH 2001:df0:8400::,2001:df0:8400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8500::,2001:df0:8500:ffff:ffff:ffff:ffff:ffff,JP 2001:df0:8600::,2001:df0:8600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8700::,2001:df0:8700:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:8800::,2001:df0:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8900::,2001:df0:8900:ffff:ffff:ffff:ffff:ffff,PK 2001:df0:8a00::,2001:df0:8a00:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:8b00::,2001:df0:8b00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:8c00::,2001:df0:8c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:8d00::,2001:df0:8d00:ffff:ffff:ffff:ffff:ffff,MV 2001:df0:8e00::,2001:df0:8e00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:8f00::,2001:df0:8f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9100::,2001:df0:9100:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:9200::,2001:df0:9200:ffff:ffff:ffff:ffff:ffff,MM +2001:df0:9300::,2001:df0:9300:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:9400::,2001:df0:9400:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:9500::,2001:df0:9500:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:9600::,2001:df0:9600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9700::,2001:df0:9700:ffff:ffff:ffff:ffff:ffff,PH 2001:df0:9800::,2001:df0:9800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9900::,2001:df0:9900:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:9a00::,2001:df0:9a00:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:9b00::,2001:df0:9b00:ffff:ffff:ffff:ffff:ffff,VN 2001:df0:9c00::,2001:df0:9c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:9d00::,2001:df0:9d00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:9e00::,2001:df0:9e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9f00::,2001:df0:9f00:ffff:ffff:ffff:ffff:ffff,KH 2001:df0:a000::,2001:df0:a000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a100::,2001:df0:a100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:a200::,2001:df0:a200:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:a300::,2001:df0:a300:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:a500::,2001:df0:a500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:a600::,2001:df0:a600:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a700::,2001:df0:a700:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:a800::,2001:df0:a800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a900::,2001:df0:a900:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:aa00::,2001:df0:aa00:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:ab00::,2001:df0:ab00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:ac00::,2001:df0:ac00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:ad00::,2001:df0:ad00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:ae00::,2001:df0:ae00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:af00::,2001:df0:af00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:b000::,2001:df0:b000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:b100::,2001:df0:b100:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:b200::,2001:df0:b200:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:b300::,2001:df0:b300:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:b400::,2001:df0:b400:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:b500::,2001:df0:b500:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:b600::,2001:df0:b600:ffff:ffff:ffff:ffff:ffff,BD 2001:df0:b800::,2001:df0:b800:ffff:ffff:ffff:ffff:ffff,PH 2001:df0:ba00::,2001:df0:ba00:ffff:ffff:ffff:ffff:ffff,IN @@ -3832,9 +3939,8 @@ 2001:df1:1e00::,2001:df1:1e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:2000::,2001:df1:2000:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:2200::,2001:df1:2200:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2400::,2001:df1:2400:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:2400::,2001:df1:2401:ffff:ffff:ffff:ffff:ffff,PH 2001:df1:2600::,2001:df1:2600:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2800::,2001:df1:2800:ffff:ffff:ffff:ffff:ffff,SG 2001:df1:2a00::,2001:df1:2a00:ffff:ffff:ffff:ffff:ffff,MY 2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:2e00::,2001:df1:2e00:ffff:ffff:ffff:ffff:ffff,IN @@ -3899,7 +4005,6 @@ 2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG 2001:df1:aa00::,2001:df1:aa00:ffff:ffff:ffff:ffff:ffff,ID 2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:ae00::,2001:df1:ae01:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH 2001:df1:b200::,2001:df1:b200:ffff:ffff:ffff:ffff:ffff,HK 2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU @@ -4090,7 +4195,6 @@ 2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID 2001:df3:3a00::,2001:df3:3a00:ffff:ffff:ffff:ffff:ffff,PH 2001:df3:3c00::,2001:df3:3c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:3e00::,2001:df3:3e00:ffff:ffff:ffff:ffff:ffff,SG 2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ 2001:df3:4200::,2001:df3:4200:ffff:ffff:ffff:ffff:ffff,HK 2001:df3:4400::,2001:df3:4400:ffff:ffff:ffff:ffff:ffff,IN @@ -4273,7 +4377,7 @@ 2001:df4:b200::,2001:df4:b200:ffff:ffff:ffff:ffff:ffff,ID 2001:df4:b400::,2001:df4:b400:ffff:ffff:ffff:ffff:ffff,JP 2001:df4:b600::,2001:df4:b600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:ba00::,2001:df4:ba00:ffff:ffff:ffff:ffff:ffff,PH +2001:df4:ba00::,2001:df4:ba01:ffff:ffff:ffff:ffff:ffff,PH 2001:df4:bc00::,2001:df4:bc00:ffff:ffff:ffff:ffff:ffff,IN 2001:df4:be00::,2001:df4:be00:ffff:ffff:ffff:ffff:ffff,SG 2001:df4:c000::,2001:df4:c000:ffff:ffff:ffff:ffff:ffff,ID @@ -4519,7 +4623,6 @@ 2001:df6:b400::,2001:df6:b400:ffff:ffff:ffff:ffff:ffff,MY 2001:df6:b600::,2001:df6:b600:ffff:ffff:ffff:ffff:ffff,AU 2001:df6:b800::,2001:df6:b800:ffff:ffff:ffff:ffff:ffff,SG -2001:df6:ba00::,2001:df6:ba00:ffff:ffff:ffff:ffff:ffff,AU 2001:df6:bc00::,2001:df6:bc00:ffff:ffff:ffff:ffff:ffff,HK 2001:df6:be00::,2001:df6:be00:ffff:ffff:ffff:ffff:ffff,NZ 2001:df6:c200::,2001:df6:c200:ffff:ffff:ffff:ffff:ffff,AU @@ -4596,7 +4699,6 @@ 2001:df7:5400::,2001:df7:5400:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:5600::,2001:df7:5600:ffff:ffff:ffff:ffff:ffff,JP 2001:df7:5a00::,2001:df7:5a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:5c00::,2001:df7:5c00:ffff:ffff:ffff:ffff:ffff,HK 2001:df7:5e00::,2001:df7:5e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:6000::,2001:df7:6000:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:6200::,2001:df7:6200:ffff:ffff:ffff:ffff:ffff,AU @@ -4956,7 +5058,16 @@ 2001:18e8::,2001:18e8:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:18f0::,2001:18f0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2001:18f8::,2001:18f8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:1900::,2001:1900:5:1::1c5,US +2001:1900::,2001:1900:1::53:ff,US +2001:1900:1::53:100,2001:1900:1::53:1ff,SG +2001:1900:1::53:200,2001:1900:1::53:2ff,JP +2001:1900:1::53:300,2001:1900:1::53:80ff,US +2001:1900:1::53:8100,2001:1900:1::53:81ff,SG +2001:1900:1::53:8200,2001:1900:1::53:82ff,JP +2001:1900:1::53:8300,2001:1900:2::53:ff,US +2001:1900:2::53:100,2001:1900:2::53:1ff,GB +2001:1900:2::53:200,2001:1900:2::53:2ff,DE +2001:1900:2::53:300,2001:1900:5:1::1c5,US 2001:1900:5:1::1c6,2001:1900:5:1::1c6,SI 2001:1900:5:1::1c7,2001:1900:5:2:2::93d,US 2001:1900:5:2:2::93e,2001:1900:5:2:2::93e,SI @@ -5009,7 +5120,7 @@ 2001:19f8::,2001:19f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:1a08::,2001:1a08:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:1a10::,2001:1a17:ffff:ffff:ffff:ffff:ffff:ffff,QA -2001:1a18::,2001:1a18:ffff:ffff:ffff:ffff:ffff:ffff,CY +2001:1a18::,2001:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,CY 2001:1a20::,2001:1a20:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:1a28::,2001:1a28:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:1a30::,2001:1a30:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -5310,6 +5421,7 @@ 2001:43f8:a0::,2001:43f8:a0:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:b0::,2001:43f8:b0:ffff:ffff:ffff:ffff:ffff,SL 2001:43f8:c0::,2001:43f8:c1:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:d0::,2001:43f8:d0:ffff:ffff:ffff:ffff:ffff,MU 2001:43f8:e0::,2001:43f8:e0:ffff:ffff:ffff:ffff:ffff,TZ 2001:43f8:100::,2001:43f8:100:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:110::,2001:43f8:110:ffff:ffff:ffff:ffff:ffff,MU @@ -5443,7 +5555,10 @@ 2001:43f8:ca0::,2001:43f8:ca0:ffff:ffff:ffff:ffff:ffff,CI 2001:43f8:cb0::,2001:43f8:cb0:ffff:ffff:ffff:ffff:ffff,KE 2001:43f8:cc0::,2001:43f8:ccf:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:ce0::,2001:43f8:ce0:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:cf0::,2001:43f8:cf1:ffff:ffff:ffff:ffff:ffff,SN 2001:43f8:e00::,2001:43f8:eff:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:a700::,2001:43f8:a700:ffff:ffff:ffff:ffff:ffff,MU 2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN 2001:4410::,2001:4410:ffff:ffff:ffff:ffff:ffff:ffff,NZ @@ -6024,8 +6139,8 @@ 2400:6100::,2400:6100:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:6140::,2400:6140:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:6180::,2400:6180:ff:ffff:ffff:ffff:ffff:ffff,SG -2400:6180:100::,2400:6180:100:7fff:ffff:ffff:ffff:ffff,IN -2400:6180:100:8000::,2400:6180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:6180:100::,2400:6180:1ff:ffff:ffff:ffff:ffff:ffff,IN +2400:6180:200::,2400:6180:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:61c0::,2400:61c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6200::,2400:6200:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6240::,2400:6240:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -6201,7 +6316,7 @@ 2400:89c0::,2400:89c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:8a00::,2400:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:8a40::,2400:8a40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8a80::,2400:8a80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:8a80::,2400:8a81:ffff:ffff:ffff:ffff:ffff:ffff,PH 2400:8ac0::,2400:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:8b00::,2400:8b00:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:8b40::,2400:8b40:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -6280,6 +6395,7 @@ 2400:9f40::,2400:9f40:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:9f80::,2400:9f80:ffff:ffff:ffff:ffff:ffff:ffff,KR 2400:9fc0::,2400:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:a000::,2400:a000:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:a040::,2400:a040:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:a080::,2400:a080:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:a0c0::,2400:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,PK @@ -6304,70 +6420,142 @@ 2400:a680::,2400:a680:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:a6c0::,2400:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:a700::,2400:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a740::,2400:a740:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:a780::,2400:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a7c0::,2400:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:a800::,2400:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:a840::,2400:a840:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:a880::,2400:a880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a8c0::,2400:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:a900::,2400:a900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a940::,2400:a940:ffff:ffff:ffff:ffff:ffff:ffff,PH 2400:a980::,2400:a987:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a9c0::,2400:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:aa00::,2400:aa00:ffff:ffff:ffff:ffff:ffff:ffff,LA +2400:aa40::,2400:aa40:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:aa80::,2400:aa80:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:aac0::,2400:aac0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ab00::,2400:ab00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:ab40::,2400:ab40:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:ab80::,2400:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:abc0::,2400:abc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ac00::,2400:ac00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:ac40::,2400:ac40:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:ac80::,2400:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:acc0::,2400:acc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ad00::,2400:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ad40::,2400:ad40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ad80::,2400:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:adc0::,2400:addf:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:ae00::,2400:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ae40::,2400:ae40:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:ae80::,2400:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:aec0::,2400:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:af40::,2400:af40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:af80::,2400:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:afc0::,2400:afc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b000::,2400:b000:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:b040::,2400:b040:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b080::,2400:b080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b0c0::,2400:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:b100::,2400:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b140::,2400:b140:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b180::,2400:b180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b1c0::,2400:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:b200::,2400:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b240::,2400:b240:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:b2c0::,2400:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:b300::,2400:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b340::,2400:b340:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b380::,2400:b380:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:b3c0::,2400:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:b400::,2400:b400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:b440::,2400:b440:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:b480::,2400:b480:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:b4c0::,2400:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:b500::,2400:b500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b540::,2400:b540:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:b580::,2400:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:b5c0::,2400:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:b600::,2400:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b640::,2400:b640:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:b680::,2400:b680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:b6c0::,2400:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:b700::,2400:b700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b740::,2400:b740:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:b780::,2400:b780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b7c0::,2400:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:b800::,2400:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b840::,2400:b840:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:b880::,2400:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b8c0::,2400:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b940::,2400:b940:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:b980::,2400:b980:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b9c0::,2400:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ba00::,2400:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ba40::,2400:ba41:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ba80::,2400:ba80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:bac0::,2400:bac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:bb00::,2400:bb00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:bb40::,2400:bb40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2400:bbc0::,2400:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:bc00::,2400:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:bc40::,2400:bc40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:bc80::,2400:bc80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:bcc0::,2400:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:bd00::,2400:bd00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:bd40::,2400:bd40:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:bdc0::,2400:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:be00::,2400:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:be40::,2400:be40:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:be80::,2400:be80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:bec0::,2400:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:bf00::,2400:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:bf40::,2400:bf40:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:bf80::,2400:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:bfc0::,2400:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:c000::,2400:c000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:c040::,2400:c040:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:c080::,2400:c080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:c0c0::,2400:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,VU 2400:c100::,2400:c100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c140::,2400:c140:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:c180::,2400:c180:ffff:ffff:ffff:ffff:ffff:ffff,LA +2400:c1c0::,2400:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:c200::,2400:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c240::,2400:c240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c2c0::,2400:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:c300::,2400:c300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c340::,2400:c340:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:c380::,2400:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c3c0::,2400:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:c400::,2400:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:c401::,2400:c401:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:c440::,2400:c440:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:c4c0::,2400:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:c500::,2400:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c540::,2400:c540:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:c580::,2400:c580:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:c5c0::,2400:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:c600::,2400:c600:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:c640::,2400:c640:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:c680::,2400:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c6c0::,2400:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:c700::,2400:c700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:c740::,2400:c740:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:c780::,2400:c780:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:c7c0::,2400:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:c800::,2400:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c840::,2400:c840:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:c880::,2400:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:c8c0::,2400:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:c900::,2400:c900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:c940::,2400:c940:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:c980::,2400:c980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:c9c0::,2400:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ca00::,2400:ca00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ca40::,2400:ca40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cac0::,2400:cac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cb00::,2400:cb00:18:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:19::,2400:cb00:19:ffff:ffff:ffff:ffff:ffff,FR 2400:cb00:1a::,2400:cb00:1f:ffff:ffff:ffff:ffff:ffff,US @@ -6381,8 +6569,7 @@ 2400:cb00:29::,2400:cb00:29:ffff:ffff:ffff:ffff:ffff,CA 2400:cb00:2a::,2400:cb00:30:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:31::,2400:cb00:31:ffff:ffff:ffff:ffff:ffff,CZ -2400:cb00:32::,2400:cb00:32:ffff:ffff:ffff:ffff:ffff,SE -2400:cb00:33::,2400:cb00:33:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:32::,2400:cb00:33:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:34::,2400:cb00:34:ffff:ffff:ffff:ffff:ffff,KR 2400:cb00:35::,2400:cb00:35:ffff:ffff:ffff:ffff:ffff,SG 2400:cb00:36::,2400:cb00:37:ffff:ffff:ffff:ffff:ffff,US @@ -6391,7 +6578,7 @@ 2400:cb00:3a::,2400:cb00:3f:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:40::,2400:cb00:40:ffff:ffff:ffff:ffff:ffff,ES 2400:cb00:41::,2400:cb00:41:ffff:ffff:ffff:ffff:ffff,CO -2400:cb00:42::,2400:cb00:42:ffff:ffff:ffff:ffff:ffff,BR +2400:cb00:42::,2400:cb00:42:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:43::,2400:cb00:43:ffff:ffff:ffff:ffff:ffff,PE 2400:cb00:44::,2400:cb00:44:ffff:ffff:ffff:ffff:ffff,AR 2400:cb00:45::,2400:cb00:45:ffff:ffff:ffff:ffff:ffff,ZA @@ -6443,83 +6630,172 @@ 2400:cb00:89::,2400:cb00:89:ffff:ffff:ffff:ffff:ffff,ES 2400:cb00:8a::,2400:cb00:8f:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:90::,2400:cb00:90:ffff:ffff:ffff:ffff:ffff,PA -2400:cb00:91::,2400:cb00:95:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:91::,2400:cb00:94:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:95::,2400:cb00:95:ffff:ffff:ffff:ffff:ffff,EC 2400:cb00:96::,2400:cb00:96:ffff:ffff:ffff:ffff:ffff,AO 2400:cb00:97::,2400:cb00:97:ffff:ffff:ffff:ffff:ffff,BR -2400:cb00:98::,2400:cb00:103:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:98::,2400:cb00:ff:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:100::,2400:cb00:100:ffff:ffff:ffff:ffff:ffff,DE +2400:cb00:101::,2400:cb00:103:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:104::,2400:cb00:104:ffff:ffff:ffff:ffff:ffff,TH 2400:cb00:105::,2400:cb00:105:ffff:ffff:ffff:ffff:ffff,CW 2400:cb00:106::,2400:cb00:106:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:107::,2400:cb00:107:ffff:ffff:ffff:ffff:ffff,PT -2400:cb00:108::,2400:cb00:113:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:108::,2400:cb00:112:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:113::,2400:cb00:113:ffff:ffff:ffff:ffff:ffff,ZA 2400:cb00:114::,2400:cb00:114:ffff:ffff:ffff:ffff:ffff,AT -2400:cb00:115::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:115::,2400:cb00:116:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:117::,2400:cb00:117:ffff:ffff:ffff:ffff:ffff,AM +2400:cb00:118::,2400:cb00:11f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:120::,2400:cb00:120:ffff:ffff:ffff:ffff:ffff,RS +2400:cb00:121::,2400:cb00:121:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:122::,2400:cb00:122:ffff:ffff:ffff:ffff:ffff,DJ +2400:cb00:123::,2400:cb00:125:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:126::,2400:cb00:126:ffff:ffff:ffff:ffff:ffff,IT +2400:cb00:127::,2400:cb00:127:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:128::,2400:cb00:128:ffff:ffff:ffff:ffff:ffff,SE +2400:cb00:129::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:cb40::,2400:cb40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cb80::,2400:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cbc0::,2400:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cc00::,2400:cc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:cc40::,2400:cc40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cc80::,2400:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ccc0::,2400:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cd00::,2400:cd00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:cd40::,2400:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cd80::,2400:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:cdc0::,2400:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ce00::,2400:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ce40::,2400:ce40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ce80::,2400:ce80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:cec0::,2400:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:cf00::,2400:cf00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:cf40::,2400:cf40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cf80::,2400:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cfc0::,2400:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d000::,2400:d000:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:d040::,2400:d040:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:d0c0::,2400:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d100::,2400:d100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d140::,2400:d140:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d180::,2400:d180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d1c0::,2400:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d200::,2400:d200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d240::,2400:d240:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:d280::,2400:d280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d2c0::,2400:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:d300::,2400:d300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d340::,2400:d340:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:d380::,2400:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d3c0::,2400:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:d400::,2400:d400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d440::,2400:d440:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d480::,2400:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d4c0::,2400:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:d500::,2400:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d540::,2400:d540:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:d580::,2400:d580:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:d5c0::,2400:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:d600::,2400:d600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d640::,2400:d640:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:d680::,2400:d680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:d6c0::,2400:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d700::,2400:d700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:d740::,2400:d740:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d780::,2400:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d7c0::,2400:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:d800::,2400:d803:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:d840::,2400:d840:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:d880::,2400:d880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:d8c0::,2400:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d900::,2400:d900:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:d940::,2400:d940:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d980::,2400:d980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:d9c0::,2400:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:da00::,2400:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:da40::,2400:da40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:da80::,2400:da80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:dac0::,2400:dac0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:db00::,2400:db00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:db40::,2400:db40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:db80::,2400:db80:ffff:ffff:ffff:ffff:ffff:ffff,MN +2400:dbc0::,2400:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:dc00::,2400:dc00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:dc40::,2400:dc40:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:dc80::,2400:dc80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:dcc0::,2400:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:dd00::,2400:dd0f:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:dd40::,2400:dd40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:dd80::,2400:dd80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ddc0::,2400:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:de00::,2400:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:de40::,2400:de40:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:de80::,2400:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:dec0::,2400:dec0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:df00::,2400:df00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:df40::,2400:df40:ffff:ffff:ffff:ffff:ffff:ffff,TW 2400:df80::,2400:df80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:dfc0::,2400:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:e000::,2400:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e040::,2400:e040:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e0c0::,2400:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:e100::,2400:e100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e140::,2400:e140:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:e180::,2400:e180:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:e1c0::,2400:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:e200::,2400:e200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e240::,2400:e240:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:e2c0::,2400:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:e300::,2400:e300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e340::,2400:e340:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:e3c0::,2400:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:e400::,2400:e400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e440::,2400:e440:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:e480::,2400:e480:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:e4c0::,2400:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:e500::,2400:e500:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:e540::,2400:e540:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e5c0::,2400:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e640::,2400:e640:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:e680::,2400:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e6c0::,2400:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:e740::,2400:e740:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:e780::,2400:e780:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:e7c0::,2400:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e840::,2400:e840:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:e880::,2400:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e8c0::,2400:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:e900::,2400:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e940::,2400:e940:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2400:e980::,2400:e980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:e9c0::,2400:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:ea00::,2400:ea00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:ea40::,2400:ea40:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:ea80::,2400:ea80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:eac0::,2400:eac0:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:eb00::,2400:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:eb40::,2400:eb40:ffff:ffff:ffff:ffff:ffff:ffff,US 2400:eb80::,2400:eb80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ebc0::,2400:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ec00::,2400:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ec40::,2400:ec40:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:ec80::,2400:ec80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:ecc0::,2400:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:ed00::,2400:ed00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:ed40::,2400:ed40:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:ed80::,2400:ed80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:edc0::,2400:edc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ee00::,2400:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ee40::,2400:ee40:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:ee80::,2400:ee80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:eec0::,2400:eec0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ef00::,2400:ef00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:ef40::,2400:ef40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ef80::,2400:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:efc0::,2400:efc0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2400:f000::,2400:f000:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f040::,2400:f040:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:f080::,2400:f080:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:f100::,2400:f100:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:f180::,2400:f180:ffff:ffff:ffff:ffff:ffff:ffff,SG @@ -6687,6 +6963,7 @@ 2401:4400::,2401:4400:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -7009,7 +7286,6 @@ 2401:f580::,2401:f580:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:f680::,2401:f680:ffff:ffff:ffff:ffff:ffff:ffff,PG 2401:f700::,2401:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f780::,2401:f780:ffff:ffff:ffff:ffff:ffff:ffff,NP 2401:f800::,2401:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:f880::,2401:f880:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:f900::,2401:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG @@ -7017,7 +7293,9 @@ 2401:fa00::,2401:fa00::7fff:ffff:ffff:ffff:ffff,AU 2401:fa00:0:8000::,2401:fa00::ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:1::,2401:fa00:1:7fff:ffff:ffff:ffff:ffff,TW -2401:fa00:1:8000::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:1:8000::,2401:fa00:3:fcff:ffff:ffff:ffff:ffff,IN +2401:fa00:3:fd00::,2401:fa00:3:fd00:ffff:ffff:ffff:ffff,SG +2401:fa00:3:fd01::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:4::,2401:fa00:4:ffff:ffff:ffff:ffff:ffff,JP 2401:fa00:5::,2401:fa00:6:7fff:ffff:ffff:ffff:ffff,IN 2401:fa00:6:8000::,2401:fa00:6:ffff:ffff:ffff:ffff:ffff,AU @@ -7034,7 +7312,9 @@ 2401:fa00:13::,2401:fa00:13:ffff:ffff:ffff:ffff:ffff,HK 2401:fa00:14::,2401:fa00:17:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:18::,2401:fa00:18:7fff:ffff:ffff:ffff:ffff,PH -2401:fa00:18:8000::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:18:8000::,2401:fa00:18:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:19::,2401:fa00:19:ffff:ffff:ffff:ffff:ffff,TH +2401:fa00:1a::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:1c::,2401:fa00:1c:ffff:ffff:ffff:ffff:ffff,KR 2401:fa00:1d::,2401:fa00:1e:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:1f::,2401:fa00:1f:7fff:ffff:ffff:ffff:ffff,JP @@ -7446,7 +7726,7 @@ 2402:c400::,2402:c400:ffff:ffff:ffff:ffff:ffff:ffff,JP 2402:c480::,2402:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:c500::,2402:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:c580::,2402:c580:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:c580::,2402:c580:ffff:ffff:ffff:ffff:ffff:ffff,US 2402:c600::,2402:c600:ffff:ffff:ffff:ffff:ffff:ffff,JP 2402:c680::,2402:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:c700::,2402:c700:ffff:ffff:ffff:ffff:ffff:ffff,VN @@ -8156,7 +8436,6 @@ 2404:1900::,2404:1900:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1980::,2404:1980:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1a00::,2404:1a00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:1a80::,2404:1a80:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2404:1b00::,2404:1b00:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1b80::,2404:1b80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:1c00::,2404:1c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ @@ -8254,7 +8533,6 @@ 2404:4d00::,2404:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:4d80::,2404:4d80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:4e00::,2404:4e00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:4e80::,2404:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:4f00::,2404:4f01:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:4f80::,2404:4f80:ffff:ffff:ffff:ffff:ffff:ffff,BD 2404:5000::,2404:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -8309,7 +8587,9 @@ 2404:6800:4003::,2404:6800:4003:ffff:ffff:ffff:ffff:ffff,SG 2404:6800:4004::,2404:6800:4007:ffff:ffff:ffff:ffff:ffff,AU 2404:6800:4008::,2404:6800:4008:ffff:ffff:ffff:ffff:ffff,TW -2404:6800:4009::,2404:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:6800:4009::,2404:6800:400a:ffff:ffff:ffff:ffff:ffff,AU +2404:6800:400b::,2404:6800:400b:ffff:ffff:ffff:ffff:ffff,JP +2404:6800:400c::,2404:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:6900::,2404:6900:ffff:ffff:ffff:ffff:ffff:ffff,HK 2404:6980::,2404:6980:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:6a00::,2404:6a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ @@ -8334,7 +8614,7 @@ 2404:7400::,2404:7400:ffff:ffff:ffff:ffff:ffff:ffff,PH 2404:7480::,2404:7480:ffff:ffff:ffff:ffff:ffff:ffff,HK 2404:7500::,2404:7500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:7580::,2404:7587:ffff:ffff:ffff:ffff:ffff:ffff,PK +2404:7580::,2404:7580:ffff:ffff:ffff:ffff:ffff:ffff,PK 2404:7600::,2404:7600:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:7680::,2404:7680:ffff:ffff:ffff:ffff:ffff:ffff,PK 2404:7700::,2404:7700:ffff:ffff:ffff:ffff:ffff:ffff,IN @@ -8346,7 +8626,6 @@ 2404:7a00::,2404:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:7a80::,2404:7a87:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:7b00::,2404:7b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7b80::,2404:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PK 2404:7c00::,2404:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NP 2404:7c80::,2404:7c80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:7d00::,2404:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -9156,7 +9435,6 @@ 2406:400::,2406:400:ffff:ffff:ffff:ffff:ffff:ffff,TH 2406:480::,2406:480:ffff:ffff:ffff:ffff:ffff:ffff,TH 2406:500::,2406:500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:580::,2406:580:ffff:ffff:ffff:ffff:ffff:ffff,AU 2406:600::,2406:600:ffff:ffff:ffff:ffff:ffff:ffff,JP 2406:680::,2406:680:ffff:ffff:ffff:ffff:ffff:ffff,SG 2406:700::,2406:700:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -10203,6 +10481,7 @@ 2408:8000::,2408:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN 2409:10::,2409:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP 2409:250::,2409:25f:ffff:ffff:ffff:ffff:ffff:ffff,JP +2409:4000::,2409:43ff:ffff:ffff:ffff:ffff:ffff:ffff,IN 2409:8000::,2409:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN 240a::,240a:7f:ffff:ffff:ffff:ffff:ffff:ffff,JP 240a:8000::,240a:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -10313,6 +10592,17 @@ 2602:233::,2602:233:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:240::,2602:25f:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:300::,2602:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:feff::,2602:feff:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff00::,2602:ff00:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff01::,2602:ff01:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff02::,2602:ff02:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff04::,2602:ff04:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff05::,2602:ff05:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff06::,2602:ff06:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff07::,2602:ff07:fff:ffff:ffff:ffff:ffff:ffff,CW +2602:ff08::,2602:ff08:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff09::,2602:ff09:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff0a::,2602:ff0a:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff0b::,2602:ff0b:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff0c::,2602:ff0c:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff0d::,2602:ff0d:fff:ffff:ffff:ffff:ffff:ffff,CA @@ -10344,8 +10634,7 @@ 2602:ff27::,2602:ff27:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff28::,2602:ff28:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff29::,2602:ff29:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2a::,2602:ff2a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2b::,2602:ff2b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff2a::,2602:ff2b:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff2c::,2602:ff2c:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff2d::,2602:ff2d:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff2e::,2602:ff2e:fff:ffff:ffff:ffff:ffff:ffff,US @@ -10408,7 +10697,6 @@ 2602:ff67::,2602:ff67:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff68::,2602:ff68:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff69::,2602:ff69:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff6a::,2602:ff6a:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff6b::,2602:ff6b:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff6c::,2602:ff6c:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ff6d::,2602:ff6d:fff:ffff:ffff:ffff:ffff:ffff,CA @@ -10458,7 +10746,6 @@ 2602:ff9d::,2602:ff9d:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ff9f::,2602:ff9f:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ffa0::,2602:ffa0:fff:ffff:ffff:ffff:ffff:ffff,VG -2602:ffa1::,2602:ffa1:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffa2::,2602:ffa2:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffa3::,2602:ffa3:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffa4::,2602:ffa4:fff:ffff:ffff:ffff:ffff:ffff,US @@ -10553,9 +10840,11 @@ 2602:ffff::,2602:ffff:fff:ffff:ffff:ffff:ffff:ffff,US 2603::,2603:100f:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1010::,2603:1010::ffff:ffff:ffff:ffff:ffff,AU -2603:1010:1::,2603:1010:ff:ffff:ffff:ffff:ffff:ffff,US -2603:1010:100::,2603:1010:1ff:ffff:ffff:ffff:ffff:ffff,AU -2603:1010:200::,2603:1015:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1010:1::,2603:1010:1:ffff:ffff:ffff:ffff:ffff,US +2603:1010:2::,2603:1010:2:ffff:ffff:ffff:ffff:ffff,AU +2603:1010:3::,2603:1010:ff:ffff:ffff:ffff:ffff:ffff,US +2603:1010:100::,2603:1010:200:ffff:ffff:ffff:ffff:ffff,AU +2603:1010:201::,2603:1015:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1016::,2603:1016::4c:ffff:ffff:ffff:ffff,AU 2603:1016:0:4d::,2603:1016:1f:ffff:ffff:ffff:ffff:ffff,US 2603:1016:20::,2603:1016:2f:ffff:ffff:ffff:ffff:ffff,AU @@ -10567,7 +10856,7 @@ 2603:1019:200::,2603:1019:2ff:ffff:ffff:ffff:ffff:ffff,AU 2603:1019:300::,2603:101f:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1020::,2603:1020:ff:ffff:ffff:ffff:ffff:ffff,IE -2603:1020:100::,2603:1020:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1020:100::,2603:1020:1ff:ffff:ffff:ffff:ffff:ffff,AT 2603:1020:200::,2603:1020:2ff:ffff:ffff:ffff:ffff:ffff,NL 2603:1020:300::,2603:1020:4ff:ffff:ffff:ffff:ffff:ffff,GB 2603:1020:500::,2603:1020:5ff:ffff:ffff:ffff:ffff:ffff,US @@ -10594,8 +10883,10 @@ 2603:1026:700::,2603:1026:7ff:ffff:ffff:ffff:ffff:ffff,US 2603:1026:800::,2603:1026:8ff:ffff:ffff:ffff:ffff:ffff,GB 2603:1026:900::,2603:1026:fff:ffff:ffff:ffff:ffff:ffff,US -2603:1026:1000::,2603:1026:1fff:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:2000::,2603:1027::1:ffff:ffff:ffff:ffff,US +2603:1026:1000::,2603:1026:10ff:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:1100::,2603:1026:12ff:ffff:ffff:ffff:ffff:ffff,FR +2603:1026:1300::,2603:1026:13ff:ffff:ffff:ffff:ffff:ffff,NL +2603:1026:1400::,2603:1027::1:ffff:ffff:ffff:ffff,US 2603:1027:0:2::,2603:1027::3:ffff:ffff:ffff:ffff,NL 2603:1027:0:4::,2603:1027::4:ffff:ffff:ffff:ffff,IE 2603:1027:0:5::,2603:1027::5:ffff:ffff:ffff:ffff,US @@ -10631,12 +10922,18 @@ 2603:1030:f00::,2603:1030:10ff:ffff:ffff:ffff:ffff:ffff,CA 2603:1030:1100::,2603:1036:aff:ffff:ffff:ffff:ffff:ffff,US 2603:1036:b00::,2603:1036:cff:ffff:ffff:ffff:ffff:ffff,CA -2603:1036:d00::,2603:1039:dff:ffff:ffff:ffff:ffff:ffff,US +2603:1036:d00::,2603:1037::d:ffff:ffff:ffff:ffff,US +2603:1037:0:e::,2603:1037::f:ffff:ffff:ffff:ffff,CA +2603:1037:0:10::,2603:1037::8d:ffff:ffff:ffff:ffff,US +2603:1037:0:8e::,2603:1037::8f:ffff:ffff:ffff:ffff,CA +2603:1037:0:90::,2603:1039:dff:ffff:ffff:ffff:ffff:ffff,US 2603:1039:e00::,2603:1039:eff:ffff:ffff:ffff:ffff:ffff,CA 2603:1039:f00::,2603:1039:fff:ffff:ffff:ffff:ffff:ffff,US 2603:1039:1000::,2603:1039:10ff:ffff:ffff:ffff:ffff:ffff,CA 2603:1039:1100::,2603:1039:1100:ffff:ffff:ffff:ffff:ffff,PR -2603:1039:1101::,2603:1040:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1039:1101::,2603:103f:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1040::,2603:1040:ff:ffff:ffff:ffff:ffff:ffff,SG +2603:1040:100::,2603:1040:1ff:ffff:ffff:ffff:ffff:ffff,MY 2603:1040:200::,2603:1040:2ff:ffff:ffff:ffff:ffff:ffff,HK 2603:1040:300::,2603:1040:3ff:ffff:ffff:ffff:ffff:ffff,US 2603:1040:400::,2603:1040:4ff:ffff:ffff:ffff:ffff:ffff,JP @@ -10648,7 +10945,9 @@ 2603:1040:a00::,2603:1040:aff:ffff:ffff:ffff:ffff:ffff,IN 2603:1040:b00::,2603:1040:bff:ffff:ffff:ffff:ffff:ffff,US 2603:1040:c00::,2603:1040:cff:ffff:ffff:ffff:ffff:ffff,IN -2603:1040:d00::,2603:1045:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:d00::,2603:1040:dff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:e00::,2603:1040:eff:ffff:ffff:ffff:ffff:ffff,KR +2603:1040:f00::,2603:1045:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1046::,2603:1046:ff:ffff:ffff:ffff:ffff:ffff,SG 2603:1046:100::,2603:1046:1ff:ffff:ffff:ffff:ffff:ffff,KR 2603:1046:200::,2603:1046:2ff:ffff:ffff:ffff:ffff:ffff,HK @@ -10681,7 +10980,10 @@ 2603:1047:0:5::,2603:1047::5:ffff:ffff:ffff:ffff,HK 2603:1047:0:6::,2603:1047::6:ffff:ffff:ffff:ffff,SG 2603:1047:0:7::,2603:1047::7:ffff:ffff:ffff:ffff,KR -2603:1047:0:8::,2603:1047::3f:ffff:ffff:ffff:ffff,US +2603:1047:0:8::,2603:1047::9:ffff:ffff:ffff:ffff,JP +2603:1047:0:a::,2603:1047::b:ffff:ffff:ffff:ffff,AU +2603:1047:0:c::,2603:1047::d:ffff:ffff:ffff:ffff,IN +2603:1047:0:e::,2603:1047::3f:ffff:ffff:ffff:ffff,US 2603:1047:0:40::,2603:1047::40:ffff:ffff:ffff:ffff,JP 2603:1047:0:41::,2603:1047::41:ffff:ffff:ffff:ffff,SG 2603:1047:0:42::,2603:1047::42:ffff:ffff:ffff:ffff,JP @@ -10699,7 +11001,10 @@ 2603:1047:0:85::,2603:1047::85:ffff:ffff:ffff:ffff,HK 2603:1047:0:86::,2603:1047::86:ffff:ffff:ffff:ffff,SG 2603:1047:0:87::,2603:1047::87:ffff:ffff:ffff:ffff,KR -2603:1047:0:88::,2603:1047::bf:ffff:ffff:ffff:ffff,US +2603:1047:0:88::,2603:1047::89:ffff:ffff:ffff:ffff,JP +2603:1047:0:8a::,2603:1047::8b:ffff:ffff:ffff:ffff,AU +2603:1047:0:8c::,2603:1047::8d:ffff:ffff:ffff:ffff,IN +2603:1047:0:8e::,2603:1047::bf:ffff:ffff:ffff:ffff,US 2603:1047:0:c0::,2603:1047::c0:ffff:ffff:ffff:ffff,JP 2603:1047:0:c1::,2603:1047::c1:ffff:ffff:ffff:ffff,SG 2603:1047:0:c2::,2603:1047::c2:ffff:ffff:ffff:ffff,JP @@ -10728,7 +11033,9 @@ 2603:1049:e00::,2603:1049:eff:ffff:ffff:ffff:ffff:ffff,IN 2603:1049:f00::,2603:1049:fff:ffff:ffff:ffff:ffff:ffff,US 2603:1049:1000::,2603:1049:10ff:ffff:ffff:ffff:ffff:ffff,IN -2603:1049:1100::,2603:1050:20f:ffff:ffff:ffff:ffff:ffff,US +2603:1049:1100::,2603:1050::ffff:ffff:ffff:ffff:ffff,US +2603:1050:1::,2603:1050:1:ffff:ffff:ffff:ffff:ffff,BR +2603:1050:2::,2603:1050:20f:ffff:ffff:ffff:ffff:ffff,US 2603:1050:210::,2603:1050:21f:ffff:ffff:ffff:ffff:ffff,CL 2603:1050:220::,2603:1055:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1056::,2603:1056:2:3f:ffff:ffff:ffff:ffff,BR @@ -10744,7 +11051,9 @@ 2603:1056:400::,2603:1056:4ff:ffff:ffff:ffff:ffff:ffff,BR 2603:1056:500::,2603:1056:5ff:ffff:ffff:ffff:ffff:ffff,US 2603:1056:600::,2603:1056:6ff:ffff:ffff:ffff:ffff:ffff,CL -2603:1056:700::,2603:1058:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1056:700::,2603:1057:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1058::,2603:1058:1f:ffff:ffff:ffff:ffff:ffff,CL +2603:1058:20::,2603:1058:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1059::,2603:1059::ffff:ffff:ffff:ffff:ffff,BR 2603:1059:1::,2603:1059:1:ffff:ffff:ffff:ffff:ffff,CL 2603:1059:2::,2603:1059:f:ffff:ffff:ffff:ffff:ffff,US @@ -10758,6 +11067,8 @@ 2603:4000::,2603:40ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:5000::,2603:50ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:6000::,2603:60ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:7000::,2603:70ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:8000::,2603:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2604::,2604::ffff:ffff:ffff:ffff:ffff:ffff,US 2604:10::,2604:10:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:50::,2604:50:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -10831,59 +11142,113 @@ 2604:1200::,2604:1200:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1240::,2604:1240:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1280::,2604:1280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:12c0::,2604:12c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1300::,2604:1300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1340::,2604:1340:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1380::,2604:1380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:13c0::,2604:13c0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1400::,2604:1400:ffff:ffff:ffff:ffff:ffff:ffff,PR +2604:1440::,2604:1440:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1480::,2604:1480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:14c0::,2604:14c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1500::,2604:1500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1540::,2604:1540:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1580::,2604:1580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:15c0::,2604:15c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1600::,2604:1600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1640::,2604:1640:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1680::,2604:1680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:16c0::,2604:16c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1700::,2604:1700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1740::,2604:1740:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1780::,2604:1780:ffff:ffff:ffff:ffff:ffff:ffff,KY +2604:17c0::,2604:17c0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1800::,2604:1800:ffff:ffff:ffff:ffff:ffff:ffff,GP +2604:1840::,2604:1840:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1880::,2604:1880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:18c0::,2604:18c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1900::,2604:1900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1940::,2604:1940:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1980::,2604:1980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:19c0::,2604:19c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1a00::,2604:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1a40::,2604:1a40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1a80::,2604:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1ac0::,2604:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1b00::,2604:1b00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1b40::,2604:1b40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1b80::,2604:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1bc0::,2604:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1c00::,2604:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1c40::,2604:1c40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1c80::,2604:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1cc0::,2604:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,PR 2604:1d00::,2604:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1d40::,2604:1d40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1d80::,2604:1d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1dc0::,2604:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1e00::,2604:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1e40::,2604:1e40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1e80::,2604:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1ec0::,2604:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1f00::,2604:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1f40::,2604:1f40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1f80::,2604:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1fc0::,2604:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2000::,2604:2000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2040::,2604:2040:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2080::,2604:2080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:20c0::,2604:20c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2100::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2140::,2604:2140:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2180::,2604:2180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:21c0::,2604:21c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2200::,2604:2200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2240::,2604:2240:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2280::,2604:2280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:22c0::,2604:22c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2300::,2604:2300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2340::,2604:2340:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2380::,2604:2380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:23c0::,2604:23c0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:2400::,2604:2400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2440::,2604:2440:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2480::,2604:2480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:24c0::,2604:24c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2500::,2604:2500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2540::,2604:2540:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2580::,2604:2580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:25c0::,2604:25c0:ffff:ffff:ffff:ffff:ffff:ffff,CW 2604:2600::,2604:2600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2640::,2604:2640:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2680::,2604:2680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:26c0::,2604:26c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2700::,2604:2700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2740::,2604:2740:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2780::,2604:2780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:27c0::,2604:27c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2800::,2604:2800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2840::,2604:2840:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:2880::,2604:2880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:28c0::,2604:28c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2900::,2604:2900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2940::,2604:2940:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2980::,2604:2980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:29c0::,2604:29c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2a00::,2604:2a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2a40::,2604:2a40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2a80::,2604:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2ac0::,2604:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2b00::,2604:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2b40::,2604:2b40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2b80::,2604:2b80:fff:ffff:ffff:ffff:ffff:ffff,CA +2604:2bc0::,2604:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2c00::,2604:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2c40::,2604:2c40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2c80::,2604:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2cc0::,2604:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2d00::,2604:2d00:fff:ffff:ffff:ffff:ffff:ffff,US +2604:2d40::,2604:2d40:ffff:ffff:ffff:ffff:ffff:ffff,PR 2604:2d80::,2604:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2e00::,2604:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2e80::,2604:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -10913,7 +11278,7 @@ 2604:3b80::,2604:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3c00::,2604:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3c80::,2604:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3d00::,2604:3d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:3d00::,2604:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:3d80::,2604:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3e00::,2604:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3e80::,2604:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11078,7 +11443,6 @@ 2604:9280::,2604:9280:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9300::,2604:9300:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9380::,2604:9380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:9400::,2604:9400:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9480::,2604:9480:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9500::,2604:9500:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9580::,2604:9580:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11097,7 +11461,7 @@ 2604:9c80::,2604:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9d00::,2604:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9d80::,2604:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9e00::,2604:9e01:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9e00::,2604:9e0f:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9e80::,2604:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:9f00::,2604:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9f80::,2604:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11117,8 +11481,8 @@ 2604:a780::,2604:a780:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a800::,2604:a800:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a880::,2604:a880:cac:ffff:ffff:ffff:ffff:ffff,US -2604:a880:cad::,2604:a880:cad:ffff:ffff:ffff:ffff:ffff,CA -2604:a880:cae::,2604:a880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a880:cad::,2604:a880:cad:7fff:ffff:ffff:ffff:ffff,CA +2604:a880:cad:8000::,2604:a880:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a900::,2604:a900:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a980::,2604:a980:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:aa00::,2604:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11305,7 +11669,6 @@ 2605:900::,2605:900:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:980::,2605:980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a00::,2605:a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a80::,2605:a80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b80::,2605:b81:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c00::,2605:c00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:d00::,2605:d00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11369,7 +11732,6 @@ 2605:2b80::,2605:2b80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2c00::,2605:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2c80::,2605:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2d80::,2605:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2e00::,2605:2e00:fff:ffff:ffff:ffff:ffff:ffff,CA 2605:2e80::,2605:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2f00::,2605:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11622,7 +11984,6 @@ 2605:b180::,2605:b180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b200::,2605:b200:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b280::,2605:b280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b300::,2605:b300:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b380::,2605:b380:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b400::,2605:b400:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b480::,2605:b480:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -12014,7 +12375,6 @@ 2606:5780::,2606:5780:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5800::,2606:5800:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5880::,2606:5880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5900::,2606:5900:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5980::,2606:5980:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5a00::,2606:5a00:ffff:ffff:ffff:ffff:ffff:ffff,VI 2606:5a80::,2606:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -12116,7 +12476,6 @@ 2606:8c00::,2606:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2606:8c80::,2606:8c80:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8d00::,2606:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8d80::,2606:8d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8e80::,2606:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8f00::,2606:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8f80::,2606:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -12643,7 +13002,6 @@ 2607:9600::,2607:9600:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9680::,2607:9680:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9700::,2607:9700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9780::,2607:9780:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9800::,2607:9800:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9880::,2607:9880:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:9980::,2607:9980:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -12714,7 +13072,6 @@ 2607:ba80::,2607:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bb00::,2607:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bb80::,2607:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bc00::,2607:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bc80::,2607:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bd00::,2607:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:bd80::,2607:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -12907,6 +13264,7 @@ 2607:f2f8::,2607:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f300::,2607:f300:fff:ffff:ffff:ffff:ffff:ffff,US 2607:f308::,2607:f308:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f310::,2607:f310:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f318::,2607:f318:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f330::,2607:f330:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f338::,2607:f338:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -13340,7 +13698,6 @@ 2610:e0::,2610:e0:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:e8::,2610:e8:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:f0::,2610:f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:f8::,2610:f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:100::,2610:100:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:108::,2610:108:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:120::,2610:120:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -13488,7 +13845,7 @@ 2620:0:cc8::,2620::cc9:ffff:ffff:ffff:ffff:ffff,US 2620:0:cca::,2620::cca:ffff:ffff:ffff:ffff:ffff,SG 2620:0:ccb::,2620::ccd:ffff:ffff:ffff:ffff:ffff,US -2620:0:cce::,2620::cce:ffff:ffff:ffff:ffff:ffff,HK +2620:0:cce::,2620::cce:ffff:ffff:ffff:ffff:ffff,CN 2620:0:ccf::,2620::ccf:ffff:ffff:ffff:ffff:ffff,AU 2620:0:ce0::,2620::ce0:ffff:ffff:ffff:ffff:ffff,US 2620:0:cf0::,2620::cf0:ffff:ffff:ffff:ffff:ffff,US @@ -13507,8 +13864,7 @@ 2620:0:e10::,2620::e10:ffff:ffff:ffff:ffff:ffff,US 2620:0:e20::,2620::e23:ffff:ffff:ffff:ffff:ffff,US 2620:0:e30::,2620::e30:ffff:ffff:ffff:ffff:ffff,US -2620:0:e50::,2620::e50:ffff:ffff:ffff:ffff:ffff,US -2620:0:e60::,2620::e60:ffff:ffff:ffff:ffff:ffff,US +2620:0:e50::,2620::e60:ffff:ffff:ffff:ffff:ffff,US 2620:0:e80::,2620::e80:ffff:ffff:ffff:ffff:ffff,US 2620:0:e90::,2620::e90:ffff:ffff:ffff:ffff:ffff,US 2620:0:ea0::,2620::eb0:ffff:ffff:ffff:ffff:ffff,US @@ -13785,27 +14141,50 @@ 2620:13:8000::,2620:13:8000:ffff:ffff:ffff:ffff:ffff,US 2620:13:a000::,2620:13:a000:ffff:ffff:ffff:ffff:ffff,US 2620:13:c000::,2620:13:c000:ffff:ffff:ffff:ffff:ffff,US +2620:13:e000::,2620:13:e000:ffff:ffff:ffff:ffff:ffff,US 2620:14::,2620:14::ffff:ffff:ffff:ffff:ffff,US +2620:14:2000::,2620:14:2000:ffff:ffff:ffff:ffff:ffff,CA 2620:14:4000::,2620:14:4000:ffff:ffff:ffff:ffff:ffff,US +2620:14:6000::,2620:14:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:14:8000::,2620:14:8000:ffff:ffff:ffff:ffff:ffff,US +2620:14:a000::,2620:14:a000:ffff:ffff:ffff:ffff:ffff,US 2620:14:c000::,2620:14:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:14:e000::,2620:14:e000:ffff:ffff:ffff:ffff:ffff,US 2620:15::,2620:15::ffff:ffff:ffff:ffff:ffff,US +2620:15:2000::,2620:15:2000:ffff:ffff:ffff:ffff:ffff,US +2620:15:6000::,2620:15:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:15:8000::,2620:15:8000:ffff:ffff:ffff:ffff:ffff,US +2620:15:a000::,2620:15:a000:ffff:ffff:ffff:ffff:ffff,US 2620:15:c000::,2620:15:c000:ffff:ffff:ffff:ffff:ffff,US +2620:15:e000::,2620:15:e000:ffff:ffff:ffff:ffff:ffff,US 2620:16::,2620:16::ffff:ffff:ffff:ffff:ffff,CA +2620:16:2000::,2620:16:2000:ffff:ffff:ffff:ffff:ffff,US 2620:16:4000::,2620:16:4000:ffff:ffff:ffff:ffff:ffff,US +2620:16:6000::,2620:16:6000:ffff:ffff:ffff:ffff:ffff,US 2620:16:8000::,2620:16:8000:ffff:ffff:ffff:ffff:ffff,US +2620:16:a000::,2620:16:a000:ffff:ffff:ffff:ffff:ffff,US 2620:16:c000::,2620:16:c000:ffff:ffff:ffff:ffff:ffff,US +2620:16:e000::,2620:16:e000:ffff:ffff:ffff:ffff:ffff,US 2620:17::,2620:17::ffff:ffff:ffff:ffff:ffff,US +2620:17:2000::,2620:17:2000:ffff:ffff:ffff:ffff:ffff,US 2620:17:4000::,2620:17:4000:ffff:ffff:ffff:ffff:ffff,US +2620:17:6000::,2620:17:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:17:8000::,2620:17:800f:ffff:ffff:ffff:ffff:ffff,US +2620:17:a000::,2620:17:a000:ffff:ffff:ffff:ffff:ffff,US 2620:17:c000::,2620:17:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:17:e000::,2620:17:e000:ffff:ffff:ffff:ffff:ffff,US 2620:18::,2620:18::ffff:ffff:ffff:ffff:ffff,US +2620:18:2000::,2620:18:2000:ffff:ffff:ffff:ffff:ffff,US 2620:18:4000::,2620:18:4000:ffff:ffff:ffff:ffff:ffff,US +2620:18:6000::,2620:18:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:18:8000::,2620:18:8000:ffff:ffff:ffff:ffff:ffff,US +2620:18:a000::,2620:18:a000:ffff:ffff:ffff:ffff:ffff,US 2620:18:c000::,2620:18:c000:ffff:ffff:ffff:ffff:ffff,KN +2620:18:e000::,2620:18:e000:ffff:ffff:ffff:ffff:ffff,US 2620:19::,2620:19::ffff:ffff:ffff:ffff:ffff,US +2620:19:2000::,2620:19:2000:ffff:ffff:ffff:ffff:ffff,CA 2620:19:4000::,2620:19:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:19:6000::,2620:19:6000:ffff:ffff:ffff:ffff:ffff,US 2620:19:8000::,2620:19:8000:ffff:ffff:ffff:ffff:ffff,US 2620:1a::,2620:1a::ffff:ffff:ffff:ffff:ffff,US 2620:1a:4000::,2620:1a:4000:ffff:ffff:ffff:ffff:ffff,US @@ -14289,7 +14668,6 @@ 2620:96:8000::,2620:96:8000:ffff:ffff:ffff:ffff:ffff,US 2620:96:c000::,2620:96:c000:ffff:ffff:ffff:ffff:ffff,US 2620:97::,2620:97::ffff:ffff:ffff:ffff:ffff,US -2620:97:4000::,2620:97:4000:ffff:ffff:ffff:ffff:ffff,US 2620:97:8000::,2620:97:8000:ffff:ffff:ffff:ffff:ffff,US 2620:97:c000::,2620:97:c000:ffff:ffff:ffff:ffff:ffff,US 2620:98::,2620:98::ffff:ffff:ffff:ffff:ffff,US @@ -14300,7 +14678,6 @@ 2620:99:8000::,2620:99:8000:ffff:ffff:ffff:ffff:ffff,US 2620:99:c000::,2620:99:c000:ffff:ffff:ffff:ffff:ffff,US 2620:9a::,2620:9a::ffff:ffff:ffff:ffff:ffff,CA -2620:9a:4000::,2620:9a:4000:ffff:ffff:ffff:ffff:ffff,US 2620:9a:8000::,2620:9a:8000:ffff:ffff:ffff:ffff:ffff,US 2620:9b::,2620:9b::ffff:ffff:ffff:ffff:ffff,US 2620:9b:4000::,2620:9b:4000:ffff:ffff:ffff:ffff:ffff,US @@ -14663,7 +15040,7 @@ 2620:f5:8000::,2620:f5:8000:ffff:ffff:ffff:ffff:ffff,US 2620:f5:c000::,2620:f5:c000:ffff:ffff:ffff:ffff:ffff,US 2620:f6::,2620:f6::ffff:ffff:ffff:ffff:ffff,CA -2620:f6:4000::,2620:f6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f6:4000::,2620:f6:400f:ffff:ffff:ffff:ffff:ffff,US 2620:f6:8000::,2620:f6:8000:ffff:ffff:ffff:ffff:ffff,US 2620:f6:c000::,2620:f6:c000:ffff:ffff:ffff:ffff:ffff,CA 2620:f7::,2620:f7::ffff:ffff:ffff:ffff:ffff,US @@ -15084,7 +15461,6 @@ 2620:117:c000::,2620:117:c0ff:ffff:ffff:ffff:ffff:ffff,US 2620:117:d000::,2620:117:d0ff:ffff:ffff:ffff:ffff:ffff,CA 2620:117:e000::,2620:117:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:f000::,2620:117:f00f:ffff:ffff:ffff:ffff:ffff,US 2620:118::,2620:118:f:ffff:ffff:ffff:ffff:ffff,US 2620:118:1000::,2620:118:10ff:ffff:ffff:ffff:ffff:ffff,US 2620:118:2000::,2620:118:20ff:ffff:ffff:ffff:ffff:ffff,US @@ -15435,6 +15811,17 @@ 2620:12d:8000::,2620:12d:80ff:ffff:ffff:ffff:ffff:ffff,US 2620:12d:9000::,2620:12d:90ff:ffff:ffff:ffff:ffff:ffff,US 2620:12d:a000::,2620:12d:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:b000::,2620:12d:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:c000::,2620:12d:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:d000::,2620:12d:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:e000::,2620:12d:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:f000::,2620:12d:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e::,2620:12e:f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:1000::,2620:12e:100f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:2000::,2620:12e:200f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:3000::,2620:12e:300f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:4000::,2620:12e:400f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:5000::,2620:12e:50ff:ffff:ffff:ffff:ffff:ffff,US 2620:140::,2620:140:3ff:ffff:ffff:ffff:ffff:ffff,US 2620:141::,2620:141:fff:ffff:ffff:ffff:ffff:ffff,US 2620:143::,2620:143:7ff:ffff:ffff:ffff:ffff:ffff,US @@ -15464,7 +15851,7 @@ 2620:15c::,2620:15c:4:ffff:ffff:ffff:ffff:ffff,US 2620:15c:5::,2620:15c:5:ffff:ffff:ffff:ffff:ffff,BR 2620:15c:6::,2620:15c:fff:ffff:ffff:ffff:ffff:ffff,US -2620:15d::,2620:15e:fff:ffff:ffff:ffff:ffff:ffff,US +2620:15e::,2620:15e:fff:ffff:ffff:ffff:ffff:ffff,US 2620:15f::,2620:15f:fff:ffff:ffff:ffff:ffff:ffff,US 2620:160::,2620:160:ffff:ffff:ffff:ffff:ffff:ffff,US 2620:162::,2620:162:fff:ffff:ffff:ffff:ffff:ffff,US @@ -15494,6 +15881,7 @@ 2620:182::,2620:182:fff:ffff:ffff:ffff:ffff:ffff,US 2620:183::,2620:183:fff:ffff:ffff:ffff:ffff:ffff,US 2620:184::,2620:184:fff:ffff:ffff:ffff:ffff:ffff,US +2620:185::,2620:185:fff:ffff:ffff:ffff:ffff:ffff,US 2620:190::,2620:190:ffff:ffff:ffff:ffff:ffff:ffff,US 2620:1a0::,2620:1a0:ffff:ffff:ffff:ffff:ffff:ffff,US 2620:1b0::,2620:1b0:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -15765,7 +16153,6 @@ 2801:0:1b0::,2801::1b0:ffff:ffff:ffff:ffff:ffff,AR 2801:0:1c0::,2801::1c7:ffff:ffff:ffff:ffff:ffff,CO 2801:0:1d0::,2801::1d7:ffff:ffff:ffff:ffff:ffff,AR -2801:0:1e0::,2801::1e0:ffff:ffff:ffff:ffff:ffff,CO 2801:0:1f0::,2801::1f0:ffff:ffff:ffff:ffff:ffff,PY 2801:0:200::,2801::200:ffff:ffff:ffff:ffff:ffff,VE 2801:0:210::,2801::210:ffff:ffff:ffff:ffff:ffff,CO @@ -15806,7 +16193,6 @@ 2801:0:4c0::,2801::4c0:ffff:ffff:ffff:ffff:ffff,CO 2801:0:4d0::,2801::4d0:ffff:ffff:ffff:ffff:ffff,EC 2801:0:4e0::,2801::4e0:ffff:ffff:ffff:ffff:ffff,CL -2801:0:4f0::,2801::4f0:ffff:ffff:ffff:ffff:ffff,CO 2801:0:2000::,2801::2fff:ffff:ffff:ffff:ffff:ffff,UY 2801:1::,2801:1:ffff:ffff:ffff:ffff:ffff:ffff,CR 2801:2::,2801:2:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -15832,6 +16218,7 @@ 2801:11:9000::,2801:11:9000:ffff:ffff:ffff:ffff:ffff,CO 2801:11:a000::,2801:11:a000:ffff:ffff:ffff:ffff:ffff,VE 2801:11:c000::,2801:11:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:11:d000::,2801:11:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:11:e000::,2801:11:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:12::,2801:12::ffff:ffff:ffff:ffff:ffff,PY 2801:12:1000::,2801:12:1000:ffff:ffff:ffff:ffff:ffff,BO @@ -15842,6 +16229,7 @@ 2801:12:8000::,2801:12:8000:ffff:ffff:ffff:ffff:ffff,AR 2801:12:9000::,2801:12:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:12:c000::,2801:12:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:12:d000::,2801:12:d000:ffff:ffff:ffff:ffff:ffff,BO 2801:12:e000::,2801:12:e000:ffff:ffff:ffff:ffff:ffff,PA 2801:13::,2801:13::ffff:ffff:ffff:ffff:ffff,VE 2801:13:1000::,2801:13:1000:ffff:ffff:ffff:ffff:ffff,AR @@ -15853,11 +16241,11 @@ 2801:13:9000::,2801:13:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:13:a000::,2801:13:a000:ffff:ffff:ffff:ffff:ffff,CO 2801:13:c000::,2801:13:c000:ffff:ffff:ffff:ffff:ffff,TT +2801:13:d000::,2801:13:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:13:e000::,2801:13:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:14::,2801:14::ffff:ffff:ffff:ffff:ffff,CO 2801:14:1000::,2801:14:1000:ffff:ffff:ffff:ffff:ffff,CL 2801:14:2000::,2801:14:2000:ffff:ffff:ffff:ffff:ffff,AR -2801:14:4000::,2801:14:4000:ffff:ffff:ffff:ffff:ffff,CO 2801:14:5000::,2801:14:5000:ffff:ffff:ffff:ffff:ffff,NI 2801:14:6000::,2801:14:6000:ffff:ffff:ffff:ffff:ffff,BO 2801:14:8000::,2801:14:8000:ffff:ffff:ffff:ffff:ffff,CO @@ -15876,6 +16264,7 @@ 2801:15:9000::,2801:15:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:15:a000::,2801:15:a000:ffff:ffff:ffff:ffff:ffff,DO 2801:15:c000::,2801:15:c000:ffff:ffff:ffff:ffff:ffff,GT +2801:15:d000::,2801:15:d000:ffff:ffff:ffff:ffff:ffff,CL 2801:15:e000::,2801:15:e000:ffff:ffff:ffff:ffff:ffff,DO 2801:16::,2801:16::ffff:ffff:ffff:ffff:ffff,CW 2801:16:e0::,2801:16:e0:ffff:ffff:ffff:ffff:ffff,GY @@ -15888,6 +16277,7 @@ 2801:16:9000::,2801:16:9000:ffff:ffff:ffff:ffff:ffff,BO 2801:16:a000::,2801:16:a000:ffff:ffff:ffff:ffff:ffff,CR 2801:16:c000::,2801:16:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:16:d000::,2801:16:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:17::,2801:17::ffff:ffff:ffff:ffff:ffff,CL 2801:17:1000::,2801:17:1000:ffff:ffff:ffff:ffff:ffff,HN 2801:17:2000::,2801:17:2000:ffff:ffff:ffff:ffff:ffff,PY @@ -15920,17 +16310,16 @@ 2801:19:9000::,2801:19:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:19:a000::,2801:19:a000:ffff:ffff:ffff:ffff:ffff,BO 2801:19:c000::,2801:19:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:19:d000::,2801:19:d000:ffff:ffff:ffff:ffff:ffff,BO 2801:19:e000::,2801:19:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:1a::,2801:1a::ffff:ffff:ffff:ffff:ffff,CO 2801:1a:1000::,2801:1a:1000:ffff:ffff:ffff:ffff:ffff,CL -2801:1a:2000::,2801:1a:2000:ffff:ffff:ffff:ffff:ffff,SR -2801:1a:4000::,2801:1a:4000:ffff:ffff:ffff:ffff:ffff,CO 2801:1a:5000::,2801:1a:5000:ffff:ffff:ffff:ffff:ffff,AR -2801:1a:6000::,2801:1a:6000:ffff:ffff:ffff:ffff:ffff,CR 2801:1a:8000::,2801:1a:8000:ffff:ffff:ffff:ffff:ffff,CL 2801:1a:9000::,2801:1a:9000:ffff:ffff:ffff:ffff:ffff,DO 2801:1a:a000::,2801:1a:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:1a:c000::,2801:1a:c000:ffff:ffff:ffff:ffff:ffff,CO +2801:1a:d000::,2801:1a:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:1a:e000::,2801:1a:e000:ffff:ffff:ffff:ffff:ffff,DO 2801:1b::,2801:1b::ffff:ffff:ffff:ffff:ffff,CR 2801:1b:1000::,2801:1b:1000:ffff:ffff:ffff:ffff:ffff,CL @@ -15964,6 +16353,7 @@ 2801:1d:9000::,2801:1d:9000:ffff:ffff:ffff:ffff:ffff,CO 2801:1d:a000::,2801:1d:a00f:ffff:ffff:ffff:ffff:ffff,CR 2801:1d:c000::,2801:1d:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:d000::,2801:1d:d000:ffff:ffff:ffff:ffff:ffff,BO 2801:1d:e000::,2801:1d:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC 2801:1e:1000::,2801:1e:1000:ffff:ffff:ffff:ffff:ffff,AR @@ -15974,11 +16364,11 @@ 2801:1e:8000::,2801:1e:8000:ffff:ffff:ffff:ffff:ffff,CR 2801:1e:9000::,2801:1e:9000:ffff:ffff:ffff:ffff:ffff,SV 2801:1e:a000::,2801:1e:a000:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:d000::,2801:1e:d000:ffff:ffff:ffff:ffff:ffff,CO 2801:1e:e000::,2801:1e:e000:ffff:ffff:ffff:ffff:ffff,SV 2801:1f::,2801:1f::ffff:ffff:ffff:ffff:ffff,AR 2801:1f:1000::,2801:1f:1000:ffff:ffff:ffff:ffff:ffff,HN 2801:1f:2000::,2801:1f:2000:ffff:ffff:ffff:ffff:ffff,CR -2801:1f:4000::,2801:1f:4000:ffff:ffff:ffff:ffff:ffff,CR 2801:1f:5000::,2801:1f:5000:ffff:ffff:ffff:ffff:ffff,CO 2801:1f:6000::,2801:1f:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR @@ -16321,6 +16711,12 @@ 2801:80:1be0::,2801:80:1be0:ffff:ffff:ffff:ffff:ffff,BR 2801:80:1bf0::,2801:80:1bf0:ffff:ffff:ffff:ffff:ffff,BR 2801:80:1c00::,2801:80:1c00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c10::,2801:80:1c10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c20::,2801:80:1c20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c30::,2801:80:1c30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c40::,2801:80:1c4f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c60::,2801:80:1c60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c70::,2801:80:1c70:ffff:ffff:ffff:ffff:ffff,BR 2801:82::,2801:82:ffff:ffff:ffff:ffff:ffff:ffff,BR 2801:84::,2801:84:ffff:ffff:ffff:ffff:ffff:ffff,BR 2801:86::,2801:86:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -16429,6 +16825,7 @@ 2803:100::,2803:100:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:140::,2803:140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:180::,2803:180:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:1c0::,2803:1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:240::,2803:240:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16474,6 +16871,7 @@ 2803:e00::,2803:e00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:e40::,2803:e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e80::,2803:e80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:ec0::,2803:ec0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:f00::,2803:f00:48a:ffff:ffff:ffff:ffff:ffff,PE 2803:f00:48b::,2803:f00:48e:ffff:ffff:ffff:ffff:ffff,CO 2803:f00:48f::,2803:f00:4a9:ffff:ffff:ffff:ffff:ffff,PE @@ -16488,6 +16886,7 @@ 2803:1100::,2803:1100:ffff:ffff:ffff:ffff:ffff:ffff,CW 2803:1140::,2803:1140:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:1180::,2803:1180:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:11c0::,2803:11c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:1240::,2803:1240:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -16504,6 +16903,7 @@ 2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ 2803:1640::,2803:1640:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:1680::,2803:1680:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:16c0::,2803:16c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1700::,2803:1700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1740::,2803:1740:ffff:ffff:ffff:ffff:ffff:ffff,GF 2803:1780::,2803:1780:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -16511,7 +16911,6 @@ 2803:1840::,2803:1840:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1940::,2803:1940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1980::,2803:1980:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1a40::,2803:1a40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR @@ -16528,6 +16927,7 @@ 2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:1e40::,2803:1e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1e80::,2803:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1ec0::,2803:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:1f00::,2803:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1f40::,2803:1f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1f80::,2803:1f80:ffff:ffff:ffff:ffff:ffff:ffff,VE @@ -16537,6 +16937,7 @@ 2803:20c0::,2803:20c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2140::,2803:2140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2180::,2803:2180:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:21c0::,2803:21c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:2240::,2803:2240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ @@ -16554,6 +16955,7 @@ 2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2640::,2803:2640:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:2680::,2803:2680:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:26c0::,2803:26c0:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:2700::,2803:2700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2740::,2803:2740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2780::,2803:2780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16581,6 +16983,7 @@ 2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:2e40::,2803:2e40:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:2e80::,2803:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2ec0::,2803:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:2f00::,2803:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2f40::,2803:2f40:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:2f80::,2803:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -16590,6 +16993,7 @@ 2803:3100::,2803:3100:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:3140::,2803:3140:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:3180::,2803:3180:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:31c0::,2803:31c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3200::,2803:3200:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:3240::,2803:3240:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT @@ -16607,6 +17011,7 @@ 2803:3600::,2803:3600:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:3640::,2803:3640:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:3680::,2803:3680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:36c0::,2803:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:3700::,2803:3700:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:3740::,2803:3740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3780::,2803:3780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16634,6 +17039,7 @@ 2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3e40::,2803:3e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3e80::,2803:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:3ec0::,2803:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:3f00::,2803:3f00:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:3f40::,2803:3f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3f80::,2803:3f80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16644,6 +17050,7 @@ 2803:4100::,2803:4100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4140::,2803:4140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4180::,2803:4180:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:41c0::,2803:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4240::,2803:4240:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16661,6 +17068,7 @@ 2803:4600::,2803:4600:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:4640::,2803:4640:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4680::,2803:4680:ffff:ffff:ffff:ffff:ffff:ffff,TT +2803:46c0::,2803:46c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:4700::,2803:4700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4740::,2803:4740:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:4780::,2803:4780:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -16687,6 +17095,7 @@ 2803:4e00::,2803:4e00:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:4e40::,2803:4e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4e80::,2803:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:4ec0::,2803:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4f00::,2803:4f00:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:4f40::,2803:4f40:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:4f80::,2803:4f80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16697,6 +17106,7 @@ 2803:5100::,2803:5100:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:5140::,2803:5140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5180::,2803:5180:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:51c0::,2803:51c0:ffff:ffff:ffff:ffff:ffff:ffff,SX 2803:5200::,2803:5200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5240::,2803:5240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -16714,6 +17124,7 @@ 2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:5640::,2803:5640:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:5680::,2803:5680:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:56c0::,2803:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5700::,2803:5700:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:5740::,2803:5740:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:5780::,2803:5780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16740,6 +17151,7 @@ 2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:5e40::,2803:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5e80::,2803:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5ec0::,2803:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:5f40::,2803:5f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5f80::,2803:5f80:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:6000::,2803:6000:ffff:ffff:ffff:ffff:ffff:ffff,CR @@ -16749,6 +17161,7 @@ 2803:6100::,2803:6100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6140::,2803:6140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6180::,2803:6180:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:61c0::,2803:61c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6240::,2803:6240:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -16765,6 +17178,7 @@ 2803:6580::,2803:6580:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6680::,2803:6680:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:66c0::,2803:66c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6700::,2803:6700:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:6740::,2803:6740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6780::,2803:6780:ffff:ffff:ffff:ffff:ffff:ffff,SV @@ -16792,6 +17206,7 @@ 2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:6e40::,2803:6e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6e80::,2803:6e80:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:6ec0::,2803:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:6f00::,2803:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6f40::,2803:6f40:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:6f80::,2803:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -16802,6 +17217,7 @@ 2803:7100::,2803:7100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7140::,2803:7140:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:7180::,2803:7180:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:71c0::,2803:71c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7200::,2803:7200:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:7240::,2803:7240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -16819,6 +17235,7 @@ 2803:7600::,2803:7600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7640::,2803:7640:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:7680::,2803:7680:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:76c0::,2803:76c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7700::,2803:7700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7740::,2803:7740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7780::,2803:7780:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16846,6 +17263,7 @@ 2803:7e00::,2803:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7e40::,2803:7e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7e80::,2803:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7ec0::,2803:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:7f00::,2803:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:7f40::,2803:7f40:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:7f80::,2803:7f80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16856,6 +17274,7 @@ 2803:8100::,2803:8100:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:8140::,2803:8140:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8180::,2803:8180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:81c0::,2803:81c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:8240::,2803:8240:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE @@ -16873,6 +17292,7 @@ 2803:8600::,2803:8600:ffff:ffff:ffff:ffff:ffff:ffff,HT 2803:8640::,2803:8640:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8680::,2803:8680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:86c0::,2803:86c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:8700::,2803:8700:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:8740::,2803:8740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8780::,2803:8780:ffff:ffff:ffff:ffff:ffff:ffff,BZ @@ -16899,6 +17319,7 @@ 2803:8e00::,2803:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8e40::,2803:8e40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8e80::,2803:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:8ec0::,2803:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:8f00::,2803:8f00:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:8f40::,2803:8f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8f80::,2803:8f80:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16909,6 +17330,7 @@ 2803:9100::,2803:9100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9140::,2803:9140:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:9180::,2803:9180:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:91c0::,2803:91c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9200::,2803:9200:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:9240::,2803:9240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16926,6 +17348,7 @@ 2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW 2803:9640::,2803:9640:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:9680::,2803:9680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:96c0::,2803:96c0:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:9740::,2803:9740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9780::,2803:9780:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16952,6 +17375,7 @@ 2803:9e00::,2803:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9e40::,2803:9e40:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:9e80::,2803:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:9ec0::,2803:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:9f00::,2803:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9f40::,2803:9f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9f80::,2803:9f80:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16962,6 +17386,7 @@ 2803:a100::,2803:a100:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:a140::,2803:a140:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:a180::,2803:a180:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:a1c0::,2803:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:a240::,2803:a240:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -16978,6 +17403,7 @@ 2803:a600::,2803:a600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a640::,2803:a640:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:a680::,2803:a680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a6c0::,2803:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:a700::,2803:a700:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:a740::,2803:a740:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:a780::,2803:a780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17005,6 +17431,7 @@ 2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ae40::,2803:ae40:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:ae80::,2803:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:aec0::,2803:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:af00::,2803:af00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:af40::,2803:af40:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:af80::,2803:af80:ffff:ffff:ffff:ffff:ffff:ffff,PY @@ -17014,6 +17441,7 @@ 2803:b100::,2803:b100:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:b140::,2803:b140:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:b180::,2803:b180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b1c0::,2803:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:b200::,2803:b200:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:b240::,2803:b240:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17031,6 +17459,7 @@ 2803:b600::,2803:b600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b640::,2803:b640:ffff:ffff:ffff:ffff:ffff:ffff,AW 2803:b680::,2803:b680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b6c0::,2803:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b700::,2803:b700:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:b740::,2803:b740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b780::,2803:b780:ffff:ffff:ffff:ffff:ffff:ffff,NI @@ -17057,6 +17486,7 @@ 2803:be00::,2803:be00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:be40::,2803:be40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:be80::,2803:be80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:bec0::,2803:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:bf00::,2803:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:bf40::,2803:bf40:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:bf80::,2803:bf80:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -17067,6 +17497,7 @@ 2803:c100::,2803:c100:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:c140::,2803:c140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c180::,2803:c180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c1c0::,2803:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:c240::,2803:c240:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC @@ -17084,6 +17515,7 @@ 2803:c600::,2803:c600:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:c640::,2803:c640:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c680::,2803:c680:ffff:ffff:ffff:ffff:ffff:ffff,HT +2803:c6c0::,2803:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c700::,2803:c700:ffff:ffff:ffff:ffff:ffff:ffff,GF 2803:c740::,2803:c740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c780::,2803:c780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17111,6 +17543,7 @@ 2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:ce40::,2803:ce40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ce80::,2803:ce80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cec0::,2803:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:cf00::,2803:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:cf40::,2803:cf40:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:cf80::,2803:cf80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17123,6 +17556,7 @@ 2803:d100::,2803:d100:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:d140::,2803:d140:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:d180::,2803:d180:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:d1c0::,2803:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:d200::,2803:d200:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:d240::,2803:d240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY @@ -17134,11 +17568,12 @@ 2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:d4c0::,2803:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:d500::,2803:d500:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:d540::,2803:d540:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:d540::,2803:d540:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:d580::,2803:d580:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:d600::,2803:d600:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:d640::,2803:d640:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:d680::,2803:d680:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:d6c0::,2803:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:d700::,2803:d700:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:d740::,2803:d740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:d780::,2803:d780:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17166,6 +17601,7 @@ 2803:de00::,2803:de00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:de40::,2803:de40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:de80::,2803:de80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:dec0::,2803:dec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:df00::,2803:df00:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:df40::,2803:df40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:df80::,2803:df80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17176,6 +17612,7 @@ 2803:e100::,2803:e100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e140::,2803:e140:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:e180::,2803:e180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e1c0::,2803:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e240::,2803:e240:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17193,6 +17630,7 @@ 2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:e640::,2803:e640:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:e680::,2803:e680:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:e6c0::,2803:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:e700::,2803:e700:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:e740::,2803:e740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e780::,2803:e780:ffff:ffff:ffff:ffff:ffff:ffff,PY @@ -17220,6 +17658,7 @@ 2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ee40::,2803:ee40:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:ee80::,2803:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:eec0::,2803:eec0:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:ef00::,2803:ef00:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:ef40::,2803:ef40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ef80::,2803:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17230,6 +17669,7 @@ 2803:f100::,2803:f100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f140::,2803:f140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f180::,2803:f180:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:f1c0::,2803:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:f200::,2803:f200:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f240::,2803:f240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -17247,6 +17687,7 @@ 2803:f600::,2803:f600:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:f640::,2803:f640:ffff:ffff:ffff:ffff:ffff:ffff,BQ 2803:f680::,2803:f680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f6c0::,2803:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f700::,2803:f700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f740::,2803:f740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f780::,2803:f780:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -17273,6 +17714,7 @@ 2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:fe40::,2803:fe40:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:fe80::,2803:fe80:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:fec0::,2803:fec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ff40::,2803:ff40:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:ff80::,2803:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2804::,2804::ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -19213,6 +19655,7 @@ 2804:1f28::,2804:1f28:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f2a::,2804:1f2a:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f2c::,2804:1f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f2e::,2804:1f2e:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:2000::,2804:2000:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:2004::,2804:2004:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:2008::,2804:2008:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -20837,6 +21280,114 @@ 2804:396c::,2804:396c:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:3970::,2804:3970:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:3974::,2804:3974:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3978::,2804:3978:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:397c::,2804:397c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3980::,2804:3980:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3984::,2804:3984:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3988::,2804:3988:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:398c::,2804:398c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3990::,2804:3990:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3994::,2804:3994:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3998::,2804:3998:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:399c::,2804:399c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a0::,2804:39a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a4::,2804:39a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a8::,2804:39a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39ac::,2804:39ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b0::,2804:39b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b4::,2804:39b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b8::,2804:39b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39bc::,2804:39bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c0::,2804:39c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c4::,2804:39c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c8::,2804:39c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39cc::,2804:39cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d0::,2804:39d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d4::,2804:39d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d8::,2804:39d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39dc::,2804:39dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e0::,2804:39e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e4::,2804:39e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e8::,2804:39e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39ec::,2804:39ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f0::,2804:39f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f4::,2804:39f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f8::,2804:39f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39fc::,2804:39fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a00::,2804:3a00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a04::,2804:3a04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a08::,2804:3a08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a0c::,2804:3a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a10::,2804:3a10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a14::,2804:3a14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a18::,2804:3a18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a1c::,2804:3a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a20::,2804:3a20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a24::,2804:3a24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a28::,2804:3a28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a2c::,2804:3a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a30::,2804:3a30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a34::,2804:3a34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a38::,2804:3a38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a3c::,2804:3a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a40::,2804:3a40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a44::,2804:3a44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a48::,2804:3a48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a4c::,2804:3a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a50::,2804:3a50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a54::,2804:3a54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a58::,2804:3a58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a5c::,2804:3a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a60::,2804:3a60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a64::,2804:3a64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a68::,2804:3a68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a6c::,2804:3a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a70::,2804:3a70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a74::,2804:3a74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a78::,2804:3a78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a7c::,2804:3a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a80::,2804:3a80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a84::,2804:3a84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a88::,2804:3a88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a8c::,2804:3a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a90::,2804:3a90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a94::,2804:3a94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a98::,2804:3a98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a9c::,2804:3a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa0::,2804:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa4::,2804:3aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa8::,2804:3aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aac::,2804:3aac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab0::,2804:3ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab4::,2804:3ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab8::,2804:3ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3abc::,2804:3abc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac0::,2804:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac4::,2804:3ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac8::,2804:3ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3acc::,2804:3acc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad0::,2804:3ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad4::,2804:3ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad8::,2804:3ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3adc::,2804:3adc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae0::,2804:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae4::,2804:3ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae8::,2804:3ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aec::,2804:3aec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af0::,2804:3af0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af4::,2804:3af4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af8::,2804:3af8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3afc::,2804:3afc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b00::,2804:3b00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b04::,2804:3b04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b08::,2804:3b08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b0c::,2804:3b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b10::,2804:3b10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b14::,2804:3b14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b18::,2804:3b18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b1c::,2804:3b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b20::,2804:3b20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b24::,2804:3b24:ffff:ffff:ffff:ffff:ffff:ffff,BR 2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:200::,2806:216::ffff:ffff:ffff:ffff:ffff,MX 2806:217::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX @@ -20847,14 +21398,12 @@ 2806:250::,2806:250:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:260::,2806:260:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:270::,2806:270:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:280::,2806:287:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:289::,2806:289:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:290::,2806:290:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:280::,2806:290:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2a0::,2806:2a0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2b0::,2806:2b0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2c0::,2806:2c0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2d0::,2806:2d0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2e0::,2806:2e0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2e0::,2806:2e1:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2f0::,2806:2f0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:300::,2806:300:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:310::,2806:310:ffff:ffff:ffff:ffff:ffff:ffff,MX @@ -21206,7 +21755,6 @@ 2a00:16f8::,2a00:16f8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1700::,2a00:1700:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1708::,2a00:1708:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1710::,2a00:1710:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a00:1718::,2a00:1718:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:1720::,2a00:1720:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1728::,2a00:1728:ffff:ffff:ffff:ffff:ffff:ffff,BG @@ -21297,7 +21845,7 @@ 2a00:1a00::,2a00:1a00:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:1a08::,2a00:1a08:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a00:1a10::,2a00:1a17:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1a18::,2a00:1a18:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1a18::,2a00:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:1a20::,2a00:1a27:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a00:1a28::,2a00:1a28:23ff:ffff:ffff:ffff:ffff:ffff,SE 2a00:1a28:2400::,2a00:1a28:24ff:ffff:ffff:ffff:ffff:ffff,FI @@ -21346,7 +21894,7 @@ 2a00:1b68::,2a00:1b68:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1b70::,2a00:1b70:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a00:1b78::,2a00:1b78:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b80::,2a00:1b80:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:1b80::,2a00:1b87:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a00:1b88::,2a00:1b88:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:1b90::,2a00:1b90:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a00:1b98::,2a00:1b98:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -21359,7 +21907,7 @@ 2a00:1bd0::,2a00:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1bd8::,2a00:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1be0::,2a00:1be0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1be8::,2a00:1be8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1be8::,2a00:1bef:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:1bf0::,2a00:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1bf8::,2a00:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:1c00::,2a00:1c00:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -21375,7 +21923,7 @@ 2a00:1c50::,2a00:1c50:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:1c58::,2a00:1c58:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1c60::,2a00:1c60:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:1c68::,2a00:1c68:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1c68::,2a00:1c68:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1c70::,2a00:1c70:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1c78::,2a00:1c78:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1c80::,2a00:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SI @@ -22062,7 +22610,6 @@ 2a00:8600::,2a00:8600:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:8620::,2a00:8620:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a00:8640::,2a00:8647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8660::,2a00:8660:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:8680::,2a00:8680:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a00:86a0::,2a00:86a0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:86c0::,2a00:86c0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -22153,7 +22700,7 @@ 2a00:91e0::,2a00:91e0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:9200::,2a00:9200:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:9220::,2a00:9220:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:9240::,2a00:9240:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9240::,2a00:9247:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:9260::,2a00:9267:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a00:9280::,2a00:9280:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a00:92a0::,2a00:92a7:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -22204,7 +22751,7 @@ 2a00:97a0::,2a00:97a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:97c0::,2a00:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:97e0::,2a00:97e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:9800::,2a00:9801:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9800::,2a00:9807:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:9820::,2a00:9820:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:9840::,2a00:9840:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:9860::,2a00:9860:ffff:ffff:ffff:ffff:ffff:ffff,HR @@ -22538,6 +23085,7 @@ 2a00:c2a0::,2a00:c2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:c2c0::,2a00:c2c0:fffe:ffff:ffff:ffff:ffff:ffff,NL 2a00:c2c0:ffff::,2a00:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a00:c2c1::,2a00:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:c2e0::,2a00:c2e0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:c300::,2a00:c307:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:c320::,2a00:c320:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -22578,7 +23126,6 @@ 2a00:c780::,2a00:c780:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:c7a0::,2a00:c7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:c7c0::,2a00:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c7e0::,2a00:c7e0:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a00:c800::,2a00:c800:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:c820::,2a00:c820:ffff:ffff:ffff:ffff:ffff:ffff,BY 2a00:c840::,2a00:c840:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -22764,7 +23311,7 @@ 2a00:dea0::,2a00:dea0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:dec0::,2a00:dec0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:dee0::,2a00:dee0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:df00::,2a00:df00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:df00::,2a00:df07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:df20::,2a00:df20:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:df40::,2a00:df40:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:df60::,2a00:df60:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -22814,7 +23361,7 @@ 2a00:e520::,2a00:e520:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:e540::,2a00:e540:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:e560::,2a00:e560:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:e580::,2a00:e580:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:e580::,2a00:e587:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a00:e5a0::,2a00:e5a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:e5c0::,2a00:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a00:e5e0::,2a00:e5e0:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -23068,46 +23615,15 @@ 2a01:111:2000:4::,2a01:111:2000:4:ffff:ffff:ffff:ffff,US 2a01:111:2000:5::,2a01:111:2000:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2001::,2a01:111:2001:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2002::,2a01:111:2004:3:ffff:ffff:ffff:ffff,GB -2a01:111:2004:4::,2a01:111:2004:7:ffff:ffff:ffff:ffff,US -2a01:111:2004:8::,2a01:111:2004:8:ffff:ffff:ffff:ffff,GB -2a01:111:2004:9::,2a01:111:2004:9:ffff:ffff:ffff:ffff,US -2a01:111:2004:a::,2a01:111:2004:b:ffff:ffff:ffff:ffff,GB -2a01:111:2004:c::,2a01:111:2004:d:ffff:ffff:ffff:ffff,US -2a01:111:2004:e::,2a01:111:2005:2:ffff:ffff:ffff:ffff,GB -2a01:111:2005:3::,2a01:111:2005:5:ffff:ffff:ffff:ffff,US -2a01:111:2005:6::,2a01:111:2006::ffff:ffff:ffff:ffff,GB -2a01:111:2006:1::,2a01:111:2006:1:ffff:ffff:ffff:ffff,US -2a01:111:2006:2::,2a01:111:2006:7:ffff:ffff:ffff:ffff,GB -2a01:111:2006:8::,2a01:111:2006:e:ffff:ffff:ffff:ffff,US -2a01:111:2006:f::,2a01:111:2006:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2002::,2a01:111:2003:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2004::,2a01:111:2006:ffff:ffff:ffff:ffff:ffff,US 2a01:111:2007::,2a01:111:2007:ffff:ffff:ffff:ffff:ffff,AU 2a01:111:2008::,2a01:111:2008:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2009::,2a01:111:200b::ffff:ffff:ffff:ffff,GB -2a01:111:200b:1::,2a01:111:200b:9:ffff:ffff:ffff:ffff,US -2a01:111:200b:a::,2a01:111:200c:3:ffff:ffff:ffff:ffff,GB -2a01:111:200c:4::,2a01:111:200c:6:ffff:ffff:ffff:ffff,US -2a01:111:200c:7::,2a01:111:200c:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:200d::,2a01:111:200d::ffff:ffff:ffff:ffff,US -2a01:111:200d:1::,2a01:111:200e:1:ffff:ffff:ffff:ffff,GB -2a01:111:200e:2::,2a01:111:200e:2:ffff:ffff:ffff:ffff,US -2a01:111:200e:3::,2a01:111:200f:2:ffff:ffff:ffff:ffff,GB -2a01:111:200f:3::,2a01:111:200f:3:ffff:ffff:ffff:ffff,US -2a01:111:200f:4::,2a01:111:200f:4:ffff:ffff:ffff:ffff,GB -2a01:111:200f:5::,2a01:111:200f:5:ffff:ffff:ffff:ffff,US -2a01:111:200f:6::,2a01:111:200f:11:ffff:ffff:ffff:ffff,GB -2a01:111:200f:12::,2a01:111:200f:13:ffff:ffff:ffff:ffff,US -2a01:111:200f:14::,2a01:111:2010:3:ffff:ffff:ffff:ffff,GB -2a01:111:2010:4::,2a01:111:2010:5:ffff:ffff:ffff:ffff,US -2a01:111:2010:6::,2a01:111:2011:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2012::,2a01:111:2012:1:ffff:ffff:ffff:ffff,US -2a01:111:2012:2::,2a01:111:2013::ffff:ffff:ffff:ffff,GB -2a01:111:2013:1::,2a01:111:2013:2:ffff:ffff:ffff:ffff,US -2a01:111:2013:3::,2a01:111:2013:4:ffff:ffff:ffff:ffff,GB -2a01:111:2013:5::,2a01:111:2013:7:ffff:ffff:ffff:ffff,US -2a01:111:2013:8::,2a01:111:2013:8:ffff:ffff:ffff:ffff,GB -2a01:111:2013:9::,2a01:111:2013:a:ffff:ffff:ffff:ffff,US -2a01:111:2013:b::,2a01:111:2015:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2009::,2a01:111:2009:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:200a::,2a01:111:2010:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2011::,2a01:111:2011:ffff:ffff:ffff:ffff:ffff,PR +2a01:111:2012::,2a01:111:2013:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2014::,2a01:111:2015:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2016::,2a01:111:2016::ffff:ffff:ffff:ffff,US 2a01:111:2016:1::,2a01:111:2016:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2017::,2a01:111:2017:ffff:ffff:ffff:ffff:ffff,BR @@ -23116,7 +23632,8 @@ 2a01:111:201b::,2a01:111:201c:ffff:ffff:ffff:ffff:ffff,US 2a01:111:201d::,2a01:111:201d:ffff:ffff:ffff:ffff:ffff,HK 2a01:111:201e::,2a01:111:201f:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2020::,2a01:111:2022:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2020::,2a01:111:2020:ffff:ffff:ffff:ffff:ffff,NL +2a01:111:2021::,2a01:111:2022:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2023::,2a01:111:2023::ffff:ffff:ffff:ffff,SE 2a01:111:2023:1::,2a01:111:2025:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2026::,2a01:111:2026:ffff:ffff:ffff:ffff:ffff,IE @@ -23127,19 +23644,15 @@ 2a01:111:202b::,2a01:111:202b:ffff:ffff:ffff:ffff:ffff,IE 2a01:111:202c::,2a01:111:202f:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2030::,2a01:111:2030:ffff:ffff:ffff:ffff:ffff,JP -2a01:111:2031::,2a01:111:2031:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2032::,2a01:111:2032:1:ffff:ffff:ffff:ffff,HK -2a01:111:2032:2::,2a01:111:2032:2:ffff:ffff:ffff:ffff,GB -2a01:111:2032:3::,2a01:111:2032:3:ffff:ffff:ffff:ffff,HK -2a01:111:2032:4::,2a01:111:2032:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2031::,2a01:111:2031:ffff:ffff:ffff:ffff:ffff,SG +2a01:111:2032::,2a01:111:2032:ffff:ffff:ffff:ffff:ffff,HK 2a01:111:2033::,2a01:111:2033:ffff:ffff:ffff:ffff:ffff,IE 2a01:111:2034::,2a01:111:2034:ffff:ffff:ffff:ffff:ffff,AU 2a01:111:2035::,2a01:111:2035:ffff:ffff:ffff:ffff:ffff,SG 2a01:111:2036::,2a01:111:2036:ffff:ffff:ffff:ffff:ffff,JP 2a01:111:2037::,2a01:111:2037:ffff:ffff:ffff:ffff:ffff,NL 2a01:111:2038::,2a01:111:2038:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2039::,2a01:111:2039::ffff:ffff:ffff:ffff,AU -2a01:111:2039:1::,2a01:111:2039:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2039::,2a01:111:2039:ffff:ffff:ffff:ffff:ffff,AU 2a01:111:203a::,2a01:111:203a:ffff:ffff:ffff:ffff:ffff,BR 2a01:111:203b::,2a01:111:203b:ffff:ffff:ffff:ffff:ffff,AT 2a01:111:203c::,2a01:111:203c:ffff:ffff:ffff:ffff:ffff,US @@ -23147,9 +23660,9 @@ 2a01:111:203e::,2a01:111:2040:ffff:ffff:ffff:ffff:ffff,IN 2a01:111:2041::,2a01:111:2041:ffff:ffff:ffff:ffff:ffff,US 2a01:111:2042::,2a01:111:2042:ffff:ffff:ffff:ffff:ffff,FI -2a01:111:2043::,2a01:111:2044:5:ffff:ffff:ffff:ffff,GB -2a01:111:2044:6::,2a01:111:2044:8:ffff:ffff:ffff:ffff,IE -2a01:111:2044:9::,2a01:111:2045:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2043::,2a01:111:2043:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2044::,2a01:111:2044:ffff:ffff:ffff:ffff:ffff,IE +2a01:111:2045::,2a01:111:2045:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2046::,2a01:111:2046:ffff:ffff:ffff:ffff:ffff,JP 2a01:111:2047::,2a01:111:2048:ffff:ffff:ffff:ffff:ffff,CA 2a01:111:2049::,2a01:111:207f:ffff:ffff:ffff:ffff:ffff,GB @@ -23157,26 +23670,12 @@ 2a01:111:2081::,2a01:111:f00f:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f010::,2a01:111:f013:ffff:ffff:ffff:ffff:ffff,US 2a01:111:f014::,2a01:111:f0ff:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f100::,2a01:111:f100:fff:ffff:ffff:ffff:ffff,US -2a01:111:f100:1000::,2a01:111:f100:1004:ffff:ffff:ffff:ffff,GB -2a01:111:f100:1005::,2a01:111:f100:1006:ffff:ffff:ffff:ffff,US -2a01:111:f100:1007::,2a01:111:f100:1007:ffff:ffff:ffff:ffff,GB -2a01:111:f100:1008::,2a01:111:f100:1008:ffff:ffff:ffff:ffff,US -2a01:111:f100:1009::,2a01:111:f100:2000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:2001::,2a01:111:f100:2001:ffff:ffff:ffff:ffff,US -2a01:111:f100:2002::,2a01:111:f100:4002:ffff:ffff:ffff:ffff,GB -2a01:111:f100:4003::,2a01:111:f100:4003:ffff:ffff:ffff:ffff,US -2a01:111:f100:4004::,2a01:111:f100:6000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:6001::,2a01:111:f100:6002:ffff:ffff:ffff:ffff,HK -2a01:111:f100:6003::,2a01:111:f100:7000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:7001::,2a01:111:f100:7001:ffff:ffff:ffff:ffff,SG -2a01:111:f100:7002::,2a01:111:f100:8000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:8001::,2a01:111:f100:8002:ffff:ffff:ffff:ffff,NL -2a01:111:f100:8003::,2a01:111:f100:8fff:ffff:ffff:ffff:ffff,GB -2a01:111:f100:9000::,2a01:111:f100:9fff:ffff:ffff:ffff:ffff,NL -2a01:111:f100:a000::,2a01:111:f100:a001:ffff:ffff:ffff:ffff,GB -2a01:111:f100:a002::,2a01:111:f100:a003:ffff:ffff:ffff:ffff,IE -2a01:111:f100:a004::,2a01:111:f100:afff:ffff:ffff:ffff:ffff,GB +2a01:111:f100::,2a01:111:f100:4fff:ffff:ffff:ffff:ffff,US +2a01:111:f100:5000::,2a01:111:f100:5fff:ffff:ffff:ffff:ffff,GB +2a01:111:f100:6000::,2a01:111:f100:6fff:ffff:ffff:ffff:ffff,HK +2a01:111:f100:7000::,2a01:111:f100:7fff:ffff:ffff:ffff:ffff,SG +2a01:111:f100:8000::,2a01:111:f100:9fff:ffff:ffff:ffff:ffff,NL +2a01:111:f100:a000::,2a01:111:f100:afff:ffff:ffff:ffff:ffff,IE 2a01:111:f100:b000::,2a01:111:f100:bfff:ffff:ffff:ffff:ffff,US 2a01:111:f100:c000::,2a01:111:f100:cfff:ffff:ffff:ffff:ffff,IE 2a01:111:f100:d000::,2a01:111:f100:dfff:ffff:ffff:ffff:ffff,US @@ -23209,7 +23708,9 @@ 2a01:111:f330:1795::,2a01:111:f330:17cf:ffff:ffff:ffff:ffff,GB 2a01:111:f330:17d0::,2a01:111:f330:17d0:ffff:ffff:ffff:ffff,US 2a01:111:f330:17d1::,2a01:111:f3ff:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f400::,2a01:111:f400:5c:ffff:ffff:ffff:ffff,US +2a01:111:f400::,2a01:111:f400:29:ffff:ffff:ffff:ffff,US +2a01:111:f400:2a::,2a01:111:f400:3d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:3e::,2a01:111:f400:5c:ffff:ffff:ffff:ffff,US 2a01:111:f400:5d::,2a01:111:f400:3ff:ffff:ffff:ffff:ffff,GB 2a01:111:f400:400::,2a01:111:f400:1bff:ffff:ffff:ffff:ffff,US 2a01:111:f400:1c00::,2a01:111:f400:1c07:ffff:ffff:ffff:ffff,HK @@ -23218,7 +23719,9 @@ 2a01:111:f400:1c20::,2a01:111:f400:1c27:ffff:ffff:ffff:ffff,BR 2a01:111:f400:1c28::,2a01:111:f400:23ff:ffff:ffff:ffff:ffff,GB 2a01:111:f400:2400::,2a01:111:f400:2413:ffff:ffff:ffff:ffff,IE -2a01:111:f400:2414::,2a01:111:f400:2491:ffff:ffff:ffff:ffff,US +2a01:111:f400:2414::,2a01:111:f400:247f:ffff:ffff:ffff:ffff,US +2a01:111:f400:2480::,2a01:111:f400:2490:ffff:ffff:ffff:ffff,GB +2a01:111:f400:2491::,2a01:111:f400:2491:ffff:ffff:ffff:ffff,US 2a01:111:f400:2492::,2a01:111:f400:27ff:ffff:ffff:ffff:ffff,GB 2a01:111:f400:2800::,2a01:111:f400:2c00:ffff:ffff:ffff:ffff,US 2a01:111:f400:2c01::,2a01:111:f400:2c02:ffff:ffff:ffff:ffff,GB @@ -23261,7 +23764,9 @@ 2a01:111:f400:508e::,2a01:111:f400:508e:ffff:ffff:ffff:ffff,AT 2a01:111:f400:508f::,2a01:111:f400:5093:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5094::,2a01:111:f400:5095:ffff:ffff:ffff:ffff,AT -2a01:111:f400:5096::,2a01:111:f400:50a9:ffff:ffff:ffff:ffff,FI +2a01:111:f400:5096::,2a01:111:f400:5098:ffff:ffff:ffff:ffff,FI +2a01:111:f400:5099::,2a01:111:f400:5099:ffff:ffff:ffff:ffff,GB +2a01:111:f400:509a::,2a01:111:f400:50a9:ffff:ffff:ffff:ffff,FI 2a01:111:f400:50aa::,2a01:111:f400:50e6:ffff:ffff:ffff:ffff,GB 2a01:111:f400:50e7::,2a01:111:f400:50f7:ffff:ffff:ffff:ffff,US 2a01:111:f400:50f8::,2a01:111:f400:5101:ffff:ffff:ffff:ffff,GB @@ -23271,14 +23776,18 @@ 2a01:111:f400:510e::,2a01:111:f400:5115:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5116::,2a01:111:f400:511e:ffff:ffff:ffff:ffff,US 2a01:111:f400:511f::,2a01:111:f400:513d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:513e::,2a01:111:f400:514b:ffff:ffff:ffff:ffff,IE +2a01:111:f400:513e::,2a01:111:f400:5140:ffff:ffff:ffff:ffff,IE +2a01:111:f400:5141::,2a01:111:f400:5141:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5142::,2a01:111:f400:514b:ffff:ffff:ffff:ffff,IE 2a01:111:f400:514c::,2a01:111:f400:514c:ffff:ffff:ffff:ffff,GB 2a01:111:f400:514d::,2a01:111:f400:514e:ffff:ffff:ffff:ffff,IE 2a01:111:f400:514f::,2a01:111:f400:5175:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5176::,2a01:111:f400:5176:ffff:ffff:ffff:ffff,IE 2a01:111:f400:5177::,2a01:111:f400:517f:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5180::,2a01:111:f400:518a:ffff:ffff:ffff:ffff,AU -2a01:111:f400:518b::,2a01:111:f400:5199:ffff:ffff:ffff:ffff,US +2a01:111:f400:518b::,2a01:111:f400:518c:ffff:ffff:ffff:ffff,US +2a01:111:f400:518d::,2a01:111:f400:518d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:518e::,2a01:111:f400:5199:ffff:ffff:ffff:ffff,US 2a01:111:f400:519a::,2a01:111:f400:51ad:ffff:ffff:ffff:ffff,GB 2a01:111:f400:51ae::,2a01:111:f400:51bf:ffff:ffff:ffff:ffff,US 2a01:111:f400:51c0::,2a01:111:f400:5236:ffff:ffff:ffff:ffff,GB @@ -23355,7 +23864,7 @@ 2a01:111:f400:609a::,2a01:111:f400:60a5:ffff:ffff:ffff:ffff,GB 2a01:111:f400:60a6::,2a01:111:f400:60a6:ffff:ffff:ffff:ffff,BR 2a01:111:f400:60a7::,2a01:111:f400:60a8:ffff:ffff:ffff:ffff,CA -2a01:111:f400:60a9::,2a01:111:f400:60a9:ffff:ffff:ffff:ffff,US +2a01:111:f400:60a9::,2a01:111:f400:60a9:ffff:ffff:ffff:ffff,GB 2a01:111:f400:60aa::,2a01:111:f400:60ab:ffff:ffff:ffff:ffff,DE 2a01:111:f400:60ac::,2a01:111:f400:60ac:ffff:ffff:ffff:ffff,US 2a01:111:f400:60ad::,2a01:111:f400:60ad:ffff:ffff:ffff:ffff,CA @@ -23375,7 +23884,9 @@ 2a01:111:f400:708a::,2a01:111:f400:708a:ffff:ffff:ffff:ffff,GB 2a01:111:f400:708b::,2a01:111:f400:7091:ffff:ffff:ffff:ffff,US 2a01:111:f400:7092::,2a01:111:f400:70b1:ffff:ffff:ffff:ffff,GB -2a01:111:f400:70b2::,2a01:111:f400:70d1:ffff:ffff:ffff:ffff,HK +2a01:111:f400:70b2::,2a01:111:f400:70b5:ffff:ffff:ffff:ffff,HK +2a01:111:f400:70b6::,2a01:111:f400:70b6:ffff:ffff:ffff:ffff,GB +2a01:111:f400:70b7::,2a01:111:f400:70d1:ffff:ffff:ffff:ffff,HK 2a01:111:f400:70d2::,2a01:111:f400:70e6:ffff:ffff:ffff:ffff,GB 2a01:111:f400:70e7::,2a01:111:f400:7116:ffff:ffff:ffff:ffff,IE 2a01:111:f400:7117::,2a01:111:f400:73ff:ffff:ffff:ffff:ffff,GB @@ -23396,7 +23907,13 @@ 2a01:111:f400:7e08::,2a01:111:f400:7e08:ffff:ffff:ffff:ffff,NL 2a01:111:f400:7e09::,2a01:111:f400:7e09:ffff:ffff:ffff:ffff,AT 2a01:111:f400:7e0a::,2a01:111:f400:7e0a:ffff:ffff:ffff:ffff,IE -2a01:111:f400:7e0b::,2a01:111:f400:7e40:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e0b::,2a01:111:f400:7e0b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e0c::,2a01:111:f400:7e0c:ffff:ffff:ffff:ffff,IE +2a01:111:f400:7e0d::,2a01:111:f400:7e0d:ffff:ffff:ffff:ffff,FI +2a01:111:f400:7e0e::,2a01:111:f400:7e0e:ffff:ffff:ffff:ffff,AT +2a01:111:f400:7e0f::,2a01:111:f400:7e1d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e1e::,2a01:111:f400:7e1e:ffff:ffff:ffff:ffff,NL +2a01:111:f400:7e1f::,2a01:111:f400:7e40:ffff:ffff:ffff:ffff,GB 2a01:111:f400:7e41::,2a01:111:f400:7e41:ffff:ffff:ffff:ffff,US 2a01:111:f400:7e42::,2a01:111:f400:7e44:ffff:ffff:ffff:ffff,GB 2a01:111:f400:7e45::,2a01:111:f400:7e45:ffff:ffff:ffff:ffff,US @@ -23668,7 +24185,13 @@ 2a01:111:f400:ff8d::,2a01:111:f400:ff8d:ffff:ffff:ffff:ffff,GB 2a01:111:f400:ff8e::,2a01:111:f400:ff8e:ffff:ffff:ffff:ffff,HK 2a01:111:f400:ff8f::,2a01:111:f400:ff8f:ffff:ffff:ffff:ffff,SG -2a01:111:f400:ff90::,2a01:111:f400:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff90::,2a01:111:f400:ffc2:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffc3::,2a01:111:f400:ffc3:ffff:ffff:ffff:ffff,IE +2a01:111:f400:ffc4::,2a01:111:f400:ffcb:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffcc::,2a01:111:f400:ffcc:ffff:ffff:ffff:ffff,FI +2a01:111:f400:ffcd::,2a01:111:f400:ffe7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffe8::,2a01:111:f400:ffe9:ffff:ffff:ffff:ffff,US +2a01:111:f400:ffea::,2a01:111:f400:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f401::,2a01:111:f401::ffff:ffff:ffff:ffff,US 2a01:111:f401:1::,2a01:111:f401:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f402::,2a01:111:f402:7ff:ffff:ffff:ffff:ffff,US @@ -23698,8 +24221,8 @@ 2a01:111:f402:5c00::,2a01:111:f402:5fff:ffff:ffff:ffff:ffff,AU 2a01:111:f402:6000::,2a01:111:f402:6fff:ffff:ffff:ffff:ffff,GB 2a01:111:f402:7000::,2a01:111:f402:73ff:ffff:ffff:ffff:ffff,AU -2a01:111:f402:7400::,2a01:111:f402:87ff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:8800::,2a01:111:f402:8bff:ffff:ffff:ffff:ffff,NL +2a01:111:f402:7400::,2a01:111:f402:83ff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:8400::,2a01:111:f402:8bff:ffff:ffff:ffff:ffff,NL 2a01:111:f402:8c00::,2a01:111:f402:93ff:ffff:ffff:ffff:ffff,GB 2a01:111:f402:9400::,2a01:111:f402:97ff:ffff:ffff:ffff:ffff,IE 2a01:111:f402:9800::,2a01:111:f402:9bff:ffff:ffff:ffff:ffff,GB @@ -23765,7 +24288,7 @@ 2a01:111:f406:b800::,2a01:111:f4ff:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f500::,2a01:111:f5ff:ffff:ffff:ffff:ffff:ffff,US 2a01:111:f600::,2a01:111:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:120::,2a01:120:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:120::,2a01:127:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:130::,2a01:138:a01c:ffff:ffff:ffff:ffff:ffff,DE 2a01:138:a01d::,2a01:138:a01d:ffff:ffff:ffff:ffff:ffff,CH 2a01:138:a01e::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -23851,6 +24374,7 @@ 2a01:3e0:402::,2a01:3e0:403:ffff:ffff:ffff:ffff:ffff,FR 2a01:3e0:501::,2a01:3e0:501:ffff:ffff:ffff:ffff:ffff,RU 2a01:3e0:502::,2a01:3e0:502:ffff:ffff:ffff:ffff:ffff,DE +2a01:3e0:701::,2a01:3e0:701:ffff:ffff:ffff:ffff:ffff,GB 2a01:3e0:801::,2a01:3e0:801:ffff:ffff:ffff:ffff:ffff,FR 2a01:3e0:d01::,2a01:3e0:d02:ffff:ffff:ffff:ffff:ffff,GB 2a01:3e0:1101::,2a01:3e0:1101:ffff:ffff:ffff:ffff:ffff,NL @@ -23867,7 +24391,9 @@ 2a01:3e0:3300::,2a01:3e0:3300:ff:ffff:ffff:ffff:ffff,BG 2a01:3e0:3400::,2a01:3e0:3400:ff:ffff:ffff:ffff:ffff,HU 2a01:3e0:3500::,2a01:3e0:3500:ff:ffff:ffff:ffff:ffff,LU -2a01:3e0:ff24::,2a01:3e0:ff24:ffff:ffff:ffff:ffff:ffff,DE +2a01:3e0:3600::,2a01:3e0:3600:1ff:ffff:ffff:ffff:ffff,SA +2a01:3e0:3700::,2a01:3e0:3700:ff:ffff:ffff:ffff:ffff,SA +2a01:3e0:ff24::,2a01:3e0:ff25:ffff:ffff:ffff:ffff:ffff,DE 2a01:3e8::,2a01:3e8:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:3f0::,2a01:3f7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:3f8::,2a01:3f8:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -24652,7 +25178,7 @@ 2a01:9060::,2a01:9060:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:9080::,2a01:9080:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:90a0::,2a01:90a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:90c0::,2a01:90c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:90c0::,2a01:90c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:90e0::,2a01:90e0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a01:9100::,2a01:9107:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a01:9120::,2a01:9120:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -24665,7 +25191,7 @@ 2a01:9200::,2a01:9200:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:9220::,2a01:9220:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:9240::,2a01:9240:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a01:9260::,2a01:9260:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:9260::,2a01:9260:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:9280::,2a01:9280:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:92a0::,2a01:92a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a01:92c0::,2a01:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -24793,7 +25319,7 @@ 2a01:a220::,2a01:a220:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:a240::,2a01:a240:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a01:a260::,2a01:a260:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:a280::,2a01:a280:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:a280::,2a01:a283:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:a2a0::,2a01:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:a2c0::,2a01:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:a2e0::,2a01:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -25093,7 +25619,7 @@ 2a02:1e0::,2a02:1e8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:1f0::,2a02:1f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:1f8::,2a02:1f8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:200::,2a02:200:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:200::,2a02:207:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:208::,2a02:208:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:210::,2a02:210:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:218::,2a02:21f:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -25172,7 +25698,7 @@ 2a02:480::,2a02:480:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a02:488::,2a02:488:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:490::,2a02:490:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:498::,2a02:498:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:498::,2a02:49f:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:4a0::,2a02:4a0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:4a8::,2a02:4a8:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:4b0::,2a02:4b0:ffff:ffff:ffff:ffff:ffff:ffff,BE @@ -25242,7 +25768,7 @@ 2a02:6e0::,2a02:6e0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:6e8::,2a02:6e8:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:6f0::,2a02:6f0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6f8::,2a02:6f8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:6f8::,2a02:6f8:ffff:ffff:ffff:ffff:ffff:ffff,CY 2a02:700::,2a02:700:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:708::,2a02:708:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:710::,2a02:710:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -25333,7 +25859,7 @@ 2a02:9b0::,2a02:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a02:9b8::,2a02:9b9:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:9c0::,2a02:9c0:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:9c8::,2a02:9c8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:9c8::,2a02:9cf:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:9d0::,2a02:9d0:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a02:9d8::,2a02:9d8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:9e0::,2a02:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -25343,7 +25869,8 @@ 2a02:a00::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:a08::,2a02:a08:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:a10::,2a02:a10::ffff:ffff:ffff:ffff:ffff,US -2a02:a10:1::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:a10:1::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:a11::,2a02:a17:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:a18::,2a02:a18:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:a20::,2a02:a20:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:a28::,2a02:a28:ffff:ffff:ffff:ffff:ffff:ffff,CZ @@ -25449,7 +25976,7 @@ 2a02:d78::,2a02:d78:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d80::,2a02:d80:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a02:d88::,2a02:d88:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:d90::,2a02:d90:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:d90::,2a02:d97:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a02:d98::,2a02:d98:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:da8::,2a02:da8:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:db0::,2a02:db0:ffff:ffff:ffff:ffff:ffff:ffff,UA @@ -25500,7 +26027,7 @@ 2a02:f30::,2a02:f30:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:f38::,2a02:f38:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:f40::,2a02:f40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:f48::,2a02:f48:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:f48::,2a02:f4f:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a02:f50::,2a02:f50:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a02:f58::,2a02:f58:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:f60::,2a02:f60:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -25555,7 +26082,7 @@ 2a02:13e0::,2a02:13e0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:13e8::,2a02:13e8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:13f0::,2a02:13f0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:13f8::,2a02:13f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:13f8::,2a02:13ff:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:1400::,2a02:143f:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:1600::,2a02:1600:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a02:1608::,2a02:1608:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -25790,7 +26317,7 @@ 2a02:2568::,2a02:2568:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:2578::,2a02:2578:ffff:ffff:ffff:ffff:ffff:ffff,BH 2a02:2580::,2a02:2587:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2588::,2a02:2588:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2588::,2a02:258f:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2590::,2a02:2590:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a02:25a0::,2a02:25a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:25a8::,2a02:25af:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -25810,7 +26337,7 @@ 2a02:2618::,2a02:2618:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:2620::,2a02:2620:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:2628::,2a02:2628:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:2630::,2a02:2630:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:2630::,2a02:2637:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a02:2638::,2a02:2638:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:2640::,2a02:2647:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:2648::,2a02:2648:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -25877,7 +26404,9 @@ 2a02:2808:3001::,2a02:2808:3001:ffff:ffff:ffff:ffff:ffff,RU 2a02:2808:3002::,2a02:2808:5300:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2808:5301::,2a02:2808:5301:ffff:ffff:ffff:ffff:ffff,RU -2a02:2808:5302::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:5302::,2a02:2808:5400:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:5401::,2a02:2808:5401:ffff:ffff:ffff:ffff:ffff,FI +2a02:2808:5402::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2810::,2a02:2810:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a02:2818::,2a02:2818:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a02:2820::,2a02:2820:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -25927,7 +26456,11 @@ 2a02:2990::,2a02:2990:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:2998::,2a02:2998:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:29a0::,2a02:29a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:29a8::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8::,2a02:29a8:3ff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8:400::,2a02:29a8:4ff:ffff:ffff:ffff:ffff:ffff,SG +2a02:29a8:500::,2a02:29a8:7ff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8:800::,2a02:29a8:8ff:ffff:ffff:ffff:ffff:ffff,US +2a02:29a8:900::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:29b8::,2a02:29b8:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:29c0::,2a02:29c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:29c8::,2a02:29c8:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -26453,7 +26986,7 @@ 2a02:76c0::,2a02:76c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:76e0::,2a02:76e0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:7700::,2a02:7700:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7720::,2a02:7720:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7720::,2a02:7727:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:7740::,2a02:7740:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a02:7760::,2a02:7760:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:7780::,2a02:7780:ffff:ffff:ffff:ffff:ffff:ffff,CY @@ -26671,7 +27204,7 @@ 2a02:d600::,2a02:d607:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d640::,2a02:d647:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:d680::,2a02:d683:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:d6a0::,2a02:d6a3:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d6a0::,2a02:d6a7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d6c0::,2a02:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a02:d700::,2a02:d707:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d740::,2a02:d747:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -26818,7 +27351,6 @@ 2a02:f8c0::,2a02:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:f900::,2a02:f907:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a02:f940::,2a02:f947:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:f980::,2a02:f987:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:f9c0::,2a02:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:fa00::,2a02:fa07:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a02:fa40::,2a02:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR @@ -27400,7 +27932,6 @@ 2a03:4480::,2a03:4480:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a03:44a0::,2a03:44a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:44c0::,2a03:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:44e0::,2a03:44e0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:4500::,2a03:4500:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4520::,2a03:4520:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:4540::,2a03:4540:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -27421,7 +27952,7 @@ 2a03:4720::,2a03:4720:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:4740::,2a03:4740:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4760::,2a03:4760:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:4780::,2a03:4780:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:4780::,2a03:4787:ffff:ffff:ffff:ffff:ffff:ffff,KW 2a03:47a0::,2a03:47a0:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a03:47c0::,2a03:47c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a03:4800::,2a03:4800:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -27469,6 +28000,7 @@ 2a03:4a80:b::,2a03:4a80:b:ffff:ffff:ffff:ffff:ffff,AE 2a03:4a80:c::,2a03:4a80:fffe:ffff:ffff:ffff:ffff:ffff,NL 2a03:4a80:ffff::,2a03:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:4a81::,2a03:4a87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4aa0::,2a03:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4ac0::,2a03:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a03:4ae0::,2a03:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -27545,7 +28077,7 @@ 2a03:53e0::,2a03:53e0:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:5400::,2a03:5400:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:5420::,2a03:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5440::,2a03:5440:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:5440::,2a03:5447:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:5460::,2a03:5460:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:5480::,2a03:5480:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a03:54a0::,2a03:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IR @@ -27640,7 +28172,7 @@ 2a03:6060::,2a03:6060:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:6080::,2a03:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:60c0::,2a03:60c0::ffff:ffff:ffff:ffff:ffff,US -2a03:60c0:1::,2a03:60c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:60c0:1::,2a03:60c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:60e0::,2a03:60e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6100::,2a03:6100:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:6120::,2a03:6120:ffff:ffff:ffff:ffff:ffff:ffff,UA @@ -27654,7 +28186,7 @@ 2a03:6220::,2a03:6220:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:6240::,2a03:6240:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:6260::,2a03:6260:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6280::,2a03:6280:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6280::,2a03:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:62a0::,2a03:62a0:3500:ffff:ffff:ffff:ffff:ffff,AU 2a03:62a0:3501::,2a03:62a0:3501:7fff:ffff:ffff:ffff:ffff,FI 2a03:62a0:3501:8000::,2a03:62a0:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -27819,7 +28351,7 @@ 2a03:7720::,2a03:7720:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:7740::,2a03:7740:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a03:7760::,2a03:7760:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:7780::,2a03:7780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:7780::,2a03:7787:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:77a0::,2a03:77a0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:77c0::,2a03:77c0:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a03:77e0::,2a03:77e0:4401:1098::63,GB @@ -28027,7 +28559,25 @@ 2a03:9060::,2a03:9060:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:9080::,2a03:9080:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:90a0::,2a03:90a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:90c0::,2a03:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0::,2a03:90c0:f:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0:10::,2a03:90c0:1f:ffff:ffff:ffff:ffff:ffff,NL +2a03:90c0:20::,2a03:90c0:3f:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:40::,2a03:90c0:4f:ffff:ffff:ffff:ffff:ffff,DE +2a03:90c0:50::,2a03:90c0:5f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:60::,2a03:90c0:6f:ffff:ffff:ffff:ffff:ffff,SG +2a03:90c0:70::,2a03:90c0:7f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:80::,2a03:90c0:8f:ffff:ffff:ffff:ffff:ffff,LU +2a03:90c0:90::,2a03:90c0:9f:ffff:ffff:ffff:ffff:ffff,CY +2a03:90c0:a0::,2a03:90c0:bf:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:c0::,2a03:90c0:cf:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:d0::,2a03:90c0:df:ffff:ffff:ffff:ffff:ffff,PL +2a03:90c0:e0::,2a03:90c0:998f:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0:9990::,2a03:90c0:9994:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:9995::,2a03:90c0:9995:ffff:ffff:ffff:ffff:ffff,SG +2a03:90c0:9996::,2a03:90c0:9996:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:9997::,2a03:90c0:9997:ffff:ffff:ffff:ffff:ffff,DE +2a03:90c0:9998::,2a03:90c0:999f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:99a0::,2a03:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:90e0::,2a03:90e0:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a03:9100::,2a03:9100:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:9120::,2a03:9120:ffff:ffff:ffff:ffff:ffff:ffff,BY @@ -28311,7 +28861,7 @@ 2a03:ad20::,2a03:ad27:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:ad40::,2a03:ad40:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:ad60::,2a03:ad60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ad80::,2a03:ad80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:ad80::,2a03:ad87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:ada0::,2a03:ada0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:adc0::,2a03:adc0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:ade0::,2a03:ade0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -28354,6 +28904,7 @@ 2a03:b300::,2a03:b300:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:b340::,2a03:b340:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:b380::,2a03:b380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:b3c0::,2a03:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:b400::,2a03:b400:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:b440::,2a03:b440:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:b480::,2a03:b480:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -28362,7 +28913,7 @@ 2a03:b540::,2a03:b540:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a03:b580::,2a03:b580:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:b5c0::,2a03:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b600::,2a03:b600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600::,2a03:b607:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:b640::,2a03:b640:ffff:ffff:ffff:ffff:ffff:ffff,JO 2a03:b680::,2a03:b680:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:b6c0::,2a03:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -28427,7 +28978,7 @@ 2a03:c5c0::,2a03:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a03:c600::,2a03:c600:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:c640::,2a03:c640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:c680::,2a03:c680:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:c680::,2a03:c687:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:c6c0::,2a03:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:c700::,2a03:c700:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:c740::,2a03:c740:ffff:ffff:ffff:ffff:ffff:ffff,BY @@ -28872,7 +29423,9 @@ 2a04:3480::,2a04:3487:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:34c0::,2a04:34c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:3500::,2a04:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:3540::,2a04:3547:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:3540::,2a04:3542:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:3543::,2a04:3543:ffff:ffff:ffff:ffff:ffff:ffff,SG +2a04:3544::,2a04:3547:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a04:3580::,2a04:3587:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a04:35c0::,2a04:35c7:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a04:3600::,2a04:3607:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -29089,7 +29642,7 @@ 2a04:6a00::,2a04:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:6a40::,2a04:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:6a80::,2a04:6a87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:6ac0::,2a04:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:6ac0::,2a04:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a04:6b00::,2a04:6b07:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a04:6b40::,2a04:6b47:ffff:ffff:ffff:ffff:ffff:ffff,GG 2a04:6b80::,2a04:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -29414,7 +29967,6 @@ 2a04:ba40::,2a04:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:ba80::,2a04:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:bac0::,2a04:bac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:bb00::,2a04:bb07:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a04:bb40::,2a04:bb47:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:bb80::,2a04:bb87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:bbc0::,2a04:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -29488,7 +30040,6 @@ 2a04:c9c0::,2a04:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:ca00::,2a04:ca07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:ca40::,2a04:ca47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:ca80::,2a04:ca87:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:cac0::,2a04:cac7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:cb00::,2a04:cb07:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:cb40::,2a04:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -30601,7 +31152,9 @@ 2a05:dfc0:1ee4::,2a05:dfc0:1ee4:ffff:ffff:ffff:ffff:ffff,CA 2a05:dfc0:1ee5::,2a05:dfc0:6938:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc0:6939::,2a05:dfc0:6939:ffff:ffff:ffff:ffff:ffff,NL -2a05:dfc0:693a::,2a05:dfc7:7:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc0:693a::,2a05:dfc7:4:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:5::,2a05:dfc7:5:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:6::,2a05:dfc7:7:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc7:8::,2a05:dfc7:8:7fff:ffff:ffff:ffff:ffff,SG 2a05:dfc7:8:8000::,2a05:dfc7:8:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc7:9::,2a05:dfc7:9:7fff:ffff:ffff:ffff:ffff,SG @@ -30614,7 +31167,14 @@ 2a05:dfc7:30::,2a05:dfc7:30:ffff:ffff:ffff:ffff:ffff,US 2a05:dfc7:31::,2a05:dfc7:3f:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc7:40::,2a05:dfc7:40:ffff:ffff:ffff:ffff:ffff,BY -2a05:dfc7:41::,2a05:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:41::,2a05:dfc7:5352:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:5353::,2a05:dfc7:5353:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:5354::,2a05:dfc7:beee:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:beef::,2a05:dfc7:beef:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:bef0::,2a05:dfc7:dfc6:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:dfc7::,2a05:dfc7:dfc7:ffff:ffff:ffff:ffff:ffff,UA +2a05:dfc7:dfc8::,2a05:dfc7:dfc8:ffff:ffff:ffff:ffff:ffff,US +2a05:dfc7:dfc9::,2a05:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a05:e000::,2a05:e007:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a05:e040::,2a05:e047:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a05:e080::,2a05:e087:ffff:ffff:ffff:ffff:ffff:ffff,IE @@ -31708,7 +32268,11 @@ 2a06:e881:200::,2a06:e881:2ff:ffff:ffff:ffff:ffff:ffff,AT 2a06:e881:300::,2a06:e881:14ff:ffff:ffff:ffff:ffff:ffff,CH 2a06:e881:1500::,2a06:e881:150f:ffff:ffff:ffff:ffff:ffff,GB -2a06:e881:1510::,2a06:e887:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:1510::,2a06:e881:1fff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:2000::,2a06:e881:200f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:2010::,2a06:e881:20ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:2100::,2a06:e881:210f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:2110::,2a06:e887:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a06:e8c0::,2a06:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a06:e900::,2a06:e907:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a06:e940::,2a06:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -32105,8 +32669,8 @@ 2a07:4b80::,2a07:4b87:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a07:4bc0::,2a07:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a07:4c00::,2a07:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:4c40::,2a07:4c47:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:4c80::,2a07:4c87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:4c40::,2a07:4c47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:4c80::,2a07:4c87:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:4cc0::,2a07:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a07:4d00::,2a07:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:4d40::,2a07:4d47:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -32183,7 +32747,7 @@ 2a07:5f00::,2a07:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a07:5f40::,2a07:5f47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a07:5f80::,2a07:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5fc0::,2a07:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:5fc0::,2a07:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:6000::,2a07:6007:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a07:6040::,2a07:6047:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a07:6080::,2a07:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -32217,7 +32781,7 @@ 2a07:6780::,2a07:6787:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a07:67c0::,2a07:67c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a07:6800::,2a07:6807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6840::,2a07:6847:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:6840::,2a07:6847:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:6880::,2a07:6887:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a07:68c0::,2a07:68c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:6900::,2a07:6907:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -32245,7 +32809,7 @@ 2a07:6e80::,2a07:6e87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:6ec0::,2a07:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a07:6f00::,2a07:6f07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:6f40::,2a07:6f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6f40::,2a07:6f47:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:6f80::,2a07:6f87:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a07:6fc0::,2a07:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:7000::,2a07:7007:ffff:ffff:ffff:ffff:ffff:ffff,TR @@ -32275,7 +32839,7 @@ 2a07:7600::,2a07:7607:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:7640::,2a07:7647:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a07:7680::,2a07:7687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:76c0::,2a07:76c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:76c0::,2a07:76c7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:7700::,2a07:7707:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:7740::,2a07:7747:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a07:7780::,2a07:7787:ffff:ffff:ffff:ffff:ffff:ffff,UA @@ -32435,7 +32999,7 @@ 2a07:9c00::,2a07:9c07:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a07:9c40::,2a07:9c47:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:9c80::,2a07:9c87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:9cc0::,2a07:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a07:9cc0::,2a07:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:9d00::,2a07:9d07:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a07:9d40::,2a07:9d47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a07:9d80::,2a07:9d87:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -32608,7 +33172,7 @@ 2a07:c740::,2a07:c747:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:c780::,2a07:c787:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:c7c0::,2a07:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a07:c800::,2a07:c807:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:c800::,2a07:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:c840::,2a07:c847:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a07:c880::,2a07:c887:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a07:c8c0::,2a07:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,RO @@ -32624,256 +33188,503 @@ 2a07:cb40::,2a07:cb47:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a08::,2a08:1fff:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a::,2a0a:7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:40::,2a0a:47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:80::,2a0a:87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:c0::,2a0a:c7:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:100::,2a0a:107:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:140::,2a0a:147:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:180::,2a0a:187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1c0::,2a0a:1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:200::,2a0a:200:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:240::,2a0a:247:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:280::,2a0a:287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2c0::,2a0a:2c0:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:300::,2a0a:307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:340::,2a0a:347:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:380::,2a0a:387:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:3c0::,2a0a:3c0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:400::,2a0a:400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:440::,2a0a:447:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:480::,2a0a:487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:4c0::,2a0a:4c0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:500::,2a0a:507:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:540::,2a0a:547:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:580::,2a0a:580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:5c0::,2a0a:5c7:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:600::,2a0a:607:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:640::,2a0a:647:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:680::,2a0a:687:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:6c0::,2a0a:6c7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:700::,2a0a:707:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:740::,2a0a:747:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:780::,2a0a:780:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7c0::,2a0a:7c7:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:800::,2a0a:807:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:840::,2a0a:847:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:880::,2a0a:880:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8c0::,2a0a:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:900::,2a0a:907:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:940::,2a0a:947:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:980::,2a0a:987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:9c0::,2a0a:9c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:a00::,2a0a:a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a40::,2a0a:a43:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:a80::,2a0a:a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ac0::,2a0a:ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a0a:b00::,2a0a:b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:b40::,2a0a:b47:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:b80::,2a0a:b87:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:bc0::,2a0a:bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:c00::,2a0a:c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c40::,2a0a:c47:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:c80::,2a0a:c87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:cc0::,2a0a:cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:d00::,2a0a:d07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:d40::,2a0a:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:d80::,2a0a:d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:dc0::,2a0a:dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:e00::,2a0a:e07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e40::,2a0a:e47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:e80::,2a0a:e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:ec0::,2a0a:ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:f00::,2a0a:f07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f40::,2a0a:f40:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a0a:f80::,2a0a:f87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:fc0::,2a0a:fc7:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a0a:1000::,2a0a:1007:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:1040::,2a0a:1047:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:10c0::,2a0a:10c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:1100::,2a0a:1107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1140::,2a0a:1147:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1180::,2a0a:1187:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:11c0::,2a0a:11c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:1200::,2a0a:1207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1240::,2a0a:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1280::,2a0a:1287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:12c0::,2a0a:12c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1300::,2a0a:1307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1340::,2a0a:1347:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a0a:1380::,2a0a:1387:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:13c0::,2a0a:13c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1400::,2a0a:1407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1440::,2a0a:1447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1480::,2a0a:1487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:14c0::,2a0a:14c0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:1500::,2a0a:1507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1540::,2a0a:1547:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:1580::,2a0a:1587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:15c0::,2a0a:15c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:1600::,2a0a:1607:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:1640::,2a0a:1647:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1680::,2a0a:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:16c0::,2a0a:16c0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:1700::,2a0a:1707:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:1740::,2a0a:1747:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:1780::,2a0a:1787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:17c0::,2a0a:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:1800::,2a0a:1800:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1840::,2a0a:1847:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1880::,2a0a:1887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:18c0::,2a0a:18c7:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a0a:1900::,2a0a:1907:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:1940::,2a0a:1947:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:1980::,2a0a:1987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:19c0::,2a0a:19c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1a00::,2a0a:1a07:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:1a40::,2a0a:1a40:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1a80::,2a0a:1a87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:1ac0::,2a0a:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:1b00::,2a0a:1b07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:1b40::,2a0a:1b40:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a0a:1b80::,2a0a:1b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1bc0::,2a0a:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1c00::,2a0a:1c07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:1c40::,2a0a:1c47:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:1c80::,2a0a:1c87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:1cc0::,2a0a:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:1d00::,2a0a:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1d40::,2a0a:1d40:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1d80::,2a0a:1d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1dc0::,2a0a:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0a:1e00::,2a0a:1e07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:1e40::,2a0a:1e40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:1e80::,2a0a:1e87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1ec0::,2a0a:1ec1:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1f00::,2a0a:1f07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:1f40::,2a0a:1f47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:1f80::,2a0a:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:1fc0::,2a0a:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2000::,2a0a:2007:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:2040::,2a0a:2047:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2080::,2a0a:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:20c0::,2a0a:20c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:2100::,2a0a:2107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:2140::,2a0a:2147:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2180::,2a0a:2187:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:21c0::,2a0a:21c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:2200::,2a0a:2200:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2240::,2a0a:2247:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:2280::,2a0a:2287:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:22c0::,2a0a:22c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2300::,2a0a:2307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2340::,2a0a:2347:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2380::,2a0a:2380:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0a:23c0::,2a0a:23c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:2400::,2a0a:2400:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:2440::,2a0a:2440:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:2480::,2a0a:2487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:24c0::,2a0a:24c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:2500::,2a0a:2500:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:2540::,2a0a:2547:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:2580::,2a0a:2587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:25c0::,2a0a:25c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:2600::,2a0a:2607:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:2640::,2a0a:2647:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2680::,2a0a:2687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:26c0::,2a0a:26c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2700::,2a0a:2707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:2780::,2a0a:2787:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2740::,2a0a:2747:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a0a:2780::,2a0a:2783:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2784::,2a0a:2784:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:2785::,2a0a:2787:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:27c0::,2a0a:27c0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:2800::,2a0a:2807:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:2840::,2a0a:2847:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a0a:2880::,2a0a:2887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:28c0::,2a0a:28c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2900::,2a0a:2907:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:2940::,2a0a:2947:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2980::,2a0a:2987:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0a:29c0::,2a0a:29c0:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:2a00::,2a0a:2a00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:2a40::,2a0a:2a47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:2a80::,2a0a:2a87:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:2ac0::,2a0a:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:2b00::,2a0a:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2b40::,2a0a:2b47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:2b80::,2a0a:2b87:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:2bc0::,2a0a:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2c00::,2a0a:2c07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:2c40::,2a0a:2c47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2c80::,2a0a:2c87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:2cc0::,2a0a:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:2d00::,2a0a:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2d40::,2a0a:2d47:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:2d80::,2a0a:2d87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2dc0::,2a0a:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:2e00::,2a0a:2e07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:2e40::,2a0a:2e47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:2e80::,2a0a:2e87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:2ec0::,2a0a:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:2f00::,2a0a:2f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2f40::,2a0a:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:2f80::,2a0a:2f80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:2fc0::,2a0a:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3000::,2a0a:3000:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3040::,2a0a:3047:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:3080::,2a0a:3087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:30c0::,2a0a:30c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:3100::,2a0a:3107:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3140::,2a0a:3147:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:3180::,2a0a:3187:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:31c0::,2a0a:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:3200::,2a0a:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3240::,2a0a:3240:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a0a:3280::,2a0a:3287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:32c0::,2a0a:32c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:3300::,2a0a:3307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:3340::,2a0a:3347:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:3380::,2a0a:3387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:33c0::,2a0a:33c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:3400::,2a0a:3407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3440::,2a0a:3447:ffff:ffff:ffff:ffff:ffff:ffff,AM 2a0a:3480::,2a0a:3487:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:34c0::,2a0a:34c3:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:3500::,2a0a:3507:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3540::,2a0a:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:3580::,2a0a:3587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:35c0::,2a0a:35c7:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:3600::,2a0a:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3640::,2a0a:3647:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:3680::,2a0a:3687:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:36c0::,2a0a:36c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:3700::,2a0a:3707:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:3740::,2a0a:3747:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:3780::,2a0a:3787:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:37c0::,2a0a:37c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:3800::,2a0a:3807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:3840::,2a0a:3847:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:3880::,2a0a:3887:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a0a:38c0::,2a0a:38c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:3900::,2a0a:3907:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:3940::,2a0a:3947:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a0a:3980::,2a0a:3980:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:39c0::,2a0a:39c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:3a00::,2a0a:3a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3a40::,2a0a:3a40:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:3a80::,2a0a:3a87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3ac0::,2a0a:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:3b00::,2a0a:3b00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:3b80::,2a0a:3b80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3b40::,2a0a:3b47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3bc0::,2a0a:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:3c00::,2a0a:3c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:3c40::,2a0a:3c47:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3c80::,2a0a:3c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3cc0::,2a0a:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:3d00::,2a0a:3d00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:3d40::,2a0a:3d47:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:3d80::,2a0a:3d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3dc0::,2a0a:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:3e00::,2a0a:3e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3e40::,2a0a:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3e80::,2a0a:3e87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3ec0::,2a0a:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3f00::,2a0a:3f00:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0a:3f40::,2a0a:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:3f80::,2a0a:3f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3fc0::,2a0a:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a0a:4000::,2a0a:4007:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:4040::,2a0a:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:4080::,2a0a:4087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:40c0::,2a0a:40c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:4100::,2a0a:4107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4140::,2a0a:4147:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:4180::,2a0a:4187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:41c0::,2a0a:41c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:4200::,2a0a:4207:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:4240::,2a0a:4247:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4280::,2a0a:4287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:42c0::,2a0a:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:4300::,2a0a:4307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4340::,2a0a:4347:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4380::,2a0a:4387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:43c0::,2a0a:43c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4400::,2a0a:4407:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:4440::,2a0a:4440:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:4480::,2a0a:4487:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:44c0::,2a0a:44c7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:4500::,2a0a:4507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4540::,2a0a:4540:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4580::,2a0a:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:45c0::,2a0a:45c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4600::,2a0a:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4640::,2a0a:4647:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:4680::,2a0a:4687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:46c0::,2a0a:46c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:4700::,2a0a:4707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:4740::,2a0a:4747:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:4780::,2a0a:4787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:47c0::,2a0a:47c7:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:4800::,2a0a:4807:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:4840::,2a0a:4847:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4880::,2a0a:4887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:48c0::,2a0a:48c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:4900::,2a0a:4907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4940::,2a0a:4947:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:4980::,2a0a:4987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:49c0::,2a0a:49c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4a00::,2a0a:4a07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:4a40::,2a0a:4a47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:4a80::,2a0a:4a87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:4ac0::,2a0a:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:4b00::,2a0a:4b07:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:4b40::,2a0a:4b47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:4b80::,2a0a:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4bc0::,2a0a:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4c00::,2a0a:4c06:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4c07::,2a0a:4c07::ffff:ffff:ffff:ffff:ffff,CA 2a0a:4c07:1::,2a0a:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4c40::,2a0a:4c40:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a0a:4c80::,2a0a:4c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4cc0::,2a0a:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:4d00::,2a0a:4d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:4d40::,2a0a:4d40:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:4d80::,2a0a:4d87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:4dc0::,2a0a:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4e00::,2a0a:4e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:4e40::,2a0a:4e47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4e80::,2a0a:4e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4ec0::,2a0a:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:4f00::,2a0a:4f07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:4f40::,2a0a:4f40:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:4f80::,2a0a:4f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4fc0::,2a0a:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:5000::,2a0a:5007:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:5040::,2a0a:5040:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5080::,2a0a:5087:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:50c0::,2a0a:50c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:5100::,2a0a:5107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:5140::,2a0a:5147:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5180::,2a0a:5187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:51c0::,2a0a:51c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:5200::,2a0a:5200:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:5240::,2a0a:5247:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0a:5280::,2a0a:5287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:52c0::,2a0a:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:5300::,2a0a:5307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5340::,2a0a:5347:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5380::,2a0a:5387:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:53c0::,2a0a:53c7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:5400::,2a0a:5407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:5440::,2a0a:5447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5480::,2a0a:5487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:54c0::,2a0a:54c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5500::,2a0a:5507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5540::,2a0a:5547:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:5580::,2a0a:5587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:55c0::,2a0a:55c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:5600::,2a0a:5607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5640::,2a0a:5640:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:5680::,2a0a:5687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:56c0::,2a0a:56c7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:5700::,2a0a:5707:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:5740::,2a0a:5740:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5780::,2a0a:5780:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:57c0::,2a0a:57c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5800::,2a0a:5807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:5840::,2a0a:5840:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:5880::,2a0a:5887:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:58c0::,2a0a:58c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5900::,2a0a:5907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:5940::,2a0a:5947:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5980::,2a0a:5987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:59c0::,2a0a:59c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:5a00::,2a0a:5a07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:5a40::,2a0a:5a47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5a80::,2a0a:5a87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:5ac0::,2a0a:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:5b00::,2a0a:5b07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:5b40::,2a0a:5b47:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:5b80::,2a0a:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5bc0::,2a0a:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5c00::,2a0a:5c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5c40::,2a0a:5c47:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:5c80::,2a0a:5c87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:5cc0::,2a0a:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5d00::,2a0a:5d00:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:5d40::,2a0a:5d47:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:5d80::,2a0a:5d87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5dc0::,2a0a:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:5e00::,2a0a:5e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5e40::,2a0a:5e40:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:5e80::,2a0a:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:5ec0::,2a0a:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:5f00::,2a0a:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:5f40::,2a0a:5f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:5f80::,2a0a:5f87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:5fc0::,2a0a:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:6000::,2a0a:6007:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:6040::,2a0a:6047:ffff:ffff:ffff:ffff:ffff:ffff,GL 2a0a:6080::,2a0a:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:60c0::,2a0a:60c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6100::,2a0a:6107:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:6140::,2a0a:6147:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6180::,2a0a:6187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:61c0::,2a0a:61c7:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:6200::,2a0a:6200:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6240::,2a0a:6247:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:6280::,2a0a:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:62c0::,2a0a:62c0:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:6300::,2a0a:6307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:6340::,2a0a:6347:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6380::,2a0a:6387:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:63c0::,2a0a:63c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:6400::,2a0a:6407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:6440::,2a0a:6447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6480::,2a0a:6487:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:64c0::,2a0a:64c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6500::,2a0a:6507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6540::,2a0a:6547:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6580::,2a0a:6580:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:65c0::,2a0a:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6600::,2a0a:6607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6640::,2a0a:6647:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:6680::,2a0a:6680:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:66c0::,2a0a:66c0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a0a:6700::,2a0a:6707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6740::,2a0a:6747:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:6780::,2a0a:6787:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:67c0::,2a0a:67c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6800::,2a0a:6807:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:6840::,2a0a:6847:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:6880::,2a0a:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:68c0::,2a0a:68c0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6900::,2a0a:6907:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:6940::,2a0a:6947:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:6980::,2a0a:6980:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:69c0::,2a0a:69c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6a00::,2a0a:6a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0a:6a40::,2a0a:6a47:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:6a80::,2a0a:6a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6ac0::,2a0a:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6b00::,2a0a:6b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6b40::,2a0a:6b47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6b80::,2a0a:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6bc0::,2a0a:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6c00::,2a0a:6c07:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:6c40::,2a0a:6c47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:6c80::,2a0a:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6cc0::,2a0a:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:6d00::,2a0a:6d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:6d40::,2a0a:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6d80::,2a0a:6d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6dc0::,2a0a:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6e00::,2a0a:6e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6e40::,2a0a:6e47:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:6e80::,2a0a:6e87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:6ec0::,2a0a:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:6f00::,2a0a:6f07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:6f40::,2a0a:6f47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:6f80::,2a0a:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6fc0::,2a0a:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7000::,2a0a:7007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7040::,2a0a:7047:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7080::,2a0a:7087:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:70c0::,2a0a:70c7:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:7100::,2a0a:7107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7140::,2a0a:7147:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7180::,2a0a:7187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:71c0::,2a0a:71c0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:7200::,2a0a:7207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7240::,2a0a:7240:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:7280::,2a0a:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:72c0::,2a0a:72c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:7300::,2a0a:7300:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:7340::,2a0a:7347:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7380::,2a0a:7387:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a0a:73c0::,2a0a:73c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:7400::,2a0a:7407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7440::,2a0a:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7480::,2a0a:7487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:74c0::,2a0a:74c0:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:7500::,2a0a:7500:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0a:7540::,2a0a:7547:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7580::,2a0a:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:75c0::,2a0a:75c0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:7600::,2a0a:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7640::,2a0a:7647:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:7680::,2a0a:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:76c0::,2a0a:76c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7700::,2a0a:7707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7740::,2a0a:7747:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7780::,2a0a:7787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:77c0::,2a0a:77c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7800::,2a0a:7807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7840::,2a0a:7847:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:7880::,2a0a:7887:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:78c0::,2a0a:78c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:7900::,2a0a:7907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7940::,2a0a:7940:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:7980::,2a0a:7987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:79c0::,2a0a:79c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:7a00::,2a0a:7a04:7fff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:7a04:8000::,2a0a:7a04:8000:ffff:ffff:ffff:ffff:ffff,US 2a0a:7a04:8001::,2a0a:7a04:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:7a05::,2a0a:7a05:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:7a06::,2a0a:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7a40::,2a0a:7a47:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:7a80::,2a0a:7a80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7ac0::,2a0a:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:7b00::,2a0a:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:7b80::,2a0a:7b87:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:7c00::,2a0a:7c07:ffff:ffff:ffff:ffff:ffff:ffff,AT @@ -33263,7 +34074,7 @@ 2a0b:3580::,2a0b:3587:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0b:3600::,2a0b:3607:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0b:3680::,2a0b:3687:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0b:3780::,2a0b:3780:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:3800::,2a0b:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:3880::,2a0b:3880:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -33368,7 +34179,8 @@ 2a0b:6a00::,2a0b:6a07:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:6a80::,2a0b:6a87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0b:6b00::,2a0b:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:6b80::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:6b80::,2a0b:6b83:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:6b84::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:6c00::,2a0b:6c07:ffff:ffff:ffff:ffff:ffff:ffff,EE 2a0b:6c80::,2a0b:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:6d00::,2a0b:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -33568,57 +34380,115 @@ 2a0b:ce00::,2a0b:ce07:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:ce80::,2a0b:ce87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:cf00::,2a0b:cf07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:cf80::,2a0b:cf87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:d000::,2a0b:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d080::,2a0b:d080:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0b:d100::,2a0b:d107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:d180::,2a0b:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0b:d200::,2a0b:d207:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:d280::,2a0b:d287:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:d300::,2a0b:d307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d380::,2a0b:d387:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:d400::,2a0b:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:d480::,2a0b:d487:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:d500::,2a0b:d507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d580::,2a0b:d580:ffff:ffff:ffff:ffff:ffff:ffff,OM 2a0b:d600::,2a0b:d607:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d680::,2a0b:d680:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0b:d700::,2a0b:d707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d780::,2a0b:d787:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b:d800::,2a0b:d807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:d880::,2a0b:d887:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b:d900::,2a0b:d907:ffff:ffff:ffff:ffff:ffff:ffff,HK +2a0b:d980::,2a0b:d987:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:da00::,2a0b:da07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:da80::,2a0b:da87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:db00::,2a0b:db07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:db80::,2a0b:db87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:dc00::,2a0b:dc07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:dc80::,2a0b:dc87:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:dd00::,2a0b:dd07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:dd80::,2a0b:dd87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:de00::,2a0b:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:de80::,2a0b:de87:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0b:df00::,2a0b:df00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:df80::,2a0b:df87:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:e000::,2a0b:e007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e080::,2a0b:e081:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0b:e100::,2a0b:e107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e180::,2a0b:e187:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b:e200::,2a0b:e207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:e280::,2a0b:e287:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:e300::,2a0b:e300:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:e380::,2a0b:e387:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:e400::,2a0b:e407:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:e480::,2a0b:e487:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:e500::,2a0b:e501:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e580::,2a0b:e587:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:e600::,2a0b:e607:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0b:e680::,2a0b:e687:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:e700::,2a0b:e707:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:e780::,2a0b:e787:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0b:e800::,2a0b:e807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e880::,2a0b:e887:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:e900::,2a0b:e907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e980::,2a0b:e987:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:ea00::,2a0b:ea00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:ea80::,2a0b:ea80:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:eb00::,2a0b:eb07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:eb80::,2a0b:eb87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0b:ec00::,2a0b:ec07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ec80::,2a0b:ec87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:ed00::,2a0b:ed07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:ed80::,2a0b:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:ee00::,2a0b:ee07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:ee80::,2a0b:ee87:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0b:ef00::,2a0b:ef07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:ef80::,2a0b:ef87:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0b:f000::,2a0b:f000:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:f080::,2a0b:f080:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:f100::,2a0b:f107:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:f180::,2a0b:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:f200::,2a0b:f200:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:f280::,2a0b:f287:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:f300::,2a0b:f307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:f380::,2a0b:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:f400::,2a0b:f400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f480::,2a0b:f480:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0b:f500::,2a0b:f507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:f580::,2a0b:f587:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a0b:f600::,2a0b:f607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:f680::,2a0b:f687:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a0b:f700::,2a0b:f707:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:f780::,2a0b:f787:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:f800::,2a0b:f800:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:f880::,2a0b:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:f900::,2a0b:f907:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:f980::,2a0b:f987:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:fa00::,2a0b:fa07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:fa80::,2a0b:fa87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:fb00::,2a0b:fb07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:fb80::,2a0b:fb87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:fc00::,2a0b:fc07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0b:fc80::,2a0b:fc87:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0b:fd00::,2a0b:fd00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:fd80::,2a0b:fd87:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:fe00::,2a0b:fe07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:fe80::,2a0b:fe87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:ff00::,2a0b:ff07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:ff80::,2a0b:ff87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2c0e::,2c0e:fff:ffff:ffff:ffff:ffff:ffff:ffff,EG 2c0e:2000::,2c0e:2fff:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0e:4000::,2c0e:40ff:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f000::,2c0f:f000:ffff:ffff:ffff:ffff:ffff:ffff,DZ +2c0f:f008::,2c0f:f008:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f010::,2c0f:f010:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f018::,2c0f:f018:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f020::,2c0f:f020:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f028::,2c0f:f028:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f030::,2c0f:f030:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f038::,2c0f:f038:ffff:ffff:ffff:ffff:ffff:ffff,GA +2c0f:f040::,2c0f:f040:ffff:ffff:ffff:ffff:ffff:ffff,SN 2c0f:f200::,2c0f:f200:ffff:ffff:ffff:ffff:ffff:ffff,UG 2c0f:f208::,2c0f:f208:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f210::,2c0f:f210:ffff:ffff:ffff:ffff:ffff:ffff,ZA @@ -33682,6 +34552,7 @@ 2c0f:f3e0::,2c0f:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,GA 2c0f:f3e8::,2c0f:f3e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f3f0::,2c0f:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3f8::,2c0f:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,KE 2c0f:f400::,2c0f:f400:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f408::,2c0f:f408:ffff:ffff:ffff:ffff:ffff:ffff,KE 2c0f:f410::,2c0f:f410:ffff:ffff:ffff:ffff:ffff:ffff,NG diff --git a/src/ext/byteorder.h b/src/ext/byteorder.h new file mode 100644 index 0000000000..c8ba52184b --- /dev/null +++ b/src/ext/byteorder.h @@ -0,0 +1,67 @@ +/* <MIT License> + Copyright (c) 2013-2014 Marek Majkowski <marek@popcount.org> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + </MIT License> + + Original location: + https://github.com/majek/csiphash/ + + Solution inspired by code from: + Samuel Neves (supercop/crypto_auth/siphash24/little) + djb (supercop/crypto_auth/siphash24/little2) + Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c) +*/ + +/* This code is extracted from csiphash.h */ + +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define _le64toh(x) ((uint64_t)(x)) +#elif defined(_WIN32) +/* Windows is always little endian, unless you're on xbox360 + http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx */ +# define _le64toh(x) ((uint64_t)(x)) +#elif defined(__APPLE__) +# include <libkern/OSByteOrder.h> +# define _le64toh(x) OSSwapLittleToHostInt64(x) +#elif defined(sun) || defined(__sun) +# include <sys/byteorder.h> +# define _le64toh(x) LE_64(x) + +#else + +/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */ +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) +# include <sys/endian.h> +# else +# include <endian.h> +# endif +# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN +# define _le64toh(x) ((uint64_t)(x)) +# else +# if defined(OpenBSD) +# define _le64toh(x) letoh64(x) +# else +# define _le64toh(x) le64toh(x) +# endif +# endif + +#endif diff --git a/src/ext/csiphash.c b/src/ext/csiphash.c index 8348c66048..1029bbbad3 100644 --- a/src/ext/csiphash.c +++ b/src/ext/csiphash.c @@ -35,41 +35,7 @@ #include "util.h" /* for memcpy */ #include <string.h> - -#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# define _le64toh(x) ((uint64_t)(x)) -#elif defined(_WIN32) -/* Windows is always little endian, unless you're on xbox360 - http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx */ -# define _le64toh(x) ((uint64_t)(x)) -#elif defined(__APPLE__) -# include <libkern/OSByteOrder.h> -# define _le64toh(x) OSSwapLittleToHostInt64(x) -#elif defined(sun) || defined(__sun) -# include <sys/byteorder.h> -# define _le64toh(x) LE_64(x) - -#else - -/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */ -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) -# include <sys/endian.h> -# else -# include <endian.h> -# endif -# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ - __BYTE_ORDER == __LITTLE_ENDIAN -# define _le64toh(x) ((uint64_t)(x)) -# else -# if defined(OpenBSD) -# define _le64toh(x) letoh64(x) -# else -# define _le64toh(x) le64toh(x) -# endif -# endif - -#endif +#include "byteorder.h" #define ROTATE(x, b) (uint64_t)( ((x) << (b)) | ( (x) >> (64 - (b))) ) diff --git a/src/ext/ed25519/donna/ed25519-hash-custom.h b/src/ext/ed25519/donna/ed25519-hash-custom.h index 7dc249129d..609451abd5 100644 --- a/src/ext/ed25519/donna/ed25519-hash-custom.h +++ b/src/ext/ed25519/donna/ed25519-hash-custom.h @@ -9,3 +9,34 @@ void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen); */ +#include "crypto.h" + +typedef struct ed25519_hash_context { + crypto_digest_t *ctx; +} ed25519_hash_context; + + +static void +ed25519_hash_init(ed25519_hash_context *ctx) +{ + ctx->ctx = crypto_digest512_new(DIGEST_SHA512); +} +static void +ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen) +{ + crypto_digest_add_bytes(ctx->ctx, (const char *)in, inlen); +} +static void +ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash) +{ + crypto_digest_get_digest(ctx->ctx, (char *)hash, DIGEST512_LEN); + crypto_digest_free(ctx->ctx); + ctx->ctx = NULL; +} +static void +ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) +{ + crypto_digest512((char *)hash, (const char *)in, inlen, + DIGEST_SHA512); +} + diff --git a/src/ext/ed25519/ref10/crypto_hash_sha512.h b/src/ext/ed25519/ref10/crypto_hash_sha512.h index 0278571522..5dad935c79 100644 --- a/src/ext/ed25519/ref10/crypto_hash_sha512.h +++ b/src/ext/ed25519/ref10/crypto_hash_sha512.h @@ -1,30 +1,32 @@ /* Added for Tor. */ -#include <openssl/sha.h> +#include "crypto.h" /* Set 'out' to the 512-bit SHA512 hash of the 'len'-byte string in 'inp' */ #define crypto_hash_sha512(out, inp, len) \ - SHA512((inp), (len), (out)) + crypto_digest512((char *)(out), (const char *)(inp), (len), DIGEST_SHA512) /* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', * concatenated with the 'len2'-byte string in 'inp2'. */ #define crypto_hash_sha512_2(out, inp1, len1, inp2, len2) \ do { \ - SHA512_CTX sha_ctx_; \ - SHA512_Init(&sha_ctx_); \ - SHA512_Update(&sha_ctx_, (inp1), (len1)); \ - SHA512_Update(&sha_ctx_, (inp2), (len2)); \ - SHA512_Final((out), &sha_ctx_); \ - } while(0) + crypto_digest_t *sha_ctx_; \ + sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ + crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ + crypto_digest_free(sha_ctx_); \ + } while (0) /* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', * concatenated with the 'len2'-byte string in 'inp2', concatenated with * the 'len3'-byte string in 'len3'. */ #define crypto_hash_sha512_3(out, inp1, len1, inp2, len2, inp3, len3) \ do { \ - SHA512_CTX sha_ctx_; \ - SHA512_Init(&sha_ctx_); \ - SHA512_Update(&sha_ctx_, (inp1), (len1)); \ - SHA512_Update(&sha_ctx_, (inp2), (len2)); \ - SHA512_Update(&sha_ctx_, (inp3), (len3)); \ - SHA512_Final((out), &sha_ctx_); \ + crypto_digest_t *sha_ctx_; \ + sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp3), (len3)); \ + crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ + crypto_digest_free(sha_ctx_); \ } while(0) diff --git a/src/ext/ht.h b/src/ext/ht.h index a441d0b685..caa420e9b5 100644 --- a/src/ext/ht.h +++ b/src/ext/ht.h @@ -1,6 +1,6 @@ /* Copyright (c) 2002, Christopher Clark. * Copyright (c) 2005-2006, Nick Mathewson. - * Copyright (c) 2007-2015, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See license at end. */ /* Based on ideas by Christopher Clark and interfaces from Niels Provos. */ diff --git a/src/ext/include.am b/src/ext/include.am index f00f3e031e..7ec2e43312 100644 --- a/src/ext/include.am +++ b/src/ext/include.am @@ -5,6 +5,7 @@ EXTRA_DIST += src/ext/README EXTHEADERS = \ src/ext/ht.h \ + src/ext/byteorder.h \ src/ext/tinytest.h \ src/ext/tor_readpassphrase.h \ src/ext/strlcat.c \ @@ -100,6 +101,7 @@ noinst_LIBRARIES += $(LIBED25519_REF10) src_ext_ed25519_donna_libed25519_donna_a_CFLAGS=\ @CFLAGS_CONSTTIME@ \ -DED25519_CUSTOMRANDOM \ + -DED25519_CUSTOMHASH \ -DED25519_SUFFIX=_donna src_ext_ed25519_donna_libed25519_donna_a_SOURCES= \ diff --git a/src/ext/keccak-tiny/keccak-tiny-unrolled.c b/src/ext/keccak-tiny/keccak-tiny-unrolled.c index d1342c3601..d8d7fe335a 100644 --- a/src/ext/keccak-tiny/keccak-tiny-unrolled.c +++ b/src/ext/keccak-tiny/keccak-tiny-unrolled.c @@ -10,28 +10,21 @@ #include <string.h> #include "crypto.h" +#include "byteorder.h" /******** Endianness conversion helpers ********/ static inline uint64_t loadu64le(const unsigned char *x) { - uint64_t r = 0; - size_t i; - - for (i = 0; i < 8; ++i) { - r |= (uint64_t)x[i] << 8 * i; - } - return r; + uint64_t r; + memcpy(&r, x, sizeof(r)); + return _le64toh(r); } static inline void storeu64le(uint8_t *x, uint64_t u) { - size_t i; - - for(i=0; i<8; ++i) { - x[i] = u; - u >>= 8; - } + uint64_t val = _le64toh(u); + memcpy(x, &val, sizeof(u)); } /******** The Keccak-f[1600] permutation ********/ diff --git a/src/ext/trunnel/trunnel-impl.h b/src/ext/trunnel/trunnel-impl.h index bc805851b1..85c847b3fd 100644 --- a/src/ext/trunnel/trunnel-impl.h +++ b/src/ext/trunnel/trunnel-impl.h @@ -5,7 +5,7 @@ /* trunnel-impl.h -- Implementation helpers for trunnel, included by * generated trunnel files * - * Copyright 2014-2015, The Tor Project, Inc. + * Copyright 2014-2017, The Tor Project, Inc. * See license at the end of this file for copying information. */ diff --git a/src/ext/trunnel/trunnel.c b/src/ext/trunnel/trunnel.c index 8f72351277..6a42417241 100644 --- a/src/ext/trunnel/trunnel.c +++ b/src/ext/trunnel/trunnel.c @@ -4,7 +4,7 @@ */ /* trunnel.c -- Helper functions to implement trunnel. * - * Copyright 2014-2015, The Tor Project, Inc. + * Copyright 2014-2017, The Tor Project, Inc. * See license at the end of this file for copying information. * * See trunnel-impl.h for documentation of these functions. @@ -31,7 +31,7 @@ # define IS_LITTLE_ENDIAN # endif #else -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) # include <sys/endian.h> # else # include <endian.h> diff --git a/src/ext/trunnel/trunnel.h b/src/ext/trunnel/trunnel.h index 85bbcc5451..dd78553c77 100644 --- a/src/ext/trunnel/trunnel.h +++ b/src/ext/trunnel/trunnel.h @@ -5,7 +5,7 @@ /* trunnel.h -- Public declarations for trunnel, to be included * in trunnel header files. - * Copyright 2014-2015, The Tor Project, Inc. + * Copyright 2014-2017, The Tor Project, Inc. * See license at the end of this file for copying information. */ diff --git a/src/include.am b/src/include.am index d12684e187..f78853f50f 100644 --- a/src/include.am +++ b/src/include.am @@ -7,3 +7,4 @@ include src/tools/include.am include src/win32/include.am include src/config/include.am include src/test/fuzz/include.am +include src/trace/include.am diff --git a/src/or/addressmap.c b/src/or/addressmap.c index 85a6434f4a..c92af38254 100644 --- a/src/or/addressmap.c +++ b/src/or/addressmap.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/addressmap.h b/src/or/addressmap.h index 67648d0518..80f453b4c1 100644 --- a/src/or/addressmap.h +++ b/src/or/addressmap.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ADDRESSMAP_H diff --git a/src/or/bridges.c b/src/or/bridges.c index 8b37f412ea..ef0638c0a7 100644 --- a/src/or/bridges.c +++ b/src/or/bridges.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -199,6 +199,33 @@ get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, return NULL; } +/** + * As get_configured_bridge_by_addr_port, but require that the + * address match <b>addr</b>:<b>port</b>, and that the ID digest match + * <b>digest</b>. (The other function will ignore the address if the + * digest matches.) + */ +bridge_info_t * +get_configured_bridge_by_exact_addr_port_digest(const tor_addr_t *addr, + uint16_t port, + const char *digest) +{ + if (!bridge_list) + return NULL; + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { + if (!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) && + bridge->port == port) { + + if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) + return bridge; + else if (!digest || tor_digest_is_zero(bridge->identity)) + return bridge; + } + + } SMARTLIST_FOREACH_END(bridge); + return NULL; +} + /** If we have a bridge configured whose digest matches <b>digest</b>, or a * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>, * return 1. Else return 0. If <b>digest</b> is NULL, check for @@ -270,7 +297,7 @@ learned_router_identity(const tor_addr_t *addr, uint16_t port, (void)ed_id; int learned = 0; bridge_info_t *bridge = - get_configured_bridge_by_addr_port_digest(addr, port, digest); + get_configured_bridge_by_exact_addr_port_digest(addr, port, digest); if (bridge && tor_digest_is_zero(bridge->identity)) { memcpy(bridge->identity, digest, DIGEST_LEN); learned = 1; @@ -543,12 +570,18 @@ launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge) return; } - directory_initiate_command(&bridge->addr, bridge->port, - NULL, 0, /*no dirport*/ - bridge->identity, - DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_BRIDGE, - DIRIND_ONEHOP, "authority.z", NULL, 0, 0); + tor_addr_port_t bridge_addrport; + memcpy(&bridge_addrport.addr, &bridge->addr, sizeof(tor_addr_t)); + bridge_addrport.port = bridge->port; + + directory_request_t *req = + directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); + directory_request_set_or_addr_port(req, &bridge_addrport); + directory_request_set_directory_id_digest(req, bridge->identity); + directory_request_set_router_purpose(req, ROUTER_PURPOSE_BRIDGE); + directory_request_set_resource(req, "authority.z"); + directory_initiate_request(req); + directory_request_free(req); } /** Fetching the bridge descriptor from the bridge authority returned a diff --git a/src/or/bridges.h b/src/or/bridges.h index de23fe6eeb..3bfc782f9a 100644 --- a/src/or/bridges.h +++ b/src/or/bridges.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -27,6 +27,10 @@ bridge_info_t *get_configured_bridge_by_addr_port_digest( const tor_addr_t *addr, uint16_t port, const char *digest); +bridge_info_t *get_configured_bridge_by_exact_addr_port_digest( + const tor_addr_t *addr, + uint16_t port, + const char *digest); int addr_is_a_configured_bridge(const tor_addr_t *addr, uint16_t port, const char *digest); diff --git a/src/or/buffers.c b/src/or/buffers.c index 6111820701..4f22935d26 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -83,7 +83,11 @@ static int parse_socks_client(const uint8_t *data, size_t datalen, #define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0]) /* We leave this many NUL bytes at the end of the buffer. */ +#ifdef DISABLE_MEMORY_SENTINELS +#define SENTINEL_LEN 0 +#else #define SENTINEL_LEN 4 +#endif /* Header size plus NUL bytes at the end */ #define CHUNK_OVERHEAD (CHUNK_HEADER_LEN + SENTINEL_LEN) @@ -97,18 +101,22 @@ static int parse_socks_client(const uint8_t *data, size_t datalen, #define DEBUG_SENTINEL -#ifdef DEBUG_SENTINEL +#if defined(DEBUG_SENTINEL) && !defined(DISABLE_MEMORY_SENTINELS) #define DBG_S(s) s #else #define DBG_S(s) (void)0 #endif +#ifdef DISABLE_MEMORY_SENTINELS +#define CHUNK_SET_SENTINEL(chunk, alloclen) STMT_NIL +#else #define CHUNK_SET_SENTINEL(chunk, alloclen) do { \ uint8_t *a = (uint8_t*) &(chunk)->mem[(chunk)->memlen]; \ DBG_S(uint8_t *b = &((uint8_t*)(chunk))[(alloclen)-SENTINEL_LEN]); \ DBG_S(tor_assert(a == b)); \ memset(a,0,SENTINEL_LEN); \ } while (0) +#endif /** Return the next character in <b>chunk</b> onto which data can be appended. * If the chunk is full, this might be off the end of chunk->mem. */ @@ -610,6 +618,11 @@ read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof, tor_assert(reached_eof); tor_assert(SOCKET_OK(s)); + if (BUG(buf->datalen >= INT_MAX)) + return -1; + if (BUG(buf->datalen >= INT_MAX - at_most)) + return -1; + while (at_most > total_read) { size_t readlen = at_most - total_read; chunk_t *chunk; @@ -667,6 +680,11 @@ read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf) check(); + if (BUG(buf->datalen >= INT_MAX)) + return -1; + if (BUG(buf->datalen >= INT_MAX - at_most)) + return -1; + while (at_most > total_read) { size_t readlen = at_most - total_read; chunk_t *chunk; @@ -861,6 +879,11 @@ write_to_buf(const char *string, size_t string_len, buf_t *buf) return (int)buf->datalen; check(); + if (BUG(buf->datalen >= INT_MAX)) + return -1; + if (BUG(buf->datalen >= INT_MAX - string_len)) + return -1; + while (string_len) { size_t copy; if (!buf->tail || !CHUNK_REMAINING_CAPACITY(buf->tail)) @@ -1010,6 +1033,12 @@ move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen) /* We can do way better here, but this doesn't turn up in any profiles. */ char b[4096]; size_t cp, len; + + if (BUG(buf_out->datalen >= INT_MAX)) + return -1; + if (BUG(buf_out->datalen >= INT_MAX - *buf_flushlen)) + return -1; + len = *buf_flushlen; if (len > buf_in->datalen) len = buf_in->datalen; @@ -2059,13 +2088,13 @@ fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len) } /** Compress on uncompress the <b>data_len</b> bytes in <b>data</b> using the - * zlib state <b>state</b>, appending the result to <b>buf</b>. If + * compression state <b>state</b>, appending the result to <b>buf</b>. If * <b>done</b> is true, flush the data in the state and finish the * compression/uncompression. Return -1 on failure, 0 on success. */ int -write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, - int done) +write_to_buf_compress(buf_t *buf, tor_compress_state_t *state, + const char *data, size_t data_len, + int done) { char *next; size_t old_avail, avail; @@ -2079,20 +2108,22 @@ write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, } next = CHUNK_WRITE_PTR(buf->tail); avail = old_avail = CHUNK_REMAINING_CAPACITY(buf->tail); - switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) { - case TOR_ZLIB_DONE: + switch (tor_compress_process(state, &next, &avail, + &data, &data_len, done)) { + case TOR_COMPRESS_DONE: over = 1; break; - case TOR_ZLIB_ERR: + case TOR_COMPRESS_ERROR: return -1; - case TOR_ZLIB_OK: + case TOR_COMPRESS_OK: if (data_len == 0) over = 1; break; - case TOR_ZLIB_BUF_FULL: + case TOR_COMPRESS_BUFFER_FULL: if (avail) { - /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk - * automatically, whether were going to or not. */ + /* The compression module says we need more room + * (TOR_COMPRESS_BUFFER_FULL). Start a new chunk automatically, + * whether were going to or not. */ need_new_chunk = 1; } break; diff --git a/src/or/buffers.h b/src/or/buffers.h index bb53b3bbff..23b58a571a 100644 --- a/src/or/buffers.h +++ b/src/or/buffers.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -36,8 +36,8 @@ int flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen); int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen); int write_to_buf(const char *string, size_t string_len, buf_t *buf); -int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, int done); +int write_to_buf_compress(buf_t *buf, tor_compress_state_t *state, + const char *data, size_t data_len, int done); int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen); int fetch_from_buf(char *string, size_t string_len, buf_t *buf); int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto); diff --git a/src/or/channel.c b/src/or/channel.c index 45f1602ab2..e79fc0760b 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/channel.h b/src/or/channel.h index 748a0991fc..3d97b8e306 100644 --- a/src/or/channel.h +++ b/src/or/channel.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/channeltls.c b/src/or/channeltls.c index e7349139fc..7c4dc9aa09 100644 --- a/src/or/channeltls.c +++ b/src/or/channeltls.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/channeltls.h b/src/or/channeltls.h index 729e595615..1f9a39d8a4 100644 --- a/src/or/channeltls.h +++ b/src/or/channeltls.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c index cdcb6deae4..4c0bd9e455 100644 --- a/src/or/circpathbias.c +++ b/src/or/circpathbias.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circpathbias.h b/src/or/circpathbias.h index ce76689d5f..2a4c316807 100644 --- a/src/or/circpathbias.h +++ b/src/or/circpathbias.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index cd00034395..f8b3609757 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -73,7 +73,6 @@ static int circuit_deliver_create_cell(circuit_t *circ, static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit); static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath); static int onion_extend_cpath(origin_circuit_t *circ); -static int count_acceptable_nodes(smartlist_t *routers); static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); /** This function tries to get a channel to the specified endpoint, @@ -819,7 +818,7 @@ should_use_create_fast_for_circuit(origin_circuit_t *circ) } if (options->FastFirstHopPK == -1) { /* option is "auto", so look at the consensus. */ - return networkstatus_get_param(NULL, "usecreatefast", 1, 0, 1); + return networkstatus_get_param(NULL, "usecreatefast", 0, 0, 1); } return options->FastFirstHopPK; @@ -892,6 +891,27 @@ circuit_pick_extend_handshake(uint8_t *cell_type_out, } } +/** + * Return true iff <b>purpose</b> is a purpose for a circuit which is + * allowed to have no guard configured, even if the circuit is multihop + * and guards are enabled. + */ +static int +circuit_purpose_may_omit_guard(int purpose) +{ + switch (purpose) { + case CIRCUIT_PURPOSE_TESTING: + case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT: + /* Testing circuits may omit guards because they're measuring + * liveness or performance, and don't want guards to interfere. */ + return 1; + default: + /* All other multihop circuits should use guards if guards are + * enabled. */ + return 0; + } +} + /** This is the backbone function for building circuits. * * If circ's first hop is closed, then we need to build a create @@ -969,7 +989,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) guard_usable_t r; if (! circ->guard_state) { if (circuit_get_cpath_len(circ) != 1 && - circ->base_.purpose != CIRCUIT_PURPOSE_TESTING && + ! circuit_purpose_may_omit_guard(circ->base_.purpose) && get_options()->UseEntryGuards) { log_warn(LD_BUG, "%d-hop circuit %p with purpose %d has no " "guard state", @@ -1525,13 +1545,98 @@ onionskin_answer(or_circuit_t *circ, return 0; } -/** Choose a length for a circuit of purpose <b>purpose</b>: three + the - * number of endpoints that would give something away about our destination. +/** Helper for new_route_len(). Choose a circuit length for purpose + * <b>purpose</b>: DEFAULT_ROUTE_LEN (+ 1 if someone else chose the + * exit). If someone else chose the exit, they could be colluding + * with the exit, so add a randomly selected node to preserve + * anonymity. + * + * Here, "exit node" sometimes means an OR acting as an internal + * endpoint, rather than as a relay to an external endpoint. This + * means there need to be at least DEFAULT_ROUTE_LEN routers between + * us and the internal endpoint to preserve the same anonymity + * properties that we would get when connecting to an external + * endpoint. These internal endpoints can include: + * + * - Connections to a directory of hidden services + * (CIRCUIT_PURPOSE_C_GENERAL) + * + * - A client connecting to an introduction point, which the hidden + * service picked (CIRCUIT_PURPOSE_C_INTRODUCING, via + * circuit_get_open_circ_or_launch() which rewrites it from + * CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) + * + * - A hidden service connecting to a rendezvous point, which the + * client picked (CIRCUIT_PURPOSE_S_CONNECT_REND, via + * rend_service_receive_introduction() and + * rend_service_relaunch_rendezvous) + * + * There are currently two situations where we picked the exit node + * ourselves, making DEFAULT_ROUTE_LEN a safe circuit length: + * + * - We are a hidden service connecting to an introduction point + * (CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, via + * rend_service_launch_establish_intro()) + * + * - We are a router testing its own reachabiity + * (CIRCUIT_PURPOSE_TESTING, via consider_testing_reachability()) + * + * onion_pick_cpath_exit() bypasses us (by not calling + * new_route_len()) in the one-hop tunnel case, so we don't need to + * handle that. + */ +static int +route_len_for_purpose(uint8_t purpose, extend_info_t *exit_ei) +{ + int routelen = DEFAULT_ROUTE_LEN; + int known_purpose = 0; + + if (!exit_ei) + return routelen; + + switch (purpose) { + /* These two purposes connect to a router that we chose, so + * DEFAULT_ROUTE_LEN is safe. */ + case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: + /* hidden service connecting to introduction point */ + case CIRCUIT_PURPOSE_TESTING: + /* router reachability testing */ + known_purpose = 1; + break; + + /* These three purposes connect to a router that someone else + * might have chosen, so add an extra hop to protect anonymity. */ + case CIRCUIT_PURPOSE_C_GENERAL: + /* connecting to hidden service directory */ + case CIRCUIT_PURPOSE_C_INTRODUCING: + /* client connecting to introduction point */ + case CIRCUIT_PURPOSE_S_CONNECT_REND: + /* hidden service connecting to rendezvous point */ + known_purpose = 1; + routelen++; + break; + + default: + /* Got a purpose not listed above along with a chosen exit. + * Increase the circuit length by one anyway for safety. */ + routelen++; + break; + } + + if (BUG(exit_ei && !known_purpose)) { + log_warn(LD_BUG, "Unhandled purpose %d with a chosen exit; " + "assuming routelen %d.", purpose, routelen); + } + return routelen; +} + +/** Choose a length for a circuit of purpose <b>purpose</b> and check + * if enough routers are available. * * If the routerlist <b>nodes</b> doesn't have enough routers * to handle the desired path length, return -1. */ -static int +STATIC int new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes) { int num_acceptable_routers; @@ -1539,11 +1644,7 @@ new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes) tor_assert(nodes); - routelen = DEFAULT_ROUTE_LEN; - if (exit_ei && - purpose != CIRCUIT_PURPOSE_TESTING && - purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) - routelen++; + routelen = route_len_for_purpose(purpose, exit_ei); num_acceptable_routers = count_acceptable_nodes(nodes); @@ -2167,8 +2268,8 @@ circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei) /** Return the number of routers in <b>routers</b> that are currently up * and available for building circuits through. */ -static int -count_acceptable_nodes(smartlist_t *nodes) +MOCK_IMPL(STATIC int, +count_acceptable_nodes, (smartlist_t *nodes)) { int num=0; diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h index ddb070b427..45d9b2fb75 100644 --- a/src/or/circuitbuild.h +++ b/src/or/circuitbuild.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -77,6 +77,9 @@ void circuit_upgrade_circuits_from_guard_wait(void); #ifdef CIRCUITBUILD_PRIVATE STATIC circid_t get_unique_circ_id_by_chan(channel_t *chan); +STATIC int new_route_len(uint8_t purpose, extend_info_t *exit_ei, + smartlist_t *nodes); +MOCK_DECL(STATIC int, count_acceptable_nodes, (smartlist_t *nodes)); #if defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS) STATIC const node_t *pick_tor2web_rendezvous_node(router_crn_flags_t flags, const or_options_t *options); diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 54a7db9dbf..365e5b2f89 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -1,7 +1,7 @@ /* Copyright 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -943,10 +943,6 @@ circuit_free(circuit_t *circ) crypto_cipher_free(ocirc->n_crypto); crypto_digest_free(ocirc->n_digest); - if (ocirc->hs_token) { - hs_circuitmap_remove_circuit(ocirc); - } - if (ocirc->rend_splice) { or_circuit_t *other = ocirc->rend_splice; tor_assert(other->base_.magic == OR_CIRCUIT_MAGIC); @@ -978,6 +974,11 @@ circuit_free(circuit_t *circ) /* Remove from map. */ circuit_set_n_circid_chan(circ, 0, NULL); + /* Clear HS circuitmap token from this circ (if any) */ + if (circ->hs_token) { + hs_circuitmap_remove_circuit(circ); + } + /* Clear cell queue _after_ removing it from the map. Otherwise our * "active" checks will be violated. */ cell_queue_clear(&circ->n_chan_cells); @@ -1989,10 +1990,10 @@ single_conn_free_bytes(connection_t *conn) } if (conn->type == CONN_TYPE_DIR) { dir_connection_t *dir_conn = TO_DIR_CONN(conn); - if (dir_conn->zlib_state) { - result += tor_zlib_state_size(dir_conn->zlib_state); - tor_zlib_free(dir_conn->zlib_state); - dir_conn->zlib_state = NULL; + if (dir_conn->compress_state) { + result += tor_compress_state_size(dir_conn->compress_state); + tor_compress_free(dir_conn->compress_state); + dir_conn->compress_state = NULL; } } return result; diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h index 6abee37dc4..d647062f46 100644 --- a/src/or/circuitlist.h +++ b/src/or/circuitlist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c index 96a3647aab..ee0d5c718b 100644 --- a/src/or/circuitmux.c +++ b/src/or/circuitmux.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux.h b/src/or/circuitmux.h index 00745ac4a1..42a46aaa47 100644 --- a/src/or/circuitmux.h +++ b/src/or/circuitmux.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux_ewma.c b/src/or/circuitmux_ewma.c index 0219459cdb..c2440b13f0 100644 --- a/src/or/circuitmux_ewma.c +++ b/src/or/circuitmux_ewma.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux_ewma.h b/src/or/circuitmux_ewma.h index a7b8961ac6..1f04408789 100644 --- a/src/or/circuitmux_ewma.h +++ b/src/or/circuitmux_ewma.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index 48cb89dc37..fe6f723bd5 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h index 23910276ae..4977b26c0d 100644 --- a/src/or/circuitstats.h +++ b/src/or/circuitstats.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuituse.c b/src/or/circuituse.c index c2b450606b..8d233e0cb6 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1240,8 +1240,8 @@ circuit_predict_and_launch_new(void) /** Build a new test circuit every 5 minutes */ #define TESTING_CIRCUIT_INTERVAL 300 -/** This function is called once a second, if router_have_min_dir_info() is - * true. Its job is to make sure all services we offer have enough circuits +/** This function is called once a second, if router_have_minimum_dir_info() + * is true. Its job is to make sure all services we offer have enough circuits * available. Some services just want enough circuits for current tasks, * whereas others want a minimum set of idle circuits hanging around. */ diff --git a/src/or/circuituse.h b/src/or/circuituse.h index e5f8700ea2..ad4c214a3b 100644 --- a/src/or/circuituse.h +++ b/src/or/circuituse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/command.c b/src/or/command.c index 4d3830f404..c91a967fd4 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/command.h b/src/or/command.h index 12cda6a463..5079d42e75 100644 --- a/src/or/command.h +++ b/src/or/command.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/config.c b/src/or/config.c index a527571cb0..201cca7941 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -69,10 +69,12 @@ #include "circuitmux.h" #include "circuitmux_ewma.h" #include "circuitstats.h" +#include "compress.h" #include "config.h" #include "connection.h" #include "connection_edge.h" #include "connection_or.h" +#include "consdiffmgr.h" #include "control.h" #include "confparse.h" #include "cpuworker.h" @@ -99,7 +101,6 @@ #include "statefile.h" #include "transports.h" #include "ext_orport.h" -#include "torgzip.h" #ifdef _WIN32 #include <shlobj.h> #endif @@ -1815,6 +1816,15 @@ options_act(const or_options_t *old_options) return -1; } + if (server_mode(options)) { + static int cdm_initialized = 0; + if (cdm_initialized == 0) { + cdm_initialized = 1; + consdiffmgr_configure(NULL); + consdiffmgr_validate(); + } + } + if (init_control_cookie_authentication(options->CookieAuthentication) < 0) { log_warn(LD_CONFIG,"Error creating control cookie authentication file."); return -1; @@ -2347,7 +2357,7 @@ print_usage(void) printf( "Copyright (c) 2001-2004, Roger Dingledine\n" "Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n" -"Copyright (c) 2007-2016, The Tor Project, Inc.\n\n" +"Copyright (c) 2007-2017, The Tor Project, Inc.\n\n" "tor -f <torrc> [args]\n" "See man page for options, or https://www.torproject.org/ for " "documentation.\n"); @@ -2815,7 +2825,7 @@ compute_publishserverdescriptor(or_options_t *options) #define MAX_PREDICTED_CIRCS_RELEVANCE (60*60) /** Highest allowable value for RendPostPeriod. */ -#define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2) +#define MAX_DIR_PERIOD ((7*24*60*60)/2) /** Lowest allowable value for MaxCircuitDirtiness; if this is too low, Tor * will generate too many circuits and potentially overload the network. */ @@ -3510,6 +3520,20 @@ options_validate(or_options_t *old_options, or_options_t *options, return -1; } + /* Inform the hidden service operator that pinning EntryNodes can possibly + * be harmful for the service anonymity. */ + if (options->EntryNodes && + routerset_is_list(options->EntryNodes) && + (options->RendConfigLines != NULL)) { + log_warn(LD_CONFIG, + "EntryNodes is set with multiple entries and at least one " + "hidden service is configured. Pinning entry nodes can possibly " + "be harmful to the service anonymity. Because of this, we " + "recommend you either don't do that or make sure you know what " + "you are doing. For more details, please look at " + "https://trac.torproject.org/projects/tor/ticket/21155."); + } + /* Single Onion Services: non-anonymous hidden services */ if (rend_service_non_anonymous_mode_enabled(options)) { log_warn(LD_CONFIG, @@ -4935,9 +4959,21 @@ options_init_from_torrc(int argc, char **argv) printf("OpenSSL \t\t%-15s\t\t%s\n", crypto_openssl_get_header_version_str(), crypto_openssl_get_version_str()); - printf("Zlib \t\t%-15s\t\t%s\n", - tor_zlib_get_header_version_str(), - tor_zlib_get_version_str()); + if (tor_compress_supports_method(ZLIB_METHOD)) { + printf("Zlib \t\t%-15s\t\t%s\n", + tor_compress_version_str(ZLIB_METHOD), + tor_compress_header_version_str(ZLIB_METHOD)); + } + if (tor_compress_supports_method(LZMA_METHOD)) { + printf("Liblzma \t\t%-15s\t\t%s\n", + tor_compress_version_str(LZMA_METHOD), + tor_compress_header_version_str(LZMA_METHOD)); + } + if (tor_compress_supports_method(ZSTD_METHOD)) { + printf("Libzstd \t\t%-15s\t\t%s\n", + tor_compress_version_str(ZSTD_METHOD), + tor_compress_header_version_str(ZSTD_METHOD)); + } //TODO: Hex versions? exit(0); } diff --git a/src/or/config.h b/src/or/config.h index 6645532514..bb7802c990 100644 --- a/src/or/config.h +++ b/src/or/config.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/confparse.c b/src/or/confparse.c index 9e352aca27..abae7e33dc 100644 --- a/src/or/confparse.c +++ b/src/or/confparse.c @@ -2,7 +2,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -31,8 +31,6 @@ static int config_parse_msec_interval(const char *s, int *ok); static int config_parse_interval(const char *s, int *ok); static void config_reset(const config_format_t *fmt, void *options, const config_var_t *var, int use_defaults); -static config_line_t *config_lines_dup_and_filter(const config_line_t *inp, - const char *key); /** Allocate an empty configuration object of a given format type. */ void * @@ -80,120 +78,6 @@ config_expand_abbrev(const config_format_t *fmt, const char *option, return option; } -/** Helper: allocate a new configuration option mapping 'key' to 'val', - * append it to *<b>lst</b>. */ -void -config_line_append(config_line_t **lst, - const char *key, - const char *val) -{ - config_line_t *newline; - - newline = tor_malloc_zero(sizeof(config_line_t)); - newline->key = tor_strdup(key); - newline->value = tor_strdup(val); - newline->next = NULL; - while (*lst) - lst = &((*lst)->next); - - (*lst) = newline; -} - -/** Return the line in <b>lines</b> whose key is exactly <b>key</b>, or NULL - * if no such key exists. For handling commandline-only options only; other - * options should be looked up in the appropriate data structure. */ -const config_line_t * -config_line_find(const config_line_t *lines, - const char *key) -{ - const config_line_t *cl; - for (cl = lines; cl; cl = cl->next) { - if (!strcmp(cl->key, key)) - return cl; - } - return NULL; -} - -/** Helper: parse the config string and strdup into key/value - * strings. Set *result to the list, or NULL if parsing the string - * failed. Return 0 on success, -1 on failure. Warn and ignore any - * misformatted lines. - * - * If <b>extended</b> is set, then treat keys beginning with / and with + as - * indicating "clear" and "append" respectively. */ -int -config_get_lines(const char *string, config_line_t **result, int extended) -{ - config_line_t *list = NULL, **next; - char *k, *v; - const char *parse_err; - - next = &list; - do { - k = v = NULL; - string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err); - if (!string) { - log_warn(LD_CONFIG, "Error while parsing configuration: %s", - parse_err?parse_err:"<unknown>"); - config_free_lines(list); - tor_free(k); - tor_free(v); - return -1; - } - if (k && v) { - unsigned command = CONFIG_LINE_NORMAL; - if (extended) { - if (k[0] == '+') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - command = CONFIG_LINE_APPEND; - } else if (k[0] == '/') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - tor_free(v); - v = tor_strdup(""); - command = CONFIG_LINE_CLEAR; - } - } - /* This list can get long, so we keep a pointer to the end of it - * rather than using config_line_append over and over and getting - * n^2 performance. */ - *next = tor_malloc_zero(sizeof(config_line_t)); - (*next)->key = k; - (*next)->value = v; - (*next)->next = NULL; - (*next)->command = command; - next = &((*next)->next); - } else { - tor_free(k); - tor_free(v); - } - } while (*string); - - *result = list; - return 0; -} - -/** - * Free all the configuration lines on the linked list <b>front</b>. - */ -void -config_free_lines(config_line_t *front) -{ - config_line_t *tmp; - - while (front) { - tmp = front; - front = tmp->next; - - tor_free(tmp->key); - tor_free(tmp->value); - tor_free(tmp); - } -} - /** If <b>key</b> is a deprecated configuration option, return the message * explaining why it is deprecated (which may be an empty string). Return NULL * if it is not deprecated. The <b>key</b> field must be fully expanded. */ @@ -633,36 +517,6 @@ config_value_needs_escape(const char *value) return 0; } -/** Return a newly allocated deep copy of the lines in <b>inp</b>. */ -config_line_t * -config_lines_dup(const config_line_t *inp) -{ - return config_lines_dup_and_filter(inp, NULL); -} - -/** Return a newly allocated deep copy of the lines in <b>inp</b>, - * but only the ones that match <b>key</b>. */ -static config_line_t * -config_lines_dup_and_filter(const config_line_t *inp, - const char *key) -{ - config_line_t *result = NULL; - config_line_t **next_out = &result; - while (inp) { - if (key && strcasecmpstart(inp->key, key)) { - inp = inp->next; - continue; - } - *next_out = tor_malloc_zero(sizeof(config_line_t)); - (*next_out)->key = tor_strdup(inp->key); - (*next_out)->value = tor_strdup(inp->value); - inp = inp->next; - next_out = &((*next_out)->next); - } - (*next_out) = NULL; - return result; -} - /** Return newly allocated line or lines corresponding to <b>key</b> in the * configuration <b>options</b>. If <b>escape_val</b> is true and a * value needs to be quoted before it's put in a config file, quote and @@ -779,6 +633,7 @@ config_get_assigned_option(const config_format_t *fmt, const void *options, tor_free(result); return NULL; case CONFIG_TYPE_LINELIST_S: + tor_free(result->key); tor_free(result); result = config_lines_dup_and_filter(*(const config_line_t **)value, key); @@ -1027,36 +882,6 @@ config_free(const config_format_t *fmt, void *options) tor_free(options); } -/** Return true iff a and b contain identical keys and values in identical - * order. */ -int -config_lines_eq(config_line_t *a, config_line_t *b) -{ - while (a && b) { - if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value)) - return 0; - a = a->next; - b = b->next; - } - if (a || b) - return 0; - return 1; -} - -/** Return the number of lines in <b>a</b> whose key is <b>key</b>. */ -int -config_count_key(const config_line_t *a, const char *key) -{ - int n = 0; - while (a) { - if (!strcasecmp(a->key, key)) { - ++n; - } - a = a->next; - } - return n; -} - /** Return true iff the option <b>name</b> has the same value in <b>o1</b> * and <b>o2</b>. Must not be called for LINELIST_S or OBSOLETE options. */ @@ -1365,8 +1190,6 @@ config_parse_msec_interval(const char *s, int *ok) { uint64_t r; r = config_parse_units(s, time_msec_units, ok); - if (!ok) - return -1; if (r > INT_MAX) { log_warn(LD_CONFIG, "Msec interval '%s' is too long", s); *ok = 0; @@ -1384,8 +1207,6 @@ config_parse_interval(const char *s, int *ok) { uint64_t r; r = config_parse_units(s, time_units, ok); - if (!ok) - return -1; if (r > INT_MAX) { log_warn(LD_CONFIG, "Interval '%s' is too long", s); *ok = 0; diff --git a/src/or/confparse.h b/src/or/confparse.h index 8d915d266b..6f5c681ba8 100644 --- a/src/or/confparse.h +++ b/src/or/confparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONFPARSE_H @@ -103,14 +103,7 @@ typedef struct config_format_t { #define CAL_WARN_DEPRECATIONS (1u<<2) void *config_new(const config_format_t *fmt); -void config_line_append(config_line_t **lst, - const char *key, const char *val); -config_line_t *config_lines_dup(const config_line_t *inp); -const config_line_t *config_line_find(const config_line_t *lines, - const char *key); void config_free(const config_format_t *fmt, void *options); -int config_lines_eq(config_line_t *a, config_line_t *b); -int config_count_key(const config_line_t *a, const char *key); config_line_t *config_get_assigned_option(const config_format_t *fmt, const void *options, const char *key, int escape_val); @@ -132,8 +125,6 @@ const char *config_find_deprecation(const config_format_t *fmt, const config_var_t *config_find_option(const config_format_t *fmt, const char *key); -int config_get_lines(const char *string, config_line_t **result, int extended); -void config_free_lines(config_line_t *front); const char *config_expand_abbrev(const config_format_t *fmt, const char *option, int command_line, int warn_obsolete); diff --git a/src/or/connection.c b/src/or/connection.c index 188276026f..5fb2c53677 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -628,13 +628,13 @@ connection_free_(connection_t *conn) dir_connection_t *dir_conn = TO_DIR_CONN(conn); tor_free(dir_conn->requested_resource); - tor_zlib_free(dir_conn->zlib_state); - if (dir_conn->fingerprint_stack) { - SMARTLIST_FOREACH(dir_conn->fingerprint_stack, char *, cp, tor_free(cp)); - smartlist_free(dir_conn->fingerprint_stack); + tor_compress_free(dir_conn->compress_state); + if (dir_conn->spool) { + SMARTLIST_FOREACH(dir_conn->spool, spooled_resource_t *, spooled, + spooled_resource_free(spooled)); + smartlist_free(dir_conn->spool); } - cached_dir_decref(dir_conn->cached_dir); rend_data_free(dir_conn->rend_data); if (dir_conn->guard_state) { /* Cancel before freeing, if it's still there. */ @@ -4060,9 +4060,9 @@ connection_write_to_buf_impl_,(const char *string, size_t len, if (zlib) { dir_connection_t *dir_conn = TO_DIR_CONN(conn); int done = zlib < 0; - CONN_LOG_PROTECT(conn, r = write_to_buf_zlib(conn->outbuf, - dir_conn->zlib_state, - string, len, done)); + CONN_LOG_PROTECT(conn, r = write_to_buf_compress(conn->outbuf, + dir_conn->compress_state, + string, len, done)); } else { CONN_LOG_PROTECT(conn, r = write_to_buf(string, len, conn->outbuf)); } diff --git a/src/or/connection.h b/src/or/connection.h index d25e002fa4..36e45aef38 100644 --- a/src/or/connection.h +++ b/src/or/connection.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -141,17 +141,17 @@ MOCK_DECL(void, connection_write_to_buf_impl_, /* DOCDOC connection_write_to_buf */ static void connection_write_to_buf(const char *string, size_t len, connection_t *conn); -/* DOCDOC connection_write_to_buf_zlib */ -static void connection_write_to_buf_zlib(const char *string, size_t len, - dir_connection_t *conn, int done); +/* DOCDOC connection_write_to_buf_compress */ +static void connection_write_to_buf_compress(const char *string, size_t len, + dir_connection_t *conn, int done); static inline void connection_write_to_buf(const char *string, size_t len, connection_t *conn) { connection_write_to_buf_impl_(string, len, conn, 0); } static inline void -connection_write_to_buf_zlib(const char *string, size_t len, - dir_connection_t *conn, int done) +connection_write_to_buf_compress(const char *string, size_t len, + dir_connection_t *conn, int done) { connection_write_to_buf_impl_(string, len, TO_CONN(conn), done ? -1 : 1); } diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index ef551048b8..d1728eca6d 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -29,7 +29,7 @@ * <li>DNS lookup streams, created on the exit side in response to * a RELAY_RESOLVE cell from a client. * <li>Tunneled directory streams, created on the directory cache side - * in response to a RELAY_BEGINDIR cell. These streams attach directly + * in response to a RELAY_BEGIN_DIR cell. These streams attach directly * to a dir_connection_t object without ever using TCP. * </ul> * @@ -1762,7 +1762,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, conn->entry_cfg.ipv6_traffic = 0; /* Still handling CONNECT. Now, check for exit enclaves. (Which we - * don't do on BEGINDIR, or when there is a chosen exit.) + * don't do on BEGIN_DIR, or when there is a chosen exit.) * * TODO: Should we remove this? Exit enclaves are nutty and don't * work very well @@ -2514,14 +2514,20 @@ connection_ap_handshake_send_begin(entry_connection_t *ap_conn) } else if (begin_type == RELAY_COMMAND_BEGIN_DIR) { /* This connection is a begindir directory connection. * Look at the linked directory connection to access the directory purpose. - * (This must be non-NULL, because we're doing begindir.) */ - tor_assert(base_conn->linked); + * If a BEGINDIR connection is ever not linked, that's a bug. */ + if (BUG(!base_conn->linked)) { + return -1; + } connection_t *linked_dir_conn_base = base_conn->linked_conn; - tor_assert(linked_dir_conn_base); + /* If the linked connection has been unlinked by other code, we can't send + * a begin cell on it. */ + if (!linked_dir_conn_base) { + return -1; + } /* Sensitive directory connections must have an anonymous path length. * Otherwise, directory connections are typically one-hop. * This matches the earlier check for directory connection path anonymity - * in directory_initiate_command_rend(). */ + * in directory_initiate_request(). */ if (purpose_needs_anonymity(linked_dir_conn_base->purpose, TO_DIR_CONN(linked_dir_conn_base)->router_purpose, TO_DIR_CONN(linked_dir_conn_base)->requested_resource)) { @@ -2995,7 +3001,7 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, return; } -/** Read a RELAY_BEGIN or RELAY_BEGINDIR cell from <b>cell</b>, decode it, and +/** Read a RELAY_BEGIN or RELAY_BEGIN_DIR cell from <b>cell</b>, decode it, and * place the result in <b>bcell</b>. On success return 0; on failure return * <0 and set *<b>end_reason_out</b> to the end reason we should send back to * the client. diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h index 61b5752aed..e4780b3c7d 100644 --- a/src/or/connection_edge.h +++ b/src/or/connection_edge.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/connection_or.c b/src/or/connection_or.c index cefe42c4db..61da43e119 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/connection_or.h b/src/or/connection_or.h index 80a5bddb14..40008426e9 100644 --- a/src/or/connection_or.h +++ b/src/or/connection_or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/conscache.c b/src/or/conscache.c new file mode 100644 index 0000000000..5ffa129bbe --- /dev/null +++ b/src/or/conscache.c @@ -0,0 +1,541 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" + +#include "config.h" +#include "conscache.h" +#include "storagedir.h" + +#define CCE_MAGIC 0x17162253 + +/** + * A consensus_cache_entry_t is a reference-counted handle to an + * item in a consensus_cache_t. It can be mmapped into RAM, or not, + * depending whether it's currently in use. + */ +struct consensus_cache_entry_t { + uint32_t magic; /**< Must be set to CCE_MAGIC */ + HANDLE_ENTRY(consensus_cache_entry, consensus_cache_entry_t); + int32_t refcnt; /**< Reference count. */ + unsigned can_remove : 1; /**< If true, we want to delete this file. */ + /** If true, we intend to unmap this file as soon as we're done with it. */ + unsigned release_aggressively : 1; + + /** Filename for this object within the storage_dir_t */ + char *fname; + /** Labels associated with this object. Immutable once the object + * is created. */ + config_line_t *labels; + /** Pointer to the cache that includes this entry (if any). */ + consensus_cache_t *in_cache; + + /** Since what time has this object been mapped into RAM, but with the cache + * being the only having a reference to it? */ + time_t unused_since; + /** mmaped contents of the underlying file. May be NULL */ + tor_mmap_t *map; + /** Length of the body within <b>map</b>. */ + size_t bodylen; + /** Pointer to the body within <b>map</b>. */ + const uint8_t *body; +}; + +/** + * A consensus_cache_t holds a directory full of labeled items. + */ +struct consensus_cache_t { + /** Underling storage_dir_t to handle persistence */ + storage_dir_t *dir; + /** List of all the entries in the directory. */ + smartlist_t *entries; +}; + +static void consensus_cache_clear(consensus_cache_t *cache); +static void consensus_cache_rescan(consensus_cache_t *); +static void consensus_cache_entry_map(consensus_cache_t *, + consensus_cache_entry_t *); +static void consensus_cache_entry_unmap(consensus_cache_entry_t *ent); + +/** + * Helper: Open a consensus cache in subdirectory <b>subdir</b> of the + * data directory, to hold up to <b>max_entries</b> of data. + */ +consensus_cache_t * +consensus_cache_open(const char *subdir, int max_entries) +{ + consensus_cache_t *cache = tor_malloc_zero(sizeof(consensus_cache_t)); + char *directory = get_datadir_fname(subdir); + cache->dir = storage_dir_new(directory, max_entries); + tor_free(directory); + if (!cache->dir) { + tor_free(cache); + return NULL; + } + + consensus_cache_rescan(cache); + return cache; +} + +/** + * Tell the sandbox (if any) configured by <b>cfg</b> to allow the + * operations that <b>cache</b> will need. + */ +int +consensus_cache_register_with_sandbox(consensus_cache_t *cache, + struct sandbox_cfg_elem **cfg) +{ + return storage_dir_register_with_sandbox(cache->dir, cfg); +} + +/** + * Helper: clear all entries from <b>cache</b> (but do not delete + * any that aren't marked for removal + */ +static void +consensus_cache_clear(consensus_cache_t *cache) +{ + consensus_cache_delete_pending(cache, 0); + + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + ent->in_cache = NULL; + consensus_cache_entry_decref(ent); + } SMARTLIST_FOREACH_END(ent); + smartlist_free(cache->entries); + cache->entries = NULL; +} + +/** + * Drop all storage held by <b>cache</b>. + */ +void +consensus_cache_free(consensus_cache_t *cache) +{ + if (! cache) + return; + + if (cache->entries) { + consensus_cache_clear(cache); + } + storage_dir_free(cache->dir); + tor_free(cache); +} + +/** + * Write <b>datalen</b> bytes of data at <b>data</b> into the <b>cache</b>, + * labeling that data with <b>labels</b>. On failure, return NULL. On + * success, return a newly created consensus_cache_entry_t. + * + * The returned value will be owned by the cache, and you will have a + * reference to it. Call consensus_cache_entry_decref() when you are + * done with it. + * + * The provided <b>labels</b> MUST have distinct keys: if they don't, + * this API does not specify which values (if any) for the duplicate keys + * will be considered. + */ +consensus_cache_entry_t * +consensus_cache_add(consensus_cache_t *cache, + const config_line_t *labels, + const uint8_t *data, + size_t datalen) +{ + char *fname = NULL; + int r = storage_dir_save_labeled_to_file(cache->dir, + labels, data, datalen, &fname); + if (r < 0 || fname == NULL) { + return NULL; + } + consensus_cache_entry_t *ent = + tor_malloc_zero(sizeof(consensus_cache_entry_t)); + ent->magic = CCE_MAGIC; + ent->fname = fname; + ent->labels = config_lines_dup(labels); + ent->in_cache = cache; + ent->unused_since = TIME_MAX; + smartlist_add(cache->entries, ent); + /* Start the reference count at 2: the caller owns one copy, and the + * cache owns another. + */ + ent->refcnt = 2; + + return ent; +} + +/** + * Given a <b>cache</b>, return some entry for which <b>key</b>=<b>value</b>. + * Return NULL if no such entry exists. + * + * Does not adjust reference counts. + */ +consensus_cache_entry_t * +consensus_cache_find_first(consensus_cache_t *cache, + const char *key, + const char *value) +{ + smartlist_t *tmp = smartlist_new(); + consensus_cache_find_all(tmp, cache, key, value); + consensus_cache_entry_t *ent = NULL; + if (smartlist_len(tmp)) + ent = smartlist_get(tmp, 0); + smartlist_free(tmp); + return ent; +} + +/** + * Given a <b>cache</b>, add every entry to <b>out<b> for which + * <b>key</b>=<b>value</b>. If <b>key</b> is NULL, add every entry. + * + * Do not add any entry that has been marked for removal. + * + * Does not adjust reference counts. + */ +void +consensus_cache_find_all(smartlist_t *out, + consensus_cache_t *cache, + const char *key, + const char *value) +{ + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + if (ent->can_remove == 1) { + /* We want to delete this; pretend it isn't there. */ + continue; + } + if (! key) { + smartlist_add(out, ent); + continue; + } + const char *found_val = consensus_cache_entry_get_value(ent, key); + if (found_val && !strcmp(value, found_val)) { + smartlist_add(out, ent); + } + } SMARTLIST_FOREACH_END(ent); +} + +/** + * Given a list of consensus_cache_entry_t, remove all those entries + * that do not have <b>key</b>=<b>value</b> in their labels. + * + * Does not adjust reference counts. + */ +void +consensus_cache_filter_list(smartlist_t *lst, + const char *key, + const char *value) +{ + if (BUG(lst == NULL)) + return; // LCOV_EXCL_LINE + if (key == NULL) + return; + SMARTLIST_FOREACH_BEGIN(lst, consensus_cache_entry_t *, ent) { + const char *found_val = consensus_cache_entry_get_value(ent, key); + if (! found_val || strcmp(value, found_val)) { + SMARTLIST_DEL_CURRENT(lst, ent); + } + } SMARTLIST_FOREACH_END(ent); +} + +/** + * If <b>ent</b> has a label with the given <b>key</b>, return its + * value. Otherwise return NULL. + * + * The return value is only guaranteed to be valid for as long as you + * hold a reference to <b>ent</b>. + */ +const char * +consensus_cache_entry_get_value(const consensus_cache_entry_t *ent, + const char *key) +{ + const config_line_t *match = config_line_find(ent->labels, key); + if (match) + return match->value; + else + return NULL; +} + +/** + * Return a pointer to the labels in <b>ent</b>. + * + * This pointer is only guaranteed to be valid for as long as you + * hold a reference to <b>ent</b>. + */ +const config_line_t * +consensus_cache_entry_get_labels(const consensus_cache_entry_t *ent) +{ + return ent->labels; +} + +/** + * Increase the reference count of <b>ent</b>. + */ +void +consensus_cache_entry_incref(consensus_cache_entry_t *ent) +{ + if (BUG(ent->magic != CCE_MAGIC)) + return; // LCOV_EXCL_LINE + ++ent->refcnt; + ent->unused_since = TIME_MAX; +} + +/** + * Release a reference held to <b>ent</b>. + * + * If it was the last reference, ent will be freed. Therefore, you must not + * use <b>ent</b> after calling this function. + */ +void +consensus_cache_entry_decref(consensus_cache_entry_t *ent) +{ + if (! ent) + return; + if (BUG(ent->refcnt <= 0)) + return; // LCOV_EXCL_LINE + if (BUG(ent->magic != CCE_MAGIC)) + return; // LCOV_EXCL_LINE + + --ent->refcnt; + + if (ent->refcnt == 1 && ent->in_cache) { + /* Only the cache has a reference: we don't need to keep the file + * mapped */ + if (ent->map) { + if (ent->release_aggressively) { + consensus_cache_entry_unmap(ent); + } else { + ent->unused_since = approx_time(); + } + } + return; + } + + if (ent->refcnt > 0) + return; + + /* Refcount is zero; we can free it. */ + if (ent->map) { + consensus_cache_entry_unmap(ent); + } + tor_free(ent->fname); + config_free_lines(ent->labels); + consensus_cache_entry_handles_clear(ent); + memwipe(ent, 0, sizeof(consensus_cache_entry_t)); + tor_free(ent); +} + +/** + * Mark <b>ent</b> for deletion from the cache. Deletion will not occur + * until the cache is the only place that holds a reference to <b>ent</b>. + */ +void +consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent) +{ + ent->can_remove = 1; +} + +/** + * Mark <b>ent</b> as the kind of entry that we don't need to keep mmap'd for + * any longer than we're actually using it. + */ +void +consensus_cache_entry_mark_for_aggressive_release(consensus_cache_entry_t *ent) +{ + ent->release_aggressively = 1; +} + +/** + * Try to read the body of <b>ent</b> into memory if it isn't already + * loaded. On success, set *<b>body_out</b> to the body, *<b>sz_out</b> + * to its size, and return 0. On failure return -1. + * + * The resulting body pointer will only be valid for as long as you + * hold a reference to <b>ent</b>. + */ +int +consensus_cache_entry_get_body(const consensus_cache_entry_t *ent, + const uint8_t **body_out, + size_t *sz_out) +{ + if (BUG(ent->magic != CCE_MAGIC)) + return -1; // LCOV_EXCL_LINE + + if (! ent->map) { + if (! ent->in_cache) + return -1; + + consensus_cache_entry_map((consensus_cache_t *)ent->in_cache, + (consensus_cache_entry_t *)ent); + if (! ent->map) { + return -1; + } + } + + *body_out = ent->body; + *sz_out = ent->bodylen; + return 0; +} + +/** + * Unmap every mmap'd element of <b>cache</b> that has been unused + * since <b>cutoff</b>. + */ +void +consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff) +{ + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + tor_assert_nonfatal(ent->in_cache == cache); + if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) { + /* Somebody is using this entry right now */ + continue; + } + if (ent->unused_since > cutoff) { + /* Has been unused only for a little while */ + continue; + } + if (ent->map == NULL) { + /* Not actually mapped. */ + continue; + } + consensus_cache_entry_unmap(ent); + } SMARTLIST_FOREACH_END(ent); +} + +/** + * Return the number of currently unused filenames available in this cache. + */ +int +consensus_cache_get_n_filenames_available(consensus_cache_t *cache) +{ + tor_assert(cache); + int max = storage_dir_get_max_files(cache->dir); + int used = smartlist_len(storage_dir_list(cache->dir)); + tor_assert_nonfatal(max >= used); + return max - used; +} + +/** + * Delete every element of <b>cache</b> has been marked with + * consensus_cache_entry_mark_for_removal. If <b>force</b> is false, + * retain those entries which are not in use except by the cache. + */ +void +consensus_cache_delete_pending(consensus_cache_t *cache, int force) +{ + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + tor_assert_nonfatal(ent->in_cache == cache); + if (! force) { + if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) { + /* Somebody is using this entry right now */ + continue; + } + } + if (ent->can_remove == 0) { + /* Don't want to delete this. */ + continue; + } + if (BUG(ent->refcnt <= 0)) { + continue; // LCOV_EXCL_LINE + } + + SMARTLIST_DEL_CURRENT(cache->entries, ent); + ent->in_cache = NULL; + char *fname = tor_strdup(ent->fname); /* save a copy */ + consensus_cache_entry_decref(ent); + storage_dir_remove_file(cache->dir, fname); + tor_free(fname); + } SMARTLIST_FOREACH_END(ent); +} + +/** + * Internal helper: rescan <b>cache</b> and rebuild its list of entries. + */ +static void +consensus_cache_rescan(consensus_cache_t *cache) +{ + if (cache->entries) { + consensus_cache_clear(cache); + } + + cache->entries = smartlist_new(); + const smartlist_t *fnames = storage_dir_list(cache->dir); + SMARTLIST_FOREACH_BEGIN(fnames, const char *, fname) { + tor_mmap_t *map = NULL; + config_line_t *labels = NULL; + const uint8_t *body; + size_t bodylen; + map = storage_dir_map_labeled(cache->dir, fname, + &labels, &body, &bodylen); + if (! map) { + /* Can't load this; continue */ + log_warn(LD_FS, "Unable to map file %s from consensus cache: %s", + escaped(fname), strerror(errno)); + continue; + } + consensus_cache_entry_t *ent = + tor_malloc_zero(sizeof(consensus_cache_entry_t)); + ent->magic = CCE_MAGIC; + ent->fname = tor_strdup(fname); + ent->labels = labels; + ent->refcnt = 1; + ent->in_cache = cache; + ent->unused_since = TIME_MAX; + smartlist_add(cache->entries, ent); + tor_munmap_file(map); /* don't actually need to keep this around */ + } SMARTLIST_FOREACH_END(fname); +} + +/** + * Make sure that <b>ent</b> is mapped into RAM. + */ +static void +consensus_cache_entry_map(consensus_cache_t *cache, + consensus_cache_entry_t *ent) +{ + if (ent->map) + return; + + ent->map = storage_dir_map_labeled(cache->dir, ent->fname, + NULL, &ent->body, &ent->bodylen); + ent->unused_since = TIME_MAX; +} + +/** + * Unmap <b>ent</b> from RAM. + * + * Do not call this if something other than the cache is holding a reference + * to <b>ent</b> + */ +static void +consensus_cache_entry_unmap(consensus_cache_entry_t *ent) +{ + ent->unused_since = TIME_MAX; + if (!ent->map) + return; + + tor_munmap_file(ent->map); + ent->map = NULL; + ent->body = NULL; + ent->bodylen = 0; + ent->unused_since = TIME_MAX; +} + +HANDLE_IMPL(consensus_cache_entry, consensus_cache_entry_t, ) + +#ifdef TOR_UNIT_TESTS +/** + * Testing only: Return true iff <b>ent</b> is mapped into memory. + * + * (In normal operation, this information is not exposed.) + */ +int +consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent) +{ + if (ent->map) { + tor_assert(ent->body); + return 1; + } else { + tor_assert(!ent->body); + return 0; + } +} +#endif + diff --git a/src/or/conscache.h b/src/or/conscache.h new file mode 100644 index 0000000000..aef54201f0 --- /dev/null +++ b/src/or/conscache.h @@ -0,0 +1,61 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONSCACHE_H +#define TOR_CONSCACHE_H + +#include "handles.h" + +typedef struct consensus_cache_entry_t consensus_cache_entry_t; +typedef struct consensus_cache_t consensus_cache_t; + +HANDLE_DECL(consensus_cache_entry, consensus_cache_entry_t, ) + +consensus_cache_t *consensus_cache_open(const char *subdir, int max_entries); +void consensus_cache_free(consensus_cache_t *cache); +struct sandbox_cfg_elem; +int consensus_cache_register_with_sandbox(consensus_cache_t *cache, + struct sandbox_cfg_elem **cfg); +void consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff); +void consensus_cache_delete_pending(consensus_cache_t *cache, + int force); +int consensus_cache_get_n_filenames_available(consensus_cache_t *cache); +consensus_cache_entry_t *consensus_cache_add(consensus_cache_t *cache, + const config_line_t *labels, + const uint8_t *data, + size_t datalen); + +consensus_cache_entry_t *consensus_cache_find_first( + consensus_cache_t *cache, + const char *key, + const char *value); + +void consensus_cache_find_all(smartlist_t *out, + consensus_cache_t *cache, + const char *key, + const char *value); +void consensus_cache_filter_list(smartlist_t *lst, + const char *key, + const char *value); + +const char *consensus_cache_entry_get_value(const consensus_cache_entry_t *ent, + const char *key); +const config_line_t *consensus_cache_entry_get_labels( + const consensus_cache_entry_t *ent); + +void consensus_cache_entry_incref(consensus_cache_entry_t *ent); +void consensus_cache_entry_decref(consensus_cache_entry_t *ent); + +void consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent); +void consensus_cache_entry_mark_for_aggressive_release( + consensus_cache_entry_t *ent); +int consensus_cache_entry_get_body(const consensus_cache_entry_t *ent, + const uint8_t **body_out, + size_t *sz_out); + +#ifdef TOR_UNIT_TESTS +int consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent); +#endif + +#endif + diff --git a/src/or/consdiff.c b/src/or/consdiff.c new file mode 100644 index 0000000000..c0fe979b60 --- /dev/null +++ b/src/or/consdiff.c @@ -0,0 +1,1314 @@ +/* Copyright (c) 2014, Daniel Martà + * Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file consdiff.c + * \brief Consensus diff implementation, including both the generation and the + * application of diffs in a minimal ed format. + * + * The consensus diff application is done in consdiff_apply_diff, which relies + * on apply_ed_diff for the main ed diff part and on some digest helper + * functions to check the digest hashes found in the consensus diff header. + * + * The consensus diff generation is more complex. consdiff_gen_diff generates + * it, relying on gen_ed_diff to generate the ed diff and some digest helper + * functions to generate the digest hashes. + * + * gen_ed_diff is the tricky bit. In it simplest form, it will take quadratic + * time and linear space to generate an ed diff given two smartlists. As shown + * in its comment section, calling calc_changes on the entire two consensuses + * will calculate what is to be added and what is to be deleted in the diff. + * Its comment section briefly explains how it works. + * + * In our case specific to consensuses, we take advantage of the fact that + * consensuses list routers sorted by their identities. We use that + * information to avoid running calc_changes on the whole smartlists. + * gen_ed_diff will navigate through the two consensuses identity by identity + * and will send small couples of slices to calc_changes, keeping the running + * time near-linear. This is explained in more detail in the gen_ed_diff + * comments. + * + * The allocation strategy tries to save time and memory by avoiding needless + * copies. Instead of actually splitting the inputs into separate strings, we + * allocate cdline_t objects, each of which represents a line in the original + * object or in the output. We use memarea_t allocators to manage the + * temporary memory we use when generating or applying diffs. + **/ + +#define CONSDIFF_PRIVATE + +#include "or.h" +#include "consdiff.h" +#include "memarea.h" +#include "routerparse.h" + +static const char* ns_diff_version = "network-status-diff-version 1"; +static const char* hash_token = "hash"; + +static char *consensus_join_lines(const smartlist_t *inp); + +/** Return true iff a and b have the same contents. */ +STATIC int +lines_eq(const cdline_t *a, const cdline_t *b) +{ + return a->len == b->len && fast_memeq(a->s, b->s, a->len); +} + +/** Return true iff a has the same contents as the nul-terminated string b. */ +STATIC int +line_str_eq(const cdline_t *a, const char *b) +{ + const size_t len = strlen(b); + tor_assert(len <= UINT32_MAX); + cdline_t bline = { b, (uint32_t)len }; + return lines_eq(a, &bline); +} + +/** Add a cdline_t to <b>lst</b> holding as its contents the nul-terminated + * string s. Use the provided memory area for storage. */ +STATIC void +smartlist_add_linecpy(smartlist_t *lst, memarea_t *area, const char *s) +{ + size_t len = strlen(s); + const char *ss = memarea_memdup(area, s, len); + cdline_t *line = memarea_alloc(area, sizeof(cdline_t)); + line->s = ss; + line->len = (uint32_t)len; + smartlist_add(lst, line); +} + +/** Compute the digest of <b>cons</b>, and store the result in + * <b>digest_out</b>. Return 0 on success, -1 on failure. */ +/* This is a separate, mockable function so that we can override it when + * fuzzing. */ +MOCK_IMPL(STATIC int, +consensus_compute_digest,(const char *cons, + consensus_digest_t *digest_out)) +{ + int r = crypto_digest256((char*)digest_out->sha3_256, + cons, strlen(cons), DIGEST_SHA3_256); + return r; +} + +/** Return true iff <b>d1</b> and <b>d2</b> contain the same digest */ +/* This is a separate, mockable function so that we can override it when + * fuzzing. */ +MOCK_IMPL(STATIC int, +consensus_digest_eq,(const uint8_t *d1, + const uint8_t *d2)) +{ + return fast_memeq(d1, d2, DIGEST256_LEN); +} + +/** Create (allocate) a new slice from a smartlist. Assumes that the start + * and the end indexes are within the bounds of the initial smartlist. The end + * element is not part of the resulting slice. If end is -1, the slice is to + * reach the end of the smartlist. + */ +STATIC smartlist_slice_t * +smartlist_slice(const smartlist_t *list, int start, int end) +{ + int list_len = smartlist_len(list); + tor_assert(start >= 0); + tor_assert(start <= list_len); + if (end == -1) { + end = list_len; + } + tor_assert(start <= end); + + smartlist_slice_t *slice = tor_malloc(sizeof(smartlist_slice_t)); + slice->list = list; + slice->offset = start; + slice->len = end - start; + return slice; +} + +/** Helper: Compute the longest common subsequence lengths for the two slices. + * Used as part of the diff generation to find the column at which to split + * slice2 while still having the optimal solution. + * If direction is -1, the navigation is reversed. Otherwise it must be 1. + * The length of the resulting integer array is that of the second slice plus + * one. + */ +STATIC int * +lcs_lengths(const smartlist_slice_t *slice1, const smartlist_slice_t *slice2, + int direction) +{ + size_t a_size = sizeof(int) * (slice2->len+1); + + /* Resulting lcs lengths. */ + int *result = tor_malloc_zero(a_size); + /* Copy of the lcs lengths from the last iteration. */ + int *prev = tor_malloc(a_size); + + tor_assert(direction == 1 || direction == -1); + + int si = slice1->offset; + if (direction == -1) { + si += (slice1->len-1); + } + + for (int i = 0; i < slice1->len; ++i, si+=direction) { + + const cdline_t *line1 = smartlist_get(slice1->list, si); + /* Store the last results. */ + memcpy(prev, result, a_size); + + int sj = slice2->offset; + if (direction == -1) { + sj += (slice2->len-1); + } + + for (int j = 0; j < slice2->len; ++j, sj+=direction) { + + const cdline_t *line2 = smartlist_get(slice2->list, sj); + if (lines_eq(line1, line2)) { + /* If the lines are equal, the lcs is one line longer. */ + result[j + 1] = prev[j] + 1; + } else { + /* If not, see what lcs parent path is longer. */ + result[j + 1] = MAX(result[j], prev[j + 1]); + } + } + } + tor_free(prev); + return result; +} + +/** Helper: Trim any number of lines that are equally at the start or the end + * of both slices. + */ +STATIC void +trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2) +{ + while (slice1->len>0 && slice2->len>0) { + const cdline_t *line1 = smartlist_get(slice1->list, slice1->offset); + const cdline_t *line2 = smartlist_get(slice2->list, slice2->offset); + if (!lines_eq(line1, line2)) { + break; + } + slice1->offset++; slice1->len--; + slice2->offset++; slice2->len--; + } + + int i1 = (slice1->offset+slice1->len)-1; + int i2 = (slice2->offset+slice2->len)-1; + + while (slice1->len>0 && slice2->len>0) { + const cdline_t *line1 = smartlist_get(slice1->list, i1); + const cdline_t *line2 = smartlist_get(slice2->list, i2); + if (!lines_eq(line1, line2)) { + break; + } + i1--; + slice1->len--; + i2--; + slice2->len--; + } +} + +/** Like smartlist_string_pos, but uses a cdline_t, and is restricted to the + * bounds of the slice. + */ +STATIC int +smartlist_slice_string_pos(const smartlist_slice_t *slice, + const cdline_t *string) +{ + int end = slice->offset + slice->len; + for (int i = slice->offset; i < end; ++i) { + const cdline_t *el = smartlist_get(slice->list, i); + if (lines_eq(el, string)) { + return i; + } + } + return -1; +} + +/** Helper: Set all the appropriate changed booleans to true. The first slice + * must be of length 0 or 1. All the lines of slice1 and slice2 which are not + * present in the other slice will be set to changed in their bool array. + * The two changed bool arrays are passed in the same order as the slices. + */ +STATIC void +set_changed(bitarray_t *changed1, bitarray_t *changed2, + const smartlist_slice_t *slice1, const smartlist_slice_t *slice2) +{ + int toskip = -1; + tor_assert(slice1->len == 0 || slice1->len == 1); + + if (slice1->len == 1) { + const cdline_t *line_common = smartlist_get(slice1->list, slice1->offset); + toskip = smartlist_slice_string_pos(slice2, line_common); + if (toskip == -1) { + bitarray_set(changed1, slice1->offset); + } + } + int end = slice2->offset + slice2->len; + for (int i = slice2->offset; i < end; ++i) { + if (i != toskip) { + bitarray_set(changed2, i); + } + } +} + +/* + * Helper: Given that slice1 has been split by half into top and bot, we want + * to fetch the column at which to split slice2 so that we are still on track + * to the optimal diff solution, i.e. the shortest one. We use lcs_lengths + * since the shortest diff is just another way to say the longest common + * subsequence. + */ +static int +optimal_column_to_split(const smartlist_slice_t *top, + const smartlist_slice_t *bot, + const smartlist_slice_t *slice2) +{ + int *lens_top = lcs_lengths(top, slice2, 1); + int *lens_bot = lcs_lengths(bot, slice2, -1); + int column=0, max_sum=-1; + + for (int i = 0; i < slice2->len+1; ++i) { + int sum = lens_top[i] + lens_bot[slice2->len-i]; + if (sum > max_sum) { + column = i; + max_sum = sum; + } + } + tor_free(lens_top); + tor_free(lens_bot); + + return column; +} + +/** + * Helper: Figure out what elements are new or gone on the second smartlist + * relative to the first smartlist, and store the booleans in the bitarrays. + * True on the first bitarray means the element is gone, true on the second + * bitarray means it's new. + * + * In its base case, either of the smartlists is of length <= 1 and we can + * quickly see what elements are new or are gone. In the other case, we will + * split one smartlist by half and we'll use optimal_column_to_split to find + * the optimal column at which to split the second smartlist so that we are + * finding the smallest diff possible. + */ +STATIC void +calc_changes(smartlist_slice_t *slice1, + smartlist_slice_t *slice2, + bitarray_t *changed1, bitarray_t *changed2) +{ + trim_slices(slice1, slice2); + + if (slice1->len <= 1) { + set_changed(changed1, changed2, slice1, slice2); + + } else if (slice2->len <= 1) { + set_changed(changed2, changed1, slice2, slice1); + + /* Keep on splitting the slices in two. */ + } else { + smartlist_slice_t *top, *bot, *left, *right; + + /* Split the first slice in half. */ + int mid = slice1->len/2; + top = smartlist_slice(slice1->list, slice1->offset, slice1->offset+mid); + bot = smartlist_slice(slice1->list, slice1->offset+mid, + slice1->offset+slice1->len); + + /* Split the second slice by the optimal column. */ + int mid2 = optimal_column_to_split(top, bot, slice2); + left = smartlist_slice(slice2->list, slice2->offset, slice2->offset+mid2); + right = smartlist_slice(slice2->list, slice2->offset+mid2, + slice2->offset+slice2->len); + + calc_changes(top, left, changed1, changed2); + calc_changes(bot, right, changed1, changed2); + tor_free(top); + tor_free(bot); + tor_free(left); + tor_free(right); + } +} + +/* This table is from crypto.c. The SP and PAD defines are different. */ +#define NOT_VALID_BASE64 255 +#define X NOT_VALID_BASE64 +#define SP NOT_VALID_BASE64 +#define PAD NOT_VALID_BASE64 +static const uint8_t base64_compare_table[256] = { + X, X, X, X, X, X, X, X, X, SP, SP, SP, X, SP, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + SP, X, X, X, X, X, X, X, X, X, X, 62, X, X, X, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X, X, X, PAD, X, X, + X, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X, X, X, X, X, + X, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, +}; + +/** Helper: Get the identity hash from a router line, assuming that the line + * at least appears to be a router line and thus starts with "r ". + * + * If an identity hash is found, store it (without decoding it) in + * <b>hash_out</b>, and return 0. On failure, return -1. + */ +STATIC int +get_id_hash(const cdline_t *line, cdline_t *hash_out) +{ + if (line->len < 2) + return -1; + + /* Skip the router name. */ + const char *hash = memchr(line->s + 2, ' ', line->len - 2); + if (!hash) { + return -1; + } + + hash++; + const char *hash_end = hash; + /* Stop when the first non-base64 character is found. Use unsigned chars to + * avoid negative indexes causing crashes. + */ + while (base64_compare_table[*((unsigned char*)hash_end)] + != NOT_VALID_BASE64 && + hash_end < line->s + line->len) { + hash_end++; + } + + /* Empty hash. */ + if (hash_end == hash) { + return -1; + } + + hash_out->s = hash; + /* Always true because lines are limited to this length */ + tor_assert(hash_end >= hash); + tor_assert((size_t)(hash_end - hash) <= UINT32_MAX); + hash_out->len = (uint32_t)(hash_end - hash); + + return 0; +} + +/** Helper: Check that a line is a valid router entry. We must at least be + * able to fetch a proper identity hash from it for it to be valid. + */ +STATIC int +is_valid_router_entry(const cdline_t *line) +{ + if (line->len < 2 || fast_memneq(line->s, "r ", 2)) + return 0; + cdline_t tmp; + return (get_id_hash(line, &tmp) == 0); +} + +/** Helper: Find the next router line starting at the current position. + * Assumes that cur is lower than the length of the smartlist, i.e. it is a + * line within the bounds of the consensus. The only exception is when we + * don't want to skip the first line, in which case cur will be -1. + */ +STATIC int +next_router(const smartlist_t *cons, int cur) +{ + int len = smartlist_len(cons); + tor_assert(cur >= -1 && cur < len); + + if (++cur >= len) { + return len; + } + + const cdline_t *line = smartlist_get(cons, cur); + while (!is_valid_router_entry(line)) { + if (++cur >= len) { + return len; + } + line = smartlist_get(cons, cur); + } + return cur; +} + +/** Helper: compare two base64-encoded identity hashes, which may be of + * different lengths. Comparison ends when the first non-base64 char is found. + */ +STATIC int +base64cmp(const cdline_t *hash1, const cdline_t *hash2) +{ + /* NULL is always lower, useful for last_hash which starts at NULL. */ + if (!hash1->s && !hash2->s) { + return 0; + } + if (!hash1->s) { + return -1; + } + if (!hash2->s) { + return 1; + } + + /* Don't index with a char; char may be signed. */ + const unsigned char *a = (unsigned char*)hash1->s; + const unsigned char *b = (unsigned char*)hash2->s; + const unsigned char *a_end = a + hash1->len; + const unsigned char *b_end = b + hash2->len; + while (1) { + uint8_t av = base64_compare_table[*a]; + uint8_t bv = base64_compare_table[*b]; + if (av == NOT_VALID_BASE64) { + if (bv == NOT_VALID_BASE64) { + /* Both ended with exactly the same characters. */ + return 0; + } else { + /* hash2 goes on longer than hash1 and thus hash1 is lower. */ + return -1; + } + } else if (bv == NOT_VALID_BASE64) { + /* hash1 goes on longer than hash2 and thus hash1 is greater. */ + return 1; + } else if (av < bv) { + /* The first difference shows that hash1 is lower. */ + return -1; + } else if (av > bv) { + /* The first difference shows that hash1 is greater. */ + return 1; + } else { + a++; + b++; + if (a == a_end) { + if (b == b_end) { + return 0; + } else { + return -1; + } + } else if (b == b_end) { + return 1; + } + } + } +} + +/** Structure used to remember the previous and current identity hash of + * the "r " lines in a consensus, to enforce well-ordering. */ +typedef struct router_id_iterator_t { + cdline_t last_hash; + cdline_t hash; +} router_id_iterator_t; + +/** + * Initializer for a router_id_iterator_t. + */ +#define ROUTER_ID_ITERATOR_INIT { { NULL, 0 }, { NULL, 0 } } + +/** Given an index *<b>idxp</b> into the consensus at <b>cons</b>, advance + * the index to the next router line ("r ...") in the consensus, or to + * an index one after the end of the list if there is no such line. + * + * Use <b>iter</b> to record the hash of the found router line, if any, + * and to enforce ordering on the hashes. If the hashes are mis-ordered, + * return -1. Else, return 0. + **/ +static int +find_next_router_line(const smartlist_t *cons, + const char *consname, + int *idxp, + router_id_iterator_t *iter) +{ + *idxp = next_router(cons, *idxp); + if (*idxp < smartlist_len(cons)) { + memcpy(&iter->last_hash, &iter->hash, sizeof(cdline_t)); + if (get_id_hash(smartlist_get(cons, *idxp), &iter->hash) < 0 || + base64cmp(&iter->hash, &iter->last_hash) <= 0) { + log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because " + "the %s consensus doesn't have its router entries sorted " + "properly.", consname); + return -1; + } + } + return 0; +} + +/** Generate an ed diff as a smartlist from two consensuses, also given as + * smartlists. Will return NULL if the diff could not be generated, which can + * happen if any lines the script had to add matched "." or if the routers + * were not properly ordered. + * + * All cdline_t objects in the resulting object are either references to lines + * in one of the inputs, or are newly allocated lines in the provided memarea. + * + * This implementation is consensus-specific. To generate an ed diff for any + * given input in quadratic time, you can replace all the code until the + * navigation in reverse order with the following: + * + * int len1 = smartlist_len(cons1); + * int len2 = smartlist_len(cons2); + * bitarray_t *changed1 = bitarray_init_zero(len1); + * bitarray_t *changed2 = bitarray_init_zero(len2); + * cons1_sl = smartlist_slice(cons1, 0, -1); + * cons2_sl = smartlist_slice(cons2, 0, -1); + * calc_changes(cons1_sl, cons2_sl, changed1, changed2); + */ +STATIC smartlist_t * +gen_ed_diff(const smartlist_t *cons1, const smartlist_t *cons2, + memarea_t *area) +{ + int len1 = smartlist_len(cons1); + int len2 = smartlist_len(cons2); + smartlist_t *result = smartlist_new(); + + /* Initialize the changed bitarrays to zero, so that calc_changes only needs + * to set the ones that matter and leave the rest untouched. + */ + bitarray_t *changed1 = bitarray_init_zero(len1); + bitarray_t *changed2 = bitarray_init_zero(len2); + int i1=-1, i2=-1; + int start1=0, start2=0; + + /* To check that hashes are ordered properly */ + router_id_iterator_t iter1 = ROUTER_ID_ITERATOR_INIT; + router_id_iterator_t iter2 = ROUTER_ID_ITERATOR_INIT; + + /* i1 and i2 are initialized at the first line of each consensus. They never + * reach past len1 and len2 respectively, since next_router doesn't let that + * happen. i1 and i2 are advanced by at least one line at each iteration as + * long as they have not yet reached len1 and len2, so the loop is + * guaranteed to end, and each pair of (i1,i2) will be inspected at most + * once. + */ + while (i1 < len1 || i2 < len2) { + + /* Advance each of the two navigation positions by one router entry if not + * yet at the end. + */ + if (i1 < len1) { + if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) { + goto error_cleanup; + } + } + + if (i2 < len2) { + if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) { + goto error_cleanup; + } + } + + /* If we have reached the end of both consensuses, there is no need to + * compare hashes anymore, since this is the last iteration. + */ + if (i1 < len1 || i2 < len2) { + + /* Keep on advancing the lower (by identity hash sorting) position until + * we have two matching positions. The only other possible outcome is + * that a lower position reaches the end of the consensus before it can + * reach a hash that is no longer the lower one. Since there will always + * be a lower hash for as long as the loop runs, one of the two indexes + * will always be incremented, thus assuring that the loop must end + * after a finite number of iterations. If that cannot be because said + * consensus has already reached the end, both are extended to their + * respecting ends since we are done. + */ + int cmp = base64cmp(&iter1.hash, &iter2.hash); + while (cmp != 0) { + if (i1 < len1 && cmp < 0) { + if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) { + goto error_cleanup; + } + if (i1 == len1) { + /* We finished the first consensus, so grab all the remaining + * lines of the second consensus and finish up. + */ + i2 = len2; + break; + } + } else if (i2 < len2 && cmp > 0) { + if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) { + goto error_cleanup; + } + if (i2 == len2) { + /* We finished the second consensus, so grab all the remaining + * lines of the first consensus and finish up. + */ + i1 = len1; + break; + } + } else { + i1 = len1; + i2 = len2; + break; + } + cmp = base64cmp(&iter1.hash, &iter2.hash); + } + } + + /* Make slices out of these chunks (up to the common router entry) and + * calculate the changes for them. + * Error if any of the two slices are longer than 10K lines. That should + * never happen with any pair of real consensuses. Feeding more than 10K + * lines to calc_changes would be very slow anyway. + */ +#define MAX_LINE_COUNT (10000) + if (i1-start1 > MAX_LINE_COUNT || i2-start2 > MAX_LINE_COUNT) { + log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because " + "we found too few common router ids."); + goto error_cleanup; + } + + smartlist_slice_t *cons1_sl = smartlist_slice(cons1, start1, i1); + smartlist_slice_t *cons2_sl = smartlist_slice(cons2, start2, i2); + calc_changes(cons1_sl, cons2_sl, changed1, changed2); + tor_free(cons1_sl); + tor_free(cons2_sl); + start1 = i1, start2 = i2; + } + + /* Navigate the changes in reverse order and generate one ed command for + * each chunk of changes. + */ + i1=len1-1, i2=len2-1; + char buf[128]; + while (i1 >= 0 || i2 >= 0) { + + int start1x, start2x, end1, end2, added, deleted; + + /* We are at a point were no changed bools are true, so just keep going. */ + if (!(i1 >= 0 && bitarray_is_set(changed1, i1)) && + !(i2 >= 0 && bitarray_is_set(changed2, i2))) { + if (i1 >= 0) { + i1--; + } + if (i2 >= 0) { + i2--; + } + continue; + } + + end1 = i1, end2 = i2; + + /* Grab all contiguous changed lines */ + while (i1 >= 0 && bitarray_is_set(changed1, i1)) { + i1--; + } + while (i2 >= 0 && bitarray_is_set(changed2, i2)) { + i2--; + } + + start1x = i1+1, start2x = i2+1; + added = end2-i2, deleted = end1-i1; + + if (added == 0) { + if (deleted == 1) { + tor_snprintf(buf, sizeof(buf), "%id", start1x+1); + smartlist_add_linecpy(result, area, buf); + } else { + tor_snprintf(buf, sizeof(buf), "%i,%id", start1x+1, start1x+deleted); + smartlist_add_linecpy(result, area, buf); + } + } else { + int i; + if (deleted == 0) { + tor_snprintf(buf, sizeof(buf), "%ia", start1x); + smartlist_add_linecpy(result, area, buf); + } else if (deleted == 1) { + tor_snprintf(buf, sizeof(buf), "%ic", start1x+1); + smartlist_add_linecpy(result, area, buf); + } else { + tor_snprintf(buf, sizeof(buf), "%i,%ic", start1x+1, start1x+deleted); + smartlist_add_linecpy(result, area, buf); + } + + for (i = start2x; i <= end2; ++i) { + cdline_t *line = smartlist_get(cons2, i); + if (line_str_eq(line, ".")) { + log_warn(LD_CONSDIFF, "Cannot generate consensus diff because " + "one of the lines to be added is \".\"."); + goto error_cleanup; + } + smartlist_add(result, line); + } + smartlist_add_linecpy(result, area, "."); + } + } + + bitarray_free(changed1); + bitarray_free(changed2); + + return result; + + error_cleanup: + + bitarray_free(changed1); + bitarray_free(changed2); + + smartlist_free(result); + + return NULL; +} + +/* Helper: Read a base-10 number between 0 and INT32_MAX from <b>s</b> and + * store it in <b>num_out</b>. Advance <b>s</b> to the characer immediately + * after the number. Return 0 on success, -1 on failure. */ +static int +get_linenum(const char **s, int *num_out) +{ + int ok; + char *next; + if (!TOR_ISDIGIT(**s)) { + return -1; + } + *num_out = (int) tor_parse_long(*s, 10, 0, INT32_MAX, &ok, &next); + if (ok && next) { + *s = next; + return 0; + } else { + return -1; + } +} + +/** Apply the ed diff, starting at <b>diff_starting_line</b>, to the consensus + * and return a new consensus, also as a line-based smartlist. Will return + * NULL if the ed diff is not properly formatted. + * + * All cdline_t objects in the resulting object are references to lines + * in one of the inputs; nothing is copied. + */ +STATIC smartlist_t * +apply_ed_diff(const smartlist_t *cons1, const smartlist_t *diff, + int diff_starting_line) +{ + int diff_len = smartlist_len(diff); + int j = smartlist_len(cons1); + smartlist_t *cons2 = smartlist_new(); + + for (int i=diff_starting_line; i<diff_len; ++i) { + const cdline_t *diff_cdline = smartlist_get(diff, i); + char diff_line[128]; + + if (diff_cdline->len > sizeof(diff_line) - 1) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command was far too long"); + goto error_cleanup; + } + /* Copy the line to make it nul-terminated. */ + memcpy(diff_line, diff_cdline->s, diff_cdline->len); + diff_line[diff_cdline->len] = 0; + const char *ptr = diff_line; + int start = 0, end = 0; + int had_range = 0; + if (get_linenum(&ptr, &start) < 0) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command was missing a line number."); + goto error_cleanup; + } + if (*ptr == ',') { + /* Two-item range */ + had_range = 1; + ++ptr; + if (get_linenum(&ptr, &end) < 0) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command was missing a range end line number."); + goto error_cleanup; + } + /* Incoherent range. */ + if (end <= start) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an invalid range was found in an ed command."); + goto error_cleanup; + } + } else { + /* We'll take <n1> as <n1>,<n1> for simplicity. */ + end = start; + } + + if (end > j) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "its commands are not properly sorted in reverse order."); + goto error_cleanup; + } + + if (*ptr == '\0') { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "a line with no ed command was found"); + goto error_cleanup; + } + + if (*(ptr+1) != '\0') { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command longer than one char was found."); + goto error_cleanup; + } + + char action = *ptr; + + switch (action) { + case 'a': + case 'c': + case 'd': + break; + default: + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an unrecognised ed command was found."); + goto error_cleanup; + } + + /* 'a' commands are not allowed to have ranges. */ + if (had_range && action == 'a') { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "it wanted to add lines after a range."); + goto error_cleanup; + } + + /* Add unchanged lines. */ + for (; j && j > end; --j) { + cdline_t *cons_line = smartlist_get(cons1, j-1); + smartlist_add(cons2, cons_line); + } + + /* Ignore removed lines. */ + if (action == 'c' || action == 'd') { + while (--j >= start) { + /* Skip line */ + } + } + + /* Add new lines in reverse order, since it will all be reversed at the + * end. + */ + if (action == 'a' || action == 'c') { + int added_end = i; + + i++; /* Skip the line with the range and command. */ + while (i < diff_len) { + if (line_str_eq(smartlist_get(diff, i), ".")) { + break; + } + if (++i == diff_len) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "it has lines to be inserted that don't end with a \".\"."); + goto error_cleanup; + } + } + + int added_i = i-1; + + /* It would make no sense to add zero new lines. */ + if (added_i == added_end) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "it has an ed command that tries to insert zero lines."); + goto error_cleanup; + } + + while (added_i > added_end) { + cdline_t *added_line = smartlist_get(diff, added_i--); + smartlist_add(cons2, added_line); + } + } + } + + /* Add remaining unchanged lines. */ + for (; j > 0; --j) { + cdline_t *cons_line = smartlist_get(cons1, j-1); + smartlist_add(cons2, cons_line); + } + + /* Reverse the whole thing since we did it from the end. */ + smartlist_reverse(cons2); + return cons2; + + error_cleanup: + + smartlist_free(cons2); + + return NULL; +} + +/** Generate a consensus diff as a smartlist from two given consensuses, also + * as smartlists. Will return NULL if the consensus diff could not be + * generated. Neither of the two consensuses are modified in any way, so it's + * up to the caller to free their resources. + */ +smartlist_t * +consdiff_gen_diff(const smartlist_t *cons1, + const smartlist_t *cons2, + const consensus_digest_t *digests1, + const consensus_digest_t *digests2, + memarea_t *area) +{ + smartlist_t *ed_diff = gen_ed_diff(cons1, cons2, area); + /* ed diff could not be generated - reason already logged by gen_ed_diff. */ + if (!ed_diff) { + goto error_cleanup; + } + + /* See that the script actually produces what we want. */ + smartlist_t *ed_cons2 = apply_ed_diff(cons1, ed_diff, 0); + if (!ed_cons2) { + /* LCOV_EXCL_START -- impossible if diff generation is correct */ + log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because " + "the generated ed diff could not be tested to successfully generate " + "the target consensus."); + goto error_cleanup; + /* LCOV_EXCL_STOP */ + } + + int cons2_eq = 1; + if (smartlist_len(cons2) == smartlist_len(ed_cons2)) { + SMARTLIST_FOREACH_BEGIN(cons2, const cdline_t *, line1) { + const cdline_t *line2 = smartlist_get(ed_cons2, line1_sl_idx); + if (! lines_eq(line1, line2) ) { + cons2_eq = 0; + break; + } + } SMARTLIST_FOREACH_END(line1); + } else { + cons2_eq = 0; + } + smartlist_free(ed_cons2); + if (!cons2_eq) { + /* LCOV_EXCL_START -- impossible if diff generation is correct. */ + log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because " + "the generated ed diff did not generate the target consensus " + "successfully when tested."); + goto error_cleanup; + /* LCOV_EXCL_STOP */ + } + + char cons1_hash_hex[HEX_DIGEST256_LEN+1]; + char cons2_hash_hex[HEX_DIGEST256_LEN+1]; + base16_encode(cons1_hash_hex, HEX_DIGEST256_LEN+1, + (const char*)digests1->sha3_256, DIGEST256_LEN); + base16_encode(cons2_hash_hex, HEX_DIGEST256_LEN+1, + (const char*)digests2->sha3_256, DIGEST256_LEN); + + /* Create the resulting consensus diff. */ + char buf[160]; + smartlist_t *result = smartlist_new(); + tor_snprintf(buf, sizeof(buf), "%s", ns_diff_version); + smartlist_add_linecpy(result, area, buf); + tor_snprintf(buf, sizeof(buf), "%s %s %s", hash_token, + cons1_hash_hex, cons2_hash_hex); + smartlist_add_linecpy(result, area, buf); + smartlist_add_all(result, ed_diff); + smartlist_free(ed_diff); + return result; + + error_cleanup: + + if (ed_diff) { + /* LCOV_EXCL_START -- ed_diff is NULL except in unreachable cases above */ + smartlist_free(ed_diff); + /* LCOV_EXCL_STOP */ + } + + return NULL; +} + +/** Fetch the digest of the base consensus in the consensus diff, encoded in + * base16 as found in the diff itself. digest1_out and digest2_out must be of + * length DIGEST256_LEN or larger if not NULL. + */ +int +consdiff_get_digests(const smartlist_t *diff, + char *digest1_out, + char *digest2_out) +{ + smartlist_t *hash_words = NULL; + const cdline_t *format; + char cons1_hash[DIGEST256_LEN], cons2_hash[DIGEST256_LEN]; + char *cons1_hash_hex, *cons2_hash_hex; + if (smartlist_len(diff) < 2) { + log_info(LD_CONSDIFF, "The provided consensus diff is too short."); + goto error_cleanup; + } + + /* Check that it's the format and version we know. */ + format = smartlist_get(diff, 0); + if (!line_str_eq(format, ns_diff_version)) { + log_warn(LD_CONSDIFF, "The provided consensus diff format is not known."); + goto error_cleanup; + } + + /* Grab the base16 digests. */ + hash_words = smartlist_new(); + { + const cdline_t *line2 = smartlist_get(diff, 1); + char *h = tor_memdup_nulterm(line2->s, line2->len); + smartlist_split_string(hash_words, h, " ", 0, 0); + tor_free(h); + } + + /* There have to be three words, the first of which must be hash_token. */ + if (smartlist_len(hash_words) != 3 || + strcmp(smartlist_get(hash_words, 0), hash_token)) { + log_info(LD_CONSDIFF, "The provided consensus diff does not include " + "the necessary digests."); + goto error_cleanup; + } + + /* Expected hashes as found in the consensus diff header. They must be of + * length HEX_DIGEST256_LEN, normally 64 hexadecimal characters. + * If any of the decodings fail, error to make sure that the hashes are + * proper base16-encoded digests. + */ + cons1_hash_hex = smartlist_get(hash_words, 1); + cons2_hash_hex = smartlist_get(hash_words, 2); + if (strlen(cons1_hash_hex) != HEX_DIGEST256_LEN || + strlen(cons2_hash_hex) != HEX_DIGEST256_LEN) { + log_info(LD_CONSDIFF, "The provided consensus diff includes " + "base16-encoded digests of incorrect size."); + goto error_cleanup; + } + + if (base16_decode(cons1_hash, DIGEST256_LEN, + cons1_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN || + base16_decode(cons2_hash, DIGEST256_LEN, + cons2_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN) { + log_info(LD_CONSDIFF, "The provided consensus diff includes " + "malformed digests."); + goto error_cleanup; + } + + if (digest1_out) { + memcpy(digest1_out, cons1_hash, DIGEST256_LEN); + } + if (digest2_out) { + memcpy(digest2_out, cons2_hash, DIGEST256_LEN); + } + + SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp)); + smartlist_free(hash_words); + return 0; + + error_cleanup: + + if (hash_words) { + SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp)); + smartlist_free(hash_words); + } + return 1; +} + +/** Apply the consensus diff to the given consensus and return a new + * consensus, also as a line-based smartlist. Will return NULL if the diff + * could not be applied. Neither the consensus nor the diff are modified in + * any way, so it's up to the caller to free their resources. + */ +char * +consdiff_apply_diff(const smartlist_t *cons1, + const smartlist_t *diff, + const consensus_digest_t *digests1) +{ + smartlist_t *cons2 = NULL; + char *cons2_str = NULL; + char e_cons1_hash[DIGEST256_LEN]; + char e_cons2_hash[DIGEST256_LEN]; + + if (consdiff_get_digests(diff, e_cons1_hash, e_cons2_hash) != 0) { + goto error_cleanup; + } + + /* See that the consensus that was given to us matches its hash. */ + if (!consensus_digest_eq(digests1->sha3_256, + (const uint8_t*)e_cons1_hash)) { + char hex_digest1[HEX_DIGEST256_LEN+1]; + char e_hex_digest1[HEX_DIGEST256_LEN+1]; + log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because " + "the base consensus doesn't match the digest as found in " + "the consensus diff header."); + base16_encode(hex_digest1, HEX_DIGEST256_LEN+1, + (const char *)digests1->sha3_256, DIGEST256_LEN); + base16_encode(e_hex_digest1, HEX_DIGEST256_LEN+1, + e_cons1_hash, DIGEST256_LEN); + log_warn(LD_CONSDIFF, "Expected: %s; found: %s", + hex_digest1, e_hex_digest1); + goto error_cleanup; + } + + /* Grab the ed diff and calculate the resulting consensus. */ + /* Skip the first two lines. */ + cons2 = apply_ed_diff(cons1, diff, 2); + + /* ed diff could not be applied - reason already logged by apply_ed_diff. */ + if (!cons2) { + goto error_cleanup; + } + + cons2_str = consensus_join_lines(cons2); + + consensus_digest_t cons2_digests; + if (consensus_compute_digest(cons2_str, &cons2_digests) < 0) { + /* LCOV_EXCL_START -- digest can't fail */ + log_warn(LD_CONSDIFF, "Could not compute digests of the consensus " + "resulting from applying a consensus diff."); + goto error_cleanup; + /* LCOV_EXCL_STOP */ + } + + /* See that the resulting consensus matches its hash. */ + if (!consensus_digest_eq(cons2_digests.sha3_256, + (const uint8_t*)e_cons2_hash)) { + log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because " + "the resulting consensus doesn't match the digest as found in " + "the consensus diff header."); + char hex_digest2[HEX_DIGEST256_LEN+1]; + char e_hex_digest2[HEX_DIGEST256_LEN+1]; + base16_encode(hex_digest2, HEX_DIGEST256_LEN+1, + (const char *)cons2_digests.sha3_256, DIGEST256_LEN); + base16_encode(e_hex_digest2, HEX_DIGEST256_LEN+1, + e_cons2_hash, DIGEST256_LEN); + log_warn(LD_CONSDIFF, "Expected: %s; found: %s", + hex_digest2, e_hex_digest2); + goto error_cleanup; + } + + goto done; + + error_cleanup: + tor_free(cons2_str); /* Sets it to NULL */ + + done: + if (cons2) { + smartlist_free(cons2); + } + + return cons2_str; +} + +/** Any consensus line longer than this means that the input is invalid. */ +#define CONSENSUS_LINE_MAX_LEN (1<<20) + +/** + * Helper: For every NL-terminated line in <b>s</b>, add a cdline referring to + * that line (without trailing newline) to <b>out</b>. Return -1 if there are + * any non-NL terminated lines; 0 otherwise. + * + * Unlike tor_split_lines, this function avoids ambiguity on its + * handling of a final line that isn't NL-terminated. + * + * All cdline_t objects are allocated in the provided memarea. Strings + * are not copied: if <b>s</b> changes or becomes invalid, then all + * generated cdlines will become invalid. + */ +STATIC int +consensus_split_lines(smartlist_t *out, const char *s, memarea_t *area) +{ + while (*s) { + const char *eol = strchr(s, '\n'); + if (!eol) { + /* File doesn't end with newline. */ + return -1; + } + if (eol - s > CONSENSUS_LINE_MAX_LEN) { + /* Line is far too long. */ + return -1; + } + cdline_t *line = memarea_alloc(area, sizeof(cdline_t)); + line->s = s; + line->len = (uint32_t)(eol - s); + smartlist_add(out, line); + s = eol+1; + } + return 0; +} + +/** Given a list of cdline_t, return a newly allocated string containing + * all of the lines, terminated with NL, concatenated. + * + * Unlike smartlist_join_strings(), avoids lossy operations on empty + * lists. */ +static char * +consensus_join_lines(const smartlist_t *inp) +{ + size_t n = 0; + SMARTLIST_FOREACH(inp, const cdline_t *, cdline, n += cdline->len + 1); + n += 1; + char *result = tor_malloc(n); + char *out = result; + SMARTLIST_FOREACH_BEGIN(inp, const cdline_t *, cdline) { + memcpy(out, cdline->s, cdline->len); + out += cdline->len; + *out++ = '\n'; + } SMARTLIST_FOREACH_END(cdline); + *out++ = '\0'; + tor_assert(out == result+n); + return result; +} + +/** Given two consensus documents, try to compute a diff between them. On + * success, retun a newly allocated string containing that diff. On failure, + * return NULL. */ +char * +consensus_diff_generate(const char *cons1, + const char *cons2) +{ + consensus_digest_t d1, d2; + smartlist_t *lines1 = NULL, *lines2 = NULL, *result_lines = NULL; + int r1, r2; + char *result = NULL; + + r1 = consensus_compute_digest(cons1, &d1); + r2 = consensus_compute_digest(cons2, &d2); + if (BUG(r1 < 0 || r2 < 0)) + return NULL; // LCOV_EXCL_LINE + + memarea_t *area = memarea_new(); + lines1 = smartlist_new(); + lines2 = smartlist_new(); + if (consensus_split_lines(lines1, cons1, area) < 0) + goto done; + if (consensus_split_lines(lines2, cons2, area) < 0) + goto done; + + result_lines = consdiff_gen_diff(lines1, lines2, &d1, &d2, area); + + done: + if (result_lines) { + result = consensus_join_lines(result_lines); + smartlist_free(result_lines); + } + + memarea_drop_all(area); + smartlist_free(lines1); + smartlist_free(lines2); + + return result; +} + +/** Given a consensus document and a diff, try to apply the diff to the + * consensus. On success return a newly allocated string containing the new + * consensus. On failure, return NULL. */ +char * +consensus_diff_apply(const char *consensus, + const char *diff) +{ + consensus_digest_t d1; + smartlist_t *lines1 = NULL, *lines2 = NULL; + int r1; + char *result = NULL; + memarea_t *area = memarea_new(); + + r1 = consensus_compute_digest(consensus, &d1); + if (BUG(r1 < 0)) + return NULL; // LCOV_EXCL_LINE + + lines1 = smartlist_new(); + lines2 = smartlist_new(); + if (consensus_split_lines(lines1, consensus, area) < 0) + goto done; + if (consensus_split_lines(lines2, diff, area) < 0) + goto done; + + result = consdiff_apply_diff(lines1, lines2, &d1); + + done: + smartlist_free(lines1); + smartlist_free(lines2); + memarea_drop_all(area); + + return result; +} + diff --git a/src/or/consdiff.h b/src/or/consdiff.h new file mode 100644 index 0000000000..e9d175136e --- /dev/null +++ b/src/or/consdiff.h @@ -0,0 +1,93 @@ +/* Copyright (c) 2014, Daniel Martà + * Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONSDIFF_H +#define TOR_CONSDIFF_H + +#include "or.h" + +char *consensus_diff_generate(const char *cons1, + const char *cons2); +char *consensus_diff_apply(const char *consensus, + const char *diff); + +#ifdef CONSDIFF_PRIVATE +struct memarea_t; + +/** Line type used for constructing consensus diffs. Each of these lines + * refers to a chunk of memory allocated elsewhere, and is not necessarily + * NUL-terminated: this helps us avoid copies and save memory. */ +typedef struct cdline_t { + const char *s; + uint32_t len; +} cdline_t; + +typedef struct consensus_digest_t { + uint8_t sha3_256[DIGEST256_LEN]; +} consensus_digest_t; + +STATIC smartlist_t *consdiff_gen_diff(const smartlist_t *cons1, + const smartlist_t *cons2, + const consensus_digest_t *digests1, + const consensus_digest_t *digests2, + struct memarea_t *area); +STATIC char *consdiff_apply_diff(const smartlist_t *cons1, + const smartlist_t *diff, + const consensus_digest_t *digests1); +STATIC int consdiff_get_digests(const smartlist_t *diff, + char *digest1_out, + char *digest2_out); + +/** Data structure to define a slice of a smarltist. */ +typedef struct smartlist_slice_t { + /** + * Smartlist that this slice is made from. + * References the whole original smartlist that the slice was made out of. + * */ + const smartlist_t *list; + /** Starting position of the slice in the smartlist. */ + int offset; + /** Length of the slice, i.e. the number of elements it holds. */ + int len; +} smartlist_slice_t; +STATIC smartlist_t *gen_ed_diff(const smartlist_t *cons1, + const smartlist_t *cons2, + struct memarea_t *area); +STATIC smartlist_t *apply_ed_diff(const smartlist_t *cons1, + const smartlist_t *diff, + int start_line); +STATIC void calc_changes(smartlist_slice_t *slice1, smartlist_slice_t *slice2, + bitarray_t *changed1, bitarray_t *changed2); +STATIC smartlist_slice_t *smartlist_slice(const smartlist_t *list, + int start, int end); +STATIC int next_router(const smartlist_t *cons, int cur); +STATIC int *lcs_lengths(const smartlist_slice_t *slice1, + const smartlist_slice_t *slice2, + int direction); +STATIC void trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2); +STATIC int base64cmp(const cdline_t *hash1, const cdline_t *hash2); +STATIC int get_id_hash(const cdline_t *line, cdline_t *hash_out); +STATIC int is_valid_router_entry(const cdline_t *line); +STATIC int smartlist_slice_string_pos(const smartlist_slice_t *slice, + const cdline_t *string); +STATIC void set_changed(bitarray_t *changed1, bitarray_t *changed2, + const smartlist_slice_t *slice1, + const smartlist_slice_t *slice2); +STATIC int consensus_split_lines(smartlist_t *out, const char *s, + struct memarea_t *area); +STATIC void smartlist_add_linecpy(smartlist_t *lst, struct memarea_t *area, + const char *s); +STATIC int lines_eq(const cdline_t *a, const cdline_t *b); +STATIC int line_str_eq(const cdline_t *a, const char *b); + +MOCK_DECL(STATIC int, + consensus_compute_digest,(const char *cons, + consensus_digest_t *digest_out)); +MOCK_DECL(STATIC int, + consensus_digest_eq,(const uint8_t *d1, + const uint8_t *d2)); +#endif + +#endif + diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c new file mode 100644 index 0000000000..29807e7c6d --- /dev/null +++ b/src/or/consdiffmgr.c @@ -0,0 +1,1386 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file consdiffmsr.c + * + * \brief consensus diff manager functions + * + * This module is run by directory authorities and caches in order + * to remember a number of past consensus documents, and to generate + * and serve the diffs from those documents to the latest consensus. + */ + +#define CONSDIFFMGR_PRIVATE + +#include "or.h" +#include "conscache.h" +#include "consdiff.h" +#include "consdiffmgr.h" +#include "cpuworker.h" +#include "networkstatus.h" +#include "workqueue.h" + +/** + * Labels to apply to items in the conscache object. + * + * @{ + */ +/* One of DOCTYPE_CONSENSUS or DOCTYPE_CONSENSUS_DIFF */ +#define LABEL_DOCTYPE "document-type" +/* The valid-after time for a consensus (or for the target consensus of a + * diff), encoded as ISO UTC. */ +#define LABEL_VALID_AFTER "consensus-valid-after" +/* A hex encoded SHA3 digest of the object, as compressed (if any) */ +#define LABEL_SHA3_DIGEST "sha3-digest" +/* A hex encoded SHA3 digest of the object before compression. */ +#define LABEL_SHA3_DIGEST_UNCOMPRESSED "sha3-digest-uncompressed" +/* The flavor of the consensus or consensuses diff */ +#define LABEL_FLAVOR "consensus-flavor" +/* Diff only: the SHA3 digest of the source consensus. */ +#define LABEL_FROM_SHA3_DIGEST "from-sha3-digest" +/* Diff only: the SHA3 digest of the target consensus. */ +#define LABEL_TARGET_SHA3_DIGEST "target-sha3-digest" +/* Diff only: the valid-after date of the source consensus. */ +#define LABEL_FROM_VALID_AFTER "from-valid-after" +/* What kind of compression was used? */ +#define LABEL_COMPRESSION_TYPE "compression" +/** @} */ + +#define DOCTYPE_CONSENSUS "consensus" +#define DOCTYPE_CONSENSUS_DIFF "consensus-diff" + +/** + * Underlying directory that stores consensuses and consensus diffs. Don't + * use this directly: use cdm_cache_get() instead. + */ +static consensus_cache_t *cons_diff_cache = NULL; +/** + * If true, we have learned at least one new consensus since the + * consensus cache was last up-to-date. + */ +static int cdm_cache_dirty = 0; +/** + * If true, we have scanned the cache to update our hashtable of diffs. + */ +static int cdm_cache_loaded = 0; + +/** + * Possible status values for cdm_diff_t.cdm_diff_status + **/ +typedef enum cdm_diff_status_t { + CDM_DIFF_PRESENT=1, + CDM_DIFF_IN_PROGRESS=2, + CDM_DIFF_ERROR=3, +} cdm_diff_status_t; + +/** Which methods do we use for precompressing diffs? */ +static const compress_method_t compress_diffs_with[] = { + NO_METHOD, + GZIP_METHOD, +#ifdef HAVE_LZMA + LZMA_METHOD, +#endif +#ifdef HAVE_ZSTD + ZSTD_METHOD, +#endif +}; + +/** How many different methods will we try to use for diff compression? */ +STATIC unsigned +n_diff_compression_methods(void) +{ + return ARRAY_LENGTH(compress_diffs_with); +} + +/** Hashtable node used to remember the current status of the diff + * from a given sha3 digest to the current consensus. */ +typedef struct cdm_diff_t { + HT_ENTRY(cdm_diff_t) node; + + /** Consensus flavor for this diff (part of ht key) */ + consensus_flavor_t flavor; + /** SHA3-256 digest of the consensus that this diff is _from_. (part of the + * ht key) */ + uint8_t from_sha3[DIGEST256_LEN]; + /** Method by which the diff is compressed. (part of the ht key */ + compress_method_t compress_method; + + /** One of the CDM_DIFF_* values, depending on whether this diff + * is available, in progress, or impossible to compute. */ + cdm_diff_status_t cdm_diff_status; + /** SHA3-256 digest of the consensus that this diff is _to. */ + uint8_t target_sha3[DIGEST256_LEN]; + + /** Handle to the cache entry for this diff, if any. We use a handle here + * to avoid thinking too hard about cache entry lifetime issues. */ + consensus_cache_entry_handle_t *entry; +} cdm_diff_t; + +/** Hashtable mapping flavor and source consensus digest to status. */ +static HT_HEAD(cdm_diff_ht, cdm_diff_t) cdm_diff_ht = HT_INITIALIZER(); + +/** + * Configuration for this module + */ +static consdiff_cfg_t consdiff_cfg = { + /* .cache_max_age_hours = */ 24 * 90, + // XXXX I'd like to make this number bigger, but it interferes with the + // XXXX seccomp2 syscall filter, which tops out at BPF_MAXINS (4096) + // XXXX rules. + /* .cache_max_num = */ 128 +}; + +static int consdiffmgr_ensure_space_for_files(int n); +static int consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from, + consensus_cache_entry_t *diff_to); +static void consdiffmgr_set_cache_flags(void); + +/* Just gzip consensuses for now. */ +#define COMPRESS_CONSENSUS_WITH GZIP_METHOD + +/* ===== + * Hashtable setup + * ===== */ + +/** Helper: hash the key of a cdm_diff_t. */ +static unsigned +cdm_diff_hash(const cdm_diff_t *diff) +{ + uint8_t tmp[DIGEST256_LEN + 2]; + memcpy(tmp, diff->from_sha3, DIGEST256_LEN); + tmp[DIGEST256_LEN] = (uint8_t) diff->flavor; + tmp[DIGEST256_LEN+1] = (uint8_t) diff->compress_method; + return (unsigned) siphash24g(tmp, sizeof(tmp)); +} +/** Helper: compare two cdm_diff_t objects for key equality */ +static int +cdm_diff_eq(const cdm_diff_t *diff1, const cdm_diff_t *diff2) +{ + return fast_memeq(diff1->from_sha3, diff2->from_sha3, DIGEST256_LEN) && + diff1->flavor == diff2->flavor && + diff1->compress_method == diff2->compress_method; +} + +HT_PROTOTYPE(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq) +HT_GENERATE2(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq, + 0.6, tor_reallocarray, tor_free_) + +/** Release all storage held in <b>diff</b>. */ +static void +cdm_diff_free(cdm_diff_t *diff) +{ + if (!diff) + return; + consensus_cache_entry_handle_free(diff->entry); + tor_free(diff); +} + +/** Create and return a new cdm_diff_t with the given values. Does not + * add it to the hashtable. */ +static cdm_diff_t * +cdm_diff_new(consensus_flavor_t flav, + const uint8_t *from_sha3, + const uint8_t *target_sha3, + compress_method_t method) +{ + cdm_diff_t *ent; + ent = tor_malloc_zero(sizeof(cdm_diff_t)); + ent->flavor = flav; + memcpy(ent->from_sha3, from_sha3, DIGEST256_LEN); + memcpy(ent->target_sha3, target_sha3, DIGEST256_LEN); + ent->compress_method = method; + return ent; +} + +/** + * Examine the diff hashtable to see whether we know anything about computing + * a diff of type <b>flav</b> between consensuses with the two provided + * SHA3-256 digests. If a computation is in progress, or if the computation + * has already been tried and failed, return 1. Otherwise, note the + * computation as "in progress" so that we don't reattempt it later, and + * return 0. + */ +static int +cdm_diff_ht_check_and_note_pending(consensus_flavor_t flav, + const uint8_t *from_sha3, + const uint8_t *target_sha3) +{ + struct cdm_diff_t search, *ent; + unsigned u; + int result = 0; + for (u = 0; u < n_diff_compression_methods(); ++u) { + compress_method_t method = compress_diffs_with[u]; + memset(&search, 0, sizeof(cdm_diff_t)); + search.flavor = flav; + search.compress_method = method; + memcpy(search.from_sha3, from_sha3, DIGEST256_LEN); + ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); + if (ent) { + tor_assert_nonfatal(ent->cdm_diff_status != CDM_DIFF_PRESENT); + result = 1; + continue; + } + ent = cdm_diff_new(flav, from_sha3, target_sha3, method); + ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS; + HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent); + } + return result; +} + +/** + * Update the status of the diff of type <b>flav</b> between consensuses with + * the two provided SHA3-256 digests, so that its status becomes + * <b>status</b>, and its value becomes the <b>handle</b>. If <b>handle</b> + * is NULL, then the old handle (if any) is freed, and replaced with NULL. + */ +static void +cdm_diff_ht_set_status(consensus_flavor_t flav, + const uint8_t *from_sha3, + const uint8_t *to_sha3, + compress_method_t method, + int status, + consensus_cache_entry_handle_t *handle) +{ + struct cdm_diff_t search, *ent; + memset(&search, 0, sizeof(cdm_diff_t)); + search.flavor = flav; + search.compress_method = method, + memcpy(search.from_sha3, from_sha3, DIGEST256_LEN); + ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); + if (!ent) { + ent = cdm_diff_new(flav, from_sha3, to_sha3, method); + ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS; + HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent); + } else if (fast_memneq(ent->target_sha3, to_sha3, DIGEST256_LEN)) { + // This can happen under certain really pathological conditions + // if we decide we don't care about a diff before it is actually + // done computing. + return; + } + + tor_assert_nonfatal(ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS); + + ent->cdm_diff_status = status; + consensus_cache_entry_handle_free(ent->entry); + ent->entry = handle; +} + +/** + * Helper: Remove from the hash table every present (actually computed) diff + * of type <b>flav</b> whose target digest does not match + * <b>unless_target_sha3_matches</b>. + * + * This function is used for the hash table to throw away references to diffs + * that do not lead to the most given consensus of a given flavor. + */ +static void +cdm_diff_ht_purge(consensus_flavor_t flav, + const uint8_t *unless_target_sha3_matches) +{ + cdm_diff_t **diff, **next; + for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) { + cdm_diff_t *this = *diff; + + if ((*diff)->cdm_diff_status == CDM_DIFF_PRESENT && + flav == (*diff)->flavor) { + + if (consensus_cache_entry_handle_get((*diff)->entry) == NULL) { + /* the underlying entry has gone away; drop this. */ + next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); + cdm_diff_free(this); + continue; + } + + if (unless_target_sha3_matches && + fast_memneq(unless_target_sha3_matches, (*diff)->target_sha3, + DIGEST256_LEN)) { + /* target hash doesn't match; drop this. */ + next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); + cdm_diff_free(this); + continue; + } + } + next = HT_NEXT(cdm_diff_ht, &cdm_diff_ht, diff); + } +} + +/** + * Helper: initialize <b>cons_diff_cache</b>. + */ +static void +cdm_cache_init(void) +{ + unsigned n_entries = consdiff_cfg.cache_max_num * 2; + + tor_assert(cons_diff_cache == NULL); + cons_diff_cache = consensus_cache_open("diff-cache", n_entries); + if (cons_diff_cache == NULL) { + // LCOV_EXCL_START + log_err(LD_FS, "Error: Couldn't open storage for consensus diffs."); + tor_assert_unreached(); + // LCOV_EXCL_STOP + } else { + consdiffmgr_set_cache_flags(); + } + cdm_cache_dirty = 1; + cdm_cache_loaded = 0; +} + +/** + * Helper: return the consensus_cache_t * that backs this manager, + * initializing it if needed. + */ +STATIC consensus_cache_t * +cdm_cache_get(void) +{ + if (PREDICT_UNLIKELY(cons_diff_cache == NULL)) { + cdm_cache_init(); + } + return cons_diff_cache; +} + +/** + * Helper: given a list of labels, prepend the hex-encoded SHA3 digest + * of the <b>bodylen</b>-byte object at <b>body</b> to those labels, + * with <b>label</b> as its label. + */ +static void +cdm_labels_prepend_sha3(config_line_t **labels, + const char *label, + const uint8_t *body, + size_t bodylen) +{ + uint8_t sha3_digest[DIGEST256_LEN]; + char hexdigest[HEX_DIGEST256_LEN+1]; + crypto_digest256((char *)sha3_digest, + (const char *)body, bodylen, DIGEST_SHA3_256); + base16_encode(hexdigest, sizeof(hexdigest), + (const char *)sha3_digest, sizeof(sha3_digest)); + + config_line_prepend(labels, label, hexdigest); +} + +/** Helper: if there is a sha3-256 hex-encoded digest in <b>ent</b> with the + * given label, set <b>digest_out</b> to that value (decoded), and return 0. + * + * Return -1 if there is no such label, and -2 if it is badly formatted. */ +STATIC int +cdm_entry_get_sha3_value(uint8_t *digest_out, + consensus_cache_entry_t *ent, + const char *label) +{ + if (ent == NULL) + return -1; + + const char *hex = consensus_cache_entry_get_value(ent, label); + if (hex == NULL) + return -1; + + int n = base16_decode((char*)digest_out, DIGEST256_LEN, hex, strlen(hex)); + if (n != DIGEST256_LEN) + return -2; + else + return 0; +} + +/** + * Helper: look for a consensus with the given <b>flavor</b> and + * <b>valid_after</b> time in the cache. Return that consensus if it's + * present, or NULL if it's missing. + */ +STATIC consensus_cache_entry_t * +cdm_cache_lookup_consensus(consensus_flavor_t flavor, time_t valid_after) +{ + char formatted_time[ISO_TIME_LEN+1]; + format_iso_time_nospace(formatted_time, valid_after); + const char *flavname = networkstatus_get_flavor_name(flavor); + + /* We'll filter by valid-after time first, since that should + * match the fewest documents. */ + /* We could add an extra hashtable here, but since we only do this scan + * when adding a new consensus, it probably doesn't matter much. */ + smartlist_t *matches = smartlist_new(); + consensus_cache_find_all(matches, cdm_cache_get(), + LABEL_VALID_AFTER, formatted_time); + consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname); + consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + + consensus_cache_entry_t *result = NULL; + if (smartlist_len(matches) > 1) { + log_warn(LD_BUG, "How odd; there appear to be two matching consensuses " + "with flavor %s published at %s.", + flavname, formatted_time); + } + if (smartlist_len(matches)) { + result = smartlist_get(matches, 0); + } + smartlist_free(matches); + + return result; +} + +/** + * Given a string containing a networkstatus consensus, and the results of + * having parsed that consensus, add that consensus to the cache if it is not + * already present and not too old. Create new consensus diffs from or to + * that consensus as appropriate. + * + * Return 0 on success and -1 on failure. + */ +int +consdiffmgr_add_consensus(const char *consensus, + const networkstatus_t *as_parsed) +{ + if (BUG(consensus == NULL) || BUG(as_parsed == NULL)) + return -1; // LCOV_EXCL_LINE + if (BUG(as_parsed->type != NS_TYPE_CONSENSUS)) + return -1; // LCOV_EXCL_LINE + + const consensus_flavor_t flavor = as_parsed->flavor; + const time_t valid_after = as_parsed->valid_after; + + if (valid_after < approx_time() - 3600 * consdiff_cfg.cache_max_age_hours) { + log_info(LD_DIRSERV, "We don't care about this consensus document; it's " + "too old."); + return -1; + } + + /* Do we already have this one? */ + consensus_cache_entry_t *entry = + cdm_cache_lookup_consensus(flavor, valid_after); + if (entry) { + log_info(LD_DIRSERV, "We already have a copy of that consensus"); + return -1; + } + + /* We don't have it. Add it to the cache. */ + consdiffmgr_ensure_space_for_files(1); + + { + size_t bodylen = strlen(consensus); + config_line_t *labels = NULL; + char formatted_time[ISO_TIME_LEN+1]; + format_iso_time_nospace(formatted_time, valid_after); + const char *flavname = networkstatus_get_flavor_name(flavor); + + cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST_UNCOMPRESSED, + (const uint8_t *)consensus, bodylen); + + char *body_compressed = NULL; + size_t size_compressed = 0; + if (tor_compress(&body_compressed, &size_compressed, + consensus, bodylen, COMPRESS_CONSENSUS_WITH) < 0) { + config_free_lines(labels); + return -1; + } + cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST, + (const uint8_t *)body_compressed, size_compressed); + config_line_prepend(&labels, LABEL_COMPRESSION_TYPE, + compression_method_get_name(COMPRESS_CONSENSUS_WITH)); + config_line_prepend(&labels, LABEL_FLAVOR, flavname); + config_line_prepend(&labels, LABEL_VALID_AFTER, formatted_time); + config_line_prepend(&labels, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + + entry = consensus_cache_add(cdm_cache_get(), + labels, + (const uint8_t *)body_compressed, + size_compressed); + tor_free(body_compressed); + config_free_lines(labels); + } + + if (entry) { + consensus_cache_entry_mark_for_aggressive_release(entry); + consensus_cache_entry_decref(entry); + } + + cdm_cache_dirty = 1; + return entry ? 0 : -1; +} + +/** + * Helper: used to sort two smartlists of consensus_cache_entry_t by their + * LABEL_VALID_AFTER labels. + */ +static int +compare_by_valid_after_(const void **a, const void **b) +{ + const consensus_cache_entry_t *e1 = *a; + const consensus_cache_entry_t *e2 = *b; + /* We're in luck here: sorting UTC iso-encoded values lexically will work + * fine (until 9999). */ + return strcmp_opt(consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER), + consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER)); +} + +/** + * Helper: Sort <b>lst</b> by LABEL_VALID_AFTER and return the most recent + * entry. + */ +static consensus_cache_entry_t * +sort_and_find_most_recent(smartlist_t *lst) +{ + smartlist_sort(lst, compare_by_valid_after_); + if (smartlist_len(lst)) { + return smartlist_get(lst, smartlist_len(lst) - 1); + } else { + return NULL; + } +} + +/** + * Look up consensus_cache_entry_t for the consensus of type <b>flavor</b>, + * from the source consensus with the specified digest (which must be SHA3). + * + * If the diff is present, store it into *<b>entry_out</b> and return + * CONSDIFF_AVAILABLE. Otherwise return CONSDIFF_NOT_FOUND or + * CONSDIFF_IN_PROGRESS. + */ +consdiff_status_t +consdiffmgr_find_diff_from(consensus_cache_entry_t **entry_out, + consensus_flavor_t flavor, + int digest_type, + const uint8_t *digest, + size_t digestlen, + compress_method_t method) +{ + if (BUG(digest_type != DIGEST_SHA3_256) || + BUG(digestlen != DIGEST256_LEN)) { + return CONSDIFF_NOT_FOUND; // LCOV_EXCL_LINE + } + + // Try to look up the entry in the hashtable. + cdm_diff_t search, *ent; + memset(&search, 0, sizeof(search)); + search.flavor = flavor; + search.compress_method = method; + memcpy(search.from_sha3, digest, DIGEST256_LEN); + ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); + + if (ent == NULL || + ent->cdm_diff_status == CDM_DIFF_ERROR) { + return CONSDIFF_NOT_FOUND; + } else if (ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS) { + return CONSDIFF_IN_PROGRESS; + } else if (BUG(ent->cdm_diff_status != CDM_DIFF_PRESENT)) { + return CONSDIFF_IN_PROGRESS; + } + + *entry_out = consensus_cache_entry_handle_get(ent->entry); + return (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND; + +#if 0 + // XXXX Remove this. I'm keeping it around for now in case we need to + // XXXX debug issues in the hashtable. + char hex[HEX_DIGEST256_LEN+1]; + base16_encode(hex, sizeof(hex), (const char *)digest, digestlen); + const char *flavname = networkstatus_get_flavor_name(flavor); + + smartlist_t *matches = smartlist_new(); + consensus_cache_find_all(matches, cdm_cache_get(), + LABEL_FROM_SHA3_DIGEST, hex); + consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname); + consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + + *entry_out = sort_and_find_most_recent(matches); + consdiff_status_t result = + (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND; + smartlist_free(matches); + + return result; +#endif +} + +/** + * Perform periodic cleanup tasks on the consensus diff cache. Return + * the number of objects marked for deletion. + */ +int +consdiffmgr_cleanup(void) +{ + smartlist_t *objects = smartlist_new(); + smartlist_t *consensuses = smartlist_new(); + smartlist_t *diffs = smartlist_new(); + int n_to_delete = 0; + + log_debug(LD_DIRSERV, "Looking for consdiffmgr entries to remove"); + + // 1. Delete any consensus or diff or anything whose valid_after is too old. + const time_t valid_after_cutoff = + approx_time() - 3600 * consdiff_cfg.cache_max_age_hours; + + consensus_cache_find_all(objects, cdm_cache_get(), + NULL, NULL); + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { + const char *lv_valid_after = + consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER); + if (! lv_valid_after) { + log_debug(LD_DIRSERV, "Ignoring entry because it had no %s label", + LABEL_VALID_AFTER); + continue; + } + time_t valid_after = 0; + if (parse_iso_time_nospace(lv_valid_after, &valid_after) < 0) { + log_debug(LD_DIRSERV, "Ignoring entry because its %s value (%s) was " + "unparseable", LABEL_VALID_AFTER, escaped(lv_valid_after)); + continue; + } + if (valid_after < valid_after_cutoff) { + log_debug(LD_DIRSERV, "Deleting entry because its %s value (%s) was " + "too old", LABEL_VALID_AFTER, lv_valid_after); + consensus_cache_entry_mark_for_removal(ent); + ++n_to_delete; + } + } SMARTLIST_FOREACH_END(ent); + + // 2. Delete all diffs that lead to a consensus whose valid-after is not the + // latest. + for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { + const char *flavname = networkstatus_get_flavor_name(flav); + /* Determine the most recent consensus of this flavor */ + consensus_cache_find_all(consensuses, cdm_cache_get(), + LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + consensus_cache_filter_list(consensuses, LABEL_FLAVOR, flavname); + consensus_cache_entry_t *most_recent = + sort_and_find_most_recent(consensuses); + if (most_recent == NULL) + continue; + const char *most_recent_sha3 = + consensus_cache_entry_get_value(most_recent, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + if (BUG(most_recent_sha3 == NULL)) + continue; // LCOV_EXCL_LINE + + /* consider all such-flavored diffs, and look to see if they match. */ + consensus_cache_find_all(diffs, cdm_cache_get(), + LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname); + SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { + const char *this_diff_target_sha3 = + consensus_cache_entry_get_value(diff, LABEL_TARGET_SHA3_DIGEST); + if (!this_diff_target_sha3) + continue; + if (strcmp(this_diff_target_sha3, most_recent_sha3)) { + consensus_cache_entry_mark_for_removal(diff); + ++n_to_delete; + } + } SMARTLIST_FOREACH_END(diff); + smartlist_clear(consensuses); + smartlist_clear(diffs); + } + + smartlist_free(objects); + smartlist_free(consensuses); + smartlist_free(diffs); + + // Actually remove files, if they're not used. + consensus_cache_delete_pending(cdm_cache_get(), 0); + return n_to_delete; +} + +/** + * Initialize the consensus diff manager and its cache, and configure + * its parameters based on the latest torrc and networkstatus parameters. + */ +void +consdiffmgr_configure(const consdiff_cfg_t *cfg) +{ + if (cfg) + memcpy(&consdiff_cfg, cfg, sizeof(consdiff_cfg)); + + (void) cdm_cache_get(); +} + +/** + * Tell the sandbox (if any) configured by <b>cfg</b> to allow the + * operations that the consensus diff manager will need. + */ +int +consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg) +{ + return consensus_cache_register_with_sandbox(cdm_cache_get(), cfg); +} + +/** + * Scan the consensus diff manager's cache for any grossly malformed entries, + * and mark them as deletable. Return 0 if no problems were found; 1 + * if problems were found and fixed. + */ +int +consdiffmgr_validate(void) +{ + /* Right now, we only check for entries that have bad sha3 values */ + int problems = 0; + + smartlist_t *objects = smartlist_new(); + consensus_cache_find_all(objects, cdm_cache_get(), + NULL, NULL); + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, obj) { + uint8_t sha3_expected[DIGEST256_LEN]; + uint8_t sha3_received[DIGEST256_LEN]; + int r = cdm_entry_get_sha3_value(sha3_expected, obj, LABEL_SHA3_DIGEST); + if (r == -1) { + /* digest isn't there; that's allowed */ + continue; + } else if (r == -2) { + /* digest is malformed; that's not allowed */ + problems = 1; + consensus_cache_entry_mark_for_removal(obj); + continue; + } + const uint8_t *body; + size_t bodylen; + consensus_cache_entry_incref(obj); + r = consensus_cache_entry_get_body(obj, &body, &bodylen); + if (r == 0) { + crypto_digest256((char *)sha3_received, (const char *)body, bodylen, + DIGEST_SHA3_256); + } + consensus_cache_entry_decref(obj); + if (r < 0) + continue; + + // Deconfuse coverity about the possibility of sha3_received being + // uninitialized + tor_assert(r <= 0); + + if (fast_memneq(sha3_received, sha3_expected, DIGEST256_LEN)) { + problems = 1; + consensus_cache_entry_mark_for_removal(obj); + continue; + } + + } SMARTLIST_FOREACH_END(obj); + smartlist_free(objects); + return problems; +} + +/** + * Helper: build new diffs of <b>flavor</b> as needed + */ +static void +consdiffmgr_rescan_flavor_(consensus_flavor_t flavor) +{ + smartlist_t *matches = NULL; + smartlist_t *diffs = NULL; + smartlist_t *compute_diffs_from = NULL; + strmap_t *have_diff_from = NULL; + + // look for the most recent consensus, and for all previous in-range + // consensuses. Do they all have diffs to it? + const char *flavname = networkstatus_get_flavor_name(flavor); + + // 1. find the most recent consensus, and the ones that we might want + // to diff to it. + matches = smartlist_new(); + consensus_cache_find_all(matches, cdm_cache_get(), + LABEL_FLAVOR, flavname); + consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + consensus_cache_entry_t *most_recent = sort_and_find_most_recent(matches); + if (!most_recent) { + log_info(LD_DIRSERV, "No 'most recent' %s consensus found; " + "not making diffs", flavname); + goto done; + } + tor_assert(smartlist_len(matches)); + smartlist_del(matches, smartlist_len(matches) - 1); + + const char *most_recent_valid_after = + consensus_cache_entry_get_value(most_recent, LABEL_VALID_AFTER); + if (BUG(most_recent_valid_after == NULL)) + goto done; //LCOV_EXCL_LINE + uint8_t most_recent_sha3[DIGEST256_LEN]; + if (BUG(cdm_entry_get_sha3_value(most_recent_sha3, most_recent, + LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0)) + goto done; //LCOV_EXCL_LINE + + // 2. Find all the relevant diffs _to_ this consensus. These are ones + // that we don't need to compute. + diffs = smartlist_new(); + consensus_cache_find_all(diffs, cdm_cache_get(), + LABEL_VALID_AFTER, most_recent_valid_after); + consensus_cache_filter_list(diffs, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname); + have_diff_from = strmap_new(); + SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { + const char *va = consensus_cache_entry_get_value(diff, + LABEL_FROM_VALID_AFTER); + if (BUG(va == NULL)) + continue; // LCOV_EXCL_LINE + strmap_set(have_diff_from, va, diff); + } SMARTLIST_FOREACH_END(diff); + + // 3. See which consensuses in 'matches' don't have diffs yet. + smartlist_reverse(matches); // from newest to oldest. + compute_diffs_from = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(matches, consensus_cache_entry_t *, ent) { + const char *va = consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER); + if (BUG(va == NULL)) + continue; // LCOV_EXCL_LINE + if (strmap_get(have_diff_from, va) != NULL) + continue; /* we already have this one. */ + smartlist_add(compute_diffs_from, ent); + } SMARTLIST_FOREACH_END(ent); + + log_info(LD_DIRSERV, + "The most recent %s consensus is valid-after %s. We have diffs to " + "this consensus for %d/%d older %s consensuses. Generating diffs " + "for the other %d.", + flavname, + most_recent_valid_after, + smartlist_len(matches) - smartlist_len(compute_diffs_from), + smartlist_len(matches), + flavname, + smartlist_len(compute_diffs_from)); + + // 4. Update the hashtable; remove entries in this flavor to other + // target consensuses. + cdm_diff_ht_purge(flavor, most_recent_sha3); + + // 5. Actually launch the requests. + SMARTLIST_FOREACH_BEGIN(compute_diffs_from, consensus_cache_entry_t *, c) { + if (BUG(c == most_recent)) + continue; // LCOV_EXCL_LINE + + uint8_t this_sha3[DIGEST256_LEN]; + if (BUG(cdm_entry_get_sha3_value(this_sha3, c, + LABEL_SHA3_DIGEST_UNCOMPRESSED)<0)) + continue; // LCOV_EXCL_LINE + if (cdm_diff_ht_check_and_note_pending(flavor, + this_sha3, most_recent_sha3)) { + // This is already pending, or we encountered an error. + continue; + } + consensus_diff_queue_diff_work(c, most_recent); + } SMARTLIST_FOREACH_END(c); + + done: + smartlist_free(matches); + smartlist_free(diffs); + smartlist_free(compute_diffs_from); + strmap_free(have_diff_from, NULL); +} + +/** + * Scan the cache for diffs, and add them to the hashtable. + */ +static void +consdiffmgr_diffs_load(void) +{ + smartlist_t *diffs = smartlist_new(); + consensus_cache_find_all(diffs, cdm_cache_get(), + LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { + const char *lv_flavor = + consensus_cache_entry_get_value(diff, LABEL_FLAVOR); + if (!lv_flavor) + continue; + int flavor = networkstatus_parse_flavor_name(lv_flavor); + if (flavor < 0) + continue; + const char *lv_compression = + consensus_cache_entry_get_value(diff, LABEL_COMPRESSION_TYPE); + compress_method_t method = NO_METHOD; + if (lv_compression) { + method = compression_method_get_by_name(lv_compression); + if (method == UNKNOWN_METHOD) { + continue; + } + } + + uint8_t from_sha3[DIGEST256_LEN]; + uint8_t to_sha3[DIGEST256_LEN]; + if (cdm_entry_get_sha3_value(from_sha3, diff, LABEL_FROM_SHA3_DIGEST)<0) + continue; + if (cdm_entry_get_sha3_value(to_sha3, diff, LABEL_TARGET_SHA3_DIGEST)<0) + continue; + + cdm_diff_ht_set_status(flavor, from_sha3, to_sha3, + method, + CDM_DIFF_PRESENT, + consensus_cache_entry_handle_new(diff)); + } SMARTLIST_FOREACH_END(diff); + smartlist_free(diffs); +} + +/** + * Build new diffs as needed. + */ +void +consdiffmgr_rescan(void) +{ + if (cdm_cache_dirty == 0) + return; + + // Clean up here to make room for new diffs, and to ensure that older + // consensuses do not have any entries. + consdiffmgr_cleanup(); + + if (cdm_cache_loaded == 0) { + consdiffmgr_diffs_load(); + cdm_cache_loaded = 1; + } + + for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { + consdiffmgr_rescan_flavor_((consensus_flavor_t) flav); + } + + cdm_cache_dirty = 0; +} + +/** + * Helper: compare two files by their from-valid-after and valid-after labels, + * trying to sort in ascending order by from-valid-after (when present) and + * valid-after (when not). Place everything that has neither label first in + * the list. + */ +static int +compare_by_staleness_(const void **a, const void **b) +{ + const consensus_cache_entry_t *e1 = *a; + const consensus_cache_entry_t *e2 = *b; + const char *va1, *fva1, *va2, *fva2; + va1 = consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER); + va2 = consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER); + fva1 = consensus_cache_entry_get_value(e1, LABEL_FROM_VALID_AFTER); + fva2 = consensus_cache_entry_get_value(e2, LABEL_FROM_VALID_AFTER); + + if (fva1) + va1 = fva1; + if (fva2) + va2 = fva2; + + /* See note about iso-encoded values in compare_by_valid_after_. Also note + * that missing dates will get placed first. */ + return strcmp_opt(va1, va2); +} + +/** If there are not enough unused filenames to store <b>n</b> files, then + * delete old consensuses until there are. (We have to keep track of the + * number of filenames because of the way that the seccomp2 cache works.) + * + * Return 0 on success, -1 on failure. + **/ +static int +consdiffmgr_ensure_space_for_files(int n) +{ + consensus_cache_t *cache = cdm_cache_get(); + if (consensus_cache_get_n_filenames_available(cache) >= n) { + // there are already enough unused filenames. + return 0; + } + // Try a cheap deletion of stuff that's waiting to get deleted. + consensus_cache_delete_pending(cache, 0); + if (consensus_cache_get_n_filenames_available(cache) >= n) { + // okay, _that_ made enough filenames available. + return 0; + } + // Let's get more assertive: clean out unused stuff, and force-remove + // the files. + consdiffmgr_cleanup(); + consensus_cache_delete_pending(cache, 1); + const int n_to_remove = n - consensus_cache_get_n_filenames_available(cache); + if (n_to_remove <= 0) { + // okay, finally! + return 0; + } + + // At this point, we're going to have to throw out objects that will be + // missed. Too bad! + smartlist_t *objects = smartlist_new(); + consensus_cache_find_all(objects, cache, NULL, NULL); + smartlist_sort(objects, compare_by_staleness_); + int n_marked = 0; + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { + consensus_cache_entry_mark_for_removal(ent); + if (++n_marked >= n_to_remove) + break; + } SMARTLIST_FOREACH_END(ent); + + consensus_cache_delete_pending(cache, 1); + if (BUG(n_marked < n_to_remove)) + return -1; + else + return 0; +} + +/** + * Set consensus cache flags on the objects in this consdiffmgr. + */ +static void +consdiffmgr_set_cache_flags(void) +{ + /* Right now, we just mark the consensus objects for aggressive release, + * so that they get mmapped for as little time as possible. */ + smartlist_t *objects = smartlist_new(); + consensus_cache_find_all(objects, cdm_cache_get(), LABEL_DOCTYPE, + DOCTYPE_CONSENSUS); + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { + consensus_cache_entry_mark_for_aggressive_release(ent); + } SMARTLIST_FOREACH_END(ent); + smartlist_free(objects); +} + +/** + * Called before shutdown: drop all storage held by the consdiffmgr.c module. + */ +void +consdiffmgr_free_all(void) +{ + cdm_diff_t **diff, **next; + for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) { + cdm_diff_t *this = *diff; + next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); + cdm_diff_free(this); + } + consensus_cache_free(cons_diff_cache); + cons_diff_cache = NULL; +} + +/* ===== + Thread workers + =====*/ + +typedef struct compressed_result_t { + config_line_t *labels; + /** + * Output: Body of the diff, as compressed. + */ + uint8_t *body; + /** + * Output: length of body_out + */ + size_t bodylen; +} compressed_result_t; + +/** + * An object passed to a worker thread that will try to produce a consensus + * diff. + */ +typedef struct consensus_diff_worker_job_t { + /** + * Input: The consensus to compute the diff from. Holds a reference to the + * cache entry, which must not be released until the job is passed back to + * the main thread. The body must be mapped into memory in the main thread. + */ + consensus_cache_entry_t *diff_from; + /** + * Input: The consensus to compute the diff to. Holds a reference to the + * cache entry, which must not be released until the job is passed back to + * the main thread. The body must be mapped into memory in the main thread. + */ + consensus_cache_entry_t *diff_to; + + /** Output: labels and bodies */ + compressed_result_t out[ARRAY_LENGTH(compress_diffs_with)]; +} consensus_diff_worker_job_t; + +/** Given a consensus_cache_entry_t, check whether it has a label claiming + * that it was compressed. If so, uncompress its contents into <b>out</b> and + * set <b>outlen</b> to hold their size. If not, just copy the body into + * <b>out</b> and set <b>outlen</b> to its length. Return 0 on success, + * -1 on failure. + * + * In all cases, the output is nul-terminated. */ +STATIC int +uncompress_or_copy(char **out, size_t *outlen, + consensus_cache_entry_t *ent) +{ + const uint8_t *body; + size_t bodylen; + + if (consensus_cache_entry_get_body(ent, &body, &bodylen) < 0) + return -1; + + const char *lv_compression = + consensus_cache_entry_get_value(ent, LABEL_COMPRESSION_TYPE); + compress_method_t method = NO_METHOD; + + if (lv_compression) + method = compression_method_get_by_name(lv_compression); + + return tor_uncompress(out, outlen, (const char *)body, bodylen, + method, 1, LOG_WARN); +} + +/** + * Worker function. This function runs inside a worker thread and receives + * a consensus_diff_worker_job_t as its input. + */ +static workqueue_reply_t +consensus_diff_worker_threadfn(void *state_, void *work_) +{ + (void)state_; + consensus_diff_worker_job_t *job = work_; + const uint8_t *diff_from, *diff_to; + size_t len_from, len_to; + int r; + /* We need to have the body already mapped into RAM here. + */ + r = consensus_cache_entry_get_body(job->diff_from, &diff_from, &len_from); + if (BUG(r < 0)) + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + r = consensus_cache_entry_get_body(job->diff_to, &diff_to, &len_to); + if (BUG(r < 0)) + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + + const char *lv_to_valid_after = + consensus_cache_entry_get_value(job->diff_to, LABEL_VALID_AFTER); + const char *lv_from_valid_after = + consensus_cache_entry_get_value(job->diff_from, LABEL_VALID_AFTER); + const char *lv_from_digest = + consensus_cache_entry_get_value(job->diff_from, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + const char *lv_from_flavor = + consensus_cache_entry_get_value(job->diff_from, LABEL_FLAVOR); + const char *lv_to_flavor = + consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR); + const char *lv_to_digest = + consensus_cache_entry_get_value(job->diff_to, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + + /* All these values are mandatory on the input */ + if (BUG(!lv_to_valid_after) || + BUG(!lv_from_valid_after) || + BUG(!lv_from_digest) || + BUG(!lv_from_flavor) || + BUG(!lv_to_flavor)) { + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + } + /* The flavors need to match */ + if (BUG(strcmp(lv_from_flavor, lv_to_flavor))) { + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + } + + char *consensus_diff; + { + char *diff_from_nt = NULL, *diff_to_nt = NULL; + size_t diff_from_nt_len, diff_to_nt_len; + + if (uncompress_or_copy(&diff_from_nt, &diff_from_nt_len, + job->diff_from) < 0) { + return WQ_RPL_REPLY; + } + if (uncompress_or_copy(&diff_to_nt, &diff_to_nt_len, + job->diff_to) < 0) { + tor_free(diff_from_nt); + return WQ_RPL_REPLY; + } + tor_assert(diff_from_nt); + tor_assert(diff_to_nt); + + // XXXX ugh; this is going to calculate the SHA3 of both its + // XXXX inputs again, even though we already have that. Maybe it's time + // XXXX to change the API here? + consensus_diff = consensus_diff_generate(diff_from_nt, diff_to_nt); + tor_free(diff_from_nt); + tor_free(diff_to_nt); + } + if (!consensus_diff) { + /* Couldn't generate consensus; we'll leave the reply blank. */ + return WQ_RPL_REPLY; + } + + /* Compress the results and send the reply */ + tor_assert(compress_diffs_with[0] == NO_METHOD); + size_t difflen = strlen(consensus_diff); + job->out[0].body = (uint8_t *) consensus_diff; + job->out[0].bodylen = difflen; + + config_line_t *common_labels = NULL; + cdm_labels_prepend_sha3(&common_labels, + LABEL_SHA3_DIGEST_UNCOMPRESSED, + job->out[0].body, + job->out[0].bodylen); + config_line_prepend(&common_labels, LABEL_FROM_VALID_AFTER, + lv_from_valid_after); + config_line_prepend(&common_labels, LABEL_VALID_AFTER, + lv_to_valid_after); + config_line_prepend(&common_labels, LABEL_FLAVOR, lv_from_flavor); + config_line_prepend(&common_labels, LABEL_FROM_SHA3_DIGEST, + lv_from_digest); + config_line_prepend(&common_labels, LABEL_TARGET_SHA3_DIGEST, + lv_to_digest); + config_line_prepend(&common_labels, LABEL_DOCTYPE, + DOCTYPE_CONSENSUS_DIFF); + + job->out[0].labels = config_lines_dup(common_labels); + cdm_labels_prepend_sha3(&job->out[0].labels, + LABEL_SHA3_DIGEST, + job->out[0].body, + job->out[0].bodylen); + + unsigned u; + for (u = 1; u < n_diff_compression_methods(); ++u) { + compress_method_t method = compress_diffs_with[u]; + const char *methodname = compression_method_get_name(method); + char *result; + size_t sz; + if (0 == tor_compress(&result, &sz, consensus_diff, difflen, method)) { + job->out[u].body = (uint8_t*)result; + job->out[u].bodylen = sz; + job->out[u].labels = config_lines_dup(common_labels); + cdm_labels_prepend_sha3(&job->out[u].labels, LABEL_SHA3_DIGEST, + job->out[u].body, + job->out[u].bodylen); + config_line_prepend(&job->out[u].labels, + LABEL_COMPRESSION_TYPE, + methodname); + } + } + + config_free_lines(common_labels); + return WQ_RPL_REPLY; +} + +/** + * Helper: release all storage held in <b>job</b>. + */ +static void +consensus_diff_worker_job_free(consensus_diff_worker_job_t *job) +{ + if (!job) + return; + unsigned u; + for (u = 0; u < n_diff_compression_methods(); ++u) { + config_free_lines(job->out[u].labels); + tor_free(job->out[u].body); + } + consensus_cache_entry_decref(job->diff_from); + consensus_cache_entry_decref(job->diff_to); + tor_free(job); +} + +/** + * Worker function: This function runs in the main thread, and receives + * a consensus_diff_worker_job_t that the worker thread has already + * processed. + */ +static void +consensus_diff_worker_replyfn(void *work_) +{ + tor_assert(in_main_thread()); + tor_assert(work_); + + consensus_diff_worker_job_t *job = work_; + + const char *lv_from_digest = + consensus_cache_entry_get_value(job->diff_from, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + const char *lv_to_digest = + consensus_cache_entry_get_value(job->diff_to, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + const char *lv_flavor = + consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR); + if (BUG(lv_from_digest == NULL)) + lv_from_digest = "???"; // LCOV_EXCL_LINE + if (BUG(lv_to_digest == NULL)) + lv_to_digest = "???"; // LCOV_EXCL_LINE + + uint8_t from_sha3[DIGEST256_LEN]; + uint8_t to_sha3[DIGEST256_LEN]; + int flav = -1; + int cache = 1; + if (BUG(cdm_entry_get_sha3_value(from_sha3, job->diff_from, + LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0)) + cache = 0; + if (BUG(cdm_entry_get_sha3_value(to_sha3, job->diff_to, + LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0)) + cache = 0; + if (BUG(lv_flavor == NULL)) { + cache = 0; + } else if ((flav = networkstatus_parse_flavor_name(lv_flavor)) < 0) { + cache = 0; + } + + int status = CDM_DIFF_ERROR; + consensus_cache_entry_handle_t *handles[ARRAY_LENGTH(compress_diffs_with)]; + memset(handles, 0, sizeof(handles)); + + consdiffmgr_ensure_space_for_files(n_diff_compression_methods()); + + unsigned u; + for (u = 0; u < n_diff_compression_methods(); ++u) { + compress_method_t method = compress_diffs_with[u]; + uint8_t *body_out = job->out[u].body; + size_t bodylen_out = job->out[u].bodylen; + config_line_t *labels = job->out[u].labels; + const char *methodname = compression_method_get_name(method); + if (body_out && bodylen_out && labels) { + /* Success! Store the results */ + log_info(LD_DIRSERV, "Adding consensus diff from %s to %s, " + "compressed with %s", + lv_from_digest, lv_to_digest, methodname); + + consensus_cache_entry_t *ent = + consensus_cache_add(cdm_cache_get(), + labels, + body_out, + bodylen_out); + + status = CDM_DIFF_PRESENT; + handles[u] = consensus_cache_entry_handle_new(ent); + consensus_cache_entry_decref(ent); + } + } + if (status != CDM_DIFF_PRESENT) { + /* Failure! Nothing to do but complain */ + log_warn(LD_DIRSERV, + "Worker was unable to compute consensus diff " + "from %s to %s", lv_from_digest, lv_to_digest); + /* Cache this error so we don't try to compute this one again. */ + status = CDM_DIFF_ERROR; + } + + for (u = 0; u < ARRAY_LENGTH(handles); ++u) { + compress_method_t method = compress_diffs_with[u]; + if (cache) { + cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, status, + handles[u]); + } else { + consensus_cache_entry_handle_free(handles[u]); + } + } + + consensus_diff_worker_job_free(job); +} + +/** + * Queue the job of computing the diff from <b>diff_from</b> to <b>diff_to</b> + * in a worker thread. + */ +static int +consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from, + consensus_cache_entry_t *diff_to) +{ + tor_assert(in_main_thread()); + + consensus_cache_entry_incref(diff_from); + consensus_cache_entry_incref(diff_to); + + consensus_diff_worker_job_t *job = tor_malloc_zero(sizeof(*job)); + job->diff_from = diff_from; + job->diff_to = diff_to; + + /* Make sure body is mapped. */ + const uint8_t *body; + size_t bodylen; + int r1 = consensus_cache_entry_get_body(diff_from, &body, &bodylen); + int r2 = consensus_cache_entry_get_body(diff_to, &body, &bodylen); + if (r1 < 0 || r2 < 0) + goto err; + + workqueue_entry_t *work; + work = cpuworker_queue_work(consensus_diff_worker_threadfn, + consensus_diff_worker_replyfn, + job); + if (!work) + goto err; + + return 0; + err: + consensus_diff_worker_job_free(job); // includes decrefs. + return -1; +} + diff --git a/src/or/consdiffmgr.h b/src/or/consdiffmgr.h new file mode 100644 index 0000000000..048dae432c --- /dev/null +++ b/src/or/consdiffmgr.h @@ -0,0 +1,54 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONSDIFFMGR_H +#define TOR_CONSDIFFMGR_H + +/** + * Possible outcomes from trying to look up a given consensus diff. + */ +typedef enum consdiff_status_t { + CONSDIFF_AVAILABLE, + CONSDIFF_NOT_FOUND, + CONSDIFF_IN_PROGRESS, +} consdiff_status_t; + +typedef struct consdiff_cfg_t { + int32_t cache_max_age_hours; + int32_t cache_max_num; +} consdiff_cfg_t; + +struct consensus_cache_entry_t; // from conscache.h + +int consdiffmgr_add_consensus(const char *consensus, + const networkstatus_t *as_parsed); + +consdiff_status_t consdiffmgr_find_diff_from( + struct consensus_cache_entry_t **entry_out, + consensus_flavor_t flavor, + int digest_type, + const uint8_t *digest, + size_t digestlen, + compress_method_t method); +void consdiffmgr_rescan(void); +int consdiffmgr_cleanup(void); +void consdiffmgr_configure(const consdiff_cfg_t *cfg); +struct sandbox_cfg_elem; +int consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg); +void consdiffmgr_free_all(void); +int consdiffmgr_validate(void); + +#ifdef CONSDIFFMGR_PRIVATE +STATIC unsigned n_diff_compression_methods(void); +STATIC consensus_cache_t *cdm_cache_get(void); +STATIC consensus_cache_entry_t *cdm_cache_lookup_consensus( + consensus_flavor_t flavor, time_t valid_after); +STATIC int cdm_entry_get_sha3_value(uint8_t *digest_out, + consensus_cache_entry_t *ent, + const char *label); +STATIC int uncompress_or_copy(char **out, size_t *outlen, + consensus_cache_entry_t *ent); +#endif + +#endif + diff --git a/src/or/control.c b/src/or/control.c index 8ab31f18f7..9b0d7c0007 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1873,7 +1873,7 @@ getinfo_helper_listeners(control_connection_t *control_conn, /** Implementation helper for GETINFO: knows the answers for questions about * directory information. */ -static int +STATIC int getinfo_helper_dir(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg) @@ -2047,6 +2047,12 @@ getinfo_helper_dir(control_connection_t *control_conn, } } } else if (!strcmp(question, "network-status")) { /* v1 */ + static int network_status_warned = 0; + if (!network_status_warned) { + log_warn(LD_CONTROL, "GETINFO network-status is deprecated; it will " + "go away in a future version of Tor."); + network_status_warned = 1; + } routerlist_t *routerlist = router_get_routerlist(); if (!routerlist || !routerlist->routers || list_server_status_v1(routerlist->routers, answer, 1) < 0) { @@ -2058,7 +2064,7 @@ getinfo_helper_dir(control_connection_t *control_conn, char d[DIGEST_LEN]; signed_descriptor_t *sd = NULL; if (base16_decode(d, sizeof(d), question, strlen(question)) - != sizeof(d)) { + == sizeof(d)) { /* XXXX this test should move into extrainfo_get_by_descriptor_digest, * but I don't want to risk affecting other parts of the code, * especially since the rules for using our own extrainfo (including @@ -7007,10 +7013,9 @@ control_event_hs_descriptor_receive_end(const char *action, char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; const char *desc_id = NULL; - if (!action || !id_digest || !rend_data || !onion_address) { - log_warn(LD_BUG, "Called with action==%p, id_digest==%p, " - "rend_data==%p, onion_address==%p", action, id_digest, - rend_data, onion_address); + if (!action || !rend_data || !onion_address) { + log_warn(LD_BUG, "Called with action==%p, rend_data==%p, " + "onion_address==%p", action, rend_data, onion_address); return; } @@ -7033,7 +7038,8 @@ control_event_hs_descriptor_receive_end(const char *action, rend_hsaddress_str_or_unknown(onion_address), rend_auth_type_to_string( TO_REND_DATA_V2(rend_data)->auth_type), - node_describe_longname_by_id(id_digest), + id_digest ? + node_describe_longname_by_id(id_digest) : "UNKNOWN", desc_id_field ? desc_id_field : "", reason_field ? reason_field : ""); @@ -7113,19 +7119,18 @@ control_event_hs_descriptor_uploaded(const char *id_digest, id_digest, NULL); } -/** Send HS_DESC event to inform controller that query <b>rend_query</b> - * failed to retrieve hidden service descriptor identified by - * <b>id_digest</b>. If <b>reason</b> is not NULL, add it to REASON= - * field. +/** Send HS_DESC event to inform controller that query <b>rend_data</b> + * failed to retrieve hidden service descriptor from directory identified by + * <b>id_digest</b>. If NULL, "UNKNOWN" is used. If <b>reason</b> is not NULL, + * add it to REASON= field. */ void control_event_hs_descriptor_failed(const rend_data_t *rend_data, const char *id_digest, const char *reason) { - if (!rend_data || !id_digest) { - log_warn(LD_BUG, "Called with rend_data==%p, id_digest==%p", - rend_data, id_digest); + if (!rend_data) { + log_warn(LD_BUG, "Called with rend_data==%p", rend_data); return; } control_event_hs_descriptor_receive_end("FAILED", @@ -7133,8 +7138,11 @@ control_event_hs_descriptor_failed(const rend_data_t *rend_data, rend_data, id_digest, reason); } -/** send HS_DESC_CONTENT event after completion of a successful fetch from - * hs directory. */ +/** Send HS_DESC_CONTENT event after completion of a successful fetch from hs + * directory. If <b>hsdir_id_digest</b> is NULL, it is replaced by "UNKNOWN". + * If <b>content</b> is NULL, it is replaced by an empty string. The + * <b>onion_address</b> or <b>desc_id</b> set to NULL will no trigger the + * control event. */ void control_event_hs_descriptor_content(const char *onion_address, const char *desc_id, @@ -7144,9 +7152,9 @@ control_event_hs_descriptor_content(const char *onion_address, static const char *event_name = "HS_DESC_CONTENT"; char *esc_content = NULL; - if (!onion_address || !desc_id || !hsdir_id_digest) { - log_warn(LD_BUG, "Called with onion_address==%p, desc_id==%p, " - "hsdir_id_digest==%p", onion_address, desc_id, hsdir_id_digest); + if (!onion_address || !desc_id) { + log_warn(LD_BUG, "Called with onion_address==%p, desc_id==%p, ", + onion_address, desc_id); return; } @@ -7161,7 +7169,9 @@ control_event_hs_descriptor_content(const char *onion_address, event_name, rend_hsaddress_str_or_unknown(onion_address), desc_id, - node_describe_longname_by_id(hsdir_id_digest), + hsdir_id_digest ? + node_describe_longname_by_id(hsdir_id_digest) : + "UNKNOWN", esc_content); tor_free(esc_content); } diff --git a/src/or/control.h b/src/or/control.h index 16ba1ed8f0..41a194bfcb 100644 --- a/src/or/control.h +++ b/src/or/control.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -290,6 +290,10 @@ STATIC int getinfo_helper_downloads( control_connection_t *control_conn, const char *question, char **answer, const char **errmsg); +STATIC int getinfo_helper_dir( + control_connection_t *control_conn, + const char *question, char **answer, + const char **errmsg); #endif diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index fd6de6ea7c..af79fafaa6 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -479,6 +479,20 @@ queue_pending_tasks(void) } } +/** DOCDOC */ +MOCK_IMPL(workqueue_entry_t *, +cpuworker_queue_work,(workqueue_reply_t (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg)) +{ + tor_assert(threadpool); + + return threadpool_queue_work(threadpool, + fn, + reply_fn, + arg); +} + /** Try to tell a cpuworker to perform the public key operations necessary to * respond to <b>onionskin</b> for the circuit <b>circ</b>. * diff --git a/src/or/cpuworker.h b/src/or/cpuworker.h index 62cf0eb164..aedf2fae32 100644 --- a/src/or/cpuworker.h +++ b/src/or/cpuworker.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -14,6 +14,12 @@ void cpu_init(void); void cpuworkers_rotate_keyinfo(void); +struct workqueue_entry_s; +enum workqueue_reply_t; +MOCK_DECL(struct workqueue_entry_s *, cpuworker_queue_work, ( + enum workqueue_reply_t (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg)); struct create_cell_t; int assign_onionskin_to_cpuworker(or_circuit_t *circ, diff --git a/src/or/dircollate.c b/src/or/dircollate.c index 033a7afe0f..172364c5f5 100644 --- a/src/or/dircollate.c +++ b/src/or/dircollate.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dircollate.h b/src/or/dircollate.h index 358c730cbb..52214282b9 100644 --- a/src/or/dircollate.h +++ b/src/or/dircollate.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/directory.c b/src/or/directory.c index 80d3c30c63..2b9f18af7a 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRECTORY_PRIVATE @@ -14,6 +14,7 @@ #include "connection.h" #include "connection_edge.h" #include "control.h" +#include "compat.h" #define DIRECTORY_PRIVATE #include "directory.h" #include "dirserv.h" @@ -62,7 +63,7 @@ * multi-hop circuits for anonymity. * * Directory requests are launched by calling - * directory_initiate_command_rend() or one of its numerous variants. This + * directory_initiate_request(). This * launch the connection, will construct an HTTP request with * directory_send_command(), send the and wait for a response. The client * later handles the response with connection_dir_client_reached_eof(), @@ -97,9 +98,8 @@ * connection_finished_connecting() in connection.c */ static void directory_send_command(dir_connection_t *conn, - int purpose, int direct, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since); + int direct, + const directory_request_t *request); static int body_is_plausible(const char *body, size_t body_len, int purpose); static char *http_get_header(const char *headers, const char *which); static void http_set_address_origin(const char *headers, connection_t *conn); @@ -117,22 +117,10 @@ static void dir_microdesc_download_failed(smartlist_t *failed, int status_code); static int client_likes_consensus(networkstatus_t *v, const char *want_url); -static void directory_initiate_command_rend( - const tor_addr_port_t *or_addr_port, - const tor_addr_port_t *dir_addr_port, - const char *digest, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - circuit_guard_state_t *guard_state); - static void connection_dir_close_consensus_fetches( dir_connection_t *except_this_one, const char *resource); +static void directory_request_set_guard_state(directory_request_t *req, + struct circuit_guard_state_t *state); /********* START VARIABLES **********/ @@ -420,11 +408,14 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, } else { indirection = DIRIND_DIRECT_CONN; } - directory_initiate_command_routerstatus(rs, dir_purpose, - router_purpose, - indirection, - NULL, payload, upload_len, 0, - NULL); + + directory_request_t *req = directory_request_new(dir_purpose); + directory_request_set_routerstatus(req, rs); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_indirection(req, indirection); + directory_request_set_payload(req, payload, upload_len); + directory_initiate_request(req); + directory_request_free(req); } SMARTLIST_FOREACH_END(ds); if (!found) { char *s = authdir_type_to_string(type); @@ -565,20 +556,19 @@ MOCK_IMPL(void, directory_get_from_dirserver, ( routerinfo_t *ri = node->ri; /* clients always make OR connections to bridges */ tor_addr_port_t or_ap; - tor_addr_port_t nil_dir_ap; + directory_request_t *req = directory_request_new(dir_purpose); /* we are willing to use a non-preferred address if we need to */ fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0, &or_ap); - tor_addr_make_null(&nil_dir_ap.addr, AF_INET); - nil_dir_ap.port = 0; - directory_initiate_command_rend(&or_ap, - &nil_dir_ap, - ri->cache_info.identity_digest, - dir_purpose, - router_purpose, - DIRIND_ONEHOP, - resource, NULL, 0, if_modified_since, - NULL, guard_state); + directory_request_set_or_addr_port(req, &or_ap); + directory_request_set_directory_id_digest(req, + ri->cache_info.identity_digest); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_resource(req, resource); + directory_request_set_if_modified_since(req, if_modified_since); + directory_request_set_guard_state(req, guard_state); + directory_initiate_request(req); + directory_request_free(req); } else { if (guard_state) { entry_guard_cancel(&guard_state); @@ -638,12 +628,16 @@ MOCK_IMPL(void, directory_get_from_dirserver, ( if (rs) { const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP; - directory_initiate_command_routerstatus(rs, dir_purpose, - router_purpose, - indirection, - resource, NULL, 0, - if_modified_since, - guard_state); + directory_request_t *req = directory_request_new(dir_purpose); + directory_request_set_routerstatus(req, rs); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_indirection(req, indirection); + directory_request_set_resource(req, resource); + directory_request_set_if_modified_since(req, if_modified_since); + if (guard_state) + directory_request_set_guard_state(req, guard_state); + directory_initiate_request(req); + directory_request_free(req); } else { log_notice(LD_DIR, "While fetching directory info, " @@ -669,15 +663,17 @@ directory_get_from_all_authorities(uint8_t dir_purpose, SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), dir_server_t *, ds) { - routerstatus_t *rs; if (router_digest_is_me(ds->digest)) continue; if (!(ds->type & V3_DIRINFO)) continue; - rs = &ds->fake_status; - directory_initiate_command_routerstatus(rs, dir_purpose, router_purpose, - DIRIND_ONEHOP, resource, NULL, - 0, 0, NULL); + const routerstatus_t *rs = &ds->fake_status; + directory_request_t *req = directory_request_new(dir_purpose); + directory_request_set_routerstatus(req, rs); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_resource(req, resource); + directory_initiate_request(req); + directory_request_free(req); } SMARTLIST_FOREACH_END(ds); } @@ -777,110 +773,6 @@ directory_choose_address_routerstatus(const routerstatus_t *status, return 0; } -/** Same as directory_initiate_command_routerstatus(), but accepts - * rendezvous data to fetch a hidden service descriptor. */ -void -directory_initiate_command_routerstatus_rend(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - circuit_guard_state_t *guard_state) -{ - const or_options_t *options = get_options(); - const node_t *node; - tor_addr_port_t use_or_ap, use_dir_ap; - const int anonymized_connection = dirind_is_anon(indirection); - - tor_assert(status != NULL); - - node = node_get_by_id(status->identity_digest); - - /* XXX The below check is wrong: !node means it's not in the consensus, - * but we haven't checked if we have a descriptor for it -- and also, - * we only care about the descriptor if it's a begindir-style anonymized - * connection. */ - if (!node && anonymized_connection) { - log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " - "don't have its router descriptor.", - routerstatus_describe(status)); - return; - } - - if (options->ExcludeNodes && options->StrictNodes && - routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) { - log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but " - "it's in our ExcludedNodes list and StrictNodes is set. " - "Skipping. This choice might make your Tor not work.", - routerstatus_describe(status), - dir_conn_purpose_to_string(dir_purpose)); - return; - } - - /* At this point, if we are a client making a direct connection to a - * directory server, we have selected a server that has at least one address - * allowed by ClientUseIPv4/6 and Reachable{"",OR,Dir}Addresses. This - * selection uses the preference in ClientPreferIPv6{OR,Dir}Port, if - * possible. (If UseBridges is set, clients always use IPv6, and prefer it - * by default.) - * - * Now choose an address that we can use to connect to the directory server. - */ - if (directory_choose_address_routerstatus(status, indirection, &use_or_ap, - &use_dir_ap) < 0) { - return; - } - - /* We don't retry the alternate OR/Dir address for the same directory if - * the address we choose fails (#6772). - * Instead, we'll retry another directory on failure. */ - - directory_initiate_command_rend(&use_or_ap, &use_dir_ap, - status->identity_digest, - dir_purpose, router_purpose, - indirection, resource, - payload, payload_len, if_modified_since, - rend_query, - guard_state); -} - -/** Launch a new connection to the directory server <b>status</b> to - * upload or download a server or rendezvous - * descriptor. <b>dir_purpose</b> determines what - * kind of directory connection we're launching, and must be one of - * DIR_PURPOSE_{FETCH|UPLOAD}_{DIR|RENDDESC_V2}. <b>router_purpose</b> - * specifies the descriptor purposes we have in mind (currently only - * used for FETCH_DIR). - * - * When uploading, <b>payload</b> and <b>payload_len</b> determine the content - * of the HTTP post. Otherwise, <b>payload</b> should be NULL. - * - * When fetching a rendezvous descriptor, <b>resource</b> is the service ID we - * want to fetch. - */ -MOCK_IMPL(void, directory_initiate_command_routerstatus, - (const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - circuit_guard_state_t *guard_state)) -{ - directory_initiate_command_routerstatus_rend(status, dir_purpose, - router_purpose, - indirection, resource, - payload, payload_len, - if_modified_since, NULL, - guard_state); -} - /** Return true iff <b>conn</b> is the client side of a directory connection * we launched to ourself in order to determine the reachability of our * dir_port. */ @@ -1064,8 +956,47 @@ directory_must_use_begindir(const or_options_t *options) return !public_server_mode(options); } +struct directory_request_t { + /** + * These fields specify which directory we're contacting. Routerstatus, + * if present, overrides the other fields. + * + * @{ */ + tor_addr_port_t or_addr_port; + tor_addr_port_t dir_addr_port; + char digest[DIGEST_LEN]; + + const routerstatus_t *routerstatus; + /** @} */ + /** One of DIR_PURPOSE_* other than DIR_PURPOSE_SERVER. Describes what + * kind of operation we'll be doing (upload/download), and of what kind + * of document. */ + uint8_t dir_purpose; + /** One of ROUTER_PURPOSE_*; used for uploads and downloads of routerinfo + * and extrainfo docs. */ + uint8_t router_purpose; + /** Enum: determines whether to anonymize, and whether to use dirport or + * orport. */ + dir_indirection_t indirection; + /** Alias to the variable part of the URL for this request */ + const char *resource; + /** Alias to the payload to upload (if any) */ + const char *payload; + /** Number of bytes to upload from payload</b> */ + size_t payload_len; + /** Value to send in an if-modified-since header, or 0 for none. */ + time_t if_modified_since; + /** Hidden-service-specific information */ + const rend_data_t *rend_query; + /** Used internally to directory.c: gets informed when the attempt to + * connect to the directory succeeds or fails, if that attempt bears on the + * directory's usability as a directory guard. */ + circuit_guard_state_t *guard_state; +}; + /** Evaluate the situation and decide if we should use an encrypted * "begindir-style" connection for this directory request. + * 0) If there is no DirPort, yes. * 1) If or_port is 0, or it's a direct conn and or_port is firewalled * or we're a dir mirror, no. * 2) If we prefer to avoid begindir conns, and we're not fetching or @@ -1076,15 +1007,24 @@ directory_must_use_begindir(const or_options_t *options) */ static int directory_command_should_use_begindir(const or_options_t *options, - const tor_addr_t *addr, - int or_port, uint8_t router_purpose, - dir_indirection_t indirection, + const directory_request_t *req, const char **reason) { - (void) router_purpose; + const tor_addr_t *or_addr = &req->or_addr_port.addr; + //const tor_addr_t *dir_addr = &req->dir_addr_port.addr; + const int or_port = req->or_addr_port.port; + const int dir_port = req->dir_addr_port.port; + + const dir_indirection_t indirection = req->indirection; + tor_assert(reason); *reason = NULL; + /* Reasons why we must use begindir */ + if (!dir_port) { + *reason = "(using begindir - directory with no DirPort)"; + return 1; /* We don't know a DirPort -- must begindir. */ + } /* Reasons why we can't possibly use begindir */ if (!or_port) { *reason = "directory with unknown ORPort"; @@ -1097,7 +1037,7 @@ directory_command_should_use_begindir(const or_options_t *options, } if (indirection == DIRIND_ONEHOP) { /* We're firewalled and want a direct OR connection */ - if (!fascist_firewall_allows_address_addr(addr, or_port, + if (!fascist_firewall_allows_address_addr(or_addr, or_port, FIREWALL_OR_CONNECTION, 0, 0)) { *reason = "ORPort not reachable"; return 0; @@ -1116,68 +1056,274 @@ directory_command_should_use_begindir(const or_options_t *options, return 1; } -/** Helper for directory_initiate_command_rend: send the - * command to a server whose OR address/port is <b>or_addr</b>/<b>or_port</b>, - * whose directory address/port is <b>dir_addr</b>/<b>dir_port</b>, whose - * identity key digest is <b>digest</b>, with purposes <b>dir_purpose</b> and - * <b>router_purpose</b>, making an (in)direct connection as specified in - * <b>indirection</b>, with command <b>resource</b>, <b>payload</b> of - * <b>payload_len</b>, and asking for a result only <b>if_modified_since</b>. +/** + * Create and return a new directory_request_t with purpose + * <b>dir_purpose</b>. + */ +directory_request_t * +directory_request_new(uint8_t dir_purpose) +{ + tor_assert(dir_purpose >= DIR_PURPOSE_MIN_); + tor_assert(dir_purpose <= DIR_PURPOSE_MAX_); + tor_assert(dir_purpose != DIR_PURPOSE_SERVER); + tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2); + + directory_request_t *result = tor_malloc_zero(sizeof(*result)); + tor_addr_make_null(&result->or_addr_port.addr, AF_INET); + result->or_addr_port.port = 0; + tor_addr_make_null(&result->dir_addr_port.addr, AF_INET); + result->dir_addr_port.port = 0; + result->dir_purpose = dir_purpose; + result->router_purpose = ROUTER_PURPOSE_GENERAL; + result->indirection = DIRIND_ONEHOP; + return result; +} +/** + * Release all resources held by <b>req</b>. + */ +void +directory_request_free(directory_request_t *req) +{ + if (req == NULL) + return; + tor_free(req); +} +/** + * Set the address and OR port to use for this directory request. If there is + * no OR port, we'll have to connect over the dirport. (If there are both, + * the indirection setting determins which to use.) + */ +void +directory_request_set_or_addr_port(directory_request_t *req, + const tor_addr_port_t *p) +{ + memcpy(&req->or_addr_port, p, sizeof(*p)); +} +/** + * Set the address and dirport to use for this directory request. If there + * is no dirport, we'll have to connect over the OR port. (If there are both, + * the indirection setting determins which to use.) */ void -directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port, - const tor_addr_t *dir_addr, uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since) +directory_request_set_dir_addr_port(directory_request_t *req, + const tor_addr_port_t *p) { - tor_addr_port_t or_ap, dir_ap; + memcpy(&req->dir_addr_port, p, sizeof(*p)); +} +/** + * Set the RSA identity digest of the directory to use for this directory + * request. + */ +void +directory_request_set_directory_id_digest(directory_request_t *req, + const char *digest) +{ + memcpy(req->digest, digest, DIGEST_LEN); +} +/** + * Set the router purpose associated with uploaded and downloaded router + * descriptors and extrainfo documents in this directory request. The purpose + * must be one of ROUTER_PURPOSE_GENERAL (the default) or + * ROUTER_PURPOSE_BRIDGE. + */ +void +directory_request_set_router_purpose(directory_request_t *req, + uint8_t router_purpose) +{ + tor_assert(router_purpose == ROUTER_PURPOSE_GENERAL || + router_purpose == ROUTER_PURPOSE_BRIDGE); + // assert that it actually makes sense to set this purpose, given + // the dir_purpose. + req->router_purpose = router_purpose; +} +/** + * Set the indirection to be used for the directory request. The indirection + * parameter configures whether to connect to a DirPort or ORPort, and whether + * to anonymize the connection. DIRIND_ONEHOP (use ORPort, don't anonymize) + * is the default. See dir_indirection_t for more information. + */ +void +directory_request_set_indirection(directory_request_t *req, + dir_indirection_t indirection) +{ + req->indirection = indirection; +} - /* Use the null tor_addr and 0 port if the address or port isn't valid. */ - if (tor_addr_port_is_valid(or_addr, or_port, 0)) { - tor_addr_copy(&or_ap.addr, or_addr); - or_ap.port = or_port; - } else { - /* the family doesn't matter here, so make it IPv4 */ - tor_addr_make_null(&or_ap.addr, AF_INET); - or_ap.port = or_port = 0; +/** + * Set a pointer to the resource to request from a directory. Different + * request types use resources to indicate different components of their URL. + * Note that only an alias to <b>resource</b> is stored, so the + * <b>resource</b> must outlive the request. + */ +void +directory_request_set_resource(directory_request_t *req, + const char *resource) +{ + req->resource = resource; +} +/** + * Set a pointer to the payload to include with this directory request, along + * with its length. Note that only an alias to <b>payload</b> is stored, so + * the <b>payload</b> must outlive the request. + */ +void +directory_request_set_payload(directory_request_t *req, + const char *payload, + size_t payload_len) +{ + tor_assert(DIR_PURPOSE_IS_UPLOAD(req->dir_purpose)); + + req->payload = payload; + req->payload_len = payload_len; +} +/** + * Set an if-modified-since date to send along with the request. The + * default is 0 (meaning, send no if-modified-since header). + */ +void +directory_request_set_if_modified_since(directory_request_t *req, + time_t if_modified_since) +{ + req->if_modified_since = if_modified_since; +} +/** + * Set an object containing HS data to be associated with this request. Note + * that only an alias to <b>query</b> is stored, so the <b>query</b> object + * must outlive the request. + */ +void +directory_request_set_rend_query(directory_request_t *req, + const rend_data_t *query) +{ + if (query) { + tor_assert(req->dir_purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 || + req->dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2); } + req->rend_query = query; +} +/** Set a static circuit_guard_state_t object to affliate with the request in + * <b>req</b>. This object will receive notification when the attempt to + * connect to the guard either succeeds or fails. */ +static void +directory_request_set_guard_state(directory_request_t *req, + circuit_guard_state_t *state) +{ + req->guard_state = state; +} - if (tor_addr_port_is_valid(dir_addr, dir_port, 0)) { - tor_addr_copy(&dir_ap.addr, dir_addr); - dir_ap.port = dir_port; - } else { - /* the family doesn't matter here, so make it IPv4 */ - tor_addr_make_null(&dir_ap.addr, AF_INET); - dir_ap.port = dir_port = 0; +/** + * Internal: Return true if any information for contacting the directory in + * <b>req</b> has been set, other than by the routerstatus. */ +static int +directory_request_dir_contact_info_specified(const directory_request_t *req) +{ + /* We only check for ports here, since we don't use an addr unless the port + * is set */ + return (req->or_addr_port.port || + req->dir_addr_port.port || + ! tor_digest_is_zero(req->digest)); +} + +/** + * Set the routerstatus to use for the directory associated with this + * request. If this option is set, then no other function to set the + * directory's address or identity should be called. + */ +void +directory_request_set_routerstatus(directory_request_t *req, + const routerstatus_t *status) +{ + req->routerstatus = status; +} +/** + * Helper: update the addresses, ports, and identities in <b>req</b> + * from the routerstatus object in <b>req</b>. Return 0 on success. + * On failure, warn and return -1. + */ +static int +directory_request_set_dir_from_routerstatus(directory_request_t *req) + +{ + const routerstatus_t *status = req->routerstatus; + if (BUG(status == NULL)) + return -1; + const or_options_t *options = get_options(); + const node_t *node; + tor_addr_port_t use_or_ap, use_dir_ap; + const int anonymized_connection = dirind_is_anon(req->indirection); + + tor_assert(status != NULL); + + node = node_get_by_id(status->identity_digest); + + /* XXX The below check is wrong: !node means it's not in the consensus, + * but we haven't checked if we have a descriptor for it -- and also, + * we only care about the descriptor if it's a begindir-style anonymized + * connection. */ + if (!node && anonymized_connection) { + log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " + "don't have its router descriptor.", + routerstatus_describe(status)); + return -1; + } + + if (options->ExcludeNodes && options->StrictNodes && + routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) { + log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but " + "it's in our ExcludedNodes list and StrictNodes is set. " + "Skipping. This choice might make your Tor not work.", + routerstatus_describe(status), + dir_conn_purpose_to_string(req->dir_purpose)); + return -1; } - directory_initiate_command_rend(&or_ap, &dir_ap, - digest, dir_purpose, - router_purpose, indirection, - resource, payload, payload_len, - if_modified_since, NULL, NULL); + /* At this point, if we are a client making a direct connection to a + * directory server, we have selected a server that has at least one address + * allowed by ClientUseIPv4/6 and Reachable{"",OR,Dir}Addresses. This + * selection uses the preference in ClientPreferIPv6{OR,Dir}Port, if + * possible. (If UseBridges is set, clients always use IPv6, and prefer it + * by default.) + * + * Now choose an address that we can use to connect to the directory server. + */ + if (directory_choose_address_routerstatus(status, + req->indirection, &use_or_ap, + &use_dir_ap) < 0) { + return -1; + } + + directory_request_set_or_addr_port(req, &use_or_ap); + directory_request_set_dir_addr_port(req, &use_dir_ap); + directory_request_set_directory_id_digest(req, status->identity_digest); + return 0; } -/** Same as directory_initiate_command(), but accepts rendezvous data to - * fetch a hidden service descriptor, and takes its address & port arguments - * as tor_addr_port_t. */ -static void -directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, - const tor_addr_port_t *dir_addr_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - circuit_guard_state_t *guard_state) +/** + * Launch the provided directory request, configured in <b>request</b>. + * After this function is called, you can free <b>request</b>. + */ +MOCK_IMPL(void, +directory_initiate_request,(directory_request_t *request)) { - tor_assert(or_addr_port); - tor_assert(dir_addr_port); + tor_assert(request); + if (request->routerstatus) { + tor_assert_nonfatal( + ! directory_request_dir_contact_info_specified(request)); + if (directory_request_set_dir_from_routerstatus(request) < 0) { + return; + } + } + + const tor_addr_port_t *or_addr_port = &request->or_addr_port; + const tor_addr_port_t *dir_addr_port = &request->dir_addr_port; + const char *digest = request->digest; + const uint8_t dir_purpose = request->dir_purpose; + const uint8_t router_purpose = request->router_purpose; + const dir_indirection_t indirection = request->indirection; + const char *resource = request->resource; + const rend_data_t *rend_query = request->rend_query; + circuit_guard_state_t *guard_state = request->guard_state; + tor_assert(or_addr_port->port || dir_addr_port->port); tor_assert(digest); @@ -1187,10 +1333,9 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, const char *begindir_reason = NULL; /* Should the connection be to a relay's OR port (and inside that we will * send our directory request)? */ - const int use_begindir = directory_command_should_use_begindir(options, - &or_addr_port->addr, or_addr_port->port, - router_purpose, indirection, - &begindir_reason); + const int use_begindir = + directory_command_should_use_begindir(options, request, &begindir_reason); + /* Will the connection go via a three-hop Tor circuit? Note that this * is separate from whether it will use_begindir. */ const int anonymized_connection = dirind_is_anon(indirection); @@ -1235,9 +1380,9 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, if (!port || tor_addr_is_null(&addr)) { static int logged_backtrace = 0; log_warn(LD_DIR, - "Cannot make an outgoing %sconnection without %sPort.", + "Cannot make an outgoing %sconnection without a remote %sPort.", use_begindir ? "begindir " : "", - use_begindir ? "an OR" : "a Dir"); + use_begindir ? "OR" : "Dir"); if (!logged_backtrace) { log_backtrace(LOG_INFO, LD_BUG, "Address came from"); logged_backtrace = 1; @@ -1291,9 +1436,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, /* fall through */ case 0: /* queue the command on the outbuf */ - directory_send_command(conn, dir_purpose, 1, resource, - payload, payload_len, - if_modified_since); + directory_send_command(conn, 1, request); connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); /* writable indicates finish, readable indicates broken link, error indicates broken link in windowsland. */ @@ -1347,9 +1490,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, } conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; /* queue the command on the outbuf */ - directory_send_command(conn, dir_purpose, 0, resource, - payload, payload_len, - if_modified_since); + directory_send_command(conn, 0, request); connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); connection_start_reading(ENTRY_TO_CONN(linked_conn)); @@ -1359,7 +1500,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, /** Return true iff anything we say on <b>conn</b> is being encrypted before * we send it to the client/server. */ int -connection_dir_is_encrypted(dir_connection_t *conn) +connection_dir_is_encrypted(const dir_connection_t *conn) { /* Right now it's sufficient to see if conn is or has been linked, since * the only thing it could be linked to is an edge connection on a @@ -1452,15 +1593,22 @@ copy_ipv6_address(char* destination, const char* source, size_t len, } } -/** Queue an appropriate HTTP command on conn-\>outbuf. The other args - * are as in directory_initiate_command(). +/** Queue an appropriate HTTP command for <b>request</b> on + * <b>conn</b>-\>outbuf. If <b>direct</b> is true, we're making a + * non-anonymized connection to the dirport. */ static void directory_send_command(dir_connection_t *conn, - int purpose, int direct, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since) + const int direct, + const directory_request_t *req) { + tor_assert(req); + const int purpose = req->dir_purpose; + const char *resource = req->resource; + const char *payload = req->payload; + const size_t payload_len = req->payload_len; + const time_t if_modified_since = req->if_modified_since; + char proxystring[256]; char hoststring[128]; /* NEEDS to be the same size hoststring. @@ -1468,7 +1616,9 @@ directory_send_command(dir_connection_t *conn, char decorated_address[128]; smartlist_t *headers = smartlist_new(); char *url; + size_t url_len; char request[8192]; + size_t request_len, total_request_len = 0; const char *httpcommand = NULL; tor_assert(conn); @@ -1614,8 +1764,14 @@ directory_send_command(dir_connection_t *conn, } tor_snprintf(request, sizeof(request), "%s %s", httpcommand, proxystring); - connection_write_to_buf(request, strlen(request), TO_CONN(conn)); - connection_write_to_buf(url, strlen(url), TO_CONN(conn)); + + request_len = strlen(request); + total_request_len += request_len; + connection_write_to_buf(request, request_len, TO_CONN(conn)); + + url_len = strlen(url); + total_request_len += url_len; + connection_write_to_buf(url, url_len, TO_CONN(conn)); tor_free(url); if (!strcmp(httpcommand, "POST") || payload) { @@ -1630,15 +1786,27 @@ directory_send_command(dir_connection_t *conn, tor_free(header); } - connection_write_to_buf(request, strlen(request), TO_CONN(conn)); + request_len = strlen(request); + total_request_len += request_len; + connection_write_to_buf(request, request_len, TO_CONN(conn)); if (payload) { /* then send the payload afterwards too */ connection_write_to_buf(payload, payload_len, TO_CONN(conn)); + total_request_len += payload_len; } SMARTLIST_FOREACH(headers, char *, h, tor_free(h)); smartlist_free(headers); + + log_debug(LD_DIR, + "Sent request to directory server '%s:%d': " + "(purpose: %d, request size: " U64_FORMAT ", " + "payload size: " U64_FORMAT ")", + conn->base_.address, conn->base_.port, + conn->base_.purpose, + U64_PRINTF_ARG(total_request_len), + U64_PRINTF_ARG(payload ? payload_len : 0)); } /** Parse an HTTP request string <b>headers</b> of the form @@ -1932,6 +2100,9 @@ connection_dir_client_reached_eof(dir_connection_t *conn) conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); time_t now = time(NULL); int src_code; + size_t received_bytes; + + received_bytes = connection_get_inbuf_len(TO_CONN(conn)); switch (connection_fetch_from_buf_http(TO_CONN(conn), &headers, MAX_HEADERS_SIZE, @@ -1958,12 +2129,20 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } if (!reason) reason = tor_strdup("[no reason given]"); - log_debug(LD_DIR, + tor_log(LOG_DEBUG, LD_DIR, "Received response from directory server '%s:%d': %d %s " - "(purpose: %d)", + "(purpose: %d, response size: " U64_FORMAT +#ifdef MEASUREMENTS_21206 + ", data cells received: %d, data cells sent: %d" +#endif + ", compression: %d)", conn->base_.address, conn->base_.port, status_code, - escaped(reason), - conn->base_.purpose); + escaped(reason), conn->base_.purpose, + U64_PRINTF_ARG(received_bytes), +#ifdef MEASUREMENTS_21206 + conn->data_cells_received, conn->data_cells_sent, +#endif + compression); if (conn->guard_state) { /* we count the connection as successful once we can read from it. We do @@ -2056,15 +2235,15 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } /* Try declared compression first if we can. */ if (compression == GZIP_METHOD || compression == ZLIB_METHOD) - tor_gzip_uncompress(&new_body, &new_len, body, body_len, compression, - !allow_partial, LOG_PROTOCOL_WARN); + tor_uncompress(&new_body, &new_len, body, body_len, compression, + !allow_partial, LOG_PROTOCOL_WARN); /* Okay, if that didn't work, and we think that it was compressed * differently, try that. */ if (!new_body && (guessed == GZIP_METHOD || guessed == ZLIB_METHOD) && compression != guessed) - tor_gzip_uncompress(&new_body, &new_len, body, body_len, guessed, - !allow_partial, LOG_PROTOCOL_WARN); + tor_uncompress(&new_body, &new_len, body, body_len, guessed, + !allow_partial, LOG_PROTOCOL_WARN); /* If we're pretty sure that we have a compressed directory, and * we didn't manage to uncompress it, then warn and bail. */ if (!plausible && !new_body) { @@ -2095,7 +2274,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) networkstatus_consensus_download_failed(status_code, flavname); return -1; } - log_info(LD_DIR,"Received consensus directory (size %d) from server " + log_info(LD_DIR,"Received consensus directory (body size %d) from server " "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); if ((r=networkstatus_set_current_consensus(body, flavname, 0, conn->identity_digest))<0) { @@ -2134,8 +2313,9 @@ connection_dir_client_reached_eof(dir_connection_t *conn) tor_free(body); tor_free(headers); tor_free(reason); return -1; } - log_info(LD_DIR,"Received authority certificates (size %d) from server " - "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); + log_info(LD_DIR,"Received authority certificates (body size %d) from " + "server '%s:%d'", + (int)body_len, conn->base_.address, conn->base_.port); /* * Tell trusted_dirs_load_certs_from_string() whether it was by fp @@ -2170,7 +2350,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) { const char *msg; int st; - log_info(LD_DIR,"Got votes (size %d) from server %s:%d", + log_info(LD_DIR,"Got votes (body size %d) from server %s:%d", (int)body_len, conn->base_.address, conn->base_.port); if (status_code != 200) { log_warn(LD_DIR, @@ -2190,7 +2370,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) { const char *msg = NULL; - log_info(LD_DIR,"Got detached signatures (size %d) from server %s:%d", + log_info(LD_DIR,"Got detached signatures (body size %d) from server %s:%d", (int)body_len, conn->base_.address, conn->base_.port); if (status_code != 200) { log_warn(LD_DIR, @@ -2214,7 +2394,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) int n_asked_for = 0; int descriptor_digests = conn->requested_resource && !strcmpstart(conn->requested_resource,"d/"); - log_info(LD_DIR,"Received %s (size %d) from server '%s:%d'", + log_info(LD_DIR,"Received %s (body size %d) from server '%s:%d'", was_ei ? "extra server info" : "server info", (int)body_len, conn->base_.address, conn->base_.port); if (conn->requested_resource && @@ -2292,7 +2472,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) { smartlist_t *which = NULL; log_info(LD_DIR,"Received answer to microdescriptor request (status %d, " - "size %d) from server '%s:%d'", + "body size %d) from server '%s:%d'", status_code, (int)body_len, conn->base_.address, conn->base_.port); tor_assert(conn->requested_resource && @@ -2444,7 +2624,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) conn->identity_digest, \ NULL) ) tor_assert(conn->rend_data); - log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d " + log_info(LD_REND,"Received rendezvous descriptor (body size %d, status %d " "(%s))", (int)body_len, status_code, escaped(reason)); switch (status_code) { @@ -2748,6 +2928,31 @@ write_http_response_header(dir_connection_t *conn, ssize_t length, cache_lifetime); } +/** Parse the compression methods listed in an Accept-Encoding header <b>h</b>, + * and convert them to a bitfield where compression method x is supported if + * and only if 1 << x is set in the bitfield. */ +STATIC unsigned +parse_accept_encoding_header(const char *h) +{ + unsigned result = (1u << NO_METHOD); + smartlist_t *methods = smartlist_new(); + smartlist_split_string(methods, h, ",", + SPLIT_SKIP_SPACE|SPLIT_STRIP_SPACE|SPLIT_IGNORE_BLANK, 0); + + SMARTLIST_FOREACH_BEGIN(methods, const char *, m) { + compress_method_t method = compression_method_get_by_name(m); + if (method != UNKNOWN_METHOD) { + tor_assert(((unsigned)method) < 8*sizeof(unsigned)); + result |= (1u << method); + } + } SMARTLIST_FOREACH_END(m); + SMARTLIST_FOREACH_BEGIN(methods, char *, m) { + tor_free(m); + } SMARTLIST_FOREACH_END(m); + smartlist_free(methods); + return result; +} + /** Decide whether a client would accept the consensus we have. * * Clients can say they only want a consensus if it's signed by more @@ -2804,7 +3009,7 @@ client_likes_consensus(networkstatus_t *v, const char *want_url) /** Return the compression level we should use for sending a compressed * response of size <b>n_bytes</b>. */ -STATIC zlib_compression_level_t +STATIC compression_level_t choose_compression_level(ssize_t n_bytes) { if (! have_been_under_memory_pressure()) { @@ -2822,8 +3027,9 @@ choose_compression_level(ssize_t n_bytes) /** Information passed to handle a GET request. */ typedef struct get_handler_args_t { - /** True if the client asked for compressed data. */ - int compressed; + /** Bitmask of compression methods that the client said (or implied) it + * supported. */ + unsigned compression_supported; /** If nonzero, the time included an if-modified-since header with this * value. */ time_t if_modified_since; @@ -2897,8 +3103,9 @@ directory_handle_command_get,(dir_connection_t *conn, const char *headers, { char *url, *url_mem, *header; time_t if_modified_since = 0; - int compressed; + int zlib_compressed_in_url; size_t url_len; + unsigned compression_methods_supported; /* We ignore the body of a GET request. */ (void)req_body; @@ -2929,17 +3136,30 @@ directory_handle_command_get,(dir_connection_t *conn, const char *headers, url_mem = url; url_len = strlen(url); - compressed = url_len > 2 && !strcmp(url+url_len-2, ".z"); - if (compressed) { + + zlib_compressed_in_url = url_len > 2 && !strcmp(url+url_len-2, ".z"); + if (zlib_compressed_in_url) { url[url_len-2] = '\0'; url_len -= 2; } + if ((header = http_get_header(headers, "Accept-Encoding"))) { + compression_methods_supported = parse_accept_encoding_header(header); + tor_free(header); + } else { + compression_methods_supported = (1u << NO_METHOD); + if (zlib_compressed_in_url) + compression_methods_supported |= (1u << ZLIB_METHOD); + } + + /* Remove all methods that we don't both support. */ + compression_methods_supported &= tor_compress_get_supported_method_bitmask(); + get_handler_args_t args; args.url = url; args.headers = headers; args.if_modified_since = if_modified_since; - args.compressed = compressed; + args.compression_supported = compression_methods_supported; int i, result = -1; for (i = 0; url_table[i].string; ++i) { @@ -3018,12 +3238,12 @@ handle_get_current_consensus(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); const time_t if_modified_since = args->if_modified_since; + int clear_spool = 0; { /* v3 network status fetch. */ - smartlist_t *dir_fps = smartlist_new(); long lifetime = NETWORKSTATUS_CACHE_LIFETIME; networkstatus_t *v; @@ -3057,7 +3277,6 @@ handle_get_current_consensus(dir_connection_t *conn, if (v && !networkstatus_consensus_reasonably_live(v, now)) { write_http_status_line(conn, 404, "Consensus is too old"); warn_consensus_is_too_old(v, flavor, now); - smartlist_free(dir_fps); geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); tor_free(flavor); goto done; @@ -3067,51 +3286,54 @@ handle_get_current_consensus(dir_connection_t *conn, !client_likes_consensus(v, want_fps)) { write_http_status_line(conn, 404, "Consensus not signed by sufficient " "number of requested authorities"); - smartlist_free(dir_fps); geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); tor_free(flavor); goto done; } + conn->spool = smartlist_new(); + clear_spool = 1; { - char *fp = tor_malloc_zero(DIGEST_LEN); + spooled_resource_t *spooled; if (flavor) - strlcpy(fp, flavor, DIGEST_LEN); + spooled = spooled_resource_new(DIR_SPOOL_NETWORKSTATUS, + (uint8_t*)flavor, strlen(flavor)); + else + spooled = spooled_resource_new(DIR_SPOOL_NETWORKSTATUS, + NULL, 0); tor_free(flavor); - smartlist_add(dir_fps, fp); + smartlist_add(conn->spool, spooled); } lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; - if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */ + if (!smartlist_len(conn->spool)) { /* we failed to create/cache cp */ write_http_status_line(conn, 503, "Network status object unavailable"); - smartlist_free(dir_fps); geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE); goto done; } - if (!dirserv_remove_old_statuses(dir_fps, if_modified_since)) { + size_t size_guess = 0; + int n_expired = 0; + dirserv_spool_remove_missing_and_guess_size(conn, if_modified_since, + compressed, + &size_guess, + &n_expired); + + if (!smartlist_len(conn->spool) && !n_expired) { write_http_status_line(conn, 404, "Not found"); - SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); - smartlist_free(dir_fps); geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); goto done; - } else if (!smartlist_len(dir_fps)) { + } else if (!smartlist_len(conn->spool)) { write_http_status_line(conn, 304, "Not modified"); - SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); - smartlist_free(dir_fps); geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED); goto done; } - size_t dlen = dirserv_estimate_data_size(dir_fps, 0, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { log_debug(LD_DIRSERV, "Client asked for network status lists, but we've been " "writing too many bytes lately. Sending 503 Dir busy."); write_http_status_line(conn, 503, "Directory busy, try again later"); - SMARTLIST_FOREACH(dir_fps, char *, fp, tor_free(fp)); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_BUSY); goto done; } @@ -3125,25 +3347,29 @@ handle_get_current_consensus(dir_connection_t *conn, /* Note that a request for a network status has started, so that we * can measure the download time later on. */ if (conn->dirreq_id) - geoip_start_dirreq(conn->dirreq_id, dlen, DIRREQ_TUNNELED); + geoip_start_dirreq(conn->dirreq_id, size_guess, DIRREQ_TUNNELED); else - geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, + geoip_start_dirreq(TO_CONN(conn)->global_identifier, size_guess, DIRREQ_DIRECT); } + clear_spool = 0; write_http_response_header(conn, -1, compressed, - smartlist_len(dir_fps) == 1 ? lifetime : 0); - conn->fingerprint_stack = dir_fps; + smartlist_len(conn->spool) == 1 ? lifetime : 0); if (! compressed) - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); + conn->compress_state = tor_compress_new(0, ZLIB_METHOD, + HIGH_COMPRESSION); /* Prime the connection with some data. */ - conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; - connection_dirserv_flushed_some(conn); + const int initial_flush_result = connection_dirserv_flushed_some(conn); + tor_assert_nonfatal(initial_flush_result == 0); goto done; } done: + if (clear_spool) { + dir_conn_clear_spool(conn); + } return 0; } @@ -3153,7 +3379,7 @@ static int handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); { int current; ssize_t body_len = 0; @@ -3230,11 +3456,11 @@ handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args) if (smartlist_len(items)) { if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(estimated_len)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(estimated_len)); SMARTLIST_FOREACH(items, const char *, c, - connection_write_to_buf_zlib(c, strlen(c), conn, 0)); - connection_write_to_buf_zlib("", 0, conn, 1); + connection_write_to_buf_compress(c, strlen(c), conn, 0)); + connection_write_to_buf_compress("", 0, conn, 1); } else { SMARTLIST_FOREACH(items, const char *, c, connection_write_to_buf(c, strlen(c), TO_CONN(conn))); @@ -3260,44 +3486,47 @@ static int handle_get_microdesc(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); + int clear_spool = 1; { - smartlist_t *fps = smartlist_new(); + conn->spool = smartlist_new(); - dir_split_resource_into_fingerprints(url+strlen("/tor/micro/d/"), - fps, NULL, + dir_split_resource_into_spoolable(url+strlen("/tor/micro/d/"), + DIR_SPOOL_MICRODESC, + conn->spool, NULL, DSR_DIGEST256|DSR_BASE64|DSR_SORT_UNIQ); - if (!dirserv_have_any_microdesc(fps)) { + size_t size_guess = 0; + dirserv_spool_remove_missing_and_guess_size(conn, 0, compressed, + &size_guess, NULL); + if (smartlist_len(conn->spool) == 0) { write_http_status_line(conn, 404, "Not found"); - SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); - smartlist_free(fps); goto done; } - size_t dlen = dirserv_estimate_microdesc_size(fps, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { log_info(LD_DIRSERV, "Client asked for server descriptors, but we've been " "writing too many bytes lately. Sending 503 Dir busy."); write_http_status_line(conn, 503, "Directory busy, try again later"); - SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); - smartlist_free(fps); goto done; } + clear_spool = 0; write_http_response_header(conn, -1, compressed, MICRODESC_CACHE_LIFETIME); - conn->dir_spool_src = DIR_SPOOL_MICRODESC; - conn->fingerprint_stack = fps; if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(dlen)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(size_guess)); - connection_dirserv_flushed_some(conn); + const int initial_flush_result = connection_dirserv_flushed_some(conn); + tor_assert_nonfatal(initial_flush_result == 0); goto done; } done: + if (clear_spool) { + dir_conn_clear_spool(conn); + } return 0; } @@ -3307,71 +3536,91 @@ static int handle_get_descriptor(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); const or_options_t *options = get_options(); + int clear_spool = 1; if (!strcmpstart(url,"/tor/server/") || (!options->BridgeAuthoritativeDir && !options->BridgeRelay && !strcmpstart(url,"/tor/extra/"))) { - size_t dlen; int res; - const char *msg; + const char *msg = NULL; int cache_lifetime = 0; int is_extra = !strcmpstart(url,"/tor/extra/"); url += is_extra ? strlen("/tor/extra/") : strlen("/tor/server/"); - conn->fingerprint_stack = smartlist_new(); - res = dirserv_get_routerdesc_fingerprints(conn->fingerprint_stack, url, - &msg, - !connection_dir_is_encrypted(conn), - is_extra); - - if (!strcmpstart(url, "fp/")) { - if (smartlist_len(conn->fingerprint_stack) == 1) - cache_lifetime = ROUTERDESC_CACHE_LIFETIME; - } else if (!strcmpstart(url, "authority")) { - cache_lifetime = ROUTERDESC_CACHE_LIFETIME; - } else if (!strcmpstart(url, "all")) { - cache_lifetime = FULL_DIR_CACHE_LIFETIME; - } else if (!strcmpstart(url, "d/")) { - if (smartlist_len(conn->fingerprint_stack) == 1) - cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME; - } - if (!strcmpstart(url, "d/")) - conn->dir_spool_src = + dir_spool_source_t source; + time_t publish_cutoff = 0; + if (!strcmpstart(url, "d/")) { + source = is_extra ? DIR_SPOOL_EXTRA_BY_DIGEST : DIR_SPOOL_SERVER_BY_DIGEST; - else - conn->dir_spool_src = + } else { + source = is_extra ? DIR_SPOOL_EXTRA_BY_FP : DIR_SPOOL_SERVER_BY_FP; + /* We only want to apply a publish cutoff when we're requesting + * resources by fingerprint. */ + publish_cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH; + } + + conn->spool = smartlist_new(); + res = dirserv_get_routerdesc_spool(conn->spool, url, + source, + connection_dir_is_encrypted(conn), + &msg); + + if (!strcmpstart(url, "all")) { + cache_lifetime = FULL_DIR_CACHE_LIFETIME; + } else if (smartlist_len(conn->spool) == 1) { + cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME; + } - if (!dirserv_have_any_serverdesc(conn->fingerprint_stack, - conn->dir_spool_src)) { - res = -1; - msg = "Not found"; + size_t size_guess = 0; + int n_expired = 0; + dirserv_spool_remove_missing_and_guess_size(conn, publish_cutoff, + compressed, &size_guess, + &n_expired); + + /* If we are the bridge authority and the descriptor is a bridge + * descriptor, remember that we served this descriptor for desc stats. */ + /* XXXX it's a bit of a kludge to have this here. */ + if (get_options()->BridgeAuthoritativeDir && + source == DIR_SPOOL_SERVER_BY_FP) { + SMARTLIST_FOREACH_BEGIN(conn->spool, spooled_resource_t *, spooled) { + const routerinfo_t *router = + router_get_by_id_digest((const char *)spooled->digest); + /* router can be NULL here when the bridge auth is asked for its own + * descriptor. */ + if (router && router->purpose == ROUTER_PURPOSE_BRIDGE) + rep_hist_note_desc_served(router->cache_info.identity_digest); + } SMARTLIST_FOREACH_END(spooled); } - if (res < 0) + if (res < 0 || size_guess == 0 || smartlist_len(conn->spool) == 0) { + if (msg == NULL) + msg = "Not found"; write_http_status_line(conn, 404, msg); - else { - dlen = dirserv_estimate_data_size(conn->fingerprint_stack, - 1, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + } else { + if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { log_info(LD_DIRSERV, "Client asked for server descriptors, but we've been " "writing too many bytes lately. Sending 503 Dir busy."); write_http_status_line(conn, 503, "Directory busy, try again later"); - conn->dir_spool_src = DIR_SPOOL_NONE; + dir_conn_clear_spool(conn); goto done; } write_http_response_header(conn, -1, compressed, cache_lifetime); if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(dlen)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(size_guess)); + clear_spool = 0; /* Prime the connection with some data. */ - connection_dirserv_flushed_some(conn); + int initial_flush_result = connection_dirserv_flushed_some(conn); + tor_assert_nonfatal(initial_flush_result == 0); } goto done; } done: - return 0; + if (clear_spool) + dir_conn_clear_spool(conn); + return 0; } /** Helper function for GET /tor/keys/... @@ -3380,7 +3629,7 @@ static int handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); const time_t if_modified_since = args->if_modified_since; { smartlist_t *certs = smartlist_new(); @@ -3450,13 +3699,14 @@ handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args) write_http_response_header(conn, compressed?-1:len, compressed, 60*60); if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(len)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(len)); SMARTLIST_FOREACH(certs, authority_cert_t *, c, - connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body, - c->cache_info.signed_descriptor_len, - conn, 0)); - connection_write_to_buf_zlib("", 0, conn, 1); + connection_write_to_buf_compress( + c->cache_info.signed_descriptor_body, + c->cache_info.signed_descriptor_len, + conn, 0)); + connection_write_to_buf_compress("", 0, conn, 1); } else { SMARTLIST_FOREACH(certs, authority_cert_t *, c, connection_write_to_buf(c->cache_info.signed_descriptor_body, @@ -3718,7 +3968,7 @@ directory_handle_command_post,(dir_connection_t *conn, const char *headers, if (connection_dir_is_encrypted(conn) && !strcmpstart(url,"/tor/rendezvous2/publish")) { if (rend_cache_store_v2_desc_as_dir(body) < 0) { - log_warn(LD_REND, "Rejected v2 rend descriptor (length %d) from %s.", + log_warn(LD_REND, "Rejected v2 rend descriptor (body size %d) from %s.", (int)body_len, conn->base_.address); write_http_status_line(conn, 400, "Invalid v2 service descriptor rejected"); @@ -3895,7 +4145,7 @@ connection_dir_finished_flushing(dir_connection_t *conn) conn->base_.state = DIR_CONN_STATE_CLIENT_READING; return 0; case DIR_CONN_STATE_SERVER_WRITING: - if (conn->dir_spool_src != DIR_SPOOL_NONE) { + if (conn->spool) { log_warn(LD_BUG, "Emptied a dirserv buffer, but it's still spooling!"); connection_mark_for_close(TO_CONN(conn)); } else { @@ -4578,3 +4828,34 @@ dir_split_resource_into_fingerprints(const char *resource, return 0; } +/** As dir_split_resource_into_fingerprints, but instead fills + * <b>spool_out</b> with a list of spoolable_resource_t for the resource + * identified through <b>source</b>. */ +int +dir_split_resource_into_spoolable(const char *resource, + dir_spool_source_t source, + smartlist_t *spool_out, + int *compressed_out, + int flags) +{ + smartlist_t *fingerprints = smartlist_new(); + + tor_assert(flags & (DSR_HEX|DSR_BASE64)); + const size_t digest_len = + (flags & DSR_DIGEST256) ? DIGEST256_LEN : DIGEST_LEN; + + int r = dir_split_resource_into_fingerprints(resource, fingerprints, + compressed_out, flags); + /* This is not a very efficient implementation XXXX */ + SMARTLIST_FOREACH_BEGIN(fingerprints, uint8_t *, digest) { + spooled_resource_t *spooled = + spooled_resource_new(source, digest, digest_len); + if (spooled) + smartlist_add(spool_out, spooled); + tor_free(digest); + } SMARTLIST_FOREACH_END(digest); + + smartlist_free(fingerprints); + return r; +} + diff --git a/src/or/directory.h b/src/or/directory.h index 8be1f8e76e..8473d39e85 100644 --- a/src/or/directory.h +++ b/src/or/directory.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -41,45 +41,49 @@ typedef enum { int directory_must_use_begindir(const or_options_t *options); -MOCK_DECL(void, directory_initiate_command_routerstatus, - (const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - struct circuit_guard_state_t *guard_state)); - -void directory_initiate_command_routerstatus_rend(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - struct circuit_guard_state_t *guard_state); +/** + * A directory_request_t describes the information about a directory request + * at the client side. It describes what we're going to ask for, which + * directory we're going to ask for it, how we're going to contact that + * directory, and (in some cases) what to do with it when we're done. + */ +typedef struct directory_request_t directory_request_t; +directory_request_t *directory_request_new(uint8_t dir_purpose); +void directory_request_free(directory_request_t *req); +void directory_request_set_or_addr_port(directory_request_t *req, + const tor_addr_port_t *p); +void directory_request_set_dir_addr_port(directory_request_t *req, + const tor_addr_port_t *p); +void directory_request_set_directory_id_digest(directory_request_t *req, + const char *digest); +void directory_request_set_router_purpose(directory_request_t *req, + uint8_t router_purpose); +void directory_request_set_indirection(directory_request_t *req, + dir_indirection_t indirection); +void directory_request_set_resource(directory_request_t *req, + const char *resource); +void directory_request_set_payload(directory_request_t *req, + const char *payload, + size_t payload_len); +void directory_request_set_if_modified_since(directory_request_t *req, + time_t if_modified_since); +void directory_request_set_rend_query(directory_request_t *req, + const rend_data_t *query); + +void directory_request_set_routerstatus(directory_request_t *req, + const routerstatus_t *rs); + +MOCK_DECL(void, directory_initiate_request, (directory_request_t *request)); int parse_http_response(const char *headers, int *code, time_t *date, compress_method_t *compression, char **response); -int connection_dir_is_encrypted(dir_connection_t *conn); +int connection_dir_is_encrypted(const dir_connection_t *conn); int connection_dir_reached_eof(dir_connection_t *conn); int connection_dir_process_inbuf(dir_connection_t *conn); int connection_dir_finished_flushing(dir_connection_t *conn); int connection_dir_finished_connecting(dir_connection_t *conn); void connection_dir_about_to_close(dir_connection_t *dir_conn); -void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port, - const tor_addr_t *dir_addr, uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since); #define DSR_HEX (1<<0) #define DSR_BASE64 (1<<1) @@ -88,7 +92,12 @@ void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port, int dir_split_resource_into_fingerprints(const char *resource, smartlist_t *fp_out, int *compressed_out, int flags); - +enum dir_spool_source_t; +int dir_split_resource_into_spoolable(const char *resource, + enum dir_spool_source_t source, + smartlist_t *spool_out, + int *compressed_out, + int flags); int dir_split_resource_into_fingerprint_pairs(const char *res, smartlist_t *pairs_out); char *directory_dump_request_log(void); @@ -176,7 +185,7 @@ STATIC int handle_post_hs_descriptor(const char *url, const char *body); STATIC char* authdir_type_to_string(dirinfo_type_t auth); STATIC const char * dir_conn_purpose_to_string(int purpose); STATIC int should_use_directory_guards(const or_options_t *options); -STATIC zlib_compression_level_t choose_compression_level(ssize_t n_bytes); +STATIC compression_level_t choose_compression_level(ssize_t n_bytes); STATIC const smartlist_t *find_dl_schedule(download_status_t *dls, const or_options_t *options); STATIC void find_dl_min_and_max_delay(download_status_t *dls, @@ -187,6 +196,7 @@ STATIC int next_random_exponential_delay(int delay, int max_delay); STATIC int parse_hs_version_from_post(const char *url, const char *prefix, const char **end_pos); +STATIC unsigned parse_accept_encoding_header(const char *h); #endif #endif diff --git a/src/or/dirserv.c b/src/or/dirserv.c index af01f8c283..e76fd932ca 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRSERV_PRIVATE @@ -81,14 +81,23 @@ dirserv_get_status_impl(const char *fp, const char *nickname, int severity); static void clear_cached_dir(cached_dir_t *d); static const signed_descriptor_t *get_signed_descriptor_by_fp( - const char *fp, - int extrainfo, - time_t publish_cutoff); + const uint8_t *fp, + int extrainfo); static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei, const char **msg); static uint32_t dirserv_get_bandwidth_for_router_kb(const routerinfo_t *ri); static uint32_t dirserv_get_credible_bandwidth_kb(const routerinfo_t *ri); +static int spooled_resource_lookup_body(const spooled_resource_t *spooled, + int conn_is_encrypted, + const uint8_t **body_out, + size_t *size_out, + time_t *published_out); +static cached_dir_t *spooled_resource_lookup_cached_dir( + const spooled_resource_t *spooled, + time_t *published_out); +static cached_dir_t *lookup_cached_dir_by_fp(const uint8_t *fp); + /************** Fingerprint handling code ************/ /* 1 Historically used to indicate Named */ @@ -814,6 +823,9 @@ directory_remove_invalid(void) * Allocate and return a description of the status of the server <b>desc</b>, * for use in a v1-style router-status line. The server is listed * as running iff <b>is_live</b> is true. + * + * This is deprecated: it's only used for controllers that want outputs in + * the old format. */ static char * list_single_server_status(const routerinfo_t *desc, int is_live) @@ -926,6 +938,9 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now) * *<b>router_status_out</b>. Return 0 on success, -1 on failure. * * If for_controller is true, include the routers with very old descriptors. + * + * This is deprecated: it's only used for controllers that want outputs in + * the old format. */ int list_server_status_v1(smartlist_t *routers, char **router_status_out, @@ -1161,8 +1176,8 @@ new_cached_dir(char *s, time_t published) d->dir = s; d->dir_len = strlen(s); d->published = published; - if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, - ZLIB_METHOD)) { + if (tor_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, + ZLIB_METHOD)) { log_warn(LD_BUG, "Error compressing directory"); } return d; @@ -3037,58 +3052,61 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, * requests, adds identity digests. */ int -dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, int for_unencrypted_conn, - int is_extrainfo) +dirserv_get_routerdesc_spool(smartlist_t *spool_out, + const char *key, + dir_spool_source_t source, + int conn_is_encrypted, + const char **msg_out) { - int by_id = 1; - *msg = NULL; + *msg_out = NULL; if (!strcmp(key, "all")) { - routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, - smartlist_add(fps_out, - tor_memdup(r->cache_info.identity_digest, DIGEST_LEN))); - /* Treat "all" requests as if they were unencrypted */ - for_unencrypted_conn = 1; + const routerlist_t *rl = router_get_routerlist(); + SMARTLIST_FOREACH_BEGIN(rl->routers, const routerinfo_t *, r) { + spooled_resource_t *spooled; + spooled = spooled_resource_new(source, + (const uint8_t *)r->cache_info.identity_digest, + DIGEST_LEN); + /* Treat "all" requests as if they were unencrypted */ + conn_is_encrypted = 0; + smartlist_add(spool_out, spooled); + } SMARTLIST_FOREACH_END(r); } else if (!strcmp(key, "authority")) { const routerinfo_t *ri = router_get_my_routerinfo(); if (ri) - smartlist_add(fps_out, - tor_memdup(ri->cache_info.identity_digest, DIGEST_LEN)); + smartlist_add(spool_out, + spooled_resource_new(source, + (const uint8_t *)ri->cache_info.identity_digest, + DIGEST_LEN)); } else if (!strcmpstart(key, "d/")) { - by_id = 0; key += strlen("d/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); + dir_split_resource_into_spoolable(key, source, spool_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else if (!strcmpstart(key, "fp/")) { key += strlen("fp/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); + dir_split_resource_into_spoolable(key, source, spool_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else { - *msg = "Key not recognized"; + *msg_out = "Not found"; return -1; } - if (for_unencrypted_conn) { + if (! conn_is_encrypted) { /* Remove anything that insists it not be sent unencrypted. */ - SMARTLIST_FOREACH_BEGIN(fps_out, char *, cp) { - const signed_descriptor_t *sd; - if (by_id) - sd = get_signed_descriptor_by_fp(cp,is_extrainfo,0); - else if (is_extrainfo) - sd = extrainfo_get_by_descriptor_digest(cp); - else - sd = router_get_by_descriptor_digest(cp); - if (sd && !sd->send_unencrypted) { - tor_free(cp); - SMARTLIST_DEL_CURRENT(fps_out, cp); - } - } SMARTLIST_FOREACH_END(cp); + SMARTLIST_FOREACH_BEGIN(spool_out, spooled_resource_t *, spooled) { + const uint8_t *body = NULL; + size_t bodylen = 0; + int r = spooled_resource_lookup_body(spooled, conn_is_encrypted, + &body, &bodylen, NULL); + if (r < 0 || body == NULL || bodylen == 0) { + SMARTLIST_DEL_CURRENT(spool_out, spooled); + spooled_resource_free(spooled); + } + } SMARTLIST_FOREACH_END(spooled); } - if (!smartlist_len(fps_out)) { - *msg = "Servers unavailable"; + if (!smartlist_len(spool_out)) { + *msg_out = "Servers unavailable"; return -1; } return 0; @@ -3352,410 +3370,446 @@ dirserv_test_reachability(time_t now) ctr = (ctr + 1) % REACHABILITY_MODULO_PER_TEST; /* increment ctr */ } -/** Given a fingerprint <b>fp</b> which is either set if we're looking for a - * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded - * flavor name if we want a flavored v3 status, return a pointer to the - * appropriate cached dir object, or NULL if there isn't one available. */ -static cached_dir_t * -lookup_cached_dir_by_fp(const char *fp) +/* ========== + * Spooling code. + * ========== */ + +spooled_resource_t * +spooled_resource_new(dir_spool_source_t source, + const uint8_t *digest, size_t digestlen) { - cached_dir_t *d = NULL; - if (tor_digest_is_zero(fp) && cached_consensuses) { - d = strmap_get(cached_consensuses, "ns"); - } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses && - (d = strmap_get(cached_consensuses, fp))) { - /* this here interface is a nasty hack XXXX */; + spooled_resource_t *spooled = tor_malloc_zero(sizeof(spooled_resource_t)); + spooled->spool_source = source; + switch (source) { + case DIR_SPOOL_NETWORKSTATUS: + spooled->spool_eagerly = 0; + break; + case DIR_SPOOL_SERVER_BY_DIGEST: + case DIR_SPOOL_SERVER_BY_FP: + case DIR_SPOOL_EXTRA_BY_DIGEST: + case DIR_SPOOL_EXTRA_BY_FP: + case DIR_SPOOL_MICRODESC: + default: + spooled->spool_eagerly = 1; + break; } - return d; + tor_assert(digestlen <= sizeof(spooled->digest)); + if (digest) + memcpy(spooled->digest, digest, digestlen); + return spooled; } -/** Remove from <b>fps</b> every networkstatus key where both - * a) we have a networkstatus document and - * b) it is not newer than <b>cutoff</b>. - * - * Return 1 if any items were present at all; else return 0. - */ -int -dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff) +/** Release all storage held by <b>spooled</b>. */ +void +spooled_resource_free(spooled_resource_t *spooled) { - int found_any = 0; - SMARTLIST_FOREACH_BEGIN(fps, char *, digest) { - cached_dir_t *d = lookup_cached_dir_by_fp(digest); - if (!d) - continue; - found_any = 1; - if (d->published <= cutoff) { - tor_free(digest); - SMARTLIST_DEL_CURRENT(fps, digest); - } - } SMARTLIST_FOREACH_END(digest); - - return found_any; -} + if (spooled == NULL) + return; -/** Return the cache-info for identity fingerprint <b>fp</b>, or - * its extra-info document if <b>extrainfo</b> is true. Return - * NULL if not found or if the descriptor is older than - * <b>publish_cutoff</b>. */ -static const signed_descriptor_t * -get_signed_descriptor_by_fp(const char *fp, int extrainfo, - time_t publish_cutoff) -{ - if (router_digest_is_me(fp)) { - if (extrainfo) - return &(router_get_my_extrainfo()->cache_info); - else - return &(router_get_my_routerinfo()->cache_info); - } else { - const routerinfo_t *ri = router_get_by_id_digest(fp); - if (ri && - ri->cache_info.published_on > publish_cutoff) { - if (extrainfo) - return extrainfo_get_by_descriptor_digest( - ri->cache_info.extra_info_digest); - else - return &ri->cache_info; - } + if (spooled->cached_dir_ref) { + cached_dir_decref(spooled->cached_dir_ref); } - return NULL; -} -/** Return true iff we have any of the documents (extrainfo or routerdesc) - * specified by the fingerprints in <b>fps</b> and <b>spool_src</b>. Used to - * decide whether to send a 404. */ -int -dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src) -{ - time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; - SMARTLIST_FOREACH_BEGIN(fps, const char *, fp) { - switch (spool_src) - { - case DIR_SPOOL_EXTRA_BY_DIGEST: - if (extrainfo_get_by_descriptor_digest(fp)) return 1; - break; - case DIR_SPOOL_SERVER_BY_DIGEST: - if (router_get_by_descriptor_digest(fp)) return 1; - break; - case DIR_SPOOL_EXTRA_BY_FP: - case DIR_SPOOL_SERVER_BY_FP: - if (get_signed_descriptor_by_fp(fp, - spool_src == DIR_SPOOL_EXTRA_BY_FP, publish_cutoff)) - return 1; - break; - } - } SMARTLIST_FOREACH_END(fp); - return 0; + tor_free(spooled); } -/** Return true iff any of the 256-bit elements in <b>fps</b> is the digest of - * a microdescriptor we have. */ -int -dirserv_have_any_microdesc(const smartlist_t *fps) +/** When spooling data from a cached_dir_t object, we always add + * at least this much. */ +#define DIRSERV_CACHED_DIR_CHUNK_SIZE 8192 + +/** Return an compression ratio for compressing objects from <b>source</b>. + */ +static double +estimate_compression_ratio(dir_spool_source_t source) { - microdesc_cache_t *cache = get_microdesc_cache(); - SMARTLIST_FOREACH(fps, const char *, fp, - if (microdesc_cache_lookup_by_digest256(cache, fp)) - return 1); - return 0; + /* We should put in better estimates here, depending on the number of + objects and their type */ + (void) source; + return 0.5; } -/** Return an approximate estimate of the number of bytes that will - * be needed to transmit the server descriptors (if is_serverdescs -- - * they can be either d/ or fp/ queries) or networkstatus objects (if - * !is_serverdescs) listed in <b>fps</b>. If <b>compressed</b> is set, - * we guess how large the data will be after compression. +/** Return an estimated number of bytes needed for transmitting the + * resource in <b>spooled</b> on <b>conn</b> * - * The return value is an estimate; it might be larger or smaller. - **/ -size_t -dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, - int compressed) -{ - size_t result; - tor_assert(fps); - if (is_serverdescs) { - int n = smartlist_len(fps); - const routerinfo_t *me = router_get_my_routerinfo(); - result = (me?me->cache_info.signed_descriptor_len:2048) * n; - if (compressed) - result /= 2; /* observed compressibility is between 35 and 55%. */ + * As a convenient side-effect, set *<b>published_out</b> to the resource's + * publication time. + */ +static size_t +spooled_resource_estimate_size(const spooled_resource_t *spooled, + dir_connection_t *conn, + int compressed, + time_t *published_out) +{ + if (spooled->spool_eagerly) { + const uint8_t *body = NULL; + size_t bodylen = 0; + int r = spooled_resource_lookup_body(spooled, + connection_dir_is_encrypted(conn), + &body, &bodylen, + published_out); + if (r == -1 || body == NULL || bodylen == 0) + return 0; + if (compressed) { + double ratio = estimate_compression_ratio(spooled->spool_source); + bodylen = (size_t)(bodylen * ratio); + } + return bodylen; } else { - result = 0; - SMARTLIST_FOREACH(fps, const char *, digest, { - cached_dir_t *dir = lookup_cached_dir_by_fp(digest); - if (dir) - result += compressed ? dir->dir_z_len : dir->dir_len; - }); + cached_dir_t *cached; + if (spooled->cached_dir_ref) { + cached = spooled->cached_dir_ref; + } else { + cached = spooled_resource_lookup_cached_dir(spooled, + published_out); + } + if (cached == NULL) { + return 0; + } + size_t result = compressed ? cached->dir_z_len : cached->dir_len; + return result; } - return result; } -/** Given a list of microdescriptor hashes, guess how many bytes will be - * needed to transmit them, and return the guess. */ -size_t -dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed) -{ - size_t result = smartlist_len(fps) * microdesc_average_size(NULL); - if (compressed) - result /= 2; - return result; -} +/** Return code for spooled_resource_flush_some */ +typedef enum { + SRFS_ERR = -1, + SRFS_MORE = 0, + SRFS_DONE +} spooled_resource_flush_status_t; -/** When we're spooling data onto our outbuf, add more whenever we dip - * below this threshold. */ -#define DIRSERV_BUFFER_MIN 16384 +/** Flush some or all of the bytes from <b>spooled</b> onto <b>conn</b>. + * Return SRFS_ERR on error, SRFS_MORE if there are more bytes to flush from + * this spooled resource, or SRFS_DONE if we are done flushing this spooled + * resource. + */ +static spooled_resource_flush_status_t +spooled_resource_flush_some(spooled_resource_t *spooled, + dir_connection_t *conn) +{ + if (spooled->spool_eagerly) { + /* Spool_eagerly resources are sent all-at-once. */ + const uint8_t *body = NULL; + size_t bodylen = 0; + int r = spooled_resource_lookup_body(spooled, + connection_dir_is_encrypted(conn), + &body, &bodylen, NULL); + if (r == -1 || body == NULL || bodylen == 0) { + /* Absent objects count as "done". */ + return SRFS_DONE; + } + if (conn->compress_state) { + connection_write_to_buf_compress((const char*)body, bodylen, conn, 0); + } else { + connection_write_to_buf((const char*)body, bodylen, TO_CONN(conn)); + } + return SRFS_DONE; + } else { + cached_dir_t *cached = spooled->cached_dir_ref; + if (cached == NULL) { + /* The cached_dir_t hasn't been materialized yet. So let's look it up. */ + cached = spooled->cached_dir_ref = + spooled_resource_lookup_cached_dir(spooled, NULL); + if (!cached) { + /* Absent objects count as done. */ + return SRFS_DONE; + } + ++cached->refcnt; + tor_assert_nonfatal(spooled->cached_dir_offset == 0); + } -/** Spooling helper: called when we have no more data to spool to <b>conn</b>. - * Flushes any remaining data to be (un)compressed, and changes the spool - * source to NONE. Returns 0 on success, negative on failure. */ -static int -connection_dirserv_finish_spooling(dir_connection_t *conn) -{ - if (conn->zlib_state) { - connection_write_to_buf_zlib("", 0, conn, 1); - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; + /* How many bytes left to flush? */ + int64_t remaining = 0; + remaining = cached->dir_z_len - spooled->cached_dir_offset; + if (BUG(remaining < 0)) + return SRFS_ERR; + ssize_t bytes = (ssize_t) MIN(DIRSERV_CACHED_DIR_CHUNK_SIZE, remaining); + if (conn->compress_state) { + connection_write_to_buf_compress( + cached->dir_z + spooled->cached_dir_offset, + bytes, conn, 0); + } else { + connection_write_to_buf(cached->dir_z + spooled->cached_dir_offset, + bytes, TO_CONN(conn)); + } + spooled->cached_dir_offset += bytes; + if (spooled->cached_dir_offset >= (off_t)cached->dir_z_len) { + return SRFS_DONE; + } else { + return SRFS_MORE; + } } - conn->dir_spool_src = DIR_SPOOL_NONE; - return 0; } -/** Spooling helper: called when we're sending a bunch of server descriptors, - * and the outbuf has become too empty. Pulls some entries from - * fingerprint_stack, and writes the corresponding servers onto outbuf. If we - * run out of entries, flushes the zlib state and sets the spool source to - * NONE. Returns 0 on success, negative on failure. +/** Helper: find the cached_dir_t for a spooled_resource_t, for + * sending it to <b>conn</b>. Set *<b>published_out</b>, if provided, + * to the published time of the cached_dir_t. + * + * DOES NOT increase the reference count on the result. Callers must do that + * themselves if they mean to hang on to it. */ +static cached_dir_t * +spooled_resource_lookup_cached_dir(const spooled_resource_t *spooled, + time_t *published_out) +{ + tor_assert(spooled->spool_eagerly == 0); + cached_dir_t *d = lookup_cached_dir_by_fp(spooled->digest); + if (d != NULL) { + if (published_out) + *published_out = d->published; + } + return d; +} + +/** Helper: Look up the body for an eagerly-served spooled_resource. If + * <b>conn_is_encrypted</b> is false, don't look up any resource that + * shouldn't be sent over an unencrypted connection. On success, set + * <b>body_out</b>, <b>size_out</b>, and <b>published_out</b> to refer + * to the resource's body, size, and publication date, and return 0. + * On failure return -1. */ static int -connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn) +spooled_resource_lookup_body(const spooled_resource_t *spooled, + int conn_is_encrypted, + const uint8_t **body_out, + size_t *size_out, + time_t *published_out) { - int by_fp = (conn->dir_spool_src == DIR_SPOOL_SERVER_BY_FP || - conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP); - int extra = (conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP || - conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_DIGEST); - time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; + tor_assert(spooled->spool_eagerly == 1); - const or_options_t *options = get_options(); + const signed_descriptor_t *sd = NULL; - while (smartlist_len(conn->fingerprint_stack) && - connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - const char *body; - char *fp = smartlist_pop_last(conn->fingerprint_stack); - const signed_descriptor_t *sd = NULL; - if (by_fp) { - sd = get_signed_descriptor_by_fp(fp, extra, publish_cutoff); - } else { - sd = extra ? extrainfo_get_by_descriptor_digest(fp) - : router_get_by_descriptor_digest(fp); + switch (spooled->spool_source) { + case DIR_SPOOL_EXTRA_BY_FP: { + sd = get_signed_descriptor_by_fp(spooled->digest, 1); + break; } - tor_free(fp); - if (!sd) - continue; - if (!connection_dir_is_encrypted(conn) && !sd->send_unencrypted) { - /* we did this check once before (so we could have an accurate size - * estimate and maybe send a 404 if somebody asked for only bridges on a - * connection), but we need to do it again in case a previously - * unknown bridge descriptor has shown up between then and now. */ - continue; + case DIR_SPOOL_SERVER_BY_FP: { + sd = get_signed_descriptor_by_fp(spooled->digest, 0); + break; } - - /** If we are the bridge authority and the descriptor is a bridge - * descriptor, remember that we served this descriptor for desc stats. */ - if (options->BridgeAuthoritativeDir && by_fp) { - const routerinfo_t *router = - router_get_by_id_digest(sd->identity_digest); - /* router can be NULL here when the bridge auth is asked for its own - * descriptor. */ - if (router && router->purpose == ROUTER_PURPOSE_BRIDGE) - rep_hist_note_desc_served(sd->identity_digest); + case DIR_SPOOL_SERVER_BY_DIGEST: { + sd = router_get_by_descriptor_digest((const char *)spooled->digest); + break; } - body = signed_descriptor_get_body(sd); - if (conn->zlib_state) { - int last = ! smartlist_len(conn->fingerprint_stack); - connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn, - last); - if (last) { - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; + case DIR_SPOOL_EXTRA_BY_DIGEST: { + sd = extrainfo_get_by_descriptor_digest((const char *)spooled->digest); + break; + } + case DIR_SPOOL_MICRODESC: { + microdesc_t *md = microdesc_cache_lookup_by_digest256( + get_microdesc_cache(), + (const char *)spooled->digest); + if (! md || ! md->body) { + return -1; } - } else { - connection_write_to_buf(body, - sd->signed_descriptor_len, - TO_CONN(conn)); + *body_out = (const uint8_t *)md->body; + *size_out = md->bodylen; + if (published_out) + *published_out = TIME_MAX; + return 0; } + case DIR_SPOOL_NETWORKSTATUS: + default: + /* LCOV_EXCL_START */ + tor_assert_nonfatal_unreached(); + return -1; + /* LCOV_EXCL_STOP */ } - if (!smartlist_len(conn->fingerprint_stack)) { - /* We just wrote the last one; finish up. */ - if (conn->zlib_state) { - connection_write_to_buf_zlib("", 0, conn, 1); - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - conn->dir_spool_src = DIR_SPOOL_NONE; - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; + /* If we get here, then we tried to set "sd" to a signed_descriptor_t. */ + + if (sd == NULL) { + return -1; + } + if (sd->send_unencrypted == 0 && ! conn_is_encrypted) { + /* we did this check once before (so we could have an accurate size + * estimate and maybe send a 404 if somebody asked for only bridges on + * a connection), but we need to do it again in case a previously + * unknown bridge descriptor has shown up between then and now. */ + return -1; } + *body_out = (const uint8_t *) signed_descriptor_get_body(sd); + *size_out = sd->signed_descriptor_len; + if (published_out) + *published_out = sd->published_on; return 0; } -/** Spooling helper: called when we're sending a bunch of microdescriptors, - * and the outbuf has become too empty. Pulls some entries from - * fingerprint_stack, and writes the corresponding microdescs onto outbuf. If - * we run out of entries, flushes the zlib state and sets the spool source to - * NONE. Returns 0 on success, negative on failure. - */ -static int -connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn) -{ - microdesc_cache_t *cache = get_microdesc_cache(); - while (smartlist_len(conn->fingerprint_stack) && - connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - char *fp256 = smartlist_pop_last(conn->fingerprint_stack); - microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256); - tor_free(fp256); - if (!md || !md->body) - continue; - if (conn->zlib_state) { - int last = !smartlist_len(conn->fingerprint_stack); - connection_write_to_buf_zlib(md->body, md->bodylen, conn, last); - if (last) { - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - } else { - connection_write_to_buf(md->body, md->bodylen, TO_CONN(conn)); - } - } - if (!smartlist_len(conn->fingerprint_stack)) { - if (conn->zlib_state) { - connection_write_to_buf_zlib("", 0, conn, 1); - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - conn->dir_spool_src = DIR_SPOOL_NONE; - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; +/** Given a fingerprint <b>fp</b> which is either set if we're looking for a + * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded + * flavor name if we want a flavored v3 status, return a pointer to the + * appropriate cached dir object, or NULL if there isn't one available. */ +static cached_dir_t * +lookup_cached_dir_by_fp(const uint8_t *fp) +{ + cached_dir_t *d = NULL; + if (tor_digest_is_zero((const char *)fp) && cached_consensuses) { + d = strmap_get(cached_consensuses, "ns"); + } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses) { + /* this here interface is a nasty hack: we're shoving a flavor into + * a digest field. */ + d = strmap_get(cached_consensuses, (const char *)fp); } - return 0; + return d; } -/** Spooling helper: Called when we're sending a directory or networkstatus, - * and the outbuf has become too empty. Pulls some bytes from - * <b>conn</b>-\>cached_dir-\>dir_z, uncompresses them if appropriate, and - * puts them on the outbuf. If we run out of entries, flushes the zlib state - * and sets the spool source to NONE. Returns 0 on success, negative on - * failure. */ -static int -connection_dirserv_add_dir_bytes_to_outbuf(dir_connection_t *conn) -{ - ssize_t bytes; - int64_t remaining; - - bytes = DIRSERV_BUFFER_MIN - connection_get_outbuf_len(TO_CONN(conn)); - tor_assert(bytes > 0); - tor_assert(conn->cached_dir); - if (bytes < 8192) - bytes = 8192; - remaining = conn->cached_dir->dir_z_len - conn->cached_dir_offset; - if (bytes > remaining) - bytes = (ssize_t) remaining; - - if (conn->zlib_state) { - connection_write_to_buf_zlib( - conn->cached_dir->dir_z + conn->cached_dir_offset, - bytes, conn, bytes == remaining); - } else { - connection_write_to_buf(conn->cached_dir->dir_z + conn->cached_dir_offset, - bytes, TO_CONN(conn)); +/** Try to guess the number of bytes that will be needed to send the + * spooled objects for <b>conn</b>'s outgoing spool. In the process, + * remove every element of the spool that refers to an absent object, or + * which was published earlier than <b>cutoff</b>. Set *<b>size_out</b> + * to the number of bytes, and *<b>n_expired_out</b> to the number of + * objects removed for being too old. */ +void +dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn, + time_t cutoff, + int compression, + size_t *size_out, + int *n_expired_out) +{ + if (BUG(!conn)) + return; + + smartlist_t *spool = conn->spool; + if (!spool) { + if (size_out) + *size_out = 0; + if (n_expired_out) + *n_expired_out = 0; + return; } - conn->cached_dir_offset += bytes; - if (conn->cached_dir_offset == (int)conn->cached_dir->dir_z_len) { - /* We just wrote the last one; finish up. */ - connection_dirserv_finish_spooling(conn); - cached_dir_decref(conn->cached_dir); - conn->cached_dir = NULL; + int n_expired = 0; + uint64_t total = 0; + SMARTLIST_FOREACH_BEGIN(spool, spooled_resource_t *, spooled) { + time_t published = TIME_MAX; + size_t sz = spooled_resource_estimate_size(spooled, conn, + compression, &published); + if (published < cutoff) { + ++n_expired; + SMARTLIST_DEL_CURRENT(spool, spooled); + spooled_resource_free(spooled); + } else if (sz == 0) { + SMARTLIST_DEL_CURRENT(spool, spooled); + spooled_resource_free(spooled); + } else { + total += sz; + } + } SMARTLIST_FOREACH_END(spooled); + + if (size_out) { + *size_out = (total > SIZE_MAX) ? SIZE_MAX : (size_t)total; } - return 0; + if (n_expired_out) + *n_expired_out = n_expired; } -/** Spooling helper: Called when we're spooling networkstatus objects on - * <b>conn</b>, and the outbuf has become too empty. If the current - * networkstatus object (in <b>conn</b>-\>cached_dir) has more data, pull data - * from there. Otherwise, pop the next fingerprint from fingerprint_stack, - * and start spooling the next networkstatus. (A digest of all 0 bytes is - * treated as a request for the current consensus.) If we run out of entries, - * flushes the zlib state and sets the spool source to NONE. Returns 0 on - * success, negative on failure. */ +/** Helper: used to sort a connection's spool. */ static int -connection_dirserv_add_networkstatus_bytes_to_outbuf(dir_connection_t *conn) -{ - - while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - if (conn->cached_dir) { - int uncompressing = (conn->zlib_state != NULL); - int r = connection_dirserv_add_dir_bytes_to_outbuf(conn); - if (conn->dir_spool_src == DIR_SPOOL_NONE) { - /* add_dir_bytes thinks we're done with the cached_dir. But we - * may have more cached_dirs! */ - conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; - /* This bit is tricky. If we were uncompressing the last - * networkstatus, we may need to make a new zlib object to - * uncompress the next one. */ - if (uncompressing && ! conn->zlib_state && - conn->fingerprint_stack && - smartlist_len(conn->fingerprint_stack)) { - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); - } - } - if (r) return r; - } else if (conn->fingerprint_stack && - smartlist_len(conn->fingerprint_stack)) { - /* Add another networkstatus; start serving it. */ - char *fp = smartlist_pop_last(conn->fingerprint_stack); - cached_dir_t *d = lookup_cached_dir_by_fp(fp); - tor_free(fp); - if (d) { - ++d->refcnt; - conn->cached_dir = d; - conn->cached_dir_offset = 0; - } - } else { - connection_dirserv_finish_spooling(conn); - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; - return 0; +dirserv_spool_sort_comparison_(const void **a_, const void **b_) +{ + const spooled_resource_t *a = *a_; + const spooled_resource_t *b = *b_; + return fast_memcmp(a->digest, b->digest, sizeof(a->digest)); +} + +/** Sort all the entries in <b>conn</b> by digest. */ +void +dirserv_spool_sort(dir_connection_t *conn) +{ + if (conn->spool == NULL) + return; + smartlist_sort(conn->spool, dirserv_spool_sort_comparison_); +} + +/** Return the cache-info for identity fingerprint <b>fp</b>, or + * its extra-info document if <b>extrainfo</b> is true. Return + * NULL if not found or if the descriptor is older than + * <b>publish_cutoff</b>. */ +static const signed_descriptor_t * +get_signed_descriptor_by_fp(const uint8_t *fp, int extrainfo) +{ + if (router_digest_is_me((const char *)fp)) { + if (extrainfo) + return &(router_get_my_extrainfo()->cache_info); + else + return &(router_get_my_routerinfo()->cache_info); + } else { + const routerinfo_t *ri = router_get_by_id_digest((const char *)fp); + if (ri) { + if (extrainfo) + return extrainfo_get_by_descriptor_digest( + ri->cache_info.extra_info_digest); + else + return &ri->cache_info; } } - return 0; + return NULL; } -/** Called whenever we have flushed some directory data in state - * SERVER_WRITING. */ +/** When we're spooling data onto our outbuf, add more whenever we dip + * below this threshold. */ +#define DIRSERV_BUFFER_MIN 16384 + +/** + * Called whenever we have flushed some directory data in state + * SERVER_WRITING, or whenever we want to fill the buffer with initial + * directory data (so that subsequent writes will occur, and trigger this + * function again.) + * + * Return 0 on success, and -1 on failure. + */ int connection_dirserv_flushed_some(dir_connection_t *conn) { tor_assert(conn->base_.state == DIR_CONN_STATE_SERVER_WRITING); - - if (connection_get_outbuf_len(TO_CONN(conn)) >= DIRSERV_BUFFER_MIN) + if (conn->spool == NULL) return 0; - switch (conn->dir_spool_src) { - case DIR_SPOOL_EXTRA_BY_DIGEST: - case DIR_SPOOL_EXTRA_BY_FP: - case DIR_SPOOL_SERVER_BY_DIGEST: - case DIR_SPOOL_SERVER_BY_FP: - return connection_dirserv_add_servers_to_outbuf(conn); - case DIR_SPOOL_MICRODESC: - return connection_dirserv_add_microdescs_to_outbuf(conn); - case DIR_SPOOL_CACHED_DIR: - return connection_dirserv_add_dir_bytes_to_outbuf(conn); - case DIR_SPOOL_NETWORKSTATUS: - return connection_dirserv_add_networkstatus_bytes_to_outbuf(conn); - case DIR_SPOOL_NONE: - default: + while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN && + smartlist_len(conn->spool)) { + spooled_resource_t *spooled = + smartlist_get(conn->spool, smartlist_len(conn->spool)-1); + spooled_resource_flush_status_t status; + status = spooled_resource_flush_some(spooled, conn); + if (status == SRFS_ERR) { + return -1; + } else if (status == SRFS_MORE) { return 0; + } + tor_assert(status == SRFS_DONE); + + /* If we're here, we're done flushing this resource. */ + tor_assert(smartlist_pop_last(conn->spool) == spooled); + spooled_resource_free(spooled); + } + + if (smartlist_len(conn->spool) > 0) { + /* We're still spooling something. */ + return 0; + } + + /* If we get here, we're done. */ + smartlist_free(conn->spool); + conn->spool = NULL; + if (conn->compress_state) { + /* Flush the compression state: there could be more bytes pending in there, + * and we don't want to omit bytes. */ + connection_write_to_buf_compress("", 0, conn, 1); + tor_compress_free(conn->compress_state); + conn->compress_state = NULL; } + return 0; +} + +/** Remove every element from <b>conn</b>'s outgoing spool, and delete + * the spool. */ +void +dir_conn_clear_spool(dir_connection_t *conn) +{ + if (!conn || ! conn->spool) + return; + SMARTLIST_FOREACH(conn->spool, spooled_resource_t *, s, + spooled_resource_free(s)); + smartlist_free(conn->spool); + conn->spool = NULL; } /** Return true iff <b>line</b> is a valid RecommendedPackages line. diff --git a/src/or/dirserv.h b/src/or/dirserv.h index e83da5e5ac..f707237ed1 100644 --- a/src/or/dirserv.h +++ b/src/or/dirserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,6 +32,53 @@ /** Maximum allowable length of a version line in a networkstatus. */ #define MAX_V_LINE_LEN 128 +/** Ways to convert a spoolable_resource_t to a bunch of bytes. */ +typedef enum dir_spool_source_t { + DIR_SPOOL_SERVER_BY_DIGEST=1, DIR_SPOOL_SERVER_BY_FP, + DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP, + DIR_SPOOL_MICRODESC, + DIR_SPOOL_NETWORKSTATUS, +} dir_spool_source_t; +#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t) + +/** Object to remember the identity of an object that we are spooling, + * or about to spool, in response to a directory request. + * + * (Why do we spool? Because some directory responses are very large, + * and we don't want to just shove the complete answer into the output + * buffer: that would take a ridiculous amount of RAM.) + * + * If the spooled resource is relatively small (like microdescriptors, + * descriptors, etc), we look them up by ID as needed, and add the whole + * thing onto the output buffer at once. If the spooled reseource is + * big (like networkstatus documents), we reference-count it, and add it + * a few K at a time. + */ +typedef struct spooled_resource_t { + /** + * If true, we add the entire object to the outbuf. If false, + * we spool the object a few K at a time. + */ + unsigned spool_eagerly : 1; + /** + * Tells us what kind of object to get, and how to look it up. + */ + dir_spool_source_bitfield_t spool_source : 7; + /** + * Tells us the specific object to spool. + */ + uint8_t digest[DIGEST256_LEN]; + /** + * A large object that we're spooling. Holds a reference count. Only + * used when spool_eagerly is false. + */ + struct cached_dir_t *cached_dir_ref; + /** + * The current offset into cached_dir. Only used when spool_eagerly is + * false */ + off_t cached_dir_offset; +} spooled_resource_t; + int connection_dirserv_flushed_some(dir_connection_t *conn); int dirserv_add_own_fingerprint(crypto_pk_t *pk); @@ -65,10 +112,10 @@ void dirserv_set_cached_consensus_networkstatus(const char *consensus, const common_digests_t *digests, time_t published); void dirserv_clear_old_networkstatuses(time_t cutoff); -int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, - int for_unencrypted_conn, - int is_extrainfo); +int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key, + dir_spool_source_t source, + int conn_is_encrytped, + const char **msg_out); int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, const char **msg); void dirserv_orconn_tls_done(const tor_addr_t *addr, @@ -89,13 +136,6 @@ void dirserv_set_node_flags_from_authoritative_status(node_t *node, uint32_t authstatus); int dirserv_would_reject_router(const routerstatus_t *rs); -int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff); -int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src); -int dirserv_have_any_microdesc(const smartlist_t *fps); -size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, - int compressed); -size_t dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed); - char *routerstatus_format_entry( const routerstatus_t *rs, const char *version, @@ -141,5 +181,17 @@ int dirserv_read_measured_bandwidths(const char *from_file, int dirserv_read_guardfraction_file(const char *fname, smartlist_t *vote_routerstatuses); +spooled_resource_t *spooled_resource_new(dir_spool_source_t source, + const uint8_t *digest, + size_t digestlen); +void spooled_resource_free(spooled_resource_t *spooled); +void dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn, + time_t cutoff, + int compression, + size_t *size_out, + int *n_expired_out); +void dirserv_spool_sort(dir_connection_t *conn); +void dir_conn_clear_spool(dir_connection_t *conn); + #endif diff --git a/src/or/dirvote.c b/src/or/dirvote.c index e92d3b49dc..f5e29eb786 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRVOTE_PRIVATE diff --git a/src/or/dirvote.h b/src/or/dirvote.h index ac7db69db2..e342dc78ea 100644 --- a/src/or/dirvote.h +++ b/src/or/dirvote.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dns.c b/src/or/dns.c index 7651501ec3..cd84a64758 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dns.h b/src/or/dns.h index 951a2a3467..a81cbd20da 100644 --- a/src/or/dns.h +++ b/src/or/dns.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dns_structs.h b/src/or/dns_structs.h index bc6067213d..dc00e9f7b9 100644 --- a/src/or/dns_structs.h +++ b/src/or/dns_structs.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dnsserv.c b/src/or/dnsserv.c index 8768b2a1d1..54a22a5150 100644 --- a/src/or/dnsserv.c +++ b/src/or/dnsserv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dnsserv.h b/src/or/dnsserv.h index ad0e248c83..6c0643b8dc 100644 --- a/src/or/dnsserv.h +++ b/src/or/dnsserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index 3bb5169355..7a27cd0f44 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -768,11 +768,6 @@ get_sampled_guard_for_bridge(guard_selection_t *gs, const uint8_t *id = bridge_get_rsa_id_digest(bridge); const tor_addr_port_t *addrport = bridge_get_addr_port(bridge); entry_guard_t *guard; - if (id) { - guard = get_sampled_guard_with_id(gs, id); - if (guard) - return guard; - } if (BUG(!addrport)) return NULL; // LCOV_EXCL_LINE guard = get_sampled_guard_by_bridge_addr(gs, addrport); @@ -787,16 +782,17 @@ get_sampled_guard_for_bridge(guard_selection_t *gs, static bridge_info_t * get_bridge_info_for_guard(const entry_guard_t *guard) { + const uint8_t *identity = NULL; if (! tor_digest_is_zero(guard->identity)) { - bridge_info_t *bridge = find_bridge_by_digest(guard->identity); - if (bridge) - return bridge; + identity = (const uint8_t *)guard->identity; } if (BUG(guard->bridge_addr == NULL)) return NULL; - return get_configured_bridge_by_addr_port_digest(&guard->bridge_addr->addr, - guard->bridge_addr->port, - NULL); + + return get_configured_bridge_by_exact_addr_port_digest( + &guard->bridge_addr->addr, + guard->bridge_addr->port, + (const char*)identity); } /** @@ -820,6 +816,10 @@ entry_guard_add_to_sample(guard_selection_t *gs, log_info(LD_GUARD, "Adding %s as to the entry guard sample set.", node_describe(node)); + /* make sure that the guard is not already sampled. */ + if (BUG(have_sampled_guard_with_id(gs, (const uint8_t*)node->identity))) + return NULL; // LCOV_EXCL_LINE + return entry_guard_add_to_sample_impl(gs, (const uint8_t*)node->identity, node_get_nickname(node), @@ -843,9 +843,6 @@ entry_guard_add_to_sample_impl(guard_selection_t *gs, // XXXX #20827 take ed25519 identity here too. - /* make sure that the guard is not already sampled. */ - if (rsa_id_digest && BUG(have_sampled_guard_with_id(gs, rsa_id_digest))) - return NULL; // LCOV_EXCL_LINE /* Make sure we can actually identify the guard. */ if (BUG(!rsa_id_digest && !bridge_addrport)) return NULL; // LCOV_EXCL_LINE @@ -890,6 +887,10 @@ entry_guard_add_bridge_to_sample(guard_selection_t *gs, tor_assert(addrport); + /* make sure that the guard is not already sampled. */ + if (BUG(get_sampled_guard_for_bridge(gs, bridge))) + return NULL; // LCOV_EXCL_LINE + return entry_guard_add_to_sample_impl(gs, id_digest, NULL, addrport); } @@ -988,9 +989,11 @@ get_max_sample_size(guard_selection_t *gs, const int using_bridges = (gs->type == GS_TYPE_BRIDGE); const int min_sample = get_min_filtered_sample_size(); - /* With bridges, max_sample is "all of them" */ + /* If we are in bridge mode, expand our sample set as needed without worrying + * about max size. We should respect the user's wishes to use many bridges if + * that's what they have specified in their configuration file. */ if (using_bridges) - return n_guards; + return INT_MAX; const int max_sample_by_pct = (int)(n_guards * get_max_sample_threshold()); const int max_sample_absolute = get_max_sample_size_absolute(); @@ -1842,7 +1845,7 @@ select_entry_guard_for_circuit(guard_selection_t *gs, if (! entry_guard_obeys_restriction(guard, rst)) continue; if (guard->is_reachable != GUARD_REACHABLE_NO) { - if (need_descriptor && BUG(!guard_has_descriptor(guard))) { + if (need_descriptor && !guard_has_descriptor(guard)) { continue; } *state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION; @@ -2901,13 +2904,7 @@ entry_guard_t * entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs, const char *digest) { - tor_assert(gs != NULL); - - SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, entry, - if (tor_memeq(digest, entry->identity, DIGEST_LEN)) - return entry; - ); - return NULL; + return get_sampled_guard_with_id(gs, (const uint8_t*)digest); } /** Return the node_t associated with a single entry_guard_t. May @@ -3362,9 +3359,15 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs) if (!gs->primary_guards_up_to_date) entry_guards_update_primary(gs); - const int num_primary = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC); int n_missing_descriptors = 0; int n_considered = 0; + int num_primary_to_check; + + /* We want to check for the descriptor of at least the first two primary + * guards in our list, since these are the guards that we typically use for + * circuits. */ + num_primary_to_check = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC); + num_primary_to_check++; SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) { entry_guard_consider_retry(guard); @@ -3373,7 +3376,7 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs) n_considered++; if (!guard_has_descriptor(guard)) n_missing_descriptors++; - if (n_considered >= num_primary) + if (n_considered >= num_primary_to_check) break; } SMARTLIST_FOREACH_END(guard); diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h index f02901f5d7..400a84269d 100644 --- a/src/or/entrynodes.h +++ b/src/or/entrynodes.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c index 676adfd8bf..b60d2e55c8 100644 --- a/src/or/ext_orport.c +++ b/src/or/ext_orport.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ext_orport.h b/src/or/ext_orport.h index 33d954e8d0..b2cd05db8f 100644 --- a/src/or/ext_orport.h +++ b/src/or/ext_orport.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef EXT_ORPORT_H diff --git a/src/or/fp_pair.c b/src/or/fp_pair.c index eeeb0f1de3..f730106d06 100644 --- a/src/or/fp_pair.c +++ b/src/or/fp_pair.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/fp_pair.h b/src/or/fp_pair.h index b1466581d2..4cea3eda6d 100644 --- a/src/or/fp_pair.h +++ b/src/or/fp_pair.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/geoip.c b/src/or/geoip.c index 74811ea643..c76071a152 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/geoip.h b/src/or/geoip.h index 070296dd07..55ca8ca28c 100644 --- a/src/or/geoip.h +++ b/src/or/geoip.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hibernate.c b/src/or/hibernate.c index c2b3bbb839..f2a4c71764 100644 --- a/src/or/hibernate.c +++ b/src/or/hibernate.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hibernate.h b/src/or/hibernate.h index fa9da6de39..8bdb65a927 100644 --- a/src/or/hibernate.h +++ b/src/or/hibernate.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hs_cache.c b/src/or/hs_cache.c index 43cd8c3258..29681b42b5 100644 --- a/src/or/hs_cache.c +++ b/src/or/hs_cache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hs_cache.h b/src/or/hs_cache.h index ba95e73338..ed00424234 100644 --- a/src/or/hs_cache.h +++ b/src/or/hs_cache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hs_circuitmap.c b/src/or/hs_circuitmap.c index 5003b4b593..ea66fb5194 100644 --- a/src/or/hs_circuitmap.c +++ b/src/or/hs_circuitmap.c @@ -1,11 +1,12 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file hs_circuitmap.c * - * \brief Manage the hidden service circuitmap: A hash table that maps binary - * tokens to introduction and rendezvous circuits. + * \brief Hidden service circuitmap: A hash table that maps binary tokens to + * introduction and rendezvous circuits; it's used both by relays acting as + * intro points and rendezvous points, and also by hidden services themselves. **/ #define HS_CIRCUITMAP_PRIVATE @@ -25,8 +26,8 @@ static struct hs_circuitmap_ht *the_hs_circuitmap = NULL; /* This is a helper function used by the hash table code (HT_). It returns 1 if * two circuits have the same HS token. */ static int -hs_circuits_have_same_token(const or_circuit_t *first_circuit, - const or_circuit_t *second_circuit) +hs_circuits_have_same_token(const circuit_t *first_circuit, + const circuit_t *second_circuit) { const hs_token_t *first_token; const hs_token_t *second_token; @@ -57,7 +58,7 @@ hs_circuits_have_same_token(const or_circuit_t *first_circuit, /* This is a helper function for the hash table code (HT_). It hashes a circuit * HS token into an unsigned int for use as a key by the hash table routines.*/ static inline unsigned int -hs_circuit_hash_token(const or_circuit_t *circuit) +hs_circuit_hash_token(const circuit_t *circuit) { tor_assert(circuit->hs_token); @@ -67,11 +68,11 @@ hs_circuit_hash_token(const or_circuit_t *circuit) /* Register the circuitmap hash table */ HT_PROTOTYPE(hs_circuitmap_ht, // The name of the hashtable struct - or_circuit_t, // The name of the element struct, + circuit_t, // The name of the element struct, hs_circuitmap_node, // The name of HT_ENTRY member hs_circuit_hash_token, hs_circuits_have_same_token) -HT_GENERATE2(hs_circuitmap_ht, or_circuit_t, hs_circuitmap_node, +HT_GENERATE2(hs_circuitmap_ht, circuit_t, hs_circuitmap_node, hs_circuit_hash_token, hs_circuits_have_same_token, 0.6, tor_reallocarray, tor_free_) @@ -116,13 +117,13 @@ hs_token_free(hs_token_t *hs_token) } /** Return the circuit from the circuitmap with token <b>search_token</b>. */ -static or_circuit_t * +static circuit_t * get_circuit_with_token(hs_token_t *search_token) { tor_assert(the_hs_circuitmap); /* We use a dummy circuit object for the hash table search routine. */ - or_circuit_t search_circ; + circuit_t search_circ; search_circ.hs_token = search_token; return HT_FIND(hs_circuitmap_ht, the_hs_circuitmap, &search_circ); } @@ -130,7 +131,7 @@ get_circuit_with_token(hs_token_t *search_token) /* Helper function that registers <b>circ</b> with <b>token</b> on the HS circuitmap. This function steals reference of <b>token</b>. */ static void -hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token) +hs_circuitmap_register_impl(circuit_t *circ, hs_token_t *token) { tor_assert(circ); tor_assert(token); @@ -145,13 +146,12 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token) take precedence over old ones, so that HSes and clients and reestablish killed circuits without changing the HS token. */ { - or_circuit_t *found_circ; + circuit_t *found_circ; found_circ = get_circuit_with_token(token); if (found_circ) { hs_circuitmap_remove_circuit(found_circ); - if (!found_circ->base_.marked_for_close) { - circuit_mark_for_close(TO_CIRCUIT(found_circ), - END_CIRC_REASON_FINISHED); + if (!found_circ->marked_for_close) { + circuit_mark_for_close(found_circ, END_CIRC_REASON_FINISHED); } } } @@ -165,7 +165,7 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token) * circuitmap. Use the HS <b>token</b> as the key to the hash table. If * <b>token</b> is not set, clear the circuit of any HS tokens. */ static void -hs_circuitmap_register_circuit(or_circuit_t *circ, +hs_circuitmap_register_circuit(circuit_t *circ, hs_token_type_t type, size_t token_len, const uint8_t *token) { @@ -178,17 +178,19 @@ hs_circuitmap_register_circuit(or_circuit_t *circ, hs_circuitmap_register_impl(circ, hs_token); } -/* Query circuitmap for circuit with <b>token</b> of size <b>token_len</b>. - * Only returns a circuit with purpose equal to the <b>wanted_circ_purpose</b> - * parameter and if it is NOT marked for close. Return NULL if no such circuit - * is found. */ -static or_circuit_t * -hs_circuitmap_get_circuit(hs_token_type_t type, - size_t token_len, - const uint8_t *token, - uint8_t wanted_circ_purpose) +/* Helper function for hs_circuitmap_get_origin_circuit() and + * hs_circuitmap_get_or_circuit(). Because only circuit_t are indexed in the + * circuitmap, this function returns object type so the specialized functions + * using this helper can upcast it to the right type. + * + * Return NULL if not such circuit is found. */ +static circuit_t * +hs_circuitmap_get_circuit_impl(hs_token_type_t type, + size_t token_len, + const uint8_t *token, + uint8_t wanted_circ_purpose) { - or_circuit_t *found_circ = NULL; + circuit_t *found_circ = NULL; tor_assert(the_hs_circuitmap); @@ -202,87 +204,247 @@ hs_circuitmap_get_circuit(hs_token_type_t type, /* Check that the circuit is useful to us */ if (!found_circ || - found_circ->base_.purpose != wanted_circ_purpose || - found_circ->base_.marked_for_close) { + found_circ->purpose != wanted_circ_purpose || + found_circ->marked_for_close) { return NULL; } return found_circ; } -/************** Public circuitmap API ****************************************/ +/* Helper function: Query circuitmap for origin circuit with <b>token</b> of + * size <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose + * equal to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked + * for close. Return NULL if no such circuit is found. */ +static origin_circuit_t * +hs_circuitmap_get_origin_circuit(hs_token_type_t type, + size_t token_len, + const uint8_t *token, + uint8_t wanted_circ_purpose) +{ + circuit_t *circ; + tor_assert(token); + tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose)); -/* Public function: Return v3 introduction circuit with <b>auth_key</b>. Return - * NULL if no such circuit is found in the circuitmap. */ -or_circuit_t * -hs_circuitmap_get_intro_circ_v3(const ed25519_public_key_t *auth_key) + circ = hs_circuitmap_get_circuit_impl(type, token_len, token, + wanted_circ_purpose); + if (!circ) { + return NULL; + } + + tor_assert(CIRCUIT_IS_ORIGIN(circ)); + return TO_ORIGIN_CIRCUIT(circ); +} + +/* Helper function: Query circuitmap for OR circuit with <b>token</b> of size + * <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose equal + * to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked for + * close. Return NULL if no such circuit is found. */ +static or_circuit_t * +hs_circuitmap_get_or_circuit(hs_token_type_t type, + size_t token_len, + const uint8_t *token, + uint8_t wanted_circ_purpose) { - tor_assert(auth_key); + circuit_t *circ; + tor_assert(token); + tor_assert(!CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose)); + + circ = hs_circuitmap_get_circuit_impl(type, token_len, token, + wanted_circ_purpose); + if (!circ) { + return NULL; + } - return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V3, - ED25519_PUBKEY_LEN, auth_key->pubkey, - CIRCUIT_PURPOSE_INTRO_POINT); + tor_assert(CIRCUIT_IS_ORCIRC(circ)); + return TO_OR_CIRCUIT(circ); } -/* Public function: Return v2 introduction circuit with <b>digest</b>. Return - * NULL if no such circuit is found in the circuitmap. */ +/************** Public circuitmap API ****************************************/ + +/**** Public relay-side getters: */ + +/* Public function: Return a v3 introduction circuit to this relay with + * <b>auth_key</b>. Return NULL if no such circuit is found in the + * circuitmap. */ or_circuit_t * -hs_circuitmap_get_intro_circ_v2(const uint8_t *digest) +hs_circuitmap_get_intro_circ_v3_relay_side( + const ed25519_public_key_t *auth_key) { - tor_assert(digest); + return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V3_RELAY_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey, + CIRCUIT_PURPOSE_INTRO_POINT); +} - return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V2, - REND_TOKEN_LEN, digest, - CIRCUIT_PURPOSE_INTRO_POINT); +/* Public function: Return v2 introduction circuit to this relay with + * <b>digest</b>. Return NULL if no such circuit is found in the circuitmap. */ +or_circuit_t * +hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest) +{ + return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V2_RELAY_SIDE, + REND_TOKEN_LEN, digest, + CIRCUIT_PURPOSE_INTRO_POINT); } -/* Public function: Return rendezvous circuit with rendezvous +/* Public function: Return rendezvous circuit to this relay with rendezvous * <b>cookie</b>. Return NULL if no such circuit is found in the circuitmap. */ or_circuit_t * -hs_circuitmap_get_rend_circ(const uint8_t *cookie) +hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie) { - tor_assert(cookie); - - return hs_circuitmap_get_circuit(HS_TOKEN_REND, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_REND_POINT_WAITING); + return hs_circuitmap_get_or_circuit(HS_TOKEN_REND_RELAY_SIDE, + REND_TOKEN_LEN, cookie, + CIRCUIT_PURPOSE_REND_POINT_WAITING); } +/** Public relay-side setters: */ + /* Public function: Register rendezvous circuit with key <b>cookie</b> to the * circuitmap. */ void -hs_circuitmap_register_rend_circ(or_circuit_t *circ, const uint8_t *cookie) +hs_circuitmap_register_rend_circ_relay_side(or_circuit_t *circ, + const uint8_t *cookie) { - hs_circuitmap_register_circuit(circ, - HS_TOKEN_REND, + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_REND_RELAY_SIDE, REND_TOKEN_LEN, cookie); } +/* Public function: Register v2 intro circuit with key <b>digest</b> to the + * circuitmap. */ +void +hs_circuitmap_register_intro_circ_v2_relay_side(or_circuit_t *circ, + const uint8_t *digest) +{ + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V2_RELAY_SIDE, + REND_TOKEN_LEN, digest); +} + +/* Public function: Register v3 intro circuit with key <b>auth_key</b> to the + * circuitmap. */ +void +hs_circuitmap_register_intro_circ_v3_relay_side(or_circuit_t *circ, + const ed25519_public_key_t *auth_key) +{ + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V3_RELAY_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey); +} + +/**** Public servide-side getters: */ + +/* Public function: Return v3 introduction circuit with <b>auth_key</b> + * originating from this hidden service. Return NULL if no such circuit is + * found in the circuitmap. */ +origin_circuit_t * +hs_circuitmap_get_intro_circ_v3_service_side(const + ed25519_public_key_t *auth_key) +{ + origin_circuit_t *circ = NULL; + + /* Check first for established intro circuits */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey, + CIRCUIT_PURPOSE_S_INTRO); + if (circ) { + return circ; + } + + /* ...if nothing found, check for pending intro circs */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey, + CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); + + return circ; +} + +/* Public function: Return v2 introduction circuit originating from this hidden + * service with <b>digest</b>. Return NULL if no such circuit is found in the + * circuitmap. */ +origin_circuit_t * +hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest) +{ + origin_circuit_t *circ = NULL; + + /* Check first for established intro circuits */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE, + REND_TOKEN_LEN, digest, + CIRCUIT_PURPOSE_S_INTRO); + if (circ) { + return circ; + } + + /* ...if nothing found, check for pending intro circs */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE, + REND_TOKEN_LEN, digest, + CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); + + return circ; +} + +/* Public function: Return rendezvous circuit originating from this hidden + * service with rendezvous <b>cookie</b>. Return NULL if no such circuit is + * found in the circuitmap. */ +origin_circuit_t * +hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie) +{ + origin_circuit_t *circ = NULL; + + /* Try to check if we have a connecting circuit. */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE, + REND_TOKEN_LEN, cookie, + CIRCUIT_PURPOSE_S_CONNECT_REND); + if (circ) { + return circ; + } + + /* Then try for connected circuit. */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE, + REND_TOKEN_LEN, cookie, + CIRCUIT_PURPOSE_S_REND_JOINED); + return circ; +} + +/**** Public servide-side setters: */ /* Public function: Register v2 intro circuit with key <b>digest</b> to the * circuitmap. */ void -hs_circuitmap_register_intro_circ_v2(or_circuit_t *circ, const uint8_t *digest) +hs_circuitmap_register_intro_circ_v2_service_side(origin_circuit_t *circ, + const uint8_t *digest) { - hs_circuitmap_register_circuit(circ, - HS_TOKEN_INTRO_V2, + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V2_SERVICE_SIDE, REND_TOKEN_LEN, digest); } /* Public function: Register v3 intro circuit with key <b>auth_key</b> to the * circuitmap. */ void -hs_circuitmap_register_intro_circ_v3(or_circuit_t *circ, - const ed25519_public_key_t *auth_key) +hs_circuitmap_register_intro_circ_v3_service_side(origin_circuit_t *circ, + const ed25519_public_key_t *auth_key) { - hs_circuitmap_register_circuit(circ, - HS_TOKEN_INTRO_V3, + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V3_SERVICE_SIDE, ED25519_PUBKEY_LEN, auth_key->pubkey); } -/** Remove this circuit from the HS circuitmap. Clear its HS token, and remove - * it from the hashtable. */ +/* Public function: Register rendezvous circuit with key <b>cookie</b> to the + * circuitmap. */ +void +hs_circuitmap_register_rend_circ_service_side(origin_circuit_t *circ, + const uint8_t *cookie) +{ + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_REND_SERVICE_SIDE, + REND_TOKEN_LEN, cookie); +} + +/**** Misc public functions: */ + +/** Public function: Remove this circuit from the HS circuitmap. Clear its HS + * token, and remove it from the hashtable. */ void -hs_circuitmap_remove_circuit(or_circuit_t *circ) +hs_circuitmap_remove_circuit(circuit_t *circ) { tor_assert(the_hs_circuitmap); @@ -291,14 +453,14 @@ hs_circuitmap_remove_circuit(or_circuit_t *circ) } /* Remove circ from circuitmap */ - or_circuit_t *tmp; + circuit_t *tmp; tmp = HT_REMOVE(hs_circuitmap_ht, the_hs_circuitmap, circ); /* ... and ensure the removal was successful. */ if (tmp) { tor_assert(tmp == circ); } else { log_warn(LD_BUG, "Could not find circuit (%u) in circuitmap.", - circ->p_circ_id); + circ->n_circ_id); } /* Clear token from circ */ @@ -306,7 +468,7 @@ hs_circuitmap_remove_circuit(or_circuit_t *circ) circ->hs_token = NULL; } -/* Initialize the global HS circuitmap. */ +/* Public function: Initialize the global HS circuitmap. */ void hs_circuitmap_init(void) { @@ -316,7 +478,7 @@ hs_circuitmap_init(void) HT_INIT(hs_circuitmap_ht, the_hs_circuitmap); } -/* Free all memory allocated by the global HS circuitmap. */ +/* Public function: Free all memory allocated by the global HS circuitmap. */ void hs_circuitmap_free_all(void) { diff --git a/src/or/hs_circuitmap.h b/src/or/hs_circuitmap.h index b587039310..33d5b64117 100644 --- a/src/or/hs_circuitmap.h +++ b/src/or/hs_circuitmap.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,26 +9,52 @@ #ifndef TOR_HS_CIRCUITMAP_H #define TOR_HS_CIRCUITMAP_H -typedef HT_HEAD(hs_circuitmap_ht, or_circuit_t) hs_circuitmap_ht; +typedef HT_HEAD(hs_circuitmap_ht, circuit_t) hs_circuitmap_ht; typedef struct hs_token_s hs_token_t; struct or_circuit_t; +struct origin_circuit_t; /** Public HS circuitmap API: */ -struct or_circuit_t *hs_circuitmap_get_rend_circ(const uint8_t *cookie); -struct or_circuit_t *hs_circuitmap_get_intro_circ_v3( - const ed25519_public_key_t *auth_key); -struct or_circuit_t *hs_circuitmap_get_intro_circ_v2(const uint8_t *digest); - -void hs_circuitmap_register_rend_circ(struct or_circuit_t *circ, - const uint8_t *cookie); -void hs_circuitmap_register_intro_circ_v2(struct or_circuit_t *circ, - const uint8_t *digest); -void hs_circuitmap_register_intro_circ_v3(struct or_circuit_t *circ, +/** Public relay-side API: */ + +struct or_circuit_t * +hs_circuitmap_get_intro_circ_v3_relay_side(const + ed25519_public_key_t *auth_key); +struct or_circuit_t * +hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest); +struct or_circuit_t * +hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie); + +void hs_circuitmap_register_rend_circ_relay_side(struct or_circuit_t *circ, + const uint8_t *cookie); +void hs_circuitmap_register_intro_circ_v2_relay_side(struct or_circuit_t *circ, + const uint8_t *digest); +void hs_circuitmap_register_intro_circ_v3_relay_side(struct or_circuit_t *circ, const ed25519_public_key_t *auth_key); -void hs_circuitmap_remove_circuit(struct or_circuit_t *circ); +/** Public service-side API: */ + +struct origin_circuit_t * +hs_circuitmap_get_intro_circ_v3_service_side(const + ed25519_public_key_t *auth_key); +struct origin_circuit_t * +hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest); +struct origin_circuit_t * +hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie); + +void hs_circuitmap_register_intro_circ_v2_service_side( + struct origin_circuit_t *circ, + const uint8_t *digest); +void hs_circuitmap_register_intro_circ_v3_service_side( + struct origin_circuit_t *circ, + const ed25519_public_key_t *auth_key); +void hs_circuitmap_register_rend_circ_service_side( + struct origin_circuit_t *circ, + const uint8_t *cookie); + +void hs_circuitmap_remove_circuit(struct circuit_t *circ); void hs_circuitmap_init(void); void hs_circuitmap_free_all(void); @@ -37,12 +63,19 @@ void hs_circuitmap_free_all(void); /** Represents the type of HS token. */ typedef enum { - /** A rendezvous cookie (128bit)*/ - HS_TOKEN_REND, - /** A v2 introduction point pubkey (160bit) */ - HS_TOKEN_INTRO_V2, - /** A v3 introduction point pubkey (256bit) */ - HS_TOKEN_INTRO_V3, + /** A rendezvous cookie on a relay (128bit)*/ + HS_TOKEN_REND_RELAY_SIDE, + /** A v2 introduction point pubkey on a relay (160bit) */ + HS_TOKEN_INTRO_V2_RELAY_SIDE, + /** A v3 introduction point pubkey on a relay (256bit) */ + HS_TOKEN_INTRO_V3_RELAY_SIDE, + + /** A rendezvous cookie on a hidden service (128bit)*/ + HS_TOKEN_REND_SERVICE_SIDE, + /** A v2 introduction point pubkey on a hidden service (160bit) */ + HS_TOKEN_INTRO_V2_SERVICE_SIDE, + /** A v3 introduction point pubkey on a hidden service (256bit) */ + HS_TOKEN_INTRO_V3_SERVICE_SIDE, } hs_token_type_t; /** Represents a token used in the HS protocol. Each such token maps to a diff --git a/src/or/hs_common.c b/src/or/hs_common.c index de96946ab5..42508126f8 100644 --- a/src/or/hs_common.c +++ b/src/or/hs_common.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,6 +9,8 @@ * protocol. **/ +#define HS_COMMON_PRIVATE + #include "or.h" #include "config.h" @@ -16,6 +18,80 @@ #include "hs_common.h" #include "rendcommon.h" +/* Make sure that the directory for <b>service</b> is private, using the config + * <b>username</b>. + * If <b>create</b> is true: + * - if the directory exists, change permissions if needed, + * - if the directory does not exist, create it with the correct permissions. + * If <b>create</b> is false: + * - if the directory exists, check permissions, + * - if the directory does not exist, check if we think we can create it. + * Return 0 on success, -1 on failure. */ +int +hs_check_service_private_dir(const char *username, const char *path, + unsigned int dir_group_readable, + unsigned int create) +{ + cpd_check_t check_opts = CPD_NONE; + + tor_assert(path); + + if (create) { + check_opts |= CPD_CREATE; + } else { + check_opts |= CPD_CHECK_MODE_ONLY; + check_opts |= CPD_CHECK; + } + if (dir_group_readable) { + check_opts |= CPD_GROUP_READ; + } + /* Check/create directory */ + if (check_private_dir(path, check_opts, username) < 0) { + return -1; + } + return 0; +} + +/** Get the default HS time period length in minutes from the consensus. */ +STATIC uint64_t +get_time_period_length(void) +{ + int32_t time_period_length = networkstatus_get_param(NULL, "hsdir-interval", + HS_TIME_PERIOD_LENGTH_DEFAULT, + HS_TIME_PERIOD_LENGTH_MIN, + HS_TIME_PERIOD_LENGTH_MAX); + /* Make sure it's a positive value. */ + tor_assert(time_period_length >= 0); + /* uint64_t will always be able to contain a int32_t */ + return (uint64_t) time_period_length; +} + +/** Get the HS time period number at time <b>now</b> */ +STATIC uint64_t +get_time_period_num(time_t now) +{ + uint64_t time_period_num; + uint64_t time_period_length = get_time_period_length(); + uint64_t minutes_since_epoch = now / 60; + + /* Now subtract half a day to fit the prop224 time period schedule (see + * section [TIME-PERIODS]). */ + tor_assert(minutes_since_epoch > HS_TIME_PERIOD_ROTATION_OFFSET); + minutes_since_epoch -= HS_TIME_PERIOD_ROTATION_OFFSET; + + /* Calculate the time period */ + time_period_num = minutes_since_epoch / time_period_length; + return time_period_num; +} + +/** Get the number of the _upcoming_ HS time period, given that the current + * time is <b>now</b>. */ +uint64_t +hs_get_next_time_period_num(time_t now) +{ + return get_time_period_num(now) + 1; +} + /* Create a new rend_data_t for a specific given <b>version</b>. * Return a pointer to the newly allocated data structure. */ static rend_data_t * diff --git a/src/or/hs_common.h b/src/or/hs_common.h index e0ab510ea4..a8fded652a 100644 --- a/src/or/hs_common.h +++ b/src/or/hs_common.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -17,12 +17,42 @@ /* Version 3 of the protocol (prop224). */ #define HS_VERSION_THREE 3 -/* Denotes ed25519 authentication key on ESTABLISH_INTRO cell. */ -#define AUTH_KEY_ED25519 0x02 +/** Try to maintain this many intro points per service by default. */ +#define NUM_INTRO_POINTS_DEFAULT 3 +/** Maximum number of intro points per service. */ +#define NUM_INTRO_POINTS_MAX 10 +/** Number of extra intro points we launch if our set of intro nodes is empty. + * See proposal 155, section 4. */ +#define NUM_INTRO_POINTS_EXTRA 2 + +/** If we can't build our intro circuits, don't retry for this long. */ +#define INTRO_CIRC_RETRY_PERIOD (60*5) +/** Don't try to build more than this many circuits before giving up for a + * while.*/ +#define MAX_INTRO_CIRCS_PER_PERIOD 10 +/** How many times will a hidden service operator attempt to connect to a + * requested rendezvous point before giving up? */ +#define MAX_REND_FAILURES 1 +/** How many seconds should we spend trying to connect to a requested + * rendezvous point before giving up? */ +#define MAX_REND_TIMEOUT 30 /* String prefix for the signature of ESTABLISH_INTRO */ #define ESTABLISH_INTRO_SIG_PREFIX "Tor establish-intro cell v1" +/* The default HS time period length */ +#define HS_TIME_PERIOD_LENGTH_DEFAULT 1440 /* 1440 minutes == one day */ +/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ +#define HS_TIME_PERIOD_LENGTH_MIN 30 /* minutes */ +/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ +#define HS_TIME_PERIOD_LENGTH_MAX (60 * 24 * 10) /* 10 days or 14400 minutes */ +/* The time period rotation offset as seen in prop224 section [TIME-PERIODS] */ +#define HS_TIME_PERIOD_ROTATION_OFFSET (12 * 60) /* minutes */ + +int hs_check_service_private_dir(const char *username, const char *path, + unsigned int dir_group_readable, + unsigned int create); + void rend_data_free(rend_data_t *data); rend_data_t *rend_data_dup(const rend_data_t *data); rend_data_t *rend_data_client_create(const char *onion_address, @@ -39,5 +69,18 @@ const char *rend_data_get_desc_id(const rend_data_t *rend_data, const uint8_t *rend_data_get_pk_digest(const rend_data_t *rend_data, size_t *len_out); +uint64_t hs_get_next_time_period_num(time_t now); + +#ifdef HS_COMMON_PRIVATE + +#ifdef TOR_UNIT_TESTS + +STATIC uint64_t get_time_period_length(void); +STATIC uint64_t get_time_period_num(time_t now); + +#endif /* TOR_UNIT_TESTS */ + +#endif /* HS_COMMON_PRIVATE */ + #endif /* TOR_HS_COMMON_H */ diff --git a/src/or/hs_descriptor.c b/src/or/hs_descriptor.c index f16a2fdc14..0480f63308 100644 --- a/src/or/hs_descriptor.c +++ b/src/or/hs_descriptor.c @@ -1,9 +1,55 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file hs_descriptor.c * \brief Handle hidden service descriptor encoding/decoding. + * + * \details + * Here is a graphical depiction of an HS descriptor and its layers: + * + * +------------------------------------------------------+ + * |DESCRIPTOR HEADER: | + * | hs-descriptor 3 | + * | descriptor-lifetime 180 | + * | ... | + * | superencrypted | + * |+---------------------------------------------------+ | + * ||SUPERENCRYPTED LAYER (aka OUTER ENCRYPTED LAYER): | | + * || desc-auth-type x25519 | | + * || desc-auth-ephemeral-key | | + * || auth-client | | + * || auth-client | | + * || ... | | + * || encrypted | | + * ||+-------------------------------------------------+| | + * |||ENCRYPTED LAYER (aka INNER ENCRYPTED LAYER): || | + * ||| create2-formats || | + * ||| intro-auth-required || | + * ||| introduction-point || | + * ||| introduction-point || | + * ||| ... || | + * ||+-------------------------------------------------+| | + * |+---------------------------------------------------+ | + * +------------------------------------------------------+ + * + * The DESCRIPTOR HEADER section is completely unencrypted and contains generic + * descriptor metadata. + * + * The SUPERENCRYPTED LAYER section is the first layer of encryption, and it's + * encrypted using the blinded public key of the hidden service to protect + * against entities who don't know its onion address. The clients of the hidden + * service know its onion address and blinded public key, whereas third-parties + * (like HSDirs) don't know it (except if it's a public hidden service). + * + * The ENCRYPTED LAYER section is the second layer of encryption, and it's + * encrypted using the client authorization key material (if those exist). When + * client authorization is enabled, this second layer of encryption protects + * the descriptor content from unauthorized entities. If client authorization + * is disabled, this second layer of encryption does not provide any extra + * security but is still present. The plaintext of this layer contains all the + * information required to connect to the hidden service like its list of + * introduction points. **/ /* For unit tests.*/ @@ -23,11 +69,12 @@ #define str_desc_cert "descriptor-signing-key-cert" #define str_rev_counter "revision-counter" #define str_superencrypted "superencrypted" +#define str_encrypted "encrypted" #define str_signature "signature" #define str_lifetime "descriptor-lifetime" /* Constant string value for the encrypted part of the descriptor. */ #define str_create2_formats "create2-formats" -#define str_auth_required "authentication-required" +#define str_intro_auth_required "intro-auth-required" #define str_single_onion "single-onion-service" #define str_intro_point "introduction-point" #define str_ip_auth_key "auth-key" @@ -36,16 +83,20 @@ #define str_intro_point_start "\n" str_intro_point " " /* Constant string value for the construction to encrypt the encrypted data * section. */ -#define str_enc_hsdir_data "hsdir-superencrypted-data" +#define str_enc_const_superencryption "hsdir-superencrypted-data" +#define str_enc_const_encryption "hsdir-encrypted-data" /* Prefix required to compute/verify HS desc signatures */ #define str_desc_sig_prefix "Tor onion service descriptor sig v3" +#define str_desc_auth_type "desc-auth-type" +#define str_desc_auth_key "desc-auth-ephemeral-key" +#define str_desc_auth_client "auth-client" +#define str_encrypted "encrypted" /* Authentication supported types. */ static const struct { hs_desc_auth_type_t type; const char *identifier; -} auth_types[] = { - { HS_DESC_AUTH_PASSWORD, "password" }, +} intro_auth_types[] = { { HS_DESC_AUTH_ED25519, "ed25519" }, /* Indicate end of array. */ { 0, NULL } @@ -62,10 +113,19 @@ static token_rule_t hs_desc_v3_token_table[] = { END_OF_TABLE }; +/* Descriptor ruleset for the superencrypted section. */ +static token_rule_t hs_desc_superencrypted_v3_token_table[] = { + T1_START(str_desc_auth_type, R3_DESC_AUTH_TYPE, GE(1), NO_OBJ), + T1(str_desc_auth_key, R3_DESC_AUTH_KEY, GE(1), NO_OBJ), + T1N(str_desc_auth_client, R3_DESC_AUTH_CLIENT, GE(3), NO_OBJ), + T1(str_encrypted, R3_ENCRYPTED, NO_ARGS, NEED_OBJ), + END_OF_TABLE +}; + /* Descriptor ruleset for the encrypted section. */ static token_rule_t hs_desc_encrypted_v3_token_table[] = { T1_START(str_create2_formats, R3_CREATE2_FORMATS, CONCAT_ARGS, NO_OBJ), - T01(str_auth_required, R3_AUTHENTICATION_REQUIRED, ARGS, NO_OBJ), + T01(str_intro_auth_required, R3_INTRO_AUTH_REQUIRED, ARGS, NO_OBJ), T01(str_single_onion, R3_SINGLE_ONION_SERVICE, ARGS, NO_OBJ), END_OF_TABLE }; @@ -107,8 +167,8 @@ desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc) return; } - if (desc->encrypted_blob) { - tor_free(desc->encrypted_blob); + if (desc->superencrypted_blob) { + tor_free(desc->superencrypted_blob); } tor_cert_free(desc->signing_key_cert); @@ -123,9 +183,9 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc) return; } - if (desc->auth_types) { - SMARTLIST_FOREACH(desc->auth_types, char *, a, tor_free(a)); - smartlist_free(desc->auth_types); + if (desc->intro_auth_types) { + SMARTLIST_FOREACH(desc->intro_auth_types, char *, a, tor_free(a)); + smartlist_free(desc->intro_auth_types); } if (desc->intro_points) { SMARTLIST_FOREACH(desc->intro_points, hs_desc_intro_point_t *, ip, @@ -135,6 +195,135 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc) memwipe(desc, 0, sizeof(*desc)); } +/* Using a key, salt and encrypted payload, build a MAC and put it in mac_out. + * We use SHA3-256 for the MAC computation. + * This function can't fail. */ +static void +build_mac(const uint8_t *mac_key, size_t mac_key_len, + const uint8_t *salt, size_t salt_len, + const uint8_t *encrypted, size_t encrypted_len, + uint8_t *mac_out, size_t mac_len) +{ + crypto_digest_t *digest; + + const uint64_t mac_len_netorder = tor_htonll(mac_key_len); + const uint64_t salt_len_netorder = tor_htonll(salt_len); + + tor_assert(mac_key); + tor_assert(salt); + tor_assert(encrypted); + tor_assert(mac_out); + + digest = crypto_digest256_new(DIGEST_SHA3_256); + /* As specified in section 2.5 of proposal 224, first add the mac key + * then add the salt first and then the encrypted section. */ + + crypto_digest_add_bytes(digest, (const char *) &mac_len_netorder, 8); + crypto_digest_add_bytes(digest, (const char *) mac_key, mac_key_len); + crypto_digest_add_bytes(digest, (const char *) &salt_len_netorder, 8); + crypto_digest_add_bytes(digest, (const char *) salt, salt_len); + crypto_digest_add_bytes(digest, (const char *) encrypted, encrypted_len); + crypto_digest_get_digest(digest, (char *) mac_out, mac_len); + crypto_digest_free(digest); +} + +/* Using a given decriptor object, build the secret input needed for the + * KDF and put it in the dst pointer which is an already allocated buffer + * of size dstlen. */ +static void +build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen) +{ + size_t offset = 0; + + tor_assert(desc); + tor_assert(dst); + tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN <= dstlen); + + /* XXX use the destination length as the memcpy length */ + /* Copy blinded public key. */ + memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey, + sizeof(desc->plaintext_data.blinded_pubkey.pubkey)); + offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey); + /* Copy subcredential. */ + memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential)); + offset += sizeof(desc->subcredential); + /* Copy revision counter value. */ + set_uint64(dst + offset, tor_ntohll(desc->plaintext_data.revision_counter)); + offset += sizeof(uint64_t); + tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset); +} + +/* Do the KDF construction and put the resulting data in key_out which is of + * key_out_len length. It uses SHAKE-256 as specified in the spec. */ +static void +build_kdf_key(const hs_descriptor_t *desc, + const uint8_t *salt, size_t salt_len, + uint8_t *key_out, size_t key_out_len, + int is_superencrypted_layer) +{ + uint8_t secret_input[HS_DESC_ENCRYPTED_SECRET_INPUT_LEN]; + crypto_xof_t *xof; + + tor_assert(desc); + tor_assert(salt); + tor_assert(key_out); + + /* Build the secret input for the KDF computation. */ + build_secret_input(desc, secret_input, sizeof(secret_input)); + + xof = crypto_xof_new(); + /* Feed our KDF. [SHAKE it like a polaroid picture --Yawning]. */ + crypto_xof_add_bytes(xof, secret_input, sizeof(secret_input)); + crypto_xof_add_bytes(xof, salt, salt_len); + + /* Feed in the right string constant based on the desc layer */ + if (is_superencrypted_layer) { + crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_superencryption, + strlen(str_enc_const_superencryption)); + } else { + crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_encryption, + strlen(str_enc_const_encryption)); + } + + /* Eat from our KDF. */ + crypto_xof_squeeze_bytes(xof, key_out, key_out_len); + crypto_xof_free(xof); + memwipe(secret_input, 0, sizeof(secret_input)); +} + +/* Using the given descriptor and salt, run it through our KDF function and + * then extract a secret key in key_out, the IV in iv_out and MAC in mac_out. + * This function can't fail. */ +static void +build_secret_key_iv_mac(const hs_descriptor_t *desc, + const uint8_t *salt, size_t salt_len, + uint8_t *key_out, size_t key_len, + uint8_t *iv_out, size_t iv_len, + uint8_t *mac_out, size_t mac_len, + int is_superencrypted_layer) +{ + size_t offset = 0; + uint8_t kdf_key[HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN]; + + tor_assert(desc); + tor_assert(salt); + tor_assert(key_out); + tor_assert(iv_out); + tor_assert(mac_out); + + build_kdf_key(desc, salt, salt_len, kdf_key, sizeof(kdf_key), + is_superencrypted_layer); + /* Copy the bytes we need for both the secret key and IV. */ + memcpy(key_out, kdf_key, key_len); + offset += key_len; + memcpy(iv_out, kdf_key + offset, iv_len); + offset += iv_len; + memcpy(mac_out, kdf_key + offset, mac_len); + /* Extra precaution to make sure we are not out of bound. */ + tor_assert((offset + mac_len) == sizeof(kdf_key)); + memwipe(kdf_key, 0, sizeof(kdf_key)); +} + /* === ENCODING === */ /* Encode the given link specifier objects into a newly allocated string. @@ -363,142 +552,23 @@ encode_intro_point(const ed25519_public_key_t *sig_key, return encoded_ip; } -/* Using a given decriptor object, build the secret input needed for the - * KDF and put it in the dst pointer which is an already allocated buffer - * of size dstlen. */ -static void -build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen) -{ - size_t offset = 0; - - tor_assert(desc); - tor_assert(dst); - tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN <= dstlen); - - /* XXX use the destination length as the memcpy length */ - /* Copy blinded public key. */ - memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey, - sizeof(desc->plaintext_data.blinded_pubkey.pubkey)); - offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey); - /* Copy subcredential. */ - memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential)); - offset += sizeof(desc->subcredential); - /* Copy revision counter value. */ - set_uint64(dst + offset, tor_ntohll(desc->plaintext_data.revision_counter)); - offset += sizeof(uint64_t); - tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset); -} - -/* Do the KDF construction and put the resulting data in key_out which is of - * key_out_len length. It uses SHAKE-256 as specified in the spec. */ -static void -build_kdf_key(const hs_descriptor_t *desc, - const uint8_t *salt, size_t salt_len, - uint8_t *key_out, size_t key_out_len) -{ - uint8_t secret_input[HS_DESC_ENCRYPTED_SECRET_INPUT_LEN]; - crypto_xof_t *xof; - - tor_assert(desc); - tor_assert(salt); - tor_assert(key_out); - - /* Build the secret input for the KDF computation. */ - build_secret_input(desc, secret_input, sizeof(secret_input)); - - xof = crypto_xof_new(); - /* Feed our KDF. [SHAKE it like a polaroid picture --Yawning]. */ - crypto_xof_add_bytes(xof, secret_input, sizeof(secret_input)); - crypto_xof_add_bytes(xof, salt, salt_len); - crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_hsdir_data, - strlen(str_enc_hsdir_data)); - /* Eat from our KDF. */ - crypto_xof_squeeze_bytes(xof, key_out, key_out_len); - crypto_xof_free(xof); - memwipe(secret_input, 0, sizeof(secret_input)); -} - -/* Using the given descriptor and salt, run it through our KDF function and - * then extract a secret key in key_out, the IV in iv_out and MAC in mac_out. - * This function can't fail. */ -static void -build_secret_key_iv_mac(const hs_descriptor_t *desc, - const uint8_t *salt, size_t salt_len, - uint8_t *key_out, size_t key_len, - uint8_t *iv_out, size_t iv_len, - uint8_t *mac_out, size_t mac_len) -{ - size_t offset = 0; - uint8_t kdf_key[HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN]; - - tor_assert(desc); - tor_assert(salt); - tor_assert(key_out); - tor_assert(iv_out); - tor_assert(mac_out); - - build_kdf_key(desc, salt, salt_len, kdf_key, sizeof(kdf_key)); - /* Copy the bytes we need for both the secret key and IV. */ - memcpy(key_out, kdf_key, key_len); - offset += key_len; - memcpy(iv_out, kdf_key + offset, iv_len); - offset += iv_len; - memcpy(mac_out, kdf_key + offset, mac_len); - /* Extra precaution to make sure we are not out of bound. */ - tor_assert((offset + mac_len) == sizeof(kdf_key)); - memwipe(kdf_key, 0, sizeof(kdf_key)); -} - -/* Using a key, salt and encrypted payload, build a MAC and put it in mac_out. - * We use SHA3-256 for the MAC computation. - * This function can't fail. */ -static void -build_mac(const uint8_t *mac_key, size_t mac_key_len, - const uint8_t *salt, size_t salt_len, - const uint8_t *encrypted, size_t encrypted_len, - uint8_t *mac_out, size_t mac_len) -{ - crypto_digest_t *digest; - - const uint64_t mac_len_netorder = tor_htonll(mac_key_len); - const uint64_t salt_len_netorder = tor_htonll(salt_len); - - tor_assert(mac_key); - tor_assert(salt); - tor_assert(encrypted); - tor_assert(mac_out); - - digest = crypto_digest256_new(DIGEST_SHA3_256); - /* As specified in section 2.5 of proposal 224, first add the mac key - * then add the salt first and then the encrypted section. */ - - crypto_digest_add_bytes(digest, (const char *) &mac_len_netorder, 8); - crypto_digest_add_bytes(digest, (const char *) mac_key, mac_key_len); - crypto_digest_add_bytes(digest, (const char *) &salt_len_netorder, 8); - crypto_digest_add_bytes(digest, (const char *) salt, salt_len); - crypto_digest_add_bytes(digest, (const char *) encrypted, encrypted_len); - crypto_digest_get_digest(digest, (char *) mac_out, mac_len); - crypto_digest_free(digest); -} - /* Given a source length, return the new size including padding for the * plaintext encryption. */ static size_t compute_padded_plaintext_length(size_t plaintext_len) { size_t plaintext_padded_len; + const int padding_block_length = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE; /* Make sure we won't overflow. */ - tor_assert(plaintext_len <= - (SIZE_T_CEILING - HS_DESC_PLAINTEXT_PADDING_MULTIPLE)); - - /* Get the extra length we need to add. For example, if srclen is 234 bytes, - * this will expand to (2 * 128) == 256 thus an extra 22 bytes. */ - plaintext_padded_len = CEIL_DIV(plaintext_len, - HS_DESC_PLAINTEXT_PADDING_MULTIPLE) * - HS_DESC_PLAINTEXT_PADDING_MULTIPLE; + tor_assert(plaintext_len <= (SIZE_T_CEILING - padding_block_length)); + + /* Get the extra length we need to add. For example, if srclen is 10200 + * bytes, this will expand to (2 * 10k) == 20k thus an extra 9800 bytes. */ + plaintext_padded_len = CEIL_DIV(plaintext_len, padding_block_length) * + padding_block_length; /* Can never be extra careful. Make sure we are _really_ padded. */ - tor_assert(!(plaintext_padded_len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE)); + tor_assert(!(plaintext_padded_len % padding_block_length)); return plaintext_padded_len; } @@ -530,7 +600,8 @@ build_plaintext_padding(const char *plaintext, size_t plaintext_len, * data. Return size of the encrypted data buffer. */ static size_t build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, - size_t plaintext_len, uint8_t **encrypted_out) + size_t plaintext_len, uint8_t **encrypted_out, + int is_superencrypted_layer) { size_t encrypted_len; uint8_t *padded_plaintext, *encrypted; @@ -541,15 +612,21 @@ build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, tor_assert(plaintext); tor_assert(encrypted_out); + /* If we are encrypting the middle layer of the descriptor, we need to first + pad the plaintext */ + if (is_superencrypted_layer) { + encrypted_len = build_plaintext_padding(plaintext, plaintext_len, + &padded_plaintext); + /* Extra precautions that we have a valid padding length. */ + tor_assert(!(encrypted_len % HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE)); + } else { /* No padding required for inner layers */ + padded_plaintext = tor_memdup(plaintext, plaintext_len); + encrypted_len = plaintext_len; + } + /* This creates a cipher for AES. It can't fail. */ cipher = crypto_cipher_new_with_iv_and_bits(key, iv, HS_DESC_ENCRYPTED_BIT_SIZE); - /* This can't fail. */ - encrypted_len = build_plaintext_padding(plaintext, plaintext_len, - &padded_plaintext); - /* Extra precautions that we have a valie padding length. */ - tor_assert(encrypted_len <= HS_DESC_PADDED_PLAINTEXT_MAX_LEN); - tor_assert(!(encrypted_len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE)); /* We use a stream cipher so the encrypted length will be the same as the * plaintext padded length. */ encrypted = tor_malloc_zero(encrypted_len); @@ -563,12 +640,13 @@ build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, return encrypted_len; } -/* Encrypt the given plaintext buffer and using the descriptor to get the +/* Encrypt the given <b>plaintext</b> buffer using <b>desc</b> to get the * keys. Set encrypted_out with the encrypted data and return the length of - * it. */ + * it. <b>is_superencrypted_layer</b> is set if this is the outer encrypted + * layer of the descriptor. */ static size_t encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, - char **encrypted_out) + char **encrypted_out, int is_superencrypted_layer) { char *final_blob; size_t encrypted_len, final_blob_len, offset = 0; @@ -589,11 +667,13 @@ encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, build_secret_key_iv_mac(desc, salt, sizeof(salt), secret_key, sizeof(secret_key), secret_iv, sizeof(secret_iv), - mac_key, sizeof(mac_key)); + mac_key, sizeof(mac_key), + is_superencrypted_layer); /* Build the encrypted part that is do the actual encryption. */ encrypted_len = build_encrypted(secret_key, secret_iv, plaintext, - strlen(plaintext), &encrypted); + strlen(plaintext), &encrypted, + is_superencrypted_layer); memwipe(secret_key, 0, sizeof(secret_key)); memwipe(secret_iv, 0, sizeof(secret_iv)); /* This construction is specified in section 2.5 of proposal 224. */ @@ -625,20 +705,89 @@ encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, return final_blob_len; } -/* Take care of encoding the encrypted data section and then encrypting it - * with the descriptor's key. A newly allocated NUL terminated string pointer - * containing the encrypted encoded blob is put in encrypted_blob_out. Return - * 0 on success else a negative value. */ -static int -encode_encrypted_data(const hs_descriptor_t *desc, - char **encrypted_blob_out) +/* Create and return a string containing a fake client-auth entry. It's the + * responsibility of the caller to free the returned string. This function will + * never fail. */ +static char * +get_fake_auth_client_str(void) { - int ret = -1; - char *encoded_str, *encrypted_blob; - smartlist_t *lines = smartlist_new(); + char *auth_client_str = NULL; + /* We are gonna fill these arrays with fake base64 data. They are all double + * the size of their binary representation to fit the base64 overhead. */ + char client_id_b64[8*2]; + char iv_b64[16*2]; + char encrypted_cookie_b64[16*2]; + int retval; + + /* This is a macro to fill a field with random data and then base64 it. */ +#define FILL_WITH_FAKE_DATA_AND_BASE64(field) STMT_BEGIN \ + crypto_rand((char *)field, sizeof(field)); \ + retval = base64_encode_nopad(field##_b64, sizeof(field##_b64), \ + field, sizeof(field)); \ + tor_assert(retval > 0); \ + STMT_END + + { /* Get those fakes! */ + uint8_t client_id[8]; /* fake client-id */ + uint8_t iv[16]; /* fake IV (initialization vector) */ + uint8_t encrypted_cookie[16]; /* fake encrypted cookie */ + + FILL_WITH_FAKE_DATA_AND_BASE64(client_id); + FILL_WITH_FAKE_DATA_AND_BASE64(iv); + FILL_WITH_FAKE_DATA_AND_BASE64(encrypted_cookie); + } + + /* Build the final string */ + tor_asprintf(&auth_client_str, "%s %s %s %s", str_desc_auth_client, + client_id_b64, iv_b64, encrypted_cookie_b64); + +#undef FILL_WITH_FAKE_DATA_AND_BASE64 + + return auth_client_str; +} - tor_assert(desc); - tor_assert(encrypted_blob_out); +/** How many lines of "client-auth" we want in our descriptors; fake or not. */ +#define CLIENT_AUTH_ENTRIES_BLOCK_SIZE 16 + +/** Create the "client-auth" part of the descriptor and return a + * newly-allocated string with it. It's the responsibility of the caller to + * free the returned string. */ +static char * +get_fake_auth_client_lines(void) +{ + /* XXX: Client authorization is still not implemented, so all this function + does is make fake clients */ + int i = 0; + smartlist_t *auth_client_lines = smartlist_new(); + char *auth_client_lines_str = NULL; + + /* Make a line for each fake client */ + const int num_fake_clients = CLIENT_AUTH_ENTRIES_BLOCK_SIZE; + for (i = 0; i < num_fake_clients; i++) { + char *auth_client_str = get_fake_auth_client_str(); + tor_assert(auth_client_str); + smartlist_add(auth_client_lines, auth_client_str); + } + + /* Join all lines together to form final string */ + auth_client_lines_str = smartlist_join_strings(auth_client_lines, + "\n", 1, NULL); + /* Cleanup the mess */ + SMARTLIST_FOREACH(auth_client_lines, char *, a, tor_free(a)); + smartlist_free(auth_client_lines); + + return auth_client_lines_str; +} + +/* Create the inner layer of the descriptor (which includes the intro points, + * etc.). Return a newly-allocated string with the layer plaintext, or NULL if + * an error occured. It's the responsibility of the caller to free the returned + * string. */ +static char * +get_inner_encrypted_layer_plaintext(const hs_descriptor_t *desc) +{ + char *encoded_str = NULL; + smartlist_t *lines = smartlist_new(); /* Build the start of the section prior to the introduction points. */ { @@ -649,12 +798,12 @@ encode_encrypted_data(const hs_descriptor_t *desc, smartlist_add_asprintf(lines, "%s %d\n", str_create2_formats, ONION_HANDSHAKE_TYPE_NTOR); - if (desc->encrypted_data.auth_types && - smartlist_len(desc->encrypted_data.auth_types)) { + if (desc->encrypted_data.intro_auth_types && + smartlist_len(desc->encrypted_data.intro_auth_types)) { /* Put the authentication-required line. */ - char *buf = smartlist_join_strings(desc->encrypted_data.auth_types, " ", - 0, NULL); - smartlist_add_asprintf(lines, "%s %s\n", str_auth_required, buf); + char *buf = smartlist_join_strings(desc->encrypted_data.intro_auth_types, + " ", 0, NULL); + smartlist_add_asprintf(lines, "%s %s\n", str_intro_auth_required, buf); tor_free(buf); } @@ -679,31 +828,159 @@ encode_encrypted_data(const hs_descriptor_t *desc, * then encrypt it. */ encoded_str = smartlist_join_strings(lines, "", 0, NULL); - /* Encrypt the section into an encrypted blob that we'll base64 encode - * before returning it. */ + err: + SMARTLIST_FOREACH(lines, char *, l, tor_free(l)); + smartlist_free(lines); + + return encoded_str; +} + +/* Create the middle layer of the descriptor, which includes the client auth + * data and the encrypted inner layer (provided as a base64 string at + * <b>layer2_b64_ciphertext</b>). Return a newly-allocated string with the + * layer plaintext, or NULL if an error occured. It's the responsibility of the + * caller to free the returned string. */ +static char * +get_outer_encrypted_layer_plaintext(const hs_descriptor_t *desc, + const char *layer2_b64_ciphertext) +{ + char *layer1_str = NULL; + smartlist_t *lines = smartlist_new(); + + /* XXX: Disclaimer: This function generates only _fake_ client auth + * data. Real client auth is not yet implemented, but client auth data MUST + * always be present in descriptors. In the future this function will be + * refactored to use real client auth data if they exist (#20700). */ + (void) *desc; + + /* Specify auth type */ + smartlist_add_asprintf(lines, "%s %s\n", str_desc_auth_type, "x25519"); + + { /* Create fake ephemeral x25519 key */ + char fake_key_base64[CURVE25519_BASE64_PADDED_LEN + 1]; + curve25519_keypair_t fake_x25519_keypair; + if (curve25519_keypair_generate(&fake_x25519_keypair, 0) < 0) { + goto done; + } + if (curve25519_public_to_base64(fake_key_base64, + &fake_x25519_keypair.pubkey) < 0) { + goto done; + } + smartlist_add_asprintf(lines, "%s %s\n", + str_desc_auth_key, fake_key_base64); + /* No need to memwipe any of these fake keys. They will go unused. */ + } + + { /* Create fake auth-client lines. */ + char *auth_client_lines = get_fake_auth_client_lines(); + tor_assert(auth_client_lines); + smartlist_add(lines, auth_client_lines); + } + + /* create encrypted section */ { - char *enc_b64; - ssize_t enc_b64_len, ret_len, enc_len; + smartlist_add_asprintf(lines, + "%s\n" + "-----BEGIN MESSAGE-----\n" + "%s" + "-----END MESSAGE-----", + str_encrypted, layer2_b64_ciphertext); + } - enc_len = encrypt_descriptor_data(desc, encoded_str, &encrypted_blob); - tor_free(encoded_str); - /* Get the encoded size plus a NUL terminating byte. */ - enc_b64_len = base64_encode_size(enc_len, BASE64_ENCODE_MULTILINE) + 1; - enc_b64 = tor_malloc_zero(enc_b64_len); - /* Base64 the encrypted blob before returning it. */ - ret_len = base64_encode(enc_b64, enc_b64_len, encrypted_blob, enc_len, - BASE64_ENCODE_MULTILINE); - /* Return length doesn't count the NUL byte. */ - tor_assert(ret_len == (enc_b64_len - 1)); - tor_free(encrypted_blob); - *encrypted_blob_out = enc_b64; + layer1_str = smartlist_join_strings(lines, "", 0, NULL); + + done: + SMARTLIST_FOREACH(lines, char *, a, tor_free(a)); + smartlist_free(lines); + + return layer1_str; +} + +/* Encrypt <b>encoded_str</b> into an encrypted blob and then base64 it before + * returning it. <b>desc</b> is provided to derive the encryption + * keys. <b>is_superencrypted_layer</b> is set if <b>encoded_str</b> is the + * middle (superencrypted) layer of the descriptor. It's the responsibility of + * the caller to free the returned string. */ +static char * +encrypt_desc_data_and_base64(const hs_descriptor_t *desc, + const char *encoded_str, + int is_superencrypted_layer) +{ + char *enc_b64; + ssize_t enc_b64_len, ret_len, enc_len; + char *encrypted_blob = NULL; + + enc_len = encrypt_descriptor_data(desc, encoded_str, &encrypted_blob, + is_superencrypted_layer); + /* Get the encoded size plus a NUL terminating byte. */ + enc_b64_len = base64_encode_size(enc_len, BASE64_ENCODE_MULTILINE) + 1; + enc_b64 = tor_malloc_zero(enc_b64_len); + /* Base64 the encrypted blob before returning it. */ + ret_len = base64_encode(enc_b64, enc_b64_len, encrypted_blob, enc_len, + BASE64_ENCODE_MULTILINE); + /* Return length doesn't count the NUL byte. */ + tor_assert(ret_len == (enc_b64_len - 1)); + tor_free(encrypted_blob); + + return enc_b64; +} + +/* Generate and encode the superencrypted portion of <b>desc</b>. This also + * involves generating the encrypted portion of the descriptor, and performing + * the superencryption. A newly allocated NUL-terminated string pointer + * containing the encrypted encoded blob is put in encrypted_blob_out. Return 0 + * on success else a negative value. */ +static int +encode_superencrypted_data(const hs_descriptor_t *desc, + char **encrypted_blob_out) +{ + int ret = -1; + char *layer2_str = NULL; + char *layer2_b64_ciphertext = NULL; + char *layer1_str = NULL; + char *layer1_b64_ciphertext = NULL; + + tor_assert(desc); + tor_assert(encrypted_blob_out); + + /* Func logic: We first create the inner layer of the descriptor (layer2). + * We then encrypt it and use it to create the middle layer of the descriptor + * (layer1). Finally we superencrypt the middle layer and return it to our + * caller. */ + + /* Create inner descriptor layer */ + layer2_str = get_inner_encrypted_layer_plaintext(desc); + if (!layer2_str) { + goto err; + } + + /* Encrypt and b64 the inner layer */ + layer2_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer2_str, 0); + if (!layer2_b64_ciphertext) { + goto err; + } + + /* Now create middle descriptor layer given the inner layer */ + layer1_str = get_outer_encrypted_layer_plaintext(desc,layer2_b64_ciphertext); + if (!layer1_str) { + goto err; } + + /* Encrypt and base64 the middle layer */ + layer1_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer1_str, 1); + if (!layer1_b64_ciphertext) { + goto err; + } + /* Success! */ ret = 0; err: - SMARTLIST_FOREACH(lines, char *, l, tor_free(l)); - smartlist_free(lines); + tor_free(layer1_str); + tor_free(layer2_str); + tor_free(layer2_b64_ciphertext); + + *encrypted_blob_out = layer1_b64_ciphertext; return ret; } @@ -756,7 +1033,7 @@ desc_encode_v3(const hs_descriptor_t *desc, /* Build the superencrypted data section. */ { char *enc_b64_blob=NULL; - if (encode_encrypted_data(desc, &enc_b64_blob) < 0) { + if (encode_superencrypted_data(desc, &enc_b64_blob) < 0) { goto err; } smartlist_add_asprintf(lines, @@ -796,6 +1073,13 @@ desc_encode_v3(const hs_descriptor_t *desc, encoded_str = smartlist_join_strings(lines, "\n", 1, NULL); *encoded_out = encoded_str; + if (strlen(encoded_str) >= hs_cache_get_max_descriptor_size()) { + log_warn(LD_GENERAL, "We just made an HS descriptor that's too big (%d)." + "Failing.", (int)strlen(encoded_str)); + tor_free(encoded_str); + goto err; + } + /* XXX: Trigger a control port event. */ /* Success! */ @@ -894,14 +1178,14 @@ decode_auth_type(hs_desc_encrypted_data_t *desc, const char *list) tor_assert(desc); tor_assert(list); - desc->auth_types = smartlist_new(); - smartlist_split_string(desc->auth_types, list, " ", 0, 0); + desc->intro_auth_types = smartlist_new(); + smartlist_split_string(desc->intro_auth_types, list, " ", 0, 0); /* Validate the types that we at least know about one. */ - SMARTLIST_FOREACH_BEGIN(desc->auth_types, const char *, auth) { - for (int idx = 0; auth_types[idx].identifier; idx++) { - if (!strncmp(auth, auth_types[idx].identifier, - strlen(auth_types[idx].identifier))) { + SMARTLIST_FOREACH_BEGIN(desc->intro_auth_types, const char *, auth) { + for (int idx = 0; intro_auth_types[idx].identifier; idx++) { + if (!strncmp(auth, intro_auth_types[idx].identifier, + strlen(intro_auth_types[idx].identifier))) { match = 1; break; } @@ -1023,41 +1307,31 @@ cert_parse_and_validate(tor_cert_t **cert_out, const char *data, STATIC int encrypted_data_length_is_valid(size_t len) { - /* Check for the minimum length possible. */ - if (len < HS_DESC_ENCRYPTED_MIN_LEN) { + /* Make sure there is enough data for the salt and the mac. The equality is + there to ensure that there is at least one byte of encrypted data. */ + if (len <= HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN) { log_warn(LD_REND, "Length of descriptor's encrypted data is too small. " "Got %lu but minimum value is %d", - (unsigned long)len, HS_DESC_ENCRYPTED_MIN_LEN); + (unsigned long)len, HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN); goto err; } - /* Encrypted data has the salt and MAC concatenated to it so remove those - * from the validation calculation. */ - len -= HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN; - - /* Check that it's aligned on the block size of the crypto algorithm. */ - if (len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE) { - log_warn(LD_REND, "Length of descriptor's encrypted data is invalid. " - "Got %lu which is not a multiple of %d.", - (unsigned long) len, HS_DESC_PLAINTEXT_PADDING_MULTIPLE); - goto err; - } - - /* XXX: Check maximum size. Will strongly depends on the maximum intro point - * allowed we decide on and probably if they will all have to use the legacy - * key which is bigger than the ed25519 key. */ - return 1; err: return 0; } -/* Decrypt the encrypted section of the descriptor using the given descriptor - * object desc. A newly allocated NUL terminated string is put in - * decrypted_out. Return the length of decrypted_out on success else 0 is - * returned and decrypted_out is set to NULL. */ +/** Decrypt an encrypted descriptor layer at <b>encrypted_blob</b> of size + * <b>encrypted_blob_size</b>. Use the descriptor object <b>desc</b> to + * generate the right decryption keys; set <b>decrypted_out</b> to the + * plaintext. If <b>is_superencrypted_layer</b> is set, this is the outter + * encrypted layer of the descriptor. */ static size_t -desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) +decrypt_desc_layer(const hs_descriptor_t *desc, + const uint8_t *encrypted_blob, + size_t encrypted_blob_size, + int is_superencrypted_layer, + char **decrypted_out) { uint8_t *decrypted = NULL; uint8_t secret_key[HS_DESC_ENCRYPTED_KEY_LEN], secret_iv[CIPHER_IV_LEN]; @@ -1067,41 +1341,33 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) tor_assert(decrypted_out); tor_assert(desc); - tor_assert(desc->plaintext_data.encrypted_blob); + tor_assert(encrypted_blob); - /* Construction is as follow: SALT | ENCRYPTED_DATA | MAC */ - if (!encrypted_data_length_is_valid( - desc->plaintext_data.encrypted_blob_size)) { + /* Construction is as follow: SALT | ENCRYPTED_DATA | MAC . + * Make sure we have enough space for all these things. */ + if (!encrypted_data_length_is_valid(encrypted_blob_size)) { goto err; } /* Start of the blob thus the salt. */ - salt = desc->plaintext_data.encrypted_blob; + salt = encrypted_blob; + /* Next is the encrypted data. */ - encrypted = desc->plaintext_data.encrypted_blob + - HS_DESC_ENCRYPTED_SALT_LEN; - encrypted_len = desc->plaintext_data.encrypted_blob_size - + encrypted = encrypted_blob + HS_DESC_ENCRYPTED_SALT_LEN; + encrypted_len = encrypted_blob_size - (HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN); + tor_assert(encrypted_len > 0); /* guaranteed by the check above */ - /* At the very end is the MAC. Make sure it's of the right size. */ - { - desc_mac = encrypted + encrypted_len; - size_t desc_mac_size = desc->plaintext_data.encrypted_blob_size - - (desc_mac - desc->plaintext_data.encrypted_blob); - if (desc_mac_size != DIGEST256_LEN) { - log_warn(LD_REND, "Service descriptor MAC length of encrypted data " - "is invalid (%lu, expected %u)", - (unsigned long) desc_mac_size, DIGEST256_LEN); - goto err; - } - } + /* And last comes the MAC. */ + desc_mac = encrypted_blob + encrypted_blob_size - DIGEST256_LEN; /* KDF construction resulting in a key from which the secret key, IV and MAC * key are extracted which is what we need for the decryption. */ build_secret_key_iv_mac(desc, salt, HS_DESC_ENCRYPTED_SALT_LEN, secret_key, sizeof(secret_key), secret_iv, sizeof(secret_iv), - mac_key, sizeof(mac_key)); + mac_key, sizeof(mac_key), + is_superencrypted_layer); /* Build MAC. */ build_mac(mac_key, sizeof(mac_key), salt, HS_DESC_ENCRYPTED_SALT_LEN, @@ -1131,7 +1397,7 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) } { - /* Adjust length to remove NULL padding bytes */ + /* Adjust length to remove NUL padding bytes */ uint8_t *end = memchr(decrypted, 0, encrypted_len); result_len = encrypted_len; if (end) { @@ -1157,6 +1423,164 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) return result_len; } +/* Basic validation that the superencrypted client auth portion of the + * descriptor is well-formed and recognized. Return True if so, otherwise + * return False. */ +static int +superencrypted_auth_data_is_valid(smartlist_t *tokens) +{ + /* XXX: This is just basic validation for now. When we implement client auth, + we can refactor this function so that it actually parses and saves the + data. */ + + { /* verify desc auth type */ + const directory_token_t *tok; + tok = find_by_keyword(tokens, R3_DESC_AUTH_TYPE); + tor_assert(tok->n_args >= 1); + if (strcmp(tok->args[0], "x25519")) { + log_warn(LD_DIR, "Unrecognized desc auth type"); + return 0; + } + } + + { /* verify desc auth key */ + const directory_token_t *tok; + curve25519_public_key_t k; + tok = find_by_keyword(tokens, R3_DESC_AUTH_KEY); + tor_assert(tok->n_args >= 1); + if (curve25519_public_from_base64(&k, tok->args[0]) < 0) { + log_warn(LD_DIR, "Bogus desc auth key in HS desc"); + return 0; + } + } + + /* verify desc auth client items */ + SMARTLIST_FOREACH_BEGIN(tokens, const directory_token_t *, tok) { + if (tok->tp == R3_DESC_AUTH_CLIENT) { + tor_assert(tok->n_args >= 3); + } + } SMARTLIST_FOREACH_END(tok); + + return 1; +} + +/* Parse <b>message</b>, the plaintext of the superencrypted portion of an HS + * descriptor. Set <b>encrypted_out</b> to the encrypted blob, and return its + * size */ +STATIC size_t +decode_superencrypted(const char *message, size_t message_len, + uint8_t **encrypted_out) +{ + int retval = 0; + memarea_t *area = NULL; + smartlist_t *tokens = NULL; + + area = memarea_new(); + tokens = smartlist_new(); + if (tokenize_string(area, message, message + message_len, tokens, + hs_desc_superencrypted_v3_token_table, 0) < 0) { + log_warn(LD_REND, "Superencrypted portion is not parseable"); + goto err; + } + + /* Do some rudimentary validation of the authentication data */ + if (!superencrypted_auth_data_is_valid(tokens)) { + log_warn(LD_REND, "Invalid auth data"); + goto err; + } + + /* Extract the encrypted data section. */ + { + const directory_token_t *tok; + tok = find_by_keyword(tokens, R3_ENCRYPTED); + tor_assert(tok->object_body); + if (strcmp(tok->object_type, "MESSAGE") != 0) { + log_warn(LD_REND, "Desc superencrypted data section is invalid"); + goto err; + } + /* Make sure the length of the encrypted blob is valid. */ + if (!encrypted_data_length_is_valid(tok->object_size)) { + goto err; + } + + /* Copy the encrypted blob to the descriptor object so we can handle it + * latter if needed. */ + tor_assert(tok->object_size <= INT_MAX); + *encrypted_out = tor_memdup(tok->object_body, tok->object_size); + retval = (int) tok->object_size; + } + + err: + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); + smartlist_free(tokens); + if (area) { + memarea_drop_all(area); + } + + return retval; +} + +/* Decrypt both the superencrypted and the encrypted section of the descriptor + * using the given descriptor object <b>desc</b>. A newly allocated NUL + * terminated string is put in decrypted_out which contains the inner encrypted + * layer of the descriptor. Return the length of decrypted_out on success else + * 0 is returned and decrypted_out is set to NULL. */ +static size_t +desc_decrypt_all(const hs_descriptor_t *desc, char **decrypted_out) +{ + size_t decrypted_len = 0; + size_t encrypted_len = 0; + size_t superencrypted_len = 0; + char *superencrypted_plaintext = NULL; + uint8_t *encrypted_blob = NULL; + + /** Function logic: This function takes us from the descriptor header to the + * inner encrypted layer, by decrypting and decoding the middle descriptor + * layer. In the end we return the contents of the inner encrypted layer to + * our caller. */ + + /* 1. Decrypt middle layer of descriptor */ + superencrypted_len = decrypt_desc_layer(desc, + desc->plaintext_data.superencrypted_blob, + desc->plaintext_data.superencrypted_blob_size, + 1, + &superencrypted_plaintext); + if (!superencrypted_len) { + log_warn(LD_REND, "Decrypting superencrypted desc failed."); + goto err; + } + tor_assert(superencrypted_plaintext); + + /* 2. Parse "superencrypted" */ + encrypted_len = decode_superencrypted(superencrypted_plaintext, + superencrypted_len, + &encrypted_blob); + if (!encrypted_len) { + log_warn(LD_REND, "Decrypting encrypted desc failed."); + goto err; + } + tor_assert(encrypted_blob); + + /* 3. Decrypt "encrypted" and set decrypted_out */ + char *decrypted_desc; + decrypted_len = decrypt_desc_layer(desc, + encrypted_blob, encrypted_len, + 0, &decrypted_desc); + if (!decrypted_len) { + log_warn(LD_REND, "Decrypting encrypted desc failed."); + goto err; + } + tor_assert(decrypted_desc); + + *decrypted_out = decrypted_desc; + + err: + tor_free(superencrypted_plaintext); + tor_free(encrypted_blob); + + return decrypted_len; +} + /* Given the start of a section and the end of it, decode a single * introduction point from that section. Return a newly allocated introduction * point object containing the decoded data. Return NULL if the section can't @@ -1289,7 +1713,9 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start) tor_cert_free(cross_cert); SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); - memarea_drop_all(area); + if (area) { + memarea_drop_all(area); + } return ip; } @@ -1508,8 +1934,8 @@ desc_decode_plaintext_v3(smartlist_t *tokens, /* Copy the encrypted blob to the descriptor object so we can handle it * latter if needed. */ - desc->encrypted_blob = tor_memdup(tok->object_body, tok->object_size); - desc->encrypted_blob_size = tok->object_size; + desc->superencrypted_blob = tor_memdup(tok->object_body, tok->object_size); + desc->superencrypted_blob_size = tok->object_size; /* Extract signature and verify it. */ tok = find_by_keyword(tokens, R3_SIGNATURE); @@ -1543,10 +1969,9 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc, tor_assert(desc); tor_assert(desc_encrypted_out); - /* Decrypt the encrypted data that is located in the plaintext section in - * the descriptor as a blob of bytes. The following functions will use the - * keys found in the same section. */ - message_len = desc_decrypt_data_v3(desc, &message); + /* Decrypt the superencrypted data that is located in the plaintext section + * in the descriptor as a blob of bytes. */ + message_len = desc_decrypt_all(desc, &message); if (!message_len) { log_warn(LD_REND, "Service descriptor decryption failed."); goto err; @@ -1572,7 +1997,7 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc, } /* Authentication type. It's optional but only once. */ - tok = find_opt_by_keyword(tokens, R3_AUTHENTICATION_REQUIRED); + tok = find_opt_by_keyword(tokens, R3_INTRO_AUTH_REQUIRED); if (tok) { if (!decode_auth_type(desc_encrypted_out, tok->args[0])) { log_warn(LD_REND, "Service descriptor authentication type has " @@ -1654,7 +2079,7 @@ hs_desc_decode_encrypted(const hs_descriptor_t *desc, /* Calling this function without an encrypted blob to parse is a code flow * error. The plaintext parsing should never succeed in the first place * without an encrypted section. */ - tor_assert(desc->plaintext_data.encrypted_blob); + tor_assert(desc->plaintext_data.superencrypted_blob); /* Let's make sure we have a supported version as well. By correctly parsing * the plaintext, this should not fail. */ if (BUG(!hs_desc_is_supported_version(version))) { @@ -1906,6 +2331,6 @@ hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data) { tor_assert(data); return (sizeof(*data) + sizeof(*data->signing_key_cert) + - data->encrypted_blob_size); + data->superencrypted_blob_size); } diff --git a/src/or/hs_descriptor.h b/src/or/hs_descriptor.h index b520d24471..b7d512c06b 100644 --- a/src/or/hs_descriptor.h +++ b/src/or/hs_descriptor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -41,24 +41,11 @@ * the secret IV and MAC key length which is the length of H() output. */ #define HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN \ CIPHER256_KEY_LEN + CIPHER_IV_LEN + DIGEST256_LEN -/* We need to pad the plaintext version of the encrypted data section before - * encryption and it has to be a multiple of this value. */ -#define HS_DESC_PLAINTEXT_PADDING_MULTIPLE 128 -/* XXX: Let's make sure this makes sense as an upper limit for the padded - * plaintext section. Then we should enforce it as now only an assert will be - * triggered if we are above it. */ -/* Once padded, this is the maximum length in bytes for the plaintext. */ -#define HS_DESC_PADDED_PLAINTEXT_MAX_LEN 8192 -/* Minimum length in bytes of the encrypted portion of the descriptor. */ -#define HS_DESC_ENCRYPTED_MIN_LEN \ - HS_DESC_ENCRYPTED_SALT_LEN + \ - HS_DESC_PLAINTEXT_PADDING_MULTIPLE + DIGEST256_LEN +/* Pad plaintext of superencrypted data section before encryption so that its + * length is a multiple of this value. */ +#define HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE 10000 /* Maximum length in bytes of a full hidden service descriptor. */ #define HS_DESC_MAX_LEN 50000 /* 50kb max size */ -/* The minimum amount of fields a descriptor should contain. The parsing of - * the fields are version specific so the only required field, as a generic - * view of a descriptor, is 1 that is the version field. */ -#define HS_DESC_PLAINTEXT_MIN_FIELDS 1 /* Key length for the descriptor symmetric encryption. As specified in the * protocol, we use AES-256 for the encrypted section of the descriptor. The @@ -68,8 +55,7 @@ /* Type of authentication in the descriptor. */ typedef enum { - HS_DESC_AUTH_PASSWORD = 1, - HS_DESC_AUTH_ED25519 = 2, + HS_DESC_AUTH_ED25519 = 1 } hs_desc_auth_type_t; /* Type of encryption key in the descriptor. */ @@ -132,7 +118,7 @@ typedef struct hs_desc_encrypted_data_t { /* A list of authentication types that a client must at least support one * in order to contact the service. Contains NULL terminated strings. */ - smartlist_t *auth_types; + smartlist_t *intro_auth_types; /* Is this descriptor a single onion service? */ unsigned int single_onion_service : 1; @@ -167,11 +153,11 @@ typedef struct hs_desc_plaintext_data_t { * has changed. Spec specifies this as a 8 bytes positive integer. */ uint64_t revision_counter; - /* Decoding only: The base64-decoded encrypted blob from the descriptor */ - uint8_t *encrypted_blob; + /* Decoding only: The b64-decoded superencrypted blob from the descriptor */ + uint8_t *superencrypted_blob; - /* Decoding only: Size of the encrypted_blob */ - size_t encrypted_blob_size; + /* Decoding only: Size of the superencrypted_blob */ + size_t superencrypted_blob_size; } hs_desc_plaintext_data_t; /* Service descriptor in its decoded form. */ @@ -242,6 +228,8 @@ STATIC int desc_sig_is_valid(const char *b64_sig, const ed25519_public_key_t *signing_pubkey, const char *encoded_desc, size_t encoded_len); STATIC void desc_intro_point_free(hs_desc_intro_point_t *ip); +STATIC size_t decode_superencrypted(const char *message, size_t message_len, + uint8_t **encrypted_out); #endif /* HS_DESCRIPTOR_PRIVATE */ #endif /* TOR_HS_DESCRIPTOR_H */ diff --git a/src/or/hs_intropoint.c b/src/or/hs_intropoint.c index db4ba7982a..2abbfcd6c3 100644 --- a/src/or/hs_intropoint.c +++ b/src/or/hs_intropoint.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -43,16 +43,16 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, switch (cell_type) { case RELAY_COMMAND_ESTABLISH_INTRO: { - const hs_cell_establish_intro_t *c_cell = cell; - key_array = hs_cell_establish_intro_getconstarray_auth_key(c_cell); - auth_key_len = hs_cell_establish_intro_getlen_auth_key(c_cell); + const trn_cell_establish_intro_t *c_cell = cell; + key_array = trn_cell_establish_intro_getconstarray_auth_key(c_cell); + auth_key_len = trn_cell_establish_intro_getlen_auth_key(c_cell); break; } case RELAY_COMMAND_INTRODUCE1: { - const hs_cell_introduce1_t *c_cell = cell; - key_array = hs_cell_introduce1_getconstarray_auth_key(cell); - auth_key_len = hs_cell_introduce1_getlen_auth_key(c_cell); + const trn_cell_introduce1_t *c_cell = cell; + key_array = trn_cell_introduce1_getconstarray_auth_key(cell); + auth_key_len = trn_cell_introduce1_getlen_auth_key(c_cell); break; } default: @@ -68,22 +68,22 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, /** We received an ESTABLISH_INTRO <b>cell</b>. Verify its signature and MAC, * given <b>circuit_key_material</b>. Return 0 on success else -1 on error. */ STATIC int -verify_establish_intro_cell(const hs_cell_establish_intro_t *cell, +verify_establish_intro_cell(const trn_cell_establish_intro_t *cell, const uint8_t *circuit_key_material, size_t circuit_key_material_len) { /* We only reach this function if the first byte of the cell is 0x02 which - * means that auth_key_type is AUTH_KEY_ED25519, hence this check should + * means that auth_key_type is of ed25519 type, hence this check should * always pass. See hs_intro_received_establish_intro(). */ - if (BUG(cell->auth_key_type != AUTH_KEY_ED25519)) { + if (BUG(cell->auth_key_type != HS_INTRO_AUTH_KEY_TYPE_ED25519)) { return -1; } /* Make sure the auth key length is of the right size for this type. For * EXTRA safety, we check both the size of the array and the length which * must be the same. Safety first!*/ - if (hs_cell_establish_intro_getlen_auth_key(cell) != ED25519_PUBKEY_LEN || - hs_cell_establish_intro_get_auth_key_len(cell) != ED25519_PUBKEY_LEN) { + if (trn_cell_establish_intro_getlen_auth_key(cell) != ED25519_PUBKEY_LEN || + trn_cell_establish_intro_get_auth_key_len(cell) != ED25519_PUBKEY_LEN) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "ESTABLISH_INTRO auth key length is invalid"); return -1; @@ -94,13 +94,14 @@ verify_establish_intro_cell(const hs_cell_establish_intro_t *cell, /* Verify the sig */ { ed25519_signature_t sig_struct; - const uint8_t *sig_array = hs_cell_establish_intro_getconstarray_sig(cell); + const uint8_t *sig_array = + trn_cell_establish_intro_getconstarray_sig(cell); /* Make sure the signature length is of the right size. For EXTRA safety, * we check both the size of the array and the length which must be the * same. Safety first!*/ - if (hs_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) || - hs_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) { + if (trn_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) || + trn_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "ESTABLISH_INTRO sig len is invalid"); return -1; @@ -147,21 +148,21 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ)) int ret; uint8_t *encoded_cell = NULL; ssize_t encoded_len, result_len; - hs_cell_intro_established_t *cell; - cell_extension_t *ext; + trn_cell_intro_established_t *cell; + trn_cell_extension_t *ext; tor_assert(circ); /* Build the cell payload. */ - cell = hs_cell_intro_established_new(); - ext = cell_extension_new(); - cell_extension_set_num(ext, 0); - hs_cell_intro_established_set_extensions(cell, ext); + cell = trn_cell_intro_established_new(); + ext = trn_cell_extension_new(); + trn_cell_extension_set_num(ext, 0); + trn_cell_intro_established_set_extensions(cell, ext); /* Encode the cell to binary format. */ - encoded_len = hs_cell_intro_established_encoded_len(cell); + encoded_len = trn_cell_intro_established_encoded_len(cell); tor_assert(encoded_len > 0); encoded_cell = tor_malloc_zero(encoded_len); - result_len = hs_cell_intro_established_encode(encoded_cell, encoded_len, + result_len = trn_cell_intro_established_encode(encoded_cell, encoded_len, cell); tor_assert(encoded_len == result_len); @@ -170,7 +171,7 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ)) (char *) encoded_cell, encoded_len, NULL); /* On failure, the above function will close the circuit. */ - hs_cell_intro_established_free(cell); + trn_cell_intro_established_free(cell); tor_free(encoded_cell); return ret; } @@ -180,7 +181,7 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ)) * establish an intro point. */ static int handle_verified_establish_intro_cell(or_circuit_t *circ, - const hs_cell_establish_intro_t *parsed_cell) + const trn_cell_establish_intro_t *parsed_cell) { /* Get the auth key of this intro point */ ed25519_public_key_t auth_key; @@ -195,7 +196,7 @@ handle_verified_establish_intro_cell(or_circuit_t *circ, } /* Associate intro point auth key with this circuit. */ - hs_circuitmap_register_intro_circ_v3(circ, &auth_key); + hs_circuitmap_register_intro_circ_v3_relay_side(circ, &auth_key); /* Repurpose this circuit into an intro circuit. */ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); @@ -210,7 +211,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, size_t request_len) { int cell_ok, retval = -1; - hs_cell_establish_intro_t *parsed_cell = NULL; + trn_cell_establish_intro_t *parsed_cell = NULL; tor_assert(circ); tor_assert(request); @@ -224,7 +225,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, } /* Parse the cell */ - ssize_t parsing_result = hs_cell_establish_intro_parse(&parsed_cell, + ssize_t parsing_result = trn_cell_establish_intro_parse(&parsed_cell, request, request_len); if (parsing_result < 0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, @@ -259,7 +260,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); done: - hs_cell_establish_intro_free(parsed_cell); + trn_cell_establish_intro_free(parsed_cell); return retval; } @@ -339,28 +340,28 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) int ret = -1; uint8_t *encoded_cell = NULL; ssize_t encoded_len, result_len; - hs_cell_introduce_ack_t *cell; - cell_extension_t *ext; + trn_cell_introduce_ack_t *cell; + trn_cell_extension_t *ext; tor_assert(circ); /* Setup the INTRODUCE_ACK cell. We have no extensions so the N_EXTENSIONS * field is set to 0 by default with a new object. */ - cell = hs_cell_introduce_ack_new(); - ret = hs_cell_introduce_ack_set_status(cell, status); + cell = trn_cell_introduce_ack_new(); + ret = trn_cell_introduce_ack_set_status(cell, status); /* We have no cell extensions in an INTRODUCE_ACK cell. */ - ext = cell_extension_new(); - cell_extension_set_num(ext, 0); - hs_cell_introduce_ack_set_extensions(cell, ext); + ext = trn_cell_extension_new(); + trn_cell_extension_set_num(ext, 0); + trn_cell_introduce_ack_set_extensions(cell, ext); /* A wrong status is a very bad code flow error as this value is controlled * by the code in this file and not an external input. This means we use a * code that is not known by the trunnel ABI. */ tor_assert(ret == 0); /* Encode the payload. We should never fail to get the encoded length. */ - encoded_len = hs_cell_introduce_ack_encoded_len(cell); + encoded_len = trn_cell_introduce_ack_encoded_len(cell); tor_assert(encoded_len > 0); encoded_cell = tor_malloc_zero(encoded_len); - result_len = hs_cell_introduce_ack_encode(encoded_cell, encoded_len, cell); + result_len = trn_cell_introduce_ack_encode(encoded_cell, encoded_len, cell); tor_assert(encoded_len == result_len); ret = relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ), @@ -368,7 +369,7 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) (char *) encoded_cell, encoded_len, NULL); /* On failure, the above function will close the circuit. */ - hs_cell_introduce_ack_free(cell); + trn_cell_introduce_ack_free(cell); tor_free(encoded_cell); return ret; } @@ -376,7 +377,7 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) /* Validate a parsed INTRODUCE1 <b>cell</b>. Return 0 if valid or else a * negative value for an invalid cell that should be NACKed. */ STATIC int -validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell) +validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell) { size_t legacy_key_id_len; const uint8_t *legacy_key_id; @@ -385,29 +386,29 @@ validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell) /* This code path SHOULD NEVER be reached if the cell is a legacy type so * safety net here. The legacy ID must be zeroes in this case. */ - legacy_key_id_len = hs_cell_introduce1_getlen_legacy_key_id(cell); - legacy_key_id = hs_cell_introduce1_getconstarray_legacy_key_id(cell); + legacy_key_id_len = trn_cell_introduce1_getlen_legacy_key_id(cell); + legacy_key_id = trn_cell_introduce1_getconstarray_legacy_key_id(cell); if (BUG(!tor_mem_is_zero((char *) legacy_key_id, legacy_key_id_len))) { goto invalid; } /* The auth key of an INTRODUCE1 should be of type ed25519 thus leading to a * known fixed length as well. */ - if (hs_cell_introduce1_get_auth_key_type(cell) != + if (trn_cell_introduce1_get_auth_key_type(cell) != HS_INTRO_AUTH_KEY_TYPE_ED25519) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting invalid INTRODUCE1 cell auth key type. " "Responding with NACK."); goto invalid; } - if (hs_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN || - hs_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) { + if (trn_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN || + trn_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting invalid INTRODUCE1 cell auth key length. " "Responding with NACK."); goto invalid; } - if (hs_cell_introduce1_getlen_encrypted(cell) == 0) { + if (trn_cell_introduce1_getlen_encrypted(cell) == 0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting invalid INTRODUCE1 cell encrypted length. " "Responding with NACK."); @@ -430,7 +431,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, { int ret = -1; or_circuit_t *service_circ; - hs_cell_introduce1_t *parsed_cell; + trn_cell_introduce1_t *parsed_cell; hs_intro_ack_status_t status = HS_INTRO_ACK_STATUS_SUCCESS; tor_assert(client_circ); @@ -439,7 +440,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, /* Parse cell. Note that we can only parse the non encrypted section for * which we'll use the authentication key to find the service introduction * circuit and relay the cell on it. */ - ssize_t cell_size = hs_cell_introduce1_parse(&parsed_cell, request, + ssize_t cell_size = trn_cell_introduce1_parse(&parsed_cell, request, request_len); if (cell_size < 0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, @@ -461,7 +462,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, { ed25519_public_key_t auth_key; get_auth_key_from_cell(&auth_key, RELAY_COMMAND_INTRODUCE1, parsed_cell); - service_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); + service_circ = hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); if (service_circ == NULL) { char b64_key[ED25519_BASE64_LEN + 1]; ed25519_public_to_base64(b64_key, &auth_key); @@ -505,7 +506,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, circuit_mark_for_close(TO_CIRCUIT(client_circ), END_CIRC_REASON_INTERNAL); } done: - hs_cell_introduce1_free(parsed_cell); + trn_cell_introduce1_free(parsed_cell); return ret; } diff --git a/src/or/hs_intropoint.h b/src/or/hs_intropoint.h index e6024a858f..163ed810e7 100644 --- a/src/or/hs_intropoint.h +++ b/src/or/hs_intropoint.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -41,7 +41,7 @@ int hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ); #include "hs/cell_introduce1.h" STATIC int -verify_establish_intro_cell(const hs_cell_establish_intro_t *out, +verify_establish_intro_cell(const trn_cell_establish_intro_t *out, const uint8_t *circuit_key_material, size_t circuit_key_material_len); @@ -52,7 +52,7 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, STATIC int introduce1_cell_is_legacy(const uint8_t *request); STATIC int handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, size_t request_len); -STATIC int validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell); +STATIC int validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell); STATIC int circuit_is_suitable_for_introduce1(const or_circuit_t *circ); #endif /* HS_INTROPOINT_PRIVATE */ diff --git a/src/or/hs_ntor.c b/src/or/hs_ntor.c new file mode 100644 index 0000000000..119899817e --- /dev/null +++ b/src/or/hs_ntor.c @@ -0,0 +1,626 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** \file hs_ntor.c + * \brief Implements the ntor variant used in Tor hidden services. + * + * \details + * This module handles the variant of the ntor handshake that is documented in + * section [NTOR-WITH-EXTRA-DATA] of rend-spec-ng.txt . + * + * The functions in this file provide an API that should be used when sending + * or receiving INTRODUCE1/RENDEZVOUS1 cells to generate the various key + * material required to create and handle those cells. + * + * In the case of INTRODUCE1 it provides encryption and MAC keys to + * encode/decode the encrypted blob (see hs_ntor_intro_cell_keys_t). The + * relevant pub functions are hs_ntor_{client,service}_get_introduce1_keys(). + * + * In the case of RENDEZVOUS1 it calculates the MAC required to authenticate + * the cell, and also provides the key seed that is used to derive the crypto + * material for rendezvous encryption (see hs_ntor_rend_cell_keys_t). The + * relevant pub functions are hs_ntor_{client,service}_get_rendezvous1_keys(). + * It also provides a function (hs_ntor_circuit_key_expansion()) that does the + * rendezvous key expansion to setup end-to-end rend circuit keys. + */ + +#include "or.h" +#include "hs_ntor.h" + +/* String constants used by the ntor HS protocol */ +#define PROTOID "tor-hs-ntor-curve25519-sha3-256-1" +#define PROTOID_LEN (sizeof(PROTOID) - 1) +#define SERVER_STR "Server" +#define SERVER_STR_LEN (sizeof(SERVER_STR) - 1) + +/* Protocol-specific tweaks to our crypto inputs */ +#define T_HSENC PROTOID ":hs_key_extract" +#define T_HSENC_LEN (sizeof(T_HSENC) - 1) +#define T_HSVERIFY PROTOID ":hs_verify" +#define T_HSMAC PROTOID ":hs_mac" +#define M_HSEXPAND PROTOID ":hs_key_expand" +#define M_HSEXPAND_LEN (sizeof(M_HSEXPAND) - 1) + +/************************* Helper functions: *******************************/ + +/** Helper macro: copy <b>len</b> bytes from <b>inp</b> to <b>ptr</b> and + *advance <b>ptr</b> by the number of bytes copied. Stolen from onion_ntor.c */ +#define APPEND(ptr, inp, len) \ + STMT_BEGIN { \ + memcpy(ptr, (inp), (len)); \ + ptr += len; \ + } STMT_END + +/* Length of EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID */ +#define REND_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN * 2 + \ + ED25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN) +/* Length of auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" */ +#define REND_AUTH_INPUT_LEN (DIGEST256_LEN + ED25519_PUBKEY_LEN + \ + CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN + SERVER_STR_LEN) + +/** Helper function: Compute the last part of the HS ntor handshake which + * derives key material necessary to create and handle RENDEZVOUS1 + * cells. Function used by both client and service. The actual calculations is + * as follows: + * + * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + * verify = MAC(rend_secret_hs_input, t_hsverify) + * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + * auth_input_mac = MAC(auth_input, t_hsmac) + * + * where in the above, AUTH_KEY is <b>intro_auth_pubkey</b>, B is + * <b>intro_enc_pubkey</b>, Y is <b>service_ephemeral_rend_pubkey</b>, and X + * is <b>client_ephemeral_enc_pubkey</b>. The provided + * <b>rend_secret_hs_input</b> is of size REND_SECRET_HS_INPUT_LEN. + * + * The final results of NTOR_KEY_SEED and auth_input_mac are placed in + * <b>hs_ntor_rend_cell_keys_out</b>. Return 0 if everything went fine. */ +static int +get_rendezvous1_key_material(const uint8_t *rend_secret_hs_input, + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) +{ + int bad = 0; + uint8_t ntor_key_seed[DIGEST256_LEN]; + uint8_t ntor_verify[DIGEST256_LEN]; + uint8_t rend_auth_input[REND_AUTH_INPUT_LEN]; + uint8_t rend_cell_auth[DIGEST256_LEN]; + uint8_t *ptr; + + /* Let's build NTOR_KEY_SEED */ + crypto_mac_sha3_256(ntor_key_seed, sizeof(ntor_key_seed), + rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN, + (const uint8_t *)T_HSENC, strlen(T_HSENC)); + bad |= safe_mem_is_zero(ntor_key_seed, DIGEST256_LEN); + + /* Let's build ntor_verify */ + crypto_mac_sha3_256(ntor_verify, sizeof(ntor_verify), + rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN, + (const uint8_t *)T_HSVERIFY, strlen(T_HSVERIFY)); + bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN); + + /* Let's build auth_input: */ + ptr = rend_auth_input; + /* Append ntor_verify */ + APPEND(ptr, ntor_verify, sizeof(ntor_verify)); + /* Append AUTH_KEY */ + APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); + /* Append B */ + APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append Y */ + APPEND(ptr, + service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append X */ + APPEND(ptr, + client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append PROTOID */ + APPEND(ptr, PROTOID, strlen(PROTOID)); + /* Append "Server" */ + APPEND(ptr, SERVER_STR, strlen(SERVER_STR)); + tor_assert(ptr == rend_auth_input + sizeof(rend_auth_input)); + + /* Let's build auth_input_mac that goes in RENDEZVOUS1 cell */ + crypto_mac_sha3_256(rend_cell_auth, sizeof(rend_cell_auth), + rend_auth_input, sizeof(rend_auth_input), + (const uint8_t *)T_HSMAC, strlen(T_HSMAC)); + bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN); + + { /* Get the computed RENDEZVOUS1 material! */ + memcpy(&hs_ntor_rend_cell_keys_out->rend_cell_auth_mac, + rend_cell_auth, DIGEST256_LEN); + memcpy(&hs_ntor_rend_cell_keys_out->ntor_key_seed, + ntor_key_seed, DIGEST256_LEN); + } + + memwipe(rend_cell_auth, 0, sizeof(rend_cell_auth)); + memwipe(rend_auth_input, 0, sizeof(rend_auth_input)); + memwipe(ntor_key_seed, 0, sizeof(ntor_key_seed)); + + return bad; +} + +/** Length of secret_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID */ +#define INTRO_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN +ED25519_PUBKEY_LEN +\ + CURVE25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN + PROTOID_LEN) +/* Length of info = m_hsexpand | subcredential */ +#define INFO_BLOB_LEN (M_HSEXPAND_LEN + DIGEST256_LEN) +/* Length of KDF input = intro_secret_hs_input | t_hsenc | info */ +#define KDF_INPUT_LEN (INTRO_SECRET_HS_INPUT_LEN + T_HSENC_LEN + INFO_BLOB_LEN) + +/** Helper function: Compute the part of the HS ntor handshake that generates + * key material for creating and handling INTRODUCE1 cells. Function used + * by both client and service. Specifically, calculate the following: + * + * info = m_hsexpand | subcredential + * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + * ENC_KEY = hs_keys[0:S_KEY_LEN] + * MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] + * + * where intro_secret_hs_input is <b>secret_input</b> (of size + * INTRO_SECRET_HS_INPUT_LEN), and <b>subcredential</b> is of size + * DIGEST256_LEN. + * + * If everything went well, fill <b>hs_ntor_intro_cell_keys_out</b> with the + * necessary key material, and return 0. */ +static void +get_introduce1_key_material(const uint8_t *secret_input, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) +{ + uint8_t keystream[CIPHER256_KEY_LEN + DIGEST256_LEN]; + uint8_t info_blob[INFO_BLOB_LEN]; + uint8_t kdf_input[KDF_INPUT_LEN]; + crypto_xof_t *xof; + uint8_t *ptr; + + /* Let's build info */ + ptr = info_blob; + APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND)); + APPEND(ptr, subcredential, DIGEST256_LEN); + tor_assert(ptr == info_blob + sizeof(info_blob)); + + /* Let's build the input to the KDF */ + ptr = kdf_input; + APPEND(ptr, secret_input, INTRO_SECRET_HS_INPUT_LEN); + APPEND(ptr, T_HSENC, strlen(T_HSENC)); + APPEND(ptr, info_blob, sizeof(info_blob)); + tor_assert(ptr == kdf_input + sizeof(kdf_input)); + + /* Now we need to run kdf_input over SHAKE-256 */ + xof = crypto_xof_new(); + crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input)); + crypto_xof_squeeze_bytes(xof, keystream, sizeof(keystream)) ; + crypto_xof_free(xof); + + { /* Get the keys */ + memcpy(&hs_ntor_intro_cell_keys_out->enc_key, keystream,CIPHER256_KEY_LEN); + memcpy(&hs_ntor_intro_cell_keys_out->mac_key, + keystream+CIPHER256_KEY_LEN, DIGEST256_LEN); + } + + memwipe(keystream, 0, sizeof(keystream)); + memwipe(kdf_input, 0, sizeof(kdf_input)); +} + +/** Helper function: Calculate the 'intro_secret_hs_input' element used by the + * HS ntor handshake and place it in <b>secret_input_out</b>. This function is + * used by both client and service code. + * + * For the client-side it looks like this: + * + * intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID + * + * whereas for the service-side it looks like this: + * + * intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID + * + * In this function, <b>dh_result</b> carries the EXP() result (and has size + * CURVE25519_OUTPUT_LEN) <b>intro_auth_pubkey</b> is AUTH_KEY, + * <b>client_ephemeral_enc_pubkey</b> is X, and <b>intro_enc_pubkey</b> is B. + */ +static void +get_intro_secret_hs_input(const uint8_t *dh_result, + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + uint8_t *secret_input_out) +{ + uint8_t *ptr; + + /* Append EXP() */ + ptr = secret_input_out; + APPEND(ptr, dh_result, CURVE25519_OUTPUT_LEN); + /* Append AUTH_KEY */ + APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); + /* Append X */ + APPEND(ptr, client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append B */ + APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append PROTOID */ + APPEND(ptr, PROTOID, strlen(PROTOID)); + tor_assert(ptr == secret_input_out + INTRO_SECRET_HS_INPUT_LEN); +} + +/** Calculate the 'rend_secret_hs_input' element used by the HS ntor handshake + * and place it in <b>rend_secret_hs_input_out</b>. This function is used by + * both client and service code. + * + * The computation on the client side is: + * rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID + * whereas on the service side it is: + * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID + * + * where: + * <b>dh_result1</b> and <b>dh_result2</b> carry the two EXP() results (of size + * CURVE25519_OUTPUT_LEN) + * <b>intro_auth_pubkey</b> is AUTH_KEY, + * <b>intro_enc_pubkey</b> is B, + * <b>client_ephemeral_enc_pubkey</b> is X, and + * <b>service_ephemeral_rend_pubkey</b> is Y. + */ +static void +get_rend_secret_hs_input(const uint8_t *dh_result1, const uint8_t *dh_result2, + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + uint8_t *rend_secret_hs_input_out) +{ + uint8_t *ptr; + + ptr = rend_secret_hs_input_out; + /* Append the first EXP() */ + APPEND(ptr, dh_result1, CURVE25519_OUTPUT_LEN); + /* Append the other EXP() */ + APPEND(ptr, dh_result2, CURVE25519_OUTPUT_LEN); + /* Append AUTH_KEY */ + APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); + /* Append B */ + APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append X */ + APPEND(ptr, + client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append Y */ + APPEND(ptr, + service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append PROTOID */ + APPEND(ptr, PROTOID, strlen(PROTOID)); + tor_assert(ptr == rend_secret_hs_input_out + REND_SECRET_HS_INPUT_LEN); +} + +/************************* Public functions: *******************************/ + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to encrypt and authenticate INTRODUCE1 cells. Return 0 and place the + * final key material in <b>hs_ntor_intro_cell_keys_out</b> if everything went + * well, otherwise return -1; + * + * The relevant calculations are as follows: + * + * intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID + * info = m_hsexpand | subcredential + * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + * ENC_KEY = hs_keys[0:S_KEY_LEN] + * MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (found in HS descriptor), + * <b>intro_enc_pubkey</b> is B (also found in HS descriptor), + * <b>client_ephemeral_enc_keypair</b> is freshly generated keypair (x,X) + * <b>subcredential</b> is the hidden service subcredential (of size + * DIGEST256_LEN). */ +int +hs_ntor_client_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) +{ + int bad = 0; + uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN]; + uint8_t dh_result[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(intro_enc_pubkey); + tor_assert(client_ephemeral_enc_keypair); + tor_assert(subcredential); + tor_assert(hs_ntor_intro_cell_keys_out); + + /* Calculate EXP(B,x) */ + curve25519_handshake(dh_result, + &client_ephemeral_enc_keypair->seckey, + intro_enc_pubkey); + bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN); + + /* Get intro_secret_hs_input */ + get_intro_secret_hs_input(dh_result, intro_auth_pubkey, + &client_ephemeral_enc_keypair->pubkey, + intro_enc_pubkey, secret_input); + bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN); + + /* Get ENC_KEY and MAC_KEY! */ + get_introduce1_key_material(secret_input, subcredential, + hs_ntor_intro_cell_keys_out); + + /* Cleanup */ + memwipe(secret_input, 0, sizeof(secret_input)); + if (bad) { + memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to verify RENDEZVOUS1 cells and encrypt further rendezvous + * traffic. Return 0 and place the final key material in + * <b>hs_ntor_rend_cell_keys_out</b> if everything went well, else return -1. + * + * The relevant calculations are as follows: + * + * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID + * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + * verify = MAC(rend_secret_hs_input, t_hsverify) + * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + * auth_input_mac = MAC(auth_input, t_hsmac) + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (found in HS descriptor), + * <b>client_ephemeral_enc_keypair</b> is freshly generated keypair (x,X) + * <b>intro_enc_pubkey</b> is B (also found in HS descriptor), + * <b>service_ephemeral_rend_pubkey</b> is Y (SERVER_PK in RENDEZVOUS1 cell) */ +int +hs_ntor_client_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) +{ + int bad = 0; + uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN]; + uint8_t dh_result1[CURVE25519_OUTPUT_LEN]; + uint8_t dh_result2[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(client_ephemeral_enc_keypair); + tor_assert(intro_enc_pubkey); + tor_assert(service_ephemeral_rend_pubkey); + tor_assert(hs_ntor_rend_cell_keys_out); + + /* Compute EXP(Y, x) */ + curve25519_handshake(dh_result1, + &client_ephemeral_enc_keypair->seckey, + service_ephemeral_rend_pubkey); + bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN); + + /* Compute EXP(B, x) */ + curve25519_handshake(dh_result2, + &client_ephemeral_enc_keypair->seckey, + intro_enc_pubkey); + bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN); + + /* Get rend_secret_hs_input */ + get_rend_secret_hs_input(dh_result1, dh_result2, + intro_auth_pubkey, intro_enc_pubkey, + &client_ephemeral_enc_keypair->pubkey, + service_ephemeral_rend_pubkey, + rend_secret_hs_input); + + /* Get NTOR_KEY_SEED and the auth_input MAC */ + bad |= get_rendezvous1_key_material(rend_secret_hs_input, + intro_auth_pubkey, + intro_enc_pubkey, + service_ephemeral_rend_pubkey, + &client_ephemeral_enc_keypair->pubkey, + hs_ntor_rend_cell_keys_out); + + memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input)); + if (bad) { + memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to decrypt and verify INTRODUCE1 cells. Return 0 and place the final + * key material in <b>hs_ntor_intro_cell_keys_out</b> if everything went well, + * otherwise return -1; + * + * The relevant calculations are as follows: + * + * intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID + * info = m_hsexpand | subcredential + * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + * HS_DEC_KEY = hs_keys[0:S_KEY_LEN] + * HS_MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (introduction point auth key), + * <b>intro_enc_keypair</b> is (b,B) (introduction point encryption keypair), + * <b>client_ephemeral_enc_pubkey</b> is X (CLIENT_PK in INTRODUCE2 cell), + * <b>subcredential</b> is the HS subcredential (of size DIGEST256_LEN) */ +int +hs_ntor_service_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) +{ + int bad = 0; + uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN]; + uint8_t dh_result[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(intro_enc_keypair); + tor_assert(client_ephemeral_enc_pubkey); + tor_assert(subcredential); + tor_assert(hs_ntor_intro_cell_keys_out); + + /* Compute EXP(X, b) */ + curve25519_handshake(dh_result, + &intro_enc_keypair->seckey, + client_ephemeral_enc_pubkey); + bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN); + + /* Get intro_secret_hs_input */ + get_intro_secret_hs_input(dh_result, intro_auth_pubkey, + client_ephemeral_enc_pubkey, + &intro_enc_keypair->pubkey, + secret_input); + bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN); + + /* Get ENC_KEY and MAC_KEY! */ + get_introduce1_key_material(secret_input, subcredential, + hs_ntor_intro_cell_keys_out); + + memwipe(secret_input, 0, sizeof(secret_input)); + if (bad) { + memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to create and authenticate RENDEZVOUS1 cells. Return 0 and place the + * final key material in <b>hs_ntor_rend_cell_keys_out</b> if all went fine, + * return -1 if error happened. + * + * The relevant calculations are as follows: + * + * rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID + * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + * verify = MAC(rend_secret_hs_input, t_hsverify) + * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + * auth_input_mac = MAC(auth_input, t_hsmac) + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (intro point auth key), + * <b>intro_enc_keypair</b> is (b,B) (intro point enc keypair) + * <b>service_ephemeral_rend_keypair</b> is a fresh (y,Y) keypair + * <b>client_ephemeral_enc_pubkey</b> is X (CLIENT_PK in INTRODUCE2 cell) */ +int +hs_ntor_service_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_keypair_t *service_ephemeral_rend_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) +{ + int bad = 0; + uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN]; + uint8_t dh_result1[CURVE25519_OUTPUT_LEN]; + uint8_t dh_result2[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(intro_enc_keypair); + tor_assert(service_ephemeral_rend_keypair); + tor_assert(client_ephemeral_enc_pubkey); + tor_assert(hs_ntor_rend_cell_keys_out); + + /* Compute EXP(X, y) */ + curve25519_handshake(dh_result1, + &service_ephemeral_rend_keypair->seckey, + client_ephemeral_enc_pubkey); + bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN); + + /* Compute EXP(X, b) */ + curve25519_handshake(dh_result2, + &intro_enc_keypair->seckey, + client_ephemeral_enc_pubkey); + bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN); + + /* Get rend_secret_hs_input */ + get_rend_secret_hs_input(dh_result1, dh_result2, + intro_auth_pubkey, + &intro_enc_keypair->pubkey, + client_ephemeral_enc_pubkey, + &service_ephemeral_rend_keypair->pubkey, + rend_secret_hs_input); + + /* Get NTOR_KEY_SEED and AUTH_INPUT_MAC! */ + bad |= get_rendezvous1_key_material(rend_secret_hs_input, + intro_auth_pubkey, + &intro_enc_keypair->pubkey, + &service_ephemeral_rend_keypair->pubkey, + client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_out); + + memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input)); + if (bad) { + memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/** Given a received RENDEZVOUS2 MAC in <b>mac</b> (of length DIGEST256_LEN), + * and the RENDEZVOUS1 key material in <b>hs_ntor_rend_cell_keys</b>, return 1 + * if the MAC is good, otherwise return 0. */ +int +hs_ntor_client_rendezvous2_mac_is_good( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys, + const uint8_t *rcvd_mac) +{ + tor_assert(rcvd_mac); + tor_assert(hs_ntor_rend_cell_keys); + + return tor_memeq(hs_ntor_rend_cell_keys->rend_cell_auth_mac, + rcvd_mac, DIGEST256_LEN); +} + +/* Input length to KDF for key expansion */ +#define NTOR_KEY_EXPANSION_KDF_INPUT_LEN (DIGEST256_LEN + M_HSEXPAND_LEN) +/* Output length of KDF for key expansion */ +#define NTOR_KEY_EXPANSION_KDF_OUTPUT_LEN (DIGEST256_LEN*3+CIPHER256_KEY_LEN*2) + +/** Given the rendezvous key material in <b>hs_ntor_rend_cell_keys</b>, do the + * circuit key expansion as specified by section '4.2.1. Key expansion' and + * return a hs_ntor_rend_circuit_keys_t structure with the computed keys. */ +hs_ntor_rend_circuit_keys_t * +hs_ntor_circuit_key_expansion( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys) +{ + uint8_t *ptr; + uint8_t kdf_input[NTOR_KEY_EXPANSION_KDF_INPUT_LEN]; + uint8_t keys[NTOR_KEY_EXPANSION_KDF_OUTPUT_LEN]; + crypto_xof_t *xof; + hs_ntor_rend_circuit_keys_t *rend_circuit_keys = NULL; + + /* Let's build the input to the KDF */ + ptr = kdf_input; + APPEND(ptr, hs_ntor_rend_cell_keys->ntor_key_seed, DIGEST256_LEN); + APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND)); + tor_assert(ptr == kdf_input + sizeof(kdf_input)); + + /* Generate the keys */ + xof = crypto_xof_new(); + crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input)); + crypto_xof_squeeze_bytes(xof, keys, sizeof(keys)); + crypto_xof_free(xof); + + /* Generate keys structure and assign keys to it */ + rend_circuit_keys = tor_malloc_zero(sizeof(hs_ntor_rend_circuit_keys_t)); + ptr = keys; + memcpy(rend_circuit_keys->KH, ptr, DIGEST256_LEN); + ptr += DIGEST256_LEN;; + memcpy(rend_circuit_keys->Df, ptr, DIGEST256_LEN); + ptr += DIGEST256_LEN; + memcpy(rend_circuit_keys->Db, ptr, DIGEST256_LEN); + ptr += DIGEST256_LEN; + memcpy(rend_circuit_keys->Kf, ptr, CIPHER256_KEY_LEN); + ptr += CIPHER256_KEY_LEN; + memcpy(rend_circuit_keys->Kb, ptr, CIPHER256_KEY_LEN); + ptr += CIPHER256_KEY_LEN; + tor_assert(ptr == keys + sizeof(keys)); + + return rend_circuit_keys; +} + diff --git a/src/or/hs_ntor.h b/src/or/hs_ntor.h new file mode 100644 index 0000000000..cd75f46a4c --- /dev/null +++ b/src/or/hs_ntor.h @@ -0,0 +1,77 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_HS_NTOR_H +#define TOR_HS_NTOR_H + +#include "or.h" + +/* Key material needed to encode/decode INTRODUCE1 cells */ +typedef struct { + /* Key used for encryption of encrypted INTRODUCE1 blob */ + uint8_t enc_key[CIPHER256_KEY_LEN]; + /* MAC key used to protect encrypted INTRODUCE1 blob */ + uint8_t mac_key[DIGEST256_LEN]; +} hs_ntor_intro_cell_keys_t; + +/* Key material needed to encode/decode RENDEZVOUS1 cells */ +typedef struct { + /* This is the MAC of the HANDSHAKE_INFO field */ + uint8_t rend_cell_auth_mac[DIGEST256_LEN]; + /* This is the key seed used to derive further rendezvous crypto keys as + * detailed in section 4.2.1 of rend-spec-ng.txt. */ + uint8_t ntor_key_seed[DIGEST256_LEN]; +} hs_ntor_rend_cell_keys_t; + +/* Key material resulting from key expansion as detailed in section "4.2.1. Key + * expansion" of rend-spec-ng.txt. */ +typedef struct { + /* Per-circuit key material used in ESTABLISH_INTRO cell */ + uint8_t KH[DIGEST256_LEN]; + /* Authentication key for outgoing RELAY cells */ + uint8_t Df[DIGEST256_LEN]; + /* Authentication key for incoming RELAY cells */ + uint8_t Db[DIGEST256_LEN]; + /* Encryption key for outgoing RELAY cells */ + uint8_t Kf[CIPHER256_KEY_LEN]; + /* Decryption key for incoming RELAY cells */ + uint8_t Kb[CIPHER256_KEY_LEN]; +} hs_ntor_rend_circuit_keys_t; + +int hs_ntor_client_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out); + +int hs_ntor_client_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out); + +int hs_ntor_service_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out); + +int hs_ntor_service_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_keypair_t *service_ephemeral_rend_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out); + +hs_ntor_rend_circuit_keys_t *hs_ntor_circuit_key_expansion( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys); + +int hs_ntor_client_rendezvous2_mac_is_good( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys, + const uint8_t *rcvd_mac); + +#endif + diff --git a/src/or/hs_service.c b/src/or/hs_service.c index 7b12b63065..205ef11c92 100644 --- a/src/or/hs_service.c +++ b/src/or/hs_service.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -6,14 +6,13 @@ * \brief Implement next generation hidden service functionality **/ -#define HS_SERVICE_PRIVATE - #include "or.h" #include "relay.h" #include "rendservice.h" #include "circuitlist.h" #include "circpathbias.h" +#include "hs_intropoint.h" #include "hs_service.h" #include "hs_common.h" @@ -22,16 +21,14 @@ /* XXX We don't currently use these functions, apart from generating unittest data. When we start implementing the service-side support for prop224 we - should revisit these functions and use them. For now we mark them as - unittest-only code: */ -#ifdef TOR_UNIT_TESTS + should revisit these functions and use them. */ /** Given an ESTABLISH_INTRO <b>cell</b>, encode it and place its payload in * <b>buf_out</b> which has size <b>buf_out_len</b>. Return the number of * bytes written, or a negative integer if there was an error. */ -STATIC ssize_t +ssize_t get_establish_intro_payload(uint8_t *buf_out, size_t buf_out_len, - const hs_cell_establish_intro_t *cell) + const trn_cell_establish_intro_t *cell) { ssize_t bytes_used = 0; @@ -39,31 +36,31 @@ get_establish_intro_payload(uint8_t *buf_out, size_t buf_out_len, return -1; } - bytes_used = hs_cell_establish_intro_encode(buf_out, buf_out_len, + bytes_used = trn_cell_establish_intro_encode(buf_out, buf_out_len, cell); return bytes_used; } /* Set the cell extensions of <b>cell</b>. */ static void -set_cell_extensions(hs_cell_establish_intro_t *cell) +set_trn_cell_extensions(trn_cell_establish_intro_t *cell) { - cell_extension_t *cell_extensions = cell_extension_new(); + trn_cell_extension_t *trn_cell_extensions = trn_cell_extension_new(); /* For now, we don't use extensions at all. */ - cell_extensions->num = 0; /* It's already zeroed, but be explicit. */ - hs_cell_establish_intro_set_extensions(cell, cell_extensions); + trn_cell_extensions->num = 0; /* It's already zeroed, but be explicit. */ + trn_cell_establish_intro_set_extensions(cell, trn_cell_extensions); } /** Given the circuit handshake info in <b>circuit_key_material</b>, create and * return an ESTABLISH_INTRO cell. Return NULL if something went wrong. The * returned cell is allocated on the heap and it's the responsibility of the * caller to free it. */ -STATIC hs_cell_establish_intro_t * +trn_cell_establish_intro_t * generate_establish_intro_cell(const uint8_t *circuit_key_material, size_t circuit_key_material_len) { - hs_cell_establish_intro_t *cell = NULL; + trn_cell_establish_intro_t *cell = NULL; ssize_t encoded_len; log_warn(LD_GENERAL, @@ -76,31 +73,32 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, goto err; } - cell = hs_cell_establish_intro_new(); + cell = trn_cell_establish_intro_new(); /* Set AUTH_KEY_TYPE: 2 means ed25519 */ - hs_cell_establish_intro_set_auth_key_type(cell, AUTH_KEY_ED25519); + trn_cell_establish_intro_set_auth_key_type(cell, + HS_INTRO_AUTH_KEY_TYPE_ED25519); /* Set AUTH_KEY_LEN field */ /* Must also set byte-length of AUTH_KEY to match */ int auth_key_len = ED25519_PUBKEY_LEN; - hs_cell_establish_intro_set_auth_key_len(cell, auth_key_len); - hs_cell_establish_intro_setlen_auth_key(cell, auth_key_len); + trn_cell_establish_intro_set_auth_key_len(cell, auth_key_len); + trn_cell_establish_intro_setlen_auth_key(cell, auth_key_len); /* Set AUTH_KEY field */ - uint8_t *auth_key_ptr = hs_cell_establish_intro_getarray_auth_key(cell); + uint8_t *auth_key_ptr = trn_cell_establish_intro_getarray_auth_key(cell); memcpy(auth_key_ptr, key_struct.pubkey.pubkey, auth_key_len); /* No cell extensions needed */ - set_cell_extensions(cell); + set_trn_cell_extensions(cell); /* Set signature size. We need to do this up here, because _encode() needs it and we need to call _encode() to calculate the MAC and signature. */ int sig_len = ED25519_SIG_LEN; - hs_cell_establish_intro_set_sig_len(cell, sig_len); - hs_cell_establish_intro_setlen_sig(cell, sig_len); + trn_cell_establish_intro_set_sig_len(cell, sig_len); + trn_cell_establish_intro_setlen_sig(cell, sig_len); /* XXX How to make this process easier and nicer? */ @@ -111,7 +109,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0}; uint8_t mac[TRUNNEL_SHA3_256_LEN]; - encoded_len = hs_cell_establish_intro_encode(cell_bytes_tmp, + encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp, sizeof(cell_bytes_tmp), cell); if (encoded_len < 0) { @@ -130,7 +128,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, (ED25519_SIG_LEN + 2 + TRUNNEL_SHA3_256_LEN)); /* Write the MAC to the cell */ uint8_t *handshake_ptr = - hs_cell_establish_intro_getarray_handshake_mac(cell); + trn_cell_establish_intro_getarray_handshake_mac(cell); memcpy(handshake_ptr, mac, sizeof(mac)); } @@ -141,7 +139,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0}; ed25519_signature_t sig; - encoded_len = hs_cell_establish_intro_encode(cell_bytes_tmp, + encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp, sizeof(cell_bytes_tmp), cell); if (encoded_len < 0) { @@ -162,7 +160,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, } /* And write the signature to the cell */ - uint8_t *sig_ptr = hs_cell_establish_intro_getarray_sig(cell); + uint8_t *sig_ptr = trn_cell_establish_intro_getarray_sig(cell); memcpy(sig_ptr, sig.sig, sig_len); } @@ -170,9 +168,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, return cell; err: - hs_cell_establish_intro_free(cell); + trn_cell_establish_intro_free(cell); return NULL; } -#endif /* TOR_UNIT_TESTS */ - diff --git a/src/or/hs_service.h b/src/or/hs_service.h index 994521fc50..3302592762 100644 --- a/src/or/hs_service.h +++ b/src/or/hs_service.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,21 +12,16 @@ #include "or.h" #include "hs/cell_establish_intro.h" -#ifdef HS_SERVICE_PRIVATE +/* These functions are only used by unit tests and we need to expose them else + * hs_service.o ends up with no symbols in libor.a which makes clang throw a + * warning at compile time. See #21825. */ -#ifdef TOR_UNIT_TESTS - -STATIC hs_cell_establish_intro_t * +trn_cell_establish_intro_t * generate_establish_intro_cell(const uint8_t *circuit_key_material, size_t circuit_key_material_len); - -STATIC ssize_t +ssize_t get_establish_intro_payload(uint8_t *buf, size_t buf_len, - const hs_cell_establish_intro_t *cell); - -#endif /* TOR_UNIT_TESTS */ - -#endif /* HS_SERVICE_PRIVATE */ + const trn_cell_establish_intro_t *cell); #endif /* TOR_HS_SERVICE_H */ diff --git a/src/or/include.am b/src/or/include.am index 4e54deca55..4c24dd23b3 100644 --- a/src/or/include.am +++ b/src/or/include.am @@ -36,6 +36,9 @@ LIBTOR_A_SOURCES = \ src/or/connection.c \ src/or/connection_edge.c \ src/or/connection_or.c \ + src/or/conscache.c \ + src/or/consdiff.c \ + src/or/consdiffmgr.c \ src/or/control.c \ src/or/cpuworker.c \ src/or/dircollate.c \ @@ -48,6 +51,7 @@ LIBTOR_A_SOURCES = \ src/or/geoip.c \ src/or/hs_intropoint.c \ src/or/hs_circuitmap.c \ + src/or/hs_ntor.c \ src/or/hs_service.c \ src/or/entrynodes.c \ src/or/ext_orport.c \ @@ -116,8 +120,10 @@ src_or_tor_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libev src_or_tor_LDADD = src/or/libtor.a src/common/libor.a src/common/libor-ctime.a \ src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event.a src/trunnel/libor-trunnel.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ if COVERAGE_ENABLED src_or_tor_cov_SOURCES = src/or/tor_main.c @@ -129,7 +135,8 @@ src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \ src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event-testing.a src/trunnel/libor-trunnel-testing.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ endif ORHEADERS = \ @@ -151,6 +158,9 @@ ORHEADERS = \ src/or/connection.h \ src/or/connection_edge.h \ src/or/connection_or.h \ + src/or/conscache.h \ + src/or/consdiff.h \ + src/or/consdiffmgr.h \ src/or/control.h \ src/or/cpuworker.h \ src/or/dircollate.h \ @@ -171,6 +181,7 @@ ORHEADERS = \ src/or/hs_descriptor.h \ src/or/hs_intropoint.h \ src/or/hs_circuitmap.h \ + src/or/hs_ntor.h \ src/or/hs_service.h \ src/or/keypin.h \ src/or/main.h \ diff --git a/src/or/keypin.c b/src/or/keypin.c index 2d4c4e92d2..1698dc184f 100644 --- a/src/or/keypin.c +++ b/src/or/keypin.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/keypin.h b/src/or/keypin.h index 673f24d9e3..2564f5befb 100644 --- a/src/or/keypin.h +++ b/src/or/keypin.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_KEYPIN_H diff --git a/src/or/main.c b/src/or/main.c index 5549f97998..0da43dc232 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -58,11 +58,13 @@ #include "circuitlist.h" #include "circuituse.h" #include "command.h" +#include "compress.h" #include "config.h" #include "confparse.h" #include "connection.h" #include "connection_edge.h" #include "connection_or.h" +#include "consdiffmgr.h" #include "control.h" #include "cpuworker.h" #include "crypto_s2k.h" @@ -104,7 +106,6 @@ #include "ext_orport.h" #ifdef USE_DMALLOC #include <dmalloc.h> -#include <openssl/crypto.h> #endif #include "memarea.h" #include "sandbox.h" @@ -1161,6 +1162,7 @@ static int periodic_events_initialized = 0; #define CALLBACK(name) \ static int name ## _callback(time_t, const or_options_t *) CALLBACK(rotate_onion_key); +CALLBACK(check_onion_keys_expiry_time); CALLBACK(check_ed_keys); CALLBACK(launch_descriptor_fetches); CALLBACK(rotate_x509_certificate); @@ -1184,6 +1186,7 @@ CALLBACK(check_dns_honesty); CALLBACK(write_bridge_ns); CALLBACK(check_fw_helper_app); CALLBACK(heartbeat); +CALLBACK(clean_consdiffmgr); #undef CALLBACK @@ -1192,6 +1195,7 @@ CALLBACK(heartbeat); static periodic_event_item_t periodic_events[] = { CALLBACK(rotate_onion_key), + CALLBACK(check_onion_keys_expiry_time), CALLBACK(check_ed_keys), CALLBACK(launch_descriptor_fetches), CALLBACK(rotate_x509_certificate), @@ -1215,6 +1219,7 @@ static periodic_event_item_t periodic_events[] = { CALLBACK(write_bridge_ns), CALLBACK(check_fw_helper_app), CALLBACK(heartbeat), + CALLBACK(clean_consdiffmgr), END_OF_PERIODIC_EVENTS }; #undef CALLBACK @@ -1470,19 +1475,26 @@ run_scheduled_events(time_t now) /* 11b. check pending unconfigured managed proxies */ if (!net_is_disabled() && pt_proxies_configuration_pending()) pt_configure_remaining_proxies(); + + /* 12. launch diff computations. (This is free if there are none to + * launch.) */ + if (server_mode(options)) { + consdiffmgr_rescan(); + } } -/* Periodic callback: Every MIN_ONION_KEY_LIFETIME seconds, rotate the onion - * keys, shut down and restart all cpuworkers, and update our descriptor if - * necessary. +/* Periodic callback: rotate the onion keys after the period defined by the + * "onion-key-rotation-days" consensus parameter, shut down and restart all + * cpuworkers, and update our descriptor if necessary. */ static int rotate_onion_key_callback(time_t now, const or_options_t *options) { if (server_mode(options)) { - time_t rotation_time = get_onion_key_set_at()+MIN_ONION_KEY_LIFETIME; + int onion_key_lifetime = get_onion_key_lifetime(); + time_t rotation_time = get_onion_key_set_at()+onion_key_lifetime; if (rotation_time > now) { - return safe_timer_diff(now, rotation_time); + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; } log_info(LD_GENERAL,"Rotating onion key."); @@ -1493,8 +1505,32 @@ rotate_onion_key_callback(time_t now, const or_options_t *options) } if (advertised_server_mode() && !options->DisableNetwork) router_upload_dir_desc_to_dirservers(0); - return MIN_ONION_KEY_LIFETIME; + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; + } + return PERIODIC_EVENT_NO_UPDATE; +} + +/* Period callback: Check if our old onion keys are still valid after the + * period of time defined by the consensus parameter + * "onion-key-grace-period-days", otherwise expire them by setting them to + * NULL. + */ +static int +check_onion_keys_expiry_time_callback(time_t now, const or_options_t *options) +{ + if (server_mode(options)) { + int onion_key_grace_period = get_onion_key_grace_period(); + time_t expiry_time = get_onion_key_set_at()+onion_key_grace_period; + if (expiry_time > now) { + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; + } + + log_info(LD_GENERAL, "Expiring old onion keys."); + expire_old_onion_keys(); + cpuworkers_rotate_keyinfo(); + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; } + return PERIODIC_EVENT_NO_UPDATE; } @@ -2008,6 +2044,17 @@ heartbeat_callback(time_t now, const or_options_t *options) return options->HeartbeatPeriod; } +#define CDM_CLEAN_CALLBACK_INTERVAL 600 +static int +clean_consdiffmgr_callback(time_t now, const or_options_t *options) +{ + (void)now; + if (server_mode(options)) { + consdiffmgr_cleanup(); + } + return CDM_CLEAN_CALLBACK_INTERVAL; +} + /** Timer: used to invoke second_elapsed_callback() once per second. */ static periodic_timer_t *second_timer = NULL; /** Number of libevent errors in the last second: we die if we get too many. */ @@ -2405,7 +2452,7 @@ do_main_loop(void) } /* Setup shared random protocol subsystem. */ - if (authdir_mode_publishes_statuses(get_options())) { + if (authdir_mode_v3(get_options())) { if (sr_init(1) < 0) { return -1; } @@ -2972,11 +3019,16 @@ tor_init(int argc, char *argv[]) const char *version = get_version(); log_notice(LD_GENERAL, "Tor %s running on %s with Libevent %s, " - "OpenSSL %s and Zlib %s.", version, + "OpenSSL %s, Zlib %s, Liblzma %s, and Libzstd %s.", version, get_uname(), tor_libevent_get_version_str(), crypto_openssl_get_version_str(), - tor_zlib_get_version_str()); + tor_compress_supports_method(ZLIB_METHOD) ? + tor_compress_version_str(ZLIB_METHOD) : "N/A", + tor_compress_supports_method(LZMA_METHOD) ? + tor_compress_version_str(LZMA_METHOD) : "N/A", + tor_compress_supports_method(ZSTD_METHOD) ? + tor_compress_version_str(ZSTD_METHOD) : "N/A"); log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! " "Learn how to be safe at " @@ -3130,6 +3182,7 @@ tor_free_all(int postfork) sandbox_free_getaddrinfo_cache(); protover_free_all(); bridges_free_all(); + consdiffmgr_free_all(); if (!postfork) { config_free_all(); or_state_free_all(); @@ -3159,6 +3212,7 @@ tor_free_all(int postfork) if (!postfork) { escaped(NULL); esc_router_info(NULL); + clean_up_backtrace_handler(); logs_free_all(); /* free log strings. do this last so logs keep working. */ } } @@ -3551,6 +3605,8 @@ sandbox_init_filter(void) OPEN_DATADIR("stats"); STAT_DATADIR("stats"); STAT_DATADIR2("stats", "dirreq-stats"); + + consdiffmgr_register_with_sandbox(&cfg); } init_addrinfo(); @@ -3583,14 +3639,15 @@ tor_main(int argc, char *argv[]) update_approx_time(time(NULL)); tor_threads_init(); + tor_compress_init(); init_logging(0); monotime_init(); #ifdef USE_DMALLOC { /* Instruct OpenSSL to use our internal wrappers for malloc, realloc and free. */ - int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); - tor_assert(r); + int r = crypto_use_tor_alloc_functions(); + tor_assert(r == 0); } #endif #ifdef NT_SERVICE diff --git a/src/or/main.h b/src/or/main.h index 07b22598b1..915d82b7ba 100644 --- a/src/or/main.h +++ b/src/or/main.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/microdesc.c b/src/or/microdesc.c index 140117f683..a4e6b409c4 100644 --- a/src/or/microdesc.c +++ b/src/or/microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Tor Project, Inc. */ +/* Copyright (c) 2009-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -804,18 +804,6 @@ microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d) return md; } -/** Return the mean size of decriptors added to <b>cache</b> since it was last - * cleared. Used to estimate the size of large downloads. */ -size_t -microdesc_average_size(microdesc_cache_t *cache) -{ - if (!cache) - cache = get_microdesc_cache(); - if (!cache->n_seen) - return 512; - return (size_t)(cache->total_len_seen / cache->n_seen); -} - /** Return a smartlist of all the sha256 digest of the microdescriptors that * are listed in <b>ns</b> but not present in <b>cache</b>. Returns pointers * to internals of <b>ns</b>; you should not free the members of the resulting diff --git a/src/or/microdesc.h b/src/or/microdesc.h index 40c83139e9..943873066e 100644 --- a/src/or/microdesc.h +++ b/src/or/microdesc.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,8 +32,6 @@ void microdesc_cache_clear(microdesc_cache_t *cache); microdesc_t *microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d); -size_t microdesc_average_size(microdesc_cache_t *cache); - smartlist_t *microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, int downloadable_only, diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c index 508cf6c5b6..188e7531f8 100644 --- a/src/or/networkstatus.c +++ b/src/or/networkstatus.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -46,6 +46,7 @@ #include "config.h" #include "connection.h" #include "connection_or.h" +#include "consdiffmgr.h" #include "control.h" #include "directory.h" #include "dirserv.h" @@ -1981,6 +1982,9 @@ networkstatus_set_current_consensus(const char *consensus, flavor, &c->digests, c->valid_after); + if (server_mode(get_options())) { + consdiffmgr_add_consensus(consensus, c); + } } if (!from_cache) { diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h index 66cd84c88e..8a9f5f0b09 100644 --- a/src/or/networkstatus.h +++ b/src/or/networkstatus.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/nodelist.c b/src/or/nodelist.c index 96e95baf5a..dc4d9a63e3 100644 --- a/src/or/nodelist.c +++ b/src/or/nodelist.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/nodelist.h b/src/or/nodelist.h index 8456d21c6c..b94a066913 100644 --- a/src/or/nodelist.h +++ b/src/or/nodelist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ntmain.c b/src/or/ntmain.c index 4c65805b32..e087bd6937 100644 --- a/src/or/ntmain.c +++ b/src/or/ntmain.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ntmain.h b/src/or/ntmain.h index 31bf38c62c..4b771b1828 100644 --- a/src/or/ntmain.h +++ b/src/or/ntmain.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion.c b/src/or/onion.c index 42b9ca4b18..a98b97cb1d 100644 --- a/src/or/onion.c +++ b/src/or/onion.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -238,7 +238,9 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin) onion_queue_entry_remove(head); log_info(LD_CIRC, "Circuit create request is too old; canceling due to overload."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); + if (! TO_CIRCUIT(circ)->marked_for_close) { + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); + } } return 0; } diff --git a/src/or/onion.h b/src/or/onion.h index 19e4a7c381..37a7b08cb6 100644 --- a/src/or/onion.h +++ b/src/or/onion.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_fast.c b/src/or/onion_fast.c index 8dcbfe22d8..146943a273 100644 --- a/src/or/onion_fast.c +++ b/src/or/onion_fast.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_fast.h b/src/or/onion_fast.h index b9626002c3..b31f8e9492 100644 --- a/src/or/onion_fast.h +++ b/src/or/onion_fast.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_ntor.c b/src/or/onion_ntor.c index ded97ee73d..902260b54b 100644 --- a/src/or/onion_ntor.c +++ b/src/or/onion_ntor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_ntor.h b/src/or/onion_ntor.h index f637b437fd..158c499de4 100644 --- a/src/or/onion_ntor.h +++ b/src/or/onion_ntor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ONION_NTOR_H diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c index 2769300945..294fc0df6d 100644 --- a/src/or/onion_tap.c +++ b/src/or/onion_tap.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -159,7 +159,7 @@ onion_skin_TAP_server_handshake( * big. That should be impossible. */ log_info(LD_GENERAL, "crypto_dh_get_public failed."); goto err; - /* LCOV_EXCP_STOP */ + /* LCOV_EXCL_STOP */ } key_material_len = DIGEST_LEN+key_out_len; diff --git a/src/or/onion_tap.h b/src/or/onion_tap.h index a2880f6e98..bd625231f4 100644 --- a/src/or/onion_tap.h +++ b/src/or/onion_tap.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/or.h b/src/or/or.h index a1a0bd4a20..e30a1d24c8 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -71,10 +71,11 @@ #include "tortls.h" #include "torlog.h" #include "container.h" -#include "torgzip.h" +#include "compress.h" #include "address.h" #include "compat_libevent.h" #include "ht.h" +#include "confline.h" #include "replaycache.h" #include "crypto_curve25519.h" #include "crypto_ed25519.h" @@ -147,8 +148,27 @@ /** Maximum size of a single extrainfo document, as above. */ #define MAX_EXTRAINFO_UPLOAD_SIZE 50000 -/** How often do we rotate onion keys? */ -#define MIN_ONION_KEY_LIFETIME (7*24*60*60) +/** Minimum lifetime for an onion key in days. */ +#define MIN_ONION_KEY_LIFETIME_DAYS (1) + +/** Maximum lifetime for an onion key in days. */ +#define MAX_ONION_KEY_LIFETIME_DAYS (90) + +/** Default lifetime for an onion key in days. */ +#define DEFAULT_ONION_KEY_LIFETIME_DAYS (28) + +/** Minimum grace period for acceptance of an onion key in days. + * The maximum value is defined in proposal #274 as being the current network + * consensus parameter for "onion-key-rotation-days". */ +#define MIN_ONION_KEY_GRACE_PERIOD_DAYS (1) + +/** Default grace period for acceptance of an onion key in days. */ +#define DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS (7) + +/** How often we should check the network consensus if it is time to rotate or + * expire onion keys. */ +#define ONION_KEY_CONSENSUS_CHECK_INTERVAL (60*60) + /** How often do we rotate TLS contexts? */ #define MAX_SSL_KEY_LIFETIME_INTERNAL (2*60*60) @@ -403,12 +423,13 @@ typedef enum { #define DIR_PURPOSE_FETCH_MICRODESC 19 #define DIR_PURPOSE_MAX_ 19 -/** True iff <b>p</b> is a purpose corresponding to uploading data to a - * directory server. */ +/** True iff <b>p</b> is a purpose corresponding to uploading + * data to a directory server. */ #define DIR_PURPOSE_IS_UPLOAD(p) \ ((p)==DIR_PURPOSE_UPLOAD_DIR || \ (p)==DIR_PURPOSE_UPLOAD_VOTE || \ - (p)==DIR_PURPOSE_UPLOAD_SIGNATURES) + (p)==DIR_PURPOSE_UPLOAD_SIGNATURES || \ + (p)==DIR_PURPOSE_UPLOAD_RENDDESC_V2) #define EXIT_PURPOSE_MIN_ 1 /** This exit stream wants to do an ordinary connect. */ @@ -1728,14 +1749,6 @@ typedef struct entry_connection_t { unsigned int is_socks_socket:1; } entry_connection_t; -typedef enum { - DIR_SPOOL_NONE=0, DIR_SPOOL_SERVER_BY_DIGEST, DIR_SPOOL_SERVER_BY_FP, - DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP, - DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS, - DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */ -} dir_spool_source_t; -#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t) - /** Subtype of connection_t for an "directory connection" -- that is, an HTTP * connection to retrieve or serve directory material. */ typedef struct dir_connection_t { @@ -1750,23 +1763,15 @@ typedef struct dir_connection_t { char *requested_resource; unsigned int dirconn_direct:1; /**< Is this dirconn direct, or via Tor? */ - /* Used only for server sides of some dir connections, to implement - * "spooling" of directory material to the outbuf. Otherwise, we'd have - * to append everything to the outbuf in one enormous chunk. */ - /** What exactly are we spooling right now? */ - dir_spool_source_bitfield_t dir_spool_src : 3; - /** If we're fetching descriptors, what router purpose shall we assign * to them? */ uint8_t router_purpose; - /** List of fingerprints for networkstatuses or descriptors to be spooled. */ - smartlist_t *fingerprint_stack; - /** A cached_dir_t object that we're currently spooling out */ - struct cached_dir_t *cached_dir; - /** The current offset into cached_dir. */ - off_t cached_dir_offset; - /** The zlib object doing on-the-fly compression for spooled data. */ - tor_zlib_state_t *zlib_state; + + /** List of spooled_resource_t for objects that we're spooling. We use + * it from back to front. */ + smartlist_t *spool; + /** The compression object doing on-the-fly compression for spooled data. */ + tor_compress_state_t *compress_state; /** What rendezvous service are we querying for? */ rend_data_t *rend_data; @@ -1782,6 +1787,14 @@ typedef struct dir_connection_t { * that's going away and being used on channels instead. The dirserver still * needs this for the incoming side, so it's moved here. */ uint64_t dirreq_id; + +#ifdef MEASUREMENTS_21206 + /** Number of RELAY_DATA cells received. */ + uint32_t data_cells_received; + + /** Number of RELAY_DATA cells sent. */ + uint32_t data_cells_sent; +#endif } dir_connection_t; /** Subtype of connection_t for an connection to a controller. */ @@ -2262,6 +2275,16 @@ typedef struct routerstatus_t { * ed25519 identity keys on a link handshake. */ unsigned int supports_ed25519_link_handshake:1; + /** True iff this router has a protocol list that allows it to be an + * introduction point supporting ed25519 authentication key which is part of + * the v3 protocol detailed in proposal 224. This requires HSIntro=4. */ + unsigned int supports_ed25519_hs_intro : 1; + + /** True iff this router has a protocol list that allows it to be an hidden + * service directory supporting version 3 as seen in proposal 224. This + * requires HSDir=2. */ + unsigned int supports_v3_hsdir : 1; + unsigned int has_bandwidth:1; /**< The vote/consensus had bw info */ unsigned int has_exitsummary:1; /**< The vote/consensus had exit summaries */ unsigned int bw_is_unmeasured:1; /**< This is a consensus entry, with @@ -3048,6 +3071,13 @@ typedef struct circuit_t { * circuit's queues; used only if CELL_STATS events are enabled and * cleared after being sent to control port. */ smartlist_t *testing_cell_stats; + + /** If set, points to an HS token that this circuit might be carrying. + * Used by the HS circuitmap. */ + hs_token_t *hs_token; + /** Hashtable node: used to look up the circuit by its HS token using the HS + circuitmap. */ + HT_ENTRY(circuit_t) hs_circuitmap_node; } circuit_t; /** Largest number of relay_early cells that we can send on a given @@ -3357,13 +3387,6 @@ typedef struct or_circuit_t { * is not marked for close. */ struct or_circuit_t *rend_splice; - /** If set, points to an HS token that this circuit might be carrying. - * Used by the HS circuitmap. */ - hs_token_t *hs_token; - /** Hashtable node: used to look up the circuit by its HS token using the HS - circuitmap. */ - HT_ENTRY(or_circuit_t) hs_circuitmap_node; - /** Stores KH for the handshake. */ char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */ @@ -3514,27 +3537,6 @@ typedef struct port_cfg_t { char unix_addr[FLEXIBLE_ARRAY_MEMBER]; } port_cfg_t; -/** Ordinary configuration line. */ -#define CONFIG_LINE_NORMAL 0 -/** Appends to previous configuration for the same option, even if we - * would ordinary replace it. */ -#define CONFIG_LINE_APPEND 1 -/* Removes all previous configuration for an option. */ -#define CONFIG_LINE_CLEAR 2 - -/** A linked list of lines in a config file. */ -typedef struct config_line_t { - char *key; - char *value; - struct config_line_t *next; - /** What special treatment (if any) does this line require? */ - unsigned int command:2; - /** If true, subsequent assignments to this linelist should replace - * it, not extend it. Set only on the first item in a linelist in an - * or_options_t. */ - unsigned int fragile:1; -} config_line_t; - typedef struct routerset_t routerset_t; /** A magic value for the (Socks|OR|...)Port options below, telling Tor @@ -5298,7 +5300,8 @@ typedef struct dir_server_t { * address information from published? */ routerstatus_t fake_status; /**< Used when we need to pass this trusted - * dir_server_t to directory_initiate_command_* + * dir_server_t to + * directory_request_set_routerstatus. * as a routerstatus_t. Not updated by the * router-status management code! **/ diff --git a/src/or/parsecommon.c b/src/or/parsecommon.c index ec2cec69f7..7959867875 100644 --- a/src/or/parsecommon.c +++ b/src/or/parsecommon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/parsecommon.h b/src/or/parsecommon.h index 15e9f7ae85..f4974a9683 100644 --- a/src/or/parsecommon.h +++ b/src/or/parsecommon.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -157,12 +157,16 @@ typedef enum { R3_SUPERENCRYPTED, R3_SIGNATURE, R3_CREATE2_FORMATS, - R3_AUTHENTICATION_REQUIRED, + R3_INTRO_AUTH_REQUIRED, R3_SINGLE_ONION_SERVICE, R3_INTRODUCTION_POINT, R3_INTRO_AUTH_KEY, R3_INTRO_ENC_KEY, R3_INTRO_ENC_KEY_CERTIFICATION, + R3_DESC_AUTH_TYPE, + R3_DESC_AUTH_KEY, + R3_DESC_AUTH_CLIENT, + R3_ENCRYPTED, R_IPO_IDENTIFIER, R_IPO_IP_ADDRESS, diff --git a/src/or/periodic.c b/src/or/periodic.c index d02d4a7bbb..6896b41c86 100644 --- a/src/or/periodic.c +++ b/src/or/periodic.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/periodic.h b/src/or/periodic.h index 021bb4ef5c..88d00cc7e9 100644 --- a/src/or/periodic.h +++ b/src/or/periodic.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_PERIODIC_H diff --git a/src/or/policies.c b/src/or/policies.c index 2aa6373f3e..3d49a6110c 100644 --- a/src/or/policies.c +++ b/src/or/policies.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/policies.h b/src/or/policies.h index f73f850c21..ce08d497e9 100644 --- a/src/or/policies.h +++ b/src/or/policies.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/protover.c b/src/or/protover.c index 88d549ab35..ee58927fc5 100644 --- a/src/or/protover.c +++ b/src/or/protover.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/protover.h b/src/or/protover.h index 5c658931ea..22667bed79 100644 --- a/src/or/protover.h +++ b/src/or/protover.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/reasons.c b/src/or/reasons.c index a1566e2299..e6c325f1b3 100644 --- a/src/or/reasons.c +++ b/src/or/reasons.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/reasons.h b/src/or/reasons.h index 2e12c93728..1cadf4e89e 100644 --- a/src/or/reasons.h +++ b/src/or/reasons.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/relay.c b/src/or/relay.c index 2e76a8ec36..1842012ed7 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -54,6 +54,7 @@ #include "circuitbuild.h" #include "circuitlist.h" #include "circuituse.h" +#include "compress.h" #include "config.h" #include "connection.h" #include "connection_edge.h" @@ -225,7 +226,8 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, return 0; if (relay_crypt(circ, cell, cell_direction, &layer_hint, &recognized) < 0) { - log_warn(LD_BUG,"relay crypt failed. Dropping connection."); + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "relay crypt failed. Dropping connection."); return -END_CIRC_REASON_INTERNAL; } @@ -257,8 +259,13 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, log_debug(LD_OR,"Sending to origin."); if ((reason = connection_edge_process_relay_cell(cell, circ, conn, layer_hint)) < 0) { - log_warn(LD_OR, - "connection_edge_process_relay_cell (at origin) failed."); + /* If a client is trying to connect to unknown hidden service port, + * END_CIRC_AT_ORIGIN is sent back so we can then close the circuit. + * Do not log warn as this is an expected behavior for a service. */ + if (reason != END_CIRC_AT_ORIGIN) { + log_warn(LD_OR, + "connection_edge_process_relay_cell (at origin) failed."); + } return reason; } } @@ -732,6 +739,16 @@ connection_edge_send_command(edge_connection_t *fromconn, return -1; } +#ifdef MEASUREMENTS_21206 + /* Keep track of the number of RELAY_DATA cells sent for directory + * connections. */ + connection_t *linked_conn = TO_CONN(fromconn)->linked_conn; + + if (linked_conn && linked_conn->type == CONN_TYPE_DIR) { + ++(TO_DIR_CONN(linked_conn)->data_cells_sent); + } +#endif + return relay_send_command_from_edge(fromconn->stream_id, circ, relay_command, payload, payload_len, cpath_layer); @@ -1585,6 +1602,16 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection_write_to_buf((char*)(cell->payload + RELAY_HEADER_SIZE), rh.length, TO_CONN(conn)); +#ifdef MEASUREMENTS_21206 + /* Count number of RELAY_DATA cells received on a linked directory + * connection. */ + connection_t *linked_conn = TO_CONN(conn)->linked_conn; + + if (linked_conn && linked_conn->type == CONN_TYPE_DIR) { + ++(TO_DIR_CONN(linked_conn)->data_cells_received); + } +#endif + if (!optimistic_data) { /* Only send a SENDME if we're not getting optimistic data; otherwise * a SENDME could arrive before the CONNECTED. @@ -2428,7 +2455,7 @@ cell_queues_check_size(void) { size_t alloc = cell_queues_get_total_allocation(); alloc += buf_get_total_allocation(); - alloc += tor_zlib_get_total_allocation(); + alloc += tor_compress_get_total_allocation(); const size_t rend_cache_total = rend_cache_get_total_allocation(); alloc += rend_cache_total; if (alloc >= get_options()->MaxMemInQueues_low_threshold) { diff --git a/src/or/relay.h b/src/or/relay.h index 3acf3ee0e3..a160cd5551 100644 --- a/src/or/relay.h +++ b/src/or/relay.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcache.c b/src/or/rendcache.c index 12c23ea87c..11b60b36a1 100644 --- a/src/or/rendcache.c +++ b/src/or/rendcache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcache.h b/src/or/rendcache.h index 746f142fcc..1bd3be2243 100644 --- a/src/or/rendcache.h +++ b/src/or/rendcache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 06744ad795..9bc2d6289d 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -724,6 +724,9 @@ directory_get_from_hs_dir(const char *desc_id, hs_dir = pick_hsdir(desc_id, desc_id_base32); if (!hs_dir) { /* No suitable hs dir can be found, stop right now. */ + control_event_hs_descriptor_failed(rend_query, NULL, "QUERY_NO_HSDIR"); + control_event_hs_descriptor_content(rend_data_get_address(rend_query), + desc_id_base32, NULL, NULL); return 0; } } @@ -744,6 +747,9 @@ directory_get_from_hs_dir(const char *desc_id, REND_DESC_COOKIE_LEN, 0)<0) { log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); + control_event_hs_descriptor_failed(rend_query, hsdir_fp, "BAD_DESC"); + control_event_hs_descriptor_content(rend_data_get_address(rend_query), + desc_id_base32, hsdir_fp, NULL); return 0; } /* Remove == signs. */ @@ -756,13 +762,15 @@ directory_get_from_hs_dir(const char *desc_id, /* Send fetch request. (Pass query and possibly descriptor cookie so that * they can be written to the directory connection and be referred to when * the response arrives. */ - directory_initiate_command_routerstatus_rend(hs_dir, - DIR_PURPOSE_FETCH_RENDDESC_V2, - ROUTER_PURPOSE_GENERAL, - how_to_fetch, - desc_id_base32, - NULL, 0, 0, - rend_query, NULL); + directory_request_t *req = + directory_request_new(DIR_PURPOSE_FETCH_RENDDESC_V2); + directory_request_set_routerstatus(req, hs_dir); + directory_request_set_indirection(req, how_to_fetch); + directory_request_set_resource(req, desc_id_base32); + directory_request_set_rend_query(req, rend_query); + directory_initiate_request(req); + directory_request_free(req); + log_info(LD_REND, "Sending fetch request for v2 descriptor for " "service '%s' with descriptor ID '%s', auth type %d, " "and descriptor cookie '%s' to hidden service " diff --git a/src/or/rendclient.h b/src/or/rendclient.h index 164305a773..ff0f4084fd 100644 --- a/src/or/rendclient.h +++ b/src/or/rendclient.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index bc53762fb6..e1236bdd0f 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h index 942ace5761..94c2480d86 100644 --- a/src/or/rendcommon.h +++ b/src/or/rendcommon.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendmid.c b/src/or/rendmid.c index 57c8cfac92..23c3deddaa 100644 --- a/src/or/rendmid.c +++ b/src/or/rendmid.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -96,7 +96,8 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, /* Close any other intro circuits with the same pk. */ c = NULL; - while ((c = hs_circuitmap_get_intro_circ_v2((const uint8_t *)pk_digest))) { + while ((c = hs_circuitmap_get_intro_circ_v2_relay_side( + (const uint8_t *)pk_digest))) { log_info(LD_REND, "Replacing old circuit for service %s", safe_str(serviceid)); circuit_mark_for_close(TO_CIRCUIT(c), END_CIRC_REASON_FINISHED); @@ -111,7 +112,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, /* Now, set up this circuit. */ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); - hs_circuitmap_register_intro_circ_v2(circ, (uint8_t *)pk_digest); + hs_circuitmap_register_intro_circ_v2_relay_side(circ, (uint8_t *)pk_digest); log_info(LD_REND, "Established introduction point on circuit %u for service %s", @@ -165,7 +166,8 @@ rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, /* The first 20 bytes are all we look at: they have a hash of the service's * PK. */ - intro_circ = hs_circuitmap_get_intro_circ_v2((const uint8_t*)request); + intro_circ = hs_circuitmap_get_intro_circ_v2_relay_side( + (const uint8_t*)request); if (!intro_circ) { log_info(LD_REND, "No intro circ found for INTRODUCE1 cell (%s) from circuit %u; " @@ -242,7 +244,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, goto err; } - if (hs_circuitmap_get_rend_circ(request)) { + if (hs_circuitmap_get_rend_circ_relay_side(request)) { log_warn(LD_PROTOCOL, "Duplicate rendezvous cookie in ESTABLISH_RENDEZVOUS."); goto err; @@ -258,7 +260,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, } circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_POINT_WAITING); - hs_circuitmap_register_rend_circ(circ, request); + hs_circuitmap_register_rend_circ_relay_side(circ, request); base16_encode(hexid,9,(char*)request,4); @@ -307,7 +309,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, "Got request for rendezvous from circuit %u to cookie %s.", (unsigned)circ->p_circ_id, hexid); - rend_circ = hs_circuitmap_get_rend_circ(request); + rend_circ = hs_circuitmap_get_rend_circ_relay_side(request); if (!rend_circ) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting RENDEZVOUS1 cell with unrecognized rendezvous cookie %s.", @@ -342,7 +344,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_ESTABLISHED); circuit_change_purpose(TO_CIRCUIT(rend_circ), CIRCUIT_PURPOSE_REND_ESTABLISHED); - hs_circuitmap_remove_circuit(circ); + hs_circuitmap_remove_circuit(TO_CIRCUIT(circ)); rend_circ->rend_splice = circ; circ->rend_splice = rend_circ; diff --git a/src/or/rendmid.h b/src/or/rendmid.h index 347d745853..daf9e2885e 100644 --- a/src/or/rendmid.h +++ b/src/or/rendmid.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 1d6fc0f96d..5de153caa4 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -76,13 +76,11 @@ static ssize_t rend_service_parse_intro_for_v3( static int rend_service_check_private_dir(const or_options_t *options, const rend_service_t *s, int create); -static int rend_service_check_private_dir_impl(const or_options_t *options, - const rend_service_t *s, - int create); static const smartlist_t* rend_get_service_list( const smartlist_t* substitute_service_list); static smartlist_t* rend_get_service_list_mutable( smartlist_t* substitute_service_list); +static int rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted); /** Represents the mapping from a virtual port of a rendezvous service to * a real port on some IP. @@ -100,26 +98,6 @@ struct rend_service_port_config_s { char unix_addr[FLEXIBLE_ARRAY_MEMBER]; }; -/** Try to maintain this many intro points per service by default. */ -#define NUM_INTRO_POINTS_DEFAULT 3 -/** Maximum number of intro points per service. */ -#define NUM_INTRO_POINTS_MAX 10 -/** Number of extra intro points we launch if our set of intro nodes is - * empty. See proposal 155, section 4. */ -#define NUM_INTRO_POINTS_EXTRA 2 - -/** If we can't build our intro circuits, don't retry for this long. */ -#define INTRO_CIRC_RETRY_PERIOD (60*5) -/** Don't try to build more than this many circuits before giving up - * for a while.*/ -#define MAX_INTRO_CIRCS_PER_PERIOD 10 -/** How many times will a hidden service operator attempt to connect to - * a requested rendezvous point before giving up? */ -#define MAX_REND_FAILURES 1 -/** How many seconds should we spend trying to connect to a requested - * rendezvous point before giving up? */ -#define MAX_REND_TIMEOUT 30 - /* Hidden service directory file names: * new file names should be added to rend_service_add_filenames_to_list() * for sandboxing purposes. */ @@ -128,9 +106,12 @@ static const char *hostname_fname = "hostname"; static const char *client_keys_fname = "client_keys"; static const char *sos_poison_fname = "onion_service_non_anonymous"; -/** A list of rend_service_t's for services run on this OP. - */ +/** A list of rend_service_t's for services run on this OP. */ static smartlist_t *rend_service_list = NULL; +/** A list of rend_service_t's for services run on this OP which is used as a + * staging area before they are put in the main list in order to prune dying + * service on config reload. */ +static smartlist_t *rend_service_staging_list = NULL; /* Like rend_get_service_list_mutable, but returns a read-only list. */ static const smartlist_t* @@ -542,18 +523,34 @@ rend_service_check_dir_and_add(smartlist_t *service_list, return rend_add_service(s_list, service); } -/* If this is a reload and there were hidden services configured before, - * keep the introduction points that are still needed and close the - * other ones. */ +/* Helper: Actual implementation of the pruning on reload which we've + * decoupled in order to make the unit test workeable without ugly hacks. + * Furthermore, this function does NOT free any memory but will nullify the + * temporary list pointer whatever happens. */ STATIC void -prune_services_on_reload(smartlist_t *old_service_list, - smartlist_t *new_service_list) +rend_service_prune_list_impl_(void) { origin_circuit_t *ocirc = NULL; - smartlist_t *surviving_services = NULL; + smartlist_t *surviving_services, *old_service_list, *new_service_list; - tor_assert(old_service_list); - tor_assert(new_service_list); + /* When pruning our current service list, we must have a staging list that + * contains what we want to check else it's a code flow error. */ + tor_assert(rend_service_staging_list); + + /* We are about to prune the current list of its dead service so set the + * semantic for that list to be the "old" one. */ + old_service_list = rend_service_list; + /* The staging list is now the "new" list so set this semantic. */ + new_service_list = rend_service_staging_list; + /* After this, whatever happens, we'll use our new list. */ + rend_service_list = new_service_list; + /* Finally, nullify the staging list pointer as we don't need it anymore + * and it needs to be NULL before the next reload. */ + rend_service_staging_list = NULL; + /* Nothing to prune if we have no service list so stop right away. */ + if (!old_service_list) { + return; + } /* This contains all _existing_ services that survives the relaod that is * that haven't been removed from the configuration. The difference between @@ -631,6 +628,27 @@ prune_services_on_reload(smartlist_t *old_service_list, smartlist_free(surviving_services); } +/* Try to prune our main service list using the temporary one that we just + * loaded and parsed successfully. The pruning process decides which onion + * services to keep and which to discard after a reload. */ +void +rend_service_prune_list(void) +{ + smartlist_t *old_service_list = rend_service_list; + /* Don't try to prune anything if we have no staging list. */ + if (!rend_service_staging_list) { + return; + } + rend_service_prune_list_impl_(); + if (old_service_list) { + /* Every remaining service in the old list have been removed from the + * configuration so clean them up safely. */ + SMARTLIST_FOREACH(old_service_list, rend_service_t *, s, + rend_service_free(s)); + smartlist_free(old_service_list); + } +} + /** Set up rend_service_list, based on the values of HiddenServiceDir and * HiddenServicePort in <b>options</b>. Return 0 on success and -1 on * failure. (If <b>validate_only</b> is set, parse, warn and return as @@ -642,22 +660,22 @@ rend_config_services(const or_options_t *options, int validate_only) config_line_t *line; rend_service_t *service = NULL; rend_service_port_config_t *portcfg; - smartlist_t *old_service_list = NULL; - smartlist_t *temp_service_list = NULL; int ok = 0; int rv = -1; - /* Use a temporary service list, so that we can check the new services' - * consistency with each other */ - temp_service_list = smartlist_new(); + /* Use the staging service list so that we can check then do the pruning + * process using the main list at the end. */ + if (rend_service_staging_list == NULL) { + rend_service_staging_list = smartlist_new(); + } for (line = options->RendConfigLines; line; line = line->next) { if (!strcasecmp(line->key, "HiddenServiceDir")) { /* register the service we just finished parsing * this code registers every service except the last one parsed, * which is registered below the loop */ - if (rend_service_check_dir_and_add(temp_service_list, options, service, - validate_only) < 0) { + if (rend_service_check_dir_and_add(rend_service_staging_list, options, + service, validate_only) < 0) { service = NULL; goto free_and_return; } @@ -857,8 +875,8 @@ rend_config_services(const or_options_t *options, int validate_only) /* register the final service after we have finished parsing all services * this code only registers the last service, other services are registered * within the loop. It is ok for this service to be NULL, it is ignored. */ - if (rend_service_check_dir_and_add(temp_service_list, options, service, - validate_only) < 0) { + if (rend_service_check_dir_and_add(rend_service_staging_list, options, + service, validate_only) < 0) { service = NULL; goto free_and_return; } @@ -870,31 +888,19 @@ rend_config_services(const or_options_t *options, int validate_only) goto free_and_return; } - /* Otherwise, use the newly added services as the new service list - * Since we have now replaced the global service list, from this point on we - * must succeed, or die trying. */ - old_service_list = rend_service_list; - rend_service_list = temp_service_list; - temp_service_list = NULL; - - /* If this is a reload and there were hidden services configured before, - * keep the introduction points that are still needed and close the - * other ones. */ - if (old_service_list && !validate_only) { - prune_services_on_reload(old_service_list, rend_service_list); - /* Every remaining service in the old list have been removed from the - * configuration so clean them up safely. */ - SMARTLIST_FOREACH(old_service_list, rend_service_t *, s, - rend_service_free(s)); - smartlist_free(old_service_list); - } + /* This could be a reload of configuration so try to prune the main list + * using the staging one. And we know we are not in validate mode here. + * After this, the main and staging list will point to the right place and + * be in a quiescent usable state. */ + rend_service_prune_list(); return 0; free_and_return: rend_service_free(service); - SMARTLIST_FOREACH(temp_service_list, rend_service_t *, ptr, + SMARTLIST_FOREACH(rend_service_staging_list, rend_service_t *, ptr, rend_service_free(ptr)); - smartlist_free(temp_service_list); + smartlist_free(rend_service_staging_list); + rend_service_staging_list = NULL; return rv; } @@ -1028,6 +1034,38 @@ rend_service_del_ephemeral(const char *service_id) return 0; } +/* There can be 1 second's delay due to second_elapsed_callback, and perhaps + * another few seconds due to blocking calls. */ +#define INTRO_CIRC_RETRY_PERIOD_SLOP 10 + +/** Log information about the intro point creation rate and current intro + * points for service, upgrading the log level from min_severity to warn if + * we have stopped launching new intro point circuits. */ +static void +rend_log_intro_limit(const rend_service_t *service, int min_severity) +{ + int exceeded_limit = (service->n_intro_circuits_launched >= + rend_max_intro_circs_per_period( + service->n_intro_points_wanted)); + int severity = min_severity; + /* We stopped creating circuits */ + if (exceeded_limit) { + severity = LOG_WARN; + } + time_t intro_period_elapsed = time(NULL) - service->intro_period_started; + tor_assert_nonfatal(intro_period_elapsed >= 0); + log_fn(severity, LD_REND, "Hidden service %s %s %d intro points in the last " + "%d seconds. Intro circuit launches are limited to %d per %d " + "seconds.", + service->service_id, + exceeded_limit ? "exceeded launch limit with" : "launched", + service->n_intro_circuits_launched, + (int)intro_period_elapsed, + rend_max_intro_circs_per_period(service->n_intro_points_wanted), + INTRO_CIRC_RETRY_PERIOD); + rend_service_dump_stats(severity); +} + /** Replace the old value of <b>service</b>-\>desc with one that reflects * the other fields in service. */ @@ -1035,7 +1073,6 @@ static void rend_service_update_descriptor(rend_service_t *service) { rend_service_descriptor_t *d; - origin_circuit_t *circ; int i; rend_service_descriptor_free(service->desc); @@ -1056,9 +1093,10 @@ rend_service_update_descriptor(rend_service_t *service) /* This intro point won't be listed in the descriptor... */ intro_svc->listed_in_last_desc = 0; - circ = find_intro_circuit(intro_svc, service->pk_digest); - if (!circ || circ->base_.purpose != CIRCUIT_PURPOSE_S_INTRO) { - /* This intro point's circuit isn't finished yet. Don't list it. */ + /* circuit_established is set in rend_service_intro_established(), and + * checked every second in rend_consider_services_intro_points(), so it's + * safe to use it here */ + if (!intro_svc->circuit_established) { continue; } @@ -1080,6 +1118,26 @@ rend_service_update_descriptor(rend_service_t *service) intro_svc->time_published = time(NULL); } } + + /* Check that we have the right number of intro points */ + unsigned int have_intro = (unsigned int)smartlist_len(d->intro_nodes); + if (have_intro != service->n_intro_points_wanted) { + int severity; + /* Getting less than we wanted or more than we're allowed is serious */ + if (have_intro < service->n_intro_points_wanted || + have_intro > NUM_INTRO_POINTS_MAX) { + severity = LOG_WARN; + } else { + /* Getting more than we wanted is weird, but less of a problem */ + severity = LOG_NOTICE; + } + log_fn(severity, LD_REND, "Hidden service %s wanted %d intro points, but " + "descriptor was updated with %d instead.", + service->service_id, + service->n_intro_points_wanted, have_intro); + /* Now log an informative message about how we might have got here. */ + rend_log_intro_limit(service, severity); + } } /* Allocate and return a string containing the path to file_name in @@ -1237,7 +1295,8 @@ poison_new_single_onion_hidden_service_dir_impl(const rend_service_t *service, } /* Make sure the directory was created before calling this function. */ - if (BUG(rend_service_check_private_dir_impl(options, service, 0) < 0)) + if (BUG(hs_check_service_private_dir(options->User, service->directory, + service->dir_group_readable, 0) < 0)) return -1; poison_fname = rend_service_sos_poison_path(service); @@ -1387,32 +1446,6 @@ rend_service_derive_key_digests(struct rend_service_t *s) return 0; } -/* Implements the directory check from rend_service_check_private_dir, - * without doing the single onion poison checks. */ -static int -rend_service_check_private_dir_impl(const or_options_t *options, - const rend_service_t *s, - int create) -{ - cpd_check_t check_opts = CPD_NONE; - if (create) { - check_opts |= CPD_CREATE; - } else { - check_opts |= CPD_CHECK_MODE_ONLY; - check_opts |= CPD_CHECK; - } - if (s->dir_group_readable) { - check_opts |= CPD_GROUP_READ; - } - /* Check/create directory */ - if (check_private_dir(s->directory, check_opts, options->User) < 0) { - log_warn(LD_REND, "Checking service directory %s failed.", s->directory); - return -1; - } - - return 0; -} - /** Make sure that the directory for <b>s</b> is private, using the config in * <b>options</b>. * If <b>create</b> is true: @@ -1433,7 +1466,8 @@ rend_service_check_private_dir(const or_options_t *options, } /* Check/create directory */ - if (rend_service_check_private_dir_impl(options, s, create) < 0) { + if (hs_check_service_private_dir(options->User, s->directory, + s->dir_group_readable, create) < 0) { return -1; } @@ -3174,8 +3208,9 @@ count_intro_point_circuits(const rend_service_t *service) of bytes written. On fail, return -1. */ STATIC ssize_t -encode_establish_intro_cell_legacy(char *cell_body_out, crypto_pk_t *intro_key, - char *rend_circ_nonce) +encode_establish_intro_cell_legacy(char *cell_body_out, + size_t cell_body_out_len, + crypto_pk_t *intro_key, char *rend_circ_nonce) { int retval = -1; int r; @@ -3202,7 +3237,7 @@ encode_establish_intro_cell_legacy(char *cell_body_out, crypto_pk_t *intro_key, len += 20; note_crypto_pk_op(REND_SERVER); r = crypto_pk_private_sign_digest(intro_key, cell_body_out+len, - sizeof(cell_body_out)-len, + cell_body_out_len - len, cell_body_out, len); if (r<0) { log_warn(LD_BUG, "Internal error: couldn't sign introduction request."); @@ -3313,8 +3348,9 @@ rend_service_intro_has_opened(origin_circuit_t *circuit) /* Send the ESTABLISH_INTRO cell */ { ssize_t len; - len = encode_establish_intro_cell_legacy(buf, circuit->intro_key, - circuit->cpath->prev->rend_circ_nonce); + len = encode_establish_intro_cell_legacy(buf, sizeof(buf), + circuit->intro_key, + circuit->cpath->prev->rend_circ_nonce); if (len < 0) { reason = END_CIRC_REASON_INTERNAL; goto err; @@ -3669,13 +3705,16 @@ directory_post_to_hs_dir(rend_service_descriptor_t *renddesc, * request. Lookup is made in rend_service_desc_has_uploaded(). */ rend_data = rend_data_client_create(service_id, desc->desc_id, NULL, REND_NO_AUTH); - directory_initiate_command_routerstatus_rend(hs_dir, - DIR_PURPOSE_UPLOAD_RENDDESC_V2, - ROUTER_PURPOSE_GENERAL, - DIRIND_ANONYMOUS, NULL, - desc->desc_str, - strlen(desc->desc_str), - 0, rend_data, NULL); + directory_request_t *req = + directory_request_new(DIR_PURPOSE_UPLOAD_RENDDESC_V2); + directory_request_set_routerstatus(req, hs_dir); + directory_request_set_indirection(req, DIRIND_ANONYMOUS); + directory_request_set_payload(req, + desc->desc_str, strlen(desc->desc_str)); + directory_request_set_rend_query(req, rend_data); + directory_initiate_request(req); + directory_request_free(req); + rend_data_free(rend_data); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc->desc_id, DIGEST_LEN); @@ -4015,6 +4054,18 @@ rend_service_desc_has_uploaded(const rend_data_t *rend_data) } SMARTLIST_FOREACH_END(intro); } +/** Don't try to build more than this many circuits before giving up + * for a while. Dynamically calculated based on the configured number of + * introduction points for the service, n_intro_points_wanted. */ +static int +rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted) +{ + /* Allow all but one of the initial connections to fail and be + * retried. (If all fail, we *want* to wait, because something is broken.) */ + tor_assert(n_intro_points_wanted <= NUM_INTRO_POINTS_MAX); + return (int)(2*n_intro_points_wanted + NUM_INTRO_POINTS_EXTRA); +} + /** For every service, check how many intro points it currently has, and: * - Invalidate introdution points based on specific criteria, see * remove_invalid_intro_points comments. @@ -4059,23 +4110,29 @@ rend_consider_services_intro_points(void) smartlist_clear(exclude_nodes); smartlist_clear(retry_nodes); + /* Cleanup the invalid intro points and save the node objects, if any, + * in the exclude_nodes and retry_nodes lists. */ + remove_invalid_intro_points(service, exclude_nodes, retry_nodes, now); + /* This retry period is important here so we don't stress circuit * creation. */ + if (now > service->intro_period_started + INTRO_CIRC_RETRY_PERIOD) { - /* One period has elapsed; we can try building circuits again. */ + /* One period has elapsed: + * - if we stopped, we can try building circuits again, + * - if we haven't, we reset the circuit creation counts. */ + rend_log_intro_limit(service, LOG_INFO); service->intro_period_started = now; service->n_intro_circuits_launched = 0; } else if (service->n_intro_circuits_launched >= - MAX_INTRO_CIRCS_PER_PERIOD) { + rend_max_intro_circs_per_period( + service->n_intro_points_wanted)) { /* We have failed too many times in this period; wait for the next - * one before we try again. */ + * one before we try to initiate any more connections. */ + rend_log_intro_limit(service, LOG_WARN); continue; } - /* Cleanup the invalid intro points and save the node objects, if apply, - * in the exclude_nodes and retry_nodes list. */ - remove_invalid_intro_points(service, exclude_nodes, retry_nodes, now); - /* Let's try to rebuild circuit on the nodes we want to retry on. */ SMARTLIST_FOREACH_BEGIN(retry_nodes, rend_intro_point_t *, intro) { r = rend_service_launch_establish_intro(service, intro); @@ -4518,3 +4575,19 @@ rend_service_non_anonymous_mode_enabled(const or_options_t *options) return options->HiddenServiceNonAnonymousMode ? 1 : 0; } +#ifdef TOR_UNIT_TESTS + +STATIC void +set_rend_service_list(smartlist_t *new_list) +{ + rend_service_list = new_list; +} + +STATIC void +set_rend_rend_service_staging_list(smartlist_t *new_list) +{ + rend_service_staging_list = new_list; +} + +#endif /* TOR_UNIT_TESTS */ + diff --git a/src/or/rendservice.h b/src/or/rendservice.h index 3bfac0bece..1583a6010b 100644 --- a/src/or/rendservice.h +++ b/src/or/rendservice.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -130,15 +130,22 @@ STATIC int rend_service_poison_new_single_onion_dir( const rend_service_t *s, const or_options_t* options); STATIC ssize_t encode_establish_intro_cell_legacy(char *cell_body_out, + size_t cell_body_out_len, crypto_pk_t *intro_key, char *rend_circ_nonce); -STATIC void prune_services_on_reload(smartlist_t *old_service_list, - smartlist_t *new_service_list); +#ifdef TOR_UNIT_TESTS -#endif +STATIC void set_rend_service_list(smartlist_t *new_list); +STATIC void set_rend_rend_service_staging_list(smartlist_t *new_list); +STATIC void rend_service_prune_list_impl_(void); + +#endif /* TOR_UNIT_TESTS */ + +#endif /* RENDSERVICE_PRIVATE */ int num_rend_services(void); int rend_config_services(const or_options_t *options, int validate_only); +void rend_service_prune_list(void); int rend_service_load_all_keys(const smartlist_t *service_list); void rend_services_add_filenames_to_lists(smartlist_t *open_lst, smartlist_t *stat_lst); diff --git a/src/or/rephist.c b/src/or/rephist.c index 8bcd7396aa..231130f13c 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rephist.h b/src/or/rephist.h index ff4810a56d..6dd88a3544 100644 --- a/src/or/rephist.h +++ b/src/or/rephist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/replaycache.c b/src/or/replaycache.c index 8290fa6964..3d42deb90a 100644 --- a/src/or/replaycache.c +++ b/src/or/replaycache.c @@ -1,4 +1,4 @@ - /* Copyright (c) 2012-2016, The Tor Project, Inc. */ + /* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/replaycache.h b/src/or/replaycache.h index 64a6caf5f5..0d637939a4 100644 --- a/src/or/replaycache.h +++ b/src/or/replaycache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/router.c b/src/or/router.c index e4fa72a283..2336a5d3df 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTER_PRIVATE @@ -148,6 +148,51 @@ dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last) tor_mutex_release(key_lock); } +/** Expire our old set of onion keys. This is done by setting + * last_curve25519_onion_key and lastonionkey to all zero's and NULL + * respectively. + * + * This function does not perform any grace period checks for the old onion + * keys. + */ +void +expire_old_onion_keys(void) +{ + char *fname = NULL; + + tor_mutex_acquire(key_lock); + + /* Free lastonionkey and set it to NULL. */ + if (lastonionkey) { + crypto_pk_free(lastonionkey); + lastonionkey = NULL; + } + + /* We zero out the keypair. See the tor_mem_is_zero() check made in + * construct_ntor_key_map() below. */ + memset(&last_curve25519_onion_key, 0, sizeof(last_curve25519_onion_key)); + + tor_mutex_release(key_lock); + + fname = get_datadir_fname2("keys", "secret_onion_key.old"); + if (file_status(fname) == FN_FILE) { + if (tor_unlink(fname) != 0) { + log_warn(LD_FS, "Couldn't unlink old onion key file %s: %s", + fname, strerror(errno)); + } + } + tor_free(fname); + + fname = get_datadir_fname2("keys", "secret_onion_key_ntor.old"); + if (file_status(fname) == FN_FILE) { + if (tor_unlink(fname) != 0) { + log_warn(LD_FS, "Couldn't unlink old ntor onion key file %s: %s", + fname, strerror(errno)); + } + } + tor_free(fname); +} + /** Return the current secret onion key for the ntor handshake. Must only * be called from the main thread. */ static const curve25519_keypair_t * @@ -683,6 +728,47 @@ v3_authority_check_key_expiry(void) last_warned = now; } +/** Get the lifetime of an onion key in days. This value is defined by the + * network consesus parameter "onion-key-rotation-days". Always returns a value + * between <b>MIN_ONION_KEY_LIFETIME_DAYS</b> and + * <b>MAX_ONION_KEY_LIFETIME_DAYS</b>. + */ +static int +get_onion_key_rotation_days_(void) +{ + return networkstatus_get_param(NULL, + "onion-key-rotation-days", + DEFAULT_ONION_KEY_LIFETIME_DAYS, + MIN_ONION_KEY_LIFETIME_DAYS, + MAX_ONION_KEY_LIFETIME_DAYS); +} + +/** Get the current lifetime of an onion key in seconds. This value is defined + * by the network consesus parameter "onion-key-rotation-days", but the value + * is converted to seconds. + */ +int +get_onion_key_lifetime(void) +{ + return get_onion_key_rotation_days_()*24*60*60; +} + +/** Get the grace period of an onion key in seconds. This value is defined by + * the network consesus parameter "onion-key-grace-period-days", but the value + * is converted to seconds. + */ +int +get_onion_key_grace_period(void) +{ + int grace_period; + grace_period = networkstatus_get_param(NULL, + "onion-key-grace-period-days", + DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS, + MIN_ONION_KEY_GRACE_PERIOD_DAYS, + get_onion_key_rotation_days_()); + return grace_period*24*60*60; +} + /** Set up Tor's TLS contexts, based on our configuration and keys. Return 0 * on success, and -1 on failure. */ int @@ -928,7 +1014,7 @@ init_keys(void) /* We have no LastRotatedOnionKey set; either we just created the key * or it's a holdover from 0.1.2.4-alpha-dev or earlier. In either case, * start the clock ticking now so that we will eventually rotate it even - * if we don't stay up for a full MIN_ONION_KEY_LIFETIME. */ + * if we don't stay up for the full lifetime of an onion key. */ state->LastRotatedOnionKey = onionkey_set_at = now; or_state_mark_dirty(state, options->AvoidDiskWrites ? time(NULL)+3600 : 0); @@ -1384,13 +1470,23 @@ consider_testing_reachability(int test_or, int test_dir) !connection_get_by_type_addr_port_purpose( CONN_TYPE_DIR, &addr, me->dir_port, DIR_PURPOSE_FETCH_SERVERDESC)) { + tor_addr_port_t my_orport, my_dirport; + memcpy(&my_orport.addr, &addr, sizeof(addr)); + memcpy(&my_dirport.addr, &addr, sizeof(addr)); + my_orport.port = me->or_port; + my_dirport.port = me->dir_port; /* ask myself, via tor, for my server descriptor. */ - directory_initiate_command(&addr, me->or_port, - &addr, me->dir_port, - me->cache_info.identity_digest, - DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_GENERAL, - DIRIND_ANON_DIRPORT, "authority.z", NULL, 0, 0); + directory_request_t *req = + directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); + directory_request_set_or_addr_port(req, &my_orport); + directory_request_set_dir_addr_port(req, &my_dirport); + directory_request_set_directory_id_digest(req, + me->cache_info.identity_digest); + // ask via an anon circuit, connecting to our dirport. + directory_request_set_indirection(req, DIRIND_ANON_DIRPORT); + directory_request_set_resource(req, "authority.z"); + directory_initiate_request(req); + directory_request_free(req); } } @@ -2760,7 +2856,7 @@ router_dump_router_to_string(routerinfo_t *router, make_ntor_onion_key_crosscert(ntor_keypair, &router->cache_info.signing_key_cert->signing_key, router->cache_info.published_on, - MIN_ONION_KEY_LIFETIME, &sign); + get_onion_key_lifetime(), &sign); if (!cert) { log_warn(LD_BUG,"make_ntor_onion_key_crosscert failed!"); goto err; diff --git a/src/or/router.h b/src/or/router.h index c30a0301b7..9c5def5218 100644 --- a/src/or/router.h +++ b/src/or/router.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -27,10 +27,13 @@ crypto_pk_t *get_my_v3_authority_signing_key(void); authority_cert_t *get_my_v3_legacy_cert(void); crypto_pk_t *get_my_v3_legacy_signing_key(void); void dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last); +void expire_old_onion_keys(void); void rotate_onion_key(void); crypto_pk_t *init_key_from_file(const char *fname, int generate, int severity, int log_greeting); void v3_authority_check_key_expiry(void); +int get_onion_key_lifetime(void); +int get_onion_key_grace_period(void); di_digest256_map_t *construct_ntor_key_map(void); void ntor_key_map_free(di_digest256_map_t *map); diff --git a/src/or/routerkeys.c b/src/or/routerkeys.c index 6259e3f5a0..01f5e98bd1 100644 --- a/src/or/routerkeys.c +++ b/src/or/routerkeys.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/routerkeys.h b/src/or/routerkeys.h index d2027f4bbe..6453c785b5 100644 --- a/src/or/routerkeys.h +++ b/src/or/routerkeys.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ROUTERKEYS_H diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 45b3838792..8927786fe8 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -947,6 +947,7 @@ authority_certs_fetch_resource_impl(const char *resource, const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP; + directory_request_t *req = NULL; /* If we've just downloaded a consensus from a bridge, re-use that * bridge */ if (options->UseBridges && node && node->ri && !get_via_tor) { @@ -955,23 +956,25 @@ authority_certs_fetch_resource_impl(const char *resource, /* we are willing to use a non-preferred address if we need to */ fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0, &or_ap); - directory_initiate_command(&or_ap.addr, or_ap.port, - NULL, 0, /*no dirport*/ - dir_hint, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, - indirection, - resource, NULL, 0, 0); - return; - } - if (rs) { - /* If we've just downloaded a consensus from a directory, re-use that + req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE); + directory_request_set_or_addr_port(req, &or_ap); + if (dir_hint) + directory_request_set_directory_id_digest(req, dir_hint); + } else if (rs) { + /* And if we've just downloaded a consensus from a directory, re-use that * directory */ - directory_initiate_command_routerstatus(rs, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, indirection, resource, NULL, - 0, 0, NULL); + req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE); + directory_request_set_routerstatus(req, rs); + } + + if (req) { + /* We've set up a request object -- fill in the other request fields, and + * send the request. */ + directory_request_set_indirection(req, indirection); + directory_request_set_resource(req, resource); + directory_initiate_request(req); + directory_request_free(req); return; } @@ -3045,8 +3048,8 @@ router_get_by_extrainfo_digest,(const char *digest)) /** Return the signed descriptor for the extrainfo_t in our routerlist whose * extra-info-digest is <b>digest</b>. Return NULL if no such extra-info * document is known. */ -signed_descriptor_t * -extrainfo_get_by_descriptor_digest(const char *digest) +MOCK_IMPL(signed_descriptor_t *, +extrainfo_get_by_descriptor_digest,(const char *digest)) { extrainfo_t *ei; tor_assert(digest); @@ -4932,10 +4935,11 @@ MOCK_IMPL(STATIC void, initiate_descriptor_downloads, if (source) { /* We know which authority or directory mirror we want. */ - directory_initiate_command_routerstatus(source, purpose, - ROUTER_PURPOSE_GENERAL, - DIRIND_ONEHOP, - resource, NULL, 0, 0, NULL); + directory_request_t *req = directory_request_new(purpose); + directory_request_set_routerstatus(req, source); + directory_request_set_resource(req, resource); + directory_initiate_request(req); + directory_request_free(req); } else { directory_get_from_dirserver(purpose, ROUTER_PURPOSE_GENERAL, resource, pds_flags, DL_WANT_ANY_DIRSERVER); diff --git a/src/or/routerlist.h b/src/or/routerlist.h index 8b68d69f28..5c1f76c8e7 100644 --- a/src/or/routerlist.h +++ b/src/or/routerlist.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -92,7 +92,8 @@ routerinfo_t *router_get_mutable_by_digest(const char *digest); signed_descriptor_t *router_get_by_descriptor_digest(const char *digest); MOCK_DECL(signed_descriptor_t *,router_get_by_extrainfo_digest, (const char *digest)); -signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest); +MOCK_DECL(signed_descriptor_t *,extrainfo_get_by_descriptor_digest, + (const char *digest)); const char *signed_descriptor_get_body(const signed_descriptor_t *desc); const char *signed_descriptor_get_annotations(const signed_descriptor_t *desc); routerlist_t *router_get_routerlist(void); diff --git a/src/or/routerparse.c b/src/or/routerparse.c index 98167d44f8..fc0a4ab50a 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -2030,6 +2030,9 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, * parse that's covered by the hash. */ int can_dl_again = 0; + if (BUG(s == NULL)) + return NULL; + if (!end) { end = s + strlen(s); } @@ -2664,6 +2667,10 @@ routerstatus_parse_entry_from_string(memarea_t *area, protocol_list_supports_protocol(tok->args[0], PRT_RELAY, 2); rs->supports_ed25519_link_handshake = protocol_list_supports_protocol(tok->args[0], PRT_LINKAUTH, 3); + rs->supports_ed25519_hs_intro = + protocol_list_supports_protocol(tok->args[0], PRT_HSINTRO, 4); + rs->supports_v3_hsdir = + protocol_list_supports_protocol(tok->args[0], PRT_HSDIR, 2); } if ((tok = find_opt_by_keyword(tokens, K_V))) { tor_assert(tok->n_args == 1); @@ -4894,6 +4901,8 @@ tor_version_parse(const char *s, tor_version_t *out) #define NUMBER(m) \ do { \ + if (!cp || *cp < '0' || *cp > '9') \ + return -1; \ out->m = (int)tor_parse_uint64(cp, 10, 0, INT32_MAX, &ok, &eos); \ if (!ok) \ return -1; \ diff --git a/src/or/routerparse.h b/src/or/routerparse.h index 648f29b0d3..e8d71b6dc9 100644 --- a/src/or/routerparse.h +++ b/src/or/routerparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/routerset.c b/src/or/routerset.c index d0df0a74e6..4906c6a51d 100644 --- a/src/or/routerset.c +++ b/src/or/routerset.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/routerset.h b/src/or/routerset.h index 2e3b4b0fe0..a63677b471 100644 --- a/src/or/routerset.h +++ b/src/or/routerset.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/scheduler.c b/src/or/scheduler.c index 033e6d119c..fac545fba7 100644 --- a/src/or/scheduler.c +++ b/src/or/scheduler.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/or/scheduler.h b/src/or/scheduler.h index 3dcfd2faca..e29c13de7e 100644 --- a/src/or/scheduler.h +++ b/src/or/scheduler.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/shared_random.c b/src/or/shared_random.c index f798a51a9f..25ca0611cd 100644 --- a/src/or/shared_random.c +++ b/src/or/shared_random.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -230,9 +230,7 @@ commit_decode(const char *encoded, sr_commit_t *commit) { int decoded_len = 0; size_t offset = 0; - /* XXX: Needs two extra bytes for the base64 decode calculation matches - * the binary length once decoded. #17868. */ - char b64_decoded[SR_COMMIT_LEN + 2]; + char b64_decoded[SR_COMMIT_LEN]; tor_assert(encoded); tor_assert(commit); @@ -284,9 +282,7 @@ STATIC int reveal_decode(const char *encoded, sr_commit_t *commit) { int decoded_len = 0; - /* XXX: Needs two extra bytes for the base64 decode calculation matches - * the binary length once decoded. #17868. */ - char b64_decoded[SR_REVEAL_LEN + 2]; + char b64_decoded[SR_REVEAL_LEN]; tor_assert(encoded); tor_assert(commit); diff --git a/src/or/shared_random.h b/src/or/shared_random.h index dbb8effeaa..1f027c70e0 100644 --- a/src/or/shared_random.h +++ b/src/or/shared_random.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_SHARED_RANDOM_H @@ -36,17 +36,14 @@ /* Length of base64 encoded commit NOT including the NUL terminated byte. * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ -#define SR_COMMIT_BASE64_LEN \ - (((SR_COMMIT_LEN - 1) / 3) * 4 + 4) +#define SR_COMMIT_BASE64_LEN (BASE64_LEN(SR_COMMIT_LEN)) /* Length of base64 encoded reveal NOT including the NUL terminated byte. * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ -#define SR_REVEAL_BASE64_LEN \ - (((SR_REVEAL_LEN - 1) / 3) * 4 + 4) +#define SR_REVEAL_BASE64_LEN (BASE64_LEN(SR_REVEAL_LEN)) /* Length of base64 encoded shared random value. It's 32 bytes long so 44 * bytes from the base64_encode_size formula. That includes the '=' * character at the end. */ -#define SR_SRV_VALUE_BASE64_LEN \ - (((DIGEST256_LEN - 1) / 3) * 4 + 4) +#define SR_SRV_VALUE_BASE64_LEN (BASE64_LEN(DIGEST256_LEN)) /* Assert if commit valid flag is not set. */ #define ASSERT_COMMIT_VALID(c) tor_assert((c)->valid) diff --git a/src/or/shared_random_state.c b/src/or/shared_random_state.c index 87db9031ee..89d2e8d7f6 100644 --- a/src/or/shared_random_state.c +++ b/src/or/shared_random_state.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/shared_random_state.h b/src/or/shared_random_state.h index 43a7f1d284..3526ad47d3 100644 --- a/src/or/shared_random_state.h +++ b/src/or/shared_random_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_SHARED_RANDOM_STATE_H diff --git a/src/or/statefile.c b/src/or/statefile.c index a95ba8533c..d0606b3012 100644 --- a/src/or/statefile.c +++ b/src/or/statefile.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/statefile.h b/src/or/statefile.h index b13743481d..10c09324bc 100644 --- a/src/or/statefile.h +++ b/src/or/statefile.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_STATEFILE_H diff --git a/src/or/status.c b/src/or/status.c index fce6a10157..f7be41e412 100644 --- a/src/or/status.c +++ b/src/or/status.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/status.h b/src/or/status.h index b97e835037..c1a0033ce0 100644 --- a/src/or/status.h +++ b/src/or/status.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_STATUS_H diff --git a/src/or/tor_main.c b/src/or/tor_main.c index d67eda2ac9..a3a8838602 100644 --- a/src/or/tor_main.c +++ b/src/or/tor_main.c @@ -1,6 +1,6 @@ /* Copyright 2001-2004 Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ extern const char tor_git_revision[]; diff --git a/src/or/torcert.c b/src/or/torcert.c index c58f3da2d3..ef9e78bfe7 100644 --- a/src/or/torcert.c +++ b/src/or/torcert.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/torcert.h b/src/or/torcert.h index 090f6b5811..51f7665f1e 100644 --- a/src/or/torcert.h +++ b/src/or/torcert.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TORCERT_H_INCLUDED diff --git a/src/or/transports.c b/src/or/transports.c index 535393b1a1..31849a8d15 100644 --- a/src/or/transports.c +++ b/src/or/transports.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/transports.h b/src/or/transports.h index 7de90dcbec..44a9626e50 100644 --- a/src/or/transports.h +++ b/src/or/transports.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/Makefile.nmake b/src/test/Makefile.nmake index 0ba56d7036..575198388b 100644 --- a/src/test/Makefile.nmake +++ b/src/test/Makefile.nmake @@ -12,7 +12,7 @@ LIBS = ..\..\..\build-alpha\lib\libevent.lib \ crypt32.lib gdi32.lib user32.lib TEST_OBJECTS = test.obj test_addr.obj test_channel.obj test_channeltls.obj \ - test_containers.obj \ + test_consdiff.obj test_containers.obj \ test_controller_events.obj test_crypto.obj test_data.obj test_dir.obj \ test_checkdir.obj test_microdesc.obj test_pt.obj test_util.obj \ test_config.obj test_connection.obj \ diff --git a/src/test/bench.c b/src/test/bench.c index 99bc686f30..a44dc94a61 100644 --- a/src/test/bench.c +++ b/src/test/bench.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ extern const char tor_git_revision[]; @@ -28,6 +28,7 @@ const char tor_git_revision[] = ""; #include "crypto_curve25519.h" #include "onion_ntor.h" #include "crypto_ed25519.h" +#include "consdiff.h" #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) static uint64_t nanostart; @@ -673,6 +674,28 @@ main(int argc, const char **argv) or_options_t *options; tor_threads_init(); + tor_compress_init(); + + if (argc == 4 && !strcmp(argv[1], "diff")) { + init_logging(1); + const int N = 200; + char *f1 = read_file_to_str(argv[2], RFTS_BIN, NULL); + char *f2 = read_file_to_str(argv[3], RFTS_BIN, NULL); + if (! f1 || ! f2) { + perror("X"); + return 1; + } + for (i = 0; i < N; ++i) { + char *diff = consensus_diff_generate(f1, f2); + tor_free(diff); + } + char *diff = consensus_diff_generate(f1, f2); + printf("%s", diff); + tor_free(f1); + tor_free(f2); + tor_free(diff); + return 0; + } for (i = 1; i < argc; ++i) { if (!strcmp(argv[i], "--list")) { diff --git a/src/test/bt_test.py b/src/test/bt_test.py index 30591453b9..4cb3326042 100755 --- a/src/test/bt_test.py +++ b/src/test/bt_test.py @@ -1,4 +1,4 @@ -# Copyright 2013-2015, The Tor Project, Inc +# Copyright 2013-2017, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/ed25519_exts_ref.py b/src/test/ed25519_exts_ref.py index d5a3a79910..af5010415e 100644 --- a/src/test/ed25519_exts_ref.py +++ b/src/test/ed25519_exts_ref.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2014-2015, The Tor Project, Inc +# Copyright 2014-2017, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/fakechans.h b/src/test/fakechans.h index fa0e37dbe6..c0de430e3d 100644 --- a/src/test/fakechans.h +++ b/src/test/fakechans.h @@ -1,4 +1,4 @@ - /* Copyright (c) 2014-2016, The Tor Project, Inc. */ + /* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_FAKECHANS_H diff --git a/src/test/fuzz/dict/http b/src/test/fuzz/dict/http index 1a7b61e8d4..3b0531579d 100644 --- a/src/test/fuzz/dict/http +++ b/src/test/fuzz/dict/http @@ -4,7 +4,7 @@ # # Extracted from directory_handle_command() in the tor source code # -# Copyright (c) 2016, The Tor Project, Inc. +# Copyright (c) 2016-2017, The Tor Project, Inc. # See LICENSE for licensing information # # Usage: diff --git a/src/test/fuzz/fuzz_consensus.c b/src/test/fuzz/fuzz_consensus.c index f5d22f69ae..6610ade7ad 100644 --- a/src/test/fuzz/fuzz_consensus.c +++ b/src/test/fuzz/fuzz_consensus.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_descriptor.c b/src/test/fuzz/fuzz_descriptor.c index d19386d77f..1a50beae17 100644 --- a/src/test/fuzz/fuzz_descriptor.c +++ b/src/test/fuzz/fuzz_descriptor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_diff.c b/src/test/fuzz/fuzz_diff.c new file mode 100644 index 0000000000..c241f63dc4 --- /dev/null +++ b/src/test/fuzz/fuzz_diff.c @@ -0,0 +1,67 @@ +/* Copyright (c) 2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "consdiff.h" + +#include "fuzzing.h" + +static int +mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) +{ + (void)c; + memset(d->sha3_256, 3, sizeof(d->sha3_256)); + return 0; +} + +int +fuzz_init(void) +{ + MOCK(consensus_compute_digest, mock_consensus_compute_digest_); + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(consensus_compute_digest); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ +#define SEP "=====\n" +#define SEPLEN strlen(SEP) + const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); + if (! separator) + return 0; + size_t c1_len = separator - stdin_buf; + char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); + size_t c2_len = data_size - c1_len - SEPLEN; + char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); + + char *c3 = consensus_diff_generate(c1, c2); + + if (c3) { + char *c4 = consensus_diff_apply(c1, c3); + tor_assert(c4); + if (strcmp(c2, c4)) { + printf("%s\n", escaped(c1)); + printf("%s\n", escaped(c2)); + printf("%s\n", escaped(c3)); + printf("%s\n", escaped(c4)); + } + tor_assert(! strcmp(c2, c4)); + tor_free(c3); + tor_free(c4); + } + tor_free(c1); + tor_free(c2); + + return 0; +} + diff --git a/src/test/fuzz/fuzz_diff_apply.c b/src/test/fuzz/fuzz_diff_apply.c new file mode 100644 index 0000000000..8d7bf751bf --- /dev/null +++ b/src/test/fuzz/fuzz_diff_apply.c @@ -0,0 +1,65 @@ +/* Copyright (c) 2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "consdiff.h" + +#include "fuzzing.h" + +static int +mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) +{ + (void)c; + memset(d->sha3_256, 3, sizeof(d->sha3_256)); + return 0; +} + +static int +mock_consensus_digest_eq_(const uint8_t *a, const uint8_t *b) +{ + (void)a; + (void)b; + return 1; +} + +int +fuzz_init(void) +{ + MOCK(consensus_compute_digest, mock_consensus_compute_digest_); + MOCK(consensus_digest_eq, mock_consensus_digest_eq_); + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(consensus_compute_digest); + UNMOCK(consensus_digest_eq); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ +#define SEP "=====\n" +#define SEPLEN strlen(SEP) + const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); + if (! separator) + return 0; + size_t c1_len = separator - stdin_buf; + char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); + size_t c2_len = data_size - c1_len - SEPLEN; + char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); + + char *c3 = consensus_diff_apply(c1, c2); + + tor_free(c1); + tor_free(c2); + tor_free(c3); + + return 0; +} + diff --git a/src/test/fuzz/fuzz_extrainfo.c b/src/test/fuzz/fuzz_extrainfo.c index 6251e606d0..2a3de7ecf7 100644 --- a/src/test/fuzz/fuzz_extrainfo.c +++ b/src/test/fuzz/fuzz_extrainfo.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_hsdescv2.c b/src/test/fuzz/fuzz_hsdescv2.c index 53b7cbe2f7..19db265716 100644 --- a/src/test/fuzz/fuzz_hsdescv2.c +++ b/src/test/fuzz/fuzz_hsdescv2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_http.c b/src/test/fuzz/fuzz_http.c index 01c3815f18..2ffeb60244 100644 --- a/src/test/fuzz/fuzz_http.c +++ b/src/test/fuzz/fuzz_http.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -18,10 +18,10 @@ static void mock_connection_write_to_buf_impl_(const char *string, size_t len, - connection_t *conn, int zlib) + connection_t *conn, int compressed) { log_debug(LD_GENERAL, "%sResponse:\n%u\nConnection: %p\n%s\n", - zlib ? "Compressed " : "", (unsigned)len, conn, string); + compressed ? "Compressed " : "", (unsigned)len, conn, string); } static int diff --git a/src/test/fuzz/fuzz_iptsv2.c b/src/test/fuzz/fuzz_iptsv2.c index 341d4880bd..4abde0c16d 100644 --- a/src/test/fuzz/fuzz_iptsv2.c +++ b/src/test/fuzz/fuzz_iptsv2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_microdesc.c b/src/test/fuzz/fuzz_microdesc.c index bb89546191..396115026e 100644 --- a/src/test/fuzz/fuzz_microdesc.c +++ b/src/test/fuzz/fuzz_microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_vrs.c b/src/test/fuzz/fuzz_vrs.c index 9301a9bcc8..baf0610a0b 100644 --- a/src/test/fuzz/fuzz_vrs.c +++ b/src/test/fuzz/fuzz_vrs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #define NETWORKSTATUS_PRIVATE diff --git a/src/test/fuzz/fuzzing.h b/src/test/fuzz/fuzzing.h index 4295743458..aecdbb4e52 100644 --- a/src/test/fuzz/fuzzing.h +++ b/src/test/fuzz/fuzzing.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef FUZZING_H #define FUZZING_H diff --git a/src/test/fuzz/fuzzing_common.c b/src/test/fuzz/fuzzing_common.c index e4920d3ee7..7aee92df63 100644 --- a/src/test/fuzz/fuzzing_common.c +++ b/src/test/fuzz/fuzzing_common.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CRYPTO_ED25519_PRIVATE #include "orconfig.h" @@ -96,6 +96,7 @@ static void global_init(void) { tor_threads_init(); + tor_compress_init(); { struct sipkey sipkey = { 1337, 7331 }; siphash_set_global_key(&sipkey); diff --git a/src/test/fuzz/include.am b/src/test/fuzz/include.am index 806710879b..500377f6d7 100644 --- a/src/test/fuzz/include.am +++ b/src/test/fuzz/include.am @@ -1,4 +1,5 @@ - +# This file was generated by fuzzing_include_am.py; do not hand-edit unless +# you enjoy having your changes erased. FUZZING_CPPFLAGS = \ $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) FUZZING_CFLAGS = \ @@ -17,7 +18,9 @@ FUZZING_LIBS = \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ @TOR_LIBEVENT_LIBS@ \ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ + @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ \ + @TOR_ZSTD_LIBS@ oss-fuzz-prereqs: \ src/or/libtor-testing.a \ @@ -32,6 +35,16 @@ oss-fuzz-prereqs: \ noinst_HEADERS += \ src/test/fuzz/fuzzing.h +LIBFUZZER = /home/nickm/build/libfuzz/libFuzzer.a +LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) +LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) +LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ + +LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) + +# ===== AFL fuzzers src_test_fuzz_fuzz_consensus_SOURCES = \ src/test/fuzz/fuzzing_common.c \ src/test/fuzz/fuzz_consensus.c @@ -48,13 +61,29 @@ src_test_fuzz_fuzz_descriptor_CFLAGS = $(FUZZING_CFLAGS) src_test_fuzz_fuzz_descriptor_LDFLAGS = $(FUZZING_LDFLAG) src_test_fuzz_fuzz_descriptor_LDADD = $(FUZZING_LIBS) -src_test_fuzz_fuzz_http_SOURCES = \ +src_test_fuzz_fuzz_diff_SOURCES = \ src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_http.c -src_test_fuzz_fuzz_http_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_http_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_http_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_http_LDADD = $(FUZZING_LIBS) + src/test/fuzz/fuzz_diff.c +src_test_fuzz_fuzz_diff_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_diff_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_diff_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_diff_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_diff_apply_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_diff_apply.c +src_test_fuzz_fuzz_diff_apply_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_diff_apply_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_diff_apply_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_diff_apply_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_extrainfo_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_extrainfo.c +src_test_fuzz_fuzz_extrainfo_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_extrainfo_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_extrainfo_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_extrainfo_LDADD = $(FUZZING_LIBS) src_test_fuzz_fuzz_hsdescv2_SOURCES = \ src/test/fuzz/fuzzing_common.c \ @@ -64,6 +93,14 @@ src_test_fuzz_fuzz_hsdescv2_CFLAGS = $(FUZZING_CFLAGS) src_test_fuzz_fuzz_hsdescv2_LDFLAGS = $(FUZZING_LDFLAG) src_test_fuzz_fuzz_hsdescv2_LDADD = $(FUZZING_LIBS) +src_test_fuzz_fuzz_http_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_http.c +src_test_fuzz_fuzz_http_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_http_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_http_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_http_LDADD = $(FUZZING_LIBS) + src_test_fuzz_fuzz_iptsv2_SOURCES = \ src/test/fuzz/fuzzing_common.c \ src/test/fuzz/fuzz_iptsv2.c @@ -72,14 +109,6 @@ src_test_fuzz_fuzz_iptsv2_CFLAGS = $(FUZZING_CFLAGS) src_test_fuzz_fuzz_iptsv2_LDFLAGS = $(FUZZING_LDFLAG) src_test_fuzz_fuzz_iptsv2_LDADD = $(FUZZING_LIBS) -src_test_fuzz_fuzz_extrainfo_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_extrainfo.c -src_test_fuzz_fuzz_extrainfo_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_extrainfo_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_extrainfo_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_extrainfo_LDADD = $(FUZZING_LIBS) - src_test_fuzz_fuzz_microdesc_SOURCES = \ src/test/fuzz/fuzzing_common.c \ src/test/fuzz/fuzz_microdesc.c @@ -99,19 +128,16 @@ src_test_fuzz_fuzz_vrs_LDADD = $(FUZZING_LIBS) FUZZERS = \ src/test/fuzz/fuzz-consensus \ src/test/fuzz/fuzz-descriptor \ + src/test/fuzz/fuzz-diff \ + src/test/fuzz/fuzz-diff-apply \ src/test/fuzz/fuzz-extrainfo \ - src/test/fuzz/fuzz-http \ src/test/fuzz/fuzz-hsdescv2 \ + src/test/fuzz/fuzz-http \ src/test/fuzz/fuzz-iptsv2 \ src/test/fuzz/fuzz-microdesc \ src/test/fuzz/fuzz-vrs - -LIBFUZZER = /home/nickm/build/libfuzz/libFuzzer.a -LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) -LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) -LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ +# ===== libfuzzer if LIBFUZZER_ENABLED src_test_fuzz_lf_fuzz_consensus_SOURCES = \ @@ -128,6 +154,20 @@ src_test_fuzz_lf_fuzz_descriptor_CFLAGS = $(LIBFUZZER_CFLAGS) src_test_fuzz_lf_fuzz_descriptor_LDFLAGS = $(LIBFUZZER_LDFLAG) src_test_fuzz_lf_fuzz_descriptor_LDADD = $(LIBFUZZER_LIBS) +src_test_fuzz_lf_fuzz_diff_SOURCES = \ + $(src_test_fuzz_fuzz_diff_SOURCES) +src_test_fuzz_lf_fuzz_diff_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_diff_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_diff_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_diff_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_diff_apply_SOURCES = \ + $(src_test_fuzz_fuzz_diff_apply_SOURCES) +src_test_fuzz_lf_fuzz_diff_apply_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_diff_apply_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_diff_apply_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_diff_apply_LDADD = $(LIBFUZZER_LIBS) + src_test_fuzz_lf_fuzz_extrainfo_SOURCES = \ $(src_test_fuzz_fuzz_extrainfo_SOURCES) src_test_fuzz_lf_fuzz_extrainfo_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) @@ -135,13 +175,6 @@ src_test_fuzz_lf_fuzz_extrainfo_CFLAGS = $(LIBFUZZER_CFLAGS) src_test_fuzz_lf_fuzz_extrainfo_LDFLAGS = $(LIBFUZZER_LDFLAG) src_test_fuzz_lf_fuzz_extrainfo_LDADD = $(LIBFUZZER_LIBS) -src_test_fuzz_lf_fuzz_http_SOURCES = \ - $(src_test_fuzz_fuzz_http_SOURCES) -src_test_fuzz_lf_fuzz_http_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_http_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_http_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_http_LDADD = $(LIBFUZZER_LIBS) - src_test_fuzz_lf_fuzz_hsdescv2_SOURCES = \ $(src_test_fuzz_fuzz_hsdescv2_SOURCES) src_test_fuzz_lf_fuzz_hsdescv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) @@ -149,6 +182,13 @@ src_test_fuzz_lf_fuzz_hsdescv2_CFLAGS = $(LIBFUZZER_CFLAGS) src_test_fuzz_lf_fuzz_hsdescv2_LDFLAGS = $(LIBFUZZER_LDFLAG) src_test_fuzz_lf_fuzz_hsdescv2_LDADD = $(LIBFUZZER_LIBS) +src_test_fuzz_lf_fuzz_http_SOURCES = \ + $(src_test_fuzz_fuzz_http_SOURCES) +src_test_fuzz_lf_fuzz_http_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_http_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_http_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_http_LDADD = $(LIBFUZZER_LIBS) + src_test_fuzz_lf_fuzz_iptsv2_SOURCES = \ $(src_test_fuzz_fuzz_iptsv2_SOURCES) src_test_fuzz_lf_fuzz_iptsv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) @@ -173,9 +213,11 @@ src_test_fuzz_lf_fuzz_vrs_LDADD = $(LIBFUZZER_LIBS) LIBFUZZER_FUZZERS = \ src/test/fuzz/lf-fuzz-consensus \ src/test/fuzz/lf-fuzz-descriptor \ + src/test/fuzz/lf-fuzz-diff \ + src/test/fuzz/lf-fuzz-diff-apply \ src/test/fuzz/lf-fuzz-extrainfo \ - src/test/fuzz/lf-fuzz-http \ src/test/fuzz/lf-fuzz-hsdescv2 \ + src/test/fuzz/lf-fuzz-http \ src/test/fuzz/lf-fuzz-iptsv2 \ src/test/fuzz/lf-fuzz-microdesc \ src/test/fuzz/lf-fuzz-vrs @@ -184,10 +226,9 @@ else LIBFUZZER_FUZZERS = endif -if OSS_FUZZ_ENABLED -LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) +# ===== oss-fuzz +if OSS_FUZZ_ENABLED src_test_fuzz_liboss_fuzz_consensus_a_SOURCES = \ $(src_test_fuzz_fuzz_consensus_SOURCES) src_test_fuzz_liboss_fuzz_consensus_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) @@ -198,21 +239,31 @@ src_test_fuzz_liboss_fuzz_descriptor_a_SOURCES = \ src_test_fuzz_liboss_fuzz_descriptor_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) src_test_fuzz_liboss_fuzz_descriptor_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) +src_test_fuzz_liboss_fuzz_diff_a_SOURCES = \ + $(src_test_fuzz_fuzz_diff_SOURCES) +src_test_fuzz_liboss_fuzz_diff_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_diff_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_diff_apply_a_SOURCES = \ + $(src_test_fuzz_fuzz_diff_apply_SOURCES) +src_test_fuzz_liboss_fuzz_diff_apply_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_diff_apply_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + src_test_fuzz_liboss_fuzz_extrainfo_a_SOURCES = \ $(src_test_fuzz_fuzz_extrainfo_SOURCES) src_test_fuzz_liboss_fuzz_extrainfo_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) src_test_fuzz_liboss_fuzz_extrainfo_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) -src_test_fuzz_liboss_fuzz_http_a_SOURCES = \ - $(src_test_fuzz_fuzz_http_SOURCES) -src_test_fuzz_liboss_fuzz_http_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_http_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - src_test_fuzz_liboss_fuzz_hsdescv2_a_SOURCES = \ $(src_test_fuzz_fuzz_hsdescv2_SOURCES) src_test_fuzz_liboss_fuzz_hsdescv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) src_test_fuzz_liboss_fuzz_hsdescv2_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) +src_test_fuzz_liboss_fuzz_http_a_SOURCES = \ + $(src_test_fuzz_fuzz_http_SOURCES) +src_test_fuzz_liboss_fuzz_http_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_http_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + src_test_fuzz_liboss_fuzz_iptsv2_a_SOURCES = \ $(src_test_fuzz_fuzz_iptsv2_SOURCES) src_test_fuzz_liboss_fuzz_iptsv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) @@ -231,12 +282,15 @@ src_test_fuzz_liboss_fuzz_vrs_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) OSS_FUZZ_FUZZERS = \ src/test/fuzz/liboss-fuzz-consensus.a \ src/test/fuzz/liboss-fuzz-descriptor.a \ + src/test/fuzz/liboss-fuzz-diff.a \ + src/test/fuzz/liboss-fuzz-diff-apply.a \ src/test/fuzz/liboss-fuzz-extrainfo.a \ - src/test/fuzz/liboss-fuzz-http.a \ src/test/fuzz/liboss-fuzz-hsdescv2.a \ + src/test/fuzz/liboss-fuzz-http.a \ src/test/fuzz/liboss-fuzz-iptsv2.a \ src/test/fuzz/liboss-fuzz-microdesc.a \ src/test/fuzz/liboss-fuzz-vrs.a + else OSS_FUZZ_FUZZERS = endif diff --git a/src/test/fuzz_static_testcases.sh b/src/test/fuzz_static_testcases.sh index bfe1677573..3cb45ad5e6 100755 --- a/src/test/fuzz_static_testcases.sh +++ b/src/test/fuzz_static_testcases.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright (c) 2016, The Tor Project, Inc. +# Copyright (c) 2016-2017, The Tor Project, Inc. # See LICENSE for licensing information set -e diff --git a/src/test/hs_ntor_ref.py b/src/test/hs_ntor_ref.py new file mode 100644 index 0000000000..813e797828 --- /dev/null +++ b/src/test/hs_ntor_ref.py @@ -0,0 +1,408 @@ +#!/usr/bin/python +# Copyright 2017, The Tor Project, Inc +# See LICENSE for licensing information + +""" +hs_ntor_ref.py + +This module is a reference implementation of the modified ntor protocol +proposed for Tor hidden services in proposal 224 (Next Generation Hidden +Services) in section [NTOR-WITH-EXTRA-DATA]. + +The modified ntor protocol is a single-round protocol, with three steps in total: + + 1: Client generates keys and sends them to service via INTRODUCE cell + + 2: Service computes key material based on client's keys, and sends its own + keys to client via RENDEZVOUS cell + + 3: Client computes key material as well. + +It's meant to be used to validate Tor's HS ntor implementation by conducting +various integration tests. Specifically it conducts the following three tests: + +- Tests our Python implementation by running the whole protocol in Python and + making sure that results are consistent. + +- Tests little-t-tor ntor implementation. We use this Python code to instrument + little-t-tor and carry out the handshake by using little-t-tor code. The + small C wrapper at src/test/test-hs-ntor-cl is used for this Python module to + interface with little-t-tor. + +- Cross-tests Python and little-t-tor implementation by running half of the + protocol in Python code and the other in little-t-tor. This is actually two + tests so that all parts of the protocol are run both by little-t-tor and + Python. + +It requires the curve25519 python module from the curve25519-donna package. + +The whole logic and concept for this test suite was taken from ntor_ref.py. + + *** DO NOT USE THIS IN PRODUCTION. *** +""" + +import struct +import os, sys +import binascii +import subprocess + +try: + import curve25519 + curve25519mod = curve25519.keys +except ImportError: + curve25519 = None + import slownacl_curve25519 + curve25519mod = slownacl_curve25519 + +try: + import sha3 +except ImportError: + # error code 77 tells automake to skip this test + sys.exit(77) + +# Import Nick's ntor reference implementation in Python +# We are gonna use a few of its utilities. +from ntor_ref import hash_nil +from ntor_ref import PrivateKey + +# String constants used in this protocol +PROTOID = "tor-hs-ntor-curve25519-sha3-256-1" +T_HSENC = PROTOID + ":hs_key_extract" +T_HSVERIFY = PROTOID + ":hs_verify" +T_HSMAC = PROTOID + ":hs_mac" +M_HSEXPAND = PROTOID + ":hs_key_expand" + +INTRO_SECRET_LEN = 161 +REND_SECRET_LEN = 225 +AUTH_INPUT_LEN = 199 + +# Implements MAC(k,m) = H(htonll(len(k)) | k | m) +def mac(k,m): + def htonll(num): + return struct.pack('!q', num) + + s = sha3.SHA3256() + s.update(htonll(len(k))) + s.update(k) + s.update(m) + return s.digest() + +###################################################################### + +# Functions that implement the modified HS ntor protocol + +"""As client compute key material for INTRODUCE cell as follows: + + intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID + info = m_hsexpand | subcredential + hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + ENC_KEY = hs_keys[0:S_KEY_LEN] + MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] +""" +def intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): + + dh_result = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) + secret = dh_result + intro_auth_pubkey_str + client_ephemeral_enc_pubkey.serialize() + intro_enc_pubkey.serialize() + PROTOID + assert(len(secret) == INTRO_SECRET_LEN) + info = M_HSEXPAND + subcredential + + kdf = sha3.SHAKE256() + kdf.update(secret + T_HSENC + info) + key_material = kdf.squeeze(64*8) + + enc_key = key_material[0:32] + mac_key = key_material[32:64] + + return enc_key, mac_key + +"""Wrapper over intro2_ntor_client()""" +def client_part1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): + enc_key, mac_key = intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) + assert(enc_key) + assert(mac_key) + + return enc_key, mac_key + +"""As service compute key material for INTRODUCE cell as follows: + + intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID + info = m_hsexpand | subcredential + hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + HS_DEC_KEY = hs_keys[0:S_KEY_LEN] + HS_MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] +""" +def intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, service_enc_privkey, service_enc_pubkey, subcredential): + dh_result = service_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) + secret = dh_result + intro_auth_pubkey_str + client_enc_pubkey.serialize() + service_enc_pubkey.serialize() + PROTOID + assert(len(secret) == INTRO_SECRET_LEN) + info = M_HSEXPAND + subcredential + + kdf = sha3.SHAKE256() + kdf.update(secret + T_HSENC + info) + key_material = kdf.squeeze(64*8) + + enc_key = key_material[0:32] + mac_key = key_material[32:64] + + return enc_key, mac_key + +"""As service compute key material for INTRODUCE and REDNEZVOUS cells. + + Use intro2_ntor_service() to calculate the INTRODUCE key material, and use + the following computations to do the RENDEZVOUS ones: + + rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID + NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + verify = MAC(rend_secret_hs_input, t_hsverify) + auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) +""" +def service_part1(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential): + intro_enc_key, intro_mac_key = intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + assert(intro_enc_key) + assert(intro_mac_key) + + service_ephemeral_privkey = PrivateKey() + service_ephemeral_pubkey = service_ephemeral_privkey.get_public() + + dh_result1 = service_ephemeral_privkey.get_shared_key(client_enc_pubkey, hash_nil) + dh_result2 = intro_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) + rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + PROTOID + assert(len(rend_secret_hs_input) == REND_SECRET_LEN) + + ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) + verify = mac(rend_secret_hs_input, T_HSVERIFY) + auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + client_enc_pubkey.serialize() + PROTOID + "Server" + assert(len(auth_input) == AUTH_INPUT_LEN) + auth_input_mac = mac(auth_input, T_HSMAC) + + assert(ntor_key_seed) + assert(auth_input_mac) + assert(service_ephemeral_pubkey) + + return intro_enc_key, intro_mac_key, ntor_key_seed, auth_input_mac, service_ephemeral_pubkey + +"""As client compute key material for rendezvous cells as follows: + + rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID + NTOR_KEY_SEED = MAC(ntor_secret_input, t_hsenc) + verify = MAC(ntor_secret_input, t_hsverify) + auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) +""" +def client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_rend_pubkey): + dh_result1 = client_ephemeral_enc_privkey.get_shared_key(service_ephemeral_rend_pubkey, hash_nil) + dh_result2 = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) + rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + PROTOID + assert(len(rend_secret_hs_input) == REND_SECRET_LEN) + + ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) + verify = mac(rend_secret_hs_input, T_HSVERIFY) + auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + PROTOID + "Server" + assert(len(auth_input) == AUTH_INPUT_LEN) + auth_input_mac = mac(auth_input, T_HSMAC) + + assert(ntor_key_seed) + assert(auth_input_mac) + + return ntor_key_seed, auth_input_mac + +################################################################################# + +""" +Utilities for communicating with the little-t-tor ntor wrapper to conduct the +integration tests +""" + +PROG = b"./src/test/test-hs-ntor-cl" +enhex=lambda s: binascii.b2a_hex(s) +dehex=lambda s: binascii.a2b_hex(s.strip()) + +def tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential): + p = subprocess.Popen([PROG, "client1", + enhex(intro_auth_pubkey_str), + enhex(intro_enc_pubkey.serialize()), + enhex(client_ephemeral_enc_privkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +def tor_server1(intro_auth_pubkey_str, intro_enc_privkey, + client_ephemeral_enc_pubkey, subcredential): + p = subprocess.Popen([PROG, "server1", + enhex(intro_auth_pubkey_str), + enhex(intro_enc_privkey.serialize()), + enhex(client_ephemeral_enc_pubkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +def tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_rend_pubkey, subcredential): + p = subprocess.Popen([PROG, "client2", + enhex(intro_auth_pubkey_str), + enhex(client_ephemeral_enc_privkey.serialize()), + enhex(intro_enc_pubkey.serialize()), + enhex(service_ephemeral_rend_pubkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +################################################################################## + +# Perform a pure python ntor test +def do_pure_python_ntor_test(): + # Initialize all needed key material + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() + intro_auth_pubkey_str = os.urandom(32) + subcredential = os.urandom(32) + + client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) + + service_enc_key, service_mac_key, service_ntor_key_seed, service_auth_input_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_pubkey) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_auth_input_mac == service_auth_input_mac) + + print "DONE: python dance [%s]" % repr(client_auth_input_mac) + +# Perform a pure little-t-tor integration test. +def do_little_t_tor_ntor_test(): + # Initialize all needed key material + subcredential = os.urandom(32) + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + intro_auth_pubkey_str = os.urandom(32) + + client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential) + assert(client_enc_key) + assert(client_mac_key) + + service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, + intro_enc_privkey, + client_ephemeral_enc_pubkey, + subcredential) + assert(service_enc_key) + assert(service_mac_key) + assert(service_ntor_auth_mac) + assert(service_ntor_key_seed) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + # Turn from bytes to key + service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) + + client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_eph_pubkey, subcredential) + assert(client_ntor_auth_mac) + assert(client_ntor_key_seed) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_ntor_auth_mac == service_ntor_auth_mac) + + print "DONE: tor dance [%s]" % repr(client_ntor_auth_mac) + +""" +Do mixed test as follows: + 1. C -> S (python mode) + 2. C <- S (tor mode) + 3. Client computes keys (python mode) +""" +def do_first_mixed_test(): + subcredential = os.urandom(32) + + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + + intro_auth_pubkey_str = os.urandom(32) + + # Let's do mixed + client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + subcredential) + + service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, + intro_enc_privkey, + client_ephemeral_enc_pubkey, + subcredential) + assert(service_enc_key) + assert(service_mac_key) + assert(service_ntor_auth_mac) + assert(service_ntor_key_seed) + assert(service_eph_pubkey) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + # Turn from bytes to key + service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) + + client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_eph_pubkey) + + assert(client_auth_input_mac == service_ntor_auth_mac) + assert(client_ntor_key_seed == service_ntor_key_seed) + + print "DONE: 1st mixed dance [%s]" % repr(client_auth_input_mac) + +""" +Do mixed test as follows: + 1. C -> S (tor mode) + 2. C <- S (python mode) + 3. Client computes keys (tor mode) +""" +def do_second_mixed_test(): + subcredential = os.urandom(32) + + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + + intro_auth_pubkey_str = os.urandom(32) + + # Let's do mixed + client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential) + assert(client_enc_key) + assert(client_mac_key) + + service_enc_key, service_mac_key, service_ntor_key_seed, service_ntor_auth_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + + client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_pubkey, subcredential) + assert(client_ntor_auth_mac) + assert(client_ntor_key_seed) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_ntor_auth_mac == service_ntor_auth_mac) + + print "DONE: 2nd mixed dance [%s]" % repr(client_ntor_auth_mac) + +def do_mixed_tests(): + do_first_mixed_test() + do_second_mixed_test() + +if __name__ == '__main__': + do_pure_python_ntor_test() + do_little_t_tor_ntor_test() + do_mixed_tests() diff --git a/src/test/include.am b/src/test/include.am index 1c0726fd3a..230a6c8bad 100644 --- a/src/test/include.am +++ b/src/test/include.am @@ -20,7 +20,7 @@ TESTSCRIPTS = \ src/test/test_switch_id.sh if USEPYTHON -TESTSCRIPTS += src/test/test_ntor.sh src/test/test_bt.sh +TESTSCRIPTS += src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh endif TESTS += src/test/test src/test/test-slow src/test/test-memwipe \ @@ -82,14 +82,19 @@ src_test_test_SOURCES = \ src/test/test_checkdir.c \ src/test/test_circuitlist.c \ src/test/test_circuitmux.c \ + src/test/test_circuitbuild.c \ src/test/test_circuituse.c \ src/test/test_compat_libevent.c \ src/test/test_config.c \ src/test/test_connection.c \ + src/test/test_conscache.c \ + src/test/test_consdiff.c \ + src/test/test_consdiffmgr.c \ src/test/test_containers.c \ src/test/test_controller.c \ src/test/test_controller_events.c \ src/test/test_crypto.c \ + src/test/test_crypto_openssl.c \ src/test/test_data.c \ src/test/test_dir.c \ src/test/test_dir_common.c \ @@ -129,6 +134,7 @@ src_test_test_SOURCES = \ src/test/test_shared_random.c \ src/test/test_socks.c \ src/test/test_status.c \ + src/test/test_storagedir.c \ src/test/test_threads.c \ src/test/test_tortls.c \ src/test/test_util.c \ @@ -174,7 +180,8 @@ src_test_test_switch_id_LDFLAGS = @TOR_LDFLAGS_zlib@ src_test_test_switch_id_LDADD = \ src/common/libor-testing.a \ src/common/libor-ctime-testing.a \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ @@ -186,9 +193,10 @@ src_test_test_LDADD = src/or/libtor-testing.a \ src/common/libor-ctime-testing.a \ src/common/libor-event-testing.a \ src/trunnel/libor-trunnel-testing.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ + @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_slow_CPPFLAGS = $(src_test_test_CPPFLAGS) src_test_test_slow_CFLAGS = $(src_test_test_CFLAGS) @@ -209,9 +217,10 @@ src_test_bench_LDADD = src/or/libtor.a src/common/libor.a \ src/common/libor-ctime.a \ src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event.a src/trunnel/libor-trunnel.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ + @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ @@ -220,8 +229,10 @@ src_test_test_workqueue_LDADD = src/or/libtor-testing.a \ src/common/libor-ctime-testing.a \ src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event-testing.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_timers_CPPFLAGS = $(src_test_test_CPPFLAGS) src_test_test_timers_CFLAGS = $(src_test_test_CFLAGS) @@ -231,7 +242,8 @@ src_test_test_timers_LDADD = \ src/common/libor-event-testing.a \ src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ src_test_test_timers_LDFLAGS = $(src_test_test_LDFLAGS) noinst_HEADERS+= \ @@ -249,20 +261,35 @@ noinst_HEADERS+= \ src/test/vote_descriptors.inc noinst_PROGRAMS+= src/test/test-ntor-cl +noinst_PROGRAMS+= src/test/test-hs-ntor-cl src_test_test_ntor_cl_SOURCES = src/test/test_ntor_cl.c src_test_test_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ src_test_test_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ src/common/libor-ctime.a \ src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ src_test_test_ntor_cl_AM_CPPFLAGS = \ -I"$(top_srcdir)/src/or" +src_test_test_hs_ntor_cl_SOURCES = src/test/test_hs_ntor_cl.c +src_test_test_hs_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ +src_test_test_hs_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ + src/common/libor-ctime.a \ + src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ +src_test_test_hs_ntor_cl_AM_CPPFLAGS = \ + -I"$(top_srcdir)/src/or" + + noinst_PROGRAMS += src/test/test-bt-cl src_test_test_bt_cl_SOURCES = src/test/test_bt_cl.c src_test_test_bt_cl_LDADD = src/common/libor-testing.a \ src/common/libor-ctime-testing.a \ + src/trace/libor-trace.a \ @TOR_LIB_MATH@ \ @TOR_LIB_WS32@ @TOR_LIB_GDI@ src_test_test_bt_cl_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) @@ -271,12 +298,13 @@ src_test_test_bt_cl_CPPFLAGS= $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) EXTRA_DIST += \ src/test/bt_test.py \ src/test/ntor_ref.py \ + src/test/hs_ntor_ref.py \ src/test/fuzz_static_testcases.sh \ src/test/slownacl_curve25519.py \ src/test/zero_length_keys.sh \ src/test/test_keygen.sh \ src/test/test_zero_length_keys.sh \ - src/test/test_ntor.sh src/test/test_bt.sh \ + src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh \ src/test/test-network.sh \ src/test/test_switch_id.sh \ src/test/test_workqueue_cancel.sh \ diff --git a/src/test/log_test_helpers.c b/src/test/log_test_helpers.c index c788a33c17..d5a39cfeee 100644 --- a/src/test/log_test_helpers.c +++ b/src/test/log_test_helpers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define LOG_PRIVATE #include "torlog.h" diff --git a/src/test/log_test_helpers.h b/src/test/log_test_helpers.h index 922c68b42f..f7798c0249 100644 --- a/src/test/log_test_helpers.h +++ b/src/test/log_test_helpers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" @@ -71,14 +71,14 @@ void mock_dump_saved_logs(void); \ assert_log_predicate(mock_saved_log_has_message_containing(str) && \ mock_saved_log_n_entries() == 1, \ - "expected log to contain exactly 1 message: " # str); \ + "expected log to contain exactly 1 message " # str); \ } while (0); #define expect_single_log_msg_containing(str) \ do { \ assert_log_predicate(mock_saved_log_has_message_containing(str)&& \ mock_saved_log_n_entries() == 1 , \ - "expected log to contain 1 message, containing" # str); \ + "expected log to contain 1 message, containing " # str); \ } while (0); #define expect_no_log_msg(str) \ diff --git a/src/test/ntor_ref.py b/src/test/ntor_ref.py index df065853f3..c753588f97 100755 --- a/src/test/ntor_ref.py +++ b/src/test/ntor_ref.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2012-2015, The Tor Project, Inc +# Copyright 2012-2017, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/rend_test_helpers.c b/src/test/rend_test_helpers.c index 377337bcb9..f7880046fb 100644 --- a/src/test/rend_test_helpers.c +++ b/src/test/rend_test_helpers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/rend_test_helpers.h b/src/test/rend_test_helpers.h index 180a4e8fde..486adba436 100644 --- a/src/test/rend_test_helpers.h +++ b/src/test/rend_test_helpers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test-child.c b/src/test/test-child.c index fdf3ccec0a..f0bdb3ea26 100644 --- a/src/test/test-child.c +++ b/src/test/test-child.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test-network.sh b/src/test/test-network.sh index 4d9776822b..6e0f286573 100755 --- a/src/test/test-network.sh +++ b/src/test/test-network.sh @@ -1,103 +1,45 @@ -#! /bin/sh +#!/bin/sh -# Please do not modify this script, it has been moved to chutney/tools +# This script calls the equivalent script in chutney/tools -ECHO_N="/bin/echo -n" +# If we already know CHUTNEY_PATH, don't bother with argument parsing +TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" +# Call the chutney version of this script, if it exists, and we can find it +if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then + # we can't produce any output, because we might be --quiet + # this preserves arguments with spaces correctly + exec "$TEST_NETWORK" "$@" +fi + +# We need to go looking for CHUTNEY_PATH +# Do we output anything at all? +ECHO="${ECHO:-echo}" # Output is prefixed with the name of the script myname=$(basename $0) -# We need to find CHUTNEY_PATH, so that we can call the version of this script -# in chutney/tools. And we want to pass any arguments to that script as well. -# So we source this script, which processes its arguments to find CHUTNEY_PATH. - -# Avoid recursively sourcing this script, and don't call the chutney version -# while recursing, either -if [ "$TEST_NETWORK_RECURSING" != true ]; then - # Process the arguments into environmental variables with this script - # to make sure $CHUTNEY_PATH is set - # When we switch to using test-network.sh in chutney/tools, --dry-run - # can be removed, because this script will find chutney, then pass all - # arguments to chutney's test-network.sh - echo "$myname: Parsing command-line arguments to find \$CHUTNEY_PATH" - export TEST_NETWORK_RECURSING=true - . "$0" --dry-run "$@" - - # Call the chutney version of this script, if it exists, and we can find it - if [ -d "$CHUTNEY_PATH" -a -x "$CHUTNEY_PATH/tools/test-network.sh" ]; then - unset NETWORK_DRY_RUN - echo "$myname: Calling newer chutney script \ -$CHUTNEY_PATH/tools/test-network.sh" - "$CHUTNEY_PATH/tools/test-network.sh" "$@" - exit $? - else - echo "$myname: This script has moved to chutney/tools." - echo "$myname: Please update your chutney using 'git pull'." - # When we switch to using test-network.sh in chutney/tools, we should - # exit with a very loud failure here - echo "$myname: Falling back to the old tor version of the script." - fi -fi +# Save the arguments before we destroy them +# This might not preserve arguments with spaces in them +ORIGINAL_ARGS="$@" +# We need to find CHUTNEY_PATH, so that we can call the version of this script +# in chutney/tools with the same arguments. We also need to respect --quiet. until [ -z "$1" ] do case "$1" in --chutney-path) - export CHUTNEY_PATH="$2" + CHUTNEY_PATH="$2" shift ;; --tor-path) - export TOR_DIR="$2" - shift - ;; - # When we switch to using test-network.sh in chutney/tools, only the - # --chutney-path and --tor-path arguments need to be processed by this - # script, everything else can be handled by chutney's test-network.sh - --flavor|--flavour|--network-flavor|--network-flavour) - export NETWORK_FLAVOUR="$2" - shift - ;; - --delay|--sleep|--bootstrap-time|--time) - export BOOTSTRAP_TIME="$2" - shift - ;; - # Environmental variables used by chutney verify performance tests - # Send this many bytes per client connection (10 KBytes) - --data|--data-bytes|--data-byte|--bytes|--byte) - export CHUTNEY_DATA_BYTES="$2" + TOR_DIR="$2" shift ;; - # Make this many connections per client (1) - # Note: If you create 7 or more connections to a hidden service from - # a single Tor 0.2.7 client, you'll likely get a verification failure due - # to #15937. This is fixed in 0.2.8. - --connections|--connection|--connection-count|--count) - export CHUTNEY_CONNECTIONS="$2" - shift + --quiet) + ECHO=true ;; - # Make each client connect to each HS (0) - # 0 means a single client connects to each HS - # 1 means every client connects to every HS - --hs-multi-client|--hs-multi-clients|--hs-client|--hs-clients) - export CHUTNEY_HS_MULTI_CLIENT="$2" - shift - ;; - --coverage) - export USE_COVERAGE_BINARY=true - ;; - --dry-run) - # process arguments, but don't call any other scripts - export NETWORK_DRY_RUN=true - ;; *) - echo "$myname: Sorry, I don't know what to do with '$1'." - echo "$myname: Maybe chutney's test-network.sh understands '$1'." - echo "$myname: Please update your chutney using 'git pull', and set \ -\$CHUTNEY_PATH" - # continue processing arguments during a dry run - if [ "$NETWORK_DRY_RUN" != true ]; then - exit 2 - fi + # maybe chutney's test-network.sh can handle it ;; esac shift @@ -106,22 +48,22 @@ done # optional: $TOR_DIR is the tor build directory # it's used to find the location of tor binaries # if it's not set: -# - set it ro $BUILDDIR, or +# - set it to $BUILDDIR, or # - if $PWD looks like a tor build directory, set it to $PWD, or # - unset $TOR_DIR, and let chutney fall back to finding tor binaries in $PATH if [ ! -d "$TOR_DIR" ]; then if [ -d "$BUILDDIR/src/or" -a -d "$BUILDDIR/src/tools" ]; then # Choose the build directory # But only if it looks like one - echo "$myname: \$TOR_DIR not set, trying \$BUILDDIR" - export TOR_DIR="$BUILDDIR" + $ECHO "$myname: \$TOR_DIR not set, trying \$BUILDDIR" + TOR_DIR="$BUILDDIR" elif [ -d "$PWD/src/or" -a -d "$PWD/src/tools" ]; then # Guess the tor directory is the current directory # But only if it looks like one - echo "$myname: \$TOR_DIR not set, trying \$PWD" - export TOR_DIR="$PWD" + $ECHO "$myname: \$TOR_DIR not set, trying \$PWD" + TOR_DIR="$PWD" else - echo "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries" + $ECHO "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries" unset TOR_DIR fi fi @@ -133,63 +75,34 @@ fi # - fail and tell the user how to clone the chutney repository if [ ! -d "$CHUTNEY_PATH" -o ! -x "$CHUTNEY_PATH/chutney" ]; then if [ -x "$PWD/chutney" ]; then - echo "$myname: \$CHUTNEY_PATH not valid, trying \$PWD" - export CHUTNEY_PATH="$PWD" + $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$PWD" + CHUTNEY_PATH="$PWD" elif [ -d "$TOR_DIR" -a -d "$TOR_DIR/../chutney" -a \ -x "$TOR_DIR/../chutney/chutney" ]; then - echo "$myname: \$CHUTNEY_PATH not valid, trying \$TOR_DIR/../chutney" - export CHUTNEY_PATH="$TOR_DIR/../chutney" + $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$TOR_DIR/../chutney" + CHUTNEY_PATH="$TOR_DIR/../chutney" else - # TODO: work out how to package and install chutney, - # so users can find it in $PATH - echo "$myname: missing 'chutney' in \$CHUTNEY_PATH ($CHUTNEY_PATH)" - echo "$myname: Get chutney: git clone https://git.torproject.org/\ + $ECHO "$myname: missing 'chutney' in \$CHUTNEY_PATH ($CHUTNEY_PATH)" + $ECHO "$myname: Get chutney: git clone https://git.torproject.org/\ chutney.git" - echo "$myname: Set \$CHUTNEY_PATH to a non-standard location: export \ + $ECHO "$myname: Set \$CHUTNEY_PATH to a non-standard location: export \ CHUTNEY_PATH=\`pwd\`/chutney" unset CHUTNEY_PATH exit 1 fi fi -# When we switch to using test-network.sh in chutney/tools, this comment and -# everything below it can be removed - -# For picking up the right tor binaries. -# If these varibles aren't set, chutney looks for tor binaries in $PATH -if [ -d "$TOR_DIR" ]; then - tor_name=tor - tor_gencert_name=tor-gencert - if [ "$USE_COVERAGE_BINARY" = true ]; then - tor_name=tor-cov - fi - export CHUTNEY_TOR="${TOR_DIR}/src/or/${tor_name}" - export CHUTNEY_TOR_GENCERT="${TOR_DIR}/src/tools/${tor_gencert_name}" -fi - -# Set the variables for the chutney network flavour -export NETWORK_FLAVOUR=${NETWORK_FLAVOUR:-"bridges+hs"} -export CHUTNEY_NETWORK=networks/$NETWORK_FLAVOUR - -# And finish up if we're doing a dry run -if [ "$NETWORK_DRY_RUN" = true ]; then - # we can't exit here, it breaks argument processing - return +TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" +# Call the chutney version of this script, if it exists, and we can find it +if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then + $ECHO "$myname: Calling newer chutney script $TEST_NETWORK" + # this may fail if some arguments have spaces in them + # if so, set CHUTNEY_PATH before calling test-network.sh, and spaces + # will be handled correctly + exec "$TEST_NETWORK" $ORIGINAL_ARGS +else + $ECHO "$myname: Could not find tools/test-network.sh in CHUTNEY_PATH." + $ECHO "$myname: Please update your chutney using 'git pull'." + # We have failed to do what the user asked + exit 1 fi - -cd "$CHUTNEY_PATH" -./tools/bootstrap-network.sh $NETWORK_FLAVOUR || exit 2 - -# Sleep some, waiting for the network to bootstrap. -# TODO: Add chutney command 'bootstrap-status' and use that instead. -BOOTSTRAP_TIME=${BOOTSTRAP_TIME:-35} -$ECHO_N "$myname: sleeping for $BOOTSTRAP_TIME seconds" -n=$BOOTSTRAP_TIME; while [ $n -gt 0 ]; do - sleep 1; n=$(expr $n - 1); $ECHO_N . -done; echo "" -./chutney verify $CHUTNEY_NETWORK -VERIFY_EXIT_STATUS=$? -# work around a bug/feature in make -j2 (or more) -# where make hangs if any child processes are still alive -./chutney stop $CHUTNEY_NETWORK -exit $VERIFY_EXIT_STATUS diff --git a/src/test/test-timers.c b/src/test/test-timers.c index b5fcade7f8..99715f4333 100644 --- a/src/test/test-timers.c +++ b/src/test/test-timers.c @@ -1,4 +1,4 @@ -/* Copyright 2016, The Tor Project, Inc. */ +/* Copyright 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test.c b/src/test/test.c index 866408e856..4d2cf1536b 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -44,13 +44,13 @@ double fabs(double x); #include "buffers.h" #include "circuitlist.h" #include "circuitstats.h" +#include "compress.h" #include "config.h" #include "connection_edge.h" #include "geoip.h" #include "rendcommon.h" #include "rendcache.h" #include "test.h" -#include "torgzip.h" #include "main.h" #include "memarea.h" #include "onion.h" @@ -1188,16 +1188,21 @@ struct testgroup_t testgroups[] = { { "channel/", channel_tests }, { "channeltls/", channeltls_tests }, { "checkdir/", checkdir_tests }, + { "circuitbuild/", circuitbuild_tests }, { "circuitlist/", circuitlist_tests }, { "circuitmux/", circuitmux_tests }, { "circuituse/", circuituse_tests }, { "compat/libevent/", compat_libevent_tests }, { "config/", config_tests }, { "connection/", connection_tests }, + { "conscache/", conscache_tests }, + { "consdiff/", consdiff_tests }, + { "consdiffmgr/", consdiffmgr_tests }, { "container/", container_tests }, { "control/", controller_tests }, { "control/event/", controller_event_tests }, { "crypto/", crypto_tests }, + { "crypto/openssl/", crypto_openssl_tests }, { "dir/", dir_tests }, { "dir_handle_get/", dir_handle_get_tests }, { "dir/md/", microdesc_tests }, @@ -1232,6 +1237,7 @@ struct testgroup_t testgroups[] = { { "socks/", socks_tests }, { "shared-random/", sr_tests }, { "status/" , status_tests }, + { "storagedir/", storagedir_tests }, { "tortls/", tortls_tests }, { "util/", util_tests }, { "util/format/", util_format_tests }, diff --git a/src/test/test.h b/src/test/test.h index 2bd58f51c8..3d7d05e771 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TEST_H @@ -183,16 +183,21 @@ extern struct testcase_t cell_queue_tests[]; extern struct testcase_t channel_tests[]; extern struct testcase_t channeltls_tests[]; extern struct testcase_t checkdir_tests[]; +extern struct testcase_t circuitbuild_tests[]; extern struct testcase_t circuitlist_tests[]; extern struct testcase_t circuitmux_tests[]; extern struct testcase_t circuituse_tests[]; extern struct testcase_t compat_libevent_tests[]; extern struct testcase_t config_tests[]; extern struct testcase_t connection_tests[]; +extern struct testcase_t conscache_tests[]; +extern struct testcase_t consdiff_tests[]; +extern struct testcase_t consdiffmgr_tests[]; extern struct testcase_t container_tests[]; extern struct testcase_t controller_tests[]; extern struct testcase_t controller_event_tests[]; extern struct testcase_t crypto_tests[]; +extern struct testcase_t crypto_openssl_tests[]; extern struct testcase_t dir_tests[]; extern struct testcase_t dir_handle_get_tests[]; extern struct testcase_t entryconn_tests[]; @@ -227,6 +232,7 @@ extern struct testcase_t routerkeys_tests[]; extern struct testcase_t routerlist_tests[]; extern struct testcase_t routerset_tests[]; extern struct testcase_t scheduler_tests[]; +extern struct testcase_t storagedir_tests[]; extern struct testcase_t socks_tests[]; extern struct testcase_t status_tests[]; extern struct testcase_t thread_tests[]; diff --git a/src/test/test_addr.c b/src/test/test_addr.c index 49e248014f..b6d2445bad 100644 --- a/src/test/test_addr.c +++ b/src/test/test_addr.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ADDRESSMAP_PRIVATE diff --git a/src/test/test_address.c b/src/test/test_address.c index 0d142ad483..50a0574522 100644 --- a/src/test/test_address.c +++ b/src/test/test_address.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ADDRESS_PRIVATE diff --git a/src/test/test_bt_cl.c b/src/test/test_bt_cl.c index 709d599f52..ed588ecc5b 100644 --- a/src/test/test_bt_cl.c +++ b/src/test/test_bt_cl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c index 9e7bdb8911..07114a8571 100644 --- a/src/test/test_buffers.c +++ b/src/test/test_buffers.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define BUFFERS_PRIVATE @@ -578,120 +578,150 @@ test_buffer_time_tracking(void *arg) } static void -test_buffers_zlib_impl(int finalize_with_nil) +test_buffers_compress_fin_at_chunk_end_impl(compress_method_t method, + compression_level_t level) { char *msg = NULL; char *contents = NULL; char *expanded = NULL; buf_t *buf = NULL; - tor_zlib_state_t *zlib_state = NULL; + tor_compress_state_t *compress_state = NULL; size_t out_len, in_len; - int done; + size_t sz, headerjunk; buf = buf_new_with_capacity(128); /* will round up */ - zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); + sz = buf_get_default_chunk_size(buf); + msg = tor_malloc_zero(sz); - msg = tor_malloc(512); - crypto_rand(msg, 512); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), OP_EQ, 0); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), OP_EQ, 0); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), OP_EQ, 0); - done = !finalize_with_nil; - tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), OP_EQ, 0); - if (finalize_with_nil) { - tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0); - } + write_to_buf(msg, 1, buf); + tt_assert(buf->head); + + /* Fill up the chunk so the compression stuff won't fit in one chunk. */ + tt_uint_op(buf->head->memlen, OP_LT, sz); + headerjunk = buf->head->memlen - 7; + write_to_buf(msg, headerjunk-1, buf); + tt_uint_op(buf->head->datalen, OP_EQ, headerjunk); + tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk); + /* Write an empty string, with finalization on. */ + compress_state = tor_compress_new(1, method, level); + tt_int_op(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); in_len = buf_datalen(buf); contents = tor_malloc(in_len); tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0); - tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len, - contents, in_len, - ZLIB_METHOD, 1, - LOG_WARN)); + if (method == NO_METHOD) { + tt_uint_op(in_len, OP_EQ, headerjunk); + } else { + tt_uint_op(in_len, OP_GT, headerjunk); + } - tt_int_op(out_len, OP_GE, 128); - tt_mem_op(msg, OP_EQ, expanded, 128); - tt_int_op(out_len, OP_GE, 512); - tt_mem_op(msg, OP_EQ, expanded, 512); - tt_int_op(out_len, OP_EQ, 512+9); - tt_mem_op("all done", OP_EQ, expanded+512, 9); + tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, + contents + headerjunk, + in_len - headerjunk, + method, 1, + LOG_WARN)); + + tt_int_op(out_len, OP_EQ, 0); + tt_assert(expanded); done: buf_free(buf); - tor_zlib_free(zlib_state); + tor_compress_free(compress_state); tor_free(contents); tor_free(expanded); tor_free(msg); } static void -test_buffers_zlib(void *arg) -{ - (void) arg; - test_buffers_zlib_impl(0); -} -static void -test_buffers_zlib_fin_with_nil(void *arg) -{ - (void) arg; - test_buffers_zlib_impl(1); -} - -static void -test_buffers_zlib_fin_at_chunk_end(void *arg) +test_buffers_compress_impl(compress_method_t method, + compression_level_t level, + int finalize_with_nil) { char *msg = NULL; char *contents = NULL; char *expanded = NULL; buf_t *buf = NULL; - tor_zlib_state_t *zlib_state = NULL; + tor_compress_state_t *compress_state = NULL; size_t out_len, in_len; - size_t sz, headerjunk; - (void) arg; + int done; buf = buf_new_with_capacity(128); /* will round up */ - sz = buf_get_default_chunk_size(buf); - msg = tor_malloc_zero(sz); - - write_to_buf(msg, 1, buf); - tt_assert(buf->head); + compress_state = tor_compress_new(1, method, level); - /* Fill up the chunk so the zlib stuff won't fit in one chunk. */ - tt_uint_op(buf->head->memlen, OP_LT, sz); - headerjunk = buf->head->memlen - 7; - write_to_buf(msg, headerjunk-1, buf); - tt_uint_op(buf->head->datalen, OP_EQ, headerjunk); - tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk); - /* Write an empty string, with finalization on. */ - zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); - tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0); + msg = tor_malloc(512); + crypto_rand(msg, 512); + tt_int_op(write_to_buf_compress(buf, compress_state, + msg, 128, 0), OP_EQ, 0); + tt_int_op(write_to_buf_compress(buf, compress_state, + msg+128, 128, 0), OP_EQ, 0); + tt_int_op(write_to_buf_compress(buf, compress_state, + msg+256, 256, 0), OP_EQ, 0); + done = !finalize_with_nil; + tt_int_op(write_to_buf_compress(buf, compress_state, + "all done", 9, done), OP_EQ, 0); + if (finalize_with_nil) { + tt_int_op(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); + } in_len = buf_datalen(buf); contents = tor_malloc(in_len); tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0); - tt_uint_op(in_len, OP_GT, headerjunk); - - tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len, - contents + headerjunk, in_len - headerjunk, - ZLIB_METHOD, 1, - LOG_WARN)); + tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, + contents, in_len, + method, 1, + LOG_WARN)); - tt_int_op(out_len, OP_EQ, 0); - tt_assert(expanded); + tt_int_op(out_len, OP_GE, 128); + tt_mem_op(msg, OP_EQ, expanded, 128); + tt_int_op(out_len, OP_GE, 512); + tt_mem_op(msg, OP_EQ, expanded, 512); + tt_int_op(out_len, OP_EQ, 512+9); + tt_mem_op("all done", OP_EQ, expanded+512, 9); done: buf_free(buf); - tor_zlib_free(zlib_state); + tor_compress_free(compress_state); tor_free(contents); tor_free(expanded); tor_free(msg); } +static void +test_buffers_compress(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + compression_level_t levels[] = { + BEST_COMPRESSION, + HIGH_COMPRESSION, + MEDIUM_COMPRESSION, + LOW_COMPRESSION + }; + + for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { + compression_level_t level = levels[l]; + + test_buffers_compress_impl(method, level, 0); + test_buffers_compress_impl(method, level, 1); + test_buffers_compress_fin_at_chunk_end_impl(method, level); + } + + done: + ; +} + static const uint8_t *tls_read_ptr; static int n_remaining; static int next_reply_val[16]; @@ -816,14 +846,22 @@ struct testcase_t buffer_tests[] = { { "allocation_tracking", test_buffer_allocation_tracking, TT_FORK, NULL, NULL }, { "time_tracking", test_buffer_time_tracking, TT_FORK, NULL, NULL }, - { "zlib", test_buffers_zlib, TT_FORK, NULL, NULL }, - { "zlib_fin_with_nil", test_buffers_zlib_fin_with_nil, TT_FORK, NULL, NULL }, - { "zlib_fin_at_chunk_end", test_buffers_zlib_fin_at_chunk_end, TT_FORK, - NULL, NULL}, { "tls_read_mocked", test_buffers_tls_read_mocked, 0, NULL, NULL }, { "chunk_size", test_buffers_chunk_size, 0, NULL, NULL }, { "find_contentlen", test_buffers_find_contentlen, 0, NULL, NULL }, + + { "compress/zlib", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"deflate" }, + { "compress/gzip", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"gzip" }, + { "compress/zstd", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"x-zstd" }, + { "compress/lzma", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"x-tor-lzma" }, + { "compress/none", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"identity" }, + END_OF_TESTCASES }; diff --git a/src/test/test_cell_formats.c b/src/test/test_cell_formats.c index 22c34b6d6c..007f7e3d3e 100644 --- a/src/test/test_cell_formats.c +++ b/src/test/test_cell_formats.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c index 93ac9854d8..69e89b69b0 100644 --- a/src/test/test_cell_queue.c +++ b/src/test/test_cell_queue.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CIRCUITLIST_PRIVATE diff --git a/src/test/test_channel.c b/src/test/test_channel.c index 862bd6dfa6..f5999b8e67 100644 --- a/src/test/test_channel.c +++ b/src/test/test_channel.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ diff --git a/src/test/test_channeltls.c b/src/test/test_channeltls.c index fd98ee40fb..96c5eba9a5 100644 --- a/src/test/test_channeltls.c +++ b/src/test/test_channeltls.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_checkdir.c b/src/test/test_checkdir.c index fbb33f87f6..38f3360b61 100644 --- a/src/test/test_checkdir.c +++ b/src/test/test_checkdir.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_circuitbuild.c b/src/test/test_circuitbuild.c new file mode 100644 index 0000000000..a5282df69d --- /dev/null +++ b/src/test/test_circuitbuild.c @@ -0,0 +1,133 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CIRCUITBUILD_PRIVATE + +#include "or.h" +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" +#include "config.h" +#include "circuitbuild.h" + +/* Dummy nodes smartlist for testing */ +static smartlist_t dummy_nodes; +/* Dummy exit extend_info for testing */ +static extend_info_t dummy_ei; + +static int +mock_count_acceptable_nodes(smartlist_t *nodes) +{ + (void)nodes; + + return DEFAULT_ROUTE_LEN + 1; +} + +/* Test route lengths when the caller of new_route_len() doesn't + * specify exit_ei. */ +static void +test_new_route_len_noexit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Test route lengths where someone else chose the "exit" node, which + * require an extra hop for safety. */ +static void +test_new_route_len_unsafe_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + /* connecting to hidden service directory */ + r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + /* client connecting to introduction point */ + r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCING, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + /* hidden service connecting to rendezvous point */ + r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Test route lengths where we chose the "exit" node, which don't + * require an extra hop for safety. */ +static void +test_new_route_len_safe_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + /* hidden service connecting to introduction point */ + r = new_route_len(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, &dummy_ei, + &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + /* router testing its own reachability */ + r = new_route_len(CIRCUIT_PURPOSE_TESTING, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Make sure a non-fatal assertion fails when new_route_len() gets an + * unexpected circuit purpose. */ +static void +test_new_route_len_unhandled_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + tor_capture_bugs_(1); + setup_full_capture_of_logs(LOG_WARN); + r = new_route_len(CIRCUIT_PURPOSE_CONTROLLER, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); + tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, + "!(exit_ei && !known_purpose)"); + expect_single_log_msg_containing("Unhandled purpose"); + expect_single_log_msg_containing("with a chosen exit; assuming routelen"); + teardown_capture_of_logs(); + tor_end_capture_bugs_(); + + done: + UNMOCK(count_acceptable_nodes); +} + +struct testcase_t circuitbuild_tests[] = { + { "noexit", test_new_route_len_noexit, 0, NULL, NULL }, + { "safe_exit", test_new_route_len_safe_exit, 0, NULL, NULL }, + { "unsafe_exit", test_new_route_len_unsafe_exit, 0, NULL, NULL }, + { "unhandled_exit", test_new_route_len_unhandled_exit, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c index 7eed5fe225..344ab27921 100644 --- a/src/test/test_circuitlist.c +++ b/src/test/test_circuitlist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ @@ -201,68 +201,68 @@ test_rend_token_maps(void *arg) tt_int_op(tok3[REND_TOKEN_LEN-1], OP_EQ, '.'); /* No maps; nothing there. */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); - hs_circuitmap_register_rend_circ(c1, tok1); - hs_circuitmap_register_intro_circ_v2(c2, tok2); + hs_circuitmap_register_rend_circ_relay_side(c1, tok1); + hs_circuitmap_register_intro_circ_v2_relay_side(c2, tok2); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok3)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); /* Without purpose set, we don't get the circuits */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; /* Okay, make sure they show up now. */ - tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); - tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); + tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); /* Two items at the same place with the same token. */ c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; - hs_circuitmap_register_rend_circ(c3, tok2); - tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); + hs_circuitmap_register_rend_circ_relay_side(c3, tok2); + tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); /* Marking a circuit makes it not get returned any more */ circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); circuit_free(TO_CIRCUIT(c1)); c1 = NULL; /* Freeing a circuit makes it not get returned any more. */ circuit_free(TO_CIRCUIT(c2)); c2 = NULL; - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); /* c3 -- are you still there? */ - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); /* Change its cookie. This never happens in Tor per se, but hey. */ c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - hs_circuitmap_register_intro_circ_v2(c3, tok3); + hs_circuitmap_register_intro_circ_v2_relay_side(c3, tok3); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); /* Now replace c3 with c4. */ c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - hs_circuitmap_register_intro_circ_v2(c4, tok3); + hs_circuitmap_register_intro_circ_v2_relay_side(c4, tok3); - tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); + tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); - tt_ptr_op(c3->hs_token, OP_EQ, NULL); - tt_ptr_op(c4->hs_token, OP_NE, NULL); - tt_mem_op(c4->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN); + tt_ptr_op(TO_CIRCUIT(c3)->hs_token, OP_EQ, NULL); + tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_NE, NULL); + tt_mem_op(TO_CIRCUIT(c4)->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN); /* Now clear c4's cookie. */ - hs_circuitmap_remove_circuit(c4); - tt_ptr_op(c4->hs_token, OP_EQ, NULL); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); + hs_circuitmap_remove_circuit(TO_CIRCUIT(c4)); + tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_EQ, NULL); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); done: if (c1) @@ -370,10 +370,89 @@ test_pick_circid(void *arg) UNMOCK(channel_dump_statistics); } +/** Test that the circuit pools of our HS circuitmap are isolated based on + * their token type. */ +static void +test_hs_circuitmap_isolation(void *arg) +{ + or_circuit_t *circ1 = NULL; + origin_circuit_t *circ2 = NULL; + or_circuit_t *circ3 = NULL; + origin_circuit_t *circ4 = NULL; + + (void)arg; + + hs_circuitmap_init(); + + { + const uint8_t tok1[REND_TOKEN_LEN] = "bet i got some of th"; + + circ1 = or_circuit_new(0, NULL); + tt_assert(circ1); + circ1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; + + /* check that circuitmap is empty right? */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + + /* Register circ1 with tok1 as relay-side rend circ */ + hs_circuitmap_register_rend_circ_relay_side(circ1, tok1); + + /* check that service-side getters don't work */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_service_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok1)); + + /* Check that the right getter works. */ + tt_ptr_op(circ1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + } + + { + const uint8_t tok2[REND_TOKEN_LEN] = "you dont know anythi"; + + circ2 = origin_circuit_new(); + tt_assert(circ2); + circ2->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + circ3 = or_circuit_new(0, NULL); + tt_assert(circ3); + circ3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; + circ4 = origin_circuit_new(); + tt_assert(circ4); + circ4->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + + /* Register circ2 with tok2 as service-side intro v2 circ */ + hs_circuitmap_register_intro_circ_v2_service_side(circ2, tok2); + /* Register circ3 with tok2 again but for different purpose */ + hs_circuitmap_register_intro_circ_v2_relay_side(circ3, tok2); + + /* Check that the getters work */ + tt_ptr_op(circ2, OP_EQ, + hs_circuitmap_get_intro_circ_v2_service_side(tok2)); + tt_ptr_op(circ3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + + /* Register circ4 with tok2: it should override circ2 */ + hs_circuitmap_register_intro_circ_v2_service_side(circ4, tok2); + + /* check that relay-side getters don't work */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + + /* Check that the getter returns circ4; the last circuit registered with + * that token. */ + tt_ptr_op(circ4, OP_EQ, + hs_circuitmap_get_intro_circ_v2_service_side(tok2)); + } + + done: + circuit_free(TO_CIRCUIT(circ1)); + circuit_free(TO_CIRCUIT(circ2)); + circuit_free(TO_CIRCUIT(circ3)); + circuit_free(TO_CIRCUIT(circ4)); +} + struct testcase_t circuitlist_tests[] = { { "maps", test_clist_maps, TT_FORK, NULL, NULL }, { "rend_token_maps", test_rend_token_maps, TT_FORK, NULL, NULL }, { "pick_circid", test_pick_circid, TT_FORK, NULL, NULL }, + { "hs_circuitmap_isolation", test_hs_circuitmap_isolation, + TT_FORK, NULL, NULL }, END_OF_TESTCASES }; diff --git a/src/test/test_circuitmux.c b/src/test/test_circuitmux.c index 9e8fb54964..779783299d 100644 --- a/src/test/test_circuitmux.c +++ b/src/test/test_circuitmux.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ diff --git a/src/test/test_circuituse.c b/src/test/test_circuituse.c index 27a87660ff..5cc9fe571e 100644 --- a/src/test/test_circuituse.c +++ b/src/test/test_circuituse.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CIRCUITLIST_PRIVATE diff --git a/src/test/test_compat_libevent.c b/src/test/test_compat_libevent.c index 0443cc0b1c..7dd8e65194 100644 --- a/src/test/test_compat_libevent.c +++ b/src/test/test_compat_libevent.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define COMPAT_LIBEVENT_PRIVATE diff --git a/src/test/test_config.c b/src/test/test_config.c index 3b19cad036..f0874e0e0b 100644 --- a/src/test/test_config.c +++ b/src/test/test_config.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_connection.c b/src/test/test_connection.c index 5cda4f3175..7e5193b203 100644 --- a/src/test/test_connection.c +++ b/src/test/test_connection.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -265,7 +265,7 @@ test_conn_get_rend_setup(const struct testcase_t *tc) rend_cache_init(); - /* TODO: use directory_initiate_command_rend() to do this - maybe? */ + /* TODO: use directory_initiate_request() to do this - maybe? */ tor_assert(strlen(TEST_CONN_REND_ADDR) == REND_SERVICE_ID_LEN_BASE32); conn->rend_data = rend_data_client_create(TEST_CONN_REND_ADDR, NULL, NULL, REND_NO_AUTH); diff --git a/src/test/test_conscache.c b/src/test/test_conscache.c new file mode 100644 index 0000000000..aee1ba8a06 --- /dev/null +++ b/src/test/test_conscache.c @@ -0,0 +1,340 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "config.h" +#include "conscache.h" +#include "test.h" + +#ifdef HAVE_UTIME_H +#include <utime.h> +#endif + +static void +test_conscache_open_failure(void *arg) +{ + (void) arg; + /* Try opening a directory that doesn't exist and which we shouldn't be + * able to create. */ + consensus_cache_t *cache = consensus_cache_open("a/b/c/d/e/f/g", 128); + tt_ptr_op(cache, OP_EQ, NULL); + + done: + ; +} + +static void +test_conscache_simple_usage(void *arg) +{ + (void)arg; + consensus_cache_entry_t *ent = NULL, *ent2 = NULL; + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create object; make sure it exists. */ + config_line_t *labels = NULL; + config_line_append(&labels, "Hello", "world"); + config_line_append(&labels, "Adios", "planetas"); + ent = consensus_cache_add(cache, + labels, (const uint8_t *)"A\0B\0C", 5); + config_free_lines(labels); + labels = NULL; + tt_assert(ent); + + /* Make a second object */ + config_line_append(&labels, "Hello", "mundo"); + config_line_append(&labels, "Adios", "planets"); + ent2 = consensus_cache_add(cache, + labels, (const uint8_t *)"xyzzy", 5); + config_free_lines(labels); + labels = NULL; + tt_assert(ent2); + tt_assert(! consensus_cache_entry_is_mapped(ent2)); + consensus_cache_entry_decref(ent2); + ent2 = NULL; + + /* Check get_value */ + tt_ptr_op(NULL, OP_EQ, consensus_cache_entry_get_value(ent, "hebbo")); + tt_str_op("world", OP_EQ, consensus_cache_entry_get_value(ent, "Hello")); + + /* Check find_first */ + ent2 = consensus_cache_find_first(cache, "Hello", "world!"); + tt_ptr_op(ent2, OP_EQ, NULL); + ent2 = consensus_cache_find_first(cache, "Hello", "world"); + tt_ptr_op(ent2, OP_EQ, ent); + ent2 = consensus_cache_find_first(cache, "Hello", "mundo"); + tt_ptr_op(ent2, OP_NE, ent); + + tt_assert(! consensus_cache_entry_is_mapped(ent)); + + /* Check get_body */ + const uint8_t *bp = NULL; + size_t sz = 0; + int r = consensus_cache_entry_get_body(ent, &bp, &sz); + tt_int_op(r, OP_EQ, 0); + tt_u64_op(sz, OP_EQ, 5); + tt_mem_op(bp, OP_EQ, "A\0B\0C", 5); + tt_assert(consensus_cache_entry_is_mapped(ent)); + + /* Free and re-create the cache, to rescan the directory. */ + consensus_cache_free(cache); + consensus_cache_entry_decref(ent); + cache = consensus_cache_open("cons", 128); + + /* Make sure the entry is still there */ + ent = consensus_cache_find_first(cache, "Hello", "mundo"); + tt_assert(ent); + ent2 = consensus_cache_find_first(cache, "Adios", "planets"); + tt_ptr_op(ent, OP_EQ, ent2); + consensus_cache_entry_incref(ent); + tt_assert(! consensus_cache_entry_is_mapped(ent)); + r = consensus_cache_entry_get_body(ent, &bp, &sz); + tt_int_op(r, OP_EQ, 0); + tt_u64_op(sz, OP_EQ, 5); + tt_mem_op(bp, OP_EQ, "xyzzy", 5); + tt_assert(consensus_cache_entry_is_mapped(ent)); + + /* There should be two entries total. */ + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 2); + + done: + consensus_cache_entry_decref(ent); + tor_free(ddir_fname); + consensus_cache_free(cache); +} + +static void +test_conscache_cleanup(void *arg) +{ + (void)arg; + const int N = 20; + consensus_cache_entry_t **ents = + tor_calloc(N, sizeof(consensus_cache_entry_t*)); + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create a bunch of entries. */ + int i; + for (i = 0; i < N; ++i) { + config_line_t *labels = NULL; + char num[8]; + tor_snprintf(num, sizeof(num), "%d", i); + config_line_append(&labels, "test-id", "cleanup"); + config_line_append(&labels, "index", num); + size_t bodylen = i * 3; + uint8_t *body = tor_malloc(bodylen); + memset(body, i, bodylen); + ents[i] = consensus_cache_add(cache, labels, body, bodylen); + tor_free(body); + config_free_lines(labels); + tt_assert(ents[i]); + /* We're still holding a reference to each entry at this point. */ + } + + /* Page all of the entries into RAM */ + for (i = 0; i < N; ++i) { + const uint8_t *bp; + size_t sz; + tt_assert(! consensus_cache_entry_is_mapped(ents[i])); + consensus_cache_entry_get_body(ents[i], &bp, &sz); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Mark some of the entries as deletable. */ + for (i = 7; i < N; i += 7) { + consensus_cache_entry_mark_for_removal(ents[i]); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Mark some of the entries as aggressively unpaged. */ + for (i = 3; i < N; i += 3) { + consensus_cache_entry_mark_for_aggressive_release(ents[i]); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Incref some of the entries again */ + for (i = 0; i < N; i += 2) { + consensus_cache_entry_incref(ents[i]); + } + + /* Now we're going to decref everything. We do so at a specific time. I'm + * picking the moment when I was writing this test, at 2017-04-05 12:16:48 + * UTC. */ + const time_t example_time = 1491394608; + update_approx_time(example_time); + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + if (i % 2) { + ents[i] = NULL; /* We're no longer holding any reference here. */ + } + } + + /* At this point, the aggressively-released items with refcount 1 should + * be unmapped. Nothing should be deleted. */ + consensus_cache_entry_t *e_tmp; + e_tmp = consensus_cache_find_first(cache, "index", "3"); + tt_assert(e_tmp); + tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "5"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "6"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "7"); + tt_assert(e_tmp == NULL); // not found because pending deletion. + + /* Delete the pending-deletion items. */ + consensus_cache_delete_pending(cache, 0); + { + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 20 - 2); /* 1 entry was deleted; 1 is not-found. */ + } + e_tmp = consensus_cache_find_first(cache, "index", "7"); // refcnt == 1... + tt_assert(e_tmp == NULL); // so deleted. + e_tmp = consensus_cache_find_first(cache, "index", "14"); // refcnt == 2 + tt_assert(e_tmp == NULL); // not deleted; but not found. + + /* Now do lazy unmapping. */ + // should do nothing. + consensus_cache_unmap_lazy(cache, example_time - 10); + e_tmp = consensus_cache_find_first(cache, "index", "11"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + // should actually unmap + consensus_cache_unmap_lazy(cache, example_time + 10); + e_tmp = consensus_cache_find_first(cache, "index", "11"); + tt_assert(e_tmp); + tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); + // This one will still be mapped, since it has a reference. + e_tmp = consensus_cache_find_first(cache, "index", "16"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + ents[i] = NULL; + } + + /* Free and re-create the cache, to rescan the directory. Make sure the + * deleted thing is still deleted, along with the other deleted thing. */ + consensus_cache_free(cache); + cache = consensus_cache_open("cons", 128); + { + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 18); + } + + done: + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + } + tor_free(ents); + tor_free(ddir_fname); + consensus_cache_free(cache); +} + +static void +test_conscache_filter(void *arg) +{ + (void)arg; + const int N = 30; + smartlist_t *lst = NULL; + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create a bunch of entries with different labels */ + int i; + for (i = 0; i < N; ++i) { + config_line_t *labels = NULL; + char num[8]; + tor_snprintf(num, sizeof(num), "%d", i); + config_line_append(&labels, "test-id", "filter"); + config_line_append(&labels, "index", num); + tor_snprintf(num, sizeof(num), "%d", i % 3); + config_line_append(&labels, "mod3", num); + tor_snprintf(num, sizeof(num), "%d", i % 5); + config_line_append(&labels, "mod5", num); + + size_t bodylen = i * 3; + uint8_t *body = tor_malloc(bodylen); + memset(body, i, bodylen); + consensus_cache_entry_t *ent = + consensus_cache_add(cache, labels, body, bodylen); + tor_free(body); + config_free_lines(labels); + tt_assert(ent); + consensus_cache_entry_decref(ent); + } + + lst = smartlist_new(); + /* Find nothing. */ + consensus_cache_find_all(lst, cache, "mod5", "5"); + tt_int_op(smartlist_len(lst), OP_EQ, 0); + /* Find everything. */ + consensus_cache_find_all(lst, cache, "test-id", "filter"); + tt_int_op(smartlist_len(lst), OP_EQ, N); + + /* Now filter to find the entries that have i%3 == 1 */ + consensus_cache_filter_list(lst, "mod3", "1"); + tt_int_op(smartlist_len(lst), OP_EQ, 10); + /* Now filter to find the entries that also have i%5 == 3 */ + consensus_cache_filter_list(lst, "mod5", "3"); + tt_int_op(smartlist_len(lst), OP_EQ, 2); + /* So now we have those entries for which i%15 == 13. */ + + consensus_cache_entry_t *ent1 = smartlist_get(lst, 0); + consensus_cache_entry_t *ent2 = smartlist_get(lst, 1); + const char *idx1 = consensus_cache_entry_get_value(ent1, "index"); + const char *idx2 = consensus_cache_entry_get_value(ent2, "index"); + tt_assert( (!strcmp(idx1, "28") && !strcmp(idx2, "13")) || + (!strcmp(idx1, "13") && !strcmp(idx2, "28")) ); + + done: + tor_free(ddir_fname); + consensus_cache_free(cache); + smartlist_free(lst); +} + +#define ENT(name) \ + { #name, test_conscache_ ## name, TT_FORK, NULL, NULL } + +struct testcase_t conscache_tests[] = { + ENT(open_failure), + ENT(simple_usage), + ENT(cleanup), + ENT(filter), + END_OF_TESTCASES +}; + diff --git a/src/test/test_consdiff.c b/src/test/test_consdiff.c new file mode 100644 index 0000000000..2f826b5ef7 --- /dev/null +++ b/src/test/test_consdiff.c @@ -0,0 +1,1168 @@ +/* Copyright (c) 2014, Daniel Martà + * Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "or.h" +#include "test.h" + +#include "consdiff.h" +#include "memarea.h" +#include "log_test_helpers.h" + +#define tt_str_eq_line(a,b) \ + tt_assert(line_str_eq((b),(a))) + +static void +test_consdiff_smartlist_slice(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_slice_t *sls; + + /* Create a regular smartlist. */ + (void)arg; + smartlist_add(sl, (void*)1); + smartlist_add(sl, (void*)2); + smartlist_add(sl, (void*)3); + smartlist_add(sl, (void*)4); + smartlist_add(sl, (void*)5); + + /* See if the slice was done correctly. */ + sls = smartlist_slice(sl, 2, 5); + tt_ptr_op(sl, OP_EQ, sls->list); + tt_ptr_op((void*)3, OP_EQ, smartlist_get(sls->list, sls->offset)); + tt_ptr_op((void*)5, OP_EQ, + smartlist_get(sls->list, sls->offset + (sls->len-1))); + tor_free(sls); + + /* See that using -1 as the end does get to the last element. */ + sls = smartlist_slice(sl, 2, -1); + tt_ptr_op(sl, OP_EQ, sls->list); + tt_ptr_op((void*)3, OP_EQ, smartlist_get(sls->list, sls->offset)); + tt_ptr_op((void*)5, OP_EQ, + smartlist_get(sls->list, sls->offset + (sls->len-1))); + + done: + tor_free(sls); + smartlist_free(sl); +} + +static void +test_consdiff_smartlist_slice_string_pos(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_slice_t *sls; + memarea_t *area = memarea_new(); + + /* Create a regular smartlist. */ + (void)arg; + consensus_split_lines(sl, "a\nd\nc\na\nb\n", area); + + /* See that smartlist_slice_string_pos respects the bounds of the slice. */ + sls = smartlist_slice(sl, 2, 5); + cdline_t a_line = { "a", 1 }; + tt_int_op(3, OP_EQ, smartlist_slice_string_pos(sls, &a_line)); + cdline_t d_line = { "d", 1 }; + tt_int_op(-1, OP_EQ, smartlist_slice_string_pos(sls, &d_line)); + + done: + tor_free(sls); + smartlist_free(sl); + memarea_drop_all(area); +} + +static void +test_consdiff_lcs_lengths(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_slice_t *sls1, *sls2; + int *lengths1, *lengths2; + memarea_t *area = memarea_new(); + + /* Expected lcs lengths in regular and reverse order. */ + int e_lengths1[] = { 0, 1, 2, 3, 3, 4 }; + int e_lengths2[] = { 0, 1, 1, 2, 3, 4 }; + + (void)arg; + consensus_split_lines(sl1, "a\nb\nc\nd\ne\n", area); + consensus_split_lines(sl2, "a\nc\nd\ni\ne\n", area); + + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + + lengths1 = lcs_lengths(sls1, sls2, 1); + lengths2 = lcs_lengths(sls1, sls2, -1); + tt_mem_op(e_lengths1, OP_EQ, lengths1, sizeof(int) * 6); + tt_mem_op(e_lengths2, OP_EQ, lengths2, sizeof(int) * 6); + + done: + tor_free(lengths1); + tor_free(lengths2); + tor_free(sls1); + tor_free(sls2); + smartlist_free(sl1); + smartlist_free(sl2); + memarea_drop_all(area); +} + +static void +test_consdiff_trim_slices(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_t *sl3 = smartlist_new(); + smartlist_t *sl4 = smartlist_new(); + smartlist_slice_t *sls1, *sls2, *sls3, *sls4; + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\nb\nb\nb\nd\n", area); + consensus_split_lines(sl2, "a\nc\nc\nc\nd\n", area); + consensus_split_lines(sl3, "a\nb\nb\nb\na\n", area); + consensus_split_lines(sl4, "c\nb\nb\nb\nc\n", area); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + sls3 = smartlist_slice(sl3, 0, -1); + sls4 = smartlist_slice(sl4, 0, -1); + + /* They should be trimmed by one line at each end. */ + tt_int_op(5, OP_EQ, sls1->len); + tt_int_op(5, OP_EQ, sls2->len); + trim_slices(sls1, sls2); + tt_int_op(3, OP_EQ, sls1->len); + tt_int_op(3, OP_EQ, sls2->len); + + /* They should not be trimmed at all. */ + tt_int_op(5, OP_EQ, sls3->len); + tt_int_op(5, OP_EQ, sls4->len); + trim_slices(sls3, sls4); + tt_int_op(5, OP_EQ, sls3->len); + tt_int_op(5, OP_EQ, sls4->len); + + done: + tor_free(sls1); + tor_free(sls2); + tor_free(sls3); + tor_free(sls4); + smartlist_free(sl1); + smartlist_free(sl2); + smartlist_free(sl3); + smartlist_free(sl4); + memarea_drop_all(area); +} + +static void +test_consdiff_set_changed(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + bitarray_t *changed1 = bitarray_init_zero(4); + bitarray_t *changed2 = bitarray_init_zero(4); + smartlist_slice_t *sls1, *sls2; + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\nb\na\na\n", area); + consensus_split_lines(sl2, "a\na\na\na\n", area); + + /* Length of sls1 is 0. */ + sls1 = smartlist_slice(sl1, 0, 0); + sls2 = smartlist_slice(sl2, 1, 3); + set_changed(changed1, changed2, sls1, sls2); + + /* The former is not changed, the latter changes all of its elements. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + bitarray_clear(changed2, 1); + bitarray_clear(changed2, 2); + + /* Length of sls1 is 1 and its element is in sls2. */ + tor_free(sls1); + sls1 = smartlist_slice(sl1, 0, 1); + set_changed(changed1, changed2, sls1, sls2); + + /* The latter changes all elements but the (first) common one. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(!bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + bitarray_clear(changed2, 2); + + /* Length of sls1 is 1 and its element is not in sls2. */ + tor_free(sls1); + sls1 = smartlist_slice(sl1, 1, 2); + set_changed(changed1, changed2, sls1, sls2); + + /* The former changes its element, the latter changes all elements. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + + done: + bitarray_free(changed1); + bitarray_free(changed2); + smartlist_free(sl1); + smartlist_free(sl2); + tor_free(sls1); + tor_free(sls2); + memarea_drop_all(area); +} + +static void +test_consdiff_calc_changes(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_slice_t *sls1, *sls2; + bitarray_t *changed1 = bitarray_init_zero(4); + bitarray_t *changed2 = bitarray_init_zero(4); + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\na\na\na\n", area); + consensus_split_lines(sl2, "a\na\na\na\n", area); + + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* Nothing should be set to changed. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(!bitarray_is_set(changed2, 1)); + tt_assert(!bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + + smartlist_clear(sl2); + consensus_split_lines(sl2, "a\nb\na\nb\n", area); + tor_free(sls1); + tor_free(sls2); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* Two elements are changed. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + bitarray_clear(changed1, 1); + bitarray_clear(changed1, 2); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(!bitarray_is_set(changed2, 2)); + tt_assert(bitarray_is_set(changed2, 3)); + bitarray_clear(changed1, 1); + bitarray_clear(changed1, 3); + + smartlist_clear(sl2); + consensus_split_lines(sl2, "b\nb\nb\nb\n", area); + tor_free(sls1); + tor_free(sls2); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* All elements are changed. */ + tt_assert(bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(bitarray_is_set(changed1, 2)); + tt_assert(bitarray_is_set(changed1, 3)); + + tt_assert(bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(bitarray_is_set(changed2, 3)); + + done: + bitarray_free(changed1); + bitarray_free(changed2); + smartlist_free(sl1); + smartlist_free(sl2); + tor_free(sls1); + tor_free(sls2); + memarea_drop_all(area); +} + +static void +test_consdiff_get_id_hash(void *arg) +{ + (void)arg; + + cdline_t line1 = { "r name", 6 }; + cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; + cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; + cdline_t tmp; + + /* No hash. */ + tt_int_op(-1, OP_EQ, get_id_hash(&line1, &tmp)); + /* The hash contains characters that are not base64. */ + tt_int_op(-1, OP_EQ, get_id_hash(&line2, &tmp)); + + /* valid hash. */ + tt_int_op(0, OP_EQ, get_id_hash(&line3, &tmp)); + tt_ptr_op(tmp.s, OP_EQ, line3.s + 7); + tt_uint_op(tmp.len, OP_EQ, line3.len - 11); + + done: + ; +} + +static void +test_consdiff_is_valid_router_entry(void *arg) +{ + /* Doesn't start with "r ". */ + (void)arg; + cdline_t line0 = { "foo", 3 }; + tt_int_op(0, OP_EQ, is_valid_router_entry(&line0)); + + /* These are already tested with get_id_hash, but make sure it's run + * properly. */ + + cdline_t line1 = { "r name", 6 }; + cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; + cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; + tt_int_op(0, OP_EQ, is_valid_router_entry(&line1)); + tt_int_op(0, OP_EQ, is_valid_router_entry(&line2)); + tt_int_op(1, OP_EQ, is_valid_router_entry(&line3)); + + done: + ; +} + +static void +test_consdiff_next_router(void *arg) +{ + smartlist_t *sl = smartlist_new(); + memarea_t *area = memarea_new(); + (void)arg; + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, + "r name hash+longer+than+27+chars+and+valid+base64 etc"); + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, + "r name hash+longer+than+27+chars+and+valid+base64 etc"); + smartlist_add_linecpy(sl, area, "foo"); + + /* Not currently on a router entry line, finding the next one. */ + tt_int_op(1, OP_EQ, next_router(sl, 0)); + tt_int_op(4, OP_EQ, next_router(sl, 2)); + + /* Already at the beginning of a router entry line, ignore it. */ + tt_int_op(4, OP_EQ, next_router(sl, 1)); + + /* There are no more router entries, so return the line after the last. */ + tt_int_op(6, OP_EQ, next_router(sl, 4)); + tt_int_op(6, OP_EQ, next_router(sl, 5)); + + done: + smartlist_free(sl); + memarea_drop_all(area); +} + +static int +base64cmp_wrapper(const char *a, const char *b) +{ + cdline_t aa = { a, a ? (uint32_t) strlen(a) : 0 }; + cdline_t bb = { b, b ? (uint32_t) strlen(b) : 0 }; + return base64cmp(&aa, &bb); +} + +static void +test_consdiff_base64cmp(void *arg) +{ + /* NULL arguments. */ + (void)arg; + tt_int_op(0, OP_EQ, base64cmp_wrapper(NULL, NULL)); + tt_int_op(-1, OP_EQ, base64cmp_wrapper(NULL, "foo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("bar", NULL)); + + /* Nil base64 values. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("", "")); + tt_int_op(0, OP_EQ, base64cmp_wrapper("_", "&")); + + /* Exact same valid strings. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+", "abcABC/+")); + /* Both end with an invalid base64 char other than '\0'. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+ ")); + /* Only one ends with an invalid base64 char other than '\0'. */ + tt_int_op(-1, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+a")); + + /* Comparisons that would return differently with strcmp(). */ + tt_int_op(-1, OP_EQ, strcmp("/foo", "Afoo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("/foo", "Afoo")); + tt_int_op(1, OP_EQ, strcmp("Afoo", "0foo")); + tt_int_op(-1, OP_EQ, base64cmp_wrapper("Afoo", "0foo")); + + /* Comparisons that would return the same as with strcmp(). */ + tt_int_op(1, OP_EQ, strcmp("afoo", "Afoo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("afoo", "Afoo")); + + /* Different lengths */ + tt_int_op(-1, OP_EQ, base64cmp_wrapper("afoo", "afooo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("afooo", "afoo")); + + done: + ; +} + +static void +test_consdiff_gen_ed_diff(void *arg) +{ + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + int i; + memarea_t *area = memarea_new(); + setup_capture_of_logs(LOG_WARN); + + (void)arg; + cons1 = smartlist_new(); + cons2 = smartlist_new(); + + /* Identity hashes are not sorted properly, return NULL. */ + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + smartlist_add_linecpy(cons1, area, "bar"); + + smartlist_add_linecpy(cons2, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + smartlist_add_linecpy(cons2, area, "foo"); + smartlist_add_linecpy(cons2, area, "r name ccccccccccccccccccccccccccc etc"); + smartlist_add_linecpy(cons2, area, "bar"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + /* Same, but now with the second consensus. */ + mock_clean_saved_logs(); + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the target consensus doesn't have its router entries sorted " + "properly."); + + /* Same as the two above, but with the reversed thing immediately after a + match. (The code handles this differently) */ + smartlist_del(cons1, 0); + smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the target consensus doesn't have its router entries sorted " + "properly."); + + /* Identity hashes are repeated, return NULL. */ + smartlist_clear(cons1); + + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "bar"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + /* We have to add a line that is just a dot, return NULL. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + smartlist_add_linecpy(cons1, area, "foo1"); + smartlist_add_linecpy(cons1, area, "foo2"); + + smartlist_add_linecpy(cons2, area, "foo1"); + smartlist_add_linecpy(cons2, area, "."); + smartlist_add_linecpy(cons2, area, "foo2"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Cannot generate consensus diff " + "because one of the lines to be added is \".\"."); + +#define MAX_LINE_COUNT (10000) + /* Too many lines to be fed to the quadratic-time function. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "a"); + for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "b"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because we found too few common router ids."); + + /* We have dot lines, but they don't interfere with the script format. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + smartlist_add_linecpy(cons1, area, "foo1"); + smartlist_add_linecpy(cons1, area, "."); + smartlist_add_linecpy(cons1, area, "."); + smartlist_add_linecpy(cons1, area, "foo2"); + + smartlist_add_linecpy(cons2, area, "foo1"); + smartlist_add_linecpy(cons2, area, "."); + smartlist_add_linecpy(cons2, area, "foo2"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + smartlist_free(diff); + + /* Empty diff tests. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(0, OP_EQ, smartlist_len(diff)); + smartlist_free(diff); + + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "bar"); + + smartlist_add_linecpy(cons2, area, "foo"); + smartlist_add_linecpy(cons2, area, "bar"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(0, OP_EQ, smartlist_len(diff)); + smartlist_free(diff); + + /* Everything is deleted. */ + smartlist_clear(cons2); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(1, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("1,2d", smartlist_get(diff, 0)); + + smartlist_free(diff); + + /* Everything is added. */ + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(4, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("0a", smartlist_get(diff, 0)); + tt_str_eq_line("foo", smartlist_get(diff, 1)); + tt_str_eq_line("bar", smartlist_get(diff, 2)); + tt_str_eq_line(".", smartlist_get(diff, 3)); + + smartlist_free(diff); + + /* Everything is changed. */ + smartlist_add_linecpy(cons2, area, "foo2"); + smartlist_add_linecpy(cons2, area, "bar2"); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(4, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("1,2c", smartlist_get(diff, 0)); + tt_str_eq_line("foo2", smartlist_get(diff, 1)); + tt_str_eq_line("bar2", smartlist_get(diff, 2)); + tt_str_eq_line(".", smartlist_get(diff, 3)); + + smartlist_free(diff); + + /* Test 'a', 'c' and 'd' together. See that it is done in reverse order. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); + consensus_split_lines(cons2, "A\nC\nO\nE\nU\n", area); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(7, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("5a", smartlist_get(diff, 0)); + tt_str_eq_line("U", smartlist_get(diff, 1)); + tt_str_eq_line(".", smartlist_get(diff, 2)); + tt_str_eq_line("4c", smartlist_get(diff, 3)); + tt_str_eq_line("O", smartlist_get(diff, 4)); + tt_str_eq_line(".", smartlist_get(diff, 5)); + tt_str_eq_line("2d", smartlist_get(diff, 6)); + + smartlist_free(diff); + + smartlist_clear(cons1); + smartlist_clear(cons2); + consensus_split_lines(cons1, "B\n", area); + consensus_split_lines(cons2, "A\nB\n", area); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(3, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("0a", smartlist_get(diff, 0)); + tt_str_eq_line("A", smartlist_get(diff, 1)); + tt_str_eq_line(".", smartlist_get(diff, 2)); + + /* TODO: small real use-cases, i.e. consensuses. */ + + done: + teardown_capture_of_logs(); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_apply_ed_diff(void *arg) +{ + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + memarea_t *area = memarea_new(); + (void)arg; + cons1 = smartlist_new(); + diff = smartlist_new(); + setup_capture_of_logs(LOG_WARN); + + consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); + + /* Command without range. */ + smartlist_add_linecpy(diff, area, "a"); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + smartlist_clear(diff); + expect_single_log_msg_containing("an ed command was missing a line number"); + + /* Range without command. */ + smartlist_add_linecpy(diff, area, "1"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("a line with no ed command was found"); + + smartlist_clear(diff); + + /* Range without end. */ + smartlist_add_linecpy(diff, area, "1,"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a range " + "end line number."); + + smartlist_clear(diff); + + /* Incoherent ranges. */ + smartlist_add_linecpy(diff, area, "1,1"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an invalid range was found"); + + smartlist_clear(diff); + + smartlist_add_linecpy(diff, area, "3,2"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an invalid range was found"); + + smartlist_clear(diff); + + /* Unexpected range for add command. */ + smartlist_add_linecpy(diff, area, "1,2a"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("add lines after a range"); + + smartlist_clear(diff); + + /* Script is not in reverse order. */ + smartlist_add_linecpy(diff, area, "1d"); + smartlist_add_linecpy(diff, area, "3d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("its commands are not properly sorted"); + + smartlist_clear(diff); + + /* Script contains unrecognised commands longer than one char. */ + smartlist_add_linecpy(diff, area, "1foo"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* Script contains unrecognised commands. */ + smartlist_add_linecpy(diff, area, "1e"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an unrecognised ed command was found"); + + smartlist_clear(diff); + + /* Command that should be followed by at least one line and a ".", but + * isn't. */ + smartlist_add_linecpy(diff, area, "0a"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it has an ed command that tries to " + "insert zero lines."); + + /* Now it is followed by a ".", but it inserts zero lines. */ + smartlist_add_linecpy(diff, area, "."); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it has an ed command that tries to " + "insert zero lines."); + + smartlist_clear(diff); + + /* Now it it inserts something, but has no terminator. */ + smartlist_add_linecpy(diff, area, "0a"); + smartlist_add_linecpy(diff, area, "hello"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("lines to be inserted that don't end with " + "a \".\"."); + + smartlist_clear(diff); + + /* Ranges must be numeric only and cannot contain spaces. */ + smartlist_add_linecpy(diff, area, "0, 4d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a range " + "end line number."); + + smartlist_clear(diff); + + /* '+' is not a number. */ + smartlist_add_linecpy(diff, area, "+0,4d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a line number"); + + smartlist_clear(diff); + + /* range duplication */ + smartlist_add_linecpy(diff, area, "0,4d,5d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* space before command */ + smartlist_add_linecpy(diff, area, "0,4 d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* space inside number */ + smartlist_add_linecpy(diff, area, "0,4 5d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* Test appending text, 'a'. */ + consensus_split_lines(diff, "3a\nU\nO\n.\n0a\nV\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(8, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("V", smartlist_get(cons2, 0)); + tt_str_eq_line("A", smartlist_get(cons2, 1)); + tt_str_eq_line("B", smartlist_get(cons2, 2)); + tt_str_eq_line("C", smartlist_get(cons2, 3)); + tt_str_eq_line("U", smartlist_get(cons2, 4)); + tt_str_eq_line("O", smartlist_get(cons2, 5)); + tt_str_eq_line("D", smartlist_get(cons2, 6)); + tt_str_eq_line("E", smartlist_get(cons2, 7)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test deleting text, 'd'. */ + consensus_split_lines(diff, "4d\n1,2d\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(2, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("C", smartlist_get(cons2, 0)); + tt_str_eq_line("E", smartlist_get(cons2, 1)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test changing text, 'c'. */ + consensus_split_lines(diff, "4c\nT\nX\n.\n1,2c\nM\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(5, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("M", smartlist_get(cons2, 0)); + tt_str_eq_line("C", smartlist_get(cons2, 1)); + tt_str_eq_line("T", smartlist_get(cons2, 2)); + tt_str_eq_line("X", smartlist_get(cons2, 3)); + tt_str_eq_line("E", smartlist_get(cons2, 4)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test 'a', 'd' and 'c' together. */ + consensus_split_lines(diff, "4c\nT\nX\n.\n2d\n0a\nM\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(6, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("M", smartlist_get(cons2, 0)); + tt_str_eq_line("A", smartlist_get(cons2, 1)); + tt_str_eq_line("C", smartlist_get(cons2, 2)); + tt_str_eq_line("T", smartlist_get(cons2, 3)); + tt_str_eq_line("X", smartlist_get(cons2, 4)); + tt_str_eq_line("E", smartlist_get(cons2, 5)); + + done: + teardown_capture_of_logs(); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_gen_diff(void *arg) +{ + char *cons1_str=NULL, *cons2_str=NULL; + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + consensus_digest_t digests1, digests2; + memarea_t *area = memarea_new(); + (void)arg; + cons1 = smartlist_new(); + cons2 = smartlist_new(); + + /* Identity hashes are not sorted properly, return NULL. + * Already tested in gen_ed_diff, but see that a NULL ed diff also makes + * gen_diff return NULL. */ + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name bbbbbbbbbbbbbbbbb etc\nfoo\n" + "r name aaaaaaaaaaaaaaaaa etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + cons2_str = tor_strdup( + "network-status-version foo\n" + "r name aaaaaaaaaaaaaaaaa etc\nfoo\n" + "r name ccccccccccccccccc etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons1_str, &digests1)); + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons2_str, &digests2)); + + consensus_split_lines(cons1, cons1_str, area); + consensus_split_lines(cons2, cons2_str, area); + + diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); + tt_ptr_op(NULL, OP_EQ, diff); + + /* Check that the headers are done properly. */ + tor_free(cons1_str); + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nfoo\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons1_str, &digests1)); + smartlist_clear(cons1); + consensus_split_lines(cons1, cons1_str, area); + diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(7, OP_EQ, smartlist_len(diff)); + tt_assert(line_str_eq(smartlist_get(diff, 0), + "network-status-diff-version 1")); + tt_assert(line_str_eq(smartlist_get(diff, 1), "hash " + "06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4 " + "7AFECEFA4599BA33D603653E3D2368F648DF4AC4723929B0F7CF39281596B0C1")); + tt_assert(line_str_eq(smartlist_get(diff, 2), "3,4d")); + tt_assert(line_str_eq(smartlist_get(diff, 3), "1a")); + tt_assert(line_str_eq(smartlist_get(diff, 4), + "r name aaaaaaaaaaaaaaaaa etc")); + tt_assert(line_str_eq(smartlist_get(diff, 5), "foo")); + tt_assert(line_str_eq(smartlist_get(diff, 6), ".")); + + /* TODO: small real use-cases, i.e. consensuses. */ + + done: + tor_free(cons1_str); + tor_free(cons2_str); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_apply_diff(void *arg) +{ + smartlist_t *cons1=NULL, *diff=NULL; + char *cons1_str=NULL, *cons2 = NULL; + consensus_digest_t digests1; + (void)arg; + memarea_t *area = memarea_new(); + cons1 = smartlist_new(); + diff = smartlist_new(); + setup_capture_of_logs(LOG_INFO); + + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nfoo\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons1_str, &digests1)); + consensus_split_lines(cons1, cons1_str, area); + + /* diff doesn't have enough lines. */ + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("too short") + + /* first line doesn't match format-version string. */ + smartlist_add_linecpy(diff, area, "foo-bar"); + smartlist_add_linecpy(diff, area, "header-line"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("format is not known") + + /* The first word of the second header line is not "hash". */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "word a b"); + smartlist_add_linecpy(diff, area, "x"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("does not include the necessary digests") + + /* Wrong number of words after "hash". */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash a b c"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("does not include the necessary digests") + + /* base16 digests do not have the expected length. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash aaa bbb"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("includes base16-encoded digests of " + "incorrect size") + + /* base16 digests contain non-base16 characters. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + " ????????????????????????????????????????????????????????????????" + " ----------------------------------------------------------------"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("includes malformed digests") + + /* Invalid ed diff. + * As tested in apply_ed_diff, but check that apply_diff does return NULL if + * the ed diff can't be applied. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* sha256 of cons2. */ + " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); + smartlist_add_linecpy(diff, area, "foobar"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("because an ed command was missing a line " + "number") + + /* Base consensus doesn't match its digest as found in the diff. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* bogus sha256. */ + " 3333333333333333333333333333333333333333333333333333333333333333" + /* sha256 of cons2. */ + " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("base consensus doesn't match the digest " + "as found"); + + /* Resulting consensus doesn't match its digest as found in the diff. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* bogus sha3. */ + " 3333333333333333333333333333333333333333333333333333333333333333"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("resulting consensus doesn't match the " + "digest as found"); + +#if 0 + /* XXXX No longer possible, since we aren't using the other algorithm. */ + /* Resulting consensus digest cannot be computed */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* bogus sha3. */ + " 3333333333333333333333333333333333333333333333333333333333333333"); + smartlist_add_linecpy(diff, area, "1,2d"); // remove starting line + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("Could not compute digests of the consensus " + "resulting from applying a consensus diff."); +#endif + + /* Very simple test, only to see that nothing errors. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* sha3 of cons2. */ + " 90A418881B2FCAB3D9E60EE02E4D666D56CFA38F8A3B7AA3E0ADBA530DDA9353"); + smartlist_add_linecpy(diff, area, "3c"); + smartlist_add_linecpy(diff, area, "sample"); + smartlist_add_linecpy(diff, area, "."); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_NE, cons2); + tt_str_op( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n", OP_EQ, + cons2); + tor_free(cons2); + + /* Check that lowercase letters in base16-encoded digests work too. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646d6cf563a41869d3b02e73254372ae3140046c5e7d83c9f71e54976af9b4" + /* sha3 of cons2. */ + " 90a418881b2fcab3d9e60ee02e4d666d56cfa38f8a3b7aa3e0adba530dda9353"); + smartlist_add_linecpy(diff, area, "3c"); + smartlist_add_linecpy(diff, area, "sample"); + smartlist_add_linecpy(diff, area, "."); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_NE, cons2); + tt_str_op( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n", OP_EQ, + cons2); + tor_free(cons2); + + smartlist_clear(diff); + + done: + teardown_capture_of_logs(); + tor_free(cons1_str); + smartlist_free(cons1); + smartlist_free(diff); + memarea_drop_all(area); +} + +#define CONSDIFF_LEGACY(name) \ + { #name, test_consdiff_ ## name , 0, NULL, NULL } + +struct testcase_t consdiff_tests[] = { + CONSDIFF_LEGACY(smartlist_slice), + CONSDIFF_LEGACY(smartlist_slice_string_pos), + CONSDIFF_LEGACY(lcs_lengths), + CONSDIFF_LEGACY(trim_slices), + CONSDIFF_LEGACY(set_changed), + CONSDIFF_LEGACY(calc_changes), + CONSDIFF_LEGACY(get_id_hash), + CONSDIFF_LEGACY(is_valid_router_entry), + CONSDIFF_LEGACY(next_router), + CONSDIFF_LEGACY(base64cmp), + CONSDIFF_LEGACY(gen_ed_diff), + CONSDIFF_LEGACY(apply_ed_diff), + CONSDIFF_LEGACY(gen_diff), + CONSDIFF_LEGACY(apply_diff), + END_OF_TESTCASES +}; + diff --git a/src/test/test_consdiffmgr.c b/src/test/test_consdiffmgr.c new file mode 100644 index 0000000000..31ce6ce901 --- /dev/null +++ b/src/test/test_consdiffmgr.c @@ -0,0 +1,890 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFFMGR_PRIVATE + +#include "or.h" +#include "config.h" +#include "conscache.h" +#include "consdiff.h" +#include "consdiffmgr.h" +#include "cpuworker.h" +#include "networkstatus.h" +#include "workqueue.h" + +#include "test.h" +#include "log_test_helpers.h" + +// ============================== Setup/teardown the consdiffmgr +// These functions get run before/after each test in this module + +static void * +consdiffmgr_test_setup(const struct testcase_t *arg) +{ + (void)arg; + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = ddir_fname; // now owns the pointer. + check_private_dir(ddir_fname, CPD_CREATE, NULL); + + consdiff_cfg_t consdiff_cfg = { 7200, 300 }; + consdiffmgr_configure(&consdiff_cfg); + return (void *)1; // must return something non-null. +} +static int +consdiffmgr_test_teardown(const struct testcase_t *arg, void *ignore) +{ + (void)arg; + (void)ignore; + consdiffmgr_free_all(); + return 1; +} +static struct testcase_setup_t setup_diffmgr = { + consdiffmgr_test_setup, + consdiffmgr_test_teardown +}; + +// ============================== NS faking functions +// These functions are for making quick fake consensus objects and +// strings that are just good enough for consdiff and consdiffmgr. + +static networkstatus_t * +fake_ns_new(consensus_flavor_t flav, time_t valid_after) +{ + networkstatus_t *ns = tor_malloc_zero(sizeof(networkstatus_t)); + ns->type = NS_TYPE_CONSENSUS; + ns->flavor = flav; + ns->valid_after = valid_after; + return ns; +} + +static char * +fake_ns_body_new(consensus_flavor_t flav, time_t valid_after) +{ + const char *flavor_string = flav == FLAV_NS ? "" : " microdesc"; + char valid_after_string[ISO_TIME_LEN+1]; + + format_iso_time(valid_after_string, valid_after); + char *random_stuff = crypto_random_hostname(3, 25, "junk ", ""); + + char *consensus; + tor_asprintf(&consensus, + "network-status-version 3%s\n" + "vote-status consensus\n" + "valid-after %s\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "%s\n", + flavor_string, + valid_after_string, + random_stuff); + tor_free(random_stuff); + return consensus; +} + +// ============================== Cpuworker mocking code +// These mocking functions and types capture the cpuworker calls +// so we can inspect them and run them in the main thread. +static smartlist_t *fake_cpuworker_queue = NULL; +typedef struct fake_work_queue_ent_t { + enum workqueue_reply_t (*fn)(void *, void *); + void (*reply_fn)(void *); + void *arg; +} fake_work_queue_ent_t; +static struct workqueue_entry_s * +mock_cpuworker_queue_work(enum workqueue_reply_t (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg) +{ + if (! fake_cpuworker_queue) + fake_cpuworker_queue = smartlist_new(); + + fake_work_queue_ent_t *ent = tor_malloc_zero(sizeof(*ent)); + ent->fn = fn; + ent->reply_fn = reply_fn; + ent->arg = arg; + smartlist_add(fake_cpuworker_queue, ent); + return (struct workqueue_entry_s *)ent; +} +static int +mock_cpuworker_run_work(void) +{ + if (! fake_cpuworker_queue) + return 0; + SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { + enum workqueue_reply_t r = ent->fn(NULL, ent->arg); + if (r != WQ_RPL_REPLY) + return -1; + }); + return 0; +} +static void +mock_cpuworker_handle_replies(void) +{ + if (! fake_cpuworker_queue) + return; + SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { + ent->reply_fn(ent->arg); + tor_free(ent); + }); + smartlist_free(fake_cpuworker_queue); + fake_cpuworker_queue = NULL; +} + +// ============================== Other helpers + +static consdiff_status_t +lookup_diff_from(consensus_cache_entry_t **out, + consensus_flavor_t flav, + const char *str1) +{ + uint8_t digest[DIGEST256_LEN]; + crypto_digest256((char*)digest, str1, strlen(str1), DIGEST_SHA3_256); + return consdiffmgr_find_diff_from(out, flav, + DIGEST_SHA3_256, digest, sizeof(digest), + NO_METHOD); +} + +static int +lookup_apply_and_verify_diff(consensus_flavor_t flav, + const char *str1, + const char *str2) +{ + consensus_cache_entry_t *ent = NULL; + consdiff_status_t status = lookup_diff_from(&ent, flav, str1); + if (ent == NULL || status != CONSDIFF_AVAILABLE) + return -1; + + consensus_cache_entry_incref(ent); + size_t size; + char *diff_string = NULL; + int r = uncompress_or_copy(&diff_string, &size, ent); + consensus_cache_entry_decref(ent); + if (diff_string == NULL || r < 0) + return -1; + + char *applied = consensus_diff_apply(str1, diff_string); + tor_free(diff_string); + if (applied == NULL) + return -1; + + int match = !strcmp(applied, str2); + tor_free(applied); + return match ? 0 : -1; +} + +static void +cdm_reload(void) +{ + consdiffmgr_free_all(); + cdm_cache_get(); + consdiffmgr_rescan(); +} + +// ============================== Beginning of tests + +#if 0 +static int got_failure = 0; +static void +got_assertion_failure(void) +{ + ++got_failure; +} + +/* XXXX This test won't work, because there is currently no way to actually + * XXXX capture a real assertion failure. */ +static void +test_consdiffmgr_init_failure(void *arg) +{ + (void)arg; + // Capture assertions and bugs. + + /* As in ...test_setup, but do not create the datadir. The missing directory + * will cause a failure. */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = ddir_fname; // now owns the pointer. + + consdiff_cfg_t consdiff_cfg = { 7200, 300 }; + + tor_set_failed_assertion_callback(got_assertion_failure); + tor_capture_bugs_(1); + consdiffmgr_configure(&consdiff_cfg); // This should fail. + tt_int_op(got_failure, OP_EQ, 1); + const smartlist_t *bugs = tor_get_captured_bug_log_(); + tt_int_op(smartlist_len(bugs), OP_EQ, 1); + + done: + tor_end_capture_bugs_(); +} +#endif + +static void +test_consdiffmgr_sha3_helper(void *arg) +{ + (void) arg; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + config_line_t *lines = NULL; + char *mem_op_hex_tmp = NULL; + config_line_prepend(&lines, "good-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + config_line_prepend(&lines, "short-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF0"); + config_line_prepend(&lines, "long-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00DF00D"); + config_line_prepend(&lines, "not-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DXXXX"); + consensus_cache_entry_t *ent = + consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + + uint8_t buf[DIGEST256_LEN]; + tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, NULL, "good-sha")); + tt_int_op(0, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "good-sha")); + test_memeq_hex(buf, "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + + tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "missing-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "short-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "long-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "not-sha")); + + done: + consensus_cache_entry_decref(ent); + config_free_lines(lines); + tor_free(mem_op_hex_tmp); +} + +static void +test_consdiffmgr_add(void *arg) +{ + (void) arg; + time_t now = approx_time(); + + char *body = NULL; + + consensus_cache_entry_t *ent = NULL; + networkstatus_t *ns_tmp = fake_ns_new(FLAV_NS, now); + const char *dummy = "foo"; + int r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* If we add it again, it won't work */ + setup_capture_of_logs(LOG_INFO); + dummy = "bar"; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, -1); + expect_single_log_msg_containing("We already have a copy of that " + "consensus"); + mock_clean_saved_logs(); + + /* But it will work fine if the flavor is different */ + dummy = "baz"; + ns_tmp->flavor = FLAV_MICRODESC; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* And it will work fine if the time is different */ + dummy = "quux"; + ns_tmp->flavor = FLAV_NS; + ns_tmp->valid_after = now - 60; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* If we add one a long long time ago, it will fail. */ + dummy = "xyzzy"; + ns_tmp->valid_after = 86400 * 100; /* A few months into 1970 */ + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, -1); + expect_single_log_msg_containing("it's too old."); + + /* Try looking up a consensuses. */ + ent = cdm_cache_lookup_consensus(FLAV_NS, now-60); + tt_assert(ent); + consensus_cache_entry_incref(ent); + size_t s; + r = uncompress_or_copy(&body, &s, ent); + tt_int_op(r, OP_EQ, 0); + tt_int_op(s, OP_EQ, 4); + tt_mem_op(body, OP_EQ, "quux", 4); + + /* Try looking up another entry, but fail */ + tt_assert(NULL == cdm_cache_lookup_consensus(FLAV_MICRODESC, now-60)); + tt_assert(NULL == cdm_cache_lookup_consensus(FLAV_NS, now-61)); + + done: + networkstatus_vote_free(ns_tmp); + teardown_capture_of_logs(); + consensus_cache_entry_decref(ent); + tor_free(body); +} + +static void +test_consdiffmgr_make_diffs(void *arg) +{ + (void)arg; + networkstatus_t *ns = NULL; + char *ns_body = NULL, *md_ns_body = NULL, *md_ns_body_2 = NULL; + char *applied = NULL, *diff_text = NULL; + time_t now = approx_time(); + int r; + consensus_cache_entry_t *diff = NULL; + uint8_t md_ns_sha3[DIGEST256_LEN]; + consdiff_status_t diff_status; + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + // Try rescan with no consensuses: shouldn't crash or queue work. + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + // Make two consensuses, 1 hour sec ago. + ns = fake_ns_new(FLAV_NS, now-3600); + ns_body = fake_ns_body_new(FLAV_NS, now-3600); + r = consdiffmgr_add_consensus(ns_body, ns); + networkstatus_vote_free(ns); + tor_free(ns_body); + tt_int_op(r, OP_EQ, 0); + + ns = fake_ns_new(FLAV_MICRODESC, now-3600); + md_ns_body = fake_ns_body_new(FLAV_MICRODESC, now-3600); + r = consdiffmgr_add_consensus(md_ns_body, ns); + crypto_digest256((char*)md_ns_sha3, md_ns_body, strlen(md_ns_body), + DIGEST_SHA3_256); + networkstatus_vote_free(ns); + tt_int_op(r, OP_EQ, 0); + + // No diffs will be generated. + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + // Add a MD consensus from 45 minutes ago. This should cause one diff + // worth of work to get queued. + ns = fake_ns_new(FLAV_MICRODESC, now-45*60); + md_ns_body_2 = fake_ns_body_new(FLAV_MICRODESC, now-45*60); + r = consdiffmgr_add_consensus(md_ns_body_2, ns); + networkstatus_vote_free(ns); + tt_int_op(r, OP_EQ, 0); + + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, + DIGEST_SHA3_256, + md_ns_sha3, DIGEST256_LEN, + NO_METHOD); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); + + // Now run that process and get the diff. + r = mock_cpuworker_run_work(); + tt_int_op(r, OP_EQ, 0); + mock_cpuworker_handle_replies(); + + // At this point we should be able to get that diff. + diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, + DIGEST_SHA3_256, + md_ns_sha3, DIGEST256_LEN, + NO_METHOD); + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, diff_status); + tt_assert(diff); + + /* Make sure applying the diff actually works */ + const uint8_t *diff_body; + size_t diff_size; + r = consensus_cache_entry_get_body(diff, &diff_body, &diff_size); + tt_int_op(r, OP_EQ, 0); + diff_text = tor_memdup_nulterm(diff_body, diff_size); + applied = consensus_diff_apply(md_ns_body, diff_text); + tt_assert(applied); + tt_str_op(applied, OP_EQ, md_ns_body_2); + + /* Rescan again: no more work to do. */ + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + done: + tor_free(md_ns_body); + tor_free(md_ns_body_2); + tor_free(diff_text); + tor_free(applied); +} + +static void +test_consdiffmgr_diff_rules(void *arg) +{ + (void)arg; +#define N 6 + char *md_body[N], *ns_body[N]; + networkstatus_t *md_ns[N], *ns_ns[N]; + uint8_t md_ns_sha3[N][DIGEST256_LEN], ns_ns_sha3[N][DIGEST256_LEN]; + int i; + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* Create a bunch of consensus things at 15-second intervals. */ + time_t start = approx_time() - 120; + for (i = 0; i < N; ++i) { + time_t when = start + i * 15; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + ns_body[i] = fake_ns_body_new(FLAV_NS, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + ns_ns[i] = fake_ns_new(FLAV_NS, when); + crypto_digest256((char *)md_ns_sha3[i], md_body[i], strlen(md_body[i]), + DIGEST_SHA3_256); + crypto_digest256((char *)ns_ns_sha3[i], ns_body[i], strlen(ns_body[i]), + DIGEST_SHA3_256); + } + + /* For the MD consensuses: add 4 of them, and make sure that + * diffs are created to one consensus (the most recent) only. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[4], md_ns[4])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(3, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + /* For the NS consensuses: add 3, generate, and add one older one and + * make sure that older one is the only one whose diff is generated */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[0], ns_ns[0])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[1], ns_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[5], ns_ns[5])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + /* At this point, we should actually have working diffs! */ + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); + + /* Self-to-self diff won't be present */ + consensus_cache_entry_t *ent; + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, ns_body[5])); + /* No diff from 2 has been added yet */ + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, ns_body[2])); + /* No diff arriving at old things. */ + tt_int_op(-1, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + /* No backwards diff */ + tt_int_op(-1, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[4], md_body[3])); + + /* Now, an update: add number 2 and make sure it's the only one whose diff + * is regenerated. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[2], ns_ns[2])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); + + /* Finally: reload, and make sure that the information is still indexed */ + cdm_reload(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); + + done: + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + tor_free(ns_body[i]); + networkstatus_vote_free(md_ns[i]); + networkstatus_vote_free(ns_ns[i]); + } + UNMOCK(cpuworker_queue_work); +#undef N +} + +static void +test_consdiffmgr_diff_failure(void *arg) +{ + (void)arg; + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* We're going to make sure that if we have a bogus request where + * we can't actually compute a diff, the world must not end. */ + networkstatus_t *ns1 = NULL; + networkstatus_t *ns2 = NULL; + int r; + + ns1 = fake_ns_new(FLAV_NS, approx_time()-100); + ns2 = fake_ns_new(FLAV_NS, approx_time()-50); + r = consdiffmgr_add_consensus("foo bar baz\n", ns1); + tt_int_op(r, OP_EQ, 0); + // We refuse to compute a diff to or from a line holding only a single dot. + // We can add it here, though. + r = consdiffmgr_add_consensus("foo bar baz\n.\n.\n", ns2); + tt_int_op(r, OP_EQ, 0); + + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + setup_capture_of_logs(LOG_WARN); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + expect_single_log_msg_containing("one of the lines to be added is \".\"."); + mock_clean_saved_logs(); + mock_cpuworker_handle_replies(); + expect_single_log_msg_containing("Worker was unable to compute consensus " + "diff from "); + + /* Make sure the diff is not present */ + consensus_cache_entry_t *ent; + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, "foo bar baz\n")); + + done: + teardown_capture_of_logs(); + UNMOCK(cpuworker_queue_work); + networkstatus_vote_free(ns1); + networkstatus_vote_free(ns2); +} + +static void +test_consdiffmgr_diff_pending(void *arg) +{ +#define N 3 + (void)arg; + char *md_body[N]; + networkstatus_t *md_ns[N]; + time_t start = approx_time() - 120; + int i; + for (i = 0; i < N; ++i) { + time_t when = start + i * 30; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + } + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + /* Make a diff */ + consdiffmgr_rescan(); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + + /* Look it up. Is it pending? */ + consensus_cache_entry_t *ent = NULL; + consdiff_status_t diff_status; + diff_status = lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1]); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); + tt_ptr_op(ent, OP_EQ, NULL); + + /* Add another old consensus. only one new diff should launch! */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); + consdiffmgr_rescan(); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + + done: + UNMOCK(cpuworker_queue_work); + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + networkstatus_vote_free(md_ns[i]); + } +#undef N +} + +static void +test_consdiffmgr_cleanup_old(void *arg) +{ + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + /* This item will be will be cleanable because it has a valid-after + * time far in the past. */ + config_line_prepend(&labels, "document-type", "confribble-blarg"); + config_line_prepend(&labels, "consensus-valid-after", + "1980-10-10T10:10:10"); + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(1, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Deleting entry because its consensus-valid-" + "after value (1980-10-10T10:10:10) was too old"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_bad_valid_after(void *arg) +{ + /* This will seem cleanable, but isn't, because its valid-after time is + * misformed. */ + + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + config_line_prepend(&labels, "document-type", "consensus"); + config_line_prepend(&labels, "consensus-valid-after", + "whan that aprille with his shoures soote"); // (~1385?) + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Ignoring entry because its consensus-valid-" + "after value (\"whan that aprille with his " + "shoures soote\") was unparseable"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_no_valid_after(void *arg) +{ + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + /* This item will be will be uncleanable because it has no recognized + * valid-after. */ + config_line_prepend(&labels, "document-type", "consensus"); + config_line_prepend(&labels, "confrooble-voolid-oofter", + "2010-10-10T09:08:07"); + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Ignoring entry because it had no consensus-" + "valid-after label"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_old_diffs(void *arg) +{ + (void)arg; +#define N 4 + char *md_body[N]; + networkstatus_t *md_ns[N]; + uint8_t md_ns_sha3[N][DIGEST256_LEN]; + int i; + consensus_cache_entry_t *hold_ent = NULL, *ent; + + /* Make sure that the cleanup function removes diffs to the not-most-recent + * consensus. */ + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* Create a bunch of consensus things at 15-second intervals. */ + time_t start = approx_time() - 120; + for (i = 0; i < N; ++i) { + time_t when = start + i * 15; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + crypto_digest256((char *)md_ns_sha3[i], md_body[i], strlen(md_body[i]), + DIGEST_SHA3_256); + } + + /* add the first 3. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + /* Make diffs. */ + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + /* Nothing is deletable now */ + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, + lookup_diff_from(&hold_ent, FLAV_MICRODESC, md_body[1])); + consensus_cache_entry_incref(hold_ent); // incref, so it is preserved. + + /* Now add an even-more-recent consensus; this should make all previous + * diffs deletable */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); + tt_int_op(2 * n_diff_compression_methods(), OP_EQ, consdiffmgr_cleanup()); + + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); + /* This one is marked deletable but still in the hashtable */ + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); + + /* Everything should be valid at this point */ + tt_int_op(0, OP_EQ, consdiffmgr_validate()); + + /* And if we recan NOW, we'll purge the hashtable of the entries, + * and launch attempts to generate new ones */ + consdiffmgr_rescan(); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); + + /* We're still holding on to this, though, so we can still map it! */ + const uint8_t *t1 = NULL; + size_t s; + int r = consensus_cache_entry_get_body(hold_ent, &t1, &s); + tt_int_op(r, OP_EQ, 0); + tt_assert(t1); + + done: + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + networkstatus_vote_free(md_ns[i]); + } + consensus_cache_entry_decref(hold_ent); + UNMOCK(cpuworker_queue_work); +#undef N +} + +static void +test_consdiffmgr_validate(void *arg) +{ + (void)arg; + config_line_t *lines = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + smartlist_t *vals = smartlist_new(); + + /* Put these: objects in the cache: one with a good sha3, one with bad sha3, + * one with a wrong sha3, and one with no sha3. */ + config_line_prepend(&lines, "id", "wrong sha3"); + config_line_prepend(&lines, "sha3-digest", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "bad sha3"); + config_line_prepend(&lines, "sha3-digest", + "now is the winter of our dicotheque"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "no sha3"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "good sha3"); + config_line_prepend(&lines, "sha3-digest", + "8d8b1998616cd6b4c4055da8d38728dc" + "93c758d4131a53c7d81aa6337dee1c05"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + cdm_reload(); + cache = cdm_cache_get(); + tt_int_op(1, OP_EQ, consdiffmgr_validate()); + + consensus_cache_find_all(vals, cache, "id", "good sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 1); + smartlist_clear(vals); + + consensus_cache_find_all(vals, cache, "id", "no sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 1); + smartlist_clear(vals); + + consensus_cache_find_all(vals, cache, "id", "wrong sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 0); + consensus_cache_find_all(vals, cache, "id", "bad sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 0); + + done: + smartlist_free(vals); +} + +#define TEST(name) \ + { #name, test_consdiffmgr_ ## name , TT_FORK, &setup_diffmgr, NULL } + +struct testcase_t consdiffmgr_tests[] = { +#if 0 + { "init_failure", test_consdiffmgr_init_failure, TT_FORK, NULL, NULL }, +#endif + TEST(sha3_helper), + TEST(add), + TEST(make_diffs), + TEST(diff_rules), + TEST(diff_failure), + TEST(diff_pending), + TEST(cleanup_old), + TEST(cleanup_bad_valid_after), + TEST(cleanup_no_valid_after), + TEST(cleanup_old_diffs), + TEST(validate), + + // XXXX Test: non-cacheing cases of replyfn(). + + END_OF_TESTCASES +}; + diff --git a/src/test/test_containers.c b/src/test/test_containers.c index 41f3f873de..54484a2a91 100644 --- a/src/test/test_containers.c +++ b/src/test/test_containers.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_controller.c b/src/test/test_controller.c index 206315e289..592f91a988 100644 --- a/src/test/test_controller.c +++ b/src/test/test_controller.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONTROL_PRIVATE diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c index 11e1e3dc8f..901ad7ab3d 100644 --- a/src/test/test_controller_events.c +++ b/src/test/test_controller_events.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONNECTION_PRIVATE diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c index d66ddccd4f..ec9d4e2709 100644 --- a/src/test/test_crypto.c +++ b/src/test/test_crypto.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -15,9 +15,6 @@ #include "crypto_ed25519.h" #include "ed25519_vectors.inc" -#include <openssl/evp.h> -#include <openssl/rand.h> - /** Run unit tests for Diffie-Hellman functionality. */ static void test_crypto_dh(void *arg) @@ -331,38 +328,6 @@ test_crypto_rng_strongest(void *arg) #undef N } -/* Test for rectifying openssl RAND engine. */ -static void -test_crypto_rng_engine(void *arg) -{ - (void)arg; - RAND_METHOD dummy_method; - memset(&dummy_method, 0, sizeof(dummy_method)); - - /* We should be a no-op if we're already on RAND_OpenSSL */ - tt_int_op(0, ==, crypto_force_rand_ssleay()); - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - - /* We should correct the method if it's a dummy. */ - RAND_set_rand_method(&dummy_method); -#ifdef LIBRESSL_VERSION_NUMBER - /* On libressl, you can't override the RNG. */ - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - tt_int_op(0, ==, crypto_force_rand_ssleay()); -#else - tt_assert(RAND_get_rand_method() == &dummy_method); - tt_int_op(1, ==, crypto_force_rand_ssleay()); -#endif - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - - /* Make sure we aren't calling dummy_method */ - crypto_rand((void *) &dummy_method, sizeof(dummy_method)); - crypto_rand((void *) &dummy_method, sizeof(dummy_method)); - - done: - ; -} - /** Run unit tests for our AES128 functionality */ static void test_crypto_aes128(void *arg) @@ -1477,28 +1442,6 @@ test_crypto_digest_names(void *arg) ; } -#ifndef OPENSSL_1_1_API -#define EVP_ENCODE_CTX_new() tor_malloc_zero(sizeof(EVP_ENCODE_CTX)) -#define EVP_ENCODE_CTX_free(ctx) tor_free(ctx) -#endif - -/** Encode src into dest with OpenSSL's EVP Encode interface, returning the - * length of the encoded data in bytes. - */ -static int -base64_encode_evp(char *dest, char *src, size_t srclen) -{ - const unsigned char *s = (unsigned char*)src; - EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new(); - int len, ret; - - EVP_EncodeInit(ctx); - EVP_EncodeUpdate(ctx, (unsigned char *)dest, &len, s, (int)srclen); - EVP_EncodeFinal(ctx, (unsigned char *)(dest + len), &ret); - EVP_ENCODE_CTX_free(ctx); - return ret+ len; -} - /** Run unit tests for misc crypto formatting functionality (base64, base32, * fingerprints, etc) */ static void @@ -1527,7 +1470,7 @@ test_crypto_formats(void *arg) tt_int_op(i, OP_GE, 0); tt_int_op(i, OP_EQ, strlen(data2)); tt_assert(! strchr(data2, '=')); - j = base64_decode_nopad((uint8_t*)data3, 1024, data2, i); + j = base64_decode(data3, 1024, data2, i); tt_int_op(j, OP_EQ, idx); tt_mem_op(data3,OP_EQ, data1, idx); } @@ -1554,20 +1497,6 @@ test_crypto_formats(void *arg) tt_assert(digest_from_base64(data3, "###") < 0); - for (i = 0; i < 256; i++) { - /* Test the multiline format Base64 encoder with 0 .. 256 bytes of - * output against OpenSSL. - */ - const size_t enclen = base64_encode_size(i, BASE64_ENCODE_MULTILINE); - data1[i] = i; - j = base64_encode(data2, 1024, data1, i, BASE64_ENCODE_MULTILINE); - tt_int_op(j, OP_EQ, enclen); - j = base64_encode_evp(data3, data1, i); - tt_int_op(j, OP_EQ, enclen); - tt_mem_op(data2, OP_EQ, data3, enclen); - tt_int_op(j, OP_EQ, strlen(data2)); - } - /* Encoding SHA256 */ crypto_rand(data2, DIGEST256_LEN); memset(data2, 100, 1024); @@ -2941,7 +2870,6 @@ struct testcase_t crypto_tests[] = { CRYPTO_LEGACY(formats), CRYPTO_LEGACY(rng), { "rng_range", test_crypto_rng_range, 0, NULL, NULL }, - { "rng_engine", test_crypto_rng_engine, TT_FORK, NULL, NULL }, { "rng_strongest", test_crypto_rng_strongest, TT_FORK, NULL, NULL }, { "rng_strongest_nosyscall", test_crypto_rng_strongest, TT_FORK, &passthrough_setup, (void*)"nosyscall" }, diff --git a/src/test/test_crypto_openssl.c b/src/test/test_crypto_openssl.c new file mode 100644 index 0000000000..3d7d2b4639 --- /dev/null +++ b/src/test/test_crypto_openssl.c @@ -0,0 +1,107 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CRYPTO_PRIVATE + +#include "crypto.h" +#include "util.h" +#include "util_format.h" +#include "compat.h" +#include "test.h" + +#include <openssl/evp.h> +#include <openssl/rand.h> +#include "compat_openssl.h" + +/* Test for rectifying openssl RAND engine. */ +static void +test_crypto_rng_engine(void *arg) +{ + (void)arg; + RAND_METHOD dummy_method; + memset(&dummy_method, 0, sizeof(dummy_method)); + + /* We should be a no-op if we're already on RAND_OpenSSL */ + tt_int_op(0, ==, crypto_force_rand_ssleay()); + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + + /* We should correct the method if it's a dummy. */ + RAND_set_rand_method(&dummy_method); +#ifdef LIBRESSL_VERSION_NUMBER + /* On libressl, you can't override the RNG. */ + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + tt_int_op(0, ==, crypto_force_rand_ssleay()); +#else + tt_assert(RAND_get_rand_method() == &dummy_method); + tt_int_op(1, ==, crypto_force_rand_ssleay()); +#endif + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + + /* Make sure we aren't calling dummy_method */ + crypto_rand((void *) &dummy_method, sizeof(dummy_method)); + crypto_rand((void *) &dummy_method, sizeof(dummy_method)); + + done: + ; +} + +#ifndef OPENSSL_1_1_API +#define EVP_ENCODE_CTX_new() tor_malloc_zero(sizeof(EVP_ENCODE_CTX)) +#define EVP_ENCODE_CTX_free(ctx) tor_free(ctx) +#endif + +/** Encode src into dest with OpenSSL's EVP Encode interface, returning the + * length of the encoded data in bytes. + */ +static int +base64_encode_evp(char *dest, char *src, size_t srclen) +{ + const unsigned char *s = (unsigned char*)src; + EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new(); + int len, ret; + + EVP_EncodeInit(ctx); + EVP_EncodeUpdate(ctx, (unsigned char *)dest, &len, s, (int)srclen); + EVP_EncodeFinal(ctx, (unsigned char *)(dest + len), &ret); + EVP_ENCODE_CTX_free(ctx); + return ret+ len; +} + +static void +test_crypto_base64_encode_matches(void *arg) +{ + (void)arg; + int i, j; + char data1[1024]; + char data2[1024]; + char data3[1024]; + + for (i = 0; i < 256; i++) { + /* Test the multiline format Base64 encoder with 0 .. 256 bytes of + * output against OpenSSL. + */ + const size_t enclen = base64_encode_size(i, BASE64_ENCODE_MULTILINE); + data1[i] = i; + j = base64_encode(data2, 1024, data1, i, BASE64_ENCODE_MULTILINE); + tt_int_op(j, OP_EQ, enclen); + j = base64_encode_evp(data3, data1, i); + tt_int_op(j, OP_EQ, enclen); + tt_mem_op(data2, OP_EQ, data3, enclen); + tt_int_op(j, OP_EQ, strlen(data2)); + } + + done: + ; +} + +struct testcase_t crypto_openssl_tests[] = { + { "rng_engine", test_crypto_rng_engine, TT_FORK, NULL, NULL }, + { "base64_encode_match", test_crypto_base64_encode_matches, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_crypto_slow.c b/src/test/test_crypto_slow.c index 0d7d65ac73..d6b0a43dd5 100644 --- a/src/test/test_crypto_slow.c +++ b/src/test/test_crypto_slow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -12,11 +12,8 @@ #if defined(HAVE_LIBSCRYPT_H) && defined(HAVE_LIBSCRYPT_SCRYPT) #define HAVE_LIBSCRYPT -#include <libscrypt.h> #endif -#include <openssl/evp.h> - /** Run unit tests for our secret-to-key passphrase hashing functionality. */ static void test_crypto_s2k_rfc2440(void *arg) diff --git a/src/test/test_data.c b/src/test/test_data.c index 788489a097..ce6c3394f6 100644 --- a/src/test/test_data.c +++ b/src/test/test_data.c @@ -1,6 +1,6 @@ /* Copyright 2001-2004 Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "test.h" diff --git a/src/test/test_dir.c b/src/test/test_dir.c index 4e5876fa3c..a9d9cba7df 100644 --- a/src/test/test_dir.c +++ b/src/test/test_dir.c @@ -1,12 +1,13 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" #include <math.h> #define CONFIG_PRIVATE +#define CONTROL_PRIVATE #define DIRSERV_PRIVATE #define DIRVOTE_PRIVATE #define ROUTER_PRIVATE @@ -19,6 +20,7 @@ #include "or.h" #include "confparse.h" #include "config.h" +#include "control.h" #include "crypto_ed25519.h" #include "directory.h" #include "dirserv.h" @@ -329,7 +331,7 @@ test_dir_formats(void *arg) ntor_cc = make_ntor_onion_key_crosscert(&r2_onion_keypair, &kp1.pubkey, r2->cache_info.published_on, - MIN_ONION_KEY_LIFETIME, + get_onion_key_lifetime(), &ntor_cc_sign); tt_assert(ntor_cc); base64_encode(cert_buf, sizeof(cert_buf), @@ -910,6 +912,23 @@ mock_get_by_ei_desc_digest(const char *d) } } +static signed_descriptor_t * +mock_ei_get_by_ei_digest(const char *d) +{ + char hex[HEX_DIGEST_LEN+1]; + base16_encode(hex, sizeof(hex), d, DIGEST_LEN); + signed_descriptor_t *sd = &sd_ei_minimal; + + if (!strcmp(hex, "11E0EDF526950739F7769810FCACAB8C882FAEEE")) { + sd->signed_descriptor_body = (char *)EX_EI_MINIMAL; + sd->signed_descriptor_len = sizeof(EX_EI_MINIMAL); + sd->annotations_len = 0; + sd->saved_location = SAVED_NOWHERE; + return sd; + } + return NULL; +} + static smartlist_t *mock_ei_insert_list = NULL; static was_router_added_t mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible) @@ -999,6 +1018,37 @@ test_dir_load_extrainfo(void *arg) } static void +test_dir_getinfo_extra(void *arg) +{ + int r; + char *answer = NULL; + const char *errmsg = NULL; + + (void)arg; + MOCK(extrainfo_get_by_descriptor_digest, mock_ei_get_by_ei_digest); + r = getinfo_helper_dir(NULL, "extra-info/digest/" + "11E0EDF526950739F7769810FCACAB8C882FAEEE", &answer, + &errmsg); + tt_int_op(0, OP_EQ, r); + tt_ptr_op(NULL, OP_EQ, errmsg); + tt_str_op(answer, OP_EQ, EX_EI_MINIMAL); + tor_free(answer); + + answer = NULL; + r = getinfo_helper_dir(NULL, "extra-info/digest/" + "NOTAVALIDHEXSTRINGNOTAVALIDHEXSTRINGNOTA", &answer, + &errmsg); + tt_int_op(0, OP_EQ, r); + /* getinfo_helper_dir() should maybe return an error here but doesn't */ + tt_ptr_op(NULL, OP_EQ, errmsg); + /* In any case, there should be no answer for an invalid hex string. */ + tt_ptr_op(NULL, OP_EQ, answer); + + done: + UNMOCK(extrainfo_get_by_descriptor_digest); +} + +static void test_dir_versions(void *arg) { tor_version_t ver1; @@ -1065,6 +1115,7 @@ test_dir_versions(void *arg) tt_int_op(0, OP_EQ, ver1.patchlevel); tt_int_op(VER_RELEASE, OP_EQ, ver1.status); tt_str_op("alpha", OP_EQ, ver1.status_tag); + /* Go through the full set of status tags */ tt_int_op(0, OP_EQ, tor_version_parse("2.1.700-alpha", &ver1)); tt_int_op(2, OP_EQ, ver1.major); tt_int_op(1, OP_EQ, ver1.minor); @@ -1079,6 +1130,60 @@ test_dir_versions(void *arg) tt_int_op(0, OP_EQ, ver1.patchlevel); tt_int_op(VER_RELEASE, OP_EQ, ver1.status); tt_str_op("alpha-dev", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.5-rc", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(5, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("rc", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.6-rc-dev", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(6, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("rc-dev", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.8", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(8, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.9-dev", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(9, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("dev", OP_EQ, ver1.status_tag); + /* In #21450, we fixed an inconsistency in parsing versions > INT32_MAX + * between i386 and x86_64, as we used tor_parse_long, and then cast to int + */ + tt_int_op(0, OP_EQ, tor_version_parse("0.2147483647.0", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2147483647, OP_EQ, ver1.minor); + tt_int_op(0, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(-1, OP_EQ, tor_version_parse("0.2147483648.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.4294967295.0", &ver1)); + /* In #21278, we reject negative version components */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.-1.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.-2147483648.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.-4294967295.0", &ver1)); + /* In #21507, we reject version components with non-numeric prefixes */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.-0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("+1.0.0", &ver1)); + /* use the list in isspace() */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.\t0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\n0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\v0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\f0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\r0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0. 0.0", &ver1)); #define tt_versionstatus_op(vs1, op, vs2) \ tt_assert_test_type(vs1,vs2,#vs1" "#op" "#vs2,version_status_t, \ @@ -1098,6 +1203,7 @@ test_dir_versions(void *arg) test_v_i_o(VS_RECOMMENDED, "0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"); test_v_i_o(VS_OLD, "0.0.5.0", "0.0.5.1-cvs"); test_v_i_o(VS_NEW_IN_SERIES, "0.0.5.1-cvs", "0.0.5, 0.0.6"); + test_v_i_o(VS_NEW, "0.2.9.9-dev", "0.2.9.9"); /* Not on list, but newer than any in same series. */ test_v_i_o(VS_NEW_IN_SERIES, "0.1.0.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); @@ -1136,6 +1242,70 @@ test_dir_versions(void *arg) "Tor 0.2.1.0-dev (r99)")); tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.1", "Tor 0.2.1.0-dev (r99)")); + /* And git revisions */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072)", + "Tor 0.2.9.9 (git-56788a2489127072)")); + /* a git revision is newer than no git revision */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072)", + "Tor 0.2.9.9")); + /* a longer git revision is newer than a shorter git revision + * this should be true if they prefix-match, but if they don't, they are + * incomparable, because hashes aren't ordered (but we compare their bytes + * anyway) */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072d513cf4baf35a8ff475f3c7b)", + "Tor 0.2.9.9 (git-56788a2489127072)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-0102)", + "Tor 0.2.9.9 (git-03)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-0102)", + "Tor 0.2.9.9 (git-00)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-01)", + "Tor 0.2.9.9 (git-00)")); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-00)", + "Tor 0.2.9.9 (git-01)")); + /* In #21278, we comapre without integer overflows. + * But since #21450 limits version components to [0, INT32_MAX], it is no + * longer possible to cause an integer overflow in tor_version_compare() */ + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.0.0.0", + "Tor 2147483647.0.0.0")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 2147483647.0.0.0", + "Tor 0.0.0.0")); + /* These versions used to cause an overflow, now they don't parse + * (and authorities reject their descriptors), and log a BUG message */ + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.0.0.0", + "Tor 0.-2147483648.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2147483647.0.0", + "Tor 0.-1.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2147483647.0.0", + "Tor 0.-2147483648.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 4294967295.0.0.0", + "Tor 0.0.0.0")); + expect_no_log_entry(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.4294967295.0.0", + "Tor 0.-4294967295.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + teardown_capture_of_logs(); /* Now try git revisions */ tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1)); @@ -1145,11 +1315,24 @@ test_dir_versions(void *arg) tt_int_op(7,OP_EQ, ver1.patchlevel); tt_int_op(3,OP_EQ, ver1.git_tag_len); tt_mem_op(ver1.git_tag,OP_EQ, "\xff\x00\xff", 3); + /* reject bad hex digits */ tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1)); + /* reject odd hex digit count */ tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1)); + /* ignore "git " */ tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1)); + /* standard length is 16 hex digits */ + tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-0010203040506070)", + &ver1)); + /* length limit is 40 hex digits */ + tt_int_op(0,OP_EQ, tor_version_parse( + "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f10111213)", + &ver1)); + tt_int_op(-1,OP_EQ, tor_version_parse( + "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f1011121314)", + &ver1)); done: - ; + teardown_capture_of_logs(); } /** Run unit tests for directory fp_pair functions. */ @@ -4399,15 +4582,7 @@ test_dir_should_use_directory_guards(void *data) } NS_DECL(void, -directory_initiate_command_routerstatus, (const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - circuit_guard_state_t *guardstate)); +directory_initiate_request, (directory_request_t *req)); static void test_dir_should_not_init_request_to_ourselves(void *data) @@ -4417,7 +4592,7 @@ test_dir_should_not_init_request_to_ourselves(void *data) crypto_pk_t *key = pk_generate(2); (void) data; - NS_MOCK(directory_initiate_command_routerstatus); + NS_MOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); @@ -4432,15 +4607,15 @@ test_dir_should_not_init_request_to_ourselves(void *data) dir_server_add(ourself); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); done: - NS_UNMOCK(directory_initiate_command_routerstatus); + NS_UNMOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); crypto_pk_free(key); @@ -4454,7 +4629,7 @@ test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data) | MICRODESC_DIRINFO; (void) data; - NS_MOCK(directory_initiate_command_routerstatus); + NS_MOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); @@ -4465,14 +4640,14 @@ test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data) dir_server_add(ds); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); done: - NS_UNMOCK(directory_initiate_command_routerstatus); + NS_UNMOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); } @@ -4483,7 +4658,7 @@ test_dir_should_init_request_to_dir_auths(void *data) dir_server_t *ds = NULL; (void) data; - NS_MOCK(directory_initiate_command_routerstatus); + NS_MOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); @@ -4494,39 +4669,23 @@ test_dir_should_init_request_to_dir_auths(void *data) dir_server_add(ds); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 1); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 1); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 2); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 2); done: - NS_UNMOCK(directory_initiate_command_routerstatus); + NS_UNMOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); } void -NS(directory_initiate_command_routerstatus)(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - circuit_guard_state_t *guardstate) +NS(directory_initiate_request)(directory_request_t *req) { - (void)status; - (void)dir_purpose; - (void)router_purpose; - (void)indirection; - (void)resource; - (void)payload; - (void)payload_len; - (void)if_modified_since; - (void)guardstate; - CALLED(directory_initiate_command_routerstatus)++; + (void)req; + CALLED(directory_initiate_request)++; } static void @@ -5837,6 +5996,7 @@ struct testcase_t dir_tests[] = { DIR(parse_router_list, TT_FORK), DIR(load_routers, TT_FORK), DIR(load_extrainfo, TT_FORK), + DIR(getinfo_extra, 0), DIR_LEGACY(versions), DIR_LEGACY(fp_pairs), DIR(split_fps, 0), diff --git a/src/test/test_dir_common.c b/src/test/test_dir_common.c index ca43dd4c04..fca70249bd 100644 --- a/src/test/test_dir_common.c +++ b/src/test/test_dir_common.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_dir_common.h b/src/test/test_dir_common.h index 9682b0db49..65b9cf6436 100644 --- a/src/test/test_dir_common.h +++ b/src/test/test_dir_common.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_dir_handle_get.c b/src/test/test_dir_handle_get.c index a0868f9253..6e963913d1 100644 --- a/src/test/test_dir_handle_get.c +++ b/src/test/test_dir_handle_get.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define RENDCOMMON_PRIVATE @@ -14,6 +14,7 @@ #include "connection.h" #include "directory.h" #include "test.h" +#include "compress.h" #include "connection.h" #include "rendcommon.h" #include "rendcache.h" @@ -28,7 +29,6 @@ #include "networkstatus.h" #include "geoip.h" #include "dirserv.h" -#include "torgzip.h" #include "dirvote.h" #include "log_test_helpers.h" @@ -743,7 +743,7 @@ test_dir_handle_get_server_descriptors_not_found(void* data) NULL, NULL, 1, 0); tt_str_op(NOT_FOUND, OP_EQ, header); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_SERVER_BY_FP); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: UNMOCK(connection_write_to_buf_impl_); @@ -773,6 +773,7 @@ test_dir_handle_get_server_descriptors_all(void* data) tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); mock_routerinfo = smartlist_get(our_routerlist->routers, 0); set_server_identity_key(mock_routerinfo->identity_pkey); + mock_routerinfo->cache_info.published_on = time(NULL); /* Treat "all" requests as if they were unencrypted */ mock_routerinfo->cache_info.send_unencrypted = 1; @@ -787,7 +788,7 @@ test_dir_handle_get_server_descriptors_all(void* data) //which is smaller than that by annotation_len bytes fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, &body, &body_used, - mock_routerinfo->cache_info.signed_descriptor_len+1, 0); + 1024*1024, 0); tt_assert(header); tt_assert(body); @@ -803,7 +804,7 @@ test_dir_handle_get_server_descriptors_all(void* data) tt_str_op(body, OP_EQ, mock_routerinfo->cache_info.signed_descriptor_body + mock_routerinfo->cache_info.annotations_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: NS_UNMOCK(router_get_my_routerinfo); @@ -882,6 +883,7 @@ test_dir_handle_get_server_descriptors_authority(void* data) mock_routerinfo->cache_info.signed_descriptor_len = strlen(TEST_DESCRIPTOR) - annotation_len;; mock_routerinfo->cache_info.annotations_len = annotation_len; + mock_routerinfo->cache_info.published_on = time(NULL); conn = new_dir_conn(); @@ -904,7 +906,7 @@ test_dir_handle_get_server_descriptors_authority(void* data) tt_int_op(body_used, OP_EQ, strlen(body)); tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: NS_UNMOCK(router_get_my_routerinfo); @@ -946,6 +948,7 @@ test_dir_handle_get_server_descriptors_fp(void* data) mock_routerinfo->cache_info.signed_descriptor_len = strlen(TEST_DESCRIPTOR) - annotation_len; mock_routerinfo->cache_info.annotations_len = annotation_len; + mock_routerinfo->cache_info.published_on = time(NULL); conn = new_dir_conn(); @@ -975,7 +978,7 @@ test_dir_handle_get_server_descriptors_fp(void* data) tt_int_op(body_used, OP_EQ, strlen(body)); tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: NS_UNMOCK(router_get_my_routerinfo); @@ -1041,7 +1044,7 @@ test_dir_handle_get_server_descriptors_d(void* data) tt_str_op(body, OP_EQ, router->cache_info.signed_descriptor_body + router->cache_info.annotations_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: UNMOCK(connection_write_to_buf_impl_); @@ -1096,7 +1099,7 @@ test_dir_handle_get_server_descriptors_busy(void* data) tt_assert(header); tt_str_op(SERVER_BUSY, OP_EQ, header); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: UNMOCK(get_options); @@ -1829,8 +1832,8 @@ test_dir_handle_get_status_vote_current_consensus_ns(void* data) comp_body_used); tt_int_op(ZLIB_METHOD, OP_EQ, compression); - tor_gzip_uncompress(&body, &body_used, comp_body, comp_body_used, - compression, 0, LOG_PROTOCOL_WARN); + tor_uncompress(&body, &body_used, comp_body, comp_body_used, + compression, 0, LOG_PROTOCOL_WARN); tt_str_op(NETWORK_STATUS, OP_EQ, body); tt_int_op(strlen(NETWORK_STATUS), OP_EQ, body_used); @@ -2494,6 +2497,53 @@ test_dir_handle_get_status_vote_current_authority(void* data) dirvote_free_all(); } +static void +test_dir_handle_get_parse_accept_encoding(void *arg) +{ + (void)arg; + const unsigned B_NONE = 1u << NO_METHOD; + const unsigned B_ZLIB = 1u << ZLIB_METHOD; + const unsigned B_GZIP = 1u << GZIP_METHOD; + const unsigned B_LZMA = 1u << LZMA_METHOD; + const unsigned B_ZSTD = 1u << ZSTD_METHOD; + + unsigned encodings; + + encodings = parse_accept_encoding_header(""); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header(" "); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and howe "); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and gzip"); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and, gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header(" gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("x-zstd, deflate, x-tor-lzma"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA, OP_EQ, encodings); + + encodings = parse_accept_encoding_header( + "x-zstd, deflate, x-tor-lzma, gzip"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("x-zstd,deflate,x-tor-lzma,gzip"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); + + done: + ; +} + #define DIR_HANDLE_CMD(name,flags) \ { #name, test_dir_handle_get_##name, (flags), NULL, NULL } @@ -2552,6 +2602,7 @@ struct testcase_t dir_handle_get_tests[] = { DIR_HANDLE_CMD(status_vote_next_consensus_signatures_not_found, 0), DIR_HANDLE_CMD(status_vote_next_consensus_signatures_busy, 0), DIR_HANDLE_CMD(status_vote_next_consensus_signatures, 0), + DIR_HANDLE_CMD(parse_accept_encoding, 0), END_OF_TESTCASES }; diff --git a/src/test/test_entryconn.c b/src/test/test_entryconn.c index 50848cfec2..12a631630b 100644 --- a/src/test/test_entryconn.c +++ b/src/test/test_entryconn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c index 249fd1f973..3db7e63ee3 100644 --- a/src/test/test_entrynodes.c +++ b/src/test/test_entrynodes.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -584,6 +584,9 @@ test_entry_guard_parse_from_state_full(void *arg) smartlist_t *text = smartlist_new(); char *joined = NULL; + // So nodes aren't expired. This is Tue, 13 Dec 2016 09:37:14 GMT + update_approx_time(1481621834); + MOCK(entry_guard_is_listed, mock_entry_guard_is_listed); dummy_state = state; diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c index 1f92780177..fc9f27a5ac 100644 --- a/src/test/test_extorport.c +++ b/src/test/test_extorport.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONNECTION_PRIVATE @@ -72,9 +72,9 @@ test_ext_or_id_map(void *arg) * writes to outbuf. */ static void connection_write_to_buf_impl_replacement(const char *string, size_t len, - connection_t *conn, int zlib) + connection_t *conn, int compressed) { - (void) zlib; + (void) compressed; tor_assert(string); tor_assert(conn); diff --git a/src/test/test_guardfraction.c b/src/test/test_guardfraction.c index 8173e44d47..56006f3cc3 100644 --- a/src/test/test_guardfraction.c +++ b/src/test/test_guardfraction.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRSERV_PRIVATE diff --git a/src/test/test_handles.c b/src/test/test_handles.c index 536a478689..7ddee6e376 100644 --- a/src/test/test_handles.c +++ b/src/test/test_handles.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_helpers.c b/src/test/test_helpers.c index 5b84366e6d..9fada5a675 100644 --- a/src/test/test_helpers.c +++ b/src/test/test_helpers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -98,9 +98,9 @@ helper_setup_fake_routerlist(void) void connection_write_to_buf_mock(const char *string, size_t len, - connection_t *conn, int zlib) + connection_t *conn, int compressed) { - (void) zlib; + (void) compressed; tor_assert(string); tor_assert(conn); diff --git a/src/test/test_helpers.h b/src/test/test_helpers.h index c6d4d9c41f..4621631cc1 100644 --- a/src/test/test_helpers.h +++ b/src/test/test_helpers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TEST_HELPERS_H @@ -15,7 +15,7 @@ void helper_setup_fake_routerlist(void); #define GET(path) "GET " path " HTTP/1.0\r\n\r\n" void connection_write_to_buf_mock(const char *string, size_t len, - connection_t *conn, int zlib); + connection_t *conn, int compressed); int mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, uint16_t family, tor_addr_t *out); diff --git a/src/test/test_hs.c b/src/test/test_hs.c index fbaabe91d8..c3457c43da 100644 --- a/src/test/test_hs.c +++ b/src/test/test_hs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -821,7 +821,9 @@ test_prune_services_on_reload(void *arg) smartlist_add(old, e1); /* Only put the non ephemeral in the new list. */ smartlist_add(new, s1); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); /* We expect that the ephemeral one is in the new list but removed from * the old one. */ tt_int_op(smartlist_len(old), OP_EQ, 1); @@ -840,7 +842,9 @@ test_prune_services_on_reload(void *arg) * one. */ smartlist_add(old, s1); smartlist_add(old, e1); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); tt_int_op(smartlist_len(old), OP_EQ, 1); tt_assert(smartlist_get(old, 0) == s1); tt_int_op(smartlist_len(new), OP_EQ, 1); @@ -855,7 +859,9 @@ test_prune_services_on_reload(void *arg) * list being completely different. */ smartlist_add(new, s1); smartlist_add(new, e1); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); tt_int_op(smartlist_len(old), OP_EQ, 0); tt_int_op(smartlist_len(new), OP_EQ, 2); tt_assert(smartlist_get(new, 0) == s1); @@ -871,7 +877,9 @@ test_prune_services_on_reload(void *arg) /* Setup our list. */ smartlist_add(old, s1); smartlist_add(new, s2); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); tt_int_op(smartlist_len(old), OP_EQ, 1); /* Intro nodes have been moved to the s2 in theory so it must be empty. */ tt_int_op(smartlist_len(s1->intro_nodes), OP_EQ, 0); @@ -892,7 +900,9 @@ test_prune_services_on_reload(void *arg) /* Test two ephemeral services. */ smartlist_add(old, e1); smartlist_add(old, e2); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); /* Check if they've all been transfered. */ tt_int_op(smartlist_len(old), OP_EQ, 0); tt_int_op(smartlist_len(new), OP_EQ, 2); diff --git a/src/test/test_hs_cache.c b/src/test/test_hs_cache.c index 1943d0ffac..bc4bfabde9 100644 --- a/src/test/test_hs_cache.c +++ b/src/test/test_hs_cache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -93,8 +93,8 @@ helper_build_hs_desc(uint64_t revision_counter, uint32_t lifetime, /* Setup encrypted data section. */ desc->encrypted_data.create2_ntor = 1; - desc->encrypted_data.auth_types = smartlist_new(); - smartlist_add(desc->encrypted_data.auth_types, tor_strdup("ed25519")); + desc->encrypted_data.intro_auth_types = smartlist_new(); + smartlist_add(desc->encrypted_data.intro_auth_types, tor_strdup("ed25519")); desc->encrypted_data.intro_points = smartlist_new(); /* Add an intro point. */ smartlist_add(desc->encrypted_data.intro_points, @@ -333,7 +333,7 @@ helper_fetch_desc_from_hsdir(const ed25519_public_key_t *blinded_key) size_t body_used = 0; fetch_from_buf_http(TO_CONN(conn)->outbuf, &headers, MAX_HEADERS_SIZE, - &received_desc, &body_used, 10000, 0); + &received_desc, &body_used, HS_DESC_MAX_LEN, 0); tor_free(headers); } diff --git a/src/test/test_hs_descriptor.c b/src/test/test_hs_descriptor.c index 02a71aa473..a1a1f14fb8 100644 --- a/src/test/test_hs_descriptor.c +++ b/src/test/test_hs_descriptor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -15,6 +15,9 @@ #include "test.h" #include "torcert.h" +#include "test_helpers.h" +#include "log_test_helpers.h" + static hs_desc_intro_point_t * helper_build_intro_point(const ed25519_keypair_t *blinded_kp, time_t now, const char *addr, int legacy) @@ -105,9 +108,9 @@ helper_build_hs_desc(unsigned int no_ip, ed25519_public_key_t *signing_pubkey) /* Setup encrypted data section. */ desc->encrypted_data.create2_ntor = 1; - desc->encrypted_data.auth_types = smartlist_new(); + desc->encrypted_data.intro_auth_types = smartlist_new(); desc->encrypted_data.single_onion_service = 1; - smartlist_add(desc->encrypted_data.auth_types, tor_strdup("ed25519")); + smartlist_add(desc->encrypted_data.intro_auth_types, tor_strdup("ed25519")); desc->encrypted_data.intro_points = smartlist_new(); if (!no_ip) { /* Add four intro points. */ @@ -157,14 +160,17 @@ helper_compare_hs_desc(const hs_descriptor_t *desc1, desc2->encrypted_data.create2_ntor); /* Authentication type. */ - tt_int_op(!!desc1->encrypted_data.auth_types, ==, - !!desc2->encrypted_data.auth_types); - if (desc1->encrypted_data.auth_types && desc2->encrypted_data.auth_types) { - tt_int_op(smartlist_len(desc1->encrypted_data.auth_types), ==, - smartlist_len(desc2->encrypted_data.auth_types)); - for (int i = 0; i < smartlist_len(desc1->encrypted_data.auth_types); i++) { - tt_str_op(smartlist_get(desc1->encrypted_data.auth_types, i), OP_EQ, - smartlist_get(desc2->encrypted_data.auth_types, i)); + tt_int_op(!!desc1->encrypted_data.intro_auth_types, ==, + !!desc2->encrypted_data.intro_auth_types); + if (desc1->encrypted_data.intro_auth_types && + desc2->encrypted_data.intro_auth_types) { + tt_int_op(smartlist_len(desc1->encrypted_data.intro_auth_types), ==, + smartlist_len(desc2->encrypted_data.intro_auth_types)); + for (int i = 0; + i < smartlist_len(desc1->encrypted_data.intro_auth_types); + i++) { + tt_str_op(smartlist_get(desc1->encrypted_data.intro_auth_types, i),OP_EQ, + smartlist_get(desc2->encrypted_data.intro_auth_types, i)); } } @@ -311,13 +317,13 @@ test_descriptor_padding(void *arg) /* Example: if l = 129, the ceiled division gives 2 and then multiplied by 128 * to give 256. With l = 127, ceiled division gives 1 then times 128. */ #define PADDING_EXPECTED_LEN(l) \ - CEIL_DIV(l, HS_DESC_PLAINTEXT_PADDING_MULTIPLE) * \ - HS_DESC_PLAINTEXT_PADDING_MULTIPLE + CEIL_DIV(l, HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE) * \ + HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE (void) arg; { /* test #1: no padding */ - plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE; + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE; plaintext = tor_malloc(plaintext_len); padded_len = build_plaintext_padding(plaintext, plaintext_len, &padded_plaintext); @@ -333,7 +339,7 @@ test_descriptor_padding(void *arg) } { /* test #2: one byte padding? */ - plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE - 1; + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE - 1; plaintext = tor_malloc(plaintext_len); padded_plaintext = NULL; padded_len = build_plaintext_padding(plaintext, plaintext_len, @@ -350,7 +356,7 @@ test_descriptor_padding(void *arg) } { /* test #3: Lots more bytes of padding? */ - plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE + 1; + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE + 1; plaintext = tor_malloc(plaintext_len); padded_plaintext = NULL; padded_len = build_plaintext_padding(plaintext, plaintext_len, @@ -587,19 +593,11 @@ test_encrypted_data_len(void *arg) /* No length, error. */ ret = encrypted_data_length_is_valid(0); tt_int_op(ret, OP_EQ, 0); - /* Not a multiple of our encryption algorithm (thus no padding). It's - * suppose to be aligned on HS_DESC_PLAINTEXT_PADDING_MULTIPLE. */ - value = HS_DESC_PLAINTEXT_PADDING_MULTIPLE * 10 - 1; - ret = encrypted_data_length_is_valid(value); - tt_int_op(ret, OP_EQ, 0); /* Valid value. */ - value = HS_DESC_PADDED_PLAINTEXT_MAX_LEN + HS_DESC_ENCRYPTED_SALT_LEN + - DIGEST256_LEN; + value = HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN + 1; ret = encrypted_data_length_is_valid(value); tt_int_op(ret, OP_EQ, 1); - /* XXX: Test maximum possible size. */ - done: ; } @@ -1006,6 +1004,103 @@ test_desc_signature(void *arg) tor_free(data); } +/* bad desc auth type */ +static const char bad_superencrypted_text1[] = "desc-auth-type scoobysnack\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +/* bad ephemeral key */ +static const char bad_superencrypted_text2[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key differentalphabet\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +/* bad encrypted msg */ +static const char bad_superencrypted_text3[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "SO SMALL NOT GOOD\n" + "-----END MESSAGE-----\n"; + +static const char correct_superencrypted_text[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "auth-client Od09Qu636Qo /PKLzqewAdS/+0+vZC+MvQ dpw4NFo13zDnuPz45rxrOg\n" + "auth-client JRr840iGYN0 8s8cxYqF7Lx23+NducC4Qg zAafl4wPLURkuEjJreZq1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +static const char correct_encrypted_plaintext[] = "being on mountains, " + "thinking about computers, is not bad at all"; + +static void +test_parse_hs_desc_superencrypted(void *arg) +{ + (void) arg; + size_t retval; + uint8_t *encrypted_out = NULL; + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text1, + strlen(bad_superencrypted_text1), + &encrypted_out); + tt_u64_op(retval, ==, 0); + tt_assert(!encrypted_out); + expect_log_msg_containing("Unrecognized desc auth type"); + teardown_capture_of_logs(); + } + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text2, + strlen(bad_superencrypted_text2), + &encrypted_out); + tt_u64_op(retval, ==, 0); + tt_assert(!encrypted_out); + expect_log_msg_containing("Bogus desc auth key in HS desc"); + teardown_capture_of_logs(); + } + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text3, + strlen(bad_superencrypted_text3), + &encrypted_out); + tt_u64_op(retval, ==, 0); + tt_assert(!encrypted_out); + expect_log_msg_containing("Length of descriptor\'s encrypted data " + "is too small."); + teardown_capture_of_logs(); + } + + /* Now finally the good one */ + retval = decode_superencrypted(correct_superencrypted_text, + strlen(correct_superencrypted_text), + &encrypted_out); + + tt_u64_op(retval, ==, strlen(correct_encrypted_plaintext)); + tt_mem_op(encrypted_out, OP_EQ, correct_encrypted_plaintext, + strlen(correct_encrypted_plaintext)); + + done: + tor_free(encrypted_out); +} + struct testcase_t hs_descriptor[] = { /* Encoding tests. */ { "cert_encoding", test_cert_encoding, TT_FORK, @@ -1035,6 +1130,9 @@ struct testcase_t hs_descriptor[] = { { "desc_signature", test_desc_signature, TT_FORK, NULL, NULL }, + { "parse_hs_desc_superencrypted", test_parse_hs_desc_superencrypted, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES }; diff --git a/src/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c index ea12aeb2da..ef5cb46567 100644 --- a/src/test/test_hs_intropoint.c +++ b/src/test/test_hs_intropoint.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -69,10 +69,10 @@ helper_create_intro_circuit(void) return circ; } -static hs_cell_introduce1_t * +static trn_cell_introduce1_t * helper_create_introduce1_cell(void) { - hs_cell_introduce1_t *cell = NULL; + trn_cell_introduce1_t *cell = NULL; ed25519_keypair_t auth_key_kp; /* Generate the auth_key of the cell. */ @@ -80,39 +80,39 @@ helper_create_introduce1_cell(void) goto err; } - cell = hs_cell_introduce1_new(); + cell = trn_cell_introduce1_new(); tt_assert(cell); /* Set the auth key. */ { size_t auth_key_len = sizeof(auth_key_kp.pubkey); - hs_cell_introduce1_set_auth_key_type(cell, + trn_cell_introduce1_set_auth_key_type(cell, HS_INTRO_AUTH_KEY_TYPE_ED25519); - hs_cell_introduce1_set_auth_key_len(cell, auth_key_len); - hs_cell_introduce1_setlen_auth_key(cell, auth_key_len); - uint8_t *auth_key_ptr = hs_cell_introduce1_getarray_auth_key(cell); + trn_cell_introduce1_set_auth_key_len(cell, auth_key_len); + trn_cell_introduce1_setlen_auth_key(cell, auth_key_len); + uint8_t *auth_key_ptr = trn_cell_introduce1_getarray_auth_key(cell); memcpy(auth_key_ptr, auth_key_kp.pubkey.pubkey, auth_key_len); } /* Set the cell extentions to none. */ { - cell_extension_t *ext = cell_extension_new(); - cell_extension_set_num(ext, 0); - hs_cell_introduce1_set_extensions(cell, ext); + trn_cell_extension_t *ext = trn_cell_extension_new(); + trn_cell_extension_set_num(ext, 0); + trn_cell_introduce1_set_extensions(cell, ext); } /* Set the encrypted section to some data. */ { size_t enc_len = 128; - hs_cell_introduce1_setlen_encrypted(cell, enc_len); - uint8_t *enc_ptr = hs_cell_introduce1_getarray_encrypted(cell); + trn_cell_introduce1_setlen_encrypted(cell, enc_len); + uint8_t *enc_ptr = trn_cell_introduce1_getarray_encrypted(cell); memset(enc_ptr, 'a', enc_len); } return cell; err: done: - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); return NULL; } @@ -122,7 +122,7 @@ static void test_establish_intro_wrong_purpose(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -154,7 +154,7 @@ test_establish_intro_wrong_purpose(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -198,7 +198,7 @@ static void test_establish_intro_wrong_keytype2(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -230,7 +230,7 @@ test_establish_intro_wrong_keytype2(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -239,7 +239,7 @@ static void test_establish_intro_wrong_mac(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -258,7 +258,7 @@ test_establish_intro_wrong_mac(void *arg) tt_assert(establish_intro_cell); /* Mangle one byte of the MAC. */ uint8_t *handshake_ptr = - hs_cell_establish_intro_getarray_handshake_mac(establish_intro_cell); + trn_cell_establish_intro_getarray_handshake_mac(establish_intro_cell); handshake_ptr[TRUNNEL_SHA3_256_LEN - 1]++; /* We need to resign the payload with that change. */ { @@ -269,7 +269,7 @@ test_establish_intro_wrong_mac(void *arg) retval = ed25519_keypair_generate(&key_struct, 0); tt_int_op(retval, OP_EQ, 0); uint8_t *auth_key_ptr = - hs_cell_establish_intro_getarray_auth_key(establish_intro_cell); + trn_cell_establish_intro_getarray_auth_key(establish_intro_cell); memcpy(auth_key_ptr, key_struct.pubkey.pubkey, ED25519_PUBKEY_LEN); /* Encode payload so we can sign it. */ cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), @@ -284,7 +284,7 @@ test_establish_intro_wrong_mac(void *arg) tt_int_op(retval, OP_EQ, 0); /* And write the signature to the cell */ uint8_t *sig_ptr = - hs_cell_establish_intro_getarray_sig(establish_intro_cell); + trn_cell_establish_intro_getarray_sig(establish_intro_cell); memcpy(sig_ptr, sig.sig, establish_intro_cell->sig_len); /* Re-encode with the new signature. */ cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), @@ -299,7 +299,7 @@ test_establish_intro_wrong_mac(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -309,7 +309,7 @@ static void test_establish_intro_wrong_auth_key_len(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -328,9 +328,9 @@ test_establish_intro_wrong_auth_key_len(void *arg) sizeof(circuit_key_material)); tt_assert(establish_intro_cell); /* Mangle the auth key length. */ - hs_cell_establish_intro_set_auth_key_len(establish_intro_cell, + trn_cell_establish_intro_set_auth_key_len(establish_intro_cell, bad_auth_key_len); - hs_cell_establish_intro_setlen_auth_key(establish_intro_cell, + trn_cell_establish_intro_setlen_auth_key(establish_intro_cell, bad_auth_key_len); cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), establish_intro_cell); @@ -344,7 +344,7 @@ test_establish_intro_wrong_auth_key_len(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -354,7 +354,7 @@ static void test_establish_intro_wrong_sig_len(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -373,8 +373,8 @@ test_establish_intro_wrong_sig_len(void *arg) sizeof(circuit_key_material)); tt_assert(establish_intro_cell); /* Mangle the signature length. */ - hs_cell_establish_intro_set_sig_len(establish_intro_cell, bad_sig_len); - hs_cell_establish_intro_setlen_sig(establish_intro_cell, bad_sig_len); + trn_cell_establish_intro_set_sig_len(establish_intro_cell, bad_sig_len); + trn_cell_establish_intro_setlen_sig(establish_intro_cell, bad_sig_len); cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), establish_intro_cell); tt_int_op(cell_len, >, 0); @@ -387,7 +387,7 @@ test_establish_intro_wrong_sig_len(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -397,7 +397,7 @@ static void test_establish_intro_wrong_sig(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -429,17 +429,17 @@ test_establish_intro_wrong_sig(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } /* Helper function: Send a well-formed v3 ESTABLISH_INTRO cell to * <b>intro_circ</b>. Return the cell. */ -static hs_cell_establish_intro_t * +static trn_cell_establish_intro_t * helper_establish_intro_v3(or_circuit_t *intro_circ) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; uint8_t circuit_key_material[DIGEST_LEN] = {0}; @@ -489,6 +489,7 @@ helper_establish_intro_v2(or_circuit_t *intro_circ) /* Use old circuit_key_material why not */ cell_len = encode_establish_intro_cell_legacy((char*)cell_body, + sizeof(cell_body), key1, (char *) circuit_key_material); tt_int_op(cell_len, >, 0); @@ -511,7 +512,7 @@ test_intro_point_registration(void *arg) hs_circuitmap_ht *the_hs_circuitmap = NULL; or_circuit_t *intro_circ = NULL; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; ed25519_public_key_t auth_key; crypto_pk_t *legacy_auth_key = NULL; @@ -531,7 +532,7 @@ test_intro_point_registration(void *arg) tt_assert(the_hs_circuitmap); tt_int_op(0, ==, HT_SIZE(the_hs_circuitmap)); /* Do a circuitmap query in any case */ - returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); + returned_intro_circ =hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); tt_ptr_op(returned_intro_circ, ==, NULL); } @@ -547,7 +548,8 @@ test_intro_point_registration(void *arg) tt_int_op(1, ==, HT_SIZE(the_hs_circuitmap)); get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, establish_intro_cell); - returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); + returned_intro_circ = + hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); tt_ptr_op(intro_circ, ==, returned_intro_circ); } @@ -568,7 +570,8 @@ test_intro_point_registration(void *arg) /* Check that the new element is our legacy intro circuit. */ retval = crypto_pk_get_digest(legacy_auth_key, key_digest); tt_int_op(retval, ==, 0); - returned_intro_circ= hs_circuitmap_get_intro_circ_v2((uint8_t*)key_digest); + returned_intro_circ = + hs_circuitmap_get_intro_circ_v2_relay_side((uint8_t*)key_digest); tt_ptr_op(legacy_intro_circ, ==, returned_intro_circ); } @@ -579,7 +582,7 @@ test_intro_point_registration(void *arg) crypto_pk_free(legacy_auth_key); circuit_free(TO_CIRCUIT(intro_circ)); circuit_free(TO_CIRCUIT(legacy_intro_circ)); - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); { /* Test circuitmap free_all function. */ the_hs_circuitmap = get_hs_circuitmap(); @@ -673,7 +676,7 @@ static void test_introduce1_validation(void *arg) { int ret; - hs_cell_introduce1_t *cell = NULL; + trn_cell_introduce1_t *cell = NULL; (void) arg; @@ -713,25 +716,25 @@ test_introduce1_validation(void *arg) ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, 0); /* Set an invalid size of the auth key buffer. */ - hs_cell_introduce1_setlen_auth_key(cell, 3); + trn_cell_introduce1_setlen_auth_key(cell, 3); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, -1); /* Reset auth key buffer and make sure it works. */ - hs_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t)); + trn_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t)); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, 0); /* Empty encrypted section. */ - hs_cell_introduce1_setlen_encrypted(cell, 0); + trn_cell_introduce1_setlen_encrypted(cell, 0); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, -1); /* Reset it to some non zero bytes and validate. */ - hs_cell_introduce1_setlen_encrypted(cell, 1); + trn_cell_introduce1_setlen_encrypted(cell, 1); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, 0); done: - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); } static void @@ -739,7 +742,7 @@ test_received_introduce1_handling(void *arg) { int ret; uint8_t *request = NULL, buf[128]; - hs_cell_introduce1_t *cell = NULL; + trn_cell_introduce1_t *cell = NULL; or_circuit_t *circ = NULL; (void) arg; @@ -773,12 +776,12 @@ test_received_introduce1_handling(void *arg) /* Valid case. */ { cell = helper_create_introduce1_cell(); - ssize_t request_len = hs_cell_introduce1_encoded_len(cell); - tt_size_op(request_len, OP_GT, 0); + ssize_t request_len = trn_cell_introduce1_encoded_len(cell); + tt_int_op((int)request_len, OP_GT, 0); request = tor_malloc_zero(request_len); ssize_t encoded_len = - hs_cell_introduce1_encode(request, request_len, cell); - tt_size_op(encoded_len, OP_GT, 0); + trn_cell_introduce1_encode(request, request_len, cell); + tt_int_op((int)encoded_len, OP_GT, 0); circ = helper_create_intro_circuit(); or_circuit_t *service_circ = helper_create_intro_circuit(); @@ -787,9 +790,9 @@ test_received_introduce1_handling(void *arg) /* Register the circuit in the map for the auth key of the cell. */ ed25519_public_key_t auth_key; const uint8_t *cell_auth_key = - hs_cell_introduce1_getconstarray_auth_key(cell); + trn_cell_introduce1_getconstarray_auth_key(cell); memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN); - hs_circuitmap_register_intro_circ_v3(service_circ, &auth_key); + hs_circuitmap_register_intro_circ_v3_relay_side(service_circ, &auth_key); ret = hs_intro_received_introduce1(circ, request, request_len); circuit_free(TO_CIRCUIT(circ)); circuit_free(TO_CIRCUIT(service_circ)); @@ -799,17 +802,17 @@ test_received_introduce1_handling(void *arg) /* Valid legacy cell. */ { tor_free(request); - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); cell = helper_create_introduce1_cell(); - uint8_t *legacy_key_id = hs_cell_introduce1_getarray_legacy_key_id(cell); + uint8_t *legacy_key_id = trn_cell_introduce1_getarray_legacy_key_id(cell); memset(legacy_key_id, 'a', DIGEST_LEN); /* Add an arbitrary amount of data for the payload of a v2 cell. */ - size_t request_len = hs_cell_introduce1_encoded_len(cell) + 256; + size_t request_len = trn_cell_introduce1_encoded_len(cell) + 256; tt_size_op(request_len, OP_GT, 0); request = tor_malloc_zero(request_len + 256); ssize_t encoded_len = - hs_cell_introduce1_encode(request, request_len, cell); - tt_size_op(encoded_len, OP_GT, 0); + trn_cell_introduce1_encode(request, request_len, cell); + tt_int_op((int)encoded_len, OP_GT, 0); circ = helper_create_intro_circuit(); or_circuit_t *service_circ = helper_create_intro_circuit(); @@ -818,7 +821,7 @@ test_received_introduce1_handling(void *arg) /* Register the circuit in the map for the auth key of the cell. */ uint8_t token[REND_TOKEN_LEN]; memcpy(token, legacy_key_id, sizeof(token)); - hs_circuitmap_register_intro_circ_v2(service_circ, token); + hs_circuitmap_register_intro_circ_v2_relay_side(service_circ, token); ret = hs_intro_received_introduce1(circ, request, request_len); circuit_free(TO_CIRCUIT(circ)); circuit_free(TO_CIRCUIT(service_circ)); @@ -826,7 +829,7 @@ test_received_introduce1_handling(void *arg) } done: - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); tor_free(request); hs_circuitmap_free_all(); UNMOCK(relay_send_command_from_edge_); diff --git a/src/test/test_hs_ntor.sh b/src/test/test_hs_ntor.sh new file mode 100755 index 0000000000..8a0003d44a --- /dev/null +++ b/src/test/test_hs_ntor.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Validate Tor's ntor implementation. + +exitcode=0 + +# Run the python integration test sand return the exitcode of the python +# script. The python script might ask the testsuite to skip it if not all +# python dependencies are covered. +"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/hs_ntor_ref.py" || exitcode=$? + +exit ${exitcode} diff --git a/src/test/test_hs_ntor_cl.c b/src/test/test_hs_ntor_cl.c new file mode 100644 index 0000000000..ed1eda58ea --- /dev/null +++ b/src/test/test_hs_ntor_cl.c @@ -0,0 +1,255 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** This is a wrapper over the little-t-tor HS ntor functions. The wrapper is + * used by src/test/hs_ntor_ref.py to conduct the HS ntor integration + * tests. + * + * The logic of this wrapper is basically copied from src/test/test_ntor_cl.c + */ + +#include "orconfig.h" +#include <stdio.h> +#include <stdlib.h> + +#define ONION_NTOR_PRIVATE +#include "or.h" +#include "util.h" +#include "compat.h" +#include "crypto.h" +#include "crypto_curve25519.h" +#include "hs_ntor.h" +#include "onion_ntor.h" + +#define N_ARGS(n) STMT_BEGIN { \ + if (argc < (n)) { \ + fprintf(stderr, "%s needs %d arguments.\n",argv[1],n); \ + return 1; \ + } \ + } STMT_END +#define BASE16(idx, var, n) STMT_BEGIN { \ + const char *s = argv[(idx)]; \ + if (base16_decode((char*)var, n, s, strlen(s)) < (int)n ) { \ + fprintf(stderr, "couldn't decode argument %d (%s)\n",idx,s); \ + return 1; \ + } \ + } STMT_END +#define INT(idx, var) STMT_BEGIN { \ + var = atoi(argv[(idx)]); \ + if (var <= 0) { \ + fprintf(stderr, "bad integer argument %d (%s)\n",idx,argv[(idx)]); \ + } \ + } STMT_END + +/** The first part of the HS ntor protocol. The client-side computes all + necessary key material and sends the appropriate message to the service. */ +static int +client1(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_public_key_t intro_enc_pubkey; + ed25519_public_key_t intro_auth_pubkey; + curve25519_keypair_t client_ephemeral_enc_keypair; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; + + char buf[256]; + + N_ARGS(6); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(4, client_ephemeral_enc_keypair.seckey.secret_key, + CURVE25519_SECKEY_LEN); + BASE16(5, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, + &client_ephemeral_enc_keypair.seckey); + + retval = hs_ntor_client_get_introduce1_keys(&intro_auth_pubkey, + &intro_enc_pubkey, + &client_ephemeral_enc_keypair, + subcredential, + &hs_ntor_intro_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send ENC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.enc_key, + sizeof(hs_ntor_intro_cell_keys.enc_key)); + printf("%s\n", buf); + /* Send MAC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.mac_key, + sizeof(hs_ntor_intro_cell_keys.mac_key)); + printf("%s\n", buf); + + done: + return retval; +} + +/** The second part of the HS ntor protocol. The service-side computes all + necessary key material and sends the appropriate message to the client */ +static int +server1(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_keypair_t intro_enc_keypair; + ed25519_public_key_t intro_auth_pubkey; + curve25519_public_key_t client_ephemeral_enc_pubkey; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; + hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; + curve25519_keypair_t service_ephemeral_rend_keypair; + + char buf[256]; + + N_ARGS(6); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, intro_enc_keypair.seckey.secret_key, CURVE25519_SECKEY_LEN); + BASE16(4, client_ephemeral_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(5, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&intro_enc_keypair.pubkey, + &intro_enc_keypair.seckey); + curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); + + /* Get INTRODUCE1 keys */ + retval = hs_ntor_service_get_introduce1_keys(&intro_auth_pubkey, + &intro_enc_keypair, + &client_ephemeral_enc_pubkey, + subcredential, + &hs_ntor_intro_cell_keys); + if (retval < 0) { + goto done; + } + + /* Get RENDEZVOUS1 keys */ + retval = hs_ntor_service_get_rendezvous1_keys(&intro_auth_pubkey, + &intro_enc_keypair, + &service_ephemeral_rend_keypair, + &client_ephemeral_enc_pubkey, + &hs_ntor_rend_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send ENC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.enc_key, + sizeof(hs_ntor_intro_cell_keys.enc_key)); + printf("%s\n", buf); + /* Send MAC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.mac_key, + sizeof(hs_ntor_intro_cell_keys.mac_key)); + printf("%s\n", buf); + /* Send AUTH_MAC */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, + sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); + printf("%s\n", buf); + /* Send NTOR_KEY_SEED */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, + sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); + printf("%s\n", buf); + /* Send service ephemeral pubkey (Y) */ + base16_encode(buf, sizeof(buf), + (const char*)service_ephemeral_rend_keypair.pubkey.public_key, + sizeof(service_ephemeral_rend_keypair.pubkey.public_key)); + printf("%s\n", buf); + + done: + return retval; +} + +/** The final step of the ntor protocol, the client computes and returns the + * rendezvous key material. */ +static int +client2(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_public_key_t intro_enc_pubkey; + ed25519_public_key_t intro_auth_pubkey; + curve25519_keypair_t client_ephemeral_enc_keypair; + curve25519_public_key_t service_ephemeral_rend_pubkey; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; + + char buf[256]; + + N_ARGS(7); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, client_ephemeral_enc_keypair.seckey.secret_key, + CURVE25519_SECKEY_LEN); + BASE16(4, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(5, service_ephemeral_rend_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(6, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, + &client_ephemeral_enc_keypair.seckey); + + /* Get RENDEZVOUS1 keys */ + retval = hs_ntor_client_get_rendezvous1_keys(&intro_auth_pubkey, + &client_ephemeral_enc_keypair, + &intro_enc_pubkey, + &service_ephemeral_rend_pubkey, + &hs_ntor_rend_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send AUTH_MAC */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, + sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); + printf("%s\n", buf); + /* Send NTOR_KEY_SEED */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, + sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); + printf("%s\n", buf); + + done: + return 1; +} + +/** Perform a different part of the protocol depdning on the argv used. */ +int +main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "I need arguments. Read source for more info.\n"); + return 1; + } + + curve25519_init(); + if (!strcmp(argv[1], "client1")) { + return client1(argc, argv); + } else if (!strcmp(argv[1], "server1")) { + return server1(argc, argv); + } else if (!strcmp(argv[1], "client2")) { + return client2(argc, argv); + } else { + fprintf(stderr, "What's a %s?\n", argv[1]); + return 1; + } +} + diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c index 039d727cea..fcfb3b992d 100644 --- a/src/test/test_hs_service.c +++ b/src/test/test_hs_service.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -6,6 +6,7 @@ * \brief Test hidden service functionality. */ +#define HS_COMMON_PRIVATE #define HS_SERVICE_PRIVATE #define HS_INTROPOINT_PRIVATE @@ -14,9 +15,12 @@ #include "crypto.h" #include "hs/cell_establish_intro.h" +#include "hs_common.h" #include "hs_service.h" #include "hs_intropoint.h" +#include "hs_ntor.h" + /** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we * parse it from the receiver side. */ static void @@ -26,8 +30,8 @@ test_gen_establish_intro_cell(void *arg) ssize_t retval; uint8_t circuit_key_material[DIGEST_LEN] = {0}; uint8_t buf[RELAY_PAYLOAD_SIZE]; - hs_cell_establish_intro_t *cell_out = NULL; - hs_cell_establish_intro_t *cell_in = NULL; + trn_cell_establish_intro_t *cell_out = NULL; + trn_cell_establish_intro_t *cell_in = NULL; crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material)); @@ -44,7 +48,7 @@ test_gen_establish_intro_cell(void *arg) /* Parse it as the receiver */ { - ssize_t parse_result = hs_cell_establish_intro_parse(&cell_in, + ssize_t parse_result = trn_cell_establish_intro_parse(&cell_in, buf, sizeof(buf)); tt_int_op(parse_result, >=, 0); @@ -55,8 +59,8 @@ test_gen_establish_intro_cell(void *arg) } done: - hs_cell_establish_intro_free(cell_out); - hs_cell_establish_intro_free(cell_in); + trn_cell_establish_intro_free(cell_out); + trn_cell_establish_intro_free(cell_in); } /* Mocked ed25519_sign_prefixed() function that always fails :) */ @@ -78,7 +82,7 @@ static void test_gen_establish_intro_cell_bad(void *arg) { (void) arg; - hs_cell_establish_intro_t *cell = NULL; + trn_cell_establish_intro_t *cell = NULL; uint8_t circuit_key_material[DIGEST_LEN] = {0}; MOCK(ed25519_sign_prefixed, mock_ed25519_sign_prefixed); @@ -96,15 +100,150 @@ test_gen_establish_intro_cell_bad(void *arg) tt_assert(!cell); done: - hs_cell_establish_intro_free(cell); + trn_cell_establish_intro_free(cell); UNMOCK(ed25519_sign_prefixed); } +/** Test the HS ntor handshake. Simulate the sending of an encrypted INTRODUCE1 + * cell, and verify the proper derivation of decryption keys on the other end. + * Then simulate the sending of an authenticated RENDEZVOUS1 cell and verify + * the proper verification on the other end. */ +static void +test_hs_ntor(void *arg) +{ + int retval; + + uint8_t subcredential[DIGEST256_LEN]; + + ed25519_keypair_t service_intro_auth_keypair; + curve25519_keypair_t service_intro_enc_keypair; + curve25519_keypair_t service_ephemeral_rend_keypair; + + curve25519_keypair_t client_ephemeral_enc_keypair; + + hs_ntor_intro_cell_keys_t client_hs_ntor_intro_cell_keys; + hs_ntor_intro_cell_keys_t service_hs_ntor_intro_cell_keys; + + hs_ntor_rend_cell_keys_t service_hs_ntor_rend_cell_keys; + hs_ntor_rend_cell_keys_t client_hs_ntor_rend_cell_keys; + + (void) arg; + + /* Generate fake data for this unittest */ + { + /* Generate fake subcredential */ + memset(subcredential, 'Z', DIGEST256_LEN); + + /* service */ + curve25519_keypair_generate(&service_intro_enc_keypair, 0); + ed25519_keypair_generate(&service_intro_auth_keypair, 0); + curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); + /* client */ + curve25519_keypair_generate(&client_ephemeral_enc_keypair, 0); + } + + /* Client: Simulate the sending of an encrypted INTRODUCE1 cell */ + retval = + hs_ntor_client_get_introduce1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair.pubkey, + &client_ephemeral_enc_keypair, + subcredential, + &client_hs_ntor_intro_cell_keys); + tt_int_op(retval, ==, 0); + + /* Service: Simulate the decryption of the received INTRODUCE1 */ + retval = + hs_ntor_service_get_introduce1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair, + &client_ephemeral_enc_keypair.pubkey, + subcredential, + &service_hs_ntor_intro_cell_keys); + tt_int_op(retval, ==, 0); + + /* Test that the INTRODUCE1 encryption/mac keys match! */ + tt_mem_op(client_hs_ntor_intro_cell_keys.enc_key, OP_EQ, + service_hs_ntor_intro_cell_keys.enc_key, + CIPHER256_KEY_LEN); + tt_mem_op(client_hs_ntor_intro_cell_keys.mac_key, OP_EQ, + service_hs_ntor_intro_cell_keys.mac_key, + DIGEST256_LEN); + + /* Service: Simulate creation of RENDEZVOUS1 key material. */ + retval = + hs_ntor_service_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair, + &service_ephemeral_rend_keypair, + &client_ephemeral_enc_keypair.pubkey, + &service_hs_ntor_rend_cell_keys); + tt_int_op(retval, ==, 0); + + /* Client: Simulate the verification of a received RENDEZVOUS1 cell */ + retval = + hs_ntor_client_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, + &client_ephemeral_enc_keypair, + &service_intro_enc_keypair.pubkey, + &service_ephemeral_rend_keypair.pubkey, + &client_hs_ntor_rend_cell_keys); + tt_int_op(retval, ==, 0); + + /* Test that the RENDEZVOUS1 key material match! */ + tt_mem_op(client_hs_ntor_rend_cell_keys.rend_cell_auth_mac, OP_EQ, + service_hs_ntor_rend_cell_keys.rend_cell_auth_mac, + DIGEST256_LEN); + tt_mem_op(client_hs_ntor_rend_cell_keys.ntor_key_seed, OP_EQ, + service_hs_ntor_rend_cell_keys.ntor_key_seed, + DIGEST256_LEN); + + done: + ; +} + +/** Test that our HS time period calculation functions work properly */ +static void +test_time_period(void *arg) +{ + (void) arg; + uint64_t tn; + int retval; + time_t fake_time; + + /* Let's do the example in prop224 section [TIME-PERIODS] */ + retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", + &fake_time); + tt_int_op(retval, ==, 0); + + /* Check that the time period number is right */ + tn = get_time_period_num(fake_time); + tt_u64_op(tn, ==, 16903); + + /* Increase current time to 11:59:59 UTC and check that the time period + number is still the same */ + fake_time += 3599; + tn = get_time_period_num(fake_time); + tt_u64_op(tn, ==, 16903); + + /* Now take time to 12:00:00 UTC and check that the time period rotated */ + fake_time += 1; + tn = get_time_period_num(fake_time); + tt_u64_op(tn, ==, 16904); + + /* Now also check our hs_get_next_time_period_num() function */ + tn = hs_get_next_time_period_num(fake_time); + tt_u64_op(tn, ==, 16905); + + done: + ; +} + struct testcase_t hs_service_tests[] = { { "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK, NULL, NULL }, { "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK, NULL, NULL }, + { "hs_ntor", test_hs_ntor, TT_FORK, + NULL, NULL }, + { "time_period", test_time_period, TT_FORK, + NULL, NULL }, END_OF_TESTCASES }; diff --git a/src/test/test_introduce.c b/src/test/test_introduce.c index 810b03c93d..cfb8d83b1d 100644 --- a/src/test/test_introduce.c +++ b/src/test/test_introduce.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_keypin.c b/src/test/test_keypin.c index 95657349c6..d2ec8e9ca7 100644 --- a/src/test/test_keypin.c +++ b/src/test/test_keypin.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_link_handshake.c b/src/test/test_link_handshake.c index 421f3aaedf..217088ee37 100644 --- a/src/test/test_link_handshake.c +++ b/src/test/test_link_handshake.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -10,13 +10,6 @@ #include "compat.h" -/* Some versions of OpenSSL declare SSL_get_selected_srtp_profile twice in - * srtp.h. Suppress the GCC warning so we can build with -Wredundant-decl. */ -DISABLE_GCC_WARNING(redundant-decls) -#include <openssl/x509.h> -#include <openssl/ssl.h> -ENABLE_GCC_WARNING(redundant-decls) - #include "or.h" #include "config.h" #include "connection.h" @@ -785,19 +778,14 @@ CERTS_FAIL(expired_rsa_id, /* both */ certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 1); const tor_x509_cert_t *idc; tor_tls_get_my_certs(1, NULL, &idc); - X509 *newc = X509_dup(idc->cert); + tor_x509_cert_t *newc; time_t new_end = time(NULL) - 86400 * 10; - X509_time_adj(X509_get_notAfter(newc), 0, &new_end); - EVP_PKEY *pk = crypto_pk_get_evp_pkey_(d->key2, 1); - tt_assert(X509_sign(newc, pk, EVP_sha1())); - int len = i2d_X509(newc, NULL); - certs_cell_cert_setlen_body(cert, len); - uint8_t *body = certs_cell_cert_getarray_body(cert); - int len2 = i2d_X509(newc, &body); - tt_int_op(len, ==, len2); + newc = tor_x509_cert_replace_expiration(idc, new_end, d->key2); + certs_cell_cert_setlen_body(cert, newc->encoded_len); + memcpy(certs_cell_cert_getarray_body(cert), + newc->encoded, newc->encoded_len); REENCODE(); - X509_free(newc); - EVP_PKEY_free(pk); + tor_x509_cert_free(newc); }) CERTS_FAIL(expired_ed_id, /* ed25519 */ { diff --git a/src/test/test_logging.c b/src/test/test_logging.c index 15471e46d0..94b3e4ea68 100644 --- a/src/test/test_logging.c +++ b/src/test/test_logging.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c index 2ae605b8db..c78fda3b69 100644 --- a/src/test/test_microdesc.c +++ b/src/test/test_microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -14,12 +14,6 @@ #include "test.h" -DISABLE_GCC_WARNING(redundant-decls) -#include <openssl/rsa.h> -#include <openssl/bn.h> -#include <openssl/pem.h> -ENABLE_GCC_WARNING(redundant-decls) - #ifdef _WIN32 /* For mkdir() */ #include <direct.h> diff --git a/src/test/test_nodelist.c b/src/test/test_nodelist.c index d58f8a7fca..256354415c 100644 --- a/src/test/test_nodelist.c +++ b/src/test/test_nodelist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/test_ntor_cl.c b/src/test/test_ntor_cl.c index a560e5fc5e..d0eea85d6f 100644 --- a/src/test/test_ntor_cl.c +++ b/src/test/test_ntor_cl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_oom.c b/src/test/test_oom.c index 0f97972032..f03a504d1d 100644 --- a/src/test/test_oom.c +++ b/src/test/test_oom.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for OOM handling logic */ diff --git a/src/test/test_oos.c b/src/test/test_oos.c index db06625116..9fd6bce5ae 100644 --- a/src/test/test_oos.c +++ b/src/test/test_oos.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for OOS handler */ diff --git a/src/test/test_options.c b/src/test/test_options.c index d5782e9ec0..29f6665f23 100644 --- a/src/test/test_options.c +++ b/src/test/test_options.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONFIG_PRIVATE @@ -105,27 +105,13 @@ clear_log_messages(void) "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ " 083C 538F 4403 8BBF A077 587D D755\n" -static void -test_options_validate_impl(const char *configuration, - const char *expect_errmsg, - int expect_log_severity, - const char *expect_log) +static int +test_options_checkmsgs(const char *configuration, + const char *expect_errmsg, + int expect_log_severity, + const char *expect_log, + char *msg) { - or_options_t *opt=NULL; - or_options_t *dflt; - config_line_t *cl=NULL; - char *msg=NULL; - int r; - - setup_options(opt, dflt); - - r = config_get_lines(configuration, &cl, 1); - tt_int_op(r, OP_EQ, 0); - - r = config_assign(&options_format, opt, cl, 0, &msg); - tt_int_op(r, OP_EQ, 0); - - r = options_validate(NULL, opt, dflt, 0, &msg); if (expect_errmsg && !msg) { TT_DIE(("Expected error message <%s> from <%s>, but got none.", expect_errmsg, configuration)); @@ -136,8 +122,6 @@ test_options_validate_impl(const char *configuration, TT_DIE(("Expected no error message from <%s> but got <%s>.", configuration, msg)); } - tt_int_op((r == 0), OP_EQ, (msg == NULL)); - if (expect_log) { int found = 0; if (messages) { @@ -157,6 +141,56 @@ test_options_validate_impl(const char *configuration, configuration, msg)); } } + return 0; + + done: + return -1; +} + +/* Which phases of config parsing/validation to check for messages/logs */ +enum { PH_GETLINES, PH_ASSIGN, PH_VALIDATE }; + +static void +test_options_validate_impl(const char *configuration, + const char *expect_errmsg, + int expect_log_severity, + const char *expect_log, + int phase) +{ + or_options_t *opt=NULL; + or_options_t *dflt; + config_line_t *cl=NULL; + char *msg=NULL; + int r; + + setup_options(opt, dflt); + + r = config_get_lines(configuration, &cl, 1); + if (phase == PH_GETLINES) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; + } + tt_int_op((r == 0), OP_EQ, (msg == NULL)); + + r = config_assign(&options_format, opt, cl, 0, &msg); + if (phase == PH_ASSIGN) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; + } + tt_int_op((r == 0), OP_EQ, (msg == NULL)); + + r = options_validate(NULL, opt, dflt, 0, &msg); + if (phase == PH_VALIDATE) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; + } + tt_int_op((r == 0), OP_EQ, (msg == NULL)); done: escaped(NULL); @@ -168,14 +202,14 @@ test_options_validate_impl(const char *configuration, clear_log_messages(); } -#define WANT_ERR(config, msg) \ - test_options_validate_impl((config), (msg), 0, NULL) -#define WANT_LOG(config, severity, msg) \ - test_options_validate_impl((config), NULL, (severity), (msg)) -#define WANT_ERR_LOG(config, msg, severity, logmsg) \ - test_options_validate_impl((config), (msg), (severity), (logmsg)) -#define OK(config) \ - test_options_validate_impl((config), NULL, 0, NULL) +#define WANT_ERR(config, msg, ph) \ + test_options_validate_impl((config), (msg), 0, NULL, (ph)) +#define WANT_LOG(config, severity, msg, ph) \ + test_options_validate_impl((config), NULL, (severity), (msg), (ph)) +#define WANT_ERR_LOG(config, msg, severity, logmsg, ph) \ + test_options_validate_impl((config), (msg), (severity), (logmsg), (ph)) +#define OK(config, ph) \ + test_options_validate_impl((config), NULL, 0, NULL, (ph)) static void test_options_validate(void *arg) @@ -184,21 +218,32 @@ test_options_validate(void *arg) setup_log_callback(); sandbox_disable_getaddrinfo_cache(); - WANT_ERR("ExtORPort 500000", "Invalid ExtORPort"); + WANT_ERR("ExtORPort 500000", "Invalid ExtORPort", PH_VALIDATE); WANT_ERR_LOG("ServerTransportOptions trebuchet", "ServerTransportOptions did not parse", - LOG_WARN, "Too few arguments"); - OK("ServerTransportOptions trebuchet sling=snappy"); - OK("ServerTransportOptions trebuchet sling="); + LOG_WARN, "Too few arguments", PH_VALIDATE); + OK("ServerTransportOptions trebuchet sling=snappy", PH_VALIDATE); + OK("ServerTransportOptions trebuchet sling=", PH_VALIDATE); WANT_ERR_LOG("ServerTransportOptions trebuchet slingsnappy", "ServerTransportOptions did not parse", - LOG_WARN, "\"slingsnappy\" is not a k=v"); + LOG_WARN, "\"slingsnappy\" is not a k=v", PH_VALIDATE); WANT_ERR("DirPort 8080\nDirCache 0", - "DirPort configured but DirCache disabled."); + "DirPort configured but DirCache disabled.", PH_VALIDATE); WANT_ERR("BridgeRelay 1\nDirCache 0", - "We're a bridge but DirCache is disabled."); + "We're a bridge but DirCache is disabled.", PH_VALIDATE); + + WANT_ERR_LOG("HeartbeatPeriod 21 snarks", + "Interval 'HeartbeatPeriod 21 snarks' is malformed or" + " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", + PH_ASSIGN); + WANT_ERR_LOG("LogTimeGranularity 21 snarks", + "Msec interval 'LogTimeGranularity 21 snarks' is malformed or" + " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", + PH_ASSIGN); + OK("HeartbeatPeriod 1 hour", PH_VALIDATE); + OK("LogTimeGranularity 100 milliseconds", PH_VALIDATE); close_temp_logs(); clear_log_messages(); diff --git a/src/test/test_policy.c b/src/test/test_policy.c index e86d0f0274..1b2fac4325 100644 --- a/src/test/test_policy.c +++ b/src/test/test_policy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_procmon.c b/src/test/test_procmon.c index 9e63fc006d..5c52af8693 100644 --- a/src/test/test_procmon.c +++ b/src/test/test_procmon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define PROCMON_PRIVATE diff --git a/src/test/test_protover.c b/src/test/test_protover.c index f00955d1b4..5626816024 100644 --- a/src/test/test_protover.c +++ b/src/test/test_protover.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define PROTOVER_PRIVATE diff --git a/src/test/test_pt.c b/src/test/test_pt.c index f93019f1c4..79b03171bc 100644 --- a/src/test/test_pt.c +++ b/src/test/test_pt.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -284,13 +284,13 @@ test_pt_get_extrainfo_string(void *arg) } #ifdef _WIN32 -#define STDIN_HANDLE HANDLE +#define STDIN_HANDLE HANDLE* #else -#define STDIN_HANDLE FILE +#define STDIN_HANDLE int #endif static smartlist_t * -tor_get_lines_from_handle_replacement(STDIN_HANDLE *handle, +tor_get_lines_from_handle_replacement(STDIN_HANDLE handle, enum stream_status *stream_status_out) { static int times_called = 0; diff --git a/src/test/test_pubsub.c b/src/test/test_pubsub.c index 547d6c6b32..2f047d9f2c 100644 --- a/src/test/test_pubsub.c +++ b/src/test/test_pubsub.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/test_relay.c b/src/test/test_relay.c index 4713c79ea5..238d4c5baf 100644 --- a/src/test/test_relay.c +++ b/src/test/test_relay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_relaycell.c b/src/test/test_relaycell.c index fb6748965a..eea1f5dc80 100644 --- a/src/test/test_relaycell.c +++ b/src/test/test_relaycell.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for handling different kinds of relay cell */ diff --git a/src/test/test_rendcache.c b/src/test/test_rendcache.c index 0d53c78817..feba8f664e 100644 --- a/src/test/test_rendcache.c +++ b/src/test/test_rendcache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -11,7 +11,6 @@ #include "routerlist.h" #include "config.h" #include "hs_common.h" -#include <openssl/rsa.h> #include "rend_test_helpers.h" #include "log_test_helpers.h" diff --git a/src/test/test_replay.c b/src/test/test_replay.c index e882bc6164..80e7203716 100644 --- a/src/test/test_replay.c +++ b/src/test/test_replay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define REPLAYCACHE_PRIVATE diff --git a/src/test/test_routerkeys.c b/src/test/test_routerkeys.c index 64692d28a0..263923f50f 100644 --- a/src/test/test_routerkeys.c +++ b/src/test/test_routerkeys.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_routerlist.c b/src/test/test_routerlist.c index 78f1cf16b7..0b4b6c5c44 100644 --- a/src/test/test_routerlist.c +++ b/src/test/test_routerlist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_scheduler.c b/src/test/test_scheduler.c index 05ea8e86e8..4c536b0905 100644 --- a/src/test/test_scheduler.c +++ b/src/test/test_scheduler.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_slow.c b/src/test/test_slow.c index 7c9f0b1cc2..e640702499 100644 --- a/src/test/test_slow.c +++ b/src/test/test_slow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/test_socks.c b/src/test/test_socks.c index 62ff12fe15..bb1be11f2b 100644 --- a/src/test/test_socks.c +++ b/src/test/test_socks.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_storagedir.c b/src/test/test_storagedir.c new file mode 100644 index 0000000000..19e5de4ea3 --- /dev/null +++ b/src/test/test_storagedir.c @@ -0,0 +1,375 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "storagedir.h" +#include "test.h" + +#ifdef HAVE_UTIME_H +#include <utime.h> +#endif + +static void +test_storagedir_empty(void *arg) +{ + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + (void)arg; + + tt_int_op(FN_NOENT, OP_EQ, file_status(dirname)); + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); + + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + storage_dir_free(d); + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); + + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + storage_dir_free(d); + tor_free(dirname); +} + +static void +test_storagedir_basic(void *arg) +{ + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *junk = NULL, *bytes = NULL; + const size_t junklen = 1024; + char *fname1 = NULL, *fname2 = NULL; + const char hello_str[] = "then what are we but cold, alone ... ?"; + tor_mmap_t *mapping = NULL; + (void)arg; + + junk = tor_malloc(junklen); + crypto_rand((void*)junk, junklen); + + d = storage_dir_new(dirname, 10); + tt_assert(d); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + int r; + r = storage_dir_save_string_to_file(d, hello_str, 1, &fname1); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(fname1, OP_NE, NULL); + tt_u64_op(strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + + r = storage_dir_save_bytes_to_file(d, junk, junklen, 1, &fname2); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(fname2, OP_NE, NULL); + + tt_str_op(fname1, OP_NE, fname2); + + tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); + + storage_dir_free(d); + d = storage_dir_new(dirname, 10); + tt_assert(d); + tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); + + size_t n; + bytes = storage_dir_read(d, fname2, 1, &n); + tt_assert(bytes); + tt_u64_op(n, OP_EQ, junklen); + tt_mem_op(bytes, OP_EQ, junk, junklen); + + mapping = storage_dir_map(d, fname1); + tt_assert(mapping); + tt_u64_op(mapping->size, OP_EQ, strlen(hello_str)); + tt_mem_op(mapping->data, OP_EQ, hello_str, strlen(hello_str)); + + done: + tor_free(dirname); + tor_free(junk); + tor_free(bytes); + tor_munmap_file(mapping); + storage_dir_free(d); + tor_free(fname1); + tor_free(fname2); +} + +static void +test_storagedir_deletion(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + char *fn1 = NULL, *fn2 = NULL; + char *bytes = NULL; + int r; + const char str1[] = "There are nine and sixty ways to disguise communiques"; + const char str2[] = "And rather more than one of them is right"; + + // Make sure the directory is there. */ + d = storage_dir_new(dirname, 10); + storage_dir_free(d); + d = NULL; + + tor_asprintf(&fn1, "%s/1007", dirname); + r = write_str_to_file(fn1, str1, 0); + tt_int_op(r, OP_EQ, 0); + + tor_asprintf(&fn2, "%s/1003.tmp", dirname); + r = write_str_to_file(fn2, str2, 0); + tt_int_op(r, OP_EQ, 0); + + // The tempfile should be deleted the next time we list the directory. + d = storage_dir_new(dirname, 10); + tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); + tt_int_op(FN_FILE, OP_EQ, file_status(fn1)); + tt_int_op(FN_NOENT, OP_EQ, file_status(fn2)); + + bytes = (char*) storage_dir_read(d, "1007", 1, NULL); + tt_str_op(bytes, OP_EQ, str1); + + // Should have no effect; file already gone. + storage_dir_remove_file(d, "1003.tmp"); + tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); + + // Actually remove a file. + storage_dir_remove_file(d, "1007"); + tt_int_op(FN_NOENT, OP_EQ, file_status(fn1)); + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + tor_free(fn1); + tor_free(fn2); + storage_dir_free(d); + tor_free(bytes); +} + +static void +test_storagedir_full(void *arg) +{ + (void)arg; + + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + const char str[] = "enemies of the peephole"; + int r; + + d = storage_dir_new(dirname, 3); + tt_assert(d); + + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + + // These should fail! + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, -1); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, -1); + + tt_u64_op(strlen(str) * 3, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + storage_dir_free(d); +} + +static void +test_storagedir_cleaning(void *arg) +{ + (void)arg; + + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + const char str[] = + "On a mountain halfway between Reno and Rome / " + "We have a machine in a plexiglass dome / " + "Which listens and looks into everyone's home." + " -- Dr. Seuss"; + char *fns[8]; + int r, i; + + memset(fns, 0, sizeof(fns)); + d = storage_dir_new(dirname, 10); + tt_assert(d); + + for (i = 0; i < 8; ++i) { + r = storage_dir_save_string_to_file(d, str+i*2, 1, &fns[i]); + tt_int_op(r, OP_EQ, 0); + } + + /* Now we're going to make sure all the files have distinct mtimes. */ + time_t now = time(NULL); + struct utimbuf ub; + ub.actime = now; + ub.modtime = now - 1000; + for (i = 0; i < 8; ++i) { + char *f = NULL; + tor_asprintf(&f, "%s/%s", dirname, fns[i]); + r = utime(f, &ub); + tor_free(f); + tt_int_op(r, OP_EQ, 0); + ub.modtime += 5; + } + + const uint64_t usage_orig = storage_dir_get_usage(d); + /* No changes needed if we are already under target. */ + storage_dir_shrink(d, 1024*1024, 0); + tt_u64_op(usage_orig, OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of at least one byte. This will delete fns[0]. */ + storage_dir_shrink(d, usage_orig - 1, 0); + tt_u64_op(usage_orig, OP_GT, storage_dir_get_usage(d)); + tt_u64_op(usage_orig - strlen(str), OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of at least two files. This will delete fns[1] and fns[2]. */ + storage_dir_shrink(d, 1024*1024, 2); + tt_u64_op(usage_orig - strlen(str)*3 + 6, OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of everything. */ + storage_dir_remove_all(d); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + storage_dir_free(d); + for (i = 0; i < 8; ++i) { + tor_free(fns[i]); + } +} + +static void +test_storagedir_save_labeled(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *inp = tor_malloc_zero(8192); + config_line_t *labels = NULL; + char *fname = NULL; + uint8_t *saved = NULL; + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + crypto_rand((char *)inp, 8192); + + config_line_append(&labels, "Foo", "bar baz"); + config_line_append(&labels, "quux", "quuzXxz"); + const char expected[] = + "Foo bar baz\n" + "quux quuzXxz\n"; + + int r = storage_dir_save_labeled_to_file(d, labels, inp, 8192, &fname); + tt_int_op(r, OP_EQ, 0); + + size_t n; + saved = storage_dir_read(d, fname, 1, &n); + tt_assert(memchr(saved, '\0', n)); + tt_str_op((char*)saved, OP_EQ, expected); /* NUL guarantees strcmp works */ + tt_mem_op(saved+strlen(expected)+1, OP_EQ, inp, 8192); + + done: + storage_dir_free(d); + tor_free(dirname); + tor_free(inp); + tor_free(fname); + config_free_lines(labels); + tor_free(saved); +} + +static void +test_storagedir_read_labeled(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *inp = tor_malloc_zero(8192); + config_line_t *labels = NULL, *labels2 = NULL; + char *fname = NULL; + tor_mmap_t *map = NULL; + uint8_t *as_read = NULL; + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tor_snprintf((char*)inp, 8192, + "Hello world\n" + "This is a test\n" + "Yadda yadda.\n"); + size_t bodylen = 8192 - strlen((char*)inp) - 1; + crypto_rand((char *)inp+strlen((char*)inp)+1, bodylen); + + int r = storage_dir_save_bytes_to_file(d, inp, 8192, 1, &fname); + tt_int_op(r, OP_EQ, 0); + + /* Try mapping */ + const uint8_t *datap = NULL; + size_t sz = 0; + map = storage_dir_map_labeled(d, fname, &labels, &datap, &sz); + tt_assert(map); + tt_assert(datap); + tt_u64_op(sz, OP_EQ, bodylen); + tt_mem_op(datap, OP_EQ, inp+strlen((char*)inp)+1, bodylen); + tt_assert(labels); + tt_str_op(labels->key, OP_EQ, "Hello"); + tt_str_op(labels->value, OP_EQ, "world"); + tt_assert(labels->next); + tt_str_op(labels->next->key, OP_EQ, "This"); + tt_str_op(labels->next->value, OP_EQ, "is a test"); + tt_assert(labels->next->next); + tt_str_op(labels->next->next->key, OP_EQ, "Yadda"); + tt_str_op(labels->next->next->value, OP_EQ, "yadda."); + tt_assert(labels->next->next->next == NULL); + + /* Try reading this time. */ + sz = 0; + as_read = storage_dir_read_labeled(d, fname, &labels2, &sz); + tt_assert(as_read); + tt_u64_op(sz, OP_EQ, bodylen); + tt_mem_op(as_read, OP_EQ, inp+strlen((char*)inp)+1, bodylen); + tt_assert(config_lines_eq(labels, labels2)); + + done: + storage_dir_free(d); + tor_free(dirname); + tor_free(inp); + tor_free(fname); + config_free_lines(labels); + config_free_lines(labels2); + tor_munmap_file(map); + tor_free(as_read); +} + +#define ENT(name) \ + { #name, test_storagedir_ ## name, TT_FORK, NULL, NULL } + +struct testcase_t storagedir_tests[] = { + ENT(empty), + ENT(basic), + ENT(deletion), + ENT(full), + ENT(cleaning), + ENT(save_labeled), + ENT(read_labeled), + END_OF_TESTCASES +}; + diff --git a/src/test/test_switch_id.c b/src/test/test_switch_id.c index 322f5bdc7a..44e02e87b3 100644 --- a/src/test/test_switch_id.c +++ b/src/test/test_switch_id.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_threads.c b/src/test/test_threads.c index ebbc95c7ca..18a9407ff7 100644 --- a/src/test/test_threads.c +++ b/src/test/test_threads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_tortls.c b/src/test/test_tortls.c index 4bfcea211d..7aa3051464 100644 --- a/src/test/test_tortls.c +++ b/src/test/test_tortls.c @@ -1,7 +1,8 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TORTLS_PRIVATE +#define TORTLS_OPENSSL_PRIVATE #define LOG_PRIVATE #include "orconfig.h" diff --git a/src/test/test_util.c b/src/test/test_util.c index e80201737a..b3f8ecdf51 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -2242,114 +2242,160 @@ test_util_pow2(void *arg) ; } -/** Run unit tests for compression functions */ static void -test_util_gzip(void *arg) +test_util_compress_impl(compress_method_t method) { - char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2; - const char *ccp2; + char *buf1=NULL, *buf2=NULL, *buf3=NULL; size_t len1, len2; - tor_zlib_state_t *state = NULL; - (void)arg; + tt_assert(tor_compress_supports_method(method)); + buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ"); tt_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD); - tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - GZIP_METHOD)); - tt_assert(buf2); - tt_assert(len1 < strlen(buf1)); - tt_assert(detect_compression_method(buf2, len1) == GZIP_METHOD); - - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, - GZIP_METHOD, 1, LOG_INFO)); - tt_assert(buf3); - tt_int_op(strlen(buf1) + 1,OP_EQ, len2); - tt_str_op(buf1,OP_EQ, buf3); - - tor_free(buf2); - tor_free(buf3); - - tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - ZLIB_METHOD)); - tt_assert(buf2); - tt_assert(detect_compression_method(buf2, len1) == ZLIB_METHOD); + tt_assert(!tor_compress(&buf2, &len1, buf1, strlen(buf1)+1, method)); + tt_assert(buf2 != NULL); + if (method == NO_METHOD) { + // The identity transform doesn't actually compress, and it isn't + // detectable as "the identity transform." + tt_int_op(len1, OP_EQ, strlen(buf1)+1); + tt_int_op(detect_compression_method(buf2, len1), OP_EQ, UNKNOWN_METHOD); + } else { + tt_int_op(len1, OP_LT, strlen(buf1)); + tt_int_op(detect_compression_method(buf2, len1), OP_EQ, method); + } - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, - ZLIB_METHOD, 1, LOG_INFO)); - tt_assert(buf3); - tt_int_op(strlen(buf1) + 1,OP_EQ, len2); - tt_str_op(buf1,OP_EQ, buf3); + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1, method, 1, LOG_INFO)); + tt_assert(buf3 != NULL); + tt_int_op(strlen(buf1) + 1, OP_EQ, len2); + tt_str_op(buf1, OP_EQ, buf3); + tt_int_op(buf3[len2], OP_EQ, 0); /* Check whether we can uncompress concatenated, compressed strings. */ tor_free(buf3); buf2 = tor_reallocarray(buf2, len1, 2); memcpy(buf2+len1, buf2, len1); - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1*2, - ZLIB_METHOD, 1, LOG_INFO)); - tt_int_op((strlen(buf1)+1)*2,OP_EQ, len2); - tt_mem_op(buf3,OP_EQ, + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1*2, method, 1, LOG_INFO)); + tt_int_op((strlen(buf1)+1)*2, OP_EQ, len2); + tt_mem_op(buf3, OP_EQ, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0", (strlen(buf1)+1)*2); + tt_int_op(buf3[len2], OP_EQ, 0); + + /* Check whether we can uncompress partial strings */ tor_free(buf1); tor_free(buf2); tor_free(buf3); - /* Check whether we can uncompress partial strings. */ - buf1 = - tor_strdup("String with low redundancy that won't be compressed much."); - tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - ZLIB_METHOD)); - tt_assert(len1>16); - /* when we allow an incomplete string, we should succeed.*/ - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, - ZLIB_METHOD, 0, LOG_INFO)); - tt_assert(len2 > 5); - buf3[len2]='\0'; - tt_assert(!strcmpstart(buf1, buf3)); - - /* when we demand a complete string, this must fail. */ + size_t b1len = 1<<10; + if (method == ZSTD_METHOD) { + // zstd needs a big input before it starts generating output that it + // can partially decompress. + b1len = 1<<18; + } + buf1 = tor_malloc(b1len); + crypto_rand(buf1, b1len); + tt_assert(!tor_compress(&buf2, &len1, buf1, b1len, method)); + tt_int_op(len1, OP_GT, 16); + /* when we allow an incomplete output we should succeed.*/ + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1-16, + method, 0, LOG_INFO)); + tt_int_op(len2, OP_GT, 5); + tt_int_op(len2, OP_LE, len1); + tt_assert(fast_memeq(buf1, buf3, len2)); + tt_int_op(buf3[len2], OP_EQ, 0); + + /* when we demand a complete output from a real compression method, this + * must fail. */ tor_free(buf3); - tt_assert(tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, - ZLIB_METHOD, 1, LOG_INFO)); - tt_assert(!buf3); + if (method != NO_METHOD) { + tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16, + method, 1, LOG_INFO)); + tt_assert(buf3 == NULL); + } - /* Now, try streaming compression. */ + done: tor_free(buf1); tor_free(buf2); tor_free(buf3); - state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); +} + +static void +test_util_compress_stream_impl(compress_method_t method, + compression_level_t level) +{ + char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2; + const char *ccp2; + size_t len1, len2; + + tor_compress_state_t *state = NULL; + state = tor_compress_new(1, method, level); tt_assert(state); cp1 = buf1 = tor_malloc(1024); len1 = 1024; ccp2 = "ABCDEFGHIJABCDEFGHIJ"; len2 = 21; - tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0) - == TOR_ZLIB_OK); - tt_int_op(0,OP_EQ, len2); /* Make sure we compressed it all. */ + tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 0), + OP_EQ, TOR_COMPRESS_OK); + tt_int_op(0, OP_EQ, len2); /* Make sure we compressed it all. */ tt_assert(cp1 > buf1); len2 = 0; cp2 = cp1; - tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1) - == TOR_ZLIB_DONE); - tt_int_op(0,OP_EQ, len2); - tt_assert(cp1 > cp2); /* Make sure we really added something. */ + tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 1), + OP_EQ, TOR_COMPRESS_DONE); + tt_int_op(0, OP_EQ, len2); + if (method == NO_METHOD) { + tt_ptr_op(cp1, OP_EQ, cp2); + } else { + tt_assert(cp1 > cp2); /* Make sure we really added something. */ + } - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1, - ZLIB_METHOD, 1, LOG_WARN)); + tt_assert(!tor_uncompress(&buf3, &len2, buf1, 1024-len1, + method, 1, LOG_WARN)); /* Make sure it compressed right. */ tt_str_op(buf3, OP_EQ, "ABCDEFGHIJABCDEFGHIJ"); - tt_int_op(21,OP_EQ, len2); + tt_int_op(21, OP_EQ, len2); done: if (state) - tor_zlib_free(state); + tor_compress_free(state); + tor_free(buf1); tor_free(buf2); tor_free(buf3); - tor_free(buf1); +} + +/** Run unit tests for compression functions */ +static void +test_util_compress(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + compression_level_t levels[] = { + BEST_COMPRESSION, + HIGH_COMPRESSION, + MEDIUM_COMPRESSION, + LOW_COMPRESSION + }; + + test_util_compress_impl(method); + + for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { + compression_level_t level = levels[l]; + test_util_compress_stream_impl(method, level); + } + done: + ; } static void @@ -2364,44 +2410,44 @@ test_util_gzip_compression_bomb(void *arg) char *one_mb = tor_malloc_zero(one_million); char *result = NULL; size_t result_len = 0; - tor_zlib_state_t *state = NULL; + tor_compress_state_t *state = NULL; /* Make sure we can't produce a compression bomb */ setup_full_capture_of_logs(LOG_WARN); - tt_int_op(-1, OP_EQ, tor_gzip_compress(&result, &result_len, - one_mb, one_million, - ZLIB_METHOD)); + tt_int_op(-1, OP_EQ, tor_compress(&result, &result_len, + one_mb, one_million, + ZLIB_METHOD)); expect_single_log_msg_containing( "We compressed something and got an insanely high " "compression factor; other Tors would think this " - "was a zlib bomb."); + "was a compression bomb."); teardown_capture_of_logs(); /* Here's a compression bomb that we made manually. */ const char compression_bomb[1039] = { 0x78, 0xDA, 0xED, 0xC1, 0x31, 0x01, 0x00, 0x00, 0x00, 0xC2, 0xA0, 0xF5, 0x4F, 0x6D, 0x08, 0x5F, 0xA0 /* .... */ }; - tt_int_op(-1, OP_EQ, tor_gzip_uncompress(&result, &result_len, - compression_bomb, 1039, - ZLIB_METHOD, 0, LOG_WARN)); + tt_int_op(-1, OP_EQ, tor_uncompress(&result, &result_len, + compression_bomb, 1039, + ZLIB_METHOD, 0, LOG_WARN)); /* Now try streaming that. */ - state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); - tor_zlib_output_t r; + state = tor_compress_new(0, ZLIB_METHOD, HIGH_COMPRESSION); + tor_compress_output_t r; const char *inp = compression_bomb; size_t inlen = 1039; do { char *outp = one_mb; size_t outleft = 4096; /* small on purpose */ - r = tor_zlib_process(state, &outp, &outleft, &inp, &inlen, 0); + r = tor_compress_process(state, &outp, &outleft, &inp, &inlen, 0); tt_int_op(inlen, OP_NE, 0); - } while (r == TOR_ZLIB_BUF_FULL); + } while (r == TOR_COMPRESS_BUFFER_FULL); - tt_int_op(r, OP_EQ, TOR_ZLIB_ERR); + tt_int_op(r, OP_EQ, TOR_COMPRESS_ERROR); done: tor_free(one_mb); - tor_zlib_free(state); + tor_compress_free(state); } /** Run unit tests for mmap() wrapper functionality. */ @@ -3340,6 +3386,13 @@ test_util_memarea(void *arg) void *malloced_ptr = NULL; int i; +#ifdef DISABLE_MEMORY_SENTINELS + /* If memory sentinels are disabled, this whole module is just an alias for + malloc(), which is free to lay out memory most any way it wants. */ + if (1) + tt_skip(); +#endif + (void)arg; tt_assert(area); @@ -3933,17 +3986,13 @@ test_util_exit_status(void *ptr) #endif #ifndef _WIN32 -/* Check that fgets with a non-blocking pipe returns partial lines and sets - * EAGAIN, returns full lines and sets no error, and returns NULL on EOF and - * sets no error */ static void -test_util_fgets_eagain(void *ptr) +test_util_string_from_pipe(void *ptr) { int test_pipe[2] = {-1, -1}; - int retval; + int retval = 0; + enum stream_status status = IO_STREAM_TERM; ssize_t retlen; - char *retptr; - FILE *test_stream = NULL; char buf[4] = { 0 }; (void)ptr; @@ -3954,91 +4003,115 @@ test_util_fgets_eagain(void *ptr) retval = pipe(test_pipe); tt_int_op(retval, OP_EQ, 0); - /* Set up the read-end to be non-blocking */ - retval = fcntl(test_pipe[0], F_SETFL, O_NONBLOCK); - tt_int_op(retval, OP_EQ, 0); + /* Send in a string. */ + retlen = write(test_pipe[1], "ABC", 3); + tt_int_op(retlen, OP_EQ, 3); - /* Open it as a stdio stream */ - test_stream = fdopen(test_pipe[0], "r"); - tt_ptr_op(test_stream, OP_NE, NULL); + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "ABC"); + errno = 0; - /* Send in a partial line */ - retlen = write(test_pipe[1], "A", 1); + /* Send in a string that contains a nul. */ + retlen = write(test_pipe[1], "AB\0", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); + errno = 0; + + /* Send in a string that contains a nul only. */ + retlen = write(test_pipe[1], "\0", 1); tt_int_op(retlen, OP_EQ, 1); - retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, OP_EQ, EAGAIN); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "A"); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, ""); errno = 0; - /* Send in the rest */ - retlen = write(test_pipe[1], "B\n", 2); - tt_int_op(retlen, OP_EQ, 2); - retptr = fgets(buf, sizeof(buf), test_stream); + /* Send in a string that contains a trailing newline. */ + retlen = write(test_pipe[1], "AB\n", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); + errno = 0; + + /* Send in a string that contains a newline only. */ + retlen = write(test_pipe[1], "\n", 1); + tt_int_op(retlen, OP_EQ, 1); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "B\n"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, ""); errno = 0; - /* Send in a full line */ - retlen = write(test_pipe[1], "CD\n", 3); + /* Send in a string and check that we nul terminate return values. */ + retlen = write(test_pipe[1], "AAA", 3); tt_int_op(retlen, OP_EQ, 3); - retptr = fgets(buf, sizeof(buf), test_stream); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "CD\n"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AAA"); + tt_mem_op(buf, OP_EQ, "AAA\0", sizeof(buf)); errno = 0; - /* Send in a partial line */ - retlen = write(test_pipe[1], "E", 1); + retlen = write(test_pipe[1], "B", 1); tt_int_op(retlen, OP_EQ, 1); - retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, OP_EQ, EAGAIN); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "E"); + + memset(buf, '\xff', sizeof(buf)); + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "B"); + tt_mem_op(buf, OP_EQ, "B\0\xff\xff", sizeof(buf)); errno = 0; - /* Send in the rest */ - retlen = write(test_pipe[1], "F\n", 2); - tt_int_op(retlen, OP_EQ, 2); - retptr = fgets(buf, sizeof(buf), test_stream); + /* Send in multiple lines. */ + retlen = write(test_pipe[1], "A\nB", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "F\n"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "A\nB"); errno = 0; - /* Send in a full line and close */ - retlen = write(test_pipe[1], "GH", 2); + /* Send in a line and close */ + retlen = write(test_pipe[1], "AB", 2); tt_int_op(retlen, OP_EQ, 2); retval = close(test_pipe[1]); tt_int_op(retval, OP_EQ, 0); test_pipe[1] = -1; - retptr = fgets(buf, sizeof(buf), test_stream); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "GH"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); errno = 0; /* Check for EOF */ - retptr = fgets(buf, sizeof(buf), test_stream); + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, NULL); - retval = feof(test_stream); - tt_int_op(retval, OP_NE, 0); + tt_int_op(status, OP_EQ, IO_STREAM_CLOSED); errno = 0; - /* Check that buf is unchanged according to C99 and C11 */ - tt_str_op(buf, OP_EQ, "GH"); - done: - if (test_stream != NULL) - fclose(test_stream); if (test_pipe[0] != -1) close(test_pipe[0]); if (test_pipe[1] != -1) close(test_pipe[1]); } -#endif + +#endif // _WIN32 /** * Test for format_hex_number_sigsafe() @@ -5664,6 +5737,10 @@ test_util_htonll(void *arg) #define UTIL_TEST(name, flags) \ { #name, test_util_ ## name, flags, NULL, NULL } +#define COMPRESS(name, identifier) \ + { "compress/" #name, test_util_compress, 0, &passthrough_setup, \ + (char*)(identifier) } + #ifdef _WIN32 #define UTIL_TEST_NO_WIN(n, f) { #n, NULL, TT_SKIP, NULL, NULL } #define UTIL_TEST_WIN_ONLY(n, f) UTIL_TEST(n, (f)) @@ -5688,7 +5765,11 @@ struct testcase_t util_tests[] = { UTIL_LEGACY(strmisc), UTIL_TEST(parse_integer, 0), UTIL_LEGACY(pow2), - UTIL_LEGACY(gzip), + COMPRESS(zlib, "deflate"), + COMPRESS(gzip, "gzip"), + COMPRESS(lzma, "x-tor-lzma"), + COMPRESS(zstd, "x-zstd"), + COMPRESS(none, "identity"), UTIL_TEST(gzip_compression_bomb, TT_FORK), UTIL_LEGACY(datadir), UTIL_LEGACY(memarea), @@ -5712,7 +5793,7 @@ struct testcase_t util_tests[] = { UTIL_TEST(num_cpus, 0), UTIL_TEST_WIN_ONLY(load_win_lib, 0), UTIL_TEST_NO_WIN(exit_status, 0), - UTIL_TEST_NO_WIN(fgets_eagain, 0), + UTIL_TEST_NO_WIN(string_from_pipe, 0), UTIL_TEST(format_hex_number, 0), UTIL_TEST(format_dec_number, 0), UTIL_TEST(join_win_cmdline, 0), diff --git a/src/test/test_util_format.c b/src/test/test_util_format.c index 21a6923c6d..ea0a86499f 100644 --- a/src/test/test_util_format.c +++ b/src/test/test_util_format.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -133,48 +133,54 @@ test_util_format_base64_encode(void *ignored) } static void -test_util_format_base64_decode_nopad(void *ignored) +test_util_format_base64_decode_oddsize(void *ignored) { (void)ignored; int res; int i; char *src; - uint8_t *dst, *real_dst; - uint8_t expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; + char *dst, real_dst[7]; + char expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; char real_src[] = "ZXhhbXBsZQ"; + char expected40[] = "testing40characteroddsizebase64encoding!"; + char src40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ"; + char pad40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ=="; src = tor_malloc_zero(256); dst = tor_malloc_zero(1000); - real_dst = tor_malloc_zero(10); for (i=0;i<256;i++) { src[i] = (char)i; } - res = base64_decode_nopad(dst, 1, src, SIZE_T_CEILING); - tt_int_op(res, OP_EQ, -1); - - res = base64_decode_nopad(dst, 1, src, 5); + res = base64_decode(dst, 1, src, 5); tt_int_op(res, OP_EQ, -1); const char *s = "SGVsbG8gd29ybGQ"; - res = base64_decode_nopad(dst, 1000, s, strlen(s)); + res = base64_decode(dst, 1000, s, strlen(s)); tt_int_op(res, OP_EQ, 11); tt_mem_op(dst, OP_EQ, "Hello world", 11); s = "T3BhIG11bmRv"; - res = base64_decode_nopad(dst, 9, s, strlen(s)); + res = base64_decode(dst, 9, s, strlen(s)); tt_int_op(res, OP_EQ, 9); tt_mem_op(dst, OP_EQ, "Opa mundo", 9); - res = base64_decode_nopad(real_dst, 10, real_src, 10); + res = base64_decode(real_dst, sizeof(real_dst), real_src, 10); tt_int_op(res, OP_EQ, 7); tt_mem_op(real_dst, OP_EQ, expected, 7); + res = base64_decode(dst, 40, src40, strlen(src40)); + tt_int_op(res, OP_EQ, 40); + tt_mem_op(dst, OP_EQ, expected40, 40); + + res = base64_decode(dst, 40, pad40, strlen(pad40)); + tt_int_op(res, OP_EQ, 40); + tt_mem_op(dst, OP_EQ, expected40, 40); + done: tor_free(src); tor_free(dst); - tor_free(real_dst); } static void @@ -196,13 +202,10 @@ test_util_format_base64_decode(void *ignored) src[i] = (char)i; } - res = base64_decode(dst, 1, src, SIZE_T_CEILING); + res = base64_decode(dst, 1, src, 100); tt_int_op(res, OP_EQ, -1); - res = base64_decode(dst, SIZE_T_CEILING+1, src, 10); - tt_int_op(res, OP_EQ, -1); - - res = base64_decode(dst, 1, real_src, SIZE_MAX/3+1); + res = base64_decode(dst, 1, real_src, 10); tt_int_op(res, OP_EQ, -1); const char *s = "T3BhIG11bmRv"; @@ -370,11 +373,39 @@ test_util_format_base32_decode(void *arg) tor_free(dst); } +static void +test_util_format_encoded_size(void *arg) +{ + (void)arg; + uint8_t inbuf[256]; + char outbuf[1024]; + unsigned i; + + crypto_rand((char *)inbuf, sizeof(inbuf)); + for (i = 0; i <= sizeof(inbuf); ++i) { + /* XXXX (Once the return values are consistent, check them too.) */ + + base32_encode(outbuf, sizeof(outbuf), (char *)inbuf, i); + /* The "+ 1" below is an API inconsistency. */ + tt_int_op(strlen(outbuf) + 1, OP_EQ, base32_encoded_size(i)); + + base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, 0); + tt_int_op(strlen(outbuf), OP_EQ, base64_encode_size(i, 0)); + base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, + BASE64_ENCODE_MULTILINE); + tt_int_op(strlen(outbuf), OP_EQ, + base64_encode_size(i, BASE64_ENCODE_MULTILINE)); + } + + done: + ; +} + struct testcase_t util_format_tests[] = { { "unaligned_accessors", test_util_format_unaligned_accessors, 0, NULL, NULL }, { "base64_encode", test_util_format_base64_encode, 0, NULL, NULL }, - { "base64_decode_nopad", test_util_format_base64_decode_nopad, 0, + { "base64_decode_oddsize", test_util_format_base64_decode_oddsize, 0, NULL, NULL }, { "base64_decode", test_util_format_base64_decode, 0, NULL, NULL }, { "base16_decode", test_util_format_base16_decode, 0, NULL, NULL }, @@ -382,6 +413,7 @@ struct testcase_t util_format_tests[] = { NULL, NULL }, { "base32_decode", test_util_format_base32_decode, 0, NULL, NULL }, + { "encoded_size", test_util_format_encoded_size, 0, NULL, NULL }, END_OF_TESTCASES }; diff --git a/src/test/test_util_process.c b/src/test/test_util_process.c index 4e75b97f3d..70292f2287 100644 --- a/src/test/test_util_process.c +++ b/src/test/test_util_process.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define UTIL_PROCESS_PRIVATE diff --git a/src/test/test_util_slow.c b/src/test/test_util_slow.c index 1e7160598c..3e5d78948d 100644 --- a/src/test/test_util_slow.c +++ b/src/test/test_util_slow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -242,7 +242,7 @@ test_util_spawn_background_partial_read_impl(int exit_early) #else /* Check that we didn't read the end of file last time */ tt_assert(!eof); - pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, sizeof(stdout_buf) - 1, NULL, &eof); #endif log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos); @@ -273,7 +273,7 @@ test_util_spawn_background_partial_read_impl(int exit_early) #else if (!eof) { /* We should have got all the data, but maybe not the EOF flag */ - pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, sizeof(stdout_buf) - 1, process_handle, &eof); tt_int_op(0,OP_EQ, pos); diff --git a/src/test/test_workqueue.c b/src/test/test_workqueue.c index ccb8d0c8ca..10714457f7 100644 --- a/src/test/test_workqueue.c +++ b/src/test/test_workqueue.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/testing_common.c b/src/test/testing_common.c index caeae13a38..d3dc761c77 100644 --- a/src/test/testing_common.c +++ b/src/test/testing_common.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ extern const char tor_git_revision[]; @@ -38,7 +38,6 @@ const char tor_git_revision[] = ""; #ifdef USE_DMALLOC #include <dmalloc.h> -#include <openssl/crypto.h> #include "main.h" #endif @@ -238,14 +237,15 @@ main(int c, const char **v) #ifdef USE_DMALLOC { - int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); - tor_assert(r); + int r = crypto_use_tor_alloc_functions(); + tor_assert(r == 0); } #endif update_approx_time(time(NULL)); options = options_new(); tor_threads_init(); + tor_compress_init(); network_init(); diff --git a/src/test/testing_rsakeys.c b/src/test/testing_rsakeys.c index 134770bb0d..5dff233a69 100644 --- a/src/test/testing_rsakeys.c +++ b/src/test/testing_rsakeys.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/tools/include.am b/src/tools/include.am index d0185b5887..5eadb03a05 100644 --- a/src/tools/include.am +++ b/src/tools/include.am @@ -1,5 +1,4 @@ bin_PROGRAMS+= src/tools/tor-resolve src/tools/tor-gencert -noinst_PROGRAMS+= src/tools/tor-checkkey if COVERAGE_ENABLED noinst_PROGRAMS+= src/tools/tor-cov-resolve src/tools/tor-cov-gencert @@ -43,14 +42,4 @@ src_tools_tor_cov_gencert_LDADD = src/common/libor-testing.a \ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ endif -src_tools_tor_checkkey_SOURCES = src/tools/tor-checkkey.c -src_tools_tor_checkkey_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ -src_tools_tor_checkkey_LDADD = src/common/libor.a \ - src/common/libor-ctime.a \ - src/common/libor-crypto.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - @TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ - EXTRA_DIST += src/tools/tor-fw-helper/README diff --git a/src/tools/tor-checkkey.c b/src/tools/tor-checkkey.c deleted file mode 100644 index 3e16fd0336..0000000000 --- a/src/tools/tor-checkkey.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (c) 2008-2015, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#include <stdio.h> -#include <stdlib.h> -#include "crypto.h" -#include "torlog.h" -#include "util.h" -#include "compat.h" -#include "compat_openssl.h" -#include <openssl/bn.h> -#include <openssl/rsa.h> - -int -main(int c, char **v) -{ - crypto_pk_t *env; - char *str; - RSA *rsa; - int wantdigest=0; - int fname_idx; - char *fname=NULL; - init_logging(1); - - if (c < 2) { - fprintf(stderr, "Hi. I'm tor-checkkey. Tell me a filename that " - "has a PEM-encoded RSA public key (like in a cert) and I'll " - "dump the modulus. Use the --digest option too and I'll " - "dump the digest.\n"); - return 1; - } - - if (crypto_global_init(0, NULL, NULL)) { - fprintf(stderr, "Couldn't initialize crypto library.\n"); - return 1; - } - - if (!strcmp(v[1], "--digest")) { - wantdigest = 1; - fname_idx = 2; - if (c<3) { - fprintf(stderr, "too few arguments"); - return 1; - } - } else { - wantdigest = 0; - fname_idx = 1; - } - - fname = expand_filename(v[fname_idx]); - str = read_file_to_str(fname, 0, NULL); - tor_free(fname); - if (!str) { - fprintf(stderr, "Couldn't read %s\n", v[fname_idx]); - return 1; - } - - env = crypto_pk_new(); - if (crypto_pk_read_public_key_from_string(env, str, strlen(str))<0) { - fprintf(stderr, "Couldn't parse key.\n"); - return 1; - } - tor_free(str); - - if (wantdigest) { - char digest[HEX_DIGEST_LEN+1]; - if (crypto_pk_get_fingerprint(env, digest, 0)<0) - return 1; - printf("%s\n",digest); - } else { - rsa = crypto_pk_get_rsa_(env); - - const BIGNUM *rsa_n; -#ifdef OPENSSL_1_1_API - const BIGNUM *rsa_e, *rsa_d; - RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d); -#else - rsa_n = rsa->n; -#endif - str = BN_bn2hex(rsa_n); - - printf("%s\n", str); - } - - return 0; -} - diff --git a/src/tools/tor-gencert.c b/src/tools/tor-gencert.c index db308485e6..395535697f 100644 --- a/src/tools/tor-gencert.c +++ b/src/tools/tor-gencert.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/tools/tor-resolve.c b/src/tools/tor-resolve.c index 6ac866d3c0..1e2409a131 100644 --- a/src/tools/tor-resolve.c +++ b/src/tools/tor-resolve.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson - * Copyright (c) 2007-2015, The Tor Project, Inc. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ diff --git a/src/trace/debug.h b/src/trace/debug.h new file mode 100644 index 0000000000..3a1652543a --- /dev/null +++ b/src/trace/debug.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TRACE_LOG_DEBUG_H +#define TOR_TRACE_LOG_DEBUG_H + +#include "torlog.h" + +/* Stringify pre-processor trick. */ +#define XSTR(d) STR(d) +#define STR(s) #s + +/* Send every event to a debug log level. This is useful to debug new trace + * events without implementing them for a specific event tracing framework. + * Note that the arguments are ignored since at this step we do not know the + * types and amount there is. */ + +/* Example on how to map a tracepoint to log_debug(). */ +#undef tor_trace +#define tor_trace(subsystem, name, args...) \ + log_debug(LD_GENERAL, "Trace event \"" XSTR(name) "\" from " \ + "\"" XSTR(subsystem) "\" hit. " \ + "(line "XSTR(__LINE__) ")") + +#endif /* TOR_TRACE_LOG_DEBUG_H */ diff --git a/src/trace/events.h b/src/trace/events.h new file mode 100644 index 0000000000..1be1fd596e --- /dev/null +++ b/src/trace/events.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file events.h + * \brief Header file for Tor event tracing. + **/ + +#ifndef TOR_TRACE_EVENTS_H +#define TOR_TRACE_EVENTS_H + +/* + * The following defines a generic event tracing function name that has to be + * used to trace events in the code base. + * + * That generic function is then defined by a event tracing framework. For + * instance, the "log debug" framework sends all trace events to log_debug() + * which is defined in src/trace/debug.h which can only be enabled at compile + * time (--enable-event-tracing-debug). + * + * By default, every trace events in the code base are replaced by a NOP. See + * doc/HACKING/Tracing.md for more information on how to use event tracing or + * add events. + */ + +#ifdef TOR_EVENT_TRACING_ENABLED +/* Map every trace event to a per subsystem macro. */ +#define tor_trace(subsystem, name, ...) \ + tor_trace_##subsystem(name, __VA_ARGS__) + +/* Enable event tracing for the debug framework where all trace events are + * mapped to a log_debug(). */ +#ifdef USE_EVENT_TRACING_DEBUG +#include "trace/debug.h" +#endif + +#else /* TOR_EVENT_TRACING_ENABLED */ + +/* Reaching this point, we NOP every event declaration because event tracing + * is not been enabled at compile time. */ +#define tor_trace(subsystem, name, args...) + +#endif /* TOR_EVENT_TRACING_ENABLED */ + +#endif /* TOR_TRACE_EVENTS_H */ diff --git a/src/trace/include.am b/src/trace/include.am new file mode 100644 index 0000000000..3285b04de6 --- /dev/null +++ b/src/trace/include.am @@ -0,0 +1,22 @@ +# Include the src/ so we can use the trace/events.h statement when including +# any file in that directory. +AM_CPPFLAGS += -I$(srcdir)/src + +noinst_LIBRARIES += \ + src/trace/libor-trace.a +LIBOR_TRACE_A_SOURCES = \ + src/trace/trace.c + +TRACEHEADERS = \ + src/trace/trace.h \ + src/trace/events.h + +if USE_EVENT_TRACING_DEBUG +TRACEHEADERS += \ + src/trace/debug.h +endif + +# Library source files. +src_trace_libor_trace_a_SOURCES = $(LIBOR_TRACE_A_SOURCES) + +noinst_HEADERS+= $(TRACEHEADERS) diff --git a/src/trace/trace.c b/src/trace/trace.c new file mode 100644 index 0000000000..fcdb80091f --- /dev/null +++ b/src/trace/trace.c @@ -0,0 +1,11 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "trace.h" + +/** Initialize the tracing library. */ +void +tor_trace_init(void) +{ +} + diff --git a/src/trace/trace.h b/src/trace/trace.h new file mode 100644 index 0000000000..28fcd8eea8 --- /dev/null +++ b/src/trace/trace.h @@ -0,0 +1,10 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TRACE_TRACE_H +#define TOR_TRACE_TRACE_H + +void tor_trace_init(void); + +#endif // TOR_TRACE_TRACE_H + diff --git a/src/trunnel/hs/cell_common.c b/src/trunnel/hs/cell_common.c index 830f2260ee..b7f19ffc60 100644 --- a/src/trunnel/hs/cell_common.c +++ b/src/trunnel/hs/cell_common.c @@ -28,10 +28,10 @@ int cellcommon_deadcode_dummy__ = 0; } \ } while (0) -cell_extension_fields_t * -cell_extension_fields_new(void) +trn_cell_extension_fields_t * +trn_cell_extension_fields_new(void) { - cell_extension_fields_t *val = trunnel_calloc(1, sizeof(cell_extension_fields_t)); + trn_cell_extension_fields_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_fields_t)); if (NULL == val) return NULL; return val; @@ -40,7 +40,7 @@ cell_extension_fields_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -cell_extension_fields_clear(cell_extension_fields_t *obj) +trn_cell_extension_fields_clear(trn_cell_extension_fields_t *obj) { (void) obj; TRUNNEL_DYNARRAY_WIPE(&obj->field); @@ -48,62 +48,62 @@ cell_extension_fields_clear(cell_extension_fields_t *obj) } void -cell_extension_fields_free(cell_extension_fields_t *obj) +trn_cell_extension_fields_free(trn_cell_extension_fields_t *obj) { if (obj == NULL) return; - cell_extension_fields_clear(obj); - trunnel_memwipe(obj, sizeof(cell_extension_fields_t)); + trn_cell_extension_fields_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_extension_fields_t)); trunnel_free_(obj); } uint8_t -cell_extension_fields_get_field_type(const cell_extension_fields_t *inp) +trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp) { return inp->field_type; } int -cell_extension_fields_set_field_type(cell_extension_fields_t *inp, uint8_t val) +trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val) { inp->field_type = val; return 0; } uint8_t -cell_extension_fields_get_field_len(const cell_extension_fields_t *inp) +trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp) { return inp->field_len; } int -cell_extension_fields_set_field_len(cell_extension_fields_t *inp, uint8_t val) +trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val) { inp->field_len = val; return 0; } size_t -cell_extension_fields_getlen_field(const cell_extension_fields_t *inp) +trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->field); } uint8_t -cell_extension_fields_get_field(cell_extension_fields_t *inp, size_t idx) +trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->field, idx); } uint8_t -cell_extension_fields_getconst_field(const cell_extension_fields_t *inp, size_t idx) +trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx) { - return cell_extension_fields_get_field((cell_extension_fields_t*)inp, idx); + return trn_cell_extension_fields_get_field((trn_cell_extension_fields_t*)inp, idx); } int -cell_extension_fields_set_field(cell_extension_fields_t *inp, size_t idx, uint8_t elt) +trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->field, idx, elt); return 0; } int -cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt) +trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT8_MAX if (inp->field.n_ == UINT8_MAX) @@ -117,17 +117,17 @@ cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt) } uint8_t * -cell_extension_fields_getarray_field(cell_extension_fields_t *inp) +trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp) { return inp->field.elts_; } const uint8_t * -cell_extension_fields_getconstarray_field(const cell_extension_fields_t *inp) +trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp) { - return (const uint8_t *)cell_extension_fields_getarray_field((cell_extension_fields_t*)inp); + return (const uint8_t *)trn_cell_extension_fields_getarray_field((trn_cell_extension_fields_t*)inp); } int -cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen) +trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen) { uint8_t *newptr; #if UINT8_MAX < SIZE_MAX @@ -147,7 +147,7 @@ cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen) return -1; } const char * -cell_extension_fields_check(const cell_extension_fields_t *obj) +trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -159,11 +159,11 @@ cell_extension_fields_check(const cell_extension_fields_t *obj) } ssize_t -cell_extension_fields_encoded_len(const cell_extension_fields_t *obj) +trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj) { ssize_t result = 0; - if (NULL != cell_extension_fields_check(obj)) + if (NULL != trn_cell_extension_fields_check(obj)) return -1; @@ -178,24 +178,24 @@ cell_extension_fields_encoded_len(const cell_extension_fields_t *obj) return result; } int -cell_extension_fields_clear_errors(cell_extension_fields_t *obj) +trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -cell_extension_fields_encode(uint8_t *output, const size_t avail, const cell_extension_fields_t *obj) +trn_cell_extension_fields_encode(uint8_t *output, const size_t avail, const trn_cell_extension_fields_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = cell_extension_fields_encoded_len(obj); + const ssize_t encoded_len = trn_cell_extension_fields_encoded_len(obj); #endif - if (NULL != (msg = cell_extension_fields_check(obj))) + if (NULL != (msg = trn_cell_extension_fields_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -252,11 +252,11 @@ cell_extension_fields_encode(uint8_t *output, const size_t avail, const cell_ext return result; } -/** As cell_extension_fields_parse(), but do not allocate the output - * object. +/** As trn_cell_extension_fields_parse(), but do not allocate the + * output object. */ static ssize_t -cell_extension_fields_parse_into(cell_extension_fields_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_extension_fields_parse_into(trn_cell_extension_fields_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -290,23 +290,23 @@ cell_extension_fields_parse_into(cell_extension_fields_t *obj, const uint8_t *in } ssize_t -cell_extension_fields_parse(cell_extension_fields_t **output, const uint8_t *input, const size_t len_in) +trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = cell_extension_fields_new(); + *output = trn_cell_extension_fields_new(); if (NULL == *output) return -1; - result = cell_extension_fields_parse_into(*output, input, len_in); + result = trn_cell_extension_fields_parse_into(*output, input, len_in); if (result < 0) { - cell_extension_fields_free(*output); + trn_cell_extension_fields_free(*output); *output = NULL; } return result; } -cell_extension_t * -cell_extension_new(void) +trn_cell_extension_t * +trn_cell_extension_new(void) { - cell_extension_t *val = trunnel_calloc(1, sizeof(cell_extension_t)); + trn_cell_extension_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_t)); if (NULL == val) return NULL; return val; @@ -315,14 +315,14 @@ cell_extension_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -cell_extension_clear(cell_extension_t *obj) +trn_cell_extension_clear(trn_cell_extension_t *obj) { (void) obj; { unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - cell_extension_fields_free(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); + trn_cell_extension_fields_free(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); } } TRUNNEL_DYNARRAY_WIPE(&obj->fields); @@ -330,92 +330,92 @@ cell_extension_clear(cell_extension_t *obj) } void -cell_extension_free(cell_extension_t *obj) +trn_cell_extension_free(trn_cell_extension_t *obj) { if (obj == NULL) return; - cell_extension_clear(obj); - trunnel_memwipe(obj, sizeof(cell_extension_t)); + trn_cell_extension_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_extension_t)); trunnel_free_(obj); } uint8_t -cell_extension_get_num(const cell_extension_t *inp) +trn_cell_extension_get_num(const trn_cell_extension_t *inp) { return inp->num; } int -cell_extension_set_num(cell_extension_t *inp, uint8_t val) +trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val) { inp->num = val; return 0; } size_t -cell_extension_getlen_fields(const cell_extension_t *inp) +trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->fields); } -struct cell_extension_fields_st * -cell_extension_get_fields(cell_extension_t *inp, size_t idx) +struct trn_cell_extension_fields_st * +trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->fields, idx); } - const struct cell_extension_fields_st * -cell_extension_getconst_fields(const cell_extension_t *inp, size_t idx) + const struct trn_cell_extension_fields_st * +trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx) { - return cell_extension_get_fields((cell_extension_t*)inp, idx); + return trn_cell_extension_get_fields((trn_cell_extension_t*)inp, idx); } int -cell_extension_set_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt) +trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt) { - cell_extension_fields_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->fields, idx); + trn_cell_extension_fields_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->fields, idx); if (oldval && oldval != elt) - cell_extension_fields_free(oldval); - return cell_extension_set0_fields(inp, idx, elt); + trn_cell_extension_fields_free(oldval); + return trn_cell_extension_set0_fields(inp, idx, elt); } int -cell_extension_set0_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt) +trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt) { TRUNNEL_DYNARRAY_SET(&inp->fields, idx, elt); return 0; } int -cell_extension_add_fields(cell_extension_t *inp, struct cell_extension_fields_st * elt) +trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt) { #if SIZE_MAX >= UINT8_MAX if (inp->fields.n_ == UINT8_MAX) goto trunnel_alloc_failed; #endif - TRUNNEL_DYNARRAY_ADD(struct cell_extension_fields_st *, &inp->fields, elt, {}); + TRUNNEL_DYNARRAY_ADD(struct trn_cell_extension_fields_st *, &inp->fields, elt, {}); return 0; trunnel_alloc_failed: TRUNNEL_SET_ERROR_CODE(inp); return -1; } -struct cell_extension_fields_st * * -cell_extension_getarray_fields(cell_extension_t *inp) +struct trn_cell_extension_fields_st * * +trn_cell_extension_getarray_fields(trn_cell_extension_t *inp) { return inp->fields.elts_; } -const struct cell_extension_fields_st * const * -cell_extension_getconstarray_fields(const cell_extension_t *inp) +const struct trn_cell_extension_fields_st * const * +trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp) { - return (const struct cell_extension_fields_st * const *)cell_extension_getarray_fields((cell_extension_t*)inp); + return (const struct trn_cell_extension_fields_st * const *)trn_cell_extension_getarray_fields((trn_cell_extension_t*)inp); } int -cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen) +trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen) { - struct cell_extension_fields_st * *newptr; + struct trn_cell_extension_fields_st * *newptr; #if UINT8_MAX < SIZE_MAX if (newlen > UINT8_MAX) goto trunnel_alloc_failed; #endif newptr = trunnel_dynarray_setlen(&inp->fields.allocated_, &inp->fields.n_, inp->fields.elts_, newlen, - sizeof(inp->fields.elts_[0]), (trunnel_free_fn_t) cell_extension_fields_free, + sizeof(inp->fields.elts_[0]), (trunnel_free_fn_t) trn_cell_extension_fields_free, &inp->trunnel_error_code_); if (newlen != 0 && newptr == NULL) goto trunnel_alloc_failed; @@ -426,7 +426,7 @@ cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen) return -1; } const char * -cell_extension_check(const cell_extension_t *obj) +trn_cell_extension_check(const trn_cell_extension_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -437,7 +437,7 @@ cell_extension_check(const cell_extension_t *obj) unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - if (NULL != (msg = cell_extension_fields_check(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)))) + if (NULL != (msg = trn_cell_extension_fields_check(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)))) return msg; } } @@ -447,46 +447,46 @@ cell_extension_check(const cell_extension_t *obj) } ssize_t -cell_extension_encoded_len(const cell_extension_t *obj) +trn_cell_extension_encoded_len(const trn_cell_extension_t *obj) { ssize_t result = 0; - if (NULL != cell_extension_check(obj)) + if (NULL != trn_cell_extension_check(obj)) return -1; /* Length of u8 num */ result += 1; - /* Length of struct cell_extension_fields fields[num] */ + /* Length of struct trn_cell_extension_fields fields[num] */ { unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - result += cell_extension_fields_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); + result += trn_cell_extension_fields_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); } } return result; } int -cell_extension_clear_errors(cell_extension_t *obj) +trn_cell_extension_clear_errors(trn_cell_extension_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_t *obj) +trn_cell_extension_encode(uint8_t *output, const size_t avail, const trn_cell_extension_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = cell_extension_encoded_len(obj); + const ssize_t encoded_len = trn_cell_extension_encoded_len(obj); #endif - if (NULL != (msg = cell_extension_check(obj))) + if (NULL != (msg = trn_cell_extension_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -500,13 +500,13 @@ cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_ trunnel_set_uint8(ptr, (obj->num)); written += 1; ptr += 1; - /* Encode struct cell_extension_fields fields[num] */ + /* Encode struct trn_cell_extension_fields fields[num] */ { unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { trunnel_assert(written <= avail); - result = cell_extension_fields_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); + result = trn_cell_extension_fields_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -537,10 +537,11 @@ cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_ return result; } -/** As cell_extension_parse(), but do not allocate the output object. +/** As trn_cell_extension_parse(), but do not allocate the output + * object. */ static ssize_t -cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_extension_parse_into(trn_cell_extension_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -552,18 +553,18 @@ cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const siz obj->num = (trunnel_get_uint8(ptr)); remaining -= 1; ptr += 1; - /* Parse struct cell_extension_fields fields[num] */ - TRUNNEL_DYNARRAY_EXPAND(cell_extension_fields_t *, &obj->fields, obj->num, {}); + /* Parse struct trn_cell_extension_fields fields[num] */ + TRUNNEL_DYNARRAY_EXPAND(trn_cell_extension_fields_t *, &obj->fields, obj->num, {}); { - cell_extension_fields_t * elt; + trn_cell_extension_fields_t * elt; unsigned idx; for (idx = 0; idx < obj->num; ++idx) { - result = cell_extension_fields_parse(&elt, ptr, remaining); + result = trn_cell_extension_fields_parse(&elt, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(cell_extension_fields_t *, &obj->fields, elt, {cell_extension_fields_free(elt);}); + TRUNNEL_DYNARRAY_ADD(trn_cell_extension_fields_t *, &obj->fields, elt, {trn_cell_extension_fields_free(elt);}); } } trunnel_assert(ptr + remaining == input + len_in); @@ -579,15 +580,15 @@ cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const siz } ssize_t -cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in) +trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = cell_extension_new(); + *output = trn_cell_extension_new(); if (NULL == *output) return -1; - result = cell_extension_parse_into(*output, input, len_in); + result = trn_cell_extension_parse_into(*output, input, len_in); if (result < 0) { - cell_extension_free(*output); + trn_cell_extension_free(*output); *output = NULL; } return result; diff --git a/src/trunnel/hs/cell_common.h b/src/trunnel/hs/cell_common.h index 8999f7da40..4d98a54cf4 100644 --- a/src/trunnel/hs/cell_common.h +++ b/src/trunnel/hs/cell_common.h @@ -8,191 +8,196 @@ #include <stdint.h> #include "trunnel.h" -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CELL_EXTENSION_FIELDS) -struct cell_extension_fields_st { +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION_FIELDS) +struct trn_cell_extension_fields_st { uint8_t field_type; uint8_t field_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) field; uint8_t trunnel_error_code_; }; #endif -typedef struct cell_extension_fields_st cell_extension_fields_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CELL_EXTENSION) -struct cell_extension_st { +typedef struct trn_cell_extension_fields_st trn_cell_extension_fields_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION) +struct trn_cell_extension_st { uint8_t num; - TRUNNEL_DYNARRAY_HEAD(, struct cell_extension_fields_st *) fields; + TRUNNEL_DYNARRAY_HEAD(, struct trn_cell_extension_fields_st *) fields; uint8_t trunnel_error_code_; }; #endif -typedef struct cell_extension_st cell_extension_t; -/** Return a newly allocated cell_extension_fields with all elements - * set to zero. - */ -cell_extension_fields_t *cell_extension_fields_new(void); -/** Release all storage held by the cell_extension_fields in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void cell_extension_fields_free(cell_extension_fields_t *victim); -/** Try to parse a cell_extension_fields from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated cell_extension_fields_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t cell_extension_fields_parse(cell_extension_fields_t **output, const uint8_t *input, const size_t len_in); +typedef struct trn_cell_extension_st trn_cell_extension_t; +/** Return a newly allocated trn_cell_extension_fields with all + * elements set to zero. + */ +trn_cell_extension_fields_t *trn_cell_extension_fields_new(void); +/** Release all storage held by the trn_cell_extension_fields in + * 'victim'. (Do nothing if 'victim' is NULL.) + */ +void trn_cell_extension_fields_free(trn_cell_extension_fields_t *victim); +/** Try to parse a trn_cell_extension_fields from the buffer in + * 'input', using up to 'len_in' bytes from the input buffer. On + * success, return the number of bytes consumed and set *output to the + * newly allocated trn_cell_extension_fields_t. On failure, return -2 + * if the input appears truncated, and -1 if the input is otherwise + * invalid. + */ +ssize_t trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * cell_extension_fields in 'obj'. On failure, return a negative + * trn_cell_extension_fields in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t cell_extension_fields_encoded_len(const cell_extension_fields_t *obj); -/** Try to encode the cell_extension_fields from 'input' into the +ssize_t trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj); +/** Try to encode the trn_cell_extension_fields from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t cell_extension_fields_encode(uint8_t *output, size_t avail, const cell_extension_fields_t *input); -/** Check whether the internal state of the cell_extension_fields in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. +ssize_t trn_cell_extension_fields_encode(uint8_t *output, size_t avail, const trn_cell_extension_fields_t *input); +/** Check whether the internal state of the trn_cell_extension_fields + * in 'obj' is consistent. Return NULL if it is, and a short message + * if it is not. */ -const char *cell_extension_fields_check(const cell_extension_fields_t *obj); +const char *trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int cell_extension_fields_clear_errors(cell_extension_fields_t *obj); +int trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj); /** Return the value of the field_type field of the - * cell_extension_fields_t in 'inp' + * trn_cell_extension_fields_t in 'inp' */ -uint8_t cell_extension_fields_get_field_type(const cell_extension_fields_t *inp); +uint8_t trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp); /** Set the value of the field_type field of the - * cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int cell_extension_fields_set_field_type(cell_extension_fields_t *inp, uint8_t val); +int trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val); /** Return the value of the field_len field of the - * cell_extension_fields_t in 'inp' + * trn_cell_extension_fields_t in 'inp' */ -uint8_t cell_extension_fields_get_field_len(const cell_extension_fields_t *inp); +uint8_t trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp); /** Set the value of the field_len field of the - * cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int cell_extension_fields_set_field_len(cell_extension_fields_t *inp, uint8_t val); +int trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val); /** Return the length of the dynamic array holding the field field of - * the cell_extension_fields_t in 'inp'. + * the trn_cell_extension_fields_t in 'inp'. */ -size_t cell_extension_fields_getlen_field(const cell_extension_fields_t *inp); +size_t trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp); /** Return the element at position 'idx' of the dynamic array field - * field of the cell_extension_fields_t in 'inp'. + * field of the trn_cell_extension_fields_t in 'inp'. */ -uint8_t cell_extension_fields_get_field(cell_extension_fields_t *inp, size_t idx); -/** As cell_extension_fields_get_field, but take and return a const - * pointer +uint8_t trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx); +/** As trn_cell_extension_fields_get_field, but take and return a + * const pointer */ -uint8_t cell_extension_fields_getconst_field(const cell_extension_fields_t *inp, size_t idx); +uint8_t trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * field of the cell_extension_fields_t in 'inp', so that it will hold - * the value 'elt'. + * field of the trn_cell_extension_fields_t in 'inp', so that it will + * hold the value 'elt'. */ -int cell_extension_fields_set_field(cell_extension_fields_t *inp, size_t idx, uint8_t elt); +int trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field field of the - * cell_extension_fields_t in 'inp'. + * trn_cell_extension_fields_t in 'inp'. */ -int cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt); +int trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field field of * 'inp'. */ -uint8_t * cell_extension_fields_getarray_field(cell_extension_fields_t *inp); -/** As cell_extension_fields_get_field, but take and return a const - * pointer +uint8_t * trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp); +/** As trn_cell_extension_fields_get_field, but take and return a + * const pointer */ -const uint8_t * cell_extension_fields_getconstarray_field(const cell_extension_fields_t *inp); +const uint8_t * trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp); /** Change the length of the variable-length array field field of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen); -/** Return a newly allocated cell_extension with all elements set to - * zero. +int trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen); +/** Return a newly allocated trn_cell_extension with all elements set + * to zero. */ -cell_extension_t *cell_extension_new(void); -/** Release all storage held by the cell_extension in 'victim'. (Do - * nothing if 'victim' is NULL.) +trn_cell_extension_t *trn_cell_extension_new(void); +/** Release all storage held by the trn_cell_extension in 'victim'. + * (Do nothing if 'victim' is NULL.) */ -void cell_extension_free(cell_extension_t *victim); -/** Try to parse a cell_extension from the buffer in 'input', using up - * to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * cell_extension_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. +void trn_cell_extension_free(trn_cell_extension_t *victim); +/** Try to parse a trn_cell_extension from the buffer in 'input', + * using up to 'len_in' bytes from the input buffer. On success, + * return the number of bytes consumed and set *output to the newly + * allocated trn_cell_extension_t. On failure, return -2 if the input + * appears truncated, and -1 if the input is otherwise invalid. */ -ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * cell_extension in 'obj'. On failure, return a negative value. Note - * that this value may be an overestimate, and can even be an + * trn_cell_extension in 'obj'. On failure, return a negative value. + * Note that this value may be an overestimate, and can even be an * underestimate for certain unencodeable objects. */ -ssize_t cell_extension_encoded_len(const cell_extension_t *obj); -/** Try to encode the cell_extension from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On +ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); +/** Try to encode the trn_cell_extension from 'input' into the buffer + * at 'output', using up to 'avail' bytes of the output buffer. On * success, return the number of bytes used. On failure, return -2 if * the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input); -/** Check whether the internal state of the cell_extension in 'obj' is - * consistent. Return NULL if it is, and a short message if it is not. +ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); +/** Check whether the internal state of the trn_cell_extension in + * 'obj' is consistent. Return NULL if it is, and a short message if + * it is not. */ -const char *cell_extension_check(const cell_extension_t *obj); +const char *trn_cell_extension_check(const trn_cell_extension_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int cell_extension_clear_errors(cell_extension_t *obj); -/** Return the value of the num field of the cell_extension_t in 'inp' +int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); +/** Return the value of the num field of the trn_cell_extension_t in + * 'inp' */ -uint8_t cell_extension_get_num(const cell_extension_t *inp); -/** Set the value of the num field of the cell_extension_t in 'inp' to - * 'val'. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. +uint8_t trn_cell_extension_get_num(const trn_cell_extension_t *inp); +/** Set the value of the num field of the trn_cell_extension_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. */ -int cell_extension_set_num(cell_extension_t *inp, uint8_t val); +int trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val); /** Return the length of the dynamic array holding the fields field of - * the cell_extension_t in 'inp'. + * the trn_cell_extension_t in 'inp'. */ -size_t cell_extension_getlen_fields(const cell_extension_t *inp); +size_t trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp); /** Return the element at position 'idx' of the dynamic array field - * fields of the cell_extension_t in 'inp'. + * fields of the trn_cell_extension_t in 'inp'. */ -struct cell_extension_fields_st * cell_extension_get_fields(cell_extension_t *inp, size_t idx); -/** As cell_extension_get_fields, but take and return a const pointer +struct trn_cell_extension_fields_st * trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx); +/** As trn_cell_extension_get_fields, but take and return a const + * pointer */ - const struct cell_extension_fields_st * cell_extension_getconst_fields(const cell_extension_t *inp, size_t idx); + const struct trn_cell_extension_fields_st * trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * fields of the cell_extension_t in 'inp', so that it will hold the - * value 'elt'. Free the previous value, if any. + * fields of the trn_cell_extension_t in 'inp', so that it will hold + * the value 'elt'. Free the previous value, if any. */ -int cell_extension_set_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt); -/** As cell_extension_set_fields, but does not free the previous +int trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt); +/** As trn_cell_extension_set_fields, but does not free the previous * value. */ -int cell_extension_set0_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt); +int trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt); /** Append a new element 'elt' to the dynamic array field fields of - * the cell_extension_t in 'inp'. + * the trn_cell_extension_t in 'inp'. */ -int cell_extension_add_fields(cell_extension_t *inp, struct cell_extension_fields_st * elt); +int trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt); /** Return a pointer to the variable-length array field fields of * 'inp'. */ -struct cell_extension_fields_st * * cell_extension_getarray_fields(cell_extension_t *inp); -/** As cell_extension_get_fields, but take and return a const pointer +struct trn_cell_extension_fields_st * * trn_cell_extension_getarray_fields(trn_cell_extension_t *inp); +/** As trn_cell_extension_get_fields, but take and return a const + * pointer */ -const struct cell_extension_fields_st * const * cell_extension_getconstarray_fields(const cell_extension_t *inp); +const struct trn_cell_extension_fields_st * const * trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp); /** Change the length of the variable-length array field fields of * 'inp' to 'newlen'.Fill extra elements with NULL; free removed * elements. Return 0 on success; return -1 and set the error code on * 'inp' on failure. */ -int cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen); +int trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen); #endif diff --git a/src/trunnel/hs/cell_common.trunnel b/src/trunnel/hs/cell_common.trunnel index 1bbec5a1fe..1aa6999de7 100644 --- a/src/trunnel/hs/cell_common.trunnel +++ b/src/trunnel/hs/cell_common.trunnel @@ -1,12 +1,12 @@ /* This file contains common data structure that cells use. */ -struct cell_extension_fields { +struct trn_cell_extension_fields { u8 field_type; u8 field_len; u8 field[field_len]; }; -struct cell_extension { +struct trn_cell_extension { u8 num; - struct cell_extension_fields fields[num]; + struct trn_cell_extension_fields fields[num]; }; diff --git a/src/trunnel/hs/cell_establish_intro.c b/src/trunnel/hs/cell_establish_intro.c index 633bd7c214..22e198c369 100644 --- a/src/trunnel/hs/cell_establish_intro.c +++ b/src/trunnel/hs/cell_establish_intro.c @@ -28,18 +28,18 @@ int cellestablishintro_deadcode_dummy__ = 0; } \ } while (0) -typedef struct cell_extension_st cell_extension_t; -cell_extension_t *cell_extension_new(void); -void cell_extension_free(cell_extension_t *victim); -ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in); -ssize_t cell_extension_encoded_len(const cell_extension_t *obj); -ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input); -const char *cell_extension_check(const cell_extension_t *obj); -int cell_extension_clear_errors(cell_extension_t *obj); -hs_cell_establish_intro_t * -hs_cell_establish_intro_new(void) -{ - hs_cell_establish_intro_t *val = trunnel_calloc(1, sizeof(hs_cell_establish_intro_t)); +typedef struct trn_cell_extension_st trn_cell_extension_t; +trn_cell_extension_t *trn_cell_extension_new(void); +void trn_cell_extension_free(trn_cell_extension_t *victim); +ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); +ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); +const char *trn_cell_extension_check(const trn_cell_extension_t *obj); +int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); +trn_cell_establish_intro_t * +trn_cell_establish_intro_new(void) +{ + trn_cell_establish_intro_t *val = trunnel_calloc(1, sizeof(trn_cell_establish_intro_t)); if (NULL == val) return NULL; return val; @@ -48,39 +48,39 @@ hs_cell_establish_intro_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_establish_intro_clear(hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_clear(trn_cell_establish_intro_t *obj) { (void) obj; TRUNNEL_DYNARRAY_WIPE(&obj->auth_key); TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key); - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; TRUNNEL_DYNARRAY_WIPE(&obj->sig); TRUNNEL_DYNARRAY_CLEAR(&obj->sig); } void -hs_cell_establish_intro_free(hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_free(trn_cell_establish_intro_t *obj) { if (obj == NULL) return; - hs_cell_establish_intro_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_establish_intro_t)); + trn_cell_establish_intro_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_establish_intro_t)); trunnel_free_(obj); } const uint8_t * -hs_cell_establish_intro_get_start_cell(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp) { return inp->start_cell; } uint8_t -hs_cell_establish_intro_get_auth_key_type(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp) { return inp->auth_key_type; } int -hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_t val) +trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val) { if (! ((val == 0 || val == 1 || val == 2))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -90,41 +90,41 @@ hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_ return 0; } uint16_t -hs_cell_establish_intro_get_auth_key_len(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp) { return inp->auth_key_len; } int -hs_cell_establish_intro_set_auth_key_len(hs_cell_establish_intro_t *inp, uint16_t val) +trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val) { inp->auth_key_len = val; return 0; } size_t -hs_cell_establish_intro_getlen_auth_key(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->auth_key); } uint8_t -hs_cell_establish_intro_get_auth_key(hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx); } uint8_t -hs_cell_establish_intro_getconst_auth_key(const hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx) { - return hs_cell_establish_intro_get_auth_key((hs_cell_establish_intro_t*)inp, idx); + return trn_cell_establish_intro_get_auth_key((trn_cell_establish_intro_t*)inp, idx); } int -hs_cell_establish_intro_set_auth_key(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt) +trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt); return 0; } int -hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt) +trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->auth_key.n_ == UINT16_MAX) @@ -138,17 +138,17 @@ hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt } uint8_t * -hs_cell_establish_intro_getarray_auth_key(hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp) { return inp->auth_key.elts_; } const uint8_t * -hs_cell_establish_intro_getconstarray_auth_key(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp) { - return (const uint8_t *)hs_cell_establish_intro_getarray_auth_key((hs_cell_establish_intro_t*)inp); + return (const uint8_t *)trn_cell_establish_intro_getarray_auth_key((trn_cell_establish_intro_t*)inp); } int -hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t newlen) +trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -167,54 +167,54 @@ hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t n TRUNNEL_SET_ERROR_CODE(inp); return -1; } -struct cell_extension_st * -hs_cell_establish_intro_get_extensions(hs_cell_establish_intro_t *inp) +struct trn_cell_extension_st * +trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_establish_intro_getconst_extensions(const hs_cell_establish_intro_t *inp) +const struct trn_cell_extension_st * +trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp) { - return hs_cell_establish_intro_get_extensions((hs_cell_establish_intro_t*) inp); + return trn_cell_establish_intro_get_extensions((trn_cell_establish_intro_t*) inp); } int -hs_cell_establish_intro_set_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val) +trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_establish_intro_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_establish_intro_set0_extensions(inp, val); } int -hs_cell_establish_intro_set0_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val) +trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } const uint8_t * -hs_cell_establish_intro_get_end_mac_fields(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp) { return inp->end_mac_fields; } size_t -hs_cell_establish_intro_getlen_handshake_mac(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp) { (void)inp; return TRUNNEL_SHA3_256_LEN; } uint8_t -hs_cell_establish_intro_get_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx) { trunnel_assert(idx < TRUNNEL_SHA3_256_LEN); return inp->handshake_mac[idx]; } uint8_t -hs_cell_establish_intro_getconst_handshake_mac(const hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx) { - return hs_cell_establish_intro_get_handshake_mac((hs_cell_establish_intro_t*)inp, idx); + return trn_cell_establish_intro_get_handshake_mac((trn_cell_establish_intro_t*)inp, idx); } int -hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt) +trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) { trunnel_assert(idx < TRUNNEL_SHA3_256_LEN); inp->handshake_mac[idx] = elt; @@ -222,56 +222,56 @@ hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t } uint8_t * -hs_cell_establish_intro_getarray_handshake_mac(hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp) { return inp->handshake_mac; } const uint8_t * -hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp) { - return (const uint8_t *)hs_cell_establish_intro_getarray_handshake_mac((hs_cell_establish_intro_t*)inp); + return (const uint8_t *)trn_cell_establish_intro_getarray_handshake_mac((trn_cell_establish_intro_t*)inp); } const uint8_t * -hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp) { return inp->end_sig_fields; } uint16_t -hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp) { return inp->sig_len; } int -hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val) +trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val) { inp->sig_len = val; return 0; } size_t -hs_cell_establish_intro_getlen_sig(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->sig); } uint8_t -hs_cell_establish_intro_get_sig(hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->sig, idx); } uint8_t -hs_cell_establish_intro_getconst_sig(const hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx) { - return hs_cell_establish_intro_get_sig((hs_cell_establish_intro_t*)inp, idx); + return trn_cell_establish_intro_get_sig((trn_cell_establish_intro_t*)inp, idx); } int -hs_cell_establish_intro_set_sig(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt) +trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->sig, idx, elt); return 0; } int -hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt) +trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->sig.n_ == UINT16_MAX) @@ -285,17 +285,17 @@ hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt) } uint8_t * -hs_cell_establish_intro_getarray_sig(hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp) { return inp->sig.elts_; } const uint8_t * -hs_cell_establish_intro_getconstarray_sig(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp) { - return (const uint8_t *)hs_cell_establish_intro_getarray_sig((hs_cell_establish_intro_t*)inp); + return (const uint8_t *)trn_cell_establish_intro_getarray_sig((trn_cell_establish_intro_t*)inp); } int -hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen) +trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -315,7 +315,7 @@ hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen return -1; } const char * -hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -327,7 +327,7 @@ hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj) return "Length mismatch for auth_key"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } if (TRUNNEL_DYNARRAY_LEN(&obj->sig) != obj->sig_len) @@ -336,11 +336,11 @@ hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj) } ssize_t -hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_establish_intro_check(obj)) + if (NULL != trn_cell_establish_intro_check(obj)) return -1; @@ -353,8 +353,8 @@ hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj) /* Length of u8 auth_key[auth_key_len] */ result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); /* Length of u8 handshake_mac[TRUNNEL_SHA3_256_LEN] */ result += TRUNNEL_SHA3_256_LEN; @@ -367,24 +367,24 @@ hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj) return result; } int -hs_cell_establish_intro_clear_errors(hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_encode(uint8_t *output, const size_t avail, const trn_cell_establish_intro_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_establish_intro_encoded_len(obj); + const ssize_t encoded_len = trn_cell_establish_intro_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_establish_intro_check(obj))) + if (NULL != (msg = trn_cell_establish_intro_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -417,9 +417,9 @@ hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cel written += elt_len; ptr += elt_len; } - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -474,11 +474,11 @@ hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cel return result; } -/** As hs_cell_establish_intro_parse(), but do not allocate the output - * object. +/** As trn_cell_establish_intro_parse(), but do not allocate the + * output object. */ static ssize_t -hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_establish_intro_parse_into(trn_cell_establish_intro_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -506,8 +506,8 @@ hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len); ptr += obj->auth_key_len; remaining -= obj->auth_key_len; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -548,23 +548,23 @@ hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t } ssize_t -hs_cell_establish_intro_parse(hs_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in) +trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_establish_intro_new(); + *output = trn_cell_establish_intro_new(); if (NULL == *output) return -1; - result = hs_cell_establish_intro_parse_into(*output, input, len_in); + result = trn_cell_establish_intro_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_establish_intro_free(*output); + trn_cell_establish_intro_free(*output); *output = NULL; } return result; } -hs_cell_intro_established_t * -hs_cell_intro_established_new(void) +trn_cell_intro_established_t * +trn_cell_intro_established_new(void) { - hs_cell_intro_established_t *val = trunnel_calloc(1, sizeof(hs_cell_intro_established_t)); + trn_cell_intro_established_t *val = trunnel_calloc(1, sizeof(trn_cell_intro_established_t)); if (NULL == val) return NULL; return val; @@ -573,48 +573,48 @@ hs_cell_intro_established_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_intro_established_clear(hs_cell_intro_established_t *obj) +trn_cell_intro_established_clear(trn_cell_intro_established_t *obj) { (void) obj; - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; } void -hs_cell_intro_established_free(hs_cell_intro_established_t *obj) +trn_cell_intro_established_free(trn_cell_intro_established_t *obj) { if (obj == NULL) return; - hs_cell_intro_established_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_intro_established_t)); + trn_cell_intro_established_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_intro_established_t)); trunnel_free_(obj); } -struct cell_extension_st * -hs_cell_intro_established_get_extensions(hs_cell_intro_established_t *inp) +struct trn_cell_extension_st * +trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_intro_established_getconst_extensions(const hs_cell_intro_established_t *inp) +const struct trn_cell_extension_st * +trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp) { - return hs_cell_intro_established_get_extensions((hs_cell_intro_established_t*) inp); + return trn_cell_intro_established_get_extensions((trn_cell_intro_established_t*) inp); } int -hs_cell_intro_established_set_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val) +trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_intro_established_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_intro_established_set0_extensions(inp, val); } int -hs_cell_intro_established_set0_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val) +trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } const char * -hs_cell_intro_established_check(const hs_cell_intro_established_t *obj) +trn_cell_intro_established_check(const trn_cell_intro_established_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -622,53 +622,53 @@ hs_cell_intro_established_check(const hs_cell_intro_established_t *obj) return "A set function failed on this object"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } return NULL; } ssize_t -hs_cell_intro_established_encoded_len(const hs_cell_intro_established_t *obj) +trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_intro_established_check(obj)) + if (NULL != trn_cell_intro_established_check(obj)) return -1; - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); return result; } int -hs_cell_intro_established_clear_errors(hs_cell_intro_established_t *obj) +trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_intro_established_encode(uint8_t *output, const size_t avail, const hs_cell_intro_established_t *obj) +trn_cell_intro_established_encode(uint8_t *output, const size_t avail, const trn_cell_intro_established_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_intro_established_encoded_len(obj); + const ssize_t encoded_len = trn_cell_intro_established_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_intro_established_check(obj))) + if (NULL != (msg = trn_cell_intro_established_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN trunnel_assert(encoded_len >= 0); #endif - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -694,19 +694,19 @@ hs_cell_intro_established_encode(uint8_t *output, const size_t avail, const hs_c return result; } -/** As hs_cell_intro_established_parse(), but do not allocate the +/** As trn_cell_intro_established_parse(), but do not allocate the * output object. */ static ssize_t -hs_cell_intro_established_parse_into(hs_cell_intro_established_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_intro_established_parse_into(trn_cell_intro_established_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; ssize_t result = 0; (void)result; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -720,15 +720,15 @@ hs_cell_intro_established_parse_into(hs_cell_intro_established_t *obj, const uin } ssize_t -hs_cell_intro_established_parse(hs_cell_intro_established_t **output, const uint8_t *input, const size_t len_in) +trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_intro_established_new(); + *output = trn_cell_intro_established_new(); if (NULL == *output) return -1; - result = hs_cell_intro_established_parse_into(*output, input, len_in); + result = trn_cell_intro_established_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_intro_established_free(*output); + trn_cell_intro_established_free(*output); *output = NULL; } return result; diff --git a/src/trunnel/hs/cell_establish_intro.h b/src/trunnel/hs/cell_establish_intro.h index 725d47cd85..2f0d893659 100644 --- a/src/trunnel/hs/cell_establish_intro.h +++ b/src/trunnel/hs/cell_establish_intro.h @@ -8,15 +8,15 @@ #include <stdint.h> #include "trunnel.h" -struct cell_extension_st; +struct trn_cell_extension_st; #define TRUNNEL_SHA3_256_LEN 32 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_ESTABLISH_INTRO) -struct hs_cell_establish_intro_st { +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_ESTABLISH_INTRO) +struct trn_cell_establish_intro_st { const uint8_t *start_cell; uint8_t auth_key_type; uint16_t auth_key_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; const uint8_t *end_mac_fields; uint8_t handshake_mac[TRUNNEL_SHA3_256_LEN]; const uint8_t *end_sig_fields; @@ -25,251 +25,252 @@ struct hs_cell_establish_intro_st { uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_establish_intro_st hs_cell_establish_intro_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRO_ESTABLISHED) -struct hs_cell_intro_established_st { - struct cell_extension_st *extensions; +typedef struct trn_cell_establish_intro_st trn_cell_establish_intro_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRO_ESTABLISHED) +struct trn_cell_intro_established_st { + struct trn_cell_extension_st *extensions; uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_intro_established_st hs_cell_intro_established_t; -/** Return a newly allocated hs_cell_establish_intro with all elements - * set to zero. +typedef struct trn_cell_intro_established_st trn_cell_intro_established_t; +/** Return a newly allocated trn_cell_establish_intro with all + * elements set to zero. */ -hs_cell_establish_intro_t *hs_cell_establish_intro_new(void); -/** Release all storage held by the hs_cell_establish_intro in +trn_cell_establish_intro_t *trn_cell_establish_intro_new(void); +/** Release all storage held by the trn_cell_establish_intro in * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_establish_intro_free(hs_cell_establish_intro_t *victim); -/** Try to parse a hs_cell_establish_intro from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated hs_cell_establish_intro_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. +void trn_cell_establish_intro_free(trn_cell_establish_intro_t *victim); +/** Try to parse a trn_cell_establish_intro from the buffer in + * 'input', using up to 'len_in' bytes from the input buffer. On + * success, return the number of bytes consumed and set *output to the + * newly allocated trn_cell_establish_intro_t. On failure, return -2 + * if the input appears truncated, and -1 if the input is otherwise + * invalid. */ -ssize_t hs_cell_establish_intro_parse(hs_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_establish_intro in 'obj'. On failure, return a negative + * trn_cell_establish_intro in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj); -/** Try to encode the hs_cell_establish_intro from 'input' into the +ssize_t trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj); +/** Try to encode the trn_cell_establish_intro from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_establish_intro_encode(uint8_t *output, size_t avail, const hs_cell_establish_intro_t *input); -/** Check whether the internal state of the hs_cell_establish_intro in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. +ssize_t trn_cell_establish_intro_encode(uint8_t *output, size_t avail, const trn_cell_establish_intro_t *input); +/** Check whether the internal state of the trn_cell_establish_intro + * in 'obj' is consistent. Return NULL if it is, and a short message + * if it is not. */ -const char *hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj); +const char *trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_establish_intro_clear_errors(hs_cell_establish_intro_t *obj); +int trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj); /** Return the position for start_cell when we parsed this object */ -const uint8_t * hs_cell_establish_intro_get_start_cell(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp); /** Return the value of the auth_key_type field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -uint8_t hs_cell_establish_intro_get_auth_key_type(const hs_cell_establish_intro_t *inp); +uint8_t trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp); /** Set the value of the auth_key_type field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_t val); +int trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val); /** Return the value of the auth_key_len field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -uint16_t hs_cell_establish_intro_get_auth_key_len(const hs_cell_establish_intro_t *inp); +uint16_t trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp); /** Set the value of the auth_key_len field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_auth_key_len(hs_cell_establish_intro_t *inp, uint16_t val); +int trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val); /** Return the length of the dynamic array holding the auth_key field - * of the hs_cell_establish_intro_t in 'inp'. + * of the trn_cell_establish_intro_t in 'inp'. */ -size_t hs_cell_establish_intro_getlen_auth_key(const hs_cell_establish_intro_t *inp); +size_t trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp); /** Return the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_establish_intro_t in 'inp'. + * auth_key of the trn_cell_establish_intro_t in 'inp'. */ -uint8_t hs_cell_establish_intro_get_auth_key(hs_cell_establish_intro_t *inp, size_t idx); -/** As hs_cell_establish_intro_get_auth_key, but take and return a +uint8_t trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx); +/** As trn_cell_establish_intro_get_auth_key, but take and return a * const pointer */ -uint8_t hs_cell_establish_intro_getconst_auth_key(const hs_cell_establish_intro_t *inp, size_t idx); +uint8_t trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_establish_intro_t in 'inp', so that it will - * hold the value 'elt'. + * auth_key of the trn_cell_establish_intro_t in 'inp', so that it + * will hold the value 'elt'. */ -int hs_cell_establish_intro_set_auth_key(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt); +int trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field auth_key of - * the hs_cell_establish_intro_t in 'inp'. + * the trn_cell_establish_intro_t in 'inp'. */ -int hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt); +int trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field auth_key of * 'inp'. */ -uint8_t * hs_cell_establish_intro_getarray_auth_key(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_auth_key, but take and return a +uint8_t * trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_auth_key, but take and return a * const pointer */ -const uint8_t * hs_cell_establish_intro_getconstarray_auth_key(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp); /** Change the length of the variable-length array field auth_key of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t newlen); +int trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen); /** Return the value of the extensions field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -struct cell_extension_st * hs_cell_establish_intro_get_extensions(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_extensions, but take and return a +struct trn_cell_extension_st * trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_extensions, but take and return a * const pointer */ -const struct cell_extension_st * hs_cell_establish_intro_getconst_extensions(const hs_cell_establish_intro_t *inp); +const struct trn_cell_extension_st * trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp); /** Set the value of the extensions field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Free the old value if + * trn_cell_establish_intro_t in 'inp' to 'val'. Free the old value if * any. Steals the referenceto 'val'.Return 0 on success; return -1 * and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val); -/** As hs_cell_establish_intro_set_extensions, but does not free the +int trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_establish_intro_set_extensions, but does not free the * previous value. */ -int hs_cell_establish_intro_set0_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val); +int trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val); /** Return the position for end_mac_fields when we parsed this object */ -const uint8_t * hs_cell_establish_intro_get_end_mac_fields(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp); /** Return the (constant) length of the array holding the - * handshake_mac field of the hs_cell_establish_intro_t in 'inp'. + * handshake_mac field of the trn_cell_establish_intro_t in 'inp'. */ -size_t hs_cell_establish_intro_getlen_handshake_mac(const hs_cell_establish_intro_t *inp); +size_t trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp); /** Return the element at position 'idx' of the fixed array field - * handshake_mac of the hs_cell_establish_intro_t in 'inp'. + * handshake_mac of the trn_cell_establish_intro_t in 'inp'. */ -uint8_t hs_cell_establish_intro_get_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx); -/** As hs_cell_establish_intro_get_handshake_mac, but take and return +uint8_t trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx); +/** As trn_cell_establish_intro_get_handshake_mac, but take and return * a const pointer */ -uint8_t hs_cell_establish_intro_getconst_handshake_mac(const hs_cell_establish_intro_t *inp, size_t idx); +uint8_t trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx); /** Change the element at position 'idx' of the fixed array field - * handshake_mac of the hs_cell_establish_intro_t in 'inp', so that it - * will hold the value 'elt'. + * handshake_mac of the trn_cell_establish_intro_t in 'inp', so that + * it will hold the value 'elt'. */ -int hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt); +int trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); /** Return a pointer to the TRUNNEL_SHA3_256_LEN-element array field * handshake_mac of 'inp'. */ -uint8_t * hs_cell_establish_intro_getarray_handshake_mac(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_handshake_mac, but take and return +uint8_t * trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_handshake_mac, but take and return * a const pointer */ -const uint8_t * hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp); /** Return the position for end_sig_fields when we parsed this object */ -const uint8_t * hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp); /** Return the value of the sig_len field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -uint16_t hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *inp); +uint16_t trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp); /** Set the value of the sig_len field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val); +int trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val); /** Return the length of the dynamic array holding the sig field of - * the hs_cell_establish_intro_t in 'inp'. + * the trn_cell_establish_intro_t in 'inp'. */ -size_t hs_cell_establish_intro_getlen_sig(const hs_cell_establish_intro_t *inp); +size_t trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp); /** Return the element at position 'idx' of the dynamic array field - * sig of the hs_cell_establish_intro_t in 'inp'. + * sig of the trn_cell_establish_intro_t in 'inp'. */ -uint8_t hs_cell_establish_intro_get_sig(hs_cell_establish_intro_t *inp, size_t idx); -/** As hs_cell_establish_intro_get_sig, but take and return a const +uint8_t trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx); +/** As trn_cell_establish_intro_get_sig, but take and return a const * pointer */ -uint8_t hs_cell_establish_intro_getconst_sig(const hs_cell_establish_intro_t *inp, size_t idx); +uint8_t trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * sig of the hs_cell_establish_intro_t in 'inp', so that it will hold - * the value 'elt'. + * sig of the trn_cell_establish_intro_t in 'inp', so that it will + * hold the value 'elt'. */ -int hs_cell_establish_intro_set_sig(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt); +int trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field sig of the - * hs_cell_establish_intro_t in 'inp'. + * trn_cell_establish_intro_t in 'inp'. */ -int hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt); +int trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field sig of 'inp'. */ -uint8_t * hs_cell_establish_intro_getarray_sig(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_sig, but take and return a const +uint8_t * trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_sig, but take and return a const * pointer */ -const uint8_t * hs_cell_establish_intro_getconstarray_sig(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp); /** Change the length of the variable-length array field sig of 'inp' * to 'newlen'.Fill extra elements with 0. Return 0 on success; return * -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen); -/** Return a newly allocated hs_cell_intro_established with all +int trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen); +/** Return a newly allocated trn_cell_intro_established with all * elements set to zero. */ -hs_cell_intro_established_t *hs_cell_intro_established_new(void); -/** Release all storage held by the hs_cell_intro_established in +trn_cell_intro_established_t *trn_cell_intro_established_new(void); +/** Release all storage held by the trn_cell_intro_established in * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_intro_established_free(hs_cell_intro_established_t *victim); -/** Try to parse a hs_cell_intro_established from the buffer in +void trn_cell_intro_established_free(trn_cell_intro_established_t *victim); +/** Try to parse a trn_cell_intro_established from the buffer in * 'input', using up to 'len_in' bytes from the input buffer. On * success, return the number of bytes consumed and set *output to the - * newly allocated hs_cell_intro_established_t. On failure, return -2 + * newly allocated trn_cell_intro_established_t. On failure, return -2 * if the input appears truncated, and -1 if the input is otherwise * invalid. */ -ssize_t hs_cell_intro_established_parse(hs_cell_intro_established_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_intro_established in 'obj'. On failure, return a negative + * trn_cell_intro_established in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_intro_established_encoded_len(const hs_cell_intro_established_t *obj); -/** Try to encode the hs_cell_intro_established from 'input' into the +ssize_t trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj); +/** Try to encode the trn_cell_intro_established from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_intro_established_encode(uint8_t *output, size_t avail, const hs_cell_intro_established_t *input); -/** Check whether the internal state of the hs_cell_intro_established +ssize_t trn_cell_intro_established_encode(uint8_t *output, size_t avail, const trn_cell_intro_established_t *input); +/** Check whether the internal state of the trn_cell_intro_established * in 'obj' is consistent. Return NULL if it is, and a short message * if it is not. */ -const char *hs_cell_intro_established_check(const hs_cell_intro_established_t *obj); +const char *trn_cell_intro_established_check(const trn_cell_intro_established_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_intro_established_clear_errors(hs_cell_intro_established_t *obj); +int trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj); /** Return the value of the extensions field of the - * hs_cell_intro_established_t in 'inp' + * trn_cell_intro_established_t in 'inp' */ -struct cell_extension_st * hs_cell_intro_established_get_extensions(hs_cell_intro_established_t *inp); -/** As hs_cell_intro_established_get_extensions, but take and return a - * const pointer +struct trn_cell_extension_st * trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp); +/** As trn_cell_intro_established_get_extensions, but take and return + * a const pointer */ -const struct cell_extension_st * hs_cell_intro_established_getconst_extensions(const hs_cell_intro_established_t *inp); +const struct trn_cell_extension_st * trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp); /** Set the value of the extensions field of the - * hs_cell_intro_established_t in 'inp' to 'val'. Free the old value + * trn_cell_intro_established_t in 'inp' to 'val'. Free the old value * if any. Steals the referenceto 'val'.Return 0 on success; return -1 * and set the error code on 'inp' on failure. */ -int hs_cell_intro_established_set_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val); -/** As hs_cell_intro_established_set_extensions, but does not free the - * previous value. +int trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_intro_established_set_extensions, but does not free + * the previous value. */ -int hs_cell_intro_established_set0_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val); +int trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val); #endif diff --git a/src/trunnel/hs/cell_establish_intro.trunnel b/src/trunnel/hs/cell_establish_intro.trunnel index 33a133bf67..011ee62a15 100644 --- a/src/trunnel/hs/cell_establish_intro.trunnel +++ b/src/trunnel/hs/cell_establish_intro.trunnel @@ -4,12 +4,12 @@ * specified in proposal 224 section 3.1. */ -extern struct cell_extension; +extern struct trn_cell_extension; const TRUNNEL_SHA3_256_LEN = 32; /* ESTABLISH_INTRO payload. See details in section 3.1.1 */ -struct hs_cell_establish_intro { +struct trn_cell_establish_intro { /* Indicate the start of the handshake authentication data. */ @ptr start_cell; @@ -19,7 +19,7 @@ struct hs_cell_establish_intro { u8 auth_key[auth_key_len]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; @ptr end_mac_fields; /* Handshake MAC. */ @@ -35,7 +35,7 @@ struct hs_cell_establish_intro { /* INTRO_ESTABLISHED payload which is an acknowledge of the ESTABLISH_INTRO * cell. For legacy node, this payload is empty so the following only applies * to version >= 3. */ -struct hs_cell_intro_established { +struct trn_cell_intro_established { /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; }; diff --git a/src/trunnel/hs/cell_introduce1.c b/src/trunnel/hs/cell_introduce1.c index 5922a086dc..7501f6f196 100644 --- a/src/trunnel/hs/cell_introduce1.c +++ b/src/trunnel/hs/cell_introduce1.c @@ -28,14 +28,14 @@ int cellintroduce_deadcode_dummy__ = 0; } \ } while (0) -typedef struct cell_extension_st cell_extension_t; -cell_extension_t *cell_extension_new(void); -void cell_extension_free(cell_extension_t *victim); -ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in); -ssize_t cell_extension_encoded_len(const cell_extension_t *obj); -ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input); -const char *cell_extension_check(const cell_extension_t *obj); -int cell_extension_clear_errors(cell_extension_t *obj); +typedef struct trn_cell_extension_st trn_cell_extension_t; +trn_cell_extension_t *trn_cell_extension_new(void); +void trn_cell_extension_free(trn_cell_extension_t *victim); +ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); +ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); +const char *trn_cell_extension_check(const trn_cell_extension_t *obj); +int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); typedef struct link_specifier_st link_specifier_t; link_specifier_t *link_specifier_new(void); void link_specifier_free(link_specifier_t *victim); @@ -44,10 +44,10 @@ ssize_t link_specifier_encoded_len(const link_specifier_t *obj); ssize_t link_specifier_encode(uint8_t *output, size_t avail, const link_specifier_t *input); const char *link_specifier_check(const link_specifier_t *obj); int link_specifier_clear_errors(link_specifier_t *obj); -hs_cell_introduce1_t * -hs_cell_introduce1_new(void) +trn_cell_introduce1_t * +trn_cell_introduce1_new(void) { - hs_cell_introduce1_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce1_t)); + trn_cell_introduce1_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce1_t)); if (NULL == val) return NULL; return val; @@ -56,47 +56,47 @@ hs_cell_introduce1_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_introduce1_clear(hs_cell_introduce1_t *obj) +trn_cell_introduce1_clear(trn_cell_introduce1_t *obj) { (void) obj; TRUNNEL_DYNARRAY_WIPE(&obj->auth_key); TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key); - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; TRUNNEL_DYNARRAY_WIPE(&obj->encrypted); TRUNNEL_DYNARRAY_CLEAR(&obj->encrypted); } void -hs_cell_introduce1_free(hs_cell_introduce1_t *obj) +trn_cell_introduce1_free(trn_cell_introduce1_t *obj) { if (obj == NULL) return; - hs_cell_introduce1_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_introduce1_t)); + trn_cell_introduce1_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_introduce1_t)); trunnel_free_(obj); } size_t -hs_cell_introduce1_getlen_legacy_key_id(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp) { (void)inp; return TRUNNEL_SHA1_LEN; } uint8_t -hs_cell_introduce1_get_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx) { trunnel_assert(idx < TRUNNEL_SHA1_LEN); return inp->legacy_key_id[idx]; } uint8_t -hs_cell_introduce1_getconst_legacy_key_id(const hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx) { - return hs_cell_introduce1_get_legacy_key_id((hs_cell_introduce1_t*)inp, idx); + return trn_cell_introduce1_get_legacy_key_id((trn_cell_introduce1_t*)inp, idx); } int -hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) { trunnel_assert(idx < TRUNNEL_SHA1_LEN); inp->legacy_key_id[idx] = elt; @@ -104,22 +104,22 @@ hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint } uint8_t * -hs_cell_introduce1_getarray_legacy_key_id(hs_cell_introduce1_t *inp) +trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp) { return inp->legacy_key_id; } const uint8_t * -hs_cell_introduce1_getconstarray_legacy_key_id(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp) { - return (const uint8_t *)hs_cell_introduce1_getarray_legacy_key_id((hs_cell_introduce1_t*)inp); + return (const uint8_t *)trn_cell_introduce1_getarray_legacy_key_id((trn_cell_introduce1_t*)inp); } uint8_t -hs_cell_introduce1_get_auth_key_type(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp) { return inp->auth_key_type; } int -hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val) +trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val) { if (! ((val == 0 || val == 1 || val == 2))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -129,41 +129,41 @@ hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val) return 0; } uint16_t -hs_cell_introduce1_get_auth_key_len(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp) { return inp->auth_key_len; } int -hs_cell_introduce1_set_auth_key_len(hs_cell_introduce1_t *inp, uint16_t val) +trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val) { inp->auth_key_len = val; return 0; } size_t -hs_cell_introduce1_getlen_auth_key(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->auth_key); } uint8_t -hs_cell_introduce1_get_auth_key(hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx); } uint8_t -hs_cell_introduce1_getconst_auth_key(const hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx) { - return hs_cell_introduce1_get_auth_key((hs_cell_introduce1_t*)inp, idx); + return trn_cell_introduce1_get_auth_key((trn_cell_introduce1_t*)inp, idx); } int -hs_cell_introduce1_set_auth_key(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt); return 0; } int -hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt) +trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->auth_key.n_ == UINT16_MAX) @@ -177,17 +177,17 @@ hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt) } uint8_t * -hs_cell_introduce1_getarray_auth_key(hs_cell_introduce1_t *inp) +trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp) { return inp->auth_key.elts_; } const uint8_t * -hs_cell_introduce1_getconstarray_auth_key(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp) { - return (const uint8_t *)hs_cell_introduce1_getarray_auth_key((hs_cell_introduce1_t*)inp); + return (const uint8_t *)trn_cell_introduce1_getarray_auth_key((trn_cell_introduce1_t*)inp); } int -hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen) +trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -206,54 +206,54 @@ hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen) TRUNNEL_SET_ERROR_CODE(inp); return -1; } -struct cell_extension_st * -hs_cell_introduce1_get_extensions(hs_cell_introduce1_t *inp) +struct trn_cell_extension_st * +trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_introduce1_getconst_extensions(const hs_cell_introduce1_t *inp) +const struct trn_cell_extension_st * +trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp) { - return hs_cell_introduce1_get_extensions((hs_cell_introduce1_t*) inp); + return trn_cell_introduce1_get_extensions((trn_cell_introduce1_t*) inp); } int -hs_cell_introduce1_set_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val) +trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_introduce1_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_introduce1_set0_extensions(inp, val); } int -hs_cell_introduce1_set0_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val) +trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } size_t -hs_cell_introduce1_getlen_encrypted(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->encrypted); } uint8_t -hs_cell_introduce1_get_encrypted(hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->encrypted, idx); } uint8_t -hs_cell_introduce1_getconst_encrypted(const hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx) { - return hs_cell_introduce1_get_encrypted((hs_cell_introduce1_t*)inp, idx); + return trn_cell_introduce1_get_encrypted((trn_cell_introduce1_t*)inp, idx); } int -hs_cell_introduce1_set_encrypted(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->encrypted, idx, elt); return 0; } int -hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt) +trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt) { TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->encrypted, elt, {}); return 0; @@ -263,17 +263,17 @@ hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt) } uint8_t * -hs_cell_introduce1_getarray_encrypted(hs_cell_introduce1_t *inp) +trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp) { return inp->encrypted.elts_; } const uint8_t * -hs_cell_introduce1_getconstarray_encrypted(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp) { - return (const uint8_t *)hs_cell_introduce1_getarray_encrypted((hs_cell_introduce1_t*)inp); + return (const uint8_t *)trn_cell_introduce1_getarray_encrypted((trn_cell_introduce1_t*)inp); } int -hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen) +trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen) { uint8_t *newptr; newptr = trunnel_dynarray_setlen(&inp->encrypted.allocated_, @@ -289,7 +289,7 @@ hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen) return -1; } const char * -hs_cell_introduce1_check(const hs_cell_introduce1_t *obj) +trn_cell_introduce1_check(const trn_cell_introduce1_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -301,18 +301,18 @@ hs_cell_introduce1_check(const hs_cell_introduce1_t *obj) return "Length mismatch for auth_key"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } return NULL; } ssize_t -hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj) +trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_introduce1_check(obj)) + if (NULL != trn_cell_introduce1_check(obj)) return -1; @@ -328,32 +328,32 @@ hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj) /* Length of u8 auth_key[auth_key_len] */ result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); /* Length of u8 encrypted[] */ result += TRUNNEL_DYNARRAY_LEN(&obj->encrypted); return result; } int -hs_cell_introduce1_clear_errors(hs_cell_introduce1_t *obj) +trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_introduce1_t *obj) +trn_cell_introduce1_encode(uint8_t *output, const size_t avail, const trn_cell_introduce1_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_introduce1_encoded_len(obj); + const ssize_t encoded_len = trn_cell_introduce1_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_introduce1_check(obj))) + if (NULL != (msg = trn_cell_introduce1_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -393,9 +393,9 @@ hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_int written += elt_len; ptr += elt_len; } - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -435,11 +435,11 @@ hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_int return result; } -/** As hs_cell_introduce1_parse(), but do not allocate the output +/** As trn_cell_introduce1_parse(), but do not allocate the output * object. */ static ssize_t -hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_introduce1_parse_into(trn_cell_introduce1_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -471,8 +471,8 @@ hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, c memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len); ptr += obj->auth_key_len; remaining -= obj->auth_key_len; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -500,23 +500,23 @@ hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, c } ssize_t -hs_cell_introduce1_parse(hs_cell_introduce1_t **output, const uint8_t *input, const size_t len_in) +trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_introduce1_new(); + *output = trn_cell_introduce1_new(); if (NULL == *output) return -1; - result = hs_cell_introduce1_parse_into(*output, input, len_in); + result = trn_cell_introduce1_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_introduce1_free(*output); + trn_cell_introduce1_free(*output); *output = NULL; } return result; } -hs_cell_introduce_ack_t * -hs_cell_introduce_ack_new(void) +trn_cell_introduce_ack_t * +trn_cell_introduce_ack_new(void) { - hs_cell_introduce_ack_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce_ack_t)); + trn_cell_introduce_ack_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_ack_t)); if (NULL == val) return NULL; return val; @@ -525,30 +525,30 @@ hs_cell_introduce_ack_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_introduce_ack_clear(hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_clear(trn_cell_introduce_ack_t *obj) { (void) obj; - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; } void -hs_cell_introduce_ack_free(hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *obj) { if (obj == NULL) return; - hs_cell_introduce_ack_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_introduce_ack_t)); + trn_cell_introduce_ack_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_introduce_ack_t)); trunnel_free_(obj); } uint16_t -hs_cell_introduce_ack_get_status(const hs_cell_introduce_ack_t *inp) +trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp) { return inp->status; } int -hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val) +trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val) { if (! ((val == 0 || val == 1 || val == 2))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -557,31 +557,31 @@ hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val) inp->status = val; return 0; } -struct cell_extension_st * -hs_cell_introduce_ack_get_extensions(hs_cell_introduce_ack_t *inp) +struct trn_cell_extension_st * +trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_introduce_ack_getconst_extensions(const hs_cell_introduce_ack_t *inp) +const struct trn_cell_extension_st * +trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp) { - return hs_cell_introduce_ack_get_extensions((hs_cell_introduce_ack_t*) inp); + return trn_cell_introduce_ack_get_extensions((trn_cell_introduce_ack_t*) inp); } int -hs_cell_introduce_ack_set_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val) +trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_introduce_ack_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_introduce_ack_set0_extensions(inp, val); } int -hs_cell_introduce_ack_set0_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val) +trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } const char * -hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -591,47 +591,47 @@ hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj) return "Integer out of bounds"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } return NULL; } ssize_t -hs_cell_introduce_ack_encoded_len(const hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_introduce_ack_check(obj)) + if (NULL != trn_cell_introduce_ack_check(obj)) return -1; /* Length of u16 status IN [0, 1, 2] */ result += 2; - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); return result; } int -hs_cell_introduce_ack_clear_errors(hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_ack_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_introduce_ack_encoded_len(obj); + const ssize_t encoded_len = trn_cell_introduce_ack_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_introduce_ack_check(obj))) + if (NULL != (msg = trn_cell_introduce_ack_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -645,9 +645,9 @@ hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_ trunnel_set_uint16(ptr, trunnel_htons(obj->status)); written += 2; ptr += 2; - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -676,11 +676,11 @@ hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_ return result; } -/** As hs_cell_introduce_ack_parse(), but do not allocate the output +/** As trn_cell_introduce_ack_parse(), but do not allocate the output * object. */ static ssize_t -hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_introduce_ack_parse_into(trn_cell_introduce_ack_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -694,8 +694,8 @@ hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *in if (! (obj->status == 0 || obj->status == 1 || obj->status == 2)) goto fail; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -714,23 +714,23 @@ hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *in } ssize_t -hs_cell_introduce_ack_parse(hs_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in) +trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_introduce_ack_new(); + *output = trn_cell_introduce_ack_new(); if (NULL == *output) return -1; - result = hs_cell_introduce_ack_parse_into(*output, input, len_in); + result = trn_cell_introduce_ack_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_introduce_ack_free(*output); + trn_cell_introduce_ack_free(*output); *output = NULL; } return result; } -hs_cell_introduce_encrypted_t * -hs_cell_introduce_encrypted_new(void) +trn_cell_introduce_encrypted_t * +trn_cell_introduce_encrypted_new(void) { - hs_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce_encrypted_t)); + trn_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_encrypted_t)); if (NULL == val) return NULL; val->onion_key_type = 1; @@ -740,10 +740,10 @@ hs_cell_introduce_encrypted_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_introduce_encrypted_clear(hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_clear(trn_cell_introduce_encrypted_t *obj) { (void) obj; - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; TRUNNEL_DYNARRAY_WIPE(&obj->onion_key); TRUNNEL_DYNARRAY_CLEAR(&obj->onion_key); @@ -761,35 +761,35 @@ hs_cell_introduce_encrypted_clear(hs_cell_introduce_encrypted_t *obj) } void -hs_cell_introduce_encrypted_free(hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *obj) { if (obj == NULL) return; - hs_cell_introduce_encrypted_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_introduce_encrypted_t)); + trn_cell_introduce_encrypted_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_introduce_encrypted_t)); trunnel_free_(obj); } size_t -hs_cell_introduce_encrypted_getlen_rend_cookie(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp) { (void)inp; return TRUNNEL_REND_COOKIE_LEN; } uint8_t -hs_cell_introduce_encrypted_get_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx) { trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); return inp->rend_cookie[idx]; } uint8_t -hs_cell_introduce_encrypted_getconst_rend_cookie(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_rend_cookie((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_rend_cookie((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) { trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); inp->rend_cookie[idx] = elt; @@ -797,45 +797,45 @@ hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, } uint8_t * -hs_cell_introduce_encrypted_getarray_rend_cookie(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp) { return inp->rend_cookie; } const uint8_t * -hs_cell_introduce_encrypted_getconstarray_rend_cookie(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp) { - return (const uint8_t *)hs_cell_introduce_encrypted_getarray_rend_cookie((hs_cell_introduce_encrypted_t*)inp); + return (const uint8_t *)trn_cell_introduce_encrypted_getarray_rend_cookie((trn_cell_introduce_encrypted_t*)inp); } -struct cell_extension_st * -hs_cell_introduce_encrypted_get_extensions(hs_cell_introduce_encrypted_t *inp) +struct trn_cell_extension_st * +trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_introduce_encrypted_getconst_extensions(const hs_cell_introduce_encrypted_t *inp) +const struct trn_cell_extension_st * +trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp) { - return hs_cell_introduce_encrypted_get_extensions((hs_cell_introduce_encrypted_t*) inp); + return trn_cell_introduce_encrypted_get_extensions((trn_cell_introduce_encrypted_t*) inp); } int -hs_cell_introduce_encrypted_set_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val) +trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_introduce_encrypted_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_introduce_encrypted_set0_extensions(inp, val); } int -hs_cell_introduce_encrypted_set0_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val) +trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } uint8_t -hs_cell_introduce_encrypted_get_onion_key_type(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp) { return inp->onion_key_type; } int -hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *inp, uint8_t val) +trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val) { if (! ((val == 1))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -845,41 +845,41 @@ hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *in return 0; } uint16_t -hs_cell_introduce_encrypted_get_onion_key_len(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp) { return inp->onion_key_len; } int -hs_cell_introduce_encrypted_set_onion_key_len(hs_cell_introduce_encrypted_t *inp, uint16_t val) +trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val) { inp->onion_key_len = val; return 0; } size_t -hs_cell_introduce_encrypted_getlen_onion_key(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->onion_key); } uint8_t -hs_cell_introduce_encrypted_get_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->onion_key, idx); } uint8_t -hs_cell_introduce_encrypted_getconst_onion_key(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_onion_key((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_onion_key((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->onion_key, idx, elt); return 0; } int -hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, uint8_t elt) +trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->onion_key.n_ == UINT16_MAX) @@ -893,17 +893,17 @@ hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, ui } uint8_t * -hs_cell_introduce_encrypted_getarray_onion_key(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp) { return inp->onion_key.elts_; } const uint8_t * -hs_cell_introduce_encrypted_getconstarray_onion_key(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp) { - return (const uint8_t *)hs_cell_introduce_encrypted_getarray_onion_key((hs_cell_introduce_encrypted_t*)inp); + return (const uint8_t *)trn_cell_introduce_encrypted_getarray_onion_key((trn_cell_introduce_encrypted_t*)inp); } int -hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, size_t newlen) +trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -923,49 +923,49 @@ hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, return -1; } uint8_t -hs_cell_introduce_encrypted_get_nspec(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp) { return inp->nspec; } int -hs_cell_introduce_encrypted_set_nspec(hs_cell_introduce_encrypted_t *inp, uint8_t val) +trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val) { inp->nspec = val; return 0; } size_t -hs_cell_introduce_encrypted_getlen_nspecs(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->nspecs); } struct link_specifier_st * -hs_cell_introduce_encrypted_get_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx); } const struct link_specifier_st * -hs_cell_introduce_encrypted_getconst_nspecs(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_nspecs((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_nspecs((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) +trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) { link_specifier_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx); if (oldval && oldval != elt) link_specifier_free(oldval); - return hs_cell_introduce_encrypted_set0_nspecs(inp, idx, elt); + return trn_cell_introduce_encrypted_set0_nspecs(inp, idx, elt); } int -hs_cell_introduce_encrypted_set0_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) +trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) { TRUNNEL_DYNARRAY_SET(&inp->nspecs, idx, elt); return 0; } int -hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt) +trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt) { #if SIZE_MAX >= UINT8_MAX if (inp->nspecs.n_ == UINT8_MAX) @@ -979,17 +979,17 @@ hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struc } struct link_specifier_st * * -hs_cell_introduce_encrypted_getarray_nspecs(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp) { return inp->nspecs.elts_; } const struct link_specifier_st * const * -hs_cell_introduce_encrypted_getconstarray_nspecs(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp) { - return (const struct link_specifier_st * const *)hs_cell_introduce_encrypted_getarray_nspecs((hs_cell_introduce_encrypted_t*)inp); + return (const struct link_specifier_st * const *)trn_cell_introduce_encrypted_getarray_nspecs((trn_cell_introduce_encrypted_t*)inp); } int -hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, size_t newlen) +trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen) { struct link_specifier_st * *newptr; #if UINT8_MAX < SIZE_MAX @@ -1009,30 +1009,30 @@ hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, si return -1; } size_t -hs_cell_introduce_encrypted_getlen_pad(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->pad); } uint8_t -hs_cell_introduce_encrypted_get_pad(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->pad, idx); } uint8_t -hs_cell_introduce_encrypted_getconst_pad(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_pad((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_pad((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_pad(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->pad, idx, elt); return 0; } int -hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t elt) +trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt) { TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->pad, elt, {}); return 0; @@ -1042,17 +1042,17 @@ hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t } uint8_t * -hs_cell_introduce_encrypted_getarray_pad(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp) { return inp->pad.elts_; } const uint8_t * -hs_cell_introduce_encrypted_getconstarray_pad(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp) { - return (const uint8_t *)hs_cell_introduce_encrypted_getarray_pad((hs_cell_introduce_encrypted_t*)inp); + return (const uint8_t *)trn_cell_introduce_encrypted_getarray_pad((trn_cell_introduce_encrypted_t*)inp); } int -hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_t newlen) +trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen) { uint8_t *newptr; newptr = trunnel_dynarray_setlen(&inp->pad.allocated_, @@ -1068,7 +1068,7 @@ hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_ return -1; } const char * -hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -1076,7 +1076,7 @@ hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj) return "A set function failed on this object"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } if (! (obj->onion_key_type == 1)) @@ -1098,19 +1098,19 @@ hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj) } ssize_t -hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_introduce_encrypted_check(obj)) + if (NULL != trn_cell_introduce_encrypted_check(obj)) return -1; /* Length of u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN] */ result += TRUNNEL_REND_COOKIE_LEN; - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); /* Length of u8 onion_key_type IN [1] */ result += 1; @@ -1138,24 +1138,24 @@ hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj return result; } int -hs_cell_introduce_encrypted_clear_errors(hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_encrypted_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_introduce_encrypted_encoded_len(obj); + const ssize_t encoded_len = trn_cell_introduce_encrypted_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_introduce_encrypted_check(obj))) + if (NULL != (msg = trn_cell_introduce_encrypted_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -1169,9 +1169,9 @@ hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs memcpy(ptr, obj->rend_cookie, TRUNNEL_REND_COOKIE_LEN); written += TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -1257,11 +1257,11 @@ hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs return result; } -/** As hs_cell_introduce_encrypted_parse(), but do not allocate the +/** As trn_cell_introduce_encrypted_parse(), but do not allocate the * output object. */ static ssize_t -hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_introduce_encrypted_parse_into(trn_cell_introduce_encrypted_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -1273,8 +1273,8 @@ hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const memcpy(obj->rend_cookie, ptr, TRUNNEL_REND_COOKIE_LEN); remaining -= TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -1342,15 +1342,15 @@ hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const } ssize_t -hs_cell_introduce_encrypted_parse(hs_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in) +trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_introduce_encrypted_new(); + *output = trn_cell_introduce_encrypted_new(); if (NULL == *output) return -1; - result = hs_cell_introduce_encrypted_parse_into(*output, input, len_in); + result = trn_cell_introduce_encrypted_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_introduce_encrypted_free(*output); + trn_cell_introduce_encrypted_free(*output); *output = NULL; } return result; diff --git a/src/trunnel/hs/cell_introduce1.h b/src/trunnel/hs/cell_introduce1.h index ccd2cda904..cca825a431 100644 --- a/src/trunnel/hs/cell_introduce1.h +++ b/src/trunnel/hs/cell_introduce1.h @@ -8,34 +8,34 @@ #include <stdint.h> #include "trunnel.h" -struct cell_extension_st; +struct trn_cell_extension_st; struct link_specifier_st; #define TRUNNEL_SHA1_LEN 20 #define TRUNNEL_REND_COOKIE_LEN 20 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE1) -struct hs_cell_introduce1_st { +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE1) +struct trn_cell_introduce1_st { uint8_t legacy_key_id[TRUNNEL_SHA1_LEN]; uint8_t auth_key_type; uint16_t auth_key_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; TRUNNEL_DYNARRAY_HEAD(, uint8_t) encrypted; uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_introduce1_st hs_cell_introduce1_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE_ACK) -struct hs_cell_introduce_ack_st { +typedef struct trn_cell_introduce1_st trn_cell_introduce1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ACK) +struct trn_cell_introduce_ack_st { uint16_t status; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_introduce_ack_st hs_cell_introduce_ack_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE_ENCRYPTED) -struct hs_cell_introduce_encrypted_st { +typedef struct trn_cell_introduce_ack_st trn_cell_introduce_ack_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ENCRYPTED) +struct trn_cell_introduce_encrypted_st { uint8_t rend_cookie[TRUNNEL_REND_COOKIE_LEN]; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; uint8_t onion_key_type; uint16_t onion_key_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) onion_key; @@ -45,449 +45,449 @@ struct hs_cell_introduce_encrypted_st { uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_introduce_encrypted_st hs_cell_introduce_encrypted_t; -/** Return a newly allocated hs_cell_introduce1 with all elements set +typedef struct trn_cell_introduce_encrypted_st trn_cell_introduce_encrypted_t; +/** Return a newly allocated trn_cell_introduce1 with all elements set * to zero. */ -hs_cell_introduce1_t *hs_cell_introduce1_new(void); -/** Release all storage held by the hs_cell_introduce1 in 'victim'. +trn_cell_introduce1_t *trn_cell_introduce1_new(void); +/** Release all storage held by the trn_cell_introduce1 in 'victim'. * (Do nothing if 'victim' is NULL.) */ -void hs_cell_introduce1_free(hs_cell_introduce1_t *victim); -/** Try to parse a hs_cell_introduce1 from the buffer in 'input', +void trn_cell_introduce1_free(trn_cell_introduce1_t *victim); +/** Try to parse a trn_cell_introduce1 from the buffer in 'input', * using up to 'len_in' bytes from the input buffer. On success, * return the number of bytes consumed and set *output to the newly - * allocated hs_cell_introduce1_t. On failure, return -2 if the input + * allocated trn_cell_introduce1_t. On failure, return -2 if the input * appears truncated, and -1 if the input is otherwise invalid. */ -ssize_t hs_cell_introduce1_parse(hs_cell_introduce1_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_introduce1 in 'obj'. On failure, return a negative value. + * trn_cell_introduce1 in 'obj'. On failure, return a negative value. * Note that this value may be an overestimate, and can even be an * underestimate for certain unencodeable objects. */ -ssize_t hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj); -/** Try to encode the hs_cell_introduce1 from 'input' into the buffer +ssize_t trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj); +/** Try to encode the trn_cell_introduce1 from 'input' into the buffer * at 'output', using up to 'avail' bytes of the output buffer. On * success, return the number of bytes used. On failure, return -2 if * the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_introduce1_encode(uint8_t *output, size_t avail, const hs_cell_introduce1_t *input); -/** Check whether the internal state of the hs_cell_introduce1 in +ssize_t trn_cell_introduce1_encode(uint8_t *output, size_t avail, const trn_cell_introduce1_t *input); +/** Check whether the internal state of the trn_cell_introduce1 in * 'obj' is consistent. Return NULL if it is, and a short message if * it is not. */ -const char *hs_cell_introduce1_check(const hs_cell_introduce1_t *obj); +const char *trn_cell_introduce1_check(const trn_cell_introduce1_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_introduce1_clear_errors(hs_cell_introduce1_t *obj); +int trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj); /** Return the (constant) length of the array holding the - * legacy_key_id field of the hs_cell_introduce1_t in 'inp'. + * legacy_key_id field of the trn_cell_introduce1_t in 'inp'. */ -size_t hs_cell_introduce1_getlen_legacy_key_id(const hs_cell_introduce1_t *inp); +size_t trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp); /** Return the element at position 'idx' of the fixed array field - * legacy_key_id of the hs_cell_introduce1_t in 'inp'. + * legacy_key_id of the trn_cell_introduce1_t in 'inp'. */ -uint8_t hs_cell_introduce1_get_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx); -/** As hs_cell_introduce1_get_legacy_key_id, but take and return a +uint8_t trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx); +/** As trn_cell_introduce1_get_legacy_key_id, but take and return a * const pointer */ -uint8_t hs_cell_introduce1_getconst_legacy_key_id(const hs_cell_introduce1_t *inp, size_t idx); +uint8_t trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx); /** Change the element at position 'idx' of the fixed array field - * legacy_key_id of the hs_cell_introduce1_t in 'inp', so that it will - * hold the value 'elt'. + * legacy_key_id of the trn_cell_introduce1_t in 'inp', so that it + * will hold the value 'elt'. */ -int hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); /** Return a pointer to the TRUNNEL_SHA1_LEN-element array field * legacy_key_id of 'inp'. */ -uint8_t * hs_cell_introduce1_getarray_legacy_key_id(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_legacy_key_id, but take and return a +uint8_t * trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_legacy_key_id, but take and return a * const pointer */ -const uint8_t * hs_cell_introduce1_getconstarray_legacy_key_id(const hs_cell_introduce1_t *inp); +const uint8_t * trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp); /** Return the value of the auth_key_type field of the - * hs_cell_introduce1_t in 'inp' + * trn_cell_introduce1_t in 'inp' */ -uint8_t hs_cell_introduce1_get_auth_key_type(const hs_cell_introduce1_t *inp); +uint8_t trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp); /** Set the value of the auth_key_type field of the - * hs_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. + * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val); +int trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val); /** Return the value of the auth_key_len field of the - * hs_cell_introduce1_t in 'inp' + * trn_cell_introduce1_t in 'inp' */ -uint16_t hs_cell_introduce1_get_auth_key_len(const hs_cell_introduce1_t *inp); +uint16_t trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp); /** Set the value of the auth_key_len field of the - * hs_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. + * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_set_auth_key_len(hs_cell_introduce1_t *inp, uint16_t val); +int trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val); /** Return the length of the dynamic array holding the auth_key field - * of the hs_cell_introduce1_t in 'inp'. + * of the trn_cell_introduce1_t in 'inp'. */ -size_t hs_cell_introduce1_getlen_auth_key(const hs_cell_introduce1_t *inp); +size_t trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp); /** Return the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_introduce1_t in 'inp'. + * auth_key of the trn_cell_introduce1_t in 'inp'. */ -uint8_t hs_cell_introduce1_get_auth_key(hs_cell_introduce1_t *inp, size_t idx); -/** As hs_cell_introduce1_get_auth_key, but take and return a const +uint8_t trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx); +/** As trn_cell_introduce1_get_auth_key, but take and return a const * pointer */ -uint8_t hs_cell_introduce1_getconst_auth_key(const hs_cell_introduce1_t *inp, size_t idx); +uint8_t trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_introduce1_t in 'inp', so that it will hold - * the value 'elt'. + * auth_key of the trn_cell_introduce1_t in 'inp', so that it will + * hold the value 'elt'. */ -int hs_cell_introduce1_set_auth_key(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field auth_key of - * the hs_cell_introduce1_t in 'inp'. + * the trn_cell_introduce1_t in 'inp'. */ -int hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt); +int trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field auth_key of * 'inp'. */ -uint8_t * hs_cell_introduce1_getarray_auth_key(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_auth_key, but take and return a const +uint8_t * trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_auth_key, but take and return a const * pointer */ -const uint8_t * hs_cell_introduce1_getconstarray_auth_key(const hs_cell_introduce1_t *inp); +const uint8_t * trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp); /** Change the length of the variable-length array field auth_key of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen); +int trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen); /** Return the value of the extensions field of the - * hs_cell_introduce1_t in 'inp' + * trn_cell_introduce1_t in 'inp' */ -struct cell_extension_st * hs_cell_introduce1_get_extensions(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_extensions, but take and return a const +struct trn_cell_extension_st * trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_extensions, but take and return a const * pointer */ -const struct cell_extension_st * hs_cell_introduce1_getconst_extensions(const hs_cell_introduce1_t *inp); -/** Set the value of the extensions field of the hs_cell_introduce1_t +const struct trn_cell_extension_st * trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp); +/** Set the value of the extensions field of the trn_cell_introduce1_t * in 'inp' to 'val'. Free the old value if any. Steals the * referenceto 'val'.Return 0 on success; return -1 and set the error * code on 'inp' on failure. */ -int hs_cell_introduce1_set_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val); -/** As hs_cell_introduce1_set_extensions, but does not free the +int trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_introduce1_set_extensions, but does not free the * previous value. */ -int hs_cell_introduce1_set0_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val); +int trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val); /** Return the length of the dynamic array holding the encrypted field - * of the hs_cell_introduce1_t in 'inp'. + * of the trn_cell_introduce1_t in 'inp'. */ -size_t hs_cell_introduce1_getlen_encrypted(const hs_cell_introduce1_t *inp); +size_t trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp); /** Return the element at position 'idx' of the dynamic array field - * encrypted of the hs_cell_introduce1_t in 'inp'. + * encrypted of the trn_cell_introduce1_t in 'inp'. */ -uint8_t hs_cell_introduce1_get_encrypted(hs_cell_introduce1_t *inp, size_t idx); -/** As hs_cell_introduce1_get_encrypted, but take and return a const +uint8_t trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx); +/** As trn_cell_introduce1_get_encrypted, but take and return a const * pointer */ -uint8_t hs_cell_introduce1_getconst_encrypted(const hs_cell_introduce1_t *inp, size_t idx); +uint8_t trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * encrypted of the hs_cell_introduce1_t in 'inp', so that it will + * encrypted of the trn_cell_introduce1_t in 'inp', so that it will * hold the value 'elt'. */ -int hs_cell_introduce1_set_encrypted(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field encrypted of - * the hs_cell_introduce1_t in 'inp'. + * the trn_cell_introduce1_t in 'inp'. */ -int hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt); +int trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field encrypted of * 'inp'. */ -uint8_t * hs_cell_introduce1_getarray_encrypted(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_encrypted, but take and return a const +uint8_t * trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_encrypted, but take and return a const * pointer */ -const uint8_t * hs_cell_introduce1_getconstarray_encrypted(const hs_cell_introduce1_t *inp); +const uint8_t * trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp); /** Change the length of the variable-length array field encrypted of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen); -/** Return a newly allocated hs_cell_introduce_ack with all elements +int trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen); +/** Return a newly allocated trn_cell_introduce_ack with all elements * set to zero. */ -hs_cell_introduce_ack_t *hs_cell_introduce_ack_new(void); -/** Release all storage held by the hs_cell_introduce_ack in 'victim'. - * (Do nothing if 'victim' is NULL.) +trn_cell_introduce_ack_t *trn_cell_introduce_ack_new(void); +/** Release all storage held by the trn_cell_introduce_ack in + * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_introduce_ack_free(hs_cell_introduce_ack_t *victim); -/** Try to parse a hs_cell_introduce_ack from the buffer in 'input', +void trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *victim); +/** Try to parse a trn_cell_introduce_ack from the buffer in 'input', * using up to 'len_in' bytes from the input buffer. On success, * return the number of bytes consumed and set *output to the newly - * allocated hs_cell_introduce_ack_t. On failure, return -2 if the + * allocated trn_cell_introduce_ack_t. On failure, return -2 if the * input appears truncated, and -1 if the input is otherwise invalid. */ -ssize_t hs_cell_introduce_ack_parse(hs_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_introduce_ack in 'obj'. On failure, return a negative + * trn_cell_introduce_ack in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_introduce_ack_encoded_len(const hs_cell_introduce_ack_t *obj); -/** Try to encode the hs_cell_introduce_ack from 'input' into the +ssize_t trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj); +/** Try to encode the trn_cell_introduce_ack from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_introduce_ack_encode(uint8_t *output, size_t avail, const hs_cell_introduce_ack_t *input); -/** Check whether the internal state of the hs_cell_introduce_ack in +ssize_t trn_cell_introduce_ack_encode(uint8_t *output, size_t avail, const trn_cell_introduce_ack_t *input); +/** Check whether the internal state of the trn_cell_introduce_ack in * 'obj' is consistent. Return NULL if it is, and a short message if * it is not. */ -const char *hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj); +const char *trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_introduce_ack_clear_errors(hs_cell_introduce_ack_t *obj); +int trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj); /** Return the value of the status field of the - * hs_cell_introduce_ack_t in 'inp' + * trn_cell_introduce_ack_t in 'inp' */ -uint16_t hs_cell_introduce_ack_get_status(const hs_cell_introduce_ack_t *inp); -/** Set the value of the status field of the hs_cell_introduce_ack_t +uint16_t trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp); +/** Set the value of the status field of the trn_cell_introduce_ack_t * in 'inp' to 'val'. Return 0 on success; return -1 and set the error * code on 'inp' on failure. */ -int hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val); +int trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val); /** Return the value of the extensions field of the - * hs_cell_introduce_ack_t in 'inp' + * trn_cell_introduce_ack_t in 'inp' */ -struct cell_extension_st * hs_cell_introduce_ack_get_extensions(hs_cell_introduce_ack_t *inp); -/** As hs_cell_introduce_ack_get_extensions, but take and return a +struct trn_cell_extension_st * trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp); +/** As trn_cell_introduce_ack_get_extensions, but take and return a * const pointer */ -const struct cell_extension_st * hs_cell_introduce_ack_getconst_extensions(const hs_cell_introduce_ack_t *inp); +const struct trn_cell_extension_st * trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp); /** Set the value of the extensions field of the - * hs_cell_introduce_ack_t in 'inp' to 'val'. Free the old value if + * trn_cell_introduce_ack_t in 'inp' to 'val'. Free the old value if * any. Steals the referenceto 'val'.Return 0 on success; return -1 * and set the error code on 'inp' on failure. */ -int hs_cell_introduce_ack_set_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val); -/** As hs_cell_introduce_ack_set_extensions, but does not free the +int trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_introduce_ack_set_extensions, but does not free the * previous value. */ -int hs_cell_introduce_ack_set0_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val); -/** Return a newly allocated hs_cell_introduce_encrypted with all +int trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val); +/** Return a newly allocated trn_cell_introduce_encrypted with all * elements set to zero. */ -hs_cell_introduce_encrypted_t *hs_cell_introduce_encrypted_new(void); -/** Release all storage held by the hs_cell_introduce_encrypted in +trn_cell_introduce_encrypted_t *trn_cell_introduce_encrypted_new(void); +/** Release all storage held by the trn_cell_introduce_encrypted in * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_introduce_encrypted_free(hs_cell_introduce_encrypted_t *victim); -/** Try to parse a hs_cell_introduce_encrypted from the buffer in +void trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *victim); +/** Try to parse a trn_cell_introduce_encrypted from the buffer in * 'input', using up to 'len_in' bytes from the input buffer. On * success, return the number of bytes consumed and set *output to the - * newly allocated hs_cell_introduce_encrypted_t. On failure, return + * newly allocated trn_cell_introduce_encrypted_t. On failure, return * -2 if the input appears truncated, and -1 if the input is otherwise * invalid. */ -ssize_t hs_cell_introduce_encrypted_parse(hs_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_introduce_encrypted in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. + * trn_cell_introduce_encrypted in 'obj'. On failure, return a + * negative value. Note that this value may be an overestimate, and + * can even be an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj); -/** Try to encode the hs_cell_introduce_encrypted from 'input' into +ssize_t trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj); +/** Try to encode the trn_cell_introduce_encrypted from 'input' into * the buffer at 'output', using up to 'avail' bytes of the output * buffer. On success, return the number of bytes used. On failure, * return -2 if the buffer was not long enough, and -1 if the input * was invalid. */ -ssize_t hs_cell_introduce_encrypted_encode(uint8_t *output, size_t avail, const hs_cell_introduce_encrypted_t *input); +ssize_t trn_cell_introduce_encrypted_encode(uint8_t *output, size_t avail, const trn_cell_introduce_encrypted_t *input); /** Check whether the internal state of the - * hs_cell_introduce_encrypted in 'obj' is consistent. Return NULL if + * trn_cell_introduce_encrypted in 'obj' is consistent. Return NULL if * it is, and a short message if it is not. */ -const char *hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj); +const char *trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_introduce_encrypted_clear_errors(hs_cell_introduce_encrypted_t *obj); +int trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj); /** Return the (constant) length of the array holding the rend_cookie - * field of the hs_cell_introduce_encrypted_t in 'inp'. + * field of the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_rend_cookie(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the fixed array field - * rend_cookie of the hs_cell_introduce_encrypted_t in 'inp'. + * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp'. */ -uint8_t hs_cell_introduce_encrypted_get_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_rend_cookie, but take and +uint8_t trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and * return a const pointer */ -uint8_t hs_cell_introduce_encrypted_getconst_rend_cookie(const hs_cell_introduce_encrypted_t *inp, size_t idx); +uint8_t trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the fixed array field - * rend_cookie of the hs_cell_introduce_encrypted_t in 'inp', so that + * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp', so that * it will hold the value 'elt'. */ -int hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); /** Return a pointer to the TRUNNEL_REND_COOKIE_LEN-element array * field rend_cookie of 'inp'. */ -uint8_t * hs_cell_introduce_encrypted_getarray_rend_cookie(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_rend_cookie, but take and +uint8_t * trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and * return a const pointer */ -const uint8_t * hs_cell_introduce_encrypted_getconstarray_rend_cookie(const hs_cell_introduce_encrypted_t *inp); +const uint8_t * trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp); /** Return the value of the extensions field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -struct cell_extension_st * hs_cell_introduce_encrypted_get_extensions(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_extensions, but take and return - * a const pointer +struct trn_cell_extension_st * trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_extensions, but take and + * return a const pointer */ -const struct cell_extension_st * hs_cell_introduce_encrypted_getconst_extensions(const hs_cell_introduce_encrypted_t *inp); +const struct trn_cell_extension_st * trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the extensions field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Free the old value - * if any. Steals the referenceto 'val'.Return 0 on success; return -1 - * and set the error code on 'inp' on failure. + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Free the old + * value if any. Steals the referenceto 'val'.Return 0 on success; + * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val); -/** As hs_cell_introduce_encrypted_set_extensions, but does not free +int trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_introduce_encrypted_set_extensions, but does not free * the previous value. */ -int hs_cell_introduce_encrypted_set0_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val); +int trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val); /** Return the value of the onion_key_type field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -uint8_t hs_cell_introduce_encrypted_get_onion_key_type(const hs_cell_introduce_encrypted_t *inp); +uint8_t trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the onion_key_type field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on * success; return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *inp, uint8_t val); +int trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val); /** Return the value of the onion_key_len field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -uint16_t hs_cell_introduce_encrypted_get_onion_key_len(const hs_cell_introduce_encrypted_t *inp); +uint16_t trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the onion_key_len field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on * success; return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_onion_key_len(hs_cell_introduce_encrypted_t *inp, uint16_t val); +int trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val); /** Return the length of the dynamic array holding the onion_key field - * of the hs_cell_introduce_encrypted_t in 'inp'. + * of the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_onion_key(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the dynamic array field - * onion_key of the hs_cell_introduce_encrypted_t in 'inp'. + * onion_key of the trn_cell_introduce_encrypted_t in 'inp'. */ -uint8_t hs_cell_introduce_encrypted_get_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_onion_key, but take and return +uint8_t trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_onion_key, but take and return * a const pointer */ -uint8_t hs_cell_introduce_encrypted_getconst_onion_key(const hs_cell_introduce_encrypted_t *inp, size_t idx); +uint8_t trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * onion_key of the hs_cell_introduce_encrypted_t in 'inp', so that it - * will hold the value 'elt'. + * onion_key of the trn_cell_introduce_encrypted_t in 'inp', so that + * it will hold the value 'elt'. */ -int hs_cell_introduce_encrypted_set_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field onion_key of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -int hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, uint8_t elt); +int trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field onion_key of * 'inp'. */ -uint8_t * hs_cell_introduce_encrypted_getarray_onion_key(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_onion_key, but take and return +uint8_t * trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_onion_key, but take and return * a const pointer */ -const uint8_t * hs_cell_introduce_encrypted_getconstarray_onion_key(const hs_cell_introduce_encrypted_t *inp); +const uint8_t * trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp); /** Change the length of the variable-length array field onion_key of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, size_t newlen); +int trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen); /** Return the value of the nspec field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -uint8_t hs_cell_introduce_encrypted_get_nspec(const hs_cell_introduce_encrypted_t *inp); +uint8_t trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the nspec field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on * success; return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_nspec(hs_cell_introduce_encrypted_t *inp, uint8_t val); +int trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val); /** Return the length of the dynamic array holding the nspecs field of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_nspecs(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the dynamic array field - * nspecs of the hs_cell_introduce_encrypted_t in 'inp'. + * nspecs of the trn_cell_introduce_encrypted_t in 'inp'. */ -struct link_specifier_st * hs_cell_introduce_encrypted_get_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_nspecs, but take and return a +struct link_specifier_st * trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a * const pointer */ - const struct link_specifier_st * hs_cell_introduce_encrypted_getconst_nspecs(const hs_cell_introduce_encrypted_t *inp, size_t idx); + const struct link_specifier_st * trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * nspecs of the hs_cell_introduce_encrypted_t in 'inp', so that it + * nspecs of the trn_cell_introduce_encrypted_t in 'inp', so that it * will hold the value 'elt'. Free the previous value, if any. */ -int hs_cell_introduce_encrypted_set_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); -/** As hs_cell_introduce_encrypted_set_nspecs, but does not free the +int trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); +/** As trn_cell_introduce_encrypted_set_nspecs, but does not free the * previous value. */ -int hs_cell_introduce_encrypted_set0_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); +int trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); /** Append a new element 'elt' to the dynamic array field nspecs of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -int hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt); +int trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt); /** Return a pointer to the variable-length array field nspecs of * 'inp'. */ -struct link_specifier_st * * hs_cell_introduce_encrypted_getarray_nspecs(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_nspecs, but take and return a +struct link_specifier_st * * trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a * const pointer */ -const struct link_specifier_st * const * hs_cell_introduce_encrypted_getconstarray_nspecs(const hs_cell_introduce_encrypted_t *inp); +const struct link_specifier_st * const * trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp); /** Change the length of the variable-length array field nspecs of * 'inp' to 'newlen'.Fill extra elements with NULL; free removed * elements. Return 0 on success; return -1 and set the error code on * 'inp' on failure. */ -int hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, size_t newlen); +int trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen); /** Return the length of the dynamic array holding the pad field of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_pad(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the dynamic array field - * pad of the hs_cell_introduce_encrypted_t in 'inp'. + * pad of the trn_cell_introduce_encrypted_t in 'inp'. */ -uint8_t hs_cell_introduce_encrypted_get_pad(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_pad, but take and return a +uint8_t trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_pad, but take and return a * const pointer */ -uint8_t hs_cell_introduce_encrypted_getconst_pad(const hs_cell_introduce_encrypted_t *inp, size_t idx); +uint8_t trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * pad of the hs_cell_introduce_encrypted_t in 'inp', so that it will + * pad of the trn_cell_introduce_encrypted_t in 'inp', so that it will * hold the value 'elt'. */ -int hs_cell_introduce_encrypted_set_pad(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field pad of the - * hs_cell_introduce_encrypted_t in 'inp'. + * trn_cell_introduce_encrypted_t in 'inp'. */ -int hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t elt); +int trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field pad of 'inp'. */ -uint8_t * hs_cell_introduce_encrypted_getarray_pad(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_pad, but take and return a +uint8_t * trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_pad, but take and return a * const pointer */ -const uint8_t * hs_cell_introduce_encrypted_getconstarray_pad(const hs_cell_introduce_encrypted_t *inp); +const uint8_t * trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp); /** Change the length of the variable-length array field pad of 'inp' * to 'newlen'.Fill extra elements with 0. Return 0 on success; return * -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_t newlen); +int trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen); #endif diff --git a/src/trunnel/hs/cell_introduce1.trunnel b/src/trunnel/hs/cell_introduce1.trunnel index f7776879cd..7577c1526f 100644 --- a/src/trunnel/hs/cell_introduce1.trunnel +++ b/src/trunnel/hs/cell_introduce1.trunnel @@ -5,7 +5,7 @@ */ /* From cell_common.trunnel. */ -extern struct cell_extension; +extern struct trn_cell_extension; /* From ed25519_cert.trunnel. */ extern struct link_specifier; @@ -13,7 +13,7 @@ const TRUNNEL_SHA1_LEN = 20; const TRUNNEL_REND_COOKIE_LEN = 20; /* INTRODUCE1 payload. See details in section 3.2.1. */ -struct hs_cell_introduce1 { +struct trn_cell_introduce1 { /* Always zeroed. MUST be checked explicitely by the caller. */ u8 legacy_key_id[TRUNNEL_SHA1_LEN]; @@ -23,28 +23,28 @@ struct hs_cell_introduce1 { u8 auth_key[auth_key_len]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; /* Variable length, up to the end of cell. */ u8 encrypted[]; }; /* INTRODUCE_ACK payload. See details in section 3.2.2. */ -struct hs_cell_introduce_ack { +struct trn_cell_introduce_ack { /* Status of introduction. */ u16 status IN [0x0000, 0x0001, 0x0002]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; }; /* Encrypted section of the INTRODUCE1/INTRODUCE2 cell. */ -struct hs_cell_introduce_encrypted { +struct trn_cell_introduce_encrypted { /* Rendezvous cookie. */ u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; /* Onion key material. */ u8 onion_key_type IN [0x01]; |