aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog388
-rw-r--r--Makefile.am2
-rw-r--r--ReleaseNotes131
-rw-r--r--changes/155544
-rw-r--r--changes/211484
-rw-r--r--changes/bug156453
-rw-r--r--changes/bug160824
-rw-r--r--changes/bug16674
-rw-r--r--changes/bug176394
-rw-r--r--changes/bug177504
-rw-r--r--changes/bug189826
-rw-r--r--changes/bug192815
-rw-r--r--changes/bug194187
-rw-r--r--changes/bug194763
-rw-r--r--changes/bug196485
-rw-r--r--changes/bug198714
-rw-r--r--changes/bug202474
-rw-r--r--changes/bug220064
-rw-r--r--changes/bug222125
-rw-r--r--changes/bug222863
-rw-r--r--changes/bug223472
-rw-r--r--changes/bug223499
-rw-r--r--changes/bug223565
-rw-r--r--changes/bug22400_014
-rw-r--r--changes/bug224104
-rw-r--r--changes/bug224617
-rw-r--r--changes/bug224974
-rw-r--r--changes/bug22502_part112
-rw-r--r--changes/bug225165
-rw-r--r--changes/bug225205
-rw-r--r--changes/bug226368
-rw-r--r--changes/bug226694
-rw-r--r--changes/bug226704
-rw-r--r--changes/bug22670_024
-rw-r--r--changes/bug22670_036
-rw-r--r--changes/bug226725
-rw-r--r--changes/bug226773
-rw-r--r--changes/bug227025
-rw-r--r--changes/bug227197
-rw-r--r--changes/bug227209
-rw-r--r--changes/bug2273712
-rw-r--r--changes/bug227464
-rw-r--r--changes/bug227505
-rw-r--r--changes/bug227515
-rw-r--r--changes/bug227537
-rw-r--r--changes/bug227794
-rw-r--r--changes/bug227897
-rw-r--r--changes/bug227974
-rw-r--r--changes/bug228015
-rw-r--r--changes/bug2280210
-rw-r--r--changes/bug228033
-rw-r--r--changes/bug228305
-rw-r--r--changes/bug22883-config7
-rw-r--r--changes/bug22883-priority8
-rw-r--r--changes/bug228855
-rw-r--r--changes/bug228924
-rw-r--r--changes/bug229153
-rw-r--r--changes/bug22916_0273
-rw-r--r--changes/bug229244
-rw-r--r--changes/bug229276
-rw-r--r--changes/bug230264
-rw-r--r--changes/bug23030_0297
-rw-r--r--changes/bug230535
-rw-r--r--changes/bug230544
-rw-r--r--changes/bug230554
-rw-r--r--changes/bug230715
-rw-r--r--changes/bug230787
-rw-r--r--changes/bug230818
-rw-r--r--changes/bug230916
-rw-r--r--changes/bug230984
-rw-r--r--changes/bug231065
-rw-r--r--changes/bug231393
-rw-r--r--changes/bug231554
-rw-r--r--changes/bug232207
-rw-r--r--changes/bug232334
-rw-r--r--changes/bug232913
-rw-r--r--changes/bug30563
-rw-r--r--changes/bug40194
-rw-r--r--changes/bug58475
-rw-r--r--changes/bug78904
-rw-r--r--changes/diagnose_227524
-rw-r--r--changes/doc201523
-rw-r--r--changes/feature229768
-rw-r--r--changes/geoip-august20174
-rw-r--r--changes/geoip-june20174
-rw-r--r--changes/more-files4
-rw-r--r--changes/more-threads3
-rw-r--r--changes/multi-priority5
-rw-r--r--changes/new_requirement_pkgconfig5
-rw-r--r--changes/task-222074
-rw-r--r--changes/ticket204885
-rw-r--r--changes/ticket205754
-rw-r--r--changes/ticket223113
-rw-r--r--changes/ticket225213
-rw-r--r--changes/ticket226086
-rw-r--r--changes/ticket226845
-rw-r--r--changes/ticket227503
-rw-r--r--changes/ticket228044
-rw-r--r--changes/ticket228705
-rw-r--r--changes/ticket228953
-rw-r--r--configure.ac151
-rw-r--r--contrib/win32build/tor-mingw.nsi.in2
-rw-r--r--doc/HACKING/CodingStandards.md40
-rw-r--r--doc/HACKING/ReleasingTor.md2
-rw-r--r--doc/tor.1.txt58
-rw-r--r--scripts/coccinelle/ceil_div.cocci6
-rwxr-xr-xscripts/coccinelle/test-operator-cleanup11
-rw-r--r--scripts/coccinelle/test_assert_int.cocci49
-rw-r--r--scripts/coccinelle/test_assert_null.cocci11
-rw-r--r--scripts/coccinelle/test_assert_zero.cocci5
-rwxr-xr-xscripts/codegen/fuzzing_include_am.py7
-rw-r--r--src/common/aes.c2
-rw-r--r--src/common/compat.c35
-rw-r--r--src/common/compat_time.c2
-rw-r--r--src/common/compress.c6
-rw-r--r--src/common/compress.h2
-rw-r--r--src/common/compress_lzma.c10
-rw-r--r--src/common/compress_zstd.c16
-rw-r--r--src/common/confline.c16
-rw-r--r--src/common/container.c4
-rw-r--r--src/common/crypto.c29
-rw-r--r--src/common/crypto.h9
-rw-r--r--src/common/crypto_ed25519.c61
-rw-r--r--src/common/crypto_ed25519.h2
-rw-r--r--src/common/memarea.c3
-rw-r--r--src/common/procmon.c2
-rw-r--r--src/common/sandbox.c71
-rw-r--r--src/common/sandbox.h8
-rw-r--r--src/common/tortls.c28
-rw-r--r--src/common/util.c34
-rw-r--r--src/common/util.h14
-rw-r--r--src/common/util_bug.c4
-rw-r--r--src/common/util_bug.h5
-rw-r--r--src/config/geoip18433
-rw-r--r--src/config/geoip61293
-rw-r--r--src/ext/ed25519/donna/curve25519-donna-sse2.h7
-rw-r--r--src/ext/ed25519/donna/ed25519_donna_tor.h5
-rw-r--r--src/ext/ed25519/donna/ed25519_tor.c39
-rw-r--r--src/ext/ed25519/ref10/blinding.c49
-rw-r--r--src/ext/ed25519/ref10/ed25519_ref10.h4
-rw-r--r--src/ext/trunnel/trunnel-impl.h2
-rw-r--r--src/ext/trunnel/trunnel.c2
-rw-r--r--src/ext/trunnel/trunnel.h2
-rw-r--r--src/or/buffers.c96
-rw-r--r--src/or/buffers.h3
-rw-r--r--src/or/channel.c47
-rw-r--r--src/or/channel.h1
-rw-r--r--src/or/channeltls.c3
-rw-r--r--src/or/circuitbuild.c564
-rw-r--r--src/or/circuitbuild.h9
-rw-r--r--src/or/circuitlist.c52
-rw-r--r--src/or/circuitlist.h3
-rw-r--r--src/or/circuitmux_ewma.c6
-rw-r--r--src/or/circuitstats.c4
-rw-r--r--src/or/circuituse.c134
-rw-r--r--src/or/circuituse.h3
-rw-r--r--src/or/command.c3
-rw-r--r--src/or/config.c60
-rw-r--r--src/or/config.h4
-rw-r--r--src/or/connection.c24
-rw-r--r--src/or/connection.h1
-rw-r--r--src/or/connection_edge.c462
-rw-r--r--src/or/connection_edge.h6
-rw-r--r--src/or/connection_or.c10
-rw-r--r--src/or/consdiffmgr.c1
-rw-r--r--src/or/control.c113
-rw-r--r--src/or/cpuworker.c4
-rw-r--r--src/or/dircollate.c2
-rw-r--r--src/or/directory.c278
-rw-r--r--src/or/directory.h43
-rw-r--r--src/or/dirserv.c18
-rw-r--r--src/or/dirvote.c9
-rw-r--r--src/or/dns.c20
-rw-r--r--src/or/entrynodes.c2
-rw-r--r--src/or/ext_orport.c2
-rw-r--r--src/or/hibernate.c5
-rw-r--r--src/or/hs_cache.c502
-rw-r--r--src/or/hs_cache.h60
-rw-r--r--src/or/hs_cell.c948
-rw-r--r--src/or/hs_cell.h122
-rw-r--r--src/or/hs_circuit.c1133
-rw-r--r--src/or/hs_circuit.h63
-rw-r--r--src/or/hs_circuitmap.c52
-rw-r--r--src/or/hs_circuitmap.h8
-rw-r--r--src/or/hs_client.c1253
-rw-r--r--src/or/hs_client.h50
-rw-r--r--src/or/hs_common.c1407
-rw-r--r--src/or/hs_common.h186
-rw-r--r--src/or/hs_config.c582
-rw-r--r--src/or/hs_config.h24
-rw-r--r--src/or/hs_descriptor.c420
-rw-r--r--src/or/hs_descriptor.h41
-rw-r--r--src/or/hs_ident.c110
-rw-r--r--src/or/hs_ident.h133
-rw-r--r--src/or/hs_intropoint.c27
-rw-r--r--src/or/hs_intropoint.h22
-rw-r--r--src/or/hs_ntor.c50
-rw-r--r--src/or/hs_ntor.h24
-rw-r--r--src/or/hs_service.c3330
-rw-r--r--src/or/hs_service.h359
-rw-r--r--src/or/include.am33
-rw-r--r--src/or/main.c79
-rw-r--r--src/or/microdesc.c2
-rw-r--r--src/or/networkstatus.c19
-rw-r--r--src/or/networkstatus.h1
-rw-r--r--src/or/nodelist.c171
-rw-r--r--src/or/nodelist.h6
-rw-r--r--src/or/ntmain.c6
-rw-r--r--src/or/onion.c2
-rw-r--r--src/or/onion_tap.c7
-rw-r--r--src/or/or.h53
-rw-r--r--src/or/parsecommon.c2
-rw-r--r--src/or/parsecommon.h3
-rw-r--r--src/or/policies.c2
-rw-r--r--src/or/protover.h5
-rw-r--r--src/or/relay.c42
-rw-r--r--src/or/rendcache.c4
-rw-r--r--src/or/rendclient.c424
-rw-r--r--src/or/rendclient.h4
-rw-r--r--src/or/rendcommon.c24
-rw-r--r--src/or/rendcommon.h11
-rw-r--r--src/or/rendmid.c1
-rw-r--r--src/or/rendservice.c547
-rw-r--r--src/or/rendservice.h28
-rw-r--r--src/or/rephist.c101
-rw-r--r--src/or/rephist.h3
-rw-r--r--src/or/router.c48
-rw-r--r--src/or/router.h2
-rw-r--r--src/or/routerkeys.c106
-rw-r--r--src/or/routerkeys.h1
-rw-r--r--src/or/routerlist.c14
-rw-r--r--src/or/routerparse.c25
-rw-r--r--src/or/scheduler.c16
-rw-r--r--src/or/shared_random.c46
-rw-r--r--src/or/shared_random.h3
-rw-r--r--src/or/shared_random_state.c46
-rw-r--r--src/or/shared_random_state.h5
-rw-r--r--src/or/statefile.c8
-rw-r--r--src/or/torcert.c2
-rw-r--r--src/rust/tor_util/include.am2
-rw-r--r--src/test/ed25519_exts_ref.py36
-rw-r--r--src/test/ed25519_vectors.inc32
-rw-r--r--src/test/fuzz/include.am8
-rw-r--r--src/test/hs_build_address.py37
-rw-r--r--src/test/hs_ntor_ref.py31
-rw-r--r--src/test/hs_test_helpers.c30
-rw-r--r--src/test/hs_test_helpers.h3
-rw-r--r--src/test/include.am52
-rw-r--r--src/test/rend_test_helpers.c16
-rw-r--r--src/test/rend_test_helpers.h1
-rw-r--r--src/test/test-memwipe.c2
-rw-r--r--src/test/test.c78
-rw-r--r--src/test/test.h9
-rw-r--r--src/test/test_addr.c36
-rw-r--r--src/test/test_address.c68
-rw-r--r--src/test/test_buffers.c35
-rw-r--r--src/test/test_channel.c317
-rw-r--r--src/test/test_channeltls.c30
-rw-r--r--src/test/test_circuitlist.c11
-rw-r--r--src/test/test_circuitmux.c6
-rw-r--r--src/test/test_circuituse.c31
-rw-r--r--src/test/test_config.c520
-rw-r--r--src/test/test_connection.c409
-rw-r--r--src/test/test_connection.h13
-rw-r--r--src/test/test_conscache.c6
-rw-r--r--src/test/test_consdiffmgr.c4
-rw-r--r--src/test/test_containers.c68
-rw-r--r--src/test/test_controller.c278
-rw-r--r--src/test/test_crypto.c139
-rw-r--r--src/test/test_crypto_openssl.c6
-rw-r--r--src/test/test_crypto_slow.c26
-rw-r--r--src/test/test_dir.c840
-rw-r--r--src/test/test_dir_common.c2
-rw-r--r--src/test/test_dns.c64
-rw-r--r--src/test/test_entryconn.c87
-rw-r--r--src/test/test_entrynodes.c92
-rw-r--r--src/test/test_guardfraction.c48
-rw-r--r--src/test/test_helpers.c144
-rw-r--r--src/test/test_helpers.h10
-rw-r--r--src/test/test_hs.c280
-rw-r--r--src/test/test_hs_cache.c112
-rw-r--r--src/test/test_hs_cell.c130
-rw-r--r--src/test/test_hs_client.c286
-rw-r--r--src/test/test_hs_common.c855
-rw-r--r--src/test/test_hs_config.c487
-rw-r--r--src/test/test_hs_descriptor.c157
-rw-r--r--src/test/test_hs_descriptor.inc224
-rw-r--r--src/test/test_hs_intropoint.c341
-rw-r--r--src/test/test_hs_ntor.c114
-rw-r--r--src/test/test_hs_service.c1423
-rw-r--r--src/test/test_introduce.c10
-rwxr-xr-xsrc/test/test_key_expiration.sh129
-rw-r--r--src/test/test_keypin.c103
-rw-r--r--src/test/test_link_handshake.c286
-rw-r--r--src/test/test_logging.c8
-rw-r--r--src/test/test_microdesc.c12
-rw-r--r--src/test/test_oos.c18
-rw-r--r--src/test/test_options.c14
-rw-r--r--src/test/test_policy.c365
-rw-r--r--src/test/test_protover.c22
-rw-r--r--src/test/test_pt.c34
-rw-r--r--src/test/test_relay.c4
-rw-r--r--src/test/test_rendcache.c22
-rw-r--r--src/test/test_replay.c24
-rw-r--r--src/test/test_routerkeys.c199
-rw-r--r--src/test/test_routerlist.c66
-rw-r--r--src/test/test_scheduler.c144
-rw-r--r--src/test/test_shared_random.c346
-rw-r--r--src/test/test_socks.c74
-rw-r--r--src/test/test_status.c6
-rw-r--r--src/test/test_storagedir.c2
-rw-r--r--src/test/test_threads.c12
-rw-r--r--src/test/test_tortls.c4
-rw-r--r--src/test/test_util.c226
-rw-r--r--src/test/test_util_format.c8
-rw-r--r--src/test/test_util_slow.c2
-rw-r--r--src/tools/include.am8
-rw-r--r--src/trunnel/channelpadding_negotiation.c12
-rw-r--r--src/trunnel/channelpadding_negotiation.h10
-rw-r--r--src/trunnel/ed25519_cert.c4
-rw-r--r--src/trunnel/ed25519_cert.h2
-rw-r--r--src/trunnel/ed25519_cert.trunnel6
-rw-r--r--src/trunnel/hs/cell_common.c4
-rw-r--r--src/trunnel/hs/cell_common.h2
-rw-r--r--src/trunnel/hs/cell_establish_intro.c4
-rw-r--r--src/trunnel/hs/cell_establish_intro.h2
-rw-r--r--src/trunnel/hs/cell_introduce1.c4
-rw-r--r--src/trunnel/hs/cell_introduce1.h2
-rw-r--r--src/trunnel/hs/cell_rendezvous.c470
-rw-r--r--src/trunnel/hs/cell_rendezvous.h187
-rw-r--r--src/trunnel/hs/cell_rendezvous.trunnel29
-rw-r--r--src/trunnel/include.am2
-rw-r--r--src/trunnel/link_handshake.c4
-rw-r--r--src/trunnel/link_handshake.h2
-rw-r--r--src/trunnel/pwbox.c4
-rw-r--r--src/trunnel/pwbox.h2
-rw-r--r--src/win32/orconfig.h2
337 files changed, 35543 insertions, 11734 deletions
diff --git a/ChangeLog b/ChangeLog
index b1f64c92f4..ba299fbeb7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,385 @@
+Changes in version 0.3.0.10 - 2017-08-02
+ Tor 0.3.0.10 backports a collection of small-to-medium bugfixes
+ from the current Tor alpha series. OpenBSD users and TPROXY users
+ should upgrade; others are probably okay sticking with 0.3.0.9.
+
+ o Major features (build system, continuous integration, backport from 0.3.1.5-alpha):
+ - Tor's repository now includes a Travis Continuous Integration (CI)
+ configuration file (.travis.yml). This is meant to help new
+ developers and contributors who fork Tor to a Github repository be
+ better able to test their changes, and understand what we expect
+ to pass. To use this new build feature, you must fork Tor to your
+ Github account, then go into the "Integrations" menu in the
+ repository settings for your fork and enable Travis, then push
+ your changes. Closes ticket 22636.
+
+ o Major bugfixes (linux TPROXY support, backport from 0.3.1.1-alpha):
+ - Fix a typo that had prevented TPROXY-based transparent proxying
+ from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha.
+ Patch from "d4fq0fQAgoJ".
+
+ o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha):
+ - Avoid an assertion failure bug affecting our implementation of
+ inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
+ handling of "0xfoo" differs from what we had expected. Fixes bug
+ 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
+
+ o Minor features (backport from 0.3.1.5-alpha):
+ - Update geoip and geoip6 to the July 4 2017 Maxmind GeoLite2
+ Country database.
+
+ o Minor bugfixes (bandwidth accounting, backport from 0.3.1.2-alpha):
+ - Roll over monthly accounting at the configured hour and minute,
+ rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1.
+ Found by Andrey Karpov with PVS-Studio.
+
+ o Minor bugfixes (compilation warnings, backport from 0.3.1.5-alpha):
+ - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug 22915;
+ bugfix on 0.2.8.1-alpha.
+ - Fix warnings when building with libscrypt and openssl scrypt
+ support on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha.
+ - When building with certain versions of the mingw C header files,
+ avoid float-conversion warnings when calling the C functions
+ isfinite(), isnan(), and signbit(). Fixes bug 22801; bugfix
+ on 0.2.8.1-alpha.
+
+ o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha):
+ - Backport a fix for an "unused variable" warning that appeared
+ in some versions of mingw. Fixes bug 22838; bugfix on
+ 0.2.8.1-alpha.
+
+ o Minor bugfixes (coverity build support, backport from 0.3.1.5-alpha):
+ - Avoid Coverity build warnings related to our BUG() macro. By
+ default, Coverity treats BUG() as the Linux kernel does: an
+ instant abort(). We need to override that so our BUG() macro
+ doesn't prevent Coverity from analyzing functions that use it.
+ Fixes bug 23030; bugfix on 0.2.9.1-alpha.
+
+ o Minor bugfixes (directory authority, backport from 0.3.1.1-alpha):
+ - When rejecting a router descriptor for running an obsolete version
+ of Tor without ntor support, warn about the obsolete tor version,
+ not the missing ntor key. Fixes bug 20270; bugfix on 0.2.9.3-alpha.
+
+ o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.5-alpha):
+ - Avoid a sandbox failure when trying to re-bind to a socket and
+ mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha.
+
+ o Minor bugfixes (unit tests, backport from 0.3.1.5-alpha)
+ - Fix a memory leak in the link-handshake/certs_ok_ed25519 test.
+ Fixes bug 22803; bugfix on 0.3.0.1-alpha.
+
+
+Changes in version 0.3.1.5-alpha - 2017-08-01
+ Tor 0.3.1.5-alpha improves the performance of consensus diff
+ calculation, fixes a crash bug on older versions of OpenBSD, and fixes
+ several other bugs. If no serious bugs are found in this version, the
+ next version will be a release candidate.
+
+ This release also marks the end of support for the Tor 0.2.4.x,
+ 0.2.6.x, and 0.2.7.x release series. Those releases will receive no
+ further bug or security fixes. Anyone still running or distributing
+ one of those versions should upgrade.
+
+ o Major features (build system, continuous integration):
+ - Tor's repository now includes a Travis Continuous Integration (CI)
+ configuration file (.travis.yml). This is meant to help new
+ developers and contributors who fork Tor to a Github repository be
+ better able to test their changes, and understand what we expect
+ to pass. To use this new build feature, you must fork Tor to your
+ Github account, then go into the "Integrations" menu in the
+ repository settings for your fork and enable Travis, then push
+ your changes. Closes ticket 22636.
+
+ o Major bugfixes (openbsd, denial-of-service):
+ - Avoid an assertion failure bug affecting our implementation of
+ inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
+ handling of "0xfoo" differs from what we had expected. Fixes bug
+ 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
+
+ o Major bugfixes (relay, performance):
+ - Perform circuit handshake operations at a higher priority than we
+ use for consensus diff creation and compression. This should
+ prevent circuits from starving when a relay or bridge receives a
+ new consensus, especially on lower-powered machines. Fixes bug
+ 22883; bugfix on 0.3.1.1-alpha.
+
+ o Minor features (bridge authority):
+ - Add "fingerprint" lines to the networkstatus-bridges file produced
+ by bridge authorities. Closes ticket 22207.
+
+ o Minor features (directory cache, consensus diff):
+ - Add a new MaxConsensusAgeForDiffs option to allow directory cache
+ operators with low-resource environments to adjust the number of
+ consensuses they'll store and generate diffs from. Most cache
+ operators should leave it unchanged. Helps to work around
+ bug 22883.
+
+ o Minor features (geoip):
+ - Update geoip and geoip6 to the July 4 2017 Maxmind GeoLite2
+ Country database.
+
+ o Minor features (relay, performance):
+ - Always start relays with at least two worker threads, to prevent
+ priority inversion on slow tasks. Part of the fix for bug 22883.
+ - Allow background work to be queued with different priorities, so
+ that a big pile of slow low-priority jobs will not starve out
+ higher priority jobs. This lays the groundwork for a fix for
+ bug 22883.
+
+ o Minor bugfixes (build system, rust):
+ - Fix a problem where Rust toolchains were not being found when
+ building without --enable-cargo-online-mode, due to setting the
+ $HOME environment variable instead of $CARGO_HOME. Fixes bug
+ 22830; bugfix on 0.3.1.1-alpha. Fix by Chelsea Komlo.
+
+ o Minor bugfixes (compatibility, zstd):
+ - Write zstd epilogues correctly when the epilogue requires
+ reallocation of the output buffer, even with zstd 1.3.0.
+ (Previously, we worked on 1.2.0 and failed with 1.3.0). Fixes bug
+ 22927; bugfix on 0.3.1.1-alpha.
+
+ o Minor bugfixes (compilation warnings):
+ - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug
+ 22915; bugfix on 0.2.8.1-alpha.
+ - Fix warnings when building with libscrypt and openssl scrypt
+ support on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha.
+ - Compile correctly when both openssl 1.1.0 and libscrypt are
+ detected. Previously this would cause an error. Fixes bug 22892;
+ bugfix on 0.3.1.1-alpha.
+ - When building with certain versions of the mingw C header files,
+ avoid float-conversion warnings when calling the C functions
+ isfinite(), isnan(), and signbit(). Fixes bug 22801; bugfix
+ on 0.2.8.1-alpha.
+
+ o Minor bugfixes (coverity build support):
+ - Avoid Coverity build warnings related to our BUG() macro. By
+ default, Coverity treats BUG() as the Linux kernel does: an
+ instant abort(). We need to override that so our BUG() macro
+ doesn't prevent Coverity from analyzing functions that use it.
+ Fixes bug 23030; bugfix on 0.2.9.1-alpha.
+
+ o Minor bugfixes (directory authority):
+ - When a directory authority rejects a descriptor or extrainfo with
+ a given digest, mark that digest as undownloadable, so that we do
+ not attempt to download it again over and over. We previously
+ tried to avoid downloading such descriptors by other means, but we
+ didn't notice if we accidentally downloaded one anyway. This
+ behavior became problematic in 0.2.7.2-alpha, when authorities
+ began pinning Ed25519 keys. Fixes bug 22349; bugfix
+ on 0.2.1.19-alpha.
+
+ o Minor bugfixes (error reporting, windows):
+ - When formatting Windows error messages, use the English format to
+ avoid codepage issues. Fixes bug 22520; bugfix on 0.1.2.8-alpha.
+ Patch from "Vort".
+
+ o Minor bugfixes (file limits, osx):
+ - When setting the maximum number of connections allowed by the OS,
+ always allow some extra file descriptors for other files. Fixes
+ bug 22797; bugfix on 0.2.0.10-alpha.
+
+ o Minor bugfixes (linux seccomp2 sandbox):
+ - Avoid a sandbox failure when trying to re-bind to a socket and
+ mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha.
+
+ o Minor bugfixes (memory leaks):
+ - Fix a small memory leak when validating a configuration that uses
+ two or more AF_UNIX sockets for the same port type. Fixes bug
+ 23053; bugfix on 0.2.6.3-alpha. This is CID 1415725.
+
+ o Minor bugfixes (unit tests):
+ - test_consdiff_base64cmp would fail on OS X because while OS X
+ follows the standard of (less than zero/zero/greater than zero),
+ it doesn't follow the convention of (-1/0/+1). Make the test
+ comply with the standard. Fixes bug 22870; bugfix on 0.3.1.1-alpha.
+ - Fix a memory leak in the link-handshake/certs_ok_ed25519 test.
+ Fixes bug 22803; bugfix on 0.3.0.1-alpha.
+
+
+Changes in version 0.3.1.4-alpha - 2017-06-29
+ Tor 0.3.1.4-alpha fixes a path selection bug that would allow a client
+ to use a guard that was in the same network family as a chosen exit
+ relay. This is a security regression; all clients running earlier
+ versions of 0.3.0.x or 0.3.1.x should upgrade to 0.3.0.9
+ or 0.3.1.4-alpha.
+
+ This release also fixes several other bugs introduced in 0.3.0.x
+ and 0.3.1.x, including others that can affect bandwidth usage
+ and correctness.
+
+ o New dependencies:
+ - To build with zstd and lzma support, Tor now requires the
+ pkg-config tool at build time. (This requirement was new in
+ 0.3.1.1-alpha, but was not noted at the time. Noting it here to
+ close ticket 22623.)
+
+ o Major bugfixes (path selection, security):
+ - When choosing which guard to use for a circuit, avoid the exit's
+ family along with the exit itself. Previously, the new guard
+ selection logic avoided the exit, but did not consider its family.
+ Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked as TROVE-2017-
+ 006 and CVE-2017-0377.
+
+ o Major bugfixes (compression, zstd):
+ - Correctly detect a full buffer when decompressing a large zstd-
+ compressed input. Previously, we would sometimes treat a full
+ buffer as an error. Fixes bug 22628; bugfix on 0.3.1.1-alpha.
+
+ o Major bugfixes (directory protocol):
+ - Ensure that we send "304 Not modified" as HTTP status code when a
+ client is attempting to fetch a consensus or consensus diff, and
+ the best one we can send them is one they already have. Fixes bug
+ 22702; bugfix on 0.3.1.1-alpha.
+
+ o Major bugfixes (entry guards):
+ - When starting with an old consensus, do not add new entry guards
+ unless the consensus is "reasonably live" (under 1 day old). Fixes
+ one root cause of bug 22400; bugfix on 0.3.0.1-alpha.
+
+ o Minor features (bug mitigation, diagnostics, logging):
+ - Avoid an assertion failure, and log a better error message, when
+ unable to remove a file from the consensus cache on Windows.
+ Attempts to mitigate and diagnose bug 22752.
+
+ o Minor features (geoip):
+ - Update geoip and geoip6 to the June 8 2017 Maxmind GeoLite2
+ Country database.
+
+ o Minor bugfixes (compression):
+ - When compressing or decompressing a buffer, check for a failure to
+ create a compression object. Fixes bug 22626; bugfix
+ on 0.3.1.1-alpha.
+ - When decompressing a buffer, check for extra data after the end of
+ the compressed data. Fixes bug 22629; bugfix on 0.3.1.1-alpha.
+ - When decompressing an object received over an anonymous directory
+ connection, if we have already decompressed it using an acceptable
+ compression method, do not reject it for looking like an
+ unacceptable compression method. Fixes part of bug 22670; bugfix
+ on 0.3.1.1-alpha.
+ - When serving directory votes compressed with zlib, do not claim to
+ have compressed them with zstd. Fixes bug 22669; bugfix
+ on 0.3.1.1-alpha.
+ - When spooling compressed data to an output buffer, don't try to
+ spool more data when there is no more data to spool and we are not
+ trying to flush the input. Previously, we would sometimes launch
+ compression requests with nothing to do, which interferes with our
+ 22672 checks. Fixes bug 22719; bugfix on 0.2.0.16-alpha.
+
+ o Minor bugfixes (defensive programming):
+ - Detect and break out of infinite loops in our compression code. We
+ don't think that any such loops exist now, but it's best to be
+ safe. Closes ticket 22672.
+ - Fix a memset() off the end of an array when packing cells. This
+ bug should be harmless in practice, since the corrupted bytes are
+ still in the same structure, and are always padding bytes,
+ ignored, or immediately overwritten, depending on compiler
+ behavior. Nevertheless, because the memset()'s purpose is to make
+ sure that any other cell-handling bugs can't expose bytes to the
+ network, we need to fix it. Fixes bug 22737; bugfix on
+ 0.2.4.11-alpha. Fixes CID 1401591.
+
+ o Minor bugfixes (linux seccomp2 sandbox):
+ - Permit the fchmod system call, to avoid crashing on startup when
+ starting with the seccomp2 sandbox and an unexpected set of
+ permissions on the data directory or its contents. Fixes bug
+ 22516; bugfix on 0.2.5.4-alpha.
+ - Fix a crash in the LZMA module, when the sandbox was enabled, and
+ liblzma would allocate more than 16 MB of memory. We solve this by
+ bumping the mprotect() limit in the sandbox module from 16 MB to
+ 20 MB. Fixes bug 22751; bugfix on 0.3.1.1-alpha.
+
+ o Minor bugfixes (logging):
+ - When decompressing, do not warn if we fail to decompress using a
+ compression method that we merely guessed. Fixes part of bug
+ 22670; bugfix on 0.1.1.14-alpha.
+ - When decompressing, treat mismatch between content-encoding and
+ actual compression type as a protocol warning. Fixes part of bug
+ 22670; bugfix on 0.1.1.9-alpha.
+ - Downgrade "assigned_to_cpuworker failed" message to info-level
+ severity. In every case that can reach it, either a better warning
+ has already been logged, or no warning is warranted. Fixes bug
+ 22356; bugfix on 0.2.6.3-alpha.
+ - Demote a warn that was caused by libevent delays to info if
+ netflow padding is less than 4.5 seconds late, or to notice
+ if it is more (4.5 seconds is the amount of time that a netflow
+ record might be emitted after, if we chose the maximum timeout).
+ Fixes bug 22212; bugfix on 0.3.1.1-alpha.
+
+ o Minor bugfixes (process behavior):
+ - When exiting because of an error, always exit with a nonzero exit
+ status. Previously, we would fail to report an error in our exit
+ status in cases related to __OwningControllerProcess failure,
+ lockfile contention, and Ed25519 key initialization. Fixes bug
+ 22720; bugfix on versions 0.2.1.6-alpha, 0.2.2.28-beta, and
+ 0.2.7.2-alpha respectively. Reported by "f55jwk4f"; patch
+ from "huyvq".
+
+ o Documentation:
+ - Add a manpage description for the key-pinning-journal file. Closes
+ ticket 22347.
+ - Correctly note that bandwidth accounting values are stored in the
+ state file, and the bw_accounting file is now obsolete. Closes
+ ticket 16082.
+ - Document more of the files in the Tor data directory, including
+ cached-extrainfo, secret_onion_key{,_ntor}.old, hidserv-stats,
+ approved-routers, sr-random, and diff-cache. Found while fixing
+ ticket 22347.
+
+
+Changes in version 0.3.0.9 - 2017-06-29
+ Tor 0.3.0.9 fixes a path selection bug that would allow a client
+ to use a guard that was in the same network family as a chosen exit
+ relay. This is a security regression; all clients running earlier
+ versions of 0.3.0.x or 0.3.1.x should upgrade to 0.3.0.9 or
+ 0.3.1.4-alpha.
+
+ This release also backports several other bugfixes from the 0.3.1.x
+ series.
+
+ o Major bugfixes (path selection, security, backport from 0.3.1.4-alpha):
+ - When choosing which guard to use for a circuit, avoid the exit's
+ family along with the exit itself. Previously, the new guard
+ selection logic avoided the exit, but did not consider its family.
+ Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked as TROVE-2017-
+ 006 and CVE-2017-0377.
+
+ o Major bugfixes (entry guards, backport from 0.3.1.1-alpha):
+ - Don't block bootstrapping when a primary bridge is offline and we
+ can't get its descriptor. Fixes bug 22325; fixes one case of bug
+ 21969; bugfix on 0.3.0.3-alpha.
+
+ o Major bugfixes (entry guards, backport from 0.3.1.4-alpha):
+ - When starting with an old consensus, do not add new entry guards
+ unless the consensus is "reasonably live" (under 1 day old). Fixes
+ one root cause of bug 22400; bugfix on 0.3.0.1-alpha.
+
+ o Minor features (geoip):
+ - Update geoip and geoip6 to the June 8 2017 Maxmind GeoLite2
+ Country database.
+
+ o Minor bugfixes (voting consistency, backport from 0.3.1.1-alpha):
+ - Reject version numbers with non-numeric prefixes (such as +, -, or
+ 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.
+
+ o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.4-alpha):
+ - Permit the fchmod system call, to avoid crashing on startup when
+ starting with the seccomp2 sandbox and an unexpected set of
+ permissions on the data directory or its contents. Fixes bug
+ 22516; bugfix on 0.2.5.4-alpha.
+
+ o Minor bugfixes (defensive programming, backport from 0.3.1.4-alpha):
+ - Fix a memset() off the end of an array when packing cells. This
+ bug should be harmless in practice, since the corrupted bytes are
+ still in the same structure, and are always padding bytes,
+ ignored, or immediately overwritten, depending on compiler
+ behavior. Nevertheless, because the memset()'s purpose is to make
+ sure that any other cell-handling bugs can't expose bytes to the
+ network, we need to fix it. Fixes bug 22737; bugfix on
+ 0.2.4.11-alpha. Fixes CID 1401591.
+
+
Changes in version 0.3.1.3-alpha - 2017-06-08
Tor 0.3.1.3-alpha fixes a pair of bugs that would allow an attacker to
remotely crash a hidden service with an assertion failure. Anyone
@@ -1996,7 +2378,7 @@ Changes in version 0.3.0.1-alpha - 2016-12-19
subprotocol-versions mechanism, so that clients can tell which
relays can identity themselves by Ed25519 ID. Closes ticket 20552.
- o Minor features (fingerprinting resistence, authentication):
+ o Minor features (fingerprinting resistance, 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.
@@ -5062,7 +5444,7 @@ Changes in version 0.2.6.8 - 2015-05-21
o Major bugfixes (hidden services, backport from 0.2.7.1-alpha):
- Revert commit that made directory authorities assign the HSDir
- flag to relay without a DirPort; this was bad because such relays
+ flag to relays without a DirPort; this was bad because such relays
can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
on 0.2.6.3-alpha.
@@ -5103,7 +5485,7 @@ Changes in version 0.2.7.1-alpha - 2015-05-12
o Major bugfixes (hidden services):
- Revert commit that made directory authorities assign the HSDir
- flag to relay without a DirPort; this was bad because such relays
+ flag to relays without a DirPort; this was bad because such relays
can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
on 0.2.6.3-alpha.
diff --git a/Makefile.am b/Makefile.am
index 79d2e78521..f1f64f2106 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,7 +26,7 @@ TESTING_TOR_BINARY=$(top_builddir)/src/or/tor$(EXEEXT)
endif
if USE_RUST
-rust_ldadd=$(top_builddir)/src/rust/target/release/libtor_util.a
+rust_ldadd=$(top_builddir)/src/rust/target/release/@TOR_RUST_UTIL_STATIC_NAME@
else
rust_ldadd=
endif
diff --git a/ReleaseNotes b/ReleaseNotes
index 1e56ffaf89..668ee533cf 100644
--- a/ReleaseNotes
+++ b/ReleaseNotes
@@ -2,6 +2,131 @@ 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.10 - 2017-08-02
+ Tor 0.3.0.10 backports a collection of small-to-medium bugfixes
+ from the current Tor alpha series. OpenBSD users and TPROXY users
+ should upgrade; others are probably okay sticking with 0.3.0.9.
+
+ o Major features (build system, continuous integration, backport from 0.3.1.5-alpha):
+ - Tor's repository now includes a Travis Continuous Integration (CI)
+ configuration file (.travis.yml). This is meant to help new
+ developers and contributors who fork Tor to a Github repository be
+ better able to test their changes, and understand what we expect
+ to pass. To use this new build feature, you must fork Tor to your
+ Github account, then go into the "Integrations" menu in the
+ repository settings for your fork and enable Travis, then push
+ your changes. Closes ticket 22636.
+
+ o Major bugfixes (linux TPROXY support, backport from 0.3.1.1-alpha):
+ - Fix a typo that had prevented TPROXY-based transparent proxying
+ from working under Linux. Fixes bug 18100; bugfix on 0.2.6.3-alpha.
+ Patch from "d4fq0fQAgoJ".
+
+ o Major bugfixes (openbsd, denial-of-service, backport from 0.3.1.5-alpha):
+ - Avoid an assertion failure bug affecting our implementation of
+ inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
+ handling of "0xfoo" differs from what we had expected. Fixes bug
+ 22789; bugfix on 0.2.3.8-alpha. Also tracked as TROVE-2017-007.
+
+ o Minor features (backport from 0.3.1.5-alpha):
+ - Update geoip and geoip6 to the July 4 2017 Maxmind GeoLite2
+ Country database.
+
+ o Minor bugfixes (bandwidth accounting, backport from 0.3.1.2-alpha):
+ - Roll over monthly accounting at the configured hour and minute,
+ rather than always at 00:00. Fixes bug 22245; bugfix on 0.0.9rc1.
+ Found by Andrey Karpov with PVS-Studio.
+
+ o Minor bugfixes (compilation warnings, backport from 0.3.1.5-alpha):
+ - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug 22915;
+ bugfix on 0.2.8.1-alpha.
+ - Fix warnings when building with libscrypt and openssl scrypt
+ support on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha.
+ - When building with certain versions of the mingw C header files,
+ avoid float-conversion warnings when calling the C functions
+ isfinite(), isnan(), and signbit(). Fixes bug 22801; bugfix
+ on 0.2.8.1-alpha.
+
+ o Minor bugfixes (compilation, mingw, backport from 0.3.1.1-alpha):
+ - Backport a fix for an "unused variable" warning that appeared
+ in some versions of mingw. Fixes bug 22838; bugfix on
+ 0.2.8.1-alpha.
+
+ o Minor bugfixes (coverity build support, backport from 0.3.1.5-alpha):
+ - Avoid Coverity build warnings related to our BUG() macro. By
+ default, Coverity treats BUG() as the Linux kernel does: an
+ instant abort(). We need to override that so our BUG() macro
+ doesn't prevent Coverity from analyzing functions that use it.
+ Fixes bug 23030; bugfix on 0.2.9.1-alpha.
+
+ o Minor bugfixes (directory authority, backport from 0.3.1.1-alpha):
+ - When rejecting a router descriptor for running an obsolete version
+ of Tor without ntor support, warn about the obsolete tor version,
+ not the missing ntor key. Fixes bug 20270; bugfix on 0.2.9.3-alpha.
+
+ o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.5-alpha):
+ - Avoid a sandbox failure when trying to re-bind to a socket and
+ mark it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha.
+
+ o Minor bugfixes (unit tests, backport from 0.3.1.5-alpha)
+ - Fix a memory leak in the link-handshake/certs_ok_ed25519 test.
+ Fixes bug 22803; bugfix on 0.3.0.1-alpha.
+
+
+Changes in version 0.3.0.9 - 2017-06-29
+ Tor 0.3.0.9 fixes a path selection bug that would allow a client
+ to use a guard that was in the same network family as a chosen exit
+ relay. This is a security regression; all clients running earlier
+ versions of 0.3.0.x or 0.3.1.x should upgrade to 0.3.0.9 or
+ 0.3.1.4-alpha.
+
+ This release also backports several other bugfixes from the 0.3.1.x
+ series.
+
+ o Major bugfixes (path selection, security, backport from 0.3.1.4-alpha):
+ - When choosing which guard to use for a circuit, avoid the exit's
+ family along with the exit itself. Previously, the new guard
+ selection logic avoided the exit, but did not consider its family.
+ Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked as TROVE-2017-
+ 006 and CVE-2017-0377.
+
+ o Major bugfixes (entry guards, backport from 0.3.1.1-alpha):
+ - Don't block bootstrapping when a primary bridge is offline and we
+ can't get its descriptor. Fixes bug 22325; fixes one case of bug
+ 21969; bugfix on 0.3.0.3-alpha.
+
+ o Major bugfixes (entry guards, backport from 0.3.1.4-alpha):
+ - When starting with an old consensus, do not add new entry guards
+ unless the consensus is "reasonably live" (under 1 day old). Fixes
+ one root cause of bug 22400; bugfix on 0.3.0.1-alpha.
+
+ o Minor features (geoip):
+ - Update geoip and geoip6 to the June 8 2017 Maxmind GeoLite2
+ Country database.
+
+ o Minor bugfixes (voting consistency, backport from 0.3.1.1-alpha):
+ - Reject version numbers with non-numeric prefixes (such as +, -, or
+ 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.
+
+ o Minor bugfixes (linux seccomp2 sandbox, backport from 0.3.1.4-alpha):
+ - Permit the fchmod system call, to avoid crashing on startup when
+ starting with the seccomp2 sandbox and an unexpected set of
+ permissions on the data directory or its contents. Fixes bug
+ 22516; bugfix on 0.2.5.4-alpha.
+
+ o Minor bugfixes (defensive programming, backport from 0.3.1.4-alpha):
+ - Fix a memset() off the end of an array when packing cells. This
+ bug should be harmless in practice, since the corrupted bytes are
+ still in the same structure, and are always padding bytes,
+ ignored, or immediately overwritten, depending on compiler
+ behavior. Nevertheless, because the memset()'s purpose is to make
+ sure that any other cell-handling bugs can't expose bytes to the
+ network, we need to fix it. Fixes bug 22737; bugfix on
+ 0.2.4.11-alpha. Fixes CID 1401591.
+
+
Changes in version 0.3.0.8 - 2017-06-08
Tor 0.3.0.8 fixes a pair of bugs that would allow an attacker to
remotely crash a hidden service with an assertion failure. Anyone
@@ -538,7 +663,7 @@ Changes in version 0.3.0.6 - 2017-04-26
- Select 200 fallback directories for each release. Closes
ticket 20881.
- o Minor features (fingerprinting resistence, authentication):
+ o Minor features (fingerprinting resistance, 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.
@@ -3185,7 +3310,7 @@ Changes in version 0.2.7.5 - 2015-11-20
o Major bugfixes (hidden services):
- Revert commit that made directory authorities assign the HSDir
- flag to relay without a DirPort; this was bad because such relays
+ flag to relays without a DirPort; this was bad because such relays
can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
on 0.2.6.3-alpha.
- When cannibalizing a circuit for an introduction point, always
@@ -3800,7 +3925,7 @@ Changes in version 0.2.6.8 - 2015-05-21
o Major bugfixes (hidden services, backport from 0.2.7.1-alpha):
- Revert commit that made directory authorities assign the HSDir
- flag to relay without a DirPort; this was bad because such relays
+ flag to relays without a DirPort; this was bad because such relays
can't handle BEGIN_DIR cells. Fixes bug 15850; bugfix
on 0.2.6.3-alpha.
diff --git a/changes/15554 b/changes/15554
new file mode 100644
index 0000000000..c7ae7e5579
--- /dev/null
+++ b/changes/15554
@@ -0,0 +1,4 @@
+ o Minor features (testing):
+ - Add a unit test to verify that we can parse a hardcoded v2
+ hidden service descriptor. Closes ticket 15554.
+
diff --git a/changes/21148 b/changes/21148
new file mode 100644
index 0000000000..4e3c332279
--- /dev/null
+++ b/changes/21148
@@ -0,0 +1,4 @@
+ o Documentation:
+ - Restore documentation for the authorities' "approved-routers" file.
+ Closes ticket 21148.
+
diff --git a/changes/bug15645 b/changes/bug15645
new file mode 100644
index 0000000000..781d20e092
--- /dev/null
+++ b/changes/bug15645
@@ -0,0 +1,3 @@
+ o Documentation:
+ - Document all values of PublishServerDescriptor in the manpage.
+ Closes ticket 15645.
diff --git a/changes/bug16082 b/changes/bug16082
deleted file mode 100644
index 0f2f04fb35..0000000000
--- a/changes/bug16082
+++ /dev/null
@@ -1,4 +0,0 @@
- o Documentation:
- - Correctly note that bandwidth accounting values are stored in the
- state file, and the bw_accounting file is now obsolete. Closes
- ticket 16082.
diff --git a/changes/bug1667 b/changes/bug1667
new file mode 100644
index 0000000000..368f9e35b2
--- /dev/null
+++ b/changes/bug1667
@@ -0,0 +1,4 @@
+ o Minor features (control port):
+ - If the control port is used as the HTTP proxy, responds with
+ a meaningful "This is the Tor control port" message, and log
+ the event. Closes ticket 1667. Patch from Ravi Chandra Padmala.
diff --git a/changes/bug17639 b/changes/bug17639
new file mode 100644
index 0000000000..4073514fd4
--- /dev/null
+++ b/changes/bug17639
@@ -0,0 +1,4 @@
+ o Minor features:
+ - Add a new commandline option, --key-expiration, which prints when
+ the current signing key is going to expire. Implements ticket
+ 17639; patch by Isis Lovecruft.
diff --git a/changes/bug17750 b/changes/bug17750
new file mode 100644
index 0000000000..eb77b77ab0
--- /dev/null
+++ b/changes/bug17750
@@ -0,0 +1,4 @@
+ o Minor bugfixes (directory downloads):
+ - Make clients wait for 6 seconds before trying to download their
+ consensus from an authority.
+ Fixes bug 17750, bugfix on 0.2.8.1-alpha.
diff --git a/changes/bug18982 b/changes/bug18982
new file mode 100644
index 0000000000..bb0383d136
--- /dev/null
+++ b/changes/bug18982
@@ -0,0 +1,6 @@
+ o Minor bugfixes (circuit logging):
+ - torspec says hop counts are 1-based, so fix two log messages
+ that mistakenly logged 0-based hop counts.
+ Closes ticket 18982, bugfix on 0275b6876 in tor 0.2.6.2-alpha
+ and 907db008a in tor 0.2.4.5-alpha. Patch by teor.
+ Credit to Xiaofan Li for reporting this issue.
diff --git a/changes/bug19281 b/changes/bug19281
new file mode 100644
index 0000000000..1586ba34f3
--- /dev/null
+++ b/changes/bug19281
@@ -0,0 +1,5 @@
+ o Minor bugfixes (correctness, controller):
+ - Make the controller's write_escaped_data() function robust to extremely
+ long inputs. Right now, it doesn't actually receive any extremely
+ long inputs, so this is for defense in depth. Fixes bug 19281;
+ bugfix on 0.1.1.1-alpha. Reported by Guido Vranken.
diff --git a/changes/bug19418 b/changes/bug19418
new file mode 100644
index 0000000000..fb5f6ad5df
--- /dev/null
+++ b/changes/bug19418
@@ -0,0 +1,7 @@
+ o Minor bugfixes (robustness, error handling):
+ - Improve our handling of the cases where OpenSSL encounters a
+ memory error while encoding keys and certificates. We haven't
+ observed these happening in the wild, but if they do happen,
+ we now detect and respond better. Fixes bug 19418; bugfix
+ on all versions of Tor. Reported by Guido Vranken.
+
diff --git a/changes/bug19476 b/changes/bug19476
new file mode 100644
index 0000000000..25a0578686
--- /dev/null
+++ b/changes/bug19476
@@ -0,0 +1,3 @@
+ o Minor changes:
+ - If we fail to write a heartbeat message, schedule a retry for the minimum
+ heartbeat interval number of seconds in the future. Fixes bug 19476.
diff --git a/changes/bug19648 b/changes/bug19648
new file mode 100644
index 0000000000..e8c2a6a094
--- /dev/null
+++ b/changes/bug19648
@@ -0,0 +1,5 @@
+ o Minor bugfixes (logging):
+ - When logging the number of descriptors we intend to download per
+ directory request, do not log a number higher than then the
+ number of descriptors we're fetching in total. Fixes bug 19648;
+ bugfix on 0.1.1.8-alpha.
diff --git a/changes/bug19871 b/changes/bug19871
new file mode 100644
index 0000000000..5f1c9dc802
--- /dev/null
+++ b/changes/bug19871
@@ -0,0 +1,4 @@
+ o Code refactoring:
+ - Remove dead code for largely unused statistics on the number of
+ times we've attempted various public key operations. Fixes bug
+ 19871; fix by Isis Lovecruft. Bugfix on 0.1.2.4-alpha.
diff --git a/changes/bug20247 b/changes/bug20247
deleted file mode 100644
index 731cf0046f..0000000000
--- a/changes/bug20247
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor bugfixes (linux seccomp2 sandbox):
- - Avoid a sandbox failure when trying to re-bind to a socket and mark
- it as IPv6-only. Fixes bug 20247; bugfix on 0.2.5.1-alpha.
-
diff --git a/changes/bug22006 b/changes/bug22006
new file mode 100644
index 0000000000..912bdd87bd
--- /dev/null
+++ b/changes/bug22006
@@ -0,0 +1,4 @@
+ o Minor features (ed25519):
+ - Add validation function that checks for torsion components in ed25119
+ public keys. Currently unused but will be used by prop224 client-side
+ code. Addresses ticket #22006. Math help by Ian Goldberg.
diff --git a/changes/bug22212 b/changes/bug22212
deleted file mode 100644
index f92d6701d3..0000000000
--- a/changes/bug22212
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes (netflow padding logging):
- - Demote a warn that was caused by libevent delays to info if
- the padding is less than 4.5 seconds late, or notice if it is more
- (4.5 seconds is the amount of time that a netflow record might
- be emitted after, if we chose the maximum timeout). Fixes bug #22212.
diff --git a/changes/bug22286 b/changes/bug22286
new file mode 100644
index 0000000000..f72e8fe2c7
--- /dev/null
+++ b/changes/bug22286
@@ -0,0 +1,3 @@
+ o Minor features (tests):
+ - Add a couple more tests for compression backend initialization.
+ Closes ticket 22286.
diff --git a/changes/bug22347 b/changes/bug22347
deleted file mode 100644
index f294ba0a2d..0000000000
--- a/changes/bug22347
+++ /dev/null
@@ -1,2 +0,0 @@
- o Documentation:
- - Add a manpage description for the key-pinning-journal file.
diff --git a/changes/bug22349 b/changes/bug22349
deleted file mode 100644
index bb43404bfe..0000000000
--- a/changes/bug22349
+++ /dev/null
@@ -1,9 +0,0 @@
- o Minor bugfixes (directory authority):
- - When a directory authority rejects a descriptor or extrainfo with
- a given digest, mark that digest as undownloadable, so that we
- do not attempt to download it again over and over. We previously
- tried to avoid downloading such descriptors by other means, but
- we didn't notice if we accidentally downloaded one anyway. This
- behavior became problematic in 0.2.7.2-alpha, when authorities
- began pinning Ed25519 keys. Fixes ticket
- 22349; bugfix on 0.2.1.19-alpha.
diff --git a/changes/bug22356 b/changes/bug22356
deleted file mode 100644
index 0082b542be..0000000000
--- a/changes/bug22356
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes (logging, relay):
- - Downgrade "assigned_to_cpuworker failed" message to INFO-level
- severity. In every case that can reach it, either a better warning
- has already been logged, or no warning is warranted. Fixes bug 22356;
- bugfix on 0.2.6.3-alpha.
diff --git a/changes/bug22400_01 b/changes/bug22400_01
deleted file mode 100644
index 454c5f746f..0000000000
--- a/changes/bug22400_01
+++ /dev/null
@@ -1,4 +0,0 @@
- o Major bugfixes (entry guards):
- - When starting with an old consensus, do not add new entry guards
- unless the consensus is "reasonably live" (under 1 day old). Fixes
- one root cause of bug 22400; bugfix on 0.3.0.1-alpha.
diff --git a/changes/bug22410 b/changes/bug22410
new file mode 100644
index 0000000000..678a26dce6
--- /dev/null
+++ b/changes/bug22410
@@ -0,0 +1,4 @@
+ o Minor bugfixes (portability):
+ - Check at configure time whether uint8_t is unsigned char. Lots
+ of existing code already assumes this, and there could be strict
+ aliasing issues if they aren't the same type. Fixes #22410.
diff --git a/changes/bug22461 b/changes/bug22461
new file mode 100644
index 0000000000..5454682810
--- /dev/null
+++ b/changes/bug22461
@@ -0,0 +1,7 @@
+ o Minor bugfixes (client, usability):
+ - Refrain from needlessly rejecting SOCKS5-with-hostnames and SOCKS4a
+ requests that contain IP address strings, even when SafeSocks in
+ enabled, as this prevents user from connecting to known IP addresses
+ without relying on DNS for resolving. SafeSocks still rejects SOCKS
+ connections that connect to IP addresses when those addresses are _not_
+ encoded as hostnames. Fixes bug 22461, bugfix on Tor 0.2.6.2-alpha.
diff --git a/changes/bug22497 b/changes/bug22497
new file mode 100644
index 0000000000..8cde87ff79
--- /dev/null
+++ b/changes/bug22497
@@ -0,0 +1,4 @@
+ o Code simplification and refactoring:
+ - Use our test macros more consistently, to produce more useful
+ error messages when our unit tests fail. Add coccinelle patches
+ to allow us to re-check for test macro uses. Closes ticket 22497.
diff --git a/changes/bug22502_part1 b/changes/bug22502_part1
deleted file mode 100644
index bd95b7c7c4..0000000000
--- a/changes/bug22502_part1
+++ /dev/null
@@ -1,12 +0,0 @@
- o Major bugfixes (compression, zstd):
- - Correctly detect a full buffer when decompessing a large
- zstd-compressed input. Fixes bug 22628; bugfix on 0.3.1.1-alpha.
-
- o Minor bugfixes (compression):
- - When compressing or decompressing a buffer, check for a failure to
- create a compression object. Fixes bug 22626; bugfix on
- 0.3.1.1-alpha.
-
- - When decompressing a buffer, check for extra data after the end of
- the compressed data. Fixes bug 22629; bugfix on 0.3.1.1-alpha.
-
diff --git a/changes/bug22516 b/changes/bug22516
deleted file mode 100644
index f024a3c470..0000000000
--- a/changes/bug22516
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes (linux seccomp2 sandbox):
- - Permit the fchmod system call, to avoid crashing on startup when
- starting with the seccomp2 sandbox and an unexpected set of permissions
- on the data directory or its contents. Fixes bug 22516; bugfix on
- 0.2.5.4-alpha.
diff --git a/changes/bug22520 b/changes/bug22520
deleted file mode 100644
index cc14f7214c..0000000000
--- a/changes/bug22520
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes (error reporting, windows):
- - When formatting Windows error messages, use the English format
- to avoid codepage issues. Fixes bug 22520; bugfix on
- 0.1.2.8-alpha. Patch from "Vort".
-
diff --git a/changes/bug22636 b/changes/bug22636
deleted file mode 100644
index 770cac72e9..0000000000
--- a/changes/bug22636
+++ /dev/null
@@ -1,8 +0,0 @@
- o Build features:
- - Tor's repository now includes a Travis Continuous Integration (CI)
- configuration file (.travis.yml). This is meant to help new developers and
- contributors who fork Tor to a Github repository be better able to test
- their changes, and understand what we expect to pass. To use this new build
- feature, you must fork Tor to your Github account, then go into the
- "Integrations" menu in the repository settings for your fork and enable
- Travis, then push your changes.
diff --git a/changes/bug22669 b/changes/bug22669
deleted file mode 100644
index 804a39e781..0000000000
--- a/changes/bug22669
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor bugfixes (compression):
- - When serving directory votes compressed with zlib,
- do not claim to have compressed them with zstd. Fixes bug 22669;
- bugfix on 0.3.1.1-alpha.
diff --git a/changes/bug22670 b/changes/bug22670
deleted file mode 100644
index 47403277d2..0000000000
--- a/changes/bug22670
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor bugfixes (logging, compression):
- - When decompressing, do not warn if we fail to decompress using a
- compression method that we merely guessed. Fixes part of
- bug 22670; bugfix on 0.1.1.14-alpha.
diff --git a/changes/bug22670_02 b/changes/bug22670_02
deleted file mode 100644
index 3e7a428faf..0000000000
--- a/changes/bug22670_02
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor bugfixes (logging, compression):
- - When decompressing, treat mismatch between content-encoding and
- actual compression type as a protocol warning. Fixes part of bug
- 22670; bugfix on 0.1.1.9-alpha.
diff --git a/changes/bug22670_03 b/changes/bug22670_03
deleted file mode 100644
index 8a7aa49bcd..0000000000
--- a/changes/bug22670_03
+++ /dev/null
@@ -1,6 +0,0 @@
- o Minor bugfixes (compression):
- - When decompressing an object received over an anonymous directory
- connection, if we have already successfully decompressed it using an
- acceptable compression method, do not reject it for looking like an
- unacceptable compression method. Fixes part of bug 22670; bugfix on
- 0.3.1.1-alpha.
diff --git a/changes/bug22672 b/changes/bug22672
deleted file mode 100644
index ec6681149d..0000000000
--- a/changes/bug22672
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor features (compression, defensive programming):
- - Detect and break out of infinite loops in our compression code.
- We don't think that any such loops exist now, but it's best to be
- safe. Closes ticket 22672.
-
diff --git a/changes/bug22677 b/changes/bug22677
new file mode 100644
index 0000000000..6d750172a9
--- /dev/null
+++ b/changes/bug22677
@@ -0,0 +1,3 @@
+ o Documentation:
+ - Clarify in the manual that "Sandbox 1" is only supported on Linux
+ kernels. Closes ticket 22677.
diff --git a/changes/bug22702 b/changes/bug22702
deleted file mode 100644
index a2044c70bf..0000000000
--- a/changes/bug22702
+++ /dev/null
@@ -1,5 +0,0 @@
- o Major bugfixes (directory protocol):
- - Ensure that we sent "304 Not modified" as HTTP status code when a
- client is attempting to fetch a consensus or consensus diff that
- matches the latest consensus we have available. Fixes bug 22702;
- bugfix on 0.3.1.1-alpha.
diff --git a/changes/bug22719 b/changes/bug22719
deleted file mode 100644
index bfcda0a4e1..0000000000
--- a/changes/bug22719
+++ /dev/null
@@ -1,7 +0,0 @@
- o Minor bugfixes (compression):
- - When spooling compressed data to an output buffer, don't try to
- spool more data when there is no more data to spool and we are
- not trying to flush the input. Previously, we would sometimes
- launch compression requests with nothing to do, which interferes
- with our 22672 checks. Fixes bug 22719; bugfix on 0.2.0.16-alpha.
-
diff --git a/changes/bug22720 b/changes/bug22720
deleted file mode 100644
index 4893b577f0..0000000000
--- a/changes/bug22720
+++ /dev/null
@@ -1,9 +0,0 @@
- o Minor bugfixes (process behavior):
- - When exiting because of an error, always exit with a nonzero
- exit status. Previously, we would fail to report an error in
- our exit status in cases related to lockfile contention,
- __OwningControllerProcess failure, and Ed25519 key
- initialization. Fixes bug 22720; bugfix on versions
- 0.2.1.6-alpha, 0.2.2.28-beta, and 0.2.7.2-alpha
- respectively. Reported by "f55jwk4f"; patch from "huyvq".
-
diff --git a/changes/bug22737 b/changes/bug22737
deleted file mode 100644
index f0de8e6c41..0000000000
--- a/changes/bug22737
+++ /dev/null
@@ -1,12 +0,0 @@
- o Minor bugfixes (defensive programming, undefined behavior):
-
- - Fix a memset() off the end of an array when packing cells. This
- bug should be harmless in practice, since the corrupted bytes
- are still in the same structure, and are always padding bytes,
- ignored, or immediately overwritten, depending on compiler
- behavior. Nevertheless, because the memset()'s purpose is to
- make sure that any other cell-handling bugs can't expose bytes
- to the network, we need to fix it. Fixes bug 22737; bugfix on
- 0.2.4.11-alpha. Fixes CID 1401591.
-
-
diff --git a/changes/bug22746 b/changes/bug22746
new file mode 100644
index 0000000000..b036460c30
--- /dev/null
+++ b/changes/bug22746
@@ -0,0 +1,4 @@
+ o Minor bugfixes (crypto):
+ - Properly detect and refuse to blind bad ed25519 keys. The key blinding
+ code is currently unused, so this bug does not affect tor clients or
+ services on the network. Fixes bug 22746; bugfix on 0.2.6.1-alpha.
diff --git a/changes/bug22750 b/changes/bug22750
new file mode 100644
index 0000000000..426cae6f1e
--- /dev/null
+++ b/changes/bug22750
@@ -0,0 +1,5 @@
+ o Minor bugfixes (linux seccomp2 sandbox, logging):
+ - Fix some messages on unexpected errors from the seccomp2
+ library. Fixes bug 22750; bugfix on 0.2.5.1-alpha. Patch
+ from "cypherpunks".
+
diff --git a/changes/bug22751 b/changes/bug22751
deleted file mode 100644
index 714525c8af..0000000000
--- a/changes/bug22751
+++ /dev/null
@@ -1,5 +0,0 @@
- o Major bugfixes (compression):
- - Fix crash in LZMA module, when the Sandbox is enabled, where
- liblzma would allocate more than 16 MB of memory. We solve this
- by bumping the mprotect() limit in the Sandbox module from 16 MB
- to 20 MB. Fixes bug 22751; bugfix on 0.3.1.1-alpha.
diff --git a/changes/bug22753 b/changes/bug22753
deleted file mode 100644
index 32a6dfa56c..0000000000
--- a/changes/bug22753
+++ /dev/null
@@ -1,7 +0,0 @@
- o Major bugfixes (path selection, security):
- - When choosing which guard to use for a circuit, avoid the
- exit's family along with the exit itself. Previously, the new
- guard selection logic avoided the exit, but did not consider
- its family. Fixes bug 22753; bugfix on 0.3.0.1-alpha. Tracked
- as TROVE-2016-006 and CVE-2017-0377.
-
diff --git a/changes/bug22779 b/changes/bug22779
new file mode 100644
index 0000000000..dc5bc3859c
--- /dev/null
+++ b/changes/bug22779
@@ -0,0 +1,4 @@
+ o Minor features (client, entry guards):
+ - Add an extra check to make sure that we always use the
+ new guard selection code for picking our guards. Closes
+ ticket 22779.
diff --git a/changes/bug22789 b/changes/bug22789
deleted file mode 100644
index a653592848..0000000000
--- a/changes/bug22789
+++ /dev/null
@@ -1,7 +0,0 @@
- o Major bugfixes (openbsd, denial-of-service):
- - Avoid an assertion failure bug affecting our implementation of
- inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
- handling of "0xfoo" differs from what we had expected.
- Fixes bug 22789; bugfix on 0.2.3.8-alpha. Also tracked as
- TROVE-2017-007.
-
diff --git a/changes/bug22797 b/changes/bug22797
deleted file mode 100644
index 619baaa409..0000000000
--- a/changes/bug22797
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor bugfixes (file limits):
- - When setting the maximum number of connections allowed by the OS,
- always allow some extra file descriptors for other files.
- Fixes bug 22797; bugfix on 0.2.0.10-alpha.
diff --git a/changes/bug22801 b/changes/bug22801
deleted file mode 100644
index 7edc79bc84..0000000000
--- a/changes/bug22801
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes (compilation):
- - When building with certain versions the mingw C header files, avoid
- float-conversion warnings when calling the C functions isfinite(),
- isnan(), and signbit(). Fixes bug 22801; bugfix on 0.2.8.1-alpha.
-
diff --git a/changes/bug22802 b/changes/bug22802
new file mode 100644
index 0000000000..7255164fd4
--- /dev/null
+++ b/changes/bug22802
@@ -0,0 +1,10 @@
+ o Minor bugfixes (format strictness):
+ - Restrict several data formats to decimal. Previously, the
+ BuildTimeHistogram entries in the state file, the "bw=" entries in the
+ bandwidth authority file, and process IDs passed to the
+ __OwningControllerProcess option could all be specified in hex or octal
+ as well as in decimal. This was not an intentional feature.
+ Fixes bug 22802; bugfixes on 0.2.2.1-alpha, 0.2.2.2-alpha, and
+ 0.2.2.28-beta.
+
+
diff --git a/changes/bug22803 b/changes/bug22803
deleted file mode 100644
index 80b4b9f589..0000000000
--- a/changes/bug22803
+++ /dev/null
@@ -1,3 +0,0 @@
- o Minor bugfixes (unit tests):
- - Fix a memory leak in the link-handshake/certs_ok_ed25519 test.
- Fixes bug 22803; bugfix on 0.3.0.1-alpha.
diff --git a/changes/bug22830 b/changes/bug22830
deleted file mode 100644
index 123b725aff..0000000000
--- a/changes/bug22830
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes:
- - Fix a problem with Rust toolchains not being found when building
- without --enable-cargo-online-mode, due to setting the $HOME
- environment variable instead of $CARGO_HOME. Fixes bug 22830;
- fix by Chelsea Komlo. Bugfix on 0.3.1.1-alpha.
diff --git a/changes/bug22883-config b/changes/bug22883-config
deleted file mode 100644
index d60594d9ae..0000000000
--- a/changes/bug22883-config
+++ /dev/null
@@ -1,7 +0,0 @@
- o Minor features (directory cache, consensus diff):
- - Add a new MaxConsensusAgeForDiffs option to allow directory cache
- operators with low-resource environments to adjust the number of
- consensuses they'll store and generate diffs from. Most cache operators
- should leave it unchanged. Helps to work around bug 22883.
-
-
diff --git a/changes/bug22883-priority b/changes/bug22883-priority
deleted file mode 100644
index 4b3531c30b..0000000000
--- a/changes/bug22883-priority
+++ /dev/null
@@ -1,8 +0,0 @@
- o Major bugfixes (relay, performance):
-
- - Perform circuit handshake operations at a higher priority than we use
- for consensus diff creation and compression. This should prevent
- circuits from starving when a relay or bridge receive a new consensus,
- especially on lower-powered machines. Fixes bug 22883; bugfix on
- 0.3.1.1-alpha.
-
diff --git a/changes/bug22885 b/changes/bug22885
new file mode 100644
index 0000000000..d95e879eb8
--- /dev/null
+++ b/changes/bug22885
@@ -0,0 +1,5 @@
+ o Minor bugfixes (relay):
+ - When uploading our descriptor for the first time after startup,
+ report the reason for uploading as "Tor just started" rather than
+ leaving it blank. Fixes bug 22885; bugfix on 0.2.3.4-alpha.
+
diff --git a/changes/bug22892 b/changes/bug22892
deleted file mode 100644
index 9a70cb0576..0000000000
--- a/changes/bug22892
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor bugfixes (compilation):
- - Compile correctly when both openssl 1.1.0 and libscrypt are detected.
- Previously this would cause an error. Fixes bug 22892; bugfix on
- 0.3.1.1-alpha.
diff --git a/changes/bug22915 b/changes/bug22915
deleted file mode 100644
index 17a9c6018f..0000000000
--- a/changes/bug22915
+++ /dev/null
@@ -1,3 +0,0 @@
- o Minor bugfixes (compilation warnings):
- - Suppress -Wdouble-promotion warnings with clang 4.0. Fixes bug 22915;
- bugfix on 0.2.8.1-alpha.
diff --git a/changes/bug22916_027 b/changes/bug22916_027
deleted file mode 100644
index 5cf99c7d15..0000000000
--- a/changes/bug22916_027
+++ /dev/null
@@ -1,3 +0,0 @@
- o Minor bugfixes (Compilation):
- - Fix warnings when building with libscrypt and openssl scrypt support
- on Clang. Fixes bug 22916; bugfix on 0.2.7.2-alpha.
diff --git a/changes/bug22924 b/changes/bug22924
new file mode 100644
index 0000000000..e59fc724eb
--- /dev/null
+++ b/changes/bug22924
@@ -0,0 +1,4 @@
+ o Minor bugfies (tests):
+ - Fix a signed-integer overflow in the unit tests for
+ dir/download_status_random_backoff, which was untriggered until we
+ fixed bug 17750. Fixes bug 22924; bugfix on 0.2.9.1-alpha.
diff --git a/changes/bug22927 b/changes/bug22927
deleted file mode 100644
index 6e68e6ff08..0000000000
--- a/changes/bug22927
+++ /dev/null
@@ -1,6 +0,0 @@
- o Minor bugfixes (compatibility, zstd):
- - Write zstd epilogues correctly when the epilogue requires reallocation
- of the output buffer, even with zstd 1.3.0. (Previously,
- we worked on 1.2.0 and failed with 1.3.0). Fixes bug 22927; bugfix on
- 0.3.1.1-alpha.
-
diff --git a/changes/bug23026 b/changes/bug23026
new file mode 100644
index 0000000000..b00745cfa3
--- /dev/null
+++ b/changes/bug23026
@@ -0,0 +1,4 @@
+ o Code simplification and refactoring:
+ - Rename the obsolete malleable hybrid_encrypt functions used in
+ TAP and old hidden services to indicate that they aren't suitable
+ for new protocols or formats. Closes ticket 23026.
diff --git a/changes/bug23030_029 b/changes/bug23030_029
deleted file mode 100644
index 89a1b507d7..0000000000
--- a/changes/bug23030_029
+++ /dev/null
@@ -1,7 +0,0 @@
- o Minor bugfixes (coverity builds):
- - Avoid Coverity build warnings related to our BUG() macro. By
- default, Coverity treats BUG() as the Linux kernel does: an
- instant abort(). We need to override that so our BUG() macro
- doesn't prevent Coverity from analyzing functions that use it.
- Fixes bug 23030; bugfix on 0.2.9.1-alpha.
-
diff --git a/changes/bug23053 b/changes/bug23053
deleted file mode 100644
index 082e239409..0000000000
--- a/changes/bug23053
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes (memory leak):
- - Fix a small memory leak when validating a configuration that
- uses two or more AF_UNIX sockets for the same port type.
- Fixes bug 23053; bugfix on 0.2.6.3-alpha. This is CID
- 1415725.
diff --git a/changes/bug23054 b/changes/bug23054
new file mode 100644
index 0000000000..39006cd807
--- /dev/null
+++ b/changes/bug23054
@@ -0,0 +1,4 @@
+ o Minor features (static analysis):
+ - The BUG() macro has been changed slightly so that Coverity no
+ longer complains about dead code if the bug is impossible. Closes
+ ticket 23054.
diff --git a/changes/bug23055 b/changes/bug23055
new file mode 100644
index 0000000000..eee1397c13
--- /dev/null
+++ b/changes/bug23055
@@ -0,0 +1,4 @@
+ o Minor bugfixes (certificate handling):
+ - Fix a time handling bug in Tor certificates set to expire after
+ the year 2106. Fixes bug 23055; bugfix on 0.3.0.1-alpha.
+ Found by Coverity as CID 1415728.
diff --git a/changes/bug23071 b/changes/bug23071
new file mode 100644
index 0000000000..4756dd6252
--- /dev/null
+++ b/changes/bug23071
@@ -0,0 +1,5 @@
+ o Minor bugfixes (tests):
+ - Port the hs_ntor handshake test to work correctly with recent
+ versions of the pysha3 module. Fixes bug 23071; bugfix on
+ 0.3.1.1-alpha.
+
diff --git a/changes/bug23078 b/changes/bug23078
new file mode 100644
index 0000000000..67624007cf
--- /dev/null
+++ b/changes/bug23078
@@ -0,0 +1,7 @@
+ o Minor bugfixes (logging, relay):
+ - Remove a log_warn() that has been forgotten when an introduction point
+ successfully established a hidden service prop224 circuit with a client.
+ - Three other log_warn() for an introduction point have been changed to
+ protocol warning because they can be failure from the network and are
+ not relevant to the operator. Fixes bug 23078; bugfix on
+ tor-0.3.0.1-alpha and tor-0.3.0.2-alpha.
diff --git a/changes/bug23081 b/changes/bug23081
new file mode 100644
index 0000000000..76c4e30971
--- /dev/null
+++ b/changes/bug23081
@@ -0,0 +1,8 @@
+ o Minor bugfixes (Windows service):
+ - When running as a Windows service, set the ID of the main thread
+ correctly. Failure to do so made us fail to send log messages
+ to the controller in 0.2.1.16-rc, slowed down controller
+ event delivery in 0.2.7.3-rc and later, and crash with an assertion
+ failure in 0.3.1.1-alpha. Fixes bug 23081; bugfix on 0.2.1.6-alpha.
+ Patch and diagnosis from "Vort".
+
diff --git a/changes/bug23091 b/changes/bug23091
new file mode 100644
index 0000000000..7dfb7e4180
--- /dev/null
+++ b/changes/bug23091
@@ -0,0 +1,6 @@
+ o Minor bugfixes (consensus expiry):
+ - Tor would reconsider updating its directory information every 2 minutes
+ instead of only doing it for a consensus that is more than 24 hours old
+ (badly expired). This specific check is done in the tor main loop
+ callback that validates if we have an expired consensus. Fixes bug
+ 23091; bugfix on tor-0.2.0.19-alpha.
diff --git a/changes/bug23098 b/changes/bug23098
new file mode 100644
index 0000000000..2075f13ba7
--- /dev/null
+++ b/changes/bug23098
@@ -0,0 +1,4 @@
+ o Minor bugfixes (portability):
+ - Stop using the PATH_MAX variable. The variable is not defined in
+ GNU Hurd which prevents Tor from being built. Fixes bug 23098;
+ bugfix on 0.3.1.1-alpha.
diff --git a/changes/bug23106 b/changes/bug23106
new file mode 100644
index 0000000000..d4ced15f82
--- /dev/null
+++ b/changes/bug23106
@@ -0,0 +1,5 @@
+ o Minor bugfixes (code correctness):
+ - Call htons() in extend_cell_format() for encoding a 16-bit
+ value. Previously we used ntohs(), which happens to behave the
+ same on all the platforms we support, but which isn't really
+ correct. Fixes bug 23106; bugfix on 0.2.4.8-alpha.
diff --git a/changes/bug23139 b/changes/bug23139
new file mode 100644
index 0000000000..ed63ce85e2
--- /dev/null
+++ b/changes/bug23139
@@ -0,0 +1,3 @@
+ o Minor bugfixes (directory cache):
+ - Fix a memory leak in the code that recovers space in the consensus
+ directory cache. Fixes bug 23139; bugfix on 0.3.1.1-alpha.
diff --git a/changes/bug23155 b/changes/bug23155
new file mode 100644
index 0000000000..4c24ab136c
--- /dev/null
+++ b/changes/bug23155
@@ -0,0 +1,4 @@
+ o Minor bugfixes (stability):
+ - Avoid crashing on double-free when unable to load or process
+ an included file. Fixes bug 23155; bugfix on 0.3.1.1-alpha.
+ Found with the clang static analyzer.
diff --git a/changes/bug23220 b/changes/bug23220
new file mode 100644
index 0000000000..9c2efc959a
--- /dev/null
+++ b/changes/bug23220
@@ -0,0 +1,7 @@
+ o Minor features (client directory bandwidth tuning):
+
+ - When downloading (micro)descriptors, don't split the list of
+ descriptors into multiple requests unless there are at least 32
+ descriptors that we want. Previously, we split at 4, not 32, which
+ could lead to significant overhead in HTTP request size and
+ degradation in compression performance. Closes ticket 23220.
diff --git a/changes/bug23233 b/changes/bug23233
new file mode 100644
index 0000000000..689a99a2a8
--- /dev/null
+++ b/changes/bug23233
@@ -0,0 +1,4 @@
+ o Minor bugfixes (hidden service):
+ - Fix a BUG alert during HSv3 descriptor decoding that could trigger with a
+ specially crafted descriptor. Fixes bug #23233; bugfix on 0.3.0.1-alpha.
+ Bug found by "haxxpop".
diff --git a/changes/bug23291 b/changes/bug23291
new file mode 100644
index 0000000000..a5b0efda0a
--- /dev/null
+++ b/changes/bug23291
@@ -0,0 +1,3 @@
+ o Minor bugfixes (testing):
+ - Fix an undersized buffer in test-memwipe.c. Fixes bug 23291; bugfix on
+ 0.2.7.2-alpha. Found and patched by Ties Stuij.
diff --git a/changes/bug3056 b/changes/bug3056
new file mode 100644
index 0000000000..62bec20d51
--- /dev/null
+++ b/changes/bug3056
@@ -0,0 +1,3 @@
+ o Minor features (exit relay, DNS):
+ - Improve the clarity and safety of the log message from evdns when
+ receiving an apparent spoofed DNS reply. Closes ticket 3056.
diff --git a/changes/bug4019 b/changes/bug4019
new file mode 100644
index 0000000000..fef736ff66
--- /dev/null
+++ b/changes/bug4019
@@ -0,0 +1,4 @@
+ o Minor bugfixes (logging):
+ - Remove duplicate log messages regarding opening non-local SocksPorts
+ upon parsing config and opening listeners at startup. Fixes bug 4019;
+ bugfix on tor-0.2.3.3-alpha.
diff --git a/changes/bug5847 b/changes/bug5847
new file mode 100644
index 0000000000..782fc7b721
--- /dev/null
+++ b/changes/bug5847
@@ -0,0 +1,5 @@
+ o Minor features (control port):
+ - Provide better error message for GETINFO desc/(id|name) when
+ microdescriptors are in use and router descriptors are not fetched.
+ Closes ticket 5847. Patch by Kevin Butler.
+
diff --git a/changes/bug7890 b/changes/bug7890
new file mode 100644
index 0000000000..1daec58ae2
--- /dev/null
+++ b/changes/bug7890
@@ -0,0 +1,4 @@
+ o Minor bugfixes (logging):
+ - Use a more comprehensible log message when telling the user they've
+ excluded every running exit node. Fixes bug 7890; bugfix on
+ 0.2.2.25-alpha.
diff --git a/changes/diagnose_22752 b/changes/diagnose_22752
deleted file mode 100644
index b5bda05ec0..0000000000
--- a/changes/diagnose_22752
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor features (bug mitigation, diagnostics, logging):
- - Avoid an assertion failure, and log a better error message,
- when unable to remove a file from the consensus cache on
- Windows. Attempts to mitigate and diagnose bug 22752.
diff --git a/changes/doc20152 b/changes/doc20152
new file mode 100644
index 0000000000..8b044e56df
--- /dev/null
+++ b/changes/doc20152
@@ -0,0 +1,3 @@
+ o Documentation:
+ - Improve the documentation for the directory port part of the
+ DirAuthority line. Closes ticket 20152.
diff --git a/changes/feature22976 b/changes/feature22976
new file mode 100644
index 0000000000..407fd15b0a
--- /dev/null
+++ b/changes/feature22976
@@ -0,0 +1,8 @@
+ o Minor features (integration, hardening):
+ - Added a new NoExec option, to prevent Tor from running
+ other programs. When this option is set to 1,
+ Tor will never try to run another program, regardless of
+ the settings of PortForwardingHelper, ClientTransportPlugin,
+ or ServerTransportPlugin. Once NoExec is set, it cannot be
+ disabled without restarting Tor.
+ Closes ticket 22976.
diff --git a/changes/geoip-august2017 b/changes/geoip-august2017
new file mode 100644
index 0000000000..2dab18a63f
--- /dev/null
+++ b/changes/geoip-august2017
@@ -0,0 +1,4 @@
+ o Minor features:
+ - Update geoip and geoip6 to the August 3 2017 Maxmind GeoLite2
+ Country database.
+
diff --git a/changes/geoip-june2017 b/changes/geoip-june2017
deleted file mode 100644
index 2ea7bf105e..0000000000
--- a/changes/geoip-june2017
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor features:
- - Update geoip and geoip6 to the June 8 2017 Maxmind GeoLite2
- Country database.
-
diff --git a/changes/more-files b/changes/more-files
deleted file mode 100644
index 861d6a3143..0000000000
--- a/changes/more-files
+++ /dev/null
@@ -1,4 +0,0 @@
- o Documentation:
- - Document more of the files in the Tor data directory, including
- cached-extrainfo, secret_onion_key{,_ntor}.old, hidserv-stats,
- approved-routers, sr-random, and diff-cache.
diff --git a/changes/more-threads b/changes/more-threads
deleted file mode 100644
index eae88b70fd..0000000000
--- a/changes/more-threads
+++ /dev/null
@@ -1,3 +0,0 @@
- o Minor features (relay, performance):
- - Always start relays with at least two worker threads, to prevent
- priority inversion on slow tasks. Part of the fix for bug 22883.
diff --git a/changes/multi-priority b/changes/multi-priority
deleted file mode 100644
index 6f19314b53..0000000000
--- a/changes/multi-priority
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor features (relay, thread pool):
- - Allow background work to be queued with different priorities, so
- that a big pile of slow low-priority jobs will not starve out
- higher priority jobs. This lays the groundwork for a fix for bug
- 22883.
diff --git a/changes/new_requirement_pkgconfig b/changes/new_requirement_pkgconfig
deleted file mode 100644
index 503ff58c9e..0000000000
--- a/changes/new_requirement_pkgconfig
+++ /dev/null
@@ -1,5 +0,0 @@
- o New dependencies:
- - To build with zstd and lzma support, Tor now requires the
- pkg-config tool at build time. (This requirement was new in
- 0.3.1.1-alpha, but was not noted at the time. Noting it here to
- close ticket 22623.)
diff --git a/changes/task-22207 b/changes/task-22207
deleted file mode 100644
index 63544834bf..0000000000
--- a/changes/task-22207
+++ /dev/null
@@ -1,4 +0,0 @@
- o Minor features:
- - Add "fingerprint" line to networkstatus-bridges produced by
- bridge authorities. Implements #22207.
-
diff --git a/changes/ticket20488 b/changes/ticket20488
new file mode 100644
index 0000000000..ad1b874372
--- /dev/null
+++ b/changes/ticket20488
@@ -0,0 +1,5 @@
+ o Minor features (logging, UI):
+ - Improve the warning message for specifying a relay by nickname.
+ The previous message implied that nickname registration was still
+ part of the Tor network design, which it isn't. Closes ticket 20488.
+
diff --git a/changes/ticket20575 b/changes/ticket20575
new file mode 100644
index 0000000000..bfbf03f6b6
--- /dev/null
+++ b/changes/ticket20575
@@ -0,0 +1,4 @@
+ o Deprecation (config):
+ - Deprecate HTTPProxy/HTTPProxyAuthenticator config options. It only
+ applies to direct unencrypted HTTP connections to your directory server,
+ which your Tor probably isn't using. Fixes bug 20575.
diff --git a/changes/ticket22311 b/changes/ticket22311
new file mode 100644
index 0000000000..0bfd465f83
--- /dev/null
+++ b/changes/ticket22311
@@ -0,0 +1,3 @@
+ o Code simplification and refactoring:
+ - Remove several now-obsolete functions for asking about old variants
+ directory authority status. Closes ticket 22311; patch from "huyvq".
diff --git a/changes/ticket22521 b/changes/ticket22521
new file mode 100644
index 0000000000..15a6218fa7
--- /dev/null
+++ b/changes/ticket22521
@@ -0,0 +1,3 @@
+ o Code simplification and refactoring:
+ - Replace our STRUCT_OFFSET() macro with offsetof(). Closes
+ ticket 22521. Patch from Neel Chauhan.
diff --git a/changes/ticket22608 b/changes/ticket22608
new file mode 100644
index 0000000000..5aa9db27f1
--- /dev/null
+++ b/changes/ticket22608
@@ -0,0 +1,6 @@
+ o Code simplification and refactoring:
+ - Extract the code for handling newly-open channels into a separate
+ function from the general code to handle channel state transitions.
+ This change simplifies our callgraph, reducing the size of the largest
+ strongly connected component by roughly a factor of two.
+ Closes ticket 22608
diff --git a/changes/ticket22684 b/changes/ticket22684
new file mode 100644
index 0000000000..f1d9d21abb
--- /dev/null
+++ b/changes/ticket22684
@@ -0,0 +1,5 @@
+ o Minor features (control):
+ - Add GETINFO desc/download-enabled and md/download-enabled, to
+ inform the controller whether try to download router descriptors
+ and microdescriptors respectively. Closes ticket 22684.
+
diff --git a/changes/ticket22750 b/changes/ticket22750
new file mode 100644
index 0000000000..6bc1fb2639
--- /dev/null
+++ b/changes/ticket22750
@@ -0,0 +1,3 @@
+ o Minor bugfixes (logging, sandbox):
+ - Use the correct system call in sandbox error messages. Fixes bug
+ 22750; bugfix on 0.2.5.1-alpha.
diff --git a/changes/ticket22804 b/changes/ticket22804
new file mode 100644
index 0000000000..a5d71c5120
--- /dev/null
+++ b/changes/ticket22804
@@ -0,0 +1,4 @@
+ o Code simplification and refactoring:
+
+ - Split the enormous circuit_send_next_onion_skin() function into
+ multiple subfunctions. Closes ticket 22804.
diff --git a/changes/ticket22870 b/changes/ticket22870
deleted file mode 100644
index 07cc8a1d04..0000000000
--- a/changes/ticket22870
+++ /dev/null
@@ -1,5 +0,0 @@
- o Minor bugfixes (consensus diff):
- - test_consdiff_base64cmp would fail on OS X because while OS X
- follows the standard of (less than zero/zero/greater than zero),
- it doesn't follow the convention of (-1/0/+1). Make the test
- comply with the standard. Fixes bug 22870; bugfix on 0.3.1.1-alpha.
diff --git a/changes/ticket22895 b/changes/ticket22895
new file mode 100644
index 0000000000..a3f7b86019
--- /dev/null
+++ b/changes/ticket22895
@@ -0,0 +1,3 @@
+ o Minor bugfixes (compilation):
+ - Fix unused variable warnings in donna's Curve25519 SSE2 code.
+ Fixes bug 22895; bugfix on 0.2.7.2-alpha.
diff --git a/configure.ac b/configure.ac
index 90173fdbbe..1e41b3f080 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@ dnl Copyright (c) 2007-2017, The Tor Project, Inc.
dnl See LICENSE for licensing information
AC_PREREQ([2.63])
-AC_INIT([tor],[0.3.1.5-alpha])
+AC_INIT([tor],[0.3.2.0-alpha-dev])
AC_CONFIG_SRCDIR([src/or/main.c])
AC_CONFIG_MACRO_DIR([m4])
@@ -258,64 +258,6 @@ dnl List all external rust crates we depend on here. Include the version
rust_crates="libc-0.2.22"
AC_SUBST(rust_crates)
-if test "x$enable_rust" = "xyes"; then
- AC_ARG_VAR([RUSTC], [path to the rustc binary])
- AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
- if test "x$RUSTC" = "xno"; then
- AC_MSG_ERROR([rustc unavailable but rust integration requested.])
- fi
-
- AC_ARG_VAR([CARGO], [path to the cargo binary])
- AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
- if test "x$CARGO" = "xno"; then
- AC_MSG_ERROR([cargo unavailable but rust integration requested.])
- fi
-
- AC_DEFINE([HAVE_RUST], 1, [have Rust])
- if test "x$enable_cargo_online_mode" = "xyes"; then
- CARGO_ONLINE=
- RUST_DL=#
- else
- CARGO_ONLINE=--frozen
- RUST_DL=
-
- dnl When we're not allowed to touch the network, we need crate dependencies
- dnl locally available.
- AC_MSG_CHECKING([rust crate dependencies])
- AC_ARG_VAR([RUST_DEPENDENCIES], [path to directory with local crate mirror])
- if test "x$RUST_DEPENDENCIES" = "x"; then
- RUST_DEPENDENCIES="$srcdir/src/ext/rust/"
- NEED_MOD=1
- fi
- if test ! -d "$RUST_DEPENDENCIES"; then
- AC_MSG_ERROR([Rust dependency directory $RUST_DEPENDENCIES does not exist. Specify a dependency directory using the RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
- fi
- for dep in $rust_crates; do
- if test ! -d "$RUST_DEPENDENCIES"/"$dep"; then
- AC_MSG_ERROR([Failure to find rust dependency $RUST_DEPENDENCIES/$dep. Specify a dependency directory using the RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
- fi
- done
- if test "x$NEED_MOD" = "x1"; then
- dnl When looking for dependencies from cargo, pick right directory
- RUST_DEPENDENCIES="../../src/ext/rust"
- fi
- fi
-
- AC_SUBST(CARGO_ONLINE)
- AC_SUBST(RUST_DL)
-
-dnl Let's check the rustc version, too
- AC_MSG_CHECKING([rust version])
- RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
- RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
- if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
- AC_MSG_ERROR([rustc version couldn't be identified])
- fi
- if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 14; then
- AC_MSG_ERROR([rustc must be at least version 1.14])
- fi
-fi
-
ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
AC_C_FLEXIBLE_ARRAY_MEMBER
], [
@@ -451,6 +393,73 @@ fi
AC_C_BIGENDIAN
+if test "x$enable_rust" = "xyes"; then
+ AC_ARG_VAR([RUSTC], [path to the rustc binary])
+ AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
+ if test "x$RUSTC" = "xno"; then
+ AC_MSG_ERROR([rustc unavailable but rust integration requested.])
+ fi
+
+ AC_ARG_VAR([CARGO], [path to the cargo binary])
+ AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
+ if test "x$CARGO" = "xno"; then
+ AC_MSG_ERROR([cargo unavailable but rust integration requested.])
+ fi
+
+ AC_DEFINE([HAVE_RUST], 1, [have Rust])
+ if test "x$enable_cargo_online_mode" = "xyes"; then
+ CARGO_ONLINE=
+ RUST_DL=#
+ else
+ CARGO_ONLINE=--frozen
+ RUST_DL=
+
+ dnl When we're not allowed to touch the network, we need crate dependencies
+ dnl locally available.
+ AC_MSG_CHECKING([rust crate dependencies])
+ AC_ARG_VAR([RUST_DEPENDENCIES], [path to directory with local crate mirror])
+ if test "x$RUST_DEPENDENCIES" = "x"; then
+ RUST_DEPENDENCIES="$srcdir/src/ext/rust/"
+ NEED_MOD=1
+ fi
+ if test ! -d "$RUST_DEPENDENCIES"; then
+ AC_MSG_ERROR([Rust dependency directory $RUST_DEPENDENCIES does not exist. Specify a dependency directory using the RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
+ fi
+ for dep in $rust_crates; do
+ if test ! -d "$RUST_DEPENDENCIES"/"$dep"; then
+ AC_MSG_ERROR([Failure to find rust dependency $RUST_DEPENDENCIES/$dep. Specify a dependency directory using the RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
+ fi
+ done
+ if test "x$NEED_MOD" = "x1"; then
+ dnl When looking for dependencies from cargo, pick right directory
+ RUST_DEPENDENCIES="../../src/ext/rust"
+ fi
+ fi
+
+ dnl For now both MSVC and MinGW rust libraries will output static libs with
+ dnl the MSVC naming convention.
+ if test "$bwin32" = "true"; then
+ TOR_RUST_UTIL_STATIC_NAME=tor_util.lib
+ else
+ TOR_RUST_UTIL_STATIC_NAME=libtor_util.a
+ fi
+
+ AC_SUBST(TOR_RUST_UTIL_STATIC_NAME)
+ AC_SUBST(CARGO_ONLINE)
+ AC_SUBST(RUST_DL)
+
+ dnl Let's check the rustc version, too
+ AC_MSG_CHECKING([rust version])
+ RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
+ RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
+ if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
+ AC_MSG_ERROR([rustc version couldn't be identified])
+ fi
+ if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 14; then
+ AC_MSG_ERROR([rustc must be at least version 1.14])
+ fi
+fi
+
AC_SEARCH_LIBS(socket, [socket network])
AC_SEARCH_LIBS(gethostbyname, [nsl])
AC_SEARCH_LIBS(dlopen, [dl])
@@ -481,6 +490,7 @@ AC_CHECK_FUNCS(
timingsafe_memcmp \
flock \
ftime \
+ get_current_dir_name \
getaddrinfo \
getifaddrs \
getpass \
@@ -573,13 +583,16 @@ if test "$bwin32" = "true"; then
# Some of the cargo-cults recommend -lwsock32 as well, but I don't
# think it's actually necessary.
TOR_LIB_GDI=-lgdi32
+ TOR_LIB_USERENV=-luserenv
else
TOR_LIB_WS32=
TOR_LIB_GDI=
+ TOR_LIB_USERENV=
fi
AC_SUBST(TOR_LIB_WS32)
AC_SUBST(TOR_LIB_GDI)
AC_SUBST(TOR_LIB_IPHLPAPI)
+AC_SUBST(TOR_LIB_USERENV)
tor_libevent_pkg_redhat="libevent"
tor_libevent_pkg_debian="libevent-dev"
@@ -893,7 +906,7 @@ dnl since sometimes the linker will like an option but not be willing to
dnl use it with a build of a library.
all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
-all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_SYSTEMD_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI $TOR_CAP_LIBS"
+all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_SYSTEMD_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI $TOR_LIB_USERENV $TOR_CAP_LIBS"
CFLAGS_FTRAPV=
CFLAGS_FWRAPV=
@@ -1552,6 +1565,24 @@ if test "$tor_cv_sign_extend" != "no"; then
[Define to 1 iff right-shifting a negative value performs sign-extension])
fi
+# Is uint8_t the same type as unsigned char?
+AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar,
+[AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <stdint.h>
+extern uint8_t c;
+unsigned char c;]])],
+ [tor_cv_uint8_uchar=yes],
+ [tor_cv_uint8_uchar=no],
+ [tor_cv_uint8_uchar=cross])])
+
+if test "$tor_cv_uint8_uchar" = "cross"; then
+ AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char])
+fi
+
+if test "$tor_cv_uint8_uchar" = "no"; then
+ AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.])
+fi
+
# Whether we should use the dmalloc memory allocation debugging library.
AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
AC_ARG_WITH(dmalloc,
diff --git a/contrib/win32build/tor-mingw.nsi.in b/contrib/win32build/tor-mingw.nsi.in
index e5181449dc..9f3a86a695 100644
--- a/contrib/win32build/tor-mingw.nsi.in
+++ b/contrib/win32build/tor-mingw.nsi.in
@@ -8,7 +8,7 @@
!include "LogicLib.nsh"
!include "FileFunc.nsh"
!insertmacro GetParameters
-!define VERSION "0.3.1.5-alpha"
+!define VERSION "0.3.2.0-alpha-dev"
!define INSTALLER "tor-${VERSION}-win32.exe"
!define WEBSITE "https://www.torproject.org/"
!define LICENSE "LICENSE"
diff --git a/doc/HACKING/CodingStandards.md b/doc/HACKING/CodingStandards.md
index c7787a72cc..55c23a7df5 100644
--- a/doc/HACKING/CodingStandards.md
+++ b/doc/HACKING/CodingStandards.md
@@ -6,8 +6,8 @@ tl;dr:
- Run configure with `--enable-fatal-warnings`
- 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
+ - Run `make check` before submitting a patch
+ - Run `make distcheck` if you have made changes to build system components
- Add a file in `changes` for your branch.
Patch checklist
@@ -32,6 +32,16 @@ Did you remember...
- To base your code on the appropriate branch?
- To include a file in the `changes` directory as appropriate?
+If you are submitting a major patch or new feature, or want to in the future...
+
+ - Set up Chutney and Stem, see HACKING/WritingTests.md
+ - Run `make test-full` to test against all unit and integration tests.
+
+If you have changed build system components:
+ - Please run `make distcheck`
+ - For example, if you have changed Makefiles, autoconf files, or anything
+ else that affects the build system.
+
How we use Git branches
=======================
@@ -52,8 +62,17 @@ before it gets merged into maint, but that's rare.
If you're working on a bugfix for a bug that occurs in a particular version,
base your bugfix branch on the "maint" branch for the first supported series
-that has that bug. (As of June 2013, we're supporting 0.2.3 and later.) If
-you're working on a new feature, base it on the master branch.
+that has that bug. (As of June 2013, we're supporting 0.2.3 and later.)
+
+If you're working on a new feature, base it on the master branch. If you're
+working on a new feature and it will take a while to implement and/or you'd
+like to avoid the possibility of unrelated bugs in Tor while you're
+implementing your feature, consider branching off of the latest maint- branch.
+_Never_ branch off a relase- branch. Don't branch off a tag either: they come
+from release branches. Doing so will likely produce a nightmare of merge
+conflicts in the ChangeLog when it comes time to merge your branch into Tor.
+Best advice: don't try to keep an independent branch forked for more than 6
+months and expect it to merge cleanly. Try to merge pieces early and often.
How we log changes
@@ -156,6 +175,19 @@ old C functions. Use `strlcat`, `strlcpy`, or `tor_snprintf/tor_asprintf` inste
We don't call `memcmp()` directly. Use `fast_memeq()`, `fast_memneq()`,
`tor_memeq()`, or `tor_memneq()` for most purposes.
+Also see a longer list of functions to avoid in:
+https://people.torproject.org/~nickm/tor-auto/internal/this-not-that.html
+
+Other C conventions
+-------------------
+
+The `a ? b : c` trinary operator only goes inside other expressions;
+don't use it as a replacement for if. (You can ignore this inside macro
+definitions when necessary.)
+
+Assignment operators shouldn't nest inside other expressions. (You can
+ignore this inside macro definitions when necessary.)
+
Functions not to write
----------------------
diff --git a/doc/HACKING/ReleasingTor.md b/doc/HACKING/ReleasingTor.md
index 4ece4d7a1d..8fece92c20 100644
--- a/doc/HACKING/ReleasingTor.md
+++ b/doc/HACKING/ReleasingTor.md
@@ -146,7 +146,7 @@ new Tor release:
- {weasel,gk,mikeperry} at torproject dot org
- {blueness} at gentoo dot org
- - {paul} at invizbox dot io
+ - {paul,vincent} at invizbox dot io
- {lfleischer} at archlinux dot org
- {Nathan} at freitas dot net
- {mike} at tig dot as
diff --git a/doc/tor.1.txt b/doc/tor.1.txt
index e17c111919..85af8c3a3d 100644
--- a/doc/tor.1.txt
+++ b/doc/tor.1.txt
@@ -128,6 +128,16 @@ COMMAND-LINE OPTIONS
the passphrase, including any trailing newlines.
Default: read from the terminal.
+[[opt-key-expiration]] **--key-expiration** [**purpose**]::
+ The **purpose** specifies which type of key certificate to determine
+ the expiration of. The only currently recognised **purpose** is
+ "sign". +
+ +
+ Running "tor --key-expiration sign" will attempt to find your signing
+ key certificate and will output, both in the logs as well as to stdout,
+ the signing key certificate's expiration time in ISO-8601 format.
+ For example, the output sent to stdout will be of the form:
+ "signing-cert-expiry: 2017-07-25 08:30:15 UTC"
Other options can be specified on the command-line in the format "--option
value", in the format "option value", or in a configuration file. For
@@ -436,9 +446,11 @@ GENERAL OPTIONS
authority is listening for IPv6 connections on the indicated IPv6 address
and OR Port. +
+
- Tor will contact the authority at __address__:__port__ (the DirPort) to
- download directory documents. If an IPv6 address is supplied, Tor will
- also download directory documents at the IPv6 address on the DirPort. +
+ Tor will contact the authority at __address__ to
+ download directory documents. The provided __port__ value is a dirport;
+ clients ignore this in favor of the specified "orport=" value. If an
+ IPv6 ORPort is supplied, Tor will
+ also download directory documents at the IPv6 ORPort. +
+
If no **DirAuthority** line is given, Tor will use the default directory
authorities. NOTE: this option is intended for setting up a private Tor
@@ -521,13 +533,14 @@ GENERAL OPTIONS
[[HTTPProxy]] **HTTPProxy** __host__[:__port__]::
Tor will make all its directory requests through this host:port (or host:80
if port is not specified), rather than connecting directly to any directory
- servers.
+ servers. (DEPRECATED: As of 0.3.1.0-alpha you should use HTTPSProxy.)
[[HTTPProxyAuthenticator]] **HTTPProxyAuthenticator** __username:password__::
If defined, Tor will use this username:password for Basic HTTP proxy
authentication, as in RFC 2617. This is currently the only form of HTTP
proxy authentication that Tor supports; feel free to submit a patch if you
- want it to support others.
+ want it to support others. (DEPRECATED: As of 0.3.1.0-alpha you should use
+ HTTPSProxyAuthenticator.)
[[HTTPSProxy]] **HTTPSProxy** __host__[:__port__]::
Tor will make all its OR (SSL) connections through this host:port (or
@@ -545,8 +558,10 @@ GENERAL OPTIONS
[[Sandbox]] **Sandbox** **0**|**1**::
If set to 1, Tor will run securely through the use of a syscall sandbox.
Otherwise the sandbox will be disabled. The option is currently an
- experimental feature. Can not be changed while tor is running.
-
+ experimental feature. It only works on Linux-based operating systems,
+ and only when Tor has been built with the libseccomp library. This option
+ can not be changed while tor is running.
+ +
When the Sandbox is 1, the following options can not be changed when tor
is running:
Address
@@ -760,6 +775,13 @@ GENERAL OPTIONS
circuits. If the option is set to "default", we obey a
parameter in the consensus document. (Default: auto)
+[[NoExec]] **NoExec** **0**|**1**::
+ If this option is set to 1, then Tor will never launch another
+ executable, regardless of the settings of PortForwardingHelper,
+ ClientTransportPlugin, or ServerTransportPlugin. Once this
+ option has been set to 1, it cannot be set back to 0 without
+ restarting Tor. (Default: 0)
+
CLIENT OPTIONS
--------------
@@ -1802,11 +1824,13 @@ is non-zero):
+
If this option is set to 0, Tor will not publish its
descriptors to any directories. (This is useful if you're testing
- out your server, or if you're using a Tor controller that handles directory
- publishing for you.) Otherwise, Tor will publish its descriptors of all
- type(s) specified. The default is "1",
- which means "if running as a server, publish the
- appropriate descriptors to the authorities".
+ out your server, or if you're using a Tor controller that handles
+ directory publishing for you.) Otherwise, Tor will publish its
+ descriptors of all type(s) specified. The default is "1", which
+ means "if running as a relay or bridge, publish descriptors to the
+ appropriate authorities". Other possibilities are "v3", meaning
+ "publish as if you're a relay", and "bridge", meaning "publish as
+ if you're a bridge".
[[ShutdownWaitLength]] **ShutdownWaitLength** __NUM__::
When we get a SIGINT and we're a server, we begin shutting down:
@@ -2844,6 +2868,16 @@ __DataDirectory__**/hashed-fingerprint**::
Only used by bridges. Holds the hashed fingerprint of the bridge's
identity key. (That is, the hash of the hash of the identity key.)
+__DataDirectory__**/approved-routers**::
+ Only used by authoritative directory servers. This file lists
+ the status of routers by their identity fingerprint.
+ Each line lists a status and a fingerprint separated by
+ whitespace. See your **fingerprint** file in the __DataDirectory__ for an
+ example line. If the status is **!reject** then descriptors from the
+ given identity (fingerprint) are rejected by this server. If it is
+ **!invalid** then descriptors are accepted but marked in the directory as
+ not valid, that is, not recommended.
+
__DataDirectory__**/v3-status-votes**::
Only for v3 authoritative directory servers. This file contains
status votes from all the authoritative directory servers.
diff --git a/scripts/coccinelle/ceil_div.cocci b/scripts/coccinelle/ceil_div.cocci
new file mode 100644
index 0000000000..00843e82c3
--- /dev/null
+++ b/scripts/coccinelle/ceil_div.cocci
@@ -0,0 +1,6 @@
+@@
+expression n, d;
+@@
+
+- (((n) + (d) - 1) / (d))
++ CEIL_DIV(n, d)
diff --git a/scripts/coccinelle/test-operator-cleanup b/scripts/coccinelle/test-operator-cleanup
new file mode 100755
index 0000000000..e7822542a4
--- /dev/null
+++ b/scripts/coccinelle/test-operator-cleanup
@@ -0,0 +1,11 @@
+#!/usr/bin/perl -w -p -i
+
+next if m#^ */\*# or m#^ *\* #;
+
+s/<([,)])/OP_LT$1/;
+s/(?<=[\s,])>([,)])/OP_GT$1/;
+#s/>([,)])/OP_GT$1/;
+s/==([,)])/OP_EQ$1/;
+s/>=([,)])/OP_GE$1/;
+s/<=([,)])/OP_LE$1/;
+s/!=([,)])/OP_NE$1/;
diff --git a/scripts/coccinelle/test_assert_int.cocci b/scripts/coccinelle/test_assert_int.cocci
new file mode 100644
index 0000000000..80e86b4f3c
--- /dev/null
+++ b/scripts/coccinelle/test_assert_int.cocci
@@ -0,0 +1,49 @@
+@@
+int e;
+constant c;
+@@
+
+(
+- tt_assert(e == c)
++ tt_int_op(e, OP_EQ, c)
+|
+- tt_assert(e != c)
++ tt_int_op(e, OP_NE, c)
+|
+- tt_assert(e < c)
++ tt_int_op(e, OP_LT, c)
+|
+- tt_assert(e <= c)
++ tt_int_op(e, OP_LE, c)
+|
+- tt_assert(e > c)
++ tt_int_op(e, OP_GT, c)
+|
+- tt_assert(e >= c)
++ tt_int_op(e, OP_GE, c)
+)
+
+@@
+unsigned int e;
+constant c;
+@@
+
+(
+- tt_assert(e == c)
++ tt_uint_op(e, OP_EQ, c)
+|
+- tt_assert(e != c)
++ tt_uint_op(e, OP_NE, c)
+|
+- tt_assert(e < c)
++ tt_uint_op(e, OP_LT, c)
+|
+- tt_assert(e <= c)
++ tt_uint_op(e, OP_LE, c)
+|
+- tt_assert(e > c)
++ tt_uint_op(e, OP_GT, c)
+|
+- tt_assert(e >= c)
++ tt_uint_op(e, OP_GE, c)
+)
diff --git a/scripts/coccinelle/test_assert_null.cocci b/scripts/coccinelle/test_assert_null.cocci
new file mode 100644
index 0000000000..3d66e1ee0b
--- /dev/null
+++ b/scripts/coccinelle/test_assert_null.cocci
@@ -0,0 +1,11 @@
+@@
+expression * e;
+@@
+
+(
+- tt_assert(e != NULL)
++ tt_ptr_op(e, OP_NE, NULL)
+|
+- tt_assert(e == NULL)
++ tt_ptr_op(e, OP_EQ, NULL)
+)
diff --git a/scripts/coccinelle/test_assert_zero.cocci b/scripts/coccinelle/test_assert_zero.cocci
new file mode 100644
index 0000000000..09feaa5fb4
--- /dev/null
+++ b/scripts/coccinelle/test_assert_zero.cocci
@@ -0,0 +1,5 @@
+@@
+@@
+
+- tt_assert(0)
++ tt_abort()
diff --git a/scripts/codegen/fuzzing_include_am.py b/scripts/codegen/fuzzing_include_am.py
index 6e45c21926..045d0f8922 100755
--- a/scripts/codegen/fuzzing_include_am.py
+++ b/scripts/codegen/fuzzing_include_am.py
@@ -30,13 +30,14 @@ FUZZING_LIBS = \
src/common/libor-ctime-testing.a \
src/common/libor-event-testing.a \
src/trunnel/libor-trunnel-testing.a \
+ $(rust_ldadd) \
@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@ @TOR_LIB_USERENV@ \
+ @CURVE25519_LIBS@ \
@TOR_SYSTEMD_LIBS@ \
@TOR_LZMA_LIBS@ \
- @TOR_ZSTD_LIBS@ \
- $(rust_ldadd)
+ @TOR_ZSTD_LIBS@
oss-fuzz-prereqs: \
src/or/libtor-testing.a \
diff --git a/src/common/aes.c b/src/common/aes.c
index 73abef143e..94d33d4392 100644
--- a/src/common/aes.c
+++ b/src/common/aes.c
@@ -66,7 +66,7 @@ ENABLE_GCC_WARNING(redundant-decls)
#elif OPENSSL_VERSION_NUMBER >= OPENSSL_V_NOPATCH(1,0,1) && \
(defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || \
- defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__)) \
+ defined(_M_AMD64) || defined(_M_X64) || defined(__INTEL__))
#define USE_EVP_AES_CTR
diff --git a/src/common/compat.c b/src/common/compat.c
index 4d110aba35..836b3813e0 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -2349,15 +2349,34 @@ get_parent_directory(char *fname)
static char *
alloc_getcwd(void)
{
-#ifdef PATH_MAX
-#define MAX_CWD PATH_MAX
+#ifdef HAVE_GET_CURRENT_DIR_NAME
+ /* Glibc makes this nice and simple for us. */
+ char *cwd = get_current_dir_name();
+ char *result = NULL;
+ if (cwd) {
+ /* We make a copy here, in case tor_malloc() is not malloc(). */
+ result = tor_strdup(cwd);
+ raw_free(cwd); // alias for free to avoid tripping check-spaces.
+ }
+ return result;
#else
-#define MAX_CWD 4096
-#endif
+ size_t size = 1024;
+ char *buf = NULL;
+ char *ptr = NULL;
- char path_buf[MAX_CWD];
- char *path = getcwd(path_buf, sizeof(path_buf));
- return path ? tor_strdup(path) : NULL;
+ while (ptr == NULL) {
+ buf = tor_realloc(buf, size);
+ ptr = getcwd(buf, size);
+
+ if (ptr == NULL && errno != ERANGE) {
+ tor_free(buf);
+ return NULL;
+ }
+
+ size *= 2;
+ }
+ return buf;
+#endif
}
#endif
@@ -2600,7 +2619,7 @@ tor_inet_pton(int af, const char *src, void *dst)
long r = strtol(src, &next, 16);
if (next == NULL || next == src) {
/* The 'next == src' error case can happen on versions of openbsd
- * where treats "0xfoo" as an error, rather than as "0" followed by
+ * which treat "0xfoo" as an error, rather than as "0" followed by
* "xfoo". */
return 0;
}
diff --git a/src/common/compat_time.c b/src/common/compat_time.c
index 2ccaa36e49..3c00c96f94 100644
--- a/src/common/compat_time.c
+++ b/src/common/compat_time.c
@@ -251,7 +251,7 @@ ratchet_timeval(const struct timeval *timeval_raw, struct timeval *out)
{
/* must hold lock */
timeradd(timeval_raw, &timeofday_offset, out);
- if (PREDICT_UNLIKELY(timercmp(out, &last_timeofday, <))) {
+ if (PREDICT_UNLIKELY(timercmp(out, &last_timeofday, OP_LT))) {
/* time ran backwards. Instead, declare that no time occurred. */
timersub(&last_timeofday, timeval_raw, &timeofday_offset);
memcpy(out, &last_timeofday, sizeof(struct timeval));
diff --git a/src/common/compress.c b/src/common/compress.c
index 7926faaa60..472268a439 100644
--- a/src/common/compress.c
+++ b/src/common/compress.c
@@ -574,6 +574,12 @@ tor_compress_process(tor_compress_state_t *state,
if (BUG((rv == TOR_COMPRESS_OK) &&
*in_len == in_len_orig &&
*out_len == out_len_orig)) {
+ log_warn(LD_GENERAL,
+ "More info on the bug: method == %s, finish == %d, "
+ " *in_len == in_len_orig == %lu, "
+ "*out_len == out_len_orig == %lu",
+ compression_method_get_human_name(state->method), finish,
+ (unsigned long)in_len_orig, (unsigned long)out_len_orig);
return TOR_COMPRESS_ERROR;
}
diff --git a/src/common/compress.h b/src/common/compress.h
index 7c0dc14061..59c8b7b9b5 100644
--- a/src/common/compress.h
+++ b/src/common/compress.h
@@ -49,7 +49,7 @@ 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);
+const char *compression_method_get_name(compress_method_t method);
const char *compression_method_get_human_name(compress_method_t method);
compress_method_t compression_method_get_by_name(const char *name);
diff --git a/src/common/compress_lzma.c b/src/common/compress_lzma.c
index b5393a6ba6..d453d9f718 100644
--- a/src/common/compress_lzma.c
+++ b/src/common/compress_lzma.c
@@ -144,9 +144,11 @@ tor_lzma_state_size_precalc(int compress, compression_level_t level)
memory_usage = lzma_easy_decoder_memusage(memory_level(level));
if (memory_usage == UINT64_MAX) {
+ // LCOV_EXCL_START
log_warn(LD_GENERAL, "Unsupported compression level passed to LZMA %s",
compress ? "encoder" : "decoder");
goto err;
+ // LCOV_EXCL_STOP
}
if (memory_usage + sizeof(tor_lzma_compress_state_t) > SIZE_MAX)
@@ -157,7 +159,7 @@ tor_lzma_state_size_precalc(int compress, compression_level_t level)
return (size_t)memory_usage;
err:
- return 0;
+ return 0; // LCOV_EXCL_LINE
}
#endif // HAVE_LZMA.
@@ -189,17 +191,21 @@ tor_lzma_compress_new(int compress,
retval = lzma_alone_encoder(&result->stream, &stream_options);
if (retval != LZMA_OK) {
+ // LCOV_EXCL_START
log_warn(LD_GENERAL, "Error from LZMA encoder: %s (%u).",
lzma_error_str(retval), retval);
goto err;
+ // LCOV_EXCL_STOP
}
} else {
retval = lzma_alone_decoder(&result->stream, MEMORY_LIMIT);
if (retval != LZMA_OK) {
+ // LCOV_EXCL_START
log_warn(LD_GENERAL, "Error from LZMA decoder: %s (%u).",
lzma_error_str(retval), retval);
goto err;
+ // LCOV_EXCL_STOP
}
}
@@ -207,7 +213,7 @@ tor_lzma_compress_new(int compress,
return result;
err:
- tor_free(result);
+ tor_free(result); // LCOV_EXCL_LINE
return NULL;
#else // HAVE_LZMA.
(void)compress;
diff --git a/src/common/compress_zstd.c b/src/common/compress_zstd.c
index 94974dec06..0808bcd9ab 100644
--- a/src/common/compress_zstd.c
+++ b/src/common/compress_zstd.c
@@ -196,31 +196,41 @@ tor_zstd_compress_new(int compress,
result->u.compress_stream = ZSTD_createCStream();
if (result->u.compress_stream == NULL) {
- log_warn(LD_GENERAL, "Error while creating Zstandard stream");
+ // LCOV_EXCL_START
+ log_warn(LD_GENERAL, "Error while creating Zstandard compression "
+ "stream");
goto err;
+ // LCOV_EXCL_STOP
}
retval = ZSTD_initCStream(result->u.compress_stream, preset);
if (ZSTD_isError(retval)) {
+ // LCOV_EXCL_START
log_warn(LD_GENERAL, "Zstandard stream initialization error: %s",
ZSTD_getErrorName(retval));
goto err;
+ // LCOV_EXCL_STOP
}
} else {
result->u.decompress_stream = ZSTD_createDStream();
if (result->u.decompress_stream == NULL) {
- log_warn(LD_GENERAL, "Error while creating Zstandard stream");
+ // LCOV_EXCL_START
+ log_warn(LD_GENERAL, "Error while creating Zstandard decompression "
+ "stream");
goto err;
+ // LCOV_EXCL_STOP
}
retval = ZSTD_initDStream(result->u.decompress_stream);
if (ZSTD_isError(retval)) {
+ // LCOV_EXCL_START
log_warn(LD_GENERAL, "Zstandard stream initialization error: %s",
ZSTD_getErrorName(retval));
goto err;
+ // LCOV_EXCL_STOP
}
}
@@ -228,6 +238,7 @@ tor_zstd_compress_new(int compress,
return result;
err:
+ // LCOV_EXCL_START
if (compress) {
ZSTD_freeCStream(result->u.compress_stream);
} else {
@@ -236,6 +247,7 @@ tor_zstd_compress_new(int compress,
tor_free(result);
return NULL;
+ // LCOV_EXCL_STOP
#else // HAVE_ZSTD.
(void)compress;
(void)method;
diff --git a/src/common/confline.c b/src/common/confline.c
index 691cbf8c6f..15fd96bf38 100644
--- a/src/common/confline.c
+++ b/src/common/confline.c
@@ -294,24 +294,26 @@ config_process_include(const char *path, int recursion_level, int extended,
return -1;
}
- SMARTLIST_FOREACH_BEGIN(config_files, char *, config_file) {
+ int rv = -1;
+ SMARTLIST_FOREACH_BEGIN(config_files, const char *, config_file) {
config_line_t *included_list = NULL;
if (config_get_included_list(config_file, recursion_level, extended,
&included_list, list_last) < 0) {
- SMARTLIST_FOREACH(config_files, char *, f, tor_free(f));
- smartlist_free(config_files);
- return -1;
+ goto done;
}
- tor_free(config_file);
*next = included_list;
if (*list_last)
next = &(*list_last)->next;
} SMARTLIST_FOREACH_END(config_file);
- smartlist_free(config_files);
*list = ret_list;
- return 0;
+ rv = 0;
+
+ done:
+ SMARTLIST_FOREACH(config_files, char *, f, tor_free(f));
+ smartlist_free(config_files);
+ return rv;
}
/**
diff --git a/src/common/container.c b/src/common/container.c
index 689e7e55e9..8645cb4826 100644
--- a/src/common/container.c
+++ b/src/common/container.c
@@ -843,13 +843,13 @@ smartlist_sort_pointers(smartlist_t *sl)
* }
*
* void timer_heap_insert(smartlist_t *heap, timer_t *timer) {
- * smartlist_pqueue_add(heap, compare, STRUCT_OFFSET(timer_t, heap_index),
+ * smartlist_pqueue_add(heap, compare, offsetof(timer_t, heap_index),
* timer);
* }
*
* void timer_heap_pop(smartlist_t *heap) {
* return smartlist_pqueue_pop(heap, compare,
- * STRUCT_OFFSET(timer_t, heap_index));
+ * offsetof(timer_t, heap_index));
* }
*/
diff --git a/src/common/crypto.c b/src/common/crypto.c
index 0fc8474832..4d6a70bc49 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -1238,9 +1238,12 @@ crypto_pk_private_sign_digest(crypto_pk_t *env, char *to, size_t tolen,
* - The beginning of the source data prefixed with a 16-byte symmetric key,
* padded and encrypted with the public key; followed by the rest of
* the source data encrypted in AES-CTR mode with the symmetric key.
+ *
+ * NOTE that this format does not authenticate the symmetrically encrypted
+ * part of the data, and SHOULD NOT BE USED for new protocols.
*/
int
-crypto_pk_public_hybrid_encrypt(crypto_pk_t *env,
+crypto_pk_obsolete_public_hybrid_encrypt(crypto_pk_t *env,
char *to, size_t tolen,
const char *from,
size_t fromlen,
@@ -1302,10 +1305,14 @@ crypto_pk_public_hybrid_encrypt(crypto_pk_t *env,
return -1;
}
-/** Invert crypto_pk_public_hybrid_encrypt. Returns the number of bytes
- * written on success, -1 on failure. */
+/** Invert crypto_pk_obsolete_public_hybrid_encrypt. Returns the number of
+ * bytes written on success, -1 on failure.
+ *
+ * NOTE that this format does not authenticate the symmetrically encrypted
+ * part of the data, and SHOULD NOT BE USED for new protocols.
+ */
int
-crypto_pk_private_hybrid_decrypt(crypto_pk_t *env,
+crypto_pk_obsolete_private_hybrid_decrypt(crypto_pk_t *env,
char *to,
size_t tolen,
const char *from,
@@ -1854,6 +1861,18 @@ struct crypto_digest_t {
} d;
};
+#ifdef TOR_UNIT_TESTS
+
+digest_algorithm_t
+crypto_digest_get_algorithm(crypto_digest_t *digest)
+{
+ tor_assert(digest);
+
+ return digest->algorithm;
+}
+
+#endif
+
/**
* Return the number of bytes we need to malloc in order to get a
* crypto_digest_t for <b>alg</b>, or the number of bytes we need to wipe
@@ -1865,7 +1884,7 @@ crypto_digest_alloc_bytes(digest_algorithm_t alg)
/* Helper: returns the number of bytes in the 'f' field of 'st' */
#define STRUCT_FIELD_SIZE(st, f) (sizeof( ((st*)0)->f ))
/* Gives the length of crypto_digest_t through the end of the field 'd' */
-#define END_OF_FIELD(f) (STRUCT_OFFSET(crypto_digest_t, f) + \
+#define END_OF_FIELD(f) (offsetof(crypto_digest_t, f) + \
STRUCT_FIELD_SIZE(crypto_digest_t, f))
switch (alg) {
case DIGEST_SHA1:
diff --git a/src/common/crypto.h b/src/common/crypto.h
index c70d91c262..cde241dd37 100644
--- a/src/common/crypto.h
+++ b/src/common/crypto.h
@@ -20,6 +20,9 @@
#include "testsupport.h"
#include "compat.h"
+#include <openssl/engine.h>
+#include "keccak-tiny/keccak-tiny.h"
+
/*
Macro to create an arbitrary OpenSSL version number as used by
OPENSSL_VERSION_NUMBER or SSLeay(), since the actual numbers are a bit hard
@@ -194,11 +197,11 @@ int crypto_pk_private_sign(const crypto_pk_t *env, char *to, size_t tolen,
const char *from, size_t fromlen);
int crypto_pk_private_sign_digest(crypto_pk_t *env, char *to, size_t tolen,
const char *from, size_t fromlen);
-int crypto_pk_public_hybrid_encrypt(crypto_pk_t *env, char *to,
+int crypto_pk_obsolete_public_hybrid_encrypt(crypto_pk_t *env, char *to,
size_t tolen,
const char *from, size_t fromlen,
int padding, int force);
-int crypto_pk_private_hybrid_decrypt(crypto_pk_t *env, char *to,
+int crypto_pk_obsolete_private_hybrid_decrypt(crypto_pk_t *env, char *to,
size_t tolen,
const char *from, size_t fromlen,
int padding, int warnOnFailure);
@@ -335,6 +338,7 @@ struct dh_st *crypto_dh_get_dh_(crypto_dh_t *dh);
void crypto_add_spaces_to_fp(char *out, size_t outlen, const char *in);
#ifdef CRYPTO_PRIVATE
+
STATIC int crypto_force_rand_ssleay(void);
STATIC int crypto_strongest_rand_raw(uint8_t *out, size_t out_len);
@@ -346,6 +350,7 @@ extern int break_strongest_rng_fallback;
#ifdef TOR_UNIT_TESTS
void crypto_pk_assign_(crypto_pk_t *dest, const crypto_pk_t *src);
+digest_algorithm_t crypto_digest_get_algorithm(crypto_digest_t *digest);
#endif
#endif
diff --git a/src/common/crypto_ed25519.c b/src/common/crypto_ed25519.c
index 188e18c710..abf23c4b38 100644
--- a/src/common/crypto_ed25519.c
+++ b/src/common/crypto_ed25519.c
@@ -28,6 +28,7 @@
#include "crypto_format.h"
#include "torlog.h"
#include "util.h"
+#include "util_format.h"
#include "ed25519/ref10/ed25519_ref10.h"
#include "ed25519/donna/ed25519_donna_tor.h"
@@ -57,6 +58,9 @@ typedef struct {
int (*pubkey_from_curve25519_pubkey)(unsigned char *, const unsigned char *,
int);
+
+ int (*ed25519_scalarmult_with_group_order)(unsigned char *,
+ const unsigned char *);
} ed25519_impl_t;
/** The Ref10 Ed25519 implementation. This one is pure C and lightly
@@ -77,6 +81,7 @@ static const ed25519_impl_t impl_ref10 = {
ed25519_ref10_blind_public_key,
ed25519_ref10_pubkey_from_curve25519_pubkey,
+ ed25519_ref10_scalarmult_with_group_order,
};
/** The Ref10 Ed25519 implementation. This one is heavily optimized, but still
@@ -97,6 +102,7 @@ static const ed25519_impl_t impl_donna = {
ed25519_donna_blind_public_key,
ed25519_donna_pubkey_from_curve25519_pubkey,
+ ed25519_donna_scalarmult_with_group_order,
};
/** Which Ed25519 implementation are we using? NULL if we haven't decided
@@ -462,7 +468,6 @@ ed25519_keypair_from_curve25519_keypair(ed25519_keypair_t *out,
tor_assert(fast_memeq(pubkey_check.pubkey, out->pubkey.pubkey, 32));
memwipe(&pubkey_check, 0, sizeof(pubkey_check));
- memwipe(&ctx, 0, sizeof(ctx));
memwipe(sha512_output, 0, sizeof(sha512_output));
return 0;
@@ -491,7 +496,8 @@ ed25519_public_key_from_curve25519_public_key(ed25519_public_key_t *pubkey,
* service descriptors are encrypted with a key derived from the service's
* long-term public key, and then signed with (and stored at a position
* indexed by) a short-term key derived by blinding the long-term keys.
- */
+ *
+ * Return 0 if blinding was successful, else return -1. */
int
ed25519_keypair_blind(ed25519_keypair_t *out,
const ed25519_keypair_t *inp,
@@ -502,7 +508,9 @@ ed25519_keypair_blind(ed25519_keypair_t *out,
get_ed_impl()->blind_secret_key(out->seckey.seckey,
inp->seckey.seckey, param);
- ed25519_public_blind(&pubkey_check, &inp->pubkey, param);
+ if (ed25519_public_blind(&pubkey_check, &inp->pubkey, param) < 0) {
+ return -1;
+ }
ed25519_public_key_generate(&out->pubkey, &out->seckey);
tor_assert(fast_memeq(pubkey_check.pubkey, out->pubkey.pubkey, 32));
@@ -522,8 +530,7 @@ ed25519_public_blind(ed25519_public_key_t *out,
const ed25519_public_key_t *inp,
const uint8_t *param)
{
- get_ed_impl()->blind_public_key(out->pubkey, inp->pubkey, param);
- return 0;
+ return get_ed_impl()->blind_public_key(out->pubkey, inp->pubkey, param);
}
/**
@@ -754,3 +761,47 @@ ed25519_init(void)
pick_ed25519_impl();
}
+/* Return true if <b>point</b> is the identity element of the ed25519 group. */
+static int
+ed25519_point_is_identity_element(const uint8_t *point)
+{
+ /* The identity element in ed25159 is the point with coordinates (0,1). */
+ static const uint8_t ed25519_identity[32] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ tor_assert(sizeof(ed25519_identity) == ED25519_PUBKEY_LEN);
+ return tor_memeq(point, ed25519_identity, sizeof(ed25519_identity));
+}
+
+/** Validate <b>pubkey</b> to ensure that it has no torsion component.
+ * Return 0 if <b>pubkey</b> is valid, else return -1. */
+int
+ed25519_validate_pubkey(const ed25519_public_key_t *pubkey)
+{
+ uint8_t result[32] = {9};
+
+ /* First check that we were not given the identity element */
+ if (ed25519_point_is_identity_element(pubkey->pubkey)) {
+ log_warn(LD_CRYPTO, "ed25519 pubkey is the identity");
+ return -1;
+ }
+
+ /* For any point on the curve, doing l*point should give the identity element
+ * (where l is the group order). Do the computation and check that the
+ * identity element is returned. */
+ if (get_ed_impl()->ed25519_scalarmult_with_group_order(result,
+ pubkey->pubkey) < 0) {
+ log_warn(LD_CRYPTO, "ed25519 group order scalarmult failed");
+ return -1;
+ }
+
+ if (!ed25519_point_is_identity_element(result)) {
+ log_warn(LD_CRYPTO, "ed25519 validation failed");
+ return -1;
+ }
+
+ return 0;
+}
+
diff --git a/src/common/crypto_ed25519.h b/src/common/crypto_ed25519.h
index 77a3313adc..3a439207b3 100644
--- a/src/common/crypto_ed25519.h
+++ b/src/common/crypto_ed25519.h
@@ -127,6 +127,8 @@ void ed25519_pubkey_copy(ed25519_public_key_t *dest,
void ed25519_set_impl_params(int use_donna);
void ed25519_init(void);
+int ed25519_validate_pubkey(const ed25519_public_key_t *pubkey);
+
#ifdef TOR_UNIT_TESTS
void crypto_ed25519_testing_force_impl(const char *name);
void crypto_ed25519_testing_restore_impl(void);
diff --git a/src/common/memarea.c b/src/common/memarea.c
index 659d1edf54..4e2a5e5fc5 100644
--- a/src/common/memarea.c
+++ b/src/common/memarea.c
@@ -7,6 +7,7 @@
*/
#include "orconfig.h"
+#include <stddef.h>
#include <stdlib.h>
#include "memarea.h"
#include "util.h"
@@ -101,7 +102,7 @@ typedef struct memarea_chunk_t {
/** How many bytes are needed for overhead before we get to the memory part
* of a chunk? */
-#define CHUNK_HEADER_SIZE STRUCT_OFFSET(memarea_chunk_t, U_MEM)
+#define CHUNK_HEADER_SIZE offsetof(memarea_chunk_t, U_MEM)
/** What's the smallest that we'll allocate a chunk? */
#define CHUNK_SIZE 4096
diff --git a/src/common/procmon.c b/src/common/procmon.c
index d49e7f18f5..5ef16c7268 100644
--- a/src/common/procmon.c
+++ b/src/common/procmon.c
@@ -71,7 +71,7 @@ parse_process_specifier(const char *process_spec,
/* If we're lucky, long will turn out to be large enough to hold a
* PID everywhere that Tor runs. */
- pid_l = tor_parse_long(process_spec, 0, 1, LONG_MAX, &pid_ok, &pspec_next);
+ pid_l = tor_parse_long(process_spec, 10, 1, LONG_MAX, &pid_ok, &pspec_next);
/* Reserve room in the ‘process specifier’ for additional
* (platform-specific) identifying information beyond the PID, to
diff --git a/src/common/sandbox.c b/src/common/sandbox.c
index 5063717355..18beaabe14 100644
--- a/src/common/sandbox.c
+++ b/src/common/sandbox.c
@@ -289,37 +289,6 @@ sb_rt_sigaction(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
return rc;
}
-#if 0
-/**
- * Function responsible for setting up the execve syscall for
- * the seccomp filter sandbox.
- */
-static int
-sb_execve(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
-{
- int rc;
- sandbox_cfg_t *elem = NULL;
-
- // for each dynamic parameter filters
- for (elem = filter; elem != NULL; elem = elem->next) {
- smp_param_t *param = elem->param;
-
- if (param != NULL && param->prot == 1 && param->syscall
- == SCMP_SYS(execve)) {
- rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(execve),
- SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value));
- if (rc != 0) {
- log_err(LD_BUG,"(Sandbox) failed to add execve syscall, received "
- "libseccomp error %d", rc);
- return rc;
- }
- }
- }
-
- return 0;
-}
-#endif
-
/**
* Function responsible for setting up the time syscall for
* the seccomp filter sandbox.
@@ -480,7 +449,7 @@ sb_chmod(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(chmod),
SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value));
if (rc != 0) {
- log_err(LD_BUG,"(Sandbox) failed to add open syscall, received "
+ log_err(LD_BUG,"(Sandbox) failed to add chmod syscall, received "
"libseccomp error %d", rc);
return rc;
}
@@ -505,7 +474,7 @@ sb_chown(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(chown),
SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value));
if (rc != 0) {
- log_err(LD_BUG,"(Sandbox) failed to add open syscall, received "
+ log_err(LD_BUG,"(Sandbox) failed to add chown syscall, received "
"libseccomp error %d", rc);
return rc;
}
@@ -1045,8 +1014,8 @@ sb_stat64(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
rc = seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(stat64),
SCMP_CMP_STR(0, SCMP_CMP_EQ, param->value));
if (rc != 0) {
- log_err(LD_BUG,"(Sandbox) failed to add open syscall, received "
- "libseccomp error %d", rc);
+ log_err(LD_BUG,"(Sandbox) failed to add stat64 syscall, received "
+ "libseccomp error %d", rc);
return rc;
}
}
@@ -1063,9 +1032,6 @@ sb_stat64(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
static sandbox_filter_func_t filter_func[] = {
sb_rt_sigaction,
sb_rt_sigprocmask,
-#if 0
- sb_execve,
-#endif
sb_time,
sb_accept4,
#ifdef __NR_mmap2
@@ -1417,26 +1383,6 @@ sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file)
return 0;
}
-#if 0
-int
-sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com)
-{
- sandbox_cfg_t *elem = NULL;
-
- elem = new_element(SCMP_SYS(execve), com);
- if (!elem) {
- log_err(LD_BUG,"(Sandbox) failed to register parameter!");
- return -1;
- }
-
- elem->next = *cfg;
- *cfg = elem;
-
- return 0;
-}
-
-#endif
-
/** Cache entry for getaddrinfo results; used when sandboxing is implemented
* so that we can consult the cache when the sandbox prevents us from doing
* getaddrinfo.
@@ -1910,15 +1856,6 @@ sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file)
return 0;
}
-#if 0
-int
-sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com)
-{
- (void)cfg; (void)com;
- return 0;
-}
-#endif
-
int
sandbox_cfg_allow_stat_filename(sandbox_cfg_t **cfg, char *file)
{
diff --git a/src/common/sandbox.h b/src/common/sandbox.h
index a6b83153af..55454eaa2b 100644
--- a/src/common/sandbox.h
+++ b/src/common/sandbox.h
@@ -156,14 +156,6 @@ int sandbox_cfg_allow_rename(sandbox_cfg_t **cfg, char *file1, char *file2);
*/
int sandbox_cfg_allow_openat_filename(sandbox_cfg_t **cfg, char *file);
-#if 0
-/**
- * Function used to add a execve allowed filename to a supplied configuration.
- * The (char*) specifies the path to the allowed file; that pointer is stolen.
- */
-int sandbox_cfg_allow_execve(sandbox_cfg_t **cfg, const char *com);
-#endif
-
/**
* Function used to add a stat/stat64 allowed filename to a configuration.
* The (char*) specifies the path to the allowed file; that pointer is stolen.
diff --git a/src/common/tortls.c b/src/common/tortls.c
index 44db3aec58..5f3cd92a63 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -676,12 +676,7 @@ tor_x509_cert_new,(X509 *x509_cert))
length = i2d_X509(x509_cert, &buf);
cert = tor_malloc_zero(sizeof(tor_x509_cert_t));
if (length <= 0 || buf == NULL) {
- /* LCOV_EXCL_START for the same reason as the exclusion above */
- tor_free(cert);
- log_err(LD_CRYPTO, "Couldn't get length of encoded x509 certificate");
- X509_free(x509_cert);
- return NULL;
- /* LCOV_EXCL_STOP */
+ goto err;
}
cert->encoded_len = (size_t) length;
cert->encoded = tor_malloc(length);
@@ -696,13 +691,25 @@ tor_x509_cert_new,(X509 *x509_cert))
if ((pkey = X509_get_pubkey(x509_cert)) &&
(rsa = EVP_PKEY_get1_RSA(pkey))) {
crypto_pk_t *pk = crypto_new_pk_from_rsa_(rsa);
- crypto_pk_get_common_digests(pk, &cert->pkey_digests);
+ if (crypto_pk_get_common_digests(pk, &cert->pkey_digests) < 0) {
+ crypto_pk_free(pk);
+ EVP_PKEY_free(pkey);
+ goto err;
+ }
+
cert->pkey_digests_set = 1;
crypto_pk_free(pk);
EVP_PKEY_free(pkey);
}
return cert;
+ err:
+ /* LCOV_EXCL_START for the same reason as the exclusion above */
+ tor_free(cert);
+ log_err(LD_CRYPTO, "Couldn't wrap encoded X509 certificate.");
+ X509_free(x509_cert);
+ return NULL;
+ /* LCOV_EXCL_STOP */
}
/** Return a new copy of <b>cert</b>. */
@@ -1174,17 +1181,20 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime,
SSL_CTX_set_options(result->ctx,
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION);
}
+
+ /* Don't actually allow compression; it uses RAM and time, it makes TLS
+ * vulnerable to CRIME-style attacks, and most of the data we transmit over
+ * TLS is encrypted (and therefore uncompressible) anyway. */
#ifdef SSL_OP_NO_COMPRESSION
SSL_CTX_set_options(result->ctx, SSL_OP_NO_COMPRESSION);
#endif
#if OPENSSL_VERSION_NUMBER < OPENSSL_V_SERIES(1,1,0)
#ifndef OPENSSL_NO_COMP
- /* Don't actually allow compression; it uses ram and time, but the data
- * we transmit is all encrypted anyway. */
if (result->ctx->comp_methods)
result->ctx->comp_methods = NULL;
#endif
#endif
+
#ifdef SSL_MODE_RELEASE_BUFFERS
SSL_CTX_set_mode(result->ctx, SSL_MODE_RELEASE_BUFFERS);
#endif
diff --git a/src/common/util.c b/src/common/util.c
index 5b47028097..31d42a3e5c 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1172,7 +1172,7 @@ tor_parse_long(const char *s, int base, long min, long max,
char *endptr;
long r;
- if (base < 0) {
+ if (BUG(base < 0)) {
if (ok)
*ok = 0;
return 0;
@@ -1191,7 +1191,7 @@ tor_parse_ulong(const char *s, int base, unsigned long min,
char *endptr;
unsigned long r;
- if (base < 0) {
+ if (BUG(base < 0)) {
if (ok)
*ok = 0;
return 0;
@@ -1223,7 +1223,7 @@ tor_parse_uint64(const char *s, int base, uint64_t min,
char *endptr;
uint64_t r;
- if (base < 0) {
+ if (BUG(base < 0)) {
if (ok)
*ok = 0;
return 0;
@@ -1233,15 +1233,7 @@ tor_parse_uint64(const char *s, int base, uint64_t min,
#ifdef HAVE_STRTOULL
r = (uint64_t)strtoull(s, &endptr, base);
#elif defined(_WIN32)
-#if defined(_MSC_VER) && _MSC_VER < 1300
- tor_assert(base <= 10);
- r = (uint64_t)_atoi64(s);
- endptr = (char*)s;
- while (TOR_ISSPACE(*endptr)) endptr++;
- while (TOR_ISDIGIT(*endptr)) endptr++;
-#else
r = (uint64_t)_strtoui64(s, &endptr, base);
-#endif
#elif SIZEOF_LONG == 8
r = (uint64_t)strtoul(s, &endptr, base);
#else
@@ -4142,6 +4134,20 @@ process_handle_waitpid_cb(int status, void *arg)
#define CHILD_STATE_EXEC 8
#define CHILD_STATE_FAILEXEC 9
/** @} */
+/**
+ * Boolean. If true, then Tor may call execve or CreateProcess via
+ * tor_spawn_background.
+ **/
+static int may_spawn_background_process = 1;
+/**
+ * Turn off may_spawn_background_process, so that all future calls to
+ * tor_spawn_background are guaranteed to fail.
+ **/
+void
+tor_disable_spawning_background_processes(void)
+{
+ may_spawn_background_process = 0;
+}
/** Start a program in the background. If <b>filename</b> contains a '/', then
* it will be treated as an absolute or relative path. Otherwise, on
* non-Windows systems, the system path will be searched for <b>filename</b>.
@@ -4166,6 +4172,12 @@ tor_spawn_background(const char *const filename, const char **argv,
process_environment_t *env,
process_handle_t **process_handle_out)
{
+ if (BUG(may_spawn_background_process == 0)) {
+ /* We should never reach this point if we're forbidden to spawn
+ * processes. Instead we should have caught the attempt earlier. */
+ return PROCESS_STATUS_ERROR;
+ }
+
#ifdef _WIN32
HANDLE stdout_pipe_read = NULL;
HANDLE stdout_pipe_write = NULL;
diff --git a/src/common/util.h b/src/common/util.h
index d56abcee2e..f50cf043a4 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -109,19 +109,11 @@ extern int dmalloc_free(const char *file, const int line, void *pnt,
void tor_log_mallinfo(int severity);
-/** Return the offset of <b>member</b> within the type <b>tp</b>, in bytes */
-#if defined(__GNUC__) && __GNUC__ > 3
-#define STRUCT_OFFSET(tp, member) __builtin_offsetof(tp, member)
-#else
- #define STRUCT_OFFSET(tp, member) \
- ((off_t) (((char*)&((tp*)0)->member)-(char*)0))
-#endif
-
/** Macro: yield a pointer to the field at position <b>off</b> within the
* structure <b>st</b>. Example:
* <pre>
* struct a { int foo; int bar; } x;
- * off_t bar_offset = STRUCT_OFFSET(struct a, bar);
+ * off_t bar_offset = offsetof(struct a, bar);
* int *bar_p = STRUCT_VAR_P(&x, bar_offset);
* *bar_p = 3;
* </pre>
@@ -138,7 +130,7 @@ void tor_log_mallinfo(int severity);
* </pre>
*/
#define SUBTYPE_P(p, subtype, basemember) \
- ((void*) ( ((char*)(p)) - STRUCT_OFFSET(subtype, basemember) ))
+ ((void*) ( ((char*)(p)) - offsetof(subtype, basemember) ))
/* Logic */
/** Macro: true if two values have the same boolean value. */
@@ -404,6 +396,8 @@ void tor_check_port_forwarding(const char *filename,
struct smartlist_t *ports_to_forward,
time_t now);
+void tor_disable_spawning_background_processes(void);
+
typedef struct process_handle_t process_handle_t;
typedef struct process_environment_t process_environment_t;
int tor_spawn_background(const char *const filename, const char **argv,
diff --git a/src/common/util_bug.c b/src/common/util_bug.c
index 3d990e3700..cc1ac2ff84 100644
--- a/src/common/util_bug.c
+++ b/src/common/util_bug.c
@@ -13,6 +13,10 @@
#include "backtrace.h"
#include "container.h"
+#ifdef __COVERITY__
+int bug_macro_deadcode_dummy__ = 0;
+#endif
+
#ifdef TOR_UNIT_TESTS
static void (*failed_assertion_cb)(void) = NULL;
static int n_bugs_to_capture = 0;
diff --git a/src/common/util_bug.h b/src/common/util_bug.h
index ae7e7a37fd..de39317d1c 100644
--- a/src/common/util_bug.h
+++ b/src/common/util_bug.h
@@ -59,10 +59,13 @@
*/
#ifdef __COVERITY__
+extern int bug_macro_deadcode_dummy__;
#undef BUG
// Coverity defines this in global headers; let's override it. This is a
// magic coverity-only preprocessor thing.
-#nodef BUG(x) ((x)?(__coverity_panic__(),1):0)
+// We use this "deadcode_dummy__" trick to prevent coverity from
+// complaining about unreachable bug cases.
+#nodef BUG(x) ((x)?(__coverity_panic__(),1):(0+bug_macro_deadcode_dummy__))
#endif
#if defined(__COVERITY__) || defined(__clang_analyzer__)
diff --git a/src/config/geoip b/src/config/geoip
index f8752d8431..1610b73102 100644
--- a/src/config/geoip
+++ b/src/config/geoip
@@ -1,4 +1,4 @@
-# Last updated based on June 8 2017 Maxmind GeoLite2 Country
+# Last updated based on August 3 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
@@ -229,11 +229,13 @@
84049920,84082687,RO
84082688,84148223,RU
84148224,84410367,DE
-84410368,84416511,RU
+84410368,84414975,RU
+84414976,84415231,CY
+84415232,84416511,RU
84416512,84417535,GB
84417536,84418559,RU
84418560,84418815,UA
-84418816,84419071,RU
+84418816,84419071,NL
84419072,84419327,UA
84419328,84419583,NL
84419584,84420607,RU
@@ -416,7 +418,8 @@
86444024,86444031,FI
86444032,86444119,FR
86444120,86444123,ES
-86444124,86444315,FR
+86444124,86444311,FR
+86444312,86444315,PL
86444316,86444323,ES
86444324,86444331,FR
86444332,86444335,ES
@@ -434,13 +437,15 @@
86444784,86444791,GB
86444792,86444839,FR
86444840,86444843,ES
-86444844,86445375,FR
+86444844,86445311,FR
+86445312,86445319,NL
+86445320,86445375,FR
86445376,86445407,ES
86445408,86445551,FR
86445552,86445555,ES
86445556,86445563,FR
-86445564,86445695,ES
-86445696,86445831,FR
+86445564,86445567,ES
+86445568,86445831,FR
86445832,86445839,ES
86445840,86446407,FR
86446408,86446408,DE
@@ -458,7 +463,9 @@
86446656,86446663,ES
86446664,86446679,FR
86446680,86446683,ES
-86446684,86446727,FR
+86446684,86446715,FR
+86446716,86446719,DE
+86446720,86446727,FR
86446728,86446731,DE
86446732,86446767,FR
86446768,86446771,GB
@@ -469,8 +476,8 @@
86447104,86447279,FR
86447280,86447280,DE
86447281,86447287,FR
-86447288,86447288,DE
-86447289,86447335,FR
+86447288,86447291,DE
+86447292,86447335,FR
86447336,86447339,ES
86447340,86447351,FR
86447352,86447355,GB
@@ -505,9 +512,11 @@
86449760,86449791,IE
86449792,86449883,FR
86449884,86449884,DE
-86449885,86449987,FR
-86449988,86449988,LT
-86449989,86450163,FR
+86449885,86449983,FR
+86449984,86450015,LT
+86450016,86450087,FR
+86450088,86450091,PL
+86450092,86450163,FR
86450164,86450167,GB
86450168,86450335,FR
86450336,86450339,GB
@@ -562,13 +571,22 @@
86454300,86454303,DE
86454304,86454335,FR
86454336,86454343,DE
-86454344,86454615,FR
+86454344,86454463,FR
+86454464,86454527,DE
+86454528,86454559,FR
+86454560,86454591,CZ
+86454592,86454607,FR
+86454608,86454611,DE
+86454612,86454615,FR
86454616,86454619,ES
-86454620,86454823,FR
+86454620,86454751,FR
+86454752,86454783,CZ
+86454784,86454823,FR
86454824,86454831,ES
86454832,86454839,FR
86454840,86454847,GB
-86454848,86454899,FR
+86454848,86454855,DE
+86454856,86454899,FR
86454900,86454903,GB
86454904,86455003,FR
86455004,86455007,ES
@@ -576,7 +594,9 @@
86455592,86455595,NL
86455596,86455623,FR
86455624,86455624,DE
-86455625,86455767,FR
+86455625,86455631,FR
+86455632,86455647,CZ
+86455648,86455767,FR
86455768,86455771,GB
86455772,86456039,FR
86456040,86456043,FI
@@ -608,21 +628,33 @@
86457472,86457519,ES
86457520,86457703,FR
86457704,86457707,ES
-86457708,86457799,FR
+86457708,86457759,FR
+86457760,86457791,PL
+86457792,86457799,FR
86457800,86457803,ES
-86457804,86467207,FR
+86457804,86458183,FR
+86458184,86458187,DE
+86458188,86458295,FR
+86458296,86458299,CZ
+86458300,86467207,FR
86467208,86467211,IE
-86467212,86467320,FR
+86467212,86467279,FR
+86467280,86467283,DE
+86467284,86467320,FR
86467321,86467321,FI
-86467322,86467535,FR
-86467536,86467543,IT
-86467544,86467999,FR
+86467322,86467871,FR
+86467872,86467903,BE
+86467904,86467999,FR
86468000,86468003,PL
86468004,86468055,FR
86468056,86468056,DE
-86468057,86468199,FR
+86468057,86468103,FR
+86468104,86468111,IT
+86468112,86468199,FR
86468200,86468200,ES
-86468201,86468447,FR
+86468201,86468407,FR
+86468408,86468415,CH
+86468416,86468447,FR
86468448,86468479,CZ
86468480,86468571,FR
86468572,86468575,ES
@@ -630,7 +662,11 @@
86468588,86468591,ES
86468592,86468671,FR
86468672,86468675,ES
-86468676,86469183,FR
+86468676,86468799,FR
+86468800,86468831,PL
+86468832,86468883,FR
+86468884,86468887,PL
+86468888,86469183,FR
86469184,86469247,GB
86469248,86469691,FR
86469692,86469695,DE
@@ -649,7 +685,11 @@
86470752,86470767,PT
86470768,86470951,FR
86470952,86470959,GB
-86470960,86471083,FR
+86470960,86471007,FR
+86471008,86471023,IT
+86471024,86471063,FR
+86471064,86471071,PL
+86471072,86471083,FR
86471084,86471087,DE
86471088,86471123,FR
86471124,86471127,GB
@@ -663,9 +703,13 @@
86471296,86471327,GB
86471328,86471943,FR
86471944,86471947,ES
-86471948,86472775,FR
+86471948,86472063,FR
+86472064,86472095,IT
+86472096,86472775,FR
86472776,86472779,GB
-86472780,86473087,FR
+86472780,86472951,FR
+86472952,86472955,PL
+86472956,86473087,FR
86473088,86473151,PT
86473152,86473347,FR
86473348,86473359,ES
@@ -792,7 +836,8 @@
87570432,87572479,ES
87572480,87588863,MD
87588864,87590143,IR
-87590144,87590655,GB
+87590144,87590399,AE
+87590400,87590655,GB
87590656,87590911,IR
87590912,87592959,RU
87592960,87597055,DK
@@ -842,7 +887,9 @@
87762432,87762943,UA
87762944,87763967,KZ
87763968,87766527,RU
-87766528,87768063,CZ
+87766528,87766783,UA
+87766784,87767039,CZ
+87767040,87768063,RU
87768064,87777279,ES
87777280,87818239,CZ
87818240,87883775,PL
@@ -872,7 +919,8 @@
87954688,87957503,GB
87957504,87957759,ES
87957760,87958015,IN
-87958016,87958527,GB
+87958016,87958271,SG
+87958272,87958527,GB
87958528,87959039,CZ
87959040,87959527,NL
87959528,87959535,US
@@ -880,8 +928,7 @@
87959548,87959551,NL
87959552,87960063,DE
87960064,87960575,GB
-87960576,87962111,US
-87962112,87962623,GB
+87960576,87962623,US
87962624,87963647,CZ
87963648,87963651,US
87963652,87963655,AS
@@ -953,7 +1000,9 @@
87963964,87963999,US
87964000,87964003,VU
87964004,87964007,VE
-87964008,87964163,US
+87964008,87964015,US
+87964016,87964019,IN
+87964020,87964163,US
87964164,87964167,AS
87964168,87964171,AI
87964172,87964175,AG
@@ -1140,7 +1189,13 @@
87965144,87965147,YE
87965148,87965151,ZM
87965152,87965155,ZW
-87965156,87965183,CZ
+87965156,87965159,HR
+87965160,87965163,IL
+87965164,87965167,AF
+87965168,87965171,AL
+87965172,87965175,DZ
+87965176,87965179,AX
+87965180,87965183,CZ
87965184,87965187,GB
87965188,87965191,AD
87965192,87965195,AO
@@ -1261,7 +1316,14 @@
87965652,87965655,ZW
87965656,87965659,PT
87965660,87965663,US
-87965664,87965695,GB
+87965664,87965667,HR
+87965668,87965671,IL
+87965672,87965675,AF
+87965676,87965679,AL
+87965680,87965683,DZ
+87965684,87965687,AX
+87965688,87965691,IN
+87965692,87965695,GB
87965696,87967743,DE
87967744,87969791,IT
87969792,87970815,IM
@@ -1370,7 +1432,6 @@
90562176,90562303,QA
90562304,90570751,RU
90570752,90578943,IT
-90578944,90583039,IR
90583040,90587135,CZ
90587136,90589183,PL
90589184,90591231,FR
@@ -1589,9 +1650,15 @@
92736488,92736491,ES
92736492,92736607,FR
92736608,92736639,PT
-92736640,92737611,FR
+92736640,92737151,FR
+92737152,92737183,NL
+92737184,92737199,FR
+92737200,92737215,PL
+92737216,92737611,FR
92737612,92737615,GB
-92737616,92738071,FR
+92737616,92737887,FR
+92737888,92737903,IT
+92737904,92738071,FR
92738072,92738075,DE
92738076,92738239,FR
92738240,92738271,GB
@@ -1601,9 +1668,13 @@
92738784,92738815,GB
92738816,92739199,FR
92739200,92739215,DE
-92739216,92739403,FR
+92739216,92739351,FR
+92739352,92739355,PL
+92739356,92739403,FR
92739404,92739407,IE
-92739408,92740611,FR
+92739408,92740415,FR
+92740416,92740431,NL
+92740432,92740611,FR
92740612,92740615,CZ
92740616,92740639,FR
92740640,92740671,ES
@@ -1611,13 +1682,13 @@
92740916,92740923,DE
92740924,92741331,FR
92741332,92741335,ES
-92741336,92742343,FR
-92742344,92742347,GB
-92742348,92742419,FR
+92741336,92742419,FR
92742420,92742423,ES
92742424,92742527,FR
92742528,92742543,IT
-92742544,92742771,FR
+92742544,92742607,FR
+92742608,92742623,BE
+92742624,92742771,FR
92742772,92742775,ES
92742776,92742815,FR
92742816,92742819,ES
@@ -1643,7 +1714,11 @@
92745664,92745695,PL
92745696,92746415,FR
92746416,92746431,ES
-92746432,92747547,FR
+92746432,92746559,FR
+92746560,92746623,IT
+92746624,92747043,FR
+92747044,92747047,CH
+92747048,92747547,FR
92747548,92747567,ES
92747568,92747711,FR
92747712,92747775,GB
@@ -1666,7 +1741,9 @@
92749040,92749055,IE
92749056,92749067,FR
92749068,92749071,GB
-92749072,92749747,FR
+92749072,92749135,FR
+92749136,92749151,FI
+92749152,92749747,FR
92749748,92749751,ES
92749752,92750639,FR
92750640,92750643,ES
@@ -1678,7 +1755,8 @@
92751632,92751647,CH
92751648,92751711,FR
92751712,92751807,DE
-92751808,92752031,FR
+92751808,92751871,NL
+92751872,92752031,FR
92752032,92752063,FI
92752064,92753079,FR
92753080,92753087,ES
@@ -1692,7 +1770,9 @@
92754368,92754431,GB
92754432,92754447,FR
92754448,92754463,GB
-92754464,92754579,FR
+92754464,92754551,FR
+92754552,92754555,DE
+92754556,92754579,FR
92754580,92754583,ES
92754584,92755135,FR
92755136,92755199,PT
@@ -1713,11 +1793,13 @@
92759264,92759279,ES
92759280,92760159,FR
92760160,92760191,DE
-92760192,92760323,FR
+92760192,92760255,CZ
+92760256,92760323,FR
92760324,92760327,DE
92760328,92760607,FR
92760608,92760639,GB
-92760640,92761151,FR
+92760640,92760671,LT
+92760672,92761151,FR
92761152,92761215,PT
92761216,92761375,FR
92761376,92761391,FI
@@ -1731,7 +1813,12 @@
92762384,92762391,ES
92762392,92762719,FR
92762720,92762751,PT
-92762752,92763127,FR
+92762752,92762783,BE
+92762784,92762863,FR
+92762864,92762879,IT
+92762880,92763103,FR
+92763104,92763119,CZ
+92763120,92763127,FR
92763128,92763135,ES
92763136,92763391,FR
92763392,92763519,IE
@@ -1747,7 +1834,13 @@
92765424,92765427,GB
92765428,92766015,FR
92766016,92766047,ES
-92766048,92777855,FR
+92766048,92776671,FR
+92776672,92776703,PL
+92776704,92776895,FR
+92776896,92776959,NL
+92776960,92777055,FR
+92777056,92777087,DE
+92777088,92777855,FR
92777856,92777983,GB
92777984,92778431,FR
92778432,92778495,ES
@@ -1755,9 +1848,14 @@
92782336,92782528,RU
92782529,92782529,FR
92782530,92782591,RU
-92782592,92782687,FR
+92782592,92782623,FR
+92782624,92782655,PL
+92782656,92782687,FR
92782688,92782719,ES
-92782720,92782975,FR
+92782720,92782815,FR
+92782816,92782847,CZ
+92782848,92782879,NL
+92782880,92782975,FR
92782976,92782979,ES
92782980,92783155,FR
92783156,92783159,GB
@@ -1767,13 +1865,19 @@
92783360,92783423,ES
92783424,92783543,FR
92783544,92783547,ES
-92783548,92784239,FR
+92783548,92783871,FR
+92783872,92783887,PL
+92783888,92784239,FR
92784240,92784243,DE
92784244,92784255,FR
92784256,92784263,NL
-92784264,92784667,FR
+92784264,92784319,FR
+92784320,92784351,NL
+92784352,92784667,FR
92784668,92784671,IE
-92784672,92784895,FR
+92784672,92784687,LT
+92784688,92784703,FI
+92784704,92784895,FR
92784896,92784959,ES
92784960,92785183,FR
92785184,92785199,ES
@@ -1786,7 +1890,9 @@
92785612,92785615,ES
92785616,92785735,FR
92785736,92785739,DE
-92785740,92786175,FR
+92785740,92785791,FR
+92785792,92785823,CZ
+92785824,92786175,FR
92786176,92786179,GB
92786180,92786239,FR
92786240,92786255,FI
@@ -1802,19 +1908,25 @@
92787200,92787203,FI
92787204,92787251,FR
92787252,92787255,ES
-92787256,92787707,FR
+92787256,92787567,FR
+92787568,92787583,IT
+92787584,92787707,FR
92787708,92787711,FI
-92787712,92788127,FR
+92787712,92788095,FR
+92788096,92788127,DE
92788128,92788131,FI
92788132,92788399,FR
92788400,92788415,FI
-92788416,92788479,FR
+92788416,92788447,FR
+92788448,92788479,BE
92788480,92788495,FI
92788496,92789119,FR
92789120,92789183,ES
92789184,92789255,FR
92789256,92789259,GB
-92789260,92789703,FR
+92789260,92789463,FR
+92789464,92789471,IT
+92789472,92789703,FR
92789704,92789707,DE
92789708,92790271,FR
92790272,92790275,DE
@@ -1829,16 +1941,25 @@
92792432,92792671,FR
92792672,92792675,GB
92792676,92792679,NL
-92792680,92793055,FR
+92792680,92793023,FR
+92793024,92793055,DE
92793056,92793087,ES
-92793088,92794227,FR
+92793088,92793327,FR
+92793328,92793331,PL
+92793332,92794227,FR
92794228,92794231,PT
92794232,92794239,ES
-92794240,92794691,FR
+92794240,92794335,FR
+92794336,92794367,NL
+92794368,92794691,FR
92794692,92794695,ES
-92794696,92795631,FR
+92794696,92795195,FR
+92795196,92795199,BE
+92795200,92795631,FR
92795632,92795639,CZ
-92795640,92796575,FR
+92795640,92796499,FR
+92796500,92796503,PL
+92796504,92796575,FR
92796576,92796579,GB
92796580,92796687,FR
92796688,92796691,DE
@@ -1851,7 +1972,11 @@
92797356,92797359,DE
92797360,92797679,FR
92797680,92797695,FI
-92797696,92798591,FR
+92797696,92798211,FR
+92798212,92798215,PL
+92798216,92798255,FR
+92798256,92798271,LT
+92798272,92798591,FR
92798592,92798623,PT
92798624,92798975,FR
92798976,93323263,RU
@@ -1874,8 +1999,7 @@
93419520,93421567,IT
93421568,93425663,DE
93425664,93426183,SE
-93426184,93427085,DE
-93427087,93427711,DE
+93426184,93427711,DE
93427712,93429759,NO
93429760,93431807,RU
93431808,93433855,ES
@@ -2196,21 +2320,25 @@
96173056,96174079,MF
96174080,96206847,HU
96206848,96209407,RU
-96209408,96209663,HR
-96209664,96245759,RU
+96209408,96209919,HR
+96209920,96220159,RU
+96220160,96221183,NL
+96221184,96235519,RU
+96235520,96236543,NL
+96236544,96245759,RU
96245760,96246783,KZ
96246784,96247807,RU
96247808,96248831,NL
96248832,96251903,RU
-96251904,96252927,NL
+96251904,96252159,DE
+96252160,96252671,UA
+96252672,96252927,NL
96252928,96255999,RU
96256000,96258047,NL
-96258048,96259071,RU
-96259072,96259327,NL
+96258048,96259327,RU
96259328,96259583,RO
96259584,96259839,US
-96259840,96260095,NL
-96260096,96262143,RU
+96259840,96262143,RU
96262144,96262399,NL
96262400,96264191,RU
96264192,96265215,NL
@@ -2241,11 +2369,12 @@
96327680,96327935,NL
96327936,96328191,RO
96328192,96328447,US
-96328448,96328703,UA
+96328448,96328703,DE
96328704,96329727,RU
96329728,96333823,GB
96333824,96335871,RU
-96335872,96336895,NL
+96335872,96336127,NL
+96336128,96336895,RU
96336896,96337151,CZ
96337152,96337663,NL
96337664,96337919,US
@@ -2258,23 +2387,41 @@
96739480,96739483,DE
96739484,96739583,FR
96739584,96739587,PT
-96739588,96740302,FR
+96739588,96739807,FR
+96739808,96739839,NL
+96739840,96740302,FR
96740303,96740303,IT
-96740304,96741039,FR
+96740304,96740431,FR
+96740432,96740447,PL
+96740448,96741039,FR
96741040,96741043,PT
-96741044,96741375,FR
+96741044,96741351,FR
+96741352,96741359,LT
+96741360,96741375,FR
96741376,96741391,GB
-96741392,96743951,FR
+96741392,96741839,FR
+96741840,96741843,DE
+96741844,96742815,FR
+96742816,96742831,NL
+96742832,96743951,FR
96743952,96743967,GB
-96743968,96744319,FR
+96743968,96744015,FR
+96744016,96744031,BE
+96744032,96744319,FR
96744320,96744335,PT
-96744336,96745071,FR
+96744336,96744467,FR
+96744468,96744471,DE
+96744472,96745071,FR
96745072,96745087,GB
96745088,96745231,FR
96745232,96745247,GB
-96745248,96747291,FR
+96745248,96746867,FR
+96746868,96746871,PL
+96746872,96747291,FR
96747292,96747295,PT
-96747296,96747343,FR
+96747296,96747323,FR
+96747324,96747327,PL
+96747328,96747343,FR
96747344,96747359,DE
96747360,96747407,FR
96747408,96747423,DE
@@ -2309,15 +2456,28 @@
96763164,96763167,PT
96763168,96763455,FR
96763456,96763471,ES
-96763472,96763551,FR
+96763472,96763495,FR
+96763496,96763503,IT
+96763504,96763551,FR
96763552,96763555,GB
96763556,96763575,FR
96763576,96763579,ES
-96763580,96764239,FR
+96763580,96763935,FR
+96763936,96763967,IT
+96763968,96764207,FR
+96764208,96764223,LT
+96764224,96764239,FR
96764240,96764255,DE
-96764256,96764383,FR
+96764256,96764303,FR
+96764304,96764319,DE
+96764320,96764383,FR
96764384,96764399,FI
-96764400,96766063,FR
+96764400,96764415,CZ
+96764416,96764859,FR
+96764860,96764863,CZ
+96764864,96765327,FR
+96765328,96765335,NL
+96765336,96766063,FR
96766064,96766079,ES
96766080,96766259,FR
96766260,96766263,ES
@@ -2327,12 +2487,18 @@
96766912,96766915,GB
96766916,96767031,FR
96767032,96767035,GB
-96767036,96767823,FR
+96767036,96767243,FR
+96767244,96767247,DE
+96767248,96767823,FR
96767824,96767839,BE
-96767840,96768143,FR
+96767840,96767903,FR
+96767904,96767935,PL
+96767936,96768143,FR
96768144,96768151,PT
96768152,96768155,FI
-96768156,96768603,FR
+96768156,96768559,FR
+96768560,96768563,PL
+96768564,96768603,FR
96768604,96768607,DE
96768608,96769279,FR
96769280,96769295,ES
@@ -2360,7 +2526,9 @@
96774912,96775039,GB
96775040,96775183,FR
96775184,96775199,PT
-96775200,96775491,FR
+96775200,96775231,FR
+96775232,96775295,DE
+96775296,96775491,FR
96775492,96775495,ES
96775496,96775551,FR
96775552,96775567,GB
@@ -2372,9 +2540,13 @@
96776320,96776323,ES
96776324,96776511,FR
96776512,96776543,ES
-96776544,96777023,FR
+96776544,96776891,FR
+96776892,96776895,DE
+96776896,96777023,FR
96777024,96777087,ES
-96777088,96778015,FR
+96777088,96777951,FR
+96777952,96777983,PL
+96777984,96778015,FR
96778016,96778031,ES
96778032,96778103,FR
96778104,96778107,BE
@@ -2385,7 +2557,8 @@
96778240,96778243,NL
96778244,96778255,FR
96778256,96778259,NL
-96778260,96778859,FR
+96778260,96778263,PL
+96778264,96778859,FR
96778860,96778863,NL
96778864,96778867,CZ
96778868,96778871,BE
@@ -2401,9 +2574,13 @@
96780356,96780359,BE
96780360,96780815,FR
96780816,96780823,ES
-96780824,96781407,FR
+96780824,96780847,FR
+96780848,96780855,CZ
+96780856,96781407,FR
96781408,96781423,FI
-96781424,96782167,FR
+96781424,96781647,FR
+96781648,96781663,IT
+96781664,96782167,FR
96782168,96782175,ES
96782176,96782199,FR
96782200,96782207,CZ
@@ -2421,7 +2598,13 @@
96783888,96783903,DE
96783904,96784495,FR
96784496,96784511,FI
-96784512,96785135,FR
+96784512,96784719,FR
+96784720,96784723,NL
+96784724,96784807,FR
+96784808,96784811,PL
+96784812,96784827,FR
+96784828,96784831,PL
+96784832,96785135,FR
96785136,96785151,NL
96785152,96785183,FR
96785184,96785199,ES
@@ -2433,13 +2616,24 @@
96785604,96785607,PT
96785608,96786431,FR
96786432,96786495,GB
-96786496,96788143,FR
+96786496,96787999,FR
+96788000,96788031,LT
+96788032,96788143,FR
96788144,96788159,ES
-96788160,96792319,FR
+96788160,96792283,FR
+96792284,96792287,DE
+96792288,96792319,FR
96792320,96792383,ES
-96792384,96792751,FR
+96792384,96792447,NL
+96792448,96792511,FR
+96792512,96792575,IT
+96792576,96792751,FR
96792752,96792767,DE
-96792768,96793583,FR
+96792768,96792923,FR
+96792924,96792927,PL
+96792928,96793039,FR
+96793040,96793047,IT
+96793048,96793583,FR
96793584,96793599,DE
96793600,96793687,FR
96793688,96793688,ES
@@ -2449,7 +2643,9 @@
96794160,96794175,ES
96794176,96794471,FR
96794472,96794479,ES
-96794480,96796671,FR
+96794480,96794623,FR
+96794624,96794687,CZ
+96794688,96796671,FR
96796672,96862207,AZ
96862208,96894975,GB
96894976,96897023,CZ
@@ -2630,66 +2826,38 @@
100532480,100532735,US
100532736,100548872,RO
100548873,100548873,TR
-100548874,100551943,RO
-100551944,100551951,US
-100551952,100552863,RO
-100552864,100552871,AT
-100552872,100553279,RO
-100553280,100553287,DE
-100553288,100554447,RO
-100554448,100554463,DE
-100554464,100554999,RO
-100555000,100555000,DE
-100555001,100555007,RO
-100555008,100555263,DE
-100555264,100558871,RO
-100558872,100558875,DE
-100558876,100558919,RO
-100558920,100558927,DE
-100558928,100558943,RO
-100558944,100558951,DE
-100558952,100559107,RO
-100559108,100559115,DE
-100559116,100559135,RO
-100559136,100559139,DE
-100559140,100559167,RO
-100559168,100559175,DE
-100559176,100559207,RO
-100559208,100559215,DE
-100559216,100559223,RO
-100559224,100559231,DE
-100559232,100559255,RO
+100548874,100550143,RO
+100550144,100550399,NL
+100550400,100550655,DE
+100550656,100550911,RO
+100550912,100551167,NL
+100551168,100551423,US
+100551424,100551679,DE
+100551680,100552191,US
+100552192,100552447,GB
+100552448,100552703,US
+100552704,100552959,AT
+100552960,100553215,US
+100553216,100553471,DE
+100553472,100553727,AT
+100553728,100553983,US
+100553984,100554495,DE
+100554496,100554751,US
+100554752,100555263,DE
+100555264,100555519,US
+100555520,100558847,RO
+100558848,100559255,DE
100559256,100559263,EG
-100559264,100559359,RO
-100559360,100559391,GB
-100559392,100559423,RO
-100559424,100559439,GB
-100559440,100559447,RO
-100559448,100559455,GB
-100559456,100559471,RO
-100559472,100559519,GB
-100559520,100559551,RO
-100559552,100559615,GB
-100559616,100559743,RO
-100559744,100559871,GB
-100559872,100559935,US
-100559936,100560127,RO
-100560128,100560383,US
-100560384,100560455,RO
-100560456,100560463,US
-100560464,100560639,RO
-100560640,100560643,US
-100560644,100560727,RO
-100560728,100560751,US
-100560752,100560895,RO
-100560896,100560959,GB
-100560960,100561023,RO
-100561024,100561151,GB
+100559264,100559359,DE
+100559360,100559871,GB
+100559872,100560895,US
+100560896,100561151,GB
100561152,100561407,RO
100561408,100561919,US
-100561920,100564799,RO
-100564800,100564863,US
-100564864,100564991,RO
+100561920,100562943,RO
+100562944,100564223,DE
+100564224,100564479,RO
+100564480,100564991,US
100564992,100573183,SE
100573184,100575231,GB
100575232,100577279,DK
@@ -2702,7 +2870,10 @@
100612096,100630527,NL
100630528,100632575,BE
100632576,100634623,GB
-100634624,100636671,ES
+100634624,100635199,ES
+100635200,100635247,BE
+100635248,100635263,CH
+100635264,100636671,ES
100636672,100638719,NL
100638720,100646911,UA
100646912,100647679,RU
@@ -2787,7 +2958,9 @@
136413184,136415665,CA
136415666,136415666,FR
136415667,136415743,CA
-136415744,136708095,US
+136415744,136702290,US
+136702291,136702291,UM
+136702292,136708095,US
136708096,136710143,GB
136710144,136712191,US
136712192,136714031,GB
@@ -2800,9 +2973,7 @@
152338432,167772159,US
184549376,202182143,US
202182144,202182399,GB
-202182400,203658975,US
-203658976,203658991,VI
-203658992,204047871,US
+202182400,204047871,US
204047872,204047999,PR
204048000,204048031,US
204048032,204048047,PR
@@ -2826,8 +2997,7 @@
214787584,214787711,PR
214787712,214787839,US
214787840,214788095,PR
-214788096,219187465,US
-219187468,219249919,US
+214788096,219249919,US
219249920,219250175,GB
219250176,219512063,US
219512064,219512319,GB
@@ -2928,17 +3098,28 @@
225087488,225088511,US
225088512,225089023,SG
225089024,225089535,IE
-225089536,225443839,US
+225089536,225093631,US
+225093632,225094143,SG
+225094144,225094655,JP
+225094656,225095167,US
+225095168,225095679,IE
+225095680,225096191,AU
+225096192,225096703,HK
+225096704,225443839,US
225443840,225705983,JP
225705984,226230271,US
-226230272,226295807,KR
-226295808,226361343,US
+226230272,226361343,KR
226361344,226492415,IN
226492416,231866367,US
231866368,231997439,AU
231997440,233046015,US
233046016,233177087,SG
-233177088,234881023,US
+233177088,233308159,JP
+233308160,233570303,IN
+233570304,233832447,AU
+233832448,234487807,US
+234487808,234618879,SG
+234618880,234881023,US
234881024,234883071,CN
234883072,234884095,JP
234884096,234885119,CN
@@ -3029,7 +3210,7 @@
247470080,247472127,IN
247472128,247476223,JP
247477248,247478271,IN
-247478272,247480319,CN
+247479296,247480319,CN
247480320,247482367,MY
247482368,247483391,PG
247483392,247484415,CN
@@ -3050,29 +3231,25 @@
249561088,251658239,VN
251658240,257532415,US
257532416,257532423,AU
+257532424,257532431,US
257532432,257532671,AU
257532672,257534463,US
257534464,257534719,IN
257534720,257597951,US
257597952,257597959,ES
+257597960,257597967,US
257597968,257598207,ES
257598208,257598463,US
257598464,257599487,FR
-257599488,264485119,US
-264485376,264997119,US
-264997376,265003519,US
+257599488,265003519,US
265003520,265003547,GB
265003548,265003548,FR
265003549,265003775,GB
-265003776,265005311,US
-265005312,265005567,CH
-265005568,265007643,US
+265003776,265007643,US
265007644,265007645,GB
265007646,265025791,US
265025792,265026047,GB
-265026048,265525503,US
-265525760,265529599,US
-265529856,265533695,US
+265026048,265533695,US
265533696,265533951,PH
265533952,266059775,US
266059776,266061823,IN
@@ -3224,7 +3401,9 @@
290913792,290914047,AU
290914048,291110911,US
291110912,291119103,AU
-291119104,300646399,US
+291119104,291201023,US
+291201024,291203071,JP
+291203072,300646399,US
300646400,300650495,JP
300650496,300654591,SG
300654592,300658687,US
@@ -3270,7 +3449,9 @@
301989032,301989119,US
301989120,301989375,AU
301989376,301989631,SG
-301989632,314703871,US
+301989632,301989711,US
+301989712,301989719,JP
+301989720,314703871,US
314703872,314966015,DE
314966016,317128703,US
317128704,317194239,BR
@@ -3278,17 +3459,17 @@
323243896,323243903,FR
323243904,332132119,US
332132120,332132127,IL
-332132128,344260863,US
-344261120,344261778,US
-344261780,344262655,US
+332132128,344262655,US
344262656,344262911,GB
344262912,344268799,US
344268800,344268817,GB
+344268818,344268818,US
344268819,344276991,GB
344276992,344588799,US
344588800,344589055,GB
344589056,344592895,US
344592896,344592945,GB
+344592946,344592946,US
344592947,344593151,GB
344593152,344662783,US
344662784,344663039,MY
@@ -3296,12 +3477,13 @@
344670208,344678399,IN
344678400,344711167,US
344711168,344719359,AU
-344719360,344880127,US
-344880384,344881151,US
+344719360,344881151,US
344881152,344881407,IN
344881408,344977407,US
344977408,344977663,IN
-344977664,355993887,US
+344977664,347602943,US
+347602944,347619327,SG
+347619328,355993887,US
355993888,355993895,IT
355993896,368674047,US
368674048,368674303,ES
@@ -3337,13 +3519,9 @@
386060288,386068479,NL
386068480,386073343,US
386073344,386073599,NL
-386073600,386074111,US
-386074112,386074623,NL
-386074624,386076415,US
+386073600,386076415,US
386076416,386076671,NL
-386076672,386088959,US
-386088960,386089983,NL
-386089984,386095615,US
+386076672,386095615,US
386095616,386096127,NL
386096128,386109439,US
386109440,386113535,NL
@@ -3414,12 +3592,14 @@
386923520,386924543,NL
386924544,387055615,CA
387055616,387121151,PR
-387121152,387825663,US
+387121152,387707903,US
+387707904,387708159,CH
+387708160,387825663,US
387825664,387833855,CA
387833856,387975167,US
387975168,387976191,NL
-387976192,387976703,US
-387976704,387978239,NL
+387976192,387977215,US
+387977216,387978239,NL
387978240,387979263,US
387979264,387980287,NL
387980288,387994623,US
@@ -3437,7 +3617,9 @@
388051968,388055039,US
388055040,388059135,NL
388059136,388091903,US
-388091904,388101119,NL
+388091904,388095999,NL
+388096000,388100095,US
+388100096,388101119,NL
388101120,388139519,US
388139520,388140031,NL
388140032,388149247,US
@@ -3451,8 +3633,8 @@
388208128,388223999,US
388224000,388225023,NL
388225024,388272127,US
-388272128,388284415,NL
-388284416,388288511,US
+388272128,388280319,NL
+388280320,388288511,US
388288512,388293631,NL
388293632,388294143,US
388294144,388296703,NL
@@ -3478,7 +3660,9 @@
388481024,388485119,NL
388485120,388493311,US
388493312,388501503,NL
-388501504,388526079,US
+388501504,388521983,US
+388521984,388523007,NL
+388523008,388526079,US
388526080,388530175,NL
388530176,388538367,US
388538368,388542463,NL
@@ -3495,19 +3679,23 @@
388636672,388677631,US
388677632,388681727,NL
388681728,388698111,US
-388698112,388714495,NL
+388698112,388706303,NL
+388706304,388710399,US
+388710400,388714495,NL
388714496,388722687,US
388722688,388730879,NL
-388730880,388788223,US
+388730880,388784895,US
+388784896,388786175,NL
+388786176,388788223,US
388788224,388792319,NL
-388792320,388812799,US
-388812800,388816895,NL
-388816896,388843519,US
+388792320,388843519,US
388843520,388844543,NL
388844544,388849663,US
388849664,388853759,NL
-388853760,388857855,US
-388857856,388865023,NL
+388853760,388856831,US
+388856832,388857343,NL
+388857344,388862975,US
+388862976,388865023,NL
388865024,388866047,US
388866048,388870143,NL
388870144,388885503,US
@@ -3534,8 +3722,8 @@
389044224,389045247,NL
389045248,389060607,US
389060608,389061631,NL
-389061632,389074943,US
-389074944,389078015,NL
+389061632,389076479,US
+389076480,389078015,NL
389078016,389079039,US
389079040,389083135,NL
389083136,389102079,US
@@ -3552,23 +3740,29 @@
389242880,389251071,NL
389251072,389273599,US
389273600,389283839,NL
-389283840,389287935,US
-389287936,389292031,NL
+389283840,389286911,US
+389286912,389292031,NL
389292032,389296127,US
389296128,389300223,NL
389300224,389319167,US
389319168,389319679,NL
389319680,389320191,US
389320192,389320447,NL
-389320448,389332991,US
-389332992,389341183,NL
-389341184,389349375,US
-389349376,389365759,NL
-389365760,389410815,US
-389410816,389419007,NL
+389320448,389350143,US
+389350144,389350399,NL
+389350400,389350655,US
+389350656,389351423,NL
+389351424,389351935,US
+389351936,389352703,NL
+389352704,389353215,US
+389353216,389365759,NL
+389365760,389391359,US
+389391360,389393407,NL
+389393408,389414911,US
+389414912,389419007,NL
389419008,389435391,US
-389435392,389443583,NL
-389443584,389447679,US
+389435392,389445119,NL
+389445120,389447679,US
389447680,389455871,NL
389455872,389495295,US
389495296,389495807,NL
@@ -3578,17 +3772,27 @@
389515264,389521407,NL
389521408,389554175,US
389554176,389562367,NL
-389562368,389615615,US
+389562368,389570559,US
+389570560,389570815,NL
+389570816,389571583,US
+389571584,389571839,NL
+389571840,389572095,US
+389572096,389572607,NL
+389572608,389572863,US
+389572864,389573119,NL
+389573120,389573887,US
+389573888,389574143,NL
+389574144,389591039,US
+389591040,389592063,NL
+389592064,389593087,US
+389593088,389594111,NL
+389594112,389615615,US
389615616,389619711,NL
-389619712,389628415,US
-389628416,389628927,NL
-389628928,389631999,US
-389632000,389641215,NL
-389641216,389700863,US
+389619712,389634047,US
+389634048,389635071,NL
+389635072,389700863,US
389700864,389701119,NL
-389701120,389730303,US
-389730304,389734399,NL
-389734400,389764095,US
+389701120,389764095,US
389764096,389765631,NL
389765632,389767167,US
389767168,389775359,NL
@@ -3652,8 +3856,8 @@
390131712,390141439,US
390141440,390141695,NL
390141696,390143231,US
-390143232,390148095,NL
-390148096,390165503,US
+390143232,390143999,NL
+390144000,390165503,US
390165504,390166527,NL
390166528,390184959,US
390184960,390193151,NL
@@ -3667,11 +3871,9 @@
390277632,390278143,NL
390278144,390278911,US
390278912,390279167,NL
-390279168,390284799,US
-390284800,390285311,NL
-390285312,390286847,US
-390286848,390291455,NL
-390291456,390299647,US
+390279168,390286847,US
+390286848,390287359,NL
+390287360,390299647,US
390299648,390304767,NL
390304768,390332159,US
390332160,390332415,GB
@@ -3680,7 +3882,9 @@
390732032,390732287,US
390732288,390732799,NL
390732800,390746111,US
-390746112,390758399,NL
+390746112,390750207,NL
+390750208,390754303,US
+390754304,390758399,NL
390758400,390767615,US
390767616,390768639,NL
390768640,390770687,US
@@ -3706,7 +3910,11 @@
391368704,391372799,CA
391372800,391376895,US
391376896,391380991,CA
-391380992,391872511,US
+391380992,391865855,US
+391865856,391866879,HK
+391866880,391867391,US
+391867392,391867647,VN
+391867648,391872511,US
391872512,391888895,CA
391888896,391897087,US
391897088,391905279,CA
@@ -3984,7 +4192,9 @@
392851456,392852479,NL
392852480,392852735,US
392852736,392852991,NL
-392852992,393007103,US
+392852992,392853503,US
+392853504,392855551,SG
+392855552,393007103,US
393007104,393008639,NL
393008640,393008895,US
393008896,393011199,NL
@@ -4000,7 +4210,8 @@
393042728,393084927,NL
393084928,393150463,US
393150464,393152511,NL
-393152512,393154559,US
+393152512,393153535,US
+393153536,393154559,SG
393154560,393158655,NL
393158656,393166847,US
393166848,393170943,CA
@@ -4008,9 +4219,9 @@
393175040,394264575,US
394264576,394264831,CA
394270720,394271231,NL
+394280960,394281215,US
394296320,394296831,NL
-394297344,394297599,US
-394330112,394788863,US
+394297344,394788863,US
394821632,394821887,US
394854400,394854655,CA
394887168,394887423,US
@@ -4028,7 +4239,6 @@
395345920,395346175,CA
395378688,395576319,US
395608064,395608319,CA
-395640832,395641087,US
395673600,395673855,CA
395706368,395706623,CA
395739136,395739391,US
@@ -4050,27 +4260,35 @@
397410304,397410559,CA
397443072,397443327,US
397475840,397541375,US
-397541376,397541631,CA
+397541376,397541887,CA
397574144,397574399,US
397606912,397607423,CA
397639680,397639935,US
-397672448,397803519,US
-397803520,397803775,CA
-397869056,397869311,US
-397934592,398065663,US
+397672448,397738239,US
+397770752,397771007,CA
+397803520,397869055,CA
+397869056,398065663,US
398065664,398065919,CA
-398131200,398131455,US
+398098432,398098687,US
+398131200,398196735,US
398196736,398196991,KY
-398262272,398262527,US
+398229504,398229759,US
+398262272,398327807,US
398327808,398328063,PR
+398360576,398360831,CA
398393344,398393599,US
+398426112,398426367,CA
398458880,398500351,US
398500352,398500863,NL
398500864,398532607,US
398532608,398536703,NL
398536704,398566911,US
398566912,398567423,NL
-398567424,398644735,US
+398567424,398640127,US
+398640128,398641151,NL
+398641152,398642175,US
+398642176,398643199,NL
+398643200,398644735,US
398644736,398645247,NL
398645248,398657535,US
398657536,398658559,NL
@@ -4144,11 +4362,19 @@
399486976,399491071,NL
399491072,399495167,US
399495168,399503359,NL
-399503360,399622143,US
+399503360,399591423,US
+399591424,399591935,NL
+399591936,399594495,US
+399594496,399595519,NL
+399595520,399622143,US
399622144,399630335,NL
399630336,399688191,US
399688192,399688703,NL
-399688704,399734527,US
+399688704,399702015,US
+399702016,399704063,NL
+399704064,399705087,US
+399705088,399707135,NL
+399707136,399734527,US
399734528,399735807,NL
399735808,399738879,US
399738880,399739135,NL
@@ -4156,15 +4382,23 @@
399739392,399739647,NL
399739648,399740927,US
399740928,399749119,NL
-399749120,399797247,US
+399749120,399769855,US
+399769856,399770111,NL
+399770112,399797247,US
399797248,399797759,NL
-399797760,399870975,US
+399797760,399828991,US
+399828992,399830015,NL
+399830016,399849471,US
+399849472,399850495,NL
+399850496,399870975,US
399870976,399871999,NL
399872000,399908863,US
399908864,399919615,NL
399919616,399921151,US
399921152,399949823,NL
-399949824,399953919,US
+399949824,399951871,US
+399951872,399952895,NL
+399952896,399953919,US
399953920,399958015,NL
399958016,399968511,US
399968512,399968767,NL
@@ -4180,9 +4414,7 @@
400021248,400021503,NL
400021504,400034815,US
400034816,400035327,NL
-400035328,400047103,US
-400047104,400047615,NL
-400047616,400056319,US
+400035328,400056319,US
400056320,400064511,NL
400064512,400083455,US
400083456,400084991,NL
@@ -4200,8 +4432,8 @@
400144384,400145407,NL
400145408,400149503,US
400149504,400150015,NL
-400150016,400154623,US
-400154624,400162815,NL
+400150016,400150527,US
+400150528,400162815,NL
400162816,400201215,US
400201216,400202751,NL
400202752,400203775,US
@@ -4213,8 +4445,8 @@
400250880,400251647,US
400251648,400251903,NL
400251904,400261119,US
-400261120,400261631,NL
-400261632,400263167,US
+400261120,400261887,NL
+400261888,400263167,US
400263168,400263679,NL
400263680,400264703,US
400264704,400265215,NL
@@ -4244,24 +4476,194 @@
400797864,400797871,IT
400797872,400805887,US
400805888,400809983,CA
-400809984,400883887,US
+400809984,400883711,US
+400883712,400883799,CA
+400883800,400883807,US
+400883808,400883823,CA
+400883824,400883831,US
+400883832,400883855,CA
+400883856,400883871,US
+400883872,400883887,CA
400883888,400883895,BG
-400883896,400883919,US
+400883896,400883919,CA
400883920,400883927,GB
-400883928,400884479,US
+400883928,400884255,CA
+400884256,400884287,US
+400884288,400884335,CA
+400884336,400884351,US
+400884352,400884479,CA
400884480,400884735,TR
400884736,400884991,GB
-400884992,400885103,US
+400884992,400885007,US
+400885008,400885095,CA
+400885096,400885103,US
400885104,400885111,GB
-400885112,400887343,US
+400885112,400885119,US
+400885120,400885279,CA
+400885280,400885311,US
+400885312,400886031,CA
+400886032,400886047,US
+400886048,400886351,CA
+400886352,400886383,US
+400886384,400886495,CA
+400886496,400886527,US
+400886528,400886719,CA
+400886720,400886767,US
+400886768,400887039,CA
+400887040,400887135,US
+400887136,400887151,CA
+400887152,400887167,US
+400887168,400887231,CA
+400887232,400887263,US
+400887264,400887343,CA
400887344,400887351,SE
-400887352,400887551,US
+400887352,400887503,CA
+400887504,400887535,US
+400887536,400887551,CA
400887552,400887807,GB
-400887808,400888575,US
+400887808,400888031,CA
+400888032,400888039,US
+400888040,400888063,CA
+400888064,400888319,US
+400888320,400888575,CA
400888576,400888831,GB
-400888832,400895551,US
+400888832,400889439,CA
+400889440,400889503,US
+400889504,400889519,CA
+400889520,400889567,US
+400889568,400889647,CA
+400889648,400889663,US
+400889664,400889855,CA
+400889856,400890111,US
+400890112,400890159,CA
+400890160,400890167,US
+400890168,400890175,CA
+400890176,400890207,US
+400890208,400890335,CA
+400890336,400890367,US
+400890368,400890527,CA
+400890528,400890543,US
+400890544,400890591,CA
+400890592,400890623,US
+400890624,400890815,CA
+400890816,400890831,US
+400890832,400891263,CA
+400891264,400891343,US
+400891344,400891391,CA
+400891392,400891407,US
+400891408,400891423,CA
+400891424,400891455,US
+400891456,400891471,CA
+400891472,400891487,US
+400891488,400891615,CA
+400891616,400891631,US
+400891632,400891791,CA
+400891792,400891807,US
+400891808,400891903,CA
+400891904,400892159,US
+400892160,400892591,CA
+400892592,400892607,US
+400892608,400892671,CA
+400892672,400892767,US
+400892768,400893055,CA
+400893056,400893087,US
+400893088,400893103,CA
+400893104,400893151,US
+400893152,400893183,CA
+400893184,400893311,US
+400893312,400893695,CA
+400893696,400893983,US
+400893984,400893999,CA
+400894000,400894047,US
+400894048,400894079,CA
+400894080,400894335,US
+400894336,400894463,CA
+400894464,400894719,US
+400894720,400894975,CA
+400894976,400895551,US
400895552,400895615,GB
-400895616,400911103,US
+400895616,400895663,CA
+400895664,400895679,US
+400895680,400895743,CA
+400895744,400896511,US
+400896512,400897023,CA
+400897024,400897279,US
+400897280,400897423,CA
+400897424,400897439,US
+400897440,400897503,CA
+400897504,400897519,US
+400897520,400897535,CA
+400897536,400897791,US
+400897792,400897887,CA
+400897888,400897903,US
+400897904,400897935,CA
+400897936,400897967,US
+400897968,400897983,CA
+400897984,400898015,US
+400898016,400898063,CA
+400898064,400898079,US
+400898080,400898175,CA
+400898176,400898303,US
+400898304,400898703,CA
+400898704,400898735,US
+400898736,400898943,CA
+400898944,400899039,US
+400899040,400899071,CA
+400899072,400899327,US
+400899328,400899711,CA
+400899712,400899743,US
+400899744,400899759,CA
+400899760,400899807,US
+400899808,400899967,CA
+400899968,400899999,US
+400900000,400900031,CA
+400900032,400900255,US
+400900256,400900287,CA
+400900288,400900319,US
+400900320,400900559,CA
+400900560,400900575,US
+400900576,400900607,CA
+400900608,400901119,US
+400901120,400901567,CA
+400901568,400901583,US
+400901584,400901615,CA
+400901616,400901631,US
+400901632,400901759,CA
+400901760,400901807,US
+400901808,400901823,CA
+400901824,400901887,US
+400901888,400902143,CA
+400902144,400902399,US
+400902400,400902431,CA
+400902432,400902479,US
+400902480,400902527,CA
+400902528,400902623,US
+400902624,400902639,CA
+400902640,400902655,US
+400902656,400902719,CA
+400902720,400902783,US
+400902784,400902911,CA
+400902912,400902943,US
+400902944,400903935,CA
+400903936,400904191,US
+400904192,400904447,CA
+400904448,400904479,US
+400904480,400904495,CA
+400904496,400904575,US
+400904576,400906175,CA
+400906176,400906207,US
+400906208,400906399,CA
+400906400,400906463,US
+400906464,400906479,CA
+400906480,400906815,US
+400906816,400906831,CA
+400906832,400906879,US
+400906880,400907423,CA
+400907424,400907455,US
+400907456,400907775,CA
+400907776,400908031,US
+400908032,400908287,CA
+400908288,400911103,US
400911104,400911359,PA
400911360,400911583,AU
400911584,400911615,US
@@ -4332,14 +4734,160 @@
401360640,401360895,HK
401360896,401361151,US
401361152,401361663,HK
-401361664,401378303,US
+401361664,401367039,US
+401367040,401367295,GB
+401367296,401367551,US
+401367552,401367807,JP
+401367808,401368831,US
+401368832,401369343,TW
+401369344,401369599,US
+401369600,401369855,DE
+401369856,401370623,US
+401370624,401370879,DE
+401370880,401372671,US
+401372672,401372927,SG
+401372928,401375487,US
+401375488,401375743,CA
+401375744,401376095,US
+401376096,401376111,CA
+401376112,401376143,US
+401376144,401376447,CA
+401376448,401376479,US
+401376480,401376495,CA
+401376496,401376511,US
+401376512,401377791,CA
+401377792,401378303,US
401378304,401378559,EG
-401378560,401386495,US
+401378560,401378687,US
+401378688,401378815,CA
+401378816,401379071,US
+401379072,401380431,CA
+401380432,401380447,US
+401380448,401380479,CA
+401380480,401380495,US
+401380496,401380527,CA
+401380528,401380543,US
+401380544,401380607,CA
+401380608,401380863,US
+401380864,401381119,CA
+401381120,401381247,US
+401381248,401381375,CA
+401381376,401381407,US
+401381408,401381423,CA
+401381424,401381631,US
+401381632,401382479,CA
+401382480,401382527,US
+401382528,401382559,CA
+401382560,401382575,US
+401382576,401384799,CA
+401384800,401384831,US
+401384832,401385343,CA
+401385344,401385375,US
+401385376,401385391,CA
+401385392,401385407,US
+401385408,401385423,CA
+401385424,401385439,US
+401385440,401386303,CA
+401386304,401386399,US
+401386400,401386415,CA
+401386416,401386463,US
+401386464,401386479,CA
+401386480,401386495,US
401386496,401387007,SE
-401387008,401387263,RU
-401387264,401400871,US
+401387008,401387263,US
+401387264,401387519,CA
+401387520,401387775,US
+401387776,401388543,CA
+401388544,401388559,US
+401388560,401388575,CA
+401388576,401388583,US
+401388584,401388615,CA
+401388616,401388631,US
+401388632,401388671,CA
+401388672,401388687,US
+401388688,401389823,CA
+401389824,401390079,US
+401390080,401393151,CA
+401393152,401393407,US
+401393408,401395455,CA
+401395456,401395711,US
+401395712,401396351,CA
+401396352,401396383,US
+401396384,401396415,CA
+401396416,401396447,US
+401396448,401397247,CA
+401397248,401397311,US
+401397312,401397327,CA
+401397328,401397359,US
+401397360,401399103,CA
+401399104,401399135,US
+401399136,401399167,CA
+401399168,401399199,US
+401399200,401399215,CA
+401399216,401399263,US
+401399264,401399279,CA
+401399280,401399295,US
+401399296,401399583,CA
+401399584,401399599,US
+401399600,401399615,CA
+401399616,401399647,US
+401399648,401399663,CA
+401399664,401399679,US
+401399680,401399711,CA
+401399712,401399743,US
+401399744,401400063,CA
+401400064,401400319,US
+401400320,401400655,CA
+401400656,401400671,US
+401400672,401400703,CA
+401400704,401400735,US
+401400736,401400751,CA
+401400752,401400783,US
+401400784,401400815,CA
+401400816,401400863,US
+401400864,401400871,CA
401400872,401400879,NO
-401400880,401419775,US
+401400880,401400895,US
+401400896,401401039,CA
+401401040,401401055,US
+401401056,401401119,CA
+401401120,401401135,US
+401401136,401401151,CA
+401401152,401401215,US
+401401216,401401247,CA
+401401248,401401279,US
+401401280,401401359,CA
+401401360,401401375,US
+401401376,401401471,CA
+401401472,401401503,US
+401401504,401401535,CA
+401401536,401401567,US
+401401568,401401663,CA
+401401664,401401679,US
+401401680,401401727,CA
+401401728,401401855,US
+401401856,401401935,CA
+401401936,401401983,US
+401401984,401402079,CA
+401402080,401402095,US
+401402096,401402111,CA
+401402112,401402207,US
+401402208,401402223,CA
+401402224,401402239,US
+401402240,401402287,CA
+401402288,401402303,US
+401402304,401402623,CA
+401402624,401402879,US
+401402880,401403487,CA
+401403488,401403503,US
+401403504,401403583,CA
+401403584,401403615,US
+401403616,401403695,CA
+401403696,401403743,US
+401403744,401403807,CA
+401403808,401403839,US
+401403840,401403903,CA
+401403904,401419775,US
401419776,401420031,CA
401420032,401420287,US
401420288,401420543,CA
@@ -4400,7 +4948,15 @@
402128128,402128383,FR
402128384,402128895,US
402128896,402169855,CA
-402169856,402223103,US
+402169856,402170111,KR
+402170112,402170879,US
+402170880,402171135,JP
+402171136,402173695,US
+402173696,402174463,SG
+402174464,402175743,US
+402175744,402175999,ES
+402176000,402176255,AE
+402176256,402223103,US
402223104,402227199,CA
402227200,402231295,PR
402235392,402239301,US
@@ -4411,19 +4967,293 @@
402243584,402247679,CA
402247680,402249215,US
402249216,402249727,GB
-402249728,402260031,US
+402249728,402259967,US
+402259968,402260031,CA
402260032,402260039,FI
-402260040,402260271,US
+402260040,402260271,CA
402260272,402260279,GB
-402260280,402262455,US
+402260280,402260479,CA
+402260480,402260511,US
+402260512,402260575,CA
+402260576,402260607,US
+402260608,402260639,CA
+402260640,402260655,US
+402260656,402260767,CA
+402260768,402260783,US
+402260784,402260799,CA
+402260800,402260815,US
+402260816,402260863,CA
+402260864,402260895,US
+402260896,402260911,CA
+402260912,402260959,US
+402260960,402260975,CA
+402260976,402260991,US
+402260992,402261007,CA
+402261008,402261087,US
+402261088,402261119,CA
+402261120,402261151,US
+402261152,402261183,CA
+402261184,402261215,US
+402261216,402262015,CA
+402262016,402262271,US
+402262272,402262455,CA
402262456,402262463,FI
-402262464,402265690,US
+402262464,402263423,CA
+402263424,402263455,US
+402263456,402263471,CA
+402263472,402263487,US
+402263488,402263807,CA
+402263808,402264063,US
+402264064,402264079,CA
+402264080,402264095,US
+402264096,402264111,CA
+402264112,402264127,US
+402264128,402264191,CA
+402264192,402264319,US
+402264320,402264447,CA
+402264448,402264559,US
+402264560,402265471,CA
+402265472,402265535,US
+402265536,402265551,CA
+402265552,402265583,US
+402265584,402265663,CA
+402265664,402265690,US
402265691,402265691,BD
-402265692,402266727,US
+402265692,402265759,US
+402265760,402265919,CA
+402265920,402265951,US
+402265952,402265967,CA
+402265968,402266143,US
+402266144,402266175,CA
+402266176,402266191,US
+402266192,402266287,CA
+402266288,402266303,US
+402266304,402266367,CA
+402266368,402266655,US
+402266656,402266671,CA
+402266672,402266703,US
+402266704,402266727,CA
402266728,402266735,NO
-402266736,402279935,US
-402279936,402280063,CA
-402280064,402366463,US
+402266736,402266751,US
+402266752,402267391,CA
+402267392,402267423,US
+402267424,402267439,CA
+402267440,402267455,US
+402267456,402267471,CA
+402267472,402267487,US
+402267488,402267519,CA
+402267520,402267647,US
+402267648,402269199,CA
+402269200,402269207,US
+402269208,402269263,CA
+402269264,402269279,US
+402269280,402269311,CA
+402269312,402269343,US
+402269344,402269375,CA
+402269376,402269455,US
+402269456,402269631,CA
+402269632,402269647,US
+402269648,402269983,CA
+402269984,402270031,US
+402270032,402270079,CA
+402270080,402270207,US
+402270208,402270335,CA
+402270336,402270463,US
+402270464,402270719,CA
+402270720,402270751,US
+402270752,402270879,CA
+402270880,402270895,US
+402270896,402270911,CA
+402270912,402270927,US
+402270928,402270975,CA
+402270976,402271103,US
+402271104,402271119,CA
+402271120,402271135,US
+402271136,402271167,CA
+402271168,402271199,US
+402271200,402271231,CA
+402271232,402271391,US
+402271392,402271439,CA
+402271440,402271455,US
+402271456,402271487,CA
+402271488,402271519,US
+402271520,402271551,CA
+402271552,402271615,US
+402271616,402271631,CA
+402271632,402271647,US
+402271648,402271679,CA
+402271680,402271727,US
+402271728,402271999,CA
+402272000,402272127,US
+402272128,402272255,CA
+402272256,402272639,US
+402272640,402272703,CA
+402272704,402272895,US
+402272896,402273279,CA
+402273280,402273311,US
+402273312,402273375,CA
+402273376,402273391,US
+402273392,402273471,CA
+402273472,402273503,US
+402273504,402273519,CA
+402273520,402273535,US
+402273536,402273599,CA
+402273600,402273631,US
+402273632,402273663,CA
+402273664,402273791,US
+402273792,402273935,CA
+402273936,402273951,US
+402273952,402273983,CA
+402273984,402273999,US
+402274000,402274015,CA
+402274016,402274047,US
+402274048,402274271,CA
+402274272,402274287,US
+402274288,402274303,CA
+402274304,402274463,US
+402274464,402274479,CA
+402274480,402274543,US
+402274544,402275423,CA
+402275424,402275839,US
+402275840,402276095,CA
+402276096,402276223,US
+402276224,402277375,CA
+402277376,402277631,US
+402277632,402278015,CA
+402278016,402278047,US
+402278048,402278079,CA
+402278080,402278127,US
+402278128,402278399,CA
+402278400,402278655,US
+402278656,402280063,CA
+402280064,402280191,US
+402280192,402280207,CA
+402280208,402280223,US
+402280224,402280319,CA
+402280320,402280383,US
+402280384,402280959,CA
+402280960,402281087,US
+402281088,402281199,CA
+402281200,402281471,US
+402281472,402281727,CA
+402281728,402281823,US
+402281824,402282111,CA
+402282112,402282239,US
+402282240,402282879,CA
+402282880,402282911,US
+402282912,402282927,CA
+402282928,402282943,US
+402282944,402282959,CA
+402282960,402282975,US
+402282976,402283263,CA
+402283264,402283519,US
+402283520,402284159,CA
+402284160,402284287,US
+402284288,402284799,CA
+402284800,402285055,US
+402285056,402285407,CA
+402285408,402285439,US
+402285440,402285567,CA
+402285568,402285823,US
+402285824,402286335,CA
+402286336,402286847,US
+402286848,402286863,CA
+402286864,402286895,US
+402286896,402286911,CA
+402286912,402286927,US
+402286928,402286943,CA
+402286944,402286975,US
+402286976,402287263,CA
+402287264,402287279,US
+402287280,402287423,CA
+402287424,402287487,US
+402287488,402287551,CA
+402287552,402287583,US
+402287584,402287743,CA
+402287744,402287791,US
+402287792,402288031,CA
+402288032,402288047,US
+402288048,402288159,CA
+402288160,402288175,US
+402288176,402288223,CA
+402288224,402288255,US
+402288256,402288271,CA
+402288272,402288287,US
+402288288,402288319,CA
+402288320,402288383,US
+402288384,402288431,CA
+402288432,402288447,US
+402288448,402288543,CA
+402288544,402288591,US
+402288592,402288607,CA
+402288608,402288623,US
+402288624,402288639,CA
+402288640,402288895,US
+402288896,402289119,CA
+402289120,402289151,US
+402289152,402289535,CA
+402289536,402289663,US
+402289664,402289679,CA
+402289680,402289695,US
+402289696,402289711,CA
+402289712,402289719,US
+402289720,402289743,CA
+402289744,402289759,US
+402289760,402289775,CA
+402289776,402289791,US
+402289792,402289983,CA
+402289984,402290047,US
+402290048,402290239,CA
+402290240,402290255,US
+402290256,402290271,CA
+402290272,402290287,US
+402290288,402290399,CA
+402290400,402290407,US
+402290408,402290479,CA
+402290480,402290511,US
+402290512,402290639,CA
+402290640,402290655,US
+402290656,402290687,CA
+402290688,402290815,US
+402290816,402290831,CA
+402290832,402290847,US
+402290848,402290879,CA
+402290880,402290919,US
+402290920,402290975,CA
+402290976,402291007,US
+402291008,402291041,CA
+402291042,402291042,US
+402291043,402291087,CA
+402291088,402291119,US
+402291120,402291135,CA
+402291136,402291199,US
+402291200,402291231,CA
+402291232,402291263,US
+402291264,402291327,CA
+402291328,402291359,US
+402291360,402291391,CA
+402291392,402291423,US
+402291424,402291711,CA
+402291712,402291999,US
+402292000,402292143,CA
+402292144,402292151,US
+402292152,402292351,CA
+402292352,402353663,US
+402353664,402353919,JP
+402353920,402354175,ID
+402354176,402354431,DE
+402354432,402354943,US
+402354944,402355199,ES
+402355200,402356223,US
+402356224,402356479,SG
+402356480,402356735,HK
+402356736,402356991,MY
+402356992,402357247,US
+402357248,402357503,KR
+402357504,402357759,JP
+402357760,402358015,US
+402358016,402358271,ID
+402358272,402366463,US
402366464,402374655,CA
402374656,402399231,US
402399232,402403327,CA
@@ -4434,14 +5264,197 @@
402409728,402410239,US
402410240,402410751,TR
402410752,402411263,US
-402411264,402411519,TR
-402411520,402524263,US
+402411264,402411519,NL
+402411520,402522111,US
+402522112,402522223,CA
+402522224,402522231,US
+402522232,402522399,CA
+402522400,402522407,US
+402522408,402522479,CA
+402522480,402522559,US
+402522560,402522591,CA
+402522592,402522607,US
+402522608,402522623,CA
+402522624,402522655,US
+402522656,402522719,CA
+402522720,402522895,US
+402522896,402522991,CA
+402522992,402523007,US
+402523008,402523023,CA
+402523024,402523039,US
+402523040,402523071,CA
+402523072,402523103,US
+402523104,402523119,CA
+402523120,402523135,US
+402523136,402523167,CA
+402523168,402523199,US
+402523200,402523231,CA
+402523232,402523391,US
+402523392,402523423,CA
+402523424,402523439,US
+402523440,402523455,CA
+402523456,402523487,US
+402523488,402523503,CA
+402523504,402523647,US
+402523648,402523679,CA
+402523680,402523711,US
+402523712,402523743,CA
+402523744,402524159,US
+402524160,402524191,CA
+402524192,402524255,US
+402524256,402524263,CA
402524264,402524271,FI
-402524272,402550015,US
-402550016,402550271,CA
+402524272,402524287,CA
+402524288,402524319,US
+402524320,402524383,CA
+402524384,402524415,US
+402524416,402524479,CA
+402524480,402524575,US
+402524576,402524591,CA
+402524592,402524607,US
+402524608,402524639,CA
+402524640,402524655,US
+402524656,402524671,CA
+402524672,402524799,US
+402524800,402524831,CA
+402524832,402524895,US
+402524896,402524927,CA
+402524928,402524959,US
+402524960,402524991,CA
+402524992,402525007,US
+402525008,402525023,CA
+402525024,402525055,US
+402525056,402525087,CA
+402525088,402525103,US
+402525104,402525119,CA
+402525120,402525151,US
+402525152,402525183,CA
+402525184,402525215,US
+402525216,402525247,CA
+402525248,402525279,US
+402525280,402525295,CA
+402525296,402525327,US
+402525328,402525343,CA
+402525344,402525375,US
+402525376,402525439,CA
+402525440,402525695,US
+402525696,402525951,CA
+402525952,402526079,US
+402526080,402526207,CA
+402526208,402526527,US
+402526528,402526655,CA
+402526656,402526671,US
+402526672,402526687,CA
+402526688,402526719,US
+402526720,402526975,CA
+402526976,402527359,US
+402527360,402527391,CA
+402527392,402527615,US
+402527616,402528767,CA
+402528768,402529023,US
+402529024,402529279,CA
+402529280,402529535,US
+402529536,402529791,CA
+402529792,402530047,US
+402530048,402530303,CA
+402530304,402530559,US
+402530560,402531583,CA
+402531584,402531839,US
+402531840,402532983,CA
+402532984,402532991,US
+402532992,402533039,CA
+402533040,402533047,US
+402533048,402533119,CA
+402533120,402533279,US
+402533280,402533295,CA
+402533296,402533311,US
+402533312,402533327,CA
+402533328,402533343,US
+402533344,402533631,CA
+402533632,402533759,US
+402533760,402533791,CA
+402533792,402533887,US
+402533888,402533903,CA
+402533904,402533919,US
+402533920,402533935,CA
+402533936,402534015,US
+402534016,402534079,CA
+402534080,402534095,US
+402534096,402534111,CA
+402534112,402534143,US
+402534144,402534175,CA
+402534176,402534255,US
+402534256,402534271,CA
+402534272,402534319,US
+402534320,402534399,CA
+402534400,402534479,US
+402534480,402534495,CA
+402534496,402534655,US
+402534656,402536255,CA
+402536256,402536287,US
+402536288,402536303,CA
+402536304,402536351,US
+402536352,402536367,CA
+402536368,402536383,US
+402536384,402536479,CA
+402536480,402536527,US
+402536528,402536543,CA
+402536544,402536575,US
+402536576,402536639,CA
+402536640,402536687,US
+402536688,402536959,CA
+402536960,402537215,US
+402537216,402538591,CA
+402538592,402538687,US
+402538688,402538735,CA
+402538736,402538751,US
+402538752,402538815,CA
+402538816,402538863,US
+402538864,402538879,CA
+402538880,402538895,US
+402538896,402538911,CA
+402538912,402538927,US
+402538928,402538959,CA
+402538960,402538975,US
+402538976,402539775,CA
+402539776,402540031,US
+402540032,402540287,CA
+402540288,402540543,US
+402540544,402541311,CA
+402541312,402541567,US
+402541568,402541823,CA
+402541824,402542079,US
+402542080,402542335,CA
+402542336,402542591,US
+402542592,402542847,CA
+402542848,402543119,US
+402543120,402543167,CA
+402543168,402543231,US
+402543232,402543327,CA
+402543328,402543343,US
+402543344,402543391,CA
+402543392,402543487,US
+402543488,402543551,CA
+402543552,402543583,US
+402543584,402543615,CA
+402543616,402544415,US
+402544416,402544431,CA
+402544432,402544479,US
+402544480,402544559,CA
+402544560,402544591,US
+402544592,402544607,CA
+402544608,402546687,US
+402546688,402546943,CA
+402546944,402547455,US
+402547456,402547967,CA
+402547968,402549247,US
+402549248,402550271,CA
402550272,402550527,US
402550528,402550783,GB
-402550784,402591663,US
+402550784,402551039,CA
+402551040,402552063,US
+402552064,402554879,CA
+402554880,402591663,US
402591664,402591671,AU
402591672,402593535,US
402593536,402593543,AU
@@ -4500,7 +5513,8 @@
406142976,406147071,US
406147072,406159359,CA
406159360,406175743,US
-406175744,406216703,CA
+406175744,406183935,JP
+406183936,406216703,CA
406216704,406241279,US
406241280,406257663,PR
406257664,406274047,US
@@ -4559,7 +5573,7 @@
411885568,411975679,CA
411975680,411979775,US
411979776,411983871,CA
-411983872,411988735,US
+411983872,411988991,US
411988992,411989247,GB
411989248,412057599,US
412057600,412073983,CA
@@ -4636,7 +5650,11 @@
436207616,452984831,US
452984832,452985855,JP
452985856,452986879,MY
-452986880,452987903,SG
+452986880,452987143,SG
+452987144,452987147,BD
+452987148,452987399,SG
+452987400,452987403,BD
+452987404,452987903,SG
452987904,452988927,VN
452988928,452997119,JP
452997120,453001215,IN
@@ -5053,7 +6071,7 @@
520765440,520781823,RU
520781824,520822783,CH
520822784,520824831,IT
-520824832,520826879,RO
+520824832,520826879,US
520826880,520828927,QA
520828928,520830975,NL
520830976,520847359,MK
@@ -5124,18 +6142,19 @@
521037568,521037823,TH
521037824,521039871,RO
521039872,521043967,IR
-521043968,521045286,IT
-521045288,521048063,IT
+521043968,521048063,IT
521048064,521052159,IR
521052160,521053183,RO
521053184,521054207,SY
-521054208,521056255,RO
+521054208,521056255,GR
521056256,521057279,LT
521057280,521058303,MD
521058304,521060351,IT
521060352,521062399,RO
521062400,521064447,ES
-521064448,521074687,RO
+521064448,521066495,GR
+521066496,521072639,RO
+521072640,521074687,GR
521074688,521074943,EG
521074944,521075199,RO
521075200,521075327,FR
@@ -5420,7 +6439,7 @@
528748544,528752639,CZ
528760832,528762879,PL
528762880,528764927,AM
-528764928,528769023,RO
+528764928,528769023,KZ
528769024,528793599,RU
528793600,528795647,RO
528795648,528797695,NL
@@ -5479,8 +6498,9 @@
529809408,529817855,RU
529817856,529818367,CZ
529818368,529826303,RU
-529826304,529826815,CZ
-529826816,529828863,RU
+529826304,529827327,CZ
+529827328,529827839,UA
+529827840,529828863,RU
529828864,529829887,KZ
529829888,529830911,UZ
529830912,529831935,RU
@@ -5509,9 +6529,7 @@
529924096,529989631,DE
529989632,530055167,NL
530055168,530120703,GR
-530120704,530165759,CY
-530165760,530173951,GR
-530173952,530186239,CY
+530120704,530186239,CY
530186240,530251775,IL
530251776,530317311,TR
530317312,530579455,IT
@@ -5596,9 +6614,7 @@
531428280,531428287,IT
531428288,531428351,GB
531428352,531428359,IT
-531428360,531428439,GB
-531428440,531428447,IT
-531428448,531428487,GB
+531428360,531428487,GB
531428488,531428495,IT
531428496,531428599,GB
531428600,531428607,IT
@@ -5904,7 +6920,9 @@
534347776,534348031,US
534348032,534348287,GB
534348288,534348543,US
-534348544,534349071,GB
+534348544,534348831,GB
+534348832,534348847,CA
+534348848,534349071,GB
534349072,534349079,US
534349080,534355967,GB
534355968,534364159,GR
@@ -5993,8 +7011,7 @@
534769664,534773759,IT
534773760,536870911,DE
536870912,539623423,US
-539623424,539624577,NL
-539624579,539627519,NL
+539623424,539627519,AU
539627520,539629455,GB
539629456,539629463,BE
539629464,539629975,GB
@@ -6037,8 +7054,7 @@
540814085,540814086,TH
540814087,540814327,SG
540814328,540814328,IN
-540814329,540814335,SG
-540814592,540817055,SG
+540814329,540817055,SG
540817056,540817071,US
540817072,540819455,SG
540819456,540820959,US
@@ -6053,10 +7069,13 @@
543690752,543691007,AR
543691008,543691263,US
543691264,543691775,BR
-543691776,544436771,US
+543691776,543872511,US
+543872512,543872767,BE
+543872768,544436771,US
544436772,544436775,CA
544436776,586153983,US
586153984,586975999,IE
+586976000,586976255,US
586976256,587006719,IE
587006720,587006975,GB
587006976,587202559,IE
@@ -6065,10 +7084,12 @@
597360640,597426175,US
597426176,597688319,DE
597688320,598736895,US
-598736896,598867967,GB
-598867968,599130111,US
+598736896,598999039,GB
+598999040,599130111,US
599130112,599261183,CA
-599261184,603979775,US
+599261184,599608829,US
+599608830,599608830,GB
+599608831,603979775,US
603979776,603980799,CN
603980800,603981823,NP
603981824,604110847,CN
@@ -6102,7 +7123,6 @@
620703744,620704767,NZ
620704768,620705791,BD
620705792,620706815,HK
-620706816,620707839,US
620707840,620708863,IN
620708864,620709887,HK
620709888,620711935,AU
@@ -6111,7 +7131,9 @@
620715008,620716031,AU
620716032,620716287,TW
620716288,620716543,PH
-620716544,620718079,PK
+620716544,620716799,BE
+620716800,620717055,LU
+620717056,620718079,PK
620718080,620720127,IN
620720128,620721151,AU
620721152,620722175,CN
@@ -6130,13 +7152,13 @@
620735488,620737535,CN
620737536,620739583,IN
620739584,620740607,BD
-620740608,620741631,CN
+620740608,620741631,HK
620741632,620743679,IN
620743680,620743935,HK
620743936,620744191,AU
620744192,620744703,JP
620744704,620745727,IN
-620745728,620746751,US
+620745728,620746751,PK
620746752,620747775,JP
620747776,620748799,CN
620748800,620751871,IN
@@ -6266,9 +7288,7 @@
621938688,621939458,GE
621939459,621939459,RU
621939460,621939711,GE
-621939712,621945855,RU
-621945856,621946111,KG
-621946112,621969407,RU
+621939712,621969407,RU
621971456,621973503,IM
621973504,621975551,IE
621975552,621977599,RU
@@ -6429,7 +7449,7 @@
623798272,623800319,GE
623800320,623800575,SE
623800576,623800831,LU
-623800832,623801087,NL
+623800832,623801087,BG
623801088,623801855,US
623801856,623802367,NL
623802368,623802879,SE
@@ -6500,7 +7520,9 @@
624640952,624640959,PT
624640960,624641187,FR
624641188,624641191,ES
-624641192,624641535,FR
+624641192,624641375,FR
+624641376,624641407,LT
+624641408,624641535,FR
624641536,624641551,IE
624641552,624641855,FR
624641856,624641887,GB
@@ -6514,17 +7536,25 @@
624642300,624642303,ES
624642304,624642479,FR
624642480,624642483,GB
-624642484,624643091,FR
+624642484,624642815,FR
+624642816,624642831,LT
+624642832,624643091,FR
624643092,624643095,FI
624643096,624643107,FR
624643108,624643111,GB
-624643112,624643231,FR
+624643112,624643211,FR
+624643212,624643215,CH
+624643216,624643231,FR
624643232,624643235,DE
624643236,624643243,FR
624643244,624643247,ES
-624643248,624643423,FR
+624643248,624643263,FR
+624643264,624643295,DE
+624643296,624643423,FR
624643424,624643459,ES
-624643460,624644031,FR
+624643460,624643811,FR
+624643812,624643815,CH
+624643816,624644031,FR
624644032,624644063,FI
624644064,624644095,ES
624644096,624644115,FR
@@ -6546,17 +7576,23 @@
624645592,624646235,FR
624646236,624646239,IT
624646240,624646255,DE
-624646256,624646347,FR
+624646256,624646267,FR
+624646268,624646271,PL
+624646272,624646347,FR
624646348,624646351,IE
624646352,624646643,FR
624646644,624646647,ES
624646648,624646651,FR
624646652,624646655,PT
-624646656,624646719,FR
+624646656,624646671,FR
+624646672,624646687,GB
+624646688,624646719,FR
624646720,624646735,ES
624646736,624646791,FR
624646792,624646795,IE
-624646796,624647171,FR
+624646796,624646911,FR
+624646912,624646927,LT
+624646928,624647171,FR
624647172,624647183,ES
624647184,624647459,FR
624647460,624647463,GB
@@ -6586,7 +7622,8 @@
624657616,624657631,GB
624657632,624657711,FR
624657712,624657715,ES
-624657716,624657831,FR
+624657716,624657719,PL
+624657720,624657831,FR
624657832,624657839,ES
624657840,624657883,FR
624657884,624657887,ES
@@ -6603,17 +7640,25 @@
624658484,624658487,ES
624658488,624658535,FR
624658536,624658539,ES
-624658540,624658863,FR
+624658540,624658559,FR
+624658560,624658591,LT
+624658592,624658863,FR
624658864,624658879,ES
624658880,624659071,FR
624659072,624659135,ES
-624659136,624660103,FR
+624659136,624659611,FR
+624659612,624659615,PL
+624659616,624659975,FR
+624659976,624659983,LT
+624659984,624660103,FR
624660104,624660107,PT
624660108,624660127,FR
624660128,624660131,IE
624660132,624660607,FR
624660608,624660639,IE
-624660640,624660827,FR
+624660640,624660703,FR
+624660704,624660719,PL
+624660720,624660827,FR
624660828,624660839,ES
624660840,624660927,FR
624660928,624660991,GB
@@ -6676,7 +7721,8 @@
624665612,624665615,ES
624665616,624665663,FR
624665664,624665695,ES
-624665696,624665903,FR
+624665696,624665887,FR
+624665888,624665903,PL
624665904,624665919,FI
624665920,624665999,FR
624666000,624666015,GB
@@ -6709,7 +7755,9 @@
624668064,624668079,BE
624668080,624668111,FR
624668112,624668127,GB
-624668128,624668643,FR
+624668128,624668207,FR
+624668208,624668211,CZ
+624668212,624668643,FR
624668644,624668647,IE
624668648,624668667,FR
624668668,624668671,PT
@@ -6731,13 +7779,16 @@
624670316,624670319,ES
624670320,624670659,FR
624670660,624670663,IE
-624670664,624670915,FR
+624670664,624670871,FR
+624670872,624670875,BE
+624670876,624670915,FR
624670916,624670919,ES
624670920,624670935,FR
624670936,624670939,GB
624670940,624671287,FR
624671288,624671291,ES
-624671292,624671455,FR
+624671292,624671295,PL
+624671296,624671455,FR
624671456,624671471,ES
624671472,624672127,FR
624672128,624672131,GB
@@ -6765,7 +7816,8 @@
624674464,624674479,ES
624674480,624675019,FR
624675020,624675023,DE
-624675024,624675047,FR
+624675024,624675027,BE
+624675028,624675047,FR
624675048,624675055,ES
624675056,624675647,FR
624675648,624675651,FI
@@ -6784,7 +7836,9 @@
624676072,624676075,ES
624676076,624676087,FR
624676088,624676091,DE
-624676092,624676627,FR
+624676092,624676115,FR
+624676116,624676119,IT
+624676120,624676627,FR
624676628,624676631,GB
624676632,624676715,FR
624676716,624676719,ES
@@ -6797,7 +7851,10 @@
624677688,624677695,GB
624677696,624677769,FR
624677770,624677770,NL
-624677771,624678199,FR
+624677771,624677855,FR
+624677856,624677887,BE
+624677888,624677891,PL
+624677892,624678199,FR
624678200,624678239,ES
624678240,624678263,FR
624678264,624678279,ES
@@ -6817,7 +7874,9 @@
624679844,624679847,ES
624679848,624680063,FR
624680064,624680191,ES
-624680192,624680783,FR
+624680192,624680747,FR
+624680748,624680751,NL
+624680752,624680783,FR
624680784,624680799,GB
624680800,624680895,FR
624680896,624680927,ES
@@ -6825,7 +7884,9 @@
624681024,624681055,ES
624681056,624681083,FR
624681084,624681087,ES
-624681088,624681535,FR
+624681088,624681095,FR
+624681096,624681103,NL
+624681104,624681535,FR
624681536,624681599,ES
624681600,624681807,FR
624681808,624681823,BE
@@ -6843,7 +7904,9 @@
624683016,624683023,ES
624683024,624683031,FR
624683032,624683039,GB
-624683040,624683295,FR
+624683040,624683135,FR
+624683136,624683151,PL
+624683152,624683295,FR
624683296,624683311,DE
624683312,624683339,FR
624683340,624683343,ES
@@ -6855,7 +7918,9 @@
624683784,624683787,DE
624683788,624683807,FR
624683808,624683811,ES
-624683812,624683975,FR
+624683812,624683875,FR
+624683876,624683879,PL
+624683880,624683975,FR
624683976,624683983,GB
624683984,624684043,FR
624684044,624684047,PT
@@ -6865,7 +7930,9 @@
624684064,624684071,PT
624684072,624684191,FR
624684192,624684195,CH
-624684196,624684479,FR
+624684196,624684339,FR
+624684340,624684343,NL
+624684344,624684479,FR
624684480,624684511,FI
624684512,624684639,FR
624684640,624684655,ES
@@ -6927,7 +7994,8 @@
624688664,624688671,ES
624688672,624688691,FR
624688692,624688695,ES
-624688696,624688779,FR
+624688696,624688775,FR
+624688776,624688779,PL
624688780,624688783,ES
624688784,624688791,FR
624688792,624688795,ES
@@ -6998,8 +8066,8 @@
625518592,625518847,NL
625518848,625519103,US
625519104,625520135,NL
-625520136,625520447,US
-625520448,625520495,NL
+625520136,625520479,US
+625520480,625520495,NL
625520496,625520511,US
625520512,625520639,NL
625520640,625522687,RU
@@ -7182,7 +8250,11 @@
629389312,629391359,CH
629391360,629399551,RU
629399552,629401599,GE
-629401600,629405695,DE
+629401600,629401983,DE
+629401984,629401991,CH
+629401992,629402007,DE
+629402008,629402015,CH
+629402016,629405695,DE
629405696,629407743,TR
629407744,629669887,ES
629669888,629735423,FI
@@ -7251,7 +8323,7 @@
630173696,630177791,AT
630177792,630194175,BG
630194176,630456319,RU
-630456320,630489087,RO
+630456320,630489087,IR
630489088,630491135,NL
630491136,630493183,DE
630493184,630495231,NO
@@ -7301,7 +8373,9 @@
630820096,630820351,RO
630820352,630820607,ES
630820608,630820863,US
-630820864,630827007,RO
+630820864,630822911,GR
+630822912,630824959,RO
+630824960,630827007,GR
630827008,630828031,NL
630828032,630828543,SE
630828544,630829055,BG
@@ -7396,9 +8470,11 @@
632979456,633012223,IT
633012224,633059983,FR
633059984,633059987,GB
-633059988,633062504,FR
-633062505,633062506,BE
-633062507,633063679,FR
+633059988,633061247,FR
+633061248,633061311,NL
+633061312,633062463,FR
+633062464,633062527,BE
+633062528,633063679,FR
633063680,633063935,PL
633063936,633064191,FR
633064192,633064447,GB
@@ -7414,7 +8490,9 @@
633066752,633067007,IT
633067008,633067455,FR
633067456,633067471,ES
-633067472,633069251,FR
+633067472,633068735,FR
+633068736,633068799,BE
+633068800,633069251,FR
633069252,633069255,ES
633069256,633074760,FR
633074761,633074761,ES
@@ -7447,11 +8525,14 @@
634001408,634003455,NO
634003456,634007551,PL
634007552,634009599,TR
-634009600,634011647,NO
+634009600,634010111,NO
+634010112,634010367,UA
+634010368,634011647,NO
634011648,634028031,JO
634028032,634060799,RO
634060800,634068991,UA
-634068992,634071039,LV
+634068992,634069503,DE
+634069504,634071039,LV
634071040,634073087,GB
634073088,634075135,IE
634075136,634077183,NL
@@ -7532,9 +8613,7 @@
635200168,635200175,IT
635200176,635200335,GB
635200336,635200343,IT
-635200344,635200599,GB
-635200600,635200607,IT
-635200608,635200631,GB
+635200344,635200631,GB
635200632,635200639,IT
635200640,635200727,GB
635200728,635200735,IT
@@ -7542,13 +8621,9 @@
635200848,635200855,IT
635200856,635200911,GB
635200912,635200919,IT
-635200920,635200991,GB
-635200992,635200999,IT
-635201000,635201159,GB
+635200920,635201159,GB
635201160,635201167,IT
-635201168,635201183,GB
-635201184,635201191,IT
-635201192,635201295,GB
+635201168,635201295,GB
635201296,635201303,IT
635201304,635203583,GB
635203584,635207679,JO
@@ -7562,11 +8637,8 @@
635273216,635281407,UA
635281408,635283455,RO
635283456,635283967,DE
-635283968,635284223,RO
-635284224,635284418,DE
-635284419,635284419,RO
-635284420,635284479,DE
-635284992,635285503,US
+635283968,635284479,RO
+635284480,635285503,US
635285504,635287551,ME
635287552,635289599,RU
635289600,635291647,DE
@@ -7608,7 +8680,8 @@
635858944,635860479,RU
635860480,635860991,NL
635860992,635863039,BE
-635863040,635864063,US
+635863040,635863551,GB
+635863552,635864063,NL
635864064,635864575,RU
635864576,635864831,LB
635864832,635865087,ES
@@ -7618,9 +8691,7 @@
635871488,635871743,UA
635871744,635891967,RU
635891968,635892223,GB
-635892224,635893503,RU
-635893504,635893759,AZ
-635893760,635894527,RU
+635892224,635894527,RU
635894528,635894783,KZ
635894784,635895807,RU
635895808,635961343,KW
@@ -7791,8 +8862,8 @@
642097152,642105343,CA
642105344,642113535,US
642113536,642115583,AU
-642115584,642387967,US
-642387968,642392063,CA
+642115584,642385919,US
+642385920,642392063,CA
642392064,642394111,US
642394112,642396159,CA
642396160,642793471,US
@@ -7868,7 +8939,9 @@
644390912,644399103,US
644399104,644399359,CA
644399360,644403199,US
-644403200,644403711,CA
+644403200,644403695,CA
+644403696,644403703,US
+644403704,644403711,CA
644403712,644407807,US
644407808,644408319,CA
644408320,644413439,US
@@ -7951,7 +9024,9 @@
645229056,645230079,CA
645230080,645480447,US
645480448,645482495,CA
-645482496,645484543,US
+645482496,645483775,US
+645483776,645484031,CA
+645484032,645484543,US
645484544,645488639,CA
645488640,645525503,US
645525504,645529599,CA
@@ -7997,7 +9072,9 @@
646084608,646086655,CA
646086656,646160383,US
646160384,646164479,CA
-646164480,646193151,US
+646164480,646166527,US
+646166528,646168575,CA
+646168576,646193151,US
646193152,646194943,CA
646194944,646195199,US
646195200,646198783,CA
@@ -8036,8 +9113,7 @@
661651456,662700031,KR
662700032,666894335,CN
666894336,671088639,ID
-671088640,671113215,US
-671113472,675381247,US
+671088640,675381247,US
675381248,675397631,SG
675397632,675447167,US
675447168,675447295,HK
@@ -8045,7 +9121,11 @@
675447424,675447551,BR
675447552,675448575,US
675448576,675449087,GB
-675449088,675545087,US
+675449088,675449471,US
+675449472,675449599,IE
+675449600,675449727,AT
+675449728,675449855,FI
+675449856,675545087,US
675545088,675610623,NL
675610624,675635199,IE
675635200,675643391,CA
@@ -8055,8 +9135,7 @@
675807232,675938303,CN
675938304,675954687,NL
675954688,675975167,JP
-675975168,675979263,IE
-675979264,676168959,US
+675975168,676168959,US
676168960,676169215,IE
676169216,676169471,HK
676169472,676175903,US
@@ -8072,7 +9151,9 @@
676193024,676193535,US
676193536,676193791,IE
676193792,676249599,US
-676249600,676265983,AU
+676249600,676251647,IN
+676251648,676253695,US
+676253696,676265983,AU
676265984,676298751,US
676298752,676331519,IE
676331520,676347903,NL
@@ -8361,8 +9442,10 @@
677651456,677652479,JP
677652480,677653503,HK
677653504,677655551,KR
-677655552,677678079,US
-677678080,677678591,IN
+677655552,677656063,US
+677656064,677656319,HK
+677656320,677677055,US
+677677056,677678591,IN
677678592,677679103,US
677679104,677679615,AU
677679616,677680639,US
@@ -8388,13 +9471,20 @@
677723136,677724159,NL
677724160,677725183,FI
677725184,677726207,AT
-677726208,677727231,US
+677726208,677727231,IE
677727232,677728255,AT
-677728256,677738495,US
+677728256,677729279,NL
+677729280,677730303,FI
+677730304,677731327,NL
+677731328,677732351,FR
+677732352,677733375,IE
+677733376,677738495,US
677738496,677739775,NL
677739776,677740031,IE
677740032,677740543,FI
-677740544,677774335,US
+677740544,677742591,CA
+677742592,677744639,FR
+677744640,677774335,US
677774336,677776383,BR
677776384,677781503,US
677781504,677783551,CL
@@ -8650,7 +9740,24 @@
677850832,677850847,IE
677850848,677850863,FI
677850864,677850879,NL
-677850880,678150143,US
+677850880,677853695,US
+677853696,677853711,AT
+677853712,677853727,IE
+677853728,677853759,US
+677853760,677853775,AT
+677853776,677853791,MY
+677853792,677853823,US
+677853824,677853839,AT
+677853840,677853855,IE
+677853856,677853887,US
+677853888,677853903,AT
+677853904,677853919,IE
+677853920,677853951,US
+677853952,677853967,AT
+677853968,677853983,IE
+677853984,678117887,US
+678117888,678118399,CA
+678118400,678150143,US
678150144,678150271,FI
678150272,678151167,US
678151168,678151295,NL
@@ -8687,8 +9794,14 @@
678214656,678214911,GB
678214912,678215167,CA
678215168,678215423,US
-678215424,678215935,NL
-678215936,678428671,US
+678215424,678216191,NL
+678216192,678216447,US
+678216448,678216703,NL
+678216704,678216959,US
+678216960,678217215,AU
+678217216,678217471,JP
+678217472,678217983,IE
+678217984,678428671,US
678428672,678436863,IE
678436864,678437887,US
678437888,678438015,IE
@@ -8711,29 +9824,20 @@
678641664,678649855,AU
678649856,678658047,IE
678658048,678690815,JP
-678690816,678756351,US
-678756352,678764543,IE
-678764544,678821887,US
+678690816,678821887,US
678821888,678854655,NL
-678854656,678887423,US
-678887424,678952959,NL
-678952960,679018495,IE
-679018496,679182335,US
-679182336,679215103,AU
-679215104,679313407,US
+678854656,679313407,US
679313408,679346175,CN
-679346176,679362559,JP
+679346176,679362559,US
679362560,679378943,CN
-679378944,679395327,KR
-679395328,679403519,IN
+679378944,679403519,US
679403520,679411711,AU
-679411712,679428095,SG
+679411712,679428095,US
679428096,679436287,AU
679436288,679440383,IE
679440384,679444479,US
679444480,679477247,IE
-679477248,687618147,US
-687618152,687865855,US
+679477248,687865855,US
687865856,689963007,ZA
689963008,691011583,EG
691011584,691617791,ZA
@@ -8751,8 +9855,10 @@
691798016,691806207,ZM
691806208,691830783,ZW
691830784,691857407,ZM
-691857408,691858175,KE
-691858176,691863551,ZM
+691857408,691858431,KE
+691858432,691858687,ZM
+691858688,691858943,KE
+691858944,691863551,ZM
691863552,691929087,ZA
691994624,692011007,ZM
692011008,692027391,ZA
@@ -8785,7 +9891,7 @@
692637904,692637911,KE
692637912,692641791,MU
692641792,692649983,GA
-692649984,692658175,NG
+692649984,692656127,NG
692658176,692666367,ZA
692666368,692674559,TZ
692674560,692682751,ML
@@ -8798,7 +9904,7 @@
692727808,692731903,BW
692731904,692735999,LY
692736000,692740095,GH
-692740096,692744191,ZA
+692740656,692740671,ZA
692744192,692748287,TZ
692748288,692752383,CV
692752384,692756479,ZA
@@ -8808,7 +9914,6 @@
692772864,692776959,ZA
692776960,692781055,AO
692781056,692785151,BW
-692785152,692789247,NG
692789248,692793343,KE
692793344,692797439,GH
692797440,692801535,CG
@@ -8829,9 +9934,7 @@
692852736,692854783,GH
692854784,692856831,ZA
692856832,692858879,MU
-692858880,692859135,MW
-692859136,692859391,UG
-692859392,692860927,MW
+692858880,692860927,UG
692860928,692862975,ZA
692862976,692869119,NG
692869120,692871167,TZ
@@ -8841,7 +9944,6 @@
692881408,692883455,CG
692883456,692885503,MZ
692885504,692887551,NG
-692887552,692889599,UG
692889600,692891647,KE
692891648,692893695,ZA
692893696,692895743,KE
@@ -8867,35 +9969,34 @@
692942848,692944895,GA
692944896,692946943,MZ
692946944,692948991,EG
-692948992,692951039,ZM
+692948992,692950271,MU
+692950272,692950303,ZM
+692950304,692950527,MU
+692950528,692950783,ZM
+692950784,692951039,MU
692951040,692953087,ZA
-692953088,692955135,RW
692955136,692957183,NG
692957184,692959231,DZ
692959232,692961279,GN
692961280,692963327,TZ
692963328,692965375,ZA
692965376,692967423,CM
-692967424,692968447,KE
692968448,692969471,CD
692969472,692971519,TZ
692971520,692973567,SZ
692973568,692975615,MZ
-692975616,692977663,EG
692977664,692978687,TZ
692978688,692979711,ZA
-692979712,692981759,NG
+692979712,692980735,NG
692981760,692982783,AO
692982784,692983807,EG
692983808,692984831,KE
692984832,692987903,ZA
692987904,692988927,GH
-692988928,692989951,ZW
692989952,692991999,BF
692992000,692993023,MW
692993024,692994047,EG
692994048,692995071,TZ
-692995072,692996095,SL
692996096,692996351,SO
692996352,692996479,ZA
692996480,692997119,SO
@@ -8915,19 +10016,17 @@
693008384,693009407,CF
693009408,693010431,GH
693010432,693011455,ZA
-693011456,693012479,SZ
693012480,693013503,TG
693013504,693014527,ZA
693014528,693015551,GH
693015552,693016575,EG
693016576,693017599,GA
693017600,693018623,NG
-693018624,693019647,UG
693019648,693020671,ZA
693020672,693021695,TZ
693021696,693022719,NG
693022720,693023743,KE
-693023744,693026815,ZA
+693024768,693026815,ZA
693026816,693028863,CD
693028864,693029887,ZA
693029888,693030911,CM
@@ -8937,7 +10036,6 @@
693033984,693035007,ZA
693035008,693036031,NG
693036032,693038079,ZA
-693038080,693039103,ZW
693039104,693040127,GA
693040128,693041151,ZA
693041152,693042175,MW
@@ -8958,7 +10056,6 @@
693059584,693060607,NG
693060608,693061631,TZ
693061632,693064703,ZA
-693064704,693065727,GH
693065728,693066751,MW
693066752,693067775,ZA
693067776,693068799,GH
@@ -8971,7 +10068,6 @@
693075968,693076991,CM
693076992,693078015,MU
693078016,693079039,BW
-693079040,693080063,KE
693080064,693081087,NG
693081088,693082111,ZA
693082112,693083135,NG
@@ -8999,7 +10095,8 @@
693106688,693106951,TZ
693106952,693106959,ZA
693106960,693107199,TZ
-693107200,693107711,ZA
+693107200,693107455,ZA
+693107456,693107711,TZ
693107712,693239807,KE
693239808,693370879,SN
693370880,693403647,ZA
@@ -9021,7 +10118,6 @@
693551104,693559295,ZA
693559296,693567487,BJ
693567488,693575679,MW
-693575680,693583871,KE
693583872,693592063,NG
693592064,693600255,MU
693600256,693608447,MA
@@ -9055,8 +10151,7 @@
696942592,696950783,MR
696950784,696958975,NG
696958976,696963071,TZ
-696963072,696966143,UG
-696966144,696967167,TZ
+696963072,696967167,UG
696967168,696971263,MZ
696971264,696974335,KE
696974336,696975359,LU
@@ -9091,8 +10186,7 @@
700252160,700260351,NG
700260352,700268543,CI
700268544,700276735,ZA
-700276736,700284927,CI
-700284928,700301311,GH
+700293120,700301311,GH
700301312,700309503,CD
700309504,700317695,DJ
700317696,700325887,NG
@@ -9117,7 +10211,6 @@
700376064,700377087,NE
700377088,700378111,CD
700378112,700379135,MG
-700379136,700380159,NG
700380160,700381183,BW
700381184,700382207,EG
700382208,700383231,KE
@@ -9129,11 +10222,9 @@
700403712,700404735,EG
700404736,700405759,BJ
700405760,700406783,ZA
-700406784,700407807,TZ
700407808,700408831,GH
700408832,700409855,CM
700409856,700410879,LR
-700410880,700411903,NG
700412928,700413951,ZM
700413952,700414975,SC
700414976,700432383,ZA
@@ -9143,9 +10234,7 @@
700437504,700438527,MU
700438528,700439551,BW
700439552,700440575,GN
-700440576,700442247,MU
-700442248,700442251,KE
-700442252,700442623,MU
+700440576,700442623,MU
700442624,700444671,ZW
700444672,700446719,GH
700446720,700447743,SL
@@ -9163,17 +10252,18 @@
700599040,700710911,ZA
700710912,700776447,EG
700776448,700841983,RW
-700841984,700846079,MU
-700846080,700850175,NA
-700850176,700854271,MU
-700854272,700855295,NA
-700855296,700866559,MU
+700841984,700844031,GB
+700844032,700846079,ZA
+700846080,700856319,NA
+700856320,700858367,MU
+700858368,700862463,ZA
+700862464,700866559,ZM
700866560,700866815,NG
-700866816,700867327,MU
+700866816,700867327,NA
700867328,700867583,NG
-700867584,700895231,MU
-700895232,700899327,NG
-700899328,700907519,MU
+700867584,700870655,NA
+700870656,700874751,GB
+700874752,700907519,ZA
700907520,700973055,EG
700973056,701104127,DZ
701104128,701112319,GH
@@ -9183,9 +10273,7 @@
701153280,701161471,CM
701161472,701169663,UG
701169664,701186047,ZA
-701186048,701189887,NG
-701189888,701190143,BJ
-701190144,701202431,NG
+701186048,701202431,NG
701202432,701210623,NE
701210624,701214719,ZA
701214720,701218815,LS
@@ -9214,29 +10302,23 @@
701366272,701374463,NG
701374464,701382655,KE
701382656,701390847,CI
-701390848,701392127,MU
-701392128,701392383,TZ
+701390848,701391871,MU
+701391872,701392127,KE
+701392128,701392383,MU
701392384,701392639,ZA
701392640,701399039,MU
701399040,701407231,EG
701407232,701423615,ZA
-701423616,701431807,NG
701431808,701439999,CI
701440000,701448191,MG
-701448192,701458831,KE
-701458832,701458847,CG
-701458848,701462783,KE
-701462784,701463295,CG
-701463296,701463807,KE
+701448192,701462783,KE
+701462784,701463039,CG
+701463040,701463807,KE
701463808,701464063,CG
-701464064,701464319,KE
-701464320,701464351,CG
-701464352,701464367,KE
-701464368,701464575,CG
+701464064,701464575,KE
701464576,701472767,MU
701472768,701480959,TG
701480960,701489151,CI
-701489152,701490175,NG
701490176,701491199,AO
701491200,701492223,MU
701492224,701493247,ZA
@@ -9249,7 +10331,6 @@
701546496,701562879,ZA
701562880,701579263,KE
701579264,701595647,SD
-701595648,701603839,DZ
701612032,701628415,EG
701628416,701644799,GH
701644800,701661183,DZ
@@ -9277,7 +10358,7 @@
702015488,702017535,ZA
702017536,702018559,EG
702018560,702019583,NG
-702019584,702020607,RW
+702019584,702020607,MU
702020608,702021631,CD
702021632,702029823,ZM
702029824,702038015,BJ
@@ -9291,7 +10372,7 @@
702066944,702067199,NL
702067200,702067711,PL
702067712,702068735,NL
-702068736,702070271,CM
+702068736,702070271,ZA
702070272,702070783,RU
702070784,702074879,ZA
702074880,702076927,BW
@@ -9304,7 +10385,6 @@
702119936,702128127,CM
702128128,702136319,EG
702136320,702137343,ZA
-702137344,702138367,MG
702138368,702139391,TZ
702139392,702140415,NG
702140416,702141439,MZ
@@ -9314,11 +10394,10 @@
702144512,702146559,EG
702146560,702148607,UG
702148608,702150655,ZA
-702150656,702152703,ZM
702152704,702169087,SD
-702169088,702173183,NA
-702173184,702175231,ZM
-702175232,702181375,NA
+702169088,702173631,NA
+702173632,702173663,ZM
+702173664,702181375,NA
702181376,702185471,AO
702185472,702201855,EG
702201856,702218239,GH
@@ -9340,13 +10419,9 @@
702337024,702341119,UG
702341120,702342111,MU
702342112,702342127,KE
-702342128,702342259,MU
-702342260,702342263,KE
-702342264,702343039,MU
+702342128,702343039,MU
702343040,702343103,KE
-702343104,702344199,MU
-702344200,702344971,KE
-702344972,702345215,MU
+702343104,702345215,MU
702345216,702349311,KE
702349312,702353407,ZA
702353408,702357503,DZ
@@ -9354,7 +10429,6 @@
702365696,702369791,MZ
702369792,702373887,UG
702373888,702377983,MW
-702377984,702382079,NG
702382080,702386175,EG
702386176,702390271,ZW
702390272,702394367,NG
@@ -9373,7 +10447,6 @@
702431232,702433279,NG
702433280,702434303,SS
702434304,702435327,NG
-702435328,702437375,MZ
702437376,702439423,TZ
702439424,702441471,MU
702441472,702443519,ZA
@@ -9400,10 +10473,8 @@
702476288,702477311,ZM
702477312,702478335,RW
702478336,702480383,AO
-702480896,702481407,AO
702481408,702482431,TZ
702482432,702483455,ZA
-702483456,702484479,BI
702484480,702485503,TZ
702485504,702486527,EG
702486528,702487551,ZA
@@ -9418,7 +10489,6 @@
702494720,702495743,KE
702495744,702496767,ZA
702496768,702497791,NG
-702497792,702498815,ZA
702498816,702499839,BW
702499840,702500863,MU
702500864,702501887,NA
@@ -9453,7 +10523,6 @@
702530560,702531583,EG
702531584,702532607,SD
702532608,702533631,SC
-702533632,702534655,CI
702534656,702535679,GM
702535680,702536703,SC
702536704,702538751,MU
@@ -9483,17 +10552,14 @@
703756288,703757311,ZA
703757312,703758335,RE
703758336,703759359,CD
-703759360,703760383,ZA
703760384,703761407,GH
703761408,703762431,RW
703762432,703764479,MU
-703764480,703766527,LY
703766528,703770623,ZA
703770624,703774719,BJ
703774720,703791103,ZA
703791104,703856639,CD
703856640,703922175,CM
-703922176,703954943,ZA
703954944,703987711,NG
703987712,704118783,ZA
704118784,704380927,MA
@@ -9512,8 +10578,7 @@
704905216,705167359,CN
705167360,707788799,KR
707788800,708575231,CN
-708575232,708642805,SG
-708642807,708706303,SG
+708575232,708706303,SG
708706304,708751359,CN
708751360,708752383,ID
708752384,708755455,CN
@@ -9531,7 +10596,9 @@
710961152,710962175,TH
710962176,711065599,CN
711065600,711131135,HK
-711131136,711163903,CN
+711131136,711160831,CN
+711160832,711161855,HK
+711161856,711163903,CN
711163904,711164727,JP
711164728,711164735,HK
711164736,711166463,JP
@@ -9603,7 +10670,8 @@
736128000,736131071,BD
736131072,736132095,NZ
736132096,736133119,LK
-736133120,736137215,IN
+736133120,736136191,IN
+736136192,736137215,JP
736137216,736138239,CN
736138240,736139263,HK
736139264,736140287,SG
@@ -9634,7 +10702,7 @@
736169984,736173055,IN
736173056,736174079,HK
736174080,736175103,AU
-736175104,736176127,MY
+736175104,736176127,HK
736176128,736177151,BN
736177152,736178175,HK
736178176,736178431,AU
@@ -9784,6 +10852,7 @@
736453632,736455679,IN
736455680,736458751,HK
736458752,736459775,CN
+736459776,736460799,BT
736460800,736461823,SG
736461824,736462847,TH
736462848,736465919,CN
@@ -9806,11 +10875,7 @@
736494592,736495103,ID
736495104,736495359,NR
736495360,736495615,ID
-736495616,736495871,HK
-736495872,736496127,KR
-736496128,736496383,JP
-736496384,736496639,PH
-736496640,736498687,HK
+736495616,736498687,HK
736498688,736499711,CN
736499712,736500479,SG
736500480,736500735,TH
@@ -9928,8 +10993,7 @@
737142784,737143039,HK
737143040,737143807,MY
737143808,737146879,IN
-737146880,737147391,US
-737147392,737147903,NZ
+737146880,737147903,NZ
737147904,737148927,MY
737148928,737149951,CN
737149952,737151999,IN
@@ -9998,7 +11062,9 @@
737264640,737265663,CN
737265664,737266687,AU
737266688,737267711,HK
-737267712,737279999,CN
+737267712,737276927,CN
+737276928,737277951,IN
+737277952,737279999,CN
737280000,737281023,KR
737281024,737282047,SG
737282048,737288191,CN
@@ -10344,7 +11410,9 @@
737874432,737874943,IN
737875968,737876991,HK
737876992,737878015,KR
-737878016,737879039,HK
+737878016,737878271,HK
+737878272,737878783,JP
+737878784,737879039,HK
737879040,737880063,CN
737880064,737881087,AU
737881088,737882111,HK
@@ -10535,7 +11603,9 @@
738177024,738178047,CN
738178048,738179071,TW
738179072,738180095,CN
-738180096,738181119,HK
+738180096,738180607,HK
+738180608,738180863,US
+738180864,738181119,HK
738181120,738182143,CN
738182144,738183167,ID
738183168,738187263,CN
@@ -10548,7 +11618,9 @@
738195456,738197503,KR
738197504,746786303,US
746786304,746786559,GB
-746786560,747175935,US
+746786560,746973439,US
+746973440,746973695,ES
+746973696,747175935,US
747175936,747241471,NL
747241472,747671807,US
747671808,747672063,GB
@@ -10629,7 +11701,9 @@
755401728,755402751,AR
755402752,755403775,BR
755403776,755404799,MX
-755404800,755422207,BR
+755404800,755419135,BR
+755419136,755420159,US
+755420160,755422207,BR
755422208,755423231,AR
755423232,755425279,BR
755425280,755426303,EC
@@ -10637,22 +11711,23 @@
755431424,755433471,UY
755433472,755440639,BR
755440640,755441663,MX
-755441664,755442687,BR
-755443712,755444735,BR
+755441664,755444735,BR
755444736,755445759,MX
755445760,755454975,BR
755454976,755457023,AR
755457024,755458047,CL
755458048,755459071,AR
-755459072,755464191,BR
+755459072,755465215,BR
755465216,755466239,AR
755466240,755467263,BR
755467264,755468287,CO
+755468288,755469311,MX
755469312,755470335,CR
-755470336,755482623,BR
+755470336,755486719,BR
755486720,755487743,AR
-755489792,755490815,BR
+755487744,755491839,BR
755491840,755492863,CL
+755492864,755493887,BR
755493888,755494911,HN
755494912,755499007,AR
756023296,757071871,US
@@ -10693,7 +11768,9 @@
757108224,757108415,NL
757108416,757108479,US
757108480,757108735,NL
-757108736,757110783,FR
+757108736,757110523,FR
+757110524,757110524,TF
+757110525,757110783,FR
757110784,757112831,DE
757112832,757116927,US
757116928,757118975,GB
@@ -10717,7 +11794,7 @@
757612544,757616639,CA
757616640,757645311,US
757645312,757645567,NZ
-757645568,757661695,US
+757645568,757661695,CN
757661696,757661951,NZ
757661952,757662719,US
757662720,757662975,IN
@@ -10826,19 +11903,7 @@
757789440,757789567,NP
757789568,757790975,US
757790976,757791231,WS
-757791232,757793791,US
-757793792,757794047,CA
-757794048,757795839,US
-757795840,757796351,CA
-757796352,757796863,US
-757796864,757797375,CA
-757797376,757798143,US
-757798144,757798399,CA
-757798400,757799167,US
-757799168,757799423,CA
-757799424,757799935,US
-757799936,757800191,CA
-757800192,757809151,US
+757791232,757809151,US
757809152,757809407,CA
757809408,757809663,RO
757809664,757809919,GB
@@ -10885,11 +11950,116 @@
758693888,758700031,US
758700032,758702079,CA
758702080,758710271,NL
-758710272,758747391,US
-758747392,758747647,LT
-758747648,758752199,US
+758710272,758743039,US
+758743040,758744679,CA
+758744680,758744687,US
+758744688,758744751,CA
+758744752,758744767,US
+758744768,758744879,CA
+758744880,758744887,US
+758744888,758745087,CA
+758745088,758747199,US
+758747200,758747215,CA
+758747216,758747231,US
+758747232,758747327,CA
+758747328,758747375,US
+758747376,758747903,CA
+758747904,758747935,US
+758747936,758747951,CA
+758747952,758747999,US
+758748000,758748031,CA
+758748032,758748159,US
+758748160,758748415,CA
+758748416,758748671,US
+758748672,758749439,CA
+758749440,758749519,US
+758749520,758749535,CA
+758749536,758749551,US
+758749552,758749695,CA
+758749696,758749951,US
+758749952,758750207,CA
+758750208,758750463,US
+758750464,758750719,CA
+758750720,758750975,US
+758750976,758751487,CA
+758751488,758751999,US
+758752000,758752127,CA
+758752128,758752191,US
+758752192,758752199,CA
758752200,758752207,FI
-758752208,758779903,US
+758752208,758752223,US
+758752224,758752239,CA
+758752240,758752255,US
+758752256,758752511,CA
+758752512,758752671,US
+758752672,758752687,CA
+758752688,758752735,US
+758752736,758753279,CA
+758753280,758753535,US
+758753536,758754303,CA
+758754304,758754431,US
+758754432,758755327,CA
+758755328,758755839,US
+758755840,758756607,CA
+758756608,758756863,US
+758756864,758757375,CA
+758757376,758757631,US
+758757632,758757887,CA
+758757888,758758143,US
+758758144,758759935,CA
+758759936,758760703,US
+758760704,758761727,CA
+758761728,758762239,US
+758762240,758762495,CA
+758762496,758762751,US
+758762752,758764031,CA
+758764032,758764287,US
+758764288,758764687,CA
+758764688,758764703,US
+758764704,758764719,CA
+758764720,758764751,US
+758764752,758764767,CA
+758764768,758764799,US
+758764800,758765631,CA
+758765632,758765647,US
+758765648,758765663,CA
+758765664,758765695,US
+758765696,758765951,CA
+758765952,758765967,US
+758765968,758765983,CA
+758765984,758766015,US
+758766016,758766143,CA
+758766144,758766303,US
+758766304,758766319,CA
+758766320,758766335,US
+758766336,758766431,CA
+758766432,758766495,US
+758766496,758766527,CA
+758766528,758766575,US
+758766576,758766591,CA
+758766592,758766847,US
+758766848,758769279,CA
+758769280,758769359,US
+758769360,758769663,CA
+758769664,758769743,US
+758769744,758769791,CA
+758769792,758769855,US
+758769856,758769919,CA
+758769920,758770175,US
+758770176,758770431,CA
+758770432,758770687,US
+758770688,758770751,CA
+758770752,758770847,US
+758770848,758770863,CA
+758770864,758770927,US
+758770928,758770943,CA
+758770944,758771199,US
+758771200,758771711,CA
+758771712,758772991,US
+758772992,758773759,CA
+758773760,758774271,US
+758774272,758775807,CA
+758775808,758779903,US
758779904,758783999,CA
758784000,758785023,US
758785024,758785535,CA
@@ -11092,6 +12262,7 @@
759276544,759282687,BR
759282688,759283711,HN
759283712,759285759,BR
+759285760,759286015,CO
759286016,759286271,BR
759286272,759286527,AR
759286528,759286783,EC
@@ -11104,13 +12275,78 @@
759297024,759298047,DO
759298048,759299071,PE
759299072,759299327,AR
-759693312,759693959,US
+759299328,759299583,BR
+759299584,759300095,PA
+759693312,759693439,CA
+759693440,759693455,US
+759693456,759693471,CA
+759693472,759693519,US
+759693520,759693535,CA
+759693536,759693567,US
+759693568,759693959,CA
759693960,759693975,GR
-759693976,759726079,US
-759726080,759791615,CA
-759791616,759799807,US
-759799808,759801855,IL
-759801856,759802367,US
+759693976,759694271,CA
+759694272,759694303,US
+759694304,759694319,CA
+759694320,759694591,US
+759694592,759694847,CA
+759694848,759695231,US
+759695232,759696271,CA
+759696272,759696335,US
+759696336,759696351,CA
+759696352,759696415,US
+759696416,759696447,CA
+759696448,759696463,US
+759696464,759696479,CA
+759696480,759696575,US
+759696576,759697407,CA
+759697408,759701503,US
+759701504,759701759,CA
+759701760,759702015,US
+759702016,759702399,CA
+759702400,759702431,US
+759702432,759702447,CA
+759702448,759702479,US
+759702480,759702495,CA
+759702496,759702527,US
+759702528,759708287,CA
+759708288,759708415,US
+759708416,759708927,CA
+759708928,759709183,US
+759709184,759710463,CA
+759710464,759710495,US
+759710496,759710511,CA
+759710512,759710559,US
+759710560,759710591,CA
+759710592,759710719,US
+759710720,759710975,CA
+759710976,759711263,US
+759711264,759711279,CA
+759711280,759711359,US
+759711360,759711615,CA
+759711616,759711647,US
+759711648,759711663,CA
+759711664,759711679,US
+759711680,759711695,CA
+759711696,759711711,US
+759711712,759711871,CA
+759711872,759712015,US
+759712016,759712063,CA
+759712064,759712095,US
+759712096,759712111,CA
+759712112,759712127,US
+759712128,759712255,CA
+759712256,759712351,US
+759712352,759712383,CA
+759712384,759712511,US
+759712512,759712895,CA
+759712896,759713023,US
+759713024,759721215,CA
+759721216,759721231,US
+759721232,759721279,CA
+759721280,759721343,US
+759721344,759791615,CA
+759791616,759802367,US
759802368,759803391,CA
759803392,759803903,US
759803904,759804927,GB
@@ -11156,41 +12392,52 @@
759832960,759833087,BI
759833088,759833215,ER
759833216,759833343,LS
-759833344,759840767,US
+759833344,759835391,US
+759835392,759835647,AU
+759835648,759835903,SE
+759835904,759836159,US
+759836160,759836415,SE
+759836416,759840767,US
759840768,759844863,CA
759844864,759848959,US
-759848960,759955455,CA
+759848960,759922687,CA
+759922688,759955455,GB
759955456,759963647,US
759963648,759965759,NL
759965760,759966207,US
759966208,759966719,NL
-759966720,759967743,FR
-759967744,759968767,JP
-759968768,759975935,US
+759966720,759966915,FR
+759966916,759966916,TF
+759966917,759967743,FR
+759967744,759969791,JP
+759969792,759975935,US
759975936,759980031,DE
-759980032,759984127,JP
+759980032,759983119,JP
+759983120,759983135,US
+759983136,759984127,JP
759984128,759987199,AU
759987200,759988223,US
759988224,759992319,GB
759992320,759997439,SG
759997440,760000511,US
760000512,760004607,SG
-760004608,760006983,JP
-760006984,760006987,US
-760006988,760007007,JP
-760007008,760007039,US
+760004608,760006911,JP
+760006912,760007039,US
760007040,760012799,JP
760012800,760023039,US
760023040,760026367,JP
760026368,760026623,HK
760026624,760029183,JP
-760029184,760031743,SG
-760031744,760034303,US
+760029184,760033279,SG
+760033280,760033791,AU
+760033792,760034303,US
760034304,760035327,DE
760035328,760036351,GB
760036352,760037375,FR
760037376,760038399,DE
-760038400,760111103,US
+760038400,760043519,US
+760043520,760044543,GB
+760044544,760111103,US
760111104,760119295,CA
760119296,760127487,US
760127488,760152063,CA
@@ -11258,6 +12505,7 @@
762403840,762404863,AU
762404864,762407935,IN
762407936,762408959,CN
+762408960,762409983,HK
762409984,762411007,JP
762411008,762411519,HK
762411520,762411775,IN
@@ -11342,7 +12590,8 @@
762517760,762518015,KR
762518016,762518079,VN
762518080,762518111,ID
-762518112,762518527,HK
+762518112,762518271,VN
+762518272,762518527,HK
762519552,762520575,JP
762520576,762522623,HK
762522624,762523647,CN
@@ -11376,7 +12625,6 @@
762553344,762554367,CN
762554368,762560511,IN
762560512,762561535,JP
-762561536,762562559,AU
762562560,762563583,CN
762563584,762564607,AU
762564608,762565631,IN
@@ -11441,7 +12689,7 @@
762649600,762650623,IN
762650624,762651647,MN
762651648,762652671,NZ
-762652672,762653695,CN
+762652672,762653695,HK
762653696,762656767,IN
762656768,762658815,BD
762658816,762659839,IN
@@ -11687,7 +12935,9 @@
763126784,763127807,CN
763127808,763129343,IN
763129344,763129855,AU
-763129856,763130879,HK
+763129856,763130367,HK
+763130368,763130623,US
+763130624,763130879,HK
763130880,763132927,IN
763132928,763133951,CN
763133952,763134975,IN
@@ -11705,7 +12955,9 @@
763155456,763156479,AU
763156480,763158527,JP
763158528,763164671,IN
-763164672,763166719,CN
+763164672,763166207,CN
+763166208,763166463,DE
+763166464,763166719,RU
763166720,763169791,HK
763169792,763171839,CN
763171840,763172863,SG
@@ -11877,7 +13129,6 @@
769464320,769464575,GH
769464576,769464831,MW
769464832,769465087,ZA
-769465088,769465343,EG
769465344,769466367,CI
769466368,769474815,ZA
769474816,769475583,NG
@@ -11900,7 +13151,6 @@
771230720,771237375,IN
771237376,771237887,MY
771237888,771238911,IN
-771238912,771239935,US
771239936,771241983,AU
771241984,771245055,IN
771245056,771246079,HK
@@ -11930,8 +13180,8 @@
771316736,771317759,CN
771317760,771318783,HK
771318784,771319295,SG
-771319296,771319551,BD
-771319552,771320063,SG
+771319296,771319807,BD
+771319808,771320063,SG
771320064,771320319,TW
771320320,771320831,AU
771320832,771321855,IN
@@ -12026,7 +13276,7 @@
771578880,771587071,CN
771587072,771588095,NZ
771588096,771588607,AU
-771588608,771629055,CN
+771589120,771629055,CN
771629056,771630079,VN
771630080,771631103,SG
771631104,771632127,CN
@@ -12068,8 +13318,7 @@
772339968,772340223,NL
772340224,772340735,RU
772340736,772341247,KZ
-772341248,772341503,US
-772341504,772341759,RU
+772341248,772341759,RU
772341760,772407295,NO
772407296,772472831,BG
772472832,772538367,MT
@@ -12181,11 +13430,10 @@
773017600,773019647,IL
773019648,773021695,DE
773021696,773023743,AM
-773023744,773025791,RO
+773023744,773025791,US
773025792,773027839,RU
773027840,773031935,FR
-773031936,773032191,CH
-773032448,773033727,CH
+773031936,773033983,CH
773033984,773036031,LV
773036032,773038079,DE
773038080,773040127,GB
@@ -12326,7 +13574,7 @@
773648384,773650431,PL
773650432,773652479,GB
773652480,773653503,SK
-773653504,773654527,TR
+773653504,773654527,CZ
773654528,773656575,RU
773656576,773658623,PL
773660672,773662719,AT
@@ -12468,6 +13716,7 @@
774001664,774002687,NL
774002688,774002815,ES
774002816,774002842,NL
+774002843,774002843,ES
774002844,774002943,NL
774002944,774003199,ES
774003200,774003711,TR
@@ -12680,7 +13929,9 @@
774995968,775028735,SA
775028736,775061503,PT
775061504,775094271,RU
-775094272,775127039,RO
+775094272,775111877,RO
+775111878,775111878,IR
+775111879,775127039,RO
775127040,775147519,IE
775147520,775149567,NL
775149568,775151615,SG
@@ -12732,7 +13983,8 @@
778461184,778461439,TR
778461440,778462207,RO
778462208,778462463,TR
-778462464,778462975,RO
+778462464,778462719,US
+778462720,778462975,RO
778462976,778463231,EE
778463232,778465279,RO
778465280,778466303,IT
@@ -12780,19 +14032,30 @@
778640640,778640895,PT
778640896,778641151,FR
778641152,778641407,IE
-778641408,778653887,FR
+778641408,778650655,FR
+778650656,778650687,LT
+778650688,778653855,FR
+778653856,778653871,BE
+778653872,778653887,FR
778653888,778653903,IE
778653904,778653935,FR
778653936,778653951,GB
778653952,778654903,FR
778654904,778654907,GB
-778654908,778655039,FR
+778654908,778654959,FR
+778654960,778654975,BE
+778654976,778655039,FR
778655040,778655103,ES
-778655104,778655223,FR
+778655104,778655191,FR
+778655192,778655199,LT
+778655200,778655223,FR
778655224,778655231,PT
778655232,778655583,FR
778655584,778655615,ES
-778655616,778655935,FR
+778655616,778655679,IT
+778655680,778655807,FR
+778655808,778655871,NL
+778655872,778655935,FR
778655936,778655999,IE
778656000,778656223,FR
778656224,778656255,PT
@@ -12800,11 +14063,15 @@
778656384,778656447,GB
778656448,778656575,FR
778656576,778656607,PT
-778656608,778657335,FR
+778656608,778656639,FR
+778656640,778656671,BE
+778656672,778656703,IT
+778656704,778657335,FR
778657336,778657339,IE
778657340,778657399,FR
778657400,778657403,PT
-778657404,778657471,FR
+778657404,778657463,FR
+778657464,778657471,CZ
778657472,778657535,GB
778657536,778662028,FR
778662029,778662029,ES
@@ -12818,11 +14085,17 @@
778666376,778666379,GB
778666380,778666479,FR
778666480,778666495,DE
-778666496,778666847,FR
+778666496,778666591,FR
+778666592,778666607,LT
+778666608,778666687,FR
+778666688,778666719,ES
+778666720,778666847,FR
778666848,778666863,PT
778666864,778666879,FR
778666880,778666943,GB
-778666944,778667175,FR
+778666944,778666975,FR
+778666976,778667007,PL
+778667008,778667175,FR
778667176,778667179,ES
778667180,778667347,FR
778667348,778667351,GB
@@ -12879,11 +14152,15 @@
778671916,778671919,GB
778671920,778672063,FR
778672064,778672067,GB
-778672068,778672095,FR
+778672068,778672071,FR
+778672072,778672079,GB
+778672080,778672095,FR
778672096,778672111,IE
778672112,778672119,FR
778672120,778672123,ES
-778672124,778672479,FR
+778672124,778672383,FR
+778672384,778672447,NL
+778672448,778672479,FR
778672480,778672511,ES
778672512,778672639,FR
778672640,778672703,PT
@@ -12897,7 +14174,9 @@
778673752,778673759,DE
778673760,778673883,FR
778673884,778673887,ES
-778673888,778674535,FR
+778673888,778674303,FR
+778674304,778674367,DE
+778674368,778674535,FR
778674536,778674539,ES
778674540,778674768,FR
778674769,778674769,BE
@@ -12907,7 +14186,8 @@
778674992,778674995,GB
778674996,778674999,FR
778675000,778675003,FI
-778675004,778675199,FR
+778675004,778675007,PL
+778675008,778675199,FR
778675200,778675207,ES
778675208,778675631,FR
778675632,778675639,ES
@@ -12937,7 +14217,9 @@
778676640,778676655,ES
778676656,778676719,FR
778676720,778676723,GB
-778676724,778677183,FR
+778676724,778677095,FR
+778677096,778677099,PL
+778677100,778677183,FR
778677184,778677215,ES
778677216,778677255,FR
778677256,778677259,ES
@@ -12966,7 +14248,9 @@
778680176,778680183,ES
778680184,778680227,FR
778680228,778680231,IE
-778680232,778680643,FR
+778680232,778680575,FR
+778680576,778680639,DE
+778680640,778680643,FR
778680644,778680647,PT
778680648,778680651,FR
778680652,778680655,ES
@@ -12976,7 +14260,9 @@
778681024,778681087,FI
778681088,778681359,FR
778681360,778681367,ES
-778681368,778681463,FR
+778681368,778681423,FR
+778681424,778681431,FI
+778681432,778681463,FR
778681464,778681471,ES
778681472,778681503,FR
778681504,778681507,DE
@@ -12992,17 +14278,23 @@
778681984,778681999,PT
778682000,778682079,FR
778682080,778682095,PT
-778682096,778688447,FR
+778682096,778687431,FR
+778687432,778687439,IT
+778687440,778688447,FR
778688448,778688451,CZ
778688452,778689007,FR
778689008,778689015,FI
-778689016,778689923,FR
+778689016,778689151,FR
+778689152,778689183,CZ
+778689184,778689923,FR
778689924,778689927,DE
778689928,778690655,FR
778690656,778690687,ES
778690688,778690735,FR
778690736,778690751,PT
-778690752,778691887,FR
+778690752,778691763,FR
+778691764,778691767,DE
+778691768,778691887,FR
778691888,778691895,PT
778691896,778691975,FR
778691976,778691983,ES
@@ -13036,11 +14328,15 @@
778693428,778693431,ES
778693432,778693439,FR
778693440,778693455,GB
-778693456,778693663,FR
+778693456,778693471,FR
+778693472,778693503,NL
+778693504,778693663,FR
778693664,778693679,ES
778693680,778693759,FR
778693760,778693763,ES
-778693764,778693967,FR
+778693764,778693855,FR
+778693856,778693887,BE
+778693888,778693967,FR
778693968,778693971,ES
778693972,778694187,FR
778694188,778694191,ES
@@ -13086,7 +14382,9 @@
778697176,778697179,ES
778697180,778697279,FR
778697280,778697287,IE
-778697288,778697435,FR
+778697288,778697311,FR
+778697312,778697343,ES
+778697344,778697435,FR
778697436,778697439,GB
778697440,778697471,FR
778697472,778697479,CZ
@@ -13138,9 +14436,7 @@
780533760,780599295,PL
780599296,780664831,CZ
780664832,780730367,ES
-780730368,780756170,IE
-780756172,780756724,IE
-780756726,780779519,IE
+780730368,780779519,IE
780779520,780795903,SG
780795904,780861439,RU
780861440,780926975,HU
@@ -13273,13 +14569,15 @@
782667776,782671871,NL
782671872,782672655,LT
782672656,782672663,VG
-782672664,782672871,LT
-782672872,782672879,IL
-782672880,782673935,LT
+782672664,782673935,LT
782673936,782673943,EE
782673944,782674167,LT
782674168,782674175,VG
-782674176,782674959,LT
+782674176,782674439,LT
+782674440,782674447,CA
+782674448,782674471,LT
+782674472,782674479,CA
+782674480,782674959,LT
782674960,782674975,CR
782674976,782675967,LT
782675968,782680063,NL
@@ -13372,9 +14670,7 @@
783699968,783702015,UA
783702016,783704063,IT
783704064,783706111,PL
-783706112,783707391,NL
-783707392,783707647,US
-783707648,783708159,NL
+783706112,783708159,NL
783708160,783710207,FI
783710208,783712255,NL
783712256,783714303,RU
@@ -13458,12 +14754,11 @@
784203776,784236543,GR
784236544,784237567,IT
784237568,784238591,ES
-784238592,784239615,US
-784239616,784240639,GB
-784240640,784241151,SG
-784241152,784242175,AU
-784242176,784242687,HK
-784242688,784268799,GB
+784238592,784238847,GB
+784238848,784239103,US
+784239104,784240895,GB
+784240896,784241151,SG
+784241152,784268799,GB
784268800,784269055,US
784269056,784269311,GB
784269312,784302079,BY
@@ -13522,7 +14817,9 @@
786595840,786597887,FR
786597888,786599935,EE
786599936,786601983,ES
-786601984,786604031,SE
+786601984,786603007,SE
+786603008,786603519,NL
+786603520,786604031,SE
786604032,786606079,RU
786606080,786608127,GB
786608128,786610175,IT
@@ -13608,7 +14905,7 @@
786911232,786913279,NL
786913280,786915327,DE
786915328,786917375,SK
-786917376,786919423,RO
+786917376,786919423,US
786919424,786919431,IT
786919432,786919615,GB
786919616,786919623,IT
@@ -13691,7 +14988,9 @@
787116544,787120127,CZ
787120128,787128319,ES
787128320,787136511,CZ
-787136512,787152895,IT
+787136512,787147443,IT
+787147444,787147447,AT
+787147448,787152895,IT
787152896,787154943,GB
787154944,787156991,TR
787156992,787159039,FR
@@ -13708,9 +15007,10 @@
787177472,787179519,RS
787179520,787179775,DE
787179776,787180031,PL
-787180032,787180287,GB
+787180032,787180287,HU
787180288,787180543,DK
-787180544,787183615,DE
+787180544,787180799,IE
+787180800,787183615,DE
787183616,787185663,PL
787185664,787187711,GG
787187712,787189759,IT
@@ -13721,7 +15021,6 @@
787192832,787193087,AE
787193088,787193343,FI
787193344,787193599,DE
-787193600,787193855,IT
787193856,787195903,RU
787195904,787197951,GB
787197952,787199999,FR
@@ -13778,7 +15077,7 @@
787712000,787712255,MT
787712256,787712511,MA
787712512,787713023,DE
-787713024,787713279,LV
+787713024,787713279,BE
787713280,787713535,SE
787713536,787713791,BG
787713792,787714047,GR
@@ -13791,13 +15090,23 @@
787715584,787715839,BH
787715840,787718143,NL
787718144,787718655,RU
-787718656,787718911,NL
-787718912,787719423,RU
+787718656,787719167,NL
+787719168,787719423,RU
787719424,787719935,NL
787719936,787722239,RU
787722240,787722751,NL
787722752,787725311,RU
-787725312,787741695,NL
+787725312,787730431,NL
+787730432,787731199,SE
+787731200,787731967,CA
+787731968,787732479,LU
+787732480,787732735,CH
+787732736,787733247,BE
+787733248,787733759,RU
+787733760,787734015,AT
+787734016,787734271,IE
+787734272,787734527,RO
+787734528,787741695,NL
787741696,787741951,RU
787741952,787742207,NL
787742208,787742719,RU
@@ -14002,9 +15311,7 @@
788504576,788506623,FR
788506624,788508671,CH
788508672,788510719,FR
-788510720,788510847,ES
-788510848,788510910,NO
-788510911,788512320,ES
+788510720,788512320,ES
788512321,788512383,NO
788512384,788512767,ES
788512768,788514815,FI
@@ -14037,7 +15344,9 @@
793247744,793313279,NZ
793313280,793378815,DE
793378816,793395199,JP
-793395200,794329087,US
+793395200,794296319,US
+794296320,794304511,JP
+794304512,794329087,US
794329088,794361855,SG
794361856,794369288,HK
794369289,794369289,CN
@@ -14191,16 +15500,13 @@
838467584,838729727,JP
838729728,838795263,KR
838795264,838860799,AU
-838860800,839009023,US
-839009024,839009279,HU
-839009280,839016191,US
-839016192,839016447,CA
-839016448,839075839,US
-839075840,839076863,DE
-839076864,839078911,US
-839078912,839079935,DE
-839079936,839339607,US
-839339610,839340031,US
+838860800,838991871,US
+838991872,839008511,DE
+839008512,839008767,US
+839008768,839016959,DE
+839016960,839017087,US
+839017088,839122943,DE
+839122944,839340031,US
839340032,839341055,ES
839341056,839343103,DE
839343104,839344127,NL
@@ -14259,8 +15565,7 @@
846561280,846594047,CA
846594048,846631253,US
846631254,846631254,CA
-846631255,846635519,US
-846635776,846644755,US
+846631255,846644755,US
846644756,846644756,PT
846644757,846646527,US
846646528,846646783,CN
@@ -14298,7 +15603,9 @@
858193920,858259455,SA
858259456,860905167,GB
860905168,860905171,FR
-860905172,864919551,GB
+860905172,864550911,GB
+864550912,864616447,NL
+864616448,864919551,GB
864919552,864927743,US
864927744,865009663,GB
865009664,865042431,US
@@ -14322,57 +15629,102 @@
871038976,871104511,SA
871104512,872153087,GB
872153088,872284159,SA
-872284160,872286271,FR
+872284160,872285339,FR
+872285340,872285343,PL
+872285344,872285375,FR
+872285376,872285439,DE
+872285440,872286271,FR
872286272,872286335,ES
872286336,872286871,FR
872286872,872286875,CZ
-872286876,872288159,FR
+872286876,872287743,FR
+872287744,872287807,BE
+872287808,872288159,FR
872288160,872288191,ES
872288192,872288255,FR
872288256,872288319,ES
-872288320,872288383,FR
+872288320,872288383,DE
872288384,872288511,GB
872288512,872288871,FR
872288872,872288875,DE
-872288876,872290111,FR
+872288876,872289071,FR
+872289072,872289087,PL
+872289088,872289247,FR
+872289248,872289279,IT
+872289280,872290111,FR
872290112,872290143,ES
-872290144,872291151,FR
+872290144,872290415,FR
+872290416,872290431,BE
+872290432,872290463,FR
+872290464,872290495,BE
+872290496,872290523,FR
+872290524,872290527,PL
+872290528,872290671,FR
+872290672,872290687,CZ
+872290688,872290751,FR
+872290752,872290815,DE
+872290816,872291151,FR
872291152,872291167,FI
872291168,872291519,FR
872291520,872291583,IE
872291584,872291871,FR
872291872,872291903,ES
-872291904,872292223,FR
+872291904,872292071,FR
+872292072,872292079,BE
+872292080,872292223,FR
872292224,872292351,GB
-872292352,872297039,FR
+872292352,872296479,FR
+872296480,872296511,IT
+872296512,872296575,NL
+872296576,872297039,FR
872297040,872297055,ES
-872297056,872297215,FR
+872297056,872297087,CZ
+872297088,872297215,FR
872297216,872297231,GB
872297232,872297823,FR
872297824,872297855,ES
-872297856,872299103,FR
+872297856,872298383,FR
+872298384,872298391,LT
+872298392,872298463,FR
+872298464,872298495,DE
+872298496,872299103,FR
872299104,872299135,PT
872299136,872299239,FR
872299240,872299247,ES
-872299248,872299967,FR
+872299248,872299839,FR
+872299840,872299903,DE
+872299904,872299967,FR
872299968,872299983,ES
872299984,872300031,FR
872300032,872300063,ES
-872300064,872300543,FR
+872300064,872300127,FR
+872300128,872300159,NL
+872300160,872300543,FR
872300544,872300559,GB
872300560,872300639,FR
872300640,872300671,PT
872300672,872300735,FR
872300736,872300751,PL
-872300752,872301503,FR
+872300752,872300767,FR
+872300768,872300799,NL
+872300800,872301503,FR
872301504,872301567,PL
-872301568,872302783,FR
+872301568,872302687,FR
+872302688,872302719,NL
+872302720,872302783,FR
872302784,872302847,GB
-872302848,872303103,FR
+872302848,872303007,FR
+872303008,872303039,IT
+872303040,872303103,FR
872303104,872303359,GB
-872303360,872304063,FR
+872303360,872303679,FR
+872303680,872303743,IT
+872303744,872304063,FR
872304064,872304079,GB
-872304080,872304319,FR
+872304080,872304239,FR
+872304240,872304255,IT
+872304256,872304311,FR
+872304312,872304319,BE
872304320,872304383,IE
872304384,872304395,FR
872304396,872304399,CZ
@@ -14386,13 +15738,17 @@
872305656,872305663,GB
872305664,872306183,FR
872306184,872306191,US
-872306192,872306367,FR
+872306192,872306223,FR
+872306224,872306239,NL
+872306240,872306367,FR
872306368,872306399,GB
872306400,872307263,FR
872307264,872307327,ES
872307328,872307603,FR
872307604,872307607,GB
-872307608,872308351,FR
+872307608,872307743,FR
+872307744,872307759,IT
+872307760,872308351,FR
872308352,872308371,GB
872308372,872308372,US
872308373,872308455,GB
@@ -14404,15 +15760,22 @@
872309884,872309884,PT
872309885,872310799,FR
872310800,872310815,ES
-872310816,872311039,FR
+872310816,872310911,FR
+872310912,872311039,DE
872311040,872311167,IE
-872311168,872311246,FR
-872311247,872311249,BE
-872311250,872311983,FR
+872311168,872311231,FR
+872311232,872311295,BE
+872311296,872311903,FR
+872311904,872311935,DE
+872311936,872311983,FR
872311984,872311999,FI
-872312000,872312191,FR
+872312000,872312063,NL
+872312064,872312159,FR
+872312160,872312191,CZ
872312192,872312255,ES
-872312256,872312511,FR
+872312256,872312383,FR
+872312384,872312447,IT
+872312448,872312511,FR
872312512,872312575,IE
872312576,872312703,FR
872312704,872312767,ES
@@ -14423,7 +15786,11 @@
872321216,872321279,ES
872321280,872321379,FR
872321380,872321383,GB
-872321384,872322943,FR
+872321384,872321599,FR
+872321600,872321663,IT
+872321664,872321711,FR
+872321712,872321727,CZ
+872321728,872322943,FR
872322944,872323071,GB
872323072,872323135,FR
872323136,872323199,ES
@@ -14434,21 +15801,39 @@
872323472,872323487,ES
872323488,872323551,FR
872323552,872323583,GB
-872323584,872323775,FR
+872323584,872323647,FR
+872323648,872323711,NL
+872323712,872323775,FR
872323776,872323839,ES
872323840,872323936,FR
872323937,872323937,DE
-872323938,872325567,FR
+872323938,872324239,FR
+872324240,872324255,LT
+872324256,872324719,FR
+872324720,872324723,PL
+872324724,872324831,FR
+872324832,872324863,CZ
+872324864,872324927,FR
+872324928,872324991,IT
+872324992,872325567,FR
872325568,872325583,FI
872325584,872325707,FR
872325708,872325711,ES
-872325712,872326151,FR
+872325712,872325823,FR
+872325824,872325887,DE
+872325888,872326151,FR
872326152,872326155,CZ
872326156,872326175,FR
872326176,872326207,PT
872326208,872326271,FR
872326272,872326275,FI
-872326276,872327615,FR
+872326276,872326303,FR
+872326304,872326311,LT
+872326312,872326399,FR
+872326400,872326431,CZ
+872326432,872326495,FR
+872326496,872326511,BE
+872326512,872327615,FR
872327616,872327679,ES
872327680,872327807,FR
872327808,872327811,FI
@@ -14457,51 +15842,96 @@
872327832,872327835,IT
872327836,872327887,FR
872327888,872327903,ES
-872327904,872328231,FR
-872328232,872328235,PL
-872328236,872328383,FR
+872327904,872328351,FR
+872328352,872328383,IT
872328384,872328447,PL
-872328448,872329407,FR
+872328448,872328575,FR
+872328576,872328591,DE
+872328592,872328671,FR
+872328672,872328703,NL
+872328704,872329151,FR
+872329152,872329215,DE
+872329216,872329407,FR
872329408,872329471,ES
872329472,872329599,GB
872329600,872329951,FR
872329952,872329983,GB
872329984,872330279,FR
872330280,872330283,GB
-872330284,872332287,FR
+872330284,872330527,FR
+872330528,872330559,CZ
+872330560,872331271,FR
+872331272,872331275,PL
+872331276,872332287,FR
872332288,872332295,PT
-872332296,872332735,FR
+872332296,872332383,FR
+872332384,872332415,DE
+872332416,872332607,FR
+872332608,872332671,BE
+872332672,872332735,FR
872332736,872332799,ES
872332800,872332831,IE
872332832,872338880,FR
872338881,872338881,BE
872338882,872342335,FR
872342336,872342367,ES
-872342368,872344603,FR
+872342368,872342623,FR
+872342624,872342655,DE
+872342656,872344603,FR
872344604,872344607,GB
-872344608,872345215,FR
+872344608,872344639,IT
+872344640,872344895,FR
+872344896,872344959,NL
+872344960,872345151,FR
+872345152,872345215,CZ
872345216,872345343,GB
-872345344,872346223,FR
+872345344,872346095,FR
+872346096,872346111,DE
+872346112,872346223,FR
872346224,872346239,ES
-872346240,872346351,FR
+872346240,872346319,FR
+872346320,872346335,CZ
+872346336,872346351,FR
872346352,872346367,FI
-872346368,872346815,FR
+872346368,872346799,FR
+872346800,872346815,DE
872346816,872346879,ES
-872346880,872346978,FR
-872346979,872346979,DE
-872346980,872347039,FR
+872346880,872346943,FR
+872346944,872347007,DE
+872347008,872347039,FR
872347040,872347055,GB
872347056,872347063,FR
872347064,872347067,PT
-872347068,872348959,FR
+872347068,872347263,FR
+872347264,872347271,CZ
+872347272,872348095,FR
+872348096,872348159,IT
+872348160,872348799,FR
+872348800,872348863,BE
+872348864,872348959,FR
872348960,872348991,GB
-872348992,872349983,FR
+872348992,872349039,FR
+872349040,872349055,IT
+872349056,872349983,FR
872349984,872350015,GB
-872350016,872351327,FR
+872350016,872350271,FR
+872350272,872350335,BE
+872350336,872350351,NL
+872350352,872350399,FR
+872350400,872350463,NL
+872350464,872350815,FR
+872350816,872350847,IT
+872350848,872351327,FR
872351328,872351359,ES
872351360,872351575,FR
872351576,872351583,FI
-872351584,872353119,FR
+872351584,872351679,FR
+872351680,872351743,DE
+872351744,872351879,FR
+872351880,872351883,PL
+872351884,872352443,FR
+872352444,872352447,DE
+872352448,872353119,FR
872353120,872353151,PT
872353152,872353343,FR
872353344,872353407,IE
@@ -14509,13 +15939,13 @@
872353472,872353535,ES
872353536,872353663,FR
872353664,872353791,GB
-872353792,872354367,FR
+872353792,872354079,FR
+872354080,872354111,CZ
+872354112,872354367,FR
872354368,872354399,PT
-872354400,872354752,FR
-872354753,872354753,BE
-872354754,872354780,FR
-872354781,872354781,BE
-872354782,872355071,FR
+872354400,872354751,FR
+872354752,872354815,BE
+872354816,872355071,FR
872355072,872355103,ES
872355104,872355679,FR
872355680,872355711,PT
@@ -14523,20 +15953,35 @@
872356376,872356383,FI
872356384,872356399,FR
872356400,872356415,ES
-872356416,872357423,FR
+872356416,872356479,DE
+872356480,872356671,FR
+872356672,872356735,IT
+872356736,872357423,FR
872357424,872357439,PT
872357440,872357503,ES
-872357504,872363071,FR
+872357504,872357671,FR
+872357672,872357679,IT
+872357680,872357695,FR
+872357696,872357759,NL
+872357760,872363071,FR
872363072,872363103,ES
872363104,872363135,FR
872363136,872363199,PL
-872363200,872363871,FR
+872363200,872363423,FR
+872363424,872363455,CZ
+872363456,872363871,FR
872363872,872363903,PT
-872363904,872364863,FR
+872363904,872364671,FR
+872364672,872364703,LT
+872364704,872364847,FR
+872364848,872364855,DE
+872364856,872364863,FR
872364864,872364898,NL
872364899,872364899,FR
872364900,872364927,NL
-872364928,872365311,FR
+872364928,872365019,FR
+872365020,872365023,CZ
+872365024,872365311,FR
872365312,872365319,PT
872365320,872374459,FR
872374460,872374463,GB
@@ -14552,86 +15997,190 @@
872376192,872376319,GB
872376320,872376687,FR
872376688,872376691,CZ
-872376692,872377279,FR
+872376692,872376895,FR
+872376896,872376959,BE
+872376960,872377279,FR
872377280,872377343,ES
-872377344,872377983,FR
+872377344,872377919,FR
+872377920,872377983,BE
872377984,872378047,IE
-872378048,872379375,FR
+872378048,872378207,FR
+872378208,872378239,IT
+872378240,872378447,FR
+872378448,872378463,CZ
+872378464,872379103,FR
+872379104,872379135,PL
+872379136,872379199,FR
+872379200,872379263,DE
+872379264,872379375,FR
872379376,872379391,GB
-872379392,872380247,FR
+872379392,872379967,FR
+872379968,872380031,NL
+872380032,872380143,FR
+872380144,872380147,DE
+872380148,872380247,FR
872380248,872380248,ES
872380249,872380607,FR
872380608,872380671,ES
872380672,872380783,FR
872380784,872380799,IE
-872380800,872382143,FR
+872380800,872381063,FR
+872381064,872381071,CZ
+872381072,872381151,FR
+872381152,872381183,CZ
+872381184,872381343,FR
+872381344,872381375,PL
+872381376,872382143,FR
872382144,872382207,ES
872382208,872382335,FR
872382336,872382463,GB
-872382464,872382779,FR
+872382464,872382655,FR
+872382656,872382719,DE
+872382720,872382779,FR
872382780,872382783,ES
-872382784,872383519,FR
+872382784,872383327,FR
+872383328,872383359,PL
+872383360,872383519,FR
872383520,872383551,ES
872383552,872383583,GB
872383584,872383743,FR
872383744,872383759,DE
-872383760,872384095,FR
+872383760,872383807,FR
+872383808,872383871,IT
+872383872,872383967,FR
+872383968,872383999,CZ
+872384000,872384003,PL
+872384004,872384095,FR
872384096,872384127,ES
872384128,872384287,FR
872384288,872384319,FI
872384320,872384383,ES
-872384384,872385535,FR
+872384384,872385103,FR
+872385104,872385119,PL
+872385120,872385151,FR
+872385152,872385167,LT
+872385168,872385183,FR
+872385184,872385215,DE
+872385216,872385279,BE
+872385280,872385535,FR
872385536,872385543,PT
-872385544,872385695,FR
+872385544,872385615,FR
+872385616,872385631,NL
+872385632,872385671,FR
+872385672,872385679,PL
+872385680,872385695,FR
872385696,872385727,PT
872385728,872386175,FR
872386176,872386303,GB
872386304,872386335,FR
872386336,872386367,FI
-872386368,872387007,FR
+872386368,872386399,FR
+872386400,872386431,IT
+872386432,872386591,FR
+872386592,872386607,LT
+872386608,872386623,FR
+872386624,872386687,IT
+872386688,872386719,FR
+872386720,872386751,PL
+872386752,872387007,FR
872387008,872387071,IE
872387072,872387263,FR
872387264,872387279,PT
-872387280,872388287,FR
+872387280,872387295,PL
+872387296,872387775,FR
+872387776,872387839,IT
+872387840,872388191,FR
+872388192,872388223,DE
+872388224,872388255,FR
+872388256,872388287,CZ
872388288,872388351,ES
872388352,872388407,FR
872388408,872388415,PT
872388416,872388447,ES
-872388448,872388463,FR
-872388464,872388471,GB
-872388472,872388591,FR
+872388448,872388511,FR
+872388512,872388543,PL
+872388544,872388591,FR
872388592,872388607,ES
-872388608,872389535,FR
+872388608,872388671,DE
+872388672,872388799,FR
+872388800,872388863,DE
+872388864,872389247,FR
+872389248,872389311,DE
+872389312,872389535,FR
872389536,872389567,GB
-872389568,872390591,FR
+872389568,872389983,FR
+872389984,872390015,NL
+872390016,872390495,FR
+872390496,872390527,PL
+872390528,872390591,FR
872390592,872390655,ES
872390656,872391230,FR
872391231,872391231,BE
872391232,872393204,FR
872393205,872393205,BE
-872393206,872403159,FR
+872393206,872403023,FR
+872403024,872403039,LT
+872403040,872403071,NL
+872403072,872403159,FR
872403160,872403167,PT
-872403168,872403599,FR
+872403168,872403183,FR
+872403184,872403199,PL
+872403200,872403567,FR
+872403568,872403583,LT
+872403584,872403599,FR
872403600,872403615,PT
-872403616,872403743,FR
+872403616,872403647,PL
+872403648,872403711,IT
+872403712,872403743,FR
872403744,872403775,PT
-872403776,872405791,FR
+872403776,872403839,DE
+872403840,872404071,FR
+872404072,872404079,PL
+872404080,872404511,FR
+872404512,872404543,IT
+872404544,872404639,FR
+872404640,872404671,PL
+872404672,872405567,FR
+872405568,872405631,BE
+872405632,872405791,FR
872405792,872405823,FI
-872405824,872406207,FR
+872405824,872405887,NL
+872405888,872405935,FR
+872405936,872405951,CZ
+872405952,872406047,FR
+872406048,872406079,PL
+872406080,872406207,FR
872406208,872406271,ES
-872406272,872406815,FR
+872406272,872406591,FR
+872406592,872406655,DE
+872406656,872406815,FR
872406816,872406847,FI
872406848,872406879,FR
872406880,872406911,ES
872406912,872407167,FR
872407168,872407171,FI
-872407172,872408383,FR
+872407172,872407231,FR
+872407232,872407295,IT
+872407296,872408255,FR
+872408256,872408319,NL
+872408320,872408383,FR
872408384,872408447,IE
-872408448,872409215,FR
+872408448,872408591,FR
+872408592,872408607,LT
+872408608,872409151,FR
+872409152,872409215,DE
872409216,872409343,GB
-872409344,872409679,FR
+872409344,872409631,FR
+872409632,872409663,IT
+872409664,872409679,FR
872409680,872409683,ES
-872409684,872415231,FR
+872409684,872410175,FR
+872410176,872410239,DE
+872410240,872410759,FR
+872410760,872410767,IT
+872410768,872410847,FR
+872410848,872410879,IT
+872410880,872415231,FR
872415232,873463807,US
873463808,873646466,IE
873646467,873646467,US
@@ -14842,7 +16391,10 @@
879822336,879822591,IN
879822592,879822623,HK
879822624,879822655,SG
-879822656,879829119,US
+879822656,879822719,US
+879822720,879822847,HK
+879822848,879822975,SG
+879822976,879829119,US
879829120,879829247,SG
879829248,879829375,JP
879829376,879829503,HK
@@ -14875,7 +16427,7 @@
880216832,880217087,CA
880217088,880261119,US
880261120,880262143,SG
-880262144,880263167,US
+880262144,880263167,DE
880263168,880264191,IE
880264192,880269311,US
880269312,880271359,JP
@@ -14893,19 +16445,21 @@
880874752,880875007,CA
880875008,880876543,US
880876544,880877567,CA
+880877568,880878079,US
880878080,880878591,CA
-880878592,880879233,US
-880879234,880879234,CA
-880879235,880881663,US
+880878592,880881663,US
880881664,880885759,PR
-880885760,881332223,US
+880885760,880934911,US
+880934912,881065983,SG
+881065984,881332223,US
881332224,881332735,IN
881332736,881333759,GB
881333760,881334271,CA
881334272,881334527,IN
881334528,881334783,AU
881334784,881335039,SG
-881335040,881336319,US
+881335040,881335551,FR
+881335552,881336319,US
881336320,881344511,IN
881344512,881360895,US
881360896,881377279,FR
@@ -14926,7 +16480,15 @@
881770496,881803263,NL
881803264,881819647,US
881819648,881836031,FR
-881836032,881859327,US
+881836032,881836543,US
+881836544,881836799,NL
+881836800,881837055,IE
+881837056,881837311,SG
+881837312,881840127,US
+881840128,881840383,NL
+881840384,881840639,IE
+881840640,881840895,SG
+881840896,881859327,US
881859328,881859583,CA
881859584,881868799,US
881868800,881876991,IT
@@ -14958,10 +16520,9 @@
882720768,882769919,NL
882769920,882802687,IE
882802688,882810879,AU
-882810880,882843337,US
-882843340,882843751,US
-882843754,882851839,US
+882810880,882851839,US
882851840,882851942,IN
+882851943,882851943,US
882851944,882860031,IN
882860032,883097599,US
883097600,883163135,SG
@@ -15071,7 +16632,10 @@
888127104,888127231,KR
888127232,888127999,US
888128000,888128255,FR
-888128256,888274943,US
+888128256,888128511,US
+888128512,888128767,FR
+888128768,888129023,SG
+888129024,888274943,US
888274944,888291327,CA
888291328,888348671,US
888348672,888356863,JP
@@ -15122,9 +16686,10 @@
889052160,889135103,US
889135104,889143295,AU
889143296,889192447,US
-889192448,897238054,DE
-897238056,905969663,DE
-905969664,910163967,US
+889192448,905969663,DE
+905969664,908328959,US
+908328960,908591103,FR
+908591104,910163967,US
910163968,910197237,JP
910197238,910197238,US
910197239,910295039,JP
@@ -15233,6 +16798,7 @@
921760768,921761791,BR
921761792,922091519,US
922091520,922189311,IE
+922189312,922189567,US
922189568,922205775,IE
922205776,922205776,DE
922205777,922222591,IE
@@ -15249,24 +16815,14 @@
959447040,959512575,US
959512576,960495615,BE
960495616,960626687,FR
-960626688,960641023,GB
-960641280,960643330,GB
-960643332,960644351,GB
-960644864,960646399,GB
-960646912,960654335,GB
-960654375,960654375,GB
-960654592,960657919,GB
+960626688,960657919,GB
960657920,960658175,EG
960658176,960658431,GB
960658432,960658687,US
960658688,960659455,GB
-960659456,960662015,DE
-960662272,960662783,DE
+960659456,960662783,DE
960662784,960663039,FR
-960663040,960671487,DE
-960671744,960673293,DE
-960673295,960674047,DE
-960674304,960676607,DE
+960663040,960676607,DE
960676608,960676863,PL
960676864,960692223,DE
960692224,960699935,FR
@@ -15275,14 +16831,10 @@
960724992,960726783,NL
960726784,960727039,ZA
960727040,960727295,US
-960727296,960728319,NL
-960728576,960729343,NL
+960727296,960729343,NL
960729344,960729599,ZA
-960729856,960733183,NL
-960733184,960733439,BE
-960733696,960733951,BE
-960734464,960737535,BE
-960737792,960741375,BE
+960729600,960733183,NL
+960733184,960741375,BE
960741376,960749567,NL
960749568,960757759,LU
960757760,960888831,US
@@ -15302,24 +16854,14 @@
960974848,960978943,VU
960978944,960983039,NC
960983040,961019903,FR
-961019904,961021439,HK
-961021696,961021951,HK
+961019904,961022079,HK
961022080,961022095,SG
-961022208,961022719,HK
-961022976,961025535,HK
-961025792,961036799,HK
-961037056,961052671,HK
+961022096,961052671,HK
961052672,961085439,JP
-961085440,961087231,SG
-961087488,961089023,SG
-961089536,961090047,SG
-961090304,961091839,SG
+961085440,961092095,SG
961092096,961092351,IN
-961092608,961093887,SG
-961094144,961118207,SG
-961118208,961119487,MY
-961119509,961119509,MY
-961119744,961126399,MY
+961092352,961118207,SG
+961118208,961126399,MY
961126400,961134591,TW
961134592,961142783,KR
961142784,961150975,KP
@@ -15413,12 +16955,10 @@
961896448,961900543,NG
961900544,961937407,FR
961937408,961945599,IS
-961945600,961950463,FI
-961950720,961953791,FI
+961945600,961953791,FI
961953792,961961983,DK
961961984,961970175,NO
-961970176,961971455,SE
-961971712,962002943,SE
+961970176,962002943,SE
962002944,962035711,RU
962035712,962039807,EE
962039808,962043903,LV
@@ -15447,9 +16987,7 @@
962138112,962142207,YE
962142208,962199551,FR
962199552,962203647,AL
-962203648,962207999,AT
-962208196,962208196,AT
-962208256,962211839,AT
+962203648,962211839,AT
962211840,962215935,BG
962215936,962217983,HR
962217984,962220031,BA
@@ -15534,8 +17072,7 @@
968818688,968819711,DE
968819712,968851455,BE
968851456,968852479,US
-968852480,972748031,BE
-972748288,973078527,BE
+968852480,973078527,BE
973078528,973209599,JP
973209600,973275135,IN
973275136,973471743,JP
@@ -15655,9 +17192,7 @@
985006080,985071615,SG
985071616,985137151,JP
985137152,985202687,KR
-985202688,985224959,SG
-985225216,985243903,SG
-985244160,985268223,SG
+985202688,985268223,SG
985268224,985399295,VN
985399296,985661439,JP
985661440,987758591,CN
@@ -15711,8 +17246,7 @@
999847936,999848959,IN
999848960,999849983,US
999849984,999866367,KR
-999866368,999873941,HK
-999873944,999882751,HK
+999866368,999882751,HK
999882752,999883775,IN
999883776,999884799,CN
999884800,999885823,AU
@@ -15839,8 +17373,7 @@
1023967232,1023975423,IN
1023975424,1023979519,CN
1023979520,1023983615,AU
-1023983616,1023991551,SG
-1023991808,1023999999,SG
+1023983616,1023999999,SG
1024000000,1024032767,PH
1024032768,1024065535,AU
1024065536,1024131071,HK
@@ -15869,8 +17402,7 @@
1024361168,1024361183,HK
1024361184,1024364063,JP
1024364064,1024364079,AU
-1024364080,1024365055,JP
-1024365312,1024365727,JP
+1024364080,1024365727,JP
1024365728,1024365759,SG
1024365760,1024371199,JP
1024371200,1024371455,PH
@@ -15902,7 +17434,9 @@
1025294592,1025294847,SG
1025294848,1025295615,AU
1025295616,1025295871,PH
-1025295872,1025299199,AU
+1025295872,1025296127,AU
+1025296128,1025296639,FR
+1025296640,1025299199,AU
1025299200,1025299263,IN
1025299264,1025299455,AU
1025299456,1025299711,CN
@@ -15982,13 +17516,11 @@
1029701632,1030674431,KR
1030674432,1030676479,JP
1030676480,1030750207,KR
-1030750208,1030946303,JP
-1030946560,1031798783,JP
+1030750208,1031798783,JP
1031798784,1033172184,CN
1033172185,1033172185,US
1033172186,1035993087,CN
-1035993088,1037415679,JP
-1037415936,1037565951,JP
+1035993088,1037565951,JP
1037565952,1038614527,TW
1038614528,1039007743,CN
1039007744,1039138815,HK
@@ -16044,7 +17576,6 @@
1040990208,1040998399,CY
1040998400,1041002495,SD
1041002496,1041004543,KE
-1041004544,1041006591,EG
1041006592,1041039359,CH
1041039360,1041072127,SE
1041072128,1041080319,GB
@@ -16061,25 +17592,21 @@
1041268736,1041301503,NO
1041301504,1041310975,IE
1041310976,1041311231,GB
-1041311232,1041336319,IE
-1041336576,1041338879,IE
+1041311232,1041338879,IE
1041338880,1041339135,GB
1041339136,1041367039,IE
1041367040,1041498111,IT
1041498112,1041563647,SE
1041563648,1041596415,PL
1041596416,1041629183,NL
-1041629184,1041638655,ES
-1041638912,1041642751,ES
-1041643008,1041694719,ES
+1041629184,1041694719,ES
1041694720,1041724807,FR
1041724808,1041724815,AT
1041724816,1041728551,FR
1041728552,1041728559,IT
1041728560,1041728655,FR
1041728656,1041728671,IT
-1041728672,1041748991,FR
-1041749248,1041752319,FR
+1041728672,1041752319,FR
1041752320,1041752575,AT
1041752576,1041760255,FR
1041760256,1041768447,DE
@@ -16093,8 +17620,8 @@
1041862656,1041866751,SG
1041866752,1041870847,JP
1041870848,1041874943,AU
-1041874944,1041890303,GB
-1041890304,1041891327,HK
+1041874944,1041890047,GB
+1041890048,1041891327,HK
1041891328,1042022399,DE
1042022400,1042087935,PT
1042087936,1042120703,TR
@@ -16131,8 +17658,7 @@
1042880000,1042880007,GB
1042880008,1042881023,NL
1042881024,1042881535,DE
-1042881536,1042892863,NL
-1042893056,1042939903,NL
+1042881536,1042939903,NL
1042939904,1043070975,ES
1043070976,1043079167,CZ
1043079168,1043087359,DE
@@ -16174,8 +17700,7 @@
1043899392,1043899647,CG
1043899648,1043902463,GB
1043902464,1043908607,US
-1043908608,1043910143,DE
-1043910400,1043910655,DE
+1043908608,1043910655,DE
1043910656,1043919442,GB
1043919443,1043919443,SS
1043919444,1043920895,GB
@@ -16223,7 +17748,9 @@
1044578624,1044578639,DE
1044578640,1044589055,GB
1044589056,1044589311,DE
-1044589312,1044625631,GB
+1044589312,1044590689,GB
+1044590690,1044590690,FR
+1044590691,1044625631,GB
1044625632,1044625647,RS
1044625648,1044627391,GB
1044627392,1044627455,ES
@@ -16260,8 +17787,7 @@
1044748288,1044750335,DK
1044750336,1044758527,NL
1044758528,1044774911,PL
-1044774912,1044782079,NO
-1044782336,1044840447,NO
+1044774912,1044840447,NO
1044840448,1044905983,FI
1044905984,1044908031,GB
1044908032,1044909055,US
@@ -16320,6 +17846,7 @@
1044955136,1044963327,NL
1044963328,1044971519,FI
1044971520,1044973567,FR
+1044973568,1044974079,GB
1044974080,1044979711,FR
1044979712,1044987903,FI
1044987904,1045004287,BG
@@ -16498,9 +18025,7 @@
1046514688,1046515711,DE
1046515712,1046518359,GB
1046518360,1046518367,DE
-1046518368,1046518799,GB
-1046518800,1046518807,DE
-1046518808,1046518911,GB
+1046518368,1046518911,GB
1046518912,1046518975,DE
1046518976,1046519039,GB
1046519040,1046519295,DE
@@ -16519,8 +18044,8 @@
1046525696,1046525951,GB
1046525952,1046527999,DE
1046528000,1046528335,GB
-1046528336,1046528383,DE
-1046528384,1046528505,GB
+1046528336,1046528391,DE
+1046528392,1046528505,GB
1046528506,1046528506,DE
1046528507,1046528535,GB
1046528536,1046528543,DE
@@ -16542,7 +18067,11 @@
1046535624,1046535631,DE
1046535632,1046535665,GB
1046535666,1046535666,DE
-1046535667,1046536511,GB
+1046535667,1046535967,GB
+1046535968,1046535999,DE
+1046536000,1046536063,GB
+1046536064,1046536095,DE
+1046536096,1046536511,GB
1046536512,1046536543,DE
1046536544,1046536631,GB
1046536632,1046536639,DE
@@ -16717,7 +18246,6 @@
1047782690,1047782690,GB
1047787520,1047787775,ES
1047788288,1047788543,NL
-1047788544,1047789055,GB
1047789568,1047822335,AT
1047822336,1047838719,DE
1047838720,1047846911,DK
@@ -16727,8 +18255,7 @@
1047871488,1047887871,RU
1047887872,1047920639,ES
1047920640,1047986175,RU
-1047986176,1048011775,SE
-1048012032,1048051711,SE
+1047986176,1048051711,SE
1048051712,1048117247,SA
1048117248,1048125439,GB
1048125440,1048133631,FI
@@ -16772,7 +18299,7 @@
1048604945,1048604945,LT
1048604946,1048608767,UA
1048608768,1048616959,GB
-1048617216,1048618751,US
+1048616960,1048619007,US
1048619008,1048621055,GB
1048621056,1048621056,DE
1048621057,1048625151,US
@@ -16800,8 +18327,7 @@
1048992608,1048992623,DE
1049006080,1049006335,DE
1049008128,1049009151,DE
-1049016320,1049018367,DE
-1049018624,1049022463,DE
+1049016320,1049022463,DE
1049026816,1049029375,DE
1049030656,1049031679,DE
1049031744,1049031871,DE
@@ -16835,8 +18361,7 @@
1049477120,1049493503,PL
1049493504,1049559039,FI
1049559040,1049698303,DE
-1049698304,1049699071,NL
-1049699328,1049700351,NL
+1049698304,1049700351,NL
1049700352,1049702399,DE
1049702400,1049706495,NL
1049706496,1049722879,GB
@@ -16870,14 +18395,11 @@
1050189824,1050198015,DE
1050198016,1050206207,RU
1050206208,1050214399,SK
-1050214400,1050272511,DE
-1050272768,1050470911,DE
+1050214400,1050470911,DE
1050470912,1050471031,GB
1050471032,1050471039,DE
1050471040,1050471167,GB
-1050471168,1050627327,DE
-1050627402,1050627402,DE
-1050627584,1050673151,DE
+1050471168,1050673151,DE
1050673152,1050804223,FR
1050804224,1050869759,MK
1050869760,1050935295,NL
@@ -16927,8 +18449,7 @@
1051394048,1051525119,GB
1051525120,1051533311,MT
1051533312,1051541503,NG
-1051541504,1051549345,GB
-1051549347,1051557887,GB
+1051541504,1051557887,GB
1051557888,1051566079,RU
1051566080,1051574271,IT
1051574272,1051590655,GB
@@ -17721,16 +19242,14 @@
1052507648,1052507775,GB
1052507904,1052605951,GB
1052605952,1052606207,HU
-1052606208,1052641930,GB
-1052641932,1052704767,GB
+1052606208,1052704767,GB
1052704768,1052712959,NL
1052712960,1052770303,GB
1052770304,1052778495,CH
1052778496,1052786687,RU
1052786688,1052794879,GR
1052794880,1052803071,NL
-1052803072,1052803327,DE
-1052803584,1052806655,DE
+1052803072,1052806655,DE
1052806656,1052807167,MW
1052807168,1052811263,DE
1052811264,1052819455,RU
@@ -17740,7 +19259,6 @@
1052844032,1052852223,FR
1052852224,1052868607,EG
1052868608,1052876799,RS
-1052876800,1052884991,NG
1052884992,1052901375,FR
1052901376,1053032447,NL
1053032448,1053097983,IT
@@ -17851,7 +19369,7 @@
1053867976,1053867983,DE
1053867992,1053867999,DE
1053868008,1053868015,DE
-1053868032,1053868359,ES
+1053868032,1053868367,ES
1053868416,1053868447,ES
1053868448,1053868455,GB
1053868456,1053868479,ES
@@ -17887,7 +19405,9 @@
1053949952,1053968188,FR
1053968189,1053968189,PT
1053968190,1053985279,FR
-1053985280,1053985535,GB
+1053985280,1053985390,GB
+1053985391,1053985391,FR
+1053985392,1053985535,GB
1053985536,1054015487,FR
1054015488,1054089215,IT
1054089216,1054097407,GE
@@ -17972,9 +19492,7 @@
1054720000,1054728191,NL
1054728192,1054729471,ES
1054729472,1054867455,NL
-1054867456,1054948253,DE
-1054948255,1054973951,DE
-1054974208,1055129599,DE
+1054867456,1055129599,DE
1055129600,1055195135,CY
1055195136,1055203327,CH
1055211520,1055219711,PT
@@ -18164,7 +19682,9 @@
1067237888,1067238399,JP
1067238400,1067294719,US
1067294720,1067294975,CA
-1067294976,1067481855,US
+1067294976,1067384831,US
+1067384832,1067385087,JP
+1067385088,1067481855,US
1067481856,1067482111,CA
1067482112,1067532287,US
1067532288,1067532799,HN
@@ -18180,11 +19700,7 @@
1067736832,1067737087,PR
1067737088,1067740159,US
1067740160,1067741183,HN
-1067741184,1067780607,US
-1067780608,1067780863,GB
-1067780864,1067989247,US
-1067989248,1067989503,EC
-1067989504,1067998463,US
+1067741184,1067998463,US
1067998464,1067998719,CO
1067998720,1068004351,US
1068004352,1068004607,CA
@@ -18200,9 +19716,7 @@
1068199936,1068204031,CA
1068204032,1068230655,US
1068230656,1068230911,CO
-1068230912,1068326911,US
-1068326912,1068327167,EC
-1068327168,1068346367,US
+1068230912,1068346367,US
1068346368,1068346879,YE
1068346880,1068419071,US
1068419072,1068421119,CO
@@ -18234,10 +19748,7 @@
1071255526,1071255526,DE
1071255527,1071255839,US
1071255840,1071255847,TW
-1071255848,1071270655,US
-1071270912,1071271167,US
-1071271264,1071271279,US
-1071271360,1071276031,US
+1071255848,1071276031,US
1071276032,1071284223,SG
1071284224,1071290367,US
1071290368,1071292415,AU
@@ -18274,8 +19785,7 @@
1072228864,1072229375,CA
1072229376,1072361471,US
1072361472,1072361727,GB
-1072361728,1072405457,US
-1072405459,1072707327,US
+1072361728,1072707327,US
1072707328,1072707583,IN
1072707584,1072923135,US
1072923136,1072923391,CA
@@ -18360,8 +19870,7 @@
1073118720,1073119231,DE
1073119232,1073373183,US
1073373184,1073381375,CA
-1073381376,1073381631,US
-1073381888,1073454591,US
+1073381376,1073454591,US
1073454592,1073454847,KY
1073454848,1074009727,US
1074009728,1074009855,IE
@@ -18477,9 +19986,7 @@
1074508288,1074509823,CA
1074509824,1074510079,US
1074510080,1074513151,CA
-1074513152,1074558486,US
-1074558488,1074558551,US
-1074558553,1074703615,US
+1074513152,1074703615,US
1074703616,1074703871,GB
1074703872,1074704383,US
1074704384,1074704639,GB
@@ -18516,7 +20023,7 @@
1075576897,1075585023,NO
1075585024,1075609599,US
1075609600,1075613695,TT
-1075617792,1075855359,US
+1075613696,1075855359,US
1075855360,1075871743,DO
1075871744,1075904511,US
1075904512,1075920895,JP
@@ -18587,7 +20094,11 @@
1076008448,1076009215,CA
1076009216,1076009727,US
1076009728,1076009983,CA
-1076009984,1076026623,US
+1076009984,1076018057,US
+1076018058,1076018058,CA
+1076018059,1076018798,US
+1076018799,1076018799,CA
+1076018800,1076026623,US
1076026624,1076026879,CA
1076026880,1076027019,US
1076027020,1076027023,CA
@@ -18641,8 +20152,7 @@
1076394240,1076396031,CA
1076396032,1076408319,US
1076408320,1076412415,CA
-1076412416,1076422192,US
-1076422194,1076424703,US
+1076412416,1076424703,US
1076424704,1076428799,CA
1076428800,1076543487,US
1076543488,1076559871,CA
@@ -18692,17 +20202,23 @@
1077857381,1077857535,FR
1077857536,1077865983,US
1077865984,1077866239,CA
-1077866240,1077963775,US
+1077866240,1077886975,US
+1077886976,1077903359,JP
+1077903360,1077961347,US
+1077961348,1077961350,MX
+1077961351,1077963775,US
1077963776,1077964031,JP
1077964032,1077967103,US
1077967104,1077967359,CA
1077967360,1077967615,US
1077967616,1077968127,GB
-1077968128,1077977087,US
+1077968128,1077968765,US
+1077968766,1077968768,MX
+1077968769,1077977087,US
1077977088,1077985279,CA
1077985280,1077993471,US
-1077993472,1078001663,CA
-1078001664,1078067199,US
+1077993472,1078018047,CA
+1078018048,1078067199,US
1078067200,1078071295,BS
1078071296,1078075391,CA
1078075392,1078124543,US
@@ -18805,7 +20321,9 @@
1078782464,1078782719,PA
1078782720,1078895103,US
1078895104,1078895359,CN
-1078895360,1079320575,US
+1078895360,1079319295,US
+1079319296,1079319551,CN
+1079319552,1079320575,US
1079320576,1079322831,CA
1079322832,1079322839,US
1079322840,1079328767,CA
@@ -18914,13 +20432,16 @@
1080262656,1080279039,CA
1080279040,1080492031,US
1080492032,1080498664,NL
+1080498665,1080498665,US
1080498666,1080501380,NL
1080501381,1080501381,US
1080501382,1080501503,NL
+1080501504,1080501759,US
1080501760,1080524799,NL
1080524800,1080557567,IN
1080557568,1080573951,JP
1080573952,1080581887,SG
+1080581888,1080582143,US
1080582144,1080590335,HK
1080590336,1080598527,IN
1080598528,1080606719,HK
@@ -18995,13 +20516,17 @@
1081462784,1081462856,US
1081462857,1081462857,BR
1081462858,1081479167,US
-1081479168,1081483263,CA
+1081479168,1081483247,CA
+1081483248,1081483255,US
+1081483256,1081483263,CA
1081483264,1081565183,US
1081565184,1081573375,CA
1081573376,1081589759,US
1081589760,1081593855,BB
1081593856,1081597951,CA
-1081597952,1081978623,US
+1081597952,1081634303,US
+1081634304,1081637375,SG
+1081637376,1081978623,US
1081978624,1081978631,CH
1081978632,1082091263,US
1082091264,1082091271,CN
@@ -19075,8 +20600,7 @@
1086955520,1086971903,CA
1086971904,1087016959,US
1087016960,1087021055,CA
-1087021056,1087385855,US
-1087386112,1087398911,US
+1087021056,1087398911,US
1087398912,1087399423,GB
1087399424,1087405407,US
1087405408,1087405423,MX
@@ -19102,9 +20626,7 @@
1087444224,1087444479,GB
1087444480,1087466883,US
1087466884,1087466887,GB
-1087466888,1087496703,US
-1087496704,1087496959,CA
-1087496960,1087501471,US
+1087466888,1087501471,US
1087501472,1087501479,HK
1087501480,1087501535,US
1087501536,1087501695,HK
@@ -19168,7 +20690,9 @@
1087862784,1087864831,PA
1087864832,1087873023,US
1087873024,1087873535,CA
-1087873536,1087883263,US
+1087873536,1087879403,US
+1087879404,1087879407,GB
+1087879408,1087883263,US
1087883264,1087883519,AR
1087883520,1087918511,US
1087918512,1087918519,PR
@@ -19176,11 +20700,121 @@
1087950112,1087950119,PR
1087950120,1088012767,US
1088012768,1088012775,PR
-1088012776,1088684031,US
-1088684032,1088946175,CA
-1088946176,1089055999,US
-1089056256,1089057279,US
-1089057536,1089151231,US
+1088012776,1088421887,US
+1088421888,1088422143,CA
+1088422144,1088422911,US
+1088422912,1088423167,CA
+1088423168,1088423679,US
+1088423680,1088424959,CA
+1088424960,1088425983,US
+1088425984,1088427263,CA
+1088427264,1088433663,US
+1088433664,1088433919,CA
+1088433920,1088435455,US
+1088435456,1088435711,CA
+1088435712,1088437247,US
+1088437248,1088438527,CA
+1088438528,1088440063,US
+1088440064,1088440575,CA
+1088440576,1088440831,US
+1088440832,1088441343,CA
+1088441344,1088442623,US
+1088442624,1088442879,CA
+1088442880,1088446975,US
+1088446976,1088447231,CA
+1088447232,1088447487,US
+1088447488,1088449023,CA
+1088449024,1088449279,US
+1088449280,1088450047,CA
+1088450048,1088450303,US
+1088450304,1088462847,CA
+1088462848,1088467711,US
+1088467712,1088467967,CA
+1088467968,1088471039,US
+1088471040,1088471807,CA
+1088471808,1088472063,US
+1088472064,1088473455,CA
+1088473456,1088473487,US
+1088473488,1088473855,CA
+1088473856,1088474111,US
+1088474112,1088475135,CA
+1088475136,1088476927,US
+1088476928,1088477439,CA
+1088477440,1088477695,US
+1088477696,1088478207,CA
+1088478208,1088478719,US
+1088478720,1088479231,CA
+1088479232,1088481023,US
+1088481024,1088483327,CA
+1088483328,1088484095,US
+1088484096,1088484351,CA
+1088484352,1088485375,US
+1088485376,1088486911,CA
+1088486912,1088487423,US
+1088487424,1088495615,CA
+1088495616,1088514047,US
+1088514048,1088514559,CA
+1088514560,1088516095,US
+1088516096,1088538623,CA
+1088538624,1088543487,US
+1088543488,1088546815,CA
+1088546816,1088548863,US
+1088548864,1088550399,CA
+1088550400,1088550655,US
+1088550656,1088551167,CA
+1088551168,1088551423,US
+1088551424,1088551935,CA
+1088551936,1088552191,US
+1088552192,1088552703,CA
+1088552704,1088552959,US
+1088552960,1088553727,CA
+1088553728,1088553983,US
+1088553984,1088554239,CA
+1088554240,1088558335,US
+1088558336,1088558591,CA
+1088558592,1088559103,US
+1088559104,1088560383,CA
+1088560384,1088564223,US
+1088564224,1088565247,CA
+1088565248,1088566271,US
+1088566272,1088566783,CA
+1088566784,1088580095,US
+1088580096,1088584703,CA
+1088584704,1088591871,US
+1088591872,1088596479,CA
+1088596480,1088599039,US
+1088599040,1088599551,CA
+1088599552,1088607999,US
+1088608000,1088608255,CA
+1088608256,1088609279,US
+1088609280,1088609791,CA
+1088609792,1088610815,US
+1088610816,1088611071,CA
+1088611072,1088614399,US
+1088614400,1088616447,CA
+1088616448,1088617471,US
+1088617472,1088618495,CA
+1088618496,1088636927,US
+1088636928,1088639999,CA
+1088640000,1088641023,US
+1088641024,1088642047,CA
+1088642048,1088660735,US
+1088660736,1088661503,CA
+1088661504,1088663551,US
+1088663552,1088665599,CA
+1088665600,1088666111,US
+1088666112,1088666623,CA
+1088666624,1088668671,US
+1088668672,1088669695,CA
+1088669696,1088673279,US
+1088673280,1088676863,CA
+1088676864,1088677887,US
+1088677888,1088678911,CA
+1088678912,1088679423,US
+1088679424,1088679935,CA
+1088679936,1088680959,US
+1088680960,1088946175,CA
+1088946176,1089151231,US
1089151232,1089151487,NL
1089151488,1089152255,US
1089152256,1089152511,NL
@@ -19205,9 +20839,9 @@
1089235456,1089235967,GB
1089235968,1089249279,US
1089249280,1089249535,IE
-1089249536,1089250070,US
-1089250072,1089263615,US
+1089249536,1089263615,US
1089263616,1089263871,GB
+1089263872,1089264127,US
1089264128,1089264639,FR
1089264640,1089265663,US
1089265664,1089265919,GB
@@ -19246,7 +20880,9 @@
1090355200,1090363391,CA
1090363392,1090387967,US
1090387968,1090396159,CA
-1090396160,1090427391,US
+1090396160,1090418565,US
+1090418566,1090418566,DE
+1090418567,1090427391,US
1090427392,1090427647,CA
1090427648,1090445311,US
1090445312,1090453503,CA
@@ -19260,9 +20896,7 @@
1091808000,1091808255,CA
1091808256,1091809535,US
1091809536,1091809791,CA
-1091809792,1091812351,US
-1091812352,1091812607,CN
-1091812608,1091960831,US
+1091809792,1091960831,US
1091960832,1092026367,CA
1092026368,1092075519,US
1092075520,1092091903,PR
@@ -19270,9 +20904,7 @@
1093017600,1093021695,CA
1093021696,1093025791,US
1093025792,1093033983,CA
-1093033984,1093055487,US
-1093055488,1093055743,AR
-1093055744,1093058559,US
+1093033984,1093058559,US
1093058560,1093066751,PR
1093066752,1093074943,US
1093074944,1093091327,CA
@@ -19286,22 +20918,18 @@
1093109760,1093109871,US
1093109872,1093109879,CA
1093109880,1093110015,US
-1093110016,1093110271,CA
-1093110272,1093110527,US
-1093110528,1093110783,CA
+1093110016,1093110783,CA
1093110784,1093110927,US
1093110928,1093110935,CA
1093110936,1093111039,US
1093111040,1093111551,CA
1093111552,1093111727,US
1093111728,1093111743,CA
-1093111744,1093111903,US
-1093111904,1093111935,CA
+1093111744,1093111871,US
+1093111872,1093111935,CA
1093111936,1093112063,US
1093112064,1093112319,CA
-1093112320,1093113855,US
-1093113856,1093114111,CA
-1093114112,1093114843,US
+1093112320,1093114843,US
1093114844,1093114847,CA
1093114848,1093114879,US
1093114880,1093115647,CA
@@ -19318,7 +20946,9 @@
1093120416,1093120431,CA
1093120432,1093120511,US
1093120512,1093120767,GB
-1093120768,1093121535,US
+1093120768,1093120991,US
+1093120992,1093121023,CA
+1093121024,1093121535,US
1093121536,1093122047,CA
1093122048,1093122175,US
1093122176,1093122303,CA
@@ -19328,7 +20958,9 @@
1093122816,1093123839,CA
1093123840,1093123951,US
1093123952,1093123967,CA
-1093123968,1093126143,US
+1093123968,1093125119,US
+1093125120,1093125375,CA
+1093125376,1093126143,US
1093126144,1093126399,CA
1093126400,1093128447,US
1093128448,1093128703,CA
@@ -19346,8 +20978,8 @@
1093135872,1093136639,CA
1093136640,1093136895,US
1093136896,1093137151,CA
-1093137152,1093137407,US
-1093137408,1093137791,CA
+1093137152,1093137663,US
+1093137664,1093137791,CA
1093137792,1093137919,US
1093137920,1093138175,CA
1093138176,1093138303,US
@@ -19370,7 +21002,9 @@
1093723648,1093724415,BB
1093724416,1093725183,VC
1093725184,1093730303,BB
-1093730304,1093734053,US
+1093730304,1093732537,US
+1093732538,1093732538,CA
+1093732539,1093734053,US
1093734054,1093734054,PH
1093734055,1093943295,US
1093943296,1093947391,IE
@@ -19476,8 +21110,8 @@
1097785344,1097830399,US
1097830400,1097834495,CA
1097834496,1097896191,US
-1097896192,1097897471,VI
-1097897472,1097947135,US
+1097896192,1097897215,VI
+1097897216,1097947135,US
1097947136,1097949183,VI
1097949184,1097951231,US
1097951232,1097953279,VI
@@ -19497,27 +21131,19 @@
1100505128,1100505135,CA
1100505136,1100560647,US
1100560648,1100560655,TR
-1100560656,1101121535,US
-1101121536,1101121791,EC
-1101121792,1101182975,US
+1100560656,1101182975,US
1101182976,1101183487,YE
-1101183488,1101190655,US
-1101190656,1101191167,EC
-1101191168,1101263103,US
+1101183488,1101263103,US
1101263104,1101263359,CW
1101263360,1101267711,US
1101267712,1101267967,CA
-1101267968,1101304063,US
-1101304064,1101304319,EC
-1101304320,1101304831,US
+1101267968,1101304831,US
1101304832,1101305855,HN
1101305856,1101352959,US
1101352960,1101355007,HN
1101355008,1101402031,US
1101402032,1101402047,PR
-1101402048,1101425919,US
-1101425920,1101426175,EC
-1101426176,1101459455,US
+1101402048,1101459455,US
1101459456,1101461503,BB
1101461504,1101475839,US
1101475840,1101479935,CO
@@ -19525,17 +21151,11 @@
1101484032,1101488127,CO
1101488128,1101542399,US
1101542400,1101542911,CO
-1101542912,1101574655,US
-1101574656,1101575167,EC
-1101575168,1101635327,US
+1101542912,1101635327,US
1101635328,1101635583,HN
1101635584,1101650431,US
1101650432,1101650943,HN
-1101650944,1101668095,US
-1101668096,1101668351,EC
-1101668352,1101676543,US
-1101676544,1101678591,EC
-1101678592,1101681407,US
+1101650944,1101681407,US
1101681408,1101681663,NL
1101681664,1101750783,US
1101750784,1101751295,BM
@@ -19545,9 +21165,7 @@
1101797376,1101798399,BB
1101798400,1101803519,US
1101803520,1101804543,HN
-1101804544,1101837311,US
-1101837312,1101837567,EC
-1101837568,1101871103,US
+1101804544,1101871103,US
1101871104,1101873151,BO
1101873152,1101992063,US
1101992064,1101992191,NL
@@ -19557,11 +21175,7 @@
1102005504,1102005759,PK
1102005760,1102006271,US
1102006272,1102006527,CA
-1102006528,1102007295,US
-1102007296,1102007551,PK
-1102007552,1102010623,US
-1102010624,1102010879,PK
-1102010880,1102389247,US
+1102006528,1102389247,US
1102389248,1102393343,CA
1102393344,1102446591,US
1102446592,1102448383,HN
@@ -19606,9 +21220,10 @@
1106767872,1106768383,CO
1106768384,1106768895,EC
1106768896,1106769919,CO
-1106769920,1107239935,US
-1107239936,1107240959,CN
-1107240960,1107243007,US
+1106769920,1107240191,US
+1107240192,1107240959,CN
+1107240960,1107242495,US
+1107242496,1107243007,DE
1107243008,1107247103,TC
1107247104,1107275775,US
1107275776,1107279871,CA
@@ -19650,25 +21265,50 @@
1109688320,1109696511,CA
1109696512,1109705727,US
1109705728,1109705983,CG
-1109705984,1109707007,US
-1109707008,1109707263,JM
-1109707264,1109707519,US
+1109705984,1109707519,US
1109707520,1109707775,MW
-1109707776,1109709823,US
-1109709824,1109710847,ZM
-1109710848,1109819391,US
+1109707776,1109819391,US
1109819392,1109848831,CA
1109848832,1109849087,US
1109849088,1109852159,CA
1109852160,1109918463,US
1109918464,1109918719,GB
-1109918720,1109919743,US
+1109918720,1109919487,CA
+1109919488,1109919743,US
1109919744,1109919999,GB
-1109920000,1109927167,US
+1109920000,1109920255,US
+1109920256,1109920767,CA
+1109920768,1109921023,US
+1109921024,1109921279,CA
+1109921280,1109921791,US
+1109921792,1109926143,CA
+1109926144,1109926655,US
+1109926656,1109927167,CA
1109927168,1109927423,AU
-1109927424,1109934591,US
+1109927424,1109927679,CA
+1109927680,1109928959,US
+1109928960,1109929983,CA
+1109929984,1109930751,US
+1109930752,1109931007,CA
+1109931008,1109931263,US
+1109931264,1109931775,CA
+1109931776,1109932287,US
+1109932288,1109932543,CA
+1109932544,1109932799,US
+1109932800,1109934591,CA
1109934592,1109934847,GB
-1109934848,1110126591,US
+1109934848,1109936127,CA
+1109936128,1109936383,US
+1109936384,1109936639,CA
+1109936640,1109937151,US
+1109937152,1109937663,CA
+1109937664,1109950463,US
+1109950464,1109969407,CA
+1109969408,1109970431,US
+1109970432,1109970687,CA
+1109970688,1109979135,US
+1109979136,1109983231,CA
+1109983232,1110126591,US
1110126592,1110130687,CA
1110130688,1110248623,US
1110248624,1110248631,CA
@@ -19750,8 +21390,8 @@
1111244800,1111916543,US
1111916544,1111922687,CA
1111922688,1111924735,US
-1111924736,1111928831,CA
-1111928832,1111929855,US
+1111924736,1111929087,CA
+1111929088,1111929855,US
1111929856,1111931135,CA
1111931136,1111931391,US
1111931392,1111931903,CA
@@ -19759,11 +21399,13 @@
1111932928,1111938047,CA
1111938048,1111941119,US
1111941120,1111943167,CA
-1111943168,1111982079,US
+1111943168,1111943584,US
+1111943585,1111943585,CA
+1111943586,1111945215,US
+1111945216,1111947263,CA
+1111947264,1111982079,US
1111982080,1111998463,IT
-1111998464,1112408063,US
-1112408064,1112410111,IL
-1112410112,1112412671,US
+1111998464,1112412671,US
1112412672,1112413183,NL
1112413184,1112413695,CH
1112413696,1112414207,CA
@@ -19815,7 +21457,9 @@
1113677824,1113681919,US
1113686016,1113697279,US
1113697280,1113697791,BM
-1113697792,1113718783,US
+1113697792,1113699327,US
+1113699328,1113700351,CA
+1113700352,1113718783,US
1113718784,1113743359,DO
1113743360,1113854207,US
1113854208,1113854463,CA
@@ -19840,15 +21484,7 @@
1114509568,1114509571,MX
1114509572,1114511871,US
1114511872,1114512127,CA
-1114512128,1114513407,US
-1114513408,1114513471,SA
-1114513472,1114513571,US
-1114513572,1114513599,SA
-1114513600,1114514719,US
-1114514720,1114514751,SA
-1114514752,1114514943,US
-1114514944,1114515455,SA
-1114515456,1114515463,US
+1114512128,1114515463,US
1114515464,1114515471,CA
1114515472,1114517503,US
1114517504,1114518015,CA
@@ -19862,12 +21498,15 @@
1114524000,1114524007,BM
1114524008,1114524031,US
1114524032,1114524415,JM
-1114524416,1114524671,ZA
-1114524672,1114533375,US
+1114524416,1114533375,US
1114533376,1114533887,ZA
1114533888,1114537983,AO
1114537984,1114550271,CA
-1114550272,1114657927,US
+1114550272,1114588671,US
+1114588672,1114589695,CA
+1114589696,1114590975,US
+1114590976,1114595327,CA
+1114595328,1114657927,US
1114657928,1114657935,LA
1114657936,1114681343,US
1114681344,1114685439,CA
@@ -19916,9 +21555,19 @@
1115795456,1115799551,CA
1115799552,1115815935,US
1115815936,1115947007,CA
-1115947008,1116024063,US
+1115947008,1115979775,US
+1115979776,1116012543,CA
+1116012544,1116014079,US
+1116014080,1116014335,DE
+1116014336,1116014591,US
+1116014592,1116014847,DE
+1116014848,1116015871,US
+1116015872,1116016127,DE
+1116016128,1116024063,US
1116024064,1116024319,PG
-1116024320,1116031743,US
+1116024320,1116027135,US
+1116027136,1116027903,DE
+1116027904,1116031743,US
1116031744,1116031999,GB
1116032000,1116032255,US
1116032256,1116032511,NL
@@ -19931,23 +21580,43 @@
1116198576,1116198576,DE
1116198577,1116897279,US
1116897280,1116905471,CA
-1116905472,1117137919,US
+1116905472,1116997119,US
+1116997120,1116999423,CA
+1116999424,1117000703,US
+1117000704,1117002751,CA
+1117002752,1117004031,US
+1117004032,1117005823,CA
+1117005824,1117006847,US
+1117006848,1117007871,CA
+1117007872,1117009919,US
+1117009920,1117010943,CA
+1117010944,1117011455,US
+1117011456,1117011711,CA
+1117011712,1117137919,US
1117137920,1117138175,CA
1117138176,1117142271,US
1117142272,1117142527,CA
1117142528,1117274111,US
1117274112,1117282303,CA
-1117282304,1117458911,US
+1117282304,1117454335,US
+1117454336,1117454591,CA
+1117454592,1117454847,US
+1117454848,1117455619,CA
+1117455620,1117455620,DE
+1117455621,1117456383,CA
+1117456384,1117457151,US
+1117457152,1117458911,CA
1117458912,1117458943,GB
-1117458944,1117460223,US
+1117458944,1117460223,CA
1117460224,1117460351,GB
-1117460352,1117460991,US
+1117460352,1117460991,CA
1117460992,1117461247,GB
-1117461248,1117470719,US
-1117470720,1117471231,CA
-1117471232,1117480191,US
-1117480192,1117480255,CA
-1117480256,1117683711,US
+1117461248,1117469183,CA
+1117469184,1117469439,US
+1117469440,1117481471,CA
+1117481472,1117481983,US
+1117481984,1117487103,CA
+1117487104,1117683711,US
1117683712,1117691903,CA
1117691904,1117724671,US
1117724672,1117728767,CA
@@ -19975,9 +21644,7 @@
1118132992,1118133247,CA
1118133248,1118135807,US
1118135808,1118136063,CA
-1118136064,1118138879,US
-1118138880,1118139135,CA
-1118139136,1118139903,US
+1118136064,1118139903,US
1118139904,1118140415,CA
1118140416,1118141183,US
1118141184,1118141439,CA
@@ -19999,9 +21666,7 @@
1118543872,1118547967,CA
1118547968,1118790655,US
1118790656,1118790911,IL
-1118790912,1118792431,US
-1118792432,1118792447,AR
-1118792448,1118962943,US
+1118790912,1118962943,US
1118962944,1118963199,AS
1118963200,1118965247,US
1118965248,1118965503,AS
@@ -20022,9 +21687,7 @@
1118975488,1118975743,KE
1118975744,1118975999,US
1118976000,1118976255,GB
-1118976256,1118980607,US
-1118980608,1118980863,TZ
-1118980864,1118983423,US
+1118976256,1118983423,US
1118983424,1118983679,NI
1118983680,1118984447,US
1118984448,1118984703,SA
@@ -20040,11 +21703,7 @@
1118994176,1118994431,LR
1118994432,1119072255,US
1119072256,1119073279,CA
-1119073280,1119109119,US
-1119109120,1119109375,CA
-1119109376,1119109631,US
-1119109632,1119109887,CA
-1119109888,1119110143,US
+1119073280,1119110143,US
1119110144,1119111167,CA
1119111168,1119199231,US
1119199232,1119207169,MN
@@ -20055,9 +21714,7 @@
1119215616,1119289343,US
1119289344,1119354879,CA
1119354880,1119428607,US
-1119428608,1119431663,VI
-1119431664,1119432191,US
-1119432192,1119432703,VI
+1119428608,1119432703,VI
1119432704,1119436799,CA
1119436800,1119440895,US
1119440896,1119444991,CA
@@ -20069,9 +21726,7 @@
1119502336,1119510527,CA
1119510528,1119558143,US
1119558144,1119558655,PR
-1119558656,1119570559,US
-1119570560,1119570687,GB
-1119570688,1119571967,US
+1119558656,1119571967,US
1119571968,1119576063,CA
1119576064,1119580159,US
1119580160,1119584255,CA
@@ -20079,7 +21734,7 @@
1119611904,1119612159,BR
1119612160,1119612415,US
1119612416,1119612927,AU
-1119617024,1120149503,US
+1119612928,1120149503,US
1120149504,1120153599,CA
1120153600,1120157695,US
1120157696,1120159743,GB
@@ -20115,7 +21770,9 @@
1120371568,1120371583,CA
1120371584,1120372223,US
1120372224,1120372479,CA
-1120372480,1120372991,US
+1120372480,1120372839,US
+1120372840,1120372847,CA
+1120372848,1120372991,US
1120372992,1120373247,CA
1120373248,1120373503,US
1120373504,1120374015,CA
@@ -20151,8 +21808,8 @@
1120380672,1120380991,CA
1120380992,1120381087,US
1120381088,1120381095,CA
-1120381096,1120381183,US
-1120381184,1120382207,CA
+1120381096,1120381439,US
+1120381440,1120382207,CA
1120382208,1120382439,US
1120382440,1120382447,CA
1120382448,1120382463,US
@@ -20171,11 +21828,7 @@
1120491520,1120491775,CA
1120491776,1120492543,US
1120492544,1120493055,CA
-1120493056,1120493823,US
-1120493824,1120494079,CA
-1120494080,1120494335,US
-1120494336,1120494591,CA
-1120494592,1120497407,US
+1120493056,1120497407,US
1120497408,1120497663,CA
1120497664,1120498943,US
1120498944,1120499199,CA
@@ -20224,11 +21877,23 @@
1121250816,1121252863,CA
1121252864,1121253119,BZ
1121253120,1121255423,CA
-1121255424,1121763327,US
+1121255424,1121716991,US
+1121716992,1121717247,JP
+1121717248,1121763327,US
1121763328,1121767423,CA
1121767424,1121878015,US
1121878016,1121910783,CA
-1121910784,1122074623,US
+1121910784,1121912831,US
+1121912832,1121918975,CA
+1121918976,1121919999,US
+1121920000,1121927167,CA
+1121927168,1121929983,US
+1121929984,1121936127,CA
+1121936128,1121936383,US
+1121936384,1121937407,CA
+1121937408,1121938943,US
+1121938944,1121942527,CA
+1121942528,1122074623,US
1122074624,1122091007,CA
1122091008,1122092799,US
1122092800,1122093055,CA
@@ -20281,19 +21946,27 @@
1123589888,1123590143,US
1123590144,1123598335,VI
1123598336,1123598591,CA
-1123598592,1123635455,US
+1123598592,1123635626,US
1123635627,1123635627,PL
+1123635628,1123635639,US
1123635640,1123635640,RU
+1123635641,1123635660,US
1123635661,1123635661,RU
+1123635662,1123635670,US
1123635671,1123635671,RU
+1123635672,1123635865,US
1123635866,1123635866,IN
+1123635867,1123635887,US
1123635888,1123635888,AU
+1123635889,1123635909,US
1123635910,1123635910,TW
-1123635968,1123638527,US
+1123635911,1123638539,US
1123638540,1123638540,PK
+1123638541,1123638614,US
1123638615,1123638615,RE
+1123638616,1123638730,US
1123638731,1123638731,RE
-1123638784,1123651583,US
+1123638732,1123651583,US
1123651584,1123651839,JM
1123651840,1123652095,BB
1123652096,1123653119,JM
@@ -20360,8 +22033,7 @@
1125575424,1125576703,CA
1125576704,1126924287,US
1126924288,1126928383,CA
-1126928384,1126931455,US
-1126931712,1126948863,US
+1126928384,1126948863,US
1126948864,1126952959,CA
1126952960,1127677951,US
1127677952,1127694335,CA
@@ -20406,9 +22078,7 @@
1137287168,1137295359,CA
1137295360,1137369087,US
1137369088,1137371135,CA
-1137371136,1137378815,US
-1137378816,1137379071,UA
-1137379072,1137426431,US
+1137371136,1137426431,US
1137426432,1137442815,PR
1137442816,1137491967,US
1137491968,1137508351,CA
@@ -20418,8 +22088,8 @@
1137623040,1137639423,PR
1137639424,1137656831,US
1137656832,1137657855,GB
-1137657856,1137658879,DE
-1137658880,1137681583,US
+1137657856,1137659903,DE
+1137659904,1137681583,US
1137681584,1137681599,AR
1137681600,1137704959,US
1137704960,1137712383,CA
@@ -20430,9 +22100,7 @@
1137840128,1137840383,CA
1137840384,1137840895,US
1137840896,1137841151,DE
-1137841152,1137842175,US
-1137842176,1137842431,BR
-1137842432,1137868799,US
+1137841152,1137868799,US
1137868800,1137872895,CA
1137872896,1137876991,US
1137876992,1137881087,CA
@@ -20455,13 +22123,9 @@
1138061312,1138069503,US
1138069504,1138073599,JM
1138073600,1138163711,US
-1138163712,1138166919,CA
-1138166920,1138166927,SA
-1138166928,1138166935,CA
+1138163712,1138166935,CA
1138166936,1138166943,SA
-1138166944,1138166991,CA
-1138166992,1138166999,SA
-1138167000,1138167807,CA
+1138166944,1138167807,CA
1138167808,1138175999,US
1138176000,1138180095,CA
1138180096,1138184191,US
@@ -20475,11 +22139,13 @@
1138185728,1138185983,ZA
1138185984,1138188287,US
1138188288,1138192383,PR
-1138192384,1138196479,US
+1138192384,1138196479,NZ
1138196480,1138204671,CA
1138204672,1138212863,US
1138212864,1138216959,CA
-1138216960,1138372607,US
+1138216960,1138237439,US
+1138237440,1138245631,CA
+1138245632,1138372607,US
1138372608,1138373631,AS
1138373632,1138373887,US
1138373888,1138374143,AS
@@ -20487,7 +22153,9 @@
1138374400,1138374911,AS
1138374912,1138375423,US
1138375424,1138375679,AS
-1138375680,1138417407,US
+1138375680,1138415871,US
+1138415872,1138416127,CA
+1138416128,1138417407,US
1138417408,1138417663,CA
1138417664,1138419711,US
1138419712,1138419967,DE
@@ -20511,7 +22179,13 @@
1138555136,1138555391,NL
1138555392,1138556159,US
1138556160,1138556671,NL
-1138556672,1138593791,US
+1138556672,1138569215,US
+1138569216,1138571263,CA
+1138571264,1138571775,US
+1138571776,1138572031,CA
+1138572032,1138572287,US
+1138572288,1138573311,CA
+1138573312,1138593791,US
1138593792,1138597887,CA
1138597888,1138704383,US
1138704384,1138716671,CA
@@ -20528,17 +22202,24 @@
1138819072,1138851839,CA
1138851840,1138917375,US
1138917376,1138937855,CA
-1138937856,1138941951,US
+1138937856,1138940415,US
+1138940416,1138940671,CA
+1138940672,1138941951,US
1138941952,1138950143,CA
1138950144,1138956799,US
1138956800,1138957311,CA
-1138957312,1138970111,US
+1138957312,1138957823,US
+1138957824,1138958079,NL
+1138958080,1138958335,CA
+1138958336,1138970111,US
1138970112,1138970367,IN
1138970368,1139146751,US
1139146752,1139154943,GT
1139154944,1139167231,JM
1139167232,1139167743,US
-1139167744,1139168767,PR
+1139167744,1139168255,PR
+1139168256,1139168639,US
+1139168640,1139168767,PR
1139168768,1139169279,US
1139169280,1139169791,PR
1139169792,1139170303,US
@@ -20561,8 +22242,7 @@
1145188352,1145192447,CA
1145192448,1145242111,US
1145242112,1145242367,NO
-1145242368,1145243135,US
-1145243392,1145243647,US
+1145242368,1145244159,US
1145244160,1145244415,NO
1145244416,1145249791,US
1145249792,1145257983,CA
@@ -20624,9 +22304,55 @@
1157755248,1157755263,GR
1157755264,1157758207,US
1157758208,1157758463,RU
-1157758464,1157914194,US
+1157758464,1157910527,US
+1157910528,1157910575,CA
+1157910576,1157910591,US
+1157910592,1157910639,CA
+1157910640,1157910655,US
+1157910656,1157910831,CA
+1157910832,1157910847,US
+1157910848,1157910863,CA
+1157910864,1157910879,US
+1157910880,1157911071,CA
+1157911072,1157911103,US
+1157911104,1157911775,CA
+1157911776,1157911791,US
+1157911792,1157911951,CA
+1157911952,1157911983,US
+1157911984,1157912015,CA
+1157912016,1157912031,US
+1157912032,1157912447,CA
+1157912448,1157912463,US
+1157912464,1157912655,CA
+1157912656,1157912671,US
+1157912672,1157912703,CA
+1157912704,1157912735,US
+1157912736,1157912895,CA
+1157912896,1157912911,US
+1157912912,1157913087,CA
+1157913088,1157913119,US
+1157913120,1157913279,CA
+1157913280,1157913295,US
+1157913296,1157913471,CA
+1157913472,1157913487,US
+1157913488,1157913583,CA
+1157913584,1157913599,US
+1157913600,1157913663,CA
+1157913664,1157913679,US
+1157913680,1157914031,CA
+1157914032,1157914047,US
+1157914048,1157914143,CA
+1157914144,1157914175,US
+1157914176,1157914194,CA
1157914195,1157914202,IN
-1157914203,1157931007,US
+1157914203,1157914207,CA
+1157914208,1157914223,US
+1157914224,1157914239,CA
+1157914240,1157914255,US
+1157914256,1157914351,CA
+1157914352,1157914367,US
+1157914368,1157914623,CA
+1157914624,1157931007,US
1157931008,1157935103,BS
1157935104,1157943295,US
1157943296,1157947391,CA
@@ -20645,8 +22371,7 @@
1158250496,1158295807,US
1158295808,1158296063,GB
1158296064,1158316031,US
-1158316032,1158318847,CA
-1158319104,1158322242,CA
+1158316032,1158322242,CA
1158322243,1158322243,US
1158322244,1158324223,CA
1158324224,1158340607,US
@@ -20690,7 +22415,9 @@
1159348224,1159356415,CA
1159356416,1159421951,US
1159421952,1159430143,CA
-1159430144,1159480063,US
+1159430144,1159477247,US
+1159477248,1159477503,HK
+1159477504,1159480063,US
1159480064,1159480319,CA
1159480320,1159483903,US
1159483904,1159484415,CA
@@ -20809,13 +22536,44 @@
1161426944,1161427967,AI
1161427968,1161428223,AG
1161428224,1161428991,KN
-1161428992,1161429711,US
+1161428992,1161429119,CA
+1161429120,1161429135,US
+1161429136,1161429183,CA
+1161429184,1161429199,US
+1161429200,1161429215,CA
+1161429216,1161429247,US
+1161429248,1161429375,CA
+1161429376,1161429407,US
+1161429408,1161429551,CA
+1161429552,1161429583,US
+1161429584,1161429647,CA
+1161429648,1161429663,US
+1161429664,1161429695,CA
+1161429696,1161429711,US
1161429712,1161429719,FI
-1161429720,1161430079,US
-1161430080,1161430111,BG
-1161430112,1161432063,US
-1161432064,1161432126,CA
-1161432127,1161433087,US
+1161429720,1161429727,US
+1161429728,1161429759,CA
+1161429760,1161429775,US
+1161429776,1161430111,CA
+1161430112,1161430159,US
+1161430160,1161430191,CA
+1161430192,1161430207,US
+1161430208,1161430431,CA
+1161430432,1161430447,US
+1161430448,1161430527,CA
+1161430528,1161430543,US
+1161430544,1161430575,CA
+1161430576,1161430591,US
+1161430592,1161430799,CA
+1161430800,1161430815,US
+1161430816,1161430879,CA
+1161430880,1161430911,US
+1161430912,1161430943,CA
+1161430944,1161430975,US
+1161430976,1161431295,CA
+1161431296,1161432063,US
+1161432064,1161432831,CA
+1161432832,1161433087,US
1161433088,1161437183,CA
1161437184,1161453567,US
1161453568,1161457663,CA
@@ -20840,13 +22598,7 @@
1161830853,1161830853,BZ
1161830854,1161831181,US
1161831182,1161831182,BZ
-1161831183,1161833967,US
-1161833968,1161833975,DE
-1161833976,1161834979,US
-1161834980,1161834980,BZ
-1161834981,1161835058,US
-1161835059,1161835059,BZ
-1161835060,1161835109,US
+1161831183,1161835109,US
1161835110,1161835110,BZ
1161835111,1161835226,US
1161835227,1161835227,BZ
@@ -20856,9 +22608,17 @@
1161835949,1161835949,BZ
1161835950,1161837567,US
1161837568,1161837823,JP
-1161837824,1161885695,US
+1161837824,1161884927,US
+1161884928,1161884959,DE
+1161884960,1161885183,US
+1161885184,1161885199,JP
+1161885200,1161885215,US
+1161885216,1161885255,JP
+1161885256,1161885695,US
1161885696,1161886207,JP
-1161886208,1161887231,US
+1161886208,1161887023,US
+1161887024,1161887055,NO
+1161887056,1161887231,US
1161887232,1161887743,AU
1161887744,1161925631,US
1161925632,1161925887,EC
@@ -20943,113 +22703,95 @@
1163526144,1163529215,CA
1163529216,1163529727,US
1163529728,1163529983,CA
-1163529984,1163530655,US
-1163530656,1163530663,CA
-1163530664,1163530991,US
-1163530992,1163532799,CA
-1163532800,1163533055,US
-1163533056,1163533311,CA
-1163533312,1163533807,US
-1163533808,1163533823,CA
-1163533824,1163534255,US
-1163534256,1163534271,CA
-1163534272,1163536127,US
-1163536128,1163536383,CA
-1163536384,1163537663,US
-1163537664,1163538431,CA
-1163538432,1163538463,US
-1163538464,1163538479,CA
-1163538480,1163538575,US
-1163538576,1163538591,CA
-1163538592,1163539199,US
-1163539200,1163539455,CA
-1163539456,1163539711,US
-1163539712,1163539967,CA
-1163539968,1163540351,US
-1163540352,1163540479,CA
-1163540480,1163540735,US
-1163540736,1163542527,CA
-1163542528,1163543295,US
-1163543296,1163543551,CA
-1163543552,1163544575,US
-1163544576,1163545599,CA
-1163545600,1163546015,US
-1163546016,1163546031,CA
-1163546032,1163546623,US
-1163546624,1163550719,CA
-1163550720,1163550815,US
-1163550816,1163550831,CA
-1163550832,1163550847,US
-1163550848,1163550975,CA
-1163550976,1163551295,US
-1163551296,1163551311,CA
-1163551312,1163551455,US
-1163551456,1163551487,CA
-1163551488,1163551631,US
-1163551632,1163551647,CA
-1163551648,1163551743,US
-1163551744,1163552255,CA
-1163552256,1163552519,US
-1163552520,1163552527,CA
-1163552528,1163552543,US
-1163552544,1163552559,CA
-1163552560,1163552607,US
-1163552608,1163552623,CA
-1163552624,1163552767,US
-1163552768,1163553791,CA
-1163553792,1163554047,US
-1163554048,1163554559,CA
-1163554560,1163554815,US
-1163554816,1163555839,CA
+1163529984,1163530239,US
+1163530240,1163534335,CA
+1163534336,1163534591,US
+1163534592,1163555839,CA
1163555840,1163556095,US
-1163556096,1163556607,CA
-1163556608,1163561215,US
+1163556096,1163556863,CA
+1163556864,1163557119,US
+1163557120,1163558911,CA
+1163558912,1163561215,US
1163561216,1163561471,CA
-1163561472,1163564031,US
-1163564032,1163565311,CA
-1163565312,1163567103,US
-1163567104,1163568127,CA
-1163568128,1163571199,US
-1163571200,1163573247,CA
-1163573248,1163573439,US
+1163561472,1163563007,US
+1163563008,1163563999,CA
+1163564000,1163564031,US
+1163564032,1163565567,CA
+1163565568,1163565823,US
+1163565824,1163566335,CA
+1163566336,1163567103,US
+1163567104,1163569407,CA
+1163569408,1163569919,US
+1163569920,1163570943,CA
+1163570944,1163571199,US
+1163571200,1163573343,CA
+1163573344,1163573375,US
+1163573376,1163573439,CA
1163573440,1163573503,IN
-1163573504,1163575039,US
+1163573504,1163573775,CA
+1163573776,1163573791,US
+1163573792,1163574015,CA
+1163574016,1163574031,US
+1163574032,1163574143,CA
+1163574144,1163574159,US
+1163574160,1163574207,CA
+1163574208,1163574356,US
+1163574357,1163574359,CA
+1163574360,1163574527,US
+1163574528,1163574879,CA
+1163574880,1163574895,US
+1163574896,1163575007,CA
+1163575008,1163575039,US
1163575040,1163575295,IN
-1163575296,1163575807,CA
-1163575808,1163576063,US
-1163576064,1163577343,CA
-1163577344,1163579519,US
+1163575296,1163577599,CA
+1163577600,1163577855,US
+1163577856,1163579391,CA
+1163579392,1163579455,US
+1163579456,1163579463,CA
+1163579464,1163579471,US
+1163579472,1163579487,CA
+1163579488,1163579519,US
1163579520,1163579647,CA
-1163579648,1163579871,US
-1163579872,1163579903,CA
-1163579904,1163580927,US
-1163580928,1163581183,CA
-1163581184,1163581695,US
-1163581696,1163581951,CA
-1163581952,1163582003,US
-1163582004,1163582007,CA
-1163582008,1163582031,US
-1163582032,1163582039,CA
-1163582040,1163582079,US
-1163582080,1163582111,CA
-1163582112,1163582199,US
-1163582200,1163582207,CA
-1163582208,1163582463,US
-1163582464,1163583487,CA
-1163583488,1163587583,US
-1163587584,1163587839,CA
-1163587840,1163588351,US
-1163588352,1163588607,CA
-1163588608,1163588863,US
-1163588864,1163589631,CA
-1163589632,1167851519,US
+1163579648,1163579663,US
+1163579664,1163579683,CA
+1163579684,1163579710,US
+1163579711,1163579727,CA
+1163579728,1163579735,US
+1163579736,1163579807,CA
+1163579808,1163579839,US
+1163579840,1163580415,CA
+1163580416,1163580543,US
+1163580544,1163580819,CA
+1163580820,1163580830,US
+1163580831,1163581375,CA
+1163581376,1163581399,US
+1163581400,1163581407,CA
+1163581408,1163581423,US
+1163581424,1163583487,CA
+1163583488,1163584255,US
+1163584256,1163584511,CA
+1163584512,1163584767,US
+1163584768,1163586303,CA
+1163586304,1163586559,US
+1163586560,1163587327,CA
+1163587328,1163587583,US
+1163587584,1163589631,CA
+1163589632,1163590655,US
+1163590656,1163590751,CA
+1163590752,1163590783,US
+1163590784,1163591679,CA
+1163591680,1167851519,US
1167851520,1168113663,CA
1168113664,1168121855,MM
1168121856,1168138239,US
1168138240,1168146431,JM
1168146432,1168211967,US
1168211968,1168220159,CA
-1168220160,1168279295,US
+1168220160,1168228863,US
+1168228864,1168229119,AU
+1168229120,1168229375,HK
+1168229376,1168229631,JP
+1168229632,1168279295,US
1168279296,1168279359,CA
1168279360,1168321535,US
1168321536,1168321791,CA
@@ -21138,7 +22880,10 @@
1170212352,1170212607,NL
1170212608,1170227199,US
1170227200,1170231295,NL
-1170231296,1170358271,US
+1170231296,1170350079,US
+1170350080,1170355199,CA
+1170355200,1170357247,US
+1170357248,1170358271,CA
1170358272,1170374655,AE
1170374656,1170461135,US
1170461136,1170461151,SV
@@ -21238,8 +22983,7 @@
1177550848,1178075135,CA
1178075136,1178599423,US
1178599424,1179910143,CA
-1179910144,1189672191,US
-1189672448,1191673855,US
+1179910144,1191673855,US
1191673856,1191706623,CA
1191706624,1192232127,US
1192232128,1192232159,PA
@@ -21275,8 +23019,7 @@
1208852480,1208860671,CA
1208860672,1208918015,US
1208918016,1208922111,CA
-1208922112,1208926463,US
-1208926720,1208935935,US
+1208922112,1208935935,US
1208935936,1208935943,AU
1208935944,1208935951,IN
1208935952,1208935959,SG
@@ -21335,14 +23078,9 @@
1209824448,1209824511,GB
1209824512,1209862143,US
1209862144,1209862399,CA
-1209862400,1209863167,US
-1209863168,1209863423,CA
+1209862400,1209863423,US
1209863424,1209863679,IN
-1209863680,1209863935,US
-1209863936,1209864191,CA
-1209864192,1209867263,US
-1209867264,1209867519,CA
-1209867520,1209884679,US
+1209863680,1209884679,US
1209884680,1209884687,ES
1209884688,1209917439,US
1209917440,1209925631,CA
@@ -21447,9 +23185,7 @@
1219290624,1219290751,AU
1219290752,1219295295,US
1219295296,1219295359,GR
-1219295360,1224091903,US
-1224091904,1224092159,NL
-1224092160,1224094463,US
+1219295360,1224094463,US
1224094464,1224094719,NL
1224094720,1224118271,US
1224118272,1224119807,NL
@@ -21463,12 +23199,8 @@
1224167936,1224169471,NL
1224169472,1224169983,US
1224169984,1224171519,NL
-1224171520,1224173055,US
-1224173056,1224173567,NL
-1224173568,1224184063,US
-1224184064,1224184319,NL
-1224184320,1224189951,US
-1224189952,1224193023,NL
+1224171520,1224190975,US
+1224190976,1224193023,NL
1224193024,1224193535,US
1224193536,1224193791,NL
1224193792,1224194047,US
@@ -21485,7 +23217,9 @@
1224327168,1224327295,NL
1224327296,1224327935,US
1224327936,1224327943,CA
-1224327944,1224329215,US
+1224327944,1224328063,US
+1224328064,1224328191,NL
+1224328192,1224329215,US
1224329216,1224329471,CA
1224329472,1224331263,US
1224331264,1224333311,PR
@@ -21525,12 +23259,11 @@
1244849152,1244852223,CA
1244852224,1244864511,US
1244864512,1244872703,CA
-1244872704,1245144575,US
-1245144576,1245144831,CH
-1245144832,1245183999,US
+1244872704,1245183999,US
1245184000,1245446143,CA
1245446144,1246890431,US
1246890432,1246890463,CA
+1246890464,1246890464,US
1246890465,1246890495,CA
1246890496,1246902783,US
1246902784,1246903039,NL
@@ -21566,7 +23299,7 @@
1248913408,1248915455,MF
1248915456,1248919551,US
1248919552,1248920575,CA
-1248920576,1248921599,US
+1248920576,1248922623,US
1248922624,1248923647,CA
1248923648,1248924671,US
1248924672,1248925695,CA
@@ -21780,6 +23513,7 @@
1249722112,1249722367,IN
1249722368,1249724671,US
1249724672,1249724694,BE
+1249724695,1249724695,US
1249724696,1249724927,BE
1249724928,1249725183,FI
1249725184,1249726207,US
@@ -21788,8 +23522,7 @@
1249726720,1249726975,IE
1249726976,1249734655,US
1249734656,1249734911,FI
-1249734912,1249736959,US
-1249737472,1249752319,US
+1249734912,1249752319,US
1249752320,1249752575,BE
1249752576,1249754111,US
1249754112,1249754367,IE
@@ -21978,7 +23711,8 @@
1294073856,1294204927,RU
1294204928,1294237695,RO
1294237696,1294270463,IR
-1294270464,1294303231,DE
+1294270464,1294299135,DE
+1294299136,1294303231,IR
1294303232,1294335999,RU
1294336000,1294368767,SI
1294368768,1294401535,LV
@@ -21989,7 +23723,9 @@
1294532608,1294598143,RU
1294598144,1294606335,IT
1294606336,1294610431,IR
-1294610432,1294611455,IT
+1294610432,1294610687,IT
+1294610688,1294610943,IR
+1294610944,1294611455,IT
1294611456,1294611711,IR
1294611712,1294619647,IT
1294619648,1294626815,IR
@@ -22006,8 +23742,8 @@
1294925824,1294958591,DE
1294958592,1294991359,UA
1294991360,1295024639,CZ
-1295024640,1295024895,SK
-1295024896,1295047679,CZ
+1295024640,1295025151,SK
+1295025152,1295047679,CZ
1295047680,1295048191,SK
1295048192,1295056895,CZ
1295056896,1295122431,GR
@@ -22131,11 +23867,15 @@
1296264264,1296264271,GB
1296264272,1296264287,IE
1296264288,1296264303,US
-1296264304,1296267263,IE
+1296264304,1296265175,IE
+1296265176,1296265183,RS
+1296265184,1296267263,IE
1296267264,1296267341,DE
1296267342,1296267342,GB
1296267343,1296268287,DE
-1296268288,1296268799,IE
+1296268288,1296268389,IE
+1296268390,1296268391,GB
+1296268392,1296268799,IE
1296268800,1296269055,FR
1296269056,1296269311,US
1296269312,1296302079,BY
@@ -22149,9 +23889,13 @@
1296467544,1296469687,LU
1296469688,1296469691,BF
1296469692,1296469759,LU
-1296469760,1296482077,FR
+1296469760,1296478207,FR
+1296478208,1296482077,US
1296482078,1296482078,NO
-1296482079,1296498687,FR
+1296482079,1296482303,US
+1296482304,1296483071,GB
+1296483072,1296498175,US
+1296498176,1296498687,FR
1296498688,1296531455,BG
1296531456,1296564223,MT
1296564224,1296566271,GB
@@ -22258,9 +24002,7 @@
1296764928,1296769023,AT
1296769024,1296771071,TR
1296771072,1296773119,LT
-1296773120,1296774143,FR
-1296774145,1296774287,FR
-1296774912,1296779263,FR
+1296775168,1296779263,FR
1296779264,1296781311,CZ
1296781312,1296783359,DK
1296783360,1296785407,LB
@@ -22406,8 +24148,9 @@
1297727488,1297743871,MD
1297743872,1297760255,DE
1297760256,1297776639,LT
-1297776640,1297784831,DE
-1297784832,1297793023,PT
+1297776640,1297791743,DE
+1297791744,1297792767,PT
+1297792768,1297793023,DE
1297793024,1297809407,UA
1297809408,1297825791,PL
1297825792,1297838079,RU
@@ -22422,8 +24165,9 @@
1297868800,1297870847,DE
1297870848,1297872895,FR
1297872896,1297874943,GB
-1297874944,1297879040,CY
-1297879041,1297883135,TR
+1297874944,1297879039,CY
+1297879040,1297880063,TR
+1297880064,1297883135,CY
1297883136,1297891327,PL
1297891328,1297899519,GB
1297899520,1297915903,TR
@@ -22566,12 +24310,13 @@
1306214400,1306222591,LT
1306222592,1306230783,HR
1306230784,1306263551,LT
-1306265600,1306271743,KE
+1306263552,1306271743,KE
1306271744,1306279935,RU
1306279936,1306288127,IT
1306288128,1306296319,AT
1306296320,1306312703,RU
-1306312704,1306316287,UZ
+1306312704,1306315775,UZ
+1306315776,1306316287,RU
1306316288,1306316799,KZ
1306316800,1306317823,RU
1306317824,1306318847,NL
@@ -22718,9 +24463,7 @@
1307684864,1307688959,GB
1307688960,1307693055,LT
1307693056,1307697151,IT
-1307697152,1307697407,NL
-1307697664,1307698687,NL
-1307698944,1307701247,NL
+1307697152,1307701247,NL
1307701248,1307709439,RU
1307709440,1307713535,AL
1307713536,1307717631,IT
@@ -22728,8 +24471,7 @@
1307721728,1307725823,AT
1307725824,1307729919,CZ
1307729920,1307734015,RU
-1307734016,1307734701,NL
-1307734703,1307738111,NL
+1307734016,1307738111,NL
1307738112,1307742207,IT
1307742208,1307746303,HU
1307746304,1307750399,UA
@@ -22811,7 +24553,9 @@
1307926528,1307930623,KZ
1307930624,1307934719,RU
1307934720,1307938815,FR
-1307938816,1307942911,TR
+1307938816,1307941242,CY
+1307941243,1307941243,TR
+1307941244,1307942911,CY
1307942912,1307947007,RU
1307947008,1307951103,CH
1307951104,1307959295,RU
@@ -22856,7 +24600,10 @@
1308088320,1308090367,UA
1308090368,1308092415,SK
1308092416,1308096511,RU
-1308096512,1308098559,RS
+1308096512,1308096767,AL
+1308096768,1308097535,RS
+1308097536,1308098303,AL
+1308098304,1308098559,RS
1308098560,1308360703,NL
1308360704,1308622847,PL
1308622848,1308884991,HR
@@ -22988,7 +24735,6 @@
1311264768,1311266815,RU
1311266816,1311268863,FR
1311268864,1311270911,BE
-1311270912,1311271935,RU
1311271936,1311272447,KZ
1311272448,1311272703,NL
1311272704,1311272959,IE
@@ -23009,8 +24755,7 @@
1311307776,1311309823,IS
1311309824,1311311871,GG
1311311872,1311315967,CZ
-1311315968,1311317247,PL
-1311317504,1311318015,PL
+1311315968,1311318015,PL
1311318016,1311320063,RU
1311320064,1311322111,FR
1311324160,1311326207,LB
@@ -23031,8 +24776,7 @@
1311361024,1311363071,NL
1311363072,1311365119,GB
1311365120,1311367167,DE
-1311367168,1311367935,GB
-1311368192,1311369215,GB
+1311367168,1311369215,GB
1311369216,1311371263,FR
1311371264,1311373311,SE
1311373312,1311375359,FR
@@ -23090,9 +24834,7 @@
1315758080,1315759103,RE
1315759104,1315762175,FR
1315762176,1315766271,BG
-1315766272,1315769087,NL
-1315769344,1315769855,NL
-1315770112,1315770367,NL
+1315766272,1315770367,NL
1315770368,1315774463,UA
1315774464,1315778559,RU
1315778560,1315780607,AZ
@@ -23125,7 +24867,11 @@
1315893248,1315897343,RU
1315897344,1315901439,IR
1315901440,1315905535,UA
-1315905536,1315909631,BA
+1315905536,1315906089,OM
+1315906090,1315906090,BA
+1315906091,1315906228,OM
+1315906229,1315906229,BA
+1315906230,1315909631,OM
1315909632,1315913727,AZ
1315913728,1315917823,DE
1315917824,1315921919,RU
@@ -23518,42 +25264,75 @@
1334345728,1334378495,RU
1334378496,1334379023,FR
1334379024,1334379039,FI
-1334379040,1334379263,FR
+1334379040,1334379071,FR
+1334379072,1334379135,PL
+1334379136,1334379263,FR
1334379264,1334379519,PL
1334379520,1334379971,FR
1334379972,1334379975,DE
1334379976,1334380031,FR
1334380032,1334380287,PL
-1334380288,1334381983,FR
+1334380288,1334381823,FR
+1334381824,1334381839,IT
+1334381840,1334381887,FR
+1334381888,1334381919,IT
+1334381920,1334381983,FR
1334381984,1334382015,FI
1334382016,1334382975,FR
1334382976,1334383103,GB
-1334383104,1334383679,FR
+1334383104,1334383615,FR
+1334383616,1334383679,DE
1334383680,1334383743,ES
-1334383744,1334383935,FR
+1334383744,1334383807,IT
+1334383808,1334383871,NL
+1334383872,1334383935,BE
1334383936,1334383967,IE
1334383968,1334383999,PT
-1334384000,1334384031,FR
+1334384000,1334384031,CZ
1334384032,1334384063,FI
-1334384064,1334384799,FR
+1334384064,1334384095,LT
+1334384096,1334384735,FR
+1334384736,1334384767,BE
+1334384768,1334384799,PL
1334384800,1334384831,ES
-1334384832,1334384991,FR
+1334384832,1334384863,DE
+1334384864,1334384991,FR
1334384992,1334385007,GB
-1334385008,1334385151,FR
+1334385008,1334385023,BE
+1334385024,1334385055,IT
+1334385056,1334385151,FR
1334385152,1334385663,IT
-1334385664,1334389823,FR
+1334385664,1334385695,FR
+1334385696,1334385727,BE
+1334385728,1334386111,FR
+1334386112,1334386143,BE
+1334386144,1334386175,IT
+1334386176,1334389759,FR
+1334389760,1334389791,BE
+1334389792,1334389823,FR
1334389824,1334389887,ES
1334389888,1334390015,FR
1334390016,1334390271,ES
1334390272,1334390399,FR
1334390400,1334390415,FI
-1334390416,1334390463,FR
+1334390416,1334390431,DE
+1334390432,1334390439,LT
+1334390440,1334390463,FR
1334390464,1334390527,IE
1334390528,1334390975,FR
1334390976,1334390991,FI
-1334390992,1334391551,FR
+1334390992,1334391359,FR
+1334391360,1334391423,IT
+1334391424,1334391551,FR
1334391552,1334391615,ES
-1334391616,1334392095,FR
+1334391616,1334391711,FR
+1334391712,1334391727,LT
+1334391728,1334391871,FR
+1334391872,1334391903,DE
+1334391904,1334391935,NL
+1334391936,1334392063,FR
+1334392064,1334392067,CZ
+1334392068,1334392095,FR
1334392096,1334392111,PT
1334392112,1334392223,FR
1334392224,1334392255,ES
@@ -23561,9 +25340,13 @@
1334392320,1334392831,IT
1334392832,1334392847,FR
1334392848,1334392863,FI
-1334392864,1334392895,FR
+1334392864,1334392895,DE
1334392896,1334392959,GB
-1334392960,1334394383,FR
+1334392960,1334392991,NL
+1334392992,1334393007,PL
+1334393008,1334393023,CZ
+1334393024,1334393055,IT
+1334393056,1334394383,FR
1334394384,1334394399,GB
1334394400,1334394879,FR
1334394880,1334409599,IT
@@ -23588,8 +25371,7 @@
1334611968,1334616063,ME
1334616064,1334620159,MD
1334620160,1334624255,DE
-1334624256,1334625535,GB
-1334625792,1334628351,GB
+1334624256,1334628351,GB
1334628352,1334632447,IE
1334632448,1334636543,KZ
1334636544,1334640639,RU
@@ -23609,7 +25391,7 @@
1334682112,1334682367,IE
1334682368,1334682623,FR
1334682624,1334682879,NO
-1334682901,1334682901,DK
+1334682880,1334683135,DK
1334683136,1334683391,CZ
1334683392,1334683647,CH
1334683648,1334683903,GB
@@ -23663,8 +25445,8 @@
1334792192,1334793320,GB
1334793321,1334793321,IR
1334793322,1334793471,GB
-1334793472,1334793727,IR
-1334793728,1334794239,GB
+1334793472,1334793983,IR
+1334793984,1334794239,GB
1334794240,1334796287,ES
1334796288,1334800383,ME
1334800384,1334804479,IT
@@ -23859,7 +25641,9 @@
1343221120,1343221247,DE
1343221248,1343221759,FR
1343221760,1343222399,GB
-1343222400,1343223679,FR
+1343222400,1343222911,FR
+1343222912,1343223039,US
+1343223040,1343223679,FR
1343223680,1343223687,LB
1343223688,1343224255,FR
1343224256,1343224303,US
@@ -23894,7 +25678,7 @@
1346412544,1346416639,RU
1346416640,1346420735,DE
1346420736,1346424831,NO
-1346429184,1346433023,FR
+1346428928,1346433023,FR
1346433024,1346439167,NL
1346439168,1346441215,ES
1346441216,1346445311,RU
@@ -24104,10 +25888,13 @@
1347293317,1347293319,LR
1347293320,1347293328,GA
1347293329,1347293335,NG
+1347293336,1347293351,SE
1347293352,1347293375,NG
+1347293376,1347293391,SE
1347293392,1347293392,CY
1347293393,1347293400,NG
1347293401,1347293407,US
+1347293408,1347293408,SE
1347293409,1347293416,NG
1347293417,1347293424,TZ
1347293425,1347293440,GN
@@ -24179,6 +25966,7 @@
1347293985,1347293991,US
1347293992,1347294000,NG
1347294001,1347294008,TZ
+1347294009,1347294015,SE
1347294016,1347294023,US
1347294024,1347294040,GN
1347294041,1347294048,NG
@@ -24197,6 +25985,7 @@
1347294161,1347294168,GN
1347294169,1347294176,NG
1347294177,1347294184,US
+1347294185,1347294191,SE
1347294192,1347294192,KE
1347294193,1347294207,NG
1347294208,1347294215,SE
@@ -24245,8 +26034,8 @@
1347295009,1347295015,LR
1347295016,1347295032,SE
1347295033,1347295056,NG
-1347295057,1347295063,SE
-1347295064,1347295072,LS
+1347295057,1347295064,SE
+1347295065,1347295072,LS
1347295073,1347295079,AF
1347295080,1347295103,NG
1347295104,1347295104,SE
@@ -24319,7 +26108,6 @@
1347305472,1347309567,AL
1347309568,1347313663,DE
1347313664,1347321855,RU
-1347321856,1347325951,US
1347325952,1347330047,CZ
1347330048,1347338239,DE
1347338240,1347342335,RU
@@ -24330,9 +26118,7 @@
1347362816,1347366911,NL
1347366912,1347371007,IT
1347371008,1347375103,RU
-1347375360,1347375615,GB
-1347375872,1347376767,GB
-1347376776,1347379199,GB
+1347375104,1347379199,GB
1347379200,1347383295,NL
1347383296,1347387391,EE
1347387392,1347391487,GB
@@ -24344,8 +26130,7 @@
1347407872,1347411967,GB
1347411968,1347416063,DE
1347416064,1347420159,RU
-1347420160,1347425791,DK
-1347426048,1347428351,DK
+1347420160,1347428351,DK
1347428352,1347432447,BA
1347432448,1347436543,HR
1347436544,1347440639,SE
@@ -24486,7 +26271,10 @@
1347936256,1347940351,FR
1347940352,1347944447,BA
1347944448,1347944959,ZA
-1347945472,1347946495,NG
+1347945216,1347945471,ZM
+1347945472,1347945983,KE
+1347946240,1347946751,NG
+1347947264,1347947519,ZA
1347947520,1347948543,DZ
1347948544,1347952639,DE
1347952640,1347956735,BE
@@ -24494,44 +26282,7 @@
1347960832,1347964927,DE
1347964928,1347969023,IT
1347969024,1347977215,SE
-1347977216,1347983599,DK
-1347983600,1347983615,BJ
-1347983616,1347983903,DK
-1347983904,1347983911,NG
-1347983912,1347983919,DK
-1347983920,1347983927,NG
-1347983928,1347983983,DK
-1347983984,1347984127,NG
-1347984128,1347984207,DK
-1347984208,1347984215,NG
-1347984216,1347984367,DK
-1347984368,1347984375,CI
-1347984376,1347984415,DK
-1347984416,1347984423,NG
-1347984424,1347984447,DK
-1347984448,1347984575,IQ
-1347984576,1347984607,DK
-1347984608,1347984639,IQ
-1347984640,1347984671,DK
-1347984672,1347984703,IQ
-1347984704,1347984719,DK
-1347984720,1347984727,NG
-1347984728,1347984751,DK
-1347984752,1347984767,AE
-1347984768,1347984807,DK
-1347984808,1347984815,ZA
-1347984816,1347984839,DK
-1347984840,1347984847,BJ
-1347984848,1347984855,MR
-1347984856,1347984879,DK
-1347984880,1347984895,NG
-1347984896,1347984959,DK
-1347984960,1347984991,NG
-1347984992,1347985031,DK
-1347985032,1347985039,NG
-1347985040,1347985103,DK
-1347985104,1347985119,NG
-1347985120,1347985407,DK
+1347977216,1347985407,DK
1347985408,1347989503,IT
1347989504,1347993599,FI
1347993600,1348001791,GB
@@ -24680,9 +26431,9 @@
1350217728,1350303743,AT
1350303744,1350434815,FR
1350434816,1350565887,NL
-1350565888,1352031618,DE
-1352031620,1352294911,DE
-1352295168,1352299775,DE
+1350565888,1350763083,DE
+1350763084,1350763084,JP
+1350763085,1352299775,DE
1352299776,1352300031,US
1352300032,1352412159,DE
1352412160,1352412415,FR
@@ -24717,10 +26468,7 @@
1353275256,1353277439,GB
1353277440,1353279487,CH
1353279488,1353280511,IT
-1353280512,1353286143,GB
-1353286186,1353286186,GB
-1353286336,1353286367,GB
-1353286400,1353287959,GB
+1353280512,1353287959,GB
1353287960,1353287967,IE
1353287968,1353298783,GB
1353298784,1353298815,SE
@@ -24753,14 +26501,7 @@
1354235904,1354301439,KW
1354301440,1354366975,FR
1354366976,1354432511,FI
-1354432512,1354469375,DE
-1354469632,1354469887,DE
-1354471680,1354471935,DE
-1354472192,1354472959,DE
-1354473216,1354485759,DE
-1354487296,1354488319,DE
-1354488832,1354489087,DE
-1354489856,1354498047,DE
+1354432512,1354498047,DE
1354498048,1354563583,CZ
1354563584,1354629119,GB
1354629120,1354658495,DE
@@ -24788,15 +26529,20 @@
1355870208,1355872255,FI
1355872256,1355873279,IT
1355873280,1355873791,GB
-1355873792,1355874047,GG
1355874048,1355874303,DE
-1355874304,1355931647,DK
+1355874304,1355907071,DK
+1355907072,1355923455,GB
+1355923456,1355931647,DE
1355931648,1355935743,LT
-1355935744,1355938815,DK
+1355935744,1355936767,NL
+1355936768,1355937791,DE
+1355937792,1355938815,PL
1355938816,1355939327,NL
-1355939328,1355939583,GG
-1355939584,1356005375,DK
-1356005376,1356070911,IT
+1355939584,1355939839,ES
+1355939840,1356005375,DK
+1356005376,1356054527,IT
+1356054528,1356062719,CZ
+1356062720,1356070911,IT
1356070912,1356201983,NO
1356201984,1356333055,FR
1356333056,1356464127,SE
@@ -24853,7 +26599,7 @@
1357328688,1357328695,ES
1357328696,1357328703,IT
1357328704,1357328711,IE
-1357328896,1357329159,NL
+1357328896,1357329163,NL
1357329168,1357329183,NL
1357329408,1357329415,BE
1357330944,1357331207,GB
@@ -24904,6 +26650,9 @@
1357375224,1357375423,GB
1357375424,1357375487,IE
1357375504,1357375551,GB
+1357375560,1357375567,GB
+1357375576,1357375583,FR
+1357375584,1357375591,GB
1357377536,1357378647,FR
1357378656,1357378671,FR
1357378816,1357379071,FR
@@ -24926,9 +26675,6 @@
1357875296,1357875327,IE
1357875456,1357875711,NL
1357876448,1357876479,DE
-1357876736,1357876863,ES
-1357877248,1357877311,DE
-1357877376,1357877439,DE
1357878272,1357878335,CH
1357878336,1357878399,CZ
1357878400,1357878463,NL
@@ -24937,13 +26683,10 @@
1357878592,1357878655,PL
1357878656,1357878719,DE
1357879296,1357879423,DE
-1357879936,1357880063,GB
1357883648,1357883903,SE
-1357884160,1357884415,GB
1357885120,1357885183,DE
1357885200,1357885215,AT
1357885952,1357886207,SE
-1357889024,1357889279,GB
1357889280,1357889535,SE
1357890828,1357890831,NL
1357891072,1357891327,NL
@@ -24957,14 +26700,12 @@
1357896192,1357896447,DE
1357897376,1357897407,PL
1357897624,1357897631,GB
-1357898752,1357898879,DE
-1357899648,1357899775,GB
+1357899712,1357899775,GB
1357900312,1357900315,GB
1357900416,1357900543,SE
1357900800,1357901055,PL
1357901056,1357901183,SE
1357902366,1357902366,NO
-1357902848,1357903359,GB
1357903616,1357903743,CH
1357903744,1357903871,DK
1357904896,1357905407,GB
@@ -24993,9 +26734,7 @@
1357971456,1357975551,KZ
1357975552,1357979647,AT
1357979648,1357983743,KZ
-1357983744,1357983919,GB
-1357983920,1357983927,IT
-1357983928,1357984087,GB
+1357983744,1357984087,GB
1357984088,1357984095,IT
1357984096,1357984103,GB
1357984104,1357984111,IT
@@ -25147,7 +26886,7 @@
1358553088,1358557183,UA
1358557184,1358561279,IE
1358561280,1358569471,CZ
-1358569472,1358573567,NG
+1358569472,1358573567,MA
1358573568,1358577663,LV
1358577664,1358585855,RU
1358585856,1358589951,GB
@@ -25221,16 +26960,17 @@
1358827520,1358831615,RU
1358831616,1358835711,NO
1358835712,1358839807,RU
-1358839808,1358842367,CH
-1358842880,1358843903,CH
+1358839808,1358843903,CH
1358843904,1358847999,MT
1358848000,1358856191,RU
1358856192,1358860287,DE
-1358860288,1358860835,GB
-1358860837,1358861311,GB
+1358860288,1358861361,GB
1358861362,1358861363,DE
+1358861364,1358861449,GB
1358861450,1358861450,DE
+1358861451,1358861473,GB
1358861474,1358861474,DE
+1358861475,1358861567,GB
1358861568,1358861823,DE
1358861824,1358861871,GB
1358861872,1358861879,FR
@@ -25240,15 +26980,22 @@
1358862080,1358862335,FR
1358862336,1358862847,US
1358862848,1358862911,DK
+1358862912,1358862914,GB
1358862915,1358862915,DK
+1358862916,1358862975,GB
1358862976,1358863103,DK
+1358863104,1358863359,CH
1358863360,1358863871,US
1358863872,1358864383,GB
1358864384,1358872575,CH
1358872576,1358876671,IT
1358876672,1358880767,LV
1358884864,1358888959,SE
-1358888960,1358892159,DE
+1358888960,1358890399,DE
+1358890400,1358890431,SE
+1358890432,1358890479,DE
+1358890480,1358890487,US
+1358890488,1358892159,DE
1358892160,1358892175,CH
1358892176,1358893055,DE
1358893056,1358897151,RU
@@ -25261,8 +27008,7 @@
1358913536,1358917631,CH
1358917632,1358921727,ES
1358921728,1358929919,RU
-1358929920,1358930700,LU
-1358930702,1358934015,LU
+1358929920,1358934015,LU
1358934016,1358938111,RU
1358938112,1358946303,GB
1358946304,1358950399,LV
@@ -25291,11 +27037,9 @@
1359134464,1359134719,GR
1359134720,1359147960,CZ
1359147961,1359147961,PT
-1359147962,1359150550,CZ
-1359150552,1359151103,CZ
+1359147962,1359151103,CZ
1359151104,1359167487,DE
-1359167488,1359172095,GB
-1359172352,1359183871,GB
+1359167488,1359183871,GB
1359183872,1359200255,RU
1359200256,1359216639,AT
1359216640,1359233023,ZA
@@ -25346,7 +27090,6 @@
1360044032,1360048127,SE
1360048128,1360052223,DE
1360052224,1360056319,HU
-1360056320,1360060415,SA
1360060416,1360064511,LT
1360064512,1360068607,GE
1360068608,1360072703,RU
@@ -25382,8 +27125,7 @@
1360195584,1360199679,NL
1360199680,1360203775,CZ
1360203776,1360207871,FR
-1360207872,1360210943,CZ
-1360211200,1360211967,CZ
+1360207872,1360211967,CZ
1360211968,1360216063,GB
1360216064,1360224255,RU
1360224256,1360224767,ES
@@ -25395,7 +27137,9 @@
1360240640,1360242431,ES
1360242432,1360244479,US
1360244480,1360244735,ES
-1360244736,1360252415,GB
+1360244736,1360251391,GB
+1360251392,1360251647,DE
+1360251648,1360252415,GB
1360252416,1360252671,CH
1360252672,1360257023,GB
1360257024,1360265215,DK
@@ -25465,15 +27209,10 @@
1360392192,1360396287,EE
1360396288,1360400383,RU
1360400384,1360404479,BH
-1360404480,1360404735,GB
-1360404736,1360404991,DE
-1360404992,1360405247,FR
-1360405248,1360405503,SE
-1360405504,1360408575,GB
1360408576,1360412671,RU
-1360412672,1360420863,DZ
1360420864,1360424959,TR
-1360424960,1360429055,RU
+1360424960,1360425215,NL
+1360425216,1360429055,RU
1360429056,1360433151,UA
1360433152,1360437247,RO
1360437248,1360441343,FI
@@ -25490,7 +27229,7 @@
1360486400,1360494591,RU
1360494592,1360498687,DK
1360498688,1360515071,RU
-1360515072,1360519167,GB
+1360515072,1360519167,JP
1360519168,1360524031,NL
1360524032,1360524287,US
1360524288,1360531455,NL
@@ -25829,7 +27568,13 @@
1365164032,1365172223,GB
1365172224,1365176319,LV
1365176320,1365180415,HU
-1365180416,1365184511,DE
+1365180416,1365182335,DE
+1365182336,1365182351,GB
+1365182352,1365182367,NL
+1365182368,1365182391,DE
+1365182392,1365182399,CH
+1365182400,1365182431,SE
+1365182432,1365184511,DE
1365184512,1365192703,RU
1365192704,1365196799,GB
1365196800,1365200895,ES
@@ -25946,9 +27691,11 @@
1370302976,1370303487,NO
1370303488,1370312703,NL
1370312704,1370316799,CH
-1370316800,1370318847,NL
+1370316800,1370317823,NL
+1370317824,1370318847,IT
1370318848,1370320895,ES
-1370320896,1370324991,NL
+1370320896,1370321919,DE
+1370321920,1370324991,NL
1370324992,1370357759,DE
1370357760,1370390527,IT
1370390528,1370423295,GB
@@ -26073,8 +27820,7 @@
1373634560,1374683135,SE
1374683136,1374752255,BE
1374752256,1374752767,FR
-1374752768,1375080959,BE
-1375081216,1375207423,BE
+1374752768,1375207423,BE
1375207424,1375208447,MQ
1375208448,1375208703,GP
1375208704,1375210239,MQ
@@ -26116,11 +27862,8 @@
1375239680,1375240191,MQ
1375240192,1375256575,GP
1375256576,1375272959,RE
-1375272960,1375552511,FR
-1375553536,1375705984,FR
-1375705986,1375731711,FR
-1375731712,1378719197,GB
-1378719199,1378877439,GB
+1375272960,1375731711,FR
+1375731712,1378877439,GB
1378877440,1379926015,IT
1379926016,1380188159,FR
1380188160,1380450303,GB
@@ -26172,7 +27915,7 @@
1382334464,1382350847,DE
1382350848,1382367231,FR
1382367232,1382383615,BG
-1382383616,1382399999,DZ
+1382383616,1382399999,NG
1382400000,1382416383,NL
1382416384,1382417407,SE
1382417408,1382417663,PT
@@ -26387,14 +28130,22 @@
1385267200,1385275391,SE
1385275392,1385283583,IT
1385283584,1385286143,DE
-1385286144,1385287679,GB
+1385286144,1385290288,GB
1385290289,1385290289,RE
+1385290290,1385290631,GB
1385290632,1385290632,IS
+1385290633,1385291343,GB
1385291344,1385291344,IS
+1385291345,1385291775,GB
1385291776,1385299967,TR
1385299968,1385303039,BG
-1385303040,1385303551,DK
-1385303552,1385308159,BG
+1385303040,1385303295,HU
+1385303296,1385303551,JP
+1385303552,1385304063,BG
+1385304064,1385304319,KR
+1385304320,1385304575,AE
+1385304576,1385304831,GR
+1385304832,1385308159,BG
1385308160,1385316351,RU
1385316352,1385324543,NO
1385324544,1385332735,BE
@@ -26464,9 +28215,7 @@
1386414080,1386422271,GB
1386422272,1386423295,IT
1386423296,1386424319,FR
-1386424320,1386424575,NL
-1386424576,1386425087,GB
-1386425088,1386426367,NL
+1386424320,1386426367,NL
1386426368,1386427391,GB
1386427392,1386432511,PS
1386432512,1386433023,GB
@@ -26656,17 +28405,22 @@
1388794960,1388795967,NL
1388795968,1388796031,GB
1388796032,1388796679,NL
-1388796680,1388796681,GB
-1388796683,1388796687,GB
+1388796680,1388796687,GB
1388796688,1388797951,NL
1388797952,1388806143,RU
1388806144,1388806399,CH
1388806400,1388806655,DE
1388806656,1388806783,CH
1388806784,1388806911,GB
-1388806912,1388811775,CH
+1388806912,1388807551,CH
+1388807552,1388807615,DE
+1388807616,1388807871,CH
+1388807872,1388807935,DE
+1388807936,1388811775,CH
1388811776,1388812031,DE
-1388812032,1388814335,CH
+1388812032,1388813247,CH
+1388813248,1388813311,DE
+1388813312,1388814335,CH
1388814336,1388816383,FI
1388816384,1388818431,AX
1388818432,1388819455,SE
@@ -26691,8 +28445,7 @@
1389218816,1389219839,AF
1389219840,1389228415,AE
1389228416,1389228479,LB
-1389228480,1389231359,AE
-1389231616,1389232127,AE
+1389228480,1389232127,AE
1389232128,1389264895,DE
1389264896,1389265151,TZ
1389265152,1389266943,GB
@@ -26703,8 +28456,7 @@
1389275648,1389275903,ZA
1389275904,1389289471,GB
1389289472,1389290495,NO
-1389290496,1389293311,GB
-1389293568,1389297663,GB
+1389290496,1389297663,GB
1389297664,1389330431,UA
1389330432,1389363199,DE
1389363200,1389373498,CZ
@@ -26723,10 +28475,7 @@
1389527040,1389543423,RO
1389543424,1389548991,DE
1389548992,1389549055,BE
-1389549056,1389557247,DE
-1389557376,1389557391,DE
-1389557504,1389558015,DE
-1389558272,1389576191,DE
+1389549056,1389576191,DE
1389576192,1389592575,GB
1389592576,1389598719,GE
1389598720,1389598956,RU
@@ -26744,7 +28493,8 @@
1389707264,1389723647,IT
1389723648,1389756415,ES
1389756416,1389772799,SE
-1389772800,1389778431,SI
+1389772800,1389777919,SI
+1389777920,1389778431,MK
1389778432,1389780991,RS
1389780992,1389783039,HR
1389783040,1389785087,BA
@@ -26754,11 +28504,9 @@
1389789184,1389805567,PL
1389805568,1389806591,US
1389806592,1389806847,SA
-1389806848,1389808639,US
-1389808896,1389814271,US
+1389806848,1389814271,US
1389814272,1389814527,DE
-1389814528,1389814783,US
-1389815040,1389815295,US
+1389814528,1389815295,US
1389815296,1389815551,DE
1389815552,1389817603,US
1389817604,1389817604,NO
@@ -26850,7 +28598,6 @@
1401159680,1401225215,PT
1401225216,1401241599,DE
1401242632,1401242632,DE
-1401246720,1401257983,DE
1401271296,1401274367,DE
1401278464,1401283583,DE
1401286656,1401290751,DE
@@ -26884,8 +28631,7 @@
1401481216,1401485311,RU
1401485312,1401487834,GB
1401487835,1401487835,BE
-1401487836,1401487871,GB
-1401488128,1401489407,GB
+1401487836,1401489407,GB
1401489408,1401491455,SE
1401491456,1401493503,NL
1401493504,1401495551,CH
@@ -27114,7 +28860,9 @@
1402435072,1402435103,LU
1402435104,1402437631,GB
1402437632,1402454015,DK
-1402454016,1402455551,GB
+1402454016,1402455469,GB
+1402455470,1402455470,DK
+1402455471,1402455551,GB
1402455552,1402455807,US
1402455808,1402470399,GB
1402470400,1402994687,FR
@@ -27181,9 +28929,11 @@
1404010496,1404026879,PL
1404026880,1404043263,ES
1404043264,1404051455,EE
-1404051456,1404059647,HR
-1404059648,1404076031,SE
-1404076032,1404084223,LV
+1404051456,1404076031,HR
+1404076032,1404076543,SE
+1404076544,1404080127,LV
+1404080128,1404081151,SE
+1404081152,1404084223,LV
1404084224,1404099327,LT
1404099328,1404099583,SE
1404099584,1404103167,LT
@@ -27195,34 +28945,40 @@
1404133376,1404141567,SE
1404141568,1404149759,LV
1404149760,1404151807,SE
-1404151808,1404174335,LV
+1404151808,1404170239,LV
+1404170240,1404174335,SE
1404174336,1404182527,EE
1404182528,1404187519,SE
1404187520,1404187535,LV
1404187536,1404187551,NL
1404187552,1404189183,SE
1404189184,1404190719,EE
-1404190720,1404192767,SE
-1404192768,1404194815,LV
+1404190720,1404193791,SE
+1404193792,1404194815,LV
1404194816,1404198911,LT
1404198912,1404200959,SE
1404200960,1404207103,HR
-1404207104,1404212223,LV
+1404207104,1404211199,LV
+1404211200,1404211711,SE
+1404211712,1404212223,LV
1404212224,1404215295,SE
-1404215296,1404219391,LV
+1404215296,1404216319,LV
+1404216320,1404217343,SE
+1404217344,1404219391,LV
1404219392,1404220415,SE
1404220416,1404221439,EE
1404221440,1404222463,SE
1404222464,1404222975,LV
-1404222976,1404225535,SE
-1404225536,1404231679,LV
+1404222976,1404227071,SE
+1404227072,1404231679,LV
1404231680,1404231935,SE
1404231936,1404233215,LV
1404233216,1404234239,SE
1404234240,1404239871,HR
-1404239872,1404242687,EE
+1404239872,1404242687,LT
1404242688,1404242751,SE
-1404242752,1404313599,EE
+1404242752,1404272639,LT
+1404272640,1404313599,EE
1404313600,1404321791,HR
1404321792,1404338175,EE
1404338176,1404340223,SE
@@ -27246,12 +29002,13 @@
1404518400,1404522495,SE
1404522496,1404526591,LV
1404526592,1404538879,SE
-1404538880,1404542975,LV
-1404542976,1404559359,SE
-1404559360,1404563455,LV
-1404563456,1404567551,SE
-1404567552,1404583935,HR
-1404583936,1404600319,EE
+1404538880,1404540927,LV
+1404540928,1404541439,SE
+1404541440,1404541951,LV
+1404541952,1404560383,SE
+1404560384,1404562431,LV
+1404562432,1404567551,SE
+1404567552,1404600319,HR
1404600320,1404633087,SE
1404633088,1404641279,HR
1404641280,1404678143,SE
@@ -27269,12 +29026,12 @@
1404805120,1404813311,AT
1404813312,1404815871,EE
1404815872,1404816383,LT
-1404816384,1404821503,SE
+1404816384,1404817407,SE
+1404817408,1404821503,EE
1404821504,1404862463,LT
1404862464,1404870655,HR
1404870656,1404872703,LT
-1404872704,1404874751,SE
-1404874752,1404875775,LV
+1404872704,1404875775,SE
1404875776,1404876799,LT
1404876800,1404887039,SE
1404887040,1404895231,LT
@@ -27289,8 +29046,8 @@
1405009920,1405042687,LT
1405042688,1405050879,HR
1405050880,1405059071,AT
-1405059072,1405067263,SE
-1405067264,1405091839,EE
+1405059072,1405063167,SE
+1405063168,1405091839,EE
1405091840,1405813247,FR
1405813248,1405813503,MQ
1405813504,1405814015,FR
@@ -27474,8 +29231,11 @@
1407521128,1407521135,CD
1407521136,1407521359,GB
1407521360,1407521367,CD
-1407521368,1407522303,GB
-1407522560,1407523263,GB
+1407521368,1407522375,GB
+1407522376,1407522383,CD
+1407522384,1407522471,GB
+1407522472,1407522479,CD
+1407522480,1407523263,GB
1407523264,1407523271,CD
1407523272,1407523959,GB
1407523960,1407523967,CD
@@ -27701,8 +29461,7 @@
1410736128,1410739455,RS
1410739456,1410739711,XK
1410739712,1410744319,RS
-1410744320,1410745087,FR
-1410745344,1410747391,FR
+1410744320,1410747391,FR
1410747392,1410747647,GP
1410747648,1410752511,FR
1410752512,1410760703,NL
@@ -27923,8 +29682,7 @@
1424601904,1424602623,US
1424602624,1424602879,GB
1424602880,1424603135,US
-1424603136,1424604671,GB
-1424604928,1424604975,GB
+1424603136,1424604975,GB
1424604976,1424604991,NL
1424604992,1424607743,GB
1424607744,1424607775,DE
@@ -27979,8 +29737,13 @@
1424818176,1424850943,RU
1424850944,1424883711,LV
1424883712,1424916479,DK
-1424916480,1424928767,BG
-1424928768,1424929279,DK
+1424916480,1424917503,BG
+1424917504,1424918015,IE
+1424918016,1424924671,BG
+1424924672,1424925183,BE
+1424925184,1424925695,RU
+1424925696,1424928767,BG
+1424928768,1424929279,AT
1424929280,1424949247,BG
1424949248,1424965631,RO
1424965632,1424982015,FR
@@ -28038,7 +29801,10 @@
1425478144,1425478655,ES
1425478656,1425478911,GB
1425478912,1425479679,RO
-1425479680,1425480703,BG
+1425479680,1425479935,FR
+1425479936,1425480191,NL
+1425480192,1425480447,FR
+1425480448,1425480703,IE
1425480704,1425481727,RO
1425481728,1425482751,US
1425482752,1425483775,RO
@@ -28188,8 +29954,7 @@
1431928832,1431937023,IT
1431937024,1431945215,PL
1431945216,1431953407,NO
-1431953408,1431956735,DK
-1431956992,1431961599,DK
+1431953408,1431961599,DK
1431961600,1431969791,CH
1431969792,1431977983,GB
1431977984,1431980719,NL
@@ -28230,7 +29995,9 @@
1432158720,1432158975,LB
1432158976,1432159487,DE
1432159488,1432159743,AE
-1432159744,1432166399,DE
+1432159744,1432163327,DE
+1432163328,1432163583,PL
+1432163584,1432166399,DE
1432166400,1432174591,RU
1432174592,1432182783,DE
1432182784,1432190975,CZ
@@ -28299,9 +30066,9 @@
1433609216,1433609727,SE
1433609728,1433610239,GB
1433610240,1433611263,US
-1433611264,1433614335,GB
-1433614336,1433615027,DE
-1433615029,1433615359,DE
+1433611264,1433611775,ES
+1433611776,1433614335,GB
+1433614336,1433615359,DE
1433615360,1433615615,FR
1433615616,1433616383,GB
1433616384,1433624575,AE
@@ -28376,8 +30143,7 @@
1433913344,1433917439,DE
1433917440,1433919487,BE
1433919488,1433921535,GB
-1433921536,1433921735,CH
-1433921737,1433923583,CH
+1433921536,1433923583,CH
1433923584,1433925631,BE
1433925632,1433927679,GB
1433927680,1433971711,RO
@@ -28422,11 +30188,11 @@
1436444672,1436446719,BE
1436446720,1436450815,FR
1436450816,1436452863,BH
-1436452864,1436453314,GB
-1436453316,1436453375,GB
+1436452864,1436453375,GB
1436453376,1436453391,DE
+1436453392,1436453399,GB
1436453400,1436453631,DE
-1436453888,1436454911,GB
+1436453632,1436454911,GB
1436454912,1436456959,AZ
1436456960,1436459007,GB
1436459008,1436461055,NL
@@ -28463,8 +30229,7 @@
1436526592,1436528639,GB
1436528640,1436530687,IT
1436530688,1436532735,GB
-1436532736,1436535039,IT
-1436535296,1436536831,IT
+1436532736,1436536831,IT
1436536832,1436538879,GB
1436538880,1436540927,JO
1436540928,1436542975,RU
@@ -28482,7 +30247,7 @@
1438138368,1438146559,FR
1438146560,1438147583,MT
1438147584,1438147839,SE
-1438147840,1438148095,MT
+1438147840,1438148095,BE
1438148096,1438148351,GB
1438148352,1438154751,MT
1438154752,1438171135,DK
@@ -28747,7 +30512,6 @@
1439563264,1439563775,DE
1439563776,1439629311,LT
1439629312,1439694847,CZ
-1439694848,1439825919,SA
1439825920,1439956991,GB
1439956992,1440212991,DE
1440212992,1440213247,ES
@@ -28842,7 +30606,7 @@
1441685504,1441693695,UA
1441693696,1441694719,BR
1441694720,1441696767,DE
-1441697024,1441697791,SG
+1441696768,1441697791,SG
1441697792,1441698815,US
1441698816,1441701887,DE
1441701888,1441710079,AT
@@ -29070,7 +30834,7 @@
1449820928,1449821183,DE
1449821184,1449822719,RO
1449822720,1449823743,GB
-1449823744,1449823999,BG
+1449823744,1449823999,MD
1449824000,1449824255,RO
1449824256,1449826303,MD
1449826304,1449828351,RO
@@ -29108,7 +30872,9 @@
1449880576,1449881087,US
1449881088,1449883647,RO
1449883648,1449885695,BE
-1449885696,1449889791,GB
+1449885696,1449886463,KZ
+1449886464,1449886719,RO
+1449886720,1449889791,KZ
1449889792,1449893887,IR
1449893888,1449895935,MD
1449895936,1449896447,RO
@@ -29155,7 +30921,9 @@
1450147840,1450151935,CH
1450151936,1450153983,IQ
1450153984,1450156031,DE
-1450156032,1450164223,GB
+1450156032,1450164199,GB
+1450164200,1450164200,US
+1450164201,1450164223,GB
1450164224,1450166271,SA
1450166272,1450168319,PL
1450170368,1450172415,GB
@@ -29196,7 +30964,9 @@
1466086018,1466097919,FR
1466097920,1466099711,ES
1466099712,1466101759,PL
-1466101760,1466102271,FR
+1466101760,1466101951,FR
+1466101952,1466102015,DE
+1466102016,1466102271,FR
1466102272,1466102527,DE
1466102528,1466102783,FR
1466102784,1466103807,DE
@@ -29250,7 +31020,9 @@
1467252736,1467269119,RS
1467269120,1467285503,PL
1467285504,1467301887,RU
-1467301888,1467310079,GB
+1467301888,1467303423,GB
+1467303424,1467303935,CH
+1467303936,1467310079,GB
1467310080,1467314175,ES
1467314176,1467316223,GB
1467316224,1467318271,CH
@@ -29328,8 +31100,7 @@
1474756608,1474822143,FR
1474822144,1474887679,IE
1474887680,1474953215,NL
-1474953216,1475016447,DE
-1475016704,1475018751,DE
+1474953216,1475018751,DE
1475018752,1475084287,ES
1475084288,1475086335,NL
1475086336,1475092479,RU
@@ -29355,8 +31126,8 @@
1475133440,1475135487,CZ
1475135488,1475137535,CH
1475137536,1475138815,GB
-1475138816,1475139071,IR
-1475139072,1475139583,GB
+1475138816,1475139327,IR
+1475139328,1475139583,LT
1475139584,1475141631,ES
1475141632,1475143679,FI
1475143680,1475145727,JO
@@ -29388,8 +31159,7 @@
1475203072,1475205119,SE
1475205120,1475205887,DE
1475205888,1475206143,US
-1475206144,1475206399,DE
-1475206656,1475207167,DE
+1475206144,1475207167,DE
1475207168,1475207263,AE
1475207264,1475207295,US
1475207296,1475207423,AE
@@ -29452,7 +31222,7 @@
1475340288,1475342335,GR
1475342336,1475344383,PL
1475344384,1475344639,ES
-1475344640,1475344895,NL
+1475344640,1475344895,RO
1475344896,1475345151,SE
1475345152,1475345919,NL
1475345920,1475346175,ES
@@ -29505,30 +31275,7 @@
1475657728,1475674111,SK
1475674112,1475690495,DE
1475690496,1475706879,CH
-1475706880,1475723263,RU
-1475723264,1475723839,GB
-1475723840,1475723903,RU
-1475723904,1475723967,GB
-1475723968,1475724031,RU
-1475724032,1475724223,GB
-1475724224,1475724287,RU
-1475724288,1475724351,GB
-1475724352,1475724415,RU
-1475724416,1475724479,GB
-1475724480,1475724543,RU
-1475724544,1475724866,GB
-1475724867,1475724867,RU
-1475724868,1475724869,GB
-1475724870,1475724870,RU
-1475724871,1475724927,GB
-1475724928,1475725183,RU
-1475725184,1475725311,GB
-1475725312,1475725567,RU
-1475725568,1475725823,GB
-1475725824,1475726079,RU
-1475726080,1475726591,GB
-1475726592,1475726847,RU
-1475726848,1475727359,GB
+1475706880,1475727359,RU
1475727360,1475727391,FI
1475727392,1475727775,GB
1475727776,1475727871,FI
@@ -29773,7 +31520,7 @@
1485254656,1485259007,RU
1485262848,1485263359,UA
1485263360,1485266943,RU
-1485266944,1485271039,RO
+1485266944,1485271039,US
1485271040,1485275135,UA
1485275136,1485283327,LV
1485283328,1485291519,PL
@@ -29865,7 +31612,9 @@
1489664768,1489665023,TN
1489665792,1489674239,GB
1489674240,1489676287,NL
-1489676288,1489678943,GB
+1489676288,1489678591,GB
+1489678592,1489678847,NL
+1489678848,1489678943,GB
1489678944,1489678959,US
1489678960,1489688575,GB
1489688576,1489688831,IL
@@ -29933,7 +31682,8 @@
1490337792,1490354175,RU
1490354176,1490386943,SA
1490386944,1490403327,CH
-1490403328,1490419711,BG
+1490403328,1490411519,BG
+1490411520,1490419711,FR
1490419712,1490420735,DE
1490420736,1490421759,IR
1490421760,1490436095,DE
@@ -30082,6 +31832,7 @@
1495160256,1495160263,GB
1495160320,1495160575,FR
1495160576,1495160831,CN
+1495161856,1495161983,AE
1495162112,1495162367,DE
1495162496,1495162499,DE
1495162608,1495162623,GB
@@ -30127,6 +31878,7 @@
1495255040,1495257087,IT
1495257088,1495259135,GB
1495259136,1495261183,BE
+1495261184,1495261439,PT
1495261440,1495261481,GB
1495261482,1495261482,PT
1495261483,1495261511,GB
@@ -30168,9 +31920,9 @@
1495316480,1495316735,GB
1495316736,1495316991,RO
1495316992,1495317503,IT
-1495317504,1495317759,BG
+1495317504,1495317759,NL
1495317760,1495318015,RO
-1495318016,1495318271,BG
+1495318016,1495318271,ES
1495318272,1495319039,RO
1495319040,1495319167,FR
1495319168,1495319295,RO
@@ -30178,13 +31930,17 @@
1495319552,1495320063,IR
1495320064,1495321343,RO
1495321344,1495321599,GB
-1495321600,1495326719,RO
+1495321600,1495322623,RO
+1495322624,1495324671,GR
+1495324672,1495326719,RO
1495326720,1495332863,MD
1495332864,1495333375,RO
1495333376,1495333631,CH
1495333632,1495333887,RO
1495333888,1495334911,MD
-1495334912,1495335679,BG
+1495334912,1495335167,FR
+1495335168,1495335423,IE
+1495335424,1495335679,NL
1495335680,1495335935,MD
1495335936,1495336447,RO
1495336448,1495336959,GB
@@ -30312,7 +32068,7 @@
1495470080,1495472127,NL
1495472128,1495473151,RO
1495473152,1495474175,GB
-1495474176,1495474431,NL
+1495474176,1495474431,ES
1495474432,1495474687,RO
1495474688,1495474943,MD
1495474944,1495476223,RO
@@ -30380,7 +32136,8 @@
1495540736,1495540991,GB
1495540992,1495541247,RO
1495541248,1495541759,GB
-1495541760,1495543807,RO
+1495541760,1495542783,ES
+1495542784,1495543807,RO
1495543808,1495547903,IR
1495547904,1495548159,US
1495548160,1495548671,RO
@@ -30475,7 +32232,7 @@
1495652864,1495653375,IR
1495653376,1495654399,KZ
1495654400,1495654911,RO
-1495654912,1495655167,NL
+1495654912,1495655167,ES
1495655168,1495655423,BG
1495655424,1495656447,US
1495656448,1495656959,RO
@@ -30513,7 +32270,8 @@
1495701504,1495703551,RO
1495703552,1495704575,NL
1495704576,1495705599,KZ
-1495705600,1495709695,RO
+1495705600,1495707647,RO
+1495707648,1495709695,ES
1495709696,1495713791,IR
1495713792,1495715839,ES
1495715840,1495716863,RO
@@ -30717,7 +32475,7 @@
1495963648,1495964415,GB
1495964672,1495965695,RO
1495965696,1495966719,PL
-1495966720,1495967743,RO
+1495966720,1495967743,ES
1495967744,1495968767,NL
1495968768,1495970815,RO
1495970816,1495971839,MD
@@ -30750,7 +32508,8 @@
1495999488,1495999999,IR
1496000000,1496003327,RO
1496003328,1496003583,DE
-1496003584,1496005631,RO
+1496003584,1496004607,RO
+1496004608,1496005631,GR
1496005632,1496005887,GB
1496005888,1496006655,RO
1496006656,1496007679,TR
@@ -30776,7 +32535,7 @@
1496033280,1496034303,MD
1496034304,1496036863,RO
1496036864,1496037375,IR
-1496037376,1496038399,RO
+1496037376,1496038399,GR
1496038400,1496038911,IR
1496038912,1496040447,RO
1496040448,1496040959,ES
@@ -30795,7 +32554,8 @@
1496066816,1496067071,QA
1496067072,1496072191,RO
1496072192,1496074239,ES
-1496074240,1496079359,RO
+1496074240,1496075263,GR
+1496075264,1496079359,RO
1496079360,1496081407,GR
1496081408,1496082175,RO
1496082176,1496082431,GB
@@ -30817,7 +32577,8 @@
1496098304,1496098815,BE
1496098816,1496100863,LU
1496100864,1496102911,IR
-1496102912,1496104447,RO
+1496102912,1496103935,ES
+1496103936,1496104447,RO
1496104448,1496104959,IR
1496104960,1496107519,RO
1496107520,1496108031,IR
@@ -30825,15 +32586,17 @@
1496108544,1496108799,IT
1496108800,1496110335,RO
1496110336,1496110591,GB
-1496110592,1496117247,RO
+1496110592,1496111103,RO
+1496111104,1496113151,GR
+1496113152,1496117247,RO
1496117248,1496118271,IR
1496118272,1496119295,RO
1496119296,1496121343,SE
1496121344,1496122367,MD
1496122368,1496123391,RO
-1496123392,1496123647,BG
+1496123392,1496123647,NL
1496123648,1496124927,RO
-1496124928,1496125183,BG
+1496124928,1496125183,FR
1496125184,1496127487,RO
1496127488,1496127743,IT
1496127744,1496127999,RO
@@ -30916,7 +32679,9 @@
1496242176,1496243199,IR
1496243200,1496248575,RO
1496248576,1496248831,MD
-1496248832,1496253439,RO
+1496248832,1496251391,RO
+1496251392,1496252415,GR
+1496252416,1496253439,RO
1496253440,1496254463,ES
1496254464,1496256255,RO
1496256256,1496256511,US
@@ -30948,9 +32713,11 @@
1496299520,1496301567,SE
1496301568,1496302591,RO
1496302592,1496304639,IR
-1496304640,1496315647,RO
+1496304640,1496312831,RO
+1496312832,1496313855,ES
+1496313856,1496315647,RO
1496315648,1496315903,GB
-1496315904,1496316159,RO
+1496315904,1496316159,RS
1496316160,1496316415,GB
1496316416,1496317951,RO
1496317952,1497366527,DE
@@ -31079,7 +32846,9 @@
1502920704,1502937087,RU
1502937088,1502953471,RO
1502953472,1502969855,MD
-1502969856,1502975231,IE
+1502969856,1502972927,IE
+1502972928,1502973951,DE
+1502973952,1502975231,IE
1502975232,1502975247,GB
1502975248,1502975327,IE
1502975328,1502975359,GB
@@ -31303,8 +33072,7 @@
1505705984,1505714175,DE
1505714176,1505722367,LV
1505722368,1505738751,PL
-1505738752,1505746943,GB
-1505746944,1505751039,UA
+1505738752,1505751039,GB
1505751040,1505755135,RU
1505755136,1506017279,GB
1506017280,1506082815,IR
@@ -31356,7 +33124,9 @@
1506451072,1506451135,DK
1506451136,1506451839,GB
1506451840,1506451871,ES
-1506451872,1506453311,GB
+1506451872,1506452095,GB
+1506452096,1506452127,PT
+1506452128,1506453311,GB
1506453312,1506453319,SE
1506453320,1506456533,GB
1506456534,1506456534,IT
@@ -31370,8 +33140,7 @@
1506458245,1506458245,CH
1506458246,1506458359,GB
1506458360,1506458367,CH
-1506458368,1506459177,GB
-1506459179,1506459207,GB
+1506458368,1506459207,GB
1506459208,1506459247,BE
1506459248,1506459295,GB
1506459296,1506459327,BE
@@ -31397,9 +33166,9 @@
1506463720,1506463727,DE
1506463728,1506464999,GB
1506465000,1506465007,NL
-1506465008,1506465023,GB
+1506465008,1506465187,GB
1506465188,1506465188,NL
-1506465280,1506466383,GB
+1506465189,1506466383,GB
1506466384,1506466391,DE
1506466392,1506466431,GB
1506466432,1506466559,DE
@@ -31553,7 +33322,8 @@
1508818944,1508830719,RO
1508830720,1508831487,SK
1508831488,1508835327,RO
-1508835328,1508847615,CZ
+1508835328,1508843519,CZ
+1508843520,1508847615,PS
1508847616,1508851711,US
1508851712,1508868095,PL
1508868096,1508884479,RU
@@ -31861,8 +33631,7 @@
1514799104,1514930175,ES
1514930176,1514995711,FR
1514995712,1515061247,ES
-1515061248,1515192639,FR
-1515192656,1515467007,FR
+1515061248,1515467007,FR
1515467008,1515467263,ES
1515467264,1515467519,FR
1515467520,1515468031,US
@@ -31892,8 +33661,8 @@
1516896256,1516961791,ES
1516961792,1518338047,FR
1518338048,1518370815,LV
-1518370816,1518403583,NL
-1518403584,1518436351,SE
+1518370816,1518419967,NL
+1518419968,1518436351,SE
1518436352,1518452735,NO
1518452736,1518460927,AT
1518460928,1518469119,LV
@@ -31907,10 +33676,10 @@
1518493696,1518501887,LV
1518501888,1518503935,EE
1518503936,1518510079,LT
-1518510080,1518516223,LV
-1518516224,1518517247,SE
-1518517248,1518518271,LV
-1518518272,1518540543,SE
+1518510080,1518514175,LV
+1518514176,1518515199,SE
+1518515200,1518515711,LV
+1518515712,1518540543,SE
1518540544,1518540799,LT
1518540800,1518541479,SE
1518541480,1518541480,DE
@@ -31948,11 +33717,14 @@
1519200256,1519206399,EE
1519206400,1519208447,LV
1519208448,1519208703,SE
-1519208704,1519210495,LV
+1519208704,1519209471,LV
+1519209472,1519210495,SE
1519210496,1519214591,LT
-1519214592,1519222783,LV
-1519222784,1519263743,SE
-1519263744,1519271935,LV
+1519214592,1519215615,SE
+1519215616,1519216639,LV
+1519216640,1519221759,SE
+1519221760,1519222783,LV
+1519222784,1519271935,SE
1519271936,1519288319,NL
1519288320,1519292415,SE
1519292416,1519294463,LT
@@ -32044,7 +33816,7 @@
1532756736,1532774143,BG
1532774144,1532774399,CH
1532774400,1532784639,BG
-1532784640,1532785151,TR
+1532784640,1532785151,NL
1532785152,1532787711,BG
1532787712,1532788735,DE
1532788736,1532795903,BG
@@ -32073,7 +33845,9 @@
1533413376,1533415423,DE
1533415424,1533417471,SA
1533417472,1533419519,NO
-1533419520,1533421567,KW
+1533419520,1533420287,KW
+1533420288,1533420543,LU
+1533420544,1533421567,KW
1533421568,1533423615,NL
1533423616,1533425663,IT
1533425664,1533429759,GB
@@ -32135,7 +33909,6 @@
1533534208,1533536255,RU
1533536256,1533538303,FR
1533538304,1533540351,DE
-1533540352,1533542399,AT
1533542400,1533607935,HU
1533607936,1533640703,LV
1533640704,1533659135,RU
@@ -32178,8 +33951,8 @@
1533804544,1533805567,RU
1533805568,1533807615,NL
1533807616,1533808639,US
-1533808640,1533813759,RU
-1533813760,1533818879,GB
+1533808640,1533812735,RU
+1533812736,1533818879,GB
1533818880,1533819903,NL
1533819904,1533820927,RU
1533820928,1533829119,DE
@@ -32231,7 +34004,8 @@
1533854208,1533855231,IR
1533855232,1533857791,GB
1533857792,1533859839,IR
-1533859840,1533874175,GB
+1533859840,1533864959,IQ
+1533864960,1533874175,GB
1533874176,1533878271,DE
1533878272,1533880319,CZ
1533880320,1533882367,GB
@@ -32318,7 +34092,9 @@
1534717344,1534717359,GB
1534717360,1534717739,FR
1534717740,1534717743,GB
-1534717744,1534717995,FR
+1534717744,1534717963,FR
+1534717964,1534717967,PL
+1534717968,1534717995,FR
1534717996,1534717999,GB
1534718000,1534718031,FR
1534718032,1534718047,ES
@@ -32355,7 +34131,8 @@
1534720024,1534720027,PL
1534720028,1534720079,FR
1534720080,1534720095,ES
-1534720096,1534720179,FR
+1534720096,1534720175,FR
+1534720176,1534720179,NL
1534720180,1534720183,ES
1534720184,1534720387,FR
1534720388,1534720391,FI
@@ -32363,7 +34140,9 @@
1534720656,1534720663,ES
1534720664,1534720767,FR
1534720768,1534720783,ES
-1534720784,1534721807,FR
+1534720784,1534720831,FR
+1534720832,1534720863,GB
+1534720864,1534721807,FR
1534721808,1534721823,GB
1534721824,1534721975,FR
1534721976,1534721979,FI
@@ -32389,8 +34168,7 @@
1534988288,1535049727,ES
1535049728,1535115263,SK
1535115264,1535116287,AT
-1535116288,1535123455,SE
-1535123456,1535131647,LV
+1535116288,1535131647,SE
1535131648,1535148031,HR
1535148032,1535197183,AT
1535197184,1535203359,EE
@@ -32399,73 +34177,120 @@
1535213568,1535246335,SE
1535246336,1535311871,AT
1535311872,1535344639,EE
-1535344640,1535350783,LV
+1535344640,1535349759,LV
+1535349760,1535350783,SE
1535350784,1535352831,HR
1535352832,1535377407,EE
1535442944,1535451135,RU
1535451136,1535459327,DK
1535459328,1535475711,AT
1535475712,1535508479,IR
-1535508480,1535509279,FR
+1535508480,1535509151,FR
+1535509152,1535509183,IT
+1535509184,1535509247,DE
+1535509248,1535509279,FR
1535509280,1535509311,ES
1535509312,1535509487,FR
1535509488,1535509503,PT
-1535509504,1535511871,FR
+1535509504,1535511615,FR
+1535511616,1535511679,DE
+1535511680,1535511871,FR
1535511872,1535511935,ES
1535511936,1535511999,FR
1535512000,1535512015,GB
-1535512016,1535512121,FR
-1535512122,1535512122,PL
-1535512123,1535514911,FR
+1535512016,1535512095,FR
+1535512096,1535512127,PL
+1535512128,1535512779,FR
+1535512780,1535512783,PL
+1535512784,1535512799,FR
+1535512800,1535512831,DE
+1535512832,1535514767,FR
+1535514768,1535514783,LT
+1535514784,1535514895,FR
+1535514896,1535514911,NL
1535514912,1535514943,FI
1535514944,1535515007,IE
1535515008,1535515055,FR
1535515056,1535515071,IT
-1535515072,1535515331,FR
+1535515072,1535515231,FR
+1535515232,1535515263,CZ
+1535515264,1535515331,FR
1535515332,1535515335,ES
-1535515336,1535515504,FR
-1535515505,1535515505,PL
-1535515506,1535515519,FR
+1535515336,1535515423,FR
+1535515424,1535515455,IT
+1535515456,1535515519,PL
1535515520,1535515647,GB
-1535515648,1535515743,FR
+1535515648,1535515727,FR
+1535515728,1535515735,NL
+1535515736,1535515743,FR
1535515744,1535515775,PT
-1535515776,1535537535,FR
+1535515776,1535515935,FR
+1535515936,1535515967,LT
+1535515968,1535521407,FR
+1535521408,1535521535,NL
+1535521536,1535536739,FR
+1535536740,1535536743,PL
+1535536744,1535537343,FR
+1535537344,1535537407,DE
+1535537408,1535537535,FR
1535537536,1535537663,ES
-1535537664,1535538111,FR
+1535537664,1535537819,FR
+1535537820,1535537823,PL
+1535537824,1535537855,FR
+1535537856,1535537919,IT
+1535537920,1535538111,FR
1535538112,1535538175,FI
1535538176,1535538815,FR
1535538816,1535538879,IE
-1535538880,1535540949,FR
-1535540950,1535540951,BE
-1535540952,1535540954,FR
-1535540955,1535540955,BE
-1535540956,1535542079,FR
+1535538880,1535540159,FR
+1535540160,1535540223,CZ
+1535540224,1535540799,FR
+1535540800,1535540863,PL
+1535540864,1535540991,BE
+1535540992,1535542079,FR
1535542080,1535542143,FI
1535542144,1535542640,FR
1535542641,1535542641,BE
1535542642,1535545551,FR
1535545552,1535545567,PT
-1535545568,1535545599,FR
+1535545568,1535545599,DE
1535545600,1535545855,GB
1535545856,1535545983,FR
1535545984,1535546111,IE
-1535546112,1535546270,FR
-1535546271,1535546271,IT
-1535546272,1535547158,FR
+1535546112,1535546239,FR
+1535546240,1535546367,IT
+1535546368,1535547158,FR
1535547159,1535547159,IT
-1535547160,1535548091,FR
+1535547160,1535547167,FR
+1535547168,1535547183,IT
+1535547184,1535547407,FR
+1535547408,1535547423,DE
+1535547424,1535548091,FR
1535548092,1535548095,PL
-1535548096,1535548223,FR
+1535548096,1535548159,IT
+1535548160,1535548223,FR
1535548224,1535548415,ES
-1535548416,1535548991,FR
+1535548416,1535548463,FR
+1535548464,1535548479,LT
+1535548480,1535548991,FR
1535548992,1535549055,PT
-1535549056,1535549683,FR
-1535549684,1535549684,PL
-1535549685,1535550519,FR
+1535549056,1535549151,FR
+1535549152,1535549183,PL
+1535549184,1535549279,FR
+1535549280,1535549295,CZ
+1535549296,1535549311,FR
+1535549312,1535549439,NL
+1535549440,1535549631,FR
+1535549632,1535549695,PL
+1535549696,1535550015,FR
+1535550016,1535550079,IT
+1535550080,1535550519,FR
1535550520,1535550523,DE
1535550524,1535550547,FR
1535550548,1535550551,DE
-1535550552,1535551087,FR
+1535550552,1535550911,FR
+1535550912,1535550927,BE
+1535550928,1535551087,FR
1535551088,1535551103,ES
1535551104,1535551679,FR
1535551680,1535551695,GB
@@ -32475,33 +34300,55 @@
1535551844,1535551844,FI
1535551845,1535551903,FR
1535551904,1535551919,NL
-1535551920,1535552463,FR
+1535551920,1535551999,FR
+1535552000,1535552127,IT
+1535552128,1535552463,FR
1535552464,1535552479,NL
-1535552480,1535553343,FR
+1535552480,1535552895,FR
+1535552896,1535553023,DE
+1535553024,1535553343,FR
1535553344,1535553407,PL
1535553408,1535553471,FR
1535553472,1535553535,ES
-1535553536,1535553983,FR
+1535553536,1535553727,FR
+1535553728,1535553791,IT
+1535553792,1535553983,FR
1535553984,1535554047,GB
-1535554048,1535554295,FR
-1535554296,1535554296,PL
-1535554297,1535554367,FR
+1535554048,1535554287,FR
+1535554288,1535554303,PL
+1535554304,1535554367,FR
1535554368,1535554431,ES
-1535554432,1535554847,FR
+1535554432,1535554559,DE
+1535554560,1535554687,FR
+1535554688,1535554815,IT
+1535554816,1535554847,FR
1535554848,1535554863,PT
-1535554864,1535555935,FR
+1535554864,1535555103,FR
+1535555104,1535555135,LT
+1535555136,1535555679,FR
+1535555680,1535555711,PL
+1535555712,1535555935,FR
1535555936,1535555951,ES
1535555952,1535556095,FR
1535556096,1535556159,ES
1535556160,1535556271,FR
1535556272,1535556287,GB
-1535556288,1535556863,FR
+1535556288,1535556479,FR
+1535556480,1535556607,NL
+1535556608,1535556863,FR
1535556864,1535557119,GB
-1535557120,1535558015,FR
+1535557120,1535557311,FR
+1535557312,1535557375,PL
+1535557376,1535558015,FR
1535558016,1535558143,ES
-1535558144,1535559695,FR
+1535558144,1535558591,FR
+1535558592,1535558655,DE
+1535558656,1535558847,FR
+1535558848,1535558911,PL
+1535558912,1535559695,FR
1535559696,1535559711,IT
-1535559712,1535559807,FR
+1535559712,1535559743,LT
+1535559744,1535559807,FR
1535559808,1535559871,FI
1535559872,1535559935,FR
1535559936,1535560191,GB
@@ -32509,23 +34356,47 @@
1535560288,1535560319,FI
1535560320,1535560511,FR
1535560512,1535560575,PT
-1535560576,1535561695,FR
+1535560576,1535560703,DE
+1535560704,1535560915,FR
+1535560916,1535560919,PL
+1535560920,1535561407,FR
+1535561408,1535561471,CZ
+1535561472,1535561567,FR
+1535561568,1535561599,PL
+1535561600,1535561695,FR
1535561696,1535561727,ES
-1535561728,1535562403,FR
+1535561728,1535562303,FR
+1535562304,1535562367,PL
+1535562368,1535562403,FR
1535562404,1535562407,GB
1535562408,1535562591,FR
1535562592,1535562623,FI
1535562624,1535562699,FR
1535562700,1535562703,PT
-1535562704,1535562879,FR
+1535562704,1535562719,FR
+1535562720,1535562751,IT
+1535562752,1535562879,FR
1535562880,1535563007,ES
1535563008,1535563371,FR
1535563372,1535563375,FI
-1535563376,1535563455,FR
+1535563376,1535563407,FR
+1535563408,1535563411,PL
+1535563412,1535563455,FR
1535563456,1535563519,IE
-1535563520,1535564351,FR
+1535563520,1535563711,FR
+1535563712,1535563775,IT
+1535563776,1535563903,FR
+1535563904,1535564031,NL
+1535564032,1535564351,FR
1535564352,1535564415,IE
-1535564416,1535566143,FR
+1535564416,1535564543,BE
+1535564544,1535564767,FR
+1535564768,1535564799,PL
+1535564800,1535565503,FR
+1535565504,1535565567,IT
+1535565568,1535565759,FR
+1535565760,1535565823,CZ
+1535565824,1535566143,FR
1535566144,1535566159,ES
1535566160,1535566563,FR
1535566564,1535566567,GB
@@ -32534,23 +34405,36 @@
1535566720,1535567551,FR
1535567552,1535567615,ES
1535567616,1535567871,GB
-1535567872,1535569023,FR
+1535567872,1535567999,FR
+1535568000,1535568127,DE
+1535568128,1535568351,FR
+1535568352,1535568383,LT
+1535568384,1535569023,FR
1535569024,1535569151,ES
1535569152,1535569343,FR
1535569344,1535569407,PL
-1535569408,1535571519,FR
+1535569408,1535571199,FR
+1535571200,1535571263,BE
+1535571264,1535571519,FR
1535571520,1535571583,ES
-1535571584,1535572799,FR
+1535571584,1535571711,FR
+1535571712,1535571743,PL
+1535571744,1535571903,FR
+1535571904,1535571967,NL
+1535571968,1535572799,FR
1535572800,1535572831,IE
1535572832,1535573203,FR
1535573204,1535573207,FI
1535573208,1535573211,FR
1535573212,1535573215,GB
-1535573216,1535573307,FR
+1535573216,1535573231,FR
+1535573232,1535573247,PL
+1535573248,1535573307,FR
1535573308,1535573311,NL
1535573312,1535573391,FR
1535573392,1535573407,ES
-1535573408,1535573439,FR
+1535573408,1535573423,FR
+1535573424,1535573439,CZ
1535573440,1535573503,PL
1535573504,1535573543,FR
1535573544,1535573547,LT
@@ -32814,7 +34698,8 @@
1539276800,1539280895,SE
1539280896,1539284991,FR
1539284992,1539289087,TR
-1539289088,1539291391,RU
+1539289088,1539291135,RU
+1539291136,1539291391,NL
1539291392,1539291647,CZ
1539291648,1539293183,RU
1539293184,1539297279,AZ
@@ -33565,7 +35450,6 @@
1539802624,1539802879,IS
1539802880,1539803135,NL
1539803136,1539803391,GB
-1539803392,1539803647,NL
1539803648,1539804159,UA
1539804160,1539804671,PL
1539804672,1539804927,SI
@@ -33868,7 +35752,7 @@
1540081664,1540082687,DE
1540082688,1540083711,NO
1540083712,1540084735,RU
-1540084736,1540085759,DE
+1540084736,1540085759,NL
1540085760,1540087807,PL
1540087808,1540092927,RU
1540092928,1540094975,PL
@@ -33911,7 +35795,7 @@
1540142080,1540143103,UA
1540143104,1540144127,RU
1540144128,1540145151,AM
-1540145408,1540146175,AT
+1540145152,1540146175,AT
1540146176,1540147199,UA
1540147200,1540148223,RU
1540148224,1540149247,PL
@@ -34119,7 +36003,7 @@
1540313600,1540315135,RU
1540315136,1540315647,UA
1540315648,1540316159,IL
-1540316416,1540316671,DE
+1540316160,1540316671,DE
1540316672,1540317183,RO
1540317696,1540318207,UA
1540318208,1540318719,RU
@@ -34758,8 +36642,7 @@
1540638208,1540638463,RO
1540638464,1540638719,AM
1540639232,1540639487,RO
-1540639488,1540639491,CH
-1540639493,1540639743,CH
+1540639488,1540639743,CH
1540639744,1540639999,IL
1540640000,1540640255,CH
1540640256,1540640511,FR
@@ -34875,7 +36758,7 @@
1540675584,1540675839,GB
1540675840,1540676351,RU
1540676352,1540676607,IT
-1540676608,1540677119,RU
+1540676864,1540677119,RU
1540677120,1540677375,GB
1540677376,1540677631,PL
1540677632,1540677887,DK
@@ -35152,7 +37035,10 @@
1540792320,1540793343,UA
1540793344,1540794367,FI
1540794368,1540795391,CH
-1540795392,1540796415,RU
+1540795392,1540795647,RU
+1540795648,1540795903,IE
+1540795904,1540796159,KZ
+1540796160,1540796415,RU
1540796416,1540798463,UA
1540798464,1540799487,RU
1540799488,1540800511,RO
@@ -35207,8 +37093,7 @@
1540856832,1540857855,NL
1540857856,1540858879,DK
1540858880,1540859903,GB
-1540859904,1540860927,RU
-1540860928,1540861951,KZ
+1540859904,1540861951,RU
1540861952,1540862975,BY
1540862976,1540865023,GB
1540865024,1540872191,RU
@@ -35616,7 +37501,8 @@
1541015552,1541016575,RU
1541016576,1541018623,UA
1541019648,1541021695,RU
-1541021696,1541023743,UA
+1541021696,1541022719,UA
+1541023418,1541023418,UA
1541023744,1541024767,RU
1541024768,1541026815,UA
1541026816,1541027839,LV
@@ -36066,7 +37952,8 @@
1541280768,1541281791,BG
1541281792,1541282815,PL
1541282816,1541283839,RU
-1541283840,1541286911,UA
+1541283840,1541285887,UA
+1541285888,1541286911,CZ
1541286912,1541287935,DE
1541287936,1541288959,RU
1541288960,1541289983,CZ
@@ -36206,7 +38093,8 @@
1541366272,1541366527,RU
1541366784,1541367039,NO
1541367040,1541367295,AT
-1541367296,1541367807,UA
+1541367296,1541367551,UA
+1541367552,1541367807,RU
1541367808,1541368063,GR
1541368064,1541368319,RU
1541368320,1541368575,IL
@@ -36227,7 +38115,6 @@
1541372416,1541372671,UA
1541372672,1541373183,NL
1541373184,1541373439,FR
-1541373440,1541373695,GB
1541373696,1541373951,UA
1541373952,1541374207,RU
1541374208,1541374463,DE
@@ -37080,7 +38967,6 @@
1541875712,1541876735,UA
1541876736,1541877247,PL
1541877248,1541877503,GB
-1541877504,1541877759,RU
1541877760,1541878783,SA
1541878784,1541879295,PL
1541879296,1541879807,UA
@@ -37331,7 +39217,7 @@
1542032384,1542032639,UA
1542032640,1542032895,SA
1542032896,1542033407,DK
-1542033408,1542034943,RU
+1542033408,1542035199,RU
1542035200,1542035455,UA
1542035456,1542036479,GB
1542036480,1542038271,PL
@@ -37520,7 +39406,10 @@
1542156288,1542156543,RU
1542156544,1542156799,RO
1542156800,1542157311,DE
-1542157312,1542158335,AZ
+1542157312,1542157567,RO
+1542157568,1542157823,IE
+1542157824,1542158079,AZ
+1542158080,1542158335,RU
1542158336,1542158847,IT
1542158848,1542159359,RO
1542159360,1542160127,PL
@@ -37676,7 +39565,6 @@
1542246144,1542246911,SE
1542246912,1542247423,DK
1542247424,1542247679,SE
-1542247680,1542247935,UA
1542247936,1542248447,NL
1542248448,1542249471,RO
1542249472,1542249727,RU
@@ -38040,7 +39928,7 @@
1542459392,1542459647,RU
1542459648,1542459903,GB
1542459904,1542460415,UA
-1542460416,1542461439,CZ
+1542460416,1542461439,LT
1542461440,1542461695,GB
1542461696,1542461951,RU
1542461952,1542462207,TR
@@ -38472,7 +40360,9 @@
1546280960,1546283007,IT
1546283008,1546283463,DE
1546283464,1546283471,FR
-1546283472,1546283827,DE
+1546283472,1546283521,DE
+1546283522,1546283523,FR
+1546283524,1546283827,DE
1546283828,1546283835,FR
1546283836,1546284287,DE
1546284288,1546284291,FR
@@ -38500,10 +40390,7 @@
1546319872,1546321919,RS
1546321920,1546323967,RU
1546323968,1546326015,NO
-1546326016,1546326655,ES
-1546326656,1546327015,DE
-1546327016,1546328039,ES
-1546328040,1546328063,DE
+1546326016,1546328063,GB
1546328064,1546330111,CZ
1546330112,1546332159,SE
1546332160,1546334207,GB
@@ -38611,8 +40498,7 @@
1547542528,1547546623,FR
1547546624,1547550719,IR
1547550720,1547554815,IE
-1547554816,1547555078,AT
-1547555080,1547558911,AT
+1547554816,1547558911,AT
1547558912,1547563007,IL
1547563008,1547564031,NL
1547564032,1547564287,GB
@@ -38673,8 +40559,8 @@
1547649024,1547653119,RU
1547653120,1547657215,LV
1547657216,1547661311,RU
-1547661312,1547663359,LV
-1547663360,1547665407,ES
+1547661312,1547662335,LV
+1547662336,1547665407,ES
1547665408,1547669503,GB
1547669504,1547673599,AT
1547673600,1547677695,NL
@@ -38694,8 +40580,7 @@
1548159232,1548159235,ES
1548159236,1548159487,NL
1548159488,1548159999,GB
-1548160000,1548160257,NL
-1548160260,1548160567,NL
+1548160000,1548160567,NL
1548160568,1548160575,DE
1548160576,1548160607,NL
1548160608,1548160639,GB
@@ -38736,7 +40621,7 @@
1550319616,1550581759,CH
1550581760,1550843903,NL
1550843904,1550974975,UA
-1550974976,1550975231,BG
+1550974976,1550975231,NL
1550975232,1550975999,RO
1550976000,1550976255,EG
1550976256,1550976767,RO
@@ -38797,8 +40682,7 @@
1555628032,1555824639,ES
1555824640,1555890175,FR
1555890176,1556086783,ES
-1556086784,1556491204,DE
-1556491206,1557069823,DE
+1556086784,1557069823,DE
1557069824,1557135359,GB
1557135360,1557313279,DE
1557313280,1557313535,US
@@ -38884,28 +40768,35 @@
1558129152,1558129407,RU
1558129408,1558129663,LU
1558129664,1558130687,US
-1558130688,1558131199,AU
-1558131200,1558135551,LU
+1558130688,1558132735,LU
+1558132736,1558133247,US
+1558133248,1558133759,LU
+1558133760,1558134015,RU
+1558134016,1558134271,KR
+1558134272,1558135295,JP
+1558135296,1558135551,US
1558135552,1558135552,RU
-1558135553,1558136575,LU
+1558135553,1558135807,LU
+1558135808,1558136319,US
+1558136320,1558136575,LU
1558136576,1558136831,DE
1558136832,1558137087,RU
1558137088,1558137343,KR
1558137344,1558137855,CZ
-1558137856,1558138367,LU
-1558138368,1558138879,AU
+1558137856,1558138879,LU
1558138880,1558139135,RU
1558139136,1558139391,NL
-1558139392,1558139903,US
+1558139392,1558139647,US
+1558139648,1558139903,LU
1558139904,1558140159,DE
1558140160,1558140415,RU
-1558140416,1558140671,SG
+1558140416,1558140671,LU
1558140672,1558140927,RU
1558140928,1558141183,LU
1558141184,1558141184,CY
1558141185,1558141439,LU
1558141440,1558141695,CY
-1558141696,1558141951,RU
+1558141696,1558141951,LU
1558141952,1558142463,PL
1558142464,1558142719,US
1558142720,1558142975,SG
@@ -39053,9 +40944,7 @@
1565294592,1565302783,PT
1565302784,1565368319,UA
1565368320,1565376511,RU
-1565376512,1565485055,UA
-1565485056,1565487103,BG
-1565487104,1565523967,UA
+1565376512,1565523967,UA
1565523968,1565655039,RU
1565655040,1565786111,AT
1565786112,1565917183,BY
@@ -39067,7 +40956,9 @@
1566048256,1566052351,RU
1566056448,1566060543,IT
1566060544,1566064639,UA
-1566064640,1566068735,RU
+1566064640,1566067199,RU
+1566067200,1566067711,NL
+1566067712,1566068735,RU
1566068736,1566072831,AZ
1566072832,1566081023,IT
1566081024,1566085119,RU
@@ -39192,9 +41083,7 @@
1566401664,1566401695,SG
1566401696,1566401727,NO
1566401728,1566401759,AU
-1566401760,1566401887,NO
-1566401920,1566402143,NO
-1566402176,1566402303,NO
+1566401760,1566402303,NO
1566402304,1566402559,SG
1566404608,1566406655,ES
1566406656,1566408703,NL
@@ -39219,6 +41108,7 @@
1566452035,1566452035,DE
1566452036,1566452036,BE
1566452037,1566452037,ES
+1566452038,1566452038,IL
1566452039,1566452039,AT
1566452040,1566452042,IL
1566452043,1566452043,NL
@@ -39226,6 +41116,7 @@
1566452046,1566452046,SE
1566452047,1566452047,CH
1566452048,1566452049,DK
+1566452050,1566452050,IL
1566452051,1566452051,IE
1566452052,1566452052,CH
1566452053,1566452053,GB
@@ -39311,7 +41202,7 @@
1567692800,1567696383,RO
1567696384,1567696895,MD
1567696896,1567698175,RO
-1567698176,1567698431,NL
+1567698176,1567698431,SE
1567698432,1567698943,RO
1567698944,1567699967,ES
1567699968,1567702015,RO
@@ -39345,7 +41236,8 @@
1567729664,1567739391,RO
1567739392,1567739903,FR
1567739904,1567740927,DE
-1567740928,1567742975,RO
+1567740928,1567741951,RO
+1567741952,1567742975,GR
1567742976,1567743487,MD
1567743488,1567743999,RO
1567744000,1567748095,IR
@@ -39356,9 +41248,7 @@
1567751168,1567752191,RO
1567752192,1567756287,MD
1567756288,1567760383,IR
-1567760384,1567763521,RO
-1567763523,1567763542,RO
-1567763544,1567765247,RO
+1567760384,1567765247,RO
1567765248,1567766271,GB
1567766272,1567767039,RO
1567767040,1567767551,GB
@@ -39386,7 +41276,8 @@
1567799296,1567799467,GB
1567799468,1567799468,RO
1567799469,1567799807,GB
-1567799808,1567803391,RO
+1567799808,1567802367,RO
+1567802368,1567803391,GR
1567803392,1567805439,ES
1567805440,1567807487,SY
1567807488,1567809535,RO
@@ -39416,8 +41307,7 @@
1567833600,1567834111,IT
1567834112,1567837183,RO
1567837184,1567838207,TR
-1567838208,1567838719,RO
-1567839744,1567840255,RO
+1567838208,1567840255,RO
1567840256,1567841279,DE
1567841280,1567842303,RO
1567842304,1567842815,FR
@@ -39427,7 +41317,7 @@
1567846144,1567846399,GB
1567846400,1567848447,RO
1567848448,1567850495,IR
-1567850496,1567852543,RO
+1567850496,1567852543,ES
1567852544,1567854591,MD
1567854592,1567856639,IR
1567856640,1567857407,RO
@@ -39456,7 +41346,7 @@
1567961088,1567965183,MD
1567965184,1567966207,RO
1567966208,1567969279,MD
-1567969280,1567973375,RO
+1567969280,1567973375,ES
1567973376,1567981567,IR
1567981568,1567983871,MD
1567983872,1567984127,GB
@@ -39713,7 +41603,7 @@
1571522816,1571523583,CZ
1571523584,1571526655,RU
1571526656,1571526911,UA
-1571526912,1571527167,CZ
+1571526912,1571527167,KZ
1571527168,1571527679,SK
1571527680,1571528191,RU
1571528192,1571528703,UA
@@ -39730,8 +41620,8 @@
1571534080,1571534847,RU
1571534848,1571535103,LV
1571535104,1571535359,UA
-1571535360,1571540223,RU
-1571540224,1571540693,CZ
+1571535360,1571540479,RU
+1571540480,1571540693,CZ
1571540694,1571540695,RU
1571540696,1571540696,CZ
1571540697,1571540697,RU
@@ -39809,8 +41699,7 @@
1571748608,1571748863,GB
1571748864,1571749119,US
1571749120,1571749375,SG
-1571749376,1571749631,GB
-1571749632,1571749887,SG
+1571749376,1571749887,GB
1571749888,1571758079,RU
1571758080,1571766271,IL
1571766272,1571786751,PL
@@ -40002,7 +41891,11 @@
1572673536,1572675583,AT
1572675584,1572677631,ES
1572677632,1572681727,RU
-1572681728,1572683775,NL
+1572681728,1572682751,NL
+1572682752,1572683007,DE
+1572683008,1572683263,NL
+1572683264,1572683519,DE
+1572683520,1572683775,RU
1572683776,1572685823,CH
1572685824,1572689919,RU
1572689920,1572691967,ES
@@ -40041,7 +41934,7 @@
1572765696,1572767743,CZ
1572767744,1572769791,NL
1572769792,1572771839,RO
-1572772096,1572773887,ES
+1572771840,1572773887,ES
1572773888,1572775935,RS
1572775936,1572777983,GB
1572777984,1572780031,UA
@@ -40140,7 +42033,9 @@
1578591696,1578591699,ES
1578591700,1578591791,FR
1578591792,1578591795,ES
-1578591796,1578592071,FR
+1578591796,1578591999,FR
+1578592000,1578592031,DE
+1578592032,1578592071,FR
1578592072,1578592079,ES
1578592080,1578592111,FR
1578592112,1578592127,ES
@@ -40155,7 +42050,9 @@
1578592424,1578592431,IE
1578592432,1578592539,FR
1578592540,1578592543,ES
-1578592544,1578593023,FR
+1578592544,1578592803,FR
+1578592804,1578592807,PL
+1578592808,1578593023,FR
1578593024,1578593279,DE
1578593280,1578593319,FR
1578593320,1578593323,PT
@@ -40173,7 +42070,9 @@
1578594056,1578594059,ES
1578594060,1578594063,FR
1578594064,1578594079,PL
-1578594080,1578594307,FR
+1578594080,1578594271,FR
+1578594272,1578594303,BE
+1578594304,1578594307,FR
1578594308,1578594311,FI
1578594312,1578594351,FR
1578594352,1578594355,GB
@@ -40181,11 +42080,15 @@
1578594480,1578594495,ES
1578594496,1578594559,FR
1578594560,1578594815,ES
-1578594816,1578595039,FR
+1578594816,1578594879,FR
+1578594880,1578594895,DE
+1578594896,1578595039,FR
1578595040,1578595055,GB
1578595056,1578595103,FR
1578595104,1578595119,GB
-1578595120,1578595151,FR
+1578595120,1578595127,FR
+1578595128,1578595131,PL
+1578595132,1578595151,FR
1578595152,1578595167,ES
1578595168,1578595275,FR
1578595276,1578595279,ES
@@ -40196,11 +42099,15 @@
1578595456,1578595471,FR
1578595472,1578595479,ES
1578595480,1578595487,GB
-1578595488,1578595643,FR
+1578595488,1578595535,FR
+1578595536,1578595543,LT
+1578595544,1578595643,FR
1578595644,1578595647,GB
1578595648,1578595711,FR
1578595712,1578595743,GB
-1578595744,1578595807,FR
+1578595744,1578595763,FR
+1578595764,1578595767,DE
+1578595768,1578595807,FR
1578595808,1578595823,ES
1578595824,1578595987,FR
1578595988,1578595991,ES
@@ -40218,7 +42125,9 @@
1578602496,1578604543,NL
1578604544,1578605014,RU
1578605015,1578605015,GB
-1578605016,1578606591,RU
+1578605016,1578605258,RU
+1578605259,1578605259,GB
+1578605260,1578606591,RU
1578606592,1578608639,DE
1578608640,1578610687,CZ
1578610688,1578611039,FR
@@ -40229,7 +42138,9 @@
1578611184,1578611191,ES
1578611192,1578611295,FR
1578611296,1578611303,GB
-1578611304,1578611871,FR
+1578611304,1578611423,FR
+1578611424,1578611439,CZ
+1578611440,1578611871,FR
1578611872,1578611887,GB
1578611888,1578611967,FR
1578611968,1578611971,DE
@@ -40237,9 +42148,13 @@
1578611980,1578611983,DE
1578611984,1578612059,FR
1578612060,1578612063,ES
-1578612064,1578612391,FR
+1578612064,1578612319,FR
+1578612320,1578612351,IT
+1578612352,1578612391,FR
1578612392,1578612395,GB
-1578612396,1578612907,FR
+1578612396,1578612495,FR
+1578612496,1578612499,DE
+1578612500,1578612907,FR
1578612908,1578612911,ES
1578612912,1578613436,FR
1578613437,1578613437,ES
@@ -40273,9 +42188,15 @@
1578615916,1578615916,GB
1578615917,1578631167,FR
1578631168,1578637311,IR
-1578637312,1578651647,RO
+1578637312,1578638847,RO
+1578638848,1578639359,US
+1578639360,1578647551,RO
+1578647552,1578649599,US
+1578649600,1578651647,RO
1578651648,1578657791,IR
-1578657792,1578659839,RO
+1578657792,1578658815,RO
+1578658816,1578659327,US
+1578659328,1578659839,RO
1578659840,1578663935,ES
1578663936,1578762239,RU
1578762240,1578795007,BG
@@ -40309,7 +42230,9 @@
1580081152,1580083199,TR
1580083200,1580087565,US
1580087566,1580087566,SE
-1580087567,1580089102,US
+1580087567,1580087807,US
+1580087808,1580088063,BE
+1580088064,1580089102,US
1580089103,1580089103,SE
1580089104,1580089343,US
1580089344,1580097535,DE
@@ -40325,7 +42248,9 @@
1580109056,1580109567,PT
1580109568,1580109823,SE
1580109824,1580113919,US
-1580113920,1580121087,PT
+1580113920,1580120063,PT
+1580120064,1580120319,GB
+1580120320,1580121087,PT
1580121088,1580122111,NL
1580122112,1580123135,GB
1580123136,1580125183,CY
@@ -40463,9 +42388,7 @@
1583782432,1583782439,IT
1583782440,1583782975,GB
1583782976,1583782983,IT
-1583782984,1583783775,GB
-1583783776,1583783783,IT
-1583783784,1583783935,GB
+1583782984,1583783935,GB
1583788032,1583792127,TM
1583792128,1583796223,IE
1583796224,1583800319,DE
@@ -40586,7 +42509,8 @@
1585317888,1585319935,IT
1585319936,1585321983,CH
1585321984,1585324031,RU
-1585324032,1585326079,NL
+1585324032,1585324799,IE
+1585324800,1585326079,NL
1585326080,1585328127,GB
1585328128,1585330175,BE
1585330176,1585332223,IT
@@ -40680,8 +42604,8 @@
1586233344,1586241535,FR
1586241536,1586249727,SE
1586249728,1586257919,SI
-1586257920,1586264063,SE
-1586264064,1586265087,LV
+1586257920,1586263039,SE
+1586263040,1586265087,LV
1586265088,1586266111,SE
1586266112,1586274303,RU
1586274304,1586282495,BE
@@ -40826,10 +42750,14 @@
1588663808,1588664063,GB
1588664064,1588664319,RO
1588664320,1588664575,TH
-1588664576,1588665087,RO
+1588664576,1588664831,EE
+1588664832,1588665087,RO
1588665088,1588665343,GB
1588665344,1588673535,RO
-1588673536,1588674559,BG
+1588673536,1588673791,NL
+1588673792,1588674047,FR
+1588674048,1588674303,IE
+1588674304,1588674559,NL
1588674560,1588674815,RO
1588674816,1588675071,US
1588675072,1588675583,RO
@@ -40886,7 +42814,9 @@
1589561344,1589563391,NL
1589563392,1589569535,HK
1589569536,1589573631,BG
-1589573632,1589574655,US
+1589573632,1589574143,US
+1589574144,1589574399,CA
+1589574400,1589574655,US
1589574656,1589575679,BG
1589575680,1589608447,RU
1589608448,1589616639,SE
@@ -41090,14 +43020,23 @@
1593114624,1593131007,SE
1593131008,1593131023,CH
1593131024,1593131039,SE
-1593131040,1593134079,GB
-1593134080,1593134591,AT
-1593134592,1593135359,GB
+1593131040,1593131263,GB
+1593131264,1593132031,CH
+1593132032,1593132287,GB
+1593132288,1593132543,AT
+1593132544,1593132799,FR
+1593132800,1593133055,GB
+1593133056,1593133311,FR
+1593133312,1593133567,GB
+1593133568,1593133823,FR
+1593133824,1593134591,AT
+1593134592,1593135103,SE
+1593135104,1593135359,GB
1593135360,1593135615,IE
1593135616,1593136639,GB
1593136640,1593139199,IE
1593139200,1593140223,NL
-1593140224,1593147135,IE
+1593140224,1593147391,IE
1593147392,1593163775,RU
1593163776,1593180159,AT
1593180160,1593196543,NO
@@ -41212,7 +43151,9 @@
1596862208,1596866559,RU
1596866560,1596868607,UZ
1596868608,1596869631,RU
-1596869632,1596870655,UA
+1596869632,1596869887,UA
+1596869888,1596870143,RU
+1596870144,1596870655,UA
1596870656,1596873215,RU
1596873216,1596873471,UZ
1596873472,1596873727,RU
@@ -41284,8 +43225,8 @@
1596950784,1596951551,CZ
1596951552,1596951807,RU
1596951808,1596952063,NL
-1596952064,1596952575,UA
-1596952576,1596953087,RU
+1596952064,1596952831,UA
+1596952832,1596953087,RU
1596953088,1596953599,CZ
1596953600,1596954623,UA
1596954624,1596954879,RU
@@ -41351,8 +43292,7 @@
1599160320,1599176703,IR
1599176704,1599188991,FR
1599188992,1599189503,DE
-1599189504,1599190015,FR
-1599190272,1599190797,FR
+1599189504,1599190797,FR
1599190798,1599190798,DE
1599190799,1599190807,FR
1599190808,1599190815,DE
@@ -41751,9 +43691,7 @@
1605083136,1605091327,BE
1605091328,1605099519,PL
1605099520,1605107711,RU
-1605107712,1605109351,GB
-1605109352,1605109359,IT
-1605109360,1605109495,GB
+1605107712,1605109495,GB
1605109496,1605109503,IT
1605109504,1605110303,GB
1605110304,1605110311,IT
@@ -41763,9 +43701,7 @@
1605110928,1605110935,IT
1605110936,1605111023,GB
1605111024,1605111031,IT
-1605111032,1605111199,GB
-1605111200,1605111207,IT
-1605111208,1605111279,GB
+1605111032,1605111279,GB
1605111280,1605111287,IT
1605111288,1605111903,GB
1605111904,1605111911,IT
@@ -41777,9 +43713,7 @@
1605113408,1605113415,IT
1605113416,1605113567,GB
1605113568,1605113583,IT
-1605113584,1605114167,GB
-1605114168,1605114175,IT
-1605114176,1605114215,GB
+1605113584,1605114215,GB
1605114216,1605114223,IT
1605114224,1605114287,GB
1605114288,1605114295,IT
@@ -41789,9 +43723,7 @@
1605115008,1605115015,IT
1605115016,1605115191,GB
1605115192,1605115199,IT
-1605115200,1605115415,GB
-1605115416,1605115423,IT
-1605115424,1605115903,GB
+1605115200,1605115903,GB
1605115904,1605124095,RU
1605124096,1605125263,GB
1605125264,1605125275,DE
@@ -41991,8 +43923,8 @@
1608515584,1610612735,IT
1610612736,1610678271,US
1610678272,1610743807,CA
-1610743808,1611005951,US
-1611005952,1611007999,NL
+1610743808,1611006975,US
+1611006976,1611007999,NL
1611008000,1611009023,US
1611009024,1611010047,NL
1611010048,1611036671,US
@@ -42007,9 +43939,7 @@
1611087872,1611091967,NL
1611091968,1611112447,US
1611112448,1611117567,NL
-1611117568,1611128831,US
-1611128832,1611130879,NL
-1611130880,1611218943,US
+1611117568,1611218943,US
1611218944,1611227135,KH
1611227136,1611235327,CA
1611235328,1611243519,OM
@@ -42039,7 +43969,7 @@
1613504512,1613529087,CA
1613529088,1613545471,US
1613545472,1613565951,CA
-1613565952,1613584639,US
+1613570048,1613584639,US
1613584640,1613584895,HK
1613584896,1613585407,US
1613585408,1613585663,DE
@@ -42058,8 +43988,7 @@
1613676544,1613680639,CA
1613680640,1613737983,US
1613737984,1613742079,CA
-1613742080,1613750803,US
-1613750805,1613758463,US
+1613742080,1613758463,US
1613758464,1614282751,CA
1614282752,1614741503,US
1614741504,1614757887,CA
@@ -42069,9 +43998,7 @@
1618837504,1618841599,CA
1618841600,1618845695,DE
1618845696,1618849791,US
-1618849792,1618850303,CA
-1618850304,1618850559,US
-1618850560,1618862079,CA
+1618849792,1618862079,CA
1618862080,1618866175,US
1618866176,1618870271,CA
1618870272,1618984959,US
@@ -42277,10 +44204,14 @@
1710972672,1710972927,TW
1710972928,1711210495,CN
1711210496,1711276031,ID
+1723138048,1723195391,SD
+1723195392,1723203583,CI
1723203584,1723269119,ZA
+1723269120,1723334655,LR
1723334656,1723858943,EG
1724715556,1724715556,MU
1727004672,1727266815,TN
+1727266816,1727528959,CM
1727528960,1728053247,ZA
1728053248,1728120063,AU
1728120064,1728120319,SG
@@ -42433,10 +44364,7 @@
1728346112,1728346367,AU
1728346368,1728346623,NZ
1728346624,1728347135,AU
-1728347136,1728347147,SG
-1728347149,1728347416,SG
-1728347418,1728347421,SG
-1728347423,1728348159,SG
+1728347136,1728348159,SG
1728348160,1728349183,VN
1728349184,1728350207,AU
1728350208,1728351231,NZ
@@ -42586,7 +44514,6 @@
1728476160,1728476415,AU
1728476416,1728476927,ID
1728476928,1728477183,IN
-1728477184,1728478207,CN
1728479232,1728480255,HK
1728480256,1728481279,IN
1728481280,1728483327,HK
@@ -42626,7 +44553,8 @@
1728512000,1728512511,ID
1728512512,1728512767,SG
1728512768,1728513023,IN
-1728513024,1728514047,CN
+1728513024,1728513279,CN
+1728513280,1728514047,HK
1728514048,1728515071,SG
1728515072,1728516095,ID
1728516096,1728517119,TH
@@ -42655,7 +44583,6 @@
1728539648,1728540671,IN
1728540672,1728541695,BD
1728541696,1728542719,JP
-1728542720,1728543743,CN
1728543744,1728544767,SG
1728544768,1728545791,IN
1728545792,1728546815,JP
@@ -42884,8 +44811,7 @@
1728761856,1728762879,IN
1728762880,1728763903,VN
1728763904,1728764927,KR
-1728764928,1728764938,SG
-1728764940,1728765439,SG
+1728764928,1728765439,SG
1728765440,1728765695,IN
1728765696,1728765951,ID
1728765952,1728766975,IN
@@ -43109,10 +45035,10 @@
1728961536,1728962559,CN
1728962560,1728963583,BD
1728963584,1728964607,TH
-1728964608,1728965631,HK
1728965632,1728966655,BD
1728966656,1728966911,HK
-1728966912,1728967679,IN
+1728966912,1728967423,IN
+1728967424,1728967679,HK
1728967680,1728968703,CN
1728968704,1728970751,JP
1728970752,1728971007,IN
@@ -43122,8 +45048,9 @@
1728971776,1728972799,AU
1728972800,1728973823,TH
1728973824,1728974847,JP
-1728974848,1728976383,ID
+1728974848,1728976393,ID
1728976394,1728976394,AU
+1728976395,1728976895,ID
1728976896,1728977151,TH
1728977152,1728977407,AU
1728977408,1728977919,BD
@@ -43367,7 +45294,8 @@
1729187584,1729187839,ID
1729187840,1729189887,IN
1729189888,1729190911,VN
-1729190912,1729191935,HK
+1729190912,1729191679,HK
+1729191680,1729191935,TW
1729191936,1729195007,IN
1729195008,1729195519,MN
1729195520,1729196031,IN
@@ -43691,11 +45619,11 @@
1729545216,1729546239,AU
1729546240,1729546495,JP
1729546496,1729546751,US
-1729546752,1729547263,HK
+1729546752,1729547007,NZ
+1729547008,1729547263,HK
1729547264,1729548287,ID
1729548288,1729549311,AU
1729549312,1729550335,TW
-1729550336,1729551359,MY
1729551360,1729552383,KR
1729552384,1729553407,AU
1729553408,1729554431,CN
@@ -43803,7 +45731,6 @@
1729643520,1729644543,JP
1729644544,1729645823,ID
1729645824,1729646079,SG
-1729646080,1729646591,PG
1729646592,1729649663,IN
1729649664,1729650687,HK
1729650688,1729651711,PK
@@ -43906,7 +45833,8 @@
1729753088,1729754111,TH
1729754112,1729755135,NZ
1729755136,1729756159,BD
-1729756160,1729757183,HK
+1729756160,1729756415,HK
+1729756416,1729757183,JP
1729757184,1729758207,CN
1729758208,1729759231,ID
1729759232,1729760255,IN
@@ -44019,8 +45947,7 @@
1729860608,1729861631,KR
1729861632,1729862655,AU
1729862656,1729863679,JP
-1729863680,1729864319,AU
-1729864448,1729864703,AU
+1729863680,1729864703,AU
1729864704,1729866751,IN
1729866752,1729867775,AU
1729867776,1729869823,HK
@@ -44123,7 +46050,6 @@
1729952256,1729952511,AU
1729952512,1729952767,NZ
1729952768,1729953791,IN
-1729953792,1729954815,CN
1729954816,1729955839,ID
1729956864,1729957887,HK
1729957888,1729958911,CN
@@ -44137,7 +46063,6 @@
1729966080,1729967103,JP
1729967104,1729968127,AU
1729968128,1729969151,MY
-1729969152,1729970175,LK
1729970176,1729971199,AU
1729971200,1729972223,JP
1729972224,1729973247,HK
@@ -44467,8 +46392,7 @@
1730545920,1730546687,AU
1730546688,1730547711,IN
1730547712,1730548735,BD
-1730548736,1730548991,MY
-1730548992,1730549759,ID
+1730548736,1730549759,ID
1730549760,1730550783,KR
1730550784,1730551807,HK
1730551808,1730552831,CN
@@ -44795,7 +46719,9 @@
1730951168,1730952191,CN
1730952192,1730954239,HK
1730954240,1730955263,SG
-1730955264,1730957311,BD
+1730955264,1730956031,BD
+1730956032,1730956287,NL
+1730956288,1730957311,BD
1730957312,1730958335,CN
1730958336,1730959359,JP
1730959360,1730960383,CN
@@ -44885,7 +46811,7 @@
1731146752,1731148799,IN
1731148800,1731149055,ID
1731149056,1731149311,HK
-1731149312,1731149823,AU
+1731149312,1731149823,US
1731149824,1731152895,IN
1731152896,1731153407,SG
1731153408,1731153919,IN
@@ -44901,7 +46827,8 @@
1731163136,1731165183,CN
1731165184,1731166207,IN
1731167232,1731168255,ID
-1731168256,1731170559,CN
+1731168256,1731170303,CN
+1731170304,1731170559,AU
1731170560,1731170687,HK
1731170688,1731170815,MY
1731170816,1731171071,AU
@@ -45046,7 +46973,8 @@
1731320832,1731321855,ID
1731321856,1731322879,IN
1731322880,1731323903,ID
-1731323904,1731327487,IN
+1731323904,1731324927,IN
+1731325440,1731327487,IN
1731327488,1731327999,HK
1731328000,1731329023,CN
1731329024,1731330047,IN
@@ -45206,6 +47134,7 @@
1731523584,1731526655,IN
1731526656,1731527679,ID
1731527680,1731528703,CN
+1731528704,1731529727,HK
1731529728,1731530751,JP
1731530752,1731531775,AF
1731531776,1731532031,ID
@@ -45295,7 +47224,8 @@
1731631104,1731632127,SG
1731632128,1731633151,JP
1731633152,1731635199,CN
-1731635200,1731636223,IN
+1731635200,1731635711,IN
+1731635968,1731636223,IN
1731636224,1731636479,ID
1731636480,1731637247,IN
1731638272,1731639295,IN
@@ -45331,7 +47261,9 @@
1731666688,1731666943,KR
1731666944,1731667967,ID
1731667968,1731668991,IN
-1731668992,1731670015,AU
+1731668992,1731669927,AU
+1731669928,1731669928,CC
+1731669929,1731670015,AU
1731670016,1731671039,TL
1731671040,1731671551,AU
1731671552,1731672063,TH
@@ -45368,7 +47300,6 @@
1731699712,1731701759,IN
1731701760,1731702783,CN
1731702784,1731703295,AU
-1731703296,1731703551,AF
1731703552,1731703807,NZ
1731703808,1731705855,IN
1731705856,1731706879,KR
@@ -45382,7 +47313,6 @@
1731713536,1731713791,HK
1731713792,1731714047,AU
1731714048,1731715071,ID
-1731715072,1731716095,AU
1731716096,1731717119,CN
1731717120,1731718143,AU
1731718144,1731720191,CN
@@ -45465,7 +47395,7 @@
1731812352,1731813375,MN
1731813376,1731815423,JP
1731815424,1731816447,VN
-1731816448,1731817471,CN
+1731816448,1731817471,HK
1731817472,1731818495,VN
1731818496,1731820543,BD
1731820544,1731821567,IN
@@ -45479,8 +47409,8 @@
1731827712,1731828735,PK
1731828736,1731829759,SG
1731829760,1731830783,IN
-1731830784,1731831551,SG
-1731831552,1731831807,AU
+1731830784,1731831039,SG
+1731831040,1731831807,AU
1731831808,1731832831,PK
1731832832,1731836927,IN
1731836928,1731837951,MY
@@ -45613,7 +47543,6 @@
1732032512,1732032767,PH
1732032768,1732033023,TH
1732033024,1732033535,IN
-1732033536,1732034559,JP
1732034560,1732035583,KR
1732035584,1732036607,IN
1732036608,1732037631,AU
@@ -45770,15 +47699,12 @@
1732318208,1732318719,IN
1732318720,1732318975,AU
1732318976,1732322303,IN
-1732322304,1732322815,CN
-1732322816,1732323327,HK
-1732323328,1732323839,CN
-1732323840,1732324351,HK
+1732322304,1732324351,CN
1732324352,1732325375,JP
1732325376,1732337663,CN
1732337664,1732338175,ID
1732338176,1732338687,HK
-1732338688,1732348927,CN
+1732338688,1732342783,CN
1732348928,1732349951,IN
1732349952,1732358143,CN
1732358144,1732359167,MY
@@ -45877,7 +47803,7 @@
1732452352,1732452863,US
1732452864,1732453375,IN
1732453376,1732454399,MY
-1732454400,1732483071,CN
+1732468736,1732483071,CN
1732483072,1732483839,IN
1732483840,1732484095,AU
1732484096,1732485119,BD
@@ -45935,9 +47861,7 @@
1732538112,1732538367,LT
1732538368,1732539391,IN
1732539392,1732540415,BD
-1732540416,1732540671,US
-1732540672,1732540927,NZ
-1732540928,1732541439,US
+1732540416,1732541439,US
1732541440,1732541695,AU
1732541696,1732542463,SG
1732542464,1732543487,CN
@@ -45991,7 +47915,7 @@
1732604928,1732605951,CN
1732605952,1732606975,HK
1732606976,1732607999,NP
-1732608000,1732608511,HK
+1732608000,1732608255,HK
1732608512,1732609023,SG
1732609024,1732610047,CN
1732610048,1732611071,HK
@@ -46277,7 +48201,7 @@
1732950016,1732952063,AU
1732952064,1732953087,HK
1732953088,1732954111,IN
-1732954112,1732954367,NZ
+1732954112,1732954367,PK
1732954368,1732954879,LT
1732954880,1732955135,NZ
1732955136,1732956159,CN
@@ -46286,7 +48210,7 @@
1732957696,1732958207,IN
1732958208,1732959231,AU
1732959232,1732960511,IN
-1732960512,1732961023,AU
+1732960768,1732961023,AU
1732961024,1732961279,IN
1732961280,1732962303,BD
1732962304,1732963327,CN
@@ -46315,7 +48239,7 @@
1732998144,1732998399,AU
1732998400,1732998655,HK
1732998656,1732998911,JP
-1732998912,1732999167,CA
+1732998912,1732999167,NZ
1732999168,1733000191,CN
1733000192,1733001215,IN
1733001216,1733002239,CN
@@ -46641,7 +48565,8 @@
1733328896,1733329151,AU
1733329152,1733329407,TH
1733329408,1733329919,IN
-1733329920,1733330943,HK
+1733329920,1733330431,HK
+1733330432,1733330943,KR
1733330944,1733331967,AU
1733331968,1733332991,PH
1733332992,1733334015,HK
@@ -46738,7 +48663,7 @@
1733424128,1733424383,AU
1733424384,1733424639,IN
1733424640,1733424895,ID
-1733424896,1733425151,HK
+1733424896,1733425151,US
1733425152,1733425663,ID
1733425664,1733427199,IN
1733427200,1733428223,GB
@@ -46814,8 +48739,7 @@
1733499904,1733500927,IN
1733500928,1733501439,PG
1733501440,1733501951,MM
-1733501952,1733502207,US
-1733502208,1733502975,IN
+1733501952,1733502975,US
1733502976,1733503999,PH
1733504000,1733505023,CN
1733505024,1733506047,ID
@@ -46902,7 +48826,7 @@
1733592320,1733592575,BD
1733592576,1733592831,MV
1733592832,1733593087,AU
-1733593088,1733594111,CN
+1733593088,1733594111,HK
1733594112,1733596159,ID
1733596160,1733597183,PK
1733597184,1733598207,US
@@ -46974,7 +48898,8 @@
1733663744,1733665791,BD
1733665792,1733669887,CN
1733669888,1733670911,IN
-1733670912,1733671679,SG
+1733670912,1733671423,SG
+1733671424,1733671679,HK
1733671680,1733671935,US
1733671936,1733672959,HK
1733672960,1733675007,BD
@@ -46991,7 +48916,7 @@
1733681152,1733682175,CN
1733682176,1733683199,IN
1733683200,1733686271,BD
-1733686272,1733687295,CN
+1733686272,1733687295,HK
1733687296,1733688319,AU
1733688320,1733689343,HK
1733689344,1733691391,IN
@@ -47003,7 +48928,7 @@
1733696512,1733698559,CN
1733698560,1733699583,PK
1733699584,1733700607,IN
-1733700608,1733701631,CN
+1733700608,1733701631,KR
1733701632,1733702655,TH
1733702656,1733703679,PK
1733703680,1733704191,NP
@@ -47151,7 +49076,7 @@
1733860096,1733860351,KH
1733860352,1733861887,IN
1733861888,1733862143,KH
-1733862144,1733862399,NC
+1733862144,1733862399,AU
1733862400,1733863423,CN
1733863424,1733864447,ID
1733864448,1733865471,IN
@@ -47412,7 +49337,8 @@
1734164480,1734165503,ID
1734165504,1734166527,AU
1734166528,1734167551,HK
-1734167552,1734168575,CN
+1734167552,1734167807,JP
+1734167808,1734168575,CN
1734168576,1734169343,AU
1734169344,1734169599,IN
1734169600,1734170623,CN
@@ -47482,6 +49408,232 @@
1734233088,1734234111,HK
1734234112,1734236159,IN
1734236160,1734237183,CN
+1734237184,1734238207,NZ
+1734238208,1734239231,ID
+1734239232,1734239743,IN
+1734239744,1734239999,PK
+1734240000,1734240255,HK
+1734240256,1734243327,IN
+1734243328,1734244351,CN
+1734244352,1734246399,ID
+1734246400,1734247423,BD
+1734247424,1734247935,ID
+1734247936,1734248447,BD
+1734248448,1734249471,IN
+1734249472,1734250495,JP
+1734250496,1734251519,MM
+1734251520,1734252543,HK
+1734252544,1734253823,AU
+1734253824,1734254079,HK
+1734254080,1734254591,NP
+1734254592,1734255615,CN
+1734255616,1734255871,ID
+1734255872,1734256127,AU
+1734256128,1734256639,IN
+1734256640,1734257663,ID
+1734257664,1734258687,IN
+1734258688,1734259711,VN
+1734259712,1734260735,CN
+1734260736,1734260991,HK
+1734260992,1734261247,IN
+1734261248,1734261503,PK
+1734261504,1734261759,IN
+1734261760,1734262783,ID
+1734262784,1734263807,IN
+1734263808,1734264831,BD
+1734264832,1734265855,CN
+1734265856,1734266623,IN
+1734266624,1734267903,AU
+1734267904,1734268415,ID
+1734268416,1734268927,HK
+1734268928,1734269951,BD
+1734269952,1734270975,NP
+1734270976,1734271999,SG
+1734272000,1734273023,JP
+1734273024,1734274047,HK
+1734274048,1734274559,IN
+1734274560,1734275071,ID
+1734275072,1734276095,IN
+1734276096,1734276607,PK
+1734276608,1734277119,BD
+1734277120,1734278143,AU
+1734278144,1734279167,NP
+1734279168,1734280191,AU
+1734280192,1734280703,PK
+1734280704,1734282239,ID
+1734282240,1734283263,IN
+1734283264,1734284287,NP
+1734284288,1734285311,BD
+1734285312,1734286335,LA
+1734286336,1734287359,CN
+1734287360,1734288383,MY
+1734288384,1734288639,IN
+1734288640,1734288895,MY
+1734288896,1734289151,BD
+1734289152,1734289407,AU
+1734289408,1734290431,ID
+1734290432,1734291455,TW
+1734291456,1734291711,IN
+1734291712,1734291967,ID
+1734291968,1734292479,IN
+1734292480,1734293503,CN
+1734293504,1734294527,HK
+1734294528,1734295551,NZ
+1734295552,1734297599,CN
+1734297600,1734298623,AU
+1734298624,1734298879,SG
+1734298880,1734299647,AU
+1734299648,1734301695,IN
+1734301696,1734303743,CN
+1734303744,1734304767,BD
+1734304768,1734305023,IN
+1734305024,1734305279,ID
+1734305280,1734305791,HK
+1734305792,1734306815,JP
+1734306816,1734307327,HK
+1734307328,1734308863,AU
+1734308864,1734309887,CN
+1734309888,1734310911,IN
+1734310912,1734311935,BD
+1734311936,1734312959,CN
+1734312960,1734313983,KH
+1734313984,1734317055,CN
+1734317056,1734318079,PH
+1734318080,1734319103,CN
+1734319104,1734320127,VN
+1734320128,1734320895,ID
+1734320896,1734321151,JP
+1734321152,1734322175,IN
+1734322176,1734323199,VN
+1734323200,1734324223,IN
+1734324224,1734325247,AU
+1734325248,1734327295,JP
+1734327296,1734328831,IN
+1734328832,1734329343,AU
+1734329344,1734330367,VN
+1734330368,1734331391,IN
+1734331392,1734331903,AU
+1734331904,1734332159,JP
+1734332160,1734332415,CN
+1734332416,1734333439,BD
+1734333440,1734333951,PH
+1734333952,1734334207,AU
+1734334208,1734334463,SG
+1734334464,1734337535,CN
+1734337536,1734338559,TH
+1734338560,1734339071,PH
+1734339072,1734339583,IN
+1734339584,1734344703,CN
+1734344704,1734345727,JP
+1734345728,1734346751,AU
+1734346752,1734347775,CN
+1734347776,1734349823,IN
+1734349824,1734352383,AU
+1734352384,1734352895,IN
+1734352896,1734353919,NP
+1734353920,1734354943,BD
+1734354944,1734359039,IN
+1734359040,1734360063,AU
+1734360064,1734361087,MO
+1734361088,1734362111,JP
+1734362112,1734363135,BD
+1734363136,1734364159,HK
+1734364160,1734365183,KH
+1734365184,1734366207,CN
+1734366208,1734367231,NZ
+1734367232,1734367487,AU
+1734367488,1734368255,BD
+1734368256,1734371327,IN
+1734371328,1734372351,BD
+1734372352,1734372863,SG
+1734372864,1734373119,NZ
+1734373120,1734373375,ID
+1734373376,1734374399,JP
+1734374400,1734374655,ID
+1734374656,1734374911,NZ
+1734374912,1734375423,ID
+1734375424,1734376447,HK
+1734376448,1734377471,CN
+1734377472,1734378495,HK
+1734378496,1734378751,AU
+1734378752,1734379007,IN
+1734379008,1734379519,PG
+1734379520,1734380799,CN
+1734380800,1734381055,AU
+1734381056,1734381567,IN
+1734381568,1734382591,AU
+1734382592,1734383615,HK
+1734383616,1734401023,CN
+1734401024,1734403327,IN
+1734403328,1734403583,JP
+1734403584,1734404351,MM
+1734404352,1734404607,AF
+1734404608,1734405119,BD
+1734405120,1734406655,IN
+1734406656,1734407167,MY
+1734407168,1734408191,NP
+1734408192,1734408447,MY
+1734408448,1734408703,AU
+1734408704,1734409215,IN
+1734409216,1734410239,JP
+1734410240,1734411263,HK
+1734411264,1734412287,ID
+1734412288,1734421503,CN
+1734421504,1734422015,BD
+1734422016,1734422527,IN
+1734422528,1734423551,TW
+1734423552,1734424575,AU
+1734424576,1734429695,CN
+1734429696,1734430719,ID
+1734430720,1734431743,CN
+1734431744,1734435839,IN
+1734435840,1734436607,ID
+1734436608,1734438399,IN
+1734438400,1734438655,MM
+1734438656,1734438911,ID
+1734438912,1734440959,CN
+1734440960,1734441983,BD
+1734441984,1734443007,VN
+1734443008,1734444031,CN
+1734444032,1734445055,VN
+1734445056,1734446079,IN
+1734446080,1734446591,ID
+1734446592,1734447103,MY
+1734447104,1734449151,CN
+1734449152,1734449407,MY
+1734449408,1734449663,IN
+1734449664,1734449919,PK
+1734449920,1734450175,AU
+1734450176,1734451199,TW
+1734451200,1734452223,BD
+1734452224,1734453247,IN
+1734453248,1734453759,PK
+1734453760,1734455039,AU
+1734455040,1734456319,HK
+1734456320,1734458367,IN
+1734458368,1734460415,CN
+1734460416,1734461439,IN
+1734461440,1734461951,HK
+1734461952,1734462207,ID
+1734462208,1734462463,IN
+1734462464,1734463487,BD
+1734463488,1734463999,JP
+1734464000,1734465791,IN
+1734465792,1734467583,AU
+1734467584,1734469119,CN
+1734469120,1734469375,AU
+1734469376,1734469631,IN
+1734469632,1734471679,JP
+1734471680,1734474239,IN
+1734474240,1734474495,US
+1734474496,1734474751,ID
+1734474752,1734475775,AU
+1734475776,1734476799,IN
+1734476800,1734477823,TH
+1734477824,1734478847,HK
+1734478848,1734479359,AU
+1734479872,1734480895,HK
+1734480896,1734481919,IN
1740636160,1740644351,CN
1740644352,1740645375,IN
1740645376,1740647423,HK
@@ -47550,9 +49702,8 @@
1740723200,1740731391,IN
1740731392,1740732415,ID
1740732416,1740733439,CN
-1740733440,1740734719,HK
-1740734720,1740735487,JP
-1740735488,1740736511,HK
+1740733440,1740733695,SG
+1740733696,1740736511,HK
1740736512,1740737535,NZ
1740737536,1740740607,CN
1740740608,1740742655,IN
@@ -47863,7 +50014,7 @@
1741128704,1741129727,JP
1741129728,1741130751,IN
1741131776,1741132799,IN
-1741132800,1741133823,HK
+1741132800,1741133823,MY
1741133824,1741134847,BD
1741134848,1741136895,IN
1741136896,1741137919,CN
@@ -47977,7 +50128,8 @@
1741411328,1741413375,CN
1741413376,1741413631,HK
1741413632,1741413887,SG
-1741413888,1741414399,HK
+1741413888,1741414143,JP
+1741414144,1741414399,HK
1741414400,1741423615,IN
1741423616,1741425663,MY
1741425664,1741425919,TH
@@ -47992,15 +50144,12 @@
1741438976,1741439999,JP
1741440000,1741440511,SG
1741440512,1741440767,IN
-1741440768,1741441023,AF
1741441024,1741442047,CN
1741442048,1741443071,HK
1741443072,1741445119,BD
1741445120,1741446143,CN
1741446144,1741447167,SG
-1741447168,1741447423,HK
-1741447424,1741447679,IN
-1741447680,1741448191,HK
+1741447168,1741448191,HK
1741448192,1741449215,MM
1741449216,1741450239,AU
1741450240,1741451263,HK
@@ -48134,7 +50283,7 @@
1741601792,1741602815,HK
1741602816,1741603839,MN
1741603840,1741604863,JP
-1741604864,1741605887,PH
+1741604864,1741605887,KH
1741605888,1741606911,TH
1741606912,1741607935,IN
1741607936,1741609983,VN
@@ -48254,7 +50403,6 @@
1741756416,1741756927,AU
1741756928,1741757439,IN
1741757440,1741758463,HK
-1741758464,1741759487,US
1741759488,1741760511,IN
1741760512,1741761535,HK
1741761536,1741762559,AU
@@ -48309,7 +50457,7 @@
1741806592,1741807615,IN
1741807616,1741808639,NZ
1741808640,1741809663,BD
-1741809664,1741810687,CN
+1741809664,1741810687,HK
1741810688,1741811711,JP
1741811712,1741812223,IN
1741812224,1741813759,AU
@@ -48409,7 +50557,10 @@
1741920256,1741921279,IN
1741921280,1741922303,CN
1741922304,1741923327,US
-1741923328,1741925375,CN
+1741923328,1741923583,TH
+1741923584,1741923839,CN
+1741923840,1741924095,TH
+1741924096,1741925375,CN
1741925376,1741925631,AU
1741925632,1741925887,HK
1741925888,1741926399,PH
@@ -48485,7 +50636,10 @@
1742001152,1742002175,IN
1742002176,1742003199,AU
1742003200,1742004223,KR
-1742004224,1742005247,NZ
+1742004224,1742004479,NZ
+1742004480,1742004991,AU
+1742004992,1742005247,NZ
+1742005248,1742006271,CN
1742006272,1742007039,ID
1742007040,1742007295,IN
1742007296,1742008319,ID
@@ -48541,7 +50695,7 @@
1742095360,1742095615,KR
1742095616,1742095871,US
1742095872,1742096127,LT
-1742096128,1742096383,MM
+1742096128,1742096383,AU
1742096384,1742097407,JP
1742097408,1742098431,NP
1742098432,1742099455,BD
@@ -48672,7 +50826,6 @@
1742257152,1742257407,ID
1742257408,1742257663,NZ
1742257664,1742258175,AU
-1742258176,1742259199,US
1742259200,1742260223,AU
1742260224,1742260735,IN
1742260736,1742261247,KR
@@ -48710,8 +50863,7 @@
1742338304,1742338559,IN
1742338560,1742339327,AU
1742339328,1742339583,SG
-1742339584,1742339839,NZ
-1742339840,1742340095,AU
+1742339584,1742340095,AU
1742340096,1742341119,CN
1742341120,1742342143,HK
1742342144,1742346239,CN
@@ -48779,7 +50931,6 @@
1742460416,1742460671,AU
1742460672,1742461951,IN
1742461952,1742462975,US
-1742462976,1742463999,BD
1742464000,1742465023,IN
1742465024,1742466047,BD
1742466048,1742466559,MY
@@ -49082,7 +51233,8 @@
1742971904,1742972927,SG
1742972928,1742973439,AU
1742973440,1742973951,NZ
-1742973952,1742975999,SG
+1742973952,1742974975,KH
+1742974976,1742975999,SG
1742976000,1742977023,AU
1742977024,1742978047,US
1742978048,1742979071,JP
@@ -49272,7 +51424,8 @@
1743158272,1743159295,MY
1743160320,1743161343,TH
1743161344,1743162367,HK
-1743162368,1743162879,BZ
+1743162368,1743162623,US
+1743162624,1743162879,AQ
1743162880,1743163135,KR
1743163136,1743163391,BZ
1743163392,1743166463,IN
@@ -49416,7 +51569,8 @@
1743307776,1743308799,AU
1743308800,1743309823,JP
1743309824,1743310335,NZ
-1743310336,1743311871,AU
+1743310336,1743310847,US
+1743310848,1743311871,AU
1743311872,1743312895,CN
1743312896,1743313663,AU
1743313664,1743313919,MY
@@ -49865,8 +52019,7 @@
1743870976,1743873023,CN
1743873024,1743874047,AU
1743874048,1743874303,JP
-1743874304,1743874433,SG
-1743874435,1743875071,SG
+1743874304,1743875071,SG
1743875072,1743876095,HK
1743876096,1743877119,IN
1743877120,1743878143,KR
@@ -49969,7 +52122,7 @@
1743981824,1743982079,SG
1743982080,1743982335,HK
1743982336,1743982591,SG
-1743982592,1743983615,AU
+1743982592,1743983359,AU
1743983616,1743984639,KR
1743984640,1743985663,HK
1743985664,1743990783,IN
@@ -50160,7 +52313,6 @@
1744189440,1744190463,KR
1744191488,1744192511,IN
1744192512,1744193535,JP
-1744193536,1744194559,CN
1744194560,1744194815,ID
1744194816,1744195071,HK
1744195072,1744195327,SG
@@ -50363,6 +52515,7 @@
1744376832,1744377855,VN
1744377856,1744378879,IN
1744378880,1744379903,KR
+1744379904,1744380671,IN
1744380672,1744380927,HK
1744380928,1744383999,IN
1744384000,1744384000,AU
@@ -50788,7 +52941,8 @@
1745410304,1745410463,PL
1745410464,1745410471,US
1745410472,1745410559,PL
-1745410560,1747191807,US
+1745410560,1745879039,US
+1746927616,1747191807,US
1747191808,1747193855,CA
1747193856,1747215359,US
1747215360,1747216383,CA
@@ -50799,7 +52953,7 @@
1747228672,1747235839,US
1747235840,1747236863,CA
1747236864,1747255807,US
-1747255808,1747256063,CN
+1747255808,1747256063,PR
1747256064,1747256319,US
1747256320,1747256575,IE
1747256576,1747256831,AU
@@ -51048,13 +53202,7 @@
1749449728,1749450239,NL
1749450240,1749465087,US
1749465088,1749465599,NL
-1749465600,1749476863,US
-1749476864,1749479423,NL
-1749479424,1749487615,US
-1749487616,1749491711,NL
-1749491712,1749495807,US
-1749495808,1749496319,NL
-1749496320,1749497855,US
+1749465600,1749497855,US
1749497856,1749499391,NL
1749499392,1749508095,US
1749508096,1749516287,NL
@@ -51096,17 +53244,17 @@
1749816832,1749818367,NL
1749818368,1749819391,US
1749819392,1749827583,NL
-1749827584,1749837823,US
-1749837824,1749838847,NL
-1749838848,1749862143,US
-1749862144,1749865727,NL
+1749827584,1749862143,US
+1749862144,1749864191,NL
+1749864192,1749864447,US
+1749864448,1749865727,NL
1749865728,1749865983,US
1749865984,1749866495,NL
1749866496,1749866751,US
1749866752,1749868287,NL
1749868288,1749901311,US
-1749901312,1749901823,NL
-1749901824,1749925887,US
+1749901312,1749901567,NL
+1749901568,1749925887,US
1749925888,1749926143,NL
1749926144,1749931007,US
1749931008,1749932031,NL
@@ -51131,8 +53279,8 @@
1750172672,1750174719,US
1750174720,1750175743,NL
1750175744,1750192127,US
-1750192128,1750203391,NL
-1750203392,1750221311,US
+1750192128,1750201855,NL
+1750201856,1750221311,US
1750221312,1750224383,NL
1750224384,1750224895,US
1750224896,1750252543,NL
@@ -51148,8 +53296,8 @@
1750323200,1750327295,NL
1750327296,1750350847,US
1750350848,1750351871,NL
-1750351872,1750368255,US
-1750368256,1750373375,NL
+1750351872,1750372351,US
+1750372352,1750373375,NL
1750373376,1750374399,US
1750374400,1750394367,NL
1750394368,1750395903,US
@@ -51167,14 +53315,18 @@
1750492672,1750493183,US
1750493184,1750494207,NL
1750494208,1750494719,US
-1750494720,1750514687,NL
-1750514688,1750515199,US
-1750515200,1750534655,NL
+1750494720,1750503423,NL
+1750503424,1750515199,US
+1750515200,1750515711,NL
+1750515712,1750523903,US
+1750523904,1750534655,NL
1750534656,1750536191,US
1750536192,1750544383,NL
1750544384,1750573055,US
-1750573056,1750597631,NL
-1750597632,1750664191,US
+1750573056,1750581247,NL
+1750581248,1750585343,US
+1750585344,1750593535,NL
+1750593536,1750664191,US
1750664192,1750665727,NL
1750665728,1750667263,US
1750667264,1750675455,NL
@@ -51185,15 +53337,17 @@
1750706688,1750708223,US
1750708224,1750716415,NL
1750716416,1750754815,US
-1750754816,1750778367,NL
+1750754816,1750757375,NL
+1750757376,1750761471,US
+1750761472,1750778367,NL
1750778368,1750781439,US
1750781440,1750781951,NL
1750781952,1750877695,US
1750877696,1750879231,NL
1750879232,1750880255,US
1750880256,1750888447,NL
-1750888448,1750917119,US
-1750917120,1750926847,NL
+1750888448,1750926335,US
+1750926336,1750926847,NL
1750926848,1750946303,US
1750946304,1750946815,NL
1750946816,1750977535,US
@@ -51226,10 +53380,8 @@
1751283200,1751284735,NL
1751284736,1751285759,US
1751285760,1751298047,NL
-1751298048,1751359487,US
-1751359488,1751363583,NL
-1751363584,1751486463,US
-1751486464,1751498751,NL
+1751298048,1751490559,US
+1751490560,1751498751,NL
1751498752,1751505919,US
1751505920,1751506175,IN
1751506176,1751506431,HK
@@ -51242,7 +53394,9 @@
1751552000,1751560191,US
1751560192,1751577087,NL
1751577088,1751598847,US
-1751598848,1751640319,NL
+1751598848,1751621631,NL
+1751621632,1751625727,US
+1751625728,1751640319,NL
1751640320,1751641087,US
1751641088,1751641599,NL
1751641600,1751642111,US
@@ -51332,9 +53486,7 @@
1752882688,1752883199,US
1752883200,1752891391,NL
1752891392,1752895487,US
-1752895488,1752899583,NL
-1752899584,1752901631,US
-1752901632,1752903679,NL
+1752895488,1752903679,NL
1752903680,1752911871,US
1752911872,1752929279,NL
1752929280,1752931327,US
@@ -51385,7 +53537,9 @@
1753280512,1753284607,CA
1753284608,1753309183,US
1753309184,1753317375,CA
-1753317376,1753341951,US
+1753317376,1753325055,US
+1753325056,1753325567,CA
+1753325568,1753341951,US
1753341952,1753346047,CA
1753346048,1753481727,US
1753481728,1753481983,SG
@@ -51424,7 +53578,9 @@
1753499648,1753499903,AE
1753499904,1753500159,US
1753500160,1753500415,SK
-1753500416,1753507391,US
+1753500416,1753500991,US
+1753500992,1753501039,CA
+1753501040,1753507391,US
1753507392,1753507439,KR
1753507440,1753511167,US
1753511168,1753511423,FR
@@ -51514,16 +53670,473 @@
1754258432,1754258687,MG
1754258688,1754258943,US
1754258944,1754259199,TN
-1754259200,1754282967,US
+1754259200,1754267647,US
+1754267648,1754267719,CA
+1754267720,1754267727,US
+1754267728,1754267967,CA
+1754267968,1754267991,US
+1754267992,1754268063,CA
+1754268064,1754268079,US
+1754268080,1754268095,CA
+1754268096,1754268159,US
+1754268160,1754269055,CA
+1754269056,1754269087,US
+1754269088,1754269103,CA
+1754269104,1754269119,US
+1754269120,1754269247,CA
+1754269248,1754269311,US
+1754269312,1754269327,CA
+1754269328,1754269343,US
+1754269344,1754269375,CA
+1754269376,1754269423,US
+1754269424,1754269567,CA
+1754269568,1754269599,US
+1754269600,1754269615,CA
+1754269616,1754269631,US
+1754269632,1754269647,CA
+1754269648,1754269663,US
+1754269664,1754271231,CA
+1754271232,1754271743,US
+1754271744,1754271999,CA
+1754272000,1754272127,US
+1754272128,1754272143,CA
+1754272144,1754272159,US
+1754272160,1754272191,CA
+1754272192,1754272207,US
+1754272208,1754272223,CA
+1754272224,1754272255,US
+1754272256,1754272383,CA
+1754272384,1754272415,US
+1754272416,1754272431,CA
+1754272432,1754272463,US
+1754272464,1754272495,CA
+1754272496,1754272511,US
+1754272512,1754272655,CA
+1754272656,1754272671,US
+1754272672,1754272703,CA
+1754272704,1754272719,US
+1754272720,1754272735,CA
+1754272736,1754272895,US
+1754272896,1754272959,CA
+1754272960,1754272975,US
+1754272976,1754272991,CA
+1754272992,1754273023,US
+1754273024,1754273151,CA
+1754273152,1754273183,US
+1754273184,1754273199,CA
+1754273200,1754273247,US
+1754273248,1754273263,CA
+1754273264,1754273279,US
+1754273280,1754273407,CA
+1754273408,1754273439,US
+1754273440,1754273455,CA
+1754273456,1754273487,US
+1754273488,1754273855,CA
+1754273856,1754273871,US
+1754273872,1754273887,CA
+1754273888,1754274175,US
+1754274176,1754274559,CA
+1754274560,1754274815,US
+1754274816,1754274959,CA
+1754274960,1754274991,US
+1754274992,1754275007,CA
+1754275008,1754275023,US
+1754275024,1754275039,CA
+1754275040,1754275199,US
+1754275200,1754276863,CA
+1754276864,1754277119,US
+1754277120,1754281279,CA
+1754281280,1754281343,US
+1754281344,1754281407,CA
+1754281408,1754281455,US
+1754281456,1754282895,CA
+1754282896,1754282927,US
+1754282928,1754282943,CA
+1754282944,1754282959,US
+1754282960,1754282967,CA
1754282968,1754282975,SE
-1754282976,1754289495,US
+1754282976,1754283007,US
+1754283008,1754283263,CA
+1754283264,1754283519,US
+1754283520,1754286591,CA
+1754286592,1754286847,US
+1754286848,1754288143,CA
+1754288144,1754288159,US
+1754288160,1754288191,CA
+1754288192,1754288207,US
+1754288208,1754288223,CA
+1754288224,1754288239,US
+1754288240,1754288255,CA
+1754288256,1754288383,US
+1754288384,1754288911,CA
+1754288912,1754288927,US
+1754288928,1754288959,CA
+1754288960,1754288991,US
+1754288992,1754289007,CA
+1754289008,1754289055,US
+1754289056,1754289071,CA
+1754289072,1754289087,US
+1754289088,1754289471,CA
+1754289472,1754289487,US
+1754289488,1754289495,CA
1754289496,1754289503,NO
-1754289504,1754307895,US
+1754289504,1754289519,US
+1754289520,1754289535,CA
+1754289536,1754289663,US
+1754289664,1754290431,CA
+1754290432,1754290447,US
+1754290448,1754290495,CA
+1754290496,1754290511,US
+1754290512,1754290527,CA
+1754290528,1754290543,US
+1754290544,1754290559,CA
+1754290560,1754290591,US
+1754290592,1754290607,CA
+1754290608,1754290623,US
+1754290624,1754290943,CA
+1754290944,1754290975,US
+1754290976,1754290991,CA
+1754290992,1754291023,US
+1754291024,1754291039,CA
+1754291040,1754291103,US
+1754291104,1754291119,CA
+1754291120,1754291135,US
+1754291136,1754291471,CA
+1754291472,1754291503,US
+1754291504,1754291519,CA
+1754291520,1754291535,US
+1754291536,1754291551,CA
+1754291552,1754291711,US
+1754291712,1754294015,CA
+1754294016,1754294063,US
+1754294064,1754294079,CA
+1754294080,1754294095,US
+1754294096,1754294111,CA
+1754294112,1754294127,US
+1754294128,1754294143,CA
+1754294144,1754294271,US
+1754294272,1754295951,CA
+1754295952,1754295983,US
+1754295984,1754295999,CA
+1754296000,1754296015,US
+1754296016,1754296031,CA
+1754296032,1754296063,US
+1754296064,1754296383,CA
+1754296384,1754296399,US
+1754296400,1754296415,CA
+1754296416,1754296527,US
+1754296528,1754296543,CA
+1754296544,1754296575,US
+1754296576,1754297471,CA
+1754297472,1754297487,US
+1754297488,1754297503,CA
+1754297504,1754297535,US
+1754297536,1754297551,CA
+1754297552,1754297583,US
+1754297584,1754299647,CA
+1754299648,1754299695,US
+1754299696,1754299775,CA
+1754299776,1754299791,US
+1754299792,1754299839,CA
+1754299840,1754299903,US
+1754299904,1754300543,CA
+1754300544,1754300575,US
+1754300576,1754300591,CA
+1754300592,1754300639,US
+1754300640,1754300671,CA
+1754300672,1754300751,US
+1754300752,1754300767,CA
+1754300768,1754300783,US
+1754300784,1754300799,CA
+1754300800,1754300879,US
+1754300880,1754300895,CA
+1754300896,1754300911,US
+1754300912,1754303231,CA
+1754303232,1754303247,US
+1754303248,1754303359,CA
+1754303360,1754303375,US
+1754303376,1754303391,CA
+1754303392,1754303487,US
+1754303488,1754304543,CA
+1754304544,1754304551,US
+1754304552,1754304767,CA
+1754304768,1754304783,US
+1754304784,1754304799,CA
+1754304800,1754304847,US
+1754304848,1754304863,CA
+1754304864,1754304895,US
+1754304896,1754304911,CA
+1754304912,1754304943,US
+1754304944,1754304959,CA
+1754304960,1754304991,US
+1754304992,1754305663,CA
+1754305664,1754305695,US
+1754305696,1754305711,CA
+1754305712,1754305743,US
+1754305744,1754305775,CA
+1754305776,1754306559,US
+1754306560,1754306975,CA
+1754306976,1754307023,US
+1754307024,1754307039,CA
+1754307040,1754307071,US
+1754307072,1754307327,CA
+1754307328,1754307391,US
+1754307392,1754307423,CA
+1754307424,1754307439,US
+1754307440,1754307455,CA
+1754307456,1754307487,US
+1754307488,1754307503,CA
+1754307504,1754307567,US
+1754307568,1754307895,CA
1754307896,1754307903,SE
-1754307904,1754308951,US
+1754307904,1754308015,US
+1754308016,1754308127,CA
+1754308128,1754308143,US
+1754308144,1754308159,CA
+1754308160,1754308191,US
+1754308192,1754308287,CA
+1754308288,1754308303,US
+1754308304,1754308351,CA
+1754308352,1754308367,US
+1754308368,1754308383,CA
+1754308384,1754308415,US
+1754308416,1754308479,CA
+1754308480,1754308543,US
+1754308544,1754308863,CA
+1754308864,1754308879,US
+1754308880,1754308895,CA
+1754308896,1754308943,US
+1754308944,1754308951,CA
1754308952,1754308959,SE
-1754308960,1754333183,US
-1754333184,1754337279,CA
+1754308960,1754308975,CA
+1754308976,1754308991,US
+1754308992,1754309023,CA
+1754309024,1754309055,US
+1754309056,1754309439,CA
+1754309440,1754309455,US
+1754309456,1754309503,CA
+1754309504,1754309583,US
+1754309584,1754309887,CA
+1754309888,1754309903,US
+1754309904,1754309935,CA
+1754309936,1754309951,US
+1754309952,1754309983,CA
+1754309984,1754309999,US
+1754310000,1754310079,CA
+1754310080,1754310111,US
+1754310112,1754310127,CA
+1754310128,1754310143,US
+1754310144,1754310463,CA
+1754310464,1754310479,US
+1754310480,1754310495,CA
+1754310496,1754310527,US
+1754310528,1754310911,CA
+1754310912,1754310943,US
+1754310944,1754310975,CA
+1754310976,1754310991,US
+1754310992,1754311055,CA
+1754311056,1754311119,US
+1754311120,1754311423,CA
+1754311424,1754311487,US
+1754311488,1754311615,CA
+1754311616,1754311647,US
+1754311648,1754311663,CA
+1754311664,1754311679,US
+1754311680,1754311695,CA
+1754311696,1754311711,US
+1754311712,1754311743,CA
+1754311744,1754311759,US
+1754311760,1754311807,CA
+1754311808,1754311967,US
+1754311968,1754311999,CA
+1754312000,1754312191,US
+1754312192,1754312447,CA
+1754312448,1754312463,US
+1754312464,1754312511,CA
+1754312512,1754312527,US
+1754312528,1754312543,CA
+1754312544,1754312559,US
+1754312560,1754312639,CA
+1754312640,1754312655,US
+1754312656,1754312671,CA
+1754312672,1754312703,US
+1754312704,1754312719,CA
+1754312720,1754312735,US
+1754312736,1754312767,CA
+1754312768,1754312783,US
+1754312784,1754312895,CA
+1754312896,1754312959,US
+1754312960,1754313023,CA
+1754313024,1754313039,US
+1754313040,1754313087,CA
+1754313088,1754313119,US
+1754313120,1754313135,CA
+1754313136,1754313151,US
+1754313152,1754313247,CA
+1754313248,1754313295,US
+1754313296,1754313311,CA
+1754313312,1754313327,US
+1754313328,1754313343,CA
+1754313344,1754313391,US
+1754313392,1754313535,CA
+1754313536,1754313583,US
+1754313584,1754313599,CA
+1754313600,1754313615,US
+1754313616,1754313663,CA
+1754313664,1754313679,US
+1754313680,1754313791,CA
+1754313792,1754313807,US
+1754313808,1754313823,CA
+1754313824,1754313839,US
+1754313840,1754313855,CA
+1754313856,1754313903,US
+1754313904,1754314047,CA
+1754314048,1754314079,US
+1754314080,1754314175,CA
+1754314176,1754314191,US
+1754314192,1754314207,CA
+1754314208,1754314239,US
+1754314240,1754314255,CA
+1754314256,1754314271,US
+1754314272,1754314303,CA
+1754314304,1754314351,US
+1754314352,1754314367,CA
+1754314368,1754314415,US
+1754314416,1754314431,CA
+1754314432,1754314463,US
+1754314464,1754314559,CA
+1754314560,1754314575,US
+1754314576,1754314623,CA
+1754314624,1754314687,US
+1754314688,1754314735,CA
+1754314736,1754314751,US
+1754314752,1754314815,CA
+1754314816,1754314847,US
+1754314848,1754314863,CA
+1754314864,1754314911,US
+1754314912,1754314943,CA
+1754314944,1754314991,US
+1754314992,1754315071,CA
+1754315072,1754315087,US
+1754315088,1754315103,CA
+1754315104,1754315135,US
+1754315136,1754315199,CA
+1754315200,1754315215,US
+1754315216,1754315231,CA
+1754315232,1754315263,US
+1754315264,1754315327,CA
+1754315328,1754315343,US
+1754315344,1754315407,CA
+1754315408,1754315423,US
+1754315424,1754315471,CA
+1754315472,1754315487,US
+1754315488,1754315567,CA
+1754315568,1754315615,US
+1754315616,1754315647,CA
+1754315648,1754316287,US
+1754316288,1754316799,CA
+1754316800,1754324991,US
+1754324992,1754325055,CA
+1754325056,1754325071,US
+1754325072,1754325119,CA
+1754325120,1754325247,US
+1754325248,1754325279,CA
+1754325280,1754325295,US
+1754325296,1754325311,CA
+1754325312,1754325343,US
+1754325344,1754325439,CA
+1754325440,1754325487,US
+1754325488,1754325599,CA
+1754325600,1754325615,US
+1754325616,1754325695,CA
+1754325696,1754325759,US
+1754325760,1754325887,CA
+1754325888,1754325919,US
+1754325920,1754326079,CA
+1754326080,1754326095,US
+1754326096,1754326111,CA
+1754326112,1754326127,US
+1754326128,1754326207,CA
+1754326208,1754326239,US
+1754326240,1754326335,CA
+1754326336,1754326351,US
+1754326352,1754326367,CA
+1754326368,1754326399,US
+1754326400,1754326463,CA
+1754326464,1754326495,US
+1754326496,1754326511,CA
+1754326512,1754326527,US
+1754326528,1754326591,CA
+1754326592,1754326655,US
+1754326656,1754326719,CA
+1754326720,1754326751,US
+1754326752,1754326767,CA
+1754326768,1754326783,US
+1754326784,1754326799,CA
+1754326800,1754326815,US
+1754326816,1754326847,CA
+1754326848,1754327039,US
+1754327040,1754327551,CA
+1754327552,1754328063,US
+1754328064,1754328079,CA
+1754328080,1754328111,US
+1754328112,1754328127,CA
+1754328128,1754328143,US
+1754328144,1754328159,CA
+1754328160,1754328319,US
+1754328320,1754328575,CA
+1754328576,1754329087,US
+1754329088,1754329151,CA
+1754329152,1754329183,US
+1754329184,1754329279,CA
+1754329280,1754329311,US
+1754329312,1754329407,CA
+1754329408,1754329455,US
+1754329456,1754329471,CA
+1754329472,1754329599,US
+1754329600,1754329663,CA
+1754329664,1754329679,US
+1754329680,1754329695,CA
+1754329696,1754329711,US
+1754329712,1754329791,CA
+1754329792,1754329839,US
+1754329840,1754329871,CA
+1754329872,1754329887,US
+1754329888,1754329919,CA
+1754329920,1754329935,US
+1754329936,1754329951,CA
+1754329952,1754330111,US
+1754330112,1754330879,CA
+1754330880,1754331135,US
+1754331136,1754331263,CA
+1754331264,1754331295,US
+1754331296,1754331311,CA
+1754331312,1754331375,US
+1754331376,1754331407,CA
+1754331408,1754331423,US
+1754331424,1754331455,CA
+1754331456,1754331487,US
+1754331488,1754331503,CA
+1754331504,1754331647,US
+1754331648,1754331791,CA
+1754331792,1754331823,US
+1754331824,1754331839,CA
+1754331840,1754331855,US
+1754331856,1754331871,CA
+1754331872,1754332191,US
+1754332192,1754332207,CA
+1754332208,1754332223,US
+1754332224,1754332239,CA
+1754332240,1754332271,US
+1754332272,1754332287,CA
+1754332288,1754332671,US
+1754332672,1754332687,CA
+1754332688,1754332703,US
+1754332704,1754332735,CA
+1754332736,1754332751,US
+1754332752,1754332767,CA
+1754332768,1754332927,US
+1754332928,1754337279,CA
1754337280,1754394367,US
1754394368,1754394623,CA
1754394624,1754402815,US
@@ -51718,9 +54331,7 @@
1754869760,1754870783,CA
1754870784,1754871807,US
1754871808,1754872831,CA
-1754872832,1754886143,US
-1754886144,1754888191,IL
-1754888192,1754890239,US
+1754872832,1754890239,US
1754890240,1754892287,BB
1754892288,1754894335,CA
1754894336,1754899455,US
@@ -51783,12 +54394,9 @@
1755320832,1755321343,EE
1755321344,1755321599,NO
1755321600,1755321855,DK
-1755321856,1755322111,US
-1755322112,1755322367,RU
+1755321856,1755322367,US
1755322368,1755322879,NZ
-1755322880,1755323135,US
-1755323136,1755323391,ES
-1755323392,1755356159,US
+1755322880,1755356159,US
1755356160,1755356415,AU
1755356416,1755365375,US
1755365376,1755373567,CA
@@ -51937,8 +54545,9 @@
1757487104,1757489151,CA
1757489152,1757491199,US
1757491200,1757497343,CA
-1757497344,1757501439,US
+1757497344,1757501683,US
1757501684,1757501684,CN
+1757501685,1757502463,US
1757502464,1757503487,CA
1757503488,1757505535,US
1757505536,1757506559,CA
@@ -52028,8 +54637,8 @@
1759139840,1759140863,US
1759140864,1759141887,CA
1759141888,1759148031,US
-1759148032,1759148287,NL
-1759148288,1759149055,US
+1759148032,1759148543,NL
+1759148544,1759149055,US
1759149056,1759150079,CA
1759150080,1759160319,US
1759160320,1759162367,BM
@@ -52040,8 +54649,7 @@
1759172608,1759173631,LC
1759173632,1759178751,US
1759178752,1759179775,PR
-1759179776,1759184639,US
-1759184640,1759184895,AU
+1759179776,1759184895,US
1759184896,1759186943,CA
1759186944,1759188991,US
1759188992,1759190015,VC
@@ -52169,21 +54777,288 @@
1759526144,1759526399,CC
1759526400,1759526655,JE
1759526656,1759526911,FO
-1759526912,1759528959,IL
-1759528960,1759531007,US
+1759526912,1759531007,US
1759531008,1759535103,SG
1759535104,1759543295,CA
1759543296,1759547391,US
1759547392,1759548415,NL
-1759548416,1759707735,US
+1759548416,1759707391,US
+1759707392,1759707735,CA
1759707736,1759707743,NO
-1759707744,1759721831,US
+1759707744,1759707767,CA
+1759707768,1759707775,US
+1759707776,1759707807,CA
+1759707808,1759707815,US
+1759707816,1759708031,CA
+1759708032,1759708159,US
+1759708160,1759708351,CA
+1759708352,1759708399,US
+1759708400,1759708415,CA
+1759708416,1759708751,US
+1759708752,1759708767,CA
+1759708768,1759709439,US
+1759709440,1759711231,CA
+1759711232,1759711487,US
+1759711488,1759711615,CA
+1759711616,1759711663,US
+1759711664,1759711679,CA
+1759711680,1759711695,US
+1759711696,1759711711,CA
+1759711712,1759711727,US
+1759711728,1759711743,CA
+1759711744,1759712255,US
+1759712256,1759712271,CA
+1759712272,1759712287,US
+1759712288,1759712319,CA
+1759712320,1759712335,US
+1759712336,1759712351,CA
+1759712352,1759712511,US
+1759712512,1759712639,CA
+1759712640,1759712767,US
+1759712768,1759713279,CA
+1759713280,1759713791,US
+1759713792,1759715327,CA
+1759715328,1759715375,US
+1759715376,1759715391,CA
+1759715392,1759715407,US
+1759715408,1759715439,CA
+1759715440,1759715839,US
+1759715840,1759716991,CA
+1759716992,1759717023,US
+1759717024,1759717039,CA
+1759717040,1759717055,US
+1759717056,1759717071,CA
+1759717072,1759717103,US
+1759717104,1759718399,CA
+1759718400,1759718655,US
+1759718656,1759719807,CA
+1759719808,1759719839,US
+1759719840,1759719855,CA
+1759719856,1759719919,US
+1759719920,1759719999,CA
+1759720000,1759720015,US
+1759720016,1759720063,CA
+1759720064,1759720095,US
+1759720096,1759720127,CA
+1759720128,1759720159,US
+1759720160,1759720207,CA
+1759720208,1759720223,US
+1759720224,1759720255,CA
+1759720256,1759720271,US
+1759720272,1759720383,CA
+1759720384,1759720415,US
+1759720416,1759720447,CA
+1759720448,1759720511,US
+1759720512,1759720575,CA
+1759720576,1759720703,US
+1759720704,1759720767,CA
+1759720768,1759720783,US
+1759720784,1759720799,CA
+1759720800,1759720815,US
+1759720816,1759720831,CA
+1759720832,1759721151,US
+1759721152,1759721215,CA
+1759721216,1759721343,US
+1759721344,1759721391,CA
+1759721392,1759721423,US
+1759721424,1759721439,CA
+1759721440,1759721471,US
+1759721472,1759721535,CA
+1759721536,1759721583,US
+1759721584,1759721599,CA
+1759721600,1759721615,US
+1759721616,1759721631,CA
+1759721632,1759721647,US
+1759721648,1759721727,CA
+1759721728,1759721743,US
+1759721744,1759721759,CA
+1759721760,1759721775,US
+1759721776,1759721791,CA
+1759721792,1759721823,US
+1759721824,1759721831,CA
1759721832,1759721839,NO
-1759721840,1759727103,US
-1759727104,1759727359,IN
-1759727360,1759748647,US
+1759721840,1759722047,US
+1759722048,1759722079,CA
+1759722080,1759722271,US
+1759722272,1759722367,CA
+1759722368,1759722383,US
+1759722384,1759722431,CA
+1759722432,1759722479,US
+1759722480,1759722495,CA
+1759722496,1759722511,US
+1759722512,1759722527,CA
+1759722528,1759722559,US
+1759722560,1759722607,CA
+1759722608,1759722655,US
+1759722656,1759722751,CA
+1759722752,1759722895,US
+1759722896,1759722911,CA
+1759722912,1759722943,US
+1759722944,1759722991,CA
+1759722992,1759723007,US
+1759723008,1759723071,CA
+1759723072,1759723151,US
+1759723152,1759723167,CA
+1759723168,1759723199,US
+1759723200,1759723231,CA
+1759723232,1759723247,US
+1759723248,1759723279,CA
+1759723280,1759723295,US
+1759723296,1759723327,CA
+1759723328,1759723343,US
+1759723344,1759723359,CA
+1759723360,1759723551,US
+1759723552,1759723583,CA
+1759723584,1759723599,US
+1759723600,1759723615,CA
+1759723616,1759723631,US
+1759723632,1759723647,CA
+1759723648,1759723823,US
+1759723824,1759723887,CA
+1759723888,1759723967,US
+1759723968,1759724159,CA
+1759724160,1759724223,US
+1759724224,1759724239,CA
+1759724240,1759724255,US
+1759724256,1759725055,CA
+1759725056,1759726079,US
+1759726080,1759726975,CA
+1759726976,1759727007,US
+1759727008,1759727023,CA
+1759727024,1759727087,US
+1759727088,1759727359,CA
+1759727360,1759727615,US
+1759727616,1759728383,CA
+1759728384,1759728639,US
+1759728640,1759729151,CA
+1759729152,1759729663,US
+1759729664,1759729711,CA
+1759729712,1759729743,US
+1759729744,1759729759,CA
+1759729760,1759729967,US
+1759729968,1759730015,CA
+1759730016,1759730175,US
+1759730176,1759730191,CA
+1759730192,1759730207,US
+1759730208,1759730239,CA
+1759730240,1759730303,US
+1759730304,1759730367,CA
+1759730368,1759730399,US
+1759730400,1759730415,CA
+1759730416,1759730463,US
+1759730464,1759730495,CA
+1759730496,1759730511,US
+1759730512,1759730543,CA
+1759730544,1759730559,US
+1759730560,1759730623,CA
+1759730624,1759730831,US
+1759730832,1759730847,CA
+1759730848,1759730879,US
+1759730880,1759730895,CA
+1759730896,1759730911,US
+1759730912,1759730927,CA
+1759730928,1759731455,US
+1759731456,1759734335,CA
+1759734336,1759734351,US
+1759734352,1759734367,CA
+1759734368,1759734383,US
+1759734384,1759734399,CA
+1759734400,1759734415,US
+1759734416,1759734463,CA
+1759734464,1759734607,US
+1759734608,1759734639,CA
+1759734640,1759734703,US
+1759734704,1759734719,CA
+1759734720,1759734735,US
+1759734736,1759734751,CA
+1759734752,1759734783,US
+1759734784,1759735967,CA
+1759735968,1759736015,US
+1759736016,1759736031,CA
+1759736032,1759736063,US
+1759736064,1759736831,CA
+1759736832,1759737007,US
+1759737008,1759737023,CA
+1759737024,1759737071,US
+1759737072,1759737087,CA
+1759737088,1759737343,US
+1759737344,1759738879,CA
+1759738880,1759739023,US
+1759739024,1759739055,CA
+1759739056,1759739103,US
+1759739104,1759743999,CA
+1759744000,1759744255,US
+1759744256,1759746047,CA
+1759746048,1759746303,US
+1759746304,1759747839,CA
+1759747840,1759747919,US
+1759747920,1759747935,CA
+1759747936,1759748095,US
+1759748096,1759748407,CA
+1759748408,1759748415,US
+1759748416,1759748607,CA
+1759748608,1759748647,US
1759748648,1759748655,SE
-1759748656,1760047103,US
+1759748656,1759748863,US
+1759748864,1759749119,CA
+1759749120,1759749631,US
+1759749632,1759749935,CA
+1759749936,1759749967,US
+1759749968,1759749983,CA
+1759749984,1759750159,US
+1759750160,1759750175,CA
+1759750176,1759750191,US
+1759750192,1759750207,CA
+1759750208,1759750223,US
+1759750224,1759750239,CA
+1759750240,1759750335,US
+1759750336,1759750399,CA
+1759750400,1759750415,US
+1759750416,1759750431,CA
+1759750432,1759750463,US
+1759750464,1759750479,CA
+1759750480,1759750495,US
+1759750496,1759750511,CA
+1759750512,1759751167,US
+1759751168,1759752191,CA
+1759752192,1759752447,US
+1759752448,1759753023,CA
+1759753024,1759753039,US
+1759753040,1759753055,CA
+1759753056,1759753087,US
+1759753088,1759753103,CA
+1759753104,1759753135,US
+1759753136,1759753151,CA
+1759753152,1759753215,US
+1759753216,1759754655,CA
+1759754656,1759754719,US
+1759754720,1759754735,CA
+1759754736,1759754751,US
+1759754752,1759754879,CA
+1759754880,1759755007,US
+1759755008,1759755151,CA
+1759755152,1759755167,US
+1759755168,1759755199,CA
+1759755200,1759755263,US
+1759755264,1759755711,CA
+1759755712,1759755775,US
+1759755776,1759755903,CA
+1759755904,1759755935,US
+1759755936,1759755951,CA
+1759755952,1759755967,US
+1759755968,1759755983,CA
+1759755984,1759755999,US
+1759756000,1759756159,CA
+1759756160,1759756239,US
+1759756240,1759756255,CA
+1759756256,1759764479,US
+1759764480,1759766527,CA
+1759766528,1759767551,US
+1759767552,1759767807,CA
+1759767808,1759768831,US
+1759768832,1759772671,CA
+1759772672,1760034815,US
+1760038912,1760047103,US
1760047104,1760051199,CA
1760051200,1760083967,US
1760083968,1760086015,SE
@@ -52240,9 +55115,9 @@
1760818176,1760818431,AR
1760818432,1760818687,MX
1760818688,1760818943,AW
-1760818944,1760819199,SE
-1760819200,1760819455,IT
-1760819456,1760819711,GB
+1760818944,1760819199,US
+1760819200,1760819455,RO
+1760819456,1760819711,US
1760819712,1760819967,MA
1760819968,1760820479,US
1760820480,1760820735,CA
@@ -52250,7 +55125,9 @@
1760823296,1760824319,PT
1760824320,1760837631,US
1760837632,1760839679,CA
-1760839680,1760840379,US
+1760839680,1760840269,US
+1760840270,1760840270,LU
+1760840271,1760840379,US
1760840380,1760840380,LU
1760840381,1760867327,US
1760867328,1760868351,PR
@@ -52426,18 +55303,14 @@
1761544192,1761546239,CA
1761546240,1761554431,US
1761554432,1761555455,CA
-1761555456,1761556479,US
-1761556480,1761558527,IL
-1761558528,1761581055,US
+1761555456,1761581055,US
1761581056,1761583103,CA
1761583104,1761587199,US
1761587200,1761588223,MS
1761588224,1761589247,PR
1761589248,1761595391,US
1761595392,1761596415,CA
-1761596416,1761600255,US
-1761600256,1761600511,CA
-1761600512,1761601535,US
+1761596416,1761601535,US
1761601536,1761602559,VC
1761602560,1761606655,US
1761606656,1761607679,LC
@@ -52619,7 +55492,9 @@
1795561984,1795563519,CA
1795563520,1795564031,US
1795564032,1795564543,CA
-1795564544,1795565823,US
+1795564544,1795565719,US
+1795565720,1795565727,CA
+1795565728,1795565823,US
1795565824,1795566079,CA
1795566080,1795566335,US
1795566336,1795566591,CA
@@ -52652,7 +55527,11 @@
1805016576,1805016831,NZ
1805016832,1805017087,TR
1805017088,1805018111,CN
-1805018112,1805033983,US
+1805018112,1805022463,US
+1805022464,1805022719,DE
+1805022720,1805024767,US
+1805024768,1805025279,KR
+1805025280,1805033983,US
1805033984,1805038591,TR
1805038592,1805046271,US
1805046272,1805046783,GB
@@ -52664,11 +55543,7 @@
1805144064,1805148159,CA
1805148160,1805150463,US
1805150464,1805150719,GB
-1805150720,1805165823,US
-1805165824,1805166079,IN
-1805166080,1805166335,US
-1805166336,1805166591,IN
-1805166592,1805167103,US
+1805150720,1805167103,US
1805167104,1805167359,FR
1805167360,1805168855,US
1805168856,1805168863,SE
@@ -52735,7 +55610,44 @@
1805283328,1805283583,GB
1805283584,1805284863,US
1805284864,1805285119,ES
-1805285120,1805337287,US
+1805285120,1805321727,US
+1805321728,1805321983,VN
+1805321984,1805322751,US
+1805322752,1805323007,RU
+1805323008,1805323263,JP
+1805323264,1805324287,US
+1805324288,1805324543,DE
+1805324544,1805325055,US
+1805325056,1805325311,ES
+1805325312,1805325567,AE
+1805325568,1805325823,ID
+1805325824,1805326079,FR
+1805326080,1805326335,US
+1805326336,1805326591,SG
+1805326592,1805326847,US
+1805326848,1805327103,MY
+1805327104,1805327359,TH
+1805327360,1805327615,KR
+1805327616,1805327871,JP
+1805327872,1805328127,TW
+1805328128,1805328383,US
+1805328384,1805328639,TH
+1805328640,1805328895,ID
+1805328896,1805329663,US
+1805329664,1805329919,SG
+1805329920,1805330431,TH
+1805330432,1805332479,US
+1805332480,1805332735,DE
+1805332736,1805332991,FR
+1805332992,1805333247,JP
+1805333248,1805333503,ES
+1805333504,1805334527,US
+1805334528,1805334783,SG
+1805334784,1805335039,KR
+1805335040,1805335295,MY
+1805335296,1805335551,TH
+1805335552,1805335807,AE
+1805335808,1805337287,US
1805337288,1805337295,IT
1805337296,1805582335,US
1805582336,1805647871,CA
@@ -52752,14 +55664,9 @@
1805753088,1805754175,US
1805754176,1805754367,CA
1805754368,1805756415,US
-1805756928,1806131199,US
-1806132224,1806132479,US
-1806132608,1806132735,US
-1806134784,1806135039,US
+1805756672,1806135130,US
1806135131,1806135132,IN
-1806137088,1806137343,US
-1806138112,1806138367,US
-1806138880,1806172159,US
+1806135133,1806172159,US
1806172160,1806172415,DE
1806172416,1806172671,GB
1806172672,1806172927,DE
@@ -52884,7 +55791,9 @@
1815987712,1815988223,NL
1815988224,1815988735,JP
1815988736,1815990271,US
-1815990272,1815990783,FR
+1815990272,1815990503,FR
+1815990504,1815990504,TF
+1815990505,1815990783,FR
1815990784,1815991295,DE
1815991296,1815991807,AU
1815991808,1815993599,US
@@ -52892,7 +55801,8 @@
1815993856,1815994111,US
1815994112,1815994367,JP
1815994368,1815994623,US
-1815994624,1815994879,GB
+1815994624,1815994655,DE
+1815994656,1815994879,GB
1815994880,1815995135,US
1815995136,1815995391,AU
1815995392,1815995903,US
@@ -52934,7 +55844,8 @@
1822554112,1822572543,US
1822572544,1822605311,CA
1822605312,1822612991,US
-1822612992,1822613503,HK
+1822612992,1822613247,AU
+1822613248,1822613503,HK
1822613504,1822614015,US
1822614016,1822614527,JP
1822614528,1822615039,FR
@@ -52955,6 +55866,7 @@
1823170560,1823178751,US
1823178752,1823179007,GB
1823179008,1823179167,DE
+1823179168,1823179199,US
1823179200,1823179263,DE
1823179264,1823180287,US
1823180288,1823180543,AU
@@ -52966,7 +55878,9 @@
1823182080,1823182335,SG
1823182336,1823182591,JP
1823182592,1823182847,HK
-1823182848,1823186687,US
+1823182848,1823183103,US
+1823183104,1823183359,ZA
+1823183360,1823186687,US
1823186688,1823186943,IN
1823186944,1823211519,US
1823211520,1823342591,CA
@@ -53229,8 +56143,6 @@
1833558016,1833562111,US
1833562112,1833566207,PS
1833566208,1833570303,SE
-1833570304,1833573631,GB
-1833573632,1833574399,NL
1833574400,1833578495,YE
1833578496,1833582591,HU
1833582592,1833586687,TJ
@@ -53277,9 +56189,11 @@
1834901504,1834902527,XK
1834902528,1834903551,RS
1834903552,1834904575,BA
-1834904576,1834909695,RS
+1834904576,1834905087,RS
+1834905088,1834905343,BG
+1834905344,1834909695,RS
1834909696,1834913791,GB
-1834913792,1834917887,RO
+1834913792,1834917887,US
1834917888,1834921983,UA
1834921984,1834930175,RU
1834934272,1834938367,RS
@@ -53374,9 +56288,7 @@
1835919752,1835919759,IT
1835919760,1835921111,GB
1835921112,1835921127,IT
-1835921128,1835921159,GB
-1835921160,1835921167,IT
-1835921168,1835922559,GB
+1835921128,1835922559,GB
1835922560,1835922567,IT
1835922568,1835922647,GB
1835922648,1835922655,IT
@@ -53718,11 +56630,12 @@
1839450112,1839452159,NO
1839452160,1839454207,FI
1839454208,1839456255,RU
-1839456256,1839458863,RO
-1839458864,1839458867,US
-1839458868,1839460039,RO
-1839460040,1839460047,DE
-1839460048,1839460351,RO
+1839456256,1839459327,RO
+1839459328,1839459599,DE
+1839459600,1839459615,RO
+1839459616,1839460031,DE
+1839460032,1839460039,RO
+1839460040,1839460351,DE
1839460352,1839462399,RU
1839462400,1839464447,FI
1839464448,1839497215,CZ
@@ -54048,8 +56961,7 @@
1843982336,1843984383,PL
1843984384,1843986431,RU
1843986432,1843988479,NO
-1843988480,1843988527,GB
-1843988529,1843990527,GB
+1843988480,1843990527,GB
1843990528,1843992575,LB
1843992576,1843994623,AT
1843994624,1844000767,GB
@@ -54205,7 +57117,9 @@
1844432896,1844436991,RU
1844436992,1844441087,NO
1844441088,1844445183,IT
-1844445184,1844510719,FI
+1844445184,1844464672,FI
+1844464673,1844464673,ES
+1844464674,1844510719,FI
1844510720,1844576255,PL
1844576256,1844641791,GR
1844641792,1844707327,PL
@@ -54213,9 +57127,7 @@
1844772864,1844838399,RS
1844838400,1844903935,GB
1844903936,1844969471,NO
-1844969472,1844984831,RU
-1844984832,1844985343,GE
-1844985344,1845006335,RU
+1844969472,1845006335,RU
1845006336,1845010431,KZ
1845010432,1845022719,RU
1845022720,1845023743,KZ
@@ -54461,8 +57373,7 @@
1867907072,1868038143,JP
1868038144,1868103679,PK
1868103680,1868201983,JP
-1868201984,1868207615,MY
-1868207872,1868210175,MY
+1868201984,1868210175,MY
1868210176,1868212223,JP
1868212224,1868214271,IN
1868214272,1868218367,KH
@@ -54800,8 +57711,7 @@
1904376832,1904377855,KH
1904377856,1904476159,KR
1904476160,1905262591,CN
-1905262592,1905429765,JP
-1905429767,1906311167,JP
+1905262592,1906311167,JP
1906311168,1908408319,VN
1908408320,1908424703,AU
1908424704,1908441087,KR
@@ -54979,9 +57889,9 @@
1921865728,1921867775,ID
1921867776,1921871871,AU
1921871872,1921872895,US
-1921872896,1921873151,NZ
-1921873152,1921873407,US
-1921873408,1921874687,NZ
+1921872896,1921873663,NZ
+1921873664,1921874175,US
+1921874176,1921874687,NZ
1921874688,1921875967,US
1921875968,1921892351,CN
1921892352,1921896447,AU
@@ -55003,7 +57913,8 @@
1925611520,1925619711,PH
1925619712,1925627903,TW
1925627904,1925638143,JP
-1925638144,1925640191,PK
+1925638144,1925639935,PK
+1925639936,1925640191,EG
1925640192,1925642239,ID
1925642240,1925644287,CN
1925644288,1925660671,KR
@@ -55039,8 +57950,7 @@
1932156928,1932161023,JP
1932161024,1932163071,TW
1932163072,1932165119,PH
-1932165120,1932182523,SG
-1932182525,1932197887,SG
+1932165120,1932197887,SG
1932197888,1932263423,TW
1932263424,1933574143,CN
1933574144,1933639679,AU
@@ -55221,8 +58131,7 @@
1949446144,1949448191,JP
1949448192,1949448703,IN
1949448704,1949448959,AU
-1949448960,1949449395,IN
-1949449397,1949449471,IN
+1949448960,1949449471,IN
1949449472,1949449727,JP
1949449728,1949466623,IN
1949466624,1949499391,PH
@@ -55240,8 +58149,8 @@
1950351360,1950482431,JP
1950482432,1950515199,CN
1950515200,1950515455,US
-1950515456,1950515711,IN
-1950515712,1950516223,US
+1950515456,1950515967,IN
+1950515968,1950516223,US
1950516224,1950516735,IN
1950516736,1950518271,US
1950518272,1950519295,IN
@@ -55294,6 +58203,10 @@
1952030720,1952038911,KR
1952038912,1952047103,JP
1952047104,1952051199,NZ
+1952051200,1952052223,CN
+1952052224,1952053247,AU
+1952053248,1952054271,HK
+1952054272,1952055295,TH
1952055296,1952071679,AU
1952071680,1952073727,HK
1952073728,1952074751,AU
@@ -55416,8 +58329,8 @@
1959681793,1959682047,CN
1959682048,1959683071,IN
1959683072,1959683327,US
-1959683328,1959683583,CN
-1959683584,1959683839,JP
+1959683328,1959683583,HK
+1959683584,1959683839,US
1959683840,1959684095,CN
1959684096,1959685119,SC
1959685120,1959686143,PH
@@ -55474,7 +58387,7 @@
1960132608,1960181759,CN
1960181760,1960185855,TW
1960185856,1960187903,JP
-1960187904,1960189951,IN
+1960187904,1960189951,KH
1960189952,1960202239,CN
1960202240,1960206335,JP
1960206336,1960210431,SG
@@ -55484,8 +58397,7 @@
1960211456,1960211903,AU
1960211904,1960211967,SG
1960211968,1960212479,AU
-1960212480,1960212582,IN
-1960212584,1960212991,IN
+1960212480,1960212991,IN
1960212992,1960214015,SG
1960214016,1960214271,IN
1960214272,1960214527,SG
@@ -55524,7 +58436,9 @@
1964123648,1964123903,CN
1964123904,1964126207,SG
1964126208,1964126463,HK
-1964126464,1964130303,SG
+1964126464,1964129279,SG
+1964129280,1964129535,HK
+1964129536,1964130303,SG
1964130304,1964134399,HK
1964134400,1964136447,AU
1964136448,1964138495,JP
@@ -55876,9 +58790,9 @@
1998503936,1998520319,JP
1998520320,1998553087,TH
1998553088,1998561279,JP
-1998561280,1998562559,IN
-1998562560,1998562815,CN
-1998562816,1998562863,IN
+1998561280,1998562687,IN
+1998562688,1998562703,CN
+1998562704,1998562863,IN
1998562864,1998562864,HK
1998562865,1998565375,IN
1998565376,1998569471,TW
@@ -55954,9 +58868,7 @@
2001461248,2001465343,JP
2001465344,2001469439,TW
2001469440,2001534975,TH
-2001534976,2001542655,AU
-2001542656,2001542911,HK
-2001542912,2001559551,AU
+2001534976,2001559551,AU
2001559552,2001567743,KR
2001567744,2001600511,TW
2001600512,2001797119,CN
@@ -56219,8 +59131,7 @@
2033625088,2033627135,HK
2033627136,2033629183,CN
2033629184,2033630207,AU
-2033630208,2033630719,CN
-2033630720,2033631231,HK
+2033630208,2033631231,CN
2033631232,2033647615,KR
2033647616,2033663999,CN
2033664000,2033696767,KR
@@ -56309,7 +59220,8 @@
2046836736,2046885887,CN
2046885888,2046951423,JP
2046951424,2047082495,PH
-2047082496,2047410175,CN
+2047082496,2047377407,CN
+2047377408,2047410175,PK
2047410176,2047492095,HK
2047492096,2047496191,KR
2047496192,2047506431,HK
@@ -56333,8 +59245,7 @@
2050097152,2050098175,PK
2050098176,2050099199,ID
2050099200,2050101247,SG
-2050101248,2050129730,JP
-2050129732,2050129919,JP
+2050101248,2050129919,JP
2050129920,2050162687,IN
2050162688,2050228223,CN
2050228224,2050490367,PH
@@ -56423,8 +59334,7 @@
2056817336,2056817343,HK
2056817344,2056817727,JP
2056817728,2056817791,AU
-2056817792,2056818993,JP
-2056818995,2056819087,JP
+2056817792,2056819087,JP
2056819088,2056819103,SG
2056819104,2056823849,JP
2056823850,2056823850,SG
@@ -56475,6 +59385,7 @@
2061500416,2063073279,CN
2063073280,2063077375,BD
2063077376,2063077377,PH
+2063077378,2063077378,HK
2063077379,2063077631,PH
2063077632,2063079423,HK
2063079424,2063081471,CN
@@ -56482,8 +59393,7 @@
2063085568,2063089663,CN
2063089664,2063097855,JP
2063097856,2063106047,MM
-2063106048,2063107071,SG
-2063107328,2063107655,SG
+2063106048,2063107655,SG
2063107656,2063107663,HK
2063107664,2063108095,SG
2063108096,2063110143,HK
@@ -57048,7 +59958,33 @@
2147528704,2147532799,CZ
2147532800,2147534847,DE
2147534848,2147549183,CY
-2147549184,2147942399,US
+2147549184,2147557375,US
+2147557376,2147557631,TW
+2147557632,2147557887,SG
+2147557888,2147558143,DE
+2147558144,2147558399,TH
+2147558400,2147558655,US
+2147558656,2147558911,TW
+2147558912,2147559167,SG
+2147559168,2147559423,TH
+2147559424,2147559679,SG
+2147559680,2147559935,US
+2147559936,2147560191,DE
+2147560192,2147560447,RU
+2147560448,2147560703,TH
+2147560704,2147562239,US
+2147562240,2147562495,RU
+2147562496,2147563263,US
+2147563264,2147563519,RU
+2147563520,2147564287,US
+2147564288,2147564543,AE
+2147564544,2147564799,US
+2147564800,2147565055,SG
+2147565056,2147565311,HK
+2147565312,2147565823,TW
+2147565824,2147592703,US
+2147592704,2147592959,HK
+2147592960,2147942399,US
2147942400,2148007935,DE
2148007936,2148220515,US
2148220516,2148220535,AU
@@ -57094,8 +60030,7 @@
2152726528,2153119743,US
2153119744,2153185279,GB
2153185280,2153250815,SE
-2153250816,2153316095,US
-2153316352,2153384447,US
+2153250816,2153384447,US
2153384448,2153385471,GB
2153385472,2153385599,AT
2153385600,2153385663,CZ
@@ -57210,7 +60145,33 @@
2160533504,2160541695,NL
2160541696,2160590847,SG
2160590848,2160656383,US
+2160656384,2160657407,BR
+2160657408,2160658431,HN
+2160658432,2160661503,BR
2160661504,2160662527,AR
+2160662528,2160664575,BR
+2160664576,2160666623,CL
+2160666624,2160676863,BR
+2160676864,2160677887,AR
+2160677888,2160678911,BR
+2160678912,2160679935,GF
+2160679936,2160684031,BR
+2160684032,2160685055,AR
+2160685056,2160686079,DO
+2160686080,2160687103,CL
+2160687104,2160690175,BR
+2160690176,2160691199,AR
+2160691200,2160693247,BR
+2160693248,2160694271,CR
+2160694272,2160697343,BR
+2160697344,2160698367,EC
+2160698368,2160699391,BR
+2160699392,2160700415,AR
+2160700416,2160713727,BR
+2160713728,2160714751,CL
+2160714752,2160716799,BR
+2160716800,2160717823,AR
+2160717824,2160721919,BR
2160721920,2160852991,US
2160852992,2160885759,RU
2160885760,2160893951,AT
@@ -57231,8 +60192,7 @@
2163277824,2163408895,US
2163408896,2163474431,GB
2163474432,2163605503,US
-2163605504,2163623935,DE
-2163624192,2163638271,DE
+2163605504,2163638271,DE
2163638272,2163638527,US
2163638528,2163671039,DE
2163671040,2163867647,US
@@ -57326,9 +60286,7 @@
2176516096,2176581631,DE
2176581632,2176868607,US
2176868608,2176868863,IT
-2176868864,2176893951,US
-2176894208,2176894475,US
-2176894477,2176897023,US
+2176868864,2176897023,US
2176897024,2176897535,AU
2176897536,2176974847,US
2176974848,2177105919,CH
@@ -57414,10 +60372,7 @@
2183266304,2183331839,JP
2183331840,2183416575,US
2183416576,2183416831,GB
-2183416832,2183419647,US
-2183419904,2183421695,US
-2183421952,2183437055,US
-2183437312,2183462911,US
+2183416832,2183462911,US
2183462912,2183528447,NL
2183528448,2183856127,US
2183856128,2183888895,GR
@@ -57502,8 +60457,9 @@
2188769632,2188769663,IT
2188769664,2188770175,DE
2188770176,2188771327,IT
-2188771328,2188836863,US
+2188771328,2188901753,US
2188901754,2188901754,GB
+2188901755,2188902399,US
2188902400,2188967935,FR
2188967936,2189099007,US
2189099008,2189164543,NZ
@@ -57516,8 +60472,7 @@
2189819904,2189950975,US
2189950976,2190016511,IT
2190016512,2190082047,US
-2190082048,2190140159,NL
-2190140416,2190737407,NL
+2190082048,2190737407,NL
2190737408,2190802943,GB
2190802944,2190803967,DE
2190803968,2190804735,PL
@@ -57593,9 +60548,7 @@
2193707496,2193707503,IT
2193707504,2193707655,GB
2193707656,2193707663,IT
-2193707664,2193707791,GB
-2193707792,2193707799,IT
-2193707800,2193707839,GB
+2193707664,2193707839,GB
2193707840,2193707847,IT
2193707848,2193708375,GB
2193708376,2193708383,IT
@@ -57630,9 +60583,7 @@
2194888510,2194888510,IE
2194888511,2194891198,US
2194891199,2194891199,BE
-2194891200,2195069436,US
-2195069438,2195073023,US
-2195073280,2195193855,US
+2194891200,2195193855,US
2195193856,2195324927,NZ
2195324928,2195455999,US
2195456000,2195521535,AU
@@ -57674,7 +60625,7 @@
2197798912,2197815295,IR
2197815296,2197816319,BO
2197816320,2197828607,BR
-2197828608,2197829631,AR
+2197828608,2197829631,CL
2197829632,2197833727,BR
2197833728,2197834751,CR
2197834752,2197841919,BR
@@ -57686,7 +60637,9 @@
2197849088,2197850111,BR
2197850112,2197851135,CO
2197851136,2197858303,BR
-2197858304,2197859327,CO
+2197858304,2197858431,CO
+2197858432,2197858447,CW
+2197858448,2197859327,CO
2197859328,2197860351,CL
2197860352,2197865471,BR
2197865472,2197866495,ES
@@ -57728,7 +60681,9 @@
2204172288,2204237823,SE
2204237824,2204303359,US
2204303360,2204368895,DE
-2204368896,2204369919,PA
+2204368896,2204369407,PA
+2204369408,2204369663,US
+2204369664,2204369919,PA
2204369920,2204376063,BR
2204376064,2204377087,CL
2204377088,2204378111,BR
@@ -57759,7 +60714,11 @@
2204893184,2204894207,AR
2204894208,2204895231,PA
2204895232,2204897279,BR
-2204897280,2204898303,HN
+2204897280,2204897447,HN
+2204897448,2204897455,CA
+2204897456,2204898095,HN
+2204898096,2204898111,CR
+2204898112,2204898303,HN
2204898304,2204899327,PA
2204899328,2204902399,BR
2204902400,2204903423,CR
@@ -57777,8 +60736,10 @@
2204943360,2204946431,BR
2204946432,2204947455,CL
2204947456,2204952575,BR
-2204952576,2204953599,HN
-2204953600,2204958719,BR
+2204952576,2204952767,HN
+2204952768,2204952775,US
+2204952776,2204953599,HN
+2204954624,2204958719,BR
2204958720,2205089791,US
2205089792,2205155327,GB
2205155328,2205286399,JP
@@ -57881,7 +60842,38 @@
2210136064,2210201599,DE
2210201600,2210594815,US
2210594816,2210660351,CA
-2210660352,2211053567,US
+2210660352,2210661375,AR
+2210661376,2210662399,BR
+2210662400,2210664447,EC
+2210664448,2210667519,BR
+2210667520,2210668543,CL
+2210668544,2210669567,CR
+2210669568,2210670591,AR
+2210670592,2210673663,BR
+2210673664,2210674687,HN
+2210674688,2210675711,BR
+2210675712,2210676735,EC
+2210676736,2210678783,BR
+2210678784,2210679807,AR
+2210679808,2210680831,BR
+2210680832,2210681855,AR
+2210681856,2210689023,BR
+2210689024,2210690047,EC
+2210690048,2210692095,BR
+2210692096,2210693119,MX
+2210693120,2210696191,BR
+2210696192,2210697215,MX
+2210697216,2210705407,BR
+2210705408,2210706431,CL
+2210706432,2210707455,AR
+2210707456,2210708479,BR
+2210708480,2210709503,AR
+2210709504,2210710527,PY
+2210710528,2210713599,BR
+2210713600,2210715647,CO
+2210715648,2210722815,BR
+2210722816,2210725887,MX
+2210725888,2211053567,US
2211053568,2211119103,CA
2211119104,2211184639,NZ
2211184640,2211250175,US
@@ -57947,7 +60939,8 @@
2212814848,2212816383,FI
2212816384,2212816639,SG
2212816640,2212816895,IN
-2212816896,2212823039,FI
+2212816896,2212817151,KR
+2212817152,2212823039,FI
2212823040,2212954111,US
2212954112,2213019647,GB
2213019648,2213085183,CA
@@ -58017,15 +61010,15 @@
2214454016,2214454079,NL
2214454080,2214454271,US
2214454272,2214454335,NL
-2214454336,2214455807,US
-2214455808,2214455871,NL
-2214455872,2214455967,US
-2214455968,2214455999,NL
-2214456000,2214460415,US
+2214454336,2214455295,US
+2214455296,2214456031,NL
+2214456032,2214456063,IE
+2214456064,2214460415,US
2214460416,2214461439,NL
2214461440,2214526975,FR
-2214526976,2214527999,BR
-2214528000,2214529023,AR
+2214528000,2214528333,AR
+2214528334,2214528334,NL
+2214528335,2214529023,AR
2214529024,2214530047,BR
2214530048,2214531071,AR
2214531072,2214537215,BR
@@ -58040,7 +61033,8 @@
2214573056,2214574079,AR
2214574080,2214576127,BR
2214576128,2214577151,PE
-2214577152,2214590463,BR
+2214577152,2214588415,BR
+2214589440,2214590463,BR
2214590464,2214591487,AR
2214591488,2214592511,BR
2214592512,2218786815,US
@@ -58076,9 +61070,7 @@
2226716672,2226782207,GB
2226782208,2226847743,ZA
2226847744,2226913279,DE
-2226913280,2226921471,US
-2226921728,2227052543,US
-2227052800,2227106303,US
+2226913280,2227106303,US
2227106304,2227106559,JP
2227106560,2227109887,US
2227109888,2227175423,PE
@@ -58101,8 +61093,7 @@
2229862400,2229927935,US
2229927936,2229993471,AU
2229993472,2230583295,US
-2230583296,2230601727,GB
-2230601984,2230603775,GB
+2230583296,2230603775,GB
2230603776,2230607871,US
2230607872,2230637567,GB
2230637568,2230638591,SG
@@ -58334,7 +61325,11 @@
2231333888,2231335935,BR
2231335936,2231336959,MX
2231336960,2231337983,BR
-2231337984,2231339007,HN
+2231337984,2231338639,HN
+2231338640,2231338647,US
+2231338648,2231338695,HN
+2231338696,2231338703,US
+2231338704,2231339007,HN
2231339008,2231346175,BR
2231346176,2231347199,PY
2231347200,2231355391,BR
@@ -58397,7 +61392,7 @@
2250440704,2250506239,YE
2250506240,2250571775,GB
2250571776,2250572031,SE
-2250572032,2250637055,FI
+2250572032,2250637311,FI
2250637312,2250702847,CH
2250702848,2250833919,US
2250833920,2250899455,CA
@@ -58464,12 +61459,9 @@
2257453056,2257518591,GB
2257518592,2257584127,NL
2257584128,2257649663,AU
-2257649664,2257715199,NL
-2257715456,2257716735,NL
-2257716992,2257717503,NL
+2257649664,2257717503,NL
2257717504,2257717759,GB
-2257717760,2257765119,NL
-2257765376,2257776639,NL
+2257717760,2257776639,NL
2257776640,2257776895,IN
2257776896,2257780735,NL
2257780736,2257846271,DE
@@ -58510,8 +61502,9 @@
2258594144,2258594175,HK
2258594176,2258594303,AU
2258594304,2258594607,HK
+2258594608,2258594623,AU
2258594624,2258594751,HK
-2258594816,2258595103,AU
+2258594752,2258595103,AU
2258595104,2258595167,TW
2258595168,2258595231,AU
2258595232,2258595263,TW
@@ -58713,6 +61706,7 @@
2260598784,2260664319,CA
2260664320,2260720639,GB
2260720640,2260720703,PL
+2260720704,2260720719,GB
2260720720,2260720895,PL
2260720896,2260723711,GB
2260723712,2260723967,IL
@@ -58739,8 +61733,7 @@
2262414336,2262415359,IN
2262415360,2262499327,US
2262499328,2262630399,GB
-2262630400,2262722809,NL
-2262722811,2262724071,NL
+2262630400,2262724071,NL
2262724072,2262724073,IE
2262724074,2262761471,NL
2262761472,2262892543,US
@@ -58815,15 +61808,13 @@
2276786176,2276851711,CA
2276851712,2277769215,US
2277769216,2277834751,GB
-2277834752,2280998911,US
-2280999168,2281007103,US
+2277834752,2281007103,US
2281007104,2281007359,IN
2281007360,2281023487,US
2281023488,2281023743,IN
-2281023744,2281029645,US
-2281029647,2281037837,US
-2281037839,2281043967,US
+2281023744,2281043967,US
2281043968,2281044031,FR
+2281044032,2281044063,US
2281044064,2281044223,FR
2281044224,2281701375,US
2281701376,2281705471,CH
@@ -58837,19 +61828,20 @@
2281750528,2281758719,CN
2281758720,2282225663,US
2282225664,2282226019,AU
+2282226020,2282226020,US
2282226021,2282226239,AU
+2282226240,2282226255,US
2282226256,2282226687,AU
-2282226688,2282226943,US
-2282227200,2282234111,US
+2282226688,2282234111,US
2282234112,2282234367,GB
-2282234368,2282264063,US
-2282264320,2282264575,US
-2282264832,2283151359,US
+2282234368,2283151359,US
2283151360,2283159551,IN
2283159552,2291142655,US
2291142656,2291144703,NL
2291144704,2291145727,ES
-2291145728,2291154943,NL
+2291145728,2291147775,NL
+2291147776,2291148799,CH
+2291148800,2291154943,NL
2291154944,2291171327,GB
2291171328,2291204095,NL
2291204096,2291269631,PR
@@ -58874,7 +61866,8 @@
2292908032,2292973567,US
2292973568,2293039103,DE
2293080576,2293081087,BE
-2293104640,2293825535,US
+2293104640,2293170175,US
+2293235712,2293825535,US
2293825536,2293891071,IN
2293891072,2293956607,AU
2293956608,2294022143,JP
@@ -58908,7 +61901,7 @@
2299658240,2300641279,US
2300641280,2300706815,FI
2300706816,2300772351,CH
-2300772352,2301296639,US
+2300837888,2301296639,US
2301296640,2301362175,IE
2301362176,2301427711,GB
2301427712,2301558783,US
@@ -58931,7 +61924,7 @@
2302360576,2302363647,IN
2302363648,2302364671,AU
2302364672,2302365695,IN
-2302365696,2302366719,HK
+2302365696,2302366719,MY
2302366720,2302367743,IN
2302367744,2302368767,CN
2302368768,2302370815,IN
@@ -58973,15 +61966,14 @@
2302672896,2302738431,MW
2302738432,2302935039,US
2302935040,2303000575,KR
-2303000576,2303190527,US
-2303190784,2303262719,US
+2303000576,2303262719,US
2303262720,2303328255,GB
2303328256,2303330303,PL
2303330304,2303330591,FR
2303330592,2303330623,GB
-2303330624,2303330808,FR
-2303330809,2303330809,DE
-2303330810,2303331263,FR
+2303330624,2303330687,FR
+2303330688,2303330815,DE
+2303330816,2303331263,FR
2303331264,2303331327,FI
2303331328,2303331903,FR
2303331904,2303331967,ES
@@ -58989,39 +61981,72 @@
2303332800,2303332831,GB
2303332832,2303332967,FR
2303332968,2303332971,GB
-2303332972,2303334271,FR
+2303332972,2303333871,FR
+2303333872,2303333887,CZ
+2303333888,2303333951,FR
+2303333952,2303334015,PL
+2303334016,2303334143,IT
+2303334144,2303334239,FR
+2303334240,2303334271,LT
2303334272,2303334399,ES
-2303334400,2303340639,FR
+2303334400,2303336543,FR
+2303336544,2303336575,PL
+2303336576,2303336943,FR
+2303336944,2303336959,PL
+2303336960,2303338111,FR
+2303338112,2303338239,DE
+2303338240,2303340639,FR
2303340640,2303340671,FI
-2303340672,2303341283,FR
+2303340672,2303340799,IT
+2303340800,2303341283,FR
2303341284,2303341287,FI
2303341288,2303341951,FR
2303341952,2303341967,ES
2303341968,2303342459,FR
2303342460,2303342463,DE
-2303342464,2303343039,FR
+2303342464,2303342975,FR
+2303342976,2303343007,CZ
+2303343008,2303343039,FR
2303343040,2303343103,PT
-2303343104,2303343435,FR
+2303343104,2303343183,FR
+2303343184,2303343199,PL
+2303343200,2303343231,LT
+2303343232,2303343359,BE
+2303343360,2303343435,FR
2303343436,2303343439,GB
2303343440,2303343487,FR
2303343488,2303343615,IE
-2303343616,2303343827,FR
+2303343616,2303343675,FR
+2303343676,2303343679,PL
+2303343680,2303343827,FR
2303343828,2303343831,DE
-2303343832,2303344471,FR
+2303343832,2303344127,FR
+2303344128,2303344191,CZ
+2303344192,2303344471,FR
2303344472,2303344479,IE
-2303344480,2303348863,FR
+2303344480,2303344511,PL
+2303344512,2303344559,FR
+2303344560,2303344575,PL
+2303344576,2303348863,FR
2303348864,2303348991,GB
2303348992,2303349119,FR
2303349120,2303349247,ES
2303349248,2303349383,FR
2303349384,2303349391,NL
-2303349392,2303350783,FR
+2303349392,2303350079,FR
+2303350080,2303350143,CZ
+2303350144,2303350399,FR
+2303350400,2303350527,IT
+2303350528,2303350783,FR
2303350784,2303351039,ES
2303351040,2303351055,FR
2303351056,2303351071,GB
-2303351072,2303352523,FR
+2303351072,2303351775,FR
+2303351776,2303351807,CZ
+2303351808,2303352523,FR
2303352524,2303352524,GB
-2303352525,2303353215,FR
+2303352525,2303353183,FR
+2303353184,2303353215,IT
2303353216,2303353343,GB
2303353344,2303353783,FR
2303353784,2303353787,GB
@@ -59029,7 +62054,11 @@
2303354556,2303354559,FI
2303354560,2303354639,FR
2303354640,2303354643,GB
-2303354644,2303361079,FR
+2303354644,2303355147,FR
+2303355148,2303355151,DE
+2303355152,2303356863,FR
+2303356864,2303356927,DE
+2303356928,2303361079,FR
2303361080,2303361087,GB
2303361088,2303361535,FR
2303361536,2303361599,GB
@@ -59037,19 +62066,36 @@
2303362064,2303362079,DE
2303362080,2303362303,FR
2303362304,2303362559,DE
-2303362560,2303365279,FR
+2303362560,2303363871,FR
+2303363872,2303363903,PL
+2303363904,2303365279,FR
2303365280,2303365295,GB
-2303365296,2303368579,FR
+2303365296,2303365679,FR
+2303365680,2303365695,NL
+2303365696,2303367923,FR
+2303367924,2303367927,DE
+2303367928,2303368579,FR
2303368580,2303368583,ES
-2303368584,2303374745,FR
+2303368584,2303373431,FR
+2303373432,2303373439,ES
+2303373440,2303374399,FR
+2303374400,2303374463,NL
+2303374464,2303374591,DE
+2303374592,2303374745,FR
2303374746,2303374746,ES
-2303374747,2303376807,FR
+2303374747,2303376783,FR
+2303376784,2303376799,PT
+2303376800,2303376807,FR
2303376808,2303376815,ES
2303376816,2303377311,FR
2303377312,2303377343,GB
-2303377344,2303382879,FR
+2303377344,2303381631,FR
+2303381632,2303381663,ES
+2303381664,2303382879,FR
2303382880,2303382895,ES
-2303382896,2303383503,FR
+2303382896,2303383151,FR
+2303383152,2303383167,LT
+2303383168,2303383503,FR
2303383504,2303383519,GB
2303383520,2303383807,FR
2303383808,2303383935,ES
@@ -59057,15 +62103,31 @@
2303384960,2303384991,GB
2303384992,2303385087,FR
2303385088,2303385103,FI
-2303385104,2303387535,FR
+2303385104,2303386879,FR
+2303386880,2303387007,BE
+2303387008,2303387535,FR
2303387536,2303387551,PT
-2303387552,2303388415,FR
+2303387552,2303387567,FI
+2303387568,2303387763,FR
+2303387764,2303387767,PL
+2303387768,2303387839,FR
+2303387840,2303387871,LT
+2303387872,2303388351,FR
+2303388352,2303388415,CZ
2303388416,2303388543,ES
-2303388544,2303391007,FR
+2303388544,2303390655,FR
+2303390656,2303390719,PL
+2303390720,2303391007,FR
2303391008,2303391039,IE
-2303391040,2303392843,FR
+2303391040,2303391103,FR
+2303391104,2303391231,GB
+2303391232,2303392843,FR
2303392844,2303392847,FI
-2303392848,2303393535,FR
+2303392848,2303392895,FR
+2303392896,2303392899,DE
+2303392900,2303393247,FR
+2303393248,2303393263,GB
+2303393264,2303393535,FR
2303393536,2303393567,PT
2303393568,2303393791,FR
2303393792,2303459327,US
@@ -59112,7 +62174,9 @@
2307196928,2307197951,FI
2307197952,2307198975,DE
2307198976,2307199999,SE
-2307200000,2307260415,NO
+2307200000,2307200511,NO
+2307200512,2307201023,PL
+2307201024,2307260415,NO
2307260416,2307278847,US
2307278848,2307280895,AU
2307280896,2307358719,US
@@ -59243,8 +62307,7 @@
2317413376,2317413631,ID
2317413632,2317414655,US
2317414656,2317414911,AU
-2317414912,2317417983,US
-2317418240,2317484031,US
+2317414912,2317484031,US
2317484032,2317487359,CA
2317487360,2317487615,US
2317487616,2317549567,CA
@@ -59263,7 +62326,9 @@
2317638656,2317639679,HN
2317639680,2317640703,AR
2317640704,2317649919,BR
-2317649920,2317650943,HN
+2317649920,2317649991,HN
+2317649992,2317649999,US
+2317650000,2317650943,HN
2317650944,2317651967,BR
2317651968,2317652991,PE
2317652992,2317654015,AR
@@ -59286,7 +62351,9 @@
2318598144,2318663679,CA
2318663680,2319122431,US
2319122432,2319123455,AR
-2319123456,2319124479,HN
+2319123456,2319123999,HN
+2319124000,2319124007,US
+2319124008,2319124479,HN
2319124480,2319125503,VE
2319125504,2319126527,UY
2319126528,2319127551,CR
@@ -59304,12 +62371,14 @@
2319158272,2319159295,AR
2319159296,2319160319,BR
2319160320,2319161343,PA
-2319161344,2319164415,BR
+2319162368,2319164415,BR
2319164416,2319165439,PY
2319165440,2319167487,AR
2319167488,2319168511,HN
2319169536,2319174655,BR
-2319174656,2319175679,HN
+2319174656,2319175647,HN
+2319175648,2319175663,BR
+2319175664,2319175679,HN
2319175680,2319184895,BR
2319184896,2319185919,AR
2319185920,2319187967,BR
@@ -59348,14 +62417,26 @@
2321420288,2321430527,BR
2321430528,2321431551,CR
2321431552,2321446911,BR
-2321446912,2321447935,HN
+2321446912,2321447263,HN
+2321447264,2321447279,NL
+2321447280,2321447647,HN
+2321447648,2321447679,NL
+2321447680,2321447727,HN
+2321447728,2321447743,NL
+2321447744,2321447935,HN
2321447936,2321452031,BR
2321452032,2321453055,MX
-2321453056,2321454079,HN
+2321453056,2321453359,HN
+2321453360,2321453367,NL
+2321453368,2321453487,HN
+2321453488,2321453495,CA
+2321453496,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
@@ -59387,7 +62468,13 @@
2321743872,2321744895,SV
2321744896,2321745919,AR
2321745920,2321753087,BR
-2321753088,2321754111,HN
+2321753088,2321753359,HN
+2321753360,2321753375,NL
+2321753376,2321753599,HN
+2321753600,2321753607,NL
+2321753608,2321753927,HN
+2321753928,2321753935,NL
+2321753936,2321754111,HN
2321754112,2321755135,BR
2321755136,2321756159,UY
2321756160,2321769471,BR
@@ -59556,15 +62643,180 @@
2323315712,2323316735,MX
2323316736,2323382271,US
2323382272,2323447807,NO
-2323447808,2323648007,US
+2323447808,2323644431,US
+2323644432,2323644495,CA
+2323644496,2323644511,US
+2323644512,2323644543,CA
+2323644544,2323644575,US
+2323644576,2323644607,CA
+2323644608,2323644623,US
+2323644624,2323644639,CA
+2323644640,2323644719,US
+2323644720,2323644799,CA
+2323644800,2323644895,US
+2323644896,2323644927,CA
+2323644928,2323645071,US
+2323645072,2323645087,CA
+2323645088,2323645119,US
+2323645120,2323645135,CA
+2323645136,2323645151,US
+2323645152,2323645199,CA
+2323645200,2323645263,US
+2323645264,2323645279,CA
+2323645280,2323645471,US
+2323645472,2323645503,CA
+2323645504,2323645535,US
+2323645536,2323645567,CA
+2323645568,2323645663,US
+2323645664,2323645695,CA
+2323645696,2323645759,US
+2323645760,2323645823,CA
+2323645824,2323645951,US
+2323645952,2323645983,CA
+2323645984,2323645999,US
+2323646000,2323646015,CA
+2323646016,2323646079,US
+2323646080,2323646127,CA
+2323646128,2323646335,US
+2323646336,2323646383,CA
+2323646384,2323646415,US
+2323646416,2323646479,CA
+2323646480,2323646495,US
+2323646496,2323646527,CA
+2323646528,2323646783,US
+2323646784,2323646799,CA
+2323646800,2323646815,US
+2323646816,2323646831,CA
+2323646832,2323646911,US
+2323646912,2323646975,CA
+2323646976,2323647119,US
+2323647120,2323647135,CA
+2323647136,2323647199,US
+2323647200,2323647215,CA
+2323647216,2323647311,US
+2323647312,2323647407,CA
+2323647408,2323647487,US
+2323647488,2323647519,CA
+2323647520,2323647535,US
+2323647536,2323647615,CA
+2323647616,2323647743,US
+2323647744,2323647775,CA
+2323647776,2323647791,US
+2323647792,2323647807,CA
+2323647808,2323647871,US
+2323647872,2323647935,CA
+2323647936,2323647999,US
+2323648000,2323648007,CA
2323648008,2323648015,FI
-2323648016,2323649823,US
+2323648016,2323648031,US
+2323648032,2323648063,CA
+2323648064,2323648319,US
+2323648320,2323648335,CA
+2323648336,2323648351,US
+2323648352,2323648383,CA
+2323648384,2323648639,US
+2323648640,2323648655,CA
+2323648656,2323648671,US
+2323648672,2323648703,CA
+2323648704,2323648767,US
+2323648768,2323649023,CA
+2323649024,2323649279,US
+2323649280,2323649751,CA
+2323649752,2323649759,US
+2323649760,2323649775,CA
+2323649776,2323649783,US
+2323649784,2323649823,CA
2323649824,2323649831,NO
-2323649832,2323650007,US
+2323649832,2323650007,CA
2323650008,2323650015,RO
-2323650016,2323650183,US
+2323650016,2323650183,CA
2323650184,2323650191,FI
-2323650192,2323690495,US
+2323650192,2323650239,CA
+2323650240,2323650255,US
+2323650256,2323651327,CA
+2323651328,2323651583,US
+2323651584,2323652287,CA
+2323652288,2323652335,US
+2323652336,2323653119,CA
+2323653120,2323653135,US
+2323653136,2323653151,CA
+2323653152,2323653375,US
+2323653376,2323653631,CA
+2323653632,2323653887,US
+2323653888,2323655423,CA
+2323655424,2323655487,US
+2323655488,2323655551,CA
+2323655552,2323655807,US
+2323655808,2323655871,CA
+2323655872,2323655935,US
+2323655936,2323656031,CA
+2323656032,2323656207,US
+2323656208,2323656255,CA
+2323656256,2323656271,US
+2323656272,2323656287,CA
+2323656288,2323656447,US
+2323656448,2323656719,CA
+2323656720,2323656735,US
+2323656736,2323656767,CA
+2323656768,2323656815,US
+2323656816,2323656831,CA
+2323656832,2323656895,US
+2323656896,2323656927,CA
+2323656928,2323656959,US
+2323656960,2323657215,CA
+2323657216,2323657263,US
+2323657264,2323657279,CA
+2323657280,2323657311,US
+2323657312,2323657343,CA
+2323657344,2323657535,US
+2323657536,2323657663,CA
+2323657664,2323657695,US
+2323657696,2323657711,CA
+2323657712,2323657759,US
+2323657760,2323657775,CA
+2323657776,2323657839,US
+2323657840,2323657919,CA
+2323657920,2323658495,US
+2323658496,2323658751,CA
+2323658752,2323659007,US
+2323659008,2323659263,CA
+2323659264,2323659519,US
+2323659520,2323660031,CA
+2323660032,2323660191,US
+2323660192,2323661631,CA
+2323661632,2323661823,US
+2323661824,2323663103,CA
+2323663104,2323663679,US
+2323663680,2323665919,CA
+2323665920,2323666687,US
+2323666688,2323668223,CA
+2323668224,2323668991,US
+2323668992,2323669759,CA
+2323669760,2323670015,US
+2323670016,2323670271,CA
+2323670272,2323671039,US
+2323671040,2323671295,CA
+2323671296,2323671551,US
+2323671552,2323672063,CA
+2323672064,2323672127,US
+2323672128,2323672191,CA
+2323672192,2323672383,US
+2323672384,2323672463,CA
+2323672464,2323672479,US
+2323672480,2323672511,CA
+2323672512,2323672575,US
+2323672576,2323672591,CA
+2323672592,2323672607,US
+2323672608,2323672639,CA
+2323672640,2323672735,US
+2323672736,2323672767,CA
+2323672768,2323672831,US
+2323672832,2323672847,CA
+2323672848,2323672863,US
+2323672864,2323672895,CA
+2323672896,2323672959,US
+2323672960,2323673055,CA
+2323673056,2323690495,US
2323690496,2323690751,IN
2323690752,2323699711,US
2323699712,2323700735,NL
@@ -59587,7 +62839,8 @@
2327398400,2327399423,BR
2327399424,2327400447,BZ
2327400448,2327401471,AR
-2327401472,2327406591,BR
+2327401472,2327402495,BR
+2327403520,2327406591,BR
2327406592,2327407615,NI
2327407616,2327408639,BR
2327408640,2327409663,AR
@@ -59622,7 +62875,11 @@
2327477248,2327480319,BR
2327480320,2327481007,HN
2327481008,2327481023,US
-2327481024,2327481343,HN
+2327481024,2327481055,HN
+2327481056,2327481071,US
+2327481072,2327481135,HN
+2327481136,2327481143,US
+2327481144,2327481343,HN
2327481344,2327482367,AR
2327482368,2327483391,BR
2327483392,2327485439,AR
@@ -59635,9 +62892,17 @@
2327494656,2327496703,BR
2327496704,2327497727,MX
2327497728,2327498751,BR
-2327498752,2327499343,HN
+2327498752,2327499055,HN
+2327499056,2327499063,CL
+2327499064,2327499343,HN
2327499344,2327499351,CL
-2327499352,2327499775,HN
+2327499352,2327499623,HN
+2327499624,2327499631,CL
+2327499632,2327499639,HN
+2327499640,2327499647,CL
+2327499648,2327499655,HN
+2327499656,2327499663,CL
+2327499664,2327499775,HN
2327499776,2327501823,AR
2327501824,2327507967,BR
2327507968,2327508991,AR
@@ -59649,7 +62914,8 @@
2328035328,2328100863,FR
2328100864,2328199167,US
2328199168,2328211455,CA
-2328211456,2328231935,US
+2328211456,2328215551,DE
+2328215552,2328231935,US
2328231936,2328297471,GB
2328313856,2328317951,NL
2328342528,2328342783,DE
@@ -59708,14 +62974,17 @@
2329627648,2329628671,BR
2329628672,2329629695,AR
2329629696,2329638911,BR
-2329638912,2329639935,HN
+2329638912,2329639071,HN
+2329639072,2329639087,NL
+2329639088,2329639935,HN
2329639936,2329644031,BR
2329644032,2329645055,CW
2329645056,2329648127,BR
2329648128,2329649151,SV
2329649152,2329650175,AR
2329650176,2329652223,BR
-2329652224,2329653247,HN
+2329652224,2329652735,US
+2329652736,2329653247,HN
2329653248,2329662463,BR
2329662464,2329664511,AR
2329664512,2329666559,BR
@@ -59792,7 +63061,8 @@
2332384256,2332385279,CN
2332385280,2332387327,IN
2332387328,2332388351,BD
-2332388352,2332389375,CN
+2332388352,2332388863,HK
+2332388864,2332389375,CN
2332389376,2332393471,AU
2332393472,2332394495,CN
2332394496,2332395519,BD
@@ -59807,7 +63077,8 @@
2332404736,2332405759,AU
2332405760,2332406783,MY
2332406784,2332407807,HK
-2332407808,2332408831,US
+2332407808,2332408575,US
+2332408576,2332408831,GB
2332408832,2332409855,BD
2332409856,2332410879,CN
2332410880,2332411903,IN
@@ -59874,6 +63145,7 @@
2337931264,2337996799,BE
2337996800,2338062335,GR
2338115072,2338115839,IL
+2338123520,2338123775,IT
2338127872,2338324479,US
2338324480,2338390015,SE
2338390016,2338455551,FI
@@ -59997,7 +63269,9 @@
2355470320,2355470335,SG
2355470336,2355482607,US
2355482608,2355482623,HK
-2355482624,2355691519,US
+2355482624,2355491311,US
+2355491312,2355491327,AU
+2355491328,2355691519,US
2355691520,2355757055,IT
2355757056,2355953663,US
2355953664,2357919743,TW
@@ -60055,9 +63329,8 @@
2364671744,2364675839,US
2364675840,2364676095,CA
2364676096,2364676863,US
-2364676868,2364681727,US
-2364681984,2364724735,US
-2364724992,2364725503,US
+2364676864,2364676867,GB
+2364676868,2364725503,US
2364725504,2364725759,IL
2364725760,2364727807,US
2364727808,2364728063,DE
@@ -60072,9 +63345,11 @@
2365456384,2365521919,US
2365521920,2365587455,CN
2365587456,2365589503,JO
+2365589504,2365590527,SG
2365590528,2365590671,NO
2365590672,2365590672,FR
2365590673,2365591039,NO
+2365591040,2365591295,US
2365591296,2365591551,NO
2365591552,2365593599,DE
2365593600,2365595647,NL
@@ -60088,8 +63363,7 @@
2365638656,2365640703,FR
2365640704,2365644799,GB
2365644800,2365652991,NO
-2365652992,2365983487,DE
-2365983520,2366032895,DE
+2365652992,2366032895,DE
2366032896,2366033151,GB
2366033152,2366111743,DE
2366111744,2366144511,MT
@@ -60142,14 +63416,13 @@
2372075520,2372206591,DE
2372206592,2372214783,UA
2372214784,2372218879,DE
-2372218880,2372222207,FR
-2372222208,2372222975,CH
+2372218880,2372221951,FR
+2372221952,2372222975,CH
2372222976,2372223487,NL
2372223488,2372224511,FR
2372224512,2372225023,GB
2372225024,2372225791,US
-2372225792,2372226303,NL
-2372226304,2372226559,SG
+2372225792,2372226559,NL
2372226560,2372227071,US
2372227072,2372227583,SE
2372227584,2372228607,KR
@@ -60162,15 +63435,21 @@
2372233216,2372233727,NL
2372233728,2372234239,GB
2372234240,2372235263,CO
-2372235264,2372239359,US
-2372239360,2372240383,SK
+2372239360,2372239564,SK
+2372239565,2372239580,IT
+2372239581,2372240383,SK
2372240384,2372240511,NL
2372240512,2372240639,LU
2372240640,2372240895,NL
2372240896,2372241151,CH
2372241152,2372241407,PK
2372241408,2372243199,RU
-2372243200,2372251391,NL
+2372243200,2372243455,RO
+2372243456,2372243711,DK
+2372243712,2372243967,AM
+2372243968,2372244223,NO
+2372244224,2372244479,BN
+2372244480,2372251391,US
2372251392,2372272127,RU
2372272128,2372337663,US
2372337664,2372403199,ID
@@ -60212,6 +63491,7 @@
2373517312,2373582847,US
2373582848,2373648383,CH
2373648384,2373911041,US
+2373911042,2373911042,FI
2373911043,2374107135,US
2374107136,2374172671,DE
2374172672,2374238207,US
@@ -60220,7 +63500,7 @@
2374369280,2374500351,BE
2374500352,2374502399,LV
2374502400,2374504447,MK
-2374504448,2374508543,RO
+2374504448,2374508543,US
2374508544,2374512639,LT
2374512640,2374514687,SK
2374514688,2374516735,ES
@@ -60260,9 +63540,11 @@
2375155712,2375221247,US
2375221248,2375286783,SE
2375286784,2375352319,CH
-2375352320,2376083711,US
-2376083712,2376083839,AU
-2376083840,2376269823,US
+2375352320,2376083199,US
+2376083200,2376083455,CA
+2376083456,2376083711,US
+2376083712,2376083967,AU
+2376083968,2376269823,US
2376269824,2376335359,GB
2376335360,2376597503,US
2376597504,2376663039,AU
@@ -60288,6 +63570,7 @@
2378022912,2378023423,HK
2378023424,2378025983,US
2378025984,2378026239,NL
+2378026240,2378026495,US
2378026496,2378027007,FR
2378027008,2378170367,US
2378170368,2378203135,FI
@@ -60298,15 +63581,15 @@
2378235904,2378236415,CA
2378236416,2378238975,ES
2378238976,2378239487,CA
-2378239488,2378301439,ES
-2378301440,2378303231,FR
-2378303488,2378366975,FR
+2378239488,2378242047,ES
+2378242048,2378242303,US
+2378242304,2378301439,ES
+2378301440,2378366975,FR
2378366976,2378432511,US
2378432512,2378498047,TR
2378498048,2378500607,US
2378500608,2378500863,GB
-2378500864,2378501631,US
-2378501888,2378694655,US
+2378500864,2378694655,US
2378694656,2378760191,DE
2378760192,2378825727,AT
2378825728,2378891263,US
@@ -60320,13 +63603,18 @@
2380267520,2380398591,US
2380398592,2380420095,IL
2380420096,2380420863,GB
-2380420864,2380430847,IL
+2380420864,2380423167,IL
+2380423168,2380427263,US
+2380427264,2380429311,GB
+2380429312,2380430847,IL
2380430848,2380431103,GB
2380431104,2380431615,IL
2380431616,2380431871,US
2380431872,2380432127,TH
2380432128,2380432383,US
-2380432384,2380434431,IL
+2380432384,2380433407,IL
+2380433408,2380434175,US
+2380434176,2380434431,IL
2380434432,2380435455,US
2380435456,2380455935,IL
2380455936,2380456447,US
@@ -60337,13 +63625,12 @@
2380457984,2380464127,IL
2380464128,2380464639,FR
2380464640,2380465151,US
-2380465152,2380465407,FR
+2380465152,2380465439,FR
2380465440,2380465443,SG
-2380465664,2380529663,FR
+2380465444,2380529663,FR
2380529664,2380558335,GB
2380558336,2380562431,ZA
-2380562432,2380593663,GB
-2380593920,2380595199,GB
+2380562432,2380595199,GB
2380660736,2380726271,US
2380726272,2380791807,GB
2380791808,2381119487,US
@@ -60442,7 +63729,9 @@
2388330496,2388332543,NL
2388332544,2388350207,US
2388350208,2388350463,LK
-2388350464,2388367359,US
+2388350464,2388359167,US
+2388359168,2388361215,NL
+2388361216,2388367359,US
2388367360,2388369407,NL
2388369408,2388393983,US
2388393984,2389245951,CA
@@ -60507,7 +63796,9 @@
2398945280,2399010815,CA
2399010816,2399109119,US
2399109120,2399141887,PR
-2399141888,2399150079,BR
+2399141888,2399148031,BR
+2399148032,2399149055,DO
+2399149056,2399150079,BR
2399150080,2399151103,BQ
2399151104,2399158271,BR
2399158272,2399159295,AR
@@ -60529,13 +63820,14 @@
2399186944,2399202303,BR
2399202304,2399202591,HN
2399202592,2399202623,NL
-2399202624,2399203327,HN
+2399202624,2399203031,HN
+2399203032,2399203039,UY
+2399203040,2399203327,HN
2399203328,2399204351,CL
2399204352,2399205375,AR
2399205376,2399206399,PE
2399206400,2399207423,BR
-2399207424,2401036287,US
-2401036544,2401828863,US
+2399207424,2401828863,US
2401828864,2401894399,GB
2401894400,2402222079,US
2402222080,2402287615,IE
@@ -60592,10 +63884,14 @@
2408158208,2408159231,CR
2408159232,2408162303,BR
2408162304,2408164351,HN
-2408164352,2408169471,BR
+2408165376,2408169471,BR
2408169472,2408170495,TT
2408170496,2408178687,BR
-2408178688,2408179711,HN
+2408178688,2408179375,HN
+2408179376,2408179391,IT
+2408179392,2408179423,HN
+2408179424,2408179431,IT
+2408179432,2408179711,HN
2408179712,2408182783,BR
2408182784,2408183807,AR
2408183808,2408185855,BR
@@ -60749,15 +64045,16 @@
2416114688,2416115711,NL
2416115712,2416181247,US
2416181248,2416246783,FI
-2416246784,2416312319,US
+2416246784,2416261993,US
+2416261994,2416261994,TH
+2416261995,2416312319,US
2416312320,2416377855,AU
2416377856,2416443391,CN
2416443392,2416705535,US
2416705536,2416771071,CN
2416771072,2416916479,US
2416916480,2416916991,SG
-2416916992,2416963583,US
-2416963840,2416967679,US
+2416916992,2416967679,US
2416967680,2417033215,IN
2417033216,2417229823,US
2417229824,2417295359,ES
@@ -60977,10 +64274,9 @@
2421555200,2421620735,US
2421620736,2421686271,GB
2421686272,2422145023,US
-2422145024,2422153215,NL
-2422153472,2422154239,NL
+2422145024,2422154239,NL
2422154240,2422155263,US
-2422155520,2422161407,NL
+2422155264,2422161407,NL
2422161408,2422163455,GB
2422163456,2422165503,US
2422165504,2422167551,HK
@@ -61010,23 +64306,52 @@
2426732544,2426798079,FR
2426798080,2426942463,US
2426942464,2426943487,CA
-2426943488,2427224063,US
+2426943488,2426970111,US
+2426970112,2426972159,CA
+2426972160,2427224063,US
2427224064,2427256831,CA
2427256832,2427322367,GB
2427322368,2427453439,US
2427453440,2427536895,NO
2427536896,2427537151,US
-2427537152,2427544575,NO
-2427544832,2427584511,NO
-2427584512,2427625471,GB
+2427537152,2427584511,NO
+2427584512,2427591945,GB
+2427591946,2427591946,AT
+2427591947,2427591947,BE
+2427591948,2427591948,CZ
+2427591949,2427591949,DK
+2427591950,2427591950,FI
+2427591951,2427591951,FR
+2427591952,2427591952,DE
+2427591953,2427591953,HU
+2427591954,2427591954,IT
+2427591955,2427591955,NO
+2427591956,2427591956,PL
+2427591957,2427591957,PT
+2427591958,2427591958,RU
+2427591959,2427591959,SA
+2427591960,2427591960,ES
+2427591961,2427591961,SE
+2427591962,2427591962,CH
+2427591963,2427591963,NL
+2427591964,2427591964,TR
+2427591965,2427591965,AE
+2427591966,2427591999,GB
+2427592000,2427592015,IE
+2427592016,2427592031,IL
+2427592032,2427592047,IN
+2427592048,2427592191,GB
+2427592192,2427592207,SG
+2427592208,2427592223,JP
+2427592224,2427592239,AU
+2427592240,2427592255,CN
+2427592256,2427625471,GB
2427625472,2427633663,ES
2427633664,2427650047,GB
2427650048,2427846655,NO
-2427846656,2428183562,US
-2428183564,2428567551,US
+2427846656,2428567551,US
2428567552,2428633087,NO
-2428633088,2428696831,CA
-2428697088,2428698623,CA
+2428633088,2428698623,CA
2428698624,2428960767,US
2428960768,2429026303,MY
2429026304,2429091839,CH
@@ -61036,7 +64361,9 @@
2429419520,2429485055,RU
2429485056,2429550591,US
2429550592,2429566975,AT
-2429566976,2429573119,US
+2429566976,2429571071,US
+2429571072,2429572095,CA
+2429572096,2429573119,US
2429573120,2429573375,CA
2429573376,2429575167,US
2429575168,2429577215,CA
@@ -61096,9 +64423,9 @@
2436634624,2436694015,BE
2436694016,2436759551,NL
2436759552,2436767743,GB
+2436767744,2436767999,NL
2436768000,2436775935,GB
-2436775936,2436780127,DE
-2436780132,2436784127,DE
+2436775936,2436784127,DE
2436784128,2436825087,GB
2436825088,2441196707,NL
2441196708,2441196708,BE
@@ -61121,8 +64448,80 @@
2448183552,2448228351,HU
2448228352,2448293887,PL
2448293888,2448359423,FR
-2448359424,2448424959,GB
-2448424960,2448490495,FR
+2448359424,2448360447,DE
+2448360448,2448361471,GB
+2448361472,2448363583,FR
+2448363584,2448363711,PL
+2448363712,2448363839,FR
+2448363840,2448363903,PL
+2448363904,2448363967,FR
+2448363968,2448364159,PL
+2448364160,2448364287,FR
+2448364288,2448364351,PL
+2448364352,2448364415,FR
+2448364416,2448364543,PL
+2448364544,2448364607,FR
+2448364608,2448364735,PL
+2448364736,2448364863,FR
+2448364864,2448364927,PL
+2448364928,2448366591,FR
+2448366592,2448367615,PL
+2448367616,2448369507,FR
+2448369508,2448369511,DE
+2448369512,2448369887,FR
+2448369888,2448369903,GB
+2448369904,2448372031,FR
+2448372032,2448372047,ES
+2448372048,2448374335,FR
+2448374336,2448374351,ES
+2448374352,2448374399,FR
+2448374400,2448374527,GB
+2448374528,2448375759,FR
+2448375760,2448375775,ES
+2448375776,2448379903,FR
+2448379904,2448383999,PL
+2448384000,2448386047,FR
+2448386048,2448386175,GB
+2448386176,2448387199,FR
+2448387200,2448387327,DE
+2448387328,2448388351,FR
+2448388352,2448388479,ES
+2448388480,2448389631,FR
+2448389632,2448389759,NL
+2448389760,2448389887,GB
+2448389888,2448390399,FR
+2448390400,2448390527,ES
+2448390528,2448390655,DE
+2448390656,2448390911,FR
+2448390912,2448391039,IE
+2448391040,2448393471,FR
+2448393472,2448394239,PL
+2448394240,2448394303,DE
+2448394304,2448394463,FR
+2448394464,2448394479,DE
+2448394480,2448397311,FR
+2448397312,2448398335,DE
+2448398336,2448401847,FR
+2448401848,2448401855,GB
+2448401856,2448402943,FR
+2448402944,2448403071,GB
+2448403072,2448403199,FR
+2448403200,2448403455,GB
+2448403456,2448404415,FR
+2448404416,2448404447,GB
+2448404448,2448404479,FR
+2448404480,2448404511,GB
+2448404512,2448406623,FR
+2448406624,2448406655,FI
+2448406656,2448407807,FR
+2448407808,2448407935,ES
+2448407936,2448410623,FR
+2448410624,2448410687,GB
+2448410688,2448412671,FR
+2448412672,2448412799,DE
+2448412800,2448415487,FR
+2448415488,2448415615,IT
+2448415616,2448490495,FR
2448490496,2448556031,AT
2448556032,2448621567,FR
2448621568,2448687103,DE
@@ -61195,11 +64594,9 @@
2450849792,2450915327,SE
2450915328,2451026431,US
2451026432,2451026687,AU
-2451026688,2451031039,US
-2451031296,2451032063,US
+2451026688,2451032063,US
2451032064,2451033087,AU
-2451033088,2451035135,US
-2451035392,2452619263,US
+2451033088,2452619263,US
2452619264,2452684799,IT
2452684800,2452750335,US
2452750336,2452815871,NL
@@ -61311,10 +64708,11 @@
2456158208,2456223743,CZ
2456223744,2456289279,BE
2456289280,2456354815,NL
-2456354816,2456420351,GB
+2456354816,2456406015,GB
+2456406016,2456408063,FR
+2456408064,2456420351,GB
2456485888,2456551423,DE
-2456551424,2456603135,AT
-2456603392,2456616959,AT
+2456551424,2456616959,AT
2456616960,2456682495,CH
2456682496,2456748031,HU
2456748032,2456813567,US
@@ -61373,21 +64771,25 @@
2457382400,2457382911,CZ
2457382912,2457383935,RU
2457383936,2457384959,UA
-2457384960,2457388031,RU
-2457388032,2457388543,CZ
+2457384960,2457388543,RU
2457388544,2457388799,UA
2457388800,2457390591,CZ
2457390592,2457392127,RU
-2457392128,2457393151,CZ
+2457392128,2457392639,KG
+2457392640,2457393151,CZ
2457393152,2457394175,RU
2457394176,2457394431,UA
2457394432,2457394687,RU
-2457394688,2457394943,CZ
+2457394688,2457394943,UA
2457394944,2457395455,RU
2457395456,2457395711,UA
2457395712,2457396223,CZ
2457396224,2457397247,DE
-2457397248,2457402367,RU
+2457397248,2457399295,RU
+2457399296,2457399551,UA
+2457399552,2457399807,RU
+2457399808,2457400831,CZ
+2457400832,2457402367,RU
2457402368,2457403391,SY
2457403392,2457520895,US
2457520896,2457521151,BE
@@ -61403,8 +64805,7 @@
2458451968,2458648575,US
2458648576,2458714111,DE
2458714112,2458779647,ZA
-2458779648,2459191295,US
-2459191552,2459631615,US
+2458779648,2459631615,US
2459631616,2459697151,CL
2459697152,2459828223,US
2459828224,2459846655,RU
@@ -61694,8 +65095,7 @@
2467233792,2468020223,US
2468020224,2468085759,GR
2468085760,2468151295,US
-2468151296,2468180479,DK
-2468180736,2468200447,DK
+2468151296,2468200447,DK
2468200448,2468204543,SE
2468204544,2468216831,DK
2468216832,2468282367,KZ
@@ -61715,8 +65115,7 @@
2469724160,2469789695,US
2469789696,2469855231,DE
2469855232,2470182911,US
-2470182912,2470183167,CH
-2470183424,2470248447,CH
+2470182912,2470248447,CH
2470248448,2470510591,US
2470510592,2470576127,BR
2470576128,2470641663,AU
@@ -61746,7 +65145,8 @@
2472214528,2472280063,RS
2472280064,2472296447,US
2472296448,2472300543,CA
-2472300544,2472312831,US
+2472300544,2472302591,PR
+2472302592,2472312831,US
2472312832,2472345599,JP
2472345600,2472411135,BE
2472411136,2472476671,FR
@@ -61773,9 +65173,9 @@
2473459712,2473525247,ZA
2473525248,2473656319,NO
2473656320,2473721855,US
-2473721856,2473785599,GB
+2473721856,2473785708,GB
2473785709,2473785709,HK
-2473785856,2473787391,GB
+2473785710,2473787391,GB
2473787392,2474049535,US
2474049536,2474115071,GB
2474115072,2474246143,US
@@ -61789,42 +65189,98 @@
2474967040,2475130879,US
2475130880,2475139391,FR
2475139392,2475139455,ES
-2475139456,2475143359,FR
+2475139456,2475141935,FR
+2475141936,2475141951,FI
+2475141952,2475143295,FR
+2475143296,2475143359,DE
2475143360,2475143423,IE
2475143424,2475143551,GB
-2475143552,2475143647,FR
+2475143552,2475143615,BE
+2475143616,2475143647,CZ
2475143648,2475143679,PT
-2475143680,2475145151,FR
+2475143680,2475143743,DE
+2475143744,2475143807,FR
+2475143808,2475143935,DE
+2475143936,2475143999,FR
+2475144000,2475144063,IT
+2475144064,2475145087,FR
+2475145088,2475145151,BE
2475145152,2475145215,ES
2475145216,2475145343,FR
2475145344,2475145471,GB
2475145472,2475145727,FR
2475145728,2475145855,GB
-2475145856,2475146943,FR
+2475145856,2475145919,DE
+2475145920,2475146063,FR
+2475146064,2475146079,LT
+2475146080,2475146239,FR
+2475146240,2475146303,IT
+2475146304,2475146495,FR
+2475146496,2475146559,NL
+2475146560,2475146943,FR
2475146944,2475146975,PT
-2475146976,2475149311,FR
+2475146976,2475148351,FR
+2475148352,2475148415,PL
+2475148416,2475148521,FR
+2475148522,2475148522,PL
+2475148523,2475148543,FR
+2475148544,2475148607,PL
+2475148608,2475148671,FR
+2475148672,2475148735,PL
+2475148736,2475148796,FR
+2475148797,2475148797,PL
+2475148798,2475149119,FR
+2475149120,2475149247,PL
+2475149248,2475149279,FR
+2475149280,2475149311,PL
2475149312,2475149375,ES
-2475149376,2475149695,FR
+2475149376,2475149567,FR
+2475149568,2475149583,CH
+2475149584,2475149599,LT
+2475149600,2475149695,FR
2475149696,2475149823,IE
-2475149824,2475150207,FR
+2475149824,2475149951,DE
+2475149952,2475150207,FR
2475150208,2475150335,GB
2475150336,2475150495,FR
2475150496,2475150527,FI
-2475150528,2475153471,FR
+2475150528,2475151231,FR
+2475151232,2475151359,IT
+2475151360,2475152383,PL
+2475152384,2475153471,FR
2475153472,2475153535,GB
-2475153536,2475155807,FR
+2475153536,2475153663,FR
+2475153664,2475153919,GB
+2475153920,2475155807,FR
2475155808,2475155839,GB
2475155840,2475156063,FR
2475156064,2475156095,FI
2475156096,2475156479,FR
2475156480,2475156607,ES
-2475156608,2475159711,FR
+2475156608,2475157887,FR
+2475157888,2475158015,BE
+2475158016,2475159423,FR
+2475159424,2475159551,DE
+2475159552,2475159711,FR
2475159712,2475159743,ES
2475159744,2475160063,FR
2475160064,2475160079,GB
-2475160080,2475161087,FR
+2475160080,2475160351,FR
+2475160352,2475160383,PL
+2475160384,2475160447,FR
+2475160448,2475160575,NL
+2475160576,2475161087,FR
2475161088,2475161215,ES
-2475161216,2475163647,FR
+2475161216,2475161407,FR
+2475161408,2475161439,FI
+2475161440,2475161471,PL
+2475161472,2475161983,FR
+2475161984,2475161999,LT
+2475162000,2475162351,FR
+2475162352,2475162367,ES
+2475162368,2475162495,DE
+2475162496,2475162623,IT
+2475162624,2475163647,FR
2475163648,2475556863,US
2475556864,2475622399,DE
2475622400,2475687935,GB
@@ -61833,7 +65289,7 @@
2476277760,2476474367,US
2476474368,2476539903,ES
2476539904,2476605439,JP
-2476605440,2476670975,NZ
+2476605440,2476670975,MY
2476670976,2476802047,US
2476802048,2476867583,IL
2476867584,2476998655,IT
@@ -61849,8 +65305,7 @@
2477850624,2478047231,US
2478047232,2478112767,SE
2478112768,2478178303,NL
-2478178304,2478229759,US
-2478230016,2478309375,US
+2478178304,2478309375,US
2478309376,2478374911,GB
2478374912,2478440447,US
2478440448,2478505983,SE
@@ -61865,8 +65320,7 @@
2479226880,2479357951,US
2479357952,2479423487,AU
2479423488,2479489023,GB
-2479489024,2479585279,US
-2479585536,2479620095,US
+2479489024,2479620095,US
2479620096,2479685631,DE
2479685632,2479947775,US
2479947776,2480013311,AU
@@ -61910,9 +65364,11 @@
2486928896,2486929151,CA
2486929152,2486929407,US
2486929408,2486929663,CA
-2486929664,2486945535,US
-2486945536,2486945551,CA
-2486945552,2486946815,US
+2486929664,2486940671,US
+2486940672,2486941183,CA
+2486941184,2486945279,US
+2486945280,2486945791,CA
+2486945792,2486946815,US
2486946816,2486947327,CA
2486947328,2486949887,US
2486949888,2486951423,CA
@@ -61924,11 +65380,13 @@
2486960128,2487025663,FR
2487025664,2487156735,US
2487156736,2487222271,PT
-2487222272,2487353343,US
+2487222272,2487238655,US
+2487238656,2487246847,CA
+2487246848,2487353343,US
2487353344,2487361535,HK
2487361536,2487363583,US
2487363584,2487365631,CA
-2487365632,2487369727,US
+2487365632,2487369727,HK
2487369728,2487386111,PF
2487386112,2487394303,SG
2487394304,2487418879,US
@@ -61952,15 +65410,13 @@
2489778176,2489843711,DO
2489843712,2489992447,US
2489992448,2489992703,HK
-2489992704,2489995544,US
-2489995546,2489999103,US
+2489992704,2489999103,US
2489999104,2489999359,AU
2489999360,2490013695,US
2490013696,2490014011,GB
2490014012,2490014012,US
2490014013,2490015743,GB
-2490015744,2490041599,US
-2490041856,2490043391,US
+2490015744,2490043391,US
2490043392,2490043647,GB
2490043648,2490236927,US
2490236928,2490302463,LU
@@ -61988,15 +65444,13 @@
2493740032,2493740095,CN
2493740096,2493756415,US
2493756416,2493757439,CA
-2493757440,2494103551,US
+2493758464,2494103551,US
2494103552,2494169087,FR
2494169088,2494562303,US
2494562304,2494627839,GB
-2494627840,2494660607,US
-2494661120,2494670963,US
-2494670968,2494675331,US
-2494675334,2494676991,US
+2494627840,2494676991,US
2494676992,2494683391,AU
+2494683392,2494683647,US
2494683648,2494685183,AU
2494685184,2494689791,US
2494689792,2494690047,IN
@@ -62008,19 +65462,18 @@
2495283200,2495348735,CH
2495348736,2495348991,US
2495348992,2495349051,DE
+2495349052,2495349052,US
2495349053,2495349247,DE
-2495349248,2495351039,US
-2495351296,2495353143,US
-2495353145,2495411195,US
-2495411197,2495412223,US
-2495412480,2495807487,US
+2495349248,2495807487,US
2495807488,2495873023,AU
2495873024,2495938559,CH
2495938560,2496004095,GB
2496004096,2496069631,AT
2496069632,2496135167,US
2496135168,2496200703,NL
-2496200704,2498475007,MX
+2496200704,2497682431,MX
+2497682432,2497683455,EC
+2497683456,2498475007,MX
2498475008,2498476031,EC
2498476032,2499477503,MX
2499477504,2499543039,DE
@@ -62036,7 +65489,11 @@
2499617536,2499624959,US
2499624960,2499641343,FR
2499641344,2499665919,GB
-2499665920,2499739647,US
+2499665920,2499667455,US
+2499667456,2499668735,FR
+2499668736,2499668991,US
+2499668992,2499670527,GB
+2499670528,2499739647,US
2499739648,2499805183,DO
2499805184,2499870719,TR
2499870720,2500001791,US
@@ -62089,9 +65546,13 @@
2500180992,2500182015,US
2500182016,2500188223,GB
2500188224,2500188287,CH
-2500188288,2500188679,GB
+2500188288,2500188415,GB
+2500188416,2500188447,CH
+2500188448,2500188679,GB
2500188680,2500188687,CH
-2500188688,2500190207,GB
+2500188688,2500188831,GB
+2500188832,2500188863,CH
+2500188864,2500190207,GB
2500190208,2500190975,US
2500190976,2500191103,FR
2500191104,2500191231,US
@@ -62115,7 +65576,9 @@
2500212416,2500212423,CH
2500212424,2500212991,US
2500212992,2500213247,ES
-2500213248,2500221455,US
+2500213248,2500213279,US
+2500213280,2500213287,FI
+2500213288,2500221455,US
2500221456,2500221459,FR
2500221460,2500222975,US
2500222976,2500225551,FR
@@ -62144,7 +65607,9 @@
2500255744,2500268031,US
2500268032,2500272127,ES
2500272128,2500273407,GB
-2500273408,2500275199,US
+2500273408,2500273663,US
+2500273664,2500273919,GB
+2500273920,2500275199,US
2500275200,2500276735,GB
2500276736,2500276991,US
2500276992,2500277247,GB
@@ -62211,8 +65676,8 @@
2500624384,2500637727,US
2500637728,2500637759,GB
2500637760,2500638719,US
-2500638720,2500639743,GB
-2500639744,2500640767,US
+2500638720,2500639231,GB
+2500639232,2500640767,US
2500640768,2500644863,ES
2500644864,2500646911,FR
2500646912,2500648959,ES
@@ -62220,8 +65685,7 @@
2500653568,2500654079,NL
2500654080,2500657151,US
2500657152,2500665343,ES
-2500665344,2500666111,US
-2500666368,2500666463,US
+2500665344,2500666463,US
2500666464,2500666471,LU
2500666472,2500674623,US
2500674624,2500674687,DE
@@ -62265,7 +65729,9 @@
2500756656,2500761631,GB
2500761632,2500761639,FR
2500761640,2500763647,GB
-2500763648,2500984831,US
+2500763648,2500777983,US
+2500777984,2500777991,FR
+2500777992,2500984831,US
2500984832,2501033983,GB
2501033984,2501574655,US
2501574656,2501640191,KZ
@@ -62308,7 +65774,9 @@
2503525056,2503525119,US
2503525120,2503530911,CA
2503530912,2503530943,US
-2503530944,2503540735,CA
+2503530944,2503533375,CA
+2503533376,2503533376,US
+2503533377,2503540735,CA
2503540736,2503671807,US
2503671808,2503737343,NL
2503737344,2503868415,US
@@ -62389,15 +65857,23 @@
2506360320,2506361087,ES
2506361088,2506362879,US
2506362880,2506364415,ES
-2506364416,2506401791,US
+2506364416,2506364671,US
+2506364672,2506364927,ES
+2506364928,2506401791,US
2506401792,2506403839,IT
2506403840,2506489855,US
2506489856,2506498047,ES
2506498048,2506499071,FR
2506499072,2506506239,ES
2506506240,2506514431,NO
-2506514432,2506555391,ES
-2506555392,2507124735,US
+2506514432,2506522623,ES
+2506522624,2506524671,GB
+2506524672,2506555391,ES
+2506555392,2506817535,US
+2506817536,2506820351,ES
+2506820352,2506821119,US
+2506821120,2506821631,ES
+2506821632,2507124735,US
2507124736,2507124991,IN
2507124992,2507145215,US
2507173888,2507174143,US
@@ -62419,8 +65895,8 @@
2508081664,2508081919,GB
2508081920,2508081920,NL
2508081921,2508082431,GB
-2508082432,2508082943,DE
-2508082944,2508083199,GB
+2508082432,2508082687,DE
+2508082688,2508083199,GB
2508083200,2508085247,IS
2508085248,2508087295,PS
2508087296,2508089343,RU
@@ -62434,7 +65910,7 @@
2508111872,2508128255,RU
2508128256,2508259327,US
2508259328,2508267519,MY
-2508267520,2508292095,SG
+2508267520,2508292095,CN
2508292096,2508316671,MY
2508316672,2508324863,SG
2508324864,2508455935,US
@@ -62485,13 +65961,19 @@
2511339520,2511405055,AU
2511405056,2512715775,GB
2512715776,2512781311,FI
-2512781312,2512912383,US
+2512781312,2512872447,US
+2512872448,2512872959,SG
+2512872960,2512912383,US
2512912384,2512945151,HU
2512945152,2512977919,JO
2512977920,2513043455,DE
2513043456,2513043615,FR
2513043616,2513043647,GB
-2513043648,2513044767,FR
+2513043648,2513044095,FR
+2513044096,2513044223,DE
+2513044224,2513044287,FR
+2513044288,2513044351,IT
+2513044352,2513044767,FR
2513044768,2513044799,ES
2513044800,2513045247,FR
2513045248,2513045255,CZ
@@ -62499,15 +65981,22 @@
2513046592,2513046623,ES
2513046624,2513046911,FR
2513046912,2513047039,GB
-2513047040,2513048047,FR
+2513047040,2513047695,FR
+2513047696,2513047699,PL
+2513047700,2513048047,FR
2513048048,2513048063,ES
2513048064,2513048559,FR
2513048560,2513048575,ES
2513048576,2513049551,FR
2513049552,2513049567,ES
-2513049568,2513050391,FR
+2513049568,2513049919,FR
+2513049920,2513049983,NL
+2513049984,2513049987,PL
+2513049988,2513050391,FR
2513050392,2513050399,PT
-2513050400,2513051487,FR
+2513050400,2513050719,FR
+2513050720,2513050735,GB
+2513050736,2513051487,FR
2513051488,2513051519,GB
2513051520,2513052735,FR
2513052736,2513052751,ES
@@ -62520,13 +66009,21 @@
2513068449,2513068449,DE
2513068450,2513068631,FR
2513068632,2513068635,PT
-2513068636,2513070559,FR
+2513068636,2513069375,FR
+2513069376,2513069439,DE
+2513069440,2513069631,FR
+2513069632,2513069663,NL
+2513069664,2513069823,FR
+2513069824,2513069887,IT
+2513069888,2513070559,FR
2513070560,2513070591,ES
2513070592,2513070623,FR
2513070624,2513070655,ES
2513070656,2513071435,FR
2513071436,2513071439,NL
-2513071440,2513071595,FR
+2513071440,2513071583,FR
+2513071584,2513071587,PL
+2513071588,2513071595,FR
2513071596,2513071599,FI
2513071600,2513073375,FR
2513073376,2513073391,BE
@@ -62536,9 +66033,13 @@
2513073952,2513073983,ES
2513073984,2513073999,FR
2513074000,2513074015,ES
-2513074016,2513075247,FR
+2513074016,2513074319,FR
+2513074320,2513074327,LT
+2513074328,2513075247,FR
2513075248,2513075263,GB
-2513075264,2513075791,FR
+2513075264,2513075455,FR
+2513075456,2513075487,PL
+2513075488,2513075791,FR
2513075792,2513075807,ES
2513075808,2513075871,FR
2513075872,2513075887,ES
@@ -62549,7 +66050,11 @@
2513076256,2513076335,FR
2513076336,2513076351,IE
2513076352,2513076479,ES
-2513076480,2513078367,FR
+2513076480,2513077247,FR
+2513077248,2513077311,DE
+2513077312,2513078151,FR
+2513078152,2513078159,NL
+2513078160,2513078367,FR
2513078368,2513078371,GB
2513078372,2513078431,FR
2513078432,2513078463,PT
@@ -62565,21 +66070,38 @@
2513079328,2513079343,IE
2513079344,2513080031,FR
2513080032,2513080063,IT
-2513080064,2513080395,FR
+2513080064,2513080255,FR
+2513080256,2513080319,DE
+2513080320,2513080395,FR
2513080396,2513080399,GB
-2513080400,2513081327,FR
+2513080400,2513080543,FR
+2513080544,2513080575,NL
+2513080576,2513081151,FR
+2513081152,2513081215,IT
+2513081216,2513081327,FR
2513081328,2513081343,ES
-2513081344,2513081935,FR
+2513081344,2513081403,FR
+2513081404,2513081407,PL
+2513081408,2513081935,FR
2513081936,2513081939,DE
-2513081940,2513082495,FR
+2513081940,2513082463,FR
+2513082464,2513082495,NL
2513082496,2513082623,GB
-2513082624,2513083279,FR
+2513082624,2513083199,FR
+2513083200,2513083263,DE
+2513083264,2513083279,FR
2513083280,2513083295,PT
2513083296,2513083327,FR
2513083328,2513083391,ES
2513083392,2513083455,FR
2513083456,2513083519,IE
-2513083520,2513101919,FR
+2513083520,2513083743,FR
+2513083744,2513083775,IT
+2513083776,2513084215,FR
+2513084216,2513084223,NL
+2513084224,2513084399,FR
+2513084400,2513084415,NL
+2513084416,2513101919,FR
2513101920,2513101951,PT
2513101952,2513102047,FR
2513102048,2513102063,ES
@@ -62590,17 +66112,29 @@
2513102904,2513103895,FR
2513103896,2513103935,PT
2513103936,2513103967,IE
-2513103968,2513106239,FR
+2513103968,2513104223,FR
+2513104224,2513104255,IT
+2513104256,2513105311,FR
+2513105312,2513105343,NL
+2513105344,2513106239,FR
2513106240,2513106303,IE
-2513106304,2513107079,FR
+2513106304,2513106367,FR
+2513106368,2513106431,DE
+2513106432,2513107079,FR
2513107080,2513107083,FI
2513107084,2513107087,ES
-2513107088,2513107231,FR
+2513107088,2513107103,BE
+2513107104,2513107135,FR
+2513107136,2513107199,DE
+2513107200,2513107231,FR
2513107232,2513107263,GB
2513107264,2513107279,ES
-2513107280,2513107311,FR
+2513107280,2513107295,FR
+2513107296,2513107311,PL
2513107312,2513107327,PT
-2513107328,2513107455,FR
+2513107328,2513107391,FR
+2513107392,2513107423,DE
+2513107424,2513107455,FR
2513107456,2513107583,GB
2513107584,2513108991,FR
2513108992,2513502207,DE
@@ -62611,8 +66145,7 @@
2513698816,2513764351,DK
2513764352,2514419711,DE
2514419712,2514485247,GB
-2514485248,2514681599,DE
-2514681856,2515140607,DE
+2514485248,2515140607,DE
2515140608,2515142655,US
2515142656,2515189759,DE
2515189760,2515206143,US
@@ -62721,7 +66254,7 @@
2524512256,2524643327,CN
2524643328,2524963071,US
2524963072,2524963311,GB
-2524963328,2524971007,US
+2524963312,2524971007,US
2524971008,2525036543,ES
2525036544,2525037567,IN
2525037568,2525038591,PK
@@ -62878,7 +66411,15 @@
2533359616,2533375999,UA
2533376000,2533392383,HU
2533392384,2538602495,IT
-2538602496,2538604967,FR
+2538602496,2538602687,FR
+2538602688,2538602751,DE
+2538602752,2538603519,FR
+2538603520,2538603583,DE
+2538603584,2538603711,FR
+2538603712,2538603775,DE
+2538603776,2538604327,FR
+2538604328,2538604335,NL
+2538604336,2538604967,FR
2538604968,2538604975,ES
2538604976,2538605271,FR
2538605272,2538605279,ES
@@ -62886,7 +66427,10 @@
2538605376,2538605379,GB
2538605380,2538605471,FR
2538605472,2538605503,PT
-2538605504,2538605903,FR
+2538605504,2538605567,DE
+2538605568,2538605631,FR
+2538605632,2538605647,LT
+2538605648,2538605903,FR
2538605904,2538605919,ES
2538605920,2538606027,FR
2538606028,2538606031,DE
@@ -62897,31 +66441,59 @@
2538606344,2538606351,PL
2538606352,2538606403,FR
2538606404,2538606407,GB
-2538606408,2538606943,FR
+2538606408,2538606847,FR
+2538606848,2538606911,IT
+2538606912,2538606943,CZ
2538606944,2538607007,PT
2538607008,2538607039,FR
2538607040,2538607103,ES
2538607104,2538613134,FR
2538613135,2538613135,NL
-2538613136,2538616383,FR
+2538613136,2538616287,FR
+2538616288,2538616319,NL
+2538616320,2538616383,FR
2538616384,2538616447,ES
-2538616448,2538619359,FR
+2538616448,2538616575,FR
+2538616576,2538616639,IT
+2538616640,2538619359,FR
2538619360,2538619375,ES
2538619376,2538619431,FR
2538619432,2538619435,DE
2538619436,2538619563,FR
2538619564,2538619567,ES
-2538619568,2538619903,FR
+2538619568,2538619775,FR
+2538619776,2538619807,LT
+2538619808,2538619903,FR
2538619904,2538619911,ES
-2538619912,2538622599,FR
+2538619912,2538620255,FR
+2538620256,2538620287,NL
+2538620288,2538620847,FR
+2538620848,2538620863,CZ
+2538620864,2538621007,FR
+2538621008,2538621023,LT
+2538621024,2538621167,FR
+2538621168,2538621183,CZ
+2538621184,2538621471,FR
+2538621472,2538621503,BE
+2538621504,2538622351,FR
+2538622352,2538622367,LT
+2538622368,2538622599,FR
2538622600,2538622607,IE
-2538622608,2538624447,FR
+2538622608,2538622735,FR
+2538622736,2538622751,FI
+2538622752,2538623711,FR
+2538623712,2538623727,NL
+2538623728,2538624447,FR
2538624448,2538624511,ES
-2538624512,2538625279,FR
+2538624512,2538624671,FR
+2538624672,2538624703,PL
+2538624704,2538625279,FR
2538625280,2538625311,GB
2538625312,2538625527,FR
2538625528,2538625535,DE
-2538625536,2538625583,FR
+2538625536,2538625571,FR
+2538625572,2538625575,PL
+2538625576,2538625583,FR
2538625584,2538625599,PT
2538625600,2538626687,FR
2538626688,2538626703,ES
@@ -62931,19 +66503,27 @@
2538631584,2538631615,FI
2538631616,2538633551,FR
2538633552,2538633567,IE
-2538633568,2538634227,FR
+2538633568,2538633695,FR
+2538633696,2538633727,CZ
+2538633728,2538634227,FR
2538634228,2538634231,DE
2538634232,2538634331,FR
2538634332,2538634335,DE
2538634336,2538634559,FR
2538634560,2538634623,GB
-2538634624,2538634879,FR
+2538634624,2538634687,FR
+2538634688,2538634751,NL
+2538634752,2538634879,FR
2538634880,2538635007,GB
2538635008,2538644015,FR
2538644016,2538644039,ES
2538644040,2538644927,FR
2538644928,2538644991,IE
-2538644992,2538645855,FR
+2538644992,2538645607,FR
+2538645608,2538645615,PL
+2538645616,2538645695,FR
+2538645696,2538645727,CZ
+2538645728,2538645855,FR
2538645856,2538645871,ES
2538645872,2538646063,FR
2538646064,2538646079,PT
@@ -62985,7 +66565,9 @@
2538651968,2538651999,PT
2538652000,2538652727,FR
2538652728,2538652731,DE
-2538652732,2538653327,FR
+2538652732,2538652991,FR
+2538652992,2538653055,DE
+2538653056,2538653327,FR
2538653328,2538653331,CZ
2538653332,2538653379,FR
2538653380,2538653383,DE
@@ -63014,11 +66596,17 @@
2538658496,2538658499,DE
2538658500,2538658623,FR
2538658624,2538658655,NL
-2538658656,2538663299,FR
+2538658656,2538659071,FR
+2538659072,2538659135,NL
+2538659136,2538659331,FR
+2538659332,2538659335,PL
+2538659336,2538663299,FR
2538663300,2538663303,IT
2538663304,2538663455,FR
2538663456,2538663471,ES
-2538663472,2538666111,FR
+2538663472,2538663551,FR
+2538663552,2538663567,IT
+2538663568,2538666111,FR
2538666112,2538666175,GB
2538666176,2538667775,FR
2538667776,2538667839,ES
@@ -63026,7 +66614,9 @@
2538668032,2539978751,IT
2539978752,2540240895,US
2540240896,2540306431,FI
-2540306432,2540896255,US
+2540306432,2540355583,US
+2540355584,2540363775,GB
+2540363776,2540896255,US
2540896256,2540961791,GB
2540961792,2541223935,US
2541223936,2541289471,CH
@@ -63060,14 +66650,17 @@
2545614848,2545680383,NO
2545680384,2545745919,US
2545745920,2545811455,DE
-2545811456,2546038783,US
-2546039040,2547187711,US
+2545811456,2547187711,US
2547187712,2547318783,GB
2547318784,2547515391,US
+2547515392,2547523583,NL
2547523584,2547524607,DE
2547524608,2547525631,IR
2547525632,2547535871,GB
+2547535872,2547548159,NL
2547548160,2547580927,NO
+2547580928,2547582975,DK
+2547585024,2547589119,GB
2548039680,2548072320,GB
2548072321,2548072321,US
2548072322,2548563967,GB
@@ -63180,16 +66773,13 @@
2553544704,2553610239,IN
2553610240,2553806847,US
2553806848,2554068991,IN
-2554068992,2554211383,US
-2554211388,2554227711,US
+2554068992,2554227711,US
2554227712,2554227967,IE
-2554228030,2554228030,US
-2554228224,2554462207,US
+2554227968,2554462207,US
2554462208,2554527743,HU
2554527744,2554789887,US
2554789888,2554855423,GB
-2554855424,2554888703,US
-2554888960,2554920959,US
+2554855424,2554920959,US
2554920960,2554986495,DK
2554986496,2555052031,CL
2555052032,2555117567,US
@@ -63234,11 +66824,11 @@
2556776704,2556776959,DE
2556776960,2556780031,HK
2556780032,2556780799,SG
-2556780800,2556786687,HK
-2556786688,2556787711,ZA
-2556787712,2556787967,HK
+2556780800,2556787967,HK
2556787968,2556788223,JP
-2556788224,2556800511,HK
+2556788224,2556790783,HK
+2556790784,2556791807,ZA
+2556791808,2556800511,HK
2556800512,2556800767,TW
2556800768,2556807423,HK
2556807424,2556807679,JP
@@ -63247,7 +66837,9 @@
2556887040,2556985343,HK
2556985344,2557018111,CN
2557018112,2557083647,GB
-2557083648,2557542399,ZA
+2557083648,2557214719,ZA
+2557214720,2557280255,SC
+2557280256,2557542399,ZA
2557542400,2557607935,US
2557607936,2557673471,GB
2557673472,2557739007,DK
@@ -63316,7 +66908,7 @@
2569936896,2569970175,CH
2569970176,2569970687,US
2569970688,2569994239,CH
-2569994496,2570125311,US
+2569994240,2570125311,US
2570125312,2570190847,BE
2570190848,2572681215,US
2572681216,2572746751,SE
@@ -63333,8 +66925,10 @@
2572954112,2572954367,DE
2572954368,2572954623,HK
2572954624,2572954879,AU
-2572954880,2572955391,HK
-2572955392,2572955647,DE
+2572954880,2572955135,HK
+2572955136,2572955388,DE
+2572955389,2572955390,HK
+2572955391,2572955647,DE
2572955648,2572959743,FR
2572959744,2572960255,DE
2572960256,2572960511,SE
@@ -63423,7 +67017,10 @@
2583756800,2584018943,US
2584018944,2584084479,CA
2584084480,2584215551,US
-2584215552,2584281087,GB
+2584215552,2584227839,GB
+2584227840,2584231935,JP
+2584231936,2584248319,GB
+2584248320,2584281087,CN
2584281088,2584346623,US
2584346624,2584412159,KR
2584412160,2584477695,CA
@@ -63435,8 +67032,7 @@
2584739936,2584740095,ZA
2584740096,2584740351,US
2584740352,2584740415,AU
-2584740416,2584740479,DE
-2584740480,2584740607,ZA
+2584740416,2584740607,ZA
2584740608,2584740863,NL
2584740864,2584740927,AU
2584740928,2584741119,ZA
@@ -63445,13 +67041,12 @@
2584741440,2584741503,ZA
2584741504,2584741519,IE
2584741520,2584741631,DE
-2584741632,2584741887,US
+2584741632,2584741887,GB
2584741888,2584741951,AU
2584741952,2584742143,ZA
2584742144,2584742399,US
2584742400,2584742463,AU
-2584742464,2584742527,DE
-2584742528,2584742655,ZA
+2584742464,2584742655,ZA
2584742656,2584742911,US
2584742912,2584742975,KR
2584742976,2584743167,ZA
@@ -63463,7 +67058,7 @@
2584744000,2584744191,ZA
2584744192,2584744447,NL
2584744448,2584744511,AU
-2584744512,2584744703,DE
+2584744512,2584744703,ZA
2584744704,2584744959,US
2584744960,2584745023,AU
2584745024,2584745215,ZA
@@ -63590,7 +67185,8 @@
2584763968,2584763999,DE
2584764000,2584764415,ZA
2584764416,2584764671,MA
-2584764672,2584767231,US
+2584764672,2584766975,US
+2584766976,2584767231,NL
2584767232,2584767487,TR
2584767488,2584768511,US
2584768512,2584770559,IL
@@ -63601,7 +67197,8 @@
2584773888,2584775423,US
2584775424,2584775679,ZA
2584775680,2584776703,MA
-2584776704,2584779775,US
+2584776704,2584778751,US
+2584778752,2584779775,DE
2584779776,2584780031,NL
2584780032,2584780287,US
2584780288,2584780543,ES
@@ -63701,8 +67298,11 @@
2586884096,2586884351,ES
2586884352,2586884607,US
2586884608,2586885119,ES
-2586885120,2586889601,US
-2586889603,2586891263,US
+2586885120,2586888191,US
+2586888192,2586888447,DE
+2586888448,2586890239,US
+2586890240,2586890751,DE
+2586890752,2586891263,US
2586891264,2586891519,GB
2586891520,2586952191,US
2586952192,2586952447,FR
@@ -63799,7 +67399,9 @@
2587700224,2587700735,GB
2587700736,2587713535,US
2587713536,2587714559,ES
-2587714560,2587926527,US
+2587714560,2587717631,US
+2587717632,2587721727,ES
+2587721728,2587926527,US
2587926528,2587930623,BG
2587930624,2587938815,US
2587938816,2587942911,PR
@@ -63813,7 +67415,6 @@
2587961344,2587962367,ZA
2587962368,2587964415,SS
2587964416,2587965439,ZA
-2587965440,2587966463,KE
2587966464,2587967487,BF
2587967488,2587975679,ZA
2587975680,2587983871,GH
@@ -63823,7 +67424,6 @@
2588037120,2588038143,AO
2588038144,2588039167,GN
2588039168,2588041215,ZA
-2588041216,2588042239,DZ
2588042240,2588043263,SS
2588043264,2588044287,AO
2588044288,2588045311,LS
@@ -63952,7 +67552,10 @@
2590507008,2591031295,TN
2591031296,2591096831,GA
2591096832,2591162367,NG
-2591162368,2591293439,ZA
+2591162368,2591195135,ZA
+2591195136,2591227903,GH
+2591227904,2591260671,ZA
+2591277056,2591293439,SO
2591293440,2591326207,GA
2591326208,2591358975,AO
2591358976,2591375359,GH
@@ -64014,7 +67617,9 @@
2592043008,2592047103,ZA
2592047104,2592079871,AO
2592079872,2593128447,EG
-2593128448,2593652735,MA
+2593128448,2593522885,MA
+2593522886,2593522886,EH
+2593522887,2593652735,MA
2593652736,2594177023,KE
2594177024,2595225599,GH
2595225600,2596274175,EG
@@ -64060,9 +67665,7 @@
2604007424,2604072959,ES
2604072960,2604138495,NO
2604138496,2604204031,DE
-2604204032,2604243711,US
-2604243968,2604244991,US
-2604245248,2604335103,US
+2604204032,2604335103,US
2604335104,2604400639,NZ
2604400640,2604466175,AU
2604466176,2604648447,US
@@ -64079,15 +67682,12 @@
2605252608,2605318143,AT
2605318144,2606301183,US
2606301184,2606366719,AO
-2606366720,2606448649,US
-2606448652,2606467071,US
-2606467328,2606563327,US
+2606366720,2606563327,US
2606563328,2606596095,NG
2606596096,2606628863,ZA
2606628864,2607349759,US
2607349760,2607415295,CH
-2607415296,2608728063,US
-2608728320,2609053695,US
+2607415296,2609053695,US
2609053696,2609119231,GB
2609119232,2609184767,FR
2609184768,2609217535,PL
@@ -64118,9 +67718,9 @@
2609512448,2609643519,US
2609643520,2609677781,FR
2609677782,2609677782,GB
-2609677783,2609677815,FR
-2609677818,2609708799,FR
+2609677783,2609708799,FR
2609708800,2609708839,SG
+2609708840,2609708843,FR
2609708844,2609709055,SG
2609709056,2609840127,US
2609840128,2609971199,AU
@@ -64150,6 +67750,7 @@
2614034432,2614099967,GR
2614099968,2614157311,US
2614157312,2614164991,IT
+2614164992,2614165247,US
2614165248,2614165503,IT
2614165504,2614231039,NO
2614231040,2614296575,ES
@@ -64165,11 +67766,9 @@
2615672832,2616262655,ZA
2616262656,2616524799,US
2616524800,2616590335,GB
-2616590336,2616770303,US
-2616770560,2616786943,US
+2616590336,2616786943,US
2616786944,2616852479,GB
-2616852480,2616885527,DE
-2616885530,2616918015,DE
+2616852480,2616918015,DE
2616918016,2616983551,GM
2616983552,2617049087,US
2617049088,2617114623,IT
@@ -64302,8 +67901,7 @@
2618228736,2618294271,US
2618359808,2618425343,PL
2618425344,2618490879,FR
-2618490880,2618564235,US
-2618564240,2618687487,US
+2618490880,2618687487,US
2618687488,2618753023,AU
2618753024,2618884095,US
2618884096,2618949631,CH
@@ -64314,8 +67912,12 @@
2619342848,2619473919,US
2619473920,2619539455,CA
2619539456,2619604991,ES
-2619604992,2619735295,US
-2619735552,2619736063,US
+2619604992,2619736063,US
+2619736064,2619737087,ZA
+2619737088,2619738111,BW
+2619738112,2619740159,RW
+2619740160,2619744255,BW
+2619752448,2619760639,TG
2619768832,2619801599,ZA
2619801600,2620063743,US
2620063744,2620129279,GB
@@ -64382,8 +67984,8 @@
2621689280,2621689343,CZ
2621689344,2621689599,AU
2621689600,2621689855,CA
-2621689856,2621691903,SG
-2621691904,2621693951,CY
+2621689856,2621692927,SG
+2621692928,2621693951,CY
2621693952,2621698047,DE
2621698048,2621702143,GB
2621702144,2621767679,US
@@ -64398,8 +68000,7 @@
2624192512,2624258047,CH
2624258048,2624265727,US
2624265728,2624266239,SG
-2624266240,2624266495,US
-2624266752,2624269313,US
+2624266240,2624269313,US
2624269314,2624269314,AU
2624269315,2624269317,US
2624269318,2624269318,AU
@@ -64518,9 +68119,7 @@
2624302592,2624303103,AU
2624303104,2624303615,US
2624303616,2624304639,CN
-2624304640,2624391696,US
-2624391698,2624393727,US
-2624393984,2624395263,US
+2624304640,2624395263,US
2624395264,2624395775,GB
2624395776,2624716799,US
2624716800,2624782335,NL
@@ -64577,9 +68176,7 @@
2637629024,2637629311,IE
2637629312,2637629375,US
2637629376,2637629439,IE
-2637629440,2637629567,NL
-2637629568,2637629583,US
-2637629584,2637629599,NL
+2637629440,2637629599,NL
2637629600,2637629631,IE
2637629632,2637629663,NL
2637629664,2637629807,IE
@@ -64702,9 +68299,7 @@
2640314368,2640379903,GB
2640379904,2640388095,IS
2640388096,2640400383,NL
-2640400384,2640401407,ES
-2640401408,2640402431,NL
-2640402432,2640404479,ES
+2640400384,2640404479,ES
2640404480,2640405503,NL
2640405504,2640406527,US
2640406528,2640408575,DE
@@ -64714,7 +68309,9 @@
2640411392,2640412671,US
2640412672,2640413951,NL
2640413952,2640414207,US
-2640414208,2640417023,NL
+2640414208,2640414719,NL
+2640414720,2640416767,FR
+2640416768,2640417023,NL
2640417024,2640417279,CA
2640417280,2640423935,NL
2640423936,2640429055,ES
@@ -64779,9 +68376,18 @@
2642280448,2642411519,US
2642411520,2642477055,AU
2642477056,2642542591,FI
-2642542592,2642751487,US
+2642542592,2642739199,US
+2642739200,2642743295,RU
+2642743296,2642751487,US
2642751488,2642755583,CA
-2642755584,2642935807,US
+2642755584,2642759679,US
+2642759680,2642761727,AE
+2642761728,2642763775,SA
+2642763776,2642767871,AU
+2642767872,2642771967,DE
+2642771968,2642776063,NL
+2642776064,2642780159,JP
+2642780160,2642935807,US
2642935808,2643001343,FR
2643001344,2643066879,US
2643066880,2643132415,IT
@@ -64912,8 +68518,7 @@
2647916544,2648899583,US
2648899584,2648965119,IN
2648965120,2649030655,GB
-2649030656,2649413631,US
-2649413888,2649489407,US
+2649030656,2649489407,US
2649489408,2649554943,GB
2649554944,2649620479,NO
2649620480,2649948159,US
@@ -64933,11 +68538,9 @@
2652512256,2652520447,CA
2652520448,2652528639,US
2652528640,2652528895,AR
-2652528896,2652537607,US
-2652537616,2652541183,US
+2652528896,2652541183,US
2652541184,2652541439,NL
-2652541440,2653089791,US
-2653090048,2653159423,US
+2652541440,2653159423,US
2653159424,2653421567,NO
2653421568,2653487103,AU
2653487104,2653552639,GB
@@ -64952,8 +68555,8 @@
2654076928,2654085119,FR
2654085120,2654089215,HK
2654089216,2654093311,FR
-2654093312,2654097663,US
-2654097664,2654142463,FR
+2654093312,2654097407,US
+2654097408,2654142463,FR
2654208000,2654339071,US
2654339072,2654404607,AU
2654404608,2654601215,US
@@ -65020,8 +68623,7 @@
2658009088,2658074623,IT
2658074624,2658140159,US
2658140160,2658205695,NO
-2658205696,2658459648,US
-2658459650,2658598911,US
+2658205696,2658598911,US
2658598912,2658664447,GB
2658664448,2658804991,US
2658804992,2658805247,MX
@@ -65078,7 +68680,15 @@
2662203392,2662268927,SE
2662268928,2662300879,US
2662300880,2662300895,JP
-2662300896,2662498303,US
+2662300896,2662366271,US
+2662366272,2662366287,IE
+2662366288,2662416463,US
+2662416464,2662416471,SE
+2662416472,2662417947,US
+2662417948,2662417951,DE
+2662417952,2662418815,US
+2662418816,2662418819,DE
+2662418820,2662498303,US
2662498304,2662662143,GB
2662662144,2662670335,KG
2662670336,2662674431,AZ
@@ -65303,10 +68913,10 @@
2675257344,2675261439,US
2675261440,2675269631,TW
2675269632,2675271679,PH
-2675271680,2675279871,NZ
-2675279872,2675280383,MY
+2675271680,2675278847,NZ
+2675278848,2675280383,MY
2675280384,2675280895,TH
-2675280896,2675281919,ID
+2675280896,2675281919,MY
2675281920,2675286015,IN
2675286016,2675294207,US
2675294208,2675294463,SG
@@ -65314,10 +68924,12 @@
2675294720,2675294975,DE
2675294976,2675295231,US
2675295232,2675296255,NL
-2675296256,2675296767,NZ
+2675296256,2675296511,NZ
+2675296512,2675296767,MY
2675296768,2675298303,NL
2675298304,2675301375,US
-2675301376,2675302399,NZ
+2675301376,2675302143,NZ
+2675302144,2675302399,MY
2675302400,2675310591,HK
2675310592,2675574239,US
2675574240,2675574271,IT
@@ -65359,7 +68971,11 @@
2675610192,2675610207,IL
2675610208,2675611295,US
2675611296,2675611359,IT
-2675611360,2675613119,US
+2675611360,2675612715,US
+2675612716,2675612719,IT
+2675612720,2675612743,US
+2675612744,2675612747,IT
+2675612748,2675613119,US
2675613120,2675613151,IT
2675613152,2675613279,US
2675613280,2675613311,IT
@@ -65369,7 +68985,19 @@
2675613600,2675613631,JP
2675613632,2675614975,US
2675614976,2675614991,NL
-2675614992,2675626239,US
+2675614992,2675616419,US
+2675616420,2675616421,IT
+2675616422,2675616423,US
+2675616424,2675616424,IT
+2675616425,2675616428,US
+2675616429,2675616430,IT
+2675616431,2675616432,US
+2675616433,2675616434,IT
+2675616435,2675616436,US
+2675616437,2675616437,IT
+2675616438,2675616439,US
+2675616440,2675616441,IT
+2675616442,2675626239,US
2675626240,2675626271,GB
2675626272,2675628399,US
2675628400,2675628447,GB
@@ -65407,21 +69035,23 @@
2677623040,2677635071,US
2677635072,2677636095,CN
2677636096,2677639167,US
-2677639168,2677639679,CA
-2677639680,2677641215,US
-2677641216,2677641471,CA
+2677639168,2677640191,CA
+2677640192,2677640959,US
+2677640960,2677641471,CA
2677641472,2677642239,US
2677642240,2677642495,ES
2677642496,2677642751,CA
2677642752,2677643007,SE
-2677643008,2677644347,US
-2677644348,2677644348,GB
-2677644349,2677648383,US
+2677643008,2677643263,IE
+2677643264,2677644287,US
+2677644288,2677644347,GB
+2677644348,2677644348,US
+2677644349,2677645311,GB
+2677645312,2677648383,US
2677648384,2677649407,JP
-2677649408,2677650431,US
-2677650432,2677650719,RO
-2677650720,2677650751,DE
-2677650752,2677650943,RO
+2677649408,2677650431,GB
+2677650432,2677650687,RO
+2677650688,2677650943,DE
2677650944,2677651455,US
2677651456,2677652479,SG
2677652480,2677658367,US
@@ -65626,10 +69256,9 @@
2683371520,2683437055,CH
2683437056,2683568127,US
2683568128,2683633663,GB
-2683637760,2683637859,NL
-2683637861,2683641855,NL
+2683637760,2683641855,NL
2683641856,2683645951,US
-2683646208,2683650047,SG
+2683645952,2683650047,SG
2683650048,2683651071,US
2683699200,2683830271,US
2683830272,2683895807,AU
@@ -65701,6 +69330,8 @@
2685640704,2685641727,US
2685642752,2685644799,BR
2685647872,2685648383,ZA
+2685648384,2685648895,MZ
+2685648896,2685649919,RW
2685649920,2685650943,ZA
2685650944,2685651967,CL
2685652992,2685656063,CN
@@ -65741,20 +69372,18 @@
2687041536,2687238143,US
2687238144,2687297239,DE
2687297240,2687297247,SE
-2687297248,2687301795,DE
-2687301797,2687762431,DE
+2687297248,2687762431,DE
2687762432,2687827967,AT
2687827968,2687893503,CH
2687893504,2688221183,DE
2688221184,2688286719,CH
2688286720,2688352255,DE
-2688352256,2688418825,CH
-2688418827,2688420095,CH
+2688352256,2688420095,CH
2688420096,2688420351,US
2688420352,2688420607,CN
2688420608,2688420863,CH
2688420864,2688421119,AU
-2688421376,2688548863,CH
+2688421120,2688548863,CH
2688548864,2688614399,AU
2688614400,2688679935,US
2688679936,2688745471,IT
@@ -65788,9 +69417,9 @@
2689594112,2689594879,GB
2689594880,2689597439,US
2689597440,2689662975,IT
-2689662976,2689801727,US
+2689662976,2689801904,US
2689801905,2689801905,DE
-2689801984,2689802239,US
+2689801906,2689802239,US
2689802240,2689802751,GB
2689802752,2689803263,TR
2689803264,2689810431,GB
@@ -65822,24 +69451,29 @@
2691366912,2691760127,US
2691825664,2691891199,HU
2691891200,2691956735,SA
-2691956736,2692153343,ZA
+2691956736,2692169727,ZA
2692169728,2692173823,SC
2692173824,2692175871,ZA
2692175872,2692177919,SC
2692177920,2692179967,ZA
+2692179968,2692180991,GA
2692180992,2692182015,GH
2692182016,2692184063,MZ
2692184064,2692185087,ZA
2692185088,2692186111,NG
+2692191232,2692192255,UG
2692194304,2692202495,GA
2692202496,2692203519,ZA
2692203520,2692204543,NG
+2692204544,2692205567,SC
2692205568,2692206591,GH
2692206592,2692207615,SZ
+2692207616,2692208639,ZA
2692208640,2692209663,KE
2692209664,2692214783,ZA
2692214784,2692215807,AO
2692215808,2692216319,KE
+2692216320,2692216831,NG
2692216832,2692218879,ZA
2692218880,2692284415,CI
2692284416,2692546559,ZA
@@ -65848,7 +69482,9 @@
2694381568,2694447103,US
2694447104,2694578175,CI
2694578176,2694840319,TN
-2694840320,2696151039,MA
+2694840320,2695920283,MA
+2695920284,2695920284,EH
+2695920285,2696151039,MA
2696151040,2696216575,IT
2696216576,2696282111,BG
2696282112,2696413183,GM
@@ -65874,6 +69510,7 @@
2697633792,2697634815,KR
2697634816,2697635583,US
2697635584,2697635839,NZ
+2697635840,2697636863,CN
2697636864,2697638911,KR
2697638912,2697647103,IN
2697647104,2697658367,CN
@@ -65902,6 +69539,9 @@
2698969088,2699034623,CA
2699034624,2699165695,AO
2699165696,2699198463,NG
+2699198464,2699211263,ZA
+2699211520,2699211775,GH
+2699212800,2699213823,BF
2699214848,2699231231,ZA
2699231232,2699296767,US
2699296768,2699362303,FR
@@ -65925,9 +69565,9 @@
2699986944,2699987967,BZ
2699987968,2699995135,BR
2699995136,2699996159,AR
-2699996160,2699998207,BR
+2699996160,2699999231,BR
2699999232,2700000255,PY
-2700001280,2700004351,BR
+2700000256,2700004351,BR
2700004352,2700005375,AR
2700005376,2700006399,BR
2700006400,2700007423,CL
@@ -65942,11 +69582,25 @@
2700279808,2700935167,JP
2700935168,2701066239,US
2701066240,2701131775,BG
-2701131776,2701132391,HN
+2701131776,2701131807,HN
+2701131808,2701131823,CA
+2701131824,2701132159,HN
+2701132160,2701132175,CR
+2701132176,2701132391,HN
2701132392,2701132399,CR
-2701132400,2701137903,HN
+2701132400,2701133631,HN
+2701133632,2701133647,ES
+2701133648,2701134447,HN
+2701134448,2701134463,US
+2701134464,2701135583,HN
+2701135584,2701135599,US
+2701135600,2701136095,HN
+2701136096,2701136111,US
+2701136112,2701137903,HN
2701137904,2701137911,BR
-2701137912,2701139967,HN
+2701137912,2701139135,HN
+2701139136,2701139151,UY
+2701139152,2701139967,HN
2701139968,2701148159,NI
2701148160,2701149183,AR
2701149184,2701150207,HN
@@ -65984,7 +69638,8 @@
2702573568,2702581759,AR
2702581760,2702583807,VE
2702583808,2702585855,MX
-2702585856,2702587903,CW
+2702585856,2702586111,PA
+2702586112,2702587903,CW
2702587904,2702589951,BR
2702589952,2702606335,GF
2702606336,2702639103,BO
@@ -66045,8 +69700,7 @@
2705688320,2705688575,DE
2705688576,2705691647,US
2705691648,2705692671,GB
-2705692672,2705706522,US
-2705706524,2705710079,US
+2705692672,2705710079,US
2705710080,2705711103,IN
2705711104,2705784831,US
2705784832,2705850367,GB
@@ -66070,108 +69724,37 @@
2708340736,2708406271,AT
2708406272,2708471807,ES
2708471808,2708537343,GB
-2708537344,2708635135,US
-2708635392,2708733951,US
+2708537344,2708733951,US
2708733952,2708799487,ES
2708799488,2708865023,SG
2708865024,2708930559,JP
2708930560,2709127167,US
2709127168,2709192703,KR
-2709192704,2709192959,US
-2709192960,2709193983,ZA
-2709193984,2709194239,US
-2709194240,2709194495,ZA
-2709194496,2709195007,US
-2709195008,2709195263,ZA
-2709195264,2709196031,US
-2709196032,2709198335,ZA
-2709198336,2709198847,US
-2709198848,2709199103,ZA
-2709199104,2709199359,US
-2709199360,2709200383,ZA
-2709200384,2709200639,US
-2709200640,2709200895,ZA
-2709200896,2709201407,US
-2709201408,2709202175,ZA
-2709202176,2709202943,US
-2709202944,2709203711,ZA
-2709203712,2709203967,US
-2709203968,2709204991,ZA
-2709204992,2709205247,US
-2709205248,2709205759,ZA
-2709205760,2709206271,US
-2709206272,2709207039,ZA
-2709207040,2709207295,US
-2709207296,2709207551,ZA
-2709207552,2709207807,US
-2709207808,2709208063,ZA
-2709208064,2709208319,US
-2709208320,2709208575,ZA
-2709208576,2709208831,US
-2709208832,2709209343,ZA
-2709209344,2709209599,US
-2709209600,2709210367,ZA
-2709210368,2709211135,US
-2709211136,2709211903,ZA
-2709211904,2709212159,US
-2709212160,2709212415,ZA
-2709212416,2709212927,US
-2709212928,2709213183,ZA
-2709213184,2709213439,US
-2709213440,2709213951,ZA
-2709213952,2709214719,US
-2709214720,2709214975,ZA
-2709214976,2709215999,US
-2709216000,2709216255,ZA
-2709216256,2709216511,US
-2709216512,2709216767,ZA
-2709216768,2709217023,US
-2709217024,2709217791,ZA
-2709217792,2709218559,US
-2709218560,2709219071,ZA
-2709219072,2709219327,US
-2709219328,2709219839,ZA
-2709219840,2709220095,US
-2709220096,2709221119,ZA
-2709221120,2709221375,US
-2709221376,2709221887,ZA
-2709221888,2709222399,US
-2709222400,2709222655,ZA
-2709222656,2709222911,US
-2709222912,2709223423,ZA
-2709223424,2709224703,US
-2709224704,2709224959,ZA
-2709224960,2709225471,US
+2709192704,2709225471,ZA
2709225472,2709225727,ES
2709225728,2709225983,ZA
2709225984,2709226239,ES
2709226240,2709226495,ZA
2709226496,2709226511,DE
-2709226512,2709227775,ZA
-2709227776,2709228031,US
-2709228032,2709228287,ZA
-2709228288,2709228543,US
-2709228544,2709228767,ZA
+2709226512,2709228767,ZA
2709228768,2709228783,DE
2709228784,2709229695,ZA
2709229696,2709229711,DE
2709229712,2709230799,ZA
2709230800,2709230815,DE
-2709230816,2709230879,ZA
-2709230880,2709230895,DE
-2709230896,2709231103,ZA
+2709230816,2709231103,ZA
2709231104,2709231119,DE
2709231120,2709232127,ZA
2709232128,2709232383,DE
2709232384,2709232639,ZA
2709232640,2709232895,DE
-2709232896,2709233151,US
+2709232896,2709233151,ZA
2709233152,2709233407,DE
2709233408,2709235199,ZA
2709235200,2709235455,DE
-2709235456,2709235711,US
+2709235456,2709235711,ZA
2709235712,2709235967,DE
-2709235968,2709236223,US
+2709235968,2709236223,ZA
2709236224,2709236479,DE
2709236480,2709238271,ZA
2709238272,2709238527,DE
@@ -66181,7 +69764,7 @@
2709240320,2709240575,DE
2709240576,2709240831,ZA
2709240832,2709241087,DE
-2709241088,2709241343,US
+2709241088,2709241343,ZA
2709241344,2709241599,DE
2709241600,2709241855,ZA
2709241856,2709242111,DE
@@ -66202,13 +69785,7 @@
2709245696,2709245951,US
2709245952,2709246207,ZA
2709246208,2709246463,US
-2709246464,2709246735,ZA
-2709246736,2709246751,HK
-2709246752,2709246847,ZA
-2709246848,2709246863,HK
-2709246864,2709246959,ZA
-2709246960,2709246975,HK
-2709246976,2709247231,ZA
+2709246464,2709247231,ZA
2709247232,2709247487,MY
2709247488,2709247743,DE
2709247744,2709247999,US
@@ -66220,23 +69797,17 @@
2709250048,2709250303,DE
2709250304,2709251071,ZA
2709251072,2709251327,DE
-2709251328,2709251839,ZA
-2709251840,2709252095,GB
+2709251328,2709251583,ZA
+2709251584,2709251839,DE
+2709251840,2709252095,ZA
2709252096,2709252351,DE
-2709252352,2709253375,ZA
-2709253376,2709253631,US
-2709253632,2709254399,ZA
-2709254400,2709254655,US
-2709254656,2709255935,ZA
-2709255936,2709256191,US
-2709256192,2709256703,ZA
+2709252352,2709256703,ZA
2709256704,2709256959,DE
-2709256960,2709257471,ZA
-2709257472,2709257727,US
-2709257728,2709258239,ZA
+2709256960,2709258239,ZA
2709258240,2709389311,US
2709389312,2709454847,SG
-2709454848,2709716991,US
+2709454848,2709585919,US
+2709651456,2709716991,US
2709716992,2709782527,CL
2709782528,2709848063,PE
2709848064,2710175743,US
@@ -66254,8 +69825,7 @@
2711093248,2711158783,AU
2711158784,2711486463,US
2711486464,2711551999,NL
-2711552000,2711765247,US
-2711765504,2713190399,US
+2711552000,2713190399,US
2713190400,2713255935,CA
2713255936,2713387007,US
2713387008,2713452543,CA
@@ -66269,9 +69839,7 @@
2714238976,2714304511,TH
2714304512,2714370263,US
2714370264,2714370271,SG
-2714370272,2714370895,US
-2714370896,2714370911,CN
-2714370912,2714371679,US
+2714370272,2714371679,US
2714371680,2714371711,CA
2714371712,2714372415,US
2714372416,2714372431,PH
@@ -66279,9 +69847,7 @@
2714372968,2714372971,IN
2714372972,2714373127,US
2714373128,2714373128,SG
-2714373129,2714373279,US
-2714373280,2714373287,NL
-2714373288,2714373743,US
+2714373129,2714373743,US
2714373744,2714373759,IN
2714373760,2714374927,US
2714374928,2714374943,SG
@@ -66293,7 +69859,9 @@
2714377104,2714377119,IN
2714377120,2714377439,US
2714377440,2714377471,SG
-2714377472,2714378463,US
+2714377472,2714377615,US
+2714377616,2714377631,CA
+2714377632,2714378463,US
2714378464,2714378495,HK
2714378496,2714379103,US
2714379104,2714379135,HK
@@ -66305,63 +69873,23 @@
2714381952,2714381983,HK
2714381984,2714382530,US
2714382531,2714382531,HK
-2714382532,2714386431,US
-2714386432,2714402815,JP
-2714402816,2714403996,US
-2714403997,2714403997,JP
-2714403998,2714404789,US
-2714404790,2714404790,JP
-2714404791,2714405151,US
-2714405152,2714405167,JP
-2714405168,2714405311,US
-2714405312,2714405327,CA
-2714405328,2714405727,US
-2714405728,2714405759,JP
-2714405760,2714405829,US
-2714405830,2714405831,JP
-2714405832,2714407103,US
-2714407104,2714407119,JP
-2714407120,2714407160,US
-2714407161,2714407161,JP
-2714407162,2714407423,US
-2714407424,2714407439,CA
-2714407440,2714408703,US
-2714408704,2714408719,JP
-2714408720,2714408959,US
-2714408960,2714408991,JP
-2714408992,2714417215,US
-2714417216,2714417247,JP
-2714417248,2714419743,US
+2714382532,2714384907,US
+2714384908,2714384911,HK
+2714384912,2714386431,US
+2714386432,2714419743,JP
2714419744,2714419775,SG
-2714419776,2714419871,US
+2714419776,2714419871,JP
2714419872,2714419903,SG
-2714419904,2714420479,US
+2714419904,2714420479,JP
2714420480,2714420511,SG
-2714420512,2714420703,US
-2714420704,2714420719,SG
-2714420720,2714421439,US
+2714420512,2714421439,JP
2714421440,2714421471,SG
-2714421472,2714421567,US
+2714421472,2714421567,JP
2714421568,2714421599,SG
-2714421600,2714422879,US
+2714421600,2714422879,JP
2714422880,2714422911,SG
-2714422912,2714428767,US
-2714428768,2714428783,JP
-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,2714433535,US
-2714433536,2714433791,JP
-2714433792,2714434911,US
-2714434912,2714434927,JP
-2714434928,2714435055,US
-2714435056,2714435071,JP
-2714435072,2714697727,US
+2714422912,2714435583,JP
+2714435584,2714697727,US
2714697728,2714763263,CN
2714763264,2715025407,US
2715025408,2715090943,VE
@@ -66399,8 +69927,7 @@
2718756864,2718758911,IN
2718758912,2718760959,US
2718760960,2718826495,GB
-2718826496,2719125247,US
-2719125504,2719285247,US
+2718826496,2719285247,US
2719285248,2719350783,CH
2719350784,2719416319,US
2719416320,2719481855,CH
@@ -66463,8 +69990,7 @@
2724855808,2724921343,CA
2724921344,2725249023,US
2725249024,2725314559,NZ
-2725314560,2725543423,US
-2725543680,2725904383,US
+2725314560,2725904383,US
2725904384,2725969919,VE
2725969920,2726117375,US
2726117376,2726117631,GB
@@ -66512,8 +70038,8 @@
2728304640,2728306687,SG
2728306688,2728308735,US
2728308736,2728309759,HK
-2728309760,2728310015,RU
-2728310016,2728311807,US
+2728309760,2728310783,SE
+2728310784,2728311807,US
2728311808,2728312831,KR
2728312832,2728313087,FR
2728313088,2728313855,US
@@ -66530,7 +70056,8 @@
2728325120,2728326143,TW
2728326144,2728327423,US
2728327424,2728327679,UA
-2728327680,2731543551,US
+2728327680,2728329215,US
+2728394752,2731543551,US
2731543552,2731544575,CA
2731544576,2731549695,US
2731549696,2731550719,CA
@@ -66571,9 +70098,7 @@
2731765760,2731767807,CA
2731767808,2731768079,US
2731768080,2731768083,CA
-2731768084,2731769471,US
-2731769472,2731769475,CA
-2731769476,2731771903,US
+2731768084,2731771903,US
2731771904,2731772927,KY
2731772928,2731784191,US
2731784192,2731785215,CA
@@ -66604,7 +70129,8 @@
2731836928,2731837183,IS
2731837184,2731843583,US
2731843584,2731845631,PR
-2731845632,2731853823,US
+2731845632,2731847679,FR
+2731847680,2731853823,US
2731853824,2731855871,CA
2731855872,2731856383,LC
2731856384,2731856895,VC
@@ -66631,12 +70157,15 @@
2732107776,2732109823,US
2732110848,2732111871,US
2732111872,2732113919,CA
-2732113920,2732126207,US
-2732127232,2732128767,US
+2732113920,2732128767,US
2732128768,2732129023,NL
2732129024,2732131327,US
2732131328,2732132351,CA
-2732132352,2732145663,US
+2732132352,2732137215,US
+2732137216,2732137471,DE
+2732137472,2732138239,US
+2732138240,2732138495,DE
+2732138496,2732145663,US
2732145664,2732146687,CA
2732146688,2732189695,US
2732189696,2732192767,CA
@@ -66655,7 +70184,9 @@
2732273664,2732275711,CA
2732275712,2732278783,US
2732278784,2732279807,CA
-2732279808,2732302335,US
+2732279808,2732301311,US
+2732301312,2732301823,CA
+2732301824,2732302335,US
2732302336,2732303359,CA
2732303360,2732306431,US
2732306432,2732307455,CA
@@ -66721,7 +70252,11 @@
2732534784,2732536831,CA
2732536832,2732549119,US
2732549120,2732550143,CA
-2732550144,2732580863,US
+2732550144,2732554239,US
+2732554240,2732554495,CA
+2732554496,2732555007,US
+2732555008,2732555263,CA
+2732555264,2732580863,US
2732580864,2732582911,CA
2732582912,2733903871,US
2733903872,2733904895,PR
@@ -66848,8 +70383,7 @@
2734349312,2734350335,CA
2734350336,2734362623,US
2734362624,2734363647,CA
-2734363648,2734364671,VG
-2734364672,2734373887,US
+2734363648,2734373887,US
2734373888,2734374911,CA
2734374912,2734376959,US
2734376960,2734379007,CA
@@ -66867,16 +70401,14 @@
2734414160,2734414175,MX
2734414176,2734414183,US
2734414184,2734414275,MX
-2734414276,2734414334,US
+2734414276,2734414299,US
+2734414300,2734414303,MX
+2734414304,2734414334,US
2734414335,2734414335,MX
2734414336,2734432255,US
2734433280,2734435327,US
2734435328,2734436351,CA
-2734436352,2734439167,US
-2734439168,2734439279,GB
-2734439280,2734439295,US
-2734439296,2734439423,GB
-2734439424,2734447615,US
+2734436352,2734447615,US
2734447616,2734448639,CA
2734448640,2734452735,US
2734452736,2734454783,CA
@@ -66917,13 +70449,11 @@
2734588928,2734589951,CA
2734589952,2734599167,US
2734599168,2734600191,CA
-2734600192,2734605311,US
+2734601216,2734605311,US
2734605312,2734605567,GB
2734605568,2734605823,DE
2734605824,2734606079,SE
-2734606080,2734606807,US
-2734606808,2734606815,CA
-2734606816,2734607179,US
+2734606080,2734607179,US
2734607180,2734607181,KW
2734607182,2734608351,US
2734608352,2734608367,DE
@@ -67053,7 +70583,9 @@
2738223104,2738224127,AU
2738224128,2738225151,IN
2738225152,2738683903,JP
-2738749440,2742353919,FR
+2738749440,2741370879,FR
+2741370880,2741436415,US
+2741436416,2742353919,FR
2742353920,2742419455,ES
2742419456,2742484991,US
2742484992,2742550527,GB
@@ -67073,8 +70605,7 @@
2744713216,2744844287,US
2744844288,2744909823,CA
2744909824,2744975359,GB
-2744975360,2745040383,SE
-2745040640,2745040895,SE
+2744975360,2745040895,SE
2745040896,2745106431,NL
2745106432,2745171967,SI
2745171968,2745237503,GB
@@ -67117,8 +70648,7 @@
2749890560,2750021631,AU
2750021632,2750349311,US
2750349312,2750414847,KR
-2750414848,2750692863,US
-2750693376,2750723071,US
+2750414848,2750723071,US
2750723072,2750723327,IN
2750723328,2750723583,US
2750723584,2750723839,IN
@@ -67130,15 +70660,16 @@
2750873600,2750939135,CL
2750939136,2751070207,US
2751070208,2751135743,CL
-2751135744,2751397887,US
+2751135744,2751135762,US
+2751135763,2751135763,JP
+2751135764,2751397887,US
2751397888,2751463423,KR
2751463424,2751528959,KZ
2751528960,2751660031,FR
2751660032,2751716351,AT
2751716352,2751716607,US
2751716608,2751725567,AT
-2751725568,2751729951,SE
-2751729954,2751791103,SE
+2751725568,2751791103,SE
2751791104,2751856639,FI
2751856640,2751922175,GB
2751922176,2751987711,FR
@@ -67179,8 +70710,7 @@
2754928640,2754936831,US
2754936832,2755002367,AU
2755002368,2755330047,US
-2755330048,2755514879,DE
-2755515136,2755526655,DE
+2755330048,2755526655,DE
2755526656,2755985407,US
2755985408,2756182015,JP
2756182016,2756247551,US
@@ -67188,7 +70718,9 @@
2756313088,2756378623,US
2756378624,2756444159,AU
2756444160,2756509695,US
-2756509696,2756575231,CL
+2756509696,2756556543,CL
+2756556544,2756556799,PE
+2756556800,2756575231,CL
2756575232,2756640767,SG
2756640768,2756706303,US
2756706304,2756771839,AU
@@ -67215,45 +70747,66 @@
2759589888,2759720959,KR
2759720960,2759852031,PL
2759852032,2759917567,CH
-2759917568,2759917823,FR
-2759918080,2759983103,FR
+2759917568,2759983103,FR
2759983104,2760048639,IT
-2760048640,2760114815,FR
+2760048640,2760114811,FR
+2760114812,2760114815,PL
2760114816,2760114847,FI
-2760114848,2760115327,FR
+2760114848,2760115007,FR
+2760115008,2760115071,DE
+2760115072,2760115327,FR
2760115328,2760115455,GB
2760115456,2760115711,FR
2760115712,2760115719,IE
2760115720,2760115775,FR
2760115776,2760115839,ES
-2760115840,2760116207,FR
+2760115840,2760115903,FR
+2760115904,2760115967,IT
+2760115968,2760116063,FR
+2760116064,2760116095,PL
+2760116096,2760116207,FR
2760116208,2760116223,FI
2760116224,2760116507,FR
2760116508,2760116511,ES
2760116512,2760116759,FR
2760116760,2760116767,PT
-2760116768,2760116831,FR
+2760116768,2760116799,PL
+2760116800,2760116831,FR
2760116832,2760116847,GB
-2760116848,2760117375,FR
+2760116848,2760116879,FR
+2760116880,2760116895,IT
+2760116896,2760117183,FR
+2760117184,2760117247,NL
+2760117248,2760117375,FR
2760117376,2760117503,GB
-2760117504,2760117679,FR
+2760117504,2760117567,FR
+2760117568,2760117631,DE
+2760117632,2760117679,FR
2760117680,2760117695,FI
2760117696,2760117727,FR
2760117728,2760117759,FI
-2760117760,2760118462,FR
-2760118463,2760118463,LT
+2760117760,2760117871,FR
+2760117872,2760117887,LT
+2760117888,2760117999,FR
+2760118000,2760118015,IT
+2760118016,2760118303,FR
+2760118304,2760118335,PL
+2760118336,2760118439,FR
+2760118440,2760118463,LT
2760118464,2760118543,FR
2760118544,2760118559,GB
2760118560,2760118799,FR
2760118800,2760118815,ES
2760118816,2760118847,FI
-2760118848,2760118875,FR
-2760118876,2760118878,BE
-2760118879,2760118975,FR
+2760118848,2760118911,BE
+2760118912,2760118975,FR
2760118976,2760119039,ES
2760119040,2760119263,FR
2760119264,2760119295,PL
-2760119296,2760119495,FR
+2760119296,2760119327,FR
+2760119328,2760119359,IT
+2760119360,2760119423,DE
+2760119424,2760119495,FR
2760119496,2760119499,ES
2760119500,2760119967,FR
2760119968,2760119983,GB
@@ -67265,18 +70818,23 @@
2760121664,2760121727,ES
2760121728,2760121827,FR
2760121828,2760121831,ES
-2760121832,2760122324,FR
-2760122325,2760122325,NL
-2760122326,2760129999,FR
+2760121832,2760122047,FR
+2760122048,2760122111,DE
+2760122112,2760122303,FR
+2760122304,2760122367,NL
+2760122368,2760129887,FR
+2760129888,2760129919,CZ
+2760129920,2760129999,FR
2760130000,2760130015,ES
2760130016,2760130399,FR
2760130400,2760130431,ES
2760130432,2760130559,GB
-2760130560,2760131033,FR
-2760131034,2760131034,BE
-2760131035,2760131309,FR
-2760131310,2760131310,IT
-2760131311,2760132159,FR
+2760130560,2760130975,FR
+2760130976,2760131007,IT
+2760131008,2760131071,BE
+2760131072,2760131263,FR
+2760131264,2760131327,IT
+2760131328,2760132159,FR
2760132160,2760132223,ES
2760132224,2760132911,FR
2760132912,2760132927,PT
@@ -67288,74 +70846,136 @@
2760134784,2760134799,ES
2760134800,2760134975,FR
2760134976,2760135039,ES
-2760135040,2760135935,FR
+2760135040,2760135231,FR
+2760135232,2760135295,IT
+2760135296,2760135615,FR
+2760135616,2760135679,DE
+2760135680,2760135687,FR
+2760135688,2760135695,CZ
+2760135696,2760135935,FR
2760135936,2760136191,PT
-2760136192,2760137215,FR
+2760136192,2760136767,FR
+2760136768,2760136831,BE
+2760136832,2760137215,FR
2760137216,2760137471,GB
2760137472,2760137535,FR
2760137536,2760137599,ES
-2760137600,2760143039,FR
+2760137600,2760137647,FR
+2760137648,2760137663,PL
+2760137664,2760137935,FR
+2760137936,2760137951,PL
+2760137952,2760138271,FR
+2760138272,2760138303,PL
+2760138304,2760143039,FR
2760143040,2760143103,ES
-2760143104,2760143615,FR
+2760143104,2760143295,FR
+2760143296,2760143359,DE
+2760143360,2760143615,FR
2760143616,2760143871,GB
2760143872,2760145215,FR
2760145216,2760145279,ES
-2760145280,2760145855,FR
+2760145280,2760145327,FR
+2760145328,2760145343,PL
+2760145344,2760145599,FR
+2760145600,2760145663,NL
+2760145664,2760145855,FR
2760145856,2760145919,GB
2760145920,2760146111,FR
2760146112,2760146143,FI
-2760146144,2760147647,FR
+2760146144,2760146159,FR
+2760146160,2760146175,PL
+2760146176,2760147423,FR
+2760147424,2760147455,DE
+2760147456,2760147647,FR
2760147648,2760147711,ES
2760147712,2760148551,FR
2760148552,2760148559,FI
-2760148560,2760148937,FR
-2760148938,2760148938,DE
-2760148939,2760149263,FR
+2760148560,2760148895,FR
+2760148896,2760148927,CZ
+2760148928,2760148991,DE
+2760148992,2760149039,FR
+2760149040,2760149055,LT
+2760149056,2760149215,FR
+2760149216,2760149247,BE
+2760149248,2760149263,FR
2760149264,2760149279,PT
-2760149280,2760149375,FR
+2760149280,2760149327,FR
+2760149328,2760149343,LT
+2760149344,2760149375,FR
2760149376,2760149503,GB
-2760149504,2760150262,FR
-2760150263,2760150263,PL
-2760150264,2760150389,FR
-2760150390,2760150390,BE
-2760150391,2760150871,FR
-2760150872,2760150872,DE
-2760150873,2760151039,FR
+2760149504,2760150111,FR
+2760150112,2760150143,NL
+2760150144,2760150207,BE
+2760150208,2760150239,FR
+2760150240,2760150271,PL
+2760150272,2760150335,FR
+2760150336,2760150399,BE
+2760150400,2760150847,FR
+2760150848,2760150911,DE
+2760150912,2760151039,FR
2760151040,2760151055,GB
-2760151056,2760151208,FR
-2760151209,2760151209,CZ
-2760151210,2760151269,FR
-2760151270,2760151270,NL
-2760151271,2760151335,FR
+2760151056,2760151199,FR
+2760151200,2760151231,CZ
+2760151232,2760151247,FR
+2760151248,2760151263,LT
+2760151264,2760151295,NL
+2760151296,2760151335,FR
2760151336,2760151339,GB
2760151340,2760151343,FR
2760151344,2760151359,GB
-2760151360,2760151903,FR
+2760151360,2760151423,IT
+2760151424,2760151679,FR
+2760151680,2760151743,IT
+2760151744,2760151903,FR
2760151904,2760151935,PT
2760151936,2760152591,FR
2760152592,2760152607,PL
2760152608,2760152639,FI
-2760152640,2760153439,FR
+2760152640,2760152647,FR
+2760152648,2760152655,LT
+2760152656,2760152751,FR
+2760152752,2760152767,LT
+2760152768,2760153439,FR
2760153440,2760153471,ES
-2760153472,2760154223,FR
+2760153472,2760153535,FR
+2760153536,2760153599,DE
+2760153600,2760154223,FR
2760154224,2760154239,DE
-2760154240,2760154951,FR
+2760154240,2760154303,FR
+2760154304,2760154367,NL
+2760154368,2760154951,FR
2760154952,2760154955,GB
-2760154956,2760155007,FR
+2760154956,2760154959,FR
+2760154960,2760154975,IT
+2760154976,2760155007,PL
2760155008,2760155135,GB
-2760155136,2760159615,FR
+2760155136,2760159279,FR
+2760159280,2760159295,LT
+2760159296,2760159423,FR
+2760159424,2760159487,DE
+2760159488,2760159615,FR
2760159616,2760159743,GB
-2760159744,2760161983,FR
+2760159744,2760159775,FR
+2760159776,2760159807,IT
+2760159808,2760159903,FR
+2760159904,2760159935,CZ
+2760159936,2760160831,FR
+2760160832,2760160895,IT
+2760160896,2760160959,FR
+2760160960,2760161023,DE
+2760161024,2760161983,FR
2760161984,2760162047,IE
2760162048,2760162399,FR
2760162400,2760162431,ES
-2760162432,2760162545,FR
-2760162546,2760162546,BE
-2760162547,2760162681,FR
-2760162682,2760162682,PL
-2760162683,2760163135,FR
+2760162432,2760162495,FR
+2760162496,2760162559,BE
+2760162560,2760162671,FR
+2760162672,2760162687,PL
+2760162688,2760163135,FR
2760163136,2760163199,ES
-2760163200,2760166682,FR
+2760163200,2760163263,FR
+2760163264,2760163327,DE
+2760163328,2760166682,FR
2760166683,2760166683,DE
2760166684,2760167583,FR
2760167584,2760167599,ES
@@ -67363,11 +70983,17 @@
2760167648,2760167679,GB
2760167680,2760167951,FR
2760167952,2760167967,ES
-2760167968,2760168127,FR
+2760167968,2760167999,FR
+2760168000,2760168063,BE
+2760168064,2760168095,FR
+2760168096,2760168127,PL
2760168128,2760168191,IE
2760168192,2760168319,FR
2760168320,2760168447,GB
-2760168448,2760169471,FR
+2760168448,2760169183,FR
+2760169184,2760169215,ES
+2760169216,2760169343,FR
+2760169344,2760169471,IT
2760169472,2760169503,FI
2760169504,2760169679,FR
2760169680,2760169695,ES
@@ -67376,17 +71002,26 @@
2760170048,2760170111,FI
2760170112,2760170815,FR
2760170816,2760170847,PT
-2760170848,2760174591,FR
+2760170848,2760170975,FR
+2760170976,2760170991,IT
+2760170992,2760171279,FR
+2760171280,2760171295,PL
+2760171296,2760171439,FR
+2760171440,2760171455,CZ
+2760171456,2760174591,FR
2760174592,2760174623,GB
-2760174624,2760175295,FR
+2760174624,2760175007,FR
+2760175008,2760175039,PL
+2760175040,2760175295,FR
2760175296,2760175359,ES
-2760175360,2760175487,FR
+2760175360,2760175423,FR
+2760175424,2760175487,DE
2760175488,2760175615,GB
2760175616,2760178111,FR
2760178112,2760178175,ES
-2760178176,2760178561,FR
-2760178562,2760178563,IT
-2760178564,2760178751,FR
+2760178176,2760178559,FR
+2760178560,2760178687,IT
+2760178688,2760178751,FR
2760178752,2760178767,GB
2760178768,2760179711,FR
2760179712,2760245247,DE
@@ -67420,8 +71055,7 @@
2760835072,2760898559,GB
2760898560,2760899583,US
2760899584,2760900607,GB
-2760900608,2760932096,US
-2760932098,2761031679,US
+2760900608,2761031679,US
2761031680,2761424895,ZA
2761424896,2761621503,US
2761621504,2761687039,ZA
@@ -67468,6 +71102,34 @@
2762006528,2762010623,RE
2762010624,2762014719,GH
2762014720,2762145791,JP
+2762145792,2762147839,BR
+2762147840,2762148863,PA
+2762148864,2762156031,BR
+2762156032,2762157055,AR
+2762157056,2762158079,BR
+2762158080,2762159103,EC
+2762159104,2762160127,BR
+2762161152,2762162175,BR
+2762163200,2762164223,BR
+2762164224,2762165247,HN
+2762165248,2762166271,BR
+2762166272,2762167295,CL
+2762167296,2762168319,BR
+2762168320,2762169343,CL
+2762169344,2762176511,BR
+2762177536,2762178559,HN
+2762179584,2762180607,EC
+2762180608,2762186751,BR
+2762186752,2762187775,EC
+2762187776,2762191871,BR
+2762193920,2762194943,MX
+2762194944,2762199039,BR
+2762200064,2762201087,BR
+2762201088,2762202111,AR
+2762203136,2762207231,BR
+2762207232,2762207487,AR
+2762207744,2762207999,BR
+2762209280,2762211327,BR
2762211328,2762276863,IN
2762276864,2762342399,US
2762342400,2762407935,CA
@@ -67523,12 +71185,13 @@
2772434944,2772762623,US
2772762624,2772828159,AU
2772828160,2772959231,US
-2772959232,2773010431,CZ
-2773010688,2773024767,CZ
-2773024768,2773057535,ZA
+2772959232,2773024767,CZ
+2773024768,2773058559,ZA
2773058560,2773059583,SZ
2773059584,2773061631,ZA
2773061632,2773065727,CM
+2773065728,2773073919,ZA
+2773073920,2773082111,NG
2773082112,2773084159,ZA
2773085184,2773086207,SL
2773086208,2773090303,ZA
@@ -67574,12 +71237,11 @@
2775973888,2776039423,AU
2776039424,2776104959,US
2776104960,2776170495,GB
-2776170496,2776478207,US
+2776170496,2776478463,US
2776478464,2776478719,ZA
2776478720,2776478975,US
2776478976,2776479231,AU
-2776479232,2776697614,US
-2776697616,2776891391,US
+2776479232,2776891391,US
2776891392,2777022463,KR
2777022464,2777481215,US
2777481216,2777546751,KR
@@ -67692,7 +71354,7 @@
2783007744,2783008255,PL
2783008256,2783008767,IT
2783008768,2783009279,BE
-2783009280,2783010815,US
+2783009280,2783010943,US
2783010944,2783011071,HK
2783011072,2783011327,US
2783011328,2783011839,AU
@@ -67701,15 +71363,14 @@
2783012608,2783012863,US
2783012864,2783013887,IN
2783013888,2783150079,US
-2783150080,2783154175,DE
-2783154176,2783182847,US
+2783150080,2783158271,DE
+2783158272,2783182847,US
2783182848,2783248383,AU
2783248384,2783313919,KR
2783313920,2783379455,US
2783379456,2783380991,SC
2783380992,2783381503,NZ
-2783381504,2783383039,SC
-2783383040,2783383551,US
+2783381504,2783383551,SC
2783383552,2783387647,CA
2783387648,2783391743,GB
2783391744,2783395839,US
@@ -67717,31 +71378,13 @@
2783399936,2783404031,FR
2783404032,2783408127,NL
2783408128,2783412223,NO
-2783412224,2783414015,US
-2783414016,2783415295,SE
-2783415296,2783416063,US
-2783416064,2783416319,SE
+2783412224,2783416319,SE
2783416320,2783420415,RU
2783420416,2783424511,EE
-2783424512,2783424767,JP
-2783424768,2783425535,US
-2783425536,2783425791,JP
-2783425792,2783426559,US
-2783426560,2783426815,JP
-2783426816,2783427071,US
-2783427072,2783427327,JP
-2783427328,2783427583,US
-2783427584,2783427839,JP
-2783427840,2783428095,US
-2783428096,2783428607,JP
+2783424512,2783428607,JP
2783428608,2783436799,US
2783436800,2783440895,IT
-2783440896,2783441407,US
-2783441408,2783442431,IN
-2783442432,2783443711,US
-2783443712,2783443967,IN
-2783443968,2783444735,US
-2783444736,2783444991,IN
+2783440896,2783444991,IN
2783444992,2783510527,US
2783510528,2783576063,ZA
2783576064,2783969279,US
@@ -67780,7 +71423,9 @@
2790588416,2790653951,ZA
2790653952,2790719487,US
2790719488,2790785023,SA
-2790785024,2791571455,US
+2790785024,2790816511,US
+2790816512,2790816767,DE
+2790816768,2791571455,US
2791571456,2791636991,JP
2791636992,2791768063,US
2791768064,2791899135,KR
@@ -67806,8 +71451,7 @@
2798838016,2798838271,CO
2798838272,2801795071,US
2801795072,2801860607,CO
-2801860608,2802386186,US
-2802386188,2802515967,US
+2801860608,2802515967,US
2802515968,2802581503,CA
2802581504,2802909183,US
2802909184,2802974719,CA
@@ -67826,11 +71470,9 @@
2806644736,2806710271,CA
2806710272,2807103487,US
2807103488,2807169023,NL
-2807169024,2807236863,US
-2807237120,2807237375,US
+2807169024,2807237375,US
2807237376,2807237631,BE
-2807237632,2807259647,US
-2807260160,2807271679,US
+2807237632,2807271679,US
2807271680,2807271935,AU
2807271936,2807288345,US
2807288346,2807288346,PR
@@ -67948,8 +71590,7 @@
2813908480,2813908735,AU
2813908736,2814181375,US
2814181376,2814246911,CN
-2814246912,2814377215,US
-2814377472,2815082495,US
+2814246912,2815082495,US
2815082496,2815090687,NL
2815090688,2815098879,US
2815098880,2815164415,GB
@@ -67983,20 +71624,18 @@
2816276480,2816278527,SG
2816278528,2816671743,US
2816671744,2816737279,CA
-2816737280,2817059071,US
-2817059328,2817060863,US
-2817061120,2817277951,US
+2816737280,2817064959,US
+2817064960,2817130495,DE
+2817130496,2817277951,US
2817277952,2817294335,NL
-2817294336,2817325055,US
-2817325312,2817933055,US
+2817294336,2817933055,US
2817933056,2817933311,CA
2817933312,2817933567,PR
-2817933568,2817986303,US
-2817986560,2818002943,US
+2817933568,2818002943,US
2818002944,2818003722,GB
+2818003723,2818003723,US
2818003724,2818004991,GB
-2818004992,2818038537,US
-2818038539,2818113535,US
+2818004992,2818113535,US
2818113536,2818115583,BR
2818115584,2818116607,PE
2818116608,2818118655,BR
@@ -68042,7 +71681,9 @@
2818229248,2818231295,BR
2818231296,2818232319,PE
2818232320,2818233343,AR
-2818233344,2818234367,HN
+2818233344,2818234095,HN
+2818234096,2818234111,IT
+2818234112,2818234367,HN
2818234368,2818235391,BR
2818235392,2818236415,GT
2818236416,2818244607,BR
@@ -68060,7 +71701,9 @@
2818620416,2818623487,BR
2818623488,2818625535,AR
2818625536,2818626559,BR
-2818626560,2818627583,HN
+2818626560,2818626783,HN
+2818626784,2818626799,BR
+2818626800,2818627583,HN
2818627584,2818628607,BR
2818628608,2818629631,MX
2818629632,2818634751,BR
@@ -68069,13 +71712,19 @@
2818637824,2818670591,AU
2818670592,2818671423,US
2818671424,2818671439,AU
-2818671440,2818687299,US
+2818671440,2818671999,US
+2818672000,2818672127,AU
+2818672128,2818672191,US
+2818672192,2818672207,AU
+2818672208,2818687299,US
2818687300,2818687303,JP
2818687304,2818688903,US
2818688904,2818688927,NL
2818688928,2818689479,US
2818689480,2818689487,AU
-2818689488,2822584319,US
+2818689488,2821932367,US
+2821932368,2821932371,NO
+2821932372,2822584319,US
2822584320,2822586367,NL
2822586368,2822590463,US
2822590464,2822591629,IE
@@ -68097,21 +71746,18 @@
2822742016,2822750207,SG
2822750208,2822758399,HK
2822758400,2822766591,SG
-2822766592,2822848997,US
-2822848999,2823159807,US
+2822766592,2823159807,US
2823159808,2823225343,HK
2823225344,2823553023,US
2823553024,2823618559,ZA
2823618560,2823684095,PA
2823684096,2823749631,KR
-2823815168,2823823359,ZA
-2823823360,2823888895,SC
+2823815168,2823888895,SC
2823888896,2823897087,ZA
2823897088,2823946239,SC
2823946240,2824011775,US
2824011776,2824077311,AR
-2824077312,2824274720,US
-2824274722,2824290303,US
+2824077312,2824290303,US
2824290304,2824294399,AU
2824294400,2824404991,US
2824404992,2824470527,ZA
@@ -68125,7 +71771,11 @@
2824492032,2824493055,AR
2824493056,2824494079,BR
2824494080,2824495103,CO
-2824495104,2824496127,HN
+2824495104,2824495263,HN
+2824495264,2824495279,DE
+2824495280,2824496087,HN
+2824496088,2824496095,NL
+2824496096,2824496127,HN
2824496128,2824498175,BR
2824498176,2824498527,HN
2824498528,2824498535,FR
@@ -68252,11 +71902,9 @@
2829516800,2829582335,BW
2829582336,2829590783,US
2829590784,2829591033,GB
+2829591034,2829591034,US
2829591035,2829591039,GB
-2829591040,2829593343,US
-2829593344,2829593591,CH
-2829593596,2829593599,CH
-2829593600,2829844479,US
+2829591040,2829844479,US
2829844480,2829910015,ZA
2829910016,2830106623,US
2830106624,2830172159,CO
@@ -68294,8 +71942,7 @@
2830492928,2830492935,US
2830492936,2830493695,HN
2830493696,2830499839,BR
-2830499840,2830586879,US
-2830587136,2830761983,US
+2830499840,2830761983,US
2830761984,2830827519,AU
2830827520,2830893055,KW
2830893056,2830958591,KR
@@ -68404,7 +72051,9 @@
2831527936,2831528959,BR
2831528960,2831529983,CL
2831529984,2831531007,BR
-2831531008,2831532031,EC
+2831531008,2831531135,EC
+2831531136,2831531263,GT
+2831531264,2831532031,EC
2831532032,2831533055,BR
2831533056,2831535103,AR
2831535104,2831536127,BR
@@ -68450,8 +72099,7 @@
2832793600,2832859135,AU
2832859136,2832924671,US
2832924672,2832990207,KR
-2832990208,2833293311,US
-2833293568,2833383423,US
+2832990208,2833383423,US
2833383424,2833448959,AR
2833448960,2833449983,CO
2833449984,2833451007,AR
@@ -68467,7 +72115,9 @@
2833474560,2833475583,BR
2833475584,2833476607,CO
2833476608,2833481727,BR
-2833481728,2833482751,HN
+2833481728,2833482679,HN
+2833482680,2833482687,CL
+2833482688,2833482751,HN
2833482752,2833484799,BR
2833484800,2833485311,HN
2833485312,2833485519,US
@@ -68540,7 +72190,12 @@
2834030592,2834034687,CA
2834034688,2834497535,US
2834497536,2834563071,SV
-2834563072,2834681599,US
+2834563072,2834676735,US
+2834676736,2834677759,SG
+2834677760,2834678783,US
+2834678784,2834679295,ES
+2834679296,2834679807,CA
+2834679808,2834681599,US
2834681600,2834681855,CA
2834681856,2834689535,US
2834689536,2834694143,CA
@@ -68588,17 +72243,13 @@
2838284320,2838298623,US
2838298624,2838298655,NL
2838298656,2838298687,US
-2838298688,2838298975,NL
-2838298976,2838299007,US
-2838299008,2838299439,NL
+2838298688,2838299439,NL
2838299440,2838299455,US
2838299456,2838299695,NL
2838299696,2838299775,US
2838299776,2838300335,NL
2838300336,2838300351,US
-2838300352,2838300367,NL
-2838300368,2838300383,US
-2838300384,2838300671,NL
+2838300352,2838300671,NL
2838300672,2838300927,US
2838300928,2838301119,NL
2838301120,2838301183,US
@@ -68620,17 +72271,17 @@
2838305248,2838305279,US
2838305280,2838305647,NL
2838305648,2838305727,US
-2838305728,2838307055,NL
-2838307056,2838307063,US
-2838307064,2838307295,NL
+2838305728,2838307295,NL
2838307296,2838307303,US
2838307304,2838307311,NL
2838307312,2838307327,US
2838307328,2838307647,NL
2838307648,2838307679,US
2838307680,2838307903,NL
-2838307904,2838307999,US
-2838308000,2838308191,NL
+2838307904,2838307935,US
+2838307936,2838308175,NL
+2838308176,2838308183,US
+2838308184,2838308191,NL
2838308192,2838308223,US
2838308224,2838308255,NL
2838308256,2838308271,US
@@ -68640,26 +72291,24 @@
2838331536,2838331551,US
2838331552,2838331567,NL
2838331568,2838331583,US
-2838331584,2838331655,NL
-2838331656,2838331663,US
-2838331664,2838331711,NL
+2838331584,2838331711,NL
2838331712,2838331727,US
2838331728,2838331807,NL
2838331808,2838331839,US
-2838331840,2838332863,NL
-2838332864,2838332895,US
+2838331840,2838332879,NL
+2838332880,2838332895,US
2838332896,2838333903,NL
2838333904,2838333919,US
2838333920,2838334335,NL
2838334336,2838334351,US
-2838334352,2838337239,NL
-2838337240,2838337247,US
-2838337248,2838337279,NL
+2838334352,2838337279,NL
2838337280,2838337295,US
2838337296,2838337759,NL
2838337760,2838337761,IN
2838337762,2838337763,US
-2838337764,2838338271,NL
+2838337764,2838338111,NL
+2838338112,2838338127,US
+2838338128,2838338271,NL
2838338272,2838338303,JP
2838338304,2838338567,NL
2838338568,2838338575,US
@@ -68686,11 +72335,17 @@
2838340872,2838340879,US
2838340880,2838340959,NL
2838340960,2838340991,US
-2838340992,2838341951,NL
+2838340992,2838341903,NL
+2838341904,2838341919,US
+2838341920,2838341951,NL
2838341952,2838341967,US
-2838341968,2838343071,NL
-2838343072,2838343119,US
-2838343120,2838344451,NL
+2838341968,2838342303,NL
+2838342304,2838342319,US
+2838342320,2838343071,NL
+2838343072,2838343103,US
+2838343104,2838343359,NL
+2838343360,2838343375,US
+2838343376,2838344451,NL
2838344452,2838344455,US
2838344456,2838344457,NL
2838344458,2838344459,US
@@ -68706,7 +72361,9 @@
2838345240,2838345247,US
2838345248,2838345743,NL
2838345744,2838345751,US
-2838345752,2838346559,NL
+2838345752,2838345759,NL
+2838345760,2838345775,US
+2838345776,2838346559,NL
2838346560,2838346591,US
2838346592,2838346623,NL
2838346624,2838346655,US
@@ -68714,72 +72371,10 @@
2838346688,2838346719,US
2838346720,2838347031,NL
2838347032,2838347039,US
-2838347040,2838347231,NL
-2838347232,2838347263,US
-2838347264,2838347487,NL
+2838347040,2838347487,NL
2838347488,2838347519,US
-2838347520,2838348063,NL
-2838348064,2838348079,US
-2838348080,2838348231,NL
-2838348232,2838348239,US
-2838348240,2838348415,NL
-2838348416,2838348431,US
-2838348432,2838348655,NL
-2838348656,2838348671,US
-2838348672,2838348759,NL
-2838348760,2838348799,US
-2838348800,2838349343,NL
-2838349344,2838349375,US
-2838349376,2838349519,NL
-2838349520,2838349535,US
-2838349536,2838349807,NL
-2838349808,2838349823,US
-2838349824,2838350911,NL
-2838350912,2838350927,US
-2838350928,2838351295,NL
-2838351296,2838351327,US
-2838351328,2838351711,NL
-2838351712,2838351743,CO
-2838351744,2838352143,NL
-2838352144,2838352159,US
-2838352160,2838352575,NL
-2838352576,2838352583,US
-2838352584,2838352639,NL
-2838352640,2838352655,CO
-2838352656,2838355039,NL
-2838355040,2838355055,US
-2838355056,2838355151,NL
-2838355152,2838355159,US
-2838355160,2838356679,NL
-2838356680,2838356687,US
-2838356688,2838356695,NL
-2838356696,2838356703,US
-2838356704,2838357375,NL
-2838357376,2838357383,US
-2838357384,2838358687,NL
-2838358688,2838358719,US
-2838358720,2838358975,NL
-2838358976,2838358991,US
-2838358992,2838360047,NL
-2838360048,2838360063,US
-2838360064,2838360639,NL
-2838360640,2838360735,US
-2838360736,2838360767,NL
-2838360768,2838360831,US
-2838360832,2838360863,NL
-2838360864,2838360895,US
-2838360896,2838361439,NL
-2838361440,2838361471,US
-2838361472,2838362015,NL
-2838362016,2838362047,US
-2838362048,2838362703,NL
-2838362704,2838362719,US
-2838362720,2838363199,NL
-2838363200,2838363231,US
-2838363232,2838363455,NL
-2838363456,2838363487,US
-2838363488,2838364159,NL
-2838364160,2838396927,US
+2838347520,2838348031,NL
+2838348032,2838396927,US
2838396928,2838397007,NL
2838397008,2838397023,US
2838397024,2838397071,NL
@@ -68788,9 +72383,7 @@
2838397248,2838397279,JP
2838397280,2838397311,NL
2838397312,2838397343,US
-2838397344,2838398399,NL
-2838398400,2838398431,US
-2838398432,2838398575,NL
+2838397344,2838398575,NL
2838398576,2838398591,US
2838398592,2838400191,NL
2838400192,2838400195,US
@@ -68816,9 +72409,7 @@
2838406960,2838406967,US
2838406968,2838407103,NL
2838407104,2838407119,US
-2838407120,2838408735,NL
-2838408736,2838408767,US
-2838408768,2838408799,NL
+2838407120,2838408799,NL
2838408800,2838408831,US
2838408832,2838409439,NL
2838409440,2838409471,US
@@ -68836,8 +72427,8 @@
2838411328,2838411359,US
2838411360,2838414207,NL
2838414208,2838414271,US
-2838414272,2838414815,NL
-2838414816,2838414879,US
+2838414272,2838414847,NL
+2838414848,2838414879,US
2838414880,2838415167,NL
2838415168,2838415183,US
2838415184,2838415391,NL
@@ -68846,53 +72437,15 @@
2838415656,2838415663,US
2838415664,2838415839,NL
2838415840,2838415871,US
-2838415872,2838416479,NL
-2838416480,2838416511,US
-2838416512,2838416623,NL
+2838415872,2838416623,NL
2838416624,2838416639,AF
2838416640,2838418143,NL
2838418144,2838418175,US
-2838418176,2838418687,NL
-2838418688,2838418751,US
-2838418752,2838421503,NL
+2838418176,2838421503,NL
2838421504,2838421567,US
-2838421568,2838423663,NL
-2838423664,2838423679,US
-2838423680,2838429695,NL
-2838429696,2838462463,US
-2838462464,2838462895,NL
-2838462896,2838462911,US
-2838462912,2838463519,NL
-2838463520,2838463535,US
-2838463536,2838463583,NL
-2838463584,2838463615,US
-2838463616,2838465599,NL
-2838465600,2838465615,US
-2838465616,2838465663,NL
-2838465664,2838465671,US
-2838465672,2838465711,NL
-2838465712,2838465727,US
-2838465728,2838466063,NL
-2838466064,2838466079,US
-2838466080,2838466607,NL
-2838466608,2838466623,US
-2838466624,2838466687,NL
-2838466688,2838466719,US
-2838466720,2838466959,NL
-2838466960,2838466975,US
-2838466976,2838467375,NL
-2838467376,2838467391,US
-2838467392,2838467439,NL
-2838467440,2838467455,US
-2838467456,2838467855,NL
-2838467856,2838467903,US
-2838467904,2838467967,NL
-2838467968,2838468111,US
-2838468112,2838468159,NL
-2838468160,2838468175,US
-2838468176,2838468351,NL
-2838468352,2838468607,US
-2838468608,2838478975,NL
+2838421568,2838429695,NL
+2838429696,2838469631,US
+2838469632,2838478975,NL
2838478976,2838479007,US
2838479008,2838479207,NL
2838479208,2838479215,US
@@ -68902,15 +72455,13 @@
2838479456,2838479487,US
2838479488,2838480319,NL
2838480320,2838480323,IE
-2838480324,2838480335,NL
-2838480336,2838480351,US
-2838480352,2838481855,NL
+2838480324,2838481855,NL
2838481856,2838481887,US
2838481888,2838482383,NL
2838482384,2838482399,US
-2838482400,2838482447,NL
-2838482448,2838482455,US
-2838482456,2838482695,NL
+2838482400,2838482547,NL
+2838482548,2838482551,US
+2838482552,2838482695,NL
2838482696,2838482703,US
2838482704,2838482959,NL
2838482960,2838482967,IE
@@ -68935,21 +72486,21 @@
2838485376,2838485407,US
2838485408,2838485695,NL
2838485696,2838485727,US
-2838485728,2838486463,NL
+2838485728,2838486415,NL
+2838486416,2838486431,US
+2838486432,2838486463,NL
2838486464,2838486495,US
2838486496,2838487647,NL
2838487648,2838487679,US
2838487680,2838487743,NL
2838487744,2838487807,US
-2838487808,2838488663,NL
+2838487808,2838488399,NL
+2838488400,2838488415,US
+2838488416,2838488663,NL
2838488664,2838488671,US
-2838488672,2838488863,NL
-2838488864,2838488879,US
-2838488880,2838489983,NL
-2838489984,2838489999,US
-2838490000,2838490383,NL
-2838490384,2838490399,US
-2838490400,2838491943,NL
+2838488672,2838488943,NL
+2838488944,2838488959,US
+2838488960,2838491943,NL
2838491944,2838491951,US
2838491952,2838492479,NL
2838492480,2838492511,US
@@ -68959,11 +72510,13 @@
2838492960,2838492967,US
2838492968,2838493711,NL
2838493712,2838493727,US
-2838493728,2838494655,NL
+2838493728,2838493839,NL
+2838493840,2838493855,US
+2838493856,2838494655,NL
2838494656,2838494671,US
2838494672,2838511887,NL
-2838511888,2838511895,US
-2838511896,2838511935,NL
+2838511888,2838511903,US
+2838511904,2838511935,NL
2838511936,2838511951,JP
2838511952,2838511983,NL
2838511984,2838511999,JP
@@ -68980,22 +72533,26 @@
2838512368,2838512527,NL
2838512528,2838512543,US
2838512544,2838512639,NL
-2838512640,2838512671,US
-2838512672,2838512751,NL
+2838512640,2838512679,US
+2838512680,2838512727,NL
+2838512728,2838512735,US
+2838512736,2838512751,NL
2838512752,2838512759,US
2838512760,2838512831,NL
2838512832,2838512847,US
2838512848,2838512879,NL
2838512880,2838512895,US
-2838512896,2838513295,NL
+2838512896,2838513199,NL
+2838513200,2838513215,US
+2838513216,2838513295,NL
2838513296,2838513311,US
-2838513312,2838513455,NL
-2838513456,2838513471,US
-2838513472,2838513583,NL
+2838513312,2838513487,NL
+2838513488,2838513503,US
+2838513504,2838513583,NL
2838513584,2838513599,US
2838513600,2838513807,NL
-2838513808,2838513855,US
-2838513856,2838513887,NL
+2838513808,2838513871,US
+2838513872,2838513887,NL
2838513888,2838513903,US
2838513904,2838513951,NL
2838513952,2838513967,US
@@ -69003,17 +72560,39 @@
2838513984,2838513999,US
2838514000,2838514071,NL
2838514072,2838514111,US
-2838514112,2838514177,NL
-2838514178,2838514179,US
-2838514180,2838514191,NL
-2838514192,2838514207,US
-2838514208,2838514248,NL
+2838514112,2838514248,NL
2838514249,2838514251,US
-2838514252,2838514255,NL
-2838514256,2838514271,US
-2838514272,2838514287,NL
-2838514288,2838514311,US
-2838514312,2838526983,NL
+2838514252,2838514287,NL
+2838514288,2838514303,US
+2838514304,2838514399,NL
+2838514400,2838514431,JP
+2838514432,2838514767,NL
+2838514768,2838514783,US
+2838514784,2838515087,NL
+2838515088,2838515103,BR
+2838515104,2838515295,NL
+2838515296,2838515327,US
+2838515328,2838515391,NL
+2838515392,2838515455,US
+2838515456,2838515543,NL
+2838515544,2838515551,US
+2838515552,2838515647,NL
+2838515648,2838515663,US
+2838515664,2838519807,NL
+2838519808,2838519823,US
+2838519824,2838519935,NL
+2838519936,2838520063,US
+2838520064,2838520831,NL
+2838520832,2838522879,US
+2838522880,2838522895,NL
+2838522896,2838522927,US
+2838522928,2838523391,NL
+2838523392,2838523423,US
+2838523424,2838523615,NL
+2838523616,2838523663,US
+2838523664,2838523679,NL
+2838523680,2838523711,JP
+2838523712,2838526983,NL
2838526984,2838527007,US
2838527008,2838527055,NL
2838527056,2838527071,US
@@ -69021,7 +72600,9 @@
2838527224,2838527231,US
2838527232,2838527279,NL
2838527280,2838527295,US
-2838527296,2838527439,NL
+2838527296,2838527391,NL
+2838527392,2838527407,US
+2838527408,2838527439,NL
2838527440,2838527455,US
2838527456,2838527503,NL
2838527504,2838527519,US
@@ -69031,15 +72612,11 @@
2838527616,2838527631,US
2838527632,2838527695,NL
2838527696,2838527711,US
-2838527712,2838528255,NL
-2838528256,2838528271,US
-2838528272,2838528319,NL
+2838527712,2838528319,NL
2838528320,2838528335,US
2838528336,2838528431,NL
2838528432,2838528447,US
-2838528448,2838528463,NL
-2838528464,2838528479,US
-2838528480,2838529167,NL
+2838528448,2838529167,NL
2838529168,2838529183,US
2838529184,2838530095,NL
2838530096,2838530111,US
@@ -69047,27 +72624,79 @@
2838530272,2838530287,US
2838530288,2838530407,NL
2838530408,2838530415,US
-2838530416,2838531327,NL
-2838531328,2838531583,US
-2838531584,2838536207,NL
+2838530416,2838530687,NL
+2838530688,2838530703,US
+2838530704,2838536207,NL
2838536208,2838536239,US
-2838536240,2838537135,NL
-2838537136,2838537139,US
-2838537140,2838537375,NL
+2838536240,2838536783,NL
+2838536784,2838536799,US
+2838536800,2838537375,NL
2838537376,2838537407,US
-2838537408,2838537903,NL
-2838537904,2838537919,US
-2838537920,2838560767,NL
+2838537408,2838537679,NL
+2838537680,2838537695,US
+2838537696,2838538063,NL
+2838538064,2838538079,US
+2838538080,2838538319,NL
+2838538320,2838538327,US
+2838538328,2838538559,NL
+2838538560,2838538591,US
+2838538592,2838538663,NL
+2838538664,2838538671,US
+2838538672,2838540111,NL
+2838540112,2838540119,US
+2838540120,2838540367,NL
+2838540368,2838540383,US
+2838540384,2838540551,NL
+2838540552,2838540575,US
+2838540576,2838540687,NL
+2838540688,2838540703,US
+2838540704,2838541135,NL
+2838541136,2838541167,US
+2838541168,2838541631,NL
+2838541632,2838541647,US
+2838541648,2838541807,NL
+2838541808,2838541823,US
+2838541824,2838541999,NL
+2838542000,2838542015,US
+2838542016,2838542047,NL
+2838542048,2838542063,US
+2838542064,2838542247,NL
+2838542248,2838542255,US
+2838542256,2838542863,NL
+2838542864,2838542879,US
+2838542880,2838543247,NL
+2838543248,2838543263,US
+2838543264,2838543759,NL
+2838543760,2838543775,US
+2838543776,2838544655,NL
+2838544656,2838544671,US
+2838544672,2838544703,NL
+2838544704,2838544767,US
+2838544768,2838545279,NL
+2838545280,2838545295,US
+2838545296,2838545407,NL
+2838545408,2838546431,US
+2838546432,2838547215,NL
+2838547216,2838547231,US
+2838547232,2838547743,NL
+2838547744,2838547775,US
+2838547776,2838547807,NL
+2838547808,2838547823,US
+2838547824,2838560767,NL
2838560768,2838626303,CH
2838626304,2838626399,US
2838626400,2838626431,SA
2838626432,2838626575,US
2838626576,2838626591,CN
-2838626592,2838628319,US
+2838626592,2838627631,US
+2838627632,2838627647,CN
+2838627648,2838628319,US
2838628320,2838628351,DE
2838628352,2838631367,US
2838631368,2838631375,SA
-2838631376,2838631871,US
+2838631376,2838631423,US
+2838631424,2838631431,CN
+2838631432,2838631871,US
2838631872,2838631903,DE
2838631904,2838631935,SA
2838631936,2838631967,US
@@ -69076,9 +72705,17 @@
2838632096,2838632127,DE
2838632128,2838633295,US
2838633296,2838633311,SA
-2838633312,2838641263,US
-2838641264,2838641279,NL
-2838641280,2838642719,US
+2838633312,2838634047,US
+2838634048,2838634111,DE
+2838634112,2838641263,US
+2838641264,2838641279,GR
+2838641280,2838641351,US
+2838641352,2838641359,SE
+2838641360,2838642239,US
+2838642240,2838642303,DE
+2838642304,2838642623,US
+2838642624,2838642639,CN
+2838642640,2838642719,US
2838642720,2838642723,AE
2838642724,2838643407,US
2838643408,2838643408,GB
@@ -69092,43 +72729,39 @@
2838645840,2838645855,GB
2838645856,2838646207,US
2838646208,2838646239,GB
-2838646240,2838646735,US
-2838646736,2838646751,CN
-2838646752,2838647103,US
+2838646240,2838647103,US
2838647104,2838647111,AE
-2838647112,2838650527,US
+2838647112,2838647807,US
+2838647808,2838647839,GB
+2838647840,2838650527,US
2838650528,2838650559,GB
2838650560,2838653631,US
2838653632,2838653639,GB
-2838653640,2838653646,US
-2838653647,2838653647,GB
-2838653648,2838657295,US
+2838653640,2838657295,US
2838657296,2838657299,AE
-2838657300,2838658607,US
+2838657300,2838658181,US
+2838658182,2838658182,GB
+2838658183,2838658607,US
2838658608,2838658623,NL
2838658624,2838659007,US
2838659008,2838659023,GB
2838659024,2838659431,US
2838659432,2838659439,GB
-2838659440,2838663167,US
+2838659440,2838661759,US
+2838661760,2838661791,NL
+2838661792,2838663167,US
2838663168,2838663175,NL
-2838663176,2838663807,US
-2838663808,2838663809,BO
-2838663810,2838664079,US
-2838664080,2838664095,BO
-2838664096,2838664167,US
+2838663176,2838664167,US
2838664168,2838664175,VN
2838664176,2838665759,US
2838665760,2838665791,JP
2838665792,2838669519,US
2838669520,2838669535,NL
-2838669536,2838670623,US
-2838670624,2838670655,NL
-2838670656,2838678319,US
-2838678320,2838678327,GB
-2838678328,2838680639,US
-2838680640,2838680655,GB
-2838680656,2838708223,US
+2838669536,2838683887,US
+2838683888,2838683903,GH
+2838683904,2838700063,US
+2838700064,2838700079,GR
+2838700080,2838708223,US
2838708224,2838724607,NO
2838724608,2838757375,US
2838757376,2838822911,CH
@@ -69160,9 +72793,7 @@
2838887272,2838887279,IN
2838887280,2838887871,US
2838887872,2838887887,EC
-2838887888,2838902591,US
-2838902592,2838902623,BO
-2838902624,2838904831,US
+2838887888,2838904831,US
2838904832,2838921215,CA
2838921216,2838924687,US
2838924688,2838924703,HK
@@ -69180,9 +72811,7 @@
2838938992,2838939007,AU
2838939008,2838946735,US
2838946736,2838946751,CA
-2838946752,2838950703,US
-2838950704,2838950719,NL
-2838950720,2838957535,US
+2838946752,2838957535,US
2838957536,2838957551,HK
2838957552,2838960815,US
2838960816,2838960819,CZ
@@ -69206,7 +72835,9 @@
2838969711,2838969711,HK
2838969712,2838969737,US
2838969738,2838969738,ES
-2838969739,2838969828,US
+2838969739,2838969814,US
+2838969815,2838969815,JP
+2838969816,2838969828,US
2838969829,2838969829,NL
2838969830,2838988639,US
2838988640,2838988671,CA
@@ -69226,18 +72857,38 @@
2839001264,2839001279,CA
2839001280,2839019687,US
2839019688,2839019695,JP
-2839019696,2839035903,US
+2839019696,2839021221,US
+2839021222,2839021222,JP
+2839021223,2839021225,US
+2839021226,2839021226,JP
+2839021227,2839021229,US
+2839021230,2839021230,JP
+2839021231,2839021233,US
+2839021234,2839021234,JP
+2839021235,2839021237,US
+2839021238,2839021238,JP
+2839021239,2839021241,US
+2839021242,2839021242,JP
+2839021243,2839035903,US
2839035904,2839052287,KR
2839052288,2839085055,US
2839085056,2839117823,MX
2839117824,2839150591,BR
-2839150592,2839298543,US
-2839298544,2839298559,NL
-2839298560,2839363903,US
+2839150592,2839298793,US
+2839298794,2839298795,NL
+2839298796,2839299183,US
+2839299184,2839299199,NL
+2839299200,2839363685,US
+2839363686,2839363687,NL
+2839363688,2839363903,US
2839363904,2839363911,AU
-2839363912,2839379615,US
-2839379616,2839379631,NL
-2839379632,2839444639,US
+2839363912,2839367367,US
+2839367368,2839367371,NL
+2839367372,2839379487,US
+2839379488,2839379503,NL
+2839379504,2839379617,US
+2839379618,2839379619,NL
+2839379620,2839444639,US
2839444640,2839444655,NL
2839444656,2840015359,US
2840015360,2840015615,GB
@@ -69245,17 +72896,14 @@
2843803648,2843869183,ZA
2843869184,2844524543,US
2844524544,2844590079,KR
-2844590080,2844783615,US
-2844784640,2844862975,US
+2844590080,2844862975,US
2844862976,2844863231,CA
-2844863232,2844902655,US
-2844902912,2844912639,US
+2844863232,2844912639,US
2844912640,2844912895,JP
2844912896,2845114367,US
2845114368,2845179903,IN
2845179904,2845704191,US
-2845704192,2845755391,CU
-2845755648,2845769727,CU
+2845704192,2845769727,CU
2845769728,2845786111,GA
2845786112,2845802495,NG
2845802496,2845822975,ZA
@@ -69313,8 +72961,9 @@
2851057664,2851060735,ZA
2851060736,2851062783,NG
2851062784,2851063807,SL
-2851063808,2851064319,SC
-2851064320,2851064831,NA
+2851063808,2851064319,FR
+2851064320,2851064575,SC
+2851064576,2851064831,FR
2851064832,2851065855,SC
2851065856,2851066879,ZA
2851066880,2851067903,CD
@@ -69349,7 +72998,7 @@
2852083712,2852084735,AO
2852084736,2852085759,TN
2852085760,2852086783,KE
-2852086784,2852087807,SS
+2852086784,2852087807,SD
2852087808,2852088831,KE
2852088832,2852089855,LY
2852089856,2852090879,TZ
@@ -69410,26 +73059,37 @@
2853371904,2853765119,US
2853765120,2853830655,MX
2853830656,2854289407,US
-2854289408,2854354943,SG
+2854289408,2854290431,CN
+2854290432,2854293503,SG
+2854293504,2854295551,US
+2854295552,2854354943,SG
2854354944,2854617087,US
2854617088,2854682623,MY
2854748160,2855288831,US
2855288832,2855305215,GB
2855305216,2855309311,HK
2855309312,2855469055,US
-2855469056,2855484415,PY
+2855469056,2855473151,PY
+2855473152,2855481343,AR
+2855481344,2855484415,PY
2855484416,2855484671,AR
2855484672,2855484927,PY
2855484928,2855485183,AR
-2855485184,2855501823,UY
-2855501824,2855534591,AR
-2855534592,2855706623,US
-2855706880,2856058879,US
+2855485184,2855489535,UY
+2855489536,2855491583,AR
+2855491584,2855493631,UY
+2855493632,2855495679,AR
+2855495680,2855501823,UY
+2855501824,2855518207,AR
+2855518208,2855520255,UY
+2855520256,2855534591,AR
+2855534592,2855550975,US
+2855550976,2855567359,CA
+2855567360,2856058879,US
2856058880,2856124415,CH
2856124416,2856184831,US
2856184832,2856185855,GB
-2856185856,2856353796,US
-2856353798,2856438783,US
+2856185856,2856438783,US
2856438784,2856439039,BR
2856439040,2856439295,US
2856439296,2856439551,BR
@@ -69450,7 +73110,9 @@
2857250816,2857252863,BR
2857252864,2857253887,CO
2857253888,2857256959,BR
-2857256960,2857257983,AR
+2857256960,2857257471,AR
+2857257472,2857257727,US
+2857257728,2857257983,AR
2857257984,2857261055,BR
2857261056,2857262079,AR
2857262080,2857266175,BR
@@ -69499,7 +73161,8 @@
2857371648,2857372671,CO
2857372672,2857373695,BR
2857373696,2857374719,NI
-2857374720,2857375743,GT
+2857374720,2857374975,SV
+2857374976,2857375743,GT
2857375744,2857376767,AR
2857376768,2857377791,MX
2857377792,2857388031,BR
@@ -69596,14 +73259,16 @@
2857596928,2857597951,BR
2857597952,2857598975,AR
2857598976,2857611263,BR
-2857611264,2857612287,HN
+2857611264,2857611775,US
+2857611776,2857612287,HN
2857612288,2857615359,BR
2857615360,2857616383,HT
2857616384,2857621503,BR
2857621504,2857622527,EC
2857622528,2857623551,AR
2857623552,2857625599,BR
-2857625600,2857627647,HN
+2857625600,2857627135,HN
+2857627136,2857627647,US
2857627648,2857628671,PY
2857628672,2857633791,BR
2857633792,2857634815,TT
@@ -69629,17 +73294,15 @@
2857691136,2857692159,AR
2857692160,2857696255,BR
2857696256,2857697279,AR
-2857697280,2857766655,US
-2857766912,2859007999,US
+2857697280,2859007999,US
2859008000,2859073535,JP
2859073536,2861842431,US
2861842432,2861843851,HK
2861843852,2861843853,US
2861843854,2861844479,HK
-2861844480,2861850623,US
-2861850880,2861851391,US
-2861851648,2861858815,US
+2861844480,2861858815,US
2861858816,2861859974,HK
+2861859975,2861859976,US
2861859977,2861860863,HK
2861860864,2861862911,US
2861862912,2861863423,AU
@@ -69679,8 +73342,7 @@
2862284800,2862350335,AR
2862350336,2862415871,US
2862415872,2862481407,AU
-2862481408,2862751999,US
-2862752256,2863202303,US
+2862481408,2863202303,US
2863202304,2863267839,MX
2863267840,2863595519,US
2863595520,2863661055,CA
@@ -69725,7 +73387,9 @@
2867324928,2867325951,BR
2867325952,2867326975,PA
2867326976,2867329023,BR
-2867329024,2867330047,HN
+2867329024,2867329303,HN
+2867329304,2867329311,NL
+2867329312,2867330047,HN
2867330048,2867331071,BR
2867331072,2867396607,US
2867396608,2867403775,BR
@@ -69866,7 +73530,9 @@
2868192256,2868193279,BR
2868193280,2868194303,HN
2868194304,2868195327,BR
-2868195328,2868196351,CL
+2868195328,2868195583,CL
+2868195584,2868195839,GB
+2868195840,2868196351,CL
2868196352,2868197375,BR
2868197376,2868198399,HN
2868198400,2868205567,BR
@@ -70012,21 +73678,17 @@
2868599296,2868599807,IN
2868599808,2868604415,US
2868604416,2868604927,IN
-2868604928,2868628639,US
-2868628672,2868632575,US
+2868604928,2868632575,US
2868632576,2868633087,BR
2868633088,2868658175,US
2868658176,2868659199,GB
-2868659200,2868660223,US
-2868660480,2868662271,US
-2868662528,2868673023,US
+2868659200,2868673023,US
2868673024,2868673279,FR
2868673280,2868673535,ZA
2868673536,2868674303,US
2868674304,2868674559,SE
2868674560,2868682751,AU
-2868682752,2868682752,US
-2868682754,2868688895,US
+2868682752,2868688895,US
2868688896,2868689919,AU
2868689920,2868731903,US
2868731904,2868740095,CA
@@ -70120,7 +73782,7 @@
2870601216,2870601727,PL
2870601728,2870602751,RU
2870602752,2870603775,UA
-2870603776,2870604031,CZ
+2870603776,2870604031,LT
2870604032,2870604287,UA
2870604288,2870607871,RU
2870607872,2870673407,BE
@@ -70140,7 +73802,6 @@
2871115776,2871123967,GB
2871123968,2871126015,NL
2871126016,2871128063,ES
-2871128064,2871130111,BH
2871130112,2871132159,RU
2871132160,2872049663,CN
2872049664,2873098239,IN
@@ -70151,13 +73812,16 @@
2875719680,2877292543,CN
2877292544,2879336447,US
2879336448,2879336703,GB
-2879336704,2879467519,US
-2879468032,2882469887,US
+2879336704,2882469887,US
2882469888,2882535423,SG
2882535424,2883583999,CN
2883584000,2885681151,VN
2885681152,2886729727,US
-2887778304,2890137599,US
+2887778304,2889522431,US
+2889522432,2889522687,PR
+2889522688,2889523071,US
+2889523072,2889523199,PR
+2889523200,2890137599,US
2890137600,2890138623,AU
2890138624,2890139647,TH
2890139648,2890140927,RU
@@ -70179,7 +73843,8 @@
2890163200,2890164223,PT
2890164224,2890165247,TH
2890165248,2890166271,DE
-2890166272,2890168319,AU
+2890166272,2890167295,CL
+2890167296,2890168319,AU
2890168320,2890169343,CW
2890169344,2890170367,AM
2890170368,2890171391,DJ
@@ -70198,19 +73863,24 @@
2890188800,2890189823,LK
2890189824,2890191871,US
2890191872,2890192895,CZ
-2890192896,2890194943,US
+2890192896,2890193919,BR
+2890193920,2890194943,US
2890194944,2890195967,HU
2890195968,2890196991,US
2890196992,2890198015,TH
2890198016,2890199039,UA
2890199040,2890200063,TH
-2890200064,2890956799,US
+2890200064,2890201087,US
+2890201088,2890203135,HK
+2890203136,2890956799,US
2890956800,2890989567,AE
2890989568,2891017215,US
2891017216,2891017471,JP
2891017472,2891034623,US
2891034624,2891036671,CA
-2891036672,2891056383,US
+2891036672,2891038719,US
+2891038720,2891055103,CN
+2891055104,2891056383,US
2891056384,2891056639,ES
2891056640,2891058943,US
2891058944,2891059199,FR
@@ -70226,7 +73896,6 @@
2891283456,2891284479,CA
2891284480,2891364351,US
2891364352,2891374591,CA
-2891374592,2891378687,US
2891378688,2891380735,CA
2891380736,2891403263,US
2891403264,2891407359,CA
@@ -70243,9 +73912,11 @@
2891808768,2891841535,US
2891841536,2891841791,SE
2891841792,2891842303,US
-2891842304,2891843327,GB
+2891842304,2891842559,GB
+2891842560,2891842815,BN
+2891842816,2891843327,GB
2891843328,2891844095,US
-2891844096,2891844351,CL
+2891844096,2891844351,GE
2891844352,2891845119,US
2891845120,2891845631,DE
2891845632,2891845887,US
@@ -70270,36 +73941,42 @@
2891854592,2891854847,PL
2891854848,2891855103,US
2891855104,2891855359,FR
-2891855360,2891855615,NL
-2891855616,2891856127,SE
+2891855360,2891855615,US
+2891855616,2891855871,CH
+2891855872,2891856127,JP
2891856128,2891856383,LU
2891856384,2891856895,US
2891856896,2891857151,CU
2891857152,2891857663,US
2891857664,2891857919,DE
-2891857920,2891858175,ES
-2891858176,2891858431,TR
+2891857920,2891858175,DZ
+2891858176,2891858431,DK
2891858432,2891858687,CA
2891858688,2891859455,US
2891859456,2891859711,NO
2891859712,2891859967,AT
-2891859968,2891860223,ES
+2891859968,2891860223,US
2891860224,2891860479,NL
2891860480,2891860735,CH
-2891860736,2891861247,GB
-2891861248,2891861503,AU
+2891860736,2891860991,GB
+2891860992,2891861247,BM
+2891861248,2891861503,BO
2891861504,2891862527,US
2891862528,2891863039,KR
2891863040,2891863295,FR
2891863296,2891863551,AU
-2891863552,2891864063,JP
+2891863552,2891863807,JP
+2891863808,2891864063,FR
2891864064,2891864575,SG
2891864576,2891865087,US
2891865088,2891865343,NL
2891865344,2891865599,US
2891865600,2891865855,HK
2891865856,2891866111,US
-2891866112,2891867647,AU
+2891866112,2891866367,AU
+2891866368,2891866623,BB
+2891866624,2891867391,AU
+2891867392,2891867647,AT
2891867648,2891867903,US
2891867904,2891868159,AU
2891868160,2891868671,IT
@@ -70307,18 +73984,24 @@
2891868928,2891869439,US
2891869440,2891869695,AT
2891869696,2891869951,US
-2891869952,2891870207,HK
-2891870208,2891870975,RU
+2891869952,2891870207,DE
+2891870208,2891870463,RU
+2891870464,2891870719,KY
+2891870720,2891870975,NO
2891870976,2891871231,US
2891871232,2891871487,CA
2891871488,2891974655,US
2891974656,2891976703,CA
2891976704,2891982847,US
2891982848,2891984895,CA
-2891984896,2892015615,US
+2891984896,2891997695,US
+2891997696,2891997951,IE
+2891997952,2892015615,US
2892015616,2892016639,PR
2892016640,2892017663,US
-2892017664,2892038143,CA
+2892017664,2892019711,CA
+2892019712,2892019967,NL
+2892019968,2892038143,CA
2892038144,2892040191,US
2892040192,2892042239,CA
2892042240,2892050431,US
@@ -70349,7 +74032,9 @@
2892120576,2892121087,CA
2892121088,2892122367,US
2892122368,2892122623,CA
-2892122624,2892140543,US
+2892122624,2892124927,US
+2892124928,2892125183,NL
+2892125184,2892140543,US
2892140544,2892144895,CA
2892144896,2892145407,US
2892145408,2892145663,CA
@@ -70403,7 +74088,8 @@
2892505088,2892513279,SG
2892513280,2892529663,JP
2892529664,2892537855,DE
-2892537856,2892906495,US
+2892537856,2892546047,SG
+2892546048,2892906495,US
2892906496,2892910591,CA
2892910592,2892943743,US
2892943744,2892943871,LR
@@ -70473,7 +74159,7 @@
2893001728,2893002239,IT
2893002240,2893002495,EE
2893002496,2893002751,PA
-2893002752,2893003007,NZ
+2893002752,2893003007,AM
2893003008,2893003263,KR
2893003264,2893003775,GB
2893003776,2893004031,DE
@@ -70493,7 +74179,7 @@
2893007616,2893007871,DE
2893007872,2893008639,GB
2893008640,2893008895,US
-2893008896,2893009151,GB
+2893008896,2893009151,AF
2893009152,2893009663,US
2893009664,2893010175,GB
2893010176,2893010431,US
@@ -70564,22 +74250,57 @@
2901491712,2901493759,NL
2901493760,2901496831,US
2901496832,2901497855,NL
-2901497856,2901740455,US
+2901497856,2901538815,US
+2901538816,2901540863,SG
+2901540864,2901740455,US
2901740456,2901740463,CA
2901740464,2901751295,US
2901751296,2901751551,GB
2901751552,2902200319,US
-2902200320,2902204415,CN
-2902204416,2902208511,US
-2902208512,2902212607,CN
-2902212608,2902228991,US
-2902228992,2902245375,CN
+2902200320,2902201855,CN
+2902201856,2902202111,US
+2902202112,2902203135,CN
+2902203136,2902203391,US
+2902203392,2902204159,CN
+2902204160,2902208767,US
+2902208768,2902211327,CN
+2902211328,2902211583,US
+2902211584,2902212607,CN
+2902212608,2902228479,US
+2902228480,2902228991,DE
+2902228992,2902230015,CN
+2902230016,2902230271,US
+2902230272,2902231039,CN
+2902231040,2902231295,US
+2902231296,2902232319,CN
+2902232320,2902232575,US
+2902232576,2902232831,CN
+2902232832,2902233087,US
+2902233088,2902233343,CN
+2902233344,2902233599,US
+2902233600,2902235135,CN
+2902235136,2902235391,US
+2902235392,2902236415,CN
+2902236416,2902236927,US
+2902236928,2902237951,CN
+2902237952,2902238207,US
+2902238208,2902239999,CN
+2902240000,2902240511,US
+2902240512,2902241535,CN
+2902241536,2902241791,US
+2902241792,2902242047,CN
+2902242048,2902242303,US
+2902242304,2902243327,CN
+2902243328,2902243583,US
+2902243584,2902245375,CN
2902245376,2902246143,US
2902246144,2902246399,CN
-2902246400,2902405119,US
-2902405120,2902405935,CA
-2902405936,2902405951,US
-2902405952,2902408191,CA
+2902246400,2902392831,US
+2902392832,2902393087,NL
+2902393088,2902393599,US
+2902393600,2902396927,NL
+2902396928,2902405119,US
+2902405120,2902408191,CA
2902408192,2902409215,GB
2902409216,2902417407,US
2902417408,2902421503,NL
@@ -70616,19 +74337,13 @@
2905348864,2905349119,NZ
2905349120,2905376207,US
2905376208,2905376223,GB
-2905376224,2905387519,US
-2905387520,2905388031,CA
-2905388032,2905390879,US
+2905376224,2905390879,US
2905390880,2905390895,GB
2905390896,2905391599,US
2905391600,2905391615,GB
-2905391616,2905401855,US
-2905401856,2905402111,CA
-2905402112,2905402519,US
+2905391616,2905402519,US
2905402520,2905402527,IN
-2905402528,2905405679,US
-2905405680,2905405687,CN
-2905405688,2905415679,US
+2905402528,2905415679,US
2905415680,2905415935,GB
2905415936,2905473023,US
2905473024,2905481215,CA
@@ -70664,9 +74379,9 @@
2915518435,2915518435,FR
2915518436,2915518463,DK
2915518464,2915520511,GB
-2915520512,2915520642,AU
-2915520643,2915520643,US
-2915520644,2915520671,AU
+2915520512,2915520639,AU
+2915520640,2915520647,US
+2915520648,2915520671,AU
2915520672,2915520767,US
2915520768,2915521023,AU
2915521024,2915521279,JP
@@ -70676,23 +74391,19 @@
2915527168,2915527423,US
2915527424,2915527679,DE
2915527680,2915528703,NL
-2915528704,2915528707,US
-2915528708,2915528711,NL
-2915528712,2915528735,US
+2915528704,2915528735,US
2915528736,2915528751,NL
-2915528752,2915528767,US
-2915528768,2915528791,NL
+2915528752,2915528783,US
+2915528784,2915528791,NL
2915528792,2915528815,US
2915528816,2915528823,NL
-2915528824,2915528839,US
-2915528840,2915528843,NL
-2915528844,2915528863,US
+2915528824,2915528863,US
2915528864,2915528879,NL
2915528880,2915528927,US
2915528928,2915528943,NL
2915528944,2915528959,US
-2915528960,2915529043,NL
-2915529044,2915529151,US
+2915528960,2915529023,NL
+2915529024,2915529151,US
2915529152,2915529215,NL
2915529216,2915795013,US
2915795014,2915795014,MX
@@ -70708,9 +74419,10 @@
2916184064,2916196351,CA
2916196352,2916253695,US
2916253696,2916286463,CA
-2916286464,2916294655,US
-2916294656,2916296703,IL
-2916296704,2916302847,US
+2916286464,2916287487,US
+2916287488,2916287743,NL
+2916287744,2916287999,CA
+2916288000,2916302847,US
2916302848,2916303359,CA
2916303360,2916303871,DE
2916303872,2916304383,CA
@@ -70844,7 +74556,11 @@
2918136832,2918137087,CA
2918137088,2918154239,US
2918154240,2918170623,CA
-2918170624,2918174463,US
+2918170624,2918172790,US
+2918172791,2918172793,MX
+2918172794,2918172794,US
+2918172795,2918172800,AR
+2918172801,2918174463,US
2918174464,2918174719,MX
2918174720,2918180351,US
2918180352,2918180863,CA
@@ -70852,9 +74568,7 @@
2918187008,2918187263,CA
2918187264,2918187775,US
2918187776,2918188031,CA
-2918188032,2918190879,US
-2918190880,2918190887,CN
-2918190888,2918232063,US
+2918188032,2918232063,US
2918232064,2918236159,CA
2918236160,2918260735,US
2918260736,2918264831,CA
@@ -70872,9 +74586,7 @@
2918375424,2918391807,US
2918391808,2918395903,CA
2918395904,2918404095,US
-2918404096,2918406911,PR
-2918406912,2918407423,US
-2918407424,2918408191,PR
+2918404096,2918408191,PR
2918408192,2918432767,US
2918432768,2918436863,CA
2918436864,2918459391,US
@@ -70887,11 +74599,17 @@
2918473216,2918473727,CA
2918473728,2918477823,US
2918477824,2918481919,CA
-2918481920,2918498535,US
+2918481920,2918498499,US
+2918498500,2918498501,JP
+2918498502,2918498535,US
2918498536,2918498539,JP
2918498540,2918502911,US
2918502912,2918503167,SG
-2918503168,2918527231,US
+2918503168,2918514943,US
+2918514944,2918515079,CA
+2918515080,2918515199,US
+2918515200,2918515327,CA
+2918515328,2918527231,US
2918527232,2918527487,FR
2918527488,2918528255,US
2918528256,2918528511,NL
@@ -70932,9 +74650,7 @@
2918842368,2918875135,CA
2918875136,2918973439,US
2918973440,2918989823,CA
-2918989824,2919020551,US
-2919020552,2919020559,CA
-2919020560,2919021503,US
+2918989824,2919021503,US
2919021504,2919021535,CA
2919021536,2919055359,US
2919055360,2919057407,CN
@@ -71049,7 +74765,9 @@
2928283648,2928287743,SG
2928287744,2928304127,US
2928304128,2928305151,NL
-2928305152,2928308223,US
+2928305152,2928306175,US
+2928306176,2928307199,NL
+2928307200,2928308223,US
2928308224,2928309247,CA
2928309248,2928312319,US
2928312320,2928316415,CA
@@ -71114,8 +74832,7 @@
2938711040,2938712063,BD
2938712064,2938716159,TW
2938716160,2938732543,JP
-2938732544,2938733823,SG
-2938734080,2938748927,SG
+2938732544,2938748927,SG
2938748928,2938765311,JP
2938765312,2938961919,CN
2938961920,2938978303,HK
@@ -71241,8 +74958,7 @@
2948595712,2952790015,KR
2952790016,2953314303,DE
2953314304,2953379839,UA
-2953379840,2953399082,DE
-2953399084,2953445375,DE
+2953379840,2953445375,DE
2953445376,2953453567,IT
2953453568,2953455615,IS
2953455616,2953457663,SK
@@ -71300,11 +75016,14 @@
2954823888,2954823891,ES
2954823892,2954823999,FR
2954824000,2954824015,ES
-2954824016,2954824255,FR
+2954824016,2954824095,FR
+2954824096,2954824127,FI
+2954824128,2954824255,FR
2954824256,2954824259,ES
2954824260,2954824287,FR
2954824288,2954824319,ES
-2954824320,2954824415,FR
+2954824320,2954824351,DE
+2954824352,2954824415,FR
2954824416,2954824431,GB
2954824432,2954824511,FR
2954824512,2954824527,FI
@@ -71320,7 +75039,8 @@
2954825064,2954825067,ES
2954825068,2954825247,FR
2954825248,2954825263,GB
-2954825264,2954825311,FR
+2954825264,2954825267,PL
+2954825268,2954825311,FR
2954825312,2954825315,GB
2954825316,2954825319,ES
2954825320,2954825387,FR
@@ -71331,9 +75051,13 @@
2954825536,2954825539,ES
2954825540,2954825663,FR
2954825664,2954825727,GB
-2954825728,2954826031,FR
+2954825728,2954826015,FR
+2954826016,2954826019,PT
+2954826020,2954826031,FR
2954826032,2954826035,ES
-2954826036,2954826159,FR
+2954826036,2954826143,FR
+2954826144,2954826147,CZ
+2954826148,2954826159,FR
2954826160,2954826163,ES
2954826164,2954826471,FR
2954826472,2954826475,GB
@@ -71345,13 +75069,18 @@
2954826816,2954826879,GB
2954826880,2954827007,FR
2954827008,2954827135,ES
-2954827136,2954827799,FR
+2954827136,2954827599,FR
+2954827600,2954827615,BE
+2954827616,2954827647,NL
+2954827648,2954827799,FR
2954827800,2954827807,DE
2954827808,2954827939,FR
2954827940,2954827943,PT
2954827944,2954828335,FR
2954828336,2954828339,ES
-2954828340,2954828847,FR
+2954828340,2954828511,FR
+2954828512,2954828543,CZ
+2954828544,2954828847,FR
2954828848,2954828863,GB
2954828864,2954828975,FR
2954828976,2954828979,GB
@@ -71362,7 +75091,8 @@
2954829424,2954829623,FR
2954829624,2954829631,ES
2954829632,2954829647,GB
-2954829648,2954829695,FR
+2954829648,2954829679,FR
+2954829680,2954829695,NL
2954829696,2954829711,ES
2954829712,2954829739,FR
2954829740,2954829743,GB
@@ -71387,7 +75117,13 @@
2954831248,2954831251,ES
2954831252,2954831807,FR
2954831808,2954831823,ES
-2954831824,2954832159,FR
+2954831824,2954832003,FR
+2954832004,2954832007,BE
+2954832008,2954832031,FR
+2954832032,2954832063,PL
+2954832064,2954832151,FR
+2954832152,2954832155,DE
+2954832156,2954832159,FR
2954832160,2954832167,PT
2954832168,2954832255,FR
2954832256,2954832287,GB
@@ -71396,9 +75132,13 @@
2954832348,2954832351,ES
2954832352,2954832399,FR
2954832400,2954832415,FI
-2954832416,2954832607,FR
+2954832416,2954832447,FR
+2954832448,2954832479,CZ
+2954832480,2954832607,FR
2954832608,2954832639,PT
-2954832640,2954832843,FR
+2954832640,2954832767,FR
+2954832768,2954832771,DE
+2954832772,2954832843,FR
2954832844,2954832847,GB
2954832848,2954832891,FR
2954832892,2954832895,ES
@@ -71450,13 +75190,17 @@
2954836984,2954836991,PT
2954836992,2954837071,FR
2954837072,2954837075,ES
-2954837076,2954837311,FR
+2954837076,2954837279,FR
+2954837280,2954837295,DE
+2954837296,2954837311,FR
2954837312,2954837319,FI
2954837320,2954837327,FR
2954837328,2954837335,GB
2954837336,2954837439,FR
2954837440,2954837471,GB
-2954837472,2954837579,FR
+2954837472,2954837535,FR
+2954837536,2954837543,PT
+2954837544,2954837579,FR
2954837580,2954837583,GB
2954837584,2954837599,FR
2954837600,2954837607,GB
@@ -71464,21 +75208,30 @@
2954837668,2954837671,ES
2954837672,2954837743,FR
2954837744,2954837751,CZ
-2954837752,2954837827,FR
+2954837752,2954837759,BE
+2954837760,2954837827,FR
2954837828,2954837831,DE
2954837832,2954837867,FR
2954837868,2954837871,ES
2954837872,2954838103,FR
2954838104,2954838107,DE
-2954838108,2954838175,FR
+2954838108,2954838155,FR
+2954838156,2954838159,BE
+2954838160,2954838175,FR
2954838176,2954838179,GB
2954838180,2954838215,FR
2954838216,2954838219,GB
2954838220,2954838599,FR
2954838600,2954838607,GB
-2954838608,2954838911,FR
+2954838608,2954838655,FR
+2954838656,2954838687,BE
+2954838688,2954838911,FR
2954838912,2954838915,DE
-2954838916,2954839103,FR
+2954838916,2954838991,FR
+2954838992,2954838995,DE
+2954838996,2954839071,FR
+2954839072,2954839087,LT
+2954839088,2954839103,FR
2954839104,2954839107,GB
2954839108,2954839111,FR
2954839112,2954839119,ES
@@ -71517,11 +75270,14 @@
2954841708,2954841711,NL
2954841712,2954841851,FR
2954841852,2954841855,ES
-2954841856,2954842075,FR
+2954841856,2954841999,FR
+2954842000,2954842015,LT
+2954842016,2954842075,FR
2954842076,2954842079,GB
2954842080,2954842111,FR
2954842112,2954842143,FI
-2954842144,2954842239,FR
+2954842144,2954842175,FR
+2954842176,2954842239,BE
2954842240,2954842243,ES
2954842244,2954842247,FR
2954842248,2954842251,ES
@@ -71535,15 +75291,18 @@
2954843044,2954843047,GB
2954843048,2954843187,FR
2954843188,2954843191,GB
-2954843192,2954843503,FR
+2954843192,2954843479,FR
+2954843480,2954843487,NL
+2954843488,2954843503,FR
2954843504,2954843507,ES
2954843508,2954843759,FR
2954843760,2954843771,ES
2954843772,2954844147,FR
2954844148,2954844151,DE
-2954844152,2954844192,FR
-2954844193,2954844193,NL
-2954844194,2954844263,FR
+2954844152,2954844191,FR
+2954844192,2954844223,NL
+2954844224,2954844239,DE
+2954844240,2954844263,FR
2954844264,2954844267,IE
2954844268,2954844275,FR
2954844276,2954844279,GB
@@ -71559,7 +75318,8 @@
2954845088,2954845091,FI
2954845092,2954845283,FR
2954845284,2954845287,GB
-2954845288,2954845363,FR
+2954845288,2954845291,PL
+2954845292,2954845363,FR
2954845364,2954845367,ES
2954845368,2954845951,FR
2954845952,2954845967,ES
@@ -71587,9 +75347,12 @@
2954855516,2954855519,ES
2954855520,2954855527,FR
2954855528,2954855535,ES
-2954855536,2954855663,FR
+2954855536,2954855647,FR
+2954855648,2954855651,CZ
+2954855652,2954855663,FR
2954855664,2954855679,PT
-2954855680,2954855807,FR
+2954855680,2954855743,FR
+2954855744,2954855807,BE
2954855808,2954855871,DE
2954855872,2954855879,FR
2954855880,2954855887,ES
@@ -71630,7 +75393,9 @@
2954859316,2954859319,ES
2954859320,2954859323,FR
2954859324,2954859327,ES
-2954859328,2954859711,FR
+2954859328,2954859455,FR
+2954859456,2954859471,DE
+2954859472,2954859711,FR
2954859712,2954859727,PL
2954859728,2954859871,FR
2954859872,2954859903,ES
@@ -71649,7 +75414,9 @@
2954861880,2954861959,FR
2954861960,2954861967,GB
2954861968,2954861975,ES
-2954861976,2954862079,FR
+2954861976,2954861987,FR
+2954861988,2954861991,BE
+2954861992,2954862079,FR
2954862080,2954862095,ES
2954862096,2954862415,FR
2954862416,2954862419,ES
@@ -71665,9 +75432,13 @@
2954870844,2954870847,ES
2954870848,2954870903,FR
2954870904,2954870907,ES
-2954870908,2954871679,FR
+2954870908,2954871615,FR
+2954871616,2954871623,BE
+2954871624,2954871679,FR
2954871680,2954871695,FI
-2954871696,2954871807,FR
+2954871696,2954871759,FR
+2954871760,2954871775,PL
+2954871776,2954871807,FR
2954871808,2954871823,ES
2954871824,2954871955,FR
2954871956,2954871959,PT
@@ -71702,13 +75473,17 @@
2954874656,2954874663,DE
2954874664,2954874943,FR
2954874944,2954874975,ES
-2954874976,2954875135,FR
+2954874976,2954875075,FR
+2954875076,2954875079,BE
+2954875080,2954875135,FR
2954875136,2954875167,GB
2954875168,2954875467,FR
2954875468,2954875471,GB
2954875472,2954875583,FR
2954875584,2954875587,ES
-2954875588,2954875879,FR
+2954875588,2954875711,FR
+2954875712,2954875775,DE
+2954875776,2954875879,FR
2954875880,2954875883,ES
2954875884,2954875891,FR
2954875892,2954875895,ES
@@ -71720,7 +75495,11 @@
2954876248,2954876255,ES
2954876256,2954876351,FR
2954876352,2954876383,ES
-2954876384,2954876871,FR
+2954876384,2954876559,FR
+2954876560,2954876575,LT
+2954876576,2954876655,FR
+2954876656,2954876663,BE
+2954876664,2954876871,FR
2954876872,2954876875,ES
2954876876,2954876887,FR
2954876888,2954876891,ES
@@ -71733,13 +75512,17 @@
2954877528,2954877535,PT
2954877536,2954877727,FR
2954877728,2954877743,IE
-2954877744,2954877819,FR
+2954877744,2954877759,FR
+2954877760,2954877775,CZ
+2954877776,2954877819,FR
2954877820,2954877823,ES
2954877824,2954877967,FR
2954877968,2954877983,PT
2954877984,2954878143,FR
2954878144,2954878207,ES
-2954878208,2954878471,FR
+2954878208,2954878271,FR
+2954878272,2954878335,IT
+2954878336,2954878471,FR
2954878472,2954878475,GB
2954878476,2954878607,FR
2954878608,2954878623,FI
@@ -71777,9 +75560,7 @@
2954944512,2954946559,GB
2954946560,2954948607,DE
2954948608,2954950655,RU
-2954950656,2954951167,ES
-2954951168,2954951679,DE
-2954951680,2954952703,ES
+2954950656,2954952703,ES
2954952704,2955018239,TR
2955018240,2955027726,JP
2955027727,2955027727,IE
@@ -71796,11 +75577,9 @@
2955870208,2955935743,SA
2955935744,2956230655,RU
2956230656,2956238847,SI
-2956238848,2956242943,ES
-2956242944,2956243967,JO
-2956243968,2956244223,GR
-2956244224,2956244479,JO
-2956244480,2956244991,SE
+2956238848,2956240383,ES
+2956240384,2956240639,HK
+2956240640,2956242943,ES
2956244992,2956245247,FR
2956245248,2956245503,RO
2956245504,2956245759,GB
@@ -71864,6 +75643,7 @@
2956611584,2956613631,IT
2956613632,2956614911,GB
2956614912,2956615167,NL
+2956615168,2956615423,FR
2956615680,2956623871,GB
2956623872,2956656639,GR
2956656640,2956722175,RU
@@ -71911,11 +75691,98 @@
2957195264,2957197311,PS
2957197312,2957201407,IR
2957201408,2957201423,GB
-2957201424,2957202679,US
-2957202680,2957202680,PT
-2957202681,2957203127,US
+2957201424,2957202431,US
+2957202432,2957202463,GB
+2957202464,2957202467,PL
+2957202468,2957202471,KR
+2957202472,2957202475,BR
+2957202476,2957202479,EG
+2957202480,2957202483,ZA
+2957202484,2957202487,IS
+2957202488,2957202491,CA
+2957202492,2957202495,IL
+2957202496,2957202499,DE
+2957202500,2957202503,AR
+2957202504,2957202507,NZ
+2957202508,2957202511,DE
+2957202512,2957202527,NO
+2957202528,2957202543,SE
+2957202544,2957202551,FI
+2957202552,2957202559,EE
+2957202560,2957202567,LV
+2957202568,2957202575,LT
+2957202576,2957202583,BY
+2957202584,2957202591,UA
+2957202592,2957202599,RO
+2957202600,2957202607,BG
+2957202608,2957202615,GR
+2957202616,2957202623,TR
+2957202624,2957202627,AT
+2957202628,2957202631,IT
+2957202632,2957202639,CH
+2957202640,2957202643,LU
+2957202644,2957202647,BE
+2957202648,2957202651,NL
+2957202652,2957202667,DK
+2957202668,2957202671,FR
+2957202672,2957202675,US
+2957202676,2957202679,ES
+2957202680,2957202683,PT
+2957202684,2957202687,AU
+2957202688,2957202691,RU
+2957202692,2957202699,IE
+2957202700,2957202703,JP
+2957202704,2957202944,US
+2957202945,2957202947,AL
+2957202948,2957202951,AD
+2957202952,2957202955,AR
+2957202956,2957202959,AU
+2957202960,2957202963,BY
+2957202964,2957202967,BE
+2957202968,2957202971,BA
+2957202972,2957202975,BR
+2957202976,2957202979,BG
+2957202980,2957202983,CL
+2957202984,2957202987,CN
+2957202988,2957202991,CO
+2957202992,2957202995,CR
+2957202996,2957202999,HR
+2957203000,2957203003,CY
+2957203004,2957203007,CZ
+2957203008,2957203011,DK
+2957203012,2957203015,EG
+2957203016,2957203019,EE
+2957203020,2957203023,FJ
+2957203024,2957203027,FI
+2957203028,2957203031,FR
+2957203032,2957203035,GE
+2957203036,2957203039,DE
+2957203040,2957203043,GR
+2957203044,2957203047,HK
+2957203048,2957203051,HU
+2957203052,2957203055,IS
+2957203056,2957203059,IN
+2957203060,2957203063,IE
+2957203064,2957203067,IL
+2957203068,2957203071,IT
+2957203072,2957203075,JP
+2957203076,2957203079,KR
+2957203080,2957203083,LV
+2957203084,2957203087,LI
+2957203088,2957203091,LT
+2957203092,2957203095,LU
+2957203096,2957203099,MK
+2957203100,2957203103,MY
+2957203104,2957203107,MX
+2957203108,2957203111,NL
+2957203112,2957203115,NZ
+2957203116,2957203119,NO
+2957203120,2957203123,US
+2957203124,2957203127,MT
2957203128,2957203131,XK
-2957203132,2957203455,US
+2957203132,2957203196,GB
+2957203197,2957203199,US
+2957203200,2957203455,GB
2957203456,2957205503,FR
2957205504,2957213695,PS
2957213696,2957221887,FR
@@ -71975,7 +75842,7 @@
2959118336,2959120383,PL
2959120384,2959122431,AT
2959122432,2959126527,PL
-2959126528,2959128575,ES
+2959126528,2959128575,RO
2959128576,2959130623,RU
2959130624,2959138815,UA
2959138816,2959147007,RU
@@ -72008,7 +75875,8 @@
2959245312,2959253503,RU
2959253504,2959255551,DE
2959255552,2959261695,RU
-2959261696,2959278079,KZ
+2959261696,2959276031,KZ
+2959276032,2959278079,CZ
2959278080,2959282175,RU
2959282176,2959286271,SA
2959286272,2959290367,RO
@@ -72043,7 +75911,7 @@
2959456256,2959466495,UA
2959466496,2959474687,RU
2959474688,2959491071,UA
-2959491072,2959493119,NL
+2959491584,2959491839,NL
2959493120,2959495167,CZ
2959495168,2959499263,PL
2959499264,2959505407,SK
@@ -72205,8 +76073,7 @@
2960384000,2960388095,RO
2960388096,2960392191,PL
2960392192,2960400383,RU
-2960400384,2960402431,RO
-2960402432,2960404479,ES
+2960400384,2960404479,RO
2960404480,2960408575,RU
2960408576,2960416767,UA
2960416768,2960424959,SK
@@ -72519,20 +76386,22 @@
2972098571,2975594495,BR
2975594496,2975596543,PE
2975596544,2984247295,BR
-2984247296,2984607743,MX
-2984607744,2984613068,US
-2984613069,2984613069,MX
-2984613070,2984613648,US
-2984613649,2984613649,MX
-2984613650,2984615935,US
-2984615936,2984935423,MX
+2984247296,2984935423,MX
2984935424,2984936447,AR
2984936448,2984937471,BR
2984937472,2984937503,HN
2984937504,2984937511,US
-2984937512,2984938759,HN
+2984937512,2984937607,HN
+2984937608,2984937615,US
+2984937616,2984938079,HN
+2984938080,2984938095,US
+2984938096,2984938239,HN
+2984938240,2984938255,US
+2984938256,2984938759,HN
2984938760,2984938767,CA
-2984938768,2984939519,HN
+2984938768,2984938847,HN
+2984938848,2984938863,CA
+2984938864,2984939519,HN
2984939520,2984951807,BR
2984951808,2984968191,EC
2984968192,2985033727,BR
@@ -72754,7 +76623,9 @@
2988442848,2988442863,IT
2988442864,2988442999,FR
2988443000,2988443007,GB
-2988443008,2988443263,FR
+2988443008,2988443103,FR
+2988443104,2988443119,GB
+2988443120,2988443263,FR
2988443264,2988443295,ES
2988443296,2988443543,FR
2988443544,2988443547,ES
@@ -72763,13 +76634,18 @@
2988443676,2988443687,FR
2988443688,2988443695,ES
2988443696,2988443703,PT
-2988443704,2988444115,FR
+2988443704,2988443895,FR
+2988443896,2988443903,BE
+2988443904,2988444115,FR
2988444116,2988444119,IT
2988444120,2988444208,FR
2988444209,2988444209,FI
-2988444210,2988444231,FR
+2988444210,2988444223,FR
+2988444224,2988444231,BE
2988444232,2988444239,FI
-2988444240,2988444671,FR
+2988444240,2988444247,CZ
+2988444248,2988444255,PL
+2988444256,2988444671,FR
2988444672,2988444679,ES
2988444680,2988444719,FR
2988444720,2988444735,ES
@@ -72782,7 +76658,9 @@
2988445224,2988445231,ES
2988445232,2988446175,FR
2988446176,2988446207,FI
-2988446208,2988446719,FR
+2988446208,2988446399,FR
+2988446400,2988446431,PL
+2988446432,2988446719,FR
2988446720,2988446723,DE
2988446724,2988446863,FR
2988446864,2988446879,IE
@@ -72798,7 +76676,9 @@
2988449128,2988449135,ES
2988449136,2988449207,FR
2988449208,2988449215,ES
-2988449216,2988449631,FR
+2988449216,2988449327,FR
+2988449328,2988449331,PL
+2988449332,2988449631,FR
2988449632,2988449639,ES
2988449640,2988451839,FR
2988451840,2988453887,BE
@@ -72838,7 +76718,9 @@
2988459716,2988459719,FI
2988459720,2988459863,FR
2988459864,2988459867,ES
-2988459868,2988460143,FR
+2988459868,2988459967,FR
+2988459968,2988459999,ES
+2988460000,2988460143,FR
2988460144,2988460147,GB
2988460148,2988460151,FR
2988460152,2988460159,ES
@@ -72849,7 +76731,9 @@
2988460652,2988460655,ES
2988460656,2988460735,FR
2988460736,2988460751,PT
-2988460752,2988461263,FR
+2988460752,2988460863,FR
+2988460864,2988460895,CZ
+2988460896,2988461263,FR
2988461264,2988461279,ES
2988461280,2988461307,FR
2988461308,2988461311,ES
@@ -72859,23 +76743,20 @@
2988461496,2988461499,ES
2988461500,2988461703,FR
2988461704,2988461707,GB
-2988461708,2988461799,FR
-2988461800,2988461807,ES
-2988461808,2988462331,FR
+2988461708,2988462331,FR
2988462332,2988462335,ES
2988462336,2988462747,FR
2988462748,2988462751,ES
2988462752,2988463111,FR
2988463112,2988463119,ES
-2988463120,2988463123,GB
-2988463124,2988463143,FR
+2988463120,2988463143,FR
2988463144,2988463151,ES
-2988463152,2988463211,FR
-2988463212,2988463223,GB
+2988463152,2988463223,FR
2988463224,2988463227,ES
2988463228,2988463747,FR
2988463748,2988463751,GB
-2988463752,2988463915,FR
+2988463752,2988463759,LT
+2988463760,2988463915,FR
2988463916,2988463919,ES
2988463920,2988463947,FR
2988463948,2988463951,GB
@@ -72889,7 +76770,9 @@
2988464272,2988464275,ES
2988464276,2988464359,FR
2988464360,2988464360,NL
-2988464361,2988464615,FR
+2988464361,2988464519,FR
+2988464520,2988464527,DE
+2988464528,2988464615,FR
2988464616,2988464619,IE
2988464620,2988464623,FR
2988464624,2988464627,ES
@@ -72905,9 +76788,8 @@
2988466060,2988466063,CZ
2988466064,2988466087,FR
2988466088,2988466095,PT
-2988466096,2988466098,FR
-2988466099,2988466099,BE
-2988466100,2988474535,FR
+2988466096,2988466111,BE
+2988466112,2988474535,FR
2988474536,2988474543,GB
2988474544,2988474687,FR
2988474688,2988474703,FI
@@ -72919,7 +76801,9 @@
2988478580,2988478583,DE
2988478584,2988478587,FR
2988478588,2988478591,DE
-2988478592,2988478795,FR
+2988478592,2988478719,FR
+2988478720,2988478751,CZ
+2988478752,2988478795,FR
2988478796,2988478799,ES
2988478800,2988479003,FR
2988479004,2988479007,ES
@@ -72941,13 +76825,18 @@
2988480064,2988480095,ES
2988480096,2988480207,FR
2988480208,2988480223,ES
-2988480224,2988480799,FR
+2988480224,2988480439,FR
+2988480440,2988480443,NL
+2988480444,2988480447,GB
+2988480448,2988480799,FR
2988480800,2988480803,GB
2988480804,2988480927,FR
2988480928,2988480959,ES
2988480960,2988481059,FR
2988481060,2988481063,FI
-2988481064,2988481695,FR
+2988481064,2988481343,FR
+2988481344,2988481407,NL
+2988481408,2988481695,FR
2988481696,2988481711,ES
2988481712,2988481743,FR
2988481744,2988481759,ES
@@ -72973,7 +76862,9 @@
2988482808,2988482863,FR
2988482864,2988482871,ES
2988482872,2988482875,PT
-2988482876,2988483027,FR
+2988482876,2988482879,FR
+2988482880,2988482883,PL
+2988482884,2988483027,FR
2988483028,2988483031,ES
2988483032,2988483111,FR
2988483112,2988483115,ES
@@ -72981,7 +76872,9 @@
2988483120,2988483127,ES
2988483128,2988483159,FR
2988483160,2988483167,ES
-2988483168,2988483279,FR
+2988483168,2988483175,FR
+2988483176,2988483183,PL
+2988483184,2988483279,FR
2988483280,2988483283,ES
2988483284,2988483375,FR
2988483376,2988483379,GB
@@ -72999,7 +76892,8 @@
2988484400,2988484403,PT
2988484404,2988484831,FR
2988484832,2988484847,GB
-2988484848,2988484879,FR
+2988484848,2988484863,FR
+2988484864,2988484879,NL
2988484880,2988484883,GB
2988484884,2988484891,FR
2988484892,2988484895,GB
@@ -73033,7 +76927,9 @@
2988486616,2988486623,ES
2988486624,2988486679,FR
2988486680,2988486687,ES
-2988486688,2988486747,FR
+2988486688,2988486711,FR
+2988486712,2988486719,IE
+2988486720,2988486747,FR
2988486748,2988486751,GB
2988486752,2988486887,FR
2988486888,2988486891,PT
@@ -73046,7 +76942,9 @@
2988487100,2988487103,GB
2988487104,2988487303,FR
2988487304,2988487311,NL
-2988487312,2988487919,FR
+2988487312,2988487839,FR
+2988487840,2988487871,CZ
+2988487872,2988487919,FR
2988487920,2988487923,DE
2988487924,2988487979,FR
2988487980,2988487983,ES
@@ -73065,7 +76963,9 @@
2988489168,2988489175,PT
2988489176,2988489375,FR
2988489376,2988489379,ES
-2988489380,2988489475,FR
+2988489380,2988489451,FR
+2988489452,2988489455,DE
+2988489456,2988489475,FR
2988489476,2988489479,GB
2988489480,2988489483,DE
2988489484,2988489675,FR
@@ -73074,7 +76974,9 @@
2988489936,2988489943,ES
2988489944,2988490179,FR
2988490180,2988490191,ES
-2988490192,2988490367,FR
+2988490192,2988490291,FR
+2988490292,2988490295,DE
+2988490296,2988490367,FR
2988490368,2988490371,ES
2988490372,2988490686,FR
2988490687,2988490687,BE
@@ -73085,13 +76987,21 @@
2988491252,2988491252,ES
2988491253,2988491839,FR
2988491840,2988491919,FI
-2988491920,2988491967,FR
+2988491920,2988491935,DE
+2988491936,2988491951,PL
+2988491952,2988491967,FR
2988491968,2988492031,GB
2988492032,2988492799,FR
2988492800,2988494847,PL
-2988494848,2988495967,FR
+2988494848,2988495199,FR
+2988495200,2988495231,IT
+2988495232,2988495967,FR
2988495968,2988495999,ES
-2988496000,2988498975,FR
+2988496000,2988496767,FR
+2988496768,2988496799,CZ
+2988496800,2988496831,FR
+2988496832,2988496895,NL
+2988496896,2988498975,FR
2988498976,2988498983,ES
2988498984,2988499347,FR
2988499348,2988499351,GB
@@ -73105,7 +77015,9 @@
2988499636,2988499639,GB
2988499640,2988499671,FR
2988499672,2988499675,GB
-2988499676,2988499729,FR
+2988499676,2988499711,FR
+2988499712,2988499715,PL
+2988499716,2988499729,FR
2988499730,2988499730,GB
2988499731,2988499736,FR
2988499737,2988499737,NL
@@ -73118,7 +77030,9 @@
2988500448,2988500479,ES
2988500480,2988500519,FR
2988500520,2988500523,ES
-2988500524,2988500855,FR
+2988500524,2988500815,FR
+2988500816,2988500831,PL
+2988500832,2988500855,FR
2988500856,2988500859,ES
2988500860,2988500939,FR
2988500940,2988500943,ES
@@ -73149,11 +77063,16 @@
2988503376,2988503383,PT
2988503384,2988503471,FR
2988503472,2988503487,ES
-2988503488,2988504023,FR
+2988503488,2988503919,FR
+2988503920,2988503927,CZ
+2988503928,2988504023,FR
2988504024,2988504031,PT
-2988504032,2988504239,FR
+2988504032,2988504159,FR
+2988504160,2988504191,LT
+2988504192,2988504239,FR
2988504240,2988504255,GB
-2988504256,2988504359,FR
+2988504256,2988504287,PL
+2988504288,2988504359,FR
2988504360,2988504363,GB
2988504364,2988504367,FI
2988504368,2988504371,FR
@@ -73209,9 +77128,13 @@
2988508440,2988508443,GB
2988508444,2988508607,FR
2988508608,2988508639,ES
-2988508640,2988508847,FR
-2988508848,2988508855,GB
-2988508856,2988509491,FR
+2988508640,2988508851,FR
+2988508852,2988508855,GB
+2988508856,2988509151,FR
+2988509152,2988509183,IT
+2988509184,2988509191,FR
+2988509192,2988509199,CZ
+2988509200,2988509491,FR
2988509492,2988509495,IE
2988509496,2988509511,FR
2988509512,2988509515,PL
@@ -73223,11 +77146,11 @@
2988510080,2988510087,ES
2988510088,2988510175,FR
2988510176,2988510191,DE
-2988510192,2988510247,FR
-2988510248,2988510251,FI
-2988510252,2988510311,FR
+2988510192,2988510311,FR
2988510312,2988510319,GB
-2988510320,2988511023,FR
+2988510320,2988510639,FR
+2988510640,2988510655,LT
+2988510656,2988511023,FR
2988511024,2988511027,GB
2988511028,2988511747,FR
2988511748,2988511751,GB
@@ -73241,7 +77164,8 @@
2988512308,2988512311,GB
2988512312,2988512399,FR
2988512400,2988512403,ES
-2988512404,2988512639,FR
+2988512404,2988512407,LT
+2988512408,2988512639,FR
2988512640,2988512647,GB
2988512648,2988512655,FR
2988512656,2988512663,PT
@@ -73249,11 +77173,7 @@
2988512904,2988512907,GB
2988512908,2988512943,FR
2988512944,2988512951,ES
-2988512952,2988512959,FR
-2988512960,2988512963,ES
-2988512964,2988512967,FR
-2988512968,2988512971,GB
-2988512972,2988512995,FR
+2988512952,2988512995,FR
2988512996,2988512999,GB
2988513000,2988513003,FR
2988513004,2988513007,ES
@@ -73278,7 +77198,9 @@
2988514232,2988514239,ES
2988514240,2988514287,FR
2988514288,2988514303,ES
-2988514304,2988514739,FR
+2988514304,2988514527,FR
+2988514528,2988514543,GB
+2988514544,2988514739,FR
2988514740,2988514743,GB
2988514744,2988514943,FR
2988514944,2988514959,ES
@@ -73290,7 +77212,11 @@
2988516352,2988517375,DE
2988517376,2988519423,FR
2988519424,2988521471,PL
-2988521472,2988521951,FR
+2988521472,2988521567,FR
+2988521568,2988521599,PL
+2988521600,2988521775,FR
+2988521776,2988521791,LT
+2988521792,2988521951,FR
2988521952,2988521983,ES
2988521984,2988523599,FR
2988523600,2988523603,ES
@@ -73314,9 +77240,10 @@
2988524232,2988524239,ES
2988524240,2988524359,FR
2988524360,2988524363,ES
-2988524364,2988524440,FR
-2988524441,2988524441,CZ
-2988524442,2988524603,FR
+2988524364,2988524383,FR
+2988524384,2988524415,PL
+2988524416,2988524447,CZ
+2988524448,2988524603,FR
2988524604,2988524607,ES
2988524608,2988524623,FR
2988524624,2988524627,GB
@@ -73330,7 +77257,9 @@
2988526176,2988526239,ES
2988526240,2988526415,FR
2988526416,2988526423,ES
-2988526424,2988526867,FR
+2988526424,2988526703,FR
+2988526704,2988526707,GB
+2988526708,2988526867,FR
2988526868,2988526871,PT
2988526872,2988527187,FR
2988527188,2988527191,ES
@@ -73395,7 +77324,8 @@
2988531280,2988532991,FR
2988532992,2988533119,GB
2988533120,2988533183,IE
-2988533184,2988535807,FR
+2988533184,2988533247,BE
+2988533248,2988535807,FR
2988535808,2988537855,ES
2988537856,2988539935,FR
2988539936,2988539967,GB
@@ -73472,7 +77402,8 @@
2988545580,2988545583,ES
2988545584,2988545663,FR
2988545664,2988545695,ES
-2988545696,2988545795,FR
+2988545696,2988545791,FR
+2988545792,2988545795,NL
2988545796,2988545799,ES
2988545800,2988545995,FR
2988545996,2988545999,FI
@@ -73527,12 +77458,16 @@
2988548340,2988550143,ES
2988550144,2988550163,FR
2988550164,2988550167,GB
-2988550168,2988550255,FR
+2988550168,2988550183,FR
+2988550184,2988550191,PL
+2988550192,2988550255,FR
2988550256,2988550259,ES
2988550260,2988550355,FR
2988550356,2988550359,GB
2988550360,2988550363,ES
-2988550364,2988550407,FR
+2988550364,2988550367,FR
+2988550368,2988550399,PL
+2988550400,2988550407,FR
2988550408,2988550411,GB
2988550412,2988550438,FR
2988550439,2988550439,GB
@@ -73544,7 +77479,9 @@
2988550644,2988550647,ES
2988550648,2988550699,FR
2988550700,2988550703,ES
-2988550704,2988551171,FR
+2988550704,2988550975,FR
+2988550976,2988551007,PL
+2988551008,2988551171,FR
2988551172,2988551175,FI
2988551176,2988551179,ES
2988551180,2988551183,GB
@@ -73574,9 +77511,13 @@
2988552992,2988552995,ES
2988552996,2988553007,FR
2988553008,2988553023,IE
-2988553024,2988553199,FR
+2988553024,2988553055,FR
+2988553056,2988553087,PL
+2988553088,2988553199,FR
2988553200,2988553215,BE
-2988553216,2988553279,FR
+2988553216,2988553223,FR
+2988553224,2988553231,PL
+2988553232,2988553279,FR
2988553280,2988553283,ES
2988553284,2988553311,FR
2988553312,2988553315,ES
@@ -73588,9 +77529,12 @@
2988553972,2988553975,ES
2988553976,2988554035,FR
2988554036,2988554039,ES
-2988554040,2988554239,FR
+2988554040,2988554187,FR
+2988554188,2988554191,PL
+2988554192,2988554239,FR
2988554240,2988554495,ES
-2988554496,2988554815,FR
+2988554496,2988554499,NL
+2988554500,2988554815,FR
2988554816,2988554879,GB
2988554880,2988554931,FR
2988554932,2988554935,ES
@@ -73604,7 +77548,9 @@
2988555528,2988555531,DE
2988555532,2988555551,FR
2988555552,2988555559,PT
-2988555560,2988556203,FR
+2988555560,2988556139,FR
+2988556140,2988556143,DE
+2988556144,2988556203,FR
2988556204,2988556207,FI
2988556208,2988556211,DE
2988556212,2988556223,FR
@@ -73624,7 +77570,9 @@
2988557040,2988557095,FR
2988557096,2988557103,ES
2988557104,2988557111,PT
-2988557112,2988557423,FR
+2988557112,2988557395,FR
+2988557396,2988557399,PL
+2988557400,2988557423,FR
2988557424,2988557427,ES
2988557428,2988557507,FR
2988557508,2988557511,ES
@@ -73633,15 +77581,22 @@
2988557540,2988557543,ES
2988557544,2988557631,FR
2988557632,2988557635,GB
-2988557636,2988558203,FR
+2988557636,2988558075,FR
+2988558076,2988558079,NL
+2988558080,2988558203,FR
2988558204,2988558207,DE
-2988558208,2988558731,FR
+2988558208,2988558239,PL
+2988558240,2988558463,FR
+2988558464,2988558527,BE
+2988558528,2988558731,FR
2988558732,2988558735,PT
2988558736,2988558803,FR
2988558804,2988558807,ES
2988558808,2988558887,FR
2988558888,2988558891,GB
-2988558892,2988559199,FR
+2988558892,2988559015,FR
+2988559016,2988559023,DE
+2988559024,2988559199,FR
2988559200,2988559231,PT
2988559232,2988559615,FR
2988559616,2988559619,ES
@@ -73669,9 +77624,12 @@
2988561232,2988561235,PT
2988561236,2988561399,FR
2988561400,2988561403,ES
-2988561404,2988561683,FR
+2988561404,2988561583,FR
+2988561584,2988561591,GB
+2988561592,2988561683,FR
2988561684,2988561687,ES
-2988561688,2988561763,FR
+2988561688,2988561759,FR
+2988561760,2988561763,PL
2988561764,2988561767,IT
2988561768,2988561939,FR
2988561940,2988561943,FI
@@ -73766,8 +77724,7 @@
2991308800,2991325183,BG
2991325184,2991341567,AZ
2991341568,2991357951,MD
-2991357952,2991366298,DE
-2991366300,2991374335,DE
+2991357952,2991374335,DE
2991374336,2991390719,RU
2991390720,2991407103,BA
2991407104,2991423487,DE
@@ -73798,7 +77755,8 @@
2994733056,2994798591,GR
2994798592,2994929663,RU
2994929664,2994995199,IR
-2994995200,2994997247,RU
+2994995200,2994996735,RU
+2994996736,2994997247,NL
2994997248,2994999295,BE
2994999296,2995003391,FR
2995003392,2995007487,BH
@@ -73841,9 +77799,12 @@
2996535296,2996568063,DK
2996568064,2996600831,ES
2996600832,2996633599,RO
-2996633600,2996635647,IR
+2996633600,2996634111,IR
+2996634112,2996634623,IT
+2996634624,2996635647,IR
2996635648,2996637695,TR
-2996637696,2996649983,IR
+2996637696,2996645887,FR
+2996645888,2996649983,IR
2996649984,2996666367,RO
2996666368,2996682751,RU
2996682752,2996699135,DK
@@ -73855,7 +77816,8 @@
2996774400,2996774911,UA
2996774912,2996775423,RU
2996775424,2996775935,UA
-2996775936,2996781055,RU
+2996775936,2996776959,BY
+2996776960,2996781055,RU
2996781056,2996785151,RO
2996785152,2996789247,RU
2996789248,2996789503,UA
@@ -73933,10 +77895,10 @@
2997523200,2997525503,NL
2997525504,2997526527,TR
2997526528,2997543167,RU
-2997543168,2997544959,NL
-2997544960,2997545983,RU
-2997545984,2997546239,KZ
-2997546240,2997583871,RU
+2997543168,2997544191,NL
+2997544192,2997544447,RU
+2997544448,2997544959,NL
+2997544960,2997583871,RU
2997583872,2997616639,SY
2997616640,2997649407,SI
2997649408,2997682175,BY
@@ -73945,7 +77907,9 @@
2997747712,2997780479,CH
2997780480,2997813247,SE
2997813248,2997846015,AL
-2997846016,2997878783,MD
+2997846016,2997848665,MD
+2997848666,2997848666,UM
+2997848667,2997878783,MD
2997878784,2998140927,RU
2998140928,2998403071,PL
2998403072,2998665215,RU
@@ -73986,11 +77950,12 @@
3000021760,3000022015,DE
3000022016,3000022271,BE
3000022272,3000022527,PT
-3000022528,3000025087,GB
+3000022528,3000022783,DE
+3000022784,3000025087,GB
3000025088,3000033279,GI
3000033280,3000041471,RU
-3000041472,3000049663,BA
-3000049664,3000057855,CH
+3000041472,3000049919,BA
+3000049920,3000057855,CH
3000057856,3000066047,UA
3000066048,3000074239,RU
3000074240,3000082431,CZ
@@ -74012,7 +77977,6 @@
3000240128,3000242175,RU
3000242176,3000244223,AT
3000244224,3000246271,PL
-3000246272,3000248319,RO
3000248320,3000252415,PL
3000252416,3000254463,RO
3000254464,3000256511,UA
@@ -74107,7 +78071,6 @@
3000553472,3000555519,KG
3000555520,3000557567,RU
3000557568,3000561663,UA
-3000561664,3000563711,RO
3000563712,3000565759,IR
3000565760,3000567807,RU
3000567808,3000569855,RS
@@ -74184,8 +78147,8 @@
3001843712,3001845759,RU
3001845760,3001846238,GB
3001846239,3001846239,RU
-3001846240,3001846783,GB
-3001846784,3001847807,RU
+3001846240,3001846527,GB
+3001846528,3001847807,RU
3001847808,3001851903,GB
3001851904,3001855999,IT
3001856000,3001857023,NL
@@ -74223,7 +78186,8 @@
3001950208,3001954303,CZ
3001954304,3001958399,IT
3001958400,3001962495,KZ
-3001962496,3001966591,GB
+3001962496,3001966335,GB
+3001966336,3001966591,DE
3001966592,3001970687,NL
3001970688,3001974783,RU
3001974784,3001982975,GB
@@ -74256,8 +78220,9 @@
3002603520,3002605567,SE
3002605568,3002607615,GB
3002607616,3002609663,IR
-3002609664,3002609919,US
-3002609920,3002611711,IT
+3002609664,3002610687,GB
+3002610688,3002611455,US
+3002611456,3002611711,GB
3002611712,3002613759,CZ
3002613760,3002615807,RU
3002615808,3002617855,PL
@@ -74346,7 +78311,7 @@
3002791936,3002793983,AE
3002793984,3002796031,DK
3002796032,3002798079,DE
-3002798080,3002800127,FR
+3002799104,3002800127,FR
3002800128,3002802175,NL
3002802176,3002804223,GB
3002804224,3002806271,TR
@@ -74445,8 +78410,7 @@
3003129600,3003129855,HN
3003129856,3003138047,MX
3003138048,3003146239,HN
-3003146240,3003148287,GT
-3003148288,3003150335,CR
+3003146240,3003150335,GT
3003150336,3003154431,SV
3003154432,3003154687,CL
3003154688,3003154943,EC
@@ -74457,7 +78421,8 @@
3003160064,3003160575,AR
3003160576,3003160831,CL
3003160832,3003161087,PE
-3003161088,3003161599,CL
+3003161088,3003161343,CO
+3003161344,3003161599,CL
3003161600,3003162623,UY
3003162624,3003170815,CR
3003170816,3003171071,GT
@@ -74472,7 +78437,9 @@
3003174400,3003174911,BR
3003174912,3003179007,CR
3003179008,3003187199,AR
-3003187200,3003252735,CO
+3003187200,3003189215,CO
+3003189216,3003189247,AT
+3003189248,3003252735,CO
3003252736,3003449343,CL
3003449344,3003514879,SV
3003514880,3003645951,PE
@@ -74486,21 +78453,37 @@
3005218816,3005349887,CO
3005349888,3005480959,BR
3005480960,3005874175,AR
-3005874176,3005897983,PA
-3005897984,3005898239,CO
-3005898240,3005898495,PA
-3005898496,3005898751,CO
-3005898752,3005901823,PA
-3005901824,3005902079,CO
-3005902080,3005902591,PA
-3005902592,3005902847,CO
-3005902848,3005903615,PA
-3005903616,3005903871,CO
-3005903872,3005905663,PA
-3005905664,3005905919,CO
-3005905920,3005906431,PA
+3005874176,3005890559,PA
+3005890560,3005890815,CO
+3005890816,3005893887,PA
+3005893888,3005894655,CO
+3005894656,3005895423,PA
+3005895424,3005895935,CO
+3005895936,3005896703,PA
+3005896704,3005897215,CO
+3005897216,3005897471,PA
+3005897472,3005899263,CO
+3005899264,3005900031,PA
+3005900032,3005901055,CO
+3005901056,3005901567,PA
+3005901568,3005903103,CO
+3005903104,3005903359,PA
+3005903360,3005905407,CO
+3005905408,3005905663,PA
+3005905664,3005906175,CO
+3005906176,3005906431,PA
3005906432,3005906687,CO
-3005906688,3005914623,PA
+3005906688,3005911039,PA
+3005911040,3005911295,CO
+3005911296,3005911551,PA
+3005911552,3005911807,CO
+3005911808,3005912319,PA
+3005912320,3005912575,CO
+3005912576,3005912831,PA
+3005912832,3005913087,CO
+3005913088,3005913599,PA
+3005913600,3005913855,CO
+3005913856,3005914623,PA
3005914624,3005915135,CO
3005915136,3005918207,AR
3005918208,3005919231,CO
@@ -74515,37 +78498,57 @@
3005988864,3006005247,DO
3006005248,3006267391,VE
3006267392,3006283775,PA
-3006283776,3006284031,CR
-3006284032,3006284543,PA
+3006283776,3006284287,CR
+3006284288,3006284543,PA
3006284544,3006284799,CR
-3006284800,3006286335,PA
+3006284800,3006285055,PA
+3006285056,3006285567,CR
+3006285568,3006286335,PA
3006286336,3006286591,CR
-3006286592,3006288127,PA
-3006288128,3006288383,CR
-3006288384,3006308351,PA
-3006308352,3006308607,CR
-3006308608,3006309887,PA
-3006309888,3006310143,CR
-3006310144,3006313727,PA
-3006313728,3006313983,CR
+3006286592,3006286847,PA
+3006286848,3006287103,CR
+3006287104,3006287871,PA
+3006287872,3006288383,CR
+3006288384,3006288895,PA
+3006288896,3006289151,CR
+3006289152,3006289663,PA
+3006289664,3006291711,CR
+3006291712,3006308351,PA
+3006308352,3006308863,CR
+3006308864,3006309631,PA
+3006309632,3006311167,CR
+3006311168,3006311423,PA
+3006311424,3006311935,CR
+3006311936,3006312447,PA
+3006312448,3006312703,CR
+3006312704,3006312959,PA
+3006312960,3006313983,CR
3006313984,3006314239,PA
-3006314240,3006314751,CR
-3006314752,3006320639,PA
+3006314240,3006315007,CR
+3006315008,3006315263,PA
+3006315264,3006315775,CR
+3006315776,3006316031,PA
+3006316032,3006316543,CR
+3006316544,3006320639,PA
3006320640,3006320895,CR
-3006320896,3006323967,PA
-3006323968,3006324223,CR
-3006324224,3006324479,PA
-3006324480,3006324735,CR
+3006320896,3006321151,PA
+3006321152,3006321407,CR
+3006321408,3006322175,PA
+3006322176,3006322431,CR
+3006322432,3006323199,PA
+3006323200,3006324735,CR
3006324736,3006328831,PA
-3006328832,3006329087,NI
-3006329088,3006329343,PA
-3006329344,3006329599,NI
-3006329600,3006330623,PA
+3006328832,3006329599,NI
+3006329600,3006329855,PA
+3006329856,3006330111,NI
+3006330112,3006330623,PA
3006330624,3006330879,NI
3006330880,3006331903,CR
3006331904,3006332927,AR
3006332928,3006349311,EC
-3006349312,3006351359,PE
+3006349312,3006349847,PE
+3006349848,3006349855,BO
+3006349856,3006351359,PE
3006351360,3006353407,AR
3006353408,3006357503,DO
3006357504,3006361599,AR
@@ -74578,44 +78581,46 @@
3007092736,3007094783,AR
3007094784,3007096831,CR
3007096832,3007098879,AR
-3007098880,3007100927,HN
+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,3007100463,HN
+3007100464,3007100471,IN
+3007100472,3007100927,HN
3007100928,3007102975,AR
3007102976,3007103999,US
3007104000,3007106047,AR
3007106048,3007107071,PE
3007107072,3007108095,AR
3007108096,3007109119,TT
-3007109120,3007115263,AR
+3007109120,3007111167,AR
+3007111168,3007112191,PE
+3007112192,3007115263,AR
3007115264,3007116287,CO
3007116288,3007117311,EC
3007117312,3007122431,AR
-3007122432,3007123455,CL
+3007122432,3007122943,CL
+3007122944,3007123199,PE
+3007123200,3007123455,CO
3007123456,3007143935,AR
3007143936,3007148031,CL
3007148032,3007152127,CO
3007152128,3007152383,DE
3007152384,3007152639,US
-3007152640,3007153151,DE
-3007153152,3007153167,CL
-3007153168,3007153183,DE
-3007153184,3007153279,CL
+3007152640,3007153279,DE
3007153280,3007153407,US
-3007153408,3007153663,DE
-3007153664,3007153679,CL
-3007153680,3007153695,DE
-3007153696,3007153919,CL
+3007153408,3007153919,DE
3007153920,3007154175,US
-3007154176,3007154191,CL
-3007154192,3007154207,DE
-3007154208,3007154303,CL
+3007154176,3007154303,DE
3007154304,3007154687,US
-3007154688,3007154703,CL
-3007154704,3007154719,DE
-3007154720,3007154943,CL
+3007154688,3007154943,DE
3007154944,3007155199,US
-3007155200,3007155215,CL
-3007155216,3007155231,DE
-3007155232,3007155327,CL
+3007155200,3007155327,DE
3007155328,3007155711,US
3007155712,3007155967,DE
3007155968,3007156223,AT
@@ -74740,41 +78745,36 @@
3007172096,3007172351,US
3007172352,3007172383,FR
3007172384,3007172415,BE
-3007172416,3007172479,CL
-3007172480,3007172607,BR
+3007172416,3007172447,CL
+3007172448,3007172607,BR
3007172608,3007172863,US
-3007172864,3007172991,CL
-3007172992,3007173023,IS
+3007172864,3007173023,BR
3007173024,3007173055,NZ
-3007173056,3007173059,CL
-3007173060,3007173071,BR
-3007173072,3007173119,CL
+3007173056,3007173119,BR
3007173120,3007173375,US
3007173376,3007173407,NO
3007173408,3007173439,SE
-3007173440,3007173443,CL
-3007173444,3007173491,BR
-3007173492,3007173631,CL
+3007173440,3007173631,BR
3007173632,3007173663,NO
3007173664,3007173695,NZ
-3007173696,3007174015,BR
+3007173696,3007173887,BR
+3007173888,3007174015,US
3007174016,3007174047,NL
3007174048,3007174079,FR
3007174080,3007174271,BR
3007174272,3007174303,FI
3007174304,3007174335,NL
-3007174336,3007174399,BR
-3007174400,3007174431,IS
+3007174336,3007174431,BR
3007174432,3007174463,IT
3007174464,3007174655,BR
3007174656,3007175679,US
3007175680,3007175935,GB
3007175936,3007175967,NZ
3007175968,3007175999,BE
-3007176000,3007176319,CL
+3007176000,3007176319,BR
3007176320,3007176351,SE
3007176352,3007176383,FR
-3007176384,3007176447,CL
+3007176384,3007176447,BR
3007176448,3007176703,US
3007176704,3007177727,IN
3007177728,3007179007,US
@@ -74809,13 +78809,17 @@
3007184128,3007184383,KW
3007184384,3007184895,BR
3007184896,3007250431,AR
-3007250432,3007284735,CR
-3007284736,3007284991,PA
-3007284992,3007286015,CR
+3007250432,3007283199,CR
+3007283200,3007283455,PA
+3007283456,3007283711,CR
+3007283712,3007283967,PA
+3007283968,3007284735,CR
+3007284736,3007285247,PA
+3007285248,3007286015,CR
3007286016,3007286271,PA
3007286272,3007286783,CR
-3007286784,3007287039,PA
-3007287040,3007299583,CR
+3007286784,3007287295,PA
+3007287296,3007299583,CR
3007299584,3007301631,PA
3007301632,3007305727,AR
3007305728,3007307775,BZ
@@ -74887,8 +78891,8 @@
3025618432,3025618687,TW
3025618688,3025618943,IN
3025618944,3025619535,SG
-3025619536,3025619583,IN
-3025619584,3025619711,SG
+3025619536,3025619551,IN
+3025619552,3025619711,SG
3025619712,3025619967,IN
3025619968,3025620243,TW
3025620244,3025620991,IN
@@ -74929,7 +78933,9 @@
3025625920,3025625927,KR
3025625928,3025625935,IN
3025625936,3025626015,SG
-3025626016,3025626111,IN
+3025626016,3025626047,IN
+3025626048,3025626079,SG
+3025626080,3025626111,IN
3025626112,3025626623,SG
3025626624,3025629439,IN
3025629440,3025629567,HK
@@ -75111,8 +79117,7 @@
3029715456,3029716991,JP
3029716992,3029721087,PK
3029721088,3029722111,IN
-3029722112,3029722623,AU
-3029722624,3029723135,IN
+3029722112,3029723135,AU
3029723136,3029724159,BD
3029724160,3029725183,CN
3029725184,3029727231,IN
@@ -75184,7 +79189,8 @@
3033715712,3033716735,CN
3033716736,3033717759,TH
3033717760,3033718783,BD
-3033718784,3033726975,CN
+3033718784,3033719807,HK
+3033719808,3033726975,CN
3033726976,3033743359,KR
3033743360,3033745407,IN
3033745408,3033747455,JP
@@ -75278,7 +79284,9 @@
3035676928,3035693055,SG
3035693056,3036610559,ID
3036610560,3036676095,SG
-3036676096,3037790207,AR
+3036676096,3037697047,AR
+3037697048,3037697055,US
+3037697056,3037790207,AR
3037790208,3037986815,VE
3037986816,3038773247,AR
3038773248,3038904319,CO
@@ -75305,18 +79313,15 @@
3039415296,3039415551,US
3039415552,3039415807,BR
3039415808,3039416575,US
-3039416576,3039416591,CL
+3039416576,3039416591,BR
3039416592,3039416607,SG
-3039416608,3039416639,CL
-3039416640,3039416703,BR
-3039416704,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
@@ -75324,12 +79329,11 @@
3039418112,3039418623,US
3039418624,3039418879,BR
3039418880,3039419135,US
-3039419136,3039419391,BR
-3039419392,3039419583,CL
+3039419136,3039419583,BR
3039419584,3039419647,SG
3039419648,3039419839,BR
3039419840,3039419903,SG
-3039419904,3039420415,CL
+3039419904,3039420415,BR
3039420416,3039428607,AR
3039428608,3039559679,CL
3039559680,3039821823,AR
@@ -75353,7 +79357,9 @@
3044212736,3044245503,HN
3044245504,3044278271,BO
3044278272,3044417535,AR
-3044417536,3044425727,PA
+3044417536,3044418047,CY
+3044418048,3044421631,PA
+3044421632,3044425727,CY
3044425728,3044446207,AR
3044446208,3044450303,CO
3044450304,3044454399,CL
@@ -75378,28 +79384,68 @@
3048144896,3048210431,EC
3048210432,3048275967,PE
3048275968,3048292351,AR
-3048292352,3048293271,CA
+3048292352,3048292799,CA
+3048292800,3048292807,ES
+3048292808,3048293271,CA
3048293272,3048293279,ES
-3048293280,3048294399,CA
+3048293280,3048293599,CA
+3048293600,3048293615,ES
+3048293616,3048294399,CA
3048294400,3048294627,BZ
3048294628,3048294631,BR
3048294632,3048294759,BZ
3048294760,3048294767,BR
-3048294768,3048296351,BZ
+3048294768,3048295343,BZ
+3048295344,3048295351,CA
+3048295352,3048295631,BZ
+3048295632,3048295647,CA
+3048295648,3048296351,BZ
3048296352,3048296383,CA
3048296384,3048296751,BZ
3048296752,3048296759,CA
-3048296760,3048299599,BZ
+3048296760,3048297407,BZ
+3048297408,3048297423,CA
+3048297424,3048298495,BZ
+3048298496,3048299487,US
+3048299488,3048299503,BR
+3048299504,3048299599,US
3048299600,3048299607,BR
-3048299608,3048299655,BZ
+3048299608,3048299655,US
3048299656,3048299663,BR
-3048299664,3048300543,BZ
-3048300544,3048300863,US
+3048299664,3048300863,US
3048300864,3048300895,CA
3048300896,3048301311,US
3048301312,3048301343,CA
-3048301344,3048304639,US
-3048304640,3048308735,BZ
+3048301344,3048301471,US
+3048301472,3048301503,CA
+3048301504,3048301935,US
+3048301936,3048301951,CA
+3048301952,3048302295,US
+3048302296,3048302303,CA
+3048302304,3048302815,US
+3048302816,3048302823,NL
+3048302824,3048303303,US
+3048303304,3048303311,NL
+3048303312,3048304031,US
+3048304032,3048304047,NL
+3048304048,3048304663,US
+3048304664,3048304671,CR
+3048304672,3048304919,US
+3048304920,3048304927,CR
+3048304928,3048304999,US
+3048305000,3048305007,CR
+3048305008,3048305063,US
+3048305064,3048305071,CR
+3048305072,3048307607,US
+3048307608,3048307615,CA
+3048307616,3048307743,US
+3048307744,3048307751,CA
+3048307752,3048307967,US
+3048307968,3048307983,CA
+3048307984,3048308103,US
+3048308104,3048308111,CA
+3048308112,3048308727,US
+3048308728,3048308735,CR
3048308736,3048325119,BO
3048325120,3048331263,AR
3048331264,3048332287,GY
@@ -75419,9 +79465,18 @@
3049111552,3049119743,AR
3049119744,3049127935,HN
3049127936,3049193471,CL
+3049193472,3049202687,BR
+3049202688,3049203711,AR
+3049203712,3049205759,BR
+3049207808,3049208831,BR
+3049209856,3049210879,AR
+3049211904,3049212927,BR
+3049213952,3049242623,BR
3049259008,3049291775,AR
3049291776,3049324543,CO
-3049324544,3049521151,CR
+3049324544,3049362175,CR
+3049362176,3049362431,NI
+3049362432,3049521151,CR
3049521152,3049586687,EC
3049586688,3049635839,PA
3049635840,3049652223,AR
@@ -75444,7 +79499,9 @@
3050700816,3050701055,BR
3050701056,3050701311,DE
3050701312,3050701327,IE
-3050701328,3050701567,BR
+3050701328,3050701439,BR
+3050701440,3050701503,US
+3050701504,3050701567,BR
3050701568,3050701823,DE
3050701824,3050701839,SG
3050701840,3050702079,BR
@@ -75497,7 +79554,9 @@
3050709520,3050709759,BR
3050709760,3050710015,NL
3050710016,3050710031,ES
-3050710032,3050710271,BR
+3050710032,3050710079,BR
+3050710080,3050710143,US
+3050710144,3050710271,BR
3050710272,3050710527,US
3050710528,3050710543,FR
3050710544,3050710783,BR
@@ -75511,7 +79570,9 @@
3050711680,3050711807,BR
3050711808,3050712063,US
3050712064,3050712079,FR
-3050712080,3050712319,BR
+3050712080,3050712127,BR
+3050712128,3050712191,US
+3050712192,3050712319,BR
3050712320,3050712575,US
3050712576,3050712591,PL
3050712592,3050712831,BR
@@ -75535,7 +79596,9 @@
3050754048,3050755071,DE
3050755072,3050755327,CO
3050755328,3050755583,CL
-3050755584,3050766335,US
+3050755584,3050759935,US
+3050759936,3050760191,GB
+3050760192,3050766335,US
3050766336,3050766351,NO
3050766352,3050766591,BR
3050766592,3050766847,US
@@ -75549,7 +79612,9 @@
3050767888,3050768127,BR
3050768128,3050768383,US
3050768384,3050768399,AT
-3050768400,3050768639,BR
+3050768400,3050768511,BR
+3050768512,3050768575,US
+3050768576,3050768639,BR
3050768640,3050768895,US
3050768896,3050768911,CZ
3050768912,3050769151,BR
@@ -75567,8 +79632,8 @@
3050770960,3050771199,BR
3050771200,3050771455,US
3050771456,3050771471,SG
-3050771472,3050771711,BR
-3050771712,3050771967,US
+3050771472,3050771583,BR
+3050771584,3050771967,US
3050771968,3050771983,EE
3050771984,3050772223,BR
3050772224,3050772479,US
@@ -75610,23 +79675,7 @@
3050778368,3050778623,US
3050778624,3050778639,TR
3050778640,3050778879,BR
-3050778880,3050789375,US
-3050789376,3050789503,BR
-3050789504,3050789631,US
-3050789632,3050789759,BR
-3050789760,3050789887,US
-3050789888,3050789967,BR
-3050789968,3050789968,US
-3050789969,3050790015,BR
-3050790016,3050790143,US
-3050790144,3050790271,BR
-3050790272,3050790399,US
-3050790400,3050790463,BR
-3050790464,3050790464,US
-3050790465,3050790527,BR
-3050790528,3050790655,US
-3050790656,3050790783,BR
-3050790784,3050800383,US
+3050778880,3050800383,US
3050800384,3050800399,AL
3050800400,3050800415,AD
3050800416,3050800431,AI
@@ -75708,8 +79757,7 @@
3050802816,3050803199,US
3050803200,3050803263,NL
3050803264,3050803327,SE
-3050803328,3050803711,US
-3050803712,3050803775,IS
+3050803328,3050803775,US
3050803776,3050803839,FR
3050803840,3050804223,US
3050804224,3050804287,BE
@@ -75732,15 +79780,26 @@
3050829568,3050829823,UA
3050829824,3050831871,US
3050831872,3051356159,BR
-3051356160,3051374335,CR
-3051374336,3051374591,PA
-3051374592,3051380735,CR
+3051356160,3051372799,CR
+3051372800,3051374591,PA
+3051374592,3051374847,CR
+3051374848,3051375103,PA
+3051375104,3051375359,CR
+3051375360,3051375871,PA
+3051375872,3051380735,CR
3051380736,3051388927,AR
-3051388928,3051389183,PA
+3051388928,3051389183,US
3051389184,3051389439,NL
-3051389440,3051389695,PA
-3051389696,3051389951,NL
-3051389952,3051397119,PA
+3051389440,3051389695,US
+3051389696,3051390207,NL
+3051390208,3051390719,US
+3051390720,3051390975,NL
+3051390976,3051394047,US
+3051394048,3051394303,NL
+3051394304,3051395071,US
+3051395072,3051395839,PA
+3051395840,3051396351,US
+3051396352,3051397119,PA
3051397120,3051398143,CO
3051398144,3051399167,AR
3051399168,3051400191,DO
@@ -75848,8 +79907,7 @@
3057041408,3057049599,MY
3057049600,3057050623,AU
3057050624,3057051647,SG
-3057051648,3057051903,AU
-3057052160,3057052415,AU
+3057051648,3057052415,AU
3057052416,3057052671,ES
3057052672,3057052927,IL
3057052928,3057053183,GB
@@ -75889,6 +79947,9 @@
3064017920,3064018943,IN
3064018944,3064019967,NZ
3064019968,3064020991,HK
+3064020992,3064021503,AU
+3064021504,3064021759,HK
+3064022016,3064023039,HK
3064023040,3064024063,SG
3064024064,3064025087,JP
3064025088,3064029183,VN
@@ -76137,9 +80198,7 @@
3092671488,3092672511,NL
3092672512,3092673023,US
3092673024,3092673535,NL
-3092673536,3092688895,US
-3092688896,3092692991,NL
-3092692992,3092697087,US
+3092673536,3092697087,US
3092697088,3092697599,NL
3092697600,3092701183,US
3092701184,3092702207,NL
@@ -76212,6 +80271,7 @@
3098106624,3098106879,NL
3098106880,3098107135,DE
3098107136,3098107391,FR
+3098107392,3098107647,US
3098107648,3098107903,SE
3098107904,3098148863,US
3098148864,3098165247,JM
@@ -76222,10 +80282,14 @@
3098271744,3098412031,US
3098412032,3098413055,CA
3098413056,3098428415,US
-3098428416,3098428927,RU
+3098428416,3098428671,NL
+3098428672,3098428927,CA
3098428928,3098429439,SE
3098429440,3098431487,GB
-3098431488,3098476543,US
+3098431488,3098435071,US
+3098435072,3098435327,NL
+3098435328,3098435583,CA
+3098435584,3098476543,US
3098476544,3098492927,CA
3098492928,3098494719,US
3098494720,3098495743,CA
@@ -76318,6 +80382,9 @@
3103873280,3103873535,FR
3103873536,3103873791,CZ
3103873792,3103874047,PL
+3103874048,3103874303,LT
+3103874304,3103874559,CH
+3103874560,3103874815,NL
3103916032,3103917055,CH
3103917056,3103918079,IT
3103918080,3103919103,DE
@@ -76355,7 +80422,8 @@
3103944704,3103945727,PL
3103945728,3103947775,DE
3103947776,3103948799,RU
-3103948800,3103950847,DE
+3103948800,3103949823,GB
+3103949824,3103950847,DE
3103950848,3103951871,GB
3103951872,3103952895,DE
3103952896,3103953919,IT
@@ -76556,13 +80624,8 @@
3104153600,3104154623,RU
3104154624,3104155647,DK
3104155648,3104156671,DE
-3104156672,3104156743,RO
-3104156744,3104156751,GB
-3104156752,3104156823,RO
-3104156824,3104156831,GB
-3104156832,3104156863,RO
-3104156864,3104156895,GB
-3104156896,3104156959,RO
+3104156672,3104156927,GB
+3104156928,3104156959,RO
3104156960,3104156991,US
3104156992,3104157695,RO
3104157696,3104158719,TR
@@ -76762,9 +80825,7 @@
3104356352,3104357375,AT
3104357376,3104358399,CZ
3104358400,3104359423,IE
-3104359424,3104359551,IT
-3104359552,3104359679,RO
-3104359680,3104360447,IT
+3104359424,3104360447,IT
3104360448,3104361471,RU
3104361472,3104362495,GB
3104362496,3104363519,CH
@@ -76893,9 +80954,7 @@
3104495616,3104496639,JO
3104496640,3104497663,DK
3104497664,3104498687,CH
-3104498688,3104498695,NL
-3104498696,3104498703,US
-3104498704,3104499391,NL
+3104498688,3104499391,NL
3104499392,3104499399,US
3104499400,3104500735,NL
3104500736,3104501759,CZ
@@ -76959,7 +81018,9 @@
3104558080,3104559103,GB
3104559104,3104560127,FI
3104560128,3104561151,TR
-3104561152,3104562175,NL
+3104561152,3104561919,NL
+3104561920,3104562047,FR
+3104562048,3104562175,NL
3104562176,3104563199,ES
3104563200,3104564223,IT
3104564224,3104565247,RU
@@ -76978,7 +81039,6 @@
3104577536,3104578559,IQ
3104578560,3104579583,RU
3104579584,3104580607,FR
-3104580608,3104581631,GB
3104581632,3104582655,ME
3104582656,3104583679,CH
3104583680,3104584703,FR
@@ -77064,7 +81124,8 @@
3104662528,3104663551,FR
3104663552,3104664255,GB
3104664256,3104664263,CH
-3104664264,3104665599,GB
+3104664264,3104664271,PL
+3104664272,3104665599,GB
3104665600,3104668671,RU
3104668672,3104669695,NO
3104669696,3104670719,FR
@@ -77675,7 +81736,6 @@
3105288192,3105289215,GB
3105289216,3105290239,AT
3105290240,3105291263,TR
-3105291264,3105292287,CH
3105292288,3105293311,AT
3105293312,3105294335,GB
3105294336,3105295359,RU
@@ -77687,8 +81747,6 @@
3105300480,3105301503,RU
3105301504,3105302527,ES
3105302528,3105303551,FR
-3105303552,3105304063,IE
-3105304064,3105304575,GB
3105304576,3105305599,GE
3105305600,3105308671,GB
3105308672,3105309695,RU
@@ -77834,9 +81892,9 @@
3105441792,3105442815,IT
3105442816,3105443839,FI
3105443840,3105444863,NL
-3105444864,3105444991,PT
-3105444992,3105445631,US
-3105445632,3105445887,ES
+3105444864,3105445119,GB
+3105445120,3105445631,US
+3105445632,3105445887,GB
3105445888,3105446911,RU
3105446912,3105447935,CH
3105447936,3105448959,DE
@@ -77885,7 +81943,9 @@
3105490944,3105491967,SE
3105491968,3105494015,GB
3105494016,3105495039,BE
-3105495040,3105496063,AE
+3105495040,3105495551,AE
+3105495552,3105495807,LU
+3105495808,3105496063,AE
3105496064,3105497087,RU
3105497088,3105498111,IR
3105498112,3105499135,DE
@@ -77923,8 +81983,9 @@
3105532928,3105533951,RS
3105533952,3105534975,BA
3105534976,3105535231,ZA
-3105535232,3105535487,US
+3105535232,3105535794,US
3105535795,3105535795,RU
+3105535796,3105535999,US
3105536000,3105537023,AZ
3105537024,3105538047,AT
3105538048,3105539071,RU
@@ -78011,7 +82072,9 @@
3105623040,3105624063,GB
3105624064,3105625087,PL
3105625088,3105626111,US
-3105626112,3105629183,GB
+3105626112,3105627135,GB
+3105627136,3105628159,FR
+3105628160,3105629183,GB
3105629184,3105629695,BE
3105629696,3105629951,NL
3105629952,3105630207,BE
@@ -78100,7 +82163,7 @@
3105716224,3105717247,TR
3105717248,3105719295,RU
3105719296,3105721343,GB
-3105721344,3105722367,BA
+3105721344,3105722367,OM
3105722368,3105723391,IT
3105723392,3105724415,FR
3105724416,3105725439,CH
@@ -78173,7 +82236,6 @@
3105788928,3105789951,SA
3105789952,3105790975,SE
3105790976,3105791999,DE
-3105792000,3105793023,DK
3105793024,3105794047,NL
3105795072,3105796095,LU
3105796096,3105797119,NL
@@ -78299,7 +82361,6 @@
3105916928,3105917951,ES
3105917952,3105918975,NL
3105918976,3105919999,PL
-3105920000,3105921023,IQ
3105921024,3105922047,IE
3105922048,3105923071,PL
3105923072,3105924095,CZ
@@ -78317,9 +82378,7 @@
3105933352,3105933359,IT
3105933360,3105933847,GB
3105933848,3105933855,IT
-3105933856,3105933863,GB
-3105933864,3105933871,IT
-3105933872,3105934215,GB
+3105933856,3105934215,GB
3105934216,3105934223,IT
3105934224,3105934335,GB
3105934336,3105935359,SE
@@ -78367,7 +82426,6 @@
3105973248,3105974048,US
3105974049,3105974271,NL
3105974272,3105975295,MD
-3105975296,3105976319,TR
3105976320,3105977343,LB
3105977344,3105978367,NL
3105978368,3105979391,RU
@@ -78384,14 +82442,7 @@
3105988608,3105989631,RU
3105989632,3105990655,NL
3105990656,3105990911,PS
-3105990912,3105991167,US
-3105991168,3105991423,PS
-3105991424,3105991487,US
-3105991488,3105991551,GB
-3105991552,3105991615,DE
-3105991616,3105991678,FR
-3105991679,3105991679,US
-3105991680,3105992703,SA
+3105990912,3105991679,US
3105992704,3105993727,BH
3105993728,3105994751,DE
3105994752,3105995775,GB
@@ -78416,11 +82467,13 @@
3106016256,3106017279,DK
3106017280,3106018303,IQ
3106018304,3106019327,RU
-3106019328,3106020351,LV
+3106019328,3106019839,LV
+3106019840,3106020351,NL
3106020352,3106021375,PL
3106021376,3106022399,FR
3106022400,3106023423,IT
-3106023424,3106023807,DE
+3106023424,3106023679,NL
+3106023680,3106023807,DE
3106023808,3106023935,AE
3106023936,3106024063,US
3106024064,3106024191,DE
@@ -78538,7 +82591,6 @@
3106132992,3106134015,NO
3106134016,3106135039,DE
3106135040,3106136063,RU
-3106136064,3106137087,CH
3106137088,3106138111,GB
3106138112,3106139135,DE
3106139136,3106140159,SE
@@ -78566,13 +82618,14 @@
3106160640,3106161663,IT
3106161664,3106162687,BA
3106162688,3106163711,IT
-3106163712,3106165759,GB
+3106163712,3106164991,GB
+3106164992,3106165247,LT
+3106165248,3106165759,GB
3106165760,3106166783,BA
3106166784,3106167807,BH
3106167808,3106168831,RO
3106168832,3106169855,FI
-3106169856,3106170000,NL
-3106170002,3106170879,NL
+3106169856,3106170879,NL
3106170880,3106171903,RU
3106171904,3106172927,GB
3106172928,3106173951,NL
@@ -78617,7 +82670,6 @@
3106214912,3106215935,NL
3106215936,3106216959,RS
3106216960,3106217983,FR
-3106217984,3106219007,ME
3106219008,3106220031,US
3106220032,3106221055,FR
3106221056,3106222079,IT
@@ -78716,7 +82768,7 @@
3106300416,3106300927,GB
3106300928,3106301951,NL
3106301952,3106302975,GB
-3106303232,3106303999,CZ
+3106302976,3106303999,CZ
3106304000,3106305023,GB
3106305024,3106306047,DE
3106306048,3106307071,NO
@@ -78744,7 +82796,8 @@
3106327040,3106327295,GB
3106327296,3106327551,NL
3106327552,3106328575,RU
-3106328576,3106329599,UA
+3106328576,3106329087,UA
+3106329088,3106329599,US
3106329600,3106330623,IQ
3106330624,3106331647,UA
3106331648,3106333695,PL
@@ -78853,7 +82906,6 @@
3106428928,3106429951,FI
3106429952,3106431999,NL
3106432000,3106433023,FR
-3106433024,3106434047,RU
3106434048,3106435071,NL
3106435072,3106436095,PL
3106436096,3106437119,DE
@@ -78864,7 +82916,8 @@
3106440707,3106440707,CH
3106440708,3106441215,DE
3106441216,3106442239,HU
-3106442240,3106443263,GB
+3106442240,3106442495,GG
+3106442496,3106443263,GB
3106443264,3106445311,ES
3106445312,3106446335,RU
3106446336,3106447359,AZ
@@ -79092,7 +83145,7 @@
3106656256,3106657279,GB
3106657280,3106658303,NL
3106658304,3106659327,GB
-3106659328,3106660351,CZ
+3106659328,3106660351,LT
3106660352,3106661375,UA
3106661376,3106662399,TR
3106662400,3106663423,IE
@@ -79447,8 +83500,11 @@
3107014656,3107015679,GB
3107015680,3107016703,DE
3107016704,3107017087,GB
+3107017088,3107017107,NL
3107017108,3107017108,GB
+3107017109,3107017127,NL
3107017128,3107017128,GB
+3107017129,3107017151,NL
3107017152,3107017215,GB
3107017216,3107017727,NL
3107017728,3107018751,IR
@@ -79491,7 +83547,7 @@
3107058688,3107059711,LU
3107059712,3107060735,IT
3107060736,3107061759,DK
-3107061760,3107062783,BY
+3107061760,3107062783,ES
3107062784,3107063807,MD
3107063808,3107064831,RU
3107064832,3107065855,HR
@@ -79748,7 +83804,9 @@
3107316736,3107317759,KG
3107317760,3107318783,RU
3107318784,3107318799,IE
-3107318800,3107319039,NL
+3107318800,3107318871,NL
+3107318872,3107318879,FR
+3107318880,3107319039,NL
3107319040,3107319295,GB
3107319296,3107319807,NL
3107319808,3107320831,OM
@@ -79761,7 +83819,6 @@
3107326976,3107327999,LT
3107328000,3107329023,AE
3107329024,3107330047,RU
-3107330048,3107331071,GE
3107331072,3107332095,NO
3107332096,3107333119,IT
3107333120,3107334143,FR
@@ -79810,6 +83867,8 @@
3107377152,3107378175,AT
3107378176,3107379199,IT
3107379200,3107380223,NL
+3107380224,3107380735,RU
+3107380736,3107381247,GB
3107381248,3107383295,IE
3107383296,3107384319,DE
3107384320,3107385343,RU
@@ -79860,7 +83919,6 @@
3107427328,3107428351,AL
3107428352,3107429375,DE
3107429376,3107430399,RS
-3107430400,3107431423,GB
3107431424,3107432447,FR
3107432448,3107433471,IT
3107433472,3107434495,RU
@@ -80155,7 +84213,7 @@
3107717120,3107718143,DE
3107718144,3107719167,GB
3107719168,3107720191,FR
-3107720192,3107721215,RU
+3107720192,3107721215,UA
3107721216,3107723263,DE
3107723264,3107724287,FR
3107724288,3107725311,GB
@@ -80191,7 +84249,7 @@
3107755008,3107756031,FR
3107756032,3107757055,RU
3107757056,3107758079,NL
-3107758080,3107759103,DK
+3107758080,3107759103,NO
3107759104,3107760127,FR
3107760128,3107761151,IL
3107761152,3107762175,NO
@@ -80355,9 +84413,7 @@
3107930112,3107931135,CH
3107931136,3107932159,NL
3107932160,3107932415,SE
-3107932416,3107932671,MT
-3107932672,3107932927,PH
-3107932928,3107934207,MT
+3107932416,3107934207,MT
3107934208,3107935231,GB
3107935232,3107936255,PL
3107936256,3107937279,IT
@@ -80426,7 +84482,9 @@
3108001792,3108002815,GB
3108002816,3108003839,RO
3108003840,3108004863,DE
-3108004864,3108005887,US
+3108004864,3108005375,US
+3108005376,3108005631,CA
+3108005632,3108005887,US
3108005888,3108006911,LT
3108006912,3108007935,NL
3108007936,3108008959,DE
@@ -80654,7 +84712,7 @@
3108239360,3108240383,GB
3108240384,3108240639,UA
3108240640,3108240895,RU
-3108240896,3108241407,CZ
+3108240896,3108241407,KG
3108241408,3108242431,GB
3108242432,3108243455,AT
3108243456,3108244479,GE
@@ -80763,7 +84821,9 @@
3108346880,3108347903,NL
3108347904,3108348927,AT
3108348928,3108349951,BE
-3108349952,3108350975,SE
+3108349952,3108350207,SE
+3108350208,3108350463,US
+3108350464,3108350975,SE
3108350976,3108351999,GE
3108352000,3108354047,DE
3108354048,3108355071,TM
@@ -80952,7 +85012,9 @@
3108544512,3108546559,NL
3108546560,3108547583,BE
3108547584,3108548607,GB
-3108548608,3108549631,RO
+3108548608,3108548863,RO
+3108548864,3108549119,SE
+3108549120,3108549631,RO
3108549632,3108550655,NL
3108550656,3108551679,PL
3108551680,3108552703,RU
@@ -81008,7 +85070,6 @@
3108602880,3108603903,EE
3108603904,3108604927,IT
3108604928,3108605951,GB
-3108605952,3108606975,NL
3108606976,3108609023,GB
3108609024,3108610047,LI
3108610048,3108611071,CZ
@@ -81047,13 +85108,13 @@
3108647936,3108648959,FR
3108648960,3108649983,IM
3108649984,3108651007,CZ
-3108651008,3108651263,BG
-3108651264,3108652031,DE
+3108651008,3108652031,DE
3108652032,3108653055,CH
3108653056,3108654079,GI
-3108654080,3108654591,NL
+3108654080,3108654335,DE
+3108654336,3108654591,NL
3108654592,3108654847,GB
-3108654848,3108655103,NL
+3108654848,3108655103,DK
3108655104,3108656127,ES
3108656128,3108657151,PL
3108657152,3108658175,RS
@@ -81083,7 +85144,7 @@
3108696064,3108697087,ES
3108697088,3108698111,DE
3108698112,3108699135,IT
-3108699136,3108700159,CZ
+3108699136,3108700159,LT
3108700160,3108701183,PL
3108701184,3108702207,RU
3108702208,3108703231,AT
@@ -81156,7 +85217,6 @@
3108768000,3108768255,SE
3108768256,3108768511,NL
3108768512,3108768767,CZ
-3108768768,3108769791,UA
3108769792,3108770815,NL
3108770816,3108772863,FR
3108772864,3108773887,RO
@@ -81386,7 +85446,6 @@
3108985856,3108986879,HU
3108986880,3108987903,IR
3108987904,3108988927,RU
-3108988928,3108989951,CH
3108989952,3108991999,GB
3108992000,3108993023,RU
3108993024,3108994047,BG
@@ -81419,7 +85478,9 @@
3109022720,3109023743,RU
3109023744,3109024767,PL
3109024768,3109025791,LT
-3109025792,3109026815,IT
+3109025792,3109026493,IT
+3109026494,3109026526,SA
+3109026527,3109026815,IT
3109026816,3109027839,CH
3109027840,3109028863,BG
3109028864,3109029887,ES
@@ -81441,7 +85502,8 @@
3109045248,3109046271,RS
3109046272,3109047295,TR
3109047296,3109048319,PT
-3109048320,3109050367,GB
+3109048320,3109049343,KZ
+3109049344,3109050367,GB
3109050368,3109051391,CH
3109051392,3109052415,DE
3109052416,3109053439,ME
@@ -81450,7 +85512,9 @@
3109055488,3109056511,IL
3109056512,3109058559,GB
3109058560,3109059583,DE
-3109059584,3109060607,LU
+3109059584,3109060095,LU
+3109060096,3109060351,CY
+3109060352,3109060607,RO
3109060608,3109061631,LT
3109061632,3109062655,GB
3109062656,3109063679,TR
@@ -81521,8 +85585,7 @@
3109128216,3109128223,AT
3109128224,3109128231,DK
3109128232,3109128239,SE
-3109128240,3109128247,IS
-3109128248,3109128319,NL
+3109128240,3109128319,NL
3109128320,3109128383,GB
3109128384,3109128463,NL
3109128464,3109128471,DK
@@ -81598,14 +85661,14 @@
3109180416,3109181439,DE
3109181440,3109182463,NL
3109182464,3109183487,LT
-3109183488,3109184511,LB
+3109183488,3109184255,LB
+3109184256,3109184511,GB
3109184512,3109185535,CH
3109185536,3109187583,RS
3109187584,3109188607,IT
3109188608,3109189631,SA
3109189632,3109190655,AT
-3109190656,3109190911,SE
-3109190912,3109191679,NL
+3109190656,3109191679,SE
3109191680,3109192703,CH
3109192704,3109193727,IT
3109193728,3109194751,IR
@@ -81621,7 +85684,6 @@
3109203968,3109204991,RU
3109204992,3109206015,IR
3109206016,3109209087,NL
-3109209088,3109210111,GB
3109210112,3109211135,NL
3109211136,3109212159,CH
3109212160,3109213183,NL
@@ -81948,7 +86010,7 @@
3109548032,3109549055,IT
3109549056,3109550079,FI
3109550080,3109551103,NL
-3109551104,3109552127,TR
+3109551104,3109552127,CY
3109552128,3109553151,ES
3109553152,3109554175,TR
3109554176,3109555199,RU
@@ -82035,6 +86097,7 @@
3109640192,3109641215,IQ
3109641216,3109642239,NO
3109643264,3109643391,DE
+3109643392,3109643519,UA
3109643520,3109643775,RU
3109643776,3109644031,UA
3109644032,3109644287,ES
@@ -82066,10 +86129,11 @@
3109671936,3109672959,HR
3109672960,3109673215,US
3109673216,3109673439,SE
+3109673440,3109673450,GB
3109673451,3109673451,NO
+3109673452,3109673455,GB
3109673456,3109673471,SE
-3109673472,3109673695,GB
-3109673700,3109673703,GB
+3109673472,3109673703,GB
3109673704,3109673704,IN
3109673705,3109673727,GB
3109673728,3109673983,AU
@@ -82144,8 +86208,7 @@
3109741568,3109743615,DE
3109743616,3109744639,HU
3109744640,3109745663,TR
-3109745664,3109746431,DE
-3109746432,3109746687,US
+3109745664,3109746687,US
3109747712,3109748735,ES
3109748736,3109749759,MT
3109749760,3109750783,DE
@@ -82195,7 +86258,7 @@
3109804032,3109805055,GB
3109805056,3109807103,FR
3109807104,3109808127,ES
-3109808128,3109809151,FR
+3109808128,3109809151,RE
3109809152,3109810175,GB
3109810176,3109811199,IT
3109811200,3109812223,DE
@@ -82313,7 +86376,7 @@
3109919744,3109920767,IS
3109920768,3109921791,SE
3109921792,3109922815,IR
-3109922816,3109924863,GB
+3109922816,3109923839,GB
3109924864,3109925887,IT
3109925888,3109925967,GB
3109925968,3109925983,DE
@@ -82514,7 +86577,6 @@
3110086656,3110087679,NO
3110087680,3110088703,NL
3110088704,3110089727,GB
-3110089728,3110090751,TR
3110090752,3110091775,DE
3110091776,3110093823,GB
3110093824,3110094847,JO
@@ -82693,32 +86755,82 @@
3110278144,3110279167,TR
3110279168,3110279199,PL
3110279200,3110279231,DE
-3110279232,3110279423,GB
+3110279232,3110279295,GB
+3110279296,3110279303,FR
+3110279304,3110279311,IT
+3110279312,3110279319,SE
+3110279320,3110279327,BE
+3110279328,3110279335,IE
+3110279336,3110279343,CZ
+3110279344,3110279347,NO
+3110279348,3110279351,LI
+3110279352,3110279355,AT
+3110279356,3110279359,DK
+3110279360,3110279363,FI
+3110279364,3110279367,PT
+3110279368,3110279371,GR
+3110279372,3110279375,RO
+3110279376,3110279379,HU
+3110279380,3110279383,LU
+3110279384,3110279387,BG
+3110279388,3110279391,HR
+3110279392,3110279395,SI
+3110279396,3110279399,LT
+3110279400,3110279403,LV
+3110279404,3110279407,EE
+3110279408,3110279411,CY
+3110279412,3110279415,MT
+3110279416,3110279419,SK
+3110279420,3110279423,IS
3110279424,3110279455,ES
3110279456,3110279487,NL
3110279488,3110279679,GB
3110279680,3110279711,ES
3110279712,3110279743,NL
-3110279744,3110279935,GB
+3110279744,3110279807,GB
+3110279808,3110279815,FR
+3110279816,3110279823,IT
+3110279824,3110279831,SE
+3110279832,3110279839,BE
+3110279840,3110279847,IE
+3110279848,3110279855,CZ
+3110279856,3110279859,NO
+3110279860,3110279863,LI
+3110279864,3110279867,AT
+3110279868,3110279871,DK
+3110279872,3110279875,FI
+3110279876,3110279879,PT
+3110279880,3110279883,GR
+3110279884,3110279887,RO
+3110279888,3110279891,HU
+3110279892,3110279895,LU
+3110279896,3110279899,BG
+3110279900,3110279903,HR
+3110279904,3110279907,SI
+3110279908,3110279911,LT
+3110279912,3110279915,LV
+3110279916,3110279919,EE
+3110279920,3110279923,CY
+3110279924,3110279927,MT
+3110279928,3110279931,SK
+3110279932,3110279935,IS
3110279936,3110279967,PL
3110279968,3110279999,DE
3110280000,3110280191,GB
3110280192,3110281215,RU
3110281216,3110282239,LB
3110282240,3110283263,SE
-3110283264,3110284287,FR
3110284288,3110285311,PS
3110285312,3110286335,BE
3110286336,3110288383,DE
-3110288384,3110288639,AF
-3110288640,3110289407,ES
+3110288384,3110289407,ES
3110289408,3110291455,CZ
3110291456,3110292479,AT
3110292480,3110293503,GB
3110293504,3110294527,AT
3110294528,3110295551,GB
3110295552,3110296575,RO
-3110297600,3110298623,CY
+3110297600,3110298623,NL
3110298624,3110299647,RO
3110299648,3110300671,PL
3110300672,3110301695,IE
@@ -82735,7 +86847,7 @@
3110307684,3110307684,BR
3110307685,3110307839,BY
3110307840,3110308863,IE
-3110308864,3110309887,RS
+3110308864,3110309887,RU
3110309888,3110310911,DE
3110310912,3110311935,FR
3110311936,3110315007,RU
@@ -82884,7 +86996,8 @@
3110455296,3110457343,RU
3110457344,3110458367,FR
3110458368,3110459391,IT
-3110459392,3110459903,IL
+3110459392,3110459647,IL
+3110459648,3110459903,FR
3110459904,3110460159,US
3110460160,3110460415,IT
3110460416,3110461439,CZ
@@ -82947,7 +87060,6 @@
3110524928,3110525439,US
3110525440,3110525695,NL
3110525696,3110525951,DE
-3110525952,3110526975,GB
3110526976,3110527999,DE
3110528000,3110529023,AT
3110529024,3110530047,FI
@@ -83022,7 +87134,8 @@
3110594304,3110594559,SE
3110594560,3110595583,DE
3110595584,3110596607,NL
-3110596608,3110597631,SE
+3110596608,3110597119,SE
+3110597120,3110597631,NL
3110597632,3110599679,IR
3110599680,3110600191,RU
3110600192,3110600703,UA
@@ -83055,7 +87168,9 @@
3110630400,3110631423,IT
3110631424,3110632447,GB
3110632448,3110633471,IT
-3110633472,3110636543,NL
+3110633472,3110634495,NL
+3110634496,3110635007,ES
+3110635008,3110636543,NL
3110636544,3110637567,DE
3110637568,3110638591,GR
3110638592,3110639615,RU
@@ -83114,7 +87229,7 @@
3110693888,3110694911,UA
3110694912,3110695935,DE
3110695936,3110696959,UA
-3110696960,3110697983,IR
+3110696960,3110697983,AU
3110697984,3110699007,GB
3110699008,3110700031,IT
3110700032,3110701055,CH
@@ -83152,7 +87267,6 @@
3110730752,3110731775,DE
3110731776,3110733823,RO
3110733824,3110734847,DE
-3110734848,3110735871,IQ
3110735872,3110736895,GR
3110736896,3110737919,TR
3110737920,3110738943,LU
@@ -83189,7 +87303,6 @@
3110769664,3110770687,DE
3110770688,3110771711,NL
3110771712,3110772735,KZ
-3110772736,3110773759,AT
3110773760,3110774783,DE
3110774784,3110775807,PL
3110775808,3110776831,RU
@@ -83325,7 +87438,9 @@
3110930432,3110931455,GB
3110931456,3110932479,DK
3110932480,3110933503,RO
-3110933504,3110934527,RU
+3110933504,3110933759,RU
+3110933760,3110934015,US
+3110934016,3110934527,RU
3110934528,3110935551,IT
3110935552,3110936575,TR
3110936576,3110937599,DE
@@ -83447,7 +87562,7 @@
3111066624,3111067647,NL
3111067648,3111068671,DE
3111068672,3111069695,IS
-3111069696,3111070719,IR
+3111069696,3111070719,AU
3111070720,3111071743,FR
3111071744,3111072767,RU
3111072768,3111074815,FR
@@ -83513,8 +87628,7 @@
3111133184,3111135231,IR
3111135232,3111136255,PL
3111136256,3111137279,NL
-3111137280,3111138303,LI
-3111138304,3111139327,CH
+3111137280,3111139327,CH
3111139328,3111140351,RU
3111140352,3111141375,IT
3111141376,3111142399,NL
@@ -83524,9 +87638,12 @@
3111145472,3111145983,RU
3111145984,3111146239,FI
3111146240,3111146495,RU
-3111146496,3111149567,IT
+3111146496,3111146635,IT
+3111146636,3111146639,FR
+3111146640,3111149567,IT
3111149568,3111150591,GB
-3111150592,3111151615,RU
+3111150592,3111151359,RU
+3111151360,3111151615,US
3111151616,3111152639,OM
3111152640,3111153663,NL
3111153664,3111154687,SE
@@ -83853,7 +87970,6 @@
3111478272,3111479295,RU
3111479296,3111480319,SE
3111480320,3111481343,NL
-3111481344,3111482367,GB
3111482368,3111482879,RU
3111482880,3111483391,FI
3111483392,3111484415,TR
@@ -83967,7 +88083,8 @@
3111603200,3111604223,UA
3111604224,3111605247,TR
3111605248,3111606271,CH
-3111606272,3111607295,RS
+3111606272,3111607039,RS
+3111607040,3111607295,BG
3111607296,3111608319,DE
3111608320,3111609343,CZ
3111609344,3111610367,SE
@@ -84111,7 +88228,7 @@
3111756800,3111757823,NL
3111757824,3111758335,NZ
3111758336,3111758591,NL
-3111758592,3111758847,GB
+3111758592,3111758847,FR
3111758848,3111759871,DK
3111759872,3111760127,IS
3111760128,3111760383,AQ
@@ -84193,7 +88310,6 @@
3111839744,3111840767,GB
3111840768,3111841791,CH
3111841792,3111842815,DE
-3111842816,3111843839,CH
3111843840,3111844863,BE
3111844864,3111845887,IQ
3111845888,3111846911,TR
@@ -84211,7 +88327,7 @@
3111859200,3111860223,EE
3111860224,3111861247,ES
3111861248,3111862271,NL
-3111862272,3111864319,IR
+3111863296,3111864319,IR
3111864320,3111865343,FR
3111865344,3111866367,RU
3111866368,3111867391,GB
@@ -84258,7 +88374,6 @@
3111916544,3111919615,ES
3111919616,3111920639,RO
3111920640,3111921663,ES
-3111921664,3111922687,RU
3111922688,3111923711,IT
3111923712,3111924735,DE
3111924736,3111925759,NO
@@ -84313,12 +88428,12 @@
3111981056,3111982079,RU
3111982080,3111983103,IR
3111983104,3111984127,UA
-3111984128,3111985151,FI
3111985152,3111986175,TR
3111986176,3111987199,RU
3111987200,3111988223,NL
3111988224,3111989247,KZ
-3111989248,3111990271,RU
+3111989248,3111990015,RU
+3111990016,3111990271,US
3111990272,3111991295,FR
3111991296,3111992319,RU
3111992320,3111993343,RS
@@ -84340,7 +88455,6 @@
3112008704,3112009727,PL
3112009728,3112010751,CZ
3112010752,3112011775,PL
-3112011776,3112012799,RU
3112012800,3112013823,GB
3112013824,3112014847,IT
3112014848,3112017919,LB
@@ -84397,9 +88511,63 @@
3112034587,3112034587,PY
3112034588,3112034588,UY
3112034589,3112034589,MX
-3112034590,3112034835,US
-3112034836,3112034836,CA
-3112034837,3112035091,US
+3112034590,3112034817,US
+3112034818,3112034818,GB
+3112034819,3112034819,PL
+3112034820,3112034820,FR
+3112034821,3112034821,NL
+3112034822,3112034822,AT
+3112034823,3112034823,IT
+3112034824,3112034824,CH
+3112034825,3112034825,CZ
+3112034826,3112034826,DK
+3112034827,3112034827,ES
+3112034828,3112034828,PT
+3112034829,3112034829,HU
+3112034830,3112034830,SK
+3112034831,3112034831,BE
+3112034832,3112034832,IE
+3112034833,3112034833,NO
+3112034834,3112034834,SE
+3112034835,3112034835,FI
+3112034836,3112034837,DE
+3112034838,3112034838,TR
+3112034839,3112034839,GR
+3112034840,3112034845,US
+3112034846,3112034846,RO
+3112034847,3112034847,RS
+3112034848,3112034848,IL
+3112034849,3112034849,AE
+3112034850,3112034850,SA
+3112034851,3112034857,US
+3112034858,3112034858,GB
+3112034859,3112034859,PL
+3112034860,3112034860,FR
+3112034861,3112034861,NL
+3112034862,3112034862,AT
+3112034863,3112034863,IT
+3112034864,3112034864,CH
+3112034865,3112034865,CZ
+3112034866,3112034866,DK
+3112034867,3112034867,ES
+3112034868,3112034868,PT
+3112034869,3112034869,HU
+3112034870,3112034870,SK
+3112034871,3112034871,BE
+3112034872,3112034872,IE
+3112034873,3112034873,NO
+3112034874,3112034874,SE
+3112034875,3112034875,FI
+3112034876,3112034877,DE
+3112034878,3112034878,TR
+3112034879,3112034879,GR
+3112034880,3112034885,US
+3112034886,3112034886,RO
+3112034887,3112034887,RS
+3112034888,3112034888,IL
+3112034889,3112034889,AE
+3112034890,3112034890,SA
+3112034891,3112035091,US
3112035092,3112035092,CA
3112035093,3112035327,US
3112035328,3112036351,RU
@@ -84409,7 +88577,6 @@
3112047616,3112048639,AT
3112048640,3112049663,GB
3112049664,3112050687,DE
-3112050688,3112051711,AE
3112051712,3112052735,NO
3112052736,3112053759,IR
3112053760,3112054783,LB
@@ -84417,7 +88584,8 @@
3112055808,3112056831,DK
3112056832,3112057855,NL
3112057856,3112058879,IS
-3112058880,3112059903,NL
+3112058880,3112059391,NL
+3112059392,3112059903,FR
3112059904,3112062975,RO
3112062976,3112063999,ES
3112064000,3112065023,RU
@@ -84531,7 +88699,6 @@
3112176640,3112177663,ES
3112177664,3112178687,FI
3112178688,3112179711,PL
-3112179712,3112180735,AE
3112180736,3112181759,IT
3112181760,3112182783,NL
3112182784,3112183807,IQ
@@ -84723,7 +88890,7 @@
3112386816,3112387071,DE
3112387072,3112387327,NL
3112387328,3112387583,RU
-3112387584,3112388607,EE
+3112387584,3112388607,HK
3112388608,3112389631,DE
3112389632,3112390655,SA
3112390656,3112391679,FR
@@ -84806,7 +88973,6 @@
3112492032,3112494079,DE
3112494080,3112495103,IT
3112495104,3112496127,RS
-3112496128,3112497151,NL
3112497152,3112498175,RU
3112498176,3112499199,GB
3112499200,3112500223,PS
@@ -84858,7 +89024,8 @@
3112547328,3112548351,SA
3112548352,3112549375,SI
3112549376,3112550399,CZ
-3112550400,3112551167,GB
+3112550400,3112550911,GB
+3112550912,3112551167,RO
3112551168,3112551423,US
3112551424,3112552447,CZ
3112552448,3112553471,ES
@@ -84972,8 +89139,6 @@
3112664064,3112665087,FR
3112665088,3112666111,GB
3112666112,3112667135,CZ
-3112667136,3112668159,CH
-3112668160,3112669183,BE
3112669184,3112670207,CZ
3112670208,3112671231,RU
3112671232,3112672255,US
@@ -84983,10 +89148,7 @@
3112676352,3112677375,RU
3112677376,3112678399,FR
3112678400,3112679423,RU
-3112679424,3112679679,NO
-3112679680,3112679935,FI
-3112679936,3112680191,SE
-3112680192,3112680447,DK
+3112679424,3112680447,NO
3112680448,3112681471,IQ
3112681472,3112682495,PL
3112682496,3112683519,CZ
@@ -85029,7 +89191,9 @@
3112720384,3112721407,ES
3112721408,3112722431,PL
3112722432,3112722687,US
+3112722688,3112722943,BG
3112722944,3112723199,US
+3112723200,3112723455,BG
3112723456,3112724479,IR
3112724480,3112725503,GB
3112725504,3112726527,CZ
@@ -85383,7 +89547,6 @@
3113079808,3113080831,IR
3113080832,3113081855,TR
3113081856,3113082879,ES
-3113082880,3113083903,GB
3113083904,3113084927,IT
3113084928,3113086975,RU
3113086976,3113087999,ES
@@ -85447,7 +89610,9 @@
3113148416,3113149439,BE
3113149440,3113150463,DE
3113150464,3113151487,IR
-3113151488,3113152511,NL
+3113151488,3113151743,NL
+3113151744,3113151999,SE
+3113152000,3113152511,NL
3113152512,3113153535,SG
3113153536,3113154559,IT
3113154560,3113156607,NL
@@ -85480,7 +89645,6 @@
3113186304,3113187327,PL
3113187328,3113188351,RS
3113188352,3113189375,BH
-3113189376,3113190399,KZ
3113190400,3113191423,NL
3113191424,3113193471,ES
3113193472,3113194495,UA
@@ -85501,7 +89665,7 @@
3113209856,3113210879,NO
3113210880,3113211903,GB
3113211904,3113212927,NO
-3113212928,3113214975,GB
+3113213952,3113214975,GB
3113214976,3113215087,DE
3113215088,3113215091,GB
3113215092,3113215359,DE
@@ -85550,10 +89714,8 @@
3113246976,3113247231,CZ
3113247232,3113247487,FR
3113247488,3113247743,RU
-3113247744,3113247999,US
-3113248000,3113248031,DE
-3113248032,3113248063,US
-3113248064,3113248255,DE
+3113247744,3113248031,US
+3113248032,3113248255,DE
3113248256,3113248767,GB
3113248768,3113249791,NL
3113249792,3113250815,GB
@@ -85685,7 +89847,7 @@
3113365504,3113366527,DE
3113366528,3113367551,PL
3113367552,3113368575,ES
-3113368576,3113370623,DE
+3113368576,3113369599,DE
3113370624,3113371647,NL
3113371648,3113372671,RU
3113372672,3113373695,FR
@@ -85740,7 +89902,8 @@
3113425152,3113425407,SK
3113425408,3113425919,CZ
3113425920,3113426943,KW
-3113426944,3113427455,IM
+3113426944,3113427199,FR
+3113427200,3113427455,SG
3113427456,3113427711,NL
3113427712,3113427967,US
3113427968,3113428991,RU
@@ -85881,7 +90044,6 @@
3113570304,3113571327,ES
3113571328,3113573375,NL
3113573376,3113574399,CH
-3113574400,3113575423,PL
3113575424,3113576447,TR
3113576448,3113577471,BG
3113577472,3113578495,GB
@@ -86052,7 +90214,9 @@
3113691136,3113692159,KZ
3113692160,3113693183,GB
3113693184,3113694207,DE
-3113694208,3113695231,FR
+3113694208,3113695227,FR
+3113695228,3113695228,GB
+3113695229,3113695231,FR
3113695232,3113695347,DE
3113695348,3113695351,GB
3113695352,3113695359,DE
@@ -86201,7 +90365,6 @@
3113832448,3113833471,CZ
3113833472,3113834495,LB
3113834496,3113835519,DE
-3113835520,3113836543,NL
3113836544,3113837567,FR
3113837568,3113838591,GB
3113838592,3113839615,CH
@@ -86224,7 +90387,8 @@
3113856000,3113857023,GB
3113857024,3113857279,BR
3113857280,3113857535,MX
-3113857536,3113858047,DE
+3113857536,3113857791,US
+3113857792,3113858047,CA
3113858048,3113859071,UA
3113859072,3113860095,IR
3113860096,3113861119,NL
@@ -86326,7 +90490,6 @@
3113961472,3113962495,IR
3113962496,3113963519,NL
3113963520,3113964543,DK
-3113964544,3113965567,US
3113965568,3113966591,UA
3113966592,3113967615,FR
3113967616,3113968639,EE
@@ -86350,7 +90513,10 @@
3113986048,3113987071,NL
3113987072,3113988095,FR
3113988096,3113989119,IT
-3113989120,3113990143,GB
+3113989120,3113989375,GB
+3113989376,3113989631,FR
+3113989632,3113989887,DE
+3113989888,3113990143,GB
3113990144,3113991167,CH
3113991168,3113993215,DE
3113993216,3113994239,IT
@@ -86461,14 +90627,14 @@
3114100736,3114101759,RS
3114101760,3114102783,EE
3114102784,3114104831,DK
-3114104832,3114105855,GR
+3114104832,3114105599,GR
+3114105600,3114105855,RO
3114105856,3114106879,RU
3114106880,3114107903,ES
3114107904,3114108927,LI
3114108928,3114109951,KG
3114109952,3114110975,BE
3114110976,3114111999,NL
-3114112000,3114113023,GB
3114113024,3114114047,ES
3114114048,3114115071,DE
3114115072,3114116095,SE
@@ -86543,7 +90709,7 @@
3114173680,3114173695,GB
3114173696,3114174463,DE
3114174464,3114175231,NL
-3114175232,3114175487,US
+3114175232,3114175487,DE
3114175488,3114176511,IT
3114176512,3114177535,NL
3114177536,3114177775,DE
@@ -86662,7 +90828,12 @@
3114285056,3114286079,NL
3114286080,3114288127,UA
3114288128,3114289151,IS
-3114289152,3114292223,BG
+3114289152,3114290175,NL
+3114290176,3114291199,BG
+3114291200,3114291455,ES
+3114291456,3114291711,NL
+3114291712,3114291967,ES
+3114291968,3114292223,IE
3114292224,3114293247,DE
3114293248,3114294271,UA
3114294272,3114295295,RO
@@ -86717,7 +90888,6 @@
3114340352,3114341375,GB
3114341376,3114342399,CH
3114342400,3114343423,GB
-3114343424,3114344447,SK
3114344448,3114345471,RU
3114345472,3114346495,IR
3114346496,3114347519,ES
@@ -86762,7 +90932,6 @@
3114383360,3114384383,ES
3114384384,3114385407,GB
3114385408,3114386431,IT
-3114386432,3114387455,NL
3114387456,3114387711,JP
3114387712,3114387967,AU
3114387968,3114388479,US
@@ -86848,9 +91017,7 @@
3114458112,3114459135,RO
3114459136,3114460159,GB
3114460160,3114461183,DK
-3114461184,3114461439,NL
-3114461440,3114461951,RU
-3114461952,3114462207,NL
+3114461184,3114462207,RU
3114462208,3114463231,GR
3114463232,3114464255,US
3114464256,3114465279,BE
@@ -86871,7 +91038,7 @@
3114481664,3114482687,FI
3114482688,3114484735,FR
3114484736,3114485759,GB
-3114485760,3114486783,NL
+3114485760,3114486783,US
3114486784,3114487807,DE
3114487808,3114488831,CH
3114488832,3114489855,SE
@@ -87098,8 +91265,7 @@
3114708992,3114710015,DE
3114710016,3114711039,NO
3114711040,3114712063,FI
-3114712064,3114712319,BG
-3114712320,3114713087,DE
+3114712064,3114713087,DE
3114713088,3114714111,CH
3114714112,3114715135,RU
3114715136,3114716159,DE
@@ -87159,7 +91325,9 @@
3114774528,3114775551,SE
3114775552,3114776575,GB
3114776576,3114777599,CZ
-3114777600,3114778623,DE
+3114777600,3114777855,DE
+3114777856,3114778111,US
+3114778112,3114778623,DE
3114778624,3114779647,IT
3114779648,3114780671,IE
3114780672,3114781695,LT
@@ -87283,7 +91451,8 @@
3114907648,3114908671,IT
3114908672,3114909695,IS
3114909696,3114910719,DE
-3114910720,3114911743,GB
+3114910720,3114911231,NL
+3114911232,3114911743,GB
3114911744,3114912767,US
3114912768,3114913791,DE
3114913792,3114914815,FR
@@ -87291,7 +91460,10 @@
3114915840,3114916863,RU
3114916864,3114917887,LB
3114917888,3114918911,IT
-3114918912,3114919935,CH
+3114918912,3114919167,HN
+3114919168,3114919423,CH
+3114919424,3114919679,CW
+3114919680,3114919935,CH
3114919936,3114920703,GB
3114920704,3114920959,NL
3114920960,3114921983,IT
@@ -87299,7 +91471,8 @@
3114923008,3114924031,GB
3114924032,3114925055,HU
3114925056,3114925311,US
-3114925312,3114926079,DE
+3114925312,3114925823,DE
+3114925824,3114926079,GB
3114926080,3114927103,RU
3114927104,3114928127,NL
3114928128,3114929151,GB
@@ -87310,7 +91483,8 @@
3114933248,3114934271,DK
3114934272,3114935295,PL
3114935296,3114936319,CA
-3114936320,3114937343,PA
+3114936320,3114937087,PA
+3114937088,3114937343,NL
3114937344,3114938367,IR
3114938368,3114939391,CH
3114939392,3114940415,RU
@@ -87335,7 +91509,9 @@
3114958848,3114959871,NL
3114959872,3114960895,CH
3114960896,3114961919,IT
-3114961920,3114962943,GR
+3114961920,3114962431,GR
+3114962432,3114962687,DE
+3114962688,3114962943,GR
3114962944,3114963967,GB
3114963968,3114964991,FR
3114964992,3114966015,GB
@@ -87349,15 +91525,16 @@
3114973184,3114974207,MD
3114974208,3114975231,GB
3114975232,3114976255,RU
-3114976256,3114977279,DE
+3114976256,3114977279,US
3114977280,3114978303,PL
3114978304,3114979327,RU
3114979328,3114980351,NL
3114980352,3114981375,DE
3114981376,3114982399,PL
3114982400,3114983423,JP
-3114983424,3114983679,RO
-3114983680,3114984447,PL
+3114983424,3114983679,PL
+3114983680,3114983935,RO
+3114983936,3114984447,PL
3114984448,3114985471,CZ
3114985472,3114986495,CY
3114986496,3114987519,IR
@@ -87417,7 +91594,6 @@
3115039744,3115040767,GB
3115040768,3115041791,RU
3115041792,3115042815,DK
-3115042816,3115043839,GE
3115043840,3115044863,DE
3115044864,3115045887,NL
3115045888,3115046911,IT
@@ -87437,10 +91613,10 @@
3115063296,3115064319,EE
3115064320,3115066367,MD
3115066368,3115067391,NL
-3115067392,3115068415,DE
+3115067392,3115068415,US
3115068416,3115069439,HU
3115069440,3115070463,NL
-3115070464,3115071487,DE
+3115070464,3115071487,US
3115071488,3115071743,NL
3115071744,3115072511,DE
3115072512,3115073535,ES
@@ -87465,7 +91641,8 @@
3115091968,3115092991,RU
3115092992,3115094015,IT
3115094016,3115094527,DE
-3115094528,3115095039,NL
+3115094528,3115094783,TR
+3115094784,3115095039,NL
3115095040,3115095551,DE
3115095552,3115096063,CH
3115096064,3115097087,FR
@@ -87522,7 +91699,7 @@
3115147264,3115148287,FR
3115148288,3115149311,UA
3115149312,3115150335,IR
-3115150336,3115151359,DE
+3115150336,3115151359,US
3115151360,3115152383,RU
3115152384,3115154431,GB
3115154432,3115155455,FR
@@ -87565,7 +91742,7 @@
3115192320,3115193343,HU
3115193344,3115194367,TR
3115194368,3115195391,FI
-3115195392,3115196415,DE
+3115195392,3115196415,TR
3115196416,3115197439,LI
3115197440,3115198463,DE
3115198464,3115199487,NL
@@ -87592,7 +91769,8 @@
3115219968,3115220991,NL
3115220992,3115222015,RU
3115222016,3115223039,IR
-3115223040,3115224063,RU
+3115223040,3115223807,RU
+3115223808,3115224063,US
3115224064,3115225087,SE
3115225088,3115226111,UA
3115226112,3115227135,DE
@@ -87622,10 +91800,9 @@
3115249664,3115250687,LB
3115250688,3115251711,SE
3115251712,3115252735,IR
-3115252736,3115253759,DE
+3115252736,3115253759,US
3115253760,3115254783,SI
3115254784,3115255807,NL
-3115255808,3115256831,TR
3115256832,3115257855,GB
3115257856,3115258879,RU
3115258880,3115259903,AT
@@ -87650,8 +91827,7 @@
3115275264,3115276287,CZ
3115276288,3115277311,NL
3115277312,3115277823,ES
-3115277824,3115277824,UA
-3115277825,3115278335,ES
+3115277824,3115278335,UA
3115278336,3115279359,NO
3115279360,3115280383,GB
3115280384,3115281407,PL
@@ -87700,7 +91876,8 @@
3115322368,3115323391,IE
3115323392,3115324415,DE
3115324416,3115325439,IT
-3115325440,3115326463,RU
+3115325440,3115326207,RU
+3115326208,3115326463,GB
3115326464,3115327487,SE
3115327488,3115328511,IR
3115328512,3115329535,NO
@@ -87731,7 +91908,9 @@
3115355136,3115356159,NL
3115356160,3115357183,LB
3115357184,3115358207,FR
-3115358208,3115362303,DE
+3115358208,3115359743,DE
+3115359744,3115359999,RU
+3115360000,3115362303,DE
3115362304,3115363327,FR
3115363328,3115364351,GB
3115364352,3115365375,FR
@@ -87936,8 +92115,7 @@
3115574272,3115575295,GB
3115575296,3115576319,ES
3115576320,3115577343,FI
-3115577344,3115578111,IL
-3115578112,3115578367,NL
+3115577344,3115578367,IL
3115578368,3115579391,GB
3115579392,3115580415,US
3115580416,3115581439,GB
@@ -88079,7 +92257,8 @@
3115723776,3115724799,DE
3115724800,3115725311,GB
3115725312,3115725567,DE
-3115725568,3115726847,GB
+3115725568,3115725823,CH
+3115725824,3115726847,GB
3115726848,3115727871,NL
3115727872,3115728703,GB
3115728704,3115728735,NL
@@ -88099,7 +92278,6 @@
3115741184,3115742207,LB
3115742208,3115743231,IT
3115743232,3115744255,AM
-3115744256,3115745279,GB
3115745280,3115746303,RU
3115746304,3115747327,BE
3115747328,3115748351,JO
@@ -88114,7 +92292,7 @@
3115756544,3115757567,IT
3115757568,3115758591,AT
3115758592,3115759615,ES
-3115759616,3115760639,DE
+3115759616,3115760639,US
3115760640,3115761663,TR
3115761664,3115762687,MD
3115762688,3115763711,IT
@@ -88177,7 +92355,10 @@
3115819008,3115820031,RU
3115820032,3115822079,TR
3115822080,3115823103,RU
-3115823104,3115825151,DE
+3115823104,3115824127,DE
+3115824128,3115824639,US
+3115824640,3115824895,DE
+3115824896,3115825151,GB
3115825152,3115826175,GR
3115826176,3115828223,CH
3115828224,3115829247,RU
@@ -88281,7 +92462,7 @@
3115926528,3115927551,RU
3115927552,3115928575,SY
3115928576,3115929599,GB
-3115929600,3115930623,DE
+3115929600,3115930623,US
3115930624,3115931647,GB
3115931648,3115932671,SI
3115932672,3115933695,ES
@@ -88304,7 +92485,7 @@
3115953152,3115954175,IQ
3115954176,3115955199,LB
3115955200,3115956223,RU
-3115956224,3115957247,NL
+3115956224,3115957247,CY
3115957248,3115959295,DE
3115959296,3115960319,ES
3115960320,3115961343,CH
@@ -88325,8 +92506,7 @@
3115973632,3115974655,UA
3115974656,3115975679,RU
3115975680,3115976703,GB
-3115976704,3115977215,US
-3115977216,3115977727,NL
+3115976704,3115977727,US
3115977728,3115978751,IT
3115978752,3115980799,PL
3115980800,3115981823,DE
@@ -88345,7 +92525,7 @@
3115994112,3115994367,CH
3115994368,3115994623,GB
3115994624,3115994879,SE
-3115994880,3115995135,CA
+3115994880,3115995135,DK
3115995136,3115996159,AL
3115996160,3115997183,GR
3115997184,3115998207,FR
@@ -88410,7 +92590,8 @@
3116062720,3116063743,RU
3116063744,3116064767,LB
3116064768,3116065791,ES
-3116065792,3116066815,BE
+3116065792,3116066047,BE
+3116066048,3116066815,NL
3116066816,3116067839,TR
3116067840,3116068863,NL
3116068864,3116069887,RU
@@ -88428,7 +92609,7 @@
3116080896,3116081151,GB
3116081152,3116082175,IL
3116082176,3116083199,FR
-3116083200,3116084223,DE
+3116083200,3116084223,US
3116084224,3116085247,IT
3116085248,3116086271,KW
3116086272,3116087295,ES
@@ -88496,7 +92677,6 @@
3116149760,3116150783,GB
3116150784,3116151807,FR
3116151808,3116152831,RU
-3116152832,3116153855,PL
3116153856,3116154879,SK
3116154880,3116155903,RU
3116155904,3116156927,CH
@@ -88509,19 +92689,21 @@
3116164096,3116165119,BG
3116165120,3116166143,GB
3116166144,3116167167,SK
-3116167168,3116170239,DE
+3116167168,3116169215,DE
+3116169216,3116170239,US
3116170240,3116171263,GB
3116171264,3116172287,DE
3116172288,3116173311,CZ
3116173312,3116174335,NL
3116174336,3116176383,RU
3116176384,3116177407,FR
-3116177408,3116178431,DE
+3116177408,3116177919,US
+3116177920,3116178431,DE
3116178432,3116179455,SE
3116179456,3116180479,CZ
-3116180480,3116181503,RO
+3116180480,3116181503,US
3116181504,3116182527,GB
-3116182528,3116183551,RO
+3116182528,3116183551,US
3116183552,3116184575,SE
3116184576,3116185599,TR
3116185600,3116186623,GB
@@ -88579,7 +92761,7 @@
3116235776,3116238847,RU
3116238848,3116239871,UA
3116239872,3116240895,IE
-3116240896,3116241151,NL
+3116240896,3116241151,US
3116241152,3116241407,FR
3116241408,3116241919,TR
3116241920,3116242943,IR
@@ -88615,7 +92797,7 @@
3116269568,3116270591,GB
3116270592,3116271615,AL
3116271616,3116272639,IT
-3116272640,3116273663,DE
+3116272640,3116273663,US
3116273664,3116274687,SE
3116274688,3116275711,UA
3116275712,3116276735,RS
@@ -88664,7 +92846,7 @@
3116328960,3116329983,IT
3116329984,3116331007,DE
3116331008,3116332031,UA
-3116332032,3116333055,RO
+3116332032,3116333055,US
3116333056,3116334079,DE
3116334080,3116335103,NL
3116335104,3116336127,BE
@@ -88715,8 +92897,7 @@
3116382208,3116382463,RU
3116382464,3116382719,GU
3116382720,3116382975,AQ
-3116382976,3116383231,SC
-3116383232,3116384255,RU
+3116382976,3116384255,RU
3116384256,3116385279,DE
3116385280,3116386047,US
3116386048,3116386303,GB
@@ -88726,7 +92907,7 @@
3116389376,3116390399,BG
3116390400,3116391423,IE
3116391424,3116392447,GB
-3116392448,3116393471,DE
+3116392448,3116393471,US
3116393472,3116394495,PL
3116394496,3116395519,NL
3116395520,3116396543,RU
@@ -88773,12 +92954,14 @@
3116437504,3116439551,RU
3116439552,3116440575,LT
3116440576,3116441599,MD
-3116441600,3116443135,GB
+3116441600,3116442879,GB
+3116442880,3116443135,US
3116443136,3116443391,FR
3116443392,3116443647,GB
3116443648,3116444671,DE
3116444672,3116445695,FR
-3116445696,3116447743,RO
+3116445696,3116446719,US
+3116446720,3116447743,RO
3116447744,3116448767,BG
3116448768,3116449791,EE
3116449792,3116450815,DE
@@ -88867,7 +93050,7 @@
3116542976,3116543999,TR
3116544000,3116545023,ES
3116545024,3116546047,CH
-3116546048,3116547071,FR
+3116546048,3116547071,IT
3116547072,3116548095,UA
3116548096,3116549119,NL
3116549120,3116550143,TJ
@@ -88900,7 +93083,7 @@
3116577792,3116578815,HU
3116578816,3116579839,GB
3116579840,3116580863,AT
-3116580864,3116581887,RO
+3116580864,3116581887,US
3116581888,3116582911,CH
3116582912,3116583935,IR
3116583936,3116584959,TR
@@ -88942,7 +93125,9 @@
3116621824,3116622847,CZ
3116622848,3116623871,TR
3116623872,3116624895,SE
-3116624896,3116625663,GL
+3116624896,3116625151,GL
+3116625152,3116625407,EE
+3116625408,3116625663,US
3116625664,3116625919,NZ
3116625920,3116626943,RU
3116626944,3116627967,NL
@@ -88953,7 +93138,8 @@
3116632064,3116633087,CH
3116633088,3116634111,RO
3116634112,3116635135,ES
-3116635136,3116636159,DE
+3116635136,3116635903,DE
+3116635904,3116636159,GB
3116636160,3116637183,US
3116637184,3116638207,NL
3116638208,3116639231,ES
@@ -88998,7 +93184,7 @@
3116682240,3116684287,GB
3116684288,3116686335,UZ
3116686336,3116687359,NL
-3116687360,3116688383,DE
+3116687360,3116688383,US
3116688384,3116689407,PL
3116689408,3116690431,FI
3116690432,3116691455,RU
@@ -89011,7 +93197,9 @@
3116699648,3116700671,NL
3116700672,3116701695,SY
3116701696,3116702719,NL
-3116702720,3116703743,DE
+3116702720,3116703231,US
+3116703232,3116703487,DE
+3116703488,3116703743,GB
3116703744,3116704767,RU
3116704768,3116705791,BE
3116705792,3116706815,CH
@@ -89046,7 +93234,6 @@
3116738560,3116739583,DK
3116739584,3116740607,DE
3116740608,3116741631,JO
-3116741632,3116742655,PL
3116742656,3116743679,FR
3116743680,3116744703,NL
3116744704,3116745727,DE
@@ -89065,7 +93252,7 @@
3116755968,3116756991,DE
3116756992,3116758015,NL
3116758016,3116759039,ES
-3116759040,3116760063,DE
+3116759040,3116760063,US
3116760064,3116761087,FR
3116761088,3116762111,PL
3116762112,3116763135,SE
@@ -89075,15 +93262,18 @@
3116764192,3116765183,GB
3116765184,3116766207,PL
3116766208,3116767231,FR
-3116767232,3116768255,DE
-3116768256,3116769279,GB
+3116767232,3116767743,US
+3116767744,3116767999,DE
+3116768000,3116769279,GB
3116769280,3116770303,LT
3116770304,3116772351,RU
3116772352,3116773375,MD
3116773376,3116774399,ES
3116774400,3116775423,TR
3116775424,3116775679,RO
-3116775680,3116776447,NL
+3116775680,3116775935,NL
+3116775936,3116776191,RO
+3116776192,3116776447,NL
3116776448,3116777471,IT
3116777472,3116778495,ES
3116778496,3116779519,GB
@@ -89124,8 +93314,7 @@
3116818432,3116819455,FR
3116819456,3116820479,GB
3116820480,3116822527,AT
-3116822528,3116823551,US
-3116823552,3116824575,RO
+3116822528,3116824575,US
3116824576,3116825599,FR
3116825600,3116826623,IR
3116826624,3116827647,DE
@@ -89143,7 +93332,7 @@
3116839936,3116841983,GB
3116841984,3116843007,DE
3116843008,3116844031,IR
-3116844032,3116845055,US
+3116844032,3116845055,DE
3116845056,3116846079,IT
3116846080,3116847103,DE
3116847104,3116848127,AT
@@ -89151,7 +93340,8 @@
3116849152,3116850175,TR
3116850176,3116851199,NL
3116851200,3116852223,UA
-3116852224,3116854271,DE
+3116852224,3116853247,US
+3116853248,3116854271,DE
3116854272,3116855295,NL
3116855296,3116856319,IT
3116856320,3116857343,NL
@@ -89221,7 +93411,7 @@
3116923904,3116924927,OM
3116924928,3116925951,JO
3116925952,3116926975,NL
-3116926976,3116927999,US
+3116926976,3116927999,DE
3116928000,3116929023,RU
3116929024,3116930047,FR
3116930048,3116931071,IT
@@ -89231,7 +93421,7 @@
3116934144,3116935167,FR
3116935168,3116936191,RU
3116936192,3116937215,GB
-3116937216,3116938239,RO
+3116937216,3116938239,US
3116938240,3116939263,IT
3116939264,3116940287,SE
3116940288,3116940799,RU
@@ -89293,14 +93483,15 @@
3116995584,3116996607,GB
3116996608,3116997631,ES
3116997632,3116998655,AT
-3116998656,3116999679,US
+3116998656,3116999679,DE
3116999680,3117000703,GB
3117000704,3117001727,RU
3117001728,3117002751,SE
3117002752,3117003775,ES
3117003776,3117004799,GB
3117004800,3117005823,IT
-3117005824,3117006079,PT
+3117005828,3117005829,PT
+3117006080,3117006335,ES
3117006848,3117007871,KW
3117007872,3117008895,HR
3117008896,3117009919,NL
@@ -89310,13 +93501,14 @@
3117012992,3117014015,CH
3117014016,3117015039,TR
3117015040,3117016063,DE
-3117016064,3117017087,TR
+3117016064,3117017087,NL
3117017088,3117018111,CZ
3117018112,3117019135,SK
3117019136,3117020159,IT
-3117020160,3117021183,RO
+3117020160,3117021183,US
3117021184,3117022207,CH
-3117022208,3117024255,NL
+3117022208,3117023231,NL
+3117023232,3117024255,FR
3117024256,3117025279,AT
3117025280,3117026303,DK
3117026304,3117027327,RU
@@ -89339,7 +93531,7 @@
3117045760,3117046783,MD
3117046784,3117047807,IR
3117047808,3117048831,NL
-3117048832,3117049855,DE
+3117048832,3117049855,UA
3117049856,3117052927,NL
3117052928,3117053951,ES
3117053952,3117054975,IT
@@ -89351,10 +93543,10 @@
3117060096,3117061119,GB
3117061120,3117062143,AT
3117062144,3117063167,NL
-3117063168,3117064191,US
+3117063168,3117064191,DE
3117064192,3117066239,ES
3117066240,3117067263,TR
-3117067264,3117068287,NL
+3117067264,3117068287,US
3117068288,3117069311,SE
3117069312,3117070335,FR
3117070336,3117071359,NG
@@ -89365,11 +93557,11 @@
3117076480,3117077503,SE
3117077504,3117078527,RU
3117078528,3117079551,PL
-3117079552,3117080575,DE
+3117079552,3117080575,US
3117080576,3117081599,BE
3117081600,3117082623,SA
3117082624,3117083647,GB
-3117083648,3117084671,DE
+3117083648,3117084671,US
3117084672,3117085695,TR
3117085696,3117086719,IT
3117086720,3117087743,LU
@@ -89404,7 +93596,9 @@
3117116416,3117117439,SA
3117117440,3117118463,CH
3117118464,3117119487,BG
-3117119488,3117120511,DE
+3117119488,3117119999,DE
+3117120000,3117120255,IN
+3117120256,3117120511,US
3117120512,3117121535,IT
3117121536,3117122559,PL
3117122560,3117123583,CH
@@ -89425,7 +93619,7 @@
3117138944,3117139967,IR
3117139968,3117142015,DE
3117142016,3117143039,ES
-3117143040,3117145087,DE
+3117143040,3117145087,US
3117145088,3117147135,ES
3117147136,3117148159,AE
3117148160,3117149183,DK
@@ -89434,11 +93628,14 @@
3117151232,3117152255,UA
3117152256,3117153279,RO
3117153280,3117154303,PL
-3117154304,3117155327,RU
+3117154304,3117154559,RU
+3117154560,3117154815,FI
+3117154816,3117155327,RU
3117155328,3117156351,GB
3117156352,3117157375,SE
3117157376,3117158399,US
-3117158400,3117159423,CZ
+3117158400,3117158911,SK
+3117158912,3117159423,CZ
3117159424,3117160447,RU
3117160448,3117161471,UA
3117161472,3117162495,MD
@@ -89497,7 +93694,7 @@
3117219840,3117220863,FI
3117220864,3117221887,ES
3117221888,3117222911,IT
-3117222912,3117223935,DE
+3117222912,3117223935,US
3117223936,3117224959,TR
3117224960,3117225983,NO
3117225984,3117227007,SA
@@ -89525,7 +93722,7 @@
3117248512,3117249535,ES
3117249536,3117250559,SI
3117250560,3117251583,CH
-3117251584,3117252607,DE
+3117251584,3117252607,US
3117252608,3117253631,RU
3117253632,3117254655,DE
3117254656,3117255679,CZ
@@ -89542,7 +93739,8 @@
3117265920,3117266943,GB
3117266944,3117267967,CY
3117267968,3117268991,ES
-3117268992,3117270015,DE
+3117268992,3117269503,US
+3117269504,3117270015,DE
3117270016,3117271039,TR
3117271040,3117272063,RU
3117272064,3117273087,GB
@@ -89554,7 +93752,7 @@
3117279232,3117280255,BE
3117280256,3117281279,RU
3117281280,3117282303,NL
-3117282304,3117283327,DE
+3117282304,3117283327,US
3117283328,3117284351,HU
3117284352,3117285375,ES
3117285376,3117286399,CH
@@ -89563,7 +93761,6 @@
3117288448,3117289471,IE
3117289472,3117290495,GB
3117290496,3117291519,US
-3117291520,3117291775,NL
3117291776,3117292031,FR
3117292032,3117292287,DE
3117292544,3117293567,SA
@@ -89609,7 +93806,544 @@
3117333504,3117334527,DE
3117334528,3117335551,IE
3117335552,3117336575,DE
+3117336576,3117337599,LB
+3117337600,3117338623,RU
+3117338624,3117339647,DE
+3117339648,3117340671,NL
+3117340672,3117341695,GB
+3117341696,3117342719,TR
+3117342720,3117342975,DK
+3117342976,3117343231,NO
+3117343232,3117344767,GB
+3117344768,3117345791,NL
+3117345792,3117346815,IR
+3117346816,3117347839,US
+3117347840,3117348863,CH
+3117348864,3117349887,ES
+3117349888,3117350911,IL
+3117350912,3117351935,RU
+3117351936,3117352959,IR
+3117352960,3117353983,HU
+3117353984,3117356031,DE
+3117356032,3117357055,NL
+3117357056,3117358079,RU
+3117358080,3117359103,SA
+3117359104,3117360127,LT
+3117360128,3117361151,TR
+3117361152,3117362175,ES
+3117362176,3117363199,FR
+3117363200,3117364223,GB
+3117364224,3117365247,IR
+3117365248,3117366271,TR
+3117366272,3117367295,DE
+3117367296,3117368319,RU
+3117368320,3117369343,GB
+3117369344,3117370367,IR
+3117370368,3117371391,CH
+3117371392,3117372415,FR
+3117372416,3117373439,FI
+3117373440,3117374463,RU
+3117374464,3117375487,IE
+3117375488,3117376511,TR
+3117376512,3117378559,DE
+3117378560,3117379583,GB
+3117379584,3117380607,DE
+3117380608,3117381631,CH
+3117381632,3117383679,GB
+3117383680,3117384703,GE
+3117384704,3117385727,US
+3117385728,3117386751,UA
+3117386752,3117387775,GB
+3117387776,3117388799,ES
+3117388800,3117389823,PL
+3117389824,3117390847,US
+3117390848,3117391871,DE
+3117391872,3117392895,CY
+3117392896,3117393919,NL
+3117393920,3117394943,CZ
+3117394944,3117395967,ES
+3117395968,3117396479,GB
+3117396480,3117396735,US
+3117396736,3117396991,GB
+3117396992,3117398015,MD
+3117398016,3117399039,UA
+3117399040,3117400063,LT
+3117400064,3117401087,NL
+3117401088,3117402111,IR
+3117402112,3117403135,GB
+3117403136,3117404159,NL
+3117404160,3117405183,DE
+3117405184,3117406207,CH
+3117406208,3117407231,DE
+3117407232,3117408255,NL
+3117408256,3117409279,IE
+3117409280,3117410303,DE
+3117410304,3117411327,BG
+3117411328,3117412351,MD
+3117412352,3117413375,UA
+3117413376,3117414399,DE
+3117414400,3117415423,US
+3117415424,3117416447,RU
3117416448,3117417471,FR
+3117417472,3117418495,IE
+3117418496,3117419519,FR
+3117419520,3117420543,AT
+3117420544,3117421567,IT
+3117421568,3117422591,ES
+3117422592,3117423615,UA
+3117423616,3117424639,CH
+3117424640,3117426687,DE
+3117426688,3117427711,FR
+3117427712,3117428735,IT
+3117428736,3117429759,BG
+3117429760,3117430783,SE
+3117430784,3117431807,NL
+3117431808,3117432831,FR
+3117432832,3117433855,ES
+3117433856,3117434879,SE
+3117434880,3117435903,RU
+3117435904,3117436927,IR
+3117436928,3117437951,DK
+3117437952,3117438975,FR
+3117438976,3117439999,GB
+3117440000,3117441023,NO
+3117441024,3117442047,TJ
+3117442048,3117443071,TR
+3117443072,3117444095,IT
+3117444096,3117445119,CY
+3117445120,3117446143,EE
+3117446144,3117447167,FR
+3117447168,3117448191,CH
+3117448192,3117449215,NL
+3117449216,3117450239,MD
+3117450240,3117451263,AT
+3117451264,3117452287,IT
+3117452288,3117453311,FR
+3117453312,3117454335,ES
+3117454336,3117455359,IR
+3117455360,3117456383,CZ
+3117456384,3117457407,BG
+3117457408,3117458431,DE
+3117458432,3117459455,PL
+3117459456,3117459711,US
+3117459712,3117460479,GB
+3117460480,3117461503,IR
+3117461504,3117462527,UZ
+3117462528,3117463551,IR
+3117463552,3117464575,ES
+3117464576,3117465599,IT
+3117465600,3117466623,RU
+3117466624,3117467647,IL
+3117467648,3117468671,RU
+3117468672,3117469695,US
+3117469696,3117470719,NL
+3117470720,3117471743,DK
+3117471744,3117473791,ES
+3117473792,3117474815,HU
+3117474816,3117475839,UA
+3117475840,3117476863,IT
+3117476864,3117477887,US
+3117477888,3117478911,GB
+3117478912,3117479935,IT
+3117479936,3117480959,MD
+3117480960,3117481983,CH
+3117481984,3117483007,LV
+3117483008,3117484031,DE
+3117484032,3117485055,ES
+3117485056,3117486079,RU
+3117486080,3117487103,FR
+3117487104,3117488127,NL
+3117488128,3117489151,CZ
+3117489152,3117490175,RU
+3117490176,3117491199,SY
+3117491200,3117492223,ES
+3117492224,3117493247,GB
+3117493248,3117494271,RU
+3117494272,3117495295,SA
+3117495296,3117496319,FR
+3117496320,3117497343,UA
+3117497344,3117498367,ES
+3117498368,3117499391,DE
+3117499392,3117500415,PL
+3117500416,3117502463,ES
+3117502464,3117502975,FR
+3117502976,3117503487,RU
+3117503488,3117503743,DE
+3117503744,3117503999,RU
+3117504000,3117504511,DE
+3117504512,3117505535,RU
+3117505536,3117506559,IE
+3117506560,3117507583,EE
+3117507584,3117508607,ES
+3117508608,3117509631,DE
+3117509632,3117510655,PS
+3117510656,3117511679,RU
+3117511680,3117512703,DE
+3117512704,3117513727,ES
+3117513728,3117514751,DE
+3117514752,3117515775,US
+3117515776,3117516799,DE
+3117516800,3117517823,LT
+3117517824,3117518847,FR
+3117518848,3117519871,DE
+3117519872,3117520895,NL
+3117520896,3117521919,GB
+3117521920,3117522943,DE
+3117522944,3117523199,RU
+3117523200,3117523967,US
+3117523968,3117524991,GB
+3117524992,3117526015,CH
+3117526016,3117527039,AT
+3117527040,3117528063,UA
+3117528064,3117530111,FR
+3117530112,3117531135,IR
+3117531136,3117532159,ES
+3117532160,3117533183,SE
+3117533184,3117534207,SY
+3117534208,3117535231,AT
+3117535232,3117536255,FR
+3117536256,3117537279,CH
+3117537280,3117538303,GB
+3117538304,3117539327,US
+3117539328,3117540351,UA
+3117540352,3117541375,US
+3117541376,3117542399,BG
+3117542400,3117543423,DE
+3117543424,3117544447,PT
+3117544448,3117545471,DE
+3117545472,3117546495,PL
+3117546496,3117547519,US
+3117547520,3117548543,CH
+3117548544,3117549567,NO
+3117549568,3117550591,DE
+3117550592,3117551615,AT
+3117551616,3117553663,ES
+3117553664,3117554687,NL
+3117554688,3117555711,GB
+3117555712,3117556735,CH
+3117556736,3117557759,PL
+3117557760,3117558783,RO
+3117558784,3117559807,RU
+3117559808,3117560831,IT
+3117560832,3117561855,DE
+3117561856,3117562879,RU
+3117562880,3117563903,ES
+3117563904,3117565951,CH
+3117565952,3117566975,ES
+3117566976,3117567999,TR
+3117568000,3117569023,DE
+3117569024,3117570047,UA
+3117570048,3117571071,ES
+3117571072,3117572095,TR
+3117572096,3117573119,CH
+3117573120,3117574143,DE
+3117574144,3117575167,GB
+3117575168,3117576191,FR
+3117576192,3117577215,IT
+3117577216,3117578239,GB
+3117578240,3117579263,NL
+3117579264,3117580287,PL
+3117580288,3117581311,NL
+3117581312,3117582335,DK
+3117582336,3117583359,US
+3117583360,3117584383,RU
+3117584384,3117585407,US
+3117585408,3117586431,AT
+3117586432,3117587455,ES
+3117587456,3117587967,DE
+3117587968,3117588991,RU
+3117588992,3117589503,NL
+3117589504,3117590527,CZ
+3117590528,3117591551,GB
+3117591552,3117592575,IT
+3117592576,3117593599,DK
+3117593600,3117594623,BA
+3117594624,3117595647,ES
+3117595648,3117596671,DE
+3117596672,3117597695,ES
+3117597696,3117598719,GB
+3117598720,3117599743,IR
+3117599744,3117600767,FR
+3117600768,3117601791,DE
+3117601792,3117602815,IE
+3117602816,3117603071,RO
+3117603072,3117603327,BE
+3117603328,3117603583,RO
+3117603584,3117603839,AT
+3117603840,3117604863,SE
+3117604864,3117605887,AT
+3117605888,3117606911,GB
+3117606912,3117607935,ES
+3117607936,3117608959,DK
+3117608960,3117609983,RU
+3117609984,3117611007,ES
+3117611008,3117612031,IT
+3117612032,3117613055,TR
+3117613056,3117614079,RU
+3117614080,3117615103,US
+3117615104,3117616127,ES
+3117616128,3117617151,IT
+3117617152,3117618175,DE
+3117618176,3117619199,GB
+3117619200,3117620223,FR
+3117620224,3117621247,PL
+3117621248,3117622271,US
+3117622272,3117623295,SK
+3117623296,3117624319,HU
+3117624320,3117626367,GB
+3117626368,3117627391,NO
+3117627392,3117628415,IR
+3117628416,3117629439,DE
+3117629440,3117630463,RS
+3117630464,3117631487,ES
+3117631488,3117632511,NO
+3117632512,3117634559,IT
+3117634560,3117636607,IR
+3117636608,3117637631,CH
+3117637632,3117638655,LV
+3117638656,3117639679,DE
+3117639680,3117640703,KW
+3117640704,3117641727,CZ
+3117641728,3117642751,RU
+3117642752,3117643007,ES
+3117643008,3117643263,NL
+3117643264,3117643519,FR
+3117643520,3117643775,IE
+3117643776,3117644799,FR
+3117644800,3117645823,DE
+3117645824,3117646847,UZ
+3117646848,3117647871,DE
+3117647872,3117648895,SE
+3117648896,3117649919,GB
+3117649920,3117650943,US
+3117650944,3117651967,DE
+3117651968,3117652991,NL
+3117652992,3117654015,RU
+3117654016,3117655039,IT
+3117655040,3117656063,RU
+3117656064,3117659135,GB
+3117659136,3117660159,ES
+3117660160,3117661183,NL
+3117661184,3117663231,CZ
+3117663232,3117664255,ES
+3117664256,3117665279,BG
+3117665280,3117666303,DK
+3117666304,3117667327,NL
+3117667328,3117668351,ES
+3117668352,3117669375,AT
+3117669376,3117670399,DE
+3117670400,3117671423,RU
+3117671424,3117672447,KG
+3117672448,3117673471,LU
+3117673472,3117674495,DE
+3117674496,3117676543,RU
+3117676544,3117677567,NL
+3117677568,3117678591,IE
+3117678592,3117679615,RU
+3117679616,3117680639,NL
+3117680640,3117681663,MD
+3117681664,3117682687,CZ
+3117682688,3117683711,IT
+3117683712,3117684735,FR
+3117684736,3117685759,SE
+3117685760,3117686783,RU
+3117686784,3117687807,NL
+3117687808,3117688831,DE
+3117688832,3117689855,PL
+3117689856,3117690879,DE
+3117690880,3117691903,IR
+3117691904,3117692927,DE
+3117692928,3117693951,GB
+3117693952,3117694975,US
+3117694976,3117695999,PL
+3117696000,3117697023,GB
+3117697024,3117698047,FR
+3117698048,3117699071,DE
+3117699072,3117700095,GB
+3117700096,3117701119,ES
+3117701120,3117702143,RU
+3117702144,3117703167,DE
+3117703168,3117704191,FR
+3117704192,3117705215,AT
+3117705216,3117706239,DE
+3117706240,3117707263,BA
+3117707264,3117707775,PL
+3117707776,3117708799,RU
+3117708800,3117709311,GB
+3117709312,3117710335,IR
+3117710336,3117711359,ES
+3117711360,3117712383,NL
+3117712384,3117713407,PL
+3117713408,3117714431,ES
+3117714432,3117715455,MD
+3117715456,3117716479,GB
+3117716480,3117717503,RU
+3117717504,3117718527,IT
+3117718528,3117719551,GB
+3117719552,3117720575,FR
+3117720576,3117721599,PL
+3117721600,3117721855,GB
+3117721856,3117722111,DK
+3117722112,3117722367,CH
+3117722368,3117722623,NL
+3117722624,3117723647,TR
+3117723648,3117724671,IE
+3117724672,3117725695,GR
+3117725696,3117726719,IE
+3117726720,3117727743,AL
+3117727744,3117728767,IR
+3117728768,3117729791,DE
+3117729792,3117730815,NL
+3117730816,3117731839,ES
+3117731840,3117732863,DK
+3117732864,3117733887,FR
+3117733888,3117734911,GB
+3117734912,3117735935,LB
+3117735936,3117736959,FR
+3117736960,3117737983,IE
+3117737984,3117739007,NL
+3117739008,3117743103,UA
+3117743104,3117744127,GE
+3117744128,3117745151,RU
+3117745152,3117746175,IT
+3117746176,3117747199,IR
+3117747200,3117748223,NL
+3117748224,3117749247,US
+3117749248,3117749503,IT
+3117749504,3117750271,CA
+3117750272,3117751295,DE
+3117751296,3117752319,RU
+3117752320,3117753343,DE
+3117753344,3117754367,PL
+3117754368,3117755391,UA
+3117755392,3117756415,GB
+3117756416,3117757439,ES
+3117757440,3117758463,NO
+3117758464,3117759487,CH
+3117759488,3117760511,HK
+3117760512,3117761535,BE
+3117761536,3117762559,NL
+3117762560,3117763583,MD
+3117763584,3117765631,DE
+3117765632,3117766655,ES
+3117766656,3117767679,NL
+3117767680,3117768703,GB
+3117768704,3117769727,DE
+3117769728,3117771775,NL
+3117771776,3117772799,ES
+3117772800,3117773823,IT
+3117773824,3117775871,GB
+3117775872,3117776895,NO
+3117776896,3117777919,DE
+3117777920,3117778943,IE
+3117778944,3117779967,RU
+3117779968,3117780991,US
+3117780992,3117782015,SK
+3117782016,3117783039,GB
+3117783040,3117784063,SE
+3117784064,3117785087,RU
+3117785088,3117786111,FR
+3117786112,3117787135,IR
+3117787136,3117788159,TR
+3117788160,3117788927,NL
+3117788928,3117789183,DE
+3117789184,3117790207,UA
+3117790208,3117791231,LB
+3117791232,3117792255,LU
+3117792256,3117794303,DE
+3117794304,3117795327,ES
+3117795328,3117796351,LV
+3117796352,3117797375,CH
+3117797376,3117798399,NL
+3117798400,3117799423,RU
+3117799424,3117800447,IT
+3117800448,3117801471,IE
+3117801472,3117802495,FI
+3117802496,3117803519,RU
+3117803520,3117804543,UA
+3117804544,3117805567,DE
+3117805568,3117806591,HR
+3117806592,3117807615,GB
+3117807616,3117808639,NO
+3117808640,3117809663,IL
+3117809664,3117810687,IT
+3117810688,3117811711,NL
+3117811712,3117811967,FR
+3117811968,3117812223,IE
+3117812224,3117812735,GB
+3117812736,3117813759,ES
+3117813760,3117814783,NO
+3117814784,3117816831,NL
+3117816832,3117817855,HU
+3117817856,3117818879,PT
+3117818880,3117819903,IR
+3117819904,3117820927,RO
+3117820928,3117821951,IT
+3117821952,3117822975,GB
+3117822976,3117823999,FR
+3117824000,3117826047,RU
+3117826048,3117827071,DE
+3117827072,3117827327,NL
+3117827328,3117828095,GB
+3117828096,3117829119,NL
+3117829120,3117830143,RU
+3117830144,3117832191,ES
+3117832192,3117833215,NL
+3117833216,3117834239,HR
+3117834240,3117835263,US
+3117835264,3117836287,ES
+3117836288,3117837311,RO
+3117837312,3117838335,ES
+3117838336,3117839359,NL
+3117839360,3117840383,CZ
+3117840384,3117842431,DE
+3117842432,3117843455,NL
+3117843456,3117844479,BM
+3117844480,3117845503,ES
+3117845504,3117846527,GB
+3117846528,3117847551,ES
+3117847552,3117848575,NL
+3117848576,3117849599,CH
+3117849600,3117850623,FI
+3117850624,3117852671,RU
+3117852672,3117853695,ES
+3117853696,3117854719,ME
+3117854720,3117855743,ES
+3117855744,3117856767,GB
+3117856768,3117857791,RU
+3117857792,3117858815,TR
+3117858816,3117859839,SK
+3117859840,3117860863,UA
+3117860864,3117861887,IT
+3117861888,3117862911,ES
+3117862912,3117863935,FR
+3117863936,3117864959,NL
+3117864960,3117865983,FR
+3117865984,3117867007,GB
+3117867008,3117868031,FR
+3117868032,3117871103,DE
+3117871104,3117872127,US
+3117872128,3117875199,RU
+3117875200,3117876223,ES
+3117876224,3117877247,DK
+3117877248,3117878271,SE
+3117879296,3117880319,DE
+3117880320,3117881343,CZ
+3117881344,3117882367,FR
+3117882368,3117883391,AT
+3117883392,3117884415,NO
+3117884416,3117885439,GB
+3117885440,3117886463,NL
+3117886464,3117887487,TR
+3117887488,3117888511,LV
+3117888512,3117889535,AM
+3117889536,3117890559,DE
+3117890560,3117891583,RU
+3117891584,3117892607,FR
+3117892608,3117893631,LU
+3117893632,3117894655,PL
+3117894656,3117896703,DE
+3117896704,3117897727,ES
3120562176,3120594943,CO
3120594944,3120599039,AR
3120601088,3120602111,AR
@@ -89628,13 +94362,15 @@
3120691200,3120693247,CO
3120693248,3120726015,BO
3120726016,3120734207,HN
-3120734208,3120735487,BZ
+3120734208,3120735231,BZ
+3120735232,3120735487,RU
3120735488,3120735743,NL
-3120735744,3120736255,BZ
+3120735744,3120735999,BZ
+3120736000,3120736255,RU
3120736256,3120736511,EC
3120736512,3120736767,BZ
-3120736768,3120737023,RU
-3120737024,3120737791,BZ
+3120736768,3120737535,RU
+3120737536,3120737791,BZ
3120737792,3120738303,EC
3120738304,3120742399,CW
3120742400,3120754687,PY
@@ -89703,7 +94439,9 @@
3124846592,3124848639,AR
3124848640,3124849663,BR
3124849664,3124850687,AR
-3124850688,3124854783,HN
+3124850688,3124851855,HN
+3124851856,3124851863,IN
+3124851864,3124854783,HN
3124854784,3124887551,CL
3124887552,3124953087,EC
3124953088,3125018623,CL
@@ -89713,8 +94451,14 @@
3125673984,3125805055,CL
3125805056,3126329343,CO
3126329344,3126853631,VE
-3126853632,3126870015,AR
-3126870016,3126874111,VE
+3126853632,3126860415,AR
+3126860416,3126860543,US
+3126860544,3126863999,AR
+3126864000,3126864127,US
+3126864128,3126870015,AR
+3126870016,3126873343,VE
+3126873344,3126873599,PA
+3126873600,3126874111,VE
3126874112,3126878207,CR
3126878208,3126886399,PA
3126886400,3126906879,AR
@@ -89739,12 +94483,13 @@
3130284032,3130286079,DO
3130286080,3130290175,PA
3130290176,3130302463,AR
-3130302464,3130306559,PA
-3130306560,3130310655,CO
+3130302464,3130302975,CY
+3130302976,3130310655,CO
3130312704,3130314751,AR
3130314752,3130315775,CL
3130315776,3130316799,CR
-3130316800,3130318847,CW
+3130316800,3130317823,AW
+3130317824,3130318847,CW
3130318848,3130327039,AR
3130327040,3130458111,DO
3130458112,3130523647,GT
@@ -89755,7 +94500,9 @@
3130982400,3131006975,CO
3131006976,3131011071,BQ
3131011072,3131012095,CO
-3131012096,3131013119,PA
+3131012096,3131012479,PA
+3131012480,3131012607,CR
+3131012608,3131013119,PA
3131013120,3131015167,AR
3131015168,3131047935,CR
3131047936,3131310079,PE
@@ -89765,21 +94512,43 @@
3132096512,3132211199,CR
3132211200,3132227583,AR
3132227584,3132293119,EC
-3132293120,3132298007,HN
+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,3132298007,HN
3132298008,3132298015,US
3132298016,3132298127,HN
3132298128,3132298143,US
-3132298144,3132301727,HN
+3132298144,3132300383,HN
+3132300384,3132300391,US
+3132300392,3132301727,HN
3132301728,3132301743,NL
-3132301744,3132304127,HN
-3132304128,3132304383,US
+3132301744,3132302319,HN
+3132302320,3132302335,NL
+3132302336,3132302975,HN
+3132302976,3132302983,NL
+3132302984,3132303735,HN
+3132303736,3132303743,NL
+3132303744,3132304127,HN
+3132304128,3132304303,US
+3132304304,3132304311,DE
+3132304312,3132304383,US
3132304384,3132304607,HN
3132304608,3132304623,DE
3132304624,3132305143,HN
3132305144,3132305151,NL
-3132305152,3132307823,HN
+3132305152,3132306239,HN
+3132306240,3132306271,DE
+3132306272,3132307823,HN
3132307824,3132307839,US
-3132307840,3132308775,HN
+3132307840,3132308367,HN
+3132308368,3132308375,US
+3132308376,3132308775,HN
3132308776,3132308783,US
3132308784,3132309503,HN
3132309504,3132313599,CR
@@ -89799,7 +94568,9 @@
3132997632,3133014015,AR
3133014016,3133046783,HT
3133046784,3133067263,AR
-3133067264,3133073407,PA
+3133067264,3133071359,PA
+3133071360,3133071871,CY
+3133071872,3133073407,PA
3133073408,3133074431,CW
3133074432,3133075455,CL
3133075456,3133079551,CW
@@ -89813,8 +94584,10 @@
3136985948,3136985951,BR
3136985952,3136986015,AR
3136986016,3136986023,BR
-3136986024,3136986111,AR
-3136986112,3140587519,BR
+3136986024,3136986095,AR
+3136986096,3136986099,BR
+3136986100,3136986107,AR
+3136986108,3140587519,BR
3140599808,3140614143,BR
3140614144,3140616191,CR
3140616192,3145727999,BR
@@ -89998,8 +94771,12 @@
3158852864,3158853119,ES
3158853120,3158853631,NL
3158853632,3158855679,RU
-3158855680,3158857727,US
-3158857728,3158859903,NL
+3158855680,3158856447,NL
+3158856448,3158857471,DE
+3158857472,3158857727,SE
+3158857728,3158859519,NL
+3158859520,3158859775,GB
+3158859776,3158859903,NL
3158859904,3158860031,CZ
3158860032,3158860287,GB
3158860288,3158860543,NL
@@ -90223,8 +95000,8 @@
3161964544,3161980927,ES
3161980928,3161989119,SK
3161989120,3161990143,NL
-3161990144,3161991167,TR
-3161991168,3161993215,NL
+3161990144,3161992191,TR
+3161992192,3161993215,NL
3161993216,3161997311,RU
3161997312,3162005503,DK
3162005504,3162013695,RS
@@ -90316,8 +95093,8 @@
3162682880,3162683135,GB
3162683136,3162683391,ES
3162683392,3162685439,EE
-3162685440,3162701567,RU
-3162701568,3162701823,UZ
+3162685440,3162689535,MD
+3162689536,3162701823,RU
3162701824,3162734591,MD
3162734592,3162767359,RU
3162767360,3162800127,SA
@@ -90386,7 +95163,14 @@
3164925952,3164927999,PL
3164928000,3164930047,NL
3164930048,3164932095,IE
-3164932096,3164932991,FR
+3164932096,3164932719,FR
+3164932720,3164932735,CZ
+3164932736,3164932831,FR
+3164932832,3164932863,IT
+3164932864,3164932879,FR
+3164932880,3164932895,LT
+3164932896,3164932927,FR
+3164932928,3164932991,NL
3164932992,3164933119,GB
3164933120,3164934143,FR
3164934144,3164936191,PL
@@ -90410,7 +95194,11 @@
3164946480,3164946483,ES
3164946484,3164946527,FR
3164946528,3164946559,FI
-3164946560,3164947023,FR
+3164946560,3164946815,FR
+3164946816,3164946879,DE
+3164946880,3164946943,FR
+3164946944,3164947007,IT
+3164947008,3164947023,FR
3164947024,3164947039,FI
3164947040,3164947043,FR
3164947044,3164947047,GB
@@ -90442,11 +95230,13 @@
3164952256,3164952271,ES
3164952272,3164952511,FR
3164952512,3164952527,PT
-3164952528,3164953023,FR
+3164952528,3164953007,FR
+3164953008,3164953023,LT
3164953024,3164953087,IE
3164953088,3164953583,FR
3164953584,3164953599,ES
-3164953600,3164954471,FR
+3164953600,3164954463,FR
+3164954464,3164954471,IT
3164954472,3164954479,IE
3164954480,3164954507,FR
3164954508,3164954511,ES
@@ -90469,7 +95259,9 @@
3164960392,3164960395,GB
3164960396,3164960439,FR
3164960440,3164960443,DE
-3164960444,3164960671,FR
+3164960444,3164960499,FR
+3164960500,3164960503,CZ
+3164960504,3164960671,FR
3164960672,3164960675,ES
3164960676,3164960699,FR
3164960700,3164960703,ES
@@ -90502,7 +95294,9 @@
3164967232,3164967239,ES
3164967240,3164967303,FR
3164967304,3164967307,DE
-3164967308,3164968223,FR
+3164967308,3164967935,FR
+3164967936,3164967967,DE
+3164967968,3164968223,FR
3164968224,3164968255,GB
3164968256,3164968319,FR
3164968320,3164968447,GB
@@ -90522,9 +95316,13 @@
3164970414,3164970415,IT
3164970416,3164970631,FR
3164970632,3164970639,ES
-3164970640,3164970927,FR
+3164970640,3164970719,FR
+3164970720,3164970751,PL
+3164970752,3164970927,FR
3164970928,3164970943,ES
-3164970944,3164971479,FR
+3164970944,3164971011,FR
+3164971012,3164971015,IE
+3164971016,3164971479,FR
3164971480,3164971483,FI
3164971484,3164971579,FR
3164971580,3164971583,ES
@@ -90532,7 +95330,11 @@
3164971616,3164971619,ES
3164971620,3164971807,FR
3164971808,3164971839,ES
-3164971840,3164972735,FR
+3164971840,3164972543,FR
+3164972544,3164972559,IT
+3164972560,3164972599,FR
+3164972600,3164972607,IT
+3164972608,3164972735,FR
3164972736,3164972751,GB
3164972752,3164973407,FR
3164973408,3164973415,GB
@@ -90544,24 +95346,37 @@
3164974336,3164974437,GB
3164974438,3164974438,IT
3164974439,3164974463,GB
-3164974464,3164975199,FR
+3164974464,3164974495,DE
+3164974496,3164975199,FR
3164975200,3164975215,ES
3164975216,3164975311,FR
3164975312,3164975327,ES
-3164975328,3164976027,FR
+3164975328,3164975887,FR
+3164975888,3164975903,IT
+3164975904,3164975991,FR
+3164975992,3164975995,PL
+3164975996,3164976027,FR
3164976028,3164976031,ES
3164976032,3164976143,FR
3164976144,3164976159,BE
3164976160,3164976231,FR
3164976232,3164976239,ES
-3164976240,3164977223,FR
+3164976240,3164976511,FR
+3164976512,3164976527,LT
+3164976528,3164977215,FR
+3164977216,3164977223,NL
3164977224,3164977231,PT
-3164977232,3164977255,FR
+3164977232,3164977239,BE
+3164977240,3164977247,IT
+3164977248,3164977255,CZ
3164977256,3164977263,PT
3164977264,3164977271,FI
-3164977272,3164978079,FR
+3164977272,3164977279,IT
+3164977280,3164978079,FR
3164978080,3164978111,PT
-3164978112,3164978623,FR
+3164978112,3164978155,FR
+3164978156,3164978159,DE
+3164978160,3164978623,FR
3164978624,3164978655,ES
3164978656,3164979151,FR
3164979152,3164979155,ES
@@ -90630,7 +95445,8 @@
3165453056,3165453311,US
3165453312,3165453567,PE
3165453568,3165453823,US
-3165453824,3165454335,AT
+3165453824,3165454079,RO
+3165454080,3165454335,AE
3165454336,3165519871,RO
3165519872,3165585407,DE
3165585408,3165650943,CZ
@@ -90665,7 +95481,9 @@
3166697472,3166699519,RO
3166699520,3166961663,DE
3166961664,3167223807,SI
-3167223808,3167748095,NL
+3167223808,3167694591,NL
+3167694592,3167698943,GB
+3167698944,3167748095,NL
3167748096,3167752959,RO
3167752960,3167753215,IT
3167753216,3167755263,ES
@@ -90701,7 +95519,7 @@
3167799296,3167800319,IR
3167800320,3167801343,MD
3167801344,3167803391,IR
-3167803392,3167804159,RO
+3167803392,3167804159,PL
3167804160,3167804415,ES
3167804416,3167805439,GB
3167805440,3167825919,IR
@@ -90761,7 +95579,7 @@
3168005888,3168006143,NL
3168006144,3168008191,SE
3168008192,3168008447,RO
-3168008448,3168010239,DE
+3168008448,3168010239,US
3168010240,3168011519,MD
3168011520,3168011775,RO
3168011776,3168012287,IR
@@ -90773,7 +95591,9 @@
3168016128,3168016383,GB
3168016384,3168018431,MD
3168018432,3168018687,TR
-3168018688,3168020479,RO
+3168018688,3168018943,RO
+3168018944,3168019455,GB
+3168019456,3168020479,RO
3168020480,3168022527,MD
3168022528,3168035839,IR
3168035840,3168036863,RO
@@ -90930,7 +95750,8 @@
3168239616,3168243711,IR
3168243712,3168247807,RO
3168247808,3168264191,IR
-3168264192,3168265727,RO
+3168264192,3168265215,ES
+3168265216,3168265727,RO
3168265728,3168265855,FR
3168265856,3168265983,RO
3168265984,3168266239,GR
@@ -91006,7 +95827,10 @@
3169862912,3169863167,IT
3169863168,3169863423,MD
3169863424,3169863679,RO
-3169863680,3169864703,BG
+3169863680,3169863935,ES
+3169863936,3169864191,NL
+3169864192,3169864447,FR
+3169864448,3169864703,IE
3169864704,3169866495,RO
3169866496,3169866751,GB
3169866752,3169867775,RO
@@ -91098,7 +95922,11 @@
3170500608,3170631679,PT
3170631680,3170664447,PL
3170664448,3170697215,HR
-3170697216,3170729983,IR
+3170697216,3170722815,IR
+3170722816,3170723839,AU
+3170723840,3170728959,IR
+3170728960,3170729951,AU
+3170729952,3170729983,IR
3170729984,3170762751,AZ
3170762752,3170795519,RU
3170795520,3170828287,BG
@@ -91137,19 +95965,63 @@
3187857408,3187859455,CR
3187859456,3187863551,PA
3187863552,3187908607,AR
-3187910656,3187914751,CL
+3187910656,3187913727,CL
+3187913728,3187913815,PT
+3187913816,3187913823,CL
+3187913824,3187913983,PT
+3187913984,3187914751,CL
3187914752,3187916799,BO
3187916800,3187933183,CO
3187933184,3187933341,GT
3187933342,3187933342,HN
-3187933343,3187944351,GT
+3187933343,3187934079,GT
+3187934080,3187934207,HN
+3187934208,3187935543,GT
+3187935544,3187935551,HN
+3187935552,3187936591,GT
+3187936592,3187936595,HN
+3187936596,3187940631,GT
+3187940632,3187940639,HN
+3187940640,3187940823,GT
+3187940824,3187940831,HN
+3187940832,3187941647,GT
+3187941648,3187941655,HN
+3187941656,3187942271,GT
+3187942272,3187942279,HN
+3187942280,3187942563,GT
+3187942564,3187942567,HN
+3187942568,3187942655,GT
+3187942656,3187942663,HN
+3187942664,3187942975,GT
+3187942976,3187942991,HN
+3187942992,3187943551,GT
+3187943552,3187943687,HN
+3187943688,3187944351,GT
3187944352,3187944359,HN
3187944360,3187944773,GT
3187944774,3187944774,HN
-3187944775,3187948031,GT
-3187948032,3187948159,HN
-3187948160,3187949567,GT
-3187949568,3187950126,BQ
+3187944775,3187944855,GT
+3187944856,3187944859,HN
+3187944860,3187945343,GT
+3187945344,3187945471,HN
+3187945472,3187946687,GT
+3187946688,3187946695,HN
+3187946696,3187946887,GT
+3187946888,3187946895,HN
+3187946896,3187946975,GT
+3187946976,3187946979,HN
+3187946980,3187947999,GT
+3187948000,3187948159,HN
+3187948160,3187948367,GT
+3187948368,3187948375,HN
+3187948376,3187948799,GT
+3187948800,3187948927,HN
+3187948928,3187949115,GT
+3187949116,3187949119,HN
+3187949120,3187949567,GT
+3187949568,3187949816,BQ
+3187949817,3187949817,US
+3187949818,3187950126,BQ
3187950127,3187950127,CW
3187950128,3187953663,BQ
3187953664,3187955711,CL
@@ -91177,13 +96049,23 @@
3188117504,3188121599,AR
3188121600,3188125695,TT
3188125696,3188146175,AR
-3188146176,3188149335,CO
+3188146176,3188147623,CO
+3188147624,3188147631,PE
+3188147632,3188148911,CO
+3188148912,3188148915,PE
+3188148916,3188149335,CO
3188149336,3188149339,PE
-3188149340,3188170751,CO
+3188149340,3188152171,CO
+3188152172,3188152175,PE
+3188152176,3188153015,CO
+3188153016,3188153023,EC
+3188153024,3188154139,CO
+3188154140,3188154143,CL
+3188154144,3188170751,CO
3188170752,3188174847,CR
3188174848,3188178943,BR
3188178944,3188187135,CR
-3188187136,3188199423,AR
+3188187136,3188203519,AR
3188203520,3188207615,DO
3188207616,3188211711,AR
3188211712,3188228095,CL
@@ -91213,9 +96095,13 @@
3188473856,3188482047,PE
3188482048,3188490239,AR
3188490240,3188498431,CO
-3188498432,3188523007,AR
+3188498432,3188511103,AR
+3188511104,3188511231,US
+3188511232,3188523007,AR
3188523008,3188539391,CO
-3188539392,3188543487,CL
+3188539392,3188542207,CL
+3188542208,3188542463,US
+3188542464,3188543487,CL
3188543488,3188545535,PA
3188545536,3188547583,AR
3188547584,3188551679,CO
@@ -91236,7 +96122,9 @@
3188637696,3188645887,PA
3188645888,3188662271,CO
3188662272,3188670463,BR
-3188670464,3188674559,HN
+3188670464,3188671487,HN
+3188671488,3188672511,BS
+3188672512,3188674559,HN
3188674560,3188678655,AR
3188678656,3188686847,BR
3188686848,3188690943,EC
@@ -91260,22 +96148,21 @@
3191095296,3191099391,EC
3191099392,3191103487,AR
3191103488,3191107583,VE
-3191107584,3191108959,PE
+3191107584,3191108271,PE
+3191108272,3191108287,MX
+3191108288,3191108959,PE
3191108960,3191108991,CO
3191108992,3191109119,PE
-3191109120,3191109631,MX
-3191109632,3191111679,PE
+3191109120,3191111167,MX
+3191111168,3191111679,PE
3191111680,3191128063,PY
3191128064,3191132159,EC
3191132160,3191136255,AR
3191136256,3191144447,DO
-3191144448,3191153663,SV
-3191153664,3191154175,NI
-3191154176,3191154687,SV
-3191154688,3191155711,NI
+3191144448,3191152639,SV
+3191152640,3191155711,NI
3191155712,3191156223,SV
-3191156224,3191156479,NI
-3191156480,3191156735,SV
+3191156224,3191156735,NI
3191156736,3191169023,HN
3191169024,3191193599,SV
3191193600,3191209983,HN
@@ -91286,33 +96173,45 @@
3191439360,3191455743,EC
3191455744,3191472127,AR
3191472128,3191603199,TT
-3191603200,3191607295,CO
+3191603200,3191603455,CO
+3191603456,3191603519,GT
+3191603520,3191603647,CO
+3191603648,3191603711,SV
+3191603712,3191607295,CO
3191607296,3191607551,MX
3191607552,3191610111,CO
3191610112,3191610367,PE
-3191610368,3191611391,CO
+3191610368,3191610879,CO
+3191610880,3191611135,PE
+3191611136,3191611391,CO
3191611392,3191619583,VE
3191619584,3191619903,CO
3191619904,3191619935,VE
3191619936,3191635967,CO
3191635968,3191652351,AR
-3191652352,3191673281,CO
+3191652352,3191670783,CO
+3191670784,3191672831,CL
+3191672832,3191673281,CO
3191673282,3191673282,EC
-3191673283,3191693311,CO
+3191673283,3191673343,CO
+3191673344,3191674879,CL
+3191674880,3191693311,CO
3191693312,3191701503,AR
3191701504,3191709695,CO
3191709696,3191709951,BR
3191709952,3191714815,CO
3191714816,3191715071,AR
3191715072,3191719935,CO
-3191719936,3191719999,AR
-3191720000,3191720959,CO
+3191719936,3191720015,AR
+3191720016,3191720959,CO
3191720960,3191721471,AR
3191721472,3191721983,CO
3191721984,3191722495,AR
3191722496,3191724799,CO
3191724800,3191725311,AR
-3191725312,3191734271,CO
+3191725312,3191732735,CO
+3191732736,3191732991,AR
+3191732992,3191734271,CO
3191734272,3191799807,SV
3191799808,3191865343,EC
3191865344,3191930879,UY
@@ -91330,20 +96229,39 @@
3193575168,3193575295,PE
3193575296,3193575311,CO
3193575312,3193575327,PE
-3193575328,3193590655,CO
-3193590656,3193590783,EC
-3193590784,3193595391,CO
+3193575328,3193579263,CO
+3193579264,3193579391,EC
+3193579392,3193582847,CO
+3193582848,3193583103,EC
+3193583104,3193590527,CO
+3193590528,3193590783,EC
+3193590784,3193591807,CO
+3193591808,3193592063,EC
+3193592064,3193592319,CO
+3193592320,3193592575,EC
+3193592576,3193595391,CO
3193595392,3193595647,EC
-3193595648,3193606527,CO
-3193606528,3193606655,EC
-3193606656,3193618431,CO
+3193595648,3193599743,CO
+3193599744,3193599999,EC
+3193600000,3193604575,CO
+3193604576,3193604607,EC
+3193604608,3193606527,CO
+3193606528,3193606911,EC
+3193606912,3193617151,CO
+3193617152,3193617407,EC
+3193617408,3193618431,CO
3193618432,3193618559,US
3193618560,3193618943,CO
3193618944,3193619071,EC
-3193619072,3193625599,CO
+3193619072,3193621887,CO
+3193621888,3193622271,EC
+3193622272,3193623295,CO
+3193623296,3193623551,EC
+3193623552,3193624063,CO
+3193624064,3193624575,EC
+3193624576,3193625599,CO
3193625600,3193625855,EC
-3193625856,3193626367,CO
-3193626368,3193626623,US
+3193625856,3193626623,US
3193626624,3193628671,CO
3193628672,3193629183,EC
3193629184,3193631103,CO
@@ -91354,9 +96272,37 @@
3193700352,3193724927,HN
3193724928,3193729023,AR
3193729024,3193733119,CU
-3193733120,3193740543,AR
-3193740544,3193740799,US
-3193740800,3193765887,AR
+3193733120,3193735679,AR
+3193735680,3193735935,US
+3193735936,3193736447,AR
+3193736448,3193736959,US
+3193736960,3193738239,AR
+3193738240,3193739007,US
+3193739008,3193739519,AR
+3193739520,3193739775,US
+3193739776,3193740287,AR
+3193740288,3193741055,US
+3193741056,3193741311,AR
+3193741312,3193741823,US
+3193741824,3193743871,AR
+3193743872,3193743999,US
+3193744000,3193744895,AR
+3193744896,3193745151,US
+3193745152,3193745279,AR
+3193745280,3193745407,US
+3193745408,3193749503,AR
+3193749504,3193749759,US
+3193749760,3193750527,AR
+3193750528,3193750783,US
+3193750784,3193751295,AR
+3193751296,3193751551,US
+3193751552,3193752063,AR
+3193752064,3193752575,US
+3193752576,3193754111,AR
+3193754112,3193754239,US
+3193754240,3193755007,AR
+3193755008,3193755135,US
+3193755136,3193765887,AR
3193765888,3193774079,TT
3193775104,3193776127,GY
3193776128,3193777151,AR
@@ -91364,13 +96310,14 @@
3193778176,3193782271,AR
3193782272,3193798655,TT
3193798656,3193806847,CO
-3193806848,3193810943,CR
+3193806848,3193808895,CR
+3193808896,3193809663,US
+3193809664,3193810943,CR
3193810944,3193811967,PY
3193815040,3193823231,AR
3193823232,3193827327,CL
3193827328,3193828351,CR
-3193828352,3193828863,US
-3193828864,3193831423,CR
+3193829376,3193831423,CR
3193831424,3193864191,DO
3193864192,3193872383,EC
3193872384,3193880575,AR
@@ -91393,21 +96340,34 @@
3194077184,3194085375,CO
3194085376,3194093567,VE
3194093568,3194126335,SR
-3194126336,3194128383,AR
+3194126336,3194126591,AR
+3194126592,3194126847,NL
+3194126848,3194126911,AR
+3194126912,3194126975,PE
+3194126976,3194128127,AR
+3194128128,3194128383,BR
3194128384,3194129407,NI
3194129408,3194129663,AR
3194129664,3194129671,BR
-3194129672,3194130047,AR
+3194129672,3194129919,AR
+3194129920,3194130047,BR
3194130048,3194130175,CO
-3194130176,3194130303,AR
+3194130176,3194130303,CL
3194130304,3194130431,BR
-3194130432,3194135551,AR
+3194130432,3194130943,AR
+3194130944,3194131455,BR
+3194131456,3194132991,AR
+3194132992,3194133247,CL
+3194133248,3194135551,AR
3194135552,3194136063,BR
-3194136064,3194136575,AR
+3194136064,3194136319,AR
+3194136320,3194136447,CO
+3194136448,3194136575,AR
3194136576,3194137087,BR
-3194137088,3194139903,AR
-3194139904,3194140159,BR
-3194140160,3194142719,AR
+3194137088,3194139647,AR
+3194139648,3194140159,BR
+3194140160,3194140671,AR
+3194140672,3194142719,CR
3194142720,3194159103,CL
3194159104,3194165247,HN
3194165248,3194175487,SV
@@ -91427,8 +96387,9 @@
3194368000,3194370047,BO
3194370048,3194372095,PA
3194372096,3194380287,HT
-3194380288,3194384383,US
-3194384384,3194388479,BZ
+3194380288,3194381311,US
+3194381312,3194382335,CA
+3194382336,3194388479,US
3194388480,3194396671,PE
3194396672,3194413055,CO
3194413056,3194421247,CL
@@ -91438,7 +96399,11 @@
3194441728,3194445823,AR
3194445824,3194449031,CO
3194449032,3194449047,CL
-3194449048,3194454015,CO
+3194449048,3194449175,CO
+3194449176,3194449183,PE
+3194449184,3194452375,CO
+3194452376,3194452383,PE
+3194452384,3194454015,CO
3194454016,3194458111,AR
3194458112,3194462207,CL
3194462208,3194466303,BR
@@ -91462,7 +96427,7 @@
3194596352,3194597375,HT
3194597376,3194601471,AR
3194601472,3194602495,CW
-3194603520,3194610943,AR
+3194602496,3194610943,AR
3194610944,3194611199,CO
3194611200,3194613503,AR
3194613504,3194613759,CL
@@ -91499,7 +96464,10 @@
3194757120,3194765311,AR
3194765312,3194767359,EC
3194767360,3194768383,CR
-3194769408,3194773503,PE
+3194768384,3194769407,AR
+3194769408,3194771583,PE
+3194771584,3194771591,US
+3194771592,3194773503,PE
3194773504,3194781695,BR
3194781696,3194798079,CL
3194798080,3194799103,AR
@@ -91522,8 +96490,12 @@
3194925056,3194929151,AR
3194929152,3194937343,EC
3194937344,3194945535,AR
-3194945536,3194953727,GT
-3194953728,3194961919,AR
+3194945536,3194953471,GT
+3194953472,3194953599,NI
+3194953600,3194953727,GT
+3194953728,3194961407,AR
+3194961408,3194961663,US
+3194961664,3194961919,AR
3194961920,3194970111,EC
3194974208,3194976255,AR
3194976256,3194977279,VE
@@ -91556,12 +96528,14 @@
3195138048,3195139071,DO
3195139072,3195140095,CL
3195140096,3195142143,CR
-3195142144,3195142783,PA
-3195142784,3195142911,VE
+3195142144,3195142655,PA
+3195142656,3195142911,VE
3195142912,3195143039,EC
3195143040,3195143167,UY
3195143168,3195143295,GT
-3195143296,3195150335,PA
+3195143296,3195144447,PA
+3195144448,3195144703,CR
+3195144704,3195150335,PA
3195150336,3195158527,CL
3195158528,3195199487,AR
3195199488,3195201535,PY
@@ -91569,7 +96543,9 @@
3195203584,3195205631,VE
3195205632,3195206655,PE
3195206656,3195207679,CL
-3195207680,3195211775,GT
+3195207680,3195209687,GT
+3195209688,3195209695,PR
+3195209696,3195211775,GT
3195211776,3195214988,BZ
3195214989,3195214989,RU
3195214990,3195215871,BZ
@@ -91589,7 +96565,7 @@
3195576320,3195580415,CL
3195580416,3195584511,AR
3195584512,3195592703,HT
-3195596391,3195596391,PA
+3195592704,3195596799,PA
3195596800,3195597823,CR
3195597824,3195598847,AR
3195598848,3195600895,VE
@@ -91626,16 +96602,44 @@
3195764736,3195768831,CR
3195768832,3195772927,AR
3195772928,3195781119,VE
-3195781120,3195785215,BR
-3195785216,3195785407,HN
-3195785408,3195785439,DE
+3195781120,3195783167,PA
+3195783168,3195784191,BR
+3195784192,3195785215,PA
+3195785216,3195785311,HN
+3195785312,3195785343,CA
+3195785344,3195785375,HN
+3195785376,3195785439,DE
3195785440,3195785735,HN
3195785736,3195785743,GB
-3195785744,3195786239,HN
+3195785744,3195785815,HN
+3195785816,3195785823,DE
+3195785824,3195786015,HN
+3195786016,3195786023,ES
+3195786024,3195786191,HN
+3195786192,3195786199,US
+3195786200,3195786239,HN
3195786240,3195786287,US
3195786288,3195786295,ES
-3195786296,3195786751,US
-3195786752,3195789311,HN
+3195786296,3195786479,US
+3195786480,3195786487,CA
+3195786488,3195786751,US
+3195786752,3195787127,HN
+3195787128,3195787135,DE
+3195787136,3195787215,HN
+3195787216,3195787231,US
+3195787232,3195787263,HN
+3195787264,3195787607,US
+3195787608,3195787615,DE
+3195787616,3195787775,US
+3195787776,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
3195789312,3195793407,PA
3195793408,3195801599,AR
3195801600,3195803647,HN
@@ -91643,7 +96647,13 @@
3195804672,3195805695,VE
3195805696,3195807743,NI
3195807744,3195807871,US
-3195807872,3195809791,BZ
+3195807872,3195808383,BZ
+3195808384,3195808639,US
+3195808640,3195808767,BZ
+3195808768,3195808895,US
+3195808896,3195809407,BZ
+3195809408,3195809535,US
+3195809536,3195809791,BZ
3195809792,3195811839,PE
3195811840,3195813887,AR
3195813888,3195822079,DO
@@ -91656,7 +96666,7 @@
3195852800,3195853823,SX
3195853824,3195854847,GY
3195854848,3195859967,AR
-3195860992,3195862015,CR
+3195859968,3195862015,CR
3195863040,3196092415,CO
3196092416,3196125183,PY
3196125184,3196190719,BO
@@ -91710,7 +96720,8 @@
3199729664,3199762431,NI
3199762432,3199778815,CO
3199778816,3199779839,AR
-3199779840,3199780863,CR
+3199779840,3199780735,CR
+3199780736,3199780863,US
3199780864,3199782911,CO
3199782912,3199784959,AR
3199784960,3199785983,EC
@@ -91728,7 +96739,8 @@
3200565248,3200569343,HT
3200569344,3200573439,CL
3200573440,3200577535,AR
-3200577536,3200579583,BR
+3200577536,3200578559,BR
+3200578560,3200579583,EC
3200579584,3200581631,AR
3200581632,3200614399,BZ
3200614400,3200647167,AR
@@ -91759,110 +96771,93 @@
3201630208,3201695743,TT
3201695744,3201761279,EC
3201761280,3201826815,CL
-3201826816,3201851863,AR
-3201851864,3201851867,EC
-3201851868,3201852519,AR
-3201852520,3201852527,EC
-3201852528,3201854143,AR
-3201854144,3201854151,EC
-3201854152,3201854463,AR
-3201854464,3201854975,EC
-3201854976,3201855295,AR
-3201855296,3201855311,EC
-3201855312,3201855487,AR
+3201826816,3201851391,AR
+3201851392,3201855487,EC
3201855488,3201859583,PE
3201859584,3201863679,CO
-3201863680,3201864633,AR
-3201864634,3201864634,CL
-3201864635,3201865215,AR
-3201865216,3201865471,CL
-3201865472,3201866607,AR
-3201866608,3201866623,CO
-3201866624,3201866863,AR
-3201866864,3201866871,CO
-3201866872,3201867775,AR
-3201867776,3201869823,PE
-3201869824,3201870911,AR
-3201870912,3201870943,PE
-3201870944,3201872739,AR
-3201872740,3201872740,PE
-3201872741,3201872767,AR
-3201872768,3201872799,PE
-3201872800,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
+3201863680,3201865727,CL
+3201865728,3201867775,CO
+3201867776,3201869831,PE
+3201869832,3201870495,AR
+3201870496,3201870527,PE
+3201870528,3201870815,AR
+3201870816,3201870831,PE
+3201870832,3201870911,AR
+3201870912,3201870959,PE
+3201870960,3201870975,AR
+3201870976,3201871615,PE
+3201871616,3201871695,AR
+3201871696,3201871703,PE
+3201871704,3201871823,AR
+3201871824,3201871839,PE
+3201871840,3201871871,AR
+3201871872,3201875967,PE
+3201875968,3201880063,CO
3201880064,3201884159,EC
-3201884160,3201888511,VE
-3201888512,3201889279,AR
+3201884160,3201889279,VE
3201889280,3201889535,US
-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
+3201889536,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,3201908223,AR
-3201908224,3201908735,CO
+3201904640,3201908735,CO
3201908736,3201916927,AR
3201916928,3201917183,CO
3201917184,3201917527,AR
3201917528,3201917535,CO
-3201917536,3201918795,AR
-3201918796,3201918799,CO
-3201918800,3201918975,AR
-3201918976,3201920063,CO
-3201920064,3201925119,AR
+3201917536,3201917859,AR
+3201917860,3201917863,CO
+3201917864,3201917951,AR
+3201917952,3201920063,CO
+3201920064,3201920064,AR
+3201920065,3201920068,CO
+3201920069,3201925119,AR
3201925120,3201957887,CL
3201957888,3202088959,PA
-3202088960,3202220031,AR
+3202088960,3202127999,AR
+3202128000,3202128015,CW
+3202128016,3202220031,AR
3202220032,3202351103,PE
3202351104,3202875391,AR
3202875392,3203399679,PE
3203399680,3203465215,CO
3203465216,3203530751,CR
-3203530752,3203536895,CO
+3203530752,3203531519,CO
+3203531520,3203531775,PA
+3203531776,3203532799,CO
+3203532800,3203534847,PA
+3203534848,3203535871,CO
+3203535872,3203536383,PA
+3203536384,3203536895,CO
3203536896,3203537919,HN
-3203537920,3203538943,CO
+3203537920,3203538431,GT
+3203538432,3203538687,PA
+3203538688,3203538943,CO
3203538944,3203539967,BZ
3203539968,3203543551,CO
3203543552,3203544575,GT
-3203544576,3203548927,CO
-3203548928,3203549183,PA
-3203549184,3203562239,CO
-3203562240,3203562495,SV
+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,3203561983,CO
+3203561984,3203562495,SV
3203562496,3203564543,CO
3203564544,3203565055,DO
-3203565056,3203565567,CR
-3203565568,3203566591,CO
+3203565056,3203566079,CR
+3203566080,3203566591,CO
3203566592,3203566847,PA
-3203566848,3203568639,CO
+3203566848,3203567103,DO
+3203567104,3203568639,CO
3203568640,3203569663,SV
3203569664,3203570303,CO
3203570304,3203570431,SV
3203570432,3203570687,CR
-3203570688,3203661823,CO
+3203570688,3203571967,CO
+3203571968,3203572223,SV
+3203572224,3203661823,CO
3203661824,3203923967,AR
3203923968,3204448255,CO
3204448256,3208642559,BR
@@ -91900,20 +96895,22 @@
3210743552,3210743567,TH
3210743568,3210743615,BR
3210743616,3210743679,FR
-3210743680,3210743807,CL
+3210743680,3210743807,BR
3210743808,3210744063,US
3210744064,3210744079,TR
-3210744080,3210744127,BR
+3210744080,3210744087,BR
+3210744088,3210744095,CL
+3210744096,3210744127,BR
3210744128,3210744191,FR
-3210744192,3210744319,BR
+3210744192,3210744255,US
+3210744256,3210744319,BR
3210744320,3210744575,US
3210744576,3210744591,BE
3210744592,3210744607,BR
-3210744608,3210744831,CL
+3210744608,3210744703,CL
+3210744704,3210744831,US
3210744832,3210744863,NZ
-3210744864,3210744895,IS
-3210744896,3210744959,CL
-3210744960,3210745087,BR
+3210744864,3210745087,BR
3210745088,3210745343,US
3210745344,3210745359,RU
3210745360,3210745375,BR
@@ -91922,7 +96919,8 @@
3210745472,3210745599,DE
3210745600,3210745855,US
3210745856,3210745871,IT
-3210745872,3210746047,CL
+3210745872,3210745919,CL
+3210745920,3210746047,US
3210746048,3210746111,BR
3210746112,3210746367,US
3210746368,3210746383,SE
@@ -91934,16 +96932,17 @@
3210747136,3210748159,US
3210748160,3210748175,JP
3210748176,3210748191,BR
-3210748192,3210748351,CL
+3210748192,3210748287,CL
+3210748288,3210748351,US
3210748352,3210748415,BR
3210748416,3210748671,GB
-3210748672,3210749439,CL
-3210749440,3210752255,US
-3210752256,3210752511,CL
+3210748672,3210748927,CL
+3210748928,3210752255,US
+3210752256,3210752511,SG
3210752512,3210755839,US
3210755840,3210755855,MY
3210755856,3210756095,BR
-3210756096,3210756351,CL
+3210756096,3210756351,SG
3210756352,3210756607,US
3210756608,3210756863,DE
3210756864,3210757119,RU
@@ -91958,8 +96957,8 @@
3210764096,3210764287,BR
3210764288,3210765055,US
3210765056,3210765071,SE
-3210765072,3210765087,BR
-3210765088,3210765567,CL
+3210765072,3210765311,BR
+3210765312,3210765567,CL
3210765568,3210765823,US
3210765824,3210766079,ES
3210766080,3210766335,CL
@@ -91985,17 +96984,16 @@
3210772736,3210773247,US
3210773248,3210773503,MY
3210773504,3210773519,PL
-3210773520,3210773535,BR
-3210773536,3210773759,CL
+3210773520,3210773759,BR
3210773760,3210774271,US
3210774272,3210774287,NO
-3210774288,3210774303,BR
-3210774304,3210774527,CL
+3210774288,3210774399,BR
+3210774400,3210774527,CL
3210774528,3210774783,US
3210774784,3210774799,IT
3210774800,3210774815,BR
-3210774816,3210774911,CL
-3210774912,3210775039,BR
+3210774816,3210774847,CL
+3210774848,3210775039,BR
3210775040,3210775295,US
3210775296,3210775311,CH
3210775312,3210775327,BR
@@ -92034,7 +97032,7 @@
3210784528,3210784575,CL
3210784576,3210784767,BR
3210784768,3210785791,US
-3210785792,3210786047,CL
+3210785792,3210786047,BR
3210786048,3210786063,AU
3210786064,3210786111,CL
3210786112,3210786303,BR
@@ -92046,15 +97044,11 @@
3210786688,3210787071,CL
3210787072,3210788863,US
3210788864,3210789119,HR
-3210789120,3210791935,US
-3210791936,3210792447,CL
-3210792448,3210792959,US
+3210789120,3210792959,US
3210792960,3210793471,GB
3210793472,3210795007,US
3210795008,3210796031,IL
-3210796032,3210798079,US
-3210798080,3210798591,CL
-3210798592,3210798847,US
+3210796032,3210798847,US
3210798848,3210799103,ES
3210799104,3210802431,US
3210802432,3210802687,ES
@@ -92065,8 +97059,7 @@
3210803072,3210803087,US
3210803088,3210803199,CL
3210803200,3210803201,US
-3210803202,3210803327,CL
-3210803328,3210803455,BR
+3210803202,3210803455,BR
3210803456,3210803711,RU
3210803712,3210804479,DE
3210804480,3210805247,US
@@ -92085,7 +97078,11 @@
3210831872,3210832895,DO
3210832896,3210835967,AR
3210835968,3210838015,PY
-3210838016,3210870783,AR
+3210838016,3210868735,AR
+3210868736,3210869759,US
+3210869760,3210870271,AR
+3210870272,3210870527,US
+3210870528,3210870783,AR
3210870784,3210903551,CO
3210903552,3210919935,PE
3210919936,3210920959,GT
@@ -92116,16 +97113,16 @@
3211075072,3211075325,DK
3211075326,3211075326,CL
3211075327,3211075327,DK
-3211075328,3211075583,CL
+3211075328,3211075583,NL
3211075584,3211076095,US
3211076096,3211076607,LT
3211076608,3211079935,US
3211079936,3211080191,NG
3211080192,3211080703,US
3211080704,3211080959,GB
-3211080960,3211081215,CL
+3211080960,3211081215,IQ
3211081216,3211081727,CH
-3211081728,3211082239,US
+3211081728,3211082239,HK
3211082240,3211082495,BN
3211082496,3211082751,GB
3211082752,3211083007,SG
@@ -92135,10 +97132,9 @@
3211083776,3211083791,RU
3211083792,3211083839,CL
3211083840,3211083855,GB
-3211083856,3211083871,DE
-3211083872,3211083903,CL
+3211083856,3211083903,DE
3211083904,3211084031,FR
-3211084032,3211084287,CL
+3211084032,3211084287,DE
3211084288,3211084303,NL
3211084304,3211084351,CL
3211084352,3211084367,GB
@@ -92160,12 +97156,9 @@
3211085600,3211085695,CL
3211085696,3211085823,GE
3211085824,3211085839,TH
-3211085840,3211085887,CL
+3211085840,3211085887,DE
3211085888,3211085903,GB
-3211085904,3211085919,DE
-3211085920,3211086095,CL
-3211086096,3211086111,DE
-3211086112,3211086335,CL
+3211085904,3211086335,DE
3211086336,3211086351,FR
3211086352,3211086367,DE
3211086368,3211086463,CL
@@ -92232,9 +97225,7 @@
3211097216,3211097343,GB
3211097344,3211097599,DE
3211097600,3211097855,US
-3211097856,3211097871,CL
-3211097872,3211097887,DE
-3211097888,3211098111,CL
+3211097856,3211098111,DE
3211098112,3211098367,US
3211098368,3211098383,CL
3211098384,3211098399,DE
@@ -92249,7 +97240,7 @@
3211099776,3211099903,GB
3211099904,3211100159,DE
3211100160,3211101951,US
-3211101952,3211102207,CL
+3211101952,3211102207,SG
3211102208,3211102335,AU
3211102336,3211102463,BR
3211102464,3211102591,AU
@@ -92267,10 +97258,15 @@
3211105792,3211106303,ES
3211106304,3211109375,US
3211109376,3211109887,DE
-3211109888,3211111423,US
+3211109888,3211111205,US
+3211111206,3211111206,KR
+3211111207,3211111242,US
+3211111243,3211111243,KR
+3211111244,3211111423,US
3211111424,3211112447,JP
3211112448,3211112959,US
-3211112960,3211113471,CL
+3211112960,3211113215,CL
+3211113216,3211113471,SG
3211113472,3211113727,GB
3211113728,3211113983,LT
3211113984,3211114239,US
@@ -92288,7 +97284,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
@@ -92305,21 +97302,75 @@
3211148288,3211165695,CO
3211165696,3211165727,HN
3211165728,3211165735,UY
-3211165736,3211166559,HN
+3211165736,3211165951,HN
+3211165952,3211165983,UY
+3211165984,3211166415,HN
+3211166416,3211166431,UY
+3211166432,3211166559,HN
3211166560,3211166567,UY
-3211166568,3211171071,HN
+3211166568,3211167487,HN
+3211167488,3211167503,US
+3211167504,3211167519,HN
+3211167520,3211167527,US
+3211167528,3211167927,HN
+3211167928,3211167935,US
+3211167936,3211168767,HN
+3211168768,3211169023,US
+3211169024,3211169279,HN
+3211169280,3211169535,US
+3211169536,3211171071,HN
3211171072,3211171327,US
-3211171328,3211172671,HN
+3211171328,3211171487,HN
+3211171488,3211171503,ES
+3211171504,3211171511,HN
+3211171512,3211171519,ES
+3211171520,3211171791,HN
+3211171792,3211171807,ES
+3211171808,3211171839,HN
+3211171840,3211172047,US
+3211172048,3211172063,NL
+3211172064,3211172271,US
+3211172272,3211172279,NL
+3211172280,3211172351,US
+3211172352,3211172671,HN
3211172672,3211172687,NL
-3211172688,3211178583,HN
+3211172688,3211173183,HN
+3211173184,3211173199,NL
+3211173200,3211173279,HN
+3211173280,3211173295,NL
+3211173296,3211174183,HN
+3211174184,3211174191,CA
+3211174192,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
3211178584,3211178591,ES
-3211178592,3211179087,HN
+3211178592,3211178671,HN
+3211178672,3211178703,ES
+3211178704,3211179087,HN
3211179088,3211179103,US
-3211179104,3211179215,HN
-3211179216,3211179231,US
-3211179232,3211180687,HN
+3211179104,3211179199,HN
+3211179200,3211179231,US
+3211179232,3211180103,HN
+3211180104,3211180111,BR
+3211180112,3211180687,HN
3211180688,3211180695,BR
-3211180696,3211181439,HN
+3211180696,3211180887,HN
+3211180888,3211180895,CR
+3211180896,3211181119,HN
+3211181120,3211181135,CR
+3211181136,3211181215,HN
+3211181216,3211181231,CR
+3211181232,3211181439,HN
3211181440,3211181447,CA
3211181448,3211182079,HN
3211182080,3211194367,CO
@@ -92350,7 +97401,9 @@
3219687680,3219687935,US
3219687936,3219688447,IE
3219688448,3219688703,HK
-3219688704,3219726335,BR
+3219688704,3219720191,BR
+3219720192,3219724287,US
+3219724288,3219726335,BR
3219726336,3219734527,JP
3219734528,3219750911,NL
3219750912,3219755007,BR
@@ -92367,7 +97420,8 @@
3219791872,3219800063,US
3219800064,3219800575,BR
3219800576,3219800591,US
-3219800592,3219800703,BR
+3219800592,3219800607,IE
+3219800608,3219800703,BR
3219800704,3219800847,US
3219800848,3219802148,BR
3219802149,3219802149,US
@@ -92488,11 +97542,12 @@
3221605376,3221605887,CA
3221605888,3221608447,US
3221608448,3221608703,AU
-3221608704,3221614335,US
+3221608704,3221609119,US
+3221609120,3221609151,CH
+3221609152,3221614335,US
3221614336,3221614591,GB
3221614592,3221614847,AU
-3221614848,3221616269,US
-3221616271,3221618175,US
+3221614848,3221618175,US
3221618176,3221618431,GB
3221618432,3221618687,US
3221618688,3221618943,GB
@@ -92500,8 +97555,7 @@
3221647104,3221647359,FR
3221647360,3221656831,US
3221656832,3221657087,AU
-3221657088,3221664255,US
-3221664512,3221757951,US
+3221657088,3221757951,US
3221757952,3221759999,MY
3221760000,3221761023,IN
3221761024,3221779455,US
@@ -92514,10 +97568,7 @@
3221796352,3221796607,IN
3221796608,3221796863,US
3221796864,3221815295,IN
-3221815296,3221843967,US
-3221844224,3221993727,US
-3221993984,3222003967,US
-3222004224,3222011903,US
+3221815296,3222011903,US
3222011904,3222012159,CA
3222012160,3222012415,GB
3222012416,3222023935,US
@@ -92587,31 +97638,20 @@
3222320896,3222326015,NL
3222326016,3222326527,US
3222326528,3222339583,CA
-3222339584,3222406143,US
-3222406400,3222407167,US
-3222407424,3222409471,US
-3222409728,3222455039,US
+3222339584,3222455039,US
3222455040,3222455295,NL
-3222455296,3222466559,US
-3222466816,3222524159,US
+3222455296,3222524159,US
3222524160,3222524415,JP
3222524416,3222524927,SG
3222524928,3222525183,US
3222525184,3222525439,DE
-3222525440,3222599167,US
-3222599424,3222600447,US
-3222600704,3222741759,US
-3222742016,3222775807,US
-3222776064,3222806527,US
+3222525440,3222806527,US
3222806528,3222814719,CA
-3222814720,3222868735,US
-3222868992,3222872319,US
+3222814720,3222872319,US
3222872320,3222872575,CA
-3222872576,3222874623,US
-3222874880,3222875647,US
+3222872576,3222875647,US
3222875648,3222875903,SG
-3222875904,3222876159,US
-3222876416,3222890751,US
+3222875904,3222890751,US
3222890752,3222891007,CA
3222891008,3222936575,US
3222936576,3222940927,CH
@@ -92620,7 +97660,7 @@
3222941696,3222952703,US
3222952704,3222952959,JP
3222952960,3222953215,US
-3222953216,3222953727,JP
+3222953216,3222953727,AU
3222953728,3222953983,US
3222953984,3222954239,JP
3222954240,3222956287,US
@@ -92642,8 +97682,7 @@
3222989824,3222990079,PT
3222990080,3222990591,AT
3222990592,3222990847,PT
-3222990848,3223077119,US
-3223077376,3223091199,US
+3222990848,3223091199,US
3223091200,3223092223,AU
3223092224,3223094271,GB
3223094272,3223201791,US
@@ -92881,7 +97920,6 @@
3223857152,3223863807,US
3223863808,3223864319,CA
3223864320,3223864575,US
-3223864576,3223864831,GB
3223864832,3223865343,HR
3223865344,3223867391,FI
3223867392,3223867647,GB
@@ -93006,9 +98044,7 @@
3224170496,3224173567,SE
3224173568,3224258047,US
3224258048,3224258303,FI
-3224258304,3224288255,US
-3224288256,3224289023,DE
-3224289024,3224302335,US
+3224258304,3224302335,US
3224302336,3224302591,CA
3224302592,3224305663,US
3224305664,3224367615,JP
@@ -93126,8 +98162,7 @@
3224834048,3224834303,SG
3224834304,3224834559,US
3224834560,3224834815,TH
-3224834816,3224839423,US
-3224839680,3224850175,US
+3224834816,3224850175,US
3224850176,3224850431,IN
3224850432,3224851455,US
3224851456,3224851711,NL
@@ -93153,8 +98188,7 @@
3224863232,3224863487,CA
3224863488,3224863743,US
3224863744,3224863999,GB
-3224864000,3224870143,US
-3224870400,3224878079,US
+3224864000,3224878079,US
3224878080,3224878335,NL
3224878336,3224878591,US
3224878592,3224878847,AU
@@ -93205,7 +98239,8 @@
3225057792,3225060607,US
3225060608,3225061631,AU
3225061632,3225062399,US
-3225062400,3225063423,VC
+3225062400,3225062911,VC
+3225062912,3225063423,LC
3225063424,3225076223,US
3225076224,3225076479,CA
3225076480,3225076991,US
@@ -93219,8 +98254,7 @@
3225085184,3225085439,ES
3225085440,3225089279,US
3225089280,3225089535,CA
-3225089536,3225090047,US
-3225090304,3225314303,US
+3225089536,3225314303,US
3225314304,3225314559,GB
3225314560,3225420799,US
3225420800,3225423871,CA
@@ -93230,7 +98264,7 @@
3225427456,3225427967,CA
3225427968,3225428991,US
3225428992,3225431039,CA
-3225431040,3225431551,CZ
+3225431040,3225431551,GB
3225431552,3225434111,US
3225434112,3225436159,CA
3225436160,3225445375,US
@@ -93525,8 +98559,7 @@
3225941248,3225941503,IT
3225941504,3225941759,SE
3225941760,3225942015,AT
-3225942016,3225942038,SE
-3225942040,3225942271,SE
+3225942016,3225942271,SE
3225942272,3225942527,BE
3225942528,3225943295,SE
3225943296,3225943551,US
@@ -93678,8 +98711,7 @@
3226576896,3226578943,CA
3226578944,3226580479,US
3226580480,3226581247,FI
-3226581248,3226583295,US
-3226583296,3226583551,CA
+3226581248,3226583551,US
3226583552,3226583807,SE
3226583808,3226590207,US
3226590208,3226591231,NL
@@ -93743,6 +98775,7 @@
3226716672,3226716927,GB
3226716928,3226718207,US
3226718208,3226719231,ZA
+3226719232,3226720255,KE
3226720768,3226721279,JP
3226721280,3226722047,US
3226722048,3226722303,NL
@@ -93824,6 +98857,7 @@
3226800640,3226811391,US
3226811392,3226811647,DE
3226811648,3226824191,US
+3226824192,3226824447,DE
3226824448,3226861823,US
3226861824,3226862079,CA
3226862080,3226864383,US
@@ -93890,8 +98924,7 @@
3227026176,3227026687,US
3227026688,3227026943,GB
3227026944,3227027455,CA
-3227027456,3227035135,US
-3227035648,3227040511,US
+3227027456,3227040511,US
3227040512,3227040767,AU
3227040768,3227041279,US
3227041280,3227041535,NZ
@@ -93899,16 +98932,14 @@
3227042816,3227043071,IT
3227043072,3227044863,US
3227044864,3227045119,PL
-3227045120,3227051519,US
-3227051776,3227053567,US
+3227045120,3227053567,US
3227053568,3227053823,GB
3227053824,3227054079,DE
3227054080,3227056639,US
3227056640,3227057919,PT
3227057920,3227058175,US
3227058176,3227123711,FI
-3227123712,3227204617,US
-3227204620,3227208191,US
+3227123712,3227208191,US
3227208192,3227208447,JP
3227208448,3227225087,US
3227225088,3227225599,LU
@@ -93940,6 +98971,7 @@
3227274752,3227276799,US
3227276800,3227277055,FR
3227277056,3227278847,US
+3227278848,3227279103,NL
3227279104,3227281407,US
3227281408,3227282175,IT
3227282176,3227282431,US
@@ -93980,8 +99012,7 @@
3227392000,3227392255,PT
3227392256,3227393023,US
3227393024,3227393279,AT
-3227393280,3227393791,US
-3227394048,3227396351,US
+3227393280,3227396351,US
3227396352,3227396607,AU
3227396608,3227398399,US
3227398400,3227398655,CA
@@ -94076,10 +99107,12 @@
3227468288,3227468799,CA
3227468800,3227484159,US
3227484160,3227517183,CA
-3227517184,3227521279,ZA
+3227517184,3227520767,ZA
+3227520768,3227521023,MU
+3227521024,3227521279,ZA
3227521280,3227521791,US
-3227521792,3227522559,ZA
-3227522560,3227522815,MU
+3227521792,3227522047,ZA
+3227522048,3227522815,MU
3227522816,3227523071,US
3227523072,3227525119,ZA
3227525120,3227525375,MU
@@ -94128,16 +99161,16 @@
3227559936,3227562239,US
3227562240,3227566079,ZA
3227566080,3227566335,US
-3227566336,3227566847,MU
-3227566848,3227568127,ZA
-3227568128,3227569919,US
-3227569920,3227570175,LT
-3227570176,3227574271,US
+3227566336,3227566591,MU
+3227566592,3227568127,ZA
+3227568128,3227574271,US
3227574272,3227576575,ZA
3227576576,3227576831,US
3227576832,3227579391,MU
3227579392,3227579647,US
-3227579648,3227580927,ZA
+3227579648,3227580159,ZA
+3227580160,3227580415,MU
+3227580416,3227580927,ZA
3227580928,3227581695,MU
3227581696,3227582207,ZA
3227582208,3227638271,US
@@ -94158,26 +99191,14 @@
3227724032,3227724287,US
3227724288,3227738879,CA
3227738880,3227739135,US
-3227739136,3227746311,CA
-3227746312,3227746315,US
-3227746316,3227746335,CA
-3227746336,3227746339,US
-3227746340,3227746351,CA
-3227746352,3227746359,US
-3227746360,3227746431,CA
+3227739136,3227746431,CA
3227746432,3227746463,US
3227746464,3227746559,CA
3227746560,3227746815,AU
3227746816,3227747071,BR
-3227747072,3227747279,CA
-3227747280,3227747283,US
-3227747284,3227747335,CA
-3227747336,3227747339,US
-3227747340,3227748035,CA
+3227747072,3227748035,CA
3227748036,3227748039,US
-3227748040,3227749591,CA
-3227749592,3227749599,US
-3227749600,3227749783,CA
+3227748040,3227749783,CA
3227749784,3227749787,US
3227749788,3227749839,CA
3227749840,3227749855,BZ
@@ -94193,8 +99214,7 @@
3227758672,3227758687,US
3227758688,3227759871,CA
3227759872,3227759887,BZ
-3227759888,3227759891,US
-3227759892,3227760127,CA
+3227759888,3227760127,CA
3227760128,3227760383,US
3227760384,3227760415,CA
3227760416,3227760419,US
@@ -94204,11 +99224,7 @@
3227760648,3227760655,BZ
3227760656,3227761107,CA
3227761108,3227761111,BZ
-3227761112,3227761195,CA
-3227761196,3227761199,US
-3227761200,3227762567,CA
-3227762568,3227762571,US
-3227762572,3227762655,CA
+3227761112,3227762655,CA
3227762656,3227762671,US
3227762672,3227763483,CA
3227763484,3227763487,US
@@ -94225,22 +99241,14 @@
3227765760,3227766095,CA
3227766096,3227766099,US
3227766100,3227766343,CA
-3227766344,3227766351,US
-3227766352,3227766903,CA
-3227766904,3227766911,US
-3227766912,3227767295,CA
+3227766344,3227766347,US
+3227766348,3227767295,CA
3227767296,3227767311,US
3227767312,3227767591,CA
3227767592,3227767595,US
3227767596,3227769631,CA
3227769632,3227769635,US
-3227769636,3227769691,CA
-3227769692,3227769695,US
-3227769696,3227769743,CA
-3227769744,3227769759,US
-3227769760,3227769927,CA
-3227769928,3227769935,US
-3227769936,3227770339,CA
+3227769636,3227770339,CA
3227770340,3227770343,US
3227770344,3227770495,CA
3227770496,3227770511,US
@@ -94258,23 +99266,15 @@
3227771348,3227771351,US
3227771352,3227771619,CA
3227771620,3227771623,US
-3227771624,3227771739,CA
-3227771740,3227771743,US
-3227771744,3227772707,CA
+3227771624,3227772707,CA
3227772708,3227772711,US
3227772712,3227774751,CA
3227774752,3227774783,US
-3227774784,3227775011,CA
-3227775012,3227775015,US
-3227775016,3227775059,CA
+3227774784,3227775059,CA
3227775060,3227775063,US
-3227775064,3227775243,CA
-3227775244,3227775247,US
-3227775248,3227775423,CA
+3227775064,3227775423,CA
3227775424,3227775431,US
-3227775432,3227775667,CA
-3227775668,3227775671,US
-3227775672,3227775695,CA
+3227775432,3227775695,CA
3227775696,3227775707,BZ
3227775708,3227775731,CA
3227775732,3227775743,BZ
@@ -94282,17 +99282,13 @@
3227775857,3227775857,ES
3227775858,3227775935,CA
3227775936,3227775939,US
-3227775940,3227775959,CA
-3227775960,3227775963,US
-3227775964,3227776983,CA
+3227775940,3227776983,CA
3227776984,3227776984,US
3227776985,3227777063,CA
3227777064,3227777067,US
3227777068,3227777083,CA
3227777084,3227777087,US
-3227777088,3227777343,CA
-3227777344,3227777347,US
-3227777348,3227777759,CA
+3227777088,3227777759,CA
3227777760,3227777763,US
3227777764,3227777807,CA
3227777808,3227777823,US
@@ -94304,11 +99300,7 @@
3227778016,3227778019,BZ
3227778020,3227778135,CA
3227778136,3227778139,BZ
-3227778140,3227778267,CA
-3227778268,3227778271,US
-3227778272,3227778895,CA
-3227778896,3227778911,US
-3227778912,3227779071,CA
+3227778140,3227779071,CA
3227779072,3227779327,US
3227779328,3227779583,ZA
3227779584,3227779839,KR
@@ -94343,8 +99335,7 @@
3227806720,3227806975,US
3227806976,3227807039,SG
3227807040,3227807743,US
-3227807744,3227812351,GB
-3227812608,3227813375,GB
+3227807744,3227813375,GB
3227813376,3227813631,US
3227813632,3227815167,GB
3227815168,3227815935,US
@@ -94396,7 +99387,8 @@
3227864064,3227865343,US
3227865344,3227866111,NL
3227866112,3227866367,HK
-3227866368,3227867647,NL
+3227866368,3227866623,US
+3227866624,3227867647,NL
3227867648,3227867903,BR
3227867904,3227868159,TH
3227868160,3227872767,US
@@ -94667,19 +99659,18 @@
3228399872,3228400383,DE
3228400640,3228403711,DE
3228403968,3228404223,DE
-3228404736,3228404863,FR
-3228404896,3228405503,FR
+3228404736,3228405503,FR
3228405504,3228405759,DE
3228405760,3228406015,FR
3228406016,3228406271,US
3228406272,3228406527,IN
3228406528,3228406783,BR
3228406784,3228407039,FR
-3228407296,3228424447,DE
+3228407296,3228424703,DE
3228424704,3228424959,US
-3228425472,3228425983,DE
+3228424960,3228426143,DE
3228426144,3228426151,US
-3228426240,3228430335,DE
+3228426152,3228430335,DE
3228430848,3228431103,ZA
3228431872,3228434431,DE
3228434432,3228456191,US
@@ -94692,7 +99683,7 @@
3228478464,3228479487,CA
3228479488,3228508159,US
3228508160,3228508415,AU
-3228508416,3228508671,NL
+3228508416,3228508671,NO
3228508672,3228509951,US
3228509952,3228510207,NL
3228510208,3228511231,US
@@ -94713,11 +99704,7 @@
3228532480,3228532735,DE
3228532736,3228533759,US
3228533760,3228534015,CA
-3228534016,3228537759,US
-3228537760,3228537775,GB
-3228537776,3228538055,US
-3228538056,3228538063,GB
-3228538064,3228539903,US
+3228534016,3228539903,US
3228539904,3228540927,BR
3228540928,3228558591,US
3228558592,3228559103,BR
@@ -94817,7 +99804,7 @@
3229196800,3229197311,NL
3229197312,3229197823,SE
3229197824,3229198335,GB
-3229198336,3229198591,US
+3229198336,3229198591,SE
3229198592,3229198847,ES
3229198848,3229199103,CH
3229199104,3229199359,IT
@@ -94834,9 +99821,7 @@
3229204224,3229204479,IT
3229204480,3229205503,SE
3229205504,3229206015,GB
-3229206016,3229208575,SE
-3229208576,3229209087,NO
-3229209088,3229211647,SE
+3229206016,3229211647,SE
3229211648,3229211903,IT
3229211904,3229212927,SE
3229212928,3229213183,DE
@@ -94911,8 +99896,7 @@
3229483264,3229499647,FI
3229499648,3229614847,US
3229614848,3229615103,GB
-3229615104,3229679103,US
-3229679360,3229679871,US
+3229615104,3229679871,US
3229679872,3229695487,DE
3229695488,3229700095,US
3229700096,3229700351,AT
@@ -94956,8 +99940,7 @@
3229846016,3229846527,CA
3229847296,3229849599,US
3229849600,3229849855,AU
-3229849856,3229864703,US
-3229864960,3229870335,US
+3229849856,3229870335,US
3229870592,3229870847,CA
3229870848,3229874943,US
3229874944,3229875455,AU
@@ -94999,9 +99982,7 @@
3229939456,3229940735,KR
3229940736,3229940991,CH
3229940992,3229941247,AU
-3229941248,3229941759,US
-3229941760,3229942271,CA
-3229942272,3229945343,US
+3229941248,3229945343,US
3229945600,3229945855,PT
3229945856,3229947135,US
3229947136,3229947391,AU
@@ -95273,6 +100254,7 @@
3230425088,3230432255,BR
3230432256,3230432767,CO
3230432768,3230433023,AR
+3230433024,3230433279,BR
3230433280,3230436351,CN
3230436352,3230437375,AU
3230437376,3230439423,PK
@@ -95294,7 +100276,7 @@
3230687232,3230691327,BR
3230691328,3230692351,PE
3230692352,3230695423,BR
-3230695424,3230728191,US
+3230695424,3230728191,CN
3230777344,3230784511,BR
3230784512,3230785535,MX
3230785536,3230823679,US
@@ -95443,7 +100425,9 @@
3231005184,3231005439,US
3231005440,3231005695,FR
3231005696,3231005951,GB
-3231005952,3231010047,US
+3231005952,3231006207,US
+3231006208,3231007487,CA
+3231007488,3231010047,US
3231010048,3231010303,FR
3231010304,3231010815,NO
3231010816,3231011071,CA
@@ -95452,7 +100436,7 @@
3231011840,3231013375,US
3231013376,3231013887,CA
3231013888,3231015423,US
-3231015424,3231015679,CA
+3231015424,3231015679,GB
3231015680,3231015935,US
3231015936,3231016191,NO
3231016192,3231016447,US
@@ -95482,9 +100466,7 @@
3231049728,3231049983,AT
3231049984,3231051263,US
3231051264,3231051519,GB
-3231051776,3231057919,US
-3231058176,3231060991,US
-3231061248,3231070719,US
+3231051776,3231070719,US
3231070720,3231074559,SE
3231074560,3231075071,US
3231075072,3231075583,NL
@@ -95720,9 +100702,11 @@
3231408768,3231408783,DE
3231408784,3231408871,US
3231408872,3231408879,AU
-3231408880,3231411047,US
-3231411048,3231411063,AU
-3231411064,3231423999,US
+3231408880,3231411055,US
+3231411056,3231411063,AU
+3231411064,3231411855,US
+3231411856,3231411871,AU
+3231411872,3231423999,US
3231424000,3231424511,PR
3231424512,3231482879,US
3231482880,3231483135,BE
@@ -95761,25 +100745,24 @@
3231513088,3231514879,US
3231514880,3231515647,NO
3231515648,3231516671,US
-3231516672,3231518468,SE
-3231518470,3231519231,SE
-3231519232,3231526935,US
-3231526936,3231526943,CA
-3231526944,3231527119,US
-3231527120,3231527127,CA
-3231527128,3231528471,US
-3231528472,3231528487,CA
-3231528488,3231528959,US
+3231516672,3231519231,SE
+3231519232,3231526911,US
+3231526912,3231527423,CA
+3231527424,3231528191,US
+3231528192,3231528703,CA
+3231528704,3231528959,US
3231528960,3231528975,CA
3231528976,3231528983,US
-3231528984,3231528991,CA
-3231528992,3231529031,US
-3231529032,3231529039,CA
-3231529040,3231529471,US
-3231529472,3231529487,CA
-3231529488,3231530239,US
+3231528984,3231528999,CA
+3231529000,3231529015,US
+3231529016,3231529215,CA
+3231529216,3231529471,US
+3231529472,3231529727,CA
+3231529728,3231529983,US
+3231529984,3231530239,CA
3231530240,3231530495,IN
-3231530496,3231539199,US
+3231530496,3231530751,CA
+3231530752,3231539199,US
3231539200,3231547391,CA
3231547392,3231547647,US
3231547648,3231547903,NO
@@ -95816,8 +100799,7 @@
3231583232,3231584255,CA
3231584256,3231588863,US
3231588864,3231589119,GB
-3231589120,3231590911,US
-3231590944,3231591679,US
+3231589120,3231591679,US
3231591680,3231591935,AU
3231591936,3231593983,US
3231593984,3231594239,GB
@@ -95900,7 +100882,6 @@
3231738624,3231739135,US
3231739136,3231739391,GB
3231739392,3231739647,PL
-3231739648,3231739903,BR
3231739904,3231742719,US
3231742720,3231742975,FR
3231742976,3231743487,US
@@ -96007,9 +100988,7 @@
3231903744,3231905791,RU
3231905792,3231906047,PL
3231906048,3231907839,RU
-3231907840,3231911423,US
-3231911936,3231912959,US
-3231913216,3231916031,US
+3231907840,3231916031,US
3231916032,3231948799,FI
3231948800,3231973375,US
3231973376,3232038911,AT
@@ -96052,9 +101031,7 @@
3232089088,3232089343,ES
3232089344,3232090367,SE
3232090368,3232090623,IT
-3232090624,3232093675,SE
-3232093677,3232093695,SE
-3232093952,3232095231,SE
+3232090624,3232095231,SE
3232095232,3232096255,GB
3232096256,3232096767,SE
3232096768,3232097023,DK
@@ -96065,8 +101042,7 @@
3232098304,3232100095,SE
3232100096,3232100351,IE
3232100352,3232101119,GB
-3232101120,3232102144,SE
-3232102146,3232103167,SE
+3232101120,3232103167,SE
3232103168,3232103423,FR
3232103424,3232104447,SE
3232104448,3232106495,DE
@@ -96181,29 +101157,68 @@
3232825344,3233288191,US
3233288192,3233292287,CA
3233292288,3233431551,US
-3233431552,3233447935,CA
-3233447936,3233449095,US
+3233431552,3233448191,CA
+3233448192,3233448447,US
+3233448448,3233448591,CA
+3233448592,3233448607,US
+3233448608,3233448703,CA
+3233448704,3233448959,US
+3233448960,3233449095,CA
3233449096,3233449103,GB
-3233449104,3233449207,US
+3233449104,3233449199,CA
+3233449200,3233449207,US
3233449208,3233449215,GB
-3233449216,3233449311,US
+3233449216,3233449311,CA
3233449312,3233449319,RO
-3233449320,3233449471,US
-3233449472,3233449535,CA
+3233449320,3233449359,CA
+3233449360,3233449367,US
+3233449368,3233449535,CA
3233449536,3233449567,US
3233449568,3233449615,CA
3233449616,3233449631,US
-3233449632,3233449727,CA
-3233449728,3233450199,US
+3233449632,3233449647,CA
+3233449648,3233449663,US
+3233449664,3233450047,CA
+3233450048,3233450111,US
+3233450112,3233450127,CA
+3233450128,3233450135,US
+3233450136,3233450199,CA
3233450200,3233450207,GB
-3233450208,3233451263,US
+3233450208,3233450239,CA
+3233450240,3233451263,US
3233451264,3233451519,CA
3233451520,3233451775,GB
-3233451776,3233452351,US
+3233451776,3233451935,CA
+3233451936,3233451951,US
+3233451952,3233452031,CA
+3233452032,3233452351,US
3233452352,3233452383,IN
-3233452384,3233453567,US
+3233452384,3233452831,US
+3233452832,3233452847,CA
+3233452848,3233452879,US
+3233452880,3233452991,CA
+3233452992,3233453007,US
+3233453008,3233453183,CA
+3233453184,3233453199,US
+3233453200,3233453295,CA
+3233453296,3233453439,US
+3233453440,3233453455,CA
+3233453456,3233453471,US
+3233453472,3233453567,CA
3233453568,3233453631,IT
-3233453632,3233456191,US
+3233453632,3233454079,US
+3233454080,3233454303,CA
+3233454304,3233454335,US
+3233454336,3233454511,CA
+3233454512,3233454527,US
+3233454528,3233454559,CA
+3233454560,3233454575,US
+3233454576,3233454847,CA
+3233454848,3233455103,US
+3233455104,3233455743,CA
+3233455744,3233455775,US
+3233455776,3233455855,CA
+3233455856,3233456191,US
3233456192,3233456255,LV
3233456256,3233456383,US
3233456384,3233456391,UA
@@ -96212,7 +101227,9 @@
3233456448,3233456639,US
3233456640,3233456655,CA
3233456656,3233456671,US
-3233456672,3233456943,CA
+3233456672,3233456799,CA
+3233456800,3233456831,US
+3233456832,3233456943,CA
3233456944,3233456959,US
3233456960,3233456975,CA
3233456976,3233456991,US
@@ -96223,13 +101240,71 @@
3233457408,3233457631,RO
3233457632,3233457647,US
3233457648,3233457663,RO
-3233457664,3233458943,US
+3233457664,3233457855,CA
+3233457856,3233457863,US
+3233457864,3233457919,CA
+3233457920,3233458191,US
+3233458192,3233458223,CA
+3233458224,3233458271,US
+3233458272,3233458303,CA
+3233458304,3233458335,US
+3233458336,3233458367,CA
+3233458368,3233458399,US
+3233458400,3233458431,CA
+3233458432,3233458463,US
+3233458464,3233458479,CA
+3233458480,3233458527,US
+3233458528,3233458591,CA
+3233458592,3233458607,US
+3233458608,3233458687,CA
+3233458688,3233458943,US
3233458944,3233458959,BG
3233458960,3233458975,US
3233458976,3233459007,BG
-3233459008,3233460511,US
+3233459008,3233459455,US
+3233459456,3233459583,CA
+3233459584,3233459631,US
+3233459632,3233459711,CA
+3233459712,3233459727,US
+3233459728,3233459775,CA
+3233459776,3233459807,US
+3233459808,3233459823,CA
+3233459824,3233459839,US
+3233459840,3233459967,CA
+3233459968,3233459999,US
+3233460000,3233460015,CA
+3233460016,3233460031,US
+3233460032,3233460223,CA
+3233460224,3233460479,US
+3233460480,3233460495,CA
+3233460496,3233460511,US
3233460512,3233460519,SE
-3233460520,3233484799,US
+3233460520,3233460671,CA
+3233460672,3233461247,US
+3233461248,3233461375,CA
+3233461376,3233461407,US
+3233461408,3233461487,CA
+3233461488,3233461503,US
+3233461504,3233461567,CA
+3233461568,3233461583,US
+3233461584,3233461599,CA
+3233461600,3233461615,US
+3233461616,3233461647,CA
+3233461648,3233461663,US
+3233461664,3233461727,CA
+3233461728,3233461743,US
+3233461744,3233461759,CA
+3233461760,3233461823,US
+3233461824,3233461871,CA
+3233461872,3233462783,US
+3233462784,3233463295,CA
+3233463296,3233463807,US
+3233463808,3233463839,CA
+3233463840,3233463855,US
+3233463856,3233463935,CA
+3233463936,3233463999,US
+3233464000,3233464063,CA
+3233464064,3233484799,US
3233484800,3233487359,ES
3233487360,3233487871,US
3233487872,3233488895,CA
@@ -96468,12 +101543,9 @@
3233873920,3233874943,AU
3233874944,3233903615,US
3233903616,3233903743,GB
+3233903744,3233903807,US
3233903808,3233903871,GB
-3233903872,3233907711,US
-3233907968,3233914879,US
-3233915136,3233915903,US
-3233916160,3233936639,US
-3233936896,3233939455,US
+3233903872,3233939455,US
3233939456,3234004991,FI
3234004992,3234005247,US
3234005248,3234005503,GB
@@ -96563,24 +101635,87 @@
3234199040,3234201343,CA
3234201344,3234203647,US
3234203648,3234205695,AR
-3234205696,3234226431,US
-3234226432,3234226687,IN
-3234226688,3234226983,US
-3234226984,3234226991,CA
-3234226992,3234227455,US
-3234227456,3234227711,CA
-3234227712,3234228223,US
+3234205696,3234226175,US
+3234226176,3234226287,CA
+3234226288,3234226303,US
+3234226304,3234226719,CA
+3234226720,3234226751,US
+3234226752,3234226847,CA
+3234226848,3234226863,US
+3234226864,3234226879,CA
+3234226880,3234226943,US
+3234226944,3234227007,CA
+3234227008,3234227023,US
+3234227024,3234227191,CA
+3234227192,3234227455,US
+3234227456,3234227839,CA
+3234227840,3234227871,US
+3234227872,3234227903,CA
+3234227904,3234227935,US
+3234227936,3234227951,CA
+3234227952,3234228223,US
3234228224,3234228287,CA
-3234228288,3234229215,US
+3234228288,3234228351,US
+3234228352,3234228607,CA
+3234228608,3234228639,US
+3234228640,3234228671,CA
+3234228672,3234228703,US
+3234228704,3234228719,CA
+3234228720,3234228735,US
+3234228736,3234229039,CA
+3234229040,3234229047,US
+3234229048,3234229215,CA
3234229216,3234229223,SE
-3234229224,3234230015,US
+3234229224,3234229247,CA
+3234229248,3234229503,US
+3234229504,3234229567,CA
+3234229568,3234229599,US
+3234229600,3234229695,CA
+3234229696,3234229743,US
+3234229744,3234229919,CA
+3234229920,3234229951,US
+3234229952,3234230015,CA
3234230016,3234230207,ES
-3234230208,3234232319,US
+3234230208,3234230271,US
+3234230272,3234230527,CA
+3234230528,3234230783,US
+3234230784,3234230927,CA
+3234230928,3234230991,US
+3234230992,3234231007,CA
+3234231008,3234231039,US
+3234231040,3234231087,CA
+3234231088,3234231103,US
+3234231104,3234231807,CA
+3234231808,3234232111,US
+3234232112,3234232127,CA
+3234232128,3234232159,US
+3234232160,3234232319,CA
3234232320,3234232575,EG
-3234232576,3234238463,US
+3234232576,3234233343,US
+3234233344,3234233471,CA
+3234233472,3234233487,US
+3234233488,3234233519,CA
+3234233520,3234233599,US
+3234233600,3234233647,CA
+3234233648,3234233663,US
+3234233664,3234233727,CA
+3234233728,3234233759,US
+3234233760,3234233791,CA
+3234233792,3234233823,US
+3234233824,3234233855,CA
+3234233856,3234234127,US
+3234234128,3234234143,CA
+3234234144,3234234191,US
+3234234192,3234234207,CA
+3234234208,3234234239,US
+3234234240,3234234255,CA
+3234234256,3234234271,US
+3234234272,3234234287,CA
+3234234288,3234234335,US
+3234234336,3234234367,CA
+3234234368,3234238463,US
3234238464,3234239487,MY
-3234239488,3234240255,US
-3234240512,3234267135,US
+3234239488,3234267135,US
3234267136,3234267391,CA
3234267392,3234268927,US
3234268928,3234269183,SG
@@ -96730,14 +101865,12 @@
3234861056,3234988287,US
3234988288,3234990847,CA
3234990848,3235004415,US
-3235004416,3235021823,CA
-3235021824,3235026943,US
-3235026944,3235027199,CA
-3235027200,3235044375,US
+3235004416,3235020799,CA
+3235020800,3235021567,US
+3235021568,3235021823,CA
+3235021824,3235044375,US
3235044376,3235044383,GB
-3235044384,3235045375,US
-3235045376,3235045887,CA
-3235045888,3235046831,US
+3235044384,3235046831,US
3235046832,3235046847,AF
3235046848,3235065343,US
3235065344,3235065855,CA
@@ -96785,9 +101918,7 @@
3235844064,3235844095,CA
3235844096,3235856383,US
3235856384,3235872767,BO
-3235872768,3235876607,US
-3235876864,3235876882,US
-3235876884,3235906303,US
+3235872768,3235906303,US
3235906304,3235906559,CA
3235906560,3235908863,US
3235908864,3235909119,CA
@@ -96879,8 +102010,7 @@
3236167936,3236175871,CA
3236175872,3236200447,US
3236200448,3236233215,MY
-3236233216,3236237567,US
-3236237937,3236239359,US
+3236233216,3236239359,US
3236239360,3236241407,CA
3236241408,3236267519,US
3236267520,3236268031,DE
@@ -96963,10 +102093,7 @@
3236427520,3236427775,CA
3236427776,3236429311,US
3236429312,3236429567,MU
-3236429568,3236438015,US
-3236446208,3236447487,US
-3236447744,3236450047,US
-3236450304,3236462591,US
+3236429568,3236462591,US
3236462592,3236470783,AU
3236470784,3236560895,US
3236560896,3236561151,CA
@@ -97031,8 +102158,7 @@
3236789504,3236823295,US
3236823296,3236825855,CH
3236825856,3236827135,CA
-3236827136,3236828415,US
-3236828672,3236958207,US
+3236827136,3236958207,US
3236958208,3236962303,AU
3236962304,3236985063,US
3236985064,3236985071,AU
@@ -97068,40 +102194,123 @@
3237016832,3237017087,GB
3237017088,3237018111,US
3237018112,3237018367,DE
-3237018368,3237036543,US
+3237018368,3237036063,US
+3237036064,3237036095,CA
+3237036096,3237036127,US
+3237036128,3237036143,CA
+3237036144,3237036159,US
+3237036160,3237036255,CA
+3237036256,3237036351,US
+3237036352,3237036367,CA
+3237036368,3237036383,US
+3237036384,3237036415,CA
+3237036416,3237036495,US
+3237036496,3237036511,CA
+3237036512,3237036543,US
3237036544,3237036799,CN
-3237036800,3237038079,US
-3237038080,3237038335,CA
-3237038336,3237039183,US
-3237039184,3237039199,IN
+3237036800,3237037311,US
+3237037312,3237037567,CA
+3237037568,3237037583,US
+3237037584,3237037615,CA
+3237037616,3237037631,US
+3237037632,3237037943,CA
+3237037944,3237037951,US
+3237037952,3237038031,CA
+3237038032,3237038047,US
+3237038048,3237038367,CA
+3237038368,3237038399,US
+3237038400,3237038415,CA
+3237038416,3237038431,US
+3237038432,3237038495,CA
+3237038496,3237038575,US
+3237038576,3237038863,CA
+3237038864,3237038879,US
+3237038880,3237038911,CA
+3237038912,3237038927,US
+3237038928,3237039103,CA
+3237039104,3237039183,US
+3237039184,3237039199,CA
3237039200,3237039215,US
-3237039216,3237039295,IN
+3237039216,3237039295,CA
3237039296,3237039343,US
-3237039344,3237039359,IN
+3237039344,3237039359,CA
3237039360,3237039615,US
-3237039616,3237039871,CA
-3237039872,3237040895,US
-3237040896,3237041151,IN
+3237039616,3237039935,CA
+3237039936,3237040063,US
+3237040064,3237040143,CA
+3237040144,3237040159,US
+3237040160,3237040287,CA
+3237040288,3237040303,US
+3237040304,3237040319,CA
+3237040320,3237040335,US
+3237040336,3237040351,CA
+3237040352,3237040511,US
+3237040512,3237040639,CA
+3237040640,3237040895,US
+3237040896,3237041151,CA
3237041152,3237041183,US
-3237041184,3237041199,IN
-3237041200,3237043967,US
+3237041184,3237041199,CA
+3237041200,3237041407,US
+3237041408,3237041663,CA
+3237041664,3237041791,US
+3237041792,3237041935,CA
+3237041936,3237041983,US
+3237041984,3237042127,CA
+3237042128,3237042431,US
+3237042432,3237042479,CA
+3237042480,3237042495,US
+3237042496,3237042607,CA
+3237042608,3237042623,US
+3237042624,3237042687,CA
+3237042688,3237043455,US
+3237043456,3237043711,CA
+3237043712,3237043967,US
3237043968,3237044223,CH
-3237044224,3237046647,US
+3237044224,3237044287,US
+3237044288,3237044351,CA
+3237044352,3237044479,US
+3237044480,3237044815,CA
+3237044816,3237044831,US
+3237044832,3237044887,CA
+3237044888,3237044895,US
+3237044896,3237045247,CA
+3237045248,3237046271,US
+3237046272,3237046607,CA
+3237046608,3237046623,US
+3237046624,3237046647,CA
3237046648,3237046655,SE
-3237046656,3237047039,US
+3237046656,3237046671,CA
+3237046672,3237046767,US
+3237046768,3237046783,CA
+3237046784,3237046815,US
+3237046816,3237047039,CA
3237047040,3237047295,FR
-3237047296,3237048831,US
-3237048832,3237049087,IN
-3237049088,3237049343,US
-3237049344,3237049599,CA
-3237049600,3237050111,US
+3237047296,3237047807,US
+3237047808,3237047839,CA
+3237047840,3237047871,US
+3237047872,3237047935,CA
+3237047936,3237048031,US
+3237048032,3237048079,CA
+3237048080,3237048111,US
+3237048112,3237048127,CA
+3237048128,3237048143,US
+3237048144,3237048159,CA
+3237048160,3237048191,US
+3237048192,3237048319,CA
+3237048320,3237048575,US
+3237048576,3237048767,CA
+3237048768,3237048783,US
+3237048784,3237049855,CA
+3237049856,3237050111,US
3237050112,3237050159,GB
3237050160,3237050175,US
3237050176,3237050303,GB
3237050304,3237051903,US
3237051904,3237052159,TR
-3237052160,3237052287,CA
-3237052288,3237125295,US
+3237052160,3237052319,CA
+3237052320,3237052367,US
+3237052368,3237052415,CA
+3237052416,3237125295,US
3237125296,3237125311,CR
3237125312,3237154815,US
3237154816,3237155839,ES
@@ -97140,7 +102349,8 @@
3237320960,3237321471,US
3237321728,3237322751,US
3237322752,3237323263,CA
-3237323264,3237325055,US
+3237323264,3237323519,IN
+3237323520,3237325055,US
3237325056,3237325311,PL
3237325312,3237325823,US
3237325824,3237326079,CA
@@ -97174,8 +102384,7 @@
3237478400,3237511167,LK
3237511168,3237548031,US
3237548032,3237552127,KR
-3237552128,3237553922,US
-3237553924,3237554431,US
+3237552128,3237554431,US
3237554432,3237554434,SG
3237554435,3237554435,US
3237554436,3237554463,SG
@@ -97189,9 +102398,7 @@
3237613568,3237614591,CA
3237614592,3237615615,US
3237615616,3237616895,CA
-3237616896,3237622015,US
-3237622272,3237634601,US
-3237634604,3237642239,US
+3237616896,3237642239,US
3237642240,3237650431,AU
3237650432,3237653503,US
3237653504,3237653759,IN
@@ -97231,9 +102438,7 @@
3237773312,3237777407,CA
3237777408,3237781503,US
3237781504,3237785599,CA
-3237785600,3237787567,US
-3237787568,3237787575,CN
-3237787576,3237797887,US
+3237785600,3237797887,US
3237797888,3237801983,CA
3237801984,3237858303,US
3237858304,3237863423,CA
@@ -97428,7 +102633,7 @@
3237867504,3237867511,CN
3237867512,3237867519,US
3237867520,3237867775,HK
-3237867776,3237868031,GB
+3237867776,3237868031,AU
3237868032,3237868159,HK
3237868160,3237868287,AU
3237868288,3237868543,DK
@@ -97442,17 +102647,21 @@
3237870080,3237870335,IS
3237870336,3237870591,SG
3237870592,3237870847,BN
-3237870848,3237870975,KR
-3237870976,3237871103,JP
+3237870848,3237871103,RO
3237871104,3237871231,TH
3237871232,3237871359,TW
-3237871360,3237871487,SG
-3237871488,3237871615,MY
+3237871360,3237871615,RU
3237871616,3237890651,US
3237890652,3237890655,GB
3237890656,3237892063,US
3237892064,3237892071,GB
-3237892072,3237896191,US
+3237892072,3237893631,US
+3237893632,3237893887,TW
+3237893888,3237894911,US
+3237894912,3237895167,HK
+3237895168,3237895423,US
+3237895424,3237895679,HK
+3237895680,3237896191,US
3237896192,3237900287,PR
3237900288,3237955071,US
3237955072,3237955327,NL
@@ -97553,6 +102762,7 @@
3238062080,3238062591,CH
3238063104,3238063359,PL
3238063360,3238063615,CH
+3238063616,3238063871,DE
3238064128,3238064383,UA
3238064384,3238064639,ES
3238064640,3238064895,PL
@@ -97616,7 +102826,7 @@
3238592512,3238594559,GB
3238594560,3238595583,BE
3238595584,3238595839,SI
-3238596096,3238596351,GB
+3238595840,3238596351,GB
3238596608,3238596863,BG
3238596864,3238597119,RU
3238597120,3238597375,DE
@@ -97638,8 +102848,7 @@
3238625280,3238630399,LU
3238630400,3238631423,GR
3238632960,3238633215,UA
-3238633216,3238651491,DK
-3238651493,3238653951,DK
+3238633216,3238653951,DK
3238653952,3238655999,RU
3238656000,3238656255,GB
3238656256,3238656511,RU
@@ -97693,11 +102902,11 @@
3239079168,3239079423,SI
3239079680,3239079935,MD
3239079936,3239088127,DE
+3239088384,3239088639,GB
3239088640,3239088895,DK
3239088896,3239089151,IL
3239089152,3239089407,RO
3239089664,3239089919,GB
-3239089920,3239090175,DE
3239090176,3239090431,SI
3239090432,3239090687,ES
3239090688,3239090943,NL
@@ -97916,8 +103125,7 @@
3239488768,3239489023,RO
3239489024,3239489279,DE
3239489280,3239489535,PL
-3239489536,3239496959,DE
-3239497216,3239501823,DE
+3239489536,3239501823,DE
3239506432,3239506687,RU
3239506688,3239506943,GB
3239507200,3239507455,GB
@@ -97929,8 +103137,7 @@
3239509248,3239509503,DE
3239509504,3239509759,CH
3239509760,3239514111,DE
-3239518208,3239521023,DE
-3239521280,3239521791,DE
+3239518208,3239522303,DE
3239522304,3239522559,PL
3239522560,3239522815,SI
3239523072,3239523327,PL
@@ -98003,8 +103210,7 @@
3239583744,3239591935,DE
3239591936,3239592447,FI
3239592448,3239592703,US
-3239592704,3239592959,FI
-3239593216,3239593983,FI
+3239592704,3239593983,FI
3239593984,3239624703,DE
3239624704,3239625727,CH
3239625728,3239626751,RU
@@ -98152,8 +103358,7 @@
3239826944,3239827455,RU
3239827456,3239827967,DK
3239827968,3239828479,CH
-3239828480,3239828733,DE
-3239828735,3239828991,DE
+3239828480,3239828991,DE
3239828992,3239829503,RU
3239830016,3239830527,CH
3239831040,3239831551,RU
@@ -98207,6 +103412,7 @@
3239878656,3239882751,DE
3239882752,3239883007,GB
3239883008,3239883263,UA
+3239883264,3239883519,GB
3239883520,3239883775,CZ
3239883776,3239884031,DE
3239884032,3239884287,RU
@@ -98311,8 +103517,7 @@
3240011776,3240026111,DE
3240026112,3240027135,FR
3240027136,3240028159,BG
-3240028160,3240028160,GB
-3240028162,3240029183,GB
+3240028160,3240029183,GB
3240029184,3240030207,RU
3240030208,3240032255,UA
3240032256,3240033279,RS
@@ -98332,9 +103537,7 @@
3240087552,3240091647,IM
3240091648,3240097791,DE
3240098816,3240099327,CH
-3240100608,3240100690,GB
-3240100692,3240100863,GB
-3240101376,3240101887,GB
+3240099840,3240101887,GB
3240102144,3240102399,GB
3240102912,3240103935,UA
3240104192,3240104703,GB
@@ -98342,9 +103545,7 @@
3240104960,3240105215,RU
3240105216,3240105471,UA
3240105472,3240105727,GB
-3240105984,3240107007,GB
-3240107520,3240107583,GB
-3240107600,3240109055,GB
+3240105984,3240109055,GB
3240109056,3240109567,PL
3240109568,3240112639,GB
3240112640,3240112895,PL
@@ -98400,7 +103601,7 @@
3240182784,3240183295,RU
3240183296,3240183807,NL
3240183808,3240184319,GB
-3240184320,3240184831,RU
+3240184320,3240184831,CZ
3240184832,3240185343,GB
3240185344,3240185855,FR
3240185856,3240188415,RU
@@ -98481,7 +103682,7 @@
3240237056,3240239103,DE
3240239104,3240240127,FR
3240240128,3240241151,US
-3240241408,3240242175,FI
+3240241152,3240242175,FI
3240242176,3240243199,PL
3240243200,3240243711,GB
3240243712,3240244223,DE
@@ -98495,7 +103696,7 @@
3240252416,3240253439,LT
3240253440,3240254463,BE
3240254464,3240256511,UA
-3240256768,3240257535,DE
+3240256512,3240257535,DE
3240257536,3240258559,FO
3240258560,3240259583,RO
3240259584,3240260607,PL
@@ -98827,8 +104028,7 @@
3240812288,3240812543,KW
3240813568,3240814591,PL
3240814592,3240816639,IT
-3240818688,3240819715,NL
-3240819717,3240820735,NL
+3240818688,3240820735,NL
3240820736,3240820799,FR
3240820800,3240820831,CY
3240820832,3240820863,GB
@@ -98890,9 +104090,7 @@
3240954496,3240954623,DE
3240954624,3240955647,SE
3240955648,3240955903,GB
-3240955904,3240961151,SE
-3240961152,3240961279,GB
-3240961280,3241017343,SE
+3240955904,3241017343,SE
3241017600,3241017855,AT
3241017856,3241018111,RU
3241018112,3241018367,FR
@@ -98955,8 +104153,7 @@
3241078528,3241078783,DE
3241080832,3241082879,AT
3241082880,3241083135,FR
-3241083136,3241084927,CH
-3241085184,3241091071,CH
+3241083136,3241091071,CH
3241101056,3241101311,DK
3241101312,3241101567,RO
3241101568,3241101823,DE
@@ -98983,6 +104180,7 @@
3241118720,3241118975,CH
3241118976,3241119231,FR
3241119232,3241119487,DK
+3241119488,3241119743,LT
3241119744,3241119999,RO
3241120000,3241120255,ES
3241120256,3241120511,RU
@@ -99107,9 +104305,7 @@
3242196992,3242393599,FI
3242393600,3242399743,NL
3242399744,3242399999,GB
-3242400000,3242419967,NL
-3242420224,3242426113,NL
-3242426115,3242459135,NL
+3242400000,3242459135,NL
3242459136,3242467327,BG
3242467328,3242475519,HU
3242475520,3242483711,LV
@@ -99122,48 +104318,85 @@
3242594636,3242594639,GB
3242594640,3242594663,FR
3242594664,3242594667,DE
-3242594668,3242595967,FR
+3242594668,3242595711,FR
+3242595712,3242595839,IT
+3242595840,3242595967,FR
3242595968,3242596095,ES
-3242596096,3242596415,FR
+3242596096,3242596255,FR
+3242596256,3242596287,LT
+3242596288,3242596415,FR
3242596416,3242596479,PT
-3242596480,3242597343,FR
+3242596480,3242597087,FR
+3242597088,3242597119,CZ
+3242597120,3242597343,FR
3242597344,3242597375,NL
-3242597376,3242603119,FR
-3242603120,3242603135,GB
-3242603136,3242604755,FR
-3242604756,3242604756,NL
-3242604757,3242606975,FR
+3242597376,3242602975,FR
+3242602976,3242603007,PL
+3242603008,3242603039,FR
+3242603040,3242603071,DE
+3242603072,3242604095,FR
+3242604096,3242604159,PL
+3242604160,3242604287,IT
+3242604288,3242604671,FR
+3242604672,3242604799,NL
+3242604800,3242605279,FR
+3242605280,3242605311,BE
+3242605312,3242606943,FR
+3242606944,3242606959,BE
+3242606960,3242606975,FR
3242606976,3242607039,ES
-3242607040,3242607359,FR
+3242607040,3242607071,FR
+3242607072,3242607103,DE
+3242607104,3242607135,FR
+3242607136,3242607167,CZ
+3242607168,3242607231,PL
+3242607232,3242607359,IT
3242607360,3242607375,GB
-3242607376,3242608383,FR
+3242607376,3242607775,FR
+3242607776,3242607807,CZ
+3242607808,3242608383,FR
3242608384,3242608639,GB
-3242608640,3242609919,FR
+3242608640,3242608767,FR
+3242608768,3242608895,DE
+3242608896,3242609919,FR
3242609920,3242610047,GB
3242610048,3242610271,FR
3242610272,3242610303,FI
-3242610304,3242614527,FR
+3242610304,3242610431,BE
+3242610432,3242614527,FR
3242614528,3242614783,PL
3242614784,3242615167,FR
3242615168,3242615295,IE
3242615296,3242615871,FR
3242615872,3242615935,PL
-3242615936,3242616029,FR
-3242616030,3242616030,NL
-3242616031,3242616191,FR
+3242615936,3242615999,FR
+3242616000,3242616063,NL
+3242616064,3242616191,FR
3242616192,3242616319,ES
-3242616320,3242616991,FR
-3242616992,3242616992,IT
-3242616993,3242617599,FR
+3242616320,3242616447,FR
+3242616448,3242616575,DE
+3242616576,3242616959,FR
+3242616960,3242617087,IT
+3242617088,3242617599,FR
3242617600,3242617727,GB
3242617728,3242618239,FR
-3242618240,3242618241,NL
-3242618242,3242618431,FR
+3242618240,3242618367,NL
+3242618368,3242618415,FR
+3242618416,3242618431,CZ
3242618432,3242618495,PL
3242618496,3242620223,FR
3242620224,3242620239,PT
3242620240,3242620255,ES
-3242620256,3242622915,FR
+3242620256,3242620287,PL
+3242620288,3242620367,FR
+3242620368,3242620383,PL
+3242620384,3242622031,FR
+3242622032,3242622047,PL
+3242622048,3242622207,FR
+3242622208,3242622463,PL
+3242622464,3242622591,FR
+3242622592,3242622623,PL
+3242622624,3242622915,FR
3242622916,3242622927,PL
3242622928,3242622959,FR
3242622960,3242622975,PL
@@ -99315,10 +104548,7 @@
3244228608,3244261375,TN
3244261376,3244277759,IE
3244277760,3244294143,SI
-3244294144,3244343807,DE
-3244344064,3244452863,DE
-3244453120,3244545279,DE
-3244545536,3244818431,DE
+3244294144,3244818431,DE
3244818432,3244818687,ES
3244818688,3244818943,AT
3244818944,3244819199,PL
@@ -99485,7 +104715,7 @@
3244866048,3244866559,NL
3244866560,3244866815,FI
3244866816,3244867071,UA
-3244867072,3244867583,RU
+3244867328,3244867583,RU
3244867584,3244867839,NL
3244867840,3244868095,BE
3244868096,3244868351,DE
@@ -99505,6 +104735,7 @@
3244872704,3244872959,IR
3244872960,3244873215,UA
3244873216,3244873471,SE
+3244873472,3244873727,IE
3244873728,3244873983,DE
3244873984,3244874239,SE
3244874240,3244874495,ES
@@ -99608,7 +104839,7 @@
3244901888,3244902143,UA
3244902144,3244902655,RU
3244902656,3244902911,BE
-3244902912,3244903167,IM
+3244902912,3244903167,DE
3244903168,3244903423,PL
3244903424,3244903679,FI
3244903680,3244903935,NO
@@ -99684,7 +104915,6 @@
3244925184,3244925439,CH
3244925696,3244925951,RS
3244925952,3244926207,UA
-3244926208,3244926463,NL
3244926464,3244926719,LV
3244926720,3244926975,PL
3244926976,3244927231,DE
@@ -99694,7 +104924,7 @@
3244928000,3244928255,GB
3244928256,3244928511,NL
3244928512,3244929023,RU
-3244929024,3244929535,RO
+3244929024,3244929279,RO
3244929536,3244929791,PL
3244929792,3244930047,RU
3244930048,3244930303,PL
@@ -99821,8 +105051,11 @@
3245016064,3245017087,RS
3245017088,3245018111,PL
3245018112,3245019135,RU
-3245019136,3245019462,SC
-3245019464,3245020159,SC
+3245019136,3245019391,UZ
+3245019392,3245019462,SC
+3245019463,3245019463,UZ
+3245019464,3245019647,SC
+3245019648,3245020159,UZ
3245020160,3245021183,RU
3245021184,3245022207,UA
3245022208,3245023231,NO
@@ -99898,7 +105131,8 @@
3245106688,3245107711,UA
3245107712,3245108735,CZ
3245108736,3245109247,FR
-3245110272,3245112319,UA
+3245110272,3245111295,DE
+3245111296,3245112319,UA
3245112320,3245113343,PL
3245113344,3245113855,UA
3245113856,3245114367,RU
@@ -100071,8 +105305,7 @@
3245220864,3245221119,SE
3245221120,3245221887,FI
3245221888,3245223935,DE
-3245223936,3245225471,NL
-3245225728,3245225983,NL
+3245223936,3245225983,NL
3245225984,3245228031,HU
3245228032,3245229055,FI
3245229056,3245230079,DE
@@ -100081,8 +105314,7 @@
3245232384,3245232639,BE
3245232896,3245233151,IT
3245233152,3245233407,DK
-3245233408,3245233452,CH
-3245233454,3245233663,CH
+3245233408,3245233663,CH
3245233664,3245233919,GR
3245233920,3245234175,DK
3245234176,3245234431,GB
@@ -100236,7 +105468,8 @@
3245338368,3245339647,UA
3245339648,3245340671,LV
3245341696,3245342719,RU
-3245342720,3245867007,GB
+3245342720,3245408255,CN
+3245408256,3245867007,GB
3245867008,3245916159,IE
3245916160,3245917183,GB
3245917184,3245931263,IE
@@ -100303,14 +105536,12 @@
3246385152,3246387199,US
3246387200,3246388223,GB
3246389248,3246390783,ES
-3246391296,3246547199,GB
-3246547456,3246613503,GB
+3246391296,3246613503,GB
3246613504,3246614527,HU
3246614528,3246784511,GB
3246784512,3246825983,CH
3246825984,3246826239,US
-3246826240,3246828066,CH
-3246828068,3246915583,CH
+3246826240,3246915583,CH
3246915584,3246979783,PT
3246979784,3246979784,US
3246979785,3247046655,PT
@@ -100365,8 +105596,7 @@
3247074304,3247074559,DE
3247074560,3247074815,SE
3247074816,3247075071,PL
-3247075328,3247075992,DE
-3247075994,3247076095,DE
+3247075328,3247076095,DE
3247076096,3247076351,DK
3247076352,3247076607,TR
3247076608,3247076863,DE
@@ -100417,8 +105647,7 @@
3247290112,3247290367,NL
3247290368,3247291391,DE
3247291392,3247292415,NL
-3247292416,3247299363,DE
-3247299365,3247300607,DE
+3247292416,3247300607,DE
3247300608,3247308799,NL
3247308800,3247309055,BG
3247309056,3247309567,FI
@@ -100490,7 +105719,7 @@
3247375360,3247375871,FI
3247376384,3247378431,FI
3247379200,3247379455,FI
-3247382784,3247390719,FI
+3247382528,3247390719,FI
3247392256,3247393791,FI
3247394048,3247394303,PL
3247394560,3247397887,FI
@@ -100524,8 +105753,7 @@
3247783936,3247788031,US
3247788032,3247790079,NL
3247790080,3247792127,IE
-3247792128,3247794438,FR
-3247794440,3247800319,FR
+3247792128,3247800319,FR
3247800320,3247816703,DK
3247828992,3247833087,BE
3247833088,3247833599,RU
@@ -100671,16 +105899,11 @@
3248606976,3248619519,NO
3248619520,3248624383,DK
3248624384,3248624639,US
-3248624640,3248624895,DK
-3248625152,3248626175,DK
-3248626177,3248638463,DK
+3248624640,3248638463,DK
3248638464,3248638719,GB
3248638720,3248716287,DK
3248716288,3248716799,GB
-3248716800,3248719871,DK
-3248720128,3248748543,DK
-3248748574,3248748574,DK
-3248748800,3248750591,DK
+3248716800,3248750591,DK
3248750592,3248750847,PT
3248752640,3248752895,DE
3248752896,3248753151,TR
@@ -100859,9 +106082,7 @@
3249141760,3249142271,RU
3249142784,3249143295,UA
3249143808,3249274879,AT
-3249274880,3249279743,NL
-3249280000,3249313279,NL
-3249313536,3249405951,NL
+3249274880,3249405951,NL
3249405952,3249521279,DE
3249521280,3249521343,UA
3249521344,3249537023,DE
@@ -101093,15 +106314,15 @@
3250021376,3250022399,FR
3250022400,3250023423,SE
3250023424,3250024447,DE
-3250024448,3250026495,SE
+3250024448,3250024703,CH
+3250024704,3250026495,SE
3250026496,3250027519,FR
3250027520,3250030335,SE
3250030336,3250030591,DK
3250030592,3250031103,DE
3250031104,3250031359,DK
3250031360,3250031615,US
-3250031616,3250032639,SE
-3250032896,3250035455,SE
+3250031616,3250035455,SE
3250035456,3250035711,US
3250035712,3250038271,SE
3250038272,3250039295,ES
@@ -101190,8 +106411,7 @@
3250374144,3250374655,PL
3250374656,3250375679,SE
3250375680,3250376703,GB
-3250376704,3250377983,AT
-3250378240,3250380799,AT
+3250376704,3250380799,AT
3250380800,3250386943,CH
3250386944,3250387199,SE
3250387200,3250387455,FR
@@ -101312,6 +106532,7 @@
3250748160,3250748415,PL
3250748416,3250749439,UA
3250749440,3250749695,GH
+3250749696,3250749951,IT
3250750464,3250751487,FR
3250751488,3250751743,DE
3250752000,3250752511,CH
@@ -101642,7 +106863,7 @@
3251286016,3251288063,US
3251288064,3251290111,SG
3251290112,3251302399,GB
-3251302400,3251306239,LI
+3251302400,3251306495,LI
3251306496,3251307007,AT
3251307776,3251308031,GB
3251311104,3251311615,RS
@@ -101710,8 +106931,8 @@
3252223488,3252225023,LT
3252225024,3252232319,SE
3252232320,3252232576,NL
-3252232577,3252256767,SE
-3252256768,3252264959,HR
+3252232577,3252240383,SE
+3252240384,3252264959,HR
3252264960,3252273151,EE
3252273152,3252286463,HR
3252286464,3252289535,LT
@@ -101801,9 +107022,13 @@
3252404224,3252405759,NO
3252405760,3252406271,FR
3252406272,3252407295,NO
-3252407296,3252420607,FR
+3252407296,3252415231,FR
+3252415232,3252415999,LU
+3252416000,3252420607,FR
3252420608,3252424703,NO
-3252424704,3252428321,FR
+3252424704,3252426751,FR
+3252426752,3252427775,US
+3252427776,3252428321,FR
3252428322,3252428322,AO
3252428323,3252428799,FR
3252428800,3252429823,NO
@@ -101825,13 +107050,11 @@
3252496128,3252496383,AU
3252496384,3252500223,SE
3252500224,3252500479,GB
-3252500480,3252501247,SE
-3252501504,3252505343,SE
+3252500480,3252505343,SE
3252505344,3252505599,US
3252505600,3252507135,SE
3252507136,3252507647,RO
-3252507648,3252509183,GB
-3252509440,3252509951,GB
+3252507648,3252510719,GB
3252510720,3252514815,FR
3252514816,3252515071,SI
3252515072,3252515327,GB
@@ -101878,7 +107101,6 @@
3252586496,3252586751,IT
3252586752,3252587007,NL
3252587008,3252587263,CH
-3252587264,3252587519,AT
3252587520,3252587775,UA
3252587776,3252588031,SE
3252588544,3252599807,CH
@@ -102034,14 +107256,12 @@
3253399296,3253399551,IT
3253399552,3253400575,SE
3253400576,3253401087,IT
-3253401088,3253401343,SE
-3253401600,3253402111,SE
+3253401088,3253402111,SE
3253402112,3253402367,IT
3253402368,3253402623,JP
3253402624,3253403647,SE
3253403648,3253403903,PL
-3253403904,3253405563,SE
-3253405565,3253409791,SE
+3253403904,3253409791,SE
3253409792,3253410047,GB
3253410048,3253411839,SE
3253411840,3253412095,US
@@ -102079,7 +107299,7 @@
3253453312,3253453567,NO
3253453568,3253454079,SE
3253454080,3253454335,GB
-3253454592,3253454847,SE
+3253454336,3253454847,SE
3253454848,3253454848,NL
3253454849,3253455615,SE
3253455616,3253455871,US
@@ -102284,7 +107504,9 @@
3253744513,3253744895,GB
3253744896,3253744908,DE
3253744909,3253744909,GB
-3253744910,3253745919,DE
+3253744910,3253745172,DE
+3253745173,3253745173,NO
+3253745174,3253745919,DE
3253745920,3253745983,GB
3253745984,3253745999,SE
3253746000,3253746007,DK
@@ -102342,7 +107564,9 @@
3253768567,3253768703,GB
3253768704,3253768729,DE
3253768730,3253768730,GB
-3253768731,3253770657,DE
+3253768731,3253768831,DE
+3253768832,3253768895,GB
+3253768896,3253770657,DE
3253770658,3253770658,GB
3253770659,3253770699,DE
3253770700,3253770700,GB
@@ -102376,7 +107600,9 @@
3253775469,3253775469,GB
3253775470,3253775599,DE
3253775600,3253775607,IT
-3253775608,3253775615,DE
+3253775608,3253775609,DE
+3253775610,3253775610,GB
+3253775611,3253775615,DE
3253775616,3253775807,GB
3253775808,3253775823,DE
3253775824,3253775871,GB
@@ -102396,9 +107622,10 @@
3253778752,3253778879,BE
3253778880,3253778911,DE
3253778912,3253778943,NL
-3253778944,3253779135,DE
+3253778944,3253779135,GB
3253779136,3253779167,NL
-3253779168,3253779455,DE
+3253779168,3253779199,GB
+3253779200,3253779455,DE
3253779456,3253779711,GB
3253779712,3253781415,DE
3253781416,3253781423,GB
@@ -102411,7 +107638,9 @@
3253782536,3253783487,GB
3253783488,3253783519,DE
3253783520,3253783551,GB
-3253783552,3253784803,DE
+3253783552,3253784391,DE
+3253784392,3253784399,GB
+3253784400,3253784803,DE
3253784804,3253784804,GB
3253784805,3253785123,DE
3253785124,3253785124,GB
@@ -102419,7 +107648,15 @@
3253786624,3253786879,GB
3253786880,3253788079,DE
3253788080,3253788082,GB
-3253788083,3253794303,DE
+3253788083,3253790695,DE
+3253790696,3253790696,GB
+3253790697,3253793007,DE
+3253793008,3253793011,ES
+3253793012,3253793071,DE
+3253793072,3253793087,FR
+3253793088,3253793271,DE
+3253793272,3253793275,GB
+3253793276,3253794303,DE
3253794304,3253796607,GB
3253796608,3253796863,DE
3253796864,3253862399,SE
@@ -102789,6 +108026,7 @@
3254839552,3254839807,PL
3254839808,3254840063,BE
3254840064,3254840319,BG
+3254840320,3254840575,DK
3254840576,3254840831,UA
3254840832,3254841343,GB
3254841344,3254841599,PL
@@ -102889,7 +108127,7 @@
3255132160,3255160831,FR
3255166976,3255169023,FR
3255172352,3255172607,DE
-3255173120,3255173631,GB
+3255173120,3255173631,SH
3255173648,3255173711,GB
3255173760,3255173823,GB
3255173840,3255174151,GB
@@ -102962,8 +108200,9 @@
3255237120,3255237375,AT
3255237888,3255238143,ES
3255238400,3255238655,QA
-3255238656,3255280018,BE
-3255280020,3255292311,BE
+3255238656,3255245759,BE
+3255245760,3255245775,LU
+3255245776,3255292311,BE
3255292312,3255292319,LU
3255292320,3255304191,BE
3255304192,3255304447,DE
@@ -102979,6 +108218,7 @@
3255312384,3255315711,LV
3255315712,3255316223,PL
3255316224,3255316479,RU
+3255316736,3255316991,GB
3255316992,3255317247,FR
3255317248,3255317503,UA
3255317504,3255317759,BE
@@ -103061,12 +108301,13 @@
3255389696,3255390207,PL
3255390720,3255391231,KE
3255391232,3255391743,NL
-3255391744,3255392767,DE
+3255391744,3255391999,DE
+3255392000,3255392255,DK
+3255392256,3255392767,DE
3255392768,3255393791,RO
3255393792,3255399679,SE
3255399680,3255400447,DE
-3255400448,3255400703,CH
-3255400960,3255401471,CH
+3255400448,3255401471,CH
3255401472,3255412479,DE
3255412480,3255412735,RO
3255412736,3255413247,DE
@@ -103081,9 +108322,9 @@
3255426048,3255426559,IT
3255426816,3255427071,PL
3255427072,3255431167,RU
-3255431168,3255434464,GB
-3255434466,3255434495,GB
+3255431168,3255434495,GB
3255434496,3255434720,FR
+3255434721,3255434721,GB
3255434722,3255434751,FR
3255434752,3255435263,GB
3255435264,3255435295,EE
@@ -103174,8 +108415,7 @@
3255507712,3255507967,AT
3255507968,3255508223,UA
3255508224,3255508479,RU
-3255508480,3255521023,CH
-3255521280,3255544319,CH
+3255508480,3255544319,CH
3255544320,3255544575,DE
3255544576,3255544831,AT
3255544832,3255558143,CH
@@ -103185,8 +108425,7 @@
3255560192,3255563263,CH
3255563776,3255564031,CH
3255564032,3255564287,RU
-3255565312,3255565955,DE
-3255565957,3255566079,DE
+3255565312,3255566335,DE
3255566336,3255570431,GB
3255570432,3255574527,CH
3255574528,3255578623,CZ
@@ -103201,8 +108440,7 @@
3255660544,3255666175,NL
3255666432,3255666687,DE
3255668224,3255697407,NL
-3255697408,3255699711,SE
-3255699968,3255704575,SE
+3255697408,3255704575,SE
3255704576,3255705087,FR
3255705088,3255710719,SE
3255710720,3255710975,ES
@@ -103242,8 +108480,7 @@
3255817728,3255820287,DE
3255821312,3255822335,CH
3255822336,3255828479,DE
-3255828480,3255947484,SE
-3255947486,3256025087,SE
+3255828480,3256025087,SE
3256025088,3256057855,NO
3256057856,3256082431,DK
3256082432,3256090623,LV
@@ -103255,8 +108492,7 @@
3256233984,3256238079,SE
3256238080,3256246271,NO
3256246272,3256352767,SE
-3256352768,3256353279,CH
-3256353536,3256385535,CH
+3256352768,3256385535,CH
3256385536,3256393727,AT
3256393728,3256394239,DE
3256394752,3256395263,PL
@@ -103285,8 +108521,7 @@
3256416256,3256416767,RS
3256417280,3256417791,NO
3256417792,3256418303,GB
-3256418304,3256444415,DE
-3256444672,3256483839,DE
+3256418304,3256483839,DE
3256483840,3256487935,NL
3256489472,3256489983,GR
3256489984,3256490239,BE
@@ -103329,7 +108564,6 @@
3256650752,3256652799,UA
3256652800,3256653823,DE
3256653824,3256654847,RU
-3256654848,3256655871,GB
3256655872,3256656895,RU
3256656896,3256657919,GB
3256657920,3256658943,PL
@@ -103390,8 +108624,7 @@
3256791552,3256791807,GR
3256791808,3256792063,PL
3256792064,3256792319,DE
-3256792320,3256792489,CH
-3256792491,3256792575,CH
+3256792320,3256792575,CH
3256792576,3256792831,NL
3256793088,3256793343,GB
3256793344,3256793599,DE
@@ -103446,7 +108679,7 @@
3256945920,3256946175,GB
3256946176,3256946431,RO
3256946432,3256946687,UA
-3256947200,3256947711,DE
+3256946688,3256947711,DE
3256948736,3256950015,GB
3256950272,3256950527,NO
3256950528,3256958975,GB
@@ -103511,7 +108744,7 @@
3257145088,3257145343,GB
3257151488,3257174015,GB
3257174016,3257174271,US
-3257178112,3257180159,GB
+3257174272,3257180159,GB
3257180160,3257180415,TR
3257180416,3257180671,RU
3257180672,3257180927,EE
@@ -103540,12 +108773,9 @@
3257357312,3257357567,PT
3257357568,3257357823,SI
3257357824,3257371903,DE
+3257371904,3257372159,BE
3257372416,3257372671,GB
-3257372672,3257385983,DE
-3257390592,3257390847,DE
-3257391616,3257391625,DE
-3257391627,3257393151,DE
-3257397248,3257401343,DE
+3257372672,3257401343,DE
3257401344,3257453567,CH
3257453568,3257454591,RO
3257454592,3257455103,IT
@@ -103896,11 +109126,7 @@
3258644480,3258646527,SY
3258646528,3258685439,DE
3258685440,3258685695,CH
-3258685696,3258686207,DE
-3258686464,3258686719,DE
-3258687488,3258688511,DE
-3258689792,3258690047,DE
-3258690816,3258691583,DE
+3258685696,3258691583,DE
3258691840,3258692351,AT
3258692352,3258692607,DE
3258692608,3258692863,FR
@@ -104003,9 +109229,7 @@
3259248128,3259248383,GB
3259248384,3259248895,SE
3259248896,3259249151,GB
-3259249152,3259250722,SE
-3259250724,3259252479,SE
-3259252736,3259258623,SE
+3259249152,3259258623,SE
3259258624,3259258879,ES
3259258880,3259260927,SE
3259260928,3259261183,DK
@@ -104033,7 +109257,7 @@
3259291136,3259292415,SE
3259292416,3259292671,IT
3259292672,3259293951,SE
-3259293952,3259294207,LI
+3259293952,3259294207,BG
3259294208,3259297535,SE
3259297536,3259297791,GB
3259297792,3259301887,SE
@@ -104130,8 +109354,7 @@
3259438080,3259438335,ES
3259438336,3259438591,SE
3259438592,3259439103,NO
-3259439104,3259454719,SE
-3259454976,3259457279,SE
+3259439104,3259457279,SE
3259457280,3259457535,IT
3259457536,3259466239,SE
3259466240,3259466495,HU
@@ -104166,9 +109389,7 @@
3259823872,3259824127,IE
3259825408,3259825663,DE
3259826176,3259891711,DE
-3259891712,3259893503,BE
-3259893760,3259900866,BE
-3259900868,3259957247,BE
+3259891712,3259957247,BE
3259957248,3259958271,DE
3259958272,3259959295,RU
3259959296,3259960319,UA
@@ -104220,7 +109441,9 @@
3260571648,3260573695,US
3260573696,3260574719,NL
3260574720,3260575743,IL
-3260575744,3260579839,US
+3260575744,3260579327,US
+3260579328,3260579583,CA
+3260579584,3260579839,US
3260579840,3260580351,PL
3260580352,3260580863,HU
3260580864,3260581375,GB
@@ -104293,19 +109516,12 @@
3261150208,3261202431,DE
3261202432,3261204479,FR
3261204480,3261205503,BE
+3261205504,3261205759,FR
3261205760,3261206015,BE
-3261206016,3261212671,FR
-3261212928,3261213202,FR
-3261213204,3261213439,FR
+3261206016,3261213439,FR
3261213440,3261213695,AF
-3261213696,3261239237,FR
-3261239239,3261267967,FR
-3261267968,3261272063,DE
-3261276160,3261278207,DE
-3261280256,3261280512,DE
-3261280514,3261280767,DE
-3261281280,3261282559,DE
-3261284352,3261296639,DE
+3261213696,3261267967,FR
+3261267968,3261296639,DE
3261296896,3261297151,DE
3261297664,3261297919,RU
3261297920,3261298175,PL
@@ -104344,8 +109560,7 @@
3261677568,3261685759,GB
3261685760,3261687807,DE
3261687808,3261689855,RO
-3261689856,3261690351,GB
-3261690356,3261691903,GB
+3261689856,3261691903,GB
3261691904,3261694463,NL
3261694464,3261694975,RU
3261694976,3261695487,PL
@@ -104493,9 +109708,7 @@
3262049280,3262049535,JO
3262049536,3262049791,GB
3262049792,3262050559,PL
-3262050560,3262050815,GB
-3262050816,3262051071,CH
-3262051072,3262051583,GB
+3262050560,3262051583,GB
3262051584,3262051839,FR
3262052608,3262052863,IL
3262052864,3262053119,GB
@@ -104539,9 +109752,7 @@
3262151936,3262152191,DE
3262152664,3262152671,DE
3262152704,3262185471,AT
-3262185472,3262200319,DE
-3262200832,3262201087,DE
-3262201856,3262222335,DE
+3262185472,3262222335,DE
3262223360,3262223871,DE
3262224896,3262225151,AT
3262226432,3262227455,DE
@@ -104956,8 +110167,8 @@
3262474076,3262474076,MY
3262474077,3262474077,SG
3262474078,3262474078,IN
-3262474079,3262474079,DE
-3262474080,3262474083,SG
+3262474079,3262474080,DE
+3262474081,3262474083,SG
3262474084,3262474084,DE
3262474085,3262474085,SG
3262474086,3262474086,DE
@@ -105161,28 +110372,42 @@
3262475145,3262475152,US
3262475153,3262475155,DE
3262475156,3262475156,US
-3262475157,3262475160,DE
-3262475161,3262475167,US
-3262475168,3262475168,DE
-3262475169,3262475174,US
+3262475157,3262475166,DE
+3262475167,3262475167,US
+3262475168,3262475172,DE
+3262475173,3262475174,US
3262475175,3262475175,DE
-3262475176,3262475179,US
-3262475180,3262475180,DE
-3262475181,3262475185,US
+3262475176,3262475176,US
+3262475177,3262475177,DE
+3262475178,3262475178,US
+3262475179,3262475181,DE
+3262475182,3262475185,US
3262475186,3262475186,DE
-3262475187,3262475189,US
-3262475190,3262475190,MX
+3262475187,3262475188,US
+3262475189,3262475190,DE
3262475191,3262475191,BR
3262475192,3262475192,MX
-3262475193,3262475201,US
-3262475202,3262475203,BR
+3262475193,3262475193,US
+3262475194,3262475195,DE
+3262475196,3262475197,US
+3262475198,3262475199,DE
+3262475200,3262475200,US
+3262475201,3262475202,DE
+3262475203,3262475203,BR
3262475204,3262475204,DE
3262475205,3262475205,BR
-3262475206,3262475209,US
-3262475210,3262475210,BR
-3262475211,3262475213,US
-3262475214,3262475214,DE
-3262475215,3262475221,US
+3262475206,3262475206,DE
+3262475207,3262475207,US
+3262475208,3262475208,DE
+3262475209,3262475209,US
+3262475210,3262475211,DE
+3262475212,3262475212,US
+3262475213,3262475215,DE
+3262475216,3262475216,US
+3262475217,3262475218,DE
+3262475219,3262475219,US
+3262475220,3262475220,DE
+3262475221,3262475221,US
3262475222,3262475271,DE
3262475272,3262475275,IT
3262475276,3262475279,US
@@ -105392,8 +110617,7 @@
3262476692,3262476695,FR
3262476696,3262476707,DE
3262476708,3262476711,US
-3262476712,3262476715,DE
-3262476716,3262476719,FR
+3262476712,3262476719,DE
3262476720,3262476723,IT
3262476724,3262476727,FR
3262476728,3262476735,DE
@@ -105431,9 +110655,7 @@
3262477028,3262477035,FR
3262477036,3262477039,DK
3262477040,3262477043,US
-3262477044,3262477075,DE
-3262477076,3262477079,FR
-3262477080,3262477083,DE
+3262477044,3262477083,DE
3262477084,3262477087,NL
3262477088,3262477091,DE
3262477092,3262477095,BE
@@ -105724,8 +110946,7 @@
3262479054,3262479056,DE
3262479057,3262479057,GB
3262479058,3262479058,FR
-3262479059,3262479062,DE
-3262479063,3262479063,CH
+3262479059,3262479063,DE
3262479064,3262479064,FR
3262479065,3262479065,DE
3262479066,3262479066,IT
@@ -105738,7 +110959,7 @@
3262479077,3262479077,DE
3262479078,3262479078,IT
3262479079,3262479079,ES
-3262479080,3262479080,LU
+3262479080,3262479080,DE
3262479081,3262479081,CH
3262479082,3262479082,IT
3262479083,3262479083,NL
@@ -106233,8 +111454,137 @@
3262479865,3262479865,FR
3262479866,3262479866,DE
3262479867,3262479867,SE
-3262479868,3262479871,DE
-3262480128,3262480133,DE
+3262479868,3262479873,DE
+3262479874,3262479875,FR
+3262479876,3262479876,DE
+3262479877,3262479877,CH
+3262479878,3262479879,DE
+3262479880,3262479880,AT
+3262479881,3262479883,DE
+3262479884,3262479884,GB
+3262479885,3262479888,DE
+3262479889,3262479889,NL
+3262479890,3262479892,DE
+3262479893,3262479893,LU
+3262479894,3262479894,CH
+3262479895,3262479896,ES
+3262479897,3262479899,DE
+3262479900,3262479900,NL
+3262479901,3262479901,AT
+3262479902,3262479908,DE
+3262479909,3262479909,SE
+3262479910,3262479914,DE
+3262479915,3262479915,FR
+3262479916,3262479917,DE
+3262479918,3262479918,GB
+3262479919,3262479922,DE
+3262479923,3262479923,AT
+3262479924,3262479929,DE
+3262479930,3262479930,IT
+3262479931,3262479932,DE
+3262479933,3262479933,NL
+3262479934,3262479936,DE
+3262479937,3262479937,FR
+3262479938,3262479939,DE
+3262479940,3262479940,ES
+3262479941,3262479941,IT
+3262479942,3262479944,DE
+3262479945,3262479945,FR
+3262479946,3262479946,DE
+3262479947,3262479947,HU
+3262479948,3262479948,DE
+3262479949,3262479949,NL
+3262479950,3262479950,CH
+3262479951,3262479955,DE
+3262479956,3262479956,IT
+3262479957,3262479957,BE
+3262479958,3262479961,DE
+3262479962,3262479962,GB
+3262479963,3262479963,ES
+3262479964,3262479964,DE
+3262479965,3262479965,ES
+3262479966,3262479974,DE
+3262479975,3262479975,FR
+3262479976,3262479976,NL
+3262479977,3262479978,DE
+3262479979,3262479979,CH
+3262479980,3262479980,AT
+3262479981,3262479984,DE
+3262479985,3262479985,CH
+3262479986,3262479987,DE
+3262479988,3262479988,FR
+3262479989,3262479989,DE
+3262479990,3262479990,NL
+3262479991,3262479995,DE
+3262479996,3262479996,NL
+3262479997,3262480001,DE
+3262480002,3262480002,BE
+3262480003,3262480005,DE
+3262480006,3262480006,FR
+3262480007,3262480010,DE
+3262480011,3262480011,BE
+3262480012,3262480012,NL
+3262480013,3262480015,DE
+3262480016,3262480016,ES
+3262480017,3262480018,DE
+3262480019,3262480019,BE
+3262480020,3262480021,DE
+3262480022,3262480022,CH
+3262480023,3262480029,DE
+3262480030,3262480030,GB
+3262480031,3262480031,DE
+3262480032,3262480032,CH
+3262480033,3262480033,GB
+3262480034,3262480034,DE
+3262480035,3262480035,LU
+3262480036,3262480038,DE
+3262480039,3262480039,CH
+3262480040,3262480042,DE
+3262480043,3262480043,GB
+3262480044,3262480044,RS
+3262480045,3262480045,GB
+3262480046,3262480048,DE
+3262480049,3262480049,LU
+3262480050,3262480051,DE
+3262480052,3262480052,NL
+3262480053,3262480057,DE
+3262480058,3262480058,NL
+3262480059,3262480059,CH
+3262480060,3262480060,DE
+3262480061,3262480062,GB
+3262480063,3262480063,SI
+3262480064,3262480066,DE
+3262480067,3262480067,NL
+3262480068,3262480073,DE
+3262480074,3262480074,AT
+3262480075,3262480076,DE
+3262480077,3262480078,FR
+3262480079,3262480082,DE
+3262480083,3262480083,NO
+3262480084,3262480084,IT
+3262480085,3262480087,DE
+3262480088,3262480088,FR
+3262480089,3262480089,NL
+3262480090,3262480090,CH
+3262480091,3262480092,DE
+3262480093,3262480093,BE
+3262480094,3262480094,DE
+3262480095,3262480095,AT
+3262480096,3262480097,DE
+3262480098,3262480098,GB
+3262480099,3262480104,DE
+3262480105,3262480105,IT
+3262480106,3262480106,DE
+3262480107,3262480107,DK
+3262480108,3262480109,DE
+3262480110,3262480110,GB
+3262480111,3262480111,AT
+3262480112,3262480112,BE
+3262480113,3262480113,DE
+3262480114,3262480114,IT
+3262480115,3262480116,DE
+3262480117,3262480117,BE
+3262480118,3262480133,DE
3262480134,3262480134,AT
3262480135,3262480135,NL
3262480136,3262480136,FR
@@ -106392,15 +111742,12 @@
3262611456,3262627839,GB
3262627840,3262636031,IT
3262636032,3262644223,BE
-3262644224,3262648319,NL
-3262648576,3262654463,NL
+3262644224,3262654463,NL
3262654464,3262654719,DE
3262654720,3262658303,NL
3262658304,3262658559,DE
3262658560,3262664703,NL
-3262664704,3262665727,DE
-3262665984,3262666751,DE
-3262667008,3262670847,DE
+3262664704,3262670847,DE
3262670848,3262688767,NL
3262688768,3262689023,DE
3262689024,3262690815,NL
@@ -106483,6 +111830,7 @@
3263094528,3263094783,DK
3263094784,3263095039,UA
3263095040,3263095295,ES
+3263095296,3263095551,FR
3263095808,3263096063,DE
3263096064,3263096319,PL
3263096320,3263096575,TR
@@ -106515,8 +111863,7 @@
3263108352,3263108607,US
3263108608,3263109951,DE
3263109952,3263109959,FR
-3263109960,3263121407,DE
-3263121664,3263137791,DE
+3263109960,3263137791,DE
3263137792,3263138303,PL
3263138304,3263138559,DE
3263138560,3263138815,AT
@@ -106686,6 +112033,7 @@
3264299008,3264307199,DE
3264307200,3264311295,PL
3264311808,3264312063,DE
+3264312064,3264312319,CH
3264312576,3264312831,UA
3264312832,3264313087,DE
3264313088,3264313343,NL
@@ -106917,9 +112265,7 @@
3264674304,3264674815,PL
3264674816,3264675327,GB
3264675328,3264675839,RU
-3264675840,3264695233,NL
-3264695235,3264697924,NL
-3264697926,3264741375,NL
+3264675840,3264741375,NL
3264741376,3264749567,SI
3264749568,3264750079,LV
3264750080,3264750591,RU
@@ -106949,7 +112295,7 @@
3264826880,3264827135,NL
3264827136,3264827391,LV
3264827648,3264828159,GR
-3264828160,3264828415,DE
+3264828160,3264828415,CH
3264828416,3264828671,SE
3264828672,3264828927,MT
3264828928,3264829439,DE
@@ -107029,8 +112375,7 @@
3265003520,3265005567,DE
3265009664,3265009919,FR
3265009920,3265010175,DE
-3265011712,3265015807,DE
-3265016064,3265018879,DE
+3265011712,3265018879,DE
3265018880,3265019903,HK
3265036288,3265044479,DE
3265044736,3265044991,DE
@@ -107125,8 +112470,7 @@
3265378304,3265380095,NL
3265380096,3265384447,GB
3265384448,3265386495,DE
-3265386496,3265386751,NL
-3265387008,3265387263,NL
+3265386496,3265387519,NL
3265388544,3265396735,GB
3265396736,3265527807,DE
3265527808,3265593343,GB
@@ -107156,7 +112500,7 @@
3265605632,3265605887,PL
3265605888,3265606143,FR
3265606144,3265606399,RU
-3265606400,3265606655,NL
+3265606400,3265606655,BE
3265606656,3265606911,AT
3265606912,3265607167,RU
3265607168,3265607423,PL
@@ -107234,10 +112578,7 @@
3265920768,3265921023,RU
3265921024,3265986559,AE
3265986560,3266052095,NL
-3266052096,3266122751,DE
-3266123008,3266199807,DE
-3266200064,3266310911,DE
-3266311168,3266322431,DE
+3266052096,3266322431,DE
3266322432,3266330623,LT
3266330624,3266338815,GB
3266338816,3266339071,RU
@@ -107317,7 +112658,9 @@
3266798848,3266798879,CZ
3266798880,3266802367,GB
3266802368,3266802399,BG
-3266802400,3266804095,GB
+3266802400,3266803215,GB
+3266803216,3266803219,FR
+3266803220,3266804095,GB
3266804096,3266804127,NL
3266804128,3266804479,GB
3266804480,3266804735,NL
@@ -107350,8 +112693,7 @@
3267059712,3267060735,NL
3267060736,3267061759,LV
3267061760,3267063807,UA
-3267063808,3267064576,BE
-3267064578,3267064831,BE
+3267063808,3267064831,BE
3267064832,3267065855,PL
3267066880,3267067903,IT
3267067904,3267068927,UA
@@ -107400,8 +112742,7 @@
3267297280,3267357132,CH
3267357133,3267357133,US
3267357134,3267362815,CH
-3267362816,3267368480,DK
-3267368482,3267428351,DK
+3267362816,3267428351,DK
3267428352,3267493887,GB
3267501056,3267504127,GB
3267511296,3267512319,FR
@@ -107448,12 +112789,9 @@
3267846912,3267887103,FR
3267887104,3268017469,GB
3268017470,3268017470,KE
-3268017471,3268078591,GB
-3268078848,3268139005,GB
-3268139007,3268149247,GB
+3268017471,3268149247,GB
3268149248,3268165631,EE
-3268165632,3268167170,CH
-3268167172,3268173823,CH
+3268165632,3268173823,CH
3268173824,3268182015,MT
3268182016,3268198399,PL
3268198400,3268214783,MA
@@ -107688,8 +113026,7 @@
3269285216,3269285311,FR
3269285312,3269285327,DE
3269285336,3269285343,FR
-3269285344,3269285344,GB
-3269285346,3269285375,GB
+3269285344,3269285375,GB
3269285376,3269285631,FR
3269285632,3269285887,DE
3269286400,3269286463,DE
@@ -107820,12 +113157,11 @@
3270836224,3270901759,DE
3270901760,3270903807,IT
3270903808,3270905855,SE
-3270906112,3270909951,IT
+3270905856,3270909951,IT
3270911840,3270911871,PL
3270911872,3270911935,DE
3270911968,3270911999,NL
-3270913024,3270913535,DE
-3270913792,3270920703,DE
+3270913024,3270920703,DE
3270920704,3270921215,UA
3270921216,3270921471,DK
3270921472,3270921727,UA
@@ -108038,8 +113374,7 @@
3271425280,3271425535,DK
3271425536,3271426047,DE
3271426048,3271491583,FR
-3271491584,3271513343,DK
-3271513600,3271557119,DK
+3271491584,3271557119,DK
3271557120,3271589887,BE
3271589888,3271688191,NO
3271691776,3271692031,US
@@ -108367,7 +113702,7 @@
3272353792,3272355839,CH
3272355840,3272356351,GB
3272356352,3272356607,ES
-3272356608,3272356863,FR
+3272356608,3272356863,GB
3272356864,3272357887,RO
3272357888,3272358911,UA
3272358912,3272359935,NL
@@ -108449,7 +113784,7 @@
3272625152,3272626175,UA
3272626176,3272627199,DE
3272627200,3272628223,NL
-3272628224,3272629247,CZ
+3272628224,3272629247,LT
3272629248,3272638463,RU
3272638464,3272646655,ES
3272646656,3272647385,GB
@@ -108560,8 +113895,7 @@
3273026560,3273028607,UA
3273028608,3273029631,PL
3273029632,3273029887,CH
-3273029888,3273029897,GB
-3273029899,3273030143,GB
+3273029888,3273030143,GB
3273030400,3273030655,RU
3273030656,3273031679,PL
3273031680,3273032191,GB
@@ -108603,7 +113937,9 @@
3273193472,3273193983,PL
3273194496,3273195007,UA
3273195008,3273195519,RU
-3273195520,3273261055,FR
+3273195520,3273200387,FR
+3273200388,3273200388,GB
+3273200389,3273261055,FR
3273261056,3273261567,NO
3273261568,3273262079,BE
3273262080,3273262591,LU
@@ -108826,8 +114162,7 @@
3273523200,3273588735,DE
3273588736,3273687039,IT
3273687040,3273719807,DE
-3273719808,3273719883,NL
-3273719885,3273727079,NL
+3273719808,3273727079,NL
3273727080,3273727088,GB
3273727089,3273727095,ES
3273727096,3273727103,DE
@@ -108839,17 +114174,13 @@
3273727152,3273727167,IT
3273727168,3273728511,NL
3273728512,3273728590,GB
+3273728591,3273728592,NL
3273728593,3273728767,GB
3273728768,3273732095,NL
3273732096,3273736191,GB
3273736192,3273744383,FR
-3273744384,3273746943,GB
-3273747200,3273752575,GB
-3273752576,3273752831,NL
-3273753088,3273753343,NL
-3273753600,3273755647,NL
-3273755904,3273762303,NL
-3273762560,3273768959,NL
+3273744384,3273752575,GB
+3273752576,3273768959,NL
3273768960,3273785343,TR
3273785344,3273801727,RU
3273801728,3273802239,DE
@@ -108873,7 +114204,7 @@
3273835520,3273836543,UA
3273837568,3273838591,UA
3273838592,3273839615,PL
-3273839616,3273840639,LT
+3273839616,3273840639,EE
3273840640,3273841663,PL
3273841664,3273842687,AT
3273842688,3273850879,RU
@@ -109160,8 +114491,7 @@
3274604544,3274612735,TR
3274612736,3274620927,RU
3274620928,3274629119,FR
-3274629120,3274635519,LU
-3274635776,3274637311,LU
+3274629120,3274637311,LU
3274637312,3274670079,CZ
3274670080,3274686463,DK
3274686464,3274686719,RU
@@ -109432,10 +114762,10 @@
3275110912,3275111423,GB
3275111424,3275111935,IT
3275111936,3275112447,FR
-3275112448,3275117581,DK
-3275117583,3275120639,DK
+3275112448,3275120639,DK
3275120640,3275137023,SE
-3275137536,3275138047,UA
+3275137536,3275137791,NL
+3275137792,3275138047,UA
3275138048,3275138559,DE
3275139072,3275139583,PT
3275140096,3275140607,AT
@@ -109450,9 +114780,7 @@
3275158375,3275158375,US
3275158376,3275161599,GB
3275161600,3275227135,ES
-3275227136,3275246847,HU
-3275247104,3275262975,HU
-3275263232,3275292671,HU
+3275227136,3275292671,HU
3275292672,3275358207,ES
3275358208,3275374591,RU
3275374592,3275382783,GB
@@ -109589,7 +114917,7 @@
3275475292,3275475295,GB
3275475376,3275475399,GB
3275475408,3275475447,GB
-3275475456,3275475791,GB
+3275475456,3275475783,GB
3275475800,3275475807,GB
3275475824,3275475831,GB
3275475840,3275475871,GB
@@ -109696,7 +115024,6 @@
3275552768,3275553791,LV
3275553792,3275554815,FI
3275588448,3275588463,BE
-3275590656,3275590911,BE
3275612928,3275613183,LU
3275620352,3275622399,RU
3275622400,3275623423,GB
@@ -109741,8 +115068,7 @@
3275669504,3275677695,GB
3275677696,3275685887,IT
3275685888,3275751423,DE
-3275751424,3275751679,AT
-3275751936,3275759615,AT
+3275751424,3275759615,AT
3275759616,3275775999,NL
3275776000,3275784191,DE
3275784704,3275785215,PL
@@ -109776,9 +115102,7 @@
3275800064,3275800575,UA
3275800576,3275808767,RU
3275808768,3275816959,UA
-3275816960,3275839231,CH
-3275839264,3275839295,CH
-3275839488,3275882495,CH
+3275816960,3275882495,CH
3275882496,3275884543,DE
3275884544,3275886591,IT
3275886592,3275888639,PL
@@ -109885,7 +115209,9 @@
3276028384,3276028391,FR
3276028392,3276028543,GB
3276028544,3276028671,FR
-3276028672,3276030591,GB
+3276028672,3276029375,GB
+3276029376,3276029439,FR
+3276029440,3276030591,GB
3276030592,3276030607,FR
3276030608,3276031479,GB
3276031480,3276031487,FR
@@ -110090,8 +115416,7 @@
3276687872,3276688383,KW
3276688384,3276688895,DE
3276688896,3276689407,ES
-3276689408,3276689919,GB
-3276689920,3276690431,CN
+3276689408,3276690431,GB
3276690432,3276690943,NL
3276690944,3276691455,GR
3276691456,3276691967,RO
@@ -110477,13 +115802,13 @@
3276859392,3276859647,UA
3276859648,3276859903,CH
3276859904,3276860159,AT
+3276860160,3276860415,CH
3276860416,3276860927,PL
3276860928,3276861183,BE
3276861184,3276861439,DE
3276861440,3276865535,DK
-3276865536,3276866303,NL
-3276866560,3276866815,GB
-3276867072,3276868703,GB
+3276865536,3276866559,NL
+3276866560,3276868703,GB
3276868704,3276868711,BE
3276868712,3276869631,GB
3276869632,3276871679,IT
@@ -110499,7 +115824,9 @@
3276876280,3276876283,DK
3276876284,3276880427,GB
3276880428,3276880431,DK
-3276880432,3276881811,GB
+3276880432,3276881411,GB
+3276881412,3276881415,FR
+3276881416,3276881811,GB
3276881812,3276881815,FR
3276881816,3276881919,GB
3276881920,3276882687,IT
@@ -110751,7 +116078,7 @@
3277371392,3277371903,RU
3277371904,3277372415,PL
3277372416,3277372927,IR
-3277372928,3277373951,RU
+3277373440,3277373951,RU
3277373952,3277374463,FR
3277374464,3277375999,RU
3277376000,3277376511,NL
@@ -110991,8 +116318,7 @@
3278241792,3278307327,GB
3278307328,3278372863,IT
3278372864,3278635007,GB
-3278635008,3278635263,NL
-3278635520,3278766079,NL
+3278635008,3278766079,NL
3278767104,3278767615,RO
3278767616,3278768127,UA
3278768128,3278769151,GB
@@ -111123,9 +116449,7 @@
3278938664,3278938667,GB
3278938668,3278938675,DE
3278938676,3278938679,FR
-3278938680,3278938687,DE
-3278938688,3278938691,CH
-3278938692,3278938695,DE
+3278938680,3278938695,DE
3278938696,3278938699,IT
3278938700,3278938703,ES
3278938704,3278938707,FR
@@ -111236,8 +116560,7 @@
3278939484,3278939491,NL
3278939492,3278939495,DE
3278939496,3278939499,CH
-3278939500,3278939511,DE
-3278939512,3278939515,LU
+3278939500,3278939515,DE
3278939516,3278939523,NL
3278939524,3278939527,LU
3278939528,3278939531,FR
@@ -111322,8 +116645,7 @@
3278940108,3278940111,SG
3278940112,3278940115,DE
3278940116,3278940127,SG
-3278940128,3278940159,DE
-3278940160,3278940163,GR
+3278940128,3278940163,DE
3278940164,3278940167,CH
3278940168,3278940171,DE
3278940172,3278940175,FR
@@ -112431,8 +117753,7 @@
3278943819,3278943819,AT
3278943820,3278943820,DE
3278943821,3278943821,SM
-3278943822,3278943822,PL
-3278943823,3278943823,DE
+3278943822,3278943823,DE
3278943824,3278943824,CH
3278943825,3278943826,DE
3278943827,3278943827,AT
@@ -112731,21 +118052,29 @@
3278944251,3278944251,AT
3278944252,3278944252,IT
3278944253,3278944254,GB
-3278944255,3278944256,DE
-3278944257,3278944272,US
+3278944255,3278944257,DE
+3278944258,3278944258,US
+3278944259,3278944262,DE
+3278944263,3278944264,US
+3278944265,3278944268,DE
+3278944269,3278944269,US
+3278944270,3278944272,DE
3278944273,3278944273,CA
-3278944274,3278944274,US
-3278944275,3278944275,CA
-3278944276,3278944277,US
-3278944278,3278944278,VE
-3278944279,3278944279,DE
-3278944280,3278944284,US
-3278944285,3278944285,DE
-3278944286,3278944286,US
-3278944287,3278944288,CA
-3278944289,3278944293,US
+3278944274,3278944279,DE
+3278944280,3278944280,US
+3278944281,3278944288,DE
+3278944289,3278944289,US
+3278944290,3278944291,DE
+3278944292,3278944292,US
+3278944293,3278944293,DE
3278944294,3278944294,CA
-3278944295,3278944346,US
+3278944295,3278944295,US
+3278944296,3278944298,DE
+3278944299,3278944301,US
+3278944302,3278944302,DE
+3278944303,3278944303,US
+3278944304,3278944312,DE
+3278944313,3278944346,US
3278944347,3278944347,AR
3278944348,3278944360,US
3278944361,3278944361,AR
@@ -113040,8 +118369,7 @@
3278945810,3278945810,CH
3278945811,3278945815,DE
3278945816,3278945816,GB
-3278945817,3278945821,DE
-3278945822,3278945822,GR
+3278945817,3278945822,DE
3278945823,3278945823,CH
3278945824,3278945827,DE
3278945828,3278945828,FR
@@ -113311,9 +118639,7 @@
3279671296,3279673343,LV
3279673344,3279675391,NL
3279675392,3279683583,UA
-3279683584,3279688191,DE
-3279688448,3279895295,DE
-3279895552,3279946751,DE
+3279683584,3279946751,DE
3279946752,3279947775,SE
3279947776,3279948799,NL
3279949824,3279950847,UA
@@ -113437,7 +118763,7 @@
3280396288,3280404479,FI
3280404480,3280437247,IT
3280437248,3280453631,DE
-3280453632,3280454655,RO
+3280453632,3280454655,IT
3280454656,3280455679,UA
3280455680,3280456703,IT
3280456704,3280457727,RU
@@ -113495,7 +118821,7 @@
3280592896,3280593407,DE
3280593408,3280593919,UA
3280593920,3280594431,LU
-3280594432,3280594687,NL
+3280594432,3280594943,NL
3280594944,3280595455,UA
3280595456,3280595967,DE
3280595968,3280596479,DK
@@ -113672,9 +118998,7 @@
3281043456,3281049615,RU
3281049616,3281049622,GI
3281049623,3281059839,RU
-3281059840,3281062911,DE
-3281063040,3281063111,DE
-3281063168,3281125375,DE
+3281059840,3281125375,DE
3281125376,3281133567,CZ
3281133568,3281141759,IR
3281141760,3281149951,RU
@@ -113729,6 +119053,7 @@
3281351680,3281351935,TR
3281351936,3281352191,UA
3281352192,3281352447,PL
+3281352704,3281352959,DE
3281352960,3281353215,GB
3281353216,3281353471,DE
3281353472,3281353727,SE
@@ -113803,6 +119128,9 @@
3282104320,3282105343,IL
3282105344,3282106367,RU
3282106368,3282107391,DE
+3282107392,3282107654,NL
+3282107655,3282107655,CH
+3282107656,3282108415,NL
3282108416,3282173951,RU
3282173952,3282174463,UA
3282174464,3282174975,GB
@@ -113843,7 +119171,6 @@
3282468352,3282477055,GB
3282477056,3282485247,RU
3282485248,3282493439,GI
-3282493440,3282501631,NG
3282501632,3282534399,GR
3282534400,3282538495,GB
3282538496,3282542591,PL
@@ -113871,7 +119198,7 @@
3282741248,3282741503,PT
3282741504,3282741759,GB
3282741760,3282742015,ES
-3282742016,3282742527,RO
+3282742016,3282742271,RO
3282742528,3282742783,GB
3282742784,3282743039,RU
3282743040,3282743295,CH
@@ -113891,8 +119218,7 @@
3282746624,3282746879,SE
3282747136,3282747391,PL
3282747392,3282763775,RU
-3282763776,3282772991,GB
-3282773248,3282960383,GB
+3282763776,3282960383,GB
3282960384,3283091455,TR
3283091456,3283111935,CH
3283111936,3283113471,LI
@@ -113920,8 +119246,7 @@
3283209728,3283210239,TR
3283210240,3283210751,UA
3283210752,3283211263,PL
-3283211264,3283211488,GB
-3283211490,3283211775,GB
+3283211264,3283211775,GB
3283211776,3283212287,NL
3283212288,3283212799,PL
3283212800,3283213311,BG
@@ -114152,7 +119477,7 @@
3283995136,3283995647,BE
3283995648,3283996159,CH
3283996160,3283996671,MK
-3283996672,3283997183,RO
+3283996672,3283997183,ES
3283997184,3283997695,PS
3283997696,3283998207,SA
3283998208,3283998719,UA
@@ -114284,7 +119609,6 @@
3284096000,3284096511,IT
3284096512,3284097023,GB
3284097024,3284097535,RU
-3284097536,3284098047,UA
3284098048,3284098559,DE
3284098560,3284099071,BG
3284099072,3284099327,SI
@@ -114293,8 +119617,7 @@
3284100096,3284100607,AM
3284101120,3284101631,UA
3284101632,3284102143,GB
-3284102144,3284102399,DK
-3284102627,3284102627,DK
+3284102144,3284102655,DK
3284102656,3284103167,AT
3284103168,3284103679,NL
3284103680,3284104191,DE
@@ -114371,8 +119694,7 @@
3284204032,3284204543,FI
3284204544,3284205311,DE
3284205312,3284205567,ES
-3284205568,3284206335,NL
-3284206592,3284257535,NL
+3284205568,3284257535,NL
3284257536,3284257791,GB
3284257792,3284271103,NL
3284271104,3284399155,GB
@@ -114411,8 +119733,7 @@
3284715008,3284715263,GB
3284715264,3284715519,PL
3284715520,3284715775,SI
-3284715776,3284715816,BE
-3284715818,3284716031,BE
+3284715776,3284716031,BE
3284716032,3284716287,IT
3284716288,3284716543,RU
3284716544,3284716799,GR
@@ -114460,8 +119781,8 @@
3285065728,3285073919,RU
3285073920,3285074431,NL
3285074432,3285074687,GB
-3285074688,3285076479,NL
-3285076736,3285076767,BE
+3285074688,3285076607,NL
+3285076608,3285076767,BE
3285076768,3285078111,NL
3285078112,3285078143,GB
3285078144,3285078175,NL
@@ -114596,8 +119917,7 @@
3285515776,3285515799,GR
3285515816,3285515823,GR
3285516032,3285516095,HR
-3285516288,3285544959,BE
-3285545216,3285581823,BE
+3285516288,3285581823,BE
3285581824,3285596159,DE
3285596160,3285596191,US
3285596192,3285596223,DE
@@ -114677,7 +119997,7 @@
3285913648,3285913655,IE
3285913656,3285913703,GB
3285913704,3285913711,FI
-3285913712,3285913983,GB
+3285913712,3285913991,GB
3285915904,3285916159,AT
3285917696,3285917703,GB
3285917712,3285917807,GB
@@ -114715,7 +120035,7 @@
3285931584,3285931599,DE
3285935872,3285936127,GB
3285936136,3285936147,FR
-3285936152,3285936175,FR
+3285936152,3285936223,FR
3285939136,3285939175,GB
3285939184,3285939191,GB
3285939744,3285939759,GB
@@ -114992,7 +120312,6 @@
3286919168,3286920191,DE
3286921216,3286922239,UA
3286922240,3286923263,GB
-3286923264,3286924287,CM
3286925312,3286925823,DE
3286926080,3286926335,LV
3286926336,3286926591,UA
@@ -115070,14 +120389,14 @@
3287165952,3287166207,SA
3287166208,3287167487,US
3287167488,3287167743,SA
-3287167744,3287168511,US
+3287167744,3287168767,US
3287168768,3287169279,SA
3287169280,3287169535,US
3287169536,3287169791,SA
3287169792,3287170303,US
3287170304,3287170559,DE
3287170560,3287171071,US
-3287171072,3287171583,LT
+3287171072,3287171583,EE
3287171584,3287172095,PL
3287172608,3287173119,PL
3287173120,3287173631,RU
@@ -115499,7 +120818,6 @@
3288429312,3288429567,ZA
3288429568,3288430079,KE
3288430080,3288430335,GH
-3288430336,3288430591,EG
3288430592,3288432639,SC
3288432640,3288433407,ZA
3288433408,3288433919,KE
@@ -115522,8 +120840,7 @@
3288444928,3288449023,NG
3288449024,3288465407,SD
3288465408,3288465919,JM
-3288465920,3288466175,BW
-3288466176,3288466431,ZA
+3288465920,3288466431,ZA
3288466432,3288467455,SY
3288467456,3288469503,BI
3288469504,3288481791,ZA
@@ -115538,17 +120855,15 @@
3288532992,3288534527,PR
3288534528,3288535039,EG
3288535040,3288539135,CW
-3288539136,3288543487,US
-3288543744,3288543983,US
+3288539136,3288543986,US
3288543987,3288543987,CH
-3288544000,3288544498,US
-3288544500,3288544767,US
+3288543988,3288544767,US
3288544768,3288545023,MX
3288545024,3288545279,FR
3288545280,3288545535,AU
3288545536,3288545791,ZA
3288545792,3288546303,KE
-3288546304,3288547327,NG
+3288547072,3288547327,NG
3288547328,3288547583,GH
3288547584,3288547839,IN
3288547840,3288548095,SA
@@ -115573,7 +120888,6 @@
3288569856,3288570111,CU
3288570112,3288570367,JM
3288570368,3288577023,ZA
-3288577280,3288577535,NG
3288578048,3288580095,JM
3288580096,3288588287,BB
3288588288,3288608255,ZA
@@ -115601,7 +120915,7 @@
3288780800,3288782591,ZA
3288782592,3288782847,KE
3288782848,3288783359,NG
-3288783360,3288784127,KE
+3288783872,3288784127,KE
3288784128,3288785407,ZA
3288785408,3288785663,UG
3288785664,3288785919,TZ
@@ -115640,8 +120954,7 @@
3289048832,3289049087,NG
3289049088,3289053951,ZA
3289053952,3289055231,NG
-3289055232,3289070335,ZA
-3289070336,3289070591,ZW
+3289055232,3289070591,ZA
3289070592,3289070847,NA
3289070848,3289071103,ZA
3289071104,3289071359,SO
@@ -115716,8 +121029,7 @@
3289230848,3289231359,GH
3289231360,3289233919,ZA
3289233920,3289234175,TZ
-3289234176,3289235199,ZA
-3289235200,3289235455,KE
+3289234176,3289235455,ZA
3289235456,3289237503,GH
3289237504,3289238015,ZA
3289238016,3289238271,KE
@@ -115741,7 +121053,9 @@
3289251328,3289251583,ZA
3289251584,3289251839,KE
3289251840,3289319423,ZA
+3289319424,3289319679,MU
3289319680,3289319935,ZA
+3289319936,3289320447,MU
3289320448,3289321471,ZA
3289321472,3289325567,IN
3289325568,3289333759,SA
@@ -115757,10 +121071,22 @@
3289412608,3289413631,US
3289413632,3289414655,SC
3289414656,3289415679,US
-3289415680,3289440255,SC
+3289415680,3289424895,SC
+3289424896,3289425919,US
+3289425920,3289426943,SC
+3289426944,3289427967,US
+3289427968,3289428991,SC
+3289428992,3289430015,US
+3289430016,3289431039,SC
+3289431040,3289433087,US
+3289433088,3289433599,SC
+3289433600,3289434111,US
+3289434112,3289435135,SC
+3289435136,3289436159,US
+3289436160,3289440255,SC
3289440256,3289448447,ZA
-3289448448,3289464831,US
-3289464832,3289473023,SC
+3289448448,3289465855,US
+3289465856,3289473023,SC
3289473024,3289475071,US
3289475072,3289475583,HU
3289475584,3289476095,SC
@@ -115769,7 +121095,20 @@
3289478144,3289479167,US
3289479168,3289480191,SC
3289480192,3289481215,US
-3289481216,3289530367,SC
+3289481216,3289490431,SC
+3289490432,3289491455,US
+3289491456,3289492479,SC
+3289492480,3289493503,US
+3289493504,3289494527,SC
+3289494528,3289495551,US
+3289495552,3289496575,SC
+3289496576,3289498623,US
+3289498624,3289500671,SC
+3289500672,3289501695,US
+3289501696,3289515007,SC
+3289515008,3289516031,US
+3289516032,3289518079,SC
+3289518080,3289530367,US
3289530368,3289538559,NL
3289538560,3289540607,US
3289540608,3289541119,ES
@@ -115779,11 +121118,22 @@
3289543680,3289544703,US
3289544704,3289545727,SC
3289545728,3289546751,US
-3289546752,3289579519,SC
+3289546752,3289550847,SC
+3289550848,3289551871,US
+3289551872,3289552895,SC
+3289552896,3289553919,US
+3289553920,3289554943,SC
+3289554944,3289555967,US
+3289555968,3289556991,SC
+3289556992,3289558015,US
+3289558016,3289563135,SC
+3289563136,3289565183,US
+3289565184,3289566207,SC
+3289566208,3289567231,US
+3289567232,3289579519,SC
3289579520,3289581567,US
-3289581568,3289582591,SC
-3289582592,3289583615,US
-3289583616,3289595903,SC
+3289581568,3289582591,DE
+3289582592,3289595903,US
3289595904,3289604095,NL
3289604096,3289606143,US
3289606144,3289606655,AT
@@ -115792,8 +121142,12 @@
3289608192,3289609215,SC
3289609216,3289610239,US
3289610240,3289611263,SC
-3289611264,3289612287,US
-3289612288,3289645055,SC
+3289611264,3289622527,US
+3289622528,3289628671,SC
+3289628672,3289630719,US
+3289630720,3289631743,SC
+3289631744,3289632767,US
+3289632768,3289645055,SC
3289645056,3289653247,NA
3289653248,3289661439,EG
3289661440,3289677823,DZ
@@ -115802,7 +121156,6 @@
3289777408,3289777663,EG
3289777664,3289777919,NG
3289777920,3289778175,EG
-3289778176,3289779199,CD
3289779200,3289780223,GW
3289780224,3289788415,ZA
3289788416,3289792511,MZ
@@ -115855,7 +121208,6 @@
3290267648,3290275839,ZA
3290275840,3290284031,SD
3290284032,3290288127,AO
-3290288128,3290292223,NG
3290292224,3290296319,GH
3290296320,3290423295,ZA
3290423296,3290427391,NA
@@ -115868,7 +121220,6 @@
3290456064,3290460159,ZA
3290460160,3290464255,ML
3290464256,3290472447,PR
-3290472448,3290480639,ZA
3290480640,3290482687,AO
3290482688,3290484735,CF
3290484736,3290486783,ZA
@@ -115925,8 +121276,8 @@
3291078656,3291086847,DZ
3291086848,3291103231,PR
3291103232,3291119615,ZA
-3291119616,3291152383,BG
-3291152384,3291168767,ZA
+3291119616,3291148287,BG
+3291148288,3291168767,ZA
3291168768,3291176959,TZ
3291176960,3291185151,ZW
3291185152,3291201535,UG
@@ -115985,16 +121336,13 @@
3291216640,3291217151,NG
3291217152,3291217407,ZA
3291217408,3291217919,TZ
-3291217920,3291230207,ZA
-3291230208,3291234303,GH
-3291234304,3291242495,ZA
+3291217920,3291242495,ZA
3291242496,3291250687,GH
3291250688,3291258879,NA
3291258880,3291262975,TZ
3291262976,3291267071,ZW
3291267072,3291279359,ZA
3291279360,3291283455,RW
-3291283456,3291287551,NA
3291287552,3291291647,ZA
3291291648,3291295743,TZ
3291295744,3291299839,NG
@@ -116009,9 +121357,7 @@
3291326464,3291330559,ZA
3291330560,3291331583,TZ
3291331584,3291332607,MW
-3291332608,3291332615,ZA
-3291332616,3291332863,NG
-3291332864,3291348991,ZA
+3291332608,3291348991,ZA
3291348992,3291353087,MZ
3291353088,3291353343,KE
3291353344,3291353599,EG
@@ -116041,9 +121387,7 @@
3291385856,3291386879,NG
3291386880,3291387903,SC
3291387904,3291388927,BJ
-3291388928,3291389307,GA
-3291389308,3291389311,KM
-3291389312,3291389343,GA
+3291388928,3291389343,GA
3291389344,3291389347,CG
3291389348,3291389951,GA
3291389952,3291397119,ZA
@@ -116057,26 +121401,17 @@
3291426816,3291430911,NA
3291430912,3291432703,ZA
3291432704,3291432959,NA
-3291432960,3291434239,ZA
-3291434752,3291436031,ZA
-3291436032,3291437823,NA
+3291432960,3291435263,ZA
+3291435264,3291436287,NA
+3291436288,3291436799,ZA
+3291436800,3291437823,NA
3291437824,3291438079,ZA
-3291438080,3291439103,NA
+3291438080,3291438847,NA
+3291438848,3291439103,ZA
3291439104,3291447295,NG
3291447296,3291463679,CI
3291463680,3291480063,ZA
-3291480064,3291486463,DE
-3291486464,3291486719,US
-3291486720,3291488255,DE
-3291488256,3291488511,US
-3291488512,3291492351,SC
-3291492352,3291492607,US
-3291492608,3291496447,SC
-3291496448,3291512831,US
-3291512832,3291522559,SC
-3291522560,3291522815,US
-3291522816,3291529215,SC
-3291529216,3291545599,US
+3291480064,3291545599,SC
3291545600,3291545855,CI
3291545856,3291546111,GM
3291546112,3291546367,NA
@@ -116137,9 +121472,11 @@
3291751424,3291751679,SG
3291751680,3291751935,US
3291751936,3291752191,HK
-3291752192,3291753471,US
+3291752192,3291752447,US
+3291752448,3291752959,CA
+3291752960,3291753471,US
3291753472,3291753727,GB
-3291753728,3291753983,US
+3291753728,3291753983,KH
3291753984,3291754239,JP
3291754240,3291754495,US
3291754496,3291754751,AU
@@ -116189,7 +121526,11 @@
3291827200,3291827455,CA
3291827456,3291828223,US
3291828224,3291828479,GB
-3291828480,3291879935,US
+3291828480,3291828735,US
+3291828736,3291829247,CA
+3291829248,3291830271,US
+3291830272,3291832319,KH
+3291832320,3291879935,US
3291879936,3291880191,AU
3291880192,3291883775,US
3291883776,3291884031,CA
@@ -116224,171 +121565,458 @@
3292004864,3292005375,US
3292005376,3292005631,CZ
3292005632,3292005887,SC
-3292005888,3292007423,US
+3292005888,3292006399,US
+3292006400,3292007167,SC
+3292007168,3292007423,US
3292007424,3292007679,SC
-3292007680,3292019199,US
+3292007680,3292008191,US
+3292008192,3292008447,SC
+3292008448,3292009471,US
+3292009472,3292009983,SC
+3292009984,3292011519,US
+3292011520,3292011775,SC
+3292011776,3292013055,US
+3292013056,3292013311,SC
+3292013312,3292013823,US
+3292013824,3292014079,SC
+3292014080,3292014335,US
+3292014336,3292014591,SC
+3292014592,3292016127,US
+3292016128,3292016383,SC
+3292016384,3292018175,US
+3292018176,3292018687,SC
+3292018688,3292019199,US
3292019200,3292019455,SC
3292019456,3292019711,US
3292019712,3292019967,SC
-3292019968,3292022015,US
-3292022016,3292022271,SC
-3292022272,3292023295,US
-3292023296,3292023551,SC
-3292023552,3292031743,US
-3292031744,3292032255,SC
-3292032256,3292033791,US
+3292019968,3292020479,US
+3292020480,3292020735,SC
+3292020736,3292021247,US
+3292021248,3292021503,SC
+3292021504,3292021759,US
+3292021760,3292022271,SC
+3292022272,3292022783,US
+3292022784,3292023551,SC
+3292023552,3292024831,US
+3292024832,3292025343,SC
+3292025344,3292027647,US
+3292027648,3292027903,SC
+3292027904,3292028415,US
+3292028416,3292028671,SC
+3292028672,3292029439,US
+3292029440,3292029951,SC
+3292029952,3292030463,US
+3292030464,3292030719,SC
+3292030720,3292031487,US
+3292031488,3292032511,SC
+3292032512,3292033791,US
3292033792,3292034047,SC
3292034048,3292034303,US
-3292034304,3292034559,SC
-3292034560,3292035839,US
+3292034304,3292034815,SC
+3292034816,3292035071,US
+3292035072,3292035327,SC
+3292035328,3292035839,US
3292035840,3292036095,SC
-3292036096,3292036351,US
-3292036352,3292036607,SC
-3292036608,3292036863,US
-3292036864,3292037119,SC
-3292037120,3292047103,US
+3292036096,3292036607,US
+3292036608,3292036863,SC
+3292036864,3292038911,US
+3292038912,3292039167,SC
+3292039168,3292040959,US
+3292040960,3292041471,SC
+3292041472,3292043007,US
+3292043008,3292043263,SC
+3292043264,3292043519,US
+3292043520,3292043775,SC
+3292043776,3292044543,US
+3292044544,3292045055,SC
+3292045056,3292045311,US
+3292045312,3292045567,SC
+3292045568,3292045823,US
+3292045824,3292046079,SC
+3292046080,3292047103,US
3292047104,3292047359,SC
-3292047360,3292049663,US
+3292047360,3292047615,US
+3292047616,3292047871,SC
+3292047872,3292048383,US
+3292048384,3292049151,SC
+3292049152,3292049663,US
3292049664,3292049919,SC
-3292049920,3292050431,US
-3292050432,3292050687,SC
-3292050688,3292054015,US
-3292054016,3292054271,SC
-3292054272,3292059135,US
-3292059136,3292059391,SC
-3292059392,3292065023,US
-3292065024,3292065279,SC
-3292065280,3292065791,US
+3292049920,3292051711,US
+3292051712,3292051967,SC
+3292051968,3292053503,US
+3292053504,3292053759,SC
+3292053760,3292054015,US
+3292054016,3292054527,SC
+3292054528,3292055807,US
+3292055808,3292056063,SC
+3292056064,3292056575,US
+3292056576,3292056831,SC
+3292056832,3292057087,US
+3292057088,3292057855,SC
+3292057856,3292058879,US
+3292058880,3292059647,SC
+3292059648,3292059903,US
+3292059904,3292060159,SC
+3292060160,3292060415,US
+3292060416,3292060671,SC
+3292060672,3292061439,US
+3292061440,3292061695,SC
+3292061696,3292062975,US
+3292062976,3292063231,SC
+3292063232,3292063487,US
+3292063488,3292063743,SC
+3292063744,3292063999,US
+3292064000,3292064255,SC
+3292064256,3292064511,US
+3292064512,3292064767,SC
+3292064768,3292065791,US
3292065792,3292066047,SC
-3292066048,3292069375,US
+3292066048,3292066559,US
+3292066560,3292067071,SC
+3292067072,3292067327,US
+3292067328,3292067839,SC
+3292067840,3292068607,US
+3292068608,3292069119,SC
+3292069120,3292069375,US
3292069376,3292069631,DE
-3292069632,3292069887,AU
+3292069632,3292069887,SC
3292069888,3292070143,SE
3292070144,3292070399,DK
-3292070400,3292070655,US
-3292070656,3292070911,SC
+3292070400,3292070911,SC
3292070912,3292071167,CZ
-3292071168,3292078847,US
-3292078848,3292079103,SC
-3292079104,3292080383,US
-3292080384,3292080639,SC
-3292080640,3292081151,US
-3292081152,3292081407,SC
+3292071168,3292071423,SC
+3292071424,3292071935,US
+3292071936,3292072191,SC
+3292072192,3292073215,US
+3292073216,3292073471,SC
+3292073472,3292073983,US
+3292073984,3292074495,SC
+3292074496,3292075263,US
+3292075264,3292075775,SC
+3292075776,3292076287,US
+3292076288,3292076543,SC
+3292076544,3292078591,US
+3292078592,3292079103,SC
+3292079104,3292079359,US
+3292079360,3292079615,SC
+3292079616,3292080127,US
+3292080128,3292080639,SC
+3292080640,3292080895,US
+3292080896,3292081407,SC
3292081408,3292082431,US
-3292082432,3292082687,SC
-3292082688,3292085247,US
-3292085248,3292085503,SC
-3292085504,3292085759,US
-3292085760,3292086015,SC
-3292086016,3292093695,US
-3292093696,3292093951,SC
-3292093952,3292099327,US
+3292082432,3292082943,SC
+3292082944,3292084223,US
+3292084224,3292084479,SC
+3292084480,3292084735,US
+3292084736,3292086015,SC
+3292086016,3292088063,US
+3292088064,3292088319,SC
+3292088320,3292089087,US
+3292089088,3292089343,SC
+3292089344,3292090111,US
+3292090112,3292090367,SC
+3292090368,3292091903,US
+3292091904,3292092415,SC
+3292092416,3292093439,US
+3292093440,3292093951,SC
+3292093952,3292095231,US
+3292095232,3292095487,SC
+3292095488,3292097023,US
+3292097024,3292097791,SC
+3292097792,3292098047,US
+3292098048,3292098303,SC
+3292098304,3292098559,US
+3292098560,3292098815,SC
+3292098816,3292099327,US
3292099328,3292099583,SC
-3292099584,3292104959,US
-3292104960,3292105215,SC
-3292105216,3292105983,US
+3292099584,3292100095,US
+3292100096,3292100351,SC
+3292100352,3292102143,US
+3292102144,3292102399,SC
+3292102400,3292102911,US
+3292102912,3292103167,SC
+3292103168,3292103423,US
+3292103424,3292103679,SC
+3292103680,3292104447,US
+3292104448,3292104703,SC
+3292104704,3292104959,US
+3292104960,3292105471,SC
+3292105472,3292105983,US
3292105984,3292106239,SC
-3292106240,3292106751,US
-3292106752,3292107007,SC
-3292107008,3292108031,US
-3292108032,3292108287,SC
-3292108288,3292109567,US
+3292106240,3292106495,US
+3292106496,3292107007,SC
+3292107008,3292107519,US
+3292107520,3292108543,SC
+3292108544,3292108799,US
+3292108800,3292109055,SC
+3292109056,3292109567,US
3292109568,3292109823,SC
-3292109824,3292112127,US
+3292109824,3292110079,US
+3292110080,3292110591,SC
+3292110592,3292111615,US
+3292111616,3292111871,SC
+3292111872,3292112127,US
3292112128,3292112383,SC
-3292112384,3292113919,US
+3292112384,3292112895,US
+3292112896,3292113151,SC
+3292113152,3292113919,US
3292113920,3292114175,SC
-3292114176,3292115967,US
+3292114176,3292114431,US
+3292114432,3292114687,SC
+3292114688,3292115967,US
3292115968,3292116223,SC
-3292116224,3292125695,US
-3292125696,3292125951,SC
-3292125952,3292128767,US
+3292116224,3292116735,US
+3292116736,3292116991,SC
+3292116992,3292117247,US
+3292117248,3292117503,SC
+3292117504,3292117759,US
+3292117760,3292118015,SC
+3292118016,3292119039,US
+3292119040,3292119295,SC
+3292119296,3292119551,US
+3292119552,3292120063,SC
+3292120064,3292120575,US
+3292120576,3292121343,SC
+3292121344,3292121599,US
+3292121600,3292122111,SC
+3292122112,3292123903,US
+3292123904,3292124159,SC
+3292124160,3292124927,US
+3292124928,3292125183,SC
+3292125184,3292125439,US
+3292125440,3292125951,SC
+3292125952,3292127231,US
+3292127232,3292127487,SC
+3292127488,3292128767,US
3292128768,3292129023,SC
-3292129024,3292133631,US
-3292133632,3292133887,SC
-3292133888,3292134911,US
+3292129024,3292129791,US
+3292129792,3292130303,SC
+3292130304,3292131327,US
+3292131328,3292132095,SC
+3292132096,3292133631,US
+3292133632,3292134143,SC
+3292134144,3292134399,US
+3292134400,3292134911,SC
3292134912,3292135167,DE
3292135168,3292135423,AU
3292135424,3292135679,SE
3292135680,3292135935,DK
-3292135936,3292136447,US
+3292135936,3292136191,US
+3292136192,3292136447,SC
3292136448,3292136703,CZ
-3292136704,3292137215,US
+3292136704,3292136959,SC
+3292136960,3292137215,US
3292137216,3292137471,SC
-3292137472,3292140031,US
-3292140032,3292140287,SC
-3292140288,3292141567,US
+3292137472,3292137727,US
+3292137728,3292138239,SC
+3292138240,3292138495,US
+3292138496,3292138751,SC
+3292138752,3292139519,US
+3292139520,3292140287,SC
+3292140288,3292140799,US
+3292140800,3292141055,SC
+3292141056,3292141567,US
3292141568,3292142079,SC
-3292142080,3292153855,US
-3292153856,3292154111,SC
-3292154112,3292159999,US
-3292160000,3292160255,SC
-3292160256,3292163327,US
-3292163328,3292163583,SC
-3292163584,3292167935,US
+3292142080,3292142591,US
+3292142592,3292142847,SC
+3292142848,3292143103,US
+3292143104,3292143359,SC
+3292143360,3292143871,US
+3292143872,3292144383,SC
+3292144384,3292145407,US
+3292145408,3292145663,SC
+3292145664,3292146431,US
+3292146432,3292146687,SC
+3292146688,3292146943,US
+3292146944,3292147455,SC
+3292147456,3292147967,US
+3292147968,3292148479,SC
+3292148480,3292149503,US
+3292149504,3292149759,SC
+3292149760,3292150271,US
+3292150272,3292150527,SC
+3292150528,3292151551,US
+3292151552,3292151807,SC
+3292151808,3292152063,US
+3292152064,3292152319,SC
+3292152320,3292153343,US
+3292153344,3292154623,SC
+3292154624,3292155903,US
+3292155904,3292156159,SC
+3292156160,3292157439,US
+3292157440,3292157695,SC
+3292157696,3292157951,US
+3292157952,3292158463,SC
+3292158464,3292159999,US
+3292160000,3292160767,SC
+3292160768,3292161791,US
+3292161792,3292162047,SC
+3292162048,3292162559,US
+3292162560,3292163071,SC
+3292163072,3292163327,US
+3292163328,3292163839,SC
+3292163840,3292165887,US
+3292165888,3292166143,SC
+3292166144,3292167935,US
3292167936,3292168191,SC
-3292168192,3292173311,US
-3292173312,3292173567,SC
-3292173568,3292175103,US
-3292175104,3292175359,SC
-3292175360,3292177151,US
+3292168192,3292168703,US
+3292168704,3292169727,SC
+3292169728,3292171775,US
+3292171776,3292172543,SC
+3292172544,3292173055,US
+3292173056,3292173567,SC
+3292173568,3292174335,US
+3292174336,3292174591,SC
+3292174592,3292175103,US
+3292175104,3292175615,SC
+3292175616,3292176383,US
+3292176384,3292176639,SC
+3292176640,3292177151,US
3292177152,3292177407,SC
3292177408,3292178175,US
-3292178176,3292178431,SC
-3292178432,3292180991,US
-3292180992,3292181247,SC
-3292181248,3292183039,US
-3292183040,3292183295,SC
-3292183296,3292186623,US
-3292186624,3292186879,SC
-3292186880,3292196607,US
-3292196608,3292196863,SC
-3292196864,3292200447,US
-3292200448,3292200703,DE
+3292178176,3292178687,SC
+3292178688,3292178943,US
+3292178944,3292179199,SC
+3292179200,3292179711,US
+3292179712,3292179967,SC
+3292179968,3292180479,US
+3292180480,3292180735,SC
+3292180736,3292180991,US
+3292180992,3292181503,SC
+3292181504,3292183039,US
+3292183040,3292183551,SC
+3292183552,3292184063,US
+3292184064,3292184319,SC
+3292184320,3292184575,US
+3292184576,3292184831,SC
+3292184832,3292185599,US
+3292185600,3292186111,SC
+3292186112,3292186367,US
+3292186368,3292186879,SC
+3292186880,3292187391,US
+3292187392,3292187903,SC
+3292187904,3292188159,US
+3292188160,3292188671,SC
+3292188672,3292190975,US
+3292190976,3292191231,SC
+3292191232,3292193279,US
+3292193280,3292194047,SC
+3292194048,3292195839,US
+3292195840,3292196607,SC
+3292196608,3292197119,US
+3292197120,3292197375,SC
+3292197376,3292198399,US
+3292198400,3292198655,SC
+3292198656,3292199935,US
+3292199936,3292200703,SC
3292200704,3292200959,AU
3292200960,3292201215,SE
-3292201216,3292201471,DK
+3292201216,3292201471,SC
3292201472,3292201983,US
3292201984,3292202239,CZ
-3292202240,3292205823,US
-3292205824,3292206079,SC
-3292206080,3292206591,US
-3292206592,3292206847,SC
-3292206848,3292207615,US
-3292207616,3292207871,SC
-3292207872,3292209663,US
+3292202240,3292203007,US
+3292203008,3292203519,SC
+3292203520,3292204031,US
+3292204032,3292204287,SC
+3292204288,3292206335,US
+3292206336,3292206847,SC
+3292206848,3292208895,US
+3292208896,3292209407,SC
+3292209408,3292209663,US
3292209664,3292209919,SC
3292209920,3292210175,US
3292210176,3292210431,SC
-3292210432,3292214783,US
+3292210432,3292212479,US
+3292212480,3292212735,SC
+3292212736,3292213247,US
+3292213248,3292213503,SC
+3292213504,3292213759,US
+3292213760,3292214271,SC
+3292214272,3292214783,US
3292214784,3292215039,SC
3292215040,3292215295,US
-3292215296,3292215551,SC
-3292215552,3292216319,US
-3292216320,3292216575,SC
-3292216576,3292220927,US
-3292220928,3292221183,SC
-3292221184,3292227071,US
+3292215296,3292215807,SC
+3292215808,3292216319,US
+3292216320,3292216831,SC
+3292216832,3292219135,US
+3292219136,3292219647,SC
+3292219648,3292220671,US
+3292220672,3292221439,SC
+3292221440,3292221695,US
+3292221696,3292221951,SC
+3292221952,3292223487,US
+3292223488,3292223999,SC
+3292224000,3292224255,US
+3292224256,3292224511,SC
+3292224512,3292224767,US
+3292224768,3292225023,SC
+3292225024,3292227071,US
3292227072,3292227327,SC
-3292227328,3292231679,US
-3292231680,3292231935,SC
-3292231936,3292233471,US
-3292233472,3292233727,SC
-3292233728,3292239615,US
-3292239616,3292239871,SC
-3292239872,3292243711,US
-3292243712,3292243967,SC
-3292243968,3292244991,US
+3292227328,3292227583,US
+3292227584,3292227839,SC
+3292227840,3292229887,US
+3292229888,3292230143,SC
+3292230144,3292230399,US
+3292230400,3292230655,SC
+3292230656,3292231935,US
+3292231936,3292232191,SC
+3292232192,3292233215,US
+3292233216,3292233727,SC
+3292233728,3292234495,US
+3292234496,3292234751,SC
+3292234752,3292235775,US
+3292235776,3292236031,SC
+3292236032,3292237311,US
+3292237312,3292237823,SC
+3292237824,3292239359,US
+3292239360,3292240383,SC
+3292240384,3292240639,US
+3292240640,3292240895,SC
+3292240896,3292241151,US
+3292241152,3292241407,SC
+3292241408,3292242175,US
+3292242176,3292242431,SC
+3292242432,3292243199,US
+3292243200,3292244223,SC
+3292244224,3292244991,US
3292244992,3292245247,SC
3292245248,3292246783,US
3292246784,3292247039,SC
-3292247040,3292252415,US
+3292247040,3292247551,US
+3292247552,3292248063,SC
+3292248064,3292249343,US
+3292249344,3292249599,SC
+3292249600,3292250367,US
+3292250368,3292250623,SC
+3292250624,3292250879,US
+3292250880,3292251135,SC
+3292251136,3292251647,US
+3292251648,3292252159,SC
+3292252160,3292252415,US
3292252416,3292252671,SC
-3292252672,3292255487,US
-3292255488,3292255743,SC
-3292255744,3292259327,US
+3292252672,3292252927,US
+3292252928,3292253183,SC
+3292253184,3292254975,US
+3292254976,3292255743,SC
+3292255744,3292257023,US
+3292257024,3292257279,SC
+3292257280,3292258559,US
+3292258560,3292258815,SC
+3292258816,3292259327,US
3292259328,3292259583,SC
-3292259584,3292265983,US
+3292259584,3292260863,US
+3292260864,3292261375,SC
+3292261376,3292262399,US
+3292262400,3292263167,SC
+3292263168,3292263935,US
+3292263936,3292264191,SC
+3292264192,3292264447,US
+3292264448,3292264703,SC
+3292264704,3292264959,US
+3292264960,3292265215,SC
+3292265216,3292265471,US
+3292265472,3292265727,SC
+3292265728,3292265983,US
3292265984,3292266239,DE
3292266240,3292266495,SC
3292266496,3292266751,TZ
@@ -116442,11 +122070,11 @@
3300954112,3300958207,NG
3300958208,3301113855,ZA
3301113856,3301117951,AF
-3301117952,3301138431,NG
-3301138432,3301140479,ZA
-3301140480,3301146111,NG
-3301146112,3301146367,ZA
-3301146368,3301146623,NG
+3301117952,3301143807,ZA
+3301143808,3301144063,NG
+3301144064,3301144319,ZA
+3301144320,3301144575,NG
+3301144576,3301146623,ZA
3301146624,3301163007,IN
3301163008,3301171199,ZA
3301171200,3301172223,NG
@@ -116460,24 +122088,12 @@
3301185536,3301187583,GB
3301187584,3301189631,FR
3301189632,3301191679,US
-3301191680,3301191935,CA
-3301191936,3301192191,SE
-3301192192,3301192703,CA
-3301192704,3301192959,SE
-3301192960,3301193215,CA
-3301193216,3301193727,SE
+3301191680,3301193727,CA
3301193728,3301195775,JP
3301195776,3301197823,DE
3301197824,3301199871,GB
3301199872,3301201919,US
-3301201920,3301202175,NL
-3301202176,3301202431,SE
-3301202432,3301202687,NL
-3301202688,3301202943,SE
-3301202944,3301203199,NL
-3301203200,3301203455,SE
-3301203456,3301203711,NL
-3301203712,3301203967,SE
+3301201920,3301203967,NL
3301203968,3301204991,DK
3301204992,3301205247,SE
3301205248,3301206015,DK
@@ -116497,30 +122113,39 @@
3301238784,3301240831,US
3301240832,3301242879,SE
3301242880,3301244927,GB
-3301244928,3301245951,US
-3301245952,3301246975,SE
-3301246976,3301252095,SC
-3301252096,3301253119,US
+3301244928,3301246975,US
+3301246976,3301251071,SC
+3301251072,3301253119,US
3301253120,3301254143,SC
3301254144,3301255167,US
3301255168,3301257215,SC
-3301257216,3301258239,US
-3301258240,3301263359,SC
+3301257216,3301259263,US
+3301259264,3301261311,SC
+3301261312,3301262335,US
+3301262336,3301263359,SC
3301263360,3301264383,US
-3301264384,3301271551,SC
-3301271552,3301272575,US
-3301272576,3301279743,SC
+3301264384,3301269503,SC
+3301269504,3301272575,US
+3301272576,3301277695,SC
+3301277696,3301278719,US
+3301278720,3301279743,SC
3301279744,3301280767,PR
3301280768,3301281791,SC
3301281792,3301282815,US
3301282816,3301283839,SC
3301283840,3301284863,US
-3301284864,3301289983,SC
+3301284864,3301288959,SC
+3301288960,3301289983,ES
3301289984,3301291007,PT
3301291008,3301292031,PL
3301292032,3301294079,SC
3301294080,3301295103,LU
-3301295104,3301301247,SC
+3301295104,3301296127,SC
+3301296128,3301297151,HK
+3301297152,3301298175,SC
+3301298176,3301299199,AT
+3301299200,3301300223,SC
+3301300224,3301301247,LV
3301301248,3301302271,CZ
3301302272,3301304319,SC
3301304320,3301305343,FR
@@ -116528,136 +122153,206 @@
3301306368,3301307391,IN
3301307392,3301308415,SC
3301308416,3301309439,SG
-3301309440,3301310463,SC
-3301310464,3301310719,ZA
-3301310720,3301311487,SC
-3301311488,3301313535,SE
-3301313536,3301314559,SC
-3301314560,3301315583,SE
-3301315584,3301318655,SC
-3301318656,3301320447,SE
+3301309440,3301310463,BR
+3301310464,3301311487,SC
+3301311488,3301311743,DE
+3301311744,3301318655,SC
+3301318656,3301318911,US
+3301318912,3301319679,SC
+3301319680,3301319935,US
+3301319936,3301320447,SC
3301320448,3301320959,US
-3301320960,3301322751,SE
+3301320960,3301321215,SC
+3301321216,3301321471,US
+3301321472,3301322751,SC
3301322752,3301323007,CA
-3301323008,3301325567,SE
+3301323008,3301325567,SC
3301325568,3301325823,US
-3301325824,3301330943,SE
+3301325824,3301329151,SC
+3301329152,3301329407,DK
+3301329408,3301330943,SC
3301330944,3301331199,HU
-3301331200,3301337087,SE
+3301331200,3301331455,SC
+3301331456,3301331711,NZ
+3301331712,3301332991,SC
+3301332992,3301333247,NL
+3301333248,3301334783,SC
+3301334784,3301335039,PR
+3301335040,3301337087,SC
3301337088,3301337343,US
-3301337344,3301343487,SE
+3301337344,3301337855,SC
+3301337856,3301338111,US
+3301338112,3301343487,SC
3301343488,3301343743,US
-3301343744,3301345535,SE
+3301343744,3301344767,SC
+3301344768,3301345023,AT
+3301345024,3301345535,SC
3301345536,3301345791,DK
-3301345792,3301349119,SE
+3301345792,3301346303,SC
+3301346304,3301346559,BE
+3301346560,3301349119,SC
3301349120,3301349375,CH
-3301349376,3301351679,SE
+3301349376,3301351679,SC
3301351680,3301351935,US
-3301351936,3301353983,SE
+3301351936,3301352703,SC
+3301352704,3301352959,US
+3301352960,3301353983,SC
3301353984,3301354239,US
-3301354240,3301355263,SE
+3301354240,3301355263,SC
3301355264,3301355519,US
-3301355520,3301364479,SE
+3301355520,3301357823,SC
+3301357824,3301358079,US
+3301358080,3301359359,SC
+3301359360,3301359615,US
+3301359616,3301361407,SC
+3301361408,3301361663,FR
+3301361664,3301362431,SC
+3301362432,3301362687,LV
+3301362688,3301364479,SC
3301364480,3301364735,NO
-3301364736,3301367551,SE
+3301364736,3301364991,SC
+3301364992,3301365247,PT
+3301365248,3301367551,SC
3301367552,3301367807,PR
-3301367808,3301373183,SE
+3301367808,3301371391,SC
+3301371392,3301371647,US
+3301371648,3301373183,SC
3301373184,3301373439,US
-3301373440,3301375231,SE
+3301373440,3301375231,SC
3301375232,3301375487,US
-3301375488,3301375743,SE
+3301375488,3301375743,SC
3301375744,3301375999,US
3301376000,3301376255,SC
3301376256,3301376511,US
-3301376512,3301376767,SC
-3301376768,3301377023,US
-3301377024,3301377279,SC
-3301377280,3301378559,US
+3301376512,3301377535,SC
+3301377536,3301378559,US
3301378560,3301379071,SC
-3301379072,3301379583,US
-3301379584,3301379839,SC
-3301379840,3301387007,US
+3301379072,3301379327,US
+3301379328,3301379583,SC
+3301379584,3301379839,US
+3301379840,3301380351,SC
+3301380352,3301380863,US
+3301380864,3301381119,SC
+3301381120,3301382655,US
+3301382656,3301382911,SC
+3301382912,3301383423,US
+3301383424,3301383679,SC
+3301383680,3301384959,US
+3301384960,3301385215,SC
+3301385216,3301385727,US
+3301385728,3301386239,SC
+3301386240,3301387007,US
3301387008,3301387263,ES
-3301387264,3301390079,US
+3301387264,3301387519,SC
+3301387520,3301389311,US
+3301389312,3301389567,SC
+3301389568,3301390079,US
3301390080,3301390335,SC
3301390336,3301391359,US
3301391360,3301391615,SC
-3301391616,3301395199,US
+3301391616,3301392895,US
+3301392896,3301393151,SC
+3301393152,3301393407,US
+3301393408,3301393663,SC
+3301393664,3301394687,US
+3301394688,3301395199,SC
3301395200,3301395455,PR
-3301395456,3301397247,US
-3301397248,3301397503,SC
-3301397504,3301397759,US
-3301397760,3301398015,SC
-3301398016,3301401343,US
+3301395456,3301395711,SC
+3301395712,3301396479,US
+3301396480,3301398015,SC
+3301398016,3301398271,US
+3301398272,3301398527,SC
+3301398528,3301399039,US
+3301399040,3301399807,SC
+3301399808,3301400319,US
+3301400320,3301400575,SC
+3301400576,3301401343,US
3301401344,3301401599,SC
-3301401600,3301403391,US
-3301403392,3301403647,SC
-3301403648,3301404415,US
+3301401600,3301401855,US
+3301401856,3301402111,SC
+3301402112,3301402623,US
+3301402624,3301402879,GB
+3301402880,3301403135,NL
+3301403136,3301403391,SC
+3301403392,3301403647,ES
+3301403648,3301403903,US
+3301403904,3301404159,SC
+3301404160,3301404415,NO
3301404416,3301404671,NZ
-3301404672,3301404927,US
-3301404928,3301405183,SC
-3301405184,3301407999,US
-3301408000,3301408255,SC
-3301408256,3301411583,US
+3301404672,3301404927,LU
+3301404928,3301405183,HU
+3301405184,3301405439,US
+3301405440,3301405695,AU
+3301405696,3301405951,SC
+3301405952,3301406463,US
+3301406464,3301406719,CZ
+3301406720,3301406975,DK
+3301406976,3301407487,US
+3301407488,3301408511,SC
+3301408512,3301409023,US
+3301409024,3301409279,SC
+3301409280,3301410047,US
+3301410048,3301410303,SC
+3301410304,3301410559,US
+3301410560,3301410815,SC
+3301410816,3301411071,US
+3301411072,3301411327,SC
+3301411328,3301411583,US
3301411584,3301411839,PR
3301411840,3301412863,US
3301412864,3301413119,CA
-3301413120,3301419007,US
+3301413120,3301413631,SC
+3301413632,3301416191,US
+3301416192,3301416703,SC
+3301416704,3301418239,US
+3301418240,3301418495,SC
+3301418496,3301419007,US
3301419008,3301419519,SC
-3301419520,3301421311,US
-3301421312,3301421567,SC
-3301421568,3301422079,US
-3301422080,3301422335,SC
-3301422336,3301422591,US
-3301422592,3301422847,SC
+3301419520,3301419775,CH
+3301419776,3301420543,SC
+3301420544,3301421311,US
+3301421312,3301421567,HU
+3301421568,3301421823,US
+3301421824,3301422847,SC
3301422848,3301424383,US
-3301424384,3301424639,SC
+3301424384,3301424639,RU
3301424640,3301424895,US
3301424896,3301425151,SC
-3301425152,3301432831,US
-3301432832,3301433087,SC
-3301433088,3301437183,US
-3301437184,3301437439,SC
-3301437440,3301438975,US
+3301425152,3301426431,US
+3301426432,3301426687,SC
+3301426688,3301426943,US
+3301426944,3301427199,SC
+3301427200,3301427711,US
+3301427712,3301427967,SC
+3301427968,3301428223,PR
+3301428224,3301428479,US
+3301428480,3301428735,SC
+3301428736,3301430271,US
+3301430272,3301430527,SC
+3301430528,3301430783,US
+3301430784,3301431039,SC
+3301431040,3301432831,US
+3301432832,3301433087,PR
+3301433088,3301433343,SC
+3301433344,3301433855,US
+3301433856,3301434111,PR
+3301434112,3301434367,US
+3301434368,3301434623,SC
+3301434624,3301435391,US
+3301435392,3301435647,SC
+3301435648,3301435903,NL
+3301435904,3301436415,SC
+3301436416,3301437183,US
+3301437184,3301437695,SC
+3301437696,3301438975,US
3301438976,3301439231,SC
-3301439232,3301440511,US
-3301440512,3301440767,SC
-3301440768,3301441535,US
-3301441536,3301442351,ZA
-3301442352,3301442359,NG
-3301442360,3301442391,ZA
-3301442392,3301442399,NG
-3301442400,3301442415,ZA
-3301442416,3301442423,NG
-3301442424,3301442599,ZA
-3301442600,3301442607,NG
-3301442608,3301442679,ZA
-3301442680,3301442687,NG
-3301442688,3301442727,ZA
-3301442728,3301442735,NG
-3301442736,3301442823,ZA
-3301442824,3301442831,NG
-3301442832,3301443007,ZA
-3301443008,3301443015,NG
-3301443016,3301443295,ZA
-3301443296,3301443303,NG
-3301443304,3301443519,ZA
-3301443520,3301443527,NG
-3301443528,3301443591,ZA
-3301443592,3301443599,NG
-3301443600,3301443655,ZA
-3301443656,3301443663,NG
-3301443664,3301443695,ZA
-3301443696,3301443703,NG
-3301443704,3301443847,ZA
-3301443848,3301443855,NG
-3301443856,3301444383,ZA
-3301444384,3301444391,NG
-3301444392,3301444415,ZA
-3301444416,3301444431,NG
-3301444432,3301444599,ZA
-3301444600,3301444607,NG
-3301444608,3301445631,ZA
+3301439232,3301439487,US
+3301439488,3301439999,SC
+3301440000,3301440511,US
+3301440512,3301441023,SC
+3301441024,3301441279,US
+3301441280,3301441535,SC
+3301441536,3301445631,ZA
3301445632,3301453823,KE
3301453824,3301457919,ML
3301457920,3301462015,NG
@@ -116674,24 +122369,19 @@
3301508096,3301508607,GH
3301508608,3301509119,ZA
3301509120,3301510143,SS
-3301510144,3301511167,MW
3301511168,3301513215,ZW
3301513216,3301515263,EG
3301515264,3301523455,GH
3301523456,3301531647,CI
3301531648,3301539839,ZA
-3301539840,3301540863,KE
-3301541120,3301541631,KE
-3301541888,3301544191,KE
+3301539840,3301544191,KE
3301544192,3301544959,DE
-3301545216,3301548031,KE
-3301548032,3301556223,GH
+3301544960,3301548031,KE
3301556224,3301560319,DJ
3301560320,3301565439,KE
3301565440,3301566463,MU
3301566464,3301568511,ZA
3301568512,3301570559,EG
-3301570560,3301572607,KE
3301572608,3301605375,EG
3301605376,3301613567,SD
3301613568,3301629951,KE
@@ -116769,7 +122459,6 @@
3302550528,3302551551,ZA
3302551552,3302552063,EG
3302552064,3302552575,KE
-3302552576,3302552831,TZ
3302552832,3302553087,KE
3302553088,3302553343,EG
3302553344,3302553599,TZ
@@ -116850,99 +122539,249 @@
3303013376,3303013631,SN
3303013632,3303014399,KE
3303014400,3304062975,TN
-3304062976,3304066559,SC
+3304062976,3304066303,SC
+3304066304,3304066559,US
3304066560,3304066815,CA
-3304066816,3304077311,SC
+3304066816,3304067071,SC
+3304067072,3304067327,CA
+3304067328,3304071167,SC
+3304071168,3304071423,US
+3304071424,3304074239,SC
+3304074240,3304074495,PT
+3304074496,3304076031,SC
+3304076032,3304076287,AU
+3304076288,3304077311,SC
3304077312,3304077567,DK
3304077568,3304077823,SC
3304077824,3304078079,FR
-3304078080,3304084991,SC
+3304078080,3304081919,SC
+3304081920,3304082175,US
+3304082176,3304082431,PR
+3304082432,3304083711,SC
+3304083712,3304083967,US
+3304083968,3304084991,SC
3304084992,3304085247,US
-3304085248,3304102655,SC
+3304085248,3304086527,SC
+3304086528,3304086783,US
+3304086784,3304092671,SC
+3304092672,3304092927,AT
+3304092928,3304093439,SC
+3304093440,3304093695,CZ
+3304093696,3304096255,SC
+3304096256,3304096511,US
+3304096512,3304098047,SC
+3304098048,3304098303,US
+3304098304,3304099839,SC
+3304099840,3304100095,CA
+3304100096,3304102655,SC
3304102656,3304102911,US
-3304102912,3304107263,SC
+3304102912,3304103679,SC
+3304103680,3304103935,US
+3304103936,3304104959,SC
+3304104960,3304105215,US
+3304105216,3304105727,SC
+3304105728,3304105983,US
+3304105984,3304106239,GB
+3304106240,3304107263,SC
3304107264,3304107519,PL
3304107520,3304108799,SC
3304108800,3304109055,AU
3304109056,3304109311,SC
3304109312,3304109567,BE
-3304109568,3304115967,SC
+3304109568,3304109823,LV
+3304109824,3304113663,SC
+3304113664,3304113919,US
+3304113920,3304114175,SC
+3304114176,3304114431,US
+3304114432,3304115967,SC
3304115968,3304116223,US
-3304116224,3304120575,SC
+3304116224,3304116735,SC
+3304116736,3304116991,US
+3304116992,3304120575,SC
3304120576,3304120831,US
-3304120832,3304126975,SC
+3304120832,3304122367,SC
+3304122368,3304122623,GB
+3304122624,3304126719,SC
+3304126720,3304126975,DE
3304126976,3304127231,FR
3304127232,3304194303,SC
3304194304,3304194559,US
-3304194560,3304212223,SC
+3304194560,3304195071,SC
+3304195072,3304195327,DE
+3304195328,3304198399,SC
+3304198400,3304198655,PT
+3304198656,3304204543,SC
+3304204544,3304204799,US
+3304204800,3304208127,SC
+3304208128,3304208383,US
+3304208384,3304209407,SC
+3304209408,3304209663,US
+3304209664,3304210687,SC
+3304210688,3304210943,RU
+3304210944,3304212223,SC
3304212224,3304212479,FR
3304212480,3304213247,SC
3304213248,3304213503,LV
3304213504,3304213759,SC
3304213760,3304214015,AT
-3304214016,3304218367,SC
+3304214016,3304216831,SC
+3304216832,3304217087,GB
+3304217088,3304218367,SC
3304218368,3304218623,PR
-3304218624,3304223231,SC
+3304218624,3304222207,SC
+3304222208,3304222463,US
+3304222464,3304223231,SC
3304223232,3304223487,US
-3304223488,3304226047,SC
+3304223488,3304225023,SC
+3304225024,3304225279,US
+3304225280,3304226047,SC
3304226048,3304226559,US
3304226560,3304227839,SC
3304227840,3304228095,RU
3304228096,3304228863,SC
3304228864,3304229119,DE
3304229120,3304229375,DK
-3304229376,3304232703,SC
+3304229376,3304230911,SC
+3304230912,3304231167,HU
+3304231168,3304232191,SC
+3304232192,3304232447,PT
+3304232448,3304232703,SC
3304232704,3304232959,CH
3304232960,3304233215,SC
3304233216,3304233471,GB
3304233472,3304233727,SC
3304233728,3304233983,US
-3304233984,3304246271,SC
+3304233984,3304235775,SC
+3304235776,3304236031,PR
+3304236032,3304238591,SC
+3304238592,3304238847,US
+3304238848,3304240895,SC
+3304240896,3304241151,US
+3304241152,3304241663,SC
+3304241664,3304241919,US
+3304241920,3304242431,SC
+3304242432,3304242687,US
+3304242688,3304244991,SC
+3304244992,3304245247,FR
+3304245248,3304245503,DE
+3304245504,3304246271,SC
3304246272,3304246527,BE
-3304246528,3304249343,SC
+3304246528,3304248063,SC
+3304248064,3304248319,NO
+3304248320,3304248831,SC
+3304248832,3304249087,ES
+3304249088,3304249343,SC
3304249344,3304249599,NL
-3304249600,3304326143,SC
+3304249600,3304255231,SC
+3304255232,3304255487,US
+3304255488,3304325375,SC
+3304325376,3304325631,US
+3304325632,3304326143,SC
3304326144,3304326399,DE
3304326400,3304327935,SC
3304327936,3304328191,HK
-3304328192,3304340735,SC
+3304328192,3304329215,SC
+3304329216,3304329471,PL
+3304329472,3304336127,SC
+3304336128,3304336383,US
+3304336384,3304337663,SC
+3304337664,3304337919,US
+3304337920,3304340735,SC
3304340736,3304340991,US
3304340992,3304342783,SC
3304342784,3304343039,IN
-3304343040,3304343551,SC
+3304343040,3304343295,SC
+3304343296,3304343551,FR
3304343552,3304343807,DE
-3304343808,3304353023,SC
+3304343808,3304344063,DK
+3304344064,3304345855,SC
+3304345856,3304346111,LU
+3304346112,3304347135,SC
+3304347136,3304347391,ES
+3304347392,3304348671,SC
+3304348672,3304348927,US
+3304348928,3304349183,SC
+3304349184,3304349439,US
+3304349440,3304349695,PR
+3304349696,3304353023,SC
3304353024,3304353535,US
-3304353536,3304358399,SC
+3304353536,3304356607,SC
+3304356608,3304357119,US
+3304357120,3304358399,SC
3304358400,3304358655,BR
3304358656,3304360191,SC
3304360192,3304360447,DK
-3304360448,3304397823,SC
-3304397824,3304399871,US
-3304399872,3304408063,SC
+3304360448,3304362495,SC
+3304362496,3304362751,NZ
+3304362752,3304363007,NO
+3304363008,3304363775,SC
+3304363776,3304364031,CH
+3304364032,3304365055,SC
+3304365056,3304365311,US
+3304365312,3304368895,SC
+3304368896,3304369151,US
+3304369152,3304371199,SC
+3304371200,3304371455,US
+3304371456,3304371967,SC
+3304371968,3304372223,US
+3304372224,3304376063,SC
+3304376064,3304376319,FR
+3304376320,3304376575,SC
+3304376576,3304376831,DK
+3304376832,3304381695,SC
+3304381696,3304381951,US
+3304381952,3304382719,SC
+3304382720,3304382975,US
+3304382976,3304388095,SC
+3304388096,3304388351,PR
+3304388352,3304391679,SC
+3304391680,3304394751,US
+3304394752,3304396799,SC
+3304396800,3304400895,US
+3304400896,3304401919,SC
+3304401920,3304402943,PR
+3304402944,3304403967,US
+3304403968,3304406015,SC
+3304406016,3304407039,US
+3304407040,3304408063,SC
3304408064,3304411135,US
-3304411136,3304419327,SC
-3304419328,3304420351,US
-3304420352,3304424447,SC
+3304411136,3304412159,SC
+3304412160,3304413183,US
+3304413184,3304417279,SC
+3304417280,3304418303,US
+3304418304,3304419327,SC
+3304419328,3304421375,US
+3304421376,3304424447,SC
3304424448,3304425471,US
-3304425472,3304432639,SC
+3304425472,3304426495,PR
+3304426496,3304429567,SC
+3304429568,3304430591,US
+3304430592,3304432639,SC
3304432640,3304433663,NL
-3304433664,3304442879,SC
+3304433664,3304434687,SC
+3304434688,3304435711,ES
+3304435712,3304436735,SC
+3304436736,3304437759,PL
+3304437760,3304438783,NO
+3304438784,3304439807,NZ
+3304439808,3304442879,SC
3304442880,3304443903,AU
-3304443904,3304451071,SC
+3304443904,3304444927,AT
+3304444928,3304446975,SC
+3304446976,3304447999,CZ
+3304448000,3304449023,DK
+3304449024,3304451071,SC
3304451072,3304452095,AT
-3304452096,3304454143,SC
+3304452096,3304453119,IN
+3304453120,3304454143,SC
3304454144,3304455167,SG
3304455168,3304456191,SC
-3304456192,3304521727,NG
+3304456192,3304521727,ZA
3304521728,3304528895,US
3304528896,3304529919,SC
-3304529920,3304535295,US
-3304535296,3304536063,SC
+3304529920,3304536063,US
3304536064,3304538111,CA
-3304538112,3304548351,US
-3304548352,3304549375,SC
-3304549376,3304562687,US
+3304538112,3304562687,US
3304562688,3304563711,GB
3304563712,3304564735,NL
3304564736,3304565759,CH
@@ -116974,27 +122813,21 @@
3304718336,3304734719,ZA
3304734720,3304751103,BJ
3304751104,3304759295,ZA
+3304759296,3304763391,KE
3304763392,3304767487,LR
-3304770560,3304771583,ZA
+3304767488,3304771583,ZA
3304771584,3304773631,KE
-3304775680,3304781823,ZA
+3304773632,3304781823,ZA
3304781824,3304782847,AO
3304782848,3304783871,MU
3304783872,3304801023,ZA
3304801024,3304801279,GH
3304801280,3304801791,SC
3304801792,3304802047,GH
-3304802048,3304802559,SC
-3304802560,3304802815,GH
-3304802816,3304803327,SC
-3304803328,3304803583,GH
+3304802048,3304802303,SC
+3304802304,3304803583,GH
3304803584,3304804095,SC
-3304804096,3304804351,NG
-3304804352,3304804863,SC
-3304804864,3304805119,NG
-3304805120,3304805631,SC
-3304805632,3304805887,NG
-3304805888,3304806399,SC
+3304804096,3304806399,NG
3304806400,3304806655,ZA
3304806656,3304807167,SC
3304807168,3304807423,ZA
@@ -117002,24 +122835,17 @@
3304807936,3304808191,ZA
3304808192,3304808703,SC
3304808704,3304808959,ZA
-3304808960,3304809471,SC
+3304808960,3304809215,SC
+3304809216,3304809471,ZA
3304809472,3304809727,KE
3304809728,3304810239,SC
-3304810240,3304810495,KE
-3304810496,3304811007,SC
-3304811008,3304811263,KE
-3304811264,3304811775,SC
-3304811776,3304812031,KE
-3304812032,3304812799,SC
+3304810240,3304812543,KE
+3304812544,3304812799,SC
3304812800,3304813055,ZA
3304813056,3304813567,SC
3304813568,3304813823,ZA
3304813824,3304814591,SC
-3304814592,3304814847,ZA
-3304814848,3304815615,SC
-3304815616,3304815871,ZA
-3304815872,3304816639,SC
-3304816640,3304820735,ZA
+3304814592,3304820735,ZA
3304821760,3304822783,MU
3304822784,3304823807,BJ
3304824832,3304841215,ZA
@@ -117064,7 +122890,6 @@
3314917376,3314918399,ZA
3314918400,3314919423,NG
3314919424,3314920447,GQ
-3314920448,3314921471,ZA
3314921472,3314922495,TZ
3314922496,3314923519,ZA
3314923520,3314924543,CD
@@ -117086,7 +122911,6 @@
3315294208,3315302399,ZA
3315302400,3315318783,ML
3315318784,3315322879,LS
-3315322880,3315326975,ZA
3315326976,3315331071,ZW
3315331072,3315333119,GH
3315333120,3315351551,ZA
@@ -117110,27 +122934,24 @@
3315458048,3315459071,SL
3315459072,3315460095,KE
3315460096,3315461119,SL
-3315461120,3315462143,TZ
3315462144,3315463167,ZA
3315463168,3315464191,SO
3315464192,3315465215,CD
3315465216,3315466239,CG
3315466240,3315482623,MZ
3315482624,3315499007,MG
-3315499008,3315515391,ZM
+3315499008,3315515391,ZW
3315515392,3315531775,SC
3315531776,3315539967,CM
3315539968,3315548159,ZA
3315548160,3315552255,NG
-3315552256,3315554303,GW
-3315554304,3315556351,ZA
+3315552256,3315556351,ZA
3315556352,3315560447,KE
3315560448,3315564543,TZ
3315564544,3315568639,GH
3315568640,3315572735,MG
3315572736,3315580927,ST
3315580928,3315589119,CI
-3315589120,3315597311,CM
3315597312,3316121599,EG
3316121600,3316645887,ZA
3316645888,3317170175,KE
@@ -117172,7 +122993,6 @@
3319267328,3319398399,AO
3319398400,3319529471,MZ
3319529472,3319537663,ZM
-3319537664,3319545855,MW
3319545856,3319554047,SO
3319554048,3319562239,KE
3319562240,3319570431,LS
@@ -117211,7 +123031,6 @@
3320308736,3320309759,LY
3320309760,3320310783,ZA
3320310784,3320311807,SS
-3320311808,3320312831,BJ
3320312832,3320313855,ZM
3320313856,3320314879,BI
3320314880,3320315903,CD
@@ -117231,11 +123050,9 @@
3320508416,3320509439,ZA
3320509440,3320510463,RW
3320510464,3320511487,LY
-3320511488,3320512511,ZA
3320512512,3320578047,MZ
3320578048,3320643583,ZA
3320643584,3320709119,KE
-3320709120,3320774655,ZA
3320774656,3320791039,UG
3320791040,3320807423,BF
3320807424,3320823807,ZA
@@ -117243,7 +123060,6 @@
3320827904,3320831999,MU
3320832000,3320834047,KE
3320834048,3320840191,MU
-3320840192,3320905727,NG
3320905728,3320938495,DJ
3320938496,3320971263,AO
3320971264,3320979455,GA
@@ -117265,7 +123081,6 @@
3321032704,3321036799,NG
3321036800,3321069567,RW
3321069568,3321102335,NA
-3321102336,3321167871,NG
3321167872,3321233407,ZA
3321233408,3321298943,EG
3321298944,3321364479,MA
@@ -117388,7 +123203,9 @@
3322070976,3322071039,US
3322071040,3322071119,CN
3322071120,3322071167,US
-3322071168,3322071567,CN
+3322071168,3322071295,CN
+3322071296,3322071359,US
+3322071360,3322071567,CN
3322071568,3322071583,US
3322071584,3322071743,CN
3322071744,3322071775,US
@@ -117456,7 +123273,9 @@
3322081920,3322082047,US
3322082048,3322084671,CN
3322084672,3322084863,US
-3322084864,3322085375,CN
+3322084864,3322084927,CN
+3322084928,3322085119,US
+3322085120,3322085375,CN
3322085376,3322167551,US
3322167552,3322167807,GB
3322167808,3322202111,US
@@ -117758,8 +123577,7 @@
3322937120,3322937151,CN
3322937152,3322937167,US
3322937168,3322937343,CN
-3322937344,3322940671,US
-3322940928,3322945535,US
+3322937344,3322945535,US
3322945536,3322951679,CN
3322951680,3322953727,US
3322953728,3322956583,NL
@@ -117773,8 +123591,8 @@
3322962688,3322962943,ES
3322962944,3322963455,NL
3322963456,3322964479,GB
-3322964480,3322964991,NL
-3322964992,3322969343,US
+3322964480,3322965247,NL
+3322965248,3322969343,US
3322969344,3322970111,NL
3322970112,3323002879,CA
3323002880,3323013887,US
@@ -117782,6 +123600,7 @@
3323014144,3323017727,US
3323017728,3323017983,CA
3323017984,3323020799,US
+3323020800,3323021055,SG
3323021056,3323022591,US
3323022592,3323022847,GB
3323022848,3323023103,US
@@ -117808,31 +123627,36 @@
3323224064,3323232255,NL
3323232256,3323240447,US
3323240448,3323240703,IN
-3323240704,3323241215,US
+3323240704,3323240959,US
+3323240960,3323241215,CA
3323241216,3323241247,GB
3323241248,3323241279,TR
3323241280,3323241311,US
3323241312,3323241343,GB
-3323241344,3323241407,US
+3323241344,3323241351,CA
+3323241352,3323241375,US
+3323241376,3323241407,CA
3323241408,3323241439,GB
-3323241440,3323241471,US
+3323241440,3323241455,US
+3323241456,3323241471,CA
3323241472,3323241479,GB
3323241480,3323241487,CN
3323241488,3323241495,CA
3323241496,3323241503,MT
-3323241504,3323241519,US
+3323241504,3323241511,US
+3323241512,3323241519,CA
3323241520,3323241527,TR
-3323241528,3323241535,CA
-3323241536,3323241543,US
-3323241544,3323241559,CA
-3323241560,3323241583,US
+3323241528,3323241567,CA
+3323241568,3323241575,US
+3323241576,3323241583,CA
3323241584,3323241591,CN
-3323241592,3323241615,US
+3323241592,3323241607,CA
+3323241608,3323241615,US
3323241616,3323241623,CA
3323241624,3323241631,BR
-3323241632,3323241639,US
+3323241632,3323241639,CA
3323241640,3323241647,GB
-3323241648,3323241663,US
+3323241648,3323241663,CA
3323241664,3323241671,TR
3323241672,3323241679,PH
3323241680,3323241687,TR
@@ -117841,25 +123665,76 @@
3323241704,3323241711,CN
3323241712,3323241719,GB
3323241720,3323241727,SA
-3323241728,3323241983,CA
-3323241984,3323242511,US
+3323241728,3323242255,CA
+3323242256,3323242271,US
+3323242272,3323242287,CA
+3323242288,3323242303,US
+3323242304,3323242431,CA
+3323242432,3323242511,US
3323242512,3323242527,BD
-3323242528,3323243087,US
+3323242528,3323242575,CA
+3323242576,3323242591,US
+3323242592,3323242607,CA
+3323242608,3323242623,US
+3323242624,3323242703,CA
+3323242704,3323243007,US
+3323243008,3323243055,CA
+3323243056,3323243063,US
+3323243064,3323243087,CA
3323243088,3323243095,IE
3323243096,3323243103,GB
-3323243104,3323243143,US
-3323243144,3323243159,CA
-3323243160,3323243199,US
+3323243104,3323243119,CA
+3323243120,3323243127,US
+3323243128,3323243159,CA
+3323243160,3323243175,US
+3323243176,3323243183,CA
+3323243184,3323243199,US
3323243200,3323243207,CN
-3323243208,3323243535,US
+3323243208,3323243215,CA
+3323243216,3323243223,US
+3323243224,3323243239,CA
+3323243240,3323243255,US
+3323243256,3323243263,CA
+3323243264,3323243535,US
3323243536,3323243551,BD
-3323243552,3323244031,US
+3323243552,3323243583,CA
+3323243584,3323243615,US
+3323243616,3323243663,CA
+3323243664,3323243711,US
+3323243712,3323243743,CA
+3323243744,3323243791,US
+3323243792,3323243799,CA
+3323243800,3323243807,US
+3323243808,3323243903,CA
+3323243904,3323243967,US
+3323243968,3323244031,CA
3323244032,3323244095,IN
-3323244096,3323244319,US
+3323244096,3323244159,US
+3323244160,3323244175,CA
+3323244176,3323244255,US
+3323244256,3323244287,CA
+3323244288,3323244319,US
3323244320,3323244327,IN
-3323244328,3323244543,US
-3323244544,3323244671,CA
-3323244672,3323245311,US
+3323244328,3323244351,CA
+3323244352,3323244415,US
+3323244416,3323244487,CA
+3323244488,3323244503,US
+3323244504,3323244511,CA
+3323244512,3323244527,US
+3323244528,3323244703,CA
+3323244704,3323244735,US
+3323244736,3323244767,CA
+3323244768,3323244783,US
+3323244784,3323244799,CA
+3323244800,3323244927,US
+3323244928,3323245055,CA
+3323245056,3323245087,US
+3323245088,3323245119,CA
+3323245120,3323245207,US
+3323245208,3323245215,CA
+3323245216,3323245247,US
+3323245248,3323245255,CA
+3323245256,3323245311,US
3323245312,3323245319,IN
3323245320,3323245327,CA
3323245328,3323245343,US
@@ -117870,19 +123745,38 @@
3323245400,3323245407,TR
3323245408,3323245415,AE
3323245416,3323245423,TR
-3323245424,3323245455,US
+3323245424,3323245455,CA
3323245456,3323245463,AZ
-3323245464,3323245471,CA
-3323245472,3323245479,US
+3323245464,3323245479,CA
3323245480,3323245487,AE
3323245488,3323245495,BE
3323245496,3323245535,US
3323245536,3323245551,SG
3323245552,3323245559,GB
3323245560,3323245567,CN
-3323245568,3323246463,US
+3323245568,3323245655,US
+3323245656,3323245663,CA
+3323245664,3323245823,US
+3323245824,3323245951,CA
+3323245952,3323245959,US
+3323245960,3323245983,CA
+3323245984,3323246015,US
+3323246016,3323246079,CA
+3323246080,3323246207,US
+3323246208,3323246271,CA
+3323246272,3323246463,US
3323246464,3323246591,CN
-3323246592,3323270420,US
+3323246592,3323247359,US
+3323247360,3323247423,CA
+3323247424,3323247487,US
+3323247488,3323247551,CA
+3323247552,3323247575,US
+3323247576,3323247583,CA
+3323247584,3323247871,US
+3323247872,3323248127,CA
+3323248128,3323248383,US
+3323248384,3323248639,CA
+3323248640,3323270420,US
3323270421,3323270421,CH
3323270422,3323339263,US
3323339776,3323340031,CA
@@ -117982,7 +123876,7 @@
3323678056,3323678059,MX
3323678060,3323678063,CA
3323678064,3323678079,GB
-3323678080,3323678087,FR
+3323678080,3323678087,US
3323678088,3323678095,CA
3323678096,3323678111,US
3323678112,3323678127,CA
@@ -117996,7 +123890,8 @@
3323678176,3323678195,CA
3323678196,3323678199,VE
3323678200,3323678463,US
-3323678464,3323678523,CA
+3323678464,3323678519,CA
+3323678520,3323678523,BR
3323678524,3323678527,US
3323678528,3323678583,CA
3323678584,3323678587,US
@@ -118007,7 +123902,9 @@
3323678688,3323678691,PA
3323678692,3323678695,CA
3323678696,3323678699,PT
-3323678700,3323679963,CA
+3323678700,3323679871,CA
+3323679872,3323679903,IN
+3323679904,3323679963,CA
3323679964,3323679999,US
3323680000,3323680255,CA
3323680256,3323681023,US
@@ -118015,7 +123912,9 @@
3323681328,3323681343,US
3323681344,3323681359,CA
3323681360,3323681363,FR
-3323681364,3323681415,CA
+3323681364,3323681399,CA
+3323681400,3323681403,IT
+3323681404,3323681415,CA
3323681416,3323681423,BR
3323681424,3323681439,CA
3323681440,3323681455,AE
@@ -118043,7 +123942,9 @@
3323682752,3323682767,US
3323682768,3323682771,CA
3323682772,3323682775,RO
-3323682776,3323682831,CA
+3323682776,3323682787,CA
+3323682788,3323682791,AF
+3323682792,3323682831,CA
3323682832,3323682839,IN
3323682840,3323682843,BD
3323682844,3323682947,CA
@@ -118074,7 +123975,10 @@
3323683432,3323683439,PL
3323683440,3323683447,CA
3323683448,3323683455,US
-3323683456,3323683535,CA
+3323683456,3323683471,CA
+3323683472,3323683479,US
+3323683480,3323683487,BR
+3323683488,3323683535,CA
3323683536,3323683551,AU
3323683552,3323683583,CA
3323683584,3323683591,PA
@@ -118087,9 +123991,7 @@
3323683872,3323683903,IL
3323683904,3323683935,CA
3323683936,3323683967,US
-3323683968,3323683991,CA
-3323683992,3323683999,PE
-3323684000,3323684027,CA
+3323683968,3323684027,CA
3323684028,3323684031,US
3323684032,3323684063,PE
3323684064,3323684223,CA
@@ -118110,15 +124012,12 @@
3323684432,3323684435,US
3323684436,3323684443,CA
3323684444,3323684447,IN
-3323684448,3323684463,CA
+3323684448,3323684451,MA
+3323684452,3323684463,CA
3323684464,3323684479,US
-3323684480,3323684503,CA
-3323684504,3323684507,IN
-3323684508,3323684543,CA
-3323684544,3323684559,US
-3323684560,3323684607,CA
-3323684608,3323684611,BR
-3323684612,3323684615,CA
+3323684480,3323684539,CA
+3323684540,3323684559,US
+3323684560,3323684615,CA
3323684616,3323684619,US
3323684620,3323684695,CA
3323684696,3323684703,US
@@ -118130,12 +124029,19 @@
3323684836,3323684839,MX
3323684840,3323684843,CA
3323684844,3323684847,US
-3323684848,3323684959,CA
+3323684848,3323684883,CA
+3323684884,3323684887,US
+3323684888,3323684891,CA
+3323684892,3323684895,GR
+3323684896,3323684951,CA
+3323684952,3323684959,US
3323684960,3323684975,BZ
3323684976,3323684991,US
3323684992,3323685023,CA
3323685024,3323685039,RO
-3323685040,3323685167,CA
+3323685040,3323685079,CA
+3323685080,3323685083,IN
+3323685084,3323685167,CA
3323685168,3323685183,MX
3323685184,3323685215,CA
3323685216,3323685231,US
@@ -118158,12 +124064,15 @@
3323685392,3323685399,MX
3323685400,3323685407,CA
3323685408,3323685411,MX
-3323685412,3323685415,US
+3323685412,3323685415,CA
3323685416,3323685419,AR
3323685420,3323685551,CA
3323685552,3323685555,BY
-3323685556,3323685791,CA
-3323685792,3323685823,US
+3323685556,3323685767,CA
+3323685768,3323685775,BR
+3323685776,3323685799,CA
+3323685800,3323685807,US
+3323685808,3323685823,ZA
3323685824,3323685831,BR
3323685832,3323685847,CA
3323685848,3323685855,DE
@@ -118210,13 +124119,22 @@
3323686624,3323686631,NL
3323686632,3323686639,BR
3323686640,3323686655,US
-3323686656,3323686663,CA
-3323686664,3323686667,US
-3323686668,3323686683,CA
+3323686656,3323686659,PE
+3323686660,3323686667,CA
+3323686668,3323686671,FR
+3323686672,3323686683,CA
3323686684,3323686687,IN
-3323686688,3323686847,CA
+3323686688,3323686783,CA
+3323686784,3323686787,BR
+3323686788,3323686807,CA
+3323686808,3323686811,GB
+3323686812,3323686823,CA
+3323686824,3323686827,US
+3323686828,3323686847,CA
3323686848,3323686851,US
-3323686852,3323686911,CA
+3323686852,3323686879,CA
+3323686880,3323686887,US
+3323686888,3323686911,CA
3323686912,3323686943,BR
3323686944,3323686975,IN
3323686976,3323687031,CA
@@ -118240,7 +124158,9 @@
3323687280,3323687287,US
3323687288,3323687427,CA
3323687428,3323687431,BZ
-3323687432,3323687567,CA
+3323687432,3323687451,CA
+3323687452,3323687455,GB
+3323687456,3323687567,CA
3323687568,3323687571,PL
3323687572,3323687575,CA
3323687576,3323687583,ES
@@ -118248,15 +124168,23 @@
3323687592,3323687599,US
3323687600,3323687711,CA
3323687712,3323687715,US
-3323687716,3323687815,CA
+3323687716,3323687719,CA
+3323687720,3323687727,US
+3323687728,3323687815,CA
3323687816,3323687819,US
3323687820,3323687855,CA
3323687856,3323687863,US
-3323687864,3323687915,CA
+3323687864,3323687903,CA
+3323687904,3323687907,BR
+3323687908,3323687915,CA
3323687916,3323687919,US
-3323687920,3323687935,CA
+3323687920,3323687923,CA
+3323687924,3323687927,VN
+3323687928,3323687935,CA
3323687936,3323687999,US
-3323688000,3323688059,CA
+3323688000,3323688051,CA
+3323688052,3323688055,MX
+3323688056,3323688059,CA
3323688060,3323688063,GB
3323688064,3323688135,CA
3323688136,3323688143,US
@@ -118275,7 +124203,7 @@
3323688396,3323688415,CA
3323688416,3323688447,DE
3323688448,3323688463,CA
-3323688464,3323688467,US
+3323688464,3323688467,BR
3323688468,3323688471,CA
3323688472,3323688479,US
3323688480,3323688531,CA
@@ -118287,7 +124215,9 @@
3323688568,3323688571,VE
3323688572,3323688603,CA
3323688604,3323688607,FR
-3323688608,3323688663,CA
+3323688608,3323688655,CA
+3323688656,3323688659,IN
+3323688660,3323688663,CA
3323688664,3323688671,CH
3323688672,3323688675,CA
3323688676,3323688679,US
@@ -118298,7 +124228,9 @@
3323688856,3323688863,CL
3323688864,3323688943,CA
3323688944,3323688947,AU
-3323688948,3323689055,CA
+3323688948,3323689043,CA
+3323689044,3323689047,EC
+3323689048,3323689055,CA
3323689056,3323689059,FR
3323689060,3323689071,CA
3323689072,3323689079,ID
@@ -118319,11 +124251,13 @@
3323689392,3323689399,CA
3323689400,3323689403,DE
3323689404,3323689407,BR
-3323689408,3323689435,CA
+3323689408,3323689427,CA
+3323689428,3323689431,EC
+3323689432,3323689435,CA
3323689436,3323689439,MY
-3323689440,3323689455,CA
-3323689456,3323689471,PK
-3323689472,3323689519,CA
+3323689440,3323689491,CA
+3323689492,3323689495,BR
+3323689496,3323689519,CA
3323689520,3323689527,ES
3323689528,3323689559,CA
3323689560,3323689583,US
@@ -118331,8 +124265,8 @@
3323689600,3323689663,US
3323689664,3323689715,CA
3323689716,3323689719,US
-3323689720,3323689815,CA
-3323689816,3323689823,US
+3323689720,3323689807,CA
+3323689808,3323689823,US
3323689824,3323689863,CA
3323689864,3323689871,PE
3323689872,3323689879,IT
@@ -118340,17 +124274,13 @@
3323689928,3323689935,US
3323689936,3323689983,CA
3323689984,3323690015,RS
-3323690016,3323690047,CA
-3323690048,3323690063,PK
-3323690064,3323690095,CA
+3323690016,3323690095,CA
3323690096,3323690111,PK
3323690112,3323690199,CA
3323690200,3323690207,US
3323690208,3323690223,CA
3323690224,3323690235,US
-3323690236,3323690263,CA
-3323690264,3323690267,BR
-3323690268,3323690351,CA
+3323690236,3323690351,CA
3323690352,3323690359,AE
3323690360,3323690363,ID
3323690364,3323690463,CA
@@ -118370,9 +124300,7 @@
3324256256,3324259327,SA
3324259328,3324259583,US
3324259584,3324260095,SA
-3324260096,3324266495,US
-3324266752,3324270079,US
-3324270592,3324277759,US
+3324260096,3324277759,US
3324277760,3324278783,CA
3324278784,3324279071,US
3324279072,3324279079,TR
@@ -118454,9 +124382,11 @@
3324601088,3324601343,GB
3324601344,3324604671,US
3324604672,3324604927,GB
-3324604928,3324613727,US
-3324613728,3324613759,LU
-3324613760,3324633087,US
+3324604928,3324613695,US
+3324613696,3324613727,LU
+3324613728,3324613759,US
+3324613760,3324613823,LU
+3324613824,3324624895,US
3324633088,3324634111,PE
3324634112,3324635647,AR
3324635648,3324635903,HK
@@ -118534,8 +124464,7 @@
3324704000,3324704255,CA
3324704256,3324706303,US
3324706304,3324706559,CA
-3324706560,3324732415,US
-3324732672,3324805119,US
+3324706560,3324805119,US
3324805120,3324805151,CN
3324805152,3324805183,ES
3324805184,3324805207,US
@@ -118938,9 +124867,9 @@
3324822016,3324822527,CA
3324822528,3324824575,US
3324824576,3324824831,DE
-3324824832,3324843799,US
-3324843802,3324844543,US
-3324844800,3324937999,US
+3324824832,3324937087,US
+3324937088,3324937095,BD
+3324937096,3324937999,US
3324938000,3324938007,PK
3324938008,3324938159,US
3324938160,3324938167,GB
@@ -119014,13 +124943,15 @@
3325198420,3325198423,US
3325198424,3325198559,CA
3325198560,3325198575,PA
-3325198576,3325198583,CA
+3325198576,3325198579,CA
+3325198580,3325198583,BR
3325198584,3325198587,ES
3325198588,3325198591,US
3325198592,3325198619,CA
3325198620,3325198623,AR
3325198624,3325198627,ES
-3325198628,3325198643,CA
+3325198628,3325198639,CA
+3325198640,3325198643,IN
3325198644,3325198647,NL
3325198648,3325198655,CA
3325198656,3325198659,PE
@@ -119037,11 +124968,14 @@
3325198816,3325198823,DE
3325198824,3325198831,CA
3325198832,3325198847,US
-3325198848,3325198895,CA
+3325198848,3325198855,HR
+3325198856,3325198863,ID
+3325198864,3325198895,CA
3325198896,3325198911,BE
3325198912,3325198943,NP
3325198944,3325198947,AU
-3325198948,3325199039,CA
+3325198948,3325198975,CA
+3325198976,3325199039,FR
3325199040,3325199043,US
3325199044,3325199055,CA
3325199056,3325199063,US
@@ -119049,11 +124983,10 @@
3325199072,3325199079,US
3325199080,3325199103,CA
3325199104,3325199119,DE
-3325199120,3325199127,CA
-3325199128,3325199131,US
-3325199132,3325199143,CA
+3325199120,3325199143,CA
3325199144,3325199147,US
-3325199148,3325199255,CA
+3325199148,3325199151,GT
+3325199152,3325199255,CA
3325199256,3325199259,BR
3325199260,3325199291,CA
3325199292,3325199295,US
@@ -119065,18 +124998,16 @@
3325199352,3325199359,US
3325199360,3325199391,CA
3325199392,3325199399,US
-3325199400,3325199407,CA
-3325199408,3325199411,US
-3325199412,3325199491,CA
+3325199400,3325199491,CA
3325199492,3325199495,BR
3325199496,3325199559,CA
3325199560,3325199567,US
3325199568,3325199583,BR
-3325199584,3325199623,CA
+3325199584,3325199615,CA
+3325199616,3325199619,BR
+3325199620,3325199623,CA
3325199624,3325199627,BE
-3325199628,3325199655,CA
-3325199656,3325199663,US
-3325199664,3325199775,CA
+3325199628,3325199775,CA
3325199776,3325199779,BR
3325199780,3325199783,US
3325199784,3325199807,CA
@@ -119088,7 +125019,8 @@
3325199924,3325199927,US
3325199928,3325199931,CA
3325199932,3325199935,CN
-3325199936,3325199951,CA
+3325199936,3325199947,CA
+3325199948,3325199951,BR
3325199952,3325199959,PT
3325199960,3325199967,CA
3325199968,3325199983,BZ
@@ -119107,23 +125039,27 @@
3325200240,3325200255,US
3325200256,3325200279,CA
3325200280,3325200287,NL
-3325200288,3325200311,CA
+3325200288,3325200291,CA
+3325200292,3325200295,FR
+3325200296,3325200311,CA
3325200312,3325200315,IN
3325200316,3325200323,CA
3325200324,3325200327,IL
3325200328,3325200455,CA
3325200456,3325200459,US
3325200460,3325200463,CA
-3325200464,3325200467,US
-3325200468,3325200567,CA
+3325200464,3325200471,US
+3325200472,3325200567,CA
3325200568,3325200571,US
3325200572,3325200575,UA
-3325200576,3325200727,CA
+3325200576,3325200583,CA
+3325200584,3325200591,IN
+3325200592,3325200727,CA
3325200728,3325200731,US
3325200732,3325200739,CA
3325200740,3325200747,US
3325200748,3325200767,CA
-3325200768,3325200783,ID
+3325200768,3325200783,US
3325200784,3325200807,CA
3325200808,3325200811,TR
3325200812,3325200815,IE
@@ -119148,23 +125084,16 @@
3325201072,3325201075,US
3325201076,3325201103,CA
3325201104,3325201111,US
-3325201112,3325201163,CA
+3325201112,3325201115,CA
+3325201116,3325201119,IN
+3325201120,3325201163,CA
3325201164,3325201167,US
3325201168,3325201207,CA
3325201208,3325201215,US
-3325201216,3325201219,CA
-3325201220,3325201227,US
-3325201228,3325201247,CA
+3325201216,3325201247,CA
3325201248,3325201255,CL
3325201256,3325201259,AU
-3325201260,3325201263,US
-3325201264,3325201279,CA
-3325201280,3325201287,US
-3325201288,3325201367,CA
-3325201368,3325201375,MY
-3325201376,3325201391,CA
-3325201392,3325201407,US
-3325201408,3325201427,CA
+3325201260,3325201427,CA
3325201428,3325201431,US
3325201432,3325201439,CA
3325201440,3325201447,IN
@@ -119189,16 +125118,15 @@
3325201764,3325201795,CA
3325201796,3325201799,DM
3325201800,3325201811,CA
-3325201812,3325201823,US
-3325201824,3325201847,CA
+3325201812,3325201815,US
+3325201816,3325201847,CA
3325201848,3325201851,BR
3325201852,3325201855,ES
3325201856,3325201919,BR
3325201920,3325202015,CA
3325202016,3325202031,ES
3325202032,3325202039,CA
-3325202040,3325202047,UM
-3325202048,3325202079,US
+3325202040,3325202079,US
3325202080,3325202115,CA
3325202116,3325202119,US
3325202120,3325202271,CA
@@ -119208,18 +125136,20 @@
3325202328,3325202331,AU
3325202332,3325202367,CA
3325202368,3325202371,PH
-3325202372,3325202375,FR
-3325202376,3325202395,CA
+3325202372,3325202395,CA
3325202396,3325202399,IN
3325202400,3325204479,CA
3325204480,3325205503,US
3325205504,3325206428,CA
3325206429,3325206429,US
-3325206430,3325206543,CA
+3325206430,3325206531,CA
+3325206532,3325206535,CO
+3325206536,3325206543,CA
3325206544,3325206551,DO
3325206552,3325206555,US
3325206556,3325206559,CZ
-3325206560,3325206623,CA
+3325206560,3325206591,IN
+3325206592,3325206623,CA
3325206624,3325206625,RO
3325206626,3325206626,CA
3325206627,3325206627,RO
@@ -119234,26 +125164,25 @@
3325206816,3325206831,CA
3325206832,3325206839,US
3325206840,3325206847,BG
-3325206848,3325206879,CA
+3325206848,3325206863,MX
+3325206864,3325206879,CA
3325206880,3325206911,BA
3325206912,3325206915,BR
3325206916,3325206919,US
3325206920,3325206935,CA
3325206936,3325206943,HR
-3325206944,3325207051,CA
+3325206944,3325207047,CA
+3325207048,3325207051,BR
3325207052,3325207055,US
3325207056,3325207059,GB
3325207060,3325207071,CA
3325207072,3325207103,MX
-3325207104,3325207111,US
-3325207112,3325207115,CA
+3325207104,3325207115,CA
3325207116,3325207119,US
3325207120,3325207131,CA
3325207132,3325207135,US
3325207136,3325207167,BD
-3325207168,3325207271,CA
-3325207272,3325207279,IN
-3325207280,3325207283,CA
+3325207168,3325207283,CA
3325207284,3325207287,US
3325207288,3325207379,CA
3325207380,3325207383,US
@@ -119266,9 +125195,7 @@
3325207592,3325207599,EC
3325207600,3325207699,CA
3325207700,3325207703,LU
-3325207704,3325207735,CA
-3325207736,3325207739,ID
-3325207740,3325207775,CA
+3325207704,3325207775,CA
3325207776,3325207783,US
3325207784,3325207807,CA
3325207808,3325207935,US
@@ -119292,13 +125219,18 @@
3325208416,3325208487,CA
3325208488,3325208491,AE
3325208492,3325208495,US
-3325208496,3325208543,CA
+3325208496,3325208499,IN
+3325208500,3325208543,CA
3325208544,3325208547,US
3325208548,3325208735,CA
3325208736,3325208743,HK
3325208744,3325208747,CA
3325208748,3325208751,CZ
-3325208752,3325208827,CA
+3325208752,3325208767,CA
+3325208768,3325208783,US
+3325208784,3325208787,CA
+3325208788,3325208799,US
+3325208800,3325208827,CA
3325208828,3325208831,EG
3325208832,3325208939,CA
3325208940,3325208943,AU
@@ -119313,7 +125245,8 @@
3325209092,3325209095,AR
3325209096,3325209099,CA
3325209100,3325209103,DM
-3325209104,3325209155,CA
+3325209104,3325209151,CA
+3325209152,3325209155,US
3325209156,3325209163,BZ
3325209164,3325209167,GB
3325209168,3325209183,CA
@@ -119337,9 +125270,7 @@
3325209452,3325209475,CA
3325209476,3325209479,US
3325209480,3325209483,IN
-3325209484,3325209491,CA
-3325209492,3325209495,CN
-3325209496,3325209543,CA
+3325209484,3325209543,CA
3325209544,3325209551,US
3325209552,3325209567,CA
3325209568,3325209575,US
@@ -119350,7 +125281,11 @@
3325209648,3325209655,CA
3325209656,3325209663,CH
3325209664,3325209679,US
-3325209680,3325209767,CA
+3325209680,3325209695,CA
+3325209696,3325209711,SN
+3325209712,3325209727,CA
+3325209728,3325209759,IE
+3325209760,3325209767,CA
3325209768,3325209775,US
3325209776,3325209779,CA
3325209780,3325209783,ID
@@ -119374,20 +125309,24 @@
3325210040,3325210043,PK
3325210044,3325210047,BR
3325210048,3325210063,CA
-3325210064,3325210067,FR
+3325210064,3325210067,BR
3325210068,3325210071,IE
-3325210072,3325210255,CA
-3325210256,3325210263,ID
-3325210264,3325210351,CA
+3325210072,3325210351,CA
3325210352,3325210367,HK
3325210368,3325210399,CA
3325210400,3325210431,SE
-3325210432,3325210451,CA
+3325210432,3325210435,IN
+3325210436,3325210447,CA
+3325210448,3325210451,FR
3325210452,3325210455,ES
-3325210456,3325210631,CA
+3325210456,3325210511,CA
+3325210512,3325210519,GB
+3325210520,3325210631,CA
3325210632,3325210635,US
3325210636,3325210639,FR
-3325210640,3325210671,CA
+3325210640,3325210643,BR
+3325210644,3325210647,US
+3325210648,3325210671,CA
3325210672,3325210687,BR
3325210688,3325210703,CA
3325210704,3325210707,US
@@ -119396,40 +125335,40 @@
3325210720,3325210751,US
3325210752,3325210791,CA
3325210792,3325210799,US
-3325210800,3325210847,CA
+3325210800,3325210815,AE
+3325210816,3325210847,CA
3325210848,3325210851,US
3325210852,3325210863,CA
3325210864,3325210879,US
-3325210880,3325210959,CA
+3325210880,3325210951,CA
+3325210952,3325210955,BR
+3325210956,3325210959,VN
3325210960,3325210975,IN
-3325210976,3325210991,US
-3325210992,3325211087,CA
+3325210976,3325211087,CA
3325211088,3325211091,US
3325211092,3325211095,CA
3325211096,3325211103,US
-3325211104,3325211119,CA
+3325211104,3325211115,CA
+3325211116,3325211119,BR
3325211120,3325211127,US
3325211128,3325211135,CA
3325211136,3325211143,ID
3325211144,3325211151,CA
-3325211152,3325211155,US
-3325211156,3325211159,CA
-3325211160,3325211167,US
-3325211168,3325211175,CA
+3325211152,3325211155,IN
+3325211156,3325211175,CA
3325211176,3325211183,US
-3325211184,3325211191,CA
-3325211192,3325211199,BG
-3325211200,3325211235,CA
+3325211184,3325211235,CA
3325211236,3325211239,FR
-3325211240,3325211303,CA
+3325211240,3325211295,CA
+3325211296,3325211299,US
+3325211300,3325211303,CA
3325211304,3325211311,PT
3325211312,3325211335,CA
3325211336,3325211343,BR
3325211344,3325211351,US
3325211352,3325211363,CA
3325211364,3325211371,US
-3325211372,3325211375,BR
-3325211376,3325211383,CA
+3325211372,3325211383,CA
3325211384,3325211391,US
3325211392,3325211411,CA
3325211412,3325211415,IN
@@ -119451,7 +125390,8 @@
3325212008,3325212087,CA
3325212088,3325212091,BZ
3325212092,3325212095,US
-3325212096,3325212127,CA
+3325212096,3325212119,CA
+3325212120,3325212127,US
3325212128,3325212143,IN
3325212144,3325212151,US
3325212152,3325212155,MX
@@ -119460,9 +125400,7 @@
3325212172,3325212175,IN
3325212176,3325212191,CA
3325212192,3325212199,AR
-3325212200,3325212203,CA
-3325212204,3325212207,ID
-3325212208,3325212215,CA
+3325212200,3325212215,CA
3325212216,3325212223,HR
3325212224,3325212295,CA
3325212296,3325212303,IN
@@ -119488,16 +125426,16 @@
3325212776,3325212927,CA
3325212928,3325212943,LK
3325212944,3325213023,CA
-3325213024,3325213055,EE
+3325213024,3325213055,SE
3325213056,3325213071,US
3325213072,3325213087,NZ
-3325213088,3325213115,CA
+3325213088,3325213103,CA
+3325213104,3325213111,US
+3325213112,3325213115,CA
3325213116,3325213119,US
3325213120,3325213227,CA
3325213228,3325213231,US
-3325213232,3325213295,CA
-3325213296,3325213311,US
-3325213312,3325213423,CA
+3325213232,3325213423,CA
3325213424,3325213431,US
3325213432,3325213435,CA
3325213436,3325213439,US
@@ -119509,14 +125447,18 @@
3325213484,3325213487,VE
3325213488,3325213535,CA
3325213536,3325213543,TR
-3325213544,3325213567,CA
+3325213544,3325213551,CA
+3325213552,3325213555,ES
+3325213556,3325213567,CA
3325213568,3325213571,IE
3325213572,3325213575,CA
3325213576,3325213591,IN
3325213592,3325213607,CA
3325213608,3325213615,US
-3325213616,3325213647,CA
-3325213648,3325213663,US
+3325213616,3325213631,CA
+3325213632,3325213639,TR
+3325213640,3325213655,CA
+3325213656,3325213663,US
3325213664,3325213679,CA
3325213680,3325213687,BR
3325213688,3325213695,US
@@ -119536,14 +125478,14 @@
3325214152,3325214155,US
3325214156,3325214163,CA
3325214164,3325214167,BR
-3325214168,3325214171,CA
-3325214172,3325214175,US
-3325214176,3325214187,CA
+3325214168,3325214187,CA
3325214188,3325214191,US
3325214192,3325214255,CA
3325214256,3325214259,SA
3325214260,3325214263,US
-3325214264,3325214463,CA
+3325214264,3325214399,CA
+3325214400,3325214403,PL
+3325214404,3325214463,CA
3325214464,3325214479,AU
3325214480,3325214499,CA
3325214500,3325214503,PA
@@ -119551,17 +125493,18 @@
3325214584,3325214591,US
3325214592,3325214623,CA
3325214624,3325214639,DE
-3325214640,3325214647,FR
-3325214648,3325214703,CA
+3325214640,3325214703,CA
3325214704,3325214719,AU
3325214720,3325214735,CA
3325214736,3325214739,US
3325214740,3325214783,CA
3325214784,3325214791,US
3325214792,3325214815,CA
-3325214816,3325214823,US
+3325214816,3325214819,US
+3325214820,3325214823,PE
3325214824,3325214831,BR
-3325214832,3325215055,CA
+3325214832,3325214847,EG
+3325214848,3325215055,CA
3325215056,3325215059,IT
3325215060,3325215079,CA
3325215080,3325215087,BR
@@ -119574,8 +125517,8 @@
3325215204,3325215207,GB
3325215208,3325215211,FR
3325215212,3325215263,CA
-3325215264,3325215295,IN
-3325215296,3325215299,US
+3325215264,3325215279,BE
+3325215280,3325215299,US
3325215300,3325215303,IN
3325215304,3325215319,CA
3325215320,3325215327,BR
@@ -119614,7 +125557,9 @@
3325215984,3325215999,VE
3325216000,3325216007,CA
3325216008,3325216015,MX
-3325216016,3325216031,CA
+3325216016,3325216023,CA
+3325216024,3325216027,MX
+3325216028,3325216031,CA
3325216032,3325216035,IN
3325216036,3325216043,CA
3325216044,3325216047,EG
@@ -119627,7 +125572,9 @@
3325216116,3325216119,US
3325216120,3325216239,CA
3325216240,3325216243,BR
-3325216244,3325216319,CA
+3325216244,3325216247,CA
+3325216248,3325216251,BR
+3325216252,3325216319,CA
3325216320,3325216327,US
3325216328,3325216359,CA
3325216360,3325216363,GB
@@ -119639,13 +125586,9 @@
3325216448,3325216463,FR
3325216464,3325216527,CA
3325216528,3325216531,US
-3325216532,3325216703,CA
-3325216704,3325216711,US
-3325216712,3325216723,CA
-3325216724,3325216727,US
-3325216728,3325216731,CA
-3325216732,3325216735,BR
-3325216736,3325216855,CA
+3325216532,3325216707,CA
+3325216708,3325216711,US
+3325216712,3325216855,CA
3325216856,3325216859,VG
3325216860,3325216895,CA
3325216896,3325216927,PA
@@ -119670,11 +125613,14 @@
3325217472,3325217503,IE
3325217504,3325217651,CA
3325217652,3325217655,AE
-3325217656,3325217695,CA
+3325217656,3325217663,CA
+3325217664,3325217667,CO
+3325217668,3325217695,CA
3325217696,3325217699,US
3325217700,3325217703,BR
3325217704,3325217711,DE
-3325217712,3325217835,CA
+3325217712,3325217715,US
+3325217716,3325217835,CA
3325217836,3325217839,CL
3325217840,3325217855,CA
3325217856,3325217887,BR
@@ -119685,9 +125631,13 @@
3325217972,3325217975,US
3325217976,3325217983,CA
3325217984,3325217987,US
-3325217988,3325218039,CA
+3325217988,3325218015,CA
+3325218016,3325218031,US
+3325218032,3325218039,CA
3325218040,3325218047,US
-3325218048,3325218139,CA
+3325218048,3325218131,CA
+3325218132,3325218135,US
+3325218136,3325218139,CA
3325218140,3325218147,GB
3325218148,3325218159,CA
3325218160,3325218167,US
@@ -119722,7 +125672,9 @@
3325219084,3325219087,BZ
3325219088,3325219091,CA
3325219092,3325219095,VE
-3325219096,3325219407,CA
+3325219096,3325219175,CA
+3325219176,3325219179,US
+3325219180,3325219407,CA
3325219408,3325219411,FR
3325219412,3325219415,CA
3325219416,3325219419,US
@@ -119733,13 +125685,13 @@
3325219468,3325219475,US
3325219476,3325219503,CA
3325219504,3325219511,VG
-3325219512,3325219515,CA
-3325219516,3325219519,BR
-3325219520,3325219535,CA
+3325219512,3325219531,CA
+3325219532,3325219535,BR
3325219536,3325219551,PK
3325219552,3325219583,CA
3325219584,3325219599,US
-3325219600,3325219631,CA
+3325219600,3325219615,GB
+3325219616,3325219631,CA
3325219632,3325219647,US
3325219648,3325219695,CA
3325219696,3325219699,US
@@ -119754,18 +125706,17 @@
3325219812,3325219839,CA
3325219840,3325219871,TN
3325219872,3325219875,BR
-3325219876,3325219919,CA
-3325219920,3325219931,US
+3325219876,3325219903,CA
+3325219904,3325219931,US
3325219932,3325219935,CA
3325219936,3325219951,US
-3325219952,3325219971,CA
-3325219972,3325219975,HK
-3325219976,3325219983,CA
+3325219952,3325219983,CA
3325219984,3325219999,US
3325220000,3325220011,CA
3325220012,3325220015,AU
3325220016,3325220023,MX
-3325220024,3325220043,CA
+3325220024,3325220039,CA
+3325220040,3325220043,US
3325220044,3325220047,BR
3325220048,3325220051,AU
3325220052,3325220055,CA
@@ -119777,7 +125728,9 @@
3325220412,3325220415,BZ
3325220416,3325220511,CA
3325220512,3325220519,BR
-3325220520,3325220579,CA
+3325220520,3325220543,CA
+3325220544,3325220559,US
+3325220560,3325220579,CA
3325220580,3325220583,BZ
3325220584,3325220587,US
3325220588,3325220607,CA
@@ -119788,37 +125741,30 @@
3325220652,3325220655,BR
3325220656,3325220703,CA
3325220704,3325220719,US
-3325220720,3325220775,CA
-3325220776,3325220783,FR
-3325220784,3325220831,CA
+3325220720,3325220831,CA
3325220832,3325220879,US
3325220880,3325220895,CA
3325220896,3325220927,FR
3325220928,3325220959,CA
3325220960,3325220967,EC
-3325220968,3325220975,CA
-3325220976,3325220983,MX
-3325220984,3325221043,CA
+3325220968,3325221043,CA
3325221044,3325221047,CL
-3325221048,3325221055,CA
+3325221048,3325221051,BR
+3325221052,3325221055,CA
3325221056,3325221119,BR
3325221120,3325221183,CA
3325221184,3325221199,US
3325221200,3325221215,BR
3325221216,3325221263,CA
3325221264,3325221279,TW
-3325221280,3325221295,CA
-3325221296,3325221299,US
-3325221300,3325221307,CA
-3325221308,3325221311,VE
-3325221312,3325221439,CA
+3325221280,3325221439,CA
3325221440,3325221443,PE
3325221444,3325221451,CA
3325221452,3325221455,US
3325221456,3325221467,CA
-3325221468,3325221471,FR
+3325221468,3325221471,BR
3325221472,3325221567,CA
-3325221568,3325221575,MX
+3325221568,3325221575,AU
3325221576,3325221583,CA
3325221584,3325221599,US
3325221600,3325221615,CA
@@ -119859,17 +125805,15 @@
3325222400,3325222463,US
3325222464,3325222479,CA
3325222480,3325222483,US
-3325222484,3325222543,CA
-3325222544,3325222559,ID
-3325222560,3325222567,CA
+3325222484,3325222567,CA
3325222568,3325222571,US
3325222572,3325222575,LK
3325222576,3325222607,CA
3325222608,3325222623,US
3325222624,3325222627,DE
3325222628,3325222643,CA
-3325222644,3325222647,BR
-3325222648,3325222651,CA
+3325222644,3325222647,VN
+3325222648,3325222651,LB
3325222652,3325222655,US
3325222656,3325222667,CA
3325222668,3325222671,MX
@@ -119890,7 +125834,7 @@
3325222968,3325222983,CA
3325222984,3325222987,TW
3325222988,3325223007,CA
-3325223008,3325223023,US
+3325223008,3325223023,IN
3325223024,3325223027,CA
3325223028,3325223031,US
3325223032,3325223039,CA
@@ -119956,17 +125900,13 @@
3325224072,3325224079,HR
3325224080,3325224087,CA
3325224088,3325224091,BZ
-3325224092,3325224095,FR
-3325224096,3325224231,CA
-3325224232,3325224239,US
-3325224240,3325224271,CA
-3325224272,3325224279,BR
-3325224280,3325224383,CA
+3325224092,3325224383,CA
3325224384,3325224391,GB
3325224392,3325224399,CA
3325224400,3325224415,AU
-3325224416,3325224419,US
-3325224420,3325224479,CA
+3325224416,3325224455,CA
+3325224456,3325224463,FR
+3325224464,3325224479,CA
3325224480,3325224511,US
3325224512,3325224551,CA
3325224552,3325224559,BR
@@ -119990,15 +125930,15 @@
3325224808,3325224815,GB
3325224816,3325224823,FR
3325224824,3325224831,CA
-3325224832,3325224839,US
-3325224840,3325224855,CA
+3325224832,3325224847,US
+3325224848,3325224855,CA
3325224856,3325224863,MX
3325224864,3325224871,CA
3325224872,3325224875,IL
3325224876,3325224879,CA
3325224880,3325224895,US
3325224896,3325224919,CA
-3325224920,3325224927,US
+3325224920,3325224927,DJ
3325224928,3325224951,CA
3325224952,3325224955,GB
3325224956,3325225095,CA
@@ -120048,7 +125988,8 @@
3325225912,3325225915,CA
3325225916,3325225919,BR
3325225920,3325225923,EG
-3325225924,3325225943,CA
+3325225924,3325225927,IN
+3325225928,3325225943,CA
3325225944,3325225951,PL
3325225952,3325225967,MX
3325225968,3325225983,US
@@ -120073,11 +126014,16 @@
3325226304,3325226307,CA
3325226308,3325226311,FR
3325226312,3325226315,DE
-3325226316,3325226343,CA
+3325226316,3325226319,CA
+3325226320,3325226323,IN
+3325226324,3325226343,CA
3325226344,3325226347,IN
-3325226348,3325226439,CA
+3325226348,3325226435,CA
+3325226436,3325226439,MA
3325226440,3325226443,VN
-3325226444,3325226495,CA
+3325226444,3325226455,CA
+3325226456,3325226463,IN
+3325226464,3325226495,CA
3325226496,3325227007,US
3325227008,3325227039,CA
3325227040,3325227071,BR
@@ -120110,7 +126056,8 @@
3325227528,3325227539,CA
3325227540,3325227543,CZ
3325227544,3325227551,BD
-3325227552,3325227567,CA
+3325227552,3325227555,BR
+3325227556,3325227567,CA
3325227568,3325227571,IN
3325227572,3325227575,KE
3325227576,3325227583,US
@@ -120137,11 +126084,15 @@
3325228256,3325228263,US
3325228264,3325228287,CA
3325228288,3325228415,US
-3325228416,3325228615,CA
+3325228416,3325228551,CA
+3325228552,3325228555,PK
+3325228556,3325228615,CA
3325228616,3325228623,US
3325228624,3325228675,CA
3325228676,3325228683,US
-3325228684,3325228735,CA
+3325228684,3325228687,CA
+3325228688,3325228691,BR
+3325228692,3325228735,CA
3325228736,3325228739,FR
3325228740,3325228783,CA
3325228784,3325228787,US
@@ -120150,7 +126101,9 @@
3325228816,3325228823,CA
3325228824,3325228831,BR
3325228832,3325228863,US
-3325228864,3325228931,CA
+3325228864,3325228871,CA
+3325228872,3325228875,IN
+3325228876,3325228931,CA
3325228932,3325228935,LU
3325228936,3325228991,CA
3325228992,3325229007,BR
@@ -120160,8 +126113,8 @@
3325229084,3325229087,US
3325229088,3325229175,CA
3325229176,3325229183,IN
-3325229184,3325229247,US
-3325229248,3325229255,CA
+3325229184,3325229251,US
+3325229252,3325229255,CA
3325229256,3325229263,BR
3325229264,3325229279,CA
3325229280,3325229295,US
@@ -120172,8 +126125,8 @@
3325229352,3325229359,BR
3325229360,3325229411,CA
3325229412,3325229415,RU
-3325229416,3325229463,CA
-3325229464,3325229471,BR
+3325229416,3325229459,CA
+3325229460,3325229471,BR
3325229472,3325229487,US
3325229488,3325229499,CA
3325229500,3325229503,IN
@@ -120193,7 +126146,9 @@
3325229664,3325229695,MX
3325229696,3325229747,CA
3325229748,3325229755,CY
-3325229756,3325229815,CA
+3325229756,3325229795,CA
+3325229796,3325229799,PA
+3325229800,3325229815,CA
3325229816,3325229823,US
3325229824,3325229831,CA
3325229832,3325229835,US
@@ -120216,8 +126171,7 @@
3325230080,3325230095,US
3325230096,3325230103,CA
3325230104,3325230111,US
-3325230112,3325230119,CA
-3325230120,3325230123,MA
+3325230112,3325230123,CA
3325230124,3325230127,CL
3325230128,3325230135,CA
3325230136,3325230143,FR
@@ -120227,16 +126181,17 @@
3325230176,3325230319,CA
3325230320,3325230323,US
3325230324,3325230447,CA
-3325230448,3325230455,NI
+3325230448,3325230455,US
3325230456,3325230495,CA
3325230496,3325230511,US
3325230512,3325230527,CA
3325230528,3325230543,MU
-3325230544,3325230563,US
-3325230564,3325230583,CA
+3325230544,3325230559,US
+3325230560,3325230583,CA
3325230584,3325230591,SN
3325230592,3325230715,CA
-3325230716,3325230751,US
+3325230716,3325230719,AR
+3325230720,3325230751,US
3325230752,3325230779,CA
3325230780,3325230783,BR
3325230784,3325230983,CA
@@ -120302,8 +126257,8 @@
3325451264,3325452799,US
3325452800,3325453311,ZA
3325453312,3325463807,US
-3325463808,3325464063,ZA
-3325464064,3325465087,NA
+3325463808,3325464319,ZA
+3325464320,3325465087,NA
3325465088,3325466623,ZA
3325466624,3325467135,US
3325467136,3325469695,ZA
@@ -120324,18 +126279,14 @@
3325484288,3325484799,US
3325484800,3325485055,ZA
3325485056,3325485311,US
-3325485312,3325486591,ZA
-3325486592,3325486847,US
-3325486848,3325487359,ZA
+3325485312,3325487359,ZA
3325487360,3325487615,US
3325487616,3325487871,ZA
3325487872,3325490943,US
3325490944,3325492991,ZA
3325492992,3325497343,US
3325497344,3325499903,PR
-3325499904,3325500415,US
-3325500416,3325501439,TR
-3325501440,3325505535,US
+3325499904,3325505535,US
3325505536,3325509631,CA
3325509632,3325551615,US
3325551616,3325552639,CA
@@ -120433,8 +126384,7 @@
3327162368,3327162623,GB
3327162624,3327162879,US
3327162880,3327163391,GB
-3327163392,3327172863,US
-3327173120,3327197183,US
+3327163392,3327197183,US
3327197184,3327198207,JP
3327198208,3327199231,US
3327199232,3327200255,BR
@@ -120448,8 +126398,7 @@
3327723520,3327725311,CA
3327725312,3327788543,US
3327788544,3327789055,CA
-3327789056,3327803647,US
-3327803904,3327806463,US
+3327789056,3327806463,US
3327806464,3327811583,CA
3327811584,3327885311,US
3327885312,3327918079,CA
@@ -120526,9 +126475,9 @@
3328576513,3328576767,JP
3328576768,3328617983,US
3328617984,3328618239,CA
-3328618240,3328629503,US
+3328618240,3328629631,US
3328629632,3328629695,GB
-3328629760,3328630015,US
+3328629696,3328630015,US
3328630016,3328630271,CA
3328630272,3328630783,US
3328630784,3328631807,CA
@@ -120538,8 +126487,7 @@
3328774400,3328775935,CA
3328775936,3328788735,US
3328788736,3328788991,FR
-3328788992,3328789503,US
-3328790016,3328794623,US
+3328788992,3328794623,US
3328795648,3328796671,US
3328798720,3328799743,NL
3328800000,3328800255,NL
@@ -120708,8 +126656,7 @@
3331275264,3331275264,CH
3331275265,3331275775,US
3331275776,3331275776,CA
-3331275777,3331352919,US
-3331352921,3331356671,US
+3331275777,3331356671,US
3331356672,3331357183,BZ
3331357184,3331358719,US
3331358720,3331362815,JP
@@ -120778,9 +126725,7 @@
3331818496,3331818751,MX
3331818752,3331840111,US
3331840112,3331840115,CA
-3331840116,3331853823,US
-3331854080,3331868161,US
-3331868163,3331935231,US
+3331840116,3331935231,US
3331935232,3331935583,CA
3331935584,3331935615,US
3331935616,3331936255,CA
@@ -120788,21 +126733,30 @@
3331983104,3331983359,CA
3331983360,3331988479,US
3331988480,3331989503,CA
-3331989504,3332002559,US
-3332002560,3332002815,AU
-3332002816,3332003711,US
+3331989504,3332001791,US
+3332001792,3332002047,CA
+3332002048,3332002063,US
+3332002064,3332002111,CA
+3332002112,3332002143,US
+3332002144,3332002159,CA
+3332002160,3332002215,US
+3332002216,3332002223,CA
+3332002224,3332002303,US
+3332002304,3332002431,CA
+3332002432,3332002495,US
+3332002496,3332002559,CA
+3332002560,3332003711,US
3332003712,3332003839,IT
-3332003840,3332004607,US
-3332004608,3332004639,AU
-3332004640,3332004927,US
-3332004928,3332004959,AU
-3332004960,3332005375,US
-3332005376,3332005631,IN
-3332005632,3332028415,US
+3332003840,3332004607,CA
+3332004608,3332004671,US
+3332004672,3332004863,CA
+3332004864,3332005631,US
+3332005632,3332005632,CA
+3332005633,3332005886,US
+3332005887,3332005887,CA
+3332005888,3332028415,US
3332028416,3332030463,CA
-3332030464,3332083967,US
-3332084224,3332095231,US
-3332095488,3332423423,US
+3332030464,3332423423,US
3332423424,3332423679,CA
3332423680,3332440319,US
3332440320,3332460543,CA
@@ -120833,7 +126787,9 @@
3332505856,3332508671,CA
3332508672,3332508927,US
3332508928,3332525311,CA
-3332525312,3332526079,US
+3332525312,3332525574,US
+3332525575,3332525575,CA
+3332525576,3332526079,US
3332526080,3332526591,CA
3332526592,3332527103,US
3332527104,3332528127,CA
@@ -120928,10 +126884,8 @@
3333396224,3333396479,JP
3333396480,3333396673,US
3333396674,3333396674,DE
-3333396675,3333396689,US
-3333396692,3333427967,US
-3333427968,3333428007,GB
-3333428009,3333428223,GB
+3333396675,3333427967,US
+3333427968,3333428223,GB
3333428224,3333444095,US
3333444096,3333444351,GB
3333444352,3333444607,US
@@ -120957,8 +126911,7 @@
3333583872,3333584895,CA
3333584896,3333593855,US
3333593856,3333594111,CA
-3333594112,3333603328,US
-3333603330,3333609983,US
+3333594112,3333609983,US
3333609984,3333610239,SG
3333610240,3333614591,US
3333614592,3333614847,GB
@@ -120994,8 +126947,7 @@
3333781504,3333783551,CA
3333783552,3333801727,US
3333801728,3333801983,CA
-3333801984,3333825791,US
-3333826048,3333829631,US
+3333801984,3333829631,US
3333829632,3333830143,IN
3333830144,3333859839,US
3333859840,3333860095,BM
@@ -121009,8 +126961,7 @@
3333997824,3333998079,CA
3333998080,3334006527,US
3334006528,3334006783,NL
-3334006784,3334007551,US
-3334007808,3334020095,US
+3334006784,3334020095,US
3334020096,3334021119,CA
3334021120,3334068479,US
3334068480,3334068735,CA
@@ -121085,9 +127036,7 @@
3335352464,3335352479,CA
3335352480,3335352783,US
3335352784,3335352799,AU
-3335352800,3335353215,US
-3335353216,3335353343,PR
-3335353344,3335353855,US
+3335352800,3335353855,US
3335353856,3335353863,AU
3335353864,3335354015,US
3335354016,3335354023,AU
@@ -121119,12 +127068,11 @@
3335524352,3335524607,AU
3335524608,3335527167,US
3335527168,3335527235,DE
+3335527236,3335527237,US
3335527238,3335527423,DE
3335527424,3335573759,US
3335573760,3335574015,IN
-3335574016,3335581695,US
-3335581952,3335582463,US
-3335582720,3335665252,US
+3335574016,3335665252,US
3335665253,3335665342,TH
3335665343,3335719071,US
3335719072,3335719087,IN
@@ -121162,7 +127110,8 @@
3337053184,3337053695,CA
3337053696,3337055231,US
3337055232,3337060351,CA
-3337060352,3337106687,US
+3337060352,3337106431,US
+3337106432,3337106687,DE
3337106688,3337106943,SG
3337106944,3337107199,HK
3337107200,3337107455,AU
@@ -121173,8 +127122,8 @@
3337198400,3337198703,US
3337198704,3337198707,CA
3337198708,3337201671,US
-3337201672,3337201687,CA
-3337201688,3337201727,US
+3337201672,3337201679,CA
+3337201680,3337201727,US
3337201728,3337201735,CA
3337201736,3337201767,US
3337201768,3337201775,CA
@@ -121241,44 +127190,93 @@
3337957376,3337959423,CA
3337959424,3337960447,US
3337960448,3337961471,CA
-3337961472,3337961519,US
+3337961472,3337961487,US
+3337961488,3337961495,CA
+3337961496,3337961519,US
3337961520,3337961527,RO
-3337961528,3337961535,US
+3337961528,3337961535,CA
3337961536,3337961543,AZ
-3337961544,3337961551,US
+3337961544,3337961551,CA
3337961552,3337961559,KZ
3337961560,3337961567,ID
3337961568,3337961575,PK
3337961576,3337961583,AZ
-3337961584,3337961599,US
+3337961584,3337961591,US
+3337961592,3337961599,CA
3337961600,3337961615,RO
-3337961616,3337961631,US
+3337961616,3337961623,CA
+3337961624,3337961631,US
3337961632,3337961663,GB
-3337961664,3337961671,CA
-3337961672,3337962623,US
-3337962624,3337962751,CA
-3337962752,3337962799,US
+3337961664,3337961687,CA
+3337961688,3337961695,US
+3337961696,3337962007,CA
+3337962008,3337962015,US
+3337962016,3337962047,CA
+3337962048,3337962111,US
+3337962112,3337962143,CA
+3337962144,3337962151,US
+3337962152,3337962215,CA
+3337962216,3337962223,US
+3337962224,3337962239,CA
+3337962240,3337962327,US
+3337962328,3337962335,CA
+3337962336,3337962431,US
+3337962432,3337962599,CA
+3337962600,3337962623,US
+3337962624,3337962799,CA
3337962800,3337962807,GB
-3337962808,3337963639,US
-3337963640,3337963647,CA
-3337963648,3337963775,US
+3337962808,3337962831,CA
+3337962832,3337962943,US
+3337962944,3337962983,CA
+3337962984,3337962991,US
+3337962992,3337963071,CA
+3337963072,3337963135,US
+3337963136,3337963271,CA
+3337963272,3337963279,US
+3337963280,3337963295,CA
+3337963296,3337963311,US
+3337963312,3337963319,CA
+3337963320,3337963327,US
+3337963328,3337963335,CA
+3337963336,3337963343,US
+3337963344,3337963359,CA
+3337963360,3337963391,US
+3337963392,3337963431,CA
+3337963432,3337963439,US
+3337963440,3337963447,CA
+3337963448,3337963455,US
+3337963456,3337963535,CA
+3337963536,3337963631,US
+3337963632,3337963647,CA
+3337963648,3337963743,US
+3337963744,3337963759,CA
+3337963760,3337963767,US
+3337963768,3337963775,CA
3337963776,3337963783,AZ
3337963784,3337963791,US
3337963792,3337963799,AZ
-3337963800,3337963815,US
-3337963816,3337963823,CA
-3337963824,3337963847,US
+3337963800,3337963807,US
+3337963808,3337963847,CA
3337963848,3337963855,BR
3337963856,3337963863,CA
3337963864,3337963871,MA
-3337963872,3337963887,CA
-3337963888,3337963903,US
+3337963872,3337963903,CA
3337963904,3337963911,MA
-3337963912,3337963967,US
+3337963912,3337963919,CA
+3337963920,3337963951,US
+3337963952,3337963967,CA
3337963968,3337964031,IN
-3337964032,3337964671,US
+3337964032,3337964287,US
+3337964288,3337964295,CA
+3337964296,3337964335,US
+3337964336,3337964351,CA
+3337964352,3337964415,US
+3337964416,3337964543,CA
+3337964544,3337964671,US
3337964672,3337964735,IN
-3337964736,3337969663,US
+3337964736,3337964751,US
+3337964752,3337964759,CA
+3337964760,3337969663,US
3337969664,3337973759,PR
3337973760,3337977855,CA
3337977856,3337980671,US
@@ -121409,9 +127407,7 @@
3338360832,3338361087,RU
3338361088,3338361192,US
3338361193,3338361193,RO
-3338361194,3338361343,US
-3338361344,3338361599,GB
-3338361600,3338371071,US
+3338361194,3338371071,US
3338371072,3338403839,CA
3338403840,3338424319,US
3338424320,3338428415,CA
@@ -121422,10 +127418,12 @@
3338430976,3338431487,US
3338431488,3338431743,CA
3338431744,3338432255,US
-3338432256,3338432511,CA
+3338432256,3338432511,SG
3338432512,3338436607,US
3338436608,3338437631,CA
-3338437632,3338455039,US
+3338437632,3338446079,US
+3338446080,3338446335,CA
+3338446336,3338455039,US
3338455040,3338455295,GB
3338455296,3338567679,US
3338567680,3338600447,CA
@@ -121447,9 +127445,7 @@
3338825728,3338827775,AW
3338827776,3338849615,US
3338849616,3338849631,FR
-3338849632,3338912767,US
-3338912768,3338913023,EC
-3338913024,3338916351,US
+3338849632,3338916351,US
3338916352,3338916479,CN
3338916480,3338921219,US
3338921220,3338921220,PT
@@ -121489,7 +127485,7 @@
3339139840,3339140095,US
3339140096,3339140351,SG
3339140352,3339140607,HK
-3339140608,3339142655,US
+3339140608,3339142911,US
3339142912,3339143167,DE
3339143168,3339143423,US
3339143424,3339143679,ES
@@ -121676,13 +127672,7 @@
3339939447,3339939473,US
3339939474,3339939534,GB
3339939535,3339939582,TR
-3339939583,3339941650,US
-3339941651,3339941651,BR
-3339941652,3339941664,US
-3339941665,3339941665,BR
-3339941666,3339941790,US
-3339941791,3339941791,BR
-3339941792,3339952127,US
+3339939583,3339952127,US
3339952128,3339956223,CA
3339956224,3339962559,US
3339962560,3339962591,GB
@@ -121711,11 +127701,11 @@
3340391786,3340391793,MY
3340391794,3340391817,US
3340391818,3340391825,LK
-3340391826,3340391833,US
-3340391834,3340391841,LK
-3340391842,3340392169,US
+3340391826,3340392169,US
3340392170,3340392190,LK
-3340392191,3340418559,US
+3340392191,3340394495,US
+3340394496,3340396543,HK
+3340396544,3340418559,US
3340418560,3340419071,CA
3340419072,3340429823,US
3340429824,3340430079,PA
@@ -121869,23 +127859,21 @@
3341082624,3341084671,CA
3341084672,3341180927,US
3341180928,3341182975,CA
-3341182976,3341186489,US
-3341186490,3341186491,IN
-3341186492,3341186686,US
+3341182976,3341186686,US
3341186687,3341186688,IN
-3341186689,3341205503,US
-3341205504,3341206589,VC
+3341186689,3341194463,US
+3341194464,3341194495,NL
+3341194496,3341205503,US
+3341205504,3341206589,LC
3341206590,3341206590,BB
-3341206591,3341207551,VC
+3341206591,3341207551,LC
3341207552,3341210263,US
3341210264,3341210271,CA
3341210272,3341216255,US
3341216256,3341216767,JP
3341216768,3341217791,CA
3341217792,3341287423,US
-3341287424,3341339647,CZ
-3341339904,3341340159,CZ
-3341340416,3341408511,CZ
+3341287424,3341408511,CZ
3341408512,3341408767,US
3341408768,3341418495,CZ
3341418496,3341444863,US
@@ -121901,7 +127889,7 @@
3341480448,3341484287,US
3341484288,3341485055,CA
3341485056,3341488639,US
-3341488640,3341488895,JP
+3341488640,3341489151,JP
3341489152,3341495551,US
3341495552,3341495807,HK
3341495808,3341500159,US
@@ -121921,7 +127909,9 @@
3341535048,3341535055,GH
3341535056,3341535087,US
3341535088,3341535095,MX
-3341535096,3341535183,US
+3341535096,3341535171,US
+3341535172,3341535175,BR
+3341535176,3341535183,US
3341535184,3341535187,ID
3341535188,3341535195,US
3341535196,3341535199,SA
@@ -122073,15 +128063,13 @@
3342629888,3342657535,CA
3342657536,3342657791,US
3342657792,3342663423,CA
-3342663424,3342795007,US
-3342795264,3342831103,US
+3342663424,3342831103,US
3342831104,3342831359,IN
-3342831360,3342878967,US
-3342878976,3342879231,US
+3342831360,3342879487,US
3342879488,3342879551,NL
+3342879552,3342879567,US
3342879568,3342879743,NL
-3342879744,3342979587,US
-3342979592,3343013887,US
+3342879744,3343013887,US
3343013888,3343015695,CA
3343015696,3343015727,US
3343015728,3343015935,CA
@@ -122116,8 +128104,7 @@
3343055872,3343056895,CA
3343056896,3343090581,US
3343090582,3343090583,MX
-3343090584,3343108863,US
-3343109120,3343153151,US
+3343090584,3343153151,US
3343153152,3343153167,CA
3343153168,3343153175,US
3343153176,3343154943,CA
@@ -122282,13 +128269,7 @@
3344381894,3344406527,US
3344406528,3344408575,CA
3344408576,3344411135,US
-3344411136,3344411151,BM
-3344411152,3344411295,US
-3344411296,3344411327,BM
-3344411328,3344411519,US
-3344411520,3344411535,BM
-3344411536,3344411631,US
-3344411632,3344411647,BM
+3344411136,3344411647,BM
3344411648,3344415679,US
3344415680,3344415743,AR
3344415744,3344429055,US
@@ -122301,7 +128282,9 @@
3344534272,3344534527,CA
3344534528,3344633855,US
3344633856,3344637951,CH
-3344637952,3344649215,US
+3344637952,3344648703,US
+3344648704,3344648959,SG
+3344648960,3344649215,DE
3344649216,3344650239,PR
3344650240,3344652287,CA
3344652288,3344654335,US
@@ -122363,9 +128346,7 @@
3345299456,3345301503,CA
3345301504,3345303551,US
3345303552,3345304575,CA
-3345304576,3345310247,US
-3345310248,3345310255,GB
-3345310256,3345315071,US
+3345304576,3345315071,US
3345315072,3345315327,TW
3345315328,3345315583,US
3345315584,3345315839,TW
@@ -122404,15 +128385,16 @@
3345332496,3345332503,CA
3345332504,3345332515,BR
3345332516,3345332519,GH
-3345332520,3345332583,US
+3345332520,3345332535,US
+3345332536,3345332539,BR
+3345332540,3345332583,US
3345332584,3345332587,CY
3345332588,3345332591,BR
3345332592,3345332595,US
3345332596,3345332599,BD
3345332600,3345332603,US
3345332604,3345332607,ID
-3345332608,3345332647,US
-3345332648,3345332655,ID
+3345332608,3345332655,US
3345332656,3345332659,CY
3345332660,3345332667,US
3345332668,3345332671,ID
@@ -122520,7 +128502,9 @@
3345419520,3345422847,US
3345423360,3345424383,TC
3345424384,3345430527,US
-3345430528,3345432575,CA
+3345430528,3345431039,CA
+3345431040,3345431295,US
+3345431296,3345432575,CA
3345432576,3345433599,GB
3345433600,3345433855,SG
3345433856,3345434879,US
@@ -122556,8 +128540,7 @@
3345666624,3345666639,NO
3345666640,3345667103,US
3345667104,3345667119,IN
-3345667120,3346194175,US
-3346194432,3346196479,US
+3345667120,3346196479,US
3346196480,3346197503,CA
3346197504,3346198527,US
3346198528,3346200575,CA
@@ -122726,8 +128709,8 @@
3349605376,3349605631,US
3349605632,3349608447,CA
3349608448,3349609471,US
-3349609472,3349610495,CA
-3349610496,3349614591,US
+3349609472,3349610239,CA
+3349610240,3349614591,US
3349614592,3349614655,CA
3349614656,3349614671,US
3349614672,3349614783,CA
@@ -122742,9 +128725,7 @@
3349619392,3349619503,US
3349619504,3349619519,PA
3349619520,3349619583,CA
-3349619584,3349621826,US
-3349621827,3349621828,DK
-3349621829,3349637119,US
+3349619584,3349637119,US
3349637120,3349639167,CA
3349639168,3349640191,US
3349640192,3349641215,CA
@@ -122797,7 +128778,9 @@
3350003712,3350042879,US
3350042880,3350043135,KW
3350043136,3350134783,US
-3350134784,3350146047,CA
+3350134784,3350136575,CA
+3350136576,3350136831,US
+3350136832,3350146047,CA
3350146048,3350150143,US
3350150144,3350160639,CA
3350160640,3350160895,US
@@ -122869,8 +128852,7 @@
3350519060,3350519063,IN
3350519064,3350548735,US
3350548736,3350548991,CA
-3350549248,3350561279,US
-3350561536,3350574591,US
+3350548992,3350574591,US
3350574848,3350575103,CA
3350575104,3350593535,US
3350593536,3350605823,CA
@@ -122901,7 +128883,20 @@
3350825984,3350834687,CA
3350834688,3350835199,US
3350835200,3350836223,CA
-3350836224,3350836991,US
+3350836224,3350836227,US
+3350836228,3350836235,GB
+3350836236,3350836239,US
+3350836240,3350836243,IQ
+3350836244,3350836247,EG
+3350836248,3350836251,SA
+3350836252,3350836255,IT
+3350836256,3350836259,NZ
+3350836260,3350836263,HK
+3350836264,3350836267,CN
+3350836268,3350836275,IN
+3350836276,3350836279,ZA
+3350836280,3350836283,CA
+3350836284,3350836991,US
3350836992,3350837247,CA
3350837248,3350837759,US
3350837760,3350843391,CA
@@ -122984,16 +128979,13 @@
3351043584,3351044095,CA
3351044096,3351045311,US
3351045312,3351045343,EE
-3351045344,3351047167,US
-3351047680,3351058943,US
+3351045344,3351058943,US
3351058944,3351059455,CA
3351059456,3351071743,US
3351071744,3351072767,CA
3351072768,3351074271,US
3351074272,3351074272,GT
-3351074273,3351074283,US
-3351074284,3351074284,BR
-3351074285,3351074301,US
+3351074273,3351074301,US
3351074302,3351074302,PT
3351074303,3351074303,BR
3351074304,3351074367,US
@@ -123016,7 +129008,8 @@
3351074393,3351074394,US
3351074395,3351074395,TR
3351074396,3351074396,BR
-3351074397,3351074402,US
+3351074397,3351074397,SE
+3351074398,3351074402,US
3351074403,3351074403,BR
3351074404,3351074404,CL
3351074405,3351074405,US
@@ -123024,16 +129017,11 @@
3351074407,3351074407,US
3351074408,3351074409,BR
3351074410,3351074410,DE
-3351074411,3351074411,US
-3351074412,3351074413,PA
-3351074414,3351074415,US
+3351074411,3351074415,US
3351074416,3351074417,BR
3351074418,3351074418,US
3351074419,3351074419,IN
-3351074420,3351074422,US
-3351074423,3351074423,UA
-3351074424,3351074424,GB
-3351074425,3351074426,US
+3351074420,3351074426,US
3351074427,3351074427,DE
3351074428,3351074429,US
3351074430,3351074430,BR
@@ -123097,7 +129085,8 @@
3351104512,3351112703,US
3351112704,3351113727,CA
3351113728,3351129087,US
-3351130112,3351196159,US
+3351129088,3351129343,HK
+3351129344,3351196159,US
3351196160,3351196671,VG
3351196672,3351197695,US
3351197696,3351197711,PT
@@ -123135,7 +129124,7 @@
3351198024,3351198031,GH
3351198032,3351198059,US
3351198060,3351198063,GH
-3351198064,3351198071,BR
+3351198064,3351198071,US
3351198072,3351198079,VN
3351198080,3351198091,US
3351198092,3351198095,GT
@@ -123143,17 +129132,20 @@
3351198104,3351198111,VN
3351198112,3351198131,US
3351198132,3351198135,BR
-3351198136,3351198151,US
+3351198136,3351198147,US
+3351198148,3351198151,RO
3351198152,3351198155,GB
3351198156,3351198159,EG
3351198160,3351198171,US
3351198172,3351198175,GH
-3351198176,3351198179,BD
-3351198180,3351198183,US
+3351198176,3351198179,US
+3351198180,3351198183,VN
3351198184,3351198191,GH
3351198192,3351198207,US
-3351198208,3351198215,VN
-3351198216,3351198231,US
+3351198208,3351198211,ID
+3351198212,3351198219,US
+3351198220,3351198223,VN
+3351198224,3351198231,US
3351198232,3351198235,CA
3351198236,3351198239,US
3351198240,3351198247,VN
@@ -123173,7 +129165,7 @@
3351198392,3351198399,TR
3351198400,3351198403,US
3351198404,3351198407,IN
-3351198408,3351198411,BR
+3351198408,3351198411,US
3351198412,3351198415,GB
3351198416,3351198423,GT
3351198424,3351198427,RO
@@ -123184,17 +129176,13 @@
3351198464,3351198475,US
3351198476,3351198479,CY
3351198480,3351198495,US
-3351198496,3351198499,BR
-3351198500,3351198507,US
-3351198508,3351198511,CY
-3351198512,3351198515,US
+3351198496,3351198499,CN
+3351198500,3351198515,US
3351198516,3351198519,BR
3351198520,3351198527,IN
-3351198528,3351198535,RU
+3351198528,3351198535,US
3351198536,3351198539,CY
-3351198540,3351198551,US
-3351198552,3351198559,VN
-3351198560,3351198563,US
+3351198540,3351198563,US
3351198564,3351198567,CN
3351198568,3351198575,US
3351198576,3351198579,CY
@@ -123203,8 +129191,7 @@
3351198616,3351198619,MX
3351198620,3351198623,BD
3351198624,3351198627,CY
-3351198628,3351198631,CA
-3351198632,3351198687,US
+3351198628,3351198687,US
3351198688,3351198703,MA
3351198704,3351198711,IN
3351198712,3351232511,US
@@ -123279,8 +129266,7 @@
3351326720,3351328767,CA
3351328768,3351329279,US
3351329280,3351329535,CA
-3351329536,3351330815,US
-3351332864,3351336959,US
+3351329536,3351336959,US
3351336960,3351339007,CA
3351339008,3351353471,US
3351353472,3351353479,TR
@@ -123439,10 +129425,9 @@
3351698944,3351699455,CA
3351699456,3351706367,US
3351706368,3351706623,CA
-3351706624,3351850239,US
-3351850496,3351855615,US
+3351706624,3351855615,US
3351855616,3351855871,GB
-3351856128,3351860223,US
+3351855872,3351860223,US
3351860224,3351861247,KY
3351861248,3351869439,US
3351869440,3351871487,CA
@@ -123461,8 +129446,7 @@
3351969536,3351969791,US
3351969792,3352035327,IL
3352035328,3352036351,CA
-3352036352,3352037888,US
-3352037890,3352046591,US
+3352036352,3352046591,US
3352046592,3352046783,CA
3352046784,3352046799,US
3352046800,3352049663,CA
@@ -123518,8 +129502,7 @@
3352916565,3352916566,US
3352916567,3352916584,BR
3352916585,3352916586,US
-3352916587,3352916592,BR
-3352916593,3352916593,AE
+3352916587,3352916593,BR
3352916594,3352916607,US
3352916608,3352916615,BR
3352916616,3352916619,US
@@ -123574,9 +129557,7 @@
3353335427,3353335435,NL
3353335436,3353335437,US
3353335438,3353335445,NL
-3353335446,3353335447,US
-3353335448,3353335449,NL
-3353335450,3353335451,US
+3353335446,3353335451,US
3353335452,3353335455,NL
3353335456,3353335458,US
3353335459,3353335460,NL
@@ -123598,11 +129579,9 @@
3353335518,3353335519,NL
3353335520,3353335521,US
3353335522,3353335529,NL
-3353335530,3353335544,US
-3353335545,3353335546,DK
-3353335547,3353335559,US
-3353335560,3353335594,NL
-3353335595,3353335596,US
+3353335530,3353335559,US
+3353335560,3353335591,NL
+3353335592,3353335596,US
3353335597,3353335598,NL
3353335599,3353335600,US
3353335601,3353335606,NL
@@ -123621,11 +129600,17 @@
3353335677,3353335681,US
3353335682,3353335683,NL
3353335684,3353335686,US
-3353335687,3353335706,NL
+3353335687,3353335702,NL
+3353335703,3353335704,US
+3353335705,3353335706,NL
3353335707,3353335708,US
-3353335709,3353335722,NL
-3353335723,3353335726,US
-3353335727,3353335745,NL
+3353335709,3353335710,NL
+3353335711,3353335712,US
+3353335713,3353335716,NL
+3353335717,3353335718,US
+3353335719,3353335722,NL
+3353335723,3353335728,US
+3353335729,3353335745,NL
3353335746,3353335747,US
3353335748,3353335749,NL
3353335750,3353335750,US
@@ -123729,7 +129714,9 @@
3354468165,3354468165,IN
3354468166,3354468299,US
3354468300,3354468300,PK
-3354468301,3354484911,US
+3354468301,3354468351,US
+3354468864,3354469375,US
+3354476032,3354484911,US
3354484912,3354484927,GB
3354484928,3354485375,US
3354485376,3354485439,GB
@@ -123738,12 +129725,14 @@
3354494976,3354499071,US
3354499072,3354501119,AU
3354501120,3354503167,CA
-3354503168,3354507271,US
+3354503168,3354507263,US
+3354507264,3354507267,PK
+3354507268,3354507271,CN
3354507272,3354507279,ID
3354507280,3354507283,NZ
3354507284,3354507287,US
3354507288,3354507291,CY
-3354507292,3354507295,BR
+3354507292,3354507295,US
3354507296,3354507299,VN
3354507300,3354507303,US
3354507304,3354507307,IN
@@ -123753,22 +129742,24 @@
3354507324,3354507327,US
3354507328,3354507335,RU
3354507336,3354507343,US
-3354507344,3354507347,BR
+3354507344,3354507347,CA
3354507348,3354507351,CN
3354507352,3354507359,AU
3354507360,3354507363,EG
3354507364,3354507367,CY
3354507368,3354507375,CA
-3354507376,3354507383,ID
+3354507376,3354507383,US
3354507384,3354507387,CN
-3354507388,3354507391,BR
+3354507388,3354507391,US
3354507392,3354507399,CA
3354507400,3354507403,EG
3354507404,3354507407,CN
3354507408,3354507431,US
-3354507432,3354507439,MY
+3354507432,3354507439,BR
3354507440,3354507443,CY
-3354507444,3354507459,US
+3354507444,3354507451,US
+3354507452,3354507455,AU
+3354507456,3354507459,US
3354507460,3354507463,BR
3354507464,3354507467,GH
3354507468,3354507471,CY
@@ -123782,7 +129773,7 @@
3354507540,3354507543,HU
3354507544,3354507551,US
3354507552,3354507559,NI
-3354507560,3354507567,CN
+3354507560,3354507567,ID
3354507568,3354507591,US
3354507592,3354507599,CY
3354507600,3354507607,US
@@ -123791,9 +129782,7 @@
3354507616,3354507623,US
3354507624,3354507631,CN
3354507632,3354507639,US
-3354507640,3354507643,CN
-3354507644,3354507647,AE
-3354507648,3354507655,CN
+3354507640,3354507655,CN
3354507656,3354507659,CA
3354507660,3354507667,CY
3354507668,3354507671,BR
@@ -123809,7 +129798,9 @@
3354507728,3354507735,BR
3354507736,3354507743,US
3354507744,3354507747,TH
-3354507748,3354507775,US
+3354507748,3354507751,US
+3354507752,3354507759,BR
+3354507760,3354507775,US
3354507776,3354507779,CY
3354507780,3354507783,US
3354507784,3354507787,BR
@@ -123836,7 +129827,7 @@
3354507960,3354507967,GH
3354507968,3354507983,MX
3354507984,3354507991,AE
-3354507992,3354507999,PK
+3354507992,3354507999,BR
3354508000,3354508015,US
3354508016,3354508031,MX
3354508032,3354508043,US
@@ -123849,7 +129840,9 @@
3354508068,3354508071,US
3354508072,3354508075,CY
3354508076,3354508079,RU
-3354508080,3354508095,US
+3354508080,3354508083,US
+3354508084,3354508087,VN
+3354508088,3354508095,US
3354508096,3354508099,CY
3354508100,3354508107,US
3354508108,3354508111,BD
@@ -123867,7 +129860,7 @@
3354508168,3354508187,US
3354508188,3354508191,VN
3354508192,3354508195,IN
-3354508196,3354508199,CY
+3354508196,3354508199,US
3354508200,3354508203,CA
3354508204,3354508207,US
3354508208,3354508211,VN
@@ -123886,7 +129879,8 @@
3354508288,3354508303,CY
3354508304,3354508311,US
3354508312,3354508319,VN
-3354508320,3354508327,US
+3354508320,3354508323,US
+3354508324,3354508327,BR
3354508328,3354508335,AE
3354508336,3354508347,US
3354508348,3354508351,CA
@@ -123896,8 +129890,7 @@
3354508376,3354508383,MA
3354508384,3354508395,US
3354508396,3354508399,VN
-3354508400,3354508431,US
-3354508432,3354508439,RO
+3354508400,3354508439,US
3354508440,3354508447,AE
3354508448,3354508455,MX
3354508456,3354508487,US
@@ -123906,18 +129899,15 @@
3354508496,3354508527,US
3354508528,3354508535,AE
3354508536,3354508543,BD
-3354508544,3354508559,GR
-3354508560,3354508571,US
+3354508544,3354508571,US
3354508572,3354508575,CN
3354508576,3354508579,BR
-3354508580,3354508583,AE
+3354508580,3354508583,VN
3354508584,3354508603,US
3354508604,3354508607,CY
3354508608,3354508623,US
3354508624,3354508639,MX
-3354508640,3354508655,US
-3354508656,3354508671,AE
-3354508672,3354508679,US
+3354508640,3354508679,US
3354508680,3354508683,CY
3354508684,3354508687,PK
3354508688,3354508703,US
@@ -123932,7 +129922,7 @@
3354508864,3354508895,CY
3354508896,3354508927,US
3354508928,3354508943,GB
-3354508944,3354508951,VN
+3354508944,3354508951,US
3354508952,3354508959,PK
3354508960,3354508991,EG
3354508992,3354508999,RU
@@ -123990,11 +129980,7 @@
3354707456,3354707967,CA
3354707968,3354708207,US
3354708208,3354708223,CA
-3354708224,3354731018,US
-3354731020,3354731519,US
-3354731776,3354736639,US
-3354736640,3354737151,CN
-3354737152,3354770687,US
+3354708224,3354770687,US
3354770688,3354770943,CA
3354770944,3354788095,US
3354788096,3354789887,CA
@@ -124025,11 +130011,9 @@
3355249152,3355249663,CA
3355249664,3355260927,US
3355260928,3355262719,CA
-3355262720,3355272189,US
-3355272191,3355272959,US
+3355262720,3355272959,US
3355272960,3355273215,SE
-3355273216,3355309823,US
-3355309828,3355310591,US
+3355273216,3355310591,US
3355310592,3355311103,CA
3355311104,3355319295,US
3355319296,3355320319,CA
@@ -124111,12 +130095,13 @@
3355449344,3355450367,CU
3355450368,3355451391,EC
3355451392,3355458559,BR
-3355458560,3355459071,HN
+3355458560,3355458591,HN
+3355458592,3355458599,US
+3355458600,3355459071,HN
3355459072,3355459327,BR
3355459328,3355459583,EC
3355459840,3355460095,VE
3355460096,3355460351,CL
-3355460352,3355460607,BR
3355460608,3355461119,UY
3355461120,3355461887,BR
3355461888,3355463423,EC
@@ -124221,9 +130206,7 @@
3355643904,3355647999,BR
3355648000,3355668991,AR
3355668992,3355669247,PE
-3355669248,3355669503,AR
-3355669504,3355670527,VE
-3355670528,3355672575,AR
+3355669248,3355672575,AR
3355672576,3355677183,CO
3355677184,3355677439,GT
3355677440,3355682815,CO
@@ -124397,9 +130380,28 @@
3356102400,3356102655,PA
3356102656,3356105727,CL
3356105728,3356106751,SV
-3356106752,3356110495,HN
+3356106752,3356106975,HN
+3356106976,3356107007,FR
+3356107008,3356107263,HN
+3356107264,3356107327,BR
+3356107328,3356107519,US
+3356107520,3356107551,BR
+3356107552,3356107775,US
+3356107776,3356107975,HN
+3356107976,3356107983,IS
+3356107984,3356108063,HN
+3356108064,3356108071,IT
+3356108072,3356108511,HN
+3356108512,3356108519,US
+3356108520,3356109119,HN
+3356109120,3356109135,FR
+3356109136,3356110015,HN
+3356110016,3356110031,US
+3356110032,3356110495,HN
3356110496,3356110503,US
-3356110504,3356110847,HN
+3356110504,3356110527,HN
+3356110528,3356110543,US
+3356110544,3356110847,HN
3356110848,3356113919,BR
3356113920,3356114943,UY
3356114944,3356123135,PE
@@ -124552,8 +130554,16 @@
3356332032,3356334079,CU
3356334080,3356336127,BO
3356336128,3356336895,SV
-3356336896,3356337151,HN
-3356337152,3356344319,SV
+3356336896,3356337919,HN
+3356337920,3356340479,SV
+3356340480,3356340735,HN
+3356340736,3356340991,SV
+3356340992,3356341247,HN
+3356341248,3356341503,SV
+3356341504,3356341759,HN
+3356341760,3356343039,SV
+3356343040,3356343295,HN
+3356343296,3356344319,SV
3356344320,3356360703,CO
3356360704,3356362751,CL
3356362752,3356363519,VE
@@ -124581,14 +130591,18 @@
3356390656,3356391167,CL
3356391168,3356391423,PA
3356393472,3356413567,CL
-3356413568,3356413823,CO
-3356413824,3356420287,CL
+3356413568,3356413951,CO
+3356413952,3356420287,CL
3356420288,3356420351,CO
-3356420352,3356420863,CL
-3356420864,3356420991,CO
+3356420352,3356420735,CL
+3356420736,3356420991,CO
3356420992,3356421119,CL
3356421120,3356421247,CO
-3356421248,3356426239,CL
+3356421248,3356421503,CL
+3356421504,3356421631,CO
+3356421632,3356422015,CL
+3356422016,3356422143,CO
+3356422144,3356426239,CL
3356426240,3356427263,BR
3356427264,3356491775,US
3356491776,3356493823,PE
@@ -124597,7 +130611,9 @@
3356499968,3356508159,MX
3356508160,3356508671,AR
3356508672,3356509183,CR
-3356509184,3356509695,CO
+3356509184,3356509439,CO
+3356509440,3356509503,US
+3356509504,3356509695,CO
3356509696,3356510207,VE
3356510208,3356511999,AR
3356512000,3356512255,CO
@@ -124698,40 +130714,85 @@
3357424640,3357425663,CL
3357425664,3357442047,CO
3357442048,3357442303,NI
-3357442304,3357449471,GT
-3357449472,3357449727,HN
-3357449728,3357453311,GT
+3357442304,3357442655,GT
+3357442656,3357442671,NI
+3357442672,3357442815,GT
+3357442816,3357443071,SV
+3357443072,3357443599,GT
+3357443600,3357443615,HN
+3357443616,3357443735,GT
+3357443736,3357443743,HN
+3357443744,3357444207,GT
+3357444208,3357444215,HN
+3357444216,3357448311,GT
+3357448312,3357448319,SV
+3357448320,3357448967,GT
+3357448968,3357448975,HN
+3357448976,3357449151,GT
+3357449152,3357449727,HN
+3357449728,3357451263,GT
+3357451264,3357451519,HN
+3357451520,3357451775,NI
+3357451776,3357452287,GT
+3357452288,3357452543,HN
+3357452544,3357452799,GT
+3357452800,3357453055,NI
+3357453056,3357453311,SV
3357453312,3357453567,HN
3357453568,3357455871,GT
3357455872,3357456127,NI
-3357456128,3357457919,GT
+3357456128,3357456639,GT
+3357456640,3357456895,HN
+3357456896,3357457919,GT
3357457920,3357458431,HN
3357458432,3357474815,CL
3357474816,3357475071,US
-3357475072,3357476863,AR
+3357475072,3357476255,AR
+3357476256,3357476271,VE
+3357476272,3357476351,AR
+3357476352,3357476607,EC
+3357476608,3357476863,AR
3357476864,3357477375,EC
3357477376,3357477887,AR
3357477888,3357478911,CO
-3357478912,3357480423,AR
+3357478912,3357479087,AR
+3357479088,3357479095,CO
+3357479096,3357480031,AR
+3357480032,3357480039,CO
+3357480040,3357480103,AR
+3357480104,3357480111,CO
+3357480112,3357480159,AR
+3357480160,3357480175,CO
+3357480176,3357480407,AR
+3357480408,3357480415,CO
+3357480416,3357480423,AR
3357480424,3357480427,CO
-3357480428,3357482591,AR
-3357482592,3357482623,EC
-3357482624,3357482865,AR
-3357482866,3357482866,EC
-3357482867,3357483007,AR
+3357480428,3357480463,AR
+3357480464,3357480479,CO
+3357480480,3357480559,AR
+3357480560,3357480575,CO
+3357480576,3357480751,AR
+3357480752,3357480767,CO
+3357480768,3357480959,AR
+3357480960,3357483007,EC
3357483008,3357491199,CL
3357491200,3357499391,CO
3357499392,3357507583,PE
3357507584,3357515775,VE
3357515776,3357523967,SV
3357523968,3357532159,CO
-3357532160,3357556991,AR
-3357556992,3357557247,MX
-3357557248,3357561199,AR
-3357561200,3357561215,CO
-3357561216,3357561247,AR
-3357561248,3357561279,CO
-3357561280,3357581311,AR
+3357532160,3357556735,AR
+3357556736,3357556991,VE
+3357556992,3357557759,MX
+3357557760,3357559295,EC
+3357559296,3357559551,CA
+3357559552,3357560175,AR
+3357560176,3357560183,VE
+3357560184,3357560319,AR
+3357560320,3357560575,MX
+3357560576,3357560831,AR
+3357560832,3357561855,CO
+3357561856,3357581311,AR
3357581312,3357589503,CL
3357589504,3357605887,BZ
3357605888,3357606911,MX
@@ -124784,12 +130845,17 @@
3357728768,3357736959,BR
3357736960,3357745151,VE
3357745152,3357753343,CO
-3357753344,3357773823,VE
+3357753344,3357757487,VE
+3357757488,3357757495,BO
+3357757496,3357773823,VE
+3357773824,3357775871,PA
3357775872,3357776127,US
3357776128,3357776383,UY
3357776384,3357776895,US
3357776896,3357777919,CL
-3357777920,3357786111,GT
+3357777920,3357784503,GT
+3357784504,3357784511,SV
+3357784512,3357786111,GT
3357786112,3357802495,VE
3357802496,3357868031,MX
3357868032,3357933567,PE
@@ -124798,71 +130864,84 @@
3358023680,3358064639,MX
3358064640,3358130175,UY
3358130176,3358131199,EC
-3358131200,3358144639,AR
+3358131200,3358131327,AR
+3358131328,3358131455,CO
+3358131456,3358133631,AR
+3358133632,3358133759,VE
+3358133760,3358142719,AR
+3358142720,3358142975,US
+3358142976,3358143231,CO
+3358143232,3358143487,VE
+3358143488,3358143999,US
+3358144000,3358144127,CL
+3358144128,3358144639,AR
3358144640,3358144767,VE
-3358144768,3358154495,AR
-3358154496,3358154751,CL
-3358154752,3358158079,AR
-3358158080,3358158207,PE
-3358158208,3358158335,AR
-3358158336,3358158591,PE
-3358158592,3358159871,AR
+3358144768,3358144839,AR
+3358144840,3358144847,VE
+3358144848,3358149735,AR
+3358149736,3358149743,CO
+3358149744,3358150367,AR
+3358150368,3358150399,CO
+3358150400,3358151423,AR
+3358151424,3358151679,EC
+3358151680,3358151807,PE
+3358151808,3358152063,AR
+3358152064,3358152191,PE
+3358152192,3358153855,AR
+3358153856,3358153983,EC
+3358153984,3358154239,AR
+3358154240,3358154751,CL
+3358154752,3358158847,PE
+3358158848,3358159871,AR
3358159872,3358160895,VE
3358160896,3358236671,AR
3358236672,3358244863,CL
3358244864,3358261247,DO
-3358261248,3358326783,AR
+3358261248,3358264063,AR
+3358264064,3358264319,PY
+3358264320,3358326783,AR
3358326784,3358392319,VE
3358392320,3358457855,AR
3358457856,3358482175,PA
3358482176,3358482431,BZ
3358482432,3358523391,PA
3358523392,3358523903,AR
-3358523904,3358525951,VE
-3358525952,3358526719,AR
+3358523904,3358524415,VE
+3358524416,3358526719,AR
3358526720,3358527487,VE
3358527488,3358530047,AR
3358530048,3358530303,VE
3358530304,3358530815,AR
-3358530816,3358534143,VE
-3358534144,3358534655,AR
-3358534656,3358534911,VE
-3358534912,3358534912,AR
-3358534913,3358535167,VE
-3358535168,3358535679,AR
-3358535680,3358536447,VE
-3358536448,3358536703,AR
-3358536704,3358543359,VE
-3358543360,3358543615,AR
-3358543616,3358544127,VE
-3358544128,3358544383,AR
-3358544384,3358545919,VE
-3358545920,3358547967,AR
+3358530816,3358531583,VE
+3358531584,3358531839,AR
+3358531840,3358532351,VE
+3358532352,3358532863,AR
+3358532864,3358533631,VE
+3358533632,3358533887,AR
+3358533888,3358534143,VE
+3358534144,3358539519,AR
+3358539520,3358539775,VE
+3358539776,3358543615,AR
+3358543616,3358543871,VE
+3358543872,3358544127,MX
+3358544128,3358544895,AR
+3358544896,3358545407,VE
+3358545408,3358547967,AR
3358547968,3358548623,VE
3358548624,3358548639,AR
-3358548640,3358550015,VE
-3358550016,3358552063,AR
-3358552064,3358553087,VE
-3358553088,3358553599,AR
-3358553600,3358554111,VE
-3358554112,3358560767,AR
-3358560768,3358562303,VE
-3358562304,3358563327,AR
-3358563328,3358564095,VE
-3358564096,3358564351,AR
-3358564352,3358565375,VE
-3358565376,3358566399,AR
-3358566400,3358566911,VE
-3358566912,3358567423,AR
+3358548640,3358548991,VE
+3358548992,3358549503,AR
+3358549504,3358550015,VE
+3358550016,3358553855,AR
+3358553856,3358554111,VE
+3358554112,3358563327,AR
+3358563328,3358564095,CO
+3358564096,3358567423,AR
3358567424,3358568447,CO
-3358568448,3358570495,VE
-3358570496,3358578687,AR
+3358568448,3358578687,AR
3358578688,3358579711,CO
-3358579712,3358580735,VE
-3358580736,3358584831,AR
-3358584832,3358586879,VE
-3358586880,3358587903,AR
-3358587904,3358588927,VE
+3358579712,3358587903,AR
+3358587904,3358588927,CL
3358588928,3358654463,PE
3358654464,3358658559,AR
3358658560,3358660607,CL
@@ -124952,7 +131031,9 @@
3359598592,3359599615,EC
3359599616,3359621119,AR
3359621120,3359637503,EC
-3359637504,3359797247,MX
+3359637504,3359789823,MX
+3359789824,3359789887,US
+3359789888,3359797247,MX
3359797248,3359801343,BR
3359801344,3359899647,MX
3359899648,3359916031,CL
@@ -124964,14 +131045,17 @@
3360006144,3360014335,EC
3360014336,3360096255,AR
3360096256,3360104447,UY
-3360104448,3360112639,CO
-3360112640,3360116735,BR
+3360104448,3360116735,CO
3360116736,3360118783,BO
3360118784,3360120831,AR
3360124928,3360125439,US
3360125440,3360125951,VE
3360125952,3360127999,BR
-3360128000,3360128775,HN
+3360128000,3360128319,HN
+3360128320,3360128327,IT
+3360128328,3360128543,HN
+3360128544,3360128575,US
+3360128576,3360128775,HN
3360128776,3360128783,BE
3360128784,3360129023,HN
3360129024,3360145407,VE
@@ -125009,13 +131093,26 @@
3360669696,3360686079,MX
3360686080,3360698367,AR
3360698368,3360699135,UY
-3360699136,3360710655,AR
+3360699136,3360707839,AR
+3360707840,3360708095,US
+3360708096,3360708735,AR
+3360708736,3360708863,US
+3360708864,3360710527,AR
+3360710528,3360710655,US
3360710656,3360718847,HT
3360718848,3360763903,AR
3360765952,3360767999,CO
-3360768000,3360781599,AR
+3360768000,3360772351,AR
+3360772352,3360772479,BO
+3360772480,3360780991,AR
+3360780992,3360780995,BR
+3360780996,3360781055,AR
+3360781056,3360781071,BR
+3360781072,3360781599,AR
3360781600,3360781615,BS
-3360781616,3360788479,AR
+3360781616,3360781791,AR
+3360781792,3360781795,MX
+3360781796,3360788479,AR
3360788480,3360790527,CL
3360790528,3360849919,AR
3360849920,3360882687,VE
@@ -125027,9 +131124,7 @@
3361030144,3361034239,VE
3361034240,3361036287,EC
3361036288,3361046527,AR
-3361046528,3361048575,BO
-3361048576,3361049599,AR
-3361049600,3361052671,BO
+3361046528,3361052671,BO
3361052672,3361054463,AR
3361054464,3361054719,PE
3361054720,3361058815,NI
@@ -125073,7 +131168,9 @@
3361726464,3361734655,MX
3361734656,3362258943,BR
3362258944,3362324479,CL
-3362324480,3362349055,AR
+3362324480,3362337791,AR
+3362337792,3362338047,US
+3362338048,3362349055,AR
3362349056,3362351103,CR
3362351104,3362353151,AR
3362353152,3362355199,EC
@@ -125081,14 +131178,14 @@
3362357248,3362381823,BO
3362381824,3362390015,EC
3362390016,3362422783,PE
-3362426880,3362428927,BR
+3362426880,3362428927,PA
3362428928,3362430975,CL
3362430976,3362447359,CO
-3362447360,3362448383,SV
-3362448384,3362448895,HN
-3362448896,3362450175,SV
-3362450176,3362450431,HN
-3362450432,3362451455,SV
+3362447360,3362447871,SV
+3362447872,3362449151,HN
+3362449152,3362450175,SV
+3362450176,3362451199,HN
+3362451200,3362451455,SV
3362451456,3362452479,AR
3362452480,3362452991,BO
3362452992,3362453247,HN
@@ -125114,9 +131211,15 @@
3362529280,3362537471,PA
3362537472,3362545663,AR
3362545664,3362549759,PE
-3362549760,3362552575,AR
+3362549760,3362552431,AR
+3362552432,3362552447,MX
+3362552448,3362552575,AR
3362552576,3362552591,MX
-3362552592,3362553855,AR
+3362552592,3362553167,AR
+3362553168,3362553183,DO
+3362553184,3362553791,AR
+3362553792,3362553807,VI
+3362553808,3362553855,AR
3362553856,3362557951,PY
3362557952,3362562047,AR
3362570240,3362586623,UY
@@ -125138,13 +131241,17 @@
3362711552,3362713599,EC
3362713600,3362714623,VE
3362714624,3362714879,HN
-3362714880,3362717695,VE
+3362714880,3362716415,VE
+3362716416,3362716671,CR
+3362716672,3362717695,VE
3362717696,3362815999,CL
3362816000,3362832383,AR
3362832384,3362838527,CO
3362838528,3362840575,EC
3362840576,3362897919,CL
-3362897920,3362914303,HT
+3362897920,3362903551,HT
+3362903552,3362904063,MX
+3362904064,3362914303,HT
3362914304,3362930687,CO
3362930688,3362934783,CL
3362934784,3362936831,AR
@@ -125184,10 +131291,13 @@
3363487744,3363504127,CO
3363504128,3363512319,PE
3363512320,3363553919,AR
-3363553920,3363554047,US
-3363554048,3363554175,AR
-3363554176,3363554303,US
-3363554304,3363557375,AR
+3363553920,3363554303,US
+3363554304,3363554431,BR
+3363554432,3363555071,AR
+3363555072,3363555327,US
+3363555328,3363555839,AR
+3363555840,3363556607,US
+3363556608,3363557375,AR
3363557376,3363559423,BZ
3363559424,3363561471,AR
3363565568,3363569663,AR
@@ -125201,7 +131311,8 @@
3363601920,3363602175,AR
3363602176,3363602431,PA
3363602432,3363610623,CW
-3363614720,3363618815,AR
+3363614720,3363617791,AR
+3363617792,3363618815,PE
3363618816,3363627007,UY
3363627008,3363635199,EC
3363635200,3363651583,UY
@@ -125213,15 +131324,21 @@
3363708928,3363713023,CL
3363713024,3363713279,EC
3363713280,3363714047,CL
-3363714048,3363715839,PE
-3363715840,3363716095,CL
-3363716096,3363717119,PE
+3363714048,3363715583,PE
+3363715584,3363716095,CL
+3363716096,3363716607,PE
+3363716608,3363716863,AR
+3363716864,3363717119,PE
3363717120,3363733503,CL
3363733504,3363831807,AR
3363831808,3367763967,BR
3367763968,3367804927,MX
3367804928,3367840767,BR
-3367840768,3367841791,HN
+3367840768,3367841023,HN
+3367841024,3367841039,CA
+3367841040,3367841407,HN
+3367841408,3367841423,CA
+3367841424,3367841791,HN
3367841792,3368052991,BR
3368052992,3368053247,PE
3368053248,3368053503,CO
@@ -125229,8 +131346,7 @@
3368086528,3368087551,CR
3368087552,3368157183,BR
3368157184,3368173567,MX
-3368173568,3368601799,BR
-3368601801,3370188799,BR
+3368173568,3370188799,BR
3370188800,3370196991,MX
3370196992,3370214399,BR
3370214400,3370215423,AR
@@ -125258,7 +131374,9 @@
3380748288,3380761087,MX
3380761088,3380761599,VE
3380761600,3380764671,BR
-3380764672,3380811775,MX
+3380764672,3380808191,MX
+3380808192,3380808703,CR
+3380808704,3380811775,MX
3380811776,3380813823,BR
3380813824,3380815103,MX
3380815104,3380815359,CR
@@ -125331,8 +131449,8 @@
3381387264,3381448703,MX
3381448704,3381452799,BR
3381452800,3381453823,AR
-3381453824,3381456383,BR
-3381456384,3381456895,US
+3381453824,3381455871,BR
+3381455872,3381456895,US
3381456896,3381460991,BR
3381460992,3381944319,MX
3381944320,3381946367,BR
@@ -125340,7 +131458,11 @@
3381947392,3381952511,BR
3381952512,3381960703,MX
3381960704,3381962751,BR
-3381962752,3381963711,HN
+3381962752,3381962991,HN
+3381962992,3381962999,FR
+3381963000,3381963559,HN
+3381963560,3381963567,FR
+3381963568,3381963711,HN
3381963712,3381963727,CA
3381963728,3381963775,HN
3381963776,3381968895,BR
@@ -125397,12 +131519,17 @@
3382661120,3382662143,MX
3382662144,3382665215,BR
3382665216,3382669311,MX
-3382669312,3382670335,GT
+3382669312,3382669567,SV
+3382669568,3382669823,GT
+3382669824,3382670079,HN
+3382670080,3382670335,GT
3382670336,3382672383,BR
3382672384,3382677503,MX
3382677504,3382681599,BR
+3382681600,3382683647,MX
3382683648,3382685695,CL
-3382685696,3382686719,MX
+3382685696,3382686655,MX
+3382686656,3382686719,US
3382686720,3382689791,BR
3382689792,3382695935,MX
3382695936,3382696959,AR
@@ -125443,7 +131570,9 @@
3386556416,3386562047,PA
3386562048,3386562303,PE
3386562304,3386571263,PA
-3386571264,3386571519,BZ
+3386571264,3386571327,BZ
+3386571328,3386571391,PA
+3386571392,3386571519,BZ
3386571520,3386572799,PA
3386572800,3386589183,EC
3386589184,3386601471,AR
@@ -125502,32 +131631,22 @@
3387424768,3387502599,CO
3387502600,3387502607,JP
3387502608,3387555839,CO
-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,3387572223,AR
+3387555840,3387568127,AR
+3387568128,3387572223,PE
3387572224,3387576319,CO
3387576320,3387578367,EC
3387578368,3387584511,AR
3387584512,3387585535,PE
-3387585536,3387600895,AR
+3387585536,3387586047,AR
+3387586048,3387586303,PE
+3387586304,3387586431,AR
+3387586432,3387587583,PE
+3387587584,3387588159,AR
+3387588160,3387588175,PE
+3387588176,3387600895,AR
3387600896,3387604991,CO
-3387604992,3387609959,AR
-3387609960,3387609967,EC
-3387609968,3387611007,AR
-3387611008,3387611135,EC
-3387611136,3387613811,AR
-3387613812,3387613812,VE
-3387613813,3387613831,AR
-3387613832,3387613839,VE
-3387613840,3387615615,AR
-3387615616,3387615743,VE
-3387615744,3387617279,AR
+3387604992,3387613183,EC
+3387613184,3387617279,VE
3387617280,3387619327,CO
3387619328,3387686911,AR
3387686912,3387736063,CL
@@ -125803,7 +131922,7 @@
3389526016,3389528063,JP
3389528064,3389528319,CN
3389528320,3389528575,AU
-3389528576,3389528831,JP
+3389528576,3389529087,JP
3389529088,3389529599,ID
3389529600,3389529855,PH
3389529856,3389530111,HK
@@ -125925,8 +132044,7 @@
3389812736,3389813759,AU
3389813760,3389814015,CN
3389814016,3389814527,TH
-3389814528,3389815295,AU
-3389816064,3389816575,AU
+3389814528,3389816575,AU
3389816576,3389816831,US
3389816832,3389846527,AU
3389846528,3389847551,JP
@@ -126057,8 +132175,7 @@
3390341120,3390375935,KR
3390375936,3390377983,AU
3390377984,3390382079,NZ
-3390382080,3390384127,LK
-3390384128,3390386175,IN
+3390382080,3390386175,IN
3390386176,3390390271,CN
3390390272,3390398463,NZ
3390398464,3390406655,MN
@@ -126083,8 +132200,7 @@
3390414336,3390414847,SG
3390414848,3390418943,JP
3390418944,3390423039,MV
-3390423040,3390423807,SG
-3390424064,3390429439,SG
+3390423040,3390429439,SG
3390429440,3390429951,HK
3390429952,3390439423,SG
3390439424,3390441471,NZ
@@ -126119,8 +132235,7 @@
3390802432,3390832639,NZ
3390832640,3390963711,TH
3390963712,3391094783,KR
-3391094784,3391192063,JP
-3391192320,3391356927,JP
+3391094784,3391356927,JP
3391356928,3391414783,NZ
3391414784,3391415039,CN
3391415040,3391444479,NZ
@@ -126291,7 +132406,7 @@
3391765824,3391765919,SG
3391765920,3391765951,JP
3391765952,3391766015,SG
-3391766016,3391766783,JP
+3391766016,3391767039,JP
3391767040,3391767199,SG
3391767200,3391767231,JP
3391767232,3391767263,SG
@@ -126537,7 +132652,7 @@
3391809728,3391809759,SG
3391809760,3391809791,JP
3391809792,3391810047,SG
-3391810304,3391810559,JP
+3391810048,3391810559,JP
3391810560,3391811071,SG
3391811072,3391811103,JP
3391811104,3391811199,SG
@@ -126572,7 +132687,8 @@
3391848448,3391848959,AU
3391848960,3391849471,IN
3391849472,3391851007,AU
-3391851008,3391851263,SG
+3391851008,3391851008,SG
+3391851009,3391851263,AU
3391851264,3391851519,JP
3391851520,3391852543,AU
3391852544,3391856639,CN
@@ -126630,8 +132746,7 @@
3391954944,3391971327,HK
3391971328,3391979519,AU
3391979520,3391979775,HK
-3391979776,3391979955,JP
-3391979958,3391980031,JP
+3391979776,3391980031,JP
3391980032,3391980543,HK
3391980544,3391983615,MY
3391983616,3391984639,NP
@@ -126678,7 +132793,6 @@
3392102400,3392106495,CN
3392106496,3392108543,IN
3392108544,3392109567,AU
-3392109568,3392109823,CN
3392109824,3392110079,PH
3392110080,3392110335,CN
3392110336,3392110591,IN
@@ -126706,8 +132820,7 @@
3392134912,3392135167,ID
3392135168,3392143359,TH
3392143360,3392208895,JP
-3392208896,3392286719,NZ
-3392287232,3392287743,NZ
+3392208896,3392287743,NZ
3392287744,3392288767,NP
3392288768,3392324607,NZ
3392324608,3392325119,AU
@@ -126768,7 +132881,7 @@
3392440832,3392441343,BD
3392441344,3392441855,ID
3392441856,3392442111,AU
-3392442112,3392442623,CN
+3392442112,3392442367,CN
3392442624,3392442879,AU
3392442880,3392443391,ID
3392443392,3392443647,IN
@@ -127185,8 +133298,7 @@
3393856000,3393856255,AU
3393856256,3393856511,HK
3393856512,3393856767,CN
-3393856768,3393856896,SG
-3393856898,3393857023,SG
+3393856768,3393857023,SG
3393857024,3393857535,NZ
3393857536,3393858047,HK
3393858048,3393858303,CN
@@ -127209,7 +133321,9 @@
3393863680,3393865727,AU
3393865728,3393867775,ID
3393867776,3393871871,CN
-3393871872,3393874943,HK
+3393871872,3393872655,HK
+3393872656,3393872656,IN
+3393872657,3393874943,HK
3393874944,3393875967,AU
3393875968,3393876991,HK
3393876992,3393878015,SG
@@ -127239,7 +133353,9 @@
3393974272,3393976319,SG
3393976320,3393977343,MO
3393977344,3393978367,CN
-3393978368,3393995775,HK
+3393978368,3393995263,HK
+3393995264,3393995264,ZA
+3393995265,3393995775,HK
3393995776,3393996031,DE
3393996032,3393999615,HK
3393999616,3393999871,JP
@@ -127271,10 +133387,9 @@
3394079232,3394079743,PH
3394079744,3394087471,HK
3394087472,3394087487,CN
-3394087488,3394092543,HK
-3394092800,3394111487,HK
+3394087488,3394111487,HK
3394111488,3394113535,CN
-3394113792,3394116095,SG
+3394113536,3394116095,SG
3394116096,3394116351,AU
3394116352,3394117631,SG
3394117632,3394121727,AU
@@ -127298,9 +133413,7 @@
3394191360,3394207743,SG
3394207744,3394215935,JP
3394215936,3394220031,AU
-3394220032,3394226943,SG
-3394226948,3394226948,SG
-3394227200,3394232319,SG
+3394220032,3394232319,SG
3394232320,3394234367,CN
3394234368,3394236415,VN
3394236416,3394238463,JP
@@ -127337,8 +133450,7 @@
3394351104,3394355199,CN
3394355200,3394359295,IN
3394359296,3394363391,AU
-3394363392,3394418431,HK
-3394418688,3394441215,HK
+3394363392,3394441215,HK
3394441216,3394453503,IN
3394453504,3394461695,AU
3394461696,3394465791,SG
@@ -127349,8 +133461,7 @@
3394478080,3394482175,PK
3394482176,3394484223,AU
3394484224,3394486271,JP
-3394486272,3394489599,HK
-3394489632,3394494463,HK
+3394486272,3394494463,HK
3394494464,3394498559,JP
3394498560,3394500607,HK
3394500608,3394501631,SG
@@ -127368,8 +133479,7 @@
3394521088,3394523135,KH
3394523136,3394527231,JP
3394527232,3394535423,PH
-3394535424,3394544895,HK
-3394545152,3394621439,HK
+3394535424,3394621439,HK
3394621440,3394625535,CN
3394625536,3394629631,HK
3394629632,3394631679,AU
@@ -127431,7 +133541,11 @@
3394781184,3394789375,MP
3394789376,3394791167,HK
3394791168,3394792959,US
-3394792960,3394797567,HK
+3394792960,3394793215,HK
+3394793216,3394793216,ZA
+3394793217,3394796287,HK
+3394796288,3394796288,ZA
+3394796289,3394797567,HK
3394797568,3394813951,IN
3394813952,3394815999,JP
3394816000,3394818047,HK
@@ -127457,7 +133571,7 @@
3394835456,3394835583,SG
3394835584,3394835711,JP
3394835712,3394835967,CN
-3394836224,3394836239,JP
+3394835968,3394836239,JP
3394836240,3394836247,AS
3394836248,3394836415,JP
3394836416,3394836479,HK
@@ -127529,7 +133643,7 @@
3394963456,3394965503,ID
3394965504,3394967551,TH
3394967552,3394969599,ID
-3394969600,3394970623,GB
+3394969600,3394970623,US
3394970624,3394971647,CN
3394971648,3394972671,BD
3394972672,3394973695,AU
@@ -127601,7 +133715,7 @@
3395180544,3395181055,VN
3395181056,3395181567,TH
3395181568,3395182591,CN
-3395182848,3395190783,SG
+3395182592,3395190783,SG
3395190784,3395198975,JP
3395198976,3395199999,IN
3395200000,3395200511,BD
@@ -127614,8 +133728,7 @@
3395219456,3395223551,TH
3395223552,3395231743,CN
3395231744,3395239935,JP
-3395239936,3395243007,SG
-3395243043,3395243043,SG
+3395239936,3395243263,SG
3395243264,3395243519,AU
3395243520,3395254783,SG
3395254784,3395255039,IN
@@ -127737,7 +133850,9 @@
3397338040,3397338043,SG
3397338044,3397338375,HK
3397338376,3397338379,JP
-3397338380,3397338423,HK
+3397338380,3397338403,HK
+3397338404,3397338415,JP
+3397338416,3397338423,HK
3397338424,3397338427,JP
3397338428,3397339647,HK
3397339648,3397339687,SG
@@ -127816,9 +133931,7 @@
3397530624,3397531647,ID
3397531648,3397532671,SG
3397532672,3397533695,JP
-3397533696,3397551359,HK
-3397551616,3397557279,HK
-3397557504,3397566463,HK
+3397533696,3397566463,HK
3397566464,3397574655,AU
3397574656,3397582847,CN
3397582848,3397584895,MN
@@ -127869,7 +133982,9 @@
3397816320,3397832703,IN
3397832704,3397836799,CN
3397836800,3397844991,AU
-3397844992,3397869823,JP
+3397844992,3397848063,JP
+3397848064,3397849087,SG
+3397849088,3397869823,JP
3397869824,3397870079,AU
3397870080,3397887999,JP
3397888000,3397889023,IN
@@ -127878,8 +133993,7 @@
3397906176,3397907455,JP
3397907456,3397908479,HK
3397908480,3397910527,JP
-3397910528,3397914111,SG
-3397914368,3397918719,SG
+3397910528,3397918719,SG
3397918720,3397922815,AU
3397922816,3397926911,CN
3397926912,3397933055,IN
@@ -128221,20 +134335,18 @@
3399950336,3399954943,AU
3399954944,3399974911,US
3399974912,3399979007,HK
-3399979008,3399982963,US
-3399982966,3399983744,US
+3399979008,3399983744,US
3399983745,3399983745,SG
3399983746,3399991295,US
3399991296,3399995391,IN
3399995392,3399999487,KR
-3399999488,3400000475,JP
-3400000476,3400000479,US
-3400000480,3400002303,JP
+3399999488,3400000255,JP
+3400000256,3400000511,AU
+3400000512,3400002303,JP
3400002304,3400002367,HK
3400002368,3400003583,JP
3400003584,3400005631,AU
-3400005632,3400006143,JP
-3400006400,3400007679,JP
+3400005632,3400007679,JP
3400007680,3400024063,AU
3400024064,3400028159,MY
3400028160,3400029183,CN
@@ -128347,8 +134459,8 @@
3400432128,3400432639,IN
3400432640,3400433663,CN
3400433664,3400435711,HK
-3400435712,3400436223,BD
-3400436224,3400441855,HK
+3400435712,3400435967,BD
+3400435968,3400441855,HK
3400441856,3400445951,NZ
3400445952,3400446463,AU
3400446464,3400450047,NZ
@@ -128397,8 +134509,7 @@
3400728576,3400736767,MN
3400736768,3400744959,JP
3400744960,3400753151,IN
-3400753152,3400753407,MY
-3400753664,3400761343,MY
+3400753152,3400761343,MY
3400761344,3400763391,AU
3400763392,3400764415,ID
3400764416,3400765439,NZ
@@ -128558,7 +134669,6 @@
3405941760,3405942015,CN
3405942016,3405944319,AU
3405944320,3405944575,CN
-3405944576,3405944831,AU
3405944832,3405946367,CN
3405946368,3405946879,AU
3405946880,3405948927,CN
@@ -128762,7 +134872,7 @@
3406382592,3406383359,CN
3406383360,3406383871,AU
3406383872,3406384639,CN
-3406384896,3406385151,SG
+3406384640,3406385151,SG
3406385152,3406389247,AU
3406389248,3406390783,CN
3406390784,3406392319,AU
@@ -128814,8 +134924,7 @@
3406527232,3406527999,AU
3406528000,3406528255,CN
3406528256,3406528511,AU
-3406528512,3406529361,HK
-3406529363,3406529535,HK
+3406528512,3406529535,HK
3406529536,3406529791,IL
3406529792,3406530559,HK
3406530560,3406531583,CN
@@ -128823,6 +134932,7 @@
3406531840,3406532607,CN
3406532608,3406541823,AU
3406541824,3406542847,CN
+3406542848,3406543103,SG
3406543104,3406548991,AU
3406548992,3406550015,CN
3406550016,3406565375,AU
@@ -129170,6 +135280,7 @@
3407107584,3407108351,AU
3407108352,3407108607,CN
3407108608,3407112447,AU
+3407112448,3407112703,SG
3407112704,3407113215,CN
3407113216,3407115007,AU
3407115008,3407115263,CN
@@ -130363,7 +136474,9 @@
3411607552,3411608575,CN
3411608576,3411608831,IN
3411608832,3411609087,AU
-3411609088,3411611647,HK
+3411609088,3411609599,HK
+3411609600,3411610111,KR
+3411610112,3411611647,HK
3411611648,3411615743,ID
3411615744,3411623935,JP
3411623936,3411632127,AU
@@ -130416,9 +136529,9 @@
3411853312,3411857407,IN
3411857408,3411859249,JP
3411859250,3411859251,AU
-3411859252,3411859711,JP
+3411859252,3411859815,JP
3411859816,3411859816,CN
-3411860224,3411861503,JP
+3411859817,3411861503,JP
3411861504,3411869695,AU
3411869696,3411943423,CN
3411943424,3411951615,NZ
@@ -130542,10 +136655,7 @@
3413113856,3413114879,HK
3413114880,3413133311,JP
3413133312,3413135359,BD
-3413135616,3413135871,HK
-3413136128,3413136383,HK
-3413136640,3413137151,HK
-3413137408,3413139455,HK
+3413135360,3413139455,HK
3413139456,3413147647,AU
3413147648,3413155839,IN
3413155840,3413164031,SG
@@ -130578,10 +136688,7 @@
3413327872,3413344255,IN
3413344256,3413360639,PH
3413360640,3413377023,MY
-3413377024,3413387519,SG
-3413387696,3413387711,SG
-3413387776,3413437951,SG
-3413438208,3413524479,SG
+3413377024,3413524479,SG
3413524480,3413540863,TH
3413540864,3413557247,NZ
3413557248,3413565439,CN
@@ -130892,12 +136999,9 @@
3413934080,3413946367,IN
3413946368,3413950463,AU
3413950464,3413966847,IN
-3413966848,3414040063,SG
-3414040320,3414048767,SG
-3414049024,3414050303,SG
+3413966848,3414050303,SG
3414050304,3414050815,US
-3414050816,3414067199,SG
-3414067456,3414155519,SG
+3414050816,3414155519,SG
3414155520,3414155775,PH
3414155776,3414163455,SG
3414163456,3414171647,PK
@@ -131129,6 +137233,7 @@
3416371712,3416371967,VN
3416371968,3416372223,PK
3416372224,3416372479,CN
+3416372480,3416372735,SG
3416372736,3416372991,AU
3416372992,3416373247,CN
3416373248,3416373759,ID
@@ -131320,7 +137425,8 @@
3417354240,3417356287,ID
3417356288,3417357311,AU
3417357312,3417357567,NZ
-3417357568,3417358335,PK
+3417357568,3417357823,AU
+3417357824,3417358335,PK
3417358336,3417374719,HK
3417374720,3417440255,PH
3417440256,3417833471,JP
@@ -131405,7 +137511,6 @@
3418275840,3418279935,AU
3418279936,3418281983,NZ
3418281984,3418282239,NR
-3418282240,3418282495,AU
3418282496,3418283519,PH
3418283520,3418284031,AU
3418284032,3418286079,JP
@@ -131491,8 +137596,7 @@
3418642944,3418643199,ID
3418643200,3418643455,JP
3418643456,3418648575,AU
-3418648576,3418649343,JP
-3418649600,3418650807,JP
+3418648576,3418650807,JP
3418650808,3418650808,HK
3418650809,3418652671,JP
3418652672,3418750975,IN
@@ -131544,10 +137648,9 @@
3419412480,3419414527,PH
3419414528,3419422719,CN
3419422720,3419439103,AU
-3419439104,3419442463,SG
-3419442464,3419442479,HK
-3419442480,3419470591,SG
-3419470848,3419471871,SG
+3419439104,3419442431,SG
+3419442432,3419442687,HK
+3419442688,3419471871,SG
3419471872,3419504639,TH
3419504640,3419508735,HK
3419508736,3419512831,JP
@@ -131565,7 +137668,9 @@
3419556096,3419556351,CN
3419556352,3419556607,AU
3419556608,3419556863,CN
-3419556864,3419557631,AU
+3419556864,3419557119,AU
+3419557120,3419557120,HK
+3419557121,3419557887,AU
3419557888,3419558399,ID
3419558400,3419558655,AU
3419558656,3419559935,ID
@@ -131647,8 +137752,7 @@
3420366064,3420366079,TW
3420366080,3420366959,AU
3420366960,3420366975,KR
-3420366976,3420367359,AU
-3420367616,3420369007,AU
+3420366976,3420369007,AU
3420369008,3420369023,HK
3420369024,3420370559,AU
3420370560,3420370575,JP
@@ -131678,8 +137782,7 @@
3420436480,3420437503,AU
3420437504,3420438527,IN
3420438528,3420454911,HK
-3420454912,3422000533,KR
-3422000538,3422552063,KR
+3420454912,3422552063,KR
3422552064,3422846975,US
3422846976,3422855167,GB
3422855168,3422955519,US
@@ -131696,6 +137799,7 @@
3423094784,3423095807,CA
3423095808,3423128575,US
3423128576,3423128831,AO
+3423128832,3423129087,ZA
3423129088,3423129343,NG
3423129600,3423131647,US
3423131648,3423133695,PL
@@ -131723,14 +137827,13 @@
3423311872,3423313151,VI
3423313152,3423313407,US
3423313408,3423313919,VI
-3423313920,3423329567,US
-3423329568,3423329599,IL
-3423329600,3423366479,US
+3423313920,3423366479,US
3423366480,3423366495,IT
3423366496,3423371263,US
3423371264,3423375359,ZA
3423375360,3423379455,CA
-3423379456,3423410175,US
+3423379456,3423404031,US
+3423406080,3423410175,US
3423410176,3423412223,BM
3423412224,3423416319,US
3423416320,3423417343,CA
@@ -131765,7 +137868,9 @@
3423586304,3423588351,US
3423590400,3423602687,US
3423602688,3423603711,KN
-3423603712,3423614975,US
+3423603712,3423612671,US
+3423612672,3423612927,CA
+3423612928,3423614975,US
3423614976,3423615487,CA
3423615488,3423626239,US
3423626240,3423627263,CA
@@ -131806,9 +137911,7 @@
3423859456,3423859711,CA
3423859712,3423859967,US
3423859968,3423862527,CA
-3423862528,3424334847,US
-3424334848,3424335871,CA
-3424335872,3424378879,US
+3423862528,3424378879,US
3424378880,3424379135,PR
3424379136,3424412415,US
3424412416,3424412671,CA
@@ -131827,12 +137930,10 @@
3425699840,3425714175,US
3425714176,3425722367,CA
3425722368,3425828863,US
-3425828864,3425846783,CA
-3425847040,3425869167,CA
+3425828864,3425869167,CA
3425869168,3425869183,US
3425869184,3425894399,CA
-3425894400,3426007807,US
-3426008064,3426013183,US
+3425894400,3426013183,US
3426013184,3426013439,IL
3426013440,3426356991,US
3426356992,3426357247,CA
@@ -131867,9 +137968,7 @@
3427117056,3427117311,CA
3427117312,3427127295,US
3427127296,3427127551,CA
-3427127552,3427132927,US
-3427133184,3427408393,US
-3427408395,3427487743,US
+3427127552,3427487743,US
3427487744,3427487999,GB
3427488000,3427503615,US
3427503616,3427503871,AU
@@ -131920,7 +138019,7 @@
3427750912,3427751423,US
3427751424,3427751519,BE
3427751520,3427752447,US
-3427752704,3427752959,GB
+3427752448,3427752959,GB
3427752960,3427753215,US
3427753216,3427753471,JP
3427753472,3427753727,FI
@@ -132133,6 +138232,7 @@
3429029376,3429171199,US
3429171200,3429236735,CA
3429236736,3429381887,US
+3429381888,3429382143,DE
3429382144,3429396223,US
3429396224,3429396479,DE
3429396480,3429408511,US
@@ -132141,12 +138241,13 @@
3429411584,3429411839,DE
3429411840,3429500927,US
3429500928,3429502975,CA
-3429502976,3429775359,US
+3429502976,3429616639,US
+3429616640,3429616895,CA
+3429616896,3429775359,US
3429775360,3429777407,TC
3429777408,3429892095,US
3429892096,3429957631,CA
-3429957632,3430073343,US
-3430073600,3430074111,US
+3429957632,3430074111,US
3430074112,3430074367,AU
3430074368,3430354943,US
3430354944,3430356991,PR
@@ -132223,11 +138324,7 @@
3431468032,3431469055,CA
3431469056,3431470847,US
3431470848,3431471103,GB
-3431471104,3431517823,US
-3431517888,3431518079,US
-3431518144,3431520767,US
-3431521024,3431526921,US
-3431526923,3431596287,US
+3431471104,3431596287,US
3431596288,3431606271,CA
3431606272,3431609343,US
3431609344,3431613439,CA
@@ -132361,7 +138458,9 @@
3435069440,3435134975,CA
3435134976,3435216383,US
3435216384,3435216637,DE
+3435216638,3435216638,US
3435216639,3435216650,DE
+3435216651,3435216651,US
3435216652,3435216895,DE
3435216896,3435271423,US
3435271424,3435271679,CA
@@ -132378,8 +138477,8 @@
3436282368,3436282623,US
3436282624,3436289791,CA
3436289792,3436290047,US
-3436290048,3436314623,CA
-3436314624,3436476415,US
+3436290048,3436314367,CA
+3436314368,3436476415,US
3436476416,3436478463,AW
3436478464,3436507135,US
3436507136,3436509183,BB
@@ -132683,8 +138782,7 @@
3449572070,3449573375,AU
3449573376,3449575423,US
3449575424,3449577471,AU
-3449577472,3449582848,US
-3449582850,3449598207,US
+3449577472,3449598207,US
3449598208,3449598463,GB
3449598464,3449599999,US
3449600000,3449602047,CA
@@ -132755,11 +138853,9 @@
3450731520,3450732543,CA
3450732544,3450773503,US
3450773504,3450777599,CA
-3450777600,3450849791,US
-3450850048,3450852351,US
+3450777600,3450852351,US
3450852352,3450853375,CA
-3450853376,3450935551,US
-3450935808,3450974719,US
+3450853376,3450974719,US
3450974720,3450974975,AU
3450974976,3450986495,US
3450986496,3450986751,HK
@@ -132775,8 +138871,8 @@
3451236352,3451236607,HU
3451236608,3451371519,US
3451371520,3451371775,GB
-3451371776,3451502847,US
-3451502848,3451503359,BR
+3451371776,3451503103,US
+3451503104,3451503359,BR
3451503360,3451507199,US
3451507200,3451507711,BR
3451507712,3451715839,US
@@ -132846,8 +138942,7 @@
3452516096,3452516351,PL
3452516352,3452658431,US
3452658432,3452658687,HK
-3452658688,3452678143,US
-3452678400,3452715007,US
+3452658688,3452715007,US
3452715008,3452723199,CA
3452723200,3452730623,US
3452730624,3452730879,HK
@@ -133375,7 +139470,9 @@
3458822144,3459055615,US
3459055616,3459121151,CA
3459121152,3459186687,US
-3459186688,3459252223,CA
+3459186688,3459230975,CA
+3459230976,3459231231,US
+3459231232,3459252223,CA
3459252224,3459256831,US
3459256832,3459257087,CO
3459257088,3459257343,US
@@ -133502,10 +139599,9 @@
3459615744,3459615999,CA
3459616000,3459616255,DM
3459616256,3459616767,US
-3459616768,3459617791,CA
+3459616768,3459617999,CA
3459618000,3459618000,ID
-3459618048,3459618815,CA
-3459619072,3459620863,CA
+3459618001,3459620863,CA
3459620864,3459624959,US
3459624960,3459629055,BM
3459629056,3459686399,US
@@ -133536,16 +139632,13 @@
3460161536,3460165631,PR
3460165632,3460374527,US
3460374528,3460375551,MX
-3460375552,3460411149,US
-3460411151,3460453631,US
+3460375552,3460453631,US
3460453632,3460453887,BS
3460453888,3460507647,US
3460507648,3460507903,MX
3460507904,3460762367,US
3460762368,3460762623,CA
-3460762624,3460762879,US
-3460763648,3460801023,US
-3460801280,3460878335,US
+3460762624,3460878335,US
3460878336,3460878591,CA
3460878592,3460880383,US
3460882432,3460893439,US
@@ -133690,7 +139783,7 @@
3461516288,3461516543,IL
3461516544,3461554175,US
3461554176,3461556223,CA
-3461558272,3461808127,US
+3461556224,3461808127,US
3461808128,3461873663,CA
3461873664,3461897727,US
3461897728,3461897983,CA
@@ -133792,9 +139885,7 @@
3462661376,3462661631,SG
3462661632,3463004159,US
3463004160,3463006207,CO
-3463006208,3463032319,US
-3463032320,3463032831,PR
-3463032832,3463043071,US
+3463006208,3463043071,US
3463043072,3463044095,ES
3463044096,3463089151,US
3463089152,3463090175,CA
@@ -133819,8 +139910,7 @@
3463774208,3464108031,US
3464108032,3464108287,DE
3464108288,3464127999,US
-3464128000,3464128083,DE
-3464128085,3464128255,DE
+3464128000,3464128255,DE
3464128256,3464129535,US
3464129536,3464130047,DE
3464130048,3464167679,US
@@ -133838,7 +139928,7 @@
3464200960,3464202239,US
3464202240,3464202495,CA
3464202496,3464203007,US
-3464203008,3464203263,SE
+3464203008,3464203263,RU
3464203264,3464204799,US
3464204800,3464205055,DK
3464205056,3464205311,NL
@@ -133967,10 +140057,7 @@
3466296576,3466296831,GB
3466296832,3466489855,US
3466489856,3466490111,CA
-3466490112,3466558207,US
-3466558208,3466558463,EC
-3466558464,3466717445,US
-3466717450,3466756095,US
+3466490112,3466756095,US
3466756096,3466772479,CA
3466772480,3466846207,US
3466846208,3466854399,CA
@@ -133982,10 +140069,13 @@
3466907648,3466909695,DE
3466909696,3466914303,US
3466914304,3466914559,FR
-3466914560,3466929407,US
+3466914560,3466926551,US
+3466926552,3466926559,IT
+3466926560,3466929407,US
3466929408,3466929663,IT
3466929664,3466937663,US
3466937664,3466937669,DE
+3466937670,3466937670,US
3466937671,3466937727,DE
3466937728,3466938807,US
3466938808,3466938811,GB
@@ -134262,9 +140352,9 @@
3468688944,3468688959,IE
3468688960,3468802303,US
3468802304,3468802559,CA
-3468802560,3468977919,US
-3468978176,3469032191,US
-3469032448,3469055743,US
+3468802560,3468894207,US
+3468894208,3468902399,DE
+3468902400,3469055743,US
3469055744,3469055999,CA
3469056000,3469070335,US
3469070336,3469070591,CA
@@ -134283,9 +140373,7 @@
3470137344,3470139391,VG
3470139392,3470153727,US
3470153728,3470153983,IN
-3470153984,3470188111,US
-3470188112,3470188115,CA
-3470188116,3470192639,US
+3470153984,3470192639,US
3470192640,3470194927,CA
3470194928,3470194935,US
3470194936,3470196735,CA
@@ -134313,14 +140401,30 @@
3470749952,3470750207,CA
3470750208,3470752767,US
3470752768,3470753023,CO
-3470753024,3470754047,US
+3470753024,3470753535,US
+3470753536,3470753791,CA
+3470753792,3470754047,US
3470754048,3470754303,CA
3470754304,3470754559,PE
3470754560,3470755839,US
3470755840,3470756095,MU
-3470756096,3470761983,US
+3470756096,3470756607,US
+3470756608,3470756863,CA
+3470756864,3470761983,US
3470761984,3470770175,CA
-3470770176,3470794751,US
+3470770176,3470778367,US
+3470778368,3470778879,GB
+3470778880,3470779519,US
+3470779520,3470779647,SE
+3470779648,3470779903,US
+3470779904,3470780159,GB
+3470780160,3470780927,US
+3470780928,3470781055,GB
+3470781056,3470781183,US
+3470781184,3470781695,FR
+3470781696,3470785023,US
+3470785024,3470785791,GB
+3470785792,3470794751,US
3470794752,3470802943,PA
3470802944,3470884863,US
3470884864,3470885887,HK
@@ -134334,8 +140438,7 @@
3471060992,3471061247,NL
3471061248,3471061503,US
3471061504,3471061759,NL
-3471061760,3471262719,US
-3471262720,3471263743,EC
+3471061760,3471263743,US
3471263744,3471265791,CO
3471265792,3471276031,US
3471276032,3471278079,BB
@@ -134370,9 +140473,7 @@
3473755392,3473755647,HN
3473755648,3473786111,US
3473786112,3473786127,PR
-3473786128,3473901055,US
-3473901056,3473901311,EC
-3473901312,3473917439,US
+3473786128,3473917439,US
3473917440,3473917695,PR
3473917696,3474053119,US
3474053120,3474055167,PE
@@ -134380,7 +140481,9 @@
3474193408,3474193663,PH
3474193664,3474193919,US
3474193920,3474194431,PH
-3474194432,3474391039,US
+3474194432,3474309119,US
+3474309120,3474325503,CA
+3474325504,3474391039,US
3474391040,3474456575,CA
3474456576,3474463231,US
3474463232,3474463487,GB
@@ -134427,7 +140530,9 @@
3475909144,3475909359,US
3475909360,3475909367,IE
3475909368,3475910655,US
-3475910656,3475911519,SG
+3475910656,3475911167,SG
+3475911168,3475911295,US
+3475911296,3475911519,SG
3475911520,3475911551,HK
3475911552,3475912959,SG
3475912960,3475913215,US
@@ -134501,7 +140606,9 @@
3475954608,3475954611,SE
3475954612,3475954631,US
3475954632,3475954639,SG
-3475954640,3475955711,US
+3475954640,3475954647,US
+3475954648,3475954651,CA
+3475954652,3475955711,US
3475955712,3475959807,SG
3475959808,3475996671,US
3475996672,3476029439,CA
@@ -134551,7 +140658,11 @@
3478289664,3478289919,GB
3478289920,3478372351,US
3478372352,3478380543,MX
-3478380544,3478732799,US
+3478380544,3478721535,US
+3478721536,3478721791,CN
+3478721792,3478722047,US
+3478722048,3478722303,AE
+3478722304,3478732799,US
3478732800,3478749183,DE
3478749184,3479207935,US
3479207936,3479240703,CA
@@ -134926,7 +141037,31 @@
3484884992,3484893183,CA
3484893184,3485220863,US
3485220864,3485229055,CA
-3485229056,3485317119,US
+3485229056,3485270015,US
+3485270016,3485270527,FR
+3485270528,3485270783,US
+3485270784,3485270911,IN
+3485270912,3485271039,GB
+3485271040,3485271295,IN
+3485271296,3485271551,GB
+3485271552,3485271679,BS
+3485271680,3485271807,US
+3485271808,3485271999,GB
+3485272000,3485272047,US
+3485272048,3485272063,GB
+3485272064,3485272159,CA
+3485272160,3485272223,US
+3485272224,3485272255,CA
+3485272256,3485272815,US
+3485272816,3485272831,HK
+3485272832,3485273071,US
+3485273072,3485273079,FR
+3485273080,3485273319,US
+3485273320,3485273335,EG
+3485273336,3485273343,US
+3485273344,3485273599,GB
+3485273600,3485273727,FR
+3485273728,3485317119,US
3485317120,3485318143,IN
3485318144,3485319167,US
3485319168,3485323263,SE
@@ -135291,9 +141426,7 @@
3489673472,3489673727,PR
3489673728,3489685503,US
3489685504,3489687551,BB
-3489687552,3489717759,US
-3489717760,3489718015,PR
-3489718016,3489718271,US
+3489687552,3489718271,US
3489718272,3489718527,DM
3489718528,3489719039,LC
3489719040,3489719551,AG
@@ -135338,8 +141471,7 @@
3492151296,3492162943,CA
3492162944,3492163071,US
3492163072,3492167679,CA
-3492167680,3492536627,US
-3492536629,3492669951,US
+3492167680,3492669951,US
3492669952,3492671487,PA
3492671488,3492807155,US
3492807156,3492807159,SE
@@ -135361,15 +141493,13 @@
3492896768,3492897791,GB
3492897792,3492904215,US
3492904216,3492904219,AT
-3492904220,3492906495,US
-3492906752,3492909989,US
+3492904220,3492909989,US
3492909990,3492909990,DE
3492909991,3492912127,US
3492912128,3492912383,GB
3492912384,3492921855,US
3492921856,3492922111,VI
-3492922112,3492926079,US
-3492926096,3492931583,US
+3492922112,3492931583,US
3492931584,3492933119,CA
3492933120,3492933375,US
3492933376,3492933376,CA
@@ -135437,10 +141567,6 @@
3494003712,3494004735,CA
3494004736,3494009855,US
3494009856,3494010879,CA
-3494011088,3494011095,US
-3494011136,3494011231,US
-3494011232,3494011247,HK
-3494011264,3494011903,US
3494012928,3494014975,US
3494014976,3494017023,CA
3494017024,3494043647,US
@@ -135516,9 +141642,7 @@
3494410240,3494412287,CA
3494412288,3494422527,US
3494422528,3494425599,CA
-3494425600,3494432767,US
-3494432768,3494433791,CA
-3494433792,3494437887,US
+3494425600,3494437887,US
3494437888,3494438143,GP
3494438144,3494438399,DM
3494438400,3494438655,KN
@@ -135531,8 +141655,7 @@
3494464512,3494465535,CA
3494465536,3494510591,US
3494510592,3494512639,CA
-3494512640,3494513663,US
-3494514688,3494516735,US
+3494512640,3494516735,US
3494516736,3494517759,CA
3494517760,3494540031,US
3494540032,3494540287,UG
@@ -135559,7 +141682,9 @@
3494664192,3494665215,CA
3494665216,3494668287,US
3494668288,3494670335,CA
-3494670336,3494712319,US
+3494670336,3494709759,US
+3494709760,3494710271,CA
+3494710272,3494712319,US
3494712320,3494712575,CA
3494712576,3494727679,US
3494727680,3494729727,CA
@@ -135581,7 +141706,10 @@
3494788096,3494788351,NG
3494788352,3494788607,LY
3494788608,3494789119,CA
-3494789120,3494852607,US
+3494789120,3494812671,US
+3494812928,3494813183,US
+3494813184,3494813439,CA
+3494813440,3494852607,US
3494852608,3494854655,CA
3494854656,3494862847,US
3494862848,3494863871,DM
@@ -135609,14 +141737,19 @@
3494968320,3494972415,CA
3494972416,3494979583,US
3494979584,3494981631,CA
-3494981632,3494985727,US
+3494981632,3494984191,US
+3494984192,3494984703,PR
+3494984704,3494985727,US
3494985728,3494985975,NL
+3494985976,3494985976,US
3494985977,3494985983,NL
3494985984,3494999039,US
3494999040,3494999551,ID
3494999552,3495000063,CN
3495000064,3495001087,CA
-3495001088,3495006207,US
+3495001088,3495005439,US
+3495005440,3495005695,CA
+3495005696,3495006207,US
3495006208,3495007231,CA
3495007232,3495010303,US
3495010304,3495011327,KN
@@ -135624,14 +141757,18 @@
3495012352,3495014399,PR
3495014400,3495023615,US
3495023616,3495024639,CA
-3495024640,3495057407,US
+3495024640,3495053311,US
+3495053312,3495054335,DE
+3495054336,3495057407,US
3495057408,3495059455,CA
3495059456,3495065599,US
3495065600,3495066495,CA
3495066496,3495066623,GB
3495066624,3495076863,US
3495076864,3495077887,BM
-3495077888,3495090175,US
+3495077888,3495078399,US
+3495078400,3495078911,CA
+3495078912,3495090175,US
3495090176,3495091199,KY
3495091200,3495098367,US
3495098368,3495100415,CA
@@ -135651,7 +141788,9 @@
3495251968,3495254015,CA
3495254016,3495260159,US
3495260160,3495261183,CA
-3495261184,3495285759,US
+3495261184,3495271423,US
+3495271424,3495272447,ZA
+3495272448,3495285759,US
3495285760,3495288831,CA
3495288832,3495331839,US
3495331840,3495332095,CA
@@ -135671,7 +141810,11 @@
3495375872,3495376895,CA
3495376896,3495399423,US
3495399424,3495400447,KN
-3495400448,3495406335,US
+3495400448,3495403519,US
+3495403520,3495404031,CA
+3495404032,3495405055,US
+3495405056,3495405567,HK
+3495405568,3495406335,US
3495406336,3495406591,LB
3495406592,3495412735,US
3495412736,3495413759,CA
@@ -135710,7 +141853,7 @@
3495618560,3495619583,CA
3495619584,3495620607,US
3495620608,3495622655,CA
-3495622656,3495651327,US
+3495622656,3495653375,US
3495653376,3495654399,CA
3495654400,3495673855,US
3495673856,3495674879,MF
@@ -135794,21 +141937,7 @@
3497020416,3497020671,IL
3497020672,3497066495,US
3497066496,3497082879,CA
-3497082880,3497161735,US
-3497161736,3497161743,MT
-3497161744,3497161759,US
-3497161760,3497161767,PT
-3497161768,3497161775,MT
-3497161776,3497161895,US
-3497161896,3497161903,MT
-3497161904,3497161935,US
-3497161936,3497161943,MT
-3497161944,3497162495,US
-3497162496,3497162751,GB
-3497162752,3497163007,NL
-3497163008,3497163167,US
-3497163168,3497163175,GB
-3497163176,3497164799,US
+3497082880,3497164799,US
3497164800,3497181183,CA
3497181184,3497222751,US
3497222752,3497222767,CA
@@ -135998,10 +142127,32 @@
3507290112,3507355647,AR
3507355648,3507421183,US
3507421184,3507421439,CA
-3507421440,3507427583,US
+3507421440,3507422207,US
+3507422208,3507422719,CA
+3507422720,3507423231,US
+3507423232,3507423487,CA
+3507423488,3507423743,US
+3507423744,3507423999,CA
+3507424000,3507424511,US
+3507424512,3507424767,CA
+3507424768,3507425023,US
+3507425024,3507425279,CA
+3507425280,3507426303,US
+3507426304,3507426815,CA
+3507426816,3507427583,US
3507427584,3507427839,CA
-3507427840,3507437567,US
-3507437568,3507445759,CA
+3507427840,3507430655,US
+3507430656,3507430911,CA
+3507430912,3507433215,US
+3507433216,3507433727,CA
+3507433728,3507433983,US
+3507433984,3507434239,CA
+3507434240,3507434495,US
+3507434496,3507436031,CA
+3507436032,3507436799,US
+3507436800,3507437055,CA
+3507437056,3507437311,US
+3507437312,3507445759,CA
3507445760,3507470335,US
3507470336,3507486719,CA
3507486720,3507585023,US
@@ -136544,9 +142695,9 @@
3514723697,3514723697,BZ
3514723698,3514724455,US
3514724456,3514724456,BZ
-3514724457,3514724707,US
-3514724708,3514724708,BZ
-3514724709,3514826751,US
+3514724457,3514777599,US
+3514793984,3514802175,US
+3514810368,3514818559,US
3514826752,3514843135,CA
3514843136,3514993983,US
3514993984,3514993987,FR
@@ -136555,8 +142706,7 @@
3514994008,3514994015,DK
3514994016,3514994016,GB
3514994017,3514994023,DK
-3514994024,3514994049,US
-3514994051,3515211775,US
+3514994024,3515211775,US
3515211776,3515219967,CA
3515219968,3515222271,US
3515222272,3515224831,TR
@@ -136768,13 +142918,9 @@
3517447936,3517448191,CA
3517448192,3517546495,US
3517546496,3517562879,CA
-3517562880,3517596927,US
-3517596928,3517597183,IE
-3517597184,3517597695,US
+3517562880,3517597695,US
3517597696,3517597951,IE
-3517597952,3517598207,US
-3517598208,3517598463,IE
-3517598464,3517602047,US
+3517597952,3517602047,US
3517602048,3517602303,DE
3517602304,3517607935,US
3517607936,3517608191,DE
@@ -136782,16 +142928,21 @@
3517608448,3517608703,GB
3517608704,3517609727,US
3517609728,3517609743,AT
-3517609744,3517610495,US
-3517610496,3517611263,IE
-3517611264,3517644799,US
+3517609744,3517644799,US
3517644800,3517710335,CA
3517710336,3517718527,US
3517718528,3517726719,CA
3517726720,3517990911,US
3517990912,3517991423,CA
3517991424,3518056447,US
-3518058496,3518062591,CN
+3518058496,3518059519,CN
+3518059520,3518059775,HK
+3518059776,3518060031,US
+3518060032,3518060287,CN
+3518060288,3518060799,US
+3518060800,3518061055,CN
+3518061056,3518062079,US
+3518062080,3518062591,CN
3518062592,3518066687,CA
3518066688,3518075647,US
3518075648,3518075903,AU
@@ -136806,7 +142957,17 @@
3518381312,3518381439,US
3518381440,3518381567,IN
3518381568,3518381631,DE
-3518381632,3518431231,US
+3518381632,3518392575,US
+3518392576,3518392831,NL
+3518392832,3518393087,US
+3518393088,3518393343,SG
+3518393344,3518393599,US
+3518393600,3518393855,GB
+3518393856,3518422271,US
+3518422272,3518422527,CA
+3518422528,3518424063,US
+3518424064,3518425087,CA
+3518425088,3518431231,US
3518431232,3518439423,CA
3518439424,3518463999,US
3518464000,3518472191,CA
@@ -136847,8 +143008,8 @@
3519723520,3519724031,CA
3519724032,3519741951,US
3519741952,3519758335,ZA
-3519758336,3519864831,US
-3519864832,3519868927,CA
+3519758336,3519856639,US
+3519856640,3519868927,CA
3519868928,3519873023,US
3519873024,3519874559,CA
3519874560,3519875071,US
@@ -136878,7 +143039,36 @@
3519971072,3519971327,CA
3519971328,3520020479,US
3520020480,3520036863,CA
-3520036864,3520356351,US
+3520036864,3520192511,US
+3520192512,3520192767,GB
+3520192768,3520193023,DE
+3520193024,3520193279,GB
+3520193280,3520193535,DE
+3520193536,3520194303,GB
+3520194304,3520196607,US
+3520196608,3520196863,IN
+3520196864,3520196991,IL
+3520196992,3520197119,IN
+3520197120,3520197631,US
+3520197632,3520197759,AU
+3520197760,3520197887,RU
+3520197888,3520198143,US
+3520198144,3520198271,DE
+3520198272,3520198399,MX
+3520198400,3520198527,ES
+3520198528,3520198655,JP
+3520198656,3520198911,US
+3520198912,3520199039,MX
+3520199040,3520199167,AU
+3520199168,3520199295,HK
+3520199296,3520199423,DE
+3520199424,3520199551,JP
+3520199552,3520199807,GB
+3520199808,3520199935,HK
+3520199936,3520200447,GB
+3520200448,3520200575,IN
+3520200576,3520200703,FR
+3520200704,3520356351,US
3520356352,3520364543,ZA
3520364544,3520390143,US
3520390144,3520390399,JP
@@ -136888,8 +143078,7 @@
3520454656,3520462847,CA
3520462848,3520626687,US
3520626688,3520634879,CA
-3520634880,3520644607,US
-3520644864,3520675839,US
+3520634880,3520675839,US
3520675840,3520692223,CA
3520692224,3520937983,US
3520937984,3520954367,CA
@@ -137020,7 +143209,7 @@
3523551232,3523553279,AU
3523553280,3523555327,MY
3523555328,3523557375,NZ
-3523557376,3523559423,CN
+3523557376,3523559423,HK
3523559424,3523575807,PH
3523575808,3523583999,CN
3523584000,3523596359,HK
@@ -137037,8 +143226,7 @@
3523597568,3523597823,PK
3523597824,3523601663,HK
3523601664,3523601919,SA
-3523601920,3523603711,HK
-3523603968,3523674111,HK
+3523601920,3523674111,HK
3523674112,3523682303,FJ
3523682304,3523686399,NZ
3523686400,3523688447,AU
@@ -137309,10 +143497,7 @@
3526952960,3526953983,ID
3526953984,3526955007,JP
3526955008,3526955263,US
-3526955264,3526955775,AU
-3526955776,3526956031,JP
-3526956032,3526956287,SG
-3526956288,3526971439,JP
+3526955264,3526971439,JP
3526971440,3526971443,HK
3526971444,3526971667,JP
3526971668,3526971671,HK
@@ -137337,8 +143522,7 @@
3528491008,3528507391,AU
3528507392,3528508415,JP
3528508416,3528508927,AU
-3528508928,3528576767,JP
-3528577024,3528589311,JP
+3528508928,3528589311,JP
3528589312,3528720383,CN
3528720384,3528785919,AU
3528785920,3528851455,TW
@@ -137362,8 +143546,7 @@
3532290816,3532291071,GB
3532291072,3532546127,JP
3532546128,3532546135,HK
-3532546136,3532929279,JP
-3532929536,3534749695,JP
+3532546136,3534749695,JP
3534749696,3534757887,HK
3534757888,3534758143,AU
3534758144,3534758147,JP
@@ -137378,18 +143561,18 @@
3534759968,3534760447,AU
3534760448,3534760959,NZ
3534760960,3534761983,AU
-3534761984,3534763775,HK
-3534764032,3534785043,HK
+3534761984,3534785043,HK
3534785044,3534785047,SG
3534785048,3534786815,HK
3534786816,3534787327,MY
3534787328,3534787583,TH
3534787584,3534863443,HK
3534863444,3534863444,CN
-3534863445,3534867711,HK
-3534867968,3534880767,HK
+3534863445,3534880767,HK
3534880768,3535273983,KR
-3535273984,3535279103,HK
+3535273984,3535274495,HK
+3535274496,3535274496,ZA
+3535274497,3535279103,HK
3535279104,3535279359,US
3535279360,3535280383,HK
3535280384,3535280639,JP
@@ -137407,7 +143590,9 @@
3535294464,3535294719,DE
3535294720,3535294975,HK
3535294976,3535295231,DE
-3535295232,3535339519,HK
+3535295232,3535298303,HK
+3535298304,3535298304,ZA
+3535298305,3535339519,HK
3535339520,3535355903,NZ
3535355904,3535372287,AU
3535372288,3535380479,JP
@@ -137448,8 +143633,7 @@
3537174528,3537190911,TH
3537190912,3537240063,PH
3537240064,3537305599,IN
-3537305600,3537325567,AU
-3537325824,3537371135,AU
+3537305600,3537371135,AU
3537371136,3537895423,KR
3537895424,3538943999,JP
3538944000,3539271679,TW
@@ -137460,8 +143644,7 @@
3539402752,3539435519,JP
3539435520,3539464191,AU
3539464192,3539468287,ID
-3539468288,3539510271,JP
-3539510528,3541303295,JP
+3539468288,3541303295,JP
3541303296,3541565439,TW
3541565440,3541696511,MY
3541696512,3542089727,AU
@@ -137485,8 +143668,7 @@
3556802560,3556810751,SD
3556810752,3556818943,PT
3556818944,3556827135,MD
-3556827136,3556837887,NL
-3556838144,3556843519,NL
+3556827136,3556843519,NL
3556843520,3556851711,DE
3556851712,3556868095,UA
3556868096,3556876287,GB
@@ -137509,7 +143691,9 @@
3556990976,3556999167,UA
3556999168,3557007359,RU
3557007360,3557015551,IT
-3557015552,3557023743,LV
+3557015552,3557016976,LV
+3557016977,3557016977,ES
+3557016978,3557023743,LV
3557023744,3557027839,GB
3557027840,3557031935,BE
3557031936,3557040127,IT
@@ -137522,8 +143706,7 @@
3557089280,3557105663,DE
3557105664,3557107711,BG
3557107712,3557109759,IQ
-3557109760,3557112831,BG
-3557112832,3557113855,IQ
+3557109760,3557113855,BG
3557113856,3557130239,RU
3557130240,3557138431,BG
3557138432,3557146623,RU
@@ -137567,7 +143750,9 @@
3557336272,3557336279,BE
3557339164,3557339164,BE
3557343232,3557351423,DE
-3557351424,3557356543,RU
+3557351424,3557355775,RU
+3557355776,3557356031,US
+3557356032,3557356543,RU
3557356544,3557357311,NL
3557357312,3557358079,RU
3557358080,3557358847,NL
@@ -137619,11 +143804,7 @@
3557556224,3557564415,RU
3557564416,3557572607,DE
3557572608,3557580799,RU
-3557580800,3557584287,DE
-3557584288,3557584319,GB
-3557584320,3557585695,DE
-3557585696,3557585711,CH
-3557585712,3557588991,DE
+3557580800,3557588991,DE
3557588992,3557597183,TR
3557597184,3557605375,SA
3557605376,3557613567,LT
@@ -137676,8 +143857,7 @@
3557933056,3557941247,IT
3557941248,3557957631,DE
3557957632,3557965823,SI
-3557965824,3557969407,DE
-3557969664,3557974015,DE
+3557965824,3557974015,DE
3557974016,3557982207,CH
3557982208,3557990399,NO
3557990400,3557998591,PT
@@ -137731,12 +143911,7 @@
3558244352,3558252543,IT
3558252544,3558260735,KE
3558260736,3558268927,UA
-3558268928,3558269439,GB
-3558269440,3558269695,GI
-3558269696,3558270167,GB
-3558270168,3558270168,GI
-3558270169,3558270463,GB
-3558270464,3558275839,GI
+3558268928,3558275839,GI
3558275840,3558276095,HK
3558276096,3558276351,GB
3558276352,3558277119,GI
@@ -137744,8 +143919,7 @@
3558285952,3558286079,DE
3558286080,3558286591,GB
3558286592,3558286655,FR
-3558286656,3558288639,GB
-3558288896,3558289119,GB
+3558286656,3558289119,GB
3558289120,3558289151,FR
3558289152,3558289431,GB
3558289432,3558289439,NL
@@ -137757,8 +143931,7 @@
3558291072,3558291135,DE
3558291136,3558292255,GB
3558292256,3558292271,SE
-3558292272,3558292479,GB
-3558292736,3558293199,GB
+3558292272,3558293199,GB
3558293200,3558293215,NL
3558293216,3558293503,GB
3558293504,3558301695,RU
@@ -137789,7 +143962,9 @@
3558473728,3558506495,SA
3558506496,3558514687,UA
3558514688,3558522879,SK
-3558522880,3558531071,NL
+3558522880,3558526975,NL
+3558526976,3558527744,ES
+3558527745,3558531071,NL
3558531072,3558539263,RU
3558539264,3558547455,DK
3558547456,3558555647,FR
@@ -137809,9 +143984,7 @@
3558670336,3558686719,DE
3558686720,3558703103,TR
3558703104,3558711295,IT
-3558711296,3558717695,NL
-3558717952,3558718207,NL
-3558718464,3558719487,NL
+3558711296,3558719487,NL
3558719488,3558735871,IL
3558735872,3558744063,GG
3558744064,3558752255,LB
@@ -137870,7 +144043,9 @@
3559092244,3559092244,BE
3559092245,3559093311,GB
3559093312,3559093319,BE
-3559093320,3559094303,GB
+3559093320,3559093487,GB
+3559093488,3559093503,BE
+3559093504,3559094303,GB
3559094304,3559094319,BE
3559094320,3559095455,GB
3559095456,3559095456,BE
@@ -137997,7 +144172,8 @@
3559874560,3559882751,LT
3559882752,3559890943,AZ
3559890944,3559899135,CH
-3559899136,3559899647,UA
+3559899136,3559899263,PL
+3559899264,3559899647,UA
3559899648,3559899967,EE
3559899968,3559900007,UA
3559900008,3559900015,EE
@@ -138024,7 +144200,9 @@
3559989248,3559997439,PL
3559997440,3560005631,KE
3560005632,3560013823,RU
-3560013824,3560021247,GB
+3560013824,3560016063,GB
+3560016064,3560016064,ES
+3560016065,3560021247,GB
3560021248,3560021263,ES
3560021264,3560022015,GB
3560022016,3560030207,ES
@@ -138309,7 +144487,7 @@
3560940612,3560940619,DE
3560940620,3560940623,AT
3560940624,3560940627,SM
-3560940628,3560940631,PL
+3560940628,3560940631,DE
3560940632,3560940635,AT
3560940636,3560940639,DE
3560940640,3560940647,GB
@@ -139917,8 +146095,8 @@
3560996864,3561005055,GB
3561005056,3561013247,ES
3561013248,3561021439,TR
-3561021696,3561022463,DE
-3561022720,3561022975,AT
+3561021440,3561022463,DE
+3561022464,3561022975,AT
3561022976,3561037823,DE
3561037824,3561046015,BE
3561046016,3561054207,RU
@@ -139955,8 +146133,7 @@
3561299968,3561308159,GB
3561308160,3561316351,PL
3561316352,3561324543,RU
-3561324544,3561325567,IT
-3561326592,3561328639,IT
+3561324544,3561328639,IT
3561328640,3561332735,US
3561332736,3561340927,AT
3561340928,3561357311,GB
@@ -140017,7 +146194,9 @@
3561618878,3561618878,PL
3561618879,3561619199,GB
3561619200,3561619455,ES
-3561619456,3561652223,GB
+3561619456,3561640575,GB
+3561640576,3561640831,FR
+3561640832,3561652223,GB
3561652224,3561668607,CH
3561668608,3561684991,RU
3561684992,3561693183,BG
@@ -140094,7 +146273,9 @@
3562094912,3562094975,CH
3562094976,3562102449,GB
3562102450,3562102450,DE
-3562102451,3562102963,GB
+3562102451,3562102847,GB
+3562102848,3562102851,NO
+3562102852,3562102963,GB
3562102964,3562102967,NO
3562102968,3562110607,GB
3562110608,3562110623,FR
@@ -140118,9 +146299,7 @@
3562233856,3562242047,FI
3562242048,3562253276,FR
3562253277,3562253277,NL
-3562253278,3562256190,FR
-3562256191,3562256191,NL
-3562256192,3562258431,FR
+3562253278,3562258431,FR
3562258432,3562283007,NL
3562283008,3562285055,IT
3562285056,3562287103,IE
@@ -140132,7 +146311,9 @@
3562323968,3562340351,DE
3562340352,3562348543,GB
3562348544,3562356735,ES
-3562356736,3562364927,SE
+3562356736,3562362431,SE
+3562362432,3562362495,GB
+3562362496,3562364927,SE
3562364928,3562373119,PL
3562373120,3562381311,FR
3562381312,3562389503,SI
@@ -140142,7 +146323,7 @@
3562414080,3562422271,DE
3562422272,3562430463,IR
3562430464,3562431231,UA
-3562431232,3562431487,GB
+3562431232,3562431487,RU
3562431488,3562431999,UA
3562432000,3562432255,NL
3562432256,3562433535,UA
@@ -140405,8 +146586,11 @@
3563823104,3563831295,DE
3563831296,3563847679,RU
3563847680,3563848447,NL
+3563848448,3563848703,GB
3563848704,3563848847,NL
+3563848848,3563848848,GB
3563848849,3563848849,NL
+3563848850,3563848855,GB
3563848856,3563855871,NL
3563855872,3563864063,AT
3563864064,3563872255,GB
@@ -140487,8 +146671,7 @@
3564519424,3564527615,SI
3564527616,3564543999,SA
3564544000,3564560383,DE
-3564560384,3564560531,GB
-3564560533,3564571695,GB
+3564560384,3564571695,GB
3564571696,3564571703,DE
3564571704,3564572427,GB
3564572428,3564572431,ES
@@ -140506,8 +146689,7 @@
3564634112,3564642303,MK
3564642304,3564650495,CH
3564650496,3564666879,NL
-3564666880,3564668927,IE
-3564669184,3564675071,IE
+3564666880,3564675071,IE
3564675072,3564683263,RU
3564683264,3564691455,IR
3564691456,3564699647,GI
@@ -140522,9 +146704,9 @@
3564733344,3564733351,DE
3564733352,3564733807,GB
3564733808,3564733823,DE
-3564733824,3564734207,GB
+3564733824,3564734457,GB
3564734458,3564734458,DE
-3564734464,3564734741,GB
+3564734459,3564734741,GB
3564734742,3564734742,DE
3564734743,3564734743,GB
3564734744,3564734751,DE
@@ -140550,9 +146732,7 @@
3564806144,3564814335,BG
3564814336,3564822527,PL
3564822528,3564830719,EG
-3564830720,3564831487,BE
-3564831744,3564832511,BE
-3564832768,3564838911,BE
+3564830720,3564838911,BE
3564838912,3564847103,DE
3564847104,3564855295,IT
3564855296,3564863487,DE
@@ -140569,9 +146749,11 @@
3564882016,3564882031,NL
3564882032,3564882399,GB
3564882400,3564882415,NL
-3564882416,3564882431,GB
+3564882416,3564882543,GB
+3564882544,3564882551,NL
+3564882552,3564882559,GB
3564882560,3564882591,NL
-3564882688,3564883071,GB
+3564882592,3564883071,GB
3564883072,3564883079,NL
3564883080,3564883199,GB
3564883200,3564883967,NL
@@ -140589,7 +146771,8 @@
3564892160,3564896255,NL
3564896256,3564904447,RU
3564904448,3564912639,DE
-3564912640,3564914687,NL
+3564912640,3564913663,NL
+3564913664,3564914687,ES
3564914688,3564915711,GB
3564915712,3564915712,IN
3564915713,3564915967,US
@@ -140609,6 +146792,7 @@
3564929024,3564937215,AT
3564937216,3564945407,IT
3564945408,3564958850,GB
+3564958851,3564958851,AT
3564958852,3564961791,GB
3564961792,3564969983,TR
3564969984,3564978175,DE
@@ -140653,8 +146837,7 @@
3565503488,3565518847,GB
3565518848,3565551615,TR
3565551616,3565682687,GB
-3565682688,3565684995,NL
-3565684997,3565748223,NL
+3565682688,3565748223,NL
3565748224,3565752319,GB
3565752464,3565752479,GB
3565752536,3565752559,GB
@@ -140747,8 +146930,7 @@
3566354432,3566370815,RO
3566370816,3566403583,TR
3566403584,3566436351,CH
-3566436352,3566438546,IE
-3566438548,3566469119,IE
+3566436352,3566469119,IE
3566469120,3566534655,GB
3566534656,3566551039,DE
3566551040,3566600191,FI
@@ -140764,8 +146946,7 @@
3566796800,3566862335,NL
3566862336,3566895103,TR
3566895104,3566927871,KZ
-3566927872,3566976767,FR
-3566977024,3566993407,FR
+3566927872,3566993407,FR
3566993408,3567058943,TR
3567058944,3567124479,FR
3567124992,3567125023,GB
@@ -140830,14 +147011,17 @@
3567165440,3567169535,RU
3567169536,3567173631,MK
3567173632,3567239167,GB
-3567239168,3567241215,NL
-3567241472,3567255551,NL
+3567239168,3567255551,NL
3567255552,3567263743,PL
3567263744,3567271935,ES
3567271936,3567321087,PL
-3567321088,3567344447,GB
+3567321088,3567338615,GB
+3567338616,3567338623,DE
+3567338624,3567344447,GB
3567344448,3567344455,ES
-3567344456,3567350271,GB
+3567344456,3567344463,GB
+3567344464,3567344479,ES
+3567344480,3567350271,GB
3567350272,3567350527,ES
3567350528,3567353855,GB
3567353856,3567386623,CH
@@ -140849,13 +147033,14 @@
3567388648,3567388655,DE
3567388656,3567389695,GB
3567389696,3567390719,DE
-3567390720,3567393801,GB
+3567390720,3567391865,GB
+3567391866,3567391866,PL
+3567391867,3567393801,GB
3567393802,3567393802,SI
3567393803,3567399935,GB
3567399936,3567401471,DE
3567401472,3567403007,GB
3567403008,3567419391,IT
-3567419392,3567427583,SA
3567427584,3567435775,SE
3567435776,3567453079,GB
3567453080,3567453087,ES
@@ -140881,7 +147066,9 @@
3567465984,3567466239,ES
3567466240,3567490047,GB
3567490048,3567490303,ES
-3567490304,3567499007,GB
+3567490304,3567494847,GB
+3567494848,3567494911,ES
+3567494912,3567499007,GB
3567499008,3567499135,ES
3567499136,3567499519,GB
3567499520,3567499775,ES
@@ -140953,12 +147140,10 @@
3568435200,3568443391,UA
3568443392,3568476159,NL
3568476160,3568484351,DK
-3568484352,3568486655,NL
-3568486912,3568492543,NL
+3568484352,3568492543,NL
3568492544,3568500735,RS
3568500736,3568566271,IL
-3568566272,3568585471,FR
-3568585728,3568599039,FR
+3568566272,3568599039,FR
3568599040,3568631807,PL
3568631808,3568697343,SE
3568697344,3568730111,PL
@@ -140978,10 +147163,7 @@
3569075712,3569090559,GB
3569090560,3569123327,RU
3569123328,3569156095,GB
-3569156096,3569157379,NL
-3569157381,3569165311,NL
-3569165568,3569167871,NL
-3569168128,3569188863,NL
+3569156096,3569188863,NL
3569188864,3569221631,IT
3569221632,3569287167,BE
3569287168,3569352703,PL
@@ -141247,8 +147429,7 @@
3569876992,3569942527,RS
3569942528,3570073599,DE
3570073600,3570081791,NL
-3570081792,3570098687,CH
-3570098944,3570106367,CH
+3570081792,3570106367,CH
3570106368,3570139135,PL
3570139136,3570171903,DE
3570171904,3570204671,NL
@@ -141283,7 +147464,9 @@
3571056640,3571122175,DE
3571122176,3571187711,GB
3571187712,3571253247,RU
-3571253248,3571286015,BE
+3571253248,3571264609,BE
+3571264610,3571264610,FR
+3571264611,3571286015,BE
3571286016,3571318783,DE
3571318784,3571321055,GB
3571321056,3571321071,DE
@@ -141361,8 +147544,7 @@
3572957184,3573022719,SE
3573022720,3573055487,RU
3573055488,3573088255,GB
-3573088256,3573101055,CH
-3573101312,3573153791,CH
+3573088256,3573153791,CH
3573153792,3573219327,GB
3573219328,3573252095,GR
3573252096,3573284863,NO
@@ -141412,8 +147594,7 @@
3574186800,3574186815,ES
3574186816,3574187007,GB
3574187008,3574188031,ES
-3574188032,3574190591,GB
-3574190848,3574191615,GB
+3574188032,3574191615,GB
3574191616,3574192127,ES
3574192128,3574195199,GB
3574195200,3574196223,ES
@@ -141471,64 +147652,119 @@
3575513088,3575545855,PT
3575545856,3575562239,FR
3575562240,3575578623,DE
-3575578624,3575581439,GB
-3575581696,3575589631,GB
+3575578624,3575589631,GB
3575589632,3575589887,CY
-3575589888,3575624703,GB
-3575624960,3575631103,GB
-3575631360,3575638181,GB
-3575638183,3575644159,GB
+3575589888,3575644159,GB
3575644160,3575646303,FR
3575646304,3575646319,ES
-3575646320,3575646975,FR
+3575646320,3575646679,FR
+3575646680,3575646683,PL
+3575646684,3575646815,FR
+3575646816,3575646847,PL
+3575646848,3575646911,FR
+3575646912,3575646975,PL
3575646976,3575647231,GB
-3575647232,3575648223,FR
+3575647232,3575647447,FR
+3575647448,3575647451,PL
+3575647452,3575648223,FR
3575648224,3575648255,PT
3575648256,3575652991,FR
3575652992,3575653119,GB
-3575653120,3575653711,FR
+3575653120,3575653371,FR
+3575653372,3575653375,PL
+3575653376,3575653567,FR
+3575653568,3575653631,PL
+3575653632,3575653711,FR
3575653712,3575653727,ES
3575653728,3575653759,FR
3575653760,3575653887,ES
-3575653888,3575655039,FR
+3575653888,3575654591,FR
+3575654592,3575654655,CZ
+3575654656,3575655039,FR
3575655040,3575655103,ES
3575655104,3575655615,FR
3575655616,3575655623,IE
-3575655624,3575655863,FR
+3575655624,3575655855,FR
+3575655856,3575655859,PL
+3575655860,3575655863,FR
3575655864,3575655867,ES
3575655868,3575656287,FR
3575656288,3575656319,PT
-3575656320,3575657087,FR
+3575656320,3575656575,FR
+3575656576,3575656703,BE
+3575656704,3575656911,FR
+3575656912,3575656927,NL
+3575656928,3575657087,FR
3575657088,3575657215,ES
3575657216,3575657983,FR
3575657984,3575658239,ES
3575658240,3575658303,FR
3575658304,3575658367,FI
-3575658368,3575659007,FR
+3575658368,3575658559,FR
+3575658560,3575658623,DE
+3575658624,3575658639,NL
+3575658640,3575659007,FR
3575659008,3575659071,ES
3575659072,3575659863,FR
3575659864,3575659867,GB
3575659868,3575660155,FR
3575660156,3575660159,GB
3575660160,3575660223,ES
-3575660224,3575660351,FR
+3575660224,3575660335,FR
+3575660336,3575660351,LT
3575660352,3575660415,PT
-3575660416,3575666191,FR
+3575660416,3575664959,FR
+3575664960,3575665023,BE
+3575665024,3575665039,LT
+3575665040,3575665087,FR
+3575665088,3575665151,DE
+3575665152,3575665983,FR
+3575665984,3575666047,NL
+3575666048,3575666191,FR
3575666192,3575666207,GB
-3575666208,3575667791,FR
+3575666208,3575666431,FR
+3575666432,3575666495,DE
+3575666496,3575667791,FR
3575667792,3575667807,FI
-3575667808,3575669375,FR
+3575667808,3575667903,FR
+3575667904,3575667967,CZ
+3575667968,3575668447,FR
+3575668448,3575668479,PL
+3575668480,3575669247,FR
+3575669248,3575669263,DE
+3575669264,3575669375,FR
3575669376,3575669503,IE
-3575669504,3575670911,FR
+3575669504,3575670779,FR
+3575670780,3575670783,DE
+3575670784,3575670911,FR
3575670912,3575671039,ES
3575671040,3575671103,GB
3575671104,3575671615,FR
3575671616,3575671679,FI
-3575671680,3575671855,FR
+3575671680,3575671807,BE
+3575671808,3575671855,FR
3575671856,3575671871,GB
-3575671872,3575673087,FR
+3575671872,3575671935,NL
+3575671936,3575672063,IT
+3575672064,3575672703,FR
+3575672704,3575672831,DE
+3575672832,3575672911,FR
+3575672912,3575672927,LT
+3575672928,3575672959,PL
+3575672960,3575673087,FR
3575673088,3575673343,GB
-3575673344,3575676255,FR
+3575673344,3575674831,FR
+3575674832,3575674847,LT
+3575674848,3575675215,FR
+3575675216,3575675231,PL
+3575675232,3575675295,FR
+3575675296,3575675327,LT
+3575675328,3575675391,NL
+3575675392,3575675399,FR
+3575675400,3575675407,ES
+3575675408,3575675615,FR
+3575675616,3575675647,PL
+3575675648,3575676255,FR
3575676256,3575676271,GB
3575676272,3575693311,FR
3575693312,3575697407,DE
@@ -141692,7 +147928,9 @@
3576095232,3576096767,GB
3576099072,3576099327,GB
3576099840,3576100863,GB
-3576101376,3576104911,GB
+3576101376,3576103491,GB
+3576103492,3576103495,HU
+3576103496,3576104911,GB
3576104912,3576104927,ES
3576104928,3576106879,GB
3576106880,3576106943,DE
@@ -141720,7 +147958,9 @@
3576135680,3576168447,DE
3576168448,3576233983,GB
3576233984,3576236543,FR
-3576236544,3576241991,GB
+3576236544,3576238463,GB
+3576238464,3576238464,FR
+3576238465,3576241991,GB
3576241992,3576241999,FR
3576242000,3576242383,GB
3576242384,3576242391,FR
@@ -141804,7 +148044,9 @@
3577479168,3577544703,ES
3577544704,3577545983,DE
3577545984,3577546111,SE
-3577546112,3577610239,DE
+3577546112,3577596527,DE
+3577596528,3577596543,IT
+3577596544,3577610239,DE
3577626176,3577626239,GB
3577628672,3577629695,CH
3577635840,3577636863,DE
@@ -141817,13 +148059,7 @@
3577669632,3577670655,BE
3577675776,3577741311,PT
3577741312,3578003455,SE
-3578003456,3578040319,DE
-3578040576,3578064383,DE
-3578064509,3578064510,DE
-3578064640,3578159615,DE
-3578159637,3578159637,DE
-3578159872,3578234623,DE
-3578234880,3578265599,DE
+3578003456,3578265599,DE
3578265600,3578331135,GB
3578331136,3578339327,PL
3578339328,3578347519,ES
@@ -141996,9 +148232,7 @@
3579497992,3579527167,FR
3579527168,3579543551,BA
3579543552,3579576319,BG
-3579576320,3579581821,IT
-3579581823,3579596799,IT
-3579597056,3579609087,IT
+3579576320,3579609087,IT
3579609088,3579641855,PL
3579641856,3579707391,NL
3579707392,3579723775,ES
@@ -142013,11 +148247,14 @@
3580039424,3580039515,ES
3580039516,3580039551,NL
3580039552,3580100607,ES
-3580100608,3580108799,LV
+3580100608,3580102143,SE
+3580102144,3580108799,LV
3580108800,3580112895,SE
3580112896,3580116991,LV
3580116992,3580129279,SE
-3580129280,3580134399,LV
+3580129280,3580131327,LV
+3580131328,3580132863,SE
+3580132864,3580134399,LV
3580134400,3580135423,SE
3580135424,3580136191,EE
3580136192,3580136447,SE
@@ -142037,7 +148274,7 @@
3580204032,3580204543,LT
3580204544,3580206079,SE
3580206080,3580207103,HR
-3580207104,3580208127,LV
+3580207104,3580208127,SE
3580208128,3580209151,EE
3580209152,3580213247,HR
3580213248,3580215295,LV
@@ -142052,8 +148289,7 @@
3580232448,3580233215,LT
3580233216,3580233727,SE
3580233728,3580236799,LT
-3580236800,3580237567,LV
-3580237568,3580237823,SE
+3580236800,3580237823,SE
3580237824,3580239871,LV
3580239872,3580241919,EE
3580241920,3580243967,SE
@@ -142061,14 +148297,15 @@
3580244992,3580246015,LT
3580246016,3580248063,LV
3580248064,3580254207,EE
-3580254208,3580260351,LV
+3580254208,3580255231,SE
+3580255232,3580260351,LV
3580260352,3580265471,AT
3580265472,3580265727,SE
3580265728,3580268543,EE
3580268544,3580272639,LV
3580272640,3580280831,SE
3580280832,3580297215,HR
-3580297216,3580329983,SE
+3580297216,3580329983,LT
3580329984,3580338175,EE
3580338176,3580338687,SE
3580338688,3580339199,HR
@@ -142117,7 +148354,7 @@
3580723200,3580727295,UA
3580727296,3580731391,RU
3580739584,3580743679,RU
-3580743680,3580747775,RO
+3580743680,3580747775,KZ
3580747776,3580751871,UA
3580751872,3580755967,IR
3580755968,3580772351,RU
@@ -142141,8 +148378,7 @@
3581935616,3581943807,RU
3581943808,3581951999,FR
3581952000,3581960191,TR
-3581960192,3581966849,DE
-3581966851,3581976575,DE
+3581960192,3581976575,DE
3581976576,3581984767,NO
3581984768,3581992959,RU
3581992960,3582001151,GB
@@ -142158,10 +148394,20 @@
3582074880,3582077439,GB
3582077440,3582077471,DE
3582077472,3582083071,GB
-3582083072,3582085631,BG
-3582085632,3582085887,DK
+3582083072,3582084095,BG
+3582084096,3582084351,NZ
+3582084352,3582084607,CA
+3582084608,3582085631,BG
+3582085632,3582085887,FI
3582085888,3582087167,BG
-3582087168,3582089215,DK
+3582087168,3582087423,DK
+3582087424,3582087679,ES
+3582087680,3582087935,CH
+3582087936,3582088191,SE
+3582088192,3582088447,NL
+3582088448,3582088703,IT
+3582088704,3582088959,NO
+3582088960,3582089215,PT
3582089216,3582091263,BG
3582091264,3582099455,QA
3582099456,3582107647,GB
@@ -142183,10 +148429,7 @@
3582156800,3582164991,GB
3582164992,3582173183,SE
3582173184,3582181375,GB
-3582181376,3582190927,DE
-3582190928,3582190931,FR
-3582190932,3582193151,DE
-3582193408,3582197759,DE
+3582181376,3582197759,DE
3582197760,3582205951,DK
3582205952,3582214143,AE
3582214144,3582222335,RU
@@ -142389,7 +148632,6 @@
3583713280,3583721471,CZ
3583721472,3583729663,DE
3583729664,3583737855,TR
-3583740928,3583741183,GB
3583742976,3583743487,PL
3583743616,3583743743,GB
3583744112,3583744127,SE
@@ -142398,7 +148640,6 @@
3583744512,3583744767,GB
3583744960,3583744991,GB
3583745216,3583745279,SE
-3583745280,3583745535,GB
3583745536,3583745663,CZ
3583746048,3583754239,PL
3583754240,3583762431,RU
@@ -142429,7 +148670,9 @@
3583959040,3583967231,NO
3583967232,3583969279,TR
3583969280,3583969791,FR
-3583969792,3583971327,US
+3583969792,3583970047,US
+3583970048,3583970303,CA
+3583970304,3583971327,US
3583971328,3583973887,NL
3583973888,3583974399,IT
3583974400,3583975423,TR
@@ -142454,8 +148697,7 @@
3584096256,3584098303,NL
3584098304,3584106495,SI
3584106496,3584114687,FI
-3584114688,3584120063,GB
-3584120320,3584122879,GB
+3584114688,3584122879,GB
3584122880,3584131071,PL
3584131072,3584139263,TR
3584139264,3584147455,NO
@@ -142636,12 +148878,20 @@
3585523712,3585531903,LV
3585531904,3585540095,AT
3585540096,3585548287,DE
-3585548288,3585548799,NL
-3585548800,3585549311,DE
-3585549312,3585550335,NL
-3585550336,3585550399,DE
-3585550400,3585553919,NL
-3585553920,3585555007,RU
+3585548288,3585548543,NL
+3585548544,3585548799,RU
+3585548800,3585550399,DE
+3585550400,3585550847,NL
+3585550848,3585551103,DE
+3585551104,3585551359,NL
+3585551360,3585551615,DE
+3585551616,3585552127,NL
+3585552128,3585552383,DE
+3585552384,3585552639,RU
+3585552640,3585552895,DE
+3585552896,3585553151,RU
+3585553152,3585553663,NL
+3585553664,3585555007,RU
3585555008,3585556479,NL
3585556480,3585564671,DE
3585564672,3585572863,RU
@@ -142773,8 +149023,7 @@
3586195456,3586203647,RU
3586203648,3586205695,ZA
3586205696,3586207743,BW
-3586207744,3586207999,ZA
-3586208256,3586211071,ZA
+3586207744,3586211071,ZA
3586211072,3586211327,BW
3586211328,3586211839,ZA
3586211840,3586228223,CH
@@ -142820,23 +149069,29 @@
3586588672,3586596863,IT
3586596864,3586605055,GB
3586605056,3586621439,SE
-3586621696,3586625535,NL
-3586625536,3586628127,GB
+3586621440,3586625535,NL
+3586625536,3586625711,IE
+3586625712,3586625719,GB
+3586625720,3586628118,IE
+3586628119,3586628119,GB
+3586628120,3586628127,IE
3586628128,3586628159,AT
3586628160,3586628191,IE
3586628192,3586628223,NL
3586628224,3586628255,AT
-3586628256,3586628287,IE
-3586628288,3586628319,GB
+3586628256,3586628319,IE
3586628320,3586628351,AT
-3586628352,3586629631,GB
+3586628352,3586628607,IE
+3586628608,3586629631,GB
3586629632,3586631935,IE
3586631936,3586632191,CN
3586632192,3586634047,IE
3586634048,3586634079,NL
3586634080,3586634239,IE
-3586634240,3586634751,US
-3586634752,3586634783,IE
+3586634240,3586634527,NL
+3586634528,3586634543,IE
+3586634544,3586634623,NL
+3586634624,3586634783,IE
3586634784,3586634815,NL
3586634816,3586634847,IE
3586634848,3586634911,NL
@@ -142962,8 +149217,9 @@
3587278592,3587279359,PT
3587279360,3587279615,DE
3587279616,3587280383,PT
-3587280384,3587281151,DE
-3587281152,3587284991,PT
+3587280384,3587281919,DE
+3587281920,3587282943,PT
+3587282944,3587284991,DE
3587291136,3587292159,FR
3587293184,3587309567,IT
3587309568,3587325951,GB
@@ -142977,15 +149233,17 @@
3587408128,3587408383,NL
3587408384,3587415039,BE
3587415040,3587415807,NL
-3587415808,3587420159,BE
-3587420160,3587421183,NL
-3587421184,3587421439,BE
-3587421440,3587423743,NL
+3587415808,3587422463,BE
+3587422464,3587423743,NL
3587423744,3587424255,BE
3587424256,3587440639,DE
-3587440640,3587444735,SE
+3587440640,3587441919,DK
+3587441920,3587442175,SE
+3587442176,3587442687,DK
+3587442688,3587444735,SE
3587444736,3587446783,FI
-3587446784,3587457023,SE
+3587446784,3587448831,SE
+3587448832,3587457023,DK
3587457024,3587473407,GB
3587473408,3587489791,IT
3587489792,3587506175,EG
@@ -143044,8 +149302,7 @@
3588227072,3588292607,BE
3588292608,3588308991,AT
3588308992,3588325375,NO
-3588325376,3588328191,GB
-3588328448,3588333567,GB
+3588325376,3588333567,GB
3588333568,3588341759,FR
3588341760,3588358143,IT
3588358144,3588374527,BG
@@ -143114,8 +149371,7 @@
3588890624,3588898815,GB
3588898816,3588915199,NO
3588915200,3588931583,IT
-3588931584,3588946290,RU
-3588946292,3588947967,RU
+3588931584,3588947967,RU
3588947968,3588964351,GB
3588964352,3588997119,CZ
3588997120,3589013503,AT
@@ -143127,9 +149383,7 @@
3589030120,3589030127,NL
3589030128,3589031055,GB
3589031056,3589031056,NL
-3589031057,3589034239,GB
-3589034496,3589037055,GB
-3589037312,3589046271,GB
+3589031057,3589046271,GB
3589046272,3589079039,NO
3589079040,3589128191,DK
3589128192,3589144575,GB
@@ -143197,10 +149451,7 @@
3589718016,3589722023,BE
3589722024,3589722031,FR
3589722032,3589734399,BE
-3589734400,3589738495,ZA
-3589738496,3589739519,EG
-3589739520,3589740543,GB
-3589740544,3589742591,ZA
+3589734400,3589742591,ZA
3589742592,3589746175,NL
3589746176,3589746687,US
3589746688,3589767167,NL
@@ -143213,11 +149464,10 @@
3589825810,3589826047,DE
3589826718,3589826718,AT
3589827584,3589827647,DE
-3589827712,3589827839,DE
-3589828736,3589828991,NL
+3589828736,3589828863,NL
3589828992,3589829119,ES
3589829504,3589829631,DE
-3589829632,3589830143,GB
+3589829888,3589830143,GB
3589832704,3589849087,TR
3589849088,3589865471,GB
3589865472,3589881855,GR
@@ -143256,9 +149506,13 @@
3590029312,3590032159,FR
3590032160,3590032175,ES
3590032176,3590032191,GB
-3590032192,3590032271,FR
+3590032192,3590032207,PL
+3590032208,3590032223,NL
+3590032224,3590032271,DE
3590032272,3590032295,PT
-3590032296,3590032319,FR
+3590032296,3590032303,PL
+3590032304,3590032311,CZ
+3590032312,3590032319,LT
3590032320,3590032351,ES
3590032352,3590045695,FR
3590045696,3590062079,RU
@@ -143313,7 +149567,7 @@
3590257152,3590258559,IE
3590258560,3590258687,US
3590258688,3590291455,IT
-3590291456,3590299647,EG
+3590291456,3590299647,NG
3590299648,3590307839,FI
3590307840,3590308951,GB
3590308952,3590308959,GH
@@ -143377,29 +149631,7 @@
3624357888,3624358143,KN
3624358144,3624359679,US
3624359680,3624360703,CW
-3624360704,3624374447,US
-3624374448,3624374455,ES
-3624374456,3624374559,US
-3624374560,3624374599,ES
-3624374600,3624375871,US
-3624375872,3624375879,NL
-3624375880,3624376247,US
-3624376248,3624376263,ES
-3624376264,3624376287,US
-3624376288,3624376295,GB
-3624376296,3624376335,US
-3624376336,3624376343,AU
-3624376344,3624376351,US
-3624376352,3624376359,PT
-3624376360,3624376655,US
-3624376656,3624376679,GB
-3624376680,3624377863,US
-3624377864,3624377871,GB
-3624377872,3624377879,US
-3624377880,3624377887,GB
-3624377888,3624377903,US
-3624377904,3624377911,GB
-3624377912,3624386559,US
+3624360704,3624386559,US
3624386560,3624394751,CA
3624394752,3624402943,US
3624402944,3624411135,JP
@@ -143411,9 +149643,7 @@
3624480768,3624484863,CA
3624484864,3624525823,US
3624529920,3624534015,CA
-3624534016,3624536063,US
-3624536064,3624538111,IL
-3624538112,3624540671,US
+3624534016,3624540671,US
3624540672,3624541183,GB
3624541184,3624587263,US
3624587264,3624591359,JM
@@ -143470,8 +149700,7 @@
3626332160,3626336255,CA
3626336256,3626508287,US
3626508288,3626512383,CA
-3626512384,3626513427,US
-3626513429,3626515967,US
+3626512384,3626515967,US
3626515968,3626516223,GB
3626516224,3626524671,US
3626524672,3626532863,CA
@@ -143506,12 +149735,13 @@
3627753472,3627753727,AR
3627753728,3627759071,US
3627759072,3627759103,GB
-3627759104,3627760639,US
-3627760896,3627802623,US
+3627759104,3627760127,US
+3627760128,3627760383,NL
+3627760384,3627760895,US
+3627760896,3627761151,SG
+3627761152,3627802623,US
3627802624,3627810815,CA
-3627810816,3627842047,US
-3627842048,3627842303,IS
-3627842304,3628145919,US
+3627810816,3628145919,US
3628145920,3628146175,AU
3628146176,3628153087,US
3628153088,3628153343,KW
@@ -143590,15 +149820,12 @@
3628657920,3628658175,BS
3628658176,3628679167,US
3628679168,3628683263,CA
-3628683264,3628744703,US
-3628744704,3628746751,IL
-3628746752,3628747775,US
+3628683264,3628747775,US
3628747776,3628748287,LU
3628748288,3628748799,AU
3628748800,3628834815,US
3628834816,3628843007,CA
-3628843008,3628848639,US
-3628848896,3629187071,US
+3628843008,3629187071,US
3629187072,3629195263,CA
3629195264,3629199359,US
3629199360,3629201439,CA
@@ -143788,9 +150015,7 @@
3630905600,3630905855,CA
3630905856,3630956543,US
3630956544,3631005695,CA
-3631005696,3631039487,US
-3631039488,3631039743,CA
-3631039744,3631112191,US
+3631005696,3631112191,US
3631112192,3631112703,VC
3631112704,3631116543,BB
3631116544,3631117567,GD
@@ -143810,17 +150035,7 @@
3631665152,3631667199,CA
3631667200,3631667455,US
3631667456,3631668735,CA
-3631668736,3631669807,US
-3631669808,3631669823,EC
-3631669824,3631670527,US
-3631670528,3631670783,NG
-3631670784,3631671039,EC
-3631671040,3631672063,US
-3631672064,3631672575,PY
-3631672576,3631672831,NG
-3631672832,3631673343,US
-3631673344,3631673599,GB
-3631673600,3631806207,US
+3631668736,3631806207,US
3631806208,3631806463,NL
3631806464,3631841279,US
3631841280,3631874047,CA
@@ -143894,21 +150109,24 @@
3633549568,3633549823,GA
3633549824,3633550847,US
3633550848,3633551359,GA
-3633551360,3633552127,US
-3633552384,3633757439,US
+3633551360,3633567231,US
+3633567232,3633567743,NL
+3633567744,3633568767,US
+3633568768,3633569023,SG
+3633569024,3633569279,US
+3633569280,3633569535,CA
+3633569536,3633757439,US
3633757440,3633757695,IN
3633757696,3633757951,US
3633757952,3633758207,PH
-3633758208,3633783551,US
+3633758208,3633783039,US
+3633783296,3633783551,US
3633783552,3633783807,CA
3633783808,3633815807,US
3633815808,3633816063,CA
-3633816064,3633817087,US
-3633817088,3633817343,CA
-3633817344,3633818623,US
+3633816064,3633818623,US
3633818624,3633819135,CA
-3633819136,3633820671,US
-3633820928,3633821695,US
+3633819136,3633821695,US
3633821696,3633821951,CA
3633821952,3633823743,US
3633823744,3633827839,HK
@@ -143940,7 +150158,9 @@
3634286080,3634286335,CA
3634286336,3634288895,US
3634288896,3634289151,CA
-3634289152,3634511871,US
+3634289152,3634506495,US
+3634506496,3634506751,CA
+3634506752,3634511871,US
3634511872,3634515967,CA
3634515968,3634552831,US
3634552832,3634556927,CA
@@ -143956,8 +150176,7 @@
3634925568,3634929663,CA
3634929664,3635015935,US
3635015936,3635016191,CA
-3635016192,3635044351,US
-3635048448,3635051103,US
+3635016192,3635051103,US
3635051104,3635051119,CA
3635051120,3635051439,US
3635051440,3635051455,CA
@@ -144057,8 +150276,7 @@
3635966325,3635966975,US
3635966976,3635967999,PY
3635968000,3635970047,SV
-3635970048,3636014553,US
-3636014555,3636019199,US
+3635970048,3636019199,US
3636019200,3636027391,CA
3636027392,3636031487,SG
3636031488,3636031743,US
@@ -144091,7 +150309,9 @@
3636158208,3636158215,CA
3636158216,3636158463,US
3636158464,3636158719,CA
-3636158720,3636158871,US
+3636158720,3636158815,US
+3636158816,3636158823,CA
+3636158824,3636158871,US
3636158872,3636158879,CA
3636158880,3636158959,US
3636158960,3636159743,CA
@@ -144281,7 +150501,9 @@
3639556000,3639556007,AU
3639556008,3639556015,CA
3639556016,3639556023,CO
-3639556024,3639558143,US
+3639556024,3639556055,US
+3639556056,3639556063,BR
+3639556064,3639558143,US
3639558144,3639566335,CA
3639566336,3639566847,US
3639566848,3639567103,HK
@@ -144299,7 +150521,15 @@
3639692032,3639692287,GB
3639692288,3639704573,US
3639704574,3639704574,GB
-3639704575,3639730175,US
+3639704575,3639708463,US
+3639708464,3639708464,CY
+3639708465,3639709183,US
+3639709184,3639709439,CY
+3639709440,3639711472,US
+3639711473,3639711473,CY
+3639711474,3639713535,US
+3639713536,3639713791,CY
+3639713792,3639730175,US
3639730176,3639734271,CA
3639734272,3639736575,US
3639736576,3639736831,HK
@@ -144620,12 +150850,12 @@
3641917440,3641925631,GR
3641925632,3641933823,RU
3641933824,3641937919,GB
-3641937920,3641941759,IT
+3641937920,3641942015,IT
3641942016,3641950207,DE
3641950208,3641954303,FR
3641954304,3641957119,MD
-3641957120,3641957631,GB
-3641957632,3641957887,MD
+3641957120,3641957375,GB
+3641957376,3641957887,MD
3641957888,3641958143,GB
3641958144,3641958399,MD
3641958400,3641961727,BE
@@ -144799,8 +151029,7 @@
3642486784,3642490879,GB
3642490880,3642494975,IM
3642494976,3642499071,GB
-3642499072,3642499715,SE
-3642499717,3642501119,SE
+3642499072,3642501119,SE
3642501120,3642503167,LU
3642503168,3642507263,LV
3642507264,3642509311,FR
@@ -144838,8 +151067,7 @@
3642609664,3642613759,ZA
3642613760,3642617855,FI
3642617856,3642621951,JO
-3642626048,3642628607,BE
-3642628864,3642630143,BE
+3642626048,3642630143,BE
3642630144,3642634239,DK
3642634240,3642638335,DE
3642638336,3642642431,CZ
@@ -144866,9 +151094,7 @@
3642736640,3642740735,CZ
3642740736,3642744831,DE
3642744832,3642753023,TR
-3642753024,3642857983,GB
-3642858048,3642858079,GB
-3642858240,3643801599,GB
+3642753024,3643801599,GB
3643801600,3644063743,DE
3644063744,3644325887,EG
3644325888,3644588031,IT
@@ -145011,8 +151237,7 @@
3645288896,3645288959,LU
3645288960,3645292543,FR
3645292544,3645296639,DE
-3645296640,3645297407,NL
-3645297664,3645300735,NL
+3645296640,3645300735,NL
3645300736,3645304831,BE
3645304832,3645308927,ES
3645308928,3645313023,DK
@@ -145987,8 +152212,7 @@
3645874176,3645878271,GB
3645878272,3645882367,DE
3645882368,3645886463,CH
-3645886464,3645888511,DE
-3645888768,3645890559,DE
+3645886464,3645890559,DE
3645890560,3645894655,RU
3645894656,3645898751,NL
3645898752,3646243420,DE
@@ -146002,8 +152226,7 @@
3647916800,3647917055,SE
3647917056,3647947727,DE
3647947728,3647947735,GB
-3647947736,3647949567,DE
-3647949824,3647964159,DE
+3647947736,3647964159,DE
3647964160,3647964287,ES
3647964288,3647964503,DE
3647964504,3647964511,ES
@@ -146025,11 +152248,12 @@
3647966208,3647967231,GB
3647967232,3647967759,DE
3647967760,3647967775,BE
-3647967776,3647968895,DE
-3647968896,3647968911,FR
-3647968912,3647969327,DE
+3647967776,3647968255,DE
+3647968256,3647969279,FR
+3647969280,3647969327,DE
3647969328,3647969335,IT
-3647969336,3647971327,DE
+3647969336,3647970303,DE
+3647970304,3647971327,FR
3647971328,3647972351,GB
3647972352,3647973375,IT
3647973376,3647973399,DE
@@ -146052,7 +152276,9 @@
3647976704,3647976959,BE
3647976960,3647977471,DE
3647977472,3647978495,GB
-3647978496,3647979007,NL
+3647978496,3647978511,NL
+3647978512,3647978515,DE
+3647978516,3647979007,NL
3647979008,3647979071,IT
3647979072,3647980223,DE
3647980224,3647980239,FR
@@ -146158,8 +152384,7 @@
3648192512,3648196607,DE
3648196608,3648200703,IT
3648200704,3648208895,SE
-3648208896,3648209663,DE
-3648209920,3648212991,DE
+3648208896,3648212991,DE
3648212992,3648217087,RU
3648217088,3648221183,UA
3648221184,3648225279,IE
@@ -146195,7 +152420,7 @@
3648368640,3648372735,RU
3648372736,3648376831,LU
3648376832,3648380927,CZ
-3648381184,3648385023,NL
+3648380928,3648385023,NL
3648385024,3648389119,RU
3648389120,3648393215,IT
3648393216,3648397311,DE
@@ -146253,8 +152478,7 @@
3649568768,3649634303,BE
3649634304,3649765375,GB
3649765376,3649830911,EG
-3649830912,3649831167,NL
-3649831424,3649835007,NL
+3649830912,3649835007,NL
3649835008,3649837055,ES
3649837056,3649839103,NL
3649839104,3649840127,GB
@@ -146292,8 +152516,7 @@
3650129920,3650134015,GB
3650134016,3650142207,RU
3650142208,3650150399,PL
-3650150400,3650155263,NO
-3650155520,3650158591,NO
+3650150400,3650158591,NO
3650158592,3650162687,MT
3650162688,3650166783,RU
3650166784,3650170879,BE
@@ -146322,7 +152545,8 @@
3650227712,3650227967,PT
3650227968,3650228223,AR
3650228224,3650228479,HK
-3650228480,3650229503,AT
+3650228480,3650229247,AT
+3650229248,3650229503,DE
3650229504,3650229759,LU
3650229760,3650230527,DE
3650230528,3650231295,AT
@@ -146349,13 +152573,11 @@
3650297856,3650301951,LT
3650301952,3650306047,DE
3650306048,3650314239,GB
-3650314240,3650316287,DE
-3650316544,3650318335,DE
+3650314240,3650318335,DE
3650318336,3650322431,GI
3650322432,3650330623,IT
3650330624,3650334719,UA
-3650334720,3650335231,US
-3650335232,3650336767,DE
+3650334720,3650336767,DE
3650336768,3650338815,US
3650338816,3650342911,FR
3650342912,3650347007,CH
@@ -146378,9 +152600,7 @@
3650416640,3650420735,BE
3650420736,3650424831,ES
3650424832,3650428927,RU
-3650428928,3650429714,NL
-3650429716,3650431999,NL
-3650432256,3650433023,NL
+3650428928,3650433023,NL
3650433024,3650437119,FI
3650437120,3650441215,NL
3650441216,3650445311,IT
@@ -146424,19 +152644,7 @@
3650592768,3650600959,IS
3650600960,3650605055,SE
3650605056,3650610175,DE
-3650610176,3650611711,RU
-3650611712,3650611782,LB
-3650611783,3650611783,RU
-3650611784,3650611835,LB
-3650611836,3650611836,RU
-3650611837,3650611866,LB
-3650611867,3650611867,RU
-3650611868,3650611920,LB
-3650611921,3650611921,RU
-3650611922,3650611947,LB
-3650611948,3650611948,RU
-3650611949,3650611967,LB
-3650611968,3650613247,RU
+3650610176,3650613247,RU
3650613248,3650617343,DE
3650617344,3650682879,FI
3650682880,3650748415,PL
@@ -146518,8 +152726,7 @@
3651237376,3651237631,SC
3651239936,3651272703,GB
3651272704,3651338239,CH
-3651338240,3651350783,GB
-3651351040,3651352575,GB
+3651338240,3651352575,GB
3651352576,3651353599,FR
3651353600,3651403775,GB
3651403776,3651534847,AE
@@ -146570,8 +152777,8 @@
3651874816,3651878911,PL
3651878912,3651883007,IT
3651883008,3651884543,CD
-3651884544,3651885055,BE
-3651885056,3651885311,CD
+3651884544,3651884799,BE
+3651884800,3651885311,CD
3651885312,3651885839,BE
3651885840,3651885843,CD
3651885844,3651887103,BE
@@ -146633,8 +152840,7 @@
3652126720,3652128767,UA
3652128768,3652136959,RU
3652136960,3652141055,IT
-3652141056,3652143871,GB
-3652144128,3652145151,GB
+3652141056,3652145151,GB
3652145152,3652149247,UA
3652149248,3652153343,DE
3652153344,3652157439,SE
@@ -146650,28 +152856,56 @@
3652583488,3652583503,NL
3652583504,3652583551,FR
3652583552,3652583583,FI
-3652583584,3652584447,FR
+3652583584,3652583599,LT
+3652583600,3652583615,FR
+3652583616,3652583679,DE
+3652583680,3652584447,FR
3652584448,3652584575,GB
3652584576,3652584639,IE
-3652584640,3652584895,FR
+3652584640,3652584703,NL
+3652584704,3652584767,BE
+3652584768,3652584799,PL
+3652584800,3652584831,CZ
+3652584832,3652584895,IT
3652584896,3652584927,PT
3652584928,3652584959,FR
3652584960,3652585023,ES
-3652585024,3652585087,FR
+3652585024,3652585087,DE
3652585088,3652585151,ES
-3652585152,3652585695,FR
+3652585152,3652585343,FR
+3652585344,3652585359,LT
+3652585360,3652585695,FR
3652585696,3652585727,GB
3652585728,3652585791,FR
3652585792,3652585823,FI
3652585824,3652585983,FR
3652585984,3652586047,ES
-3652586048,3652589183,FR
+3652586048,3652586079,FR
+3652586080,3652586111,CZ
+3652586112,3652587647,FR
+3652587648,3652587711,DE
+3652587712,3652588095,FR
+3652588096,3652588159,IT
+3652588160,3652589183,FR
3652589184,3652589231,ES
-3652589232,3652590783,FR
+3652589232,3652589823,FR
+3652589824,3652589839,LT
+3652589840,3652589887,FR
+3652589888,3652589919,PL
+3652589920,3652590783,FR
3652590784,3652590847,ES
3652590848,3652591615,FR
3652591616,3652591743,GB
-3652591744,3652593023,FR
+3652591744,3652591807,BE
+3652591808,3652592543,FR
+3652592544,3652592575,PL
+3652592576,3652592703,FR
+3652592704,3652592767,DE
+3652592768,3652592847,FR
+3652592848,3652592863,LT
+3652592864,3652592927,FR
+3652592928,3652592959,CZ
+3652592960,3652593023,FR
3652593024,3652593055,PT
3652593056,3652593215,FR
3652593216,3652593279,IE
@@ -146679,13 +152913,27 @@
3652593408,3652593471,ES
3652593472,3652593631,FR
3652593632,3652593663,PT
-3652593664,3652595167,FR
+3652593664,3652595007,FR
+3652595008,3652595071,DE
+3652595072,3652595167,FR
3652595168,3652595183,ES
-3652595184,3652596479,FR
+3652595184,3652595871,FR
+3652595872,3652595935,PL
+3652595936,3652596351,FR
+3652596352,3652596415,IT
+3652596416,3652596479,FR
3652596480,3652596543,ES
-3652596544,3652597887,FR
+3652596544,3652596799,FR
+3652596800,3652596831,CZ
+3652596832,3652597183,FR
+3652597184,3652597247,DE
+3652597248,3652597407,FR
+3652597408,3652597439,PL
+3652597440,3652597887,FR
3652597888,3652597903,GB
-3652597904,3652601855,FR
+3652597904,3652599679,FR
+3652599680,3652599743,IT
+3652599744,3652601855,FR
3652601856,3652603903,PL
3652603904,3652608191,FR
3652608192,3652608223,PT
@@ -146693,43 +152941,91 @@
3652609024,3652609279,GB
3652609280,3652609503,FR
3652609504,3652609535,FI
-3652609536,3652609919,FR
+3652609536,3652609727,FR
+3652609728,3652609759,PL
+3652609760,3652609791,CZ
+3652609792,3652609823,FR
+3652609824,3652609855,CZ
+3652609856,3652609919,FR
3652609920,3652609983,ES
-3652609984,3652611135,FR
+3652609984,3652610047,BE
+3652610048,3652611135,FR
3652611136,3652611199,ES
3652611200,3652611231,FR
3652611232,3652611263,PT
3652611264,3652611679,FR
3652611680,3652611711,PT
-3652611712,3652612223,FR
+3652611712,3652611775,NL
+3652611776,3652612223,FR
3652612224,3652612287,ES
3652612288,3652612351,FR
3652612352,3652612479,GB
3652612480,3652612543,IE
-3652612544,3652613375,FR
+3652612544,3652612607,NL
+3652612608,3652613375,FR
3652613376,3652613407,FI
-3652613408,3652620671,FR
+3652613408,3652613679,FR
+3652613680,3652613695,LT
+3652613696,3652614015,FR
+3652614016,3652614079,BE
+3652614080,3652615871,FR
+3652615872,3652615935,DE
+3652615936,3652620639,FR
+3652620640,3652620671,CZ
3652620672,3652620735,PT
3652620736,3652620799,FR
3652620800,3652620831,PT
-3652620832,3652621375,FR
+3652620832,3652621247,FR
+3652621248,3652621311,DE
+3652621312,3652621375,FR
3652621376,3652621439,ES
-3652621440,3652622271,FR
+3652621440,3652621503,FR
+3652621504,3652621567,IT
+3652621568,3652621631,FR
+3652621632,3652621663,PT
+3652621664,3652621823,FR
+3652621824,3652621951,IE
+3652621952,3652622271,FR
3652622272,3652622335,GB
-3652622336,3652629743,FR
+3652622336,3652622879,FR
+3652622880,3652622911,CZ
+3652622912,3652623679,FR
+3652623680,3652623807,NL
+3652623808,3652624191,FR
+3652624192,3652624319,IT
+3652624320,3652628479,FR
+3652628480,3652628543,IT
+3652628544,3652628607,FR
+3652628608,3652628639,PL
+3652628640,3652629743,FR
3652629744,3652629759,ES
3652629760,3652630015,FR
3652630016,3652630031,ES
-3652630032,3652631807,FR
+3652630032,3652630079,FR
+3652630080,3652630111,PL
+3652630112,3652631295,FR
+3652631296,3652631359,BE
+3652631360,3652631423,FR
+3652631424,3652631455,PL
+3652631456,3652631551,FR
+3652631552,3652631583,CZ
+3652631584,3652631807,FR
3652631808,3652631823,GB
3652631824,3652632031,FR
3652632032,3652632063,PT
-3652632064,3652638655,FR
+3652632064,3652633599,FR
+3652633600,3652634623,DE
+3652634624,3652635647,PL
+3652635648,3652638655,FR
3652638656,3652638719,ES
3652638720,3652638815,FR
3652638816,3652638847,FI
3652638848,3652638975,GB
-3652638976,3652640575,FR
+3652638976,3652639359,FR
+3652639360,3652639423,DE
+3652639424,3652639679,FR
+3652639680,3652639807,NL
+3652639808,3652640575,FR
3652640576,3652640703,GB
3652640704,3652640767,FR
3652640768,3652640831,ES
@@ -146737,33 +153033,50 @@
3652641728,3652641791,GB
3652641792,3652642111,FR
3652642112,3652642175,IE
-3652642176,3652642367,FR
+3652642176,3652642239,FR
+3652642240,3652642303,DE
+3652642304,3652642367,FR
3652642368,3652642431,GB
3652642432,3652642719,FR
3652642720,3652642751,PT
3652642752,3652642975,FR
3652642976,3652643007,IE
-3652643008,3652643583,FR
+3652643008,3652643519,FR
+3652643520,3652643583,NL
3652643584,3652643647,ES
-3652643648,3652644199,FR
+3652643648,3652644031,FR
+3652644032,3652644063,BE
+3652644064,3652644199,FR
3652644200,3652644215,ES
-3652644216,3652644247,FR
+3652644216,3652644223,FR
+3652644224,3652644239,NL
+3652644240,3652644247,FR
3652644248,3652644255,ES
3652644256,3652644351,FR
3652644352,3652644383,FI
-3652644384,3652645119,FR
+3652644384,3652644415,PL
+3652644416,3652644575,FR
+3652644576,3652644607,DE
+3652644608,3652645119,FR
3652645120,3652645503,GB
3652645504,3652645663,FR
3652645664,3652645695,FI
-3652645696,3652646015,FR
+3652645696,3652645887,FR
+3652645888,3652646015,NL
3652646016,3652646079,ES
-3652646080,3652646655,FR
+3652646080,3652646111,FR
+3652646112,3652646143,CZ
+3652646144,3652646271,NL
+3652646272,3652646655,FR
3652646656,3652646719,ES
-3652646720,3652646847,FR
+3652646720,3652646799,FR
+3652646800,3652646815,PL
+3652646816,3652646847,FR
3652646848,3652646863,FI
-3652646864,3652648863,FR
+3652646864,3652648847,FR
+3652648848,3652648863,LT
3652648864,3652648895,FI
-3652648896,3652648959,FR
+3652648896,3652648959,DE
3652648960,3652714495,IE
3652714496,3653238783,DE
3653238784,3653369855,CH
@@ -146775,6 +153088,7 @@
3653378571,3653378655,DK
3653378656,3653378656,DE
3653378657,3653378674,DK
+3653378675,3653378675,DE
3653378676,3653378815,DK
3653378816,3653382143,DE
3653382144,3653386239,CH
@@ -146805,7 +153119,6 @@
3653451776,3653464063,RU
3653464064,3653468159,NL
3653468160,3653472255,GR
-3653473024,3653473279,US
3653476352,3653480447,CZ
3653480448,3653484543,DK
3653484544,3653488639,TR
@@ -146871,24 +153184,19 @@
3653758976,3653763071,RU
3653763072,3654025215,IT
3654025216,3654287359,GB
-3654287360,3654607103,SE
-3654607104,3654607359,DE
-3654607360,3654608404,SE
+3654287360,3654608404,SE
3654608405,3654608405,NO
3654608406,3654608895,SE
3654608896,3654609919,NO
3654609920,3654610431,SE
3654610432,3654610943,FR
-3654610944,3654611199,SE
-3654611200,3654611455,NL
-3654611456,3654612271,SE
+3654610944,3654612271,SE
3654612272,3654612287,AT
3654612288,3654614047,SE
3654614048,3654614063,GB
3654614064,3654614079,SE
3654614080,3654614271,FI
-3654614272,3654614527,NL
-3654614528,3654811647,SE
+3654614272,3654811647,SE
3654811648,3654942719,ES
3654942720,3655073791,IR
3655073792,3655335935,IT
@@ -146981,8 +153289,7 @@
3671130112,3671195647,KR
3671195648,3671326719,TW
3671326720,3671392255,SG
-3671392256,3671411711,HK
-3671411968,3671457791,HK
+3671392256,3671457791,HK
3671457792,3671588863,AU
3671588864,3672637439,JP
3672637440,3673161727,KR
@@ -147022,9 +153329,7 @@
3680436224,3680501759,MY
3680501760,3680883711,JP
3680883712,3680883967,NZ
-3680883968,3682554623,JP
-3682554771,3682554771,JP
-3682554880,3682598911,JP
+3680883968,3682598911,JP
3682598912,3684575268,CN
3684575269,3684575269,HK
3684575270,3684696063,CN
@@ -147072,8 +153377,7 @@
3701392384,3701393407,HK
3701393408,3701394431,MY
3701394432,3701395455,BD
-3701395456,3701395709,MY
-3701395711,3701396479,MY
+3701395456,3701396479,MY
3701396480,3701397503,NZ
3701397504,3701398527,JP
3701398528,3701399551,MV
@@ -147094,8 +153398,7 @@
3706126336,3706142719,CN
3706142720,3706159103,VN
3706159104,3706191871,CN
-3706191872,3706206959,SG
-3706206976,3706207107,SG
+3706191872,3706207107,SG
3706207108,3706207108,US
3706207109,3706208255,SG
3706208256,3706224639,CN
@@ -147127,7 +153430,7 @@
3707207680,3707208703,BD
3707208704,3707209727,NZ
3707209728,3707211775,CN
-3707211776,3707215871,VN
+3707211776,3707215871,TW
3707215872,3707217919,BD
3707217920,3707219967,ID
3707219968,3707222015,AU
@@ -147364,7 +153667,9 @@
3755999232,3757047807,IN
3757047808,3757834239,CN
3757834240,3757850623,AU
-3757850624,3757867007,JP
+3757850624,3757858815,JP
+3757858816,3757862911,AU
+3757862912,3757867007,JP
3757867008,3757875519,CN
3757875520,3757875583,HK
3757875584,3757899775,CN
diff --git a/src/config/geoip6 b/src/config/geoip6
index 2b2699ea97..ed7f7663b9 100644
--- a/src/config/geoip6
+++ b/src/config/geoip6
@@ -1,4 +1,4 @@
-# Last updated based on June 8 2017 Maxmind GeoLite2 Country
+# Last updated based on August 3 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
@@ -27,7 +27,7 @@
2001:2a0::,2001:2a0:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:2a8::,2001:2a8:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:2b0::,2001:2b0:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:2b8::,2001:2b8:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2001:2b8::,2001:2b9:ffff:ffff:ffff:ffff:ffff:ffff,KR
2001:2c0::,2001:2c0:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:2c8::,2001:2c8:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:2d8::,2001:2d8:ffff:ffff:ffff:ffff:ffff:ffff,KR
@@ -104,7 +104,9 @@
2001:470:d:2000::,2001:470:18:ffff:ffff:ffff:ffff:ffff,US
2001:470:19::,2001:470:19:3ff:ffff:ffff:ffff:ffff,CN
2001:470:19:400::,2001:470:19:7ff:ffff:ffff:ffff:ffff,US
-2001:470:19:800::,2001:470:19:fff:ffff:ffff:ffff:ffff,CN
+2001:470:19:800::,2001:470:19:e7f:ffff:ffff:ffff:ffff,CN
+2001:470:19:e80::,2001:470:19:e80:ffff:ffff:ffff:ffff,HK
+2001:470:19:e81::,2001:470:19:fff:ffff:ffff:ffff:ffff,CN
2001:470:19:1000::,2001:470:19:1fff:ffff:ffff:ffff:ffff,HK
2001:470:19:2000::,2001:470:1c:ffff:ffff:ffff:ffff:ffff,US
2001:470:1d::,2001:470:1d:7fff:ffff:ffff:ffff:ffff,CA
@@ -112,7 +114,9 @@
2001:470:23:42a::,2001:470:23:42a:ffff:ffff:ffff:ffff,RU
2001:470:23:42b::,2001:470:26:65b:ffff:ffff:ffff:ffff,US
2001:470:26:65c::,2001:470:26:65c:ffff:ffff:ffff:ffff,CH
-2001:470:26:65d::,2001:470:26:b6c:ffff:ffff:ffff:ffff,US
+2001:470:26:65d::,2001:470:26:825:ffff:ffff:ffff:ffff,US
+2001:470:26:826::,2001:470:26:826:ffff:ffff:ffff:ffff,CH
+2001:470:26:827::,2001:470:26:b6c:ffff:ffff:ffff:ffff,US
2001:470:26:b6d::,2001:470:26:b6d:ffff:ffff:ffff:ffff,AT
2001:470:26:b6e::,2001:470:27:1a5:ffff:ffff:ffff:ffff,US
2001:470:27:1a6::,2001:470:27:1a6:ffff:ffff:ffff:ffff,RU
@@ -200,7 +204,9 @@
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
2001:470:1f1d::,2001:470:1f1d:7fff:ffff:ffff:ffff:ffff,GB
-2001:470:1f1d:8000::,2001:470:207f:ffff:ffff:ffff:ffff:ffff,US
+2001:470:1f1d:8000::,2001:470:1f21:37:ffff:ffff:ffff:ffff,US
+2001:470:1f21:38::,2001:470:1f21:38:ffff:ffff:ffff:ffff,PT
+2001:470:1f21:39::,2001:470:207f:ffff:ffff:ffff:ffff:ffff,US
2001:470:2080::,2001:470:2080:7fff:ffff:ffff:ffff:ffff,UA
2001:470:2080:8000::,2001:470:2092:ffff:ffff:ffff:ffff:ffff,US
2001:470:2093::,2001:470:2093:7fff:ffff:ffff:ffff:ffff,SI
@@ -214,7 +220,9 @@
2001:470:4a64::,2001:470:4a64:ffff:ffff:ffff:ffff:ffff,NZ
2001:470:4a65::,2001:470:53a7:ffff:ffff:ffff:ffff:ffff,US
2001:470:53a8::,2001:470:53a8:7fff:ffff:ffff:ffff:ffff,DE
-2001:470:53a8:8000::,2001:470:587d:ffff:ffff:ffff:ffff:ffff,US
+2001:470:53a8:8000::,2001:470:581f:ffff:ffff:ffff:ffff:ffff,US
+2001:470:5820::,2001:470:5820:ffff:ffff:ffff:ffff:ffff,CZ
+2001:470:5821::,2001:470:587d:ffff:ffff:ffff:ffff:ffff,US
2001:470:587e::,2001:470:587e:7fff:ffff:ffff:ffff:ffff,CZ
2001:470:587e:8000::,2001:470:591a:ffff:ffff:ffff:ffff:ffff,US
2001:470:591b::,2001:470:591b:7fff:ffff:ffff:ffff:ffff,CZ
@@ -448,8 +456,8 @@
2001:504::,2001:504:1:ffff:ffff:ffff:ffff:ffff,US
2001:504:a::,2001:504:13:ffff:ffff:ffff:ffff:ffff,US
2001:504:15::,2001:504:15:ffff:ffff:ffff:ffff:ffff,CA
-2001:504:16::,2001:504:19:ffff:ffff:ffff:ffff:ffff,US
-2001:504:1a::,2001:504:1a:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:16::,2001:504:18:ffff:ffff:ffff:ffff:ffff,US
+2001:504:19::,2001:504:1a:ffff:ffff:ffff:ffff:ffff,CA
2001:504:1b::,2001:504:1c:ffff:ffff:ffff:ffff:ffff,US
2001:504:1d::,2001:504:1d:ffff:ffff:ffff:ffff:ffff,PR
2001:504:20::,2001:504:23:ffff:ffff:ffff:ffff:ffff,CA
@@ -478,6 +486,7 @@
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:504:70::,2001:504:71:ffff:ffff:ffff:ffff:ffff,US
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
@@ -609,6 +618,7 @@
2001:678:e4::,2001:678:e4:ffff:ffff:ffff:ffff:ffff,SE
2001:678:e8::,2001:678:e8:ffff:ffff:ffff:ffff:ffff,CZ
2001:678:ec::,2001:678:ec:ffff:ffff:ffff:ffff:ffff,RU
+2001:678:f0::,2001:678:f0:ffff:ffff:ffff:ffff:ffff,PL
2001:678:f4::,2001:678:f4:ffff:ffff:ffff:ffff:ffff,RU
2001:678:f8::,2001:678:f8:ffff:ffff:ffff:ffff:ffff,DE
2001:678:fc::,2001:678:fc:ffff:ffff:ffff:ffff:ffff,LT
@@ -688,7 +698,6 @@
2001:678:228::,2001:678:228:ffff:ffff:ffff:ffff:ffff,SE
2001:678:22c::,2001:678:22c:ffff:ffff:ffff:ffff:ffff,DE
2001:678:230::,2001:678:230:ffff:ffff:ffff:ffff:ffff,NL
-2001:678:234::,2001:678:234:ffff:ffff:ffff:ffff:ffff,AT
2001:678:238::,2001:678:238:ffff:ffff:ffff:ffff:ffff,PL
2001:678:23c::,2001:678:23c:ffff:ffff:ffff:ffff:ffff,PL
2001:678:240::,2001:678:240:ffff:ffff:ffff:ffff:ffff,SE
@@ -761,7 +770,6 @@
2001:678:35c::,2001:678:35c:ffff:ffff:ffff:ffff:ffff,DE
2001:678:360::,2001:678:360:ffff:ffff:ffff:ffff:ffff,DE
2001:678:364::,2001:678:364:ffff:ffff:ffff:ffff:ffff,PL
-2001:678:368::,2001:678:368:ffff:ffff:ffff:ffff:ffff,DE
2001:678:36c::,2001:678:36c:ffff:ffff:ffff:ffff:ffff,DE
2001:678:370::,2001:678:370:ffff:ffff:ffff:ffff:ffff,DE
2001:678:374::,2001:678:374:ffff:ffff:ffff:ffff:ffff,UA
@@ -834,6 +842,34 @@
2001:678:484::,2001:678:484:ffff:ffff:ffff:ffff:ffff,GB
2001:678:488::,2001:678:488:ffff:ffff:ffff:ffff:ffff,GB
2001:678:48c::,2001:678:48c:ffff:ffff:ffff:ffff:ffff,RU
+2001:678:490::,2001:678:490:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:494::,2001:678:494:ffff:ffff:ffff:ffff:ffff,RU
+2001:678:498::,2001:678:498:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:49c::,2001:678:49c:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:4a0::,2001:678:4a0:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:4a4::,2001:678:4a4:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:4a8::,2001:678:4a8:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4ac::,2001:678:4ac:ffff:ffff:ffff:ffff:ffff,RU
+2001:678:4b0::,2001:678:4b0:ffff:ffff:ffff:ffff:ffff,SE
+2001:678:4b4::,2001:678:4b4:ffff:ffff:ffff:ffff:ffff,PL
+2001:678:4b8::,2001:678:4b8:ffff:ffff:ffff:ffff:ffff,UA
+2001:678:4bc::,2001:678:4bc:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:4c0::,2001:678:4c0:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4c4::,2001:678:4c4:ffff:ffff:ffff:ffff:ffff,CH
+2001:678:4c8::,2001:678:4c8:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4cc::,2001:678:4cc:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4d0::,2001:678:4d0:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4d4::,2001:678:4d4:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4d8::,2001:678:4d8:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:4dc::,2001:678:4dc:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4e0::,2001:678:4e0:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4e4::,2001:678:4e4:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4e8::,2001:678:4e8:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4ec::,2001:678:4ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4f0::,2001:678:4f0:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4f4::,2001:678:4f4:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:4f8::,2001:678:4f8:ffff:ffff:ffff:ffff:ffff,RU
+2001:678:4fc::,2001:678:4fc:ffff:ffff:ffff:ffff:ffff,DE
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
@@ -842,6 +878,7 @@
2001:67c:14::,2001:67c:14:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:18::,2001:67c:18:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:1c::,2001:67c:1c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:20::,2001:67c:20:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:24::,2001:67c:24:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:28::,2001:67c:28:ffff:ffff:ffff:ffff:ffff,UA
2001:67c:2c::,2001:67c:2c:ffff:ffff:ffff:ffff:ffff,NL
@@ -1131,6 +1168,7 @@
2001:67c:4a0::,2001:67c:4a0:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:4a4::,2001:67c:4a4:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:4a8::,2001:67c:4a8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:4ac::,2001:67c:4ac:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:4b0::,2001:67c:4b0:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:4b8::,2001:67c:4b8:ffff:ffff:ffff:ffff:ffff,CH
2001:67c:4bc::,2001:67c:4bc:ffff:ffff:ffff:ffff:ffff,SE
@@ -1306,6 +1344,7 @@
2001:67c:770::,2001:67c:770:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:774::,2001:67c:774:ffff:ffff:ffff:ffff:ffff,NO
2001:67c:778::,2001:67c:778:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:77c::,2001:67c:77c:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:780::,2001:67c:780:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:784::,2001:67c:784:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:788::,2001:67c:788:ffff:ffff:ffff:ffff:ffff,GB
@@ -1419,7 +1458,6 @@
2001:67c:1174::,2001:67c:1174:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:1178::,2001:67c:1178:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:117c::,2001:67c:117c:ffff:ffff:ffff:ffff:ffff,UA
-2001:67c:1180::,2001:67c:1180:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:1184::,2001:67c:1184:ffff:ffff:ffff:ffff:ffff,HR
2001:67c:1188::,2001:67c:1188:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:118c::,2001:67c:118c:ffff:ffff:ffff:ffff:ffff,FR
@@ -1901,6 +1939,7 @@
2001:67c:1b7c::,2001:67c:1b7c:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:1b80::,2001:67c:1b80:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:1b84::,2001:67c:1b84:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1b88::,2001:67c:1b88:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:1b8c::,2001:67c:1b8c:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:1b90::,2001:67c:1b90:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:1b94::,2001:67c:1b94:ffff:ffff:ffff:ffff:ffff,UA
@@ -1921,7 +1960,6 @@
2001:67c:1bd0::,2001:67c:1bd0:ffff:ffff:ffff:ffff:ffff,CH
2001:67c:1bd4::,2001:67c:1bd4:ffff:ffff:ffff:ffff:ffff,SK
2001:67c:1bd8::,2001:67c:1bd8:ffff:ffff:ffff:ffff:ffff,DE
-2001:67c:1bdc::,2001:67c:1bdc:ffff:ffff:ffff:ffff:ffff,RO
2001:67c:1be0::,2001:67c:1be0:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:1be4::,2001:67c:1be4:ffff:ffff:ffff:ffff:ffff,FR
2001:67c:1be8::,2001:67c:1be8:ffff:ffff:ffff:ffff:ffff,FI
@@ -2219,7 +2257,6 @@
2001:67c:2498::,2001:67c:2498:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:249c::,2001:67c:249c:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:24a0::,2001:67c:24a0:ffff:ffff:ffff:ffff:ffff,CZ
-2001:67c:24a4::,2001:67c:24a4:ffff:ffff:ffff:ffff:ffff,CZ
2001:67c:24a8::,2001:67c:24a8:ffff:ffff:ffff:ffff:ffff,UA
2001:67c:24ac::,2001:67c:24ac:ffff:ffff:ffff:ffff:ffff,GB
2001:67c:24b0::,2001:67c:24b0:ffff:ffff:ffff:ffff:ffff,DE
@@ -2274,8 +2311,8 @@
2001:67c:2594::,2001:67c:2594:ffff:ffff:ffff:ffff:ffff,CZ
2001:67c:2598::,2001:67c:2598:ffff:ffff:ffff:ffff:ffff,NO
2001:67c:259c::,2001:67c:259c:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:25a0::,2001:67c:25a0:ffff:ffff:ffff:ffff:ffff,RO
2001:67c:25a4::,2001:67c:25a4:ffff:ffff:ffff:ffff:ffff,SE
-2001:67c:25a8::,2001:67c:25a8:ffff:ffff:ffff:ffff:ffff,GB
2001:67c:25ac::,2001:67c:25ac:ffff:ffff:ffff:ffff:ffff,PL
2001:67c:25b0::,2001:67c:25b0:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:25b4::,2001:67c:25b4:ffff:ffff:ffff:ffff:ffff,SE
@@ -2484,6 +2521,7 @@
2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,LT
2001:67c:28fc::,2001:67c:28fc:ffff:ffff:ffff:ffff:ffff,NL
2001:67c:2900::,2001:67c:291f:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2980::,2001:67c:2980:ffff:ffff:ffff:ffff:ffff,LV
2001:67c:2984::,2001:67c:2984:ffff:ffff:ffff:ffff:ffff,CH
2001:67c:2988::,2001:67c:2989:ffff:ffff:ffff:ffff:ffff,TR
2001:67c:2990::,2001:67c:2990:ffff:ffff:ffff:ffff:ffff,GB
@@ -2571,7 +2609,6 @@
2001:67c:2ae8::,2001:67c:2ae8:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:2aec::,2001:67c:2aec:ffff:ffff:ffff:ffff:ffff,AT
2001:67c:2af0::,2001:67c:2af0:ffff:ffff:ffff:ffff:ffff,SE
-2001:67c:2af4::,2001:67c:2af4:ffff:ffff:ffff:ffff:ffff,RU
2001:67c:2af8::,2001:67c:2af8:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2afc::,2001:67c:2afc:ffff:ffff:ffff:ffff:ffff,SI
2001:67c:2b04::,2001:67c:2b04:ffff:ffff:ffff:ffff:ffff,AT
@@ -2626,6 +2663,7 @@
2001:67c:2bd0::,2001:67c:2bd0:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2bd4::,2001:67c:2bd4:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2bdc::,2001:67c:2bdc:ffff:ffff:ffff:ffff:ffff,DE
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
@@ -2687,7 +2725,6 @@
2001:67c:2cf4::,2001:67c:2cf4:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2cf8::,2001:67c:2cf8:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2cfc::,2001:67c:2cfc:ffff:ffff:ffff:ffff:ffff,SE
-2001:67c:2d00::,2001:67c:2d00:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2d04::,2001:67c:2d04:ffff:ffff:ffff:ffff:ffff,SE
2001:67c:2d08::,2001:67c:2d08:ffff:ffff:ffff:ffff:ffff,DE
2001:67c:2d0c::,2001:67c:2d0c:ffff:ffff:ffff:ffff:ffff,DE
@@ -2936,7 +2973,7 @@
2001:7d0:8cc2::,2001:7d0:ffff:ffff:ffff:ffff:ffff:ffff,EE
2001:7d8::,2001:7d8:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:7e0::,2001:7e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:7e8::,2001:7e8:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2001:7e8::,2001:7ef:ffff:ffff:ffff:ffff:ffff:ffff,LU
2001:7f8::,2001:7f8::ffff:ffff:ffff:ffff:ffff,DE
2001:7f8:1::,2001:7f8:1:ffff:ffff:ffff:ffff:ffff,NL
2001:7f8:2::,2001:7f8:2:ffff:ffff:ffff:ffff:ffff,IT
@@ -3105,6 +3142,9 @@
2001:7f8:b1::,2001:7f8:b1:ffff:ffff:ffff:ffff:ffff,FR
2001:7f8:b2::,2001:7f8:b2:ffff:ffff:ffff:ffff:ffff,CZ
2001:7f8:b3::,2001:7f8:b3:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:b4::,2001:7f8:b4:ffff:ffff:ffff:ffff:ffff,LT
+2001:7f8:b5::,2001:7f8:b5:ffff:ffff:ffff:ffff:ffff,CH
+2001:7f8:b6::,2001:7f8:b6:ffff:ffff:ffff:ffff:ffff,NL
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
@@ -3252,7 +3292,10 @@
2001:ac8:34::,2001:ac8:34:ffff:ffff:ffff:ffff:ffff,GB
2001:ac8:35::,2001:ac8:35:ffff:ffff:ffff:ffff:ffff,ES
2001:ac8:36::,2001:ac8:36:ffff:ffff:ffff:ffff:ffff,DE
-2001:ac8:37::,2001:ac8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:ac8:37::,2001:ac8:37:ffff:ffff:ffff:ffff:ffff,DK
+2001:ac8:38::,2001:ac8:38:ffff:ffff:ffff:ffff:ffff,NO
+2001:ac8:39::,2001:ac8:39:ffff:ffff:ffff:ffff:ffff,IT
+2001:ac8:3a::,2001:ac8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:ad0::,2001:ad0:ffff:ffff:ffff:ffff:ffff:ffff,EE
2001:ad8::,2001:ae1:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:ae8::,2001:ae8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -3417,7 +3460,7 @@
2001:ded::,2001:ded::ffff:ffff:ffff:ffff:ffff,SG
2001:ded:8000::,2001:ded:8000:ffff:ffff:ffff:ffff:ffff,IN
2001:dee::,2001:dee::ffff:ffff:ffff:ffff:ffff,HK
-2001:dee:8000::,2001:dee:8000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:dee:8000::,2001:dee:8001:ffff:ffff:ffff:ffff:ffff,NZ
2001:def::,2001:def::ffff:ffff:ffff:ffff:ffff,HK
2001:df0::,2001:df0:1:ffff:ffff:ffff:ffff:ffff,NZ
2001:df0:2::,2001:df0:2:ffff:ffff:ffff:ffff:ffff,JP
@@ -3955,7 +3998,6 @@
2001:df0:c400::,2001:df0:c400:ffff:ffff:ffff:ffff:ffff,IN
2001:df0:c500::,2001:df0:c500:ffff:ffff:ffff:ffff:ffff,ID
2001:df0:c600::,2001:df0:c600:ffff:ffff:ffff:ffff:ffff,IN
-2001:df0:c700::,2001:df0:c700:ffff:ffff:ffff:ffff:ffff,SG
2001:df0:c800::,2001:df0:c800:ffff:ffff:ffff:ffff:ffff,AU
2001:df0:c900::,2001:df0:c900:ffff:ffff:ffff:ffff:ffff,PK
2001:df0:ca00::,2001:df0:ca00:ffff:ffff:ffff:ffff:ffff,AU
@@ -4053,7 +4095,6 @@
2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:2d00::,2001:df1:2d00:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:2e00::,2001:df1:2e00:ffff:ffff:ffff:ffff:ffff,IN
-2001:df1:2f00::,2001:df1:2f00:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:3000::,2001:df1:3000:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:3100::,2001:df1:3100:ffff:ffff:ffff:ffff:ffff,SG
2001:df1:3200::,2001:df1:3200:ffff:ffff:ffff:ffff:ffff,VN
@@ -4092,92 +4133,183 @@
2001:df1:5300::,2001:df1:5300:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:5500::,2001:df1:5500:ffff:ffff:ffff:ffff:ffff,MM
2001:df1:5600::,2001:df1:5600:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:5700::,2001:df1:5700:ffff:ffff:ffff:ffff:ffff,NZ
2001:df1:5800::,2001:df1:5800:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:5900::,2001:df1:5900:ffff:ffff:ffff:ffff:ffff,MY
2001:df1:5a00::,2001:df1:5a00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:5b00::,2001:df1:5b00:ffff:ffff:ffff:ffff:ffff,PH
2001:df1:5c00::,2001:df1:5c00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:5d00::,2001:df1:5d00:ffff:ffff:ffff:ffff:ffff,SG
2001:df1:5e00::,2001:df1:5e00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:5f00::,2001:df1:5f00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:6000::,2001:df1:6000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:6100::,2001:df1:6100:ffff:ffff:ffff:ffff:ffff,PH
2001:df1:6200::,2001:df1:6200:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:6300::,2001:df1:6300:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:6400::,2001:df1:6400:ffff:ffff:ffff:ffff:ffff,TH
+2001:df1:6500::,2001:df1:6500:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:6600::,2001:df1:6600:ffff:ffff:ffff:ffff:ffff,MY
+2001:df1:6700::,2001:df1:6700:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:6800::,2001:df1:6800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:6900::,2001:df1:6900:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:6a00::,2001:df1:6a00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:6b00::,2001:df1:6b00:ffff:ffff:ffff:ffff:ffff,BD
2001:df1:6c00::,2001:df1:6c00:ffff:ffff:ffff:ffff:ffff,TH
+2001:df1:6d00::,2001:df1:6d00:ffff:ffff:ffff:ffff:ffff,NZ
2001:df1:6e00::,2001:df1:6e00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:6f00::,2001:df1:6f00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:7000::,2001:df1:7000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:7100::,2001:df1:7100:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:7200::,2001:df1:7200:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:7300::,2001:df1:7300:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:7400::,2001:df1:7400:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:7500::,2001:df1:7500:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:7600::,2001:df1:7600:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:7700::,2001:df1:7700:ffff:ffff:ffff:ffff:ffff,TH
2001:df1:7800::,2001:df1:7800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:7900::,2001:df1:7900:ffff:ffff:ffff:ffff:ffff,HK
2001:df1:7a00::,2001:df1:7a00:ffff:ffff:ffff:ffff:ffff,NP
+2001:df1:7b00::,2001:df1:7b00:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:7c00::,2001:df1:7c00:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df1:7d00::,2001:df1:7d00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:7e00::,2001:df1:7e00:ffff:ffff:ffff:ffff:ffff,MM
+2001:df1:7f00::,2001:df1:7f00:ffff:ffff:ffff:ffff:ffff,HK
2001:df1:8000::,2001:df1:8000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:8100::,2001:df1:8100:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:8200::,2001:df1:8200:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:8300::,2001:df1:8300:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:8400::,2001:df1:8400:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:8500::,2001:df1:8500:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:8600::,2001:df1:8600:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:8700::,2001:df1:8700:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:8800::,2001:df1:8800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:8900::,2001:df1:8900:ffff:ffff:ffff:ffff:ffff,SG
2001:df1:8a00::,2001:df1:8a00:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:8b00::,2001:df1:8b00:ffff:ffff:ffff:ffff:ffff,CN
2001:df1:8c00::,2001:df1:8c00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:8d00::,2001:df1:8d00:ffff:ffff:ffff:ffff:ffff,NZ
2001:df1:8e00::,2001:df1:8e00:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:8f00::,2001:df1:8f00:ffff:ffff:ffff:ffff:ffff,BD
2001:df1:9000::,2001:df1:9000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:9100::,2001:df1:9100:ffff:ffff:ffff:ffff:ffff,PK
2001:df1:9200::,2001:df1:9200:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:9300::,2001:df1:9300:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:9400::,2001:df1:9400:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:9500::,2001:df1:9500:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:9600::,2001:df1:9600:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:9700::,2001:df1:9700:ffff:ffff:ffff:ffff:ffff,MY
2001:df1:9800::,2001:df1:9800:ffff:ffff:ffff:ffff:ffff,MY
+2001:df1:9900::,2001:df1:9900:ffff:ffff:ffff:ffff:ffff,BD
2001:df1:9a00::,2001:df1:9a00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:9b00::,2001:df1:9b00:ffff:ffff:ffff:ffff:ffff,NZ
2001:df1:9c00::,2001:df1:9c00:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:9d00::,2001:df1:9d00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:9e00::,2001:df1:9e00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:9f00::,2001:df1:9f00:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:a000::,2001:df1:a000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:a100::,2001:df1:a100:ffff:ffff:ffff:ffff:ffff,CN
2001:df1:a200::,2001:df1:a200:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:a300::,2001:df1:a300:ffff:ffff:ffff:ffff:ffff,SG
2001:df1:a400::,2001:df1:a400:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:a500::,2001:df1:a500:ffff:ffff:ffff:ffff:ffff,PH
+2001:df1:a700::,2001:df1:a700:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:a900::,2001:df1:a900:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:aa00::,2001:df1:aa00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:ab00::,2001:df1:ab00:ffff:ffff:ffff:ffff:ffff,HK
2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:ad00::,2001:df1:ad00:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:af00::,2001:df1:af00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df1:b100::,2001:df1:b100:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:b200::,2001:df1:b200:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:b300::,2001:df1:b300:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:b500::,2001:df1:b500:ffff:ffff:ffff:ffff:ffff,JP
2001:df1:b600::,2001:df1:b600:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df1:b700::,2001:df1:b700:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:b800::,2001:df1:b800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:b900::,2001:df1:b900:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:ba00::,2001:df1:ba00:ffff:ffff:ffff:ffff:ffff,BN
+2001:df1:bb00::,2001:df1:bb00:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:bc00::,2001:df1:bc00:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:bd00::,2001:df1:bd00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:be00::,2001:df1:be00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:bf00::,2001:df1:bf00:ffff:ffff:ffff:ffff:ffff,PH
+2001:df1:c100::,2001:df1:c100:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:c200::,2001:df1:c200:ffff:ffff:ffff:ffff:ffff,FR
+2001:df1:c300::,2001:df1:c300:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:c400::,2001:df1:c400:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:c500::,2001:df1:c500:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:c600::,2001:df1:c600:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:c700::,2001:df1:c700:ffff:ffff:ffff:ffff:ffff,MM
2001:df1:c800::,2001:df1:c800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:c900::,2001:df1:c900:ffff:ffff:ffff:ffff:ffff,CN
2001:df1:ca00::,2001:df1:ca00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:cb00::,2001:df1:cb00:ffff:ffff:ffff:ffff:ffff,SG
2001:df1:cc00::,2001:df1:cc00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:cd00::,2001:df1:cd00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:ce00::,2001:df1:ce00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:cf00::,2001:df1:cf00:ffff:ffff:ffff:ffff:ffff,HK
2001:df1:d000::,2001:df1:d000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:d100::,2001:df1:d100:ffff:ffff:ffff:ffff:ffff,CN
2001:df1:d200::,2001:df1:d200:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:d300::,2001:df1:d300:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:d400::,2001:df1:d401:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:d500::,2001:df1:d500:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:d600::,2001:df1:d600:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:d700::,2001:df1:d700:ffff:ffff:ffff:ffff:ffff,NL
2001:df1:d800::,2001:df1:d800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:d900::,2001:df1:d900:ffff:ffff:ffff:ffff:ffff,NZ
2001:df1:da00::,2001:df1:da00:ffff:ffff:ffff:ffff:ffff,CN
+2001:df1:db00::,2001:df1:db00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:dd00::,2001:df1:dd01:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:de00::,2001:df1:de00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:df00::,2001:df1:df00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:e000::,2001:df1:e000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:e100::,2001:df1:e100:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:e200::,2001:df1:e200:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:e300::,2001:df1:e300:ffff:ffff:ffff:ffff:ffff,US
2001:df1:e400::,2001:df1:e400:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:e500::,2001:df1:e500:ffff:ffff:ffff:ffff:ffff,JP
2001:df1:e600::,2001:df1:e600:ffff:ffff:ffff:ffff:ffff,CN
+2001:df1:e700::,2001:df1:e700:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:e800::,2001:df1:e800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:e900::,2001:df1:e900:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:ea00::,2001:df1:ea00:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:eb00::,2001:df1:eb00:ffff:ffff:ffff:ffff:ffff,BD
2001:df1:ec00::,2001:df1:ec00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:ed00::,2001:df1:ed00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:ee00::,2001:df1:ee00:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:ef00::,2001:df1:ef00:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:f000::,2001:df1:f000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:f100::,2001:df1:f100:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:f200::,2001:df1:f200:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:f300::,2001:df1:f300:ffff:ffff:ffff:ffff:ffff,NZ
2001:df1:f400::,2001:df1:f400:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:f500::,2001:df1:f500:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:f600::,2001:df1:f600:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:f700::,2001:df1:f700:ffff:ffff:ffff:ffff:ffff,ID
2001:df1:f800::,2001:df1:f800:ffff:ffff:ffff:ffff:ffff,BN
+2001:df1:f900::,2001:df1:f900:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:fa00::,2001:df1:fa00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:fb00::,2001:df1:fb00:ffff:ffff:ffff:ffff:ffff,IN
2001:df1:fc00::,2001:df1:fc00:ffff:ffff:ffff:ffff:ffff,MY
+2001:df1:fd00::,2001:df1:fd00:ffff:ffff:ffff:ffff:ffff,AU
2001:df1:fe00::,2001:df1:fe00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:ff00::,2001:df1:ff00:ffff:ffff:ffff:ffff:ffff,ID
2001:df2::,2001:df2::ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:100::,2001:df2:100:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:200::,2001:df2:200:ffff:ffff:ffff:ffff:ffff,ID
+2001:df2:300::,2001:df2:300:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:400::,2001:df2:400:ffff:ffff:ffff:ffff:ffff,TH
+2001:df2:500::,2001:df2:500:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:600::,2001:df2:600:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:700::,2001:df2:700:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:800::,2001:df2:800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:900::,2001:df2:900:ffff:ffff:ffff:ffff:ffff,AU
2001:df2:a00::,2001:df2:a00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df2:b00::,2001:df2:b00:ffff:ffff:ffff:ffff:ffff,ID
2001:df2:e00::,2001:df2:e00:ffff:ffff:ffff:ffff:ffff,AU
2001:df2:1000::,2001:df2:1001:ffff:ffff:ffff:ffff:ffff,IN
2001:df2:1200::,2001:df2:1200:ffff:ffff:ffff:ffff:ffff,BD
@@ -4233,6 +4365,7 @@
2001:df2:7a00::,2001:df2:7a00:ffff:ffff:ffff:ffff:ffff,PH
2001:df2:7c00::,2001:df2:7c00:ffff:ffff:ffff:ffff:ffff,NZ
2001:df2:7e00::,2001:df2:7e00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:7e01::,2001:df2:7e01:ffff:ffff:ffff:ffff:ffff,SG
2001:df2:8000::,2001:df2:8000:ffff:ffff:ffff:ffff:ffff,BN
2001:df2:8200::,2001:df2:8201:ffff:ffff:ffff:ffff:ffff,MY
2001:df2:8400::,2001:df2:8401:ffff:ffff:ffff:ffff:ffff,NZ
@@ -4397,7 +4530,6 @@
2001:df3:d200::,2001:df3:d200:ffff:ffff:ffff:ffff:ffff,HK
2001:df3:d400::,2001:df3:d400:ffff:ffff:ffff:ffff:ffff,AU
2001:df3:d600::,2001:df3:d600:ffff:ffff:ffff:ffff:ffff,AF
-2001:df3:d800::,2001:df3:d800:ffff:ffff:ffff:ffff:ffff,SG
2001:df3:da00::,2001:df3:da00:ffff:ffff:ffff:ffff:ffff,US
2001:df3:dc00::,2001:df3:dc00:ffff:ffff:ffff:ffff:ffff,ID
2001:df3:de00::,2001:df3:de00:ffff:ffff:ffff:ffff:ffff,AU
@@ -4697,7 +4829,6 @@
2001:df6:4400::,2001:df6:4400:ffff:ffff:ffff:ffff:ffff,IN
2001:df6:4600::,2001:df6:4600:ffff:ffff:ffff:ffff:ffff,AU
2001:df6:4800::,2001:df6:4801:ffff:ffff:ffff:ffff:ffff,NZ
-2001:df6:4a00::,2001:df6:4a00:ffff:ffff:ffff:ffff:ffff,TH
2001:df6:4c00::,2001:df6:4c00:ffff:ffff:ffff:ffff:ffff,IN
2001:df6:4e00::,2001:df6:4e00:ffff:ffff:ffff:ffff:ffff,AU
2001:df6:5000::,2001:df6:5000:ffff:ffff:ffff:ffff:ffff,AU
@@ -4906,7 +5037,7 @@
2001:df7:fc00::,2001:df7:fc00:ffff:ffff:ffff:ffff:ffff,SG
2001:df7:fe00::,2001:df7:fe00:ffff:ffff:ffff:ffff:ffff,ID
2001:df8::,2001:df8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2001:df9::,2001:df9:ffff:ffff:ffff:ffff:ffff:ffff,VN
+2001:df9::,2001:df9:ffff:ffff:ffff:ffff:ffff:ffff,TW
2001:dfa::,2001:dfa:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:e00::,2001:e01:ffff:ffff:ffff:ffff:ffff:ffff,ID
2001:e08::,2001:e08:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -5122,7 +5253,7 @@
2001:15f8::,2001:15f8:ffff:ffff:ffff:ffff:ffff:ffff,DK
2001:1600::,2001:1607:ffff:ffff:ffff:ffff:ffff:ffff,CH
2001:1608::,2001:1608:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:1610::,2001:1610:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2001:1610::,2001:1617:ffff:ffff:ffff:ffff:ffff:ffff,LU
2001:1618::,2001:1618:ffff:ffff:ffff:ffff:ffff:ffff,AT
2001:1620::,2001:1623:ffff:ffff:ffff:ffff:ffff:ffff,CH
2001:1630::,2001:1637:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -5212,7 +5343,7 @@
2001:1960::,2001:1960:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:1968::,2001:1968:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:1970::,2001:1970:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2001:1978::,2001:1978:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:1978::,2001:1978:ffff:ffff:ffff:ffff:ffff:ffff,CA
2001:1980::,2001:1980:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:1988::,2001:1988:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:1990::,2001:1990:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -5598,7 +5729,7 @@
2001:43f8:3e0::,2001:43f8:3ef:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:400::,2001:43f8:4ff:ffff:ffff:ffff:ffff:ffff,AO
2001:43f8:600::,2001:43f8:60f:ffff:ffff:ffff:ffff:ffff,NG
-2001:43f8:610::,2001:43f8:610:ffff:ffff:ffff:ffff:ffff,TZ
+2001:43f8:610::,2001:43f8:611:ffff:ffff:ffff:ffff:ffff,TZ
2001:43f8:620::,2001:43f8:620:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:630::,2001:43f8:630:ffff:ffff:ffff:ffff:ffff,MW
2001:43f8:640::,2001:43f8:640:ffff:ffff:ffff:ffff:ffff,MZ
@@ -5655,7 +5786,6 @@
2001:43f8:ad0::,2001:43f8:ad0:ffff:ffff:ffff:ffff:ffff,UG
2001:43f8:ae0::,2001:43f8:ae1:ffff:ffff:ffff:ffff:ffff,GH
2001:43f8:af0::,2001:43f8:af1:ffff:ffff:ffff:ffff:ffff,BJ
-2001:43f8:b00::,2001:43f8:b00:ffff:ffff:ffff:ffff:ffff,KE
2001:43f8:b10::,2001:43f8:b10:ffff:ffff:ffff:ffff:ffff,NG
2001:43f8:b20::,2001:43f8:b20:ffff:ffff:ffff:ffff:ffff,CI
2001:43f8:b30::,2001:43f8:b30:ffff:ffff:ffff:ffff:ffff,MA
@@ -5693,6 +5823,9 @@
2001:43f8:d50::,2001:43f8:d50:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:d60::,2001:43f8:d60:ffff:ffff:ffff:ffff:ffff,KE
2001:43f8:d70::,2001:43f8:d70:ffff:ffff:ffff:ffff:ffff,CM
+2001:43f8:d80::,2001:43f8:d80:ffff:ffff:ffff:ffff:ffff,RW
+2001:43f8:d90::,2001:43f8:d90:ffff:ffff:ffff:ffff:ffff,NG
+2001:43f8:da0::,2001:43f8:da0:ffff:ffff:ffff:ffff:ffff,ZM
2001:43f8:e00::,2001:43f8:eff: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
@@ -5701,7 +5834,7 @@
2001:4428::,2001:4428:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2001:4430::,2001:4430:ffff:ffff:ffff:ffff:ffff:ffff,KR
2001:4438::,2001:4438:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:4450::,2001:4451:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2001:4450::,2001:4453:ffff:ffff:ffff:ffff:ffff:ffff,PH
2001:4458::,2001:4458:ffff:ffff:ffff:ffff:ffff:ffff,MY
2001:4460::,2001:4460:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:4470::,2001:4470:ffff:ffff:ffff:ffff:ffff:ffff,MY
@@ -6738,7 +6871,8 @@
2400:ba00::,2400:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:ba40::,2400:ba41::ffff:ffff:ffff:ffff:ffff,CN
2400:ba41:1::,2400:ba41:1:ffff:ffff:ffff:ffff:ffff,US
-2400:ba41:2::,2400:ba41:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2400:ba41:2::,2400:ba41:2:ffff:ffff:ffff:ffff:ffff,SG
+2400:ba41:3::,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
@@ -6881,12 +7015,14 @@
2400:cb00:99::,2400:cb00:99:ffff:ffff:ffff:ffff:ffff,LU
2400:cb00:9a::,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:101::,2400:cb00:101:ffff:ffff:ffff:ffff:ffff,BR
+2400:cb00:102::,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:110:ffff:ffff:ffff:ffff:ffff,US
+2400:cb00:108::,2400:cb00:10f:ffff:ffff:ffff:ffff:ffff,US
+2400:cb00:110::,2400:cb00:110:ffff:ffff:ffff:ffff:ffff,CL
2400:cb00:111::,2400:cb00:111:ffff:ffff:ffff:ffff:ffff,LK
2400:cb00:112::,2400:cb00:112:ffff:ffff:ffff:ffff:ffff,US
2400:cb00:113::,2400:cb00:113:ffff:ffff:ffff:ffff:ffff,ZA
@@ -6960,7 +7096,6 @@
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
@@ -7149,7 +7284,6 @@
2401:9c0::,2401:9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:a00::,2401:a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:a40::,2401:a40:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2401:a80::,2401:a80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:ac0::,2401:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:b00::,2401:b00:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:b40::,2401:b40:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -7326,141 +7460,287 @@
2401:3640::,2401:3640:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:3680::,2401:3680:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:36c0::,2401:36c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:3740::,2401:3740:ffff:ffff:ffff:ffff:ffff:ffff,SG
2401:3780::,2401:3780:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:37c0::,2401:37c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:3800::,2401:3800:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3840::,2401:3840:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:3880::,2401:3880:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:38c0::,2401:38c0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:3900::,2401:3900:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:3940::,2401:3940:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:3980::,2401:3980:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:39c0::,2401:39c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:3a00::,2401:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3a40::,2401:3a40:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:3a80::,2401:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3ac0::,2401:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:3b00::,2401:3b00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:3b40::,2401:3b40:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:3b80::,2401:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3bc0::,2401:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:3c00::,2401:3c00:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:3c40::,2401:3c40:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:3c80::,2401:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3cc0::,2401:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:3d00::,2401:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:3d40::,2401:3d40:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:3d80::,2401:3d80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3dc0::,2401:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:3e00::,2401:3e00:ffff:ffff:ffff:ffff:ffff:ffff,KH
+2401:3e40::,2401:3e40:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:3e80::,2401:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3ec0::,2401:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,SG
2401:3f00::,2401:3f00:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:3f40::,2401:3f40:ffff:ffff:ffff:ffff:ffff:ffff,TW
2401:3f80::,2401:3f80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:3fc0::,2401:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:4000::,2401:4000:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2401:4040::,2401:4040:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4080::,2401:4080:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:40c0::,2401:40c0:ffff:ffff:ffff:ffff:ffff:ffff,PH
2401:4100::,2401:4100:ffff:ffff:ffff:ffff:ffff:ffff,PK
+2401:4140::,2401:4140:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4180::,2401:4180:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:41c0::,2401:41c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:4200::,2401:4200:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:4240::,2401:4240:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4280::,2401:4280:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:42c0::,2401:42c0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4300::,2401:4300:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:4340::,2401:4340:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:4380::,2401:4380:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:43c0::,2401:43c0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4400::,2401:4400:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:4440::,2401:4440:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:44c0::,2401:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:4540::,2401:4540:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:45c0::,2401:45c0:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:4640::,2401:4640:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:46c0::,2401:46c0:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:4740::,2401:4740:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:47c0::,2401:47c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:4800::,2401:4800:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:4840::,2401:4840:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:4880::,2401:4880:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:48c0::,2401:48c0:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:4900::,2401:4900:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4a00::,2401:4a00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:4a40::,2401:4a40:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:4a80::,2401:4a80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:4ac0::,2401:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:4b00::,2401:4b00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:4b40::,2401:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:4b80::,2401:4b80:ffff:ffff:ffff:ffff:ffff:ffff,TL
+2401:4bc0::,2401:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:4c00::,2401:4c00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:4c40::,2401:4c40:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:4c80::,2401:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:4cc0::,2401:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:4d00::,2401:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:4d40::,2401:4d47:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:4d80::,2401:4d80:ffff:ffff:ffff:ffff:ffff:ffff,KH
+2401:4dc0::,2401:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:4e00::,2401:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:4e40::,2401:4e40:ffff:ffff:ffff:ffff:ffff:ffff,MP
2401:4e80::,2401:4e80:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:4ec0::,2401:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:4f00::,2401:4f00:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2401:4f40::,2401:4f40:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4f80::,2401:4f80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:4fc0::,2401:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:5000::,2401:5000:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:5040::,2401:5040:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:50c0::,2401:50c0:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:5100::,2401:5100:ffff:ffff:ffff:ffff:ffff:ffff,FJ
+2401:5140::,2401:5140:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:5180::,2401:5180:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:51c0::,2401:51c0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:5200::,2401:5200:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:5240::,2401:5240:ffff:ffff:ffff:ffff:ffff:ffff,NP
2401:5280::,2401:5280:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:52c0::,2401:52c0:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:5300::,2401:5300:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:5340::,2401:5340:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:53c0::,2401:53c0:ffff:ffff:ffff:ffff:ffff:ffff,PG
2401:5400::,2401:5400:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:5440::,2401:5440:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:5480::,2401:5480:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:54c0::,2401:54c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:5500::,2401:5500:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5540::,2401:5540:ffff:ffff:ffff:ffff:ffff:ffff,PK
+2401:55c0::,2401:55c0:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:5640::,2401:5640:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:5680::,2401:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:56c0::,2401:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:5700::,2401:5700:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2401:5740::,2401:5740:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:5780::,2401:5780:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:57c0::,2401:57c0:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:5800::,2401:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:5840::,2401:5840:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:5880::,2401:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:58c0::,2401:58c0:ffff:ffff:ffff:ffff:ffff:ffff,GU
2401:5900::,2401:5900:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:5940::,2401:5940:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:5980::,2401:5980:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:59c0::,2401:59c0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:5a00::,2401:5a00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:5a40::,2401:5a40:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:5a80::,2401:5a80:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:5ac0::,2401:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:5b00::,2401:5b00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5b40::,2401:5b40:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:5b80::,2401:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5bc0::,2401:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,KH
2401:5c00::,2401:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5c40::,2401:5c40:ffff:ffff:ffff:ffff:ffff:ffff,PH
2401:5c80::,2401:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:5cc0::,2401:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:5d00::,2401:5d00:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:5d40::,2401:5d40:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5dc0::,2401:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:5e00::,2401:5e00:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2401:5e40::,2401:5e40:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:5e80::,2401:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5ec0::,2401:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,VN
2401:5f00::,2401:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5f40::,2401:5f40:ffff:ffff:ffff:ffff:ffff:ffff,BT
2401:5f80::,2401:5f80:ffff:ffff:ffff:ffff:ffff:ffff,VN
+2401:5fc0::,2401:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:6000::,2401:6fff:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:7000::,2401:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:7040::,2401:7040:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:7080::,2401:7080:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2401:70c0::,2401:70c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:7100::,2401:7100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7140::,2401:7140:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:7180::,2401:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:71c0::,2401:71c0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7200::,2401:7200:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7240::,2401:7240:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:72c0::,2401:72c0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:7300::,2401:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7340::,2401:7340:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7380::,2401:7380:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:73c0::,2401:73c0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:7400::,2401:7401:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:7440::,2401:7440:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:74c0::,2401:74c0:ffff:ffff:ffff:ffff:ffff:ffff,NP
2401:7500::,2401:7500:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:7540::,2401:7540:ffff:ffff:ffff:ffff:ffff:ffff,KH
2401:7580::,2401:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:75c0::,2401:75c0:ffff:ffff:ffff:ffff:ffff:ffff,MO
2401:7600::,2401:7600:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:7640::,2401:7640:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:7680::,2401:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:76c0::,2401:76c0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:7700::,2401:7700:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7740::,2401:7740:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:7780::,2401:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:77c0::,2401:77c0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:7800::,2401:7800:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:7840::,2401:7840:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:7880::,2401:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:78c0::,2401:78c0:ffff:ffff:ffff:ffff:ffff:ffff,VN
2401:7900::,2401:7900:ffff:ffff:ffff:ffff:ffff:ffff,LK
+2401:7940::,2401:7940:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:7980::,2401:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:79c0::,2401:79c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:7a00::,2401:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7a40::,2401:7a40:ffff:ffff:ffff:ffff:ffff:ffff,VU
2401:7a80::,2401:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7ac0::,2401:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:7b00::,2401:7b00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7b40::,2401:7b40:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:7b80::,2401:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7bc0::,2401:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7c00::,2401:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:7c40::,2401:7c40:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:7c80::,2401:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7cc0::,2401:7cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7d00::,2401:7d00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:7d40::,2401:7d40:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7d80::,2401:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7dc0::,2401:7dc0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:7e00::,2401:7e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7e40::,2401:7e40:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:7e80::,2401:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7ec0::,2401:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:7f00::,2401:7f00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:7f40::,2401:7f40:ffff:ffff:ffff:ffff:ffff:ffff,NP
2401:7f80::,2401:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7fc0::,2401:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:8000::,2401:803f:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2401:8040::,2401:8040:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:8080::,2401:8080:ffff:ffff:ffff:ffff:ffff:ffff,AF
+2401:80c0::,2401:80c0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:8100::,2401:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:8140::,2401:8140:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8180::,2401:8180:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:81c0::,2401:81c0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8200::,2401:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:8240::,2401:8240:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:8280::,2401:8280:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:82c0::,2401:82c0:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:8300::,2401:8300:ffff:ffff:ffff:ffff:ffff:ffff,MV
+2401:8340::,2401:8340:ffff:ffff:ffff:ffff:ffff:ffff,MM
2401:8380::,2401:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:83c0::,2401:83c0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:8400::,2401:8400:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:8440::,2401:8440:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:84c0::,2401:84c0:ffff:ffff:ffff:ffff:ffff:ffff,RO
2401:8500::,2401:8500:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:8540::,2401:8540:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:85c0::,2401:85c0:ffff:ffff:ffff:ffff:ffff:ffff,TW
2401:8600::,2401:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:8640::,2401:8640:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:8680::,2401:8680:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:86c0::,2401:86c0:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:8700::,2401:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2401:8780::,2401:8780:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:8740::,2401:8740:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2401:87c0::,2401:87c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:8800::,2401:8800:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:8840::,2401:8840:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:8880::,2401:8880:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:88c0::,2401:88c0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:8900::,2401:8900:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:8940::,2401:8940:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:89c0::,2401:89c0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:8a00::,2401:8a00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:8a40::,2401:8a40:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:8a80::,2401:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:8ac0::,2401:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,KR
2401:8b00::,2401:8b00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:8b40::,2401:8b40:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:8b80::,2401:8b80:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:8bc0::,2401:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:8c00::,2401:8c01:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:8c40::,2401:8c40:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:8c80::,2401:8c80:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:8cc0::,2401:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:8d00::,2401:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:8d40::,2401:8d40:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:8dc0::,2401:8dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8e00::,2401:8e00:ffff:ffff:ffff:ffff:ffff:ffff,PK
+2401:8e40::,2401:8e40:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:8e80::,2401:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2401:8ec0::,2401:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8f00::,2401:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:8f40::,2401:8f40:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:8f80::,2401:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:8fc0::,2401:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:9040::,2401:9040:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:9080::,2401:9080:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:90c0::,2401:90c0:ffff:ffff:ffff:ffff:ffff:ffff,MN
2401:9100::,2401:9100:ffff:ffff:ffff:ffff:ffff:ffff,MO
+2401:9140::,2401:9140:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:9200::,2401:9200:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:9280::,2401:9280:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:9300::,2401:9300:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -7907,7 +8187,6 @@
2402:5980::,2402:5980:ffff:ffff:ffff:ffff:ffff:ffff,SG
2402:5a00::,2402:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2402:5b00::,2402:5b00:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2402:5b80::,2402:5b80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2402:5c00::,2402:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:5c80::,2402:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IN
2402:5d00::,2402:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -8325,8 +8604,10 @@
2403:2c00:5::,2403:2c00:6:ffff:ffff:ffff:ffff:ffff,HK
2403:2c00:7::,2403:2c00:7:ffff:ffff:ffff:ffff:ffff,JP
2403:2c00:8::,2403:2c00:8:ffff:ffff:ffff:ffff:ffff,DE
-2403:2c00:9::,2403:2c00:9:ffff:ffff:ffff:ffff:ffff,US
-2403:2c00:a::,2403:2c00:afff:ffff:ffff:ffff:ffff:ffff,HK
+2403:2c00:9::,2403:2c00:a:ffff:ffff:ffff:ffff:ffff,US
+2403:2c00:b::,2403:2c00:b::,ZA
+2403:2c00:b::1,2403:2c00:9fff:ffff:ffff:ffff:ffff:ffff,HK
+2403:2c00:a000::,2403:2c00:afff:ffff:ffff:ffff:ffff:ffff,ZA
2403:2c00:b000::,2403:2c00:bfff:ffff:ffff:ffff:ffff:ffff,DE
2403:2c00:c000::,2403:2c00:cfff:ffff:ffff:ffff:ffff:ffff,JP
2403:2c00:d000::,2403:2c00:dfff:ffff:ffff:ffff:ffff:ffff,HK
@@ -9012,7 +9293,6 @@
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: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
@@ -9209,7 +9489,6 @@
2404:df00::,2404:df00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2404:df80::,2404:df80:ffff:ffff:ffff:ffff:ffff:ffff,IN
2404:e000::,2404:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2404:e080::,2404:e080:ffff:ffff:ffff:ffff:ffff:ffff,CA
2404:e100::,2404:e101:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:e180::,2404:e180:ffff:ffff:ffff:ffff:ffff:ffff,CN
2404:e200::,2404:e200:ffff:ffff:ffff:ffff:ffff:ffff,NZ
@@ -9636,7 +9915,6 @@
2405:9d80::,2405:9d80:ffff:ffff:ffff:ffff:ffff:ffff,VN
2405:9e00::,2405:9e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2405:9e80::,2405:9e80:ffff:ffff:ffff:ffff:ffff:ffff,BD
-2405:9f00::,2405:9f00:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2405:9f80::,2405:9f80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2405:a000::,2405:a000:ffff:ffff:ffff:ffff:ffff:ffff,TH
2405:a080::,2405:a080:ffff:ffff:ffff:ffff:ffff:ffff,IN
@@ -9738,7 +10016,6 @@
2405:d200::,2405:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP
2405:d280::,2405:d280:ffff:ffff:ffff:ffff:ffff:ffff,CN
2405:d300::,2405:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2405:d380::,2405:d380:ffff:ffff:ffff:ffff:ffff:ffff,AU
2405:d400::,2405:d400:ffff:ffff:ffff:ffff:ffff:ffff,PH
2405:d480::,2405:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU
2405:d580::,2405:d580:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -11000,6 +11277,32 @@
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:fec6::,2602:fec6:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fec7::,2602:fec7:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:fec8::,2602:fec8:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fec9::,2602:fec9:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:feca::,2602:feca:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fecb::,2602:fecb:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fecc::,2602:fecc:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fecd::,2602:fecd:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:fece::,2602:fece:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fecf::,2602:fecf:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed0::,2602:fed0:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed1::,2602:fed1:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed2::,2602:fed2:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:fed3::,2602:fed3:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed4::,2602:fed4:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed5::,2602:fed5:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed6::,2602:fed6:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed7::,2602:fed7:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fed8::,2602:fed8:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:fed9::,2602:fed9:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:feda::,2602:feda:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fedb::,2602:fedb:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fedc::,2602:fedc:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fedd::,2602:fedd:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:fede::,2602:fede:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fedf::,2602:fedf:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fef0::,2602:fef0:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fef1::,2602:fef1:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fef2::,2602:fef2:fff:ffff:ffff:ffff:ffff:ffff,CA
@@ -11127,7 +11430,6 @@
2602:ff6f::,2602:ff6f:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ff70::,2602:ff70:fff:ffff:ffff:ffff:ffff:ffff,CA
2602:ff71::,2602:ff72:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:ff73::,2602:ff73:fff:ffff:ffff:ffff:ffff:ffff,CA
2602:ff74::,2602:ff74:fff:ffff:ffff:ffff:ffff:ffff,CA
2602:ff75::,2602:ff75:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ff76::,2602:ff76:fff:ffff:ffff:ffff:ffff:ffff,CA
@@ -11173,8 +11475,7 @@
2602:ffa3::,2602:ffa3:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffa4::,2602:ffa4:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffa5::,2602:ffa5:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:ffa6::,2602:ffa6:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:ffa7::,2602:ffa7:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa6::,2602:ffa7:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffa8::,2602:ffa8:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffa9::,2602:ffa9:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffaa::,2602:ffaa:fff:ffff:ffff:ffff:ffff:ffff,US
@@ -11250,8 +11551,7 @@
2602:fff1::,2602:fff1:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fff2::,2602:fff2:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fff3::,2602:fff3:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:fff4::,2602:fff4:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:fff5::,2602:fff5:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:fff4::,2602:fff5:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fff6::,2602:fff6:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fff7::,2602:fff7:fff:ffff:ffff:ffff:ffff:ffff,US
2602:fff8::,2602:fff8:fff:ffff:ffff:ffff:ffff:ffff,US
@@ -11269,7 +11569,9 @@
2603:1016:20::,2603:1016:2f:ffff:ffff:ffff:ffff:ffff,AU
2603:1016:30::,2603:1016:1ff:ffff:ffff:ffff:ffff:ffff,US
2603:1016:200::,2603:1016:200:37:ffff:ffff:ffff:ffff,AU
-2603:1016:200:38::,2603:1018:ffff:ffff:ffff:ffff:ffff:ffff,US
+2603:1016:200:38::,2603:1016:fff:ffff:ffff:ffff:ffff:ffff,US
+2603:1016:1000::,2603:1016:10ff:ffff:ffff:ffff:ffff:ffff,AU
+2603:1016:1100::,2603:1018:ffff:ffff:ffff:ffff:ffff:ffff,US
2603:1019::,2603:1019:100:ffff:ffff:ffff:ffff:ffff,AU
2603:1019:101::,2603:1019:1ff:ffff:ffff:ffff:ffff:ffff,US
2603:1019:200::,2603:1019:2ff:ffff:ffff:ffff:ffff:ffff,AU
@@ -11288,7 +11590,8 @@
2603:1026:3::,2603:1026:3:ffff:ffff:ffff:ffff:ffff,FI
2603:1026:4::,2603:1026:6:ffff:ffff:ffff:ffff:ffff,IE
2603:1026:7::,2603:1026:7:ffff:ffff:ffff:ffff:ffff,FI
-2603:1026:8::,2603:1026:1f:ffff:ffff:ffff:ffff:ffff,US
+2603:1026:8::,2603:1026:8:ffff:ffff:ffff:ffff:ffff,IE
+2603:1026:9::,2603:1026:1f:ffff:ffff:ffff:ffff:ffff,US
2603:1026:20::,2603:1026:22:ffff:ffff:ffff:ffff:ffff,IE
2603:1026:23::,2603:1026:23:ffff:ffff:ffff:ffff:ffff,FI
2603:1026:24::,2603:1026:25:ffff:ffff:ffff:ffff:ffff,IE
@@ -11296,11 +11599,20 @@
2603:1026:28::,2603:1026:2a:ffff:ffff:ffff:ffff:ffff,IE
2603:1026:2b::,2603:1026:2b:ffff:ffff:ffff:ffff:ffff,FI
2603:1026:2c::,2603:1026:2d:ffff:ffff:ffff:ffff:ffff,IE
-2603:1026:2e::,2603:1026:1ff:ffff:ffff:ffff:ffff:ffff,US
+2603:1026:2e::,2603:1026:2e:ffff:ffff:ffff:ffff:ffff,US
+2603:1026:2f::,2603:1026:2f:ffff:ffff:ffff:ffff:ffff,FI
+2603:1026:30::,2603:1026:ff:ffff:ffff:ffff:ffff:ffff,US
+2603:1026:100::,2603:1026:10f:ffff:ffff:ffff:ffff:ffff,FR
+2603:1026:110::,2603:1026:11f:ffff:ffff:ffff:ffff:ffff,US
+2603:1026:120::,2603:1026:12f:ffff:ffff:ffff:ffff:ffff,FR
+2603:1026:130::,2603:1026:1ff:ffff:ffff:ffff:ffff:ffff,US
2603:1026:200::,2603:1026:2ff:ffff:ffff:ffff:ffff:ffff,NL
2603:1026:300::,2603:1026:3ff:ffff:ffff:ffff:ffff:ffff,AT
2603:1026:400::,2603:1026:6ff:ffff:ffff:ffff:ffff:ffff,GB
-2603:1026:700::,2603:1026:7ff:ffff:ffff:ffff:ffff:ffff,US
+2603:1026:700::,2603:1026:70f:ffff:ffff:ffff:ffff:ffff,FR
+2603:1026:710::,2603:1026:71f:ffff:ffff:ffff:ffff:ffff,US
+2603:1026:720::,2603:1026:72f:ffff:ffff:ffff:ffff:ffff,FR
+2603:1026:730::,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:10ff:ffff:ffff:ffff:ffff:ffff,IE
@@ -11428,7 +11740,9 @@
2603:1047:0:8c::,2603:1047::8d:ffff:ffff:ffff:ffff,IN
2603:1047:0:8e::,2603:1047::8e:ffff:ffff:ffff:ffff,HK
2603:1047:0:8f::,2603:1047::8f:ffff:ffff:ffff:ffff,SG
-2603:1047:0:90::,2603:1047::bf:ffff:ffff:ffff:ffff,US
+2603:1047:0:90::,2603:1047::90:ffff:ffff:ffff:ffff,HK
+2603:1047:0:91::,2603:1047::91:ffff:ffff:ffff:ffff,SG
+2603:1047:0:92::,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
@@ -11441,7 +11755,8 @@
2603:1047:0:ca::,2603:1047:ff:ffff:ffff:ffff:ffff:ffff,US
2603:1047:100::,2603:1047:1ff:ffff:ffff:ffff:ffff:ffff,SG
2603:1047:200::,2603:1047:2ff:ffff:ffff:ffff:ffff:ffff,HK
-2603:1047:300::,2603:1048:ffff:ffff:ffff:ffff:ffff:ffff,US
+2603:1047:300::,2603:1047:3ff:ffff:ffff:ffff:ffff:ffff,JP
+2603:1047:400::,2603:1048:ffff:ffff:ffff:ffff:ffff:ffff,US
2603:1049::,2603:1049:3:ffff:ffff:ffff:ffff:ffff,SG
2603:1049:4::,2603:1049:1ff:ffff:ffff:ffff:ffff:ffff,US
2603:1049:200::,2603:1049:202:ffff:ffff:ffff:ffff:ffff,HK
@@ -11458,8 +11773,8 @@
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::ffff:ffff:ffff:ffff:ffff,US
-2603:1050:1::,2603:1050:1:ffff:ffff:ffff:ffff:ffff,BR
-2603:1050:2::,2603:1050:ff:ffff:ffff:ffff:ffff:ffff,US
+2603:1050:1::,2603:1050:2:ffff:ffff:ffff:ffff:ffff,BR
+2603:1050:3::,2603:1050:ff:ffff:ffff:ffff:ffff:ffff,US
2603:1050:100::,2603:1050:1ff:ffff:ffff:ffff:ffff:ffff,BR
2603:1050:200::,2603:1050:20f:ffff:ffff:ffff:ffff:ffff,US
2603:1050:210::,2603:1050:21f:ffff:ffff:ffff:ffff:ffff,CL
@@ -11770,46 +12085,91 @@
2604:4400::,2604:4400:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4440::,2604:4440:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4480::,2604:4480:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:44c0::,2604:44c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4500::,2604:4500:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4540::,2604:4540:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4580::,2604:4580:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:45c0::,2604:45c0:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:4600::,2604:4600:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4640::,2604:4640:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4680::,2604:4680:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:46c0::,2604:46c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4700::,2604:4700:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4740::,2604:4740:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4780::,2604:4780:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:47c0::,2604:47c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4800::,2604:4800:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4840::,2604:4840:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4880::,2604:4880:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:48c0::,2604:48c0:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:4900::,2604:4900:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4940::,2604:4940:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4980::,2604:4980:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:49c0::,2604:49c0:ffff:ffff:ffff:ffff:ffff:ffff,GU
2604:4a00::,2604:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4a40::,2604:4a40:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:4a80::,2604:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4ac0::,2604:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4b00::,2604:4b00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4b40::,2604:4b40:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:4b80::,2604:4b80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4bc0::,2604:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4c00::,2604:4c00:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:4c40::,2604:4c40:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4c80::,2604:4c80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4cc0::,2604:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4d00::,2604:4d00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4d40::,2604:4d40:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4d80::,2604:4d80:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:4dc0::,2604:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4e00::,2604:4e00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4e40::,2604:4e40:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4e80::,2604:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:4ec0::,2604:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:4f00::,2604:4f00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4f40::,2604:4f40:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:4f80::,2604:4f80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:4fc0::,2604:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5000::,2604:5000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5040::,2604:5040:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5080::,2604:5080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:50c0::,2604:50c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5100::,2604:5100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5140::,2604:5140:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:5180::,2604:5180:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:51c0::,2604:51c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5200::,2604:5200:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5240::,2604:5240:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:5280::,2604:5280:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:52c0::,2604:52c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5300::,2604:5300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5340::,2604:5340:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:5380::,2604:5380:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:53c0::,2604:53c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5400::,2604:5400:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5440::,2604:5440:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5480::,2604:5480:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:54c0::,2604:54c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5500::,2604:5500:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5540::,2604:5540:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5580::,2604:5580:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:55c0::,2604:55c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5600::,2604:5600:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5640::,2604:5640:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:5680::,2604:5680:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:56c0::,2604:56c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5700::,2604:5700:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5740::,2604:5740:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:57c0::,2604:57c0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5800::,2604:5800:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5840::,2604:5840:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5880::,2604:5880:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:58c0::,2604:58c0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5940::,2604:5940:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:59c0::,2604:59c0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5a40::,2604:5a40:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:5a80::,2604:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:5ac0::,2604:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5b00::,2604:5b00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5b80::,2604:5b80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5c00::,2604:5c00:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -12562,7 +12922,6 @@
2605:e700::,2605:e700:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:e780::,2605:e780:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:e900::,2605:e900:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:e980::,2605:e980:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ea00::,2605:ea00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ea80::,2605:ea80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:eb00::,2605:eb00:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -13056,7 +13415,6 @@
2606:c280::,2606:c280:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:c300::,2606:c300:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:c380::,2606:c380:ffff:ffff:ffff:ffff:ffff:ffff,US
-2606:c400::,2606:c400:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:c480::,2606:c480:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:c500::,2606:c500:ffff:ffff:ffff:ffff:ffff:ffff,JM
2606:c580::,2606:c580:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -13144,7 +13502,7 @@
2606:f000::,2606:f000:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:f080::,2606:f080:ffff:ffff:ffff:ffff:ffff:ffff,CA
2606:f100::,2606:f100:ffff:ffff:ffff:ffff:ffff:ffff,US
-2606:f180::,2606:f180:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:f180::,2606:f18f:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:f200::,2606:f200:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:f280::,2606:f280:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:f300::,2606:f300:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -13401,7 +13759,6 @@
2607:7200::,2607:7200:ffff:ffff:ffff:ffff:ffff:ffff,CA
2607:7280::,2607:7280:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:7300::,2607:7300:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:7380::,2607:7380:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:7400::,2607:7400:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:7480::,2607:7480:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:7500::,2607:7500:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -13706,7 +14063,6 @@
2607:f1e0::,2607:f1e0:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f1e8::,2607:f1e8:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f1f0::,2607:f1f0:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2607:f1f8::,2607:f1f8:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f200::,2607:f200:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f208::,2607:f208:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f210::,2607:f212:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -14601,6 +14957,7 @@
2620:11:e000::,2620:11:e000:ffff:ffff:ffff:ffff:ffff,US
2620:12::,2620:12::ffff:ffff:ffff:ffff:ffff,US
2620:12:2000::,2620:12:2000:ffff:ffff:ffff:ffff:ffff,US
+2620:12:4000::,2620:12:4000:ffff:ffff:ffff:ffff:ffff,US
2620:12:6000::,2620:12:6000:ffff:ffff:ffff:ffff:ffff,US
2620:12:8000::,2620:12:8000:ffff:ffff:ffff:ffff:ffff,US
2620:12:a000::,2620:12:a000:ffff:ffff:ffff:ffff:ffff,US
@@ -14689,7 +15046,6 @@
2620:1d:4000::,2620:1d:4000:ffff:ffff:ffff:ffff:ffff,US
2620:1d:6000::,2620:1d:6000:ffff:ffff:ffff:ffff:ffff,US
2620:1d:8000::,2620:1d:8000:ffff:ffff:ffff:ffff:ffff,US
-2620:1d:a000::,2620:1d:a000:ffff:ffff:ffff:ffff:ffff,US
2620:1d:c000::,2620:1d:c000:ffff:ffff:ffff:ffff:ffff,US
2620:1d:e000::,2620:1d:e000:ffff:ffff:ffff:ffff:ffff,US
2620:1e::,2620:1e::ffff:ffff:ffff:ffff:ffff,US
@@ -14719,46 +15075,72 @@
2620:21::,2620:21::ffff:ffff:ffff:ffff:ffff,US
2620:21:2000::,2620:21:2000:ffff:ffff:ffff:ffff:ffff,US
2620:21:4000::,2620:21:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:21:6000::,2620:21:600f:ffff:ffff:ffff:ffff:ffff,US
2620:21:8000::,2620:21:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:21:a000::,2620:21:a000:ffff:ffff:ffff:ffff:ffff,US
2620:21:c000::,2620:21:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:21:e000::,2620:21:e000:ffff:ffff:ffff:ffff:ffff,US
2620:22::,2620:22::ffff:ffff:ffff:ffff:ffff,US
+2620:22:2000::,2620:22:2000:ffff:ffff:ffff:ffff:ffff,US
2620:22:4000::,2620:22:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:22:6000::,2620:22:6000:ffff:ffff:ffff:ffff:ffff,US
2620:22:8000::,2620:22:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:22:a000::,2620:22:a000:ffff:ffff:ffff:ffff:ffff,US
2620:22:c000::,2620:22:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:22:e000::,2620:22:e000:ffff:ffff:ffff:ffff:ffff,US
2620:23::,2620:23::ffff:ffff:ffff:ffff:ffff,US
+2620:23:2000::,2620:23:2000:ffff:ffff:ffff:ffff:ffff,US
2620:23:4000::,2620:23:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:23:6000::,2620:23:6000:ffff:ffff:ffff:ffff:ffff,US
2620:23:8000::,2620:23:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:23:a000::,2620:23:a000:ffff:ffff:ffff:ffff:ffff,US
2620:23:c000::,2620:23:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:23:e000::,2620:23:e000:ffff:ffff:ffff:ffff:ffff,US
2620:24::,2620:24:1f:ffff:ffff:ffff:ffff:ffff,US
2620:24:40c0::,2620:24:40c0:ffff:ffff:ffff:ffff:ffff,US
2620:24:8080::,2620:24:8080:ffff:ffff:ffff:ffff:ffff,US
2620:24:c040::,2620:24:c040:ffff:ffff:ffff:ffff:ffff,US
2620:25::,2620:25::ffff:ffff:ffff:ffff:ffff,US
+2620:25:2000::,2620:25:2000:ffff:ffff:ffff:ffff:ffff,US
2620:25:4000::,2620:25:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:25:6000::,2620:25:6000:ffff:ffff:ffff:ffff:ffff,CA
2620:25:8000::,2620:25:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:25:a000::,2620:25:a000:ffff:ffff:ffff:ffff:ffff,US
2620:25:c000::,2620:25:c00f:ffff:ffff:ffff:ffff:ffff,US
2620:26::,2620:26::ffff:ffff:ffff:ffff:ffff,US
+2620:26:2000::,2620:26:2000:ffff:ffff:ffff:ffff:ffff,US
2620:26:4000::,2620:26:400f:ffff:ffff:ffff:ffff:ffff,US
2620:26:8000::,2620:26:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:26:a000::,2620:26:a000:ffff:ffff:ffff:ffff:ffff,US
2620:26:c000::,2620:26:c00f:ffff:ffff:ffff:ffff:ffff,US
2620:27::,2620:27:f:ffff:ffff:ffff:ffff:ffff,US
2620:27:40c0::,2620:27:40c0:ffff:ffff:ffff:ffff:ffff,CA
2620:27:8080::,2620:27:8080:ffff:ffff:ffff:ffff:ffff,US
2620:27:c040::,2620:27:c040:ffff:ffff:ffff:ffff:ffff,US
2620:28::,2620:28::ffff:ffff:ffff:ffff:ffff,US
+2620:28:2000::,2620:28:2000:ffff:ffff:ffff:ffff:ffff,US
2620:28:4000::,2620:28:400f:ffff:ffff:ffff:ffff:ffff,US
2620:28:8000::,2620:28:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:28:a000::,2620:28:a000:ffff:ffff:ffff:ffff:ffff,US
2620:28:c000::,2620:28:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:28:e000::,2620:28:e000:ffff:ffff:ffff:ffff:ffff,US
2620:29::,2620:29::ffff:ffff:ffff:ffff:ffff,US
+2620:29:2000::,2620:29:2000:ffff:ffff:ffff:ffff:ffff,US
2620:29:4000::,2620:29:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:29:a000::,2620:29:a000:ffff:ffff:ffff:ffff:ffff,US
2620:29:c000::,2620:29:c00f:ffff:ffff:ffff:ffff:ffff,US
2620:2a::,2620:2a::ffff:ffff:ffff:ffff:ffff,US
+2620:2a:2000::,2620:2a:2000:ffff:ffff:ffff:ffff:ffff,US
2620:2a:4000::,2620:2a:400f:ffff:ffff:ffff:ffff:ffff,US
2620:2a:8000::,2620:2a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:2a:a000::,2620:2a:a000:ffff:ffff:ffff:ffff:ffff,US
2620:2a:c000::,2620:2a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:2a:e000::,2620:2a:e000:ffff:ffff:ffff:ffff:ffff,US
2620:2b::,2620:2b::ffff:ffff:ffff:ffff:ffff,US
+2620:2b:2000::,2620:2b:2000:ffff:ffff:ffff:ffff:ffff,US
2620:2b:4000::,2620:2b:400f:ffff:ffff:ffff:ffff:ffff,US
2620:2b:8000::,2620:2b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:2b:a000::,2620:2b:a000:ffff:ffff:ffff:ffff:ffff,US
2620:2c::,2620:2c:f:ffff:ffff:ffff:ffff:ffff,US
2620:2c:40c0::,2620:2c:40c0:ffff:ffff:ffff:ffff:ffff,CA
2620:2c:8080::,2620:2c:8080:ffff:ffff:ffff:ffff:ffff,US
@@ -14769,7 +15151,6 @@
2620:2d:c000::,2620:2d:c00f:ffff:ffff:ffff:ffff:ffff,US
2620:2e::,2620:2e:3f:ffff:ffff:ffff:ffff:ffff,US
2620:2e:40c0::,2620:2e:40c0:ffff:ffff:ffff:ffff:ffff,US
-2620:2e:8080::,2620:2e:8080:ffff:ffff:ffff:ffff:ffff,US
2620:2e:c040::,2620:2e:c040:ffff:ffff:ffff:ffff:ffff,US
2620:2f::,2620:2f::ffff:ffff:ffff:ffff:ffff,CA
2620:2f:4000::,2620:2f:4000:ffff:ffff:ffff:ffff:ffff,US
@@ -15517,7 +15898,13 @@
2620:f0::,2620:f0::ffff:ffff:ffff:ffff:ffff,US
2620:f0:4000::,2620:f0:400f:ffff:ffff:ffff:ffff:ffff,US
2620:f0:8000::,2620:f0:8000:ffff:ffff:ffff:ffff:ffff,US
-2620:f0:c000::,2620:f0:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:f0:c000::,2620:f0:c002:ffff:ffff:ffff:ffff:ffff,US
+2620:f0:c003::,2620:f0:c003:ffff:ffff:ffff:ffff:ffff,NL
+2620:f0:c004::,2620:f0:c004:ffff:ffff:ffff:ffff:ffff,US
+2620:f0:c005::,2620:f0:c005:ffff:ffff:ffff:ffff:ffff,SG
+2620:f0:c006::,2620:f0:c009:ffff:ffff:ffff:ffff:ffff,US
+2620:f0:c00a::,2620:f0:c00a:ffff:ffff:ffff:ffff:ffff,CA
+2620:f0:c00b::,2620:f0:c00f:ffff:ffff:ffff:ffff:ffff,US
2620:f1::,2620:f1::ffff:ffff:ffff:ffff:ffff,US
2620:f1:4000::,2620:f1:4000:ffff:ffff:ffff:ffff:ffff,CA
2620:f1:8000::,2620:f1:8000:ffff:ffff:ffff:ffff:ffff,US
@@ -15561,7 +15948,6 @@
2620:fb::,2620:fb::ffff:ffff:ffff:ffff:ffff,US
2620:fb:4000::,2620:fb:4000:ffff:ffff:ffff:ffff:ffff,US
2620:fb:8000::,2620:fb:8000:ffff:ffff:ffff:ffff:ffff,US
-2620:fb:c000::,2620:fb:c000:ffff:ffff:ffff:ffff:ffff,US
2620:fc::,2620:fc::ffff:ffff:ffff:ffff:ffff,CA
2620:fc:4000::,2620:fc:4000:ffff:ffff:ffff:ffff:ffff,CA
2620:fc:8000::,2620:fc:8000:ffff:ffff:ffff:ffff:ffff,US
@@ -15684,7 +16070,7 @@
2620:106:b000::,2620:106:b00f:ffff:ffff:ffff:ffff:ffff,US
2620:106:c000::,2620:106:c00f:ffff:ffff:ffff:ffff:ffff,US
2620:106:d000::,2620:106:d0ff:ffff:ffff:ffff:ffff:ffff,US
-2620:106:e000::,2620:106:e00f:ffff:ffff:ffff:ffff:ffff,US
+2620:106:e000::,2620:106:e0ff:ffff:ffff:ffff:ffff:ffff,US
2620:106:f000::,2620:106:f00f:ffff:ffff:ffff:ffff:ffff,CA
2620:107::,2620:107:ff:ffff:ffff:ffff:ffff:ffff,US
2620:107:1000::,2620:107:100f:ffff:ffff:ffff:ffff:ffff,US
@@ -15902,7 +16288,6 @@
2620:114:2000::,2620:114:20ff:ffff:ffff:ffff:ffff:ffff,US
2620:114:3000::,2620:114:300f:ffff:ffff:ffff:ffff:ffff,US
2620:114:5000::,2620:114:50ff:ffff:ffff:ffff:ffff:ffff,US
-2620:114:6000::,2620:114:600f:ffff:ffff:ffff:ffff:ffff,US
2620:114:8000::,2620:114:80ff:ffff:ffff:ffff:ffff:ffff,US
2620:114:9000::,2620:114:900f:ffff:ffff:ffff:ffff:ffff,US
2620:114:a000::,2620:114:a00f:ffff:ffff:ffff:ffff:ffff,US
@@ -15922,7 +16307,6 @@
2620:115:7000::,2620:115:70ff:ffff:ffff:ffff:ffff:ffff,US
2620:115:8000::,2620:115:800f:ffff:ffff:ffff:ffff:ffff,US
2620:115:9000::,2620:115:900f:ffff:ffff:ffff:ffff:ffff,US
-2620:115:a000::,2620:115:a00f:ffff:ffff:ffff:ffff:ffff,US
2620:115:b000::,2620:115:b00f:ffff:ffff:ffff:ffff:ffff,US
2620:115:c000::,2620:115:c0ff:ffff:ffff:ffff:ffff:ffff,US
2620:115:d000::,2620:115:d0ff:ffff:ffff:ffff:ffff:ffff,US
@@ -16351,6 +16735,29 @@
2620:130:3000::,2620:130:30ff:ffff:ffff:ffff:ffff:ffff,US
2620:130:4000::,2620:130:40ff:ffff:ffff:ffff:ffff:ffff,US
2620:130:5000::,2620:130:500f:ffff:ffff:ffff:ffff:ffff,US
+2620:130:6000::,2620:130:600f:ffff:ffff:ffff:ffff:ffff,US
+2620:130:7000::,2620:130:70ff:ffff:ffff:ffff:ffff:ffff,US
+2620:130:8000::,2620:130:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:130:9000::,2620:130:90ff:ffff:ffff:ffff:ffff:ffff,US
+2620:130:a000::,2620:130:a00f:ffff:ffff:ffff:ffff:ffff,CA
+2620:130:c000::,2620:130:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:130:d000::,2620:130:d00f:ffff:ffff:ffff:ffff:ffff,US
+2620:130:e000::,2620:130:e00f:ffff:ffff:ffff:ffff:ffff,US
+2620:130:f000::,2620:130:f00f:ffff:ffff:ffff:ffff:ffff,US
+2620:131::,2620:131:f:ffff:ffff:ffff:ffff:ffff,US
+2620:131:1000::,2620:131:10ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:2000::,2620:131:20ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:3000::,2620:131:300f:ffff:ffff:ffff:ffff:ffff,US
+2620:131:4000::,2620:131:40ff:ffff:ffff:ffff:ffff:ffff,CA
+2620:131:5000::,2620:131:50ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:6000::,2620:131:60ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:7000::,2620:131:70ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:8000::,2620:131:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:131:9000::,2620:131:90ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:a000::,2620:131:a0ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:b000::,2620:131:b0ff:ffff:ffff:ffff:ffff:ffff,US
+2620:131:c000::,2620:131:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:131:d000::,2620:131:d0ff: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
@@ -16379,7 +16786,9 @@
2620:159::,2620:159:fff:ffff:ffff:ffff:ffff:ffff,US
2620:15a::,2620:15a:fff:ffff:ffff:ffff:ffff:ffff,US
2620:15b::,2620:15b:fff:ffff:ffff:ffff:ffff:ffff,US
-2620:15c::,2620:15c:4:ffff:ffff:ffff:ffff:ffff,US
+2620:15c::,2620:15c::ffff:ffff:ffff:ffff:ffff,US
+2620:15c:1::,2620:15c:1:ffff:ffff:ffff:ffff:ffff,CA
+2620:15c:2::,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:15f:fff:ffff:ffff:ffff:ffff:ffff,US
@@ -16417,6 +16826,8 @@
2620:188::,2620:188:fff:ffff:ffff:ffff:ffff:ffff,US
2620:189::,2620:189:fff:ffff:ffff:ffff:ffff:ffff,US
2620:18a::,2620:18a:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:18b::,2620:18c:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:18d::,2620:18d: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
@@ -16684,7 +17095,7 @@
2801:0:180::,2801::180:ffff:ffff:ffff:ffff:ffff,CO
2801:0:190::,2801::190:ffff:ffff:ffff:ffff:ffff,AR
2801:0:1a0::,2801::1a0:ffff:ffff:ffff:ffff:ffff,HN
-2801:0:1b0::,2801::1b0:ffff:ffff:ffff:ffff:ffff,AR
+2801:0:1b0::,2801::1bf: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:1f0::,2801::1f0:ffff:ffff:ffff:ffff:ffff,PY
@@ -16746,6 +17157,7 @@
2801:11::,2801:11::ffff:ffff:ffff:ffff:ffff,AR
2801:11:1000::,2801:11:1000:ffff:ffff:ffff:ffff:ffff,PY
2801:11:2000::,2801:11:2000:ffff:ffff:ffff:ffff:ffff,AR
+2801:11:3000::,2801:11:3000:ffff:ffff:ffff:ffff:ffff,CR
2801:11:4000::,2801:11:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:11:5000::,2801:11:5000:ffff:ffff:ffff:ffff:ffff,CO
2801:11:6000::,2801:11:6000:ffff:ffff:ffff:ffff:ffff,AR
@@ -16794,6 +17206,7 @@
2801:15::,2801:15::ffff:ffff:ffff:ffff:ffff,EC
2801:15:1000::,2801:15:1000:ffff:ffff:ffff:ffff:ffff,SV
2801:15:2000::,2801:15:2000:ffff:ffff:ffff:ffff:ffff,CR
+2801:15:3000::,2801:15:3000:ffff:ffff:ffff:ffff:ffff,CO
2801:15:4000::,2801:15:4000:ffff:ffff:ffff:ffff:ffff,CO
2801:15:5000::,2801:15:5000:ffff:ffff:ffff:ffff:ffff,CO
2801:15:6000::,2801:15:6000:ffff:ffff:ffff:ffff:ffff,SV
@@ -16807,6 +17220,7 @@
2801:16:e0::,2801:16:e0:ffff:ffff:ffff:ffff:ffff,GY
2801:16:1000::,2801:16:1000:ffff:ffff:ffff:ffff:ffff,AR
2801:16:2000::,2801:16:2000:ffff:ffff:ffff:ffff:ffff,HN
+2801:16:3000::,2801:16:3000:ffff:ffff:ffff:ffff:ffff,PA
2801:16:4000::,2801:16:4000:ffff:ffff:ffff:ffff:ffff,AR
2801:16:5000::,2801:16:5000:ffff:ffff:ffff:ffff:ffff,CO
2801:16:6000::,2801:16:6000:ffff:ffff:ffff:ffff:ffff,AR
@@ -16842,6 +17256,7 @@
2801:19::,2801:19::ffff:ffff:ffff:ffff:ffff,AR
2801:19:1000::,2801:19:1000:ffff:ffff:ffff:ffff:ffff,PA
2801:19:2000::,2801:19:2000:ffff:ffff:ffff:ffff:ffff,CL
+2801:19:3000::,2801:19:3000:ffff:ffff:ffff:ffff:ffff,CO
2801:19:4000::,2801:19:4000:ffff:ffff:ffff:ffff:ffff,PY
2801:19:5000::,2801:19:5000:ffff:ffff:ffff:ffff:ffff,CO
2801:19:6000::,2801:19:6000:ffff:ffff:ffff:ffff:ffff,CW
@@ -16888,6 +17303,7 @@
2801:1d::,2801:1d::ffff:ffff:ffff:ffff:ffff,PY
2801:1d:1000::,2801:1d:1000:ffff:ffff:ffff:ffff:ffff,AR
2801:1d:2000::,2801:1d:2000:ffff:ffff:ffff:ffff:ffff,GT
+2801:1d:3000::,2801:1d:3000:ffff:ffff:ffff:ffff:ffff,AR
2801:1d:4000::,2801:1d:4000:ffff:ffff:ffff:ffff:ffff,TT
2801:1d:5000::,2801:1d:5000:ffff:ffff:ffff:ffff:ffff,AR
2801:1d:6000::,2801:1d:6000:ffff:ffff:ffff:ffff:ffff,NI
@@ -16900,6 +17316,7 @@
2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC
2801:1e:1000::,2801:1e:1000:ffff:ffff:ffff:ffff:ffff,AR
2801:1e:2000::,2801:1e:2000:ffff:ffff:ffff:ffff:ffff,AR
+2801:1e:3000::,2801:1e:3000:ffff:ffff:ffff:ffff:ffff,CO
2801:1e:4000::,2801:1e:4007:ffff:ffff:ffff:ffff:ffff,AR
2801:1e:5000::,2801:1e:5000:ffff:ffff:ffff:ffff:ffff,EC
2801:1e:6000::,2801:1e:6000:ffff:ffff:ffff:ffff:ffff,CO
@@ -17006,7 +17423,6 @@
2801:80:570::,2801:80:570:ffff:ffff:ffff:ffff:ffff,BR
2801:80:580::,2801:80:581:ffff:ffff:ffff:ffff:ffff,BR
2801:80:590::,2801:80:590:ffff:ffff:ffff:ffff:ffff,BR
-2801:80:5a0::,2801:80:5a0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:5b0::,2801:80:5b0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:5c0::,2801:80:5c0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:5d0::,2801:80:5d0:ffff:ffff:ffff:ffff:ffff,BR
@@ -17108,14 +17524,12 @@
2801:80:c50::,2801:80:c50:ffff:ffff:ffff:ffff:ffff,BR
2801:80:c60::,2801:80:c60:ffff:ffff:ffff:ffff:ffff,BR
2801:80:c70::,2801:80:c70:ffff:ffff:ffff:ffff:ffff,BR
-2801:80:c80::,2801:80:c80:ffff:ffff:ffff:ffff:ffff,BR
2801:80:c90::,2801:80:c90:ffff:ffff:ffff:ffff:ffff,BR
2801:80:ca0::,2801:80:ca0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:cb0::,2801:80:cb0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:cc0::,2801:80:cc0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:cd0::,2801:80:cd0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:ce0::,2801:80:ce0:ffff:ffff:ffff:ffff:ffff,BR
-2801:80:cf0::,2801:80:cf0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:d00::,2801:80:d00:ffff:ffff:ffff:ffff:ffff,BR
2801:80:d10::,2801:80:d10:ffff:ffff:ffff:ffff:ffff,BR
2801:80:d20::,2801:80:d2f:ffff:ffff:ffff:ffff:ffff,BR
@@ -17142,7 +17556,6 @@
2801:80:eb0::,2801:80:eb0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:ec0::,2801:80:ec0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:ed0::,2801:80:ed0:ffff:ffff:ffff:ffff:ffff,BR
-2801:80:ee0::,2801:80:ee0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:ef0::,2801:80:ef0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:f00::,2801:80:f00:ffff:ffff:ffff:ffff:ffff,BR
2801:80:f10::,2801:80:f10:ffff:ffff:ffff:ffff:ffff,BR
@@ -17266,7 +17679,20 @@
2801:80:1cb0::,2801:80:1cb0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:1cc0::,2801:80:1cc0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:1cd0::,2801:80:1cd0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1ce0::,2801:80:1cef:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d00::,2801:80:1d01:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d10::,2801:80:1d10:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d20::,2801:80:1d20:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d30::,2801:80:1d30:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d40::,2801:80:1d40:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d50::,2801:80:1d50:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d60::,2801:80:1d60:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d70::,2801:80:1d70:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d80::,2801:80:1d80:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1d90::,2801:80:1d90:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1da0::,2801:80:1da0:ffff:ffff:ffff:ffff:ffff,BR
2801:80:1e00::,2801:80:1eff:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:2000::,2801:80:20ff: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
@@ -17344,6 +17770,7 @@
2801:190::,2801:190:fff:ffff:ffff:ffff:ffff:ffff,CO
2801:198::,2801:198:ffff:ffff:ffff:ffff:ffff:ffff,CL
2801:1a0::,2801:1a0:3f:ffff:ffff:ffff:ffff:ffff,CO
+2801:1a4::,2801:1a4:f:ffff:ffff:ffff:ffff:ffff,AR
2801:1a8::,2801:1a8:ff:ffff:ffff:ffff:ffff:ffff,AR
2801:1b0::,2801:1b0:ff:ffff:ffff:ffff:ffff:ffff,CO
2801:1b8::,2801:1b8:f:ffff:ffff:ffff:ffff:ffff,UY
@@ -17401,6 +17828,7 @@
2803:700::,2803:700:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:740::,2803:740:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:780::,2803:780:ffff:ffff:ffff:ffff:ffff:ffff,VE
+2803:7c0::,2803:7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:800::,2803:800:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:840::,2803:840:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:880::,2803:880:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17416,6 +17844,7 @@
2803:b00::,2803:b00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:b40::,2803:b40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:b80::,2803:b80:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:bc0::,2803:bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:c00::,2803:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c40::,2803:c40:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:c80::,2803:c80:ffff:ffff:ffff:ffff:ffff:ffff,PY
@@ -17435,6 +17864,7 @@
2803:f00:4aa:8000::,2803:f00:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:f40::,2803:f40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f80::,2803:f80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:fc0::,2803:fc0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:1000::,2803:1000:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:1040::,2803:1040:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:1080::,2803:1080:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17465,6 +17895,7 @@
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
+2803:17c0::,2803:17c0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:1800::,2803:1800:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1840::,2803:1840:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17477,6 +17908,7 @@
2803:1b00::,2803:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1b40::,2803:1b40:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:1b80::,2803:1b80:ffff:ffff:ffff:ffff:ffff:ffff,TT
+2803:1bc0::,2803:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1c40::,2803:1c40:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:1c80::,2803:1c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1cc0::,2803:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17521,6 +17953,7 @@
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
+2803:27c0::,2803:27c0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:2800::,2803:2800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:2840::,2803:2840:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:2880::,2803:2880:ffff:ffff:ffff:ffff:ffff:ffff,BO
@@ -17536,6 +17969,7 @@
2803:2b00::,2803:2b00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:2b40::,2803:2b40:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:2b80::,2803:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DO
+2803:2bc0::,2803:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:2c00::,2803:2c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2c40::,2803:2c40:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:2c80::,2803:2c80:ffff:ffff:ffff:ffff:ffff:ffff,VE
@@ -17565,6 +17999,7 @@
2803:3300::,2803:3300:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:3340::,2803:3340:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3380::,2803:3380:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:33c0::,2803:33c0:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:3400::,2803:3400:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:3440::,2803:3440:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:3480::,2803:3480:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17580,6 +18015,7 @@
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
+2803:37c0::,2803:37c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3800::,2803:3800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:3840::,2803:3840:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3880::,2803:3880:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17595,6 +18031,7 @@
2803:3b00::,2803:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3b40::,2803:3b40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3b80::,2803:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:3bc0::,2803:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:3c00::,2803:3c00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:3c40::,2803:3c40:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:3c80::,2803:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -17638,9 +18075,10 @@
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:4700::,2803:4701: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
+2803:47c0::,2803:47c0:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:4800::,2803:4800:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:4840::,2803:4840:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4880::,2803:4880:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17655,6 +18093,7 @@
2803:4b00::,2803:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4b40::,2803:4b40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4b80::,2803:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:4bc0::,2803:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:4c00::,2803:4c00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:4c40::,2803:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4c80::,2803:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17670,6 +18109,7 @@
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
+2803:4fc0::,2803:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5000::,2803:5000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5040::,2803:5040:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:5080::,2803:5080:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17685,6 +18125,7 @@
2803:5300::,2803:5300:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:5340::,2803:5340:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5380::,2803:5380:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:53c0::,2803:53c0:ffff:ffff:ffff:ffff:ffff:ffff,GF
2803:5400::,2803:5400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5440::,2803:5440:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5480::,2803:5480:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17700,6 +18141,7 @@
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
+2803:57c0::,2803:57c0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:5840::,2803:5840:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:5880::,2803:5880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:58c0::,2803:58c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17714,6 +18156,7 @@
2803:5b00::,2803:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:5b40::,2803:5b40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5b80::,2803:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:5bc0::,2803:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5c00::,2803:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:5c40::,2803:5c40:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:5c80::,2803:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -17758,6 +18201,7 @@
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
+2803:67c0::,2803:67c0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:6800::,2803:6800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6840::,2803:6840:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6880::,2803:6880:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17773,6 +18217,7 @@
2803:6b00::,2803:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6b40::,2803:6b40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6b80::,2803:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:6bc0::,2803:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:6c00::,2803:6c00:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:6c40::,2803:6c40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6c80::,2803:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17803,6 +18248,7 @@
2803:7300::,2803:7300:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7340::,2803:7340:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7380::,2803:7380:ffff:ffff:ffff:ffff:ffff:ffff,SX
+2803:73c0::,2803:73c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7400::,2803:7400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7440::,2803:7440:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7480::,2803:7480:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17818,6 +18264,7 @@
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
+2803:77c0::,2803:77c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7800::,2803:7800:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:7840::,2803:7840:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7880::,2803:7880:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17833,6 +18280,7 @@
2803:7b00::,2803:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:7b40::,2803:7b40:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:7b80::,2803:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PE
+2803:7bc0::,2803:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:7c00::,2803:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:7c40::,2803:7c40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7c80::,2803:7c80:ffff:ffff:ffff:ffff:ffff:ffff,PA
@@ -17879,6 +18327,7 @@
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
+2803:87c0::,2803:87c0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:8800::,2803:8800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:8840::,2803:8840:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:8880::,2803:8880:ffff:ffff:ffff:ffff:ffff:ffff,NI
@@ -17893,6 +18342,7 @@
2803:8b00::,2803:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:8b40::,2803:8b40:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:8b80::,2803:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:8bc0::,2803:8bc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8c00::,2803:8c00:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:8c40::,2803:8c40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8c80::,2803:8c80:ffff:ffff:ffff:ffff:ffff:ffff,PA
@@ -17908,6 +18358,7 @@
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
+2803:8fc0::,2803:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9000::,2803:9000:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9040::,2803:9040:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:9080::,2803:9080:ffff:ffff:ffff:ffff:ffff:ffff,HN
@@ -17923,6 +18374,7 @@
2803:9300::,2803:9300:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9340::,2803:9340:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:9380::,2803:9380:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:93c0::,2803:93c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9400::,2803:9400:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:9440::,2803:9440:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9480::,2803:9480:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17937,6 +18389,7 @@
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:97c0::,2803:97c0:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9840::,2803:9840:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:9880::,2803:9880:ffff:ffff:ffff:ffff:ffff:ffff,BZ
@@ -17952,6 +18405,7 @@
2803:9b00::,2803:9b00:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:9b40::,2803:9b40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9b80::,2803:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:9bc0::,2803:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:9c00::,2803:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9c40::,2803:9c40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9c80::,2803:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -17997,6 +18451,7 @@
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
+2803:a7c0::,2803:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a800::,2803:a800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:a840::,2803:a840:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:a880::,2803:a880:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -18012,6 +18467,7 @@
2803:ab00::,2803:ab00:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:ab40::,2803:ab40:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:ab80::,2803:ab80:ffff:ffff:ffff:ffff:ffff:ffff,PE
+2803:abc0::,2803:abc0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:ac00::,2803:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:ac40::,2803:ac40:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:ac80::,2803:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CO
@@ -18041,6 +18497,7 @@
2803:b300::,2803:b300:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:b340::,2803:b340:ffff:ffff:ffff:ffff:ffff:ffff,SX
2803:b380::,2803:b380:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:b3c0::,2803:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:b400::,2803:b400:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:b440::,2803:b440:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:b480::,2803:b480:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -18056,6 +18513,7 @@
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
+2803:b7c0::,2803:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:b800::,2803:b800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:b840::,2803:b840:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:b880::,2803:b880:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -18070,6 +18528,7 @@
2803:bb00::,2803:bb00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bb40::,2803:bb40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bb80::,2803:bb80:ffff:ffff:ffff:ffff:ffff:ffff,VE
+2803:bbc0::,2803:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:bc00::,2803:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bc40::,2803:bc40:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:bc80::,2803:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CO
@@ -18116,6 +18575,7 @@
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
+2803:c7c0::,2803:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:c800::,2803:c800:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:c840::,2803:c840:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:c880::,2803:c880:ffff:ffff:ffff:ffff:ffff:ffff,HN
@@ -18131,6 +18591,7 @@
2803:cb00::,2803:cb00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:cb40::,2803:cb40:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:cb80::,2803:cb80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:cbc0::,2803:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:cc00::,2803:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:cc40::,2803:cc40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:cc80::,2803:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -18162,6 +18623,7 @@
2803:d2c0::,2803:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d340::,2803:d340:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d380::,2803:d380:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:d3c0::,2803:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:d400::,2803:d400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d440::,2803:d440:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE
@@ -18177,6 +18639,7 @@
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
+2803:d7c0::,2803:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d800::,2803:d800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d840::,2803:d840:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:d880::,2803:d880:ffff:ffff:ffff:ffff:ffff:ffff,CR
@@ -18192,6 +18655,7 @@
2803:db00::,2803:db00:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:db40::,2803:db40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:db80::,2803:db80:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:dbc0::,2803:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:dc00::,2803:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:dc40::,2803:dc40:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:dc80::,2803:dc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -18238,6 +18702,7 @@
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
+2803:e7c0::,2803:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:e800::,2803:e800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:e840::,2803:e840:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:e880::,2803:e880:ffff:ffff:ffff:ffff:ffff:ffff,GT
@@ -18253,6 +18718,7 @@
2803:eb40::,2803:eb40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:eb80::,2803:eb80:7fff:ffff:ffff:ffff:ffff:ffff,AR
2803:eb80:8000::,2803:eb80:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:ebc0::,2803:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:ec00::,2803:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ec40::,2803:ec40:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:ec80::,2803:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -18283,6 +18749,7 @@
2803:f300::,2803:f300:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f340::,2803:f340:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:f380::,2803:f380:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:f3c0::,2803:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:f400::,2803:f400:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:f440::,2803:f440:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:f480::,2803:f480:ffff:ffff:ffff:ffff:ffff:ffff,CO
@@ -18298,6 +18765,7 @@
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
+2803:f7c0::,2803:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f800::,2803:f800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:f840::,2803:f840:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:f8c0::,2803:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,DO
@@ -18312,6 +18780,7 @@
2803:fb00::,2803:fb00:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:fb40::,2803:fb40:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:fb80::,2803:fb80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:fbc0::,2803:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:fc00::,2803:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:fc40::,2803:fc40:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:fc80::,2803:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -18341,7 +18810,9 @@
2804:38::,2804:38:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:3c::,2804:3c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:40::,2804:40:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:44::,2804:44:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:44::,2804:44::ffff:ffff:ffff:ffff:ffff,BR
+2804:44:1::,2804:44:1:ffff:ffff:ffff:ffff:ffff,US
+2804:44:2::,2804:44:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:48::,2804:48:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:4c::,2804:4c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:50::,2804:50:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -18378,7 +18849,6 @@
2804:d0::,2804:d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:d4::,2804:d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:d8::,2804:d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:dc::,2804:dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:e0::,2804:e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:e4::,2804:e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:e8::,2804:e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -18533,7 +19003,6 @@
2804:378::,2804:378:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:37c::,2804:37c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:380::,2804:380:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:384::,2804:384:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:388::,2804:38b:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:390::,2804:390:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:394::,2804:394:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -19658,7 +20127,6 @@
2804:15c0::,2804:15c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:15c4::,2804:15c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:15c8::,2804:15c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:15cc::,2804:15cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:15d0::,2804:15d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:15d4::,2804:15d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:15d8::,2804:15d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -19873,7 +20341,6 @@
2804:1930::,2804:1930:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1934::,2804:1934:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1938::,2804:1938:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:193c::,2804:193c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1940::,2804:1940:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1944::,2804:1944:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1948::,2804:1948:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -19952,7 +20419,6 @@
2804:1a6c::,2804:1a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1a70::,2804:1a70:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1a74::,2804:1a74:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1a78::,2804:1a78:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1a7c::,2804:1a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1a80::,2804:1a80:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1a84::,2804:1a84:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20033,7 +20499,6 @@
2804:1bb4::,2804:1bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1bb8::,2804:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1bbc::,2804:1bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1bc0::,2804:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1bc4::,2804:1bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1bc8::,2804:1bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1bcc::,2804:1bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20071,7 +20536,6 @@
2804:1c4c::,2804:1c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1c50::,2804:1c50:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1c54::,2804:1c54:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1c58::,2804:1c58:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1c5c::,2804:1c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1c60::,2804:1c60:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1c64::,2804:1c64:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20107,7 +20571,6 @@
2804:1cdc::,2804:1cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1ce0::,2804:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1ce4::,2804:1ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1ce8::,2804:1ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1cec::,2804:1cec:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1cf0::,2804:1cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1cf4::,2804:1cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20143,11 +20606,9 @@
2804:1d6c::,2804:1d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d70::,2804:1d70:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d74::,2804:1d74:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1d78::,2804:1d78:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d7c::,2804:1d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d80::,2804:1d80:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d84::,2804:1d84:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1d88::,2804:1d88:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d8c::,2804:1d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d90::,2804:1d90:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1d94::,2804:1d94:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20208,7 +20669,6 @@
2804:1e74::,2804:1e74:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1e78::,2804:1e78:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1e7c::,2804:1e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1e80::,2804:1e80:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1e84::,2804:1e84:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1e88::,2804:1e88:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1e8c::,2804:1e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20221,7 +20681,6 @@
2804:1ea8::,2804:1ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1eac::,2804:1eac:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1eb0::,2804:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1eb4::,2804:1eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1eb8::,2804:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1ebc::,2804:1ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1ec0::,2804:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20246,7 +20705,6 @@
2804:1f06::,2804:1f06:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f08::,2804:1f08:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f0a::,2804:1f0a:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:1f0c::,2804:1f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f0e::,2804:1f0e:1fff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f10::,2804:1f10:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f12::,2804:1f12:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20265,6 +20723,7 @@
2804:1f2c::,2804:1f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f2e::,2804:1f2e:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f30::,2804:1f30:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1f32::,2804:1f32: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
@@ -20304,11 +20763,9 @@
2804:2090::,2804:2090:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2094::,2804:2094:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2098::,2804:2098:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:209c::,2804:209c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:20a0::,2804:20a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:20a4::,2804:20a4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:20a8::,2804:20a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:20ac::,2804:20ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:20b0::,2804:20b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:20b4::,2804:20b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:20b8::,2804:20b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20366,7 +20823,6 @@
2804:2188::,2804:2188:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:218c::,2804:218c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2190::,2804:2190:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:2194::,2804:2194:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2198::,2804:2198:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:219c::,2804:219c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:21a0::,2804:21a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20410,7 +20866,6 @@
2804:2238::,2804:2238:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:223c::,2804:223c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2240::,2804:2240:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:2244::,2804:2244:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2248::,2804:2248:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:224c::,2804:224c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2250::,2804:2250:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20420,7 +20875,6 @@
2804:2260::,2804:2260:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2264::,2804:2264:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2268::,2804:2268:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:226c::,2804:226c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2270::,2804:2270:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2274::,2804:2274:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2278::,2804:2278:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20441,7 +20895,6 @@
2804:22bc::,2804:22bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:22c0::,2804:22c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:22c4::,2804:22c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:22c8::,2804:22c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:22cc::,2804:22cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:22d0::,2804:22d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:22d4::,2804:22d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20506,7 +20959,6 @@
2804:23c0::,2804:23c1:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:23c4::,2804:23c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:23c8::,2804:23c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:23cc::,2804:23cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:23d4::,2804:23d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:23d8::,2804:23d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:23dc::,2804:23dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20616,7 +21068,6 @@
2804:2580::,2804:2580:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2584::,2804:2584:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2588::,2804:2588:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:258c::,2804:258c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2590::,2804:2590:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2594::,2804:2594:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2598::,2804:2598:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20659,7 +21110,6 @@
2804:262c::,2804:262c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2630::,2804:2630:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2634::,2804:2634:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:2638::,2804:2638:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:263c::,2804:263c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2640::,2804:2640:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:2644::,2804:2644:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20690,7 +21140,6 @@
2804:26a8::,2804:26a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:26ac::,2804:26ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:26b0::,2804:26b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:26b4::,2804:26b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:26b8::,2804:26b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:26bc::,2804:26bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:26c0::,2804:26c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -20888,8 +21337,6 @@
2804:29c8::,2804:29c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:29cc::,2804:29cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:29d0::,2804:29d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:29d4::,2804:29d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:29d8::,2804:29d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:29dc::,2804:29dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:29e0::,2804:29e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:29e4::,2804:29e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -22210,6 +22657,188 @@
2804:3e74::,2804:3e74:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:3e78::,2804:3e78:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:3e7c::,2804:3e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e80::,2804:3e80:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e84::,2804:3e84:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e88::,2804:3e88:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e8c::,2804:3e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e90::,2804:3e90:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e94::,2804:3e94:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e98::,2804:3e98:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3e9c::,2804:3e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ea0::,2804:3ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ea4::,2804:3ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ea8::,2804:3ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3eac::,2804:3eac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3eb0::,2804:3eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3eb4::,2804:3eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3eb8::,2804:3eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ebc::,2804:3ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ec0::,2804:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ec4::,2804:3ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ec8::,2804:3ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ecc::,2804:3ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ed0::,2804:3ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ed4::,2804:3ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ed8::,2804:3ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3edc::,2804:3edc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ee0::,2804:3ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ee4::,2804:3ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ee8::,2804:3ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3eec::,2804:3eec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ef0::,2804:3ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ef4::,2804:3ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ef8::,2804:3ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3efc::,2804:3efc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f00::,2804:3f00:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f04::,2804:3f04:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f08::,2804:3f08:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f0c::,2804:3f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f10::,2804:3f10:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f14::,2804:3f14:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f18::,2804:3f18:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f1c::,2804:3f1c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f20::,2804:3f20:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f24::,2804:3f24:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f28::,2804:3f28:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f2c::,2804:3f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f30::,2804:3f30:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f34::,2804:3f34:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f38::,2804:3f38:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f3c::,2804:3f3c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f40::,2804:3f40:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f44::,2804:3f44:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f48::,2804:3f48:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f4c::,2804:3f4c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f50::,2804:3f50:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f54::,2804:3f54:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f58::,2804:3f58:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f5c::,2804:3f5c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f60::,2804:3f60:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f64::,2804:3f64:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f68::,2804:3f68:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f6c::,2804:3f6c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f70::,2804:3f70:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f74::,2804:3f74:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f78::,2804:3f78:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f7c::,2804:3f7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f80::,2804:3f80:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f84::,2804:3f84:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f88::,2804:3f88:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f8c::,2804:3f8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f90::,2804:3f90:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f94::,2804:3f94:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f98::,2804:3f98:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3f9c::,2804:3f9c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fa0::,2804:3fa0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fa4::,2804:3fa4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fa8::,2804:3fa8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fac::,2804:3fac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fb0::,2804:3fb0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fb4::,2804:3fb4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fb8::,2804:3fb8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fbc::,2804:3fbc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fc0::,2804:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fc4::,2804:3fc4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fc8::,2804:3fc8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fcc::,2804:3fcc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fd0::,2804:3fd0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fd4::,2804:3fd4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fd8::,2804:3fd8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fdc::,2804:3fdc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fe0::,2804:3fe0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fe4::,2804:3fe4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fe8::,2804:3fe8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3fec::,2804:3fec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ff0::,2804:3ff0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ff4::,2804:3ff4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ff8::,2804:3ff8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:3ffc::,2804:3ffc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4000::,2804:4000:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4004::,2804:4004:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4008::,2804:4008:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:400c::,2804:400c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4010::,2804:4010:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4014::,2804:4014:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4018::,2804:4018:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:401c::,2804:401c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4020::,2804:4020:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4024::,2804:4024:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4028::,2804:4028:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:402c::,2804:402c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4030::,2804:4030:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4034::,2804:4034:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4038::,2804:4038:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:403c::,2804:403c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4040::,2804:4040:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4044::,2804:4044:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4048::,2804:4048:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:404c::,2804:404c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4050::,2804:4050:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4054::,2804:4054:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4058::,2804:4058:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:405c::,2804:405c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4060::,2804:4060:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4064::,2804:4064:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4068::,2804:4068:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:406c::,2804:406c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4070::,2804:4070:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4074::,2804:4074:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4078::,2804:4078:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:407c::,2804:407c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4080::,2804:4080:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4084::,2804:4084:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4088::,2804:4088:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:408c::,2804:408c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4090::,2804:4090:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4094::,2804:4094:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4098::,2804:4098:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:409c::,2804:409c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40a0::,2804:40a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40a4::,2804:40a4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40a8::,2804:40a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40ac::,2804:40ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40b0::,2804:40b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40b4::,2804:40b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40b8::,2804:40b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40bc::,2804:40bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40c0::,2804:40c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40c4::,2804:40c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40c8::,2804:40c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40cc::,2804:40cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40d0::,2804:40d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40d4::,2804:40d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40d8::,2804:40d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40dc::,2804:40dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40e0::,2804:40e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40e4::,2804:40e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40e8::,2804:40e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40ec::,2804:40ec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40f0::,2804:40f0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40f4::,2804:40f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40f8::,2804:40f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:40fc::,2804:40fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4100::,2804:4100:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4104::,2804:4104:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4108::,2804:4108:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:410c::,2804:410c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4110::,2804:4110:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4114::,2804:4114:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4118::,2804:4118:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:411c::,2804:411c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4120::,2804:4120:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4124::,2804:4124:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4128::,2804:4128:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:412c::,2804:412c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4130::,2804:4130:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4134::,2804:4134:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4138::,2804:4138:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:413c::,2804:413c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4140::,2804:4140:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4144::,2804:4144:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4148::,2804:4148:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:414c::,2804:414c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4150::,2804:4150:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:4154::,2804:4154: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
@@ -22225,7 +22854,7 @@
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:2e6:ffff:ffff:ffff:ffff:ffff:ffff,MX
+2806:2e0::,2806:2ed: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
@@ -22557,7 +23186,7 @@
2a00:1630::,2a00:1637:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:1638::,2a00:1638:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a00:1640::,2a00:1640:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:1650::,2a00:1650:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a00:1650::,2a00:1657:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a00:1660::,2a00:1660:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:1668::,2a00:1668:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:1670::,2a00:1670:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -22579,7 +23208,7 @@
2a00:1708::,2a00:1708:ffff:ffff:ffff:ffff:ffff:ffff,NL
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
+2a00:1728::,2a00:172f:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a00:1730::,2a00:1730:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:1748::,2a00:1748:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:1750::,2a00:1750:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -22987,7 +23616,6 @@
2a00:4fe0::,2a00:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:5000::,2a00:5000:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a00:5020::,2a00:5020:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a00:5040::,2a00:5040:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a00:5060::,2a00:5060:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:5080::,2a00:5080:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:50a0::,2a00:50a0:ffff:ffff:ffff:ffff:ffff:ffff,SA
@@ -23048,7 +23676,6 @@
2a00:5760::,2a00:5760:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:5780::,2a00:5780:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:57a0::,2a00:57a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a00:57c0::,2a00:57c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:57e0::,2a00:57e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:5800::,2a00:5800:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a00:5820::,2a00:5820:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -23200,7 +23827,6 @@
2a00:6b00::,2a00:6b00:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:6b20::,2a00:6b20:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a00:6b40::,2a00:6b40:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a00:6b60::,2a00:6b60:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a00:6b80::,2a00:6b87:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a00:6ba0::,2a00:6ba0:ffff:ffff:ffff:ffff:ffff:ffff,PS
2a00:6bc0::,2a00:6bc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -23455,7 +24081,7 @@
2a00:88e0::,2a00:88e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:8900::,2a00:8900:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:8920::,2a00:8920:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:8940::,2a00:8940:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a00:8940::,2a00:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:8960::,2a00:8960:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:8980::,2a00:8980:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:89a0::,2a00:89a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -23509,7 +24135,7 @@
2a00:8fc0::,2a00:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:8fe0::,2a00:8fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:9000::,2a00:9000:ffff:ffff:ffff:ffff:ffff:ffff,LV
-2a00:9020::,2a00:9020:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a00:9020::,2a00:9027:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:9040::,2a00:9047:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:9060::,2a00:9060:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a00:9080::,2a00:9080:ffff:ffff:ffff:ffff:ffff:ffff,DK
@@ -23565,7 +24191,6 @@
2a00:9640::,2a00:9640:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a00:9660::,2a00:9660:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:9680::,2a00:9680:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:96a0::,2a00:96a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:96c0::,2a00:96c0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:96e0::,2a00:96e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:9700::,2a00:9700:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -23635,7 +24260,7 @@
2a00:9f40::,2a00:9f47:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a00:9f60::,2a00:9f60:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a00:9f80::,2a00:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a00:9fa0::,2a00:9fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:9fa0::,2a00:9fa7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:9fc0::,2a00:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a00:9fe0::,2a00:9fe7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:a000::,2a00:a000:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -23781,13 +24406,12 @@
2a00:b1e0::,2a00:b1e0:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a00:b200::,2a00:b200:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:b220::,2a00:b220:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a00:b240::,2a00:b240:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:b260::,2a00:b260:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:b280::,2a00:b280:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:b2a0::,2a00:b2a0:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a00:b2c0::,2a00:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:b2e0::,2a00:b2e0:ffff:ffff:ffff:ffff:ffff:ffff,SA
-2a00:b300::,2a00:b300:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a00:b300::,2a00:b307:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:b320::,2a00:b320:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:b340::,2a00:b340:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:b360::,2a00:b360:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -23903,7 +24527,6 @@
2a00:c1e0::,2a00:c1e7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:c200::,2a00:c200:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a00:c220::,2a00:c220:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:c240::,2a00:c240:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:c260::,2a00:c260:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:c280::,2a00:c280:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a00:c2a0::,2a00:c2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -23949,7 +24572,7 @@
2a00:c760::,2a00:c760:ffff:ffff:ffff:ffff:ffff:ffff,HU
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:c7c0::,2a00:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
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
@@ -24009,7 +24632,6 @@
2a00:cec0::,2a00:cec0:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a00:cee0::,2a00:cee7:ffff:ffff:ffff:ffff:ffff:ffff,PS
2a00:cf00::,2a00:cf00:ffff:ffff:ffff:ffff:ffff:ffff,RS
-2a00:cf20::,2a00:cf20:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a00:cf40::,2a00:cf40:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:cf60::,2a00:cf60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:cf80::,2a00:cf80:ffff:ffff:ffff:ffff:ffff:ffff,DK
@@ -24148,7 +24770,6 @@
2a00:e040::,2a00:e040:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:e060::,2a00:e060:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:e080::,2a00:e080:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a00:e0a0::,2a00:e0a0:ffff:ffff:ffff:ffff:ffff:ffff,US
2a00:e0c0::,2a00:e0c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:e100::,2a00:e100:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:e120::,2a00:e120:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -24277,13 +24898,11 @@
2a00:f0e0::,2a00:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,QA
2a00:f100::,2a00:f100:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a00:f120::,2a00:f120:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a00:f140::,2a00:f147:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:f160::,2a00:f160:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:f180::,2a00:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:f1a0::,2a00:f1a0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:f1c0::,2a00:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:f200::,2a00:f200:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a00:f220::,2a00:f220:ffff:ffff:ffff:ffff:ffff:ffff,ME
2a00:f240::,2a00:f240:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:f260::,2a00:f260:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a00:f280::,2a00:f280:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -24503,7 +25122,9 @@
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
-2a01:111:f100:e000::,2a01:111:f101:ffff:ffff:ffff:ffff:ffff,GB
+2a01:111:f100:e000::,2a01:111:f100:efff:ffff:ffff:ffff:ffff,GB
+2a01:111:f100:f000::,2a01:111:f100:ffff:ffff:ffff:ffff:ffff,US
+2a01:111:f101::,2a01:111:f101:ffff:ffff:ffff:ffff:ffff,GB
2a01:111:f102::,2a01:111:f102:fff:ffff:ffff:ffff:ffff,BR
2a01:111:f102:1000::,2a01:111:f102:7fff:ffff:ffff:ffff:ffff,US
2a01:111:f102:8000::,2a01:111:f102:8fff:ffff:ffff:ffff:ffff,HK
@@ -24868,7 +25489,9 @@
2a01:111:f400:e28c::,2a01:111:f400:e28c:ffff:ffff:ffff:ffff,SG
2a01:111:f400:e28d::,2a01:111:f400:e28d:ffff:ffff:ffff:ffff,HK
2a01:111:f400:e28e::,2a01:111:f400:e28f:ffff:ffff:ffff:ffff,GB
-2a01:111:f400:e290::,2a01:111:f400:e2cb:ffff:ffff:ffff:ffff,US
+2a01:111:f400:e290::,2a01:111:f400:e2b7:ffff:ffff:ffff:ffff,US
+2a01:111:f400:e2b8::,2a01:111:f400:e2b8:ffff:ffff:ffff:ffff,GB
+2a01:111:f400:e2b9::,2a01:111:f400:e2cb:ffff:ffff:ffff:ffff,US
2a01:111:f400:e2cc::,2a01:111:f400:e2cd:ffff:ffff:ffff:ffff,HK
2a01:111:f400:e2ce::,2a01:111:f400:e2ce:ffff:ffff:ffff:ffff,US
2a01:111:f400:e2cf::,2a01:111:f400:e2cf:ffff:ffff:ffff:ffff,GB
@@ -24941,9 +25564,7 @@
2a01:111:f400:f36d::,2a01:111:f400:f37f:ffff:ffff:ffff:ffff,GB
2a01:111:f400:f380::,2a01:111:f400:f380:ffff:ffff:ffff:ffff,FI
2a01:111:f400:f381::,2a01:111:f400:f381:ffff:ffff:ffff:ffff,AT
-2a01:111:f400:f382::,2a01:111:f400:f3ff:ffff:ffff:ffff:ffff,GB
-2a01:111:f400:f400::,2a01:111:f400:f400:ffff:ffff:ffff:ffff,US
-2a01:111:f400:f401::,2a01:111:f400:f500:ffff:ffff:ffff:ffff,GB
+2a01:111:f400:f382::,2a01:111:f400:f500:ffff:ffff:ffff:ffff,GB
2a01:111:f400:f501::,2a01:111:f400:f506:ffff:ffff:ffff:ffff,NL
2a01:111:f400:f507::,2a01:111:f400:f510:ffff:ffff:ffff:ffff,GB
2a01:111:f400:f511::,2a01:111:f400:f531:ffff:ffff:ffff:ffff,US
@@ -25052,7 +25673,8 @@
2a01:111:f402:9800::,2a01:111:f402:9bff:ffff:ffff:ffff:ffff,US
2a01:111:f402:9c00::,2a01:111:f402:9fff:ffff:ffff:ffff:ffff,IE
2a01:111:f402:a000::,2a01:111:f402:a3ff:ffff:ffff:ffff:ffff,HK
-2a01:111:f402:a400::,2a01:111:f402:a802:ffff:ffff:ffff:ffff,GB
+2a01:111:f402:a400::,2a01:111:f402:a7ff:ffff:ffff:ffff:ffff,US
+2a01:111:f402:a800::,2a01:111:f402:a802:ffff:ffff:ffff:ffff,GB
2a01:111:f402:a803::,2a01:111:f402:a803:ffff:ffff:ffff:ffff,SG
2a01:111:f402:a804::,2a01:111:f402:a805:ffff:ffff:ffff:ffff,GB
2a01:111:f402:a806::,2a01:111:f402:a806:ffff:ffff:ffff:ffff,SG
@@ -25206,6 +25828,7 @@
2a01:3e0:1300::,2a01:3e0:1300:ff:ffff:ffff:ffff:ffff,GB
2a01:3e0:1400::,2a01:3e0:1400:ff:ffff:ffff:ffff:ffff,NL
2a01:3e0:1500::,2a01:3e0:1500:ff:ffff:ffff:ffff:ffff,GB
+2a01:3e0:1501::,2a01:3e0:1501:ffff:ffff:ffff:ffff:ffff,GB
2a01:3e0:1600::,2a01:3e0:1600:ffff:ffff:ffff:ffff:ffff,GB
2a01:3e0:1601::,2a01:3e0:1601:ffff:ffff:ffff:ffff:ffff,FI
2a01:3e0:1700::,2a01:3e0:1701:ff:ffff:ffff:ffff:ffff,GB
@@ -25476,8 +26099,7 @@
2a01:4f20::,2a01:4f20:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:4f40::,2a01:4f40:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:4f60::,2a01:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a01:4f80::,2a01:4f80:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:4fa0::,2a01:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:4f80::,2a01:4f87:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:4fc0::,2a01:4fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:4fe0::,2a01:4fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:5000::,2a01:5000:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -25711,7 +26333,6 @@
2a01:6c60:13::,2a01:6c60:fff:ffff:ffff:ffff:ffff:ffff,GB
2a01:6c60:1000::,2a01:6c60:1fff:ffff:ffff:ffff:ffff:ffff,US
2a01:6c60:2000::,2a01:6c60:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a01:6c80::,2a01:6c80:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:6ca0::,2a01:6ca0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:6ce0::,2a01:6ce0:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:6d00::,2a01:6d00:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -25808,7 +26429,6 @@
2a01:7880::,2a01:7880:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:78a0::,2a01:78a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:78c0::,2a01:78c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a01:78e0::,2a01:78e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:7900::,2a01:7900:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:7920::,2a01:7927:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a01:7940::,2a01:7940:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -25850,7 +26470,6 @@
2a01:7e00::,2a01:7e00:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:7e01::,2a01:7e01:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:7e20::,2a01:7e27:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a01:7e40::,2a01:7e40:ffff:ffff:ffff:ffff:ffff:ffff,BH
2a01:7e60::,2a01:7e60:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a01:7e80::,2a01:7e80:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:7ea0::,2a01:7ea0:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -25992,7 +26611,6 @@
2a01:8f00::,2a01:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:8f20::,2a01:8f20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:8f40::,2a01:8f40:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a01:8f60::,2a01:8f67:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:8f80::,2a01:8f87:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:8fa0::,2a01:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:8fc0::,2a01:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -26092,7 +26710,6 @@
2a01:9be0::,2a01:9be0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9c00::,2a01:9c00:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:9c20::,2a01:9c20:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2a01:9c40::,2a01:9c41:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:9c60::,2a01:9c60:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a01:9c80::,2a01:9c80:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a01:9ca0::,2a01:9ca0:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -26218,7 +26835,6 @@
2a01:abc0::,2a01:abc0:ffff:ffff:ffff:ffff:ffff:ffff,MT
2a01:abe0::,2a01:abe0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:ac00::,2a01:ac00:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:ac20::,2a01:ac20:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:ac40::,2a01:ac40:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:ac60::,2a01:ac60:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:ac80::,2a01:ac87:ffff:ffff:ffff:ffff:ffff:ffff,RS
@@ -26494,8 +27110,7 @@
2a02:300::,2a02:300:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:308::,2a02:30f:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:310::,2a02:310:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:320::,2a02:320:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:328::,2a02:32f:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:320::,2a02:32f:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:330::,2a02:330:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:338::,2a02:338:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:340::,2a02:340:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -26552,7 +27167,7 @@
2a02:4e8::,2a02:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4f0::,2a02:4f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:4f8::,2a02:4f8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:500::,2a02:500:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a02:500::,2a02:507:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a02:508::,2a02:508:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:518::,2a02:518:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:520::,2a02:520:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -26856,7 +27471,7 @@
2a02:eb8::,2a02:ebf:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:ec0::,2a02:ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:ec8::,2a02:ec8:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:ed0::,2a02:ed0:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a02:ed0::,2a02:ed7:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a02:ed8::,2a02:ed8:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:ee0::,2a02:ee0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:ef0::,2a02:ef0:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -26978,7 +27593,7 @@
2a02:1788:4ff:8500::,2a02:1788:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:1790::,2a02:1790:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a02:1798::,2a02:179f:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:17a0::,2a02:17a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:17a0::,2a02:17a7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:17a8::,2a02:17a8:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a02:17b0::,2a02:17b0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:17b8::,2a02:17b8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -27088,7 +27703,6 @@
2a02:2310::,2a02:2310:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:2318::,2a02:2318::7fff:ffff:ffff:ffff:ffff,IM
2a02:2318:0:8000::,2a02:231f:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:2320::,2a02:2320:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:2328::,2a02:2328:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:2330::,2a02:2337:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a02:2338::,2a02:233f:ffff:ffff:ffff:ffff:ffff:ffff,DK
@@ -27224,7 +27838,6 @@
2a02:2788::,2a02:2788:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:2790::,2a02:2790:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:2798::,2a02:2798:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:27a0::,2a02:27a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:27a8::,2a02:27a9:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:27aa::,2a02:27aa:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a02:27ab::,2a02:27ab:ffff:ffff:ffff:ffff:ffff:ffff,UA
@@ -27397,7 +28010,7 @@
2a02:4060::,2a02:4067:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:4080::,2a02:4080:ffff:ffff:ffff:ffff:ffff:ffff,LB
2a02:40a0::,2a02:40a0:ffff:ffff:ffff:ffff:ffff:ffff,IL
-2a02:40c0::,2a02:40c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:40c0::,2a02:40c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:40e0::,2a02:40e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:4100::,2a02:4100:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4120::,2a02:4120:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -27438,7 +28051,6 @@
2a02:4580::,2a02:4580:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:45a0::,2a02:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:45c0::,2a02:45c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:45e0::,2a02:45e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:4600::,2a02:4600:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:4620::,2a02:4620:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:4640::,2a02:4640:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -27494,7 +28106,6 @@
2a02:4c20::,2a02:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4c40::,2a02:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4c80::,2a02:4c80:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a02:4ca0::,2a02:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4cc0::,2a02:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:4ce0::,2a02:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4d00::,2a02:4d00:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -27571,7 +28182,7 @@
2a02:55e0::,2a02:55e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5600::,2a02:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:5620::,2a02:5620:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:5640::,2a02:5640:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:5640::,2a02:5647:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:5660::,2a02:5660:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5680::,2a02:5680:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:56a0::,2a02:56a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -27617,7 +28228,7 @@
2a02:5ba0::,2a02:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:5bc0::,2a02:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:5be0::,2a02:5be0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:5c00::,2a02:5c00:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:5c00::,2a02:5c07:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5c20::,2a02:5c27:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:5c40::,2a02:5c40:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:5c60::,2a02:5c60:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -27760,11 +28371,18 @@
2a02:6e20::,2a02:6e20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:6e40::,2a02:6e40:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:6e60::,2a02:6e60:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:6ea0::,2a02:6ea0:c0ff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6ea0::,2a02:6ea0:bfff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6ea0:c000::,2a02:6ea0:c0ff:ffff:ffff:ffff:ffff:ffff,NL
2a02:6ea0:c100::,2a02:6ea0:c1ff:ffff:ffff:ffff:ffff:ffff,US
-2a02:6ea0:c200::,2a02:6ea0:c7ff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6ea0:c200::,2a02:6ea0:c2ff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:6ea0:c300::,2a02:6ea0:c3ff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:6ea0:c400::,2a02:6ea0:c4ff:ffff:ffff:ffff:ffff:ffff,US
+2a02:6ea0:c500::,2a02:6ea0:c5ff:ffff:ffff:ffff:ffff:ffff,SE
+2a02:6ea0:c600::,2a02:6ea0:c6ff:ffff:ffff:ffff:ffff:ffff,US
+2a02:6ea0:c700::,2a02:6ea0:c7ff:ffff:ffff:ffff:ffff:ffff,DE
2a02:6ea0:c800::,2a02:6ea0:c8ff:ffff:ffff:ffff:ffff:ffff,US
-2a02:6ea0:c900::,2a02:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:6ea0:c900::,2a02:6ea0:c9ff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:6ea0:ca00::,2a02:6ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:6ec0::,2a02:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a02:6ee0::,2a02:6ee0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:6f00::,2a02:6f00:ffff:ffff:ffff:ffff:ffff:ffff,LU
@@ -27802,7 +28420,7 @@
2a02:7340::,2a02:7340:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:7360::,2a02:7360:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:7380::,2a02:7380:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:73a0::,2a02:73a0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a02:73a0::,2a02:73a0:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:73c0::,2a02:73c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:73e0::,2a02:73e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:7400::,2a02:7400:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -27880,7 +28498,6 @@
2a02:7ce0::,2a02:7ce0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:7d00::,2a02:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:7d20::,2a02:7d20:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a02:7d40::,2a02:7d40:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:7d60::,2a02:7d60:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:7d80::,2a02:7d80:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:7da0::,2a02:7da0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -27898,7 +28515,7 @@
2a02:7f20::,2a02:7f20:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:7f40::,2a02:7f40:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:7f60::,2a02:7f60:ffff:ffff:ffff:ffff:ffff:ffff,SM
-2a02:7f80::,2a02:7f80:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:7f80::,2a02:7f87:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:7fa0::,2a02:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:7fc0::,2a02:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:7fe0::,2a02:7fe0:ffff:ffff:ffff:ffff:ffff:ffff,IS
@@ -27933,7 +28550,6 @@
2a02:ac40::,2a02:ac47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:ac80::,2a02:ac87:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:acc0::,2a02:acc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:ad00::,2a02:ad07:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:ad40::,2a02:ad47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:ad80::,2a02:ad87:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:adc0::,2a02:adc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -28226,7 +28842,7 @@
2a03::,2a03::ffff:ffff:ffff:ffff:ffff:ffff,PT
2a03:20::,2a03:20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:40::,2a03:40:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a03:60::,2a03:60:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:60::,2a03:67:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:80::,2a03:80:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:a0::,2a03:a0:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a03:c0::,2a03:c0:ffff:ffff:ffff:ffff:ffff:ffff,DK
@@ -28335,7 +28951,6 @@
2a03:e20::,2a03:e20:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:e40::,2a03:e40:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a03:e60::,2a03:e60:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a03:e80::,2a03:e80:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:ea0::,2a03:ea0:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a03:ec0::,2a03:ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:ee0::,2a03:ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -28485,7 +29100,7 @@
2a03:20a0::,2a03:20a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:20c0::,2a03:20c0:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a03:20e0::,2a03:20e0:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a03:2100::,2a03:2100:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:2100::,2a03:2107:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:2120::,2a03:2120:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:2140::,2a03:2140:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:2160::,2a03:2160:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -28540,7 +29155,6 @@
2a03:2780::,2a03:2780:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:27a0::,2a03:27a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:27c0::,2a03:27c0:ffff:ffff:ffff:ffff:ffff:ffff,AM
-2a03:27e0::,2a03:27e0:ffff:ffff:ffff:ffff:ffff:ffff,CY
2a03:2800::,2a03:2800:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:2820::,2a03:2820:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a03:2840::,2a03:2840:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -28753,7 +29367,6 @@
2a03:40c0::,2a03:40c0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:40e0::,2a03:40e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:4100::,2a03:4107:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a03:4140::,2a03:4140:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:4160::,2a03:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4180::,2a03:4180:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:41a0::,2a03:41a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -28813,7 +29426,7 @@
2a03:4920::,2a03:4920:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:4940::,2a03:4940:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a03:4960::,2a03:4960:ffff:ffff:ffff:ffff:ffff:ffff,RS
-2a03:4980::,2a03:4980:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:4980::,2a03:4987:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:49a0::,2a03:49a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:49c0::,2a03:49c0:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a03:49e0::,2a03:49e0:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -29286,7 +29899,6 @@
2a03:8180:1301::,2a03:8180:1301:7fff:ffff:ffff:ffff:ffff,FR
2a03:8180:1301:8000::,2a03:8180:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:81a0::,2a03:81a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a03:81c0::,2a03:81c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:81e0::,2a03:81e0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:8200::,2a03:8200:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:8220::,2a03:8220:ffff:ffff:ffff:ffff:ffff:ffff,NO
@@ -29351,7 +29963,6 @@
2a03:8980::,2a03:8980:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:89a0::,2a03:89a0:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a03:89c0::,2a03:89c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a03:89e0::,2a03:89e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:8a00::,2a03:8a00:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:8a20::,2a03:8a20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:8a40::,2a03:8a40:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -29534,7 +30145,6 @@
2a03:9ec0::,2a03:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:9ee0::,2a03:9ee0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:9f00::,2a03:9f00:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a03:9f40::,2a03:9f40:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:9f60::,2a03:9f60:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a03:9f80::,2a03:9f80:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a03:9fa0::,2a03:9fa0:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -30771,11 +31381,12 @@
2a03:ba40::,2a03:ba40:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a03:ba80::,2a03:ba80:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:bac0::,2a03:bac0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:bb00::,2a03:bb07:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:bb40::,2a03:bb40:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a03:bb80::,2a03:bb80:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:bbc0::,2a03:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:bc00::,2a03:bc00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a03:bc40::,2a03:bc40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:bc40::,2a03:bc47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:bc80::,2a03:bc80:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:bcc0::,2a03:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a03:bd00::,2a03:bd00:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -30987,7 +31598,7 @@
2a03:efc0:a00::,2a03:efc0:10ff:ffff:ffff:ffff:ffff:ffff,GB
2a03:efc0:1100::,2a03:efc0:11ff:ffff:ffff:ffff:ffff:ffff,DE
2a03:efc0:1200::,2a03:efc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a03:f000::,2a03:f000:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a03:f000::,2a03:f007:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a03:f040::,2a03:f040:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a03:f080::,2a03:f080:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:f0c0::,2a03:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -31000,8 +31611,8 @@
2a03:f280::,2a03:f280:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:f2c0::,2a03:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:f300::,2a03:f300:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:f340::,2a03:f347:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:f380::,2a03:f380:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a03:f3c0::,2a03:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:f400::,2a03:f400:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a03:f440::,2a03:f440:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:f480::,2a03:f480:ffff:ffff:ffff:ffff:ffff:ffff,EE
@@ -31113,7 +31724,6 @@
2a04:f00::,2a04:f07:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a04:f40::,2a04:f47:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a04:f80::,2a04:f87:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a04:fc0::,2a04:fc7:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a04:1000::,2a04:1007:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:1040::,2a04:1047:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a04:1080::,2a04:1087:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -31163,7 +31773,6 @@
2a04:1ac0::,2a04:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:1b00::,2a04:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:1b40::,2a04:1b47:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a04:1b80::,2a04:1b87:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a04:1bc0::,2a04:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a04:1c00::,2a04:1c07:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:1c40::,2a04:1c47:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -31362,7 +31971,6 @@
2a04:4b40::,2a04:4b47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:4b80::,2a04:4b87:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a04:4bc0::,2a04:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a04:4c00::,2a04:4c07:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a04:4c40::,2a04:4c47:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a04:4c80::,2a04:4c87:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:4cc0::,2a04:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -31391,7 +31999,6 @@
2a04:52c0::,2a04:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:5300::,2a04:5307:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:5340::,2a04:5347:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a04:5380::,2a04:5387:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:53c0::,2a04:53c7:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a04:5400::,2a04:5407:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a04:5440::,2a04:5447:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -31422,7 +32029,6 @@
2a04:5ac0::,2a04:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:5b00::,2a04:5b07:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a04:5b40::,2a04:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a04:5b80::,2a04:5b87:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a04:5bc0::,2a04:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:5c00::,2a04:5c07:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:5c40::,2a04:5c47:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -31611,7 +32217,6 @@
2a04:8740::,2a04:8747:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:8780::,2a04:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:87c0::,2a04:87c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
-2a04:8800::,2a04:8807:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a04:8840::,2a04:8847:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:8880::,2a04:8887:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:88c0::,2a04:88c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -31667,7 +32272,7 @@
2a04:9580::,2a04:9587:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:95c0::,2a04:95c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:9600::,2a04:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a04:9640::,2a04:9647:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a04:9640::,2a04:9647:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a04:9680::,2a04:9687:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:96c0::,2a04:96c7:ffff:ffff:ffff:ffff:ffff:ffff,CY
2a04:9700::,2a04:9707:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -31904,7 +32509,6 @@
2a04:cf80::,2a04:cf87:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a04:cfc0::,2a04:cfc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:d000::,2a04:d007:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a04:d040::,2a04:d047:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a04:d080::,2a04:d087:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a04:d0c0::,2a04:d0c7:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a04:d100::,2a04:d107:ffff:ffff:ffff:ffff:ffff:ffff,IQ
@@ -32191,7 +32795,6 @@
2a05:16c0::,2a05:16c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a05:1700::,2a05:1707:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a05:1740::,2a05:1747:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a05:1780::,2a05:1787:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a05:17c0::,2a05:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a05:1800::,2a05:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a05:1840::,2a05:1847:ffff:ffff:ffff:ffff:ffff:ffff,HR
@@ -32366,7 +32969,6 @@
2a05:42c0::,2a05:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a05:4300::,2a05:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a05:4340::,2a05:4347:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a05:4380::,2a05:4387:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a05:43c0::,2a05:43c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a05:4400::,2a05:4407:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a05:4440::,2a05:4447:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -32550,7 +33152,6 @@
2a05:7100::,2a05:7107:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a05:7140::,2a05:7147:ffff:ffff:ffff:ffff:ffff:ffff,MD
2a05:7180::,2a05:7187:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a05:71c0::,2a05:71c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a05:7200::,2a05:7207:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a05:7240::,2a05:7247:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a05:7280::,2a05:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -32684,11 +33285,9 @@
2a05:92c0::,2a05:92c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a05:9300::,2a05:9307:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a05:9340::,2a05:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a05:9380::,2a05:9387:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a05:93c0::,2a05:93c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a05:9400::,2a05:9407:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a05:9440::,2a05:9447:ffff:ffff:ffff:ffff:ffff:ffff,IR
-2a05:9480::,2a05:9487:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a05:94c0::,2a05:94c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a05:9500::,2a05:9507:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a05:9540::,2a05:9547:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -32796,9 +33395,9 @@
2a05:b000::,2a05:b007:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a05:b040::,2a05:b047:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a05:b080::,2a05:b087:ffff:ffff:ffff:ffff:ffff:ffff,FI
-2a05:b0c0::,2a05:b0c6:21f:ffff:ffff:ffff:ffff:ffff,GB
-2a05:b0c6:220::,2a05:b0c6:22f:ffff:ffff:ffff:ffff:ffff,US
-2a05:b0c6:230::,2a05:b0c6:4ff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:b0c0::,2a05:b0c6:1ff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:b0c6:200::,2a05:b0c6:2ff:ffff:ffff:ffff:ffff:ffff,US
+2a05:b0c6:300::,2a05:b0c6:4ff:ffff:ffff:ffff:ffff:ffff,GB
2a05:b0c6:500::,2a05:b0c6:5ff:ffff:ffff:ffff:ffff:ffff,DE
2a05:b0c6:600::,2a05:b0c6:6ff:ffff:ffff:ffff:ffff:ffff,GB
2a05:b0c6:700::,2a05:b0c6:7ff:ffff:ffff:ffff:ffff:ffff,AT
@@ -33144,7 +33743,6 @@
2a05:fe00::,2a05:fe07:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a05:fe40::,2a05:fe47:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a05:fe80::,2a05:fe87:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a05:fec0::,2a05:fec7:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a05:ff00::,2a05:ff07:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a05:ff40::,2a05:ff47:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a05:ff80::,2a05:ff87:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -33227,7 +33825,7 @@
2a06:1287:20::,2a06:1287:2f:ffff:ffff:ffff:ffff:ffff,AT
2a06:1287:30::,2a06:1287:ffff:ffff:ffff:ffff:ffff:ffff,BY
2a06:12c0::,2a06:12c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a06:1300::,2a06:1307:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a06:1300::,2a06:1307:ffff:ffff:ffff:ffff:ffff:ffff,NC
2a06:1340::,2a06:1347:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a06:1380::,2a06:1387:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a06:13c0::,2a06:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -33700,7 +34298,9 @@
2a06:8280::,2a06:8280:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a06:8281::,2a06:8281:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a06:8282::,2a06:8287:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a06:82c0::,2a06:82c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a06:82c0::,2a06:82c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a06:82c1::,2a06:82c1::ffff:ffff:ffff:ffff:ffff,US
+2a06:82c1:1::,2a06:82c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a06:8300::,2a06:8307:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a06:8340::,2a06:8347:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a06:8380::,2a06:8387:ffff:ffff:ffff:ffff:ffff:ffff,IR
@@ -33859,7 +34459,6 @@
2a06:a840::,2a06:a847:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a06:a880::,2a06:a887:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a06:a8c0::,2a06:a8c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a06:a900::,2a06:a907:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a06:a940::,2a06:a947:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a06:a980::,2a06:a987:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a06:a9c0::,2a06:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -33868,7 +34467,6 @@
2a06:aa80::,2a06:aa87:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a06:aac0::,2a06:aac7:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a06:ab00::,2a06:ab07:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a06:ab40::,2a06:ab47:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a06:ab80::,2a06:ab87:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a06:abc0::,2a06:abc7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a06:ac00::,2a06:ac07:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -33915,7 +34513,6 @@
2a06:b640::,2a06:b647:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a06:b680::,2a06:b687:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a06:b6c0::,2a06:b6c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a06:b700::,2a06:b707:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a06:b740::,2a06:b747:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a06:b780::,2a06:b787:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a06:b7c0::,2a06:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -33932,7 +34529,6 @@
2a06:ba80::,2a06:ba87:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a06:bac0::,2a06:bac7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a06:bb00::,2a06:bb07:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a06:bb40::,2a06:bb47:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a06:bb80::,2a06:bb87:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a06:bbc0::,2a06:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a06:bc00::,2a06:bc07:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -34150,7 +34746,6 @@
2a06:ee40::,2a06:ee47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a06:ee80::,2a06:ee87:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a06:eec0::,2a06:eec7:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a06:ef00::,2a06:ef07:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a06:ef40::,2a06:ef47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a06:ef80::,2a06:ef87:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a06:efc0::,2a06:efc7:ffff:ffff:ffff:ffff:ffff:ffff,BE
@@ -34172,8 +34767,6 @@
2a06:f3c0::,2a06:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a06:f400::,2a06:f407:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a06:f440::,2a06:f447:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a06:f480::,2a06:f487:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a06:f4c0::,2a06:f4c7:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a06:f500::,2a06:f507:ffff:ffff:ffff:ffff:ffff:ffff,IN
2a06:f540::,2a06:f547:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a06:f580::,2a06:f587:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -34343,7 +34936,9 @@
2a07:1c44:680::,2a07:1c44:6bf:ffff:ffff:ffff:ffff:ffff,KR
2a07:1c44:6c0::,2a07:1c44:6ff:ffff:ffff:ffff:ffff:ffff,AT
2a07:1c44:700::,2a07:1c44:70f:ffff:ffff:ffff:ffff:ffff,US
-2a07:1c44:710::,2a07:1c47:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a07:1c44:710::,2a07:1c44:1800:ffff:ffff:ffff:ffff:ffff,AT
+2a07:1c44:1801::,2a07:1c44:1802:ffff:ffff:ffff:ffff:ffff,US
+2a07:1c44:1803::,2a07:1c47:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a07:1c80::,2a07:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a07:1cc0::,2a07:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a07:1d00::,2a07:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IR
@@ -34437,7 +35032,6 @@
2a07:3400::,2a07:3407:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a07:3440::,2a07:3447:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a07:3480::,2a07:3487:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a07:34c0::,2a07:34c7:ffff:ffff:ffff:ffff:ffff:ffff,KZ
2a07:3500::,2a07:3507:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a07:3540::,2a07:3547:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a07:3580::,2a07:3587:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -34459,7 +35053,6 @@
2a07:3980::,2a07:3987:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a07:39c0::,2a07:39c7:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a07:3a00::,2a07:3a07:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a07:3a40::,2a07:3a47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a07:3a80::,2a07:3a87:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a07:3ac0::,2a07:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a07:3b00::,2a07:3b07:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -34469,7 +35062,6 @@
2a07:3c00::,2a07:3c07:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a07:3c40::,2a07:3c47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a07:3c80::,2a07:3c87:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a07:3cc0::,2a07:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a07:3d00::,2a07:3d07:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a07:3d80::,2a07:3d87:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a07:3dc0::,2a07:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,DK
@@ -34493,7 +35085,6 @@
2a07:4240::,2a07:4247:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a07:4280::,2a07:4287:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a07:42c0::,2a07:42c7:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a07:4300::,2a07:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a07:4340::,2a07:4347:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a07:4380::,2a07:4387:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a07:43c0::,2a07:43c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -34757,7 +35348,6 @@
2a07:8480::,2a07:8487:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a07:84c0::,2a07:84c7:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a07:8500::,2a07:8507:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a07:8540::,2a07:8547:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a07:8580::,2a07:8587:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a07:85c0::,2a07:85c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a07:8600::,2a07:8607:ffff:ffff:ffff:ffff:ffff:ffff,BE
@@ -35029,7 +35619,6 @@
2a07:c680::,2a07:c687:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a07:c6c0::,2a07:c6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a07:c700::,2a07:c707:ffff:ffff:ffff:ffff:ffff:ffff,IT
-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,NL
@@ -35648,7 +36237,11 @@
2a0a:9140::,2a0a:9147:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0a:9180::,2a0a:9180:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0a:91c0::,2a0a:91c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a0a:9200::,2a0a:9204:ab6c:ffff:ffff:ffff:ffff:ffff,US
+2a0a:9200::,2a0a:9200:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0a:9201::,2a0a:9201:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0a:9202::,2a0a:9202:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0a:9203::,2a0a:9203:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2a0a:9204::,2a0a:9204:ab6c:ffff:ffff:ffff:ffff:ffff,US
2a0a:9204:ab6d::,2a0a:9204:ab6d:ffff:ffff:ffff:ffff:ffff,CA
2a0a:9204:ab6e::,2a0a:9207:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0a:9240::,2a0a:9247:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -35803,7 +36396,6 @@
2a0a:b640:2::,2a0a:b647:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0a:b680::,2a0a:b687:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a0a:b6c0::,2a0a:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a0a:b700::,2a0a:b707:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a0a:b740::,2a0a:b747:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0a:b780::,2a0a:b787:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a0a:b7c0::,2a0a:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -36021,7 +36613,6 @@
2a0a:ecc0::,2a0a:ecc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0a:ed00::,2a0a:ed07:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a0a:ed40::,2a0a:ed47:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2a0a:ed80::,2a0a:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0a:edc0::,2a0a:edc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0a:ee00::,2a0a:ee07:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a0a:ee40::,2a0a:ee40:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -36191,294 +36782,581 @@
2a0b:1780::,2a0b:1787:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a0b:17c0::,2a0b:17c7:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a0b:1800::,2a0b:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:1840::,2a0b:1847:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:1880::,2a0b:1887:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a0b:18c0::,2a0b:18c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:1900::,2a0b:1907:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a0b:1940::,2a0b:1940:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a0b:1980::,2a0b:1987:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a0b:19c0::,2a0b:19c7:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a0b:1a00::,2a0b:1a07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:1a40::,2a0b:1a40:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:1a80::,2a0b:1a87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:1ac0::,2a0b:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:1b00::,2a0b:1b07:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:1b40::,2a0b:1b47:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a0b:1b80::,2a0b:1b87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:1bc0::,2a0b:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:1c00::,2a0b:1c07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:1c40::,2a0b:1c47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:1c80::,2a0b:1c87:ffff:ffff:ffff:ffff:ffff:ffff,UZ
+2a0b:1cc0::,2a0b:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:1d00::,2a0b:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:1d40::,2a0b:1d40:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a0b:1d80::,2a0b:1d80:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:1dc0::,2a0b:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:1e00::,2a0b:1e07:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a0b:1e40::,2a0b:1e47:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a0b:1e80::,2a0b:1e87:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:1ec0::,2a0b:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:1f00::,2a0b:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:1f40::,2a0b:1f47:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a0b:1f80::,2a0b:1f87:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:1fc0::,2a0b:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a0b:2000::,2a0b:2007:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:2040::,2a0b:2047:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:2080::,2a0b:2087:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:20c0::,2a0b:20c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2100::,2a0b:2107:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:2140::,2a0b:2147:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2180::,2a0b:2180:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:21c0::,2a0b:21c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2200::,2a0b:2207:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:2240::,2a0b:2247:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:2280::,2a0b:2287:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a0b:22c0::,2a0b:22c7:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a0b:2300::,2a0b:2300:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:2340::,2a0b:2347:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:2380::,2a0b:2387:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:23c0::,2a0b:23c7:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:2400::,2a0b:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:2440::,2a0b:2447:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:2480::,2a0b:2480:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:24c0::,2a0b:24c7:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:2500::,2a0b:2507:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:2540::,2a0b:2547:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:2580::,2a0b:2587:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a0b:25c0::,2a0b:25c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2600::,2a0b:2607:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:2640::,2a0b:2647:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:2680::,2a0b:2687:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:26c0::,2a0b:26c7:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a0b:2700::,2a0b:2707:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:2740::,2a0b:2747:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:2780::,2a0b:2787:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:27c0::,2a0b:27c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:2800::,2a0b:2807:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:2840::,2a0b:2847:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:2880::,2a0b:2887:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:28c0::,2a0b:28c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2900::,2a0b:2900:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:2940::,2a0b:2947:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:2980::,2a0b:2980:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a0b:29c0::,2a0b:29c7:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a0b:2a00::,2a0b:2a07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:2a40::,2a0b:2a47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2a80::,2a0b:2a87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:2ac0::,2a0b:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a0b:2b00::,2a0b:2b07:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:2b40::,2a0b:2b47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2b80::,2a0b:2b87:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2a0b:2bc0::,2a0b:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:2c00::,2a0b:2c07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:2c40::,2a0b:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:2c80::,2a0b:2c87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:2cc0::,2a0b:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a0b:2d00::,2a0b:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:2d40::,2a0b:2d40:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:2d80::,2a0b:2d87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:2dc0::,2a0b:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:2e00::,2a0b:2e07:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:2e40::,2a0b:2e47:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:2e80::,2a0b:2e87:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:2ec0::,2a0b:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:2f00::,2a0b:2f07:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a0b:2f40::,2a0b:2f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:2f80::,2a0b:2f87:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:2fc0::,2a0b:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:3000::,2a0b:3007:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:3040::,2a0b:3040:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:3080::,2a0b:3080:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:30c0::,2a0b:30c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:3100::,2a0b:3107:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:3140::,2a0b:3147:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:3180::,2a0b:3187:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:31c0::,2a0b:31c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:3200::,2a0b:3207:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:3240::,2a0b:3240:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:3280::,2a0b:3280:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:32c0::,2a0b:32c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:3300::,2a0b:3307:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a0b:3340::,2a0b:3347:ffff:ffff:ffff:ffff:ffff:ffff,TJ
2a0b:3380::,2a0b:3387:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:33c0::,2a0b:33c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:3400::,2a0b:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:3440::,2a0b:3447:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:3480::,2a0b:3487:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a0b:34c0::,2a0b:34c7:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a0b:3500::,2a0b:3500:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:3540::,2a0b:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:3580::,2a0b:3587:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:35c0::,2a0b:35c7:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a0b:3600::,2a0b:3607:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:3640::,2a0b:3647:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:3680::,2a0b:3687:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a0b:36c0::,2a0b:36c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a0b:3740::,2a0b:3747:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:3780::,2a0b:3780:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:37c0::,2a0b:37c7:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:3800::,2a0b:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:3840::,2a0b:3847:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:3880::,2a0b:3880:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:38c0::,2a0b:38c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:3900::,2a0b:3907:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:3940::,2a0b:3947:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:3980::,2a0b:3980:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:39c0::,2a0b:39c7:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a0b:3a00::,2a0b:3a07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:3a40::,2a0b:3a40:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:3a80::,2a0b:3a80:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:3ac0::,2a0b:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:3b00::,2a0b:3b07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:3b40::,2a0b:3b47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:3b80::,2a0b:3b87:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a0b:3bc0::,2a0b:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a0b:3c00::,2a0b:3c07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:3c40::,2a0b:3c47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:3c80::,2a0b:3c87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:3cc0::,2a0b:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a0b:3d00::,2a0b:3d07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:3d40::,2a0b:3d47:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a0b:3d80::,2a0b:3d87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:3dc0::,2a0b:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a0b:3e00::,2a0b:3e00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:3e40::,2a0b:3e47:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a0b:3e80::,2a0b:3e87:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a0b:3ec0::,2a0b:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a0b:3f00::,2a0b:3f07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:3f40::,2a0b:3f47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:3f80::,2a0b:3f87:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a0b:3fc0::,2a0b:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:4000::,2a0b:4007:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a0b:4040::,2a0b:4047:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:4080::,2a0b:4080:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:40c0::,2a0b:40c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:4100::,2a0b:4107:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:4140::,2a0b:4147:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a0b:4180::,2a0b:4187:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a0b:41c0::,2a0b:41c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:4200::,2a0b:4207:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:4240::,2a0b:4247:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:4280::,2a0b:4287:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:42c0::,2a0b:42c7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:4300::,2a0b:4307:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:4340::,2a0b:4347:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:4380::,2a0b:4387:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:43c0::,2a0b:43c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:4400::,2a0b:4407:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:4440::,2a0b:4447:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a0b:4480::,2a0b:4487:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a0b:44c0::,2a0b:44c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:4500::,2a0b:4507:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:4540::,2a0b:4547:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:4580::,2a0b:4587:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:45c0::,2a0b:45c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:4600::,2a0b:4600:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a0b:4640::,2a0b:4647:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:4680::,2a0b:4687:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:46c0::,2a0b:46c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:4700::,2a0b:4707:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:4740::,2a0b:4740:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:4780::,2a0b:4787:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:47c0::,2a0b:47c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:4800::,2a0b:4807:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:4840::,2a0b:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:4880::,2a0b:4887:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:48c0::,2a0b:48c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:4900::,2a0b:4907:ffff:ffff:ffff:ffff:ffff:ffff,MD
+2a0b:4940::,2a0b:4947:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:4980::,2a0b:4987:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:49c0::,2a0b:49c7:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:4a00::,2a0b:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:4a40::,2a0b:4a47:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:4a80::,2a0b:4a87:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:4ac0::,2a0b:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:4b00::,2a0b:4b07:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:4b40::,2a0b:4b40:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:4b80::,2a0b:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:4bc0::,2a0b:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:4c00::,2a0b:4c07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:4c40::,2a0b:4c47:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:4c80::,2a0b:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:4cc0::,2a0b:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:4d00::,2a0b:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:4d40::,2a0b:4d47:ffff:ffff:ffff:ffff:ffff:ffff,PS
2a0b:4d80::,2a0b:4d87:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:4dc0::,2a0b:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:4e00::,2a0b:4e07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:4e40::,2a0b:4e47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:4e80::,2a0b:4e87:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a0b:4ec0::,2a0b:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:4f00::,2a0b:4f07:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a0b:4f40::,2a0b:4f47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:4f80::,2a0b:4f80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:4fc0::,2a0b:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a0b:5000::,2a0b:5007:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a0b:5040::,2a0b:5047:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:5080::,2a0b:5087:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:50c0::,2a0b:50c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:5100::,2a0b:5107:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a0b:5140::,2a0b:5147:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:5180::,2a0b:5187:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:51c0::,2a0b:51c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:5200::,2a0b:5207:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:5240::,2a0b:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:5280::,2a0b:5287:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:52c0::,2a0b:52c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:5300::,2a0b:5307:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:5340::,2a0b:5347:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:5380::,2a0b:5387:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:53c0::,2a0b:53c0:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:5400::,2a0b:5400:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:5440::,2a0b:5447:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:5480::,2a0b:5487:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:54c0::,2a0b:54c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:5500::,2a0b:5507:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a0b:5540::,2a0b:5547:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:5580::,2a0b:5587:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:55c0::,2a0b:55c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:5600::,2a0b:5600:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a0b:5640::,2a0b:5647:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:5680::,2a0b:5687:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:56c0::,2a0b:56c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:5700::,2a0b:5707:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a0b:5740::,2a0b:5747:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:5780::,2a0b:5787:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:57c0::,2a0b:57c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:5800::,2a0b:5800:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:5840::,2a0b:5847:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a0b:5880::,2a0b:5887:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:58c0::,2a0b:58c7:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:5900::,2a0b:5900:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:5940::,2a0b:5947:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:5980::,2a0b:5987:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a0b:59c0::,2a0b:59c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:5a00::,2a0b:5a07:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:5a40::,2a0b:5a47:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:5a80::,2a0b:5a87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:5ac0::,2a0b:5ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:5b00::,2a0b:5b07:ffff:ffff:ffff:ffff:ffff:ffff,MD
+2a0b:5b40::,2a0b:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:5b80::,2a0b:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a0b:5bc0::,2a0b:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:5c00::,2a0b:5c07:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a0b:5c40::,2a0b:5c47:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a0b:5c80::,2a0b:5c87:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a0b:5cc0::,2a0b:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:5d00::,2a0b:5d07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:5d40::,2a0b:5d47:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:5d80::,2a0b:5d87:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a0b:5dc0::,2a0b:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:5e00::,2a0b:5e07:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a0b:5e80::,2a0b:5e87:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a0b:5ec0::,2a0b:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:5f00::,2a0b:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:5f40::,2a0b:5f47:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:5f80::,2a0b:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:5fc0::,2a0b:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:6000::,2a0b:6007:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:6040::,2a0b:6040:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:6080::,2a0b:6087:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:60c0::,2a0b:60c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:6100::,2a0b:6107:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:6140::,2a0b:6147:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a0b:6180::,2a0b:6187:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:61c0::,2a0b:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:6200::,2a0b:6207:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a0b:6240::,2a0b:6247:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:6280::,2a0b:6287:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:62c0::,2a0b:62c7:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a0b:6300::,2a0b:6307:ffff:ffff:ffff:ffff:ffff:ffff,AL
+2a0b:6340::,2a0b:6347:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:6380::,2a0b:6387:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:63c0::,2a0b:63c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:6400::,2a0b:6407:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:6440::,2a0b:6447:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:6480::,2a0b:6487:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a0b:64c0::,2a0b:64c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:6500::,2a0b:6507:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:6540::,2a0b:6547:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:6580::,2a0b:6587:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:65c0::,2a0b:65c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:6600::,2a0b:6607:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a0b:6640::,2a0b:6647:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:6680::,2a0b:6680:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:66c0::,2a0b:66c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:6700::,2a0b:6700:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:6740::,2a0b:6747:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:6780::,2a0b:6787:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:67c0::,2a0b:67c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:6800::,2a0b:6807:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:6840::,2a0b:6847:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:6880::,2a0b:6880:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:68c0::,2a0b:68c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:6900::,2a0b:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:6940::,2a0b:6947:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:6980::,2a0b:6987:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:69c0::,2a0b:69c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:6a00::,2a0b:6a07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:6a40::,2a0b:6a47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:6a80::,2a0b:6a87:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a0b:6ac0::,2a0b:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:6b00::,2a0b:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:6b40::,2a0b:6b47:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:6b80::,2a0b:6b83:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:6b84::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:6bc0::,2a0b:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,TJ
2a0b:6c00::,2a0b:6c07:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a0b:6c40::,2a0b:6c47:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:6c80::,2a0b:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:6cc0::,2a0b:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:6d00::,2a0b:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:6d40::,2a0b:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:6d80::,2a0b:6d87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:6dc0::,2a0b:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:6e00::,2a0b:6e07:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:6e40::,2a0b:6e47:ffff:ffff:ffff:ffff:ffff:ffff,KG
2a0b:6e80::,2a0b:6e80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:6ec0::,2a0b:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:6f00::,2a0b:6f07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:6f40::,2a0b:6f40:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a0b:6f80::,2a0b:6f87:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a0b:6fc0::,2a0b:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:7000::,2a0b:7007:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a0b:7040::,2a0b:7047:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:7080::,2a0b:7087:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:70c0::,2a0b:70c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:7100::,2a0b:7107:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:7140::,2a0b:7147:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:7180::,2a0b:7187:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:71c0::,2a0b:71c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:7200::,2a0b:7207:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:7240::,2a0b:7247:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:7280::,2a0b:7287:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:72c0::,2a0b:72c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:7300::,2a0b:7307:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:7340::,2a0b:7347:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:7380::,2a0b:7387:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:73c0::,2a0b:73c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:7400::,2a0b:7400:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a0b:7440::,2a0b:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:7480::,2a0b:7480:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:74c0::,2a0b:74c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:7500::,2a0b:7507:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:7540::,2a0b:7547:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:7580::,2a0b:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:75c0::,2a0b:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:7600::,2a0b:7607:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a0b:7640::,2a0b:7647:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:7680::,2a0b:7687:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:76c0::,2a0b:76c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:7700::,2a0b:7707:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:7740::,2a0b:7747:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:7780::,2a0b:7787:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:77c0::,2a0b:77c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:7800::,2a0b:7807:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:7840::,2a0b:7847:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:7880::,2a0b:7880:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a0b:78c0::,2a0b:78c0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:7900::,2a0b:7907:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a0b:7940::,2a0b:7947:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a0b:7980::,2a0b:7987:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a0b:79c0::,2a0b:79c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:7a00::,2a0b:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:7a40::,2a0b:7a47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:7a80::,2a0b:7a87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:7ac0::,2a0b:7ac0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:7b00::,2a0b:7b07:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:7b40::,2a0b:7b47:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a0b:7b80::,2a0b:7b87:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:7bc0::,2a0b:7bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:7c00::,2a0b:7c00:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a0b:7c40::,2a0b:7c47:ffff:ffff:ffff:ffff:ffff:ffff,LB
2a0b:7c80::,2a0b:7c87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:7cc0::,2a0b:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:7d00::,2a0b:7d07:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:7d40::,2a0b:7d47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:7d80::,2a0b:7d87:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a0b:7dc0::,2a0b:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a0b:7e00::,2a0b:7e07:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a0b:7e40::,2a0b:7e40:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:7e80::,2a0b:7e87:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:7ec0::,2a0b:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:7f00::,2a0b:7f07:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:7f40::,2a0b:7f47:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:7f80::,2a0b:7f87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:7fc0::,2a0b:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:8000::,2a0b:8007:ffff:ffff:ffff:ffff:ffff:ffff,MC
+2a0b:8040::,2a0b:8047:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:8080::,2a0b:8087:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:80c0::,2a0b:80c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:8100::,2a0b:8107:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:8140::,2a0b:8147:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:8180::,2a0b:8187:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:81c0::,2a0b:81c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:8200::,2a0b:8207:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a0b:8240::,2a0b:8247:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:8280::,2a0b:8280:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:82c0::,2a0b:82c7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:8300::,2a0b:8307:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:8340::,2a0b:8347:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a0b:8380::,2a0b:8387:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:83c0::,2a0b:83c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:8400::,2a0b:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:8440::,2a0b:8440:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a0b:8480::,2a0b:8487:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:84c0::,2a0b:84c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:8500::,2a0b:8507:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a0b:8540::,2a0b:8547:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:8580::,2a0b:8587:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:85c0::,2a0b:85c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:8600::,2a0b:8607:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a0b:8640::,2a0b:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:8680::,2a0b:8687:ffff:ffff:ffff:ffff:ffff:ffff,BY
+2a0b:86c0::,2a0b:86c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:8700::,2a0b:8707:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a0b:8740::,2a0b:8747:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:8780::,2a0b:8787:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a0b:87c0::,2a0b:87c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:8800::,2a0b:8807:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a0b:8840::,2a0b:8847:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:8880::,2a0b:8887:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a0b:88c0::,2a0b:88c7:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a0b:8900::,2a0b:8900:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a0b:8940::,2a0b:8947:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a0b:8980::,2a0b:8987:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:89c0::,2a0b:89c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:8a00::,2a0b:8a07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:8a40::,2a0b:8a47:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a0b:8a80::,2a0b:8a87:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:8ac0::,2a0b:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a0b:8b00::,2a0b:8b07:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a0b:8b40::,2a0b:8b47:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:8b80::,2a0b:8b87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:8bc0::,2a0b:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:8c00::,2a0b:8c07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:8c40::,2a0b:8c47:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:8c80::,2a0b:8c87:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:8cc0::,2a0b:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:8d00::,2a0b:8d07:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:8d40::,2a0b:8d47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:8d80::,2a0b:8d87:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:8dc0::,2a0b:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:8e00::,2a0b:8e07:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:8e40::,2a0b:8e40:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a0b:8e80::,2a0b:8e87:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a0b:8ec0::,2a0b:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:8f00::,2a0b:8f07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:8f40::,2a0b:8f47:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:8f80::,2a0b:8f87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:8fc0::,2a0b:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:9000::,2a0b:9007:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:9040::,2a0b:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:9080::,2a0b:9087:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:90c0::,2a0b:90c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:9100::,2a0b:9100:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a0b:9140::,2a0b:9147:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a0b:9180::,2a0b:9180:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:91c0::,2a0b:91c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:9200::,2a0b:9200:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a0b:9240::,2a0b:9247:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:9280::,2a0b:9287:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:92c0::,2a0b:92c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a0b:9300::,2a0b:9307:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a0b:9340::,2a0b:9347:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:9380::,2a0b:9380:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:93c0::,2a0b:93c7:ffff:ffff:ffff:ffff:ffff:ffff,US
2a0b:9400::,2a0b:9400:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:9440::,2a0b:9447:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:9480::,2a0b:9480:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:94c0::,2a0b:94c0:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a0b:9500::,2a0b:9507:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:9540::,2a0b:9547:ffff:ffff:ffff:ffff:ffff:ffff,UZ
2a0b:9580::,2a0b:9580:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:95c0::,2a0b:95c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:9600::,2a0b:9607:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:9640::,2a0b:9647:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:9680::,2a0b:9687:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a0b:96c0::,2a0b:96c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:9700::,2a0b:9707:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:9740::,2a0b:9747:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:9780::,2a0b:9787:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:97c0::,2a0b:97c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:9800::,2a0b:9807:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:9840::,2a0b:9847:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:9880::,2a0b:9887:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a0b:98c0::,2a0b:98c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:9900::,2a0b:9907:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:9940::,2a0b:9940:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:9980::,2a0b:9980:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:99c0::,2a0b:99c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:9a00::,2a0b:9a07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:9a40::,2a0b:9a47:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:9a80::,2a0b:9a80:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a0b:9ac0::,2a0b:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:9b00::,2a0b:9b07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:9b40::,2a0b:9b47:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:9b80::,2a0b:9b87:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a0b:9bc0::,2a0b:9bc0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:9c00::,2a0b:9c07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:9c40::,2a0b:9c47:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:9c80::,2a0b:9c87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:9cc0::,2a0b:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:9d00::,2a0b:9d07:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a0b:9d40::,2a0b:9d47:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a0b:9d80::,2a0b:9d80:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:9dc0::,2a0b:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:9e00::,2a0b:9e07:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a0b:9e40::,2a0b:9e47:ffff:ffff:ffff:ffff:ffff:ffff,ME
2a0b:9e80::,2a0b:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a0b:9ec0::,2a0b:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a0b:9f00::,2a0b:9f07:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:9f40::,2a0b:9f47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a0b:9f80::,2a0b:9f87:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a0b:9fc0::,2a0b:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:a000::,2a0b:a007:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a0b:a040::,2a0b:a047:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:a080::,2a0b:a087:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a0b:a0c0::,2a0b:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a0b:a100::,2a0b:a100:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a0b:a140::,2a0b:a147:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:a180::,2a0b:a187:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a0b:a1c0::,2a0b:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a0b:a200::,2a0b:a207:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a0b:a240::,2a0b:a247:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a0b:a280::,2a0b:a280:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a0b:a2c0::,2a0b:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:a300::,2a0b:a307:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a0b:a340::,2a0b:a347:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a0b:a380::,2a0b:a380:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:a3c0::,2a0b:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,AM
2a0b:a400::,2a0b:a407:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a0b:a440::,2a0b:a447:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:a480::,2a0b:a480:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a0b:a4c0::,2a0b:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a0b:a500::,2a0b:a507:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a0b:a540::,2a0b:a547:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:a580::,2a0b:a587:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:a5c0::,2a0b:a5c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:a600::,2a0b:a600:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a0b:a640::,2a0b:a647:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:a680::,2a0b:a680:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:a6c0::,2a0b:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a0b:a700::,2a0b:a707:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a0b:a740::,2a0b:a740:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a0b:a780::,2a0b:a787:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a0b:a7c0::,2a0b:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a0b:a800::,2a0b:a800:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a0b:a880::,2a0b:a887:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a0b:a900::,2a0b:a907:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -36541,7 +37419,6 @@
2a0b:c580::,2a0b:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a0b:c600::,2a0b:c607:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a0b:c680::,2a0b:c687:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2a0b:c700::,2a0b:c707:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a0b:c780::,2a0b:c787:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a0b:c800::,2a0b:c807:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a0b:c880::,2a0b:c887:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -36678,6 +37555,20 @@
2c0f:f088::,2c0f:f088:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f090::,2c0f:f090:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f098::,2c0f:f098:ffff:ffff:ffff:ffff:ffff:ffff,NG
+2c0f:f0a0::,2c0f:f0a0:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f0a8::,2c0f:f0a8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f0b0::,2c0f:f0b0:ffff:ffff:ffff:ffff:ffff:ffff,EG
+2c0f:f0b8::,2c0f:f0b8:ffff:ffff:ffff:ffff:ffff:ffff,ZW
+2c0f:f0c0::,2c0f:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,TZ
+2c0f:f0c8::,2c0f:f0c8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f0d0::,2c0f:f0d0:ffff:ffff:ffff:ffff:ffff:ffff,SC
+2c0f:f0d8::,2c0f:f0d8:ffff:ffff:ffff:ffff:ffff:ffff,KE
+2c0f:f0e0::,2c0f:f0e0:ffff:ffff:ffff:ffff:ffff:ffff,SD
+2c0f:f0e8::,2c0f:f0e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f0f0::,2c0f:f0f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f0f8::,2c0f:f0f8:ffff:ffff:ffff:ffff:ffff:ffff,TG
+2c0f:f100::,2c0f:f100:ffff:ffff:ffff:ffff:ffff:ffff,KE
+2c0f:f108::,2c0f:f108:ffff:ffff:ffff:ffff:ffff:ffff,RW
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
@@ -36890,7 +37781,6 @@
2c0f:f8b8::,2c0f:f8b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f8c0::,2c0f:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,GQ
2c0f:f8c8::,2c0f:f8c8:ffff:ffff:ffff:ffff:ffff:ffff,NE
-2c0f:f8d0::,2c0f:f8d0:ffff:ffff:ffff:ffff:ffff:ffff,NG
2c0f:f8d8::,2c0f:f8d8:ffff:ffff:ffff:ffff:ffff:ffff,BW
2c0f:f8e0::,2c0f:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,MU
2c0f:f8e8::,2c0f:f8e8:ffff:ffff:ffff:ffff:ffff:ffff,GH
@@ -36990,7 +37880,6 @@
2c0f:fc60::,2c0f:fc61:ffff:ffff:ffff:ffff:ffff:ffff,NG
2c0f:fc68::,2c0f:fc68:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fc70::,2c0f:fc70:ffff:ffff:ffff:ffff:ffff:ffff,KE
-2c0f:fc78::,2c0f:fc78:ffff:ffff:ffff:ffff:ffff:ffff,ZW
2c0f:fc80::,2c0f:fc80:ffff:ffff:ffff:ffff:ffff:ffff,KE
2c0f:fc88::,2c0f:fc89:ffff:ffff:ffff:ffff:ffff:ffff,EG
2c0f:fc90::,2c0f:fc90:ffff:ffff:ffff:ffff:ffff:ffff,NG
diff --git a/src/ext/ed25519/donna/curve25519-donna-sse2.h b/src/ext/ed25519/donna/curve25519-donna-sse2.h
index 1dbfd44d8b..1123cb1e91 100644
--- a/src/ext/ed25519/donna/curve25519-donna-sse2.h
+++ b/src/ext/ed25519/donna/curve25519-donna-sse2.h
@@ -29,26 +29,19 @@ typedef packedelem32 packed32bignum25519[5];
typedef packedelem64 packed64bignum25519[10];
static const packedelem32 bot32bitmask = {{0xffffffff, 0x00000000, 0xffffffff, 0x00000000}};
-static const packedelem32 top32bitmask = {{0x00000000, 0xffffffff, 0x00000000, 0xffffffff}};
static const packedelem32 top64bitmask = {{0x00000000, 0x00000000, 0xffffffff, 0xffffffff}};
static const packedelem32 bot64bitmask = {{0xffffffff, 0xffffffff, 0x00000000, 0x00000000}};
/* reduction masks */
static const packedelem64 packedmask26 = {{0x03ffffff, 0x03ffffff}};
static const packedelem64 packedmask25 = {{0x01ffffff, 0x01ffffff}};
-static const packedelem32 packedmask2625 = {{0x3ffffff,0,0x1ffffff,0}};
static const packedelem32 packedmask26262626 = {{0x03ffffff, 0x03ffffff, 0x03ffffff, 0x03ffffff}};
static const packedelem32 packedmask25252525 = {{0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff}};
/* multipliers */
static const packedelem64 packednineteen = {{19, 19}};
-static const packedelem64 packednineteenone = {{19, 1}};
static const packedelem64 packedthirtyeight = {{38, 38}};
static const packedelem64 packed3819 = {{19*2,19}};
-static const packedelem64 packed9638 = {{19*4,19*2}};
-
-/* 121666,121665 */
-static const packedelem64 packed121666121665 = {{121666, 121665}};
/* 2*(2^255 - 19) = 0 mod p */
static const packedelem32 packed2p0 = {{0x7ffffda,0x3fffffe,0x7fffffe,0x3fffffe}};
diff --git a/src/ext/ed25519/donna/ed25519_donna_tor.h b/src/ext/ed25519/donna/ed25519_donna_tor.h
index d225407b1c..7d7b8c0625 100644
--- a/src/ext/ed25519/donna/ed25519_donna_tor.h
+++ b/src/ext/ed25519/donna/ed25519_donna_tor.h
@@ -30,4 +30,9 @@ int ed25519_donna_blind_public_key(unsigned char *out, const unsigned char *inp,
int ed25519_donna_pubkey_from_curve25519_pubkey(unsigned char *out,
const unsigned char *inp, int signbit);
+
+int
+ed25519_donna_scalarmult_with_group_order(unsigned char *out,
+ const unsigned char *pubkey);
+
#endif
diff --git a/src/ext/ed25519/donna/ed25519_tor.c b/src/ext/ed25519/donna/ed25519_tor.c
index 9537ae66a1..44ec562f02 100644
--- a/src/ext/ed25519/donna/ed25519_tor.c
+++ b/src/ext/ed25519/donna/ed25519_tor.c
@@ -245,13 +245,7 @@ ed25519_donna_sign(unsigned char *sig, const unsigned char *m, size_t mlen,
static void
ed25519_donna_gettweak(unsigned char *out, const unsigned char *param)
{
- static const char str[] = "Derive temporary signing key";
- ed25519_hash_context ctx;
-
- ed25519_hash_init(&ctx);
- ed25519_hash_update(&ctx, (const unsigned char*)str, strlen(str));
- ed25519_hash_update(&ctx, param, 32);
- ed25519_hash_final(&ctx, out);
+ memcpy(out, param, 32);
out[0] &= 248; /* Is this necessary ? */
out[31] &= 63;
@@ -304,7 +298,9 @@ ed25519_donna_blind_public_key(unsigned char *out, const unsigned char *inp,
/* No "ge25519_unpack", negate the public key. */
memcpy(pkcopy, inp, 32);
pkcopy[31] ^= (1<<7);
- ge25519_unpack_negative_vartime(&A, pkcopy);
+ if (!ge25519_unpack_negative_vartime(&A, pkcopy)) {
+ return -1;
+ }
/* A' = [tweak] * A + [0] * basepoint. */
ge25519_double_scalarmult_vartime(&Aprime, &A, t, zero);
@@ -340,5 +336,32 @@ ed25519_donna_pubkey_from_curve25519_pubkey(unsigned char *out,
return 0;
}
+/* Do the scalar multiplication of <b>pubkey</b> with the group order
+ * <b>modm_m</b>. Place the result in <b>out</b> which must be at least 32
+ * bytes long. */
+int
+ed25519_donna_scalarmult_with_group_order(unsigned char *out,
+ const unsigned char *pubkey)
+{
+ static const bignum256modm ALIGN(16) zero = { 0 };
+ unsigned char pkcopy[32];
+ ge25519 ALIGN(16) Point, Result;
+
+ /* No "ge25519_unpack", negate the public key and unpack it back.
+ * See ed25519_donna_blind_public_key() */
+ memcpy(pkcopy, pubkey, 32);
+ pkcopy[31] ^= (1<<7);
+ if (!ge25519_unpack_negative_vartime(&Point, pkcopy)) {
+ return -1; /* error: bail out */
+ }
+
+ /* There is no regular scalarmult function so we have to do:
+ * Result = l*P + 0*B */
+ ge25519_double_scalarmult_vartime(&Result, &Point, modm_m, zero);
+ ge25519_pack(out, &Result);
+
+ return 0;
+}
+
#include "test-internals.c"
diff --git a/src/ext/ed25519/ref10/blinding.c b/src/ext/ed25519/ref10/blinding.c
index ee3e8666fa..a3b32fa80c 100644
--- a/src/ext/ed25519/ref10/blinding.c
+++ b/src/ext/ed25519/ref10/blinding.c
@@ -12,8 +12,8 @@
static void
ed25519_ref10_gettweak(unsigned char *out, const unsigned char *param)
{
- const char str[] = "Derive temporary signing key";
- crypto_hash_sha512_2(out, (const unsigned char*)str, strlen(str), param, 32);
+ memcpy(out, param, 32);
+
out[0] &= 248; /* Is this necessary necessary ? */
out[31] &= 63;
out[31] |= 64;
@@ -49,6 +49,7 @@ int ed25519_ref10_blind_public_key(unsigned char *out,
unsigned char pkcopy[32];
ge_p3 A;
ge_p2 Aprime;
+ int retval = -1;
ed25519_ref10_gettweak(tweak, param);
@@ -62,15 +63,57 @@ int ed25519_ref10_blind_public_key(unsigned char *out,
* "ge_frombytes", we'd use that, but there isn't. */
memcpy(pkcopy, inp, 32);
pkcopy[31] ^= (1<<7);
- ge_frombytes_negate_vartime(&A, pkcopy);
+ if (ge_frombytes_negate_vartime(&A, pkcopy) != 0) {
+ goto done;
+ }
/* There isn't a regular ge_scalarmult -- we have to do tweak*A + zero*B. */
ge_double_scalarmult_vartime(&Aprime, tweak, &A, zero);
ge_tobytes(out, &Aprime);
+ retval = 0;
+
+ done:
memwipe(tweak, 0, sizeof(tweak));
memwipe(&A, 0, sizeof(A));
memwipe(&Aprime, 0, sizeof(Aprime));
memwipe(pkcopy, 0, sizeof(pkcopy));
+ return retval;
+}
+
+/* This is the group order encoded in a format that
+ * ge_double_scalarmult_vartime() understands. The group order m is:
+ * m = 2^252 + 27742317777372353535851937790883648493 =
+ * 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed
+ */
+static const uint8_t modm_m[32] = {0xed,0xd3,0xf5,0x5c,0x1a,0x63,0x12,0x58,
+ 0xd6,0x9c,0xf7,0xa2,0xde,0xf9,0xde,0x14,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10};
+
+/* Do the scalar multiplication of <b>pubkey</b> with the group order
+ * <b>modm_m</b>. Place the result in <b>out</b> which must be at least 32
+ * bytes long. */
+int
+ed25519_ref10_scalarmult_with_group_order(unsigned char *out,
+ const unsigned char *pubkey)
+{
+ unsigned char pkcopy[32];
+ unsigned char zero[32] = {0};
+ ge_p3 Point;
+ ge_p2 Result;
+
+ /* All this is done to fit 'pubkey' in 'Point' so that it can be used by
+ * ed25519 ref code. Same thing as in blinding function */
+ memcpy(pkcopy, pubkey, 32);
+ pkcopy[31] ^= (1<<7);
+ if (ge_frombytes_negate_vartime(&Point, pkcopy) != 0) {
+ return -1; /* error: bail out */
+ }
+
+ /* There isn't a regular scalarmult -- we have to do r = l*P + 0*B */
+ ge_double_scalarmult_vartime(&Result, modm_m, &Point, zero);
+ ge_tobytes(out, &Result);
+
return 0;
}
diff --git a/src/ext/ed25519/ref10/ed25519_ref10.h b/src/ext/ed25519/ref10/ed25519_ref10.h
index af7e21a2ad..5965694977 100644
--- a/src/ext/ed25519/ref10/ed25519_ref10.h
+++ b/src/ext/ed25519/ref10/ed25519_ref10.h
@@ -27,4 +27,8 @@ int ed25519_ref10_blind_public_key(unsigned char *out,
const unsigned char *inp,
const unsigned char *param);
+int
+ed25519_ref10_scalarmult_with_group_order(unsigned char *out,
+ const unsigned char *pubkey);
+
#endif
diff --git a/src/ext/trunnel/trunnel-impl.h b/src/ext/trunnel/trunnel-impl.h
index 85c847b3fd..b233cf7631 100644
--- a/src/ext/trunnel/trunnel-impl.h
+++ b/src/ext/trunnel/trunnel-impl.h
@@ -1,4 +1,4 @@
-/* trunnel-impl.h -- copied from Trunnel v1.5.1
+/* trunnel-impl.h -- copied from Trunnel v1.5.2
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/ext/trunnel/trunnel.c b/src/ext/trunnel/trunnel.c
index 6a42417241..b749d8136f 100644
--- a/src/ext/trunnel/trunnel.c
+++ b/src/ext/trunnel/trunnel.c
@@ -1,4 +1,4 @@
-/* trunnel.c -- copied from Trunnel v1.5.1
+/* trunnel.c -- copied from Trunnel v1.5.2
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/ext/trunnel/trunnel.h b/src/ext/trunnel/trunnel.h
index dd78553c77..32c80bac23 100644
--- a/src/ext/trunnel/trunnel.h
+++ b/src/ext/trunnel/trunnel.h
@@ -1,4 +1,4 @@
-/* trunnel.h -- copied from Trunnel v1.5.1
+/* trunnel.h -- copied from Trunnel v1.5.2
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/or/buffers.c b/src/or/buffers.c
index 12a6c0239b..bd84103c37 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -80,7 +80,7 @@ static int parse_socks_client(const uint8_t *data, size_t datalen,
/* Chunk manipulation functions */
-#define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0])
+#define CHUNK_HEADER_LEN offsetof(chunk_t, mem[0])
/* We leave this many NUL bytes at the end of the buffer. */
#ifdef DISABLE_MEMORY_SENTINELS
@@ -1478,6 +1478,32 @@ socks_request_set_socks5_error(socks_request_t *req,
req->reply[3] = 0x01; // ATYP field.
}
+static const char SOCKS_PROXY_IS_NOT_AN_HTTP_PROXY_MSG[] =
+ "HTTP/1.0 501 Tor is not an HTTP Proxy\r\n"
+ "Content-Type: text/html; charset=iso-8859-1\r\n\r\n"
+ "<html>\n"
+ "<head>\n"
+ "<title>Tor is not an HTTP Proxy</title>\n"
+ "</head>\n"
+ "<body>\n"
+ "<h1>Tor is not an HTTP Proxy</h1>\n"
+ "<p>\n"
+ "It appears you have configured your web browser to use Tor as "
+ "an HTTP proxy.\n\n"
+ "This is not correct: Tor is a SOCKS proxy, not an HTTP proxy.\n"
+ "Please configure your client accordingly.\n"
+ "</p>\n"
+ "<p>\n"
+ "See <a href=\"https://www.torproject.org/documentation.html\">"
+ "https://www.torproject.org/documentation.html</a> for more "
+ "information.\n"
+ "<!-- Plus this comment, to make the body response more than 512 bytes, so "
+ " IE will be willing to display it. Comment comment comment comment "
+ " comment comment comment comment comment comment comment comment.-->\n"
+ "</p>\n"
+ "</body>\n"
+ "</html>\n";
+
/** Implementation helper to implement fetch_from_*_socks. Instead of looking
* at a buffer's contents, we look at the <b>datalen</b> bytes of data in
* <b>data</b>. Instead of removing data from the buffer, we set
@@ -1684,15 +1710,7 @@ parse_socks(const char *data, size_t datalen, socks_request_t *req,
req->port = ntohs(get_uint16(data+5+len));
*drain_out = 5+len+2;
- if (string_is_valid_ipv4_address(req->address) ||
- string_is_valid_ipv6_address(req->address)) {
- log_unsafe_socks_warning(5,req->address,req->port,safe_socks);
-
- if (safe_socks) {
- socks_request_set_socks5_error(req, SOCKS5_NOT_ALLOWED);
- return -1;
- }
- } else if (!string_is_valid_hostname(req->address)) {
+ if (!string_is_valid_hostname(req->address)) {
socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR);
log_warn(LD_PROTOCOL,
@@ -1814,7 +1832,7 @@ parse_socks(const char *data, size_t datalen, socks_request_t *req,
log_debug(LD_APP,"socks4: Everything is here. Success.");
strlcpy(req->address, startaddr ? startaddr : tmpbuf,
sizeof(req->address));
- if (!tor_strisprint(req->address) || strchr(req->address,'\"')) {
+ if (!string_is_valid_hostname(req->address)) {
log_warn(LD_PROTOCOL,
"Your application (using socks4 to port %d) gave Tor "
"a malformed hostname: %s. Rejecting the connection.",
@@ -1834,32 +1852,8 @@ parse_socks(const char *data, size_t datalen, socks_request_t *req,
case 'H': /* head */
case 'P': /* put/post */
case 'C': /* connect */
- strlcpy((char*)req->reply,
-"HTTP/1.0 501 Tor is not an HTTP Proxy\r\n"
-"Content-Type: text/html; charset=iso-8859-1\r\n\r\n"
-"<html>\n"
-"<head>\n"
-"<title>Tor is not an HTTP Proxy</title>\n"
-"</head>\n"
-"<body>\n"
-"<h1>Tor is not an HTTP Proxy</h1>\n"
-"<p>\n"
-"It appears you have configured your web browser to use Tor as an HTTP proxy."
-"\n"
-"This is not correct: Tor is a SOCKS proxy, not an HTTP proxy.\n"
-"Please configure your client accordingly.\n"
-"</p>\n"
-"<p>\n"
-"See <a href=\"https://www.torproject.org/documentation.html\">"
- "https://www.torproject.org/documentation.html</a> for more "
- "information.\n"
-"<!-- Plus this comment, to make the body response more than 512 bytes, so "
-" IE will be willing to display it. Comment comment comment comment "
-" comment comment comment comment comment comment comment comment.-->\n"
-"</p>\n"
-"</body>\n"
-"</html>\n"
- , MAX_SOCKS_REPLY_LEN);
+ strlcpy((char*)req->reply, SOCKS_PROXY_IS_NOT_AN_HTTP_PROXY_MSG,
+ MAX_SOCKS_REPLY_LEN);
req->replylen = strlen((char*)req->reply)+1;
/* fall through */
default: /* version is not socks4 or socks5 */
@@ -2022,6 +2016,34 @@ parse_socks_client(const uint8_t *data, size_t datalen,
return -1;
}
+/** Return true if <b>cmd</b> looks like a HTTP (proxy) request. */
+int
+peek_buf_has_http_command(const buf_t *buf)
+{
+ if (peek_buf_startswith(buf, "CONNECT ") ||
+ peek_buf_startswith(buf, "DELETE ") ||
+ peek_buf_startswith(buf, "GET ") ||
+ peek_buf_startswith(buf, "POST ") ||
+ peek_buf_startswith(buf, "PUT " ))
+ return 1;
+ return 0;
+}
+
+/** Return 1 iff <b>buf</b> starts with <b>cmd</b>. <b>cmd</b> must be a null
+ * terminated string, of no more than PEEK_BUF_STARTSWITH_MAX bytes. */
+int
+peek_buf_startswith(const buf_t *buf, const char *cmd)
+{
+ char tmp[PEEK_BUF_STARTSWITH_MAX];
+ size_t clen = strlen(cmd);
+ if (BUG(clen > sizeof(tmp)))
+ return 0;
+ if (buf->datalen < clen)
+ return 0;
+ peek_from_buf(tmp, clen, buf);
+ return fast_memeq(tmp, cmd, clen);
+}
+
/** Return 1 iff buf looks more like it has an (obsolete) v0 controller
* command on it than any valid v1 controller command. */
int
diff --git a/src/or/buffers.h b/src/or/buffers.h
index 23b58a571a..d884084385 100644
--- a/src/or/buffers.h
+++ b/src/or/buffers.h
@@ -53,6 +53,9 @@ int fetch_from_buf_socks_client(buf_t *buf, int state, char **reason);
int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len);
int peek_buf_has_control0_command(buf_t *buf);
+#define PEEK_BUF_STARTSWITH_MAX 16
+int peek_buf_startswith(const buf_t *buf, const char *cmd);
+int peek_buf_has_http_command(const buf_t *buf);
int fetch_ext_or_command_from_buf(buf_t *buf, ext_or_cmd_t **out);
diff --git a/src/or/channel.c b/src/or/channel.c
index df6d7d3423..9f8a03683f 100644
--- a/src/or/channel.c
+++ b/src/or/channel.c
@@ -2086,8 +2086,8 @@ channel_write_var_cell(channel_t *chan, var_cell_t *var_cell)
* are appropriate to the state transition in question.
*/
-void
-channel_change_state(channel_t *chan, channel_state_t to_state)
+static void
+channel_change_state_(channel_t *chan, channel_state_t to_state)
{
channel_state_t from_state;
unsigned char was_active, is_active;
@@ -2206,18 +2206,8 @@ channel_change_state(channel_t *chan, channel_state_t to_state)
estimated_total_queue_size += chan->bytes_in_queue;
}
- /* Tell circuits if we opened and stuff */
- if (to_state == CHANNEL_STATE_OPEN) {
- channel_do_open_actions(chan);
- chan->has_been_open = 1;
-
- /* Check for queued cells to process */
- if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue))
- channel_process_cells(chan);
- if (! TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue))
- channel_flush_cells(chan);
- } else if (to_state == CHANNEL_STATE_CLOSED ||
- to_state == CHANNEL_STATE_ERROR) {
+ if (to_state == CHANNEL_STATE_CLOSED ||
+ to_state == CHANNEL_STATE_ERROR) {
/* Assert that all queues are empty */
tor_assert(TOR_SIMPLEQ_EMPTY(&chan->incoming_queue));
tor_assert(TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue));
@@ -2225,6 +2215,35 @@ channel_change_state(channel_t *chan, channel_state_t to_state)
}
/**
+ * As channel_change_state_, but change the state to any state but open.
+ */
+void
+channel_change_state(channel_t *chan, channel_state_t to_state)
+{
+ tor_assert(to_state != CHANNEL_STATE_OPEN);
+ channel_change_state_(chan, to_state);
+}
+
+/**
+ * As channel_change_state, but change the state to open.
+ */
+void
+channel_change_state_open(channel_t *chan)
+{
+ channel_change_state_(chan, CHANNEL_STATE_OPEN);
+
+ /* Tell circuits if we opened and stuff */
+ channel_do_open_actions(chan);
+ chan->has_been_open = 1;
+
+ /* Check for queued cells to process */
+ if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue))
+ channel_process_cells(chan);
+ if (! TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue))
+ channel_flush_cells(chan);
+}
+
+/**
* Change channel listener state
*
* This internal and subclass use only function is used to change channel
diff --git a/src/or/channel.h b/src/or/channel.h
index ea280f2fd2..2d0ec39924 100644
--- a/src/or/channel.h
+++ b/src/or/channel.h
@@ -522,6 +522,7 @@ void channel_listener_free(channel_listener_t *chan_l);
/* State/metadata setters */
void channel_change_state(channel_t *chan, channel_state_t to_state);
+void channel_change_state_open(channel_t *chan);
void channel_clear_identity_digest(channel_t *chan);
void channel_clear_remote_end(channel_t *chan);
void channel_mark_local(channel_t *chan);
diff --git a/src/or/channeltls.c b/src/or/channeltls.c
index f44e4fc8ea..6547451181 100644
--- a/src/or/channeltls.c
+++ b/src/or/channeltls.c
@@ -993,7 +993,7 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan,
* We can go to CHANNEL_STATE_OPEN from CHANNEL_STATE_OPENING or
* CHANNEL_STATE_MAINT on this.
*/
- channel_change_state(base_chan, CHANNEL_STATE_OPEN);
+ channel_change_state_open(base_chan);
/* We might have just become writeable; check and tell the scheduler */
if (connection_or_num_cells_writeable(conn) > 0) {
scheduler_channel_wants_writes(base_chan);
@@ -1915,7 +1915,6 @@ certs_cell_typenum_to_cert_type(int typenum)
* of the connection, we then authenticate the server or mark the connection.
* If it's the server side, wait for an AUTHENTICATE cell.
*/
-
STATIC void
channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan)
{
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 16cef0e56b..65cd7bd5dc 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -46,6 +46,7 @@
#include "crypto.h"
#include "directory.h"
#include "entrynodes.h"
+#include "hs_ntor.h"
#include "main.h"
#include "microdesc.h"
#include "networkstatus.h"
@@ -74,6 +75,10 @@ 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 onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice);
+static int circuit_send_first_onion_skin(origin_circuit_t *circ);
+static int circuit_build_no_more_hops(origin_circuit_t *circ);
+static int circuit_send_intermediate_onion_skin(origin_circuit_t *circ,
+ crypt_path_t *hop);
/** This function tries to get a channel to the specified endpoint,
* and then calls command_setup_channel() to give it the right
@@ -912,234 +917,275 @@ circuit_purpose_may_omit_guard(int purpose)
* If circ's first hop is closed, then we need to build a create
* cell and send it forward.
*
- * Otherwise, we need to build a relay extend cell and send it
- * forward.
+ * Otherwise, if circ's cpath still has any non-open hops, we need to
+ * build a relay extend cell and send it forward to the next non-open hop.
+ *
+ * If all hops on the cpath are open, we're done building the circuit
+ * and we should do housekeeping for the newly opened circuit.
*
* Return -reason if we want to tear down circ, else return 0.
*/
int
circuit_send_next_onion_skin(origin_circuit_t *circ)
{
- crypt_path_t *hop;
- const node_t *node;
-
tor_assert(circ);
if (circ->cpath->state == CPATH_STATE_CLOSED) {
- /* This is the first hop. */
- create_cell_t cc;
- int fast;
- int len;
- log_debug(LD_CIRC,"First skin; sending create cell.");
- memset(&cc, 0, sizeof(cc));
- if (circ->build_state->onehop_tunnel)
- control_event_bootstrap(BOOTSTRAP_STATUS_ONEHOP_CREATE, 0);
- else {
- control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0);
-
- /* If this is not a one-hop tunnel, the channel is being used
- * for traffic that wants anonymity and protection from traffic
- * analysis (such as netflow record retention). That means we want
- * to pad it.
- */
- if (circ->base_.n_chan->channel_usage < CHANNEL_USED_FOR_FULL_CIRCS)
- circ->base_.n_chan->channel_usage = CHANNEL_USED_FOR_FULL_CIRCS;
- }
+ /* Case one: we're on the first hop. */
+ return circuit_send_first_onion_skin(circ);
+ }
- node = node_get_by_id(circ->base_.n_chan->identity_digest);
- fast = should_use_create_fast_for_circuit(circ);
- if (!fast) {
- /* We are an OR and we know the right onion key: we should
- * send a create cell.
- */
- circuit_pick_create_handshake(&cc.cell_type, &cc.handshake_type,
- circ->cpath->extend_info);
- } else {
- /* We are not an OR, and we're building the first hop of a circuit to a
- * new OR: we can be speedy and use CREATE_FAST to save an RSA operation
- * and a DH operation. */
- cc.cell_type = CELL_CREATE_FAST;
- cc.handshake_type = ONION_HANDSHAKE_TYPE_FAST;
- }
+ tor_assert(circ->cpath->state == CPATH_STATE_OPEN);
+ tor_assert(circ->base_.state == CIRCUIT_STATE_BUILDING);
+ crypt_path_t *hop = onion_next_hop_in_cpath(circ->cpath);
- len = onion_skin_create(cc.handshake_type,
- circ->cpath->extend_info,
- &circ->cpath->handshake_state,
- cc.onionskin);
- if (len < 0) {
- log_warn(LD_CIRC,"onion_skin_create (first hop) failed.");
- return - END_CIRC_REASON_INTERNAL;
- }
- cc.handshake_len = len;
+ if (hop) {
+ /* Case two: we're on a hop after the first. */
+ return circuit_send_intermediate_onion_skin(circ, hop);
+ }
+
+ /* Case three: the circuit is finished. Do housekeeping tasks on it. */
+ return circuit_build_no_more_hops(circ);
+}
- if (circuit_deliver_create_cell(TO_CIRCUIT(circ), &cc, 0) < 0)
- return - END_CIRC_REASON_RESOURCELIMIT;
+/**
+ * Called from circuit_send_next_onion_skin() when we find ourselves connected
+ * to the first hop in <b>circ</b>: Send a CREATE or CREATE2 or CREATE_FAST
+ * cell to that hop. Return 0 on success; -reason on failure (if the circuit
+ * should be torn down).
+ */
+static int
+circuit_send_first_onion_skin(origin_circuit_t *circ)
+{
+ int fast;
+ int len;
+ const node_t *node;
+ create_cell_t cc;
+ memset(&cc, 0, sizeof(cc));
+
+ log_debug(LD_CIRC,"First skin; sending create cell.");
- circ->cpath->state = CPATH_STATE_AWAITING_KEYS;
- circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING);
- log_info(LD_CIRC,"First hop: finished sending %s cell to '%s'",
- fast ? "CREATE_FAST" : "CREATE",
- node ? node_describe(node) : "<unnamed>");
+ if (circ->build_state->onehop_tunnel) {
+ control_event_bootstrap(BOOTSTRAP_STATUS_ONEHOP_CREATE, 0);
} else {
- extend_cell_t ec;
- int len;
- tor_assert(circ->cpath->state == CPATH_STATE_OPEN);
- tor_assert(circ->base_.state == CIRCUIT_STATE_BUILDING);
- log_debug(LD_CIRC,"starting to send subsequent skin.");
- hop = onion_next_hop_in_cpath(circ->cpath);
- memset(&ec, 0, sizeof(ec));
- if (!hop) {
- /* done building the circuit. whew. */
- guard_usable_t r;
- if (! circ->guard_state) {
- if (circuit_get_cpath_len(circ) != 1 &&
- ! 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",
- circuit_get_cpath_len(circ), circ, circ->base_.purpose);
- }
- r = GUARD_USABLE_NOW;
- } else {
- r = entry_guard_succeeded(&circ->guard_state);
- }
- const int is_usable_for_streams = (r == GUARD_USABLE_NOW);
- if (r == GUARD_USABLE_NOW) {
- circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN);
- } else if (r == GUARD_MAYBE_USABLE_LATER) {
- // Wait till either a better guard succeeds, or till
- // all better guards fail.
- circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_GUARD_WAIT);
- } else {
- tor_assert_nonfatal(r == GUARD_USABLE_NEVER);
- return - END_CIRC_REASON_INTERNAL;
- }
+ control_event_bootstrap(BOOTSTRAP_STATUS_CIRCUIT_CREATE, 0);
- /* XXXX #21422 -- the rest of this branch needs careful thought!
- * Some of the things here need to happen when a circuit becomes
- * mechanically open; some need to happen when it is actually usable.
- * I think I got them right, but more checking would be wise. -NM
- */
+ /* If this is not a one-hop tunnel, the channel is being used
+ * for traffic that wants anonymity and protection from traffic
+ * analysis (such as netflow record retention). That means we want
+ * to pad it.
+ */
+ if (circ->base_.n_chan->channel_usage < CHANNEL_USED_FOR_FULL_CIRCS)
+ circ->base_.n_chan->channel_usage = CHANNEL_USED_FOR_FULL_CIRCS;
+ }
- if (circuit_timeout_want_to_count_circ(circ)) {
- struct timeval end;
- long timediff;
- tor_gettimeofday(&end);
- timediff = tv_mdiff(&circ->base_.timestamp_began, &end);
+ node = node_get_by_id(circ->base_.n_chan->identity_digest);
+ fast = should_use_create_fast_for_circuit(circ);
+ if (!fast) {
+ /* We know the right onion key: we should send a create cell. */
+ circuit_pick_create_handshake(&cc.cell_type, &cc.handshake_type,
+ circ->cpath->extend_info);
+ } else {
+ /* We don't know an onion key, so we need to fall back to CREATE_FAST. */
+ cc.cell_type = CELL_CREATE_FAST;
+ cc.handshake_type = ONION_HANDSHAKE_TYPE_FAST;
+ }
- /*
- * If the circuit build time is much greater than we would have cut
- * it off at, we probably had a suspend event along this codepath,
- * and we should discard the value.
- */
- if (timediff < 0 ||
- timediff > 2*get_circuit_build_close_time_ms()+1000) {
- log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. "
- "Assuming clock jump. Purpose %d (%s)", timediff,
- circ->base_.purpose,
- circuit_purpose_to_string(circ->base_.purpose));
- } else if (!circuit_build_times_disabled(get_options())) {
- /* Only count circuit times if the network is live */
- if (circuit_build_times_network_check_live(
- get_circuit_build_times())) {
- circuit_build_times_add_time(get_circuit_build_times_mutable(),
- (build_time_t)timediff);
- circuit_build_times_set_timeout(get_circuit_build_times_mutable());
- }
-
- if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- circuit_build_times_network_circ_success(
- get_circuit_build_times_mutable());
- }
- }
- }
- log_info(LD_CIRC,"circuit built!");
- circuit_reset_failure_count(0);
+ len = onion_skin_create(cc.handshake_type,
+ circ->cpath->extend_info,
+ &circ->cpath->handshake_state,
+ cc.onionskin);
+ if (len < 0) {
+ log_warn(LD_CIRC,"onion_skin_create (first hop) failed.");
+ return - END_CIRC_REASON_INTERNAL;
+ }
+ cc.handshake_len = len;
- if (circ->build_state->onehop_tunnel || circ->has_opened) {
- control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_STATUS, 0);
- }
+ if (circuit_deliver_create_cell(TO_CIRCUIT(circ), &cc, 0) < 0)
+ return - END_CIRC_REASON_RESOURCELIMIT;
- pathbias_count_build_success(circ);
- circuit_rep_hist_note_result(circ);
- if (is_usable_for_streams)
- circuit_has_opened(circ); /* do other actions as necessary */
-
- if (!have_completed_a_circuit() && !circ->build_state->onehop_tunnel) {
- const or_options_t *options = get_options();
- note_that_we_completed_a_circuit();
- /* FFFF Log a count of known routers here */
- log_notice(LD_GENERAL,
- "Tor has successfully opened a circuit. "
- "Looks like client functionality is working.");
- if (control_event_bootstrap(BOOTSTRAP_STATUS_DONE, 0) == 0) {
- log_notice(LD_GENERAL,
- "Tor has successfully opened a circuit. "
- "Looks like client functionality is working.");
- }
- control_event_client_status(LOG_NOTICE, "CIRCUIT_ESTABLISHED");
- clear_broken_connection_map(1);
- if (server_mode(options) && !check_whether_orport_reachable(options)) {
- inform_testing_reachability();
- consider_testing_reachability(1, 1);
- }
+ circ->cpath->state = CPATH_STATE_AWAITING_KEYS;
+ circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_BUILDING);
+ log_info(LD_CIRC,"First hop: finished sending %s cell to '%s'",
+ fast ? "CREATE_FAST" : "CREATE",
+ node ? node_describe(node) : "<unnamed>");
+ return 0;
+}
+
+/**
+ * Called from circuit_send_next_onion_skin() when we find that we have no
+ * more hops: mark the circuit as finished, and perform the necessary
+ * bookkeeping. Return 0 on success; -reason on failure (if the circuit
+ * should be torn down).
+ */
+static int
+circuit_build_no_more_hops(origin_circuit_t *circ)
+{
+ guard_usable_t r;
+ if (! circ->guard_state) {
+ if (circuit_get_cpath_len(circ) != 1 &&
+ ! 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",
+ circuit_get_cpath_len(circ), circ, circ->base_.purpose);
+ }
+ r = GUARD_USABLE_NOW;
+ } else {
+ r = entry_guard_succeeded(&circ->guard_state);
+ }
+ const int is_usable_for_streams = (r == GUARD_USABLE_NOW);
+ if (r == GUARD_USABLE_NOW) {
+ circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_OPEN);
+ } else if (r == GUARD_MAYBE_USABLE_LATER) {
+ // Wait till either a better guard succeeds, or till
+ // all better guards fail.
+ circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_GUARD_WAIT);
+ } else {
+ tor_assert_nonfatal(r == GUARD_USABLE_NEVER);
+ return - END_CIRC_REASON_INTERNAL;
+ }
+
+ /* XXXX #21422 -- the rest of this branch needs careful thought!
+ * Some of the things here need to happen when a circuit becomes
+ * mechanically open; some need to happen when it is actually usable.
+ * I think I got them right, but more checking would be wise. -NM
+ */
+
+ if (circuit_timeout_want_to_count_circ(circ)) {
+ struct timeval end;
+ long timediff;
+ tor_gettimeofday(&end);
+ timediff = tv_mdiff(&circ->base_.timestamp_began, &end);
+
+ /*
+ * If the circuit build time is much greater than we would have cut
+ * it off at, we probably had a suspend event along this codepath,
+ * and we should discard the value.
+ */
+ if (timediff < 0 ||
+ timediff > 2*get_circuit_build_close_time_ms()+1000) {
+ log_notice(LD_CIRC, "Strange value for circuit build time: %ldmsec. "
+ "Assuming clock jump. Purpose %d (%s)", timediff,
+ circ->base_.purpose,
+ circuit_purpose_to_string(circ->base_.purpose));
+ } else if (!circuit_build_times_disabled(get_options())) {
+ /* Only count circuit times if the network is live */
+ if (circuit_build_times_network_check_live(
+ get_circuit_build_times())) {
+ circuit_build_times_add_time(get_circuit_build_times_mutable(),
+ (build_time_t)timediff);
+ circuit_build_times_set_timeout(get_circuit_build_times_mutable());
}
- /* We're done with measurement circuits here. Just close them */
- if (circ->base_.purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
+ if (circ->base_.purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
+ circuit_build_times_network_circ_success(
+ get_circuit_build_times_mutable());
}
- return 0;
}
-
- if (tor_addr_family(&hop->extend_info->addr) != AF_INET) {
- log_warn(LD_BUG, "Trying to extend to a non-IPv4 address.");
- return - END_CIRC_REASON_INTERNAL;
+ }
+ log_info(LD_CIRC,"circuit built!");
+ circuit_reset_failure_count(0);
+
+ if (circ->build_state->onehop_tunnel || circ->has_opened) {
+ control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_STATUS, 0);
+ }
+
+ pathbias_count_build_success(circ);
+ circuit_rep_hist_note_result(circ);
+ if (is_usable_for_streams)
+ circuit_has_opened(circ); /* do other actions as necessary */
+
+ if (!have_completed_a_circuit() && !circ->build_state->onehop_tunnel) {
+ const or_options_t *options = get_options();
+ note_that_we_completed_a_circuit();
+ /* FFFF Log a count of known routers here */
+ log_notice(LD_GENERAL,
+ "Tor has successfully opened a circuit. "
+ "Looks like client functionality is working.");
+ if (control_event_bootstrap(BOOTSTRAP_STATUS_DONE, 0) == 0) {
+ log_notice(LD_GENERAL,
+ "Tor has successfully opened a circuit. "
+ "Looks like client functionality is working.");
}
-
- circuit_pick_extend_handshake(&ec.cell_type,
- &ec.create_cell.cell_type,
- &ec.create_cell.handshake_type,
- hop->extend_info);
-
- tor_addr_copy(&ec.orport_ipv4.addr, &hop->extend_info->addr);
- ec.orport_ipv4.port = hop->extend_info->port;
- tor_addr_make_unspec(&ec.orport_ipv6.addr);
- memcpy(ec.node_id, hop->extend_info->identity_digest, DIGEST_LEN);
- /* Set the ED25519 identity too -- it will only get included
- * in the extend2 cell if we're configured to use it, though. */
- ed25519_pubkey_copy(&ec.ed_pubkey, &hop->extend_info->ed_identity);
-
- len = onion_skin_create(ec.create_cell.handshake_type,
- hop->extend_info,
- &hop->handshake_state,
- ec.create_cell.onionskin);
- if (len < 0) {
- log_warn(LD_CIRC,"onion_skin_create failed.");
- return - END_CIRC_REASON_INTERNAL;
+ control_event_client_status(LOG_NOTICE, "CIRCUIT_ESTABLISHED");
+ clear_broken_connection_map(1);
+ if (server_mode(options) && !check_whether_orport_reachable(options)) {
+ inform_testing_reachability();
+ consider_testing_reachability(1, 1);
}
- ec.create_cell.handshake_len = len;
+ }
- log_info(LD_CIRC,"Sending extend relay cell.");
- {
- uint8_t command = 0;
- uint16_t payload_len=0;
- uint8_t payload[RELAY_PAYLOAD_SIZE];
- if (extend_cell_format(&command, &payload_len, payload, &ec)<0) {
- log_warn(LD_CIRC,"Couldn't format extend cell");
- return -END_CIRC_REASON_INTERNAL;
- }
+ /* We're done with measurement circuits here. Just close them */
+ if (circ->base_.purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
+ }
+ return 0;
+}
+
+/**
+ * Called from circuit_send_next_onion_skin() when we find that we have a hop
+ * other than the first that we need to extend to: use <b>hop</b>'s
+ * information to extend the circuit another step. Return 0 on success;
+ * -reason on failure (if the circuit should be torn down).
+ */
+static int
+circuit_send_intermediate_onion_skin(origin_circuit_t *circ,
+ crypt_path_t *hop)
+{
+ int len;
+ extend_cell_t ec;
+ memset(&ec, 0, sizeof(ec));
+
+ log_debug(LD_CIRC,"starting to send subsequent skin.");
+
+ if (tor_addr_family(&hop->extend_info->addr) != AF_INET) {
+ log_warn(LD_BUG, "Trying to extend to a non-IPv4 address.");
+ return - END_CIRC_REASON_INTERNAL;
+ }
- /* send it to hop->prev, because it will transfer
- * it to a create cell and then send to hop */
- if (relay_send_command_from_edge(0, TO_CIRCUIT(circ),
- command,
- (char*)payload, payload_len,
- hop->prev) < 0)
- return 0; /* circuit is closed */
+ circuit_pick_extend_handshake(&ec.cell_type,
+ &ec.create_cell.cell_type,
+ &ec.create_cell.handshake_type,
+ hop->extend_info);
+
+ tor_addr_copy(&ec.orport_ipv4.addr, &hop->extend_info->addr);
+ ec.orport_ipv4.port = hop->extend_info->port;
+ tor_addr_make_unspec(&ec.orport_ipv6.addr);
+ memcpy(ec.node_id, hop->extend_info->identity_digest, DIGEST_LEN);
+ /* Set the ED25519 identity too -- it will only get included
+ * in the extend2 cell if we're configured to use it, though. */
+ ed25519_pubkey_copy(&ec.ed_pubkey, &hop->extend_info->ed_identity);
+
+ len = onion_skin_create(ec.create_cell.handshake_type,
+ hop->extend_info,
+ &hop->handshake_state,
+ ec.create_cell.onionskin);
+ if (len < 0) {
+ log_warn(LD_CIRC,"onion_skin_create failed.");
+ return - END_CIRC_REASON_INTERNAL;
+ }
+ ec.create_cell.handshake_len = len;
+
+ log_info(LD_CIRC,"Sending extend relay cell.");
+ {
+ uint8_t command = 0;
+ uint16_t payload_len=0;
+ uint8_t payload[RELAY_PAYLOAD_SIZE];
+ if (extend_cell_format(&command, &payload_len, payload, &ec)<0) {
+ log_warn(LD_CIRC,"Couldn't format extend cell");
+ return -END_CIRC_REASON_INTERNAL;
}
- hop->state = CPATH_STATE_AWAITING_KEYS;
+
+ /* send it to hop->prev, because that relay will transfer
+ * it to a create cell and then send to hop */
+ if (relay_send_command_from_edge(0, TO_CIRCUIT(circ),
+ command,
+ (char*)payload, payload_len,
+ hop->prev) < 0)
+ return 0; /* circuit is closed */
}
+ hop->state = CPATH_STATE_AWAITING_KEYS;
return 0;
}
@@ -1325,40 +1371,77 @@ circuit_extend(cell_t *cell, circuit_t *circ)
return 0;
}
-/** Initialize cpath-\>{f|b}_{crypto|digest} from the key material in
- * key_data. key_data must contain CPATH_KEY_MATERIAL bytes, which are
- * used as follows:
+/** Initialize cpath-\>{f|b}_{crypto|digest} from the key material in key_data.
+ *
+ * If <b>is_hs_v3</b> is set, this cpath will be used for next gen hidden
+ * service circuits and <b>key_data</b> must be at least
+ * HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN bytes in length.
+ *
+ * If <b>is_hs_v3</b> is not set, key_data must contain CPATH_KEY_MATERIAL_LEN
+ * bytes, which are used as follows:
* - 20 to initialize f_digest
* - 20 to initialize b_digest
* - 16 to key f_crypto
* - 16 to key b_crypto
*
* (If 'reverse' is true, then f_XX and b_XX are swapped.)
+ *
+ * Return 0 if init was successful, else -1 if it failed.
*/
int
-circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data,
- int reverse)
+circuit_init_cpath_crypto(crypt_path_t *cpath,
+ const char *key_data, size_t key_data_len,
+ int reverse, int is_hs_v3)
{
crypto_digest_t *tmp_digest;
crypto_cipher_t *tmp_crypto;
+ size_t digest_len = 0;
+ size_t cipher_key_len = 0;
tor_assert(cpath);
tor_assert(key_data);
tor_assert(!(cpath->f_crypto || cpath->b_crypto ||
cpath->f_digest || cpath->b_digest));
- cpath->f_digest = crypto_digest_new();
- crypto_digest_add_bytes(cpath->f_digest, key_data, DIGEST_LEN);
- cpath->b_digest = crypto_digest_new();
- crypto_digest_add_bytes(cpath->b_digest, key_data+DIGEST_LEN, DIGEST_LEN);
+ /* Basic key size validation */
+ if (is_hs_v3 && BUG(key_data_len != HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN)) {
+ return -1;
+ } else if (!is_hs_v3 && BUG(key_data_len != CPATH_KEY_MATERIAL_LEN)) {
+ return -1;
+ }
+
+ /* If we are using this cpath for next gen onion services use SHA3-256,
+ otherwise use good ol' SHA1 */
+ if (is_hs_v3) {
+ digest_len = DIGEST256_LEN;
+ cipher_key_len = CIPHER256_KEY_LEN;
+ cpath->f_digest = crypto_digest256_new(DIGEST_SHA3_256);
+ cpath->b_digest = crypto_digest256_new(DIGEST_SHA3_256);
+ } else {
+ digest_len = DIGEST_LEN;
+ cipher_key_len = CIPHER_KEY_LEN;
+ cpath->f_digest = crypto_digest_new();
+ cpath->b_digest = crypto_digest_new();
+ }
+
+ tor_assert(digest_len != 0);
+ tor_assert(cipher_key_len != 0);
+ const int cipher_key_bits = (int) cipher_key_len * 8;
- if (!(cpath->f_crypto =
- crypto_cipher_new(key_data+(2*DIGEST_LEN)))) {
+ crypto_digest_add_bytes(cpath->f_digest, key_data, digest_len);
+ crypto_digest_add_bytes(cpath->b_digest, key_data+digest_len, digest_len);
+
+ cpath->f_crypto = crypto_cipher_new_with_bits(key_data+(2*digest_len),
+ cipher_key_bits);
+ if (!cpath->f_crypto) {
log_warn(LD_BUG,"Forward cipher initialization failed.");
return -1;
}
- if (!(cpath->b_crypto =
- crypto_cipher_new(key_data+(2*DIGEST_LEN)+CIPHER_KEY_LEN))) {
+
+ cpath->b_crypto = crypto_cipher_new_with_bits(
+ key_data+(2*digest_len)+cipher_key_len,
+ cipher_key_bits);
+ if (!cpath->b_crypto) {
log_warn(LD_BUG,"Backward cipher initialization failed.");
return -1;
}
@@ -1424,7 +1507,7 @@ circuit_finish_handshake(origin_circuit_t *circ,
onion_handshake_state_release(&hop->handshake_state);
- if (circuit_init_cpath_crypto(hop, keys, 0)<0) {
+ if (circuit_init_cpath_crypto(hop, keys, sizeof(keys), 0, 0)<0) {
return -END_CIRC_REASON_TORPROTOCOL;
}
@@ -1491,12 +1574,14 @@ circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, int reason)
int
onionskin_answer(or_circuit_t *circ,
const created_cell_t *created_cell,
- const char *keys,
+ const char *keys, size_t keys_len,
const uint8_t *rend_circ_nonce)
{
cell_t cell;
crypt_path_t *tmp_cpath;
+ tor_assert(keys_len == CPATH_KEY_MATERIAL_LEN);
+
if (created_cell_format(&cell, created_cell) < 0) {
log_warn(LD_BUG,"couldn't format created cell (type=%d, len=%d)",
(int)created_cell->cell_type, (int)created_cell->handshake_len);
@@ -1512,7 +1597,7 @@ onionskin_answer(or_circuit_t *circ,
log_debug(LD_CIRC,"init digest forward 0x%.8x, backward 0x%.8x.",
(unsigned int)get_uint32(keys),
(unsigned int)get_uint32(keys+20));
- if (circuit_init_cpath_crypto(tmp_cpath, keys, 0)<0) {
+ if (circuit_init_cpath_crypto(tmp_cpath, keys, keys_len, 0, 0)<0) {
log_warn(LD_BUG,"Circuit initialization failed");
tor_free(tmp_cpath);
return -1;
@@ -1956,9 +2041,10 @@ choose_good_exit_server_general(int need_uptime, int need_capacity)
}
if (options->ExitNodes) {
log_warn(LD_CIRC,
- "No specified %sexit routers seem to be running: "
+ "No exits in ExitNodes%s seem to be running: "
"can't choose an exit.",
- options->ExcludeExitNodesUnion_ ? "non-excluded " : "");
+ options->ExcludeExitNodesUnion_ ?
+ ", except possibly those excluded by your configuration, " : "");
}
return NULL;
}
@@ -2311,6 +2397,30 @@ onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop)
}
}
+#ifdef TOR_UNIT_TESTS
+
+/** Unittest helper function: Count number of hops in cpath linked list. */
+unsigned int
+cpath_get_n_hops(crypt_path_t **head_ptr)
+{
+ unsigned int n_hops = 0;
+ crypt_path_t *tmp;
+
+ if (!*head_ptr) {
+ return 0;
+ }
+
+ tmp = *head_ptr;
+ if (tmp) {
+ n_hops++;
+ tmp = (*head_ptr)->next;
+ }
+
+ return n_hops;
+}
+
+#endif
+
/** A helper function used by onion_extend_cpath(). Use <b>purpose</b>
* and <b>state</b> and the cpath <b>head</b> (currently populated only
* to length <b>cur_len</b> to decide a suitable middle hop for a
@@ -2332,8 +2442,8 @@ choose_good_middle_server(uint8_t purpose,
tor_assert(CIRCUIT_PURPOSE_MIN_ <= purpose &&
purpose <= CIRCUIT_PURPOSE_MAX_);
- log_debug(LD_CIRC, "Contemplating intermediate hop %d: random choice.",
- cur_len);
+ log_debug(LD_CIRC, "Contemplating intermediate hop #%d: random choice.",
+ cur_len+1);
excluded = smartlist_new();
if ((r = build_state_get_exit_node(state))) {
nodelist_add_node_and_family(excluded, r);
@@ -2358,9 +2468,6 @@ choose_good_middle_server(uint8_t purpose,
* router (if we're an OR), and respect firewall settings; if we're
* configured to use entry guards, return one.
*
- * If <b>state</b> is NULL, we're choosing a router to serve as an entry
- * guard, not for any particular circuit.
- *
* Set *<b>guard_state_out</b> to information about the guard that
* we're selecting, which we'll use later to remember whether the
* guard worked or not.
@@ -2378,6 +2485,11 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state,
CRN_DIRECT_CONN);
const node_t *node;
+ /* Once we used this function to select a node to be a guard. We had
+ * 'state == NULL' be the signal for that. But we don't do that any more.
+ */
+ tor_assert_nonfatal(state);
+
if (state && options->UseEntryGuards &&
(purpose != CIRCUIT_PURPOSE_TESTING || options->BridgeRelay)) {
/* This request is for an entry server to use for a regular circuit,
@@ -2467,12 +2579,12 @@ onion_extend_cpath(origin_circuit_t *circ)
}
if (!info) {
- log_warn(LD_CIRC,"Failed to find node for hop %d of our path. Discarding "
- "this circuit.", cur_len);
+ log_warn(LD_CIRC,"Failed to find node for hop #%d of our path. Discarding "
+ "this circuit.", cur_len+1);
return -1;
}
- log_debug(LD_CIRC,"Chose router %s for hop %d (exit is %s)",
+ log_debug(LD_CIRC,"Chose router %s for hop #%d (exit is %s)",
extend_info_describe(info),
cur_len+1, build_state_get_exit_nickname(state));
@@ -2580,7 +2692,7 @@ extend_info_from_node(const node_t *node, int for_direct_connect)
ed_pubkey = node_get_ed25519_id(node);
} else if (node_get_ed25519_id(node)) {
log_info(LD_CIRC, "Not including the ed25519 ID for %s, since it won't "
- " be able to authenticate it.",
+ "be able to authenticate it.",
node_describe(node));
}
diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h
index 45d9b2fb75..62a6367ed2 100644
--- a/src/or/circuitbuild.h
+++ b/src/or/circuitbuild.h
@@ -31,8 +31,9 @@ int circuit_timeout_want_to_count_circ(origin_circuit_t *circ);
int circuit_send_next_onion_skin(origin_circuit_t *circ);
void circuit_note_clock_jumped(int seconds_elapsed);
int circuit_extend(cell_t *cell, circuit_t *circ);
-int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data,
- int reverse);
+int circuit_init_cpath_crypto(crypt_path_t *cpath,
+ const char *key_data, size_t key_data_len,
+ int reverse, int is_hs_v3);
struct created_cell_t;
int circuit_finish_handshake(origin_circuit_t *circ,
const struct created_cell_t *created_cell);
@@ -40,7 +41,7 @@ int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer,
int reason);
int onionskin_answer(or_circuit_t *circ,
const struct created_cell_t *created_cell,
- const char *keys,
+ const char *keys, size_t keys_len,
const uint8_t *rend_circ_nonce);
MOCK_DECL(int, circuit_all_predicted_ports_handled, (time_t now,
int *need_uptime,
@@ -83,6 +84,8 @@ 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);
+unsigned int cpath_get_n_hops(crypt_path_t **head_ptr);
+
#endif
#endif
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 86b0aa097a..2f3fe327e6 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -65,8 +65,10 @@
#include "control.h"
#include "entrynodes.h"
#include "main.h"
+#include "hs_circuit.h"
#include "hs_circuitmap.h"
#include "hs_common.h"
+#include "hs_ident.h"
#include "networkstatus.h"
#include "nodelist.h"
#include "onion.h"
@@ -957,6 +959,7 @@ circuit_free(circuit_t *circ)
crypto_pk_free(ocirc->intro_key);
rend_data_free(ocirc->rend_data);
+ hs_ident_circuit_free(ocirc->hs_ident);
tor_free(ocirc->dest_address);
if (ocirc->socks_username) {
@@ -1530,6 +1533,41 @@ circuit_get_next_service_intro_circ(origin_circuit_t *start)
return NULL;
}
+/** Return the first service rendezvous circuit originating from the global
+ * circuit list after <b>start</b> or at the start of the list if <b>start</b>
+ * is NULL. Return NULL if no circuit is found.
+ *
+ * A service rendezvous point circuit has a purpose of either
+ * CIRCUIT_PURPOSE_S_CONNECT_REND or CIRCUIT_PURPOSE_S_REND_JOINED. This does
+ * not return a circuit marked for close and its state must be open. */
+origin_circuit_t *
+circuit_get_next_service_rp_circ(origin_circuit_t *start)
+{
+ int idx = 0;
+ smartlist_t *lst = circuit_get_global_list();
+
+ if (start) {
+ idx = TO_CIRCUIT(start)->global_circuitlist_idx + 1;
+ }
+
+ for ( ; idx < smartlist_len(lst); ++idx) {
+ circuit_t *circ = smartlist_get(lst, idx);
+
+ /* Ignore a marked for close circuit or purpose not matching a service
+ * intro point or if the state is not open. */
+ if (circ->marked_for_close || circ->state != CIRCUIT_STATE_OPEN ||
+ (circ->purpose != CIRCUIT_PURPOSE_S_CONNECT_REND &&
+ circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED)) {
+ continue;
+ }
+ /* The purposes we are looking for are only for origin circuits so the
+ * following is valid. */
+ return TO_ORIGIN_CIRCUIT(circ);
+ }
+ /* Not found. */
+ return NULL;
+}
+
/** Return the first circuit originating here in global_circuitlist after
* <b>start</b> whose purpose is <b>purpose</b>, and where <b>digest</b> (if
* set) matches the private key digest of the rend data associated with the
@@ -1911,13 +1949,20 @@ circuit_about_to_free(circuit_t *circ)
orig_reason);
}
+ /* Notify the HS subsystem for any intro point circuit closing so it can be
+ * dealt with cleanly. */
+ if (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
+ circ->purpose == CIRCUIT_PURPOSE_S_INTRO) {
+ hs_service_intro_circ_has_closed(TO_ORIGIN_CIRCUIT(circ));
+ }
+
if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) {
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
int timed_out = (reason == END_CIRC_REASON_TIMEOUT);
tor_assert(circ->state == CIRCUIT_STATE_OPEN);
tor_assert(ocirc->build_state->chosen_exit);
- tor_assert(ocirc->rend_data);
- if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT) {
+ if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT &&
+ ocirc->rend_data) {
/* treat this like getting a nack from it */
log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s",
safe_str_client(rend_data_get_address(ocirc->rend_data)),
@@ -1933,7 +1978,8 @@ circuit_about_to_free(circuit_t *circ)
reason != END_CIRC_REASON_TIMEOUT) {
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
if (ocirc->build_state->chosen_exit && ocirc->rend_data) {
- if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT) {
+ if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT &&
+ ocirc->rend_data) {
log_info(LD_REND, "Failed intro circ %s to %s "
"(building circuit to intro point). "
"Marking intro point as possibly unreachable.",
diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h
index d647062f46..b882b2c6a8 100644
--- a/src/or/circuitlist.h
+++ b/src/or/circuitlist.h
@@ -13,6 +13,7 @@
#define TOR_CIRCUITLIST_H
#include "testsupport.h"
+#include "hs_ident.h"
MOCK_DECL(smartlist_t *, circuit_get_global_list, (void));
smartlist_t *circuit_get_global_origin_circuit_list(void);
@@ -48,6 +49,8 @@ origin_circuit_t *circuit_get_ready_rend_circ_by_rend_data(
origin_circuit_t *circuit_get_next_by_pk_and_purpose(origin_circuit_t *start,
const uint8_t *digest, uint8_t purpose);
origin_circuit_t *circuit_get_next_service_intro_circ(origin_circuit_t *start);
+origin_circuit_t *circuit_get_next_service_rp_circ(origin_circuit_t *start);
+origin_circuit_t *circuit_get_next_service_hsdir_circ(origin_circuit_t *start);
origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
extend_info_t *info, int flags);
void circuit_mark_all_unused_circs(void);
diff --git a/src/or/circuitmux_ewma.c b/src/or/circuitmux_ewma.c
index c2440b13f0..fde2d22a89 100644
--- a/src/or/circuitmux_ewma.c
+++ b/src/or/circuitmux_ewma.c
@@ -731,7 +731,7 @@ add_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma)
smartlist_pqueue_add(pol->active_circuit_pqueue,
compare_cell_ewma_counts,
- STRUCT_OFFSET(cell_ewma_t, heap_index),
+ offsetof(cell_ewma_t, heap_index),
ewma);
}
@@ -746,7 +746,7 @@ remove_cell_ewma(ewma_policy_data_t *pol, cell_ewma_t *ewma)
smartlist_pqueue_remove(pol->active_circuit_pqueue,
compare_cell_ewma_counts,
- STRUCT_OFFSET(cell_ewma_t, heap_index),
+ offsetof(cell_ewma_t, heap_index),
ewma);
}
@@ -760,6 +760,6 @@ pop_first_cell_ewma(ewma_policy_data_t *pol)
return smartlist_pqueue_pop(pol->active_circuit_pqueue,
compare_cell_ewma_counts,
- STRUCT_OFFSET(cell_ewma_t, heap_index));
+ offsetof(cell_ewma_t, heap_index));
}
diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c
index 51d580a1a4..963892c9d1 100644
--- a/src/or/circuitstats.c
+++ b/src/or/circuitstats.c
@@ -939,7 +939,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
uint32_t count, k;
build_time_t ms;
int ok;
- ms = (build_time_t)tor_parse_ulong(ms_str, 0, 0,
+ ms = (build_time_t)tor_parse_ulong(ms_str, 10, 0,
CBT_BUILD_TIME_MAX, &ok, NULL);
if (!ok) {
log_warn(LD_GENERAL, "Unable to parse circuit build times: "
@@ -949,7 +949,7 @@ circuit_build_times_parse_state(circuit_build_times_t *cbt,
smartlist_free(args);
break;
}
- count = (uint32_t)tor_parse_ulong(count_str, 0, 0,
+ count = (uint32_t)tor_parse_ulong(count_str, 10, 0,
UINT32_MAX, &ok, NULL);
if (!ok) {
log_warn(LD_GENERAL, "Unable to parse circuit build times: "
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 9f9d3abf7c..570b05e572 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -42,6 +42,9 @@
#include "control.h"
#include "entrynodes.h"
#include "hs_common.h"
+#include "hs_client.h"
+#include "hs_circuit.h"
+#include "hs_ident.h"
#include "nodelist.h"
#include "networkstatus.h"
#include "policies.h"
@@ -55,6 +58,36 @@
static void circuit_expire_old_circuits_clientside(void);
static void circuit_increment_failure_count(void);
+/** Check whether the hidden service destination of the stream at
+ * <b>edge_conn</b> is the same as the destination of the circuit at
+ * <b>origin_circ</b>. */
+static int
+circuit_matches_with_rend_stream(const edge_connection_t *edge_conn,
+ const origin_circuit_t *origin_circ)
+{
+ /* Check if this is a v2 rendezvous circ/stream */
+ if ((edge_conn->rend_data && !origin_circ->rend_data) ||
+ (!edge_conn->rend_data && origin_circ->rend_data) ||
+ (edge_conn->rend_data && origin_circ->rend_data &&
+ rend_cmp_service_ids(rend_data_get_address(edge_conn->rend_data),
+ rend_data_get_address(origin_circ->rend_data)))) {
+ /* this circ is not for this conn */
+ return 0;
+ }
+
+ /* Check if this is a v3 rendezvous circ/stream */
+ if ((edge_conn->hs_ident && !origin_circ->hs_ident) ||
+ (!edge_conn->hs_ident && origin_circ->hs_ident) ||
+ (edge_conn->hs_ident && origin_circ->hs_ident &&
+ !ed25519_pubkey_eq(&edge_conn->hs_ident->identity_pk,
+ &origin_circ->hs_ident->identity_pk))) {
+ /* this circ is not for this conn */
+ return 0;
+ }
+
+ return 1;
+}
+
/** Return 1 if <b>circ</b> could be returned by circuit_get_best().
* Else return 0.
*/
@@ -169,14 +202,9 @@ circuit_is_acceptable(const origin_circuit_t *origin_circ,
/* can't exit from this router */
return 0;
}
- } else { /* not general */
+ } else { /* not general: this might be a rend circuit */
const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
- if ((edge_conn->rend_data && !origin_circ->rend_data) ||
- (!edge_conn->rend_data && origin_circ->rend_data) ||
- (edge_conn->rend_data && origin_circ->rend_data &&
- rend_cmp_service_ids(rend_data_get_address(edge_conn->rend_data),
- rend_data_get_address(origin_circ->rend_data)))) {
- /* this circ is not for this conn */
+ if (!circuit_matches_with_rend_stream(edge_conn, origin_circ)) {
return 0;
}
}
@@ -309,7 +337,8 @@ circuit_get_best(const entry_connection_t *conn,
/* Log an info message if we're going to launch a new intro circ in
* parallel */
if (purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT &&
- !must_be_open && origin_circ->hs_circ_has_timed_out) {
+ !must_be_open && origin_circ->hs_circ_has_timed_out &&
+ !circ->marked_for_close) {
intro_going_on_but_too_old = 1;
continue;
}
@@ -622,6 +651,7 @@ circuit_expire_building(void)
* because that's set when they switch purposes
*/
if (TO_ORIGIN_CIRCUIT(victim)->rend_data ||
+ TO_ORIGIN_CIRCUIT(victim)->hs_ident ||
victim->timestamp_dirty > cutoff.tv_sec)
continue;
break;
@@ -755,7 +785,7 @@ circuit_expire_building(void)
victim->state, circuit_state_to_string(victim->state),
victim->purpose);
TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out = 1;
- rend_service_relaunch_rendezvous(TO_ORIGIN_CIRCUIT(victim));
+ hs_circ_retry_service_rendezvous_point(TO_ORIGIN_CIRCUIT(victim));
continue;
}
@@ -1086,11 +1116,32 @@ needs_exit_circuits(time_t now, int *needs_uptime, int *needs_capacity)
/* Return true if we need any more hidden service server circuits.
* HS servers only need an internal circuit. */
STATIC int
-needs_hs_server_circuits(int num_uptime_internal)
+needs_hs_server_circuits(time_t now, int num_uptime_internal)
{
- return (num_rend_services() &&
- num_uptime_internal < SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS &&
- router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN);
+ if (!rend_num_services() && !hs_service_get_num_services()) {
+ /* No services, we don't need anything. */
+ goto no_need;
+ }
+
+ if (num_uptime_internal >= SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS) {
+ /* We have sufficient amount of internal circuit. */
+ goto no_need;
+ }
+
+ if (router_have_consensus_path() == CONSENSUS_PATH_UNKNOWN) {
+ /* Consensus hasn't been checked or might be invalid so requesting
+ * internal circuits is not wise. */
+ goto no_need;
+ }
+
+ /* At this point, we need a certain amount of circuits and we will most
+ * likely use them for rendezvous so we note down the use of internal
+ * circuit for our prediction for circuit needing uptime and capacity. */
+ rep_hist_note_used_internal(now, 1, 1);
+
+ return 1;
+ no_need:
+ return 0;
}
/* We need at least this many internal circuits for hidden service clients */
@@ -1189,7 +1240,7 @@ circuit_predict_and_launch_new(void)
return;
}
- if (needs_hs_server_circuits(num_uptime_internal)) {
+ if (needs_hs_server_circuits(now, num_uptime_internal)) {
flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME |
CIRCLAUNCH_IS_INTERNAL);
@@ -1253,11 +1304,6 @@ circuit_build_needed_circs(time_t now)
if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN)
connection_ap_rescan_and_attach_pending();
- /* make sure any hidden services have enough intro points
- * HS intro point streams only require an internal circuit */
- if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN)
- rend_consider_services_intro_points();
-
circuit_expire_old_circs_as_needed(now);
if (!options->DisablePredictedCircuits)
@@ -1339,8 +1385,7 @@ circuit_detach_stream(circuit_t *circ, edge_connection_t *conn)
* number of streams on the circuit associated with the rend service.
*/
if (circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED) {
- tor_assert(origin_circ->rend_data);
- origin_circ->rend_data->nr_streams--;
+ hs_dec_rdv_stream_counter(origin_circ);
}
return;
}
@@ -1593,7 +1638,7 @@ circuit_has_opened(origin_circuit_t *circ)
switch (TO_CIRCUIT(circ)->purpose) {
case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
- rend_client_rendcirc_has_opened(circ);
+ hs_client_circuit_has_opened(circ);
/* Start building an intro circ if we don't have one yet. */
connection_ap_attach_pending(1);
/* This isn't a call to circuit_try_attaching_streams because a
@@ -1605,7 +1650,7 @@ circuit_has_opened(origin_circuit_t *circ)
* state. */
break;
case CIRCUIT_PURPOSE_C_INTRODUCING:
- rend_client_introcirc_has_opened(circ);
+ hs_client_circuit_has_opened(circ);
break;
case CIRCUIT_PURPOSE_C_GENERAL:
/* Tell any AP connections that have been waiting for a new
@@ -1614,11 +1659,11 @@ circuit_has_opened(origin_circuit_t *circ)
break;
case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
/* at the service, waiting for introductions */
- rend_service_intro_has_opened(circ);
+ hs_service_circuit_has_opened(circ);
break;
case CIRCUIT_PURPOSE_S_CONNECT_REND:
/* at the service, connecting to rend point */
- rend_service_rendezvous_has_opened(circ);
+ hs_service_circuit_has_opened(circ);
break;
case CIRCUIT_PURPOSE_TESTING:
circuit_testing_opened(circ);
@@ -1768,7 +1813,7 @@ circuit_build_failed(origin_circuit_t *circ)
"(%s hop failed).",
escaped(build_state_get_exit_nickname(circ->build_state)),
failed_at_last_hop?"last":"non-last");
- rend_service_relaunch_rendezvous(circ);
+ hs_circ_retry_service_rendezvous_point(circ);
break;
/* default:
* This won't happen in normal operation, but might happen if the
@@ -2131,22 +2176,25 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn,
/* If this is a hidden service trying to start an introduction point,
* handle that case. */
if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) {
+ const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
/* need to pick an intro point */
- rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data;
- tor_assert(rend_data);
- extend_info = rend_client_get_random_intro(rend_data);
+ extend_info = hs_client_get_random_intro_from_edge(edge_conn);
if (!extend_info) {
- log_info(LD_REND,
- "No intro points for '%s': re-fetching service descriptor.",
- safe_str_client(rend_data_get_address(rend_data)));
- rend_client_refetch_v2_renddesc(rend_data);
+ log_info(LD_REND, "No intro points: re-fetching service descriptor.");
+ if (edge_conn->rend_data) {
+ rend_client_refetch_v2_renddesc(edge_conn->rend_data);
+ } else {
+ hs_client_refetch_hsdesc(&edge_conn->hs_ident->identity_pk);
+ }
connection_ap_mark_as_non_pending_circuit(conn);
ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_RENDDESC_WAIT;
return 0;
}
log_info(LD_REND,"Chose %s as intro point for '%s'.",
extend_info_describe(extend_info),
- safe_str_client(rend_data_get_address(rend_data)));
+ (edge_conn->rend_data) ?
+ safe_str_client(rend_data_get_address(edge_conn->rend_data)) :
+ "service");
}
/* If we have specified a particular exit node for our
@@ -2265,8 +2313,15 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn,
/* help predict this next time */
rep_hist_note_used_internal(time(NULL), need_uptime, 1);
if (circ) {
- /* write the service_id into circ */
- circ->rend_data = rend_data_dup(ENTRY_TO_EDGE_CONN(conn)->rend_data);
+ const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
+ if (edge_conn->rend_data) {
+ /* write the service_id into circ */
+ circ->rend_data = rend_data_dup(edge_conn->rend_data);
+ } else if (edge_conn->hs_ident) {
+ circ->hs_ident =
+ hs_ident_circuit_new(&edge_conn->hs_ident->identity_pk,
+ HS_IDENT_CIRCUIT_INTRO);
+ }
if (circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND &&
circ->base_.state == CIRCUIT_STATE_OPEN)
circuit_has_opened(circ);
@@ -2348,8 +2403,7 @@ link_apconn_to_circ(entry_connection_t *apconn, origin_circuit_t *circ,
/* We are attaching a stream to a rendezvous circuit. That means
* that an attempt to connect to a hidden service just
* succeeded. Tell rendclient.c. */
- rend_client_note_connection_attempt_ended(
- ENTRY_TO_EDGE_CONN(apconn)->rend_data);
+ hs_client_note_connection_attempt_succeeded(ENTRY_TO_EDGE_CONN(apconn));
}
if (cpath) { /* we were given one; use it */
@@ -2695,12 +2749,14 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn)
tor_assert(introcirc->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
if (introcirc->base_.state == CIRCUIT_STATE_OPEN) {
+ int ret;
log_info(LD_REND,"found open intro circ %u (rend %u); sending "
"introduction. (stream %d sec old)",
(unsigned)introcirc->base_.n_circ_id,
(unsigned)rendcirc->base_.n_circ_id,
conn_age);
- switch (rend_client_send_introduction(introcirc, rendcirc)) {
+ ret = hs_client_send_introduce1(introcirc, rendcirc);
+ switch (ret) {
case 0: /* success */
rendcirc->base_.timestamp_dirty = time(NULL);
introcirc->base_.timestamp_dirty = time(NULL);
diff --git a/src/or/circuituse.h b/src/or/circuituse.h
index ad4c214a3b..e66679586d 100644
--- a/src/or/circuituse.h
+++ b/src/or/circuituse.h
@@ -68,7 +68,8 @@ STATIC int circuit_is_available_for_use(const circuit_t *circ);
STATIC int needs_exit_circuits(time_t now,
int *port_needs_uptime,
int *port_needs_capacity);
-STATIC int needs_hs_server_circuits(int num_uptime_internal);
+STATIC int needs_hs_server_circuits(time_t now,
+ int num_uptime_internal);
STATIC int needs_hs_client_circuits(time_t now,
int *needs_uptime,
diff --git a/src/or/command.c b/src/or/command.c
index c667cbbe52..2c82984901 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -381,7 +381,8 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
created_cell.handshake_len = len;
if (onionskin_answer(circ, &created_cell,
- (const char *)keys, rend_circ_nonce)<0) {
+ (const char *)keys, sizeof(keys),
+ rend_circ_nonce)<0) {
log_warn(LD_OR,"Failed to reply to CREATE_FAST cell. Closing.");
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
return;
diff --git a/src/or/config.c b/src/or/config.c
index 67bf3b9671..30853724e4 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -91,6 +91,7 @@
#include "relay.h"
#include "rendclient.h"
#include "rendservice.h"
+#include "hs_config.h"
#include "rephist.h"
#include "router.h"
#include "sandbox.h"
@@ -176,7 +177,7 @@ static config_abbrev_t option_abbrevs_[] = {
* or_options_t.<b>member</b>"
*/
#define VAR(name,conftype,member,initvalue) \
- { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_options_t, member), \
+ { name, CONFIG_TYPE_ ## conftype, offsetof(or_options_t, member), \
initvalue }
/** As VAR, but the option name and member name are the same. */
#define V(member,conftype,initvalue) \
@@ -408,6 +409,7 @@ static config_var_t option_vars_[] = {
OBSOLETE("PredictedPortsRelevanceTime"),
OBSOLETE("WarnUnsafeSocks"),
VAR("NodeFamily", LINELIST, NodeFamilies, NULL),
+ V(NoExec, BOOL, "0"),
V(NumCPUs, UINT, "0"),
V(NumDirectoryGuards, UINT, "0"),
V(NumEntryGuards, UINT, "0"),
@@ -674,6 +676,13 @@ static const config_deprecation_t option_deprecation_notes_[] = {
"easier to fingerprint, and may open you to esoteric attacks." },
/* End of options deprecated since 0.2.9.2-alpha. */
+ /* Deprecated since 0.3.2.0-alpha. */
+ { "HTTPProxy", "It only applies to direct unencrypted HTTP connections "
+ "to your directory server, which your Tor probably wasn't using." },
+ { "HTTPProxyAuthenticator", "HTTPProxy is deprecated in favor of HTTPSProxy "
+ "which should be used with HTTPSProxyAuthenticator." },
+ /* End of options deprecated since 0.3.2.0-alpha. */
+
{ NULL, NULL }
};
@@ -725,7 +734,7 @@ static uint64_t compute_real_max_mem_in_queues(const uint64_t val,
STATIC config_format_t options_format = {
sizeof(or_options_t),
OR_OPTIONS_MAGIC,
- STRUCT_OFFSET(or_options_t, magic_),
+ offsetof(or_options_t, magic_),
option_abbrevs_,
option_deprecation_notes_,
option_vars_,
@@ -1587,6 +1596,10 @@ options_act(const or_options_t *old_options)
const int transition_affects_guards =
old_options && options_transition_affects_guards(old_options, options);
+ if (options->NoExec || options->Sandbox) {
+ tor_disable_spawning_background_processes();
+ }
+
/* disable ptrace and later, other basic debugging techniques */
{
/* Remember if we already disabled debugger attachment */
@@ -1675,7 +1688,7 @@ options_act(const or_options_t *old_options)
sweep_bridge_list();
}
- if (running_tor && rend_config_services(options, 0)<0) {
+ if (running_tor && hs_config_service_all(options, 0)<0) {
log_warn(LD_BUG,
"Previously validated hidden services line could not be added!");
return -1;
@@ -1792,7 +1805,7 @@ options_act(const or_options_t *old_options)
monitor_owning_controller_process(options->OwningControllerProcess);
/* reload keys as needed for rendezvous services. */
- if (rend_service_load_all_keys(NULL)<0) {
+ if (hs_service_load_all_keys() < 0) {
log_warn(LD_GENERAL,"Error loading rendezvous service keys");
return -1;
}
@@ -2129,6 +2142,7 @@ static const struct {
{ "--dump-config", ARGUMENT_OPTIONAL },
{ "--list-fingerprint", TAKES_NO_ARGUMENT },
{ "--keygen", TAKES_NO_ARGUMENT },
+ { "--key-expiration", ARGUMENT_OPTIONAL },
{ "--newpass", TAKES_NO_ARGUMENT },
{ "--no-passphrase", TAKES_NO_ARGUMENT },
{ "--passphrase-fd", ARGUMENT_NECESSARY },
@@ -2798,10 +2812,6 @@ compute_publishserverdescriptor(or_options_t *options)
* will generate too many circuits and potentially overload the network. */
#define MIN_CIRCUIT_STREAM_TIMEOUT 10
-/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might
- * expose more information than we're comfortable with. */
-#define MIN_HEARTBEAT_PERIOD (30*60)
-
/** Lowest recommended value for CircuitBuildTimeout; if it is set too low
* and LearnCircuitBuildTimeout is off, the failure rate for circuit
* construction may be very high. In that case, if it is set below this
@@ -3155,7 +3165,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
"UseEntryGuards. Disabling.");
options->UseEntryGuards = 0;
}
- if (!options->DownloadExtraInfo && authdir_mode_any_main(options)) {
+ if (!options->DownloadExtraInfo && authdir_mode_v3(options)) {
log_info(LD_CONFIG, "Authoritative directories always try to download "
"extra-info documents. Setting DownloadExtraInfo.");
options->DownloadExtraInfo = 1;
@@ -3565,6 +3575,10 @@ options_validate(or_options_t *old_options, or_options_t *options,
REJECT("PortForwarding is not compatible with Sandbox; at most one can "
"be set");
}
+ if (options->PortForwarding && options->NoExec) {
+ COMPLAIN("Both PortForwarding and NoExec are set; PortForwarding will "
+ "be ignored.");
+ }
if (ensure_bandwidth_cap(&options->BandwidthRate,
"BandwidthRate", msg) < 0)
@@ -4003,7 +4017,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
COMPLAIN("V3AuthVotingInterval does not divide evenly into 24 hours.");
}
- if (rend_config_services(options, 1) < 0)
+ if (hs_config_service_all(options, 1) < 0)
REJECT("Failed to configure rendezvous options. See logs for details.");
/* Parse client-side authorization for hidden services. */
@@ -4442,6 +4456,12 @@ options_transition_allowed(const or_options_t *old,
return -1;
}
+ if (old->NoExec && !new_val->NoExec) {
+ *msg = tor_strdup("While Tor is running, disabling "
+ "NoExec is not allowed.");
+ return -1;
+ }
+
if (sandbox_is_active()) {
#define SB_NOCHANGE_STR(opt) \
do { \
@@ -4928,6 +4948,9 @@ options_init_from_torrc(int argc, char **argv)
for (p_index = cmdline_only_options; p_index; p_index = p_index->next) {
if (!strcmp(p_index->key,"--keygen")) {
command = CMD_KEYGEN;
+ } else if (!strcmp(p_index->key, "--key-expiration")) {
+ command = CMD_KEY_EXPIRATION;
+ command_arg = p_index->value;
} else if (!strcmp(p_index->key,"--list-fingerprint")) {
command = CMD_LIST_FINGERPRINT;
} else if (!strcmp(p_index->key, "--hash-password")) {
@@ -5718,6 +5741,15 @@ parse_transport_line(const or_options_t *options,
goto err;
}
+ if (is_managed && options->NoExec) {
+ log_warn(LD_CONFIG,
+ "Managed proxies are not compatible with NoExec mode; ignoring."
+ "(%sTransportPlugin line was %s)",
+ server ? "Server" : "Client", escaped(line));
+ r = 0;
+ goto done;
+ }
+
if (is_managed) {
/* managed */
@@ -6252,8 +6284,9 @@ port_cfg_free(port_cfg_t *port)
/** Warn for every port in <b>ports</b> of type <b>listener_type</b> that is
* on a publicly routable address. */
static void
-warn_nonlocal_client_ports(const smartlist_t *ports, const char *portname,
- int listener_type)
+warn_nonlocal_client_ports(const smartlist_t *ports,
+ const char *portname,
+ const int listener_type)
{
SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) {
if (port->type != listener_type)
@@ -6938,7 +6971,8 @@ parse_ports(or_options_t *options, int validate_only,
options->SocksPort_lines,
"Socks", CONN_TYPE_AP_LISTENER,
"127.0.0.1", 9050,
- CL_PORT_WARN_NONLOCAL|CL_PORT_TAKES_HOSTNAMES|gw_flag) < 0) {
+ ((validate_only ? 0 : CL_PORT_WARN_NONLOCAL)
+ | CL_PORT_TAKES_HOSTNAMES | gw_flag)) < 0) {
*msg = tor_strdup("Invalid SocksPort configuration");
goto err;
}
diff --git a/src/or/config.h b/src/or/config.h
index 27aec7fe3d..3cfa7c4e5b 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -18,6 +18,10 @@
#define KERNEL_MAY_SUPPORT_IPFW
#endif
+/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might
+ * expose more information than we're comfortable with. */
+#define MIN_HEARTBEAT_PERIOD (30*60)
+
MOCK_DECL(const char*, get_dirportfrontpage, (void));
MOCK_DECL(const or_options_t *, get_options, (void));
MOCK_DECL(or_options_t *, get_options_mutable, (void));
diff --git a/src/or/connection.c b/src/or/connection.c
index 4e890497e9..31a682387d 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -84,6 +84,7 @@
#include "geoip.h"
#include "main.h"
#include "hs_common.h"
+#include "hs_ident.h"
#include "nodelist.h"
#include "policies.h"
#include "reasons.h"
@@ -605,6 +606,7 @@ connection_free_(connection_t *conn)
}
if (CONN_IS_EDGE(conn)) {
rend_data_free(TO_EDGE_CONN(conn)->rend_data);
+ hs_ident_edge_conn_free(TO_EDGE_CONN(conn)->hs_ident);
}
if (conn->type == CONN_TYPE_CONTROL) {
control_connection_t *control_conn = TO_CONTROL_CONN(conn);
@@ -636,6 +638,7 @@ connection_free_(connection_t *conn)
}
rend_data_free(dir_conn->rend_data);
+ hs_ident_dir_conn_free(dir_conn->hs_ident);
if (dir_conn->guard_state) {
/* Cancel before freeing, if it's still there. */
entry_guard_cancel(&dir_conn->guard_state);
@@ -4099,6 +4102,27 @@ connection_write_to_buf_impl_,(const char *string, size_t len,
}
}
+#define CONN_GET_ALL_TEMPLATE(var, test) \
+ STMT_BEGIN \
+ smartlist_t *conns = get_connection_array(); \
+ smartlist_t *ret_conns = smartlist_new(); \
+ SMARTLIST_FOREACH_BEGIN(conns, connection_t *, var) { \
+ if (var && (test) && !var->marked_for_close) \
+ smartlist_add(ret_conns, var); \
+ } SMARTLIST_FOREACH_END(var); \
+ return ret_conns; \
+ STMT_END
+
+/* Return a list of connections that aren't close and matches the given state.
+ * The returned list can be empty and must be freed using smartlist_free().
+ * The caller does NOT have owernship of the objects in the list so it must
+ * not free them nor reference them as they can disapear. */
+smartlist_t *
+connection_list_by_type_state(int type, int state)
+{
+ CONN_GET_ALL_TEMPLATE(conn, (conn->type == type && conn->state == state));
+}
+
/** Return a connection_t * from get_connection_array() that satisfies test on
* var, and that is not marked for close. */
#define CONN_GET_TEMPLATE(var, test) \
diff --git a/src/or/connection.h b/src/or/connection.h
index 36e45aef38..0bcf0ccdce 100644
--- a/src/or/connection.h
+++ b/src/or/connection.h
@@ -182,6 +182,7 @@ MOCK_DECL(connection_t *,connection_get_by_type_addr_port_purpose,(int type,
connection_t *connection_get_by_type_state(int type, int state);
connection_t *connection_get_by_type_state_rendquery(int type, int state,
const char *rendquery);
+smartlist_t *connection_list_by_type_state(int type, int state);
smartlist_t *connection_dir_list_by_purpose_and_resource(
int purpose,
const char *resource);
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 8480a35458..a98b32450b 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -76,6 +76,9 @@
#include "dirserv.h"
#include "hibernate.h"
#include "hs_common.h"
+#include "hs_cache.h"
+#include "hs_client.h"
+#include "hs_circuit.h"
#include "main.h"
#include "nodelist.h"
#include "policies.h"
@@ -152,7 +155,9 @@ connection_mark_unattached_ap_,(entry_connection_t *conn, int endreason,
* but we should fix it someday anyway. */
if ((edge_conn->on_circuit != NULL || edge_conn->edge_has_sent_end) &&
connection_edge_is_rendezvous_stream(edge_conn)) {
- rend_client_note_connection_attempt_ended(edge_conn->rend_data);
+ if (edge_conn->rend_data) {
+ rend_client_note_connection_attempt_ended(edge_conn->rend_data);
+ }
}
if (base_conn->marked_for_close) {
@@ -1391,6 +1396,180 @@ connection_ap_handshake_rewrite(entry_connection_t *conn,
}
}
+/** We just received a SOCKS request in <b>conn</b> to an onion address of type
+ * <b>addresstype</b>. Start connecting to the onion service. */
+static int
+connection_ap_handle_onion(entry_connection_t *conn,
+ socks_request_t *socks,
+ origin_circuit_t *circ,
+ hostname_type_t addresstype)
+{
+ time_t now = approx_time();
+ connection_t *base_conn = ENTRY_TO_CONN(conn);
+
+ /* If .onion address requests are disabled, refuse the request */
+ if (!conn->entry_cfg.onion_traffic) {
+ log_warn(LD_APP, "Onion address %s requested from a port with .onion "
+ "disabled", safe_str_client(socks->address));
+ connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY);
+ return -1;
+ }
+
+ /* Check whether it's RESOLVE or RESOLVE_PTR. We don't handle those
+ * for hidden service addresses. */
+ if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) {
+ /* if it's a resolve request, fail it right now, rather than
+ * building all the circuits and then realizing it won't work. */
+ log_warn(LD_APP,
+ "Resolve requests to hidden services not allowed. Failing.");
+ connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_ERROR,
+ 0,NULL,-1,TIME_MAX);
+ connection_mark_unattached_ap(conn,
+ END_STREAM_REASON_SOCKSPROTOCOL |
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ return -1;
+ }
+
+ /* If we were passed a circuit, then we need to fail. .onion addresses
+ * only work when we launch our own circuits for now. */
+ if (circ) {
+ log_warn(LD_CONTROL, "Attachstream to a circuit is not "
+ "supported for .onion addresses currently. Failing.");
+ connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
+ return -1;
+ }
+
+ /* Interface: Regardless of HS version after the block below we should have
+ set onion_address, rend_cache_lookup_result, and descriptor_is_usable. */
+ const char *onion_address = NULL;
+ int rend_cache_lookup_result = -ENOENT;
+ int descriptor_is_usable = 0;
+
+ if (addresstype == ONION_V2_HOSTNAME) { /* it's a v2 hidden service */
+ rend_cache_entry_t *entry = NULL;
+ /* Look up if we have client authorization configured for this hidden
+ * service. If we do, associate it with the rend_data. */
+ rend_service_authorization_t *client_auth =
+ rend_client_lookup_service_authorization(socks->address);
+
+ const uint8_t *cookie = NULL;
+ rend_auth_type_t auth_type = REND_NO_AUTH;
+ if (client_auth) {
+ log_info(LD_REND, "Using previously configured client authorization "
+ "for hidden service request.");
+ auth_type = client_auth->auth_type;
+ cookie = client_auth->descriptor_cookie;
+ }
+
+ /* Fill in the rend_data field so we can start doing a connection to
+ * a hidden service. */
+ rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data =
+ rend_data_client_create(socks->address, NULL, (char *) cookie,
+ auth_type);
+ if (rend_data == NULL) {
+ return -1;
+ }
+ onion_address = rend_data_get_address(rend_data);
+ log_info(LD_REND,"Got a hidden service request for ID '%s'",
+ safe_str_client(onion_address));
+
+ rend_cache_lookup_result = rend_cache_lookup_entry(onion_address,-1,
+ &entry);
+ if (!rend_cache_lookup_result && entry) {
+ descriptor_is_usable = rend_client_any_intro_points_usable(entry);
+ }
+ } else { /* it's a v3 hidden service */
+ tor_assert(addresstype == ONION_V3_HOSTNAME);
+ const hs_descriptor_t *cached_desc = NULL;
+ int retval;
+ /* Create HS conn identifier with HS pubkey */
+ hs_ident_edge_conn_t *hs_conn_ident =
+ tor_malloc_zero(sizeof(hs_ident_edge_conn_t));
+
+ retval = hs_parse_address(socks->address, &hs_conn_ident->identity_pk,
+ NULL, NULL);
+ if (retval < 0) {
+ log_warn(LD_GENERAL, "failed to parse hs address");
+ tor_free(hs_conn_ident);
+ return -1;
+ }
+ ENTRY_TO_EDGE_CONN(conn)->hs_ident = hs_conn_ident;
+
+ onion_address = socks->address;
+
+ /* Check the v3 desc cache */
+ cached_desc = hs_cache_lookup_as_client(&hs_conn_ident->identity_pk);
+ if (cached_desc) {
+ rend_cache_lookup_result = 0;
+ descriptor_is_usable =
+ hs_client_any_intro_points_usable(&hs_conn_ident->identity_pk,
+ cached_desc);
+ log_info(LD_GENERAL, "Found %s descriptor in cache for %s. %s.",
+ (descriptor_is_usable) ? "usable" : "unusable",
+ safe_str_client(onion_address),
+ (descriptor_is_usable) ? "Not fetching." : "Refecting.");
+ } else {
+ rend_cache_lookup_result = -ENOENT;
+ }
+ }
+
+ /* Lookup the given onion address. If invalid, stop right now.
+ * Otherwise, we might have it in the cache or not. */
+ unsigned int refetch_desc = 0;
+ if (rend_cache_lookup_result < 0) {
+ switch (-rend_cache_lookup_result) {
+ case EINVAL:
+ /* We should already have rejected this address! */
+ log_warn(LD_BUG,"Invalid service name '%s'",
+ safe_str_client(onion_address));
+ connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
+ return -1;
+ case ENOENT:
+ /* We didn't have this; we should look it up. */
+ log_info(LD_REND, "No descriptor found in our cache for %s. Fetching.",
+ safe_str_client(onion_address));
+ refetch_desc = 1;
+ break;
+ default:
+ log_warn(LD_BUG, "Unknown cache lookup error %d",
+ rend_cache_lookup_result);
+ return -1;
+ }
+ }
+
+ /* Help predict that we'll want to do hidden service circuits in the
+ * future. We're not sure if it will need a stable circuit yet, but
+ * we know we'll need *something*. */
+ rep_hist_note_used_internal(now, 0, 1);
+
+ /* Now we have a descriptor but is it usable or not? If not, refetch.
+ * Also, a fetch could have been requested if the onion address was not
+ * found in the cache previously. */
+ if (refetch_desc || !descriptor_is_usable) {
+ edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
+ connection_ap_mark_as_non_pending_circuit(conn);
+ base_conn->state = AP_CONN_STATE_RENDDESC_WAIT;
+ if (addresstype == ONION_V2_HOSTNAME) {
+ tor_assert(edge_conn->rend_data);
+ rend_client_refetch_v2_renddesc(edge_conn->rend_data);
+ } else {
+ tor_assert(addresstype == ONION_V3_HOSTNAME);
+ tor_assert(edge_conn->hs_ident);
+ hs_client_refetch_hsdesc(&edge_conn->hs_ident->identity_pk);
+ }
+ return 0;
+ }
+
+ /* We have the descriptor! So launch a connection to the HS. */
+ base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
+ log_info(LD_REND, "Descriptor is here. Great.");
+
+ /* We'll try to attach it at the next event loop, or whenever
+ * we call connection_ap_attach_pending() */
+ connection_ap_mark_as_pending_circuit(conn);
+ return 0;
+}
+
/** Connection <b>conn</b> just finished its socks handshake, or the
* controller asked us to take care of it. If <b>circ</b> is defined,
* then that's where we'll want to attach it. Otherwise we have to
@@ -1557,7 +1736,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
}
/* Now, we handle everything that isn't a .onion address. */
- if (addresstype != ONION_HOSTNAME) {
+ if (addresstype != ONION_V2_HOSTNAME && addresstype != ONION_V3_HOSTNAME) {
/* Not a hidden-service request. It's either a hostname or an IP,
* possibly with a .exit that we stripped off. We're going to check
* if we're allowed to connect/resolve there, and then launch the
@@ -1835,116 +2014,10 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return 0;
} else {
/* If we get here, it's a request for a .onion address! */
+ tor_assert(addresstype == ONION_V2_HOSTNAME ||
+ addresstype == ONION_V3_HOSTNAME);
tor_assert(!automap);
-
- /* If .onion address requests are disabled, refuse the request */
- if (!conn->entry_cfg.onion_traffic) {
- log_warn(LD_APP, "Onion address %s requested from a port with .onion "
- "disabled", safe_str_client(socks->address));
- connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY);
- return -1;
- }
-
- /* Check whether it's RESOLVE or RESOLVE_PTR. We don't handle those
- * for hidden service addresses. */
- if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) {
- /* if it's a resolve request, fail it right now, rather than
- * building all the circuits and then realizing it won't work. */
- log_warn(LD_APP,
- "Resolve requests to hidden services not allowed. Failing.");
- connection_ap_handshake_socks_resolved(conn,RESOLVED_TYPE_ERROR,
- 0,NULL,-1,TIME_MAX);
- connection_mark_unattached_ap(conn,
- END_STREAM_REASON_SOCKSPROTOCOL |
- END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
- return -1;
- }
-
- /* If we were passed a circuit, then we need to fail. .onion addresses
- * only work when we launch our own circuits for now. */
- if (circ) {
- log_warn(LD_CONTROL, "Attachstream to a circuit is not "
- "supported for .onion addresses currently. Failing.");
- connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
- return -1;
- }
-
- /* Look up if we have client authorization configured for this hidden
- * service. If we do, associate it with the rend_data. */
- rend_service_authorization_t *client_auth =
- rend_client_lookup_service_authorization(socks->address);
-
- const uint8_t *cookie = NULL;
- rend_auth_type_t auth_type = REND_NO_AUTH;
- if (client_auth) {
- log_info(LD_REND, "Using previously configured client authorization "
- "for hidden service request.");
- auth_type = client_auth->auth_type;
- cookie = client_auth->descriptor_cookie;
- }
-
- /* Fill in the rend_data field so we can start doing a connection to
- * a hidden service. */
- rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data =
- rend_data_client_create(socks->address, NULL, (char *) cookie,
- auth_type);
- if (rend_data == NULL) {
- return -1;
- }
- const char *onion_address = rend_data_get_address(rend_data);
- log_info(LD_REND,"Got a hidden service request for ID '%s'",
- safe_str_client(onion_address));
-
- /* Lookup the given onion address. If invalid, stop right now.
- * Otherwise, we might have it in the cache or not. */
- unsigned int refetch_desc = 0;
- rend_cache_entry_t *entry = NULL;
- const int rend_cache_lookup_result =
- rend_cache_lookup_entry(onion_address, -1, &entry);
- if (rend_cache_lookup_result < 0) {
- switch (-rend_cache_lookup_result) {
- case EINVAL:
- /* We should already have rejected this address! */
- log_warn(LD_BUG,"Invalid service name '%s'",
- safe_str_client(onion_address));
- connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
- return -1;
- case ENOENT:
- /* We didn't have this; we should look it up. */
- refetch_desc = 1;
- break;
- default:
- log_warn(LD_BUG, "Unknown cache lookup error %d",
- rend_cache_lookup_result);
- return -1;
- }
- }
-
- /* Help predict that we'll want to do hidden service circuits in the
- * future. We're not sure if it will need a stable circuit yet, but
- * we know we'll need *something*. */
- rep_hist_note_used_internal(now, 0, 1);
-
- /* Now we have a descriptor but is it usable or not? If not, refetch.
- * Also, a fetch could have been requested if the onion address was not
- * found in the cache previously. */
- if (refetch_desc || !rend_client_any_intro_points_usable(entry)) {
- connection_ap_mark_as_non_pending_circuit(conn);
- base_conn->state = AP_CONN_STATE_RENDDESC_WAIT;
- log_info(LD_REND, "Unknown descriptor %s. Fetching.",
- safe_str_client(onion_address));
- rend_client_refetch_v2_renddesc(rend_data);
- return 0;
- }
-
- /* We have the descriptor! So launch a connection to the HS. */
- base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
- log_info(LD_REND, "Descriptor is here. Great.");
-
- /* We'll try to attach it at the next event loop, or whenever
- * we call connection_ap_attach_pending() */
- connection_ap_mark_as_pending_circuit(conn);
- return 0;
+ return connection_ap_handle_onion(conn, socks, circ, addresstype);
}
return 0; /* unreached but keeps the compiler happy */
@@ -2455,8 +2528,8 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn)
*
* If ap_conn is broken, mark it for close and return -1. Else return 0.
*/
-int
-connection_ap_handshake_send_begin(entry_connection_t *ap_conn)
+MOCK_IMPL(int,
+connection_ap_handshake_send_begin,(entry_connection_t *ap_conn))
{
char payload[CELL_PAYLOAD_SIZE];
int payload_len;
@@ -3007,7 +3080,7 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply,
* <0 and set *<b>end_reason_out</b> to the end reason we should send back to
* the client.
*
- * Return -1 in the case where want to send a RELAY_END cell, and < -1 when
+ * Return -1 in the case where we want to send a RELAY_END cell, and < -1 when
* we don't.
**/
STATIC int
@@ -3066,6 +3139,88 @@ begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
return 0;
}
+/** For the given <b>circ</b> and the edge connection <b>conn</b>, setup the
+ * connection, attach it to the circ and connect it. Return 0 on success
+ * or END_CIRC_AT_ORIGIN if we can't find the requested hidden service port
+ * where the caller should close the circuit. */
+static int
+handle_hs_exit_conn(circuit_t *circ, edge_connection_t *conn)
+{
+ int ret;
+ origin_circuit_t *origin_circ;
+
+ assert_circuit_ok(circ);
+ tor_assert(circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED);
+ tor_assert(conn);
+
+ log_debug(LD_REND, "Connecting the hidden service rendezvous circuit "
+ "to the service destination.");
+
+ origin_circ = TO_ORIGIN_CIRCUIT(circ);
+ conn->base_.address = tor_strdup("(rendezvous)");
+ conn->base_.state = EXIT_CONN_STATE_CONNECTING;
+
+ /* The circuit either has an hs identifier for v3+ or a rend_data for legacy
+ * service. */
+ if (origin_circ->rend_data) {
+ conn->rend_data = rend_data_dup(origin_circ->rend_data);
+ tor_assert(connection_edge_is_rendezvous_stream(conn));
+ ret = rend_service_set_connection_addr_port(conn, origin_circ);
+ } else if (origin_circ->hs_ident) {
+ /* Setup the identifier to be the one for the circuit service. */
+ conn->hs_ident =
+ hs_ident_edge_conn_new(&origin_circ->hs_ident->identity_pk);
+ tor_assert(connection_edge_is_rendezvous_stream(conn));
+ ret = hs_service_set_conn_addr_port(origin_circ, conn);
+ } else {
+ /* We should never get here if the circuit's purpose is rendezvous. */
+ tor_assert_nonfatal_unreached();
+ return -1;
+ }
+ if (ret < 0) {
+ log_info(LD_REND, "Didn't find rendezvous service (addr%s, port %d)",
+ fmt_addr(&TO_CONN(conn)->addr), TO_CONN(conn)->port);
+ /* Send back reason DONE because we want to make hidden service port
+ * scanning harder thus instead of returning that the exit policy
+ * didn't match, which makes it obvious that the port is closed,
+ * return DONE and kill the circuit. That way, a user (malicious or
+ * not) needs one circuit per bad port unless it matches the policy of
+ * the hidden service. */
+ relay_send_end_cell_from_edge(conn->stream_id, circ,
+ END_STREAM_REASON_DONE,
+ origin_circ->cpath->prev);
+ connection_free(TO_CONN(conn));
+
+ /* Drop the circuit here since it might be someone deliberately
+ * scanning the hidden service ports. Note that this mitigates port
+ * scanning by adding more work on the attacker side to successfully
+ * scan but does not fully solve it. */
+ if (ret < -1) {
+ return END_CIRC_AT_ORIGIN;
+ } else {
+ return 0;
+ }
+ }
+
+ /* Link the circuit and the connection crypt path. */
+ conn->cpath_layer = origin_circ->cpath->prev;
+
+ /* Add it into the linked list of p_streams on this circuit */
+ conn->next_stream = origin_circ->p_streams;
+ origin_circ->p_streams = conn;
+ conn->on_circuit = circ;
+ assert_circuit_ok(circ);
+
+ hs_inc_rdv_stream_counter(origin_circ);
+
+ /* Connect tor to the hidden service destination. */
+ connection_exit_connect(conn);
+
+ /* For path bias: This circuit was used successfully */
+ pathbias_mark_use_success(origin_circ);
+ return 0;
+}
+
/** A relay 'begin' or 'begin_dir' cell has arrived, and either we are
* an exit hop for the circuit, or we are the origin and it is a
* rendezvous begin.
@@ -3217,58 +3372,10 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
n_stream->deliver_window = STREAMWINDOW_START;
if (circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED) {
- tor_assert(origin_circ);
- log_info(LD_REND,"begin is for rendezvous. configuring stream.");
- n_stream->base_.address = tor_strdup("(rendezvous)");
- n_stream->base_.state = EXIT_CONN_STATE_CONNECTING;
- n_stream->rend_data = rend_data_dup(origin_circ->rend_data);
- tor_assert(connection_edge_is_rendezvous_stream(n_stream));
- assert_circuit_ok(circ);
-
- const int r = rend_service_set_connection_addr_port(n_stream, origin_circ);
- if (r < 0) {
- log_info(LD_REND,"Didn't find rendezvous service (port %d)",
- n_stream->base_.port);
- /* Send back reason DONE because we want to make hidden service port
- * scanning harder thus instead of returning that the exit policy
- * didn't match, which makes it obvious that the port is closed,
- * return DONE and kill the circuit. That way, a user (malicious or
- * not) needs one circuit per bad port unless it matches the policy of
- * the hidden service. */
- relay_send_end_cell_from_edge(rh.stream_id, circ,
- END_STREAM_REASON_DONE,
- layer_hint);
- connection_free(TO_CONN(n_stream));
- tor_free(address);
-
- /* Drop the circuit here since it might be someone deliberately
- * scanning the hidden service ports. Note that this mitigates port
- * scanning by adding more work on the attacker side to successfully
- * scan but does not fully solve it. */
- if (r < -1)
- return END_CIRC_AT_ORIGIN;
- else
- return 0;
- }
- assert_circuit_ok(circ);
- log_debug(LD_REND,"Finished assigning addr/port");
- n_stream->cpath_layer = origin_circ->cpath->prev; /* link it */
-
- /* add it into the linked list of p_streams on this circuit */
- n_stream->next_stream = origin_circ->p_streams;
- n_stream->on_circuit = circ;
- origin_circ->p_streams = n_stream;
- assert_circuit_ok(circ);
-
- origin_circ->rend_data->nr_streams++;
-
- connection_exit_connect(n_stream);
-
- /* For path bias: This circuit was used successfully */
- pathbias_mark_use_success(origin_circ);
-
tor_free(address);
- return 0;
+ /* We handle this circuit and stream in this function for all supported
+ * hidden service version. */
+ return handle_hs_exit_conn(circ, n_stream);
}
tor_strlower(address);
n_stream->base_.address = address;
@@ -3566,8 +3673,12 @@ int
connection_edge_is_rendezvous_stream(const edge_connection_t *conn)
{
tor_assert(conn);
- if (conn->rend_data)
+ /* It should not be possible to set both of these structs */
+ tor_assert_nonfatal(!(conn->rend_data && conn->hs_ident));
+
+ if (conn->rend_data || conn->hs_ident) {
return 1;
+ }
return 0;
}
@@ -3640,10 +3751,12 @@ connection_ap_can_use_exit(const entry_connection_t *conn,
}
/** If address is of the form "y.onion" with a well-formed handle y:
- * Put a NUL after y, lower-case it, and return ONION_HOSTNAME.
+ * Put a NUL after y, lower-case it, and return ONION_V2_HOSTNAME or
+ * ONION_V3_HOSTNAME depending on the HS version.
*
* If address is of the form "x.y.onion" with a well-formed handle x:
- * Drop "x.", put a NUL after y, lower-case it, and return ONION_HOSTNAME.
+ * Drop "x.", put a NUL after y, lower-case it, and return
+ * ONION_V2_HOSTNAME or ONION_V3_HOSTNAME depending on the HS version.
*
* If address is of the form "y.onion" with a badly-formed handle y:
* Return BAD_HOSTNAME and log a message.
@@ -3659,7 +3772,7 @@ parse_extended_hostname(char *address)
{
char *s;
char *q;
- char query[REND_SERVICE_ID_LEN_BASE32+1];
+ char query[HS_SERVICE_ADDR_LEN_BASE32+1];
s = strrchr(address,'.');
if (!s)
@@ -3679,14 +3792,17 @@ parse_extended_hostname(char *address)
goto failed; /* reject sub-domain, as DNS does */
}
q = (NULL == q) ? address : q + 1;
- if (strlcpy(query, q, REND_SERVICE_ID_LEN_BASE32+1) >=
- REND_SERVICE_ID_LEN_BASE32+1)
+ if (strlcpy(query, q, HS_SERVICE_ADDR_LEN_BASE32+1) >=
+ HS_SERVICE_ADDR_LEN_BASE32+1)
goto failed;
if (q != address) {
memmove(address, q, strlen(q) + 1 /* also get \0 */);
}
- if (rend_valid_service_id(query)) {
- return ONION_HOSTNAME; /* success */
+ if (rend_valid_v2_service_id(query)) {
+ return ONION_V2_HOSTNAME; /* success */
+ }
+ if (hs_address_is_valid(query)) {
+ return ONION_V3_HOSTNAME;
}
failed:
/* otherwise, return to previous state and return 0 */
diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h
index e4780b3c7d..914238fc1f 100644
--- a/src/or/connection_edge.h
+++ b/src/or/connection_edge.h
@@ -33,7 +33,8 @@ int connection_edge_finished_connecting(edge_connection_t *conn);
void connection_ap_about_to_close(entry_connection_t *edge_conn);
void connection_exit_about_to_close(edge_connection_t *edge_conn);
-int connection_ap_handshake_send_begin(entry_connection_t *ap_conn);
+MOCK_DECL(int,
+ connection_ap_handshake_send_begin,(entry_connection_t *ap_conn));
int connection_ap_handshake_send_resolve(entry_connection_t *ap_conn);
entry_connection_t *connection_ap_make_link(connection_t *partner,
@@ -97,7 +98,8 @@ int connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
/** Possible return values for parse_extended_hostname. */
typedef enum hostname_type_t {
- NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME
+ NORMAL_HOSTNAME, ONION_V2_HOSTNAME, ONION_V3_HOSTNAME,
+ EXIT_HOSTNAME, BAD_HOSTNAME
} hostname_type_t;
hostname_type_t parse_extended_hostname(char *address);
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 753148291c..fc304e6f18 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -472,7 +472,7 @@ var_cell_pack_header(const var_cell_t *cell, char *hdr_out, int wide_circ_ids)
var_cell_t *
var_cell_new(uint16_t payload_len)
{
- size_t size = STRUCT_OFFSET(var_cell_t, payload) + payload_len;
+ size_t size = offsetof(var_cell_t, payload) + payload_len;
var_cell_t *cell = tor_malloc_zero(size);
cell->payload_len = payload_len;
cell->command = 0;
@@ -491,7 +491,7 @@ var_cell_copy(const var_cell_t *src)
size_t size = 0;
if (src != NULL) {
- size = STRUCT_OFFSET(var_cell_t, payload) + src->payload_len;
+ size = offsetof(var_cell_t, payload) + src->payload_len;
copy = tor_malloc_zero(size);
copy->payload_len = src->payload_len;
copy->command = src->command;
@@ -1369,7 +1369,6 @@ connection_tls_start_handshake,(or_connection_t *conn, int receiving))
connection_start_reading(TO_CONN(conn));
log_debug(LD_HANDSHAKE,"starting TLS handshake on fd "TOR_SOCKET_T_FORMAT,
conn->base_.s);
- note_crypto_pk_op(receiving ? TLS_HANDSHAKE_S : TLS_HANDSHAKE_C);
if (connection_tls_continue_handshake(conn) < 0)
return -1;
@@ -1549,7 +1548,10 @@ connection_or_check_valid_tls_handshake(or_connection_t *conn,
}
if (identity_rcvd) {
- crypto_pk_get_digest(identity_rcvd, digest_rcvd_out);
+ if (crypto_pk_get_digest(identity_rcvd, digest_rcvd_out) < 0) {
+ crypto_pk_free(identity_rcvd);
+ return -1;
+ }
} else {
memset(digest_rcvd_out, 0, DIGEST_LEN);
}
diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c
index 67a5d0b3c5..928fc26f54 100644
--- a/src/or/consdiffmgr.c
+++ b/src/or/consdiffmgr.c
@@ -1156,6 +1156,7 @@ consdiffmgr_ensure_space_for_files(int n)
if (++n_marked >= n_to_remove)
break;
} SMARTLIST_FOREACH_END(ent);
+ smartlist_free(objects);
consensus_cache_delete_pending(cache, 1);
if (BUG(n_marked < n_to_remove))
diff --git a/src/or/control.c b/src/or/control.c
index 9bcf1ee364..bc173a6e1c 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -60,6 +60,7 @@
#include "hibernate.h"
#include "hs_common.h"
#include "main.h"
+#include "microdesc.h"
#include "networkstatus.h"
#include "nodelist.h"
#include "policies.h"
@@ -367,16 +368,23 @@ connection_write_str_to_buf(const char *s, control_connection_t *conn)
STATIC size_t
write_escaped_data(const char *data, size_t len, char **out)
{
- size_t sz_out = len+8;
+ tor_assert(len < SIZE_MAX - 9);
+ size_t sz_out = len+8+1;
char *outp;
const char *start = data, *end;
- int i;
+ size_t i;
int start_of_line;
- for (i=0; i<(int)len; ++i) {
- if (data[i]== '\n')
+ for (i=0; i < len; ++i) {
+ if (data[i] == '\n') {
sz_out += 2; /* Maybe add a CR; maybe add a dot. */
+ if (sz_out >= SIZE_T_CEILING) {
+ log_warn(LD_BUG, "Input to write_escaped_data was too long");
+ *out = tor_strdup(".\r\n");
+ return 3;
+ }
+ }
}
- *out = outp = tor_malloc(sz_out+1);
+ *out = outp = tor_malloc(sz_out);
end = data+len;
start_of_line = 1;
while (data < end) {
@@ -402,7 +410,8 @@ write_escaped_data(const char *data, size_t len, char **out)
*outp++ = '\r';
*outp++ = '\n';
*outp = '\0'; /* NUL-terminate just in case. */
- tor_assert((outp - *out) <= (int)sz_out);
+ tor_assert(outp >= *out);
+ tor_assert((size_t)(outp - *out) <= sz_out);
return outp - *out;
}
@@ -802,7 +811,7 @@ queued_events_flush_all(int force)
}
/** Libevent callback: Flushes pending events to controllers that are
- * interested in them */
+ * interested in them. */
static void
flush_queued_events_cb(evutil_socket_t fd, short what, void *arg)
{
@@ -1892,6 +1901,12 @@ getinfo_helper_dir(control_connection_t *control_conn,
const char *body = signed_descriptor_get_body(&ri->cache_info);
if (body)
*answer = tor_strndup(body, ri->cache_info.signed_descriptor_len);
+ } else if (! we_fetch_router_descriptors(get_options())) {
+ /* Descriptors won't be available, provide proper error */
+ *errmsg = "We fetch microdescriptors, not router "
+ "descriptors. You'll need to use md/id/* "
+ "instead of desc/id/*.";
+ return 0;
}
} else if (!strcmpstart(question, "desc/name/")) {
const routerinfo_t *ri = NULL;
@@ -1905,7 +1920,16 @@ getinfo_helper_dir(control_connection_t *control_conn,
const char *body = signed_descriptor_get_body(&ri->cache_info);
if (body)
*answer = tor_strndup(body, ri->cache_info.signed_descriptor_len);
+ } else if (! we_fetch_router_descriptors(get_options())) {
+ /* Descriptors won't be available, provide proper error */
+ *errmsg = "We fetch microdescriptors, not router "
+ "descriptors. You'll need to use md/name/* "
+ "instead of desc/name/*.";
+ return 0;
}
+ } else if (!strcmp(question, "desc/download-enabled")) {
+ int r = we_fetch_router_descriptors(get_options());
+ tor_asprintf(answer, "%d", !!r);
} else if (!strcmp(question, "desc/all-recent")) {
routerlist_t *routerlist = router_get_routerlist();
smartlist_t *sl = smartlist_new();
@@ -1991,6 +2015,9 @@ getinfo_helper_dir(control_connection_t *control_conn,
if (md && md->body) {
*answer = tor_strndup(md->body, md->bodylen);
}
+ } else if (!strcmp(question, "md/download-enabled")) {
+ int r = we_fetch_microdescriptors(get_options());
+ tor_asprintf(answer, "%d", !!r);
} else if (!strcmpstart(question, "desc-annotations/id/")) {
const routerinfo_t *ri = NULL;
const node_t *node =
@@ -2907,7 +2934,8 @@ getinfo_helper_sr(control_connection_t *control_conn,
* *<b>a</b>. If an internal error occurs, return -1 and optionally set
* *<b>error_out</b> to point to an error message to be delivered to the
* controller. On success, _or if the key is not recognized_, return 0. Do not
- * set <b>a</b> if the key is not recognized.
+ * set <b>a</b> if the key is not recognized but you may set <b>error_out</b>
+ * to improve the error message.
*/
typedef int (*getinfo_helper_t)(control_connection_t *,
const char *q, char **a,
@@ -3012,9 +3040,13 @@ static const getinfo_item_t getinfo_items[] = {
PREFIX("desc/name/", dir, "Router descriptors by nickname."),
ITEM("desc/all-recent", dir,
"All non-expired, non-superseded router descriptors."),
+ ITEM("desc/download-enabled", dir,
+ "Do we try to download router descriptors?"),
ITEM("desc/all-recent-extrainfo-hack", dir, NULL), /* Hack. */
PREFIX("md/id/", dir, "Microdescriptors by ID"),
PREFIX("md/name/", dir, "Microdescriptors by name"),
+ ITEM("md/download-enabled", dir,
+ "Do we try to download microdescriptors?"),
PREFIX("extra-info/digest/", dir, "Extra-info documents by digest."),
PREFIX("hs/client/desc/id", dir,
"Hidden Service descriptor in client's cache by onion."),
@@ -3162,7 +3194,7 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len,
smartlist_t *questions = smartlist_new();
smartlist_t *answers = smartlist_new();
smartlist_t *unrecognized = smartlist_new();
- char *msg = NULL, *ans = NULL;
+ char *ans = NULL;
int i;
(void) len; /* body is NUL-terminated, so it's safe to ignore the length. */
@@ -3177,20 +3209,26 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len,
goto done;
}
if (!ans) {
- smartlist_add(unrecognized, (char*)q);
+ if (errmsg) /* use provided error message */
+ smartlist_add_strdup(unrecognized, errmsg);
+ else /* use default error message */
+ smartlist_add_asprintf(unrecognized, "Unrecognized key \"%s\"", q);
} else {
smartlist_add_strdup(answers, q);
smartlist_add(answers, ans);
}
} SMARTLIST_FOREACH_END(q);
+
if (smartlist_len(unrecognized)) {
+ /* control-spec section 2.3, mid-reply '-' or end of reply ' ' */
for (i=0; i < smartlist_len(unrecognized)-1; ++i)
connection_printf_to_buf(conn,
- "552-Unrecognized key \"%s\"\r\n",
- (char*)smartlist_get(unrecognized, i));
+ "552-%s\r\n",
+ (char *)smartlist_get(unrecognized, i));
+
connection_printf_to_buf(conn,
- "552 Unrecognized key \"%s\"\r\n",
- (char*)smartlist_get(unrecognized, i));
+ "552 %s\r\n",
+ (char *)smartlist_get(unrecognized, i));
goto done;
}
@@ -3217,8 +3255,8 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len,
smartlist_free(answers);
SMARTLIST_FOREACH(questions, char *, cp, tor_free(cp));
smartlist_free(questions);
+ SMARTLIST_FOREACH(unrecognized, char *, cp, tor_free(cp));
smartlist_free(unrecognized);
- tor_free(msg);
return 0;
}
@@ -4102,7 +4140,7 @@ handle_control_hsfetch(control_connection_t *conn, uint32_t len,
/* Extract the first argument (either HSAddress or DescID). */
arg1 = smartlist_get(args, 0);
/* Test if it's an HS address without the .onion part. */
- if (rend_valid_service_id(arg1)) {
+ if (rend_valid_v2_service_id(arg1)) {
hsaddress = arg1;
} else if (strcmpstart(arg1, v2_str) == 0 &&
rend_valid_descriptor_id(arg1 + v2_str_len) &&
@@ -4741,7 +4779,7 @@ handle_control_del_onion(control_connection_t *conn,
return 0;
const char *service_id = smartlist_get(args, 0);
- if (!rend_valid_service_id(service_id)) {
+ if (!rend_valid_v2_service_id(service_id)) {
connection_printf_to_buf(conn, "512 Malformed Onion Service id\r\n");
goto out;
}
@@ -4882,6 +4920,38 @@ peek_connection_has_control0_command(connection_t *conn)
return peek_buf_has_control0_command(conn->inbuf);
}
+static int
+peek_connection_has_http_command(connection_t *conn)
+{
+ return peek_buf_has_http_command(conn->inbuf);
+}
+
+static const char CONTROLPORT_IS_NOT_AN_HTTP_PROXY_MSG[] =
+ "HTTP/1.0 501 Tor ControlPort is not an HTTP proxy"
+ "\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\n"
+ "<html>\n"
+ "<head>\n"
+ "<title>Tor's ControlPort is not an HTTP proxy</title>\n"
+ "</head>\n"
+ "<body>\n"
+ "<h1>Tor's ControlPort is not an HTTP proxy</h1>\n"
+ "<p>\n"
+ "It appears you have configured your web browser to use Tor's control port"
+ " as an HTTP proxy.\n"
+ "This is not correct: Tor's default SOCKS proxy port is 9050.\n"
+ "Please configure your client accordingly.\n"
+ "</p>\n"
+ "<p>\n"
+ "See <a href=\"https://www.torproject.org/documentation.html\">"
+ "https://www.torproject.org/documentation.html</a> for more "
+ "information.\n"
+ "<!-- Plus this comment, to make the body response more than 512 bytes, so "
+ " IE will be willing to display it. Comment comment comment comment "
+ " comment comment comment comment comment comment comment comment.-->\n"
+ "</p>\n"
+ "</body>\n"
+ "</html>\n";
+
/** Called when data has arrived on a v1 control connection: Try to fetch
* commands from conn->inbuf, and execute them.
*/
@@ -4921,6 +4991,15 @@ connection_control_process_inbuf(control_connection_t *conn)
return 0;
}
+ /* If the user has the HTTP proxy port and the control port confused. */
+ if (conn->base_.state == CONTROL_CONN_STATE_NEEDAUTH &&
+ peek_connection_has_http_command(TO_CONN(conn))) {
+ connection_write_str_to_buf(CONTROLPORT_IS_NOT_AN_HTTP_PROXY_MSG, conn);
+ log_notice(LD_CONTROL, "Received HTTP request on ControlPort");
+ connection_mark_and_flush(TO_CONN(conn));
+ return 0;
+ }
+
again:
while (1) {
size_t last_idx;
diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c
index f5fff2b331..d9371b3446 100644
--- a/src/or/cpuworker.c
+++ b/src/or/cpuworker.c
@@ -382,7 +382,7 @@ cpuworker_onion_handshake_replyfn(void *work_)
if (onionskin_answer(circ,
&rpl.created_cell,
- (const char*)rpl.keys,
+ (const char*)rpl.keys, sizeof(rpl.keys),
rpl.rend_auth_material) < 0) {
log_warn(LD_OR,"onionskin_answer failed. Closing.");
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
@@ -484,7 +484,7 @@ queue_pending_tasks(void)
if (!circ)
return;
- if (assign_onionskin_to_cpuworker(circ, onionskin))
+ if (assign_onionskin_to_cpuworker(circ, onionskin) < 0)
log_info(LD_OR,"assign_to_cpuworker failed. Ignoring.");
}
}
diff --git a/src/or/dircollate.c b/src/or/dircollate.c
index 172364c5f5..d34ebe8af5 100644
--- a/src/or/dircollate.c
+++ b/src/or/dircollate.c
@@ -53,7 +53,7 @@ ddmap_entry_free(ddmap_entry_t *e)
static ddmap_entry_t *
ddmap_entry_new(int n_votes)
{
- return tor_malloc_zero(STRUCT_OFFSET(ddmap_entry_t, vrs_lst) +
+ return tor_malloc_zero(offsetof(ddmap_entry_t, vrs_lst) +
sizeof(vote_routerstatus_t *) * n_votes);
}
diff --git a/src/or/directory.c b/src/or/directory.c
index 45fbd1dd33..57dfdd9cac 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -18,7 +18,6 @@
#include "consdiffmgr.h"
#include "control.h"
#include "compat.h"
-#define DIRECTORY_PRIVATE
#include "directory.h"
#include "dirserv.h"
#include "dirvote.h"
@@ -26,6 +25,7 @@
#include "geoip.h"
#include "hs_cache.h"
#include "hs_common.h"
+#include "hs_client.h"
#include "main.h"
#include "microdesc.h"
#include "networkstatus.h"
@@ -184,9 +184,12 @@ purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose,
case DIR_PURPOSE_FETCH_EXTRAINFO:
case DIR_PURPOSE_FETCH_MICRODESC:
return 0;
+ case DIR_PURPOSE_HAS_FETCHED_HSDESC:
case DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2:
case DIR_PURPOSE_UPLOAD_RENDDESC_V2:
case DIR_PURPOSE_FETCH_RENDDESC_V2:
+ case DIR_PURPOSE_FETCH_HSDESC:
+ case DIR_PURPOSE_UPLOAD_HSDESC:
return 1;
case DIR_PURPOSE_SERVER:
default:
@@ -245,6 +248,10 @@ dir_conn_purpose_to_string(int purpose)
return "hidden-service v2 descriptor fetch";
case DIR_PURPOSE_UPLOAD_RENDDESC_V2:
return "hidden-service v2 descriptor upload";
+ case DIR_PURPOSE_FETCH_HSDESC:
+ return "hidden-service descriptor fetch";
+ case DIR_PURPOSE_UPLOAD_HSDESC:
+ return "hidden-service descriptor upload";
case DIR_PURPOSE_FETCH_MICRODESC:
return "microdescriptor fetch";
}
@@ -1035,11 +1042,12 @@ struct directory_request_t {
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 */
+ /** Hidden-service-specific information v2. */
const rend_data_t *rend_query;
/** Extra headers to append to the request */
config_line_t *additional_headers;
- /** */
+ /** Hidden-service-specific information for v3+. */
+ const hs_ident_dir_conn_t *hs_ident;
/** 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. */
@@ -1119,6 +1127,7 @@ directory_request_new(uint8_t dir_purpose)
tor_assert(dir_purpose <= DIR_PURPOSE_MAX_);
tor_assert(dir_purpose != DIR_PURPOSE_SERVER);
tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2);
+ tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_HSDESC);
directory_request_t *result = tor_malloc_zero(sizeof(*result));
tor_addr_make_null(&result->or_addr_port.addr, AF_INET);
@@ -1269,6 +1278,34 @@ directory_request_set_rend_query(directory_request_t *req,
}
req->rend_query = query;
}
+/**
+ * Set an object containing HS connection identifier to be associated with
+ * this request. Note that only an alias to <b>ident</b> is stored, so the
+ * <b>ident</b> object must outlive the request.
+ */
+void
+directory_request_upload_set_hs_ident(directory_request_t *req,
+ const hs_ident_dir_conn_t *ident)
+{
+ if (ident) {
+ tor_assert(req->dir_purpose == DIR_PURPOSE_UPLOAD_HSDESC);
+ }
+ req->hs_ident = ident;
+}
+/**
+ * Set an object containing HS connection identifier to be associated with
+ * this fetch request. Note that only an alias to <b>ident</b> is stored, so
+ * the <b>ident</b> object must outlive the request.
+ */
+void
+directory_request_fetch_set_hs_ident(directory_request_t *req,
+ const hs_ident_dir_conn_t *ident)
+{
+ if (ident) {
+ tor_assert(req->dir_purpose == DIR_PURPOSE_FETCH_HSDESC);
+ }
+ req->hs_ident = ident;
+}
/** 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. */
@@ -1390,6 +1427,7 @@ directory_initiate_request,(directory_request_t *request))
const dir_indirection_t indirection = request->indirection;
const char *resource = request->resource;
const rend_data_t *rend_query = request->rend_query;
+ const hs_ident_dir_conn_t *hs_ident = request->hs_ident;
circuit_guard_state_t *guard_state = request->guard_state;
tor_assert(or_addr_port->port || dir_addr_port->port);
@@ -1477,8 +1515,16 @@ directory_initiate_request,(directory_request_t *request))
conn->dirconn_direct = !anonymized_connection;
/* copy rendezvous data, if any */
- if (rend_query)
+ if (rend_query) {
+ /* We can't have both v2 and v3+ identifier. */
+ tor_assert_nonfatal(!hs_ident);
conn->rend_data = rend_data_dup(rend_query);
+ }
+ if (hs_ident) {
+ /* We can't have both v2 and v3+ identifier. */
+ tor_assert_nonfatal(!rend_query);
+ conn->hs_ident = hs_ident_dir_conn_dup(hs_ident);
+ }
if (!anonymized_connection && !use_begindir) {
/* then we want to connect to dirport directly */
@@ -1830,12 +1876,25 @@ directory_send_command(dir_connection_t *conn,
httpcommand = "GET";
tor_asprintf(&url, "/tor/rendezvous2/%s", resource);
break;
+ case DIR_PURPOSE_FETCH_HSDESC:
+ tor_assert(resource);
+ tor_assert(strlen(resource) <= ED25519_BASE64_LEN);
+ tor_assert(!payload);
+ httpcommand = "GET";
+ tor_asprintf(&url, "/tor/hs/3/%s", resource);
+ break;
case DIR_PURPOSE_UPLOAD_RENDDESC_V2:
tor_assert(!resource);
tor_assert(payload);
httpcommand = "POST";
url = tor_strdup("/tor/rendezvous2/publish");
break;
+ case DIR_PURPOSE_UPLOAD_HSDESC:
+ tor_assert(resource);
+ tor_assert(payload);
+ httpcommand = "POST";
+ tor_asprintf(&url, "/tor/hs/%s/publish", resource);
+ break;
default:
tor_assert(0);
return;
@@ -2158,16 +2217,6 @@ load_downloaded_routers(const char *body, smartlist_t *which,
return added;
}
-/** A structure to hold arguments passed into each directory response
- * handler */
-typedef struct response_handler_args_t {
- int status_code;
- const char *reason;
- const char *body;
- size_t body_len;
- const char *headers;
-} response_handler_args_t;
-
static int handle_response_fetch_consensus(dir_connection_t *,
const response_handler_args_t *);
static int handle_response_fetch_certificate(dir_connection_t *,
@@ -2190,6 +2239,8 @@ static int handle_response_fetch_renddesc_v2(dir_connection_t *,
const response_handler_args_t *);
static int handle_response_upload_renddesc_v2(dir_connection_t *,
const response_handler_args_t *);
+static int handle_response_upload_hsdesc(dir_connection_t *,
+ const response_handler_args_t *);
static int
dir_client_decompress_response_body(char **bodyp, size_t *bodylenp,
@@ -2490,6 +2541,12 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
case DIR_PURPOSE_UPLOAD_RENDDESC_V2:
rv = handle_response_upload_renddesc_v2(conn, &args);
break;
+ case DIR_PURPOSE_UPLOAD_HSDESC:
+ rv = handle_response_upload_hsdesc(conn, &args);
+ break;
+ case DIR_PURPOSE_FETCH_HSDESC:
+ rv = handle_response_fetch_hsdesc_v3(conn, &args);
+ break;
default:
tor_assert_nonfatal_unreached();
rv = -1;
@@ -3035,6 +3092,60 @@ handle_response_upload_signatures(dir_connection_t *conn,
}
/**
+ * Handler function: processes a response to a request for a v3 hidden service
+ * descriptor.
+ **/
+STATIC int
+handle_response_fetch_hsdesc_v3(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+ const char *body = args->body;
+ const size_t body_len = args->body_len;
+
+ tor_assert(conn->hs_ident);
+
+ log_info(LD_REND,"Received v3 hsdesc (body size %d, status %d (%s))",
+ (int)body_len, status_code, escaped(reason));
+
+ switch (status_code) {
+ case 200:
+ /* We got something: Try storing it in the cache. */
+ if (hs_cache_store_as_client(body, &conn->hs_ident->identity_pk) < 0) {
+ log_warn(LD_REND, "Failed to store hidden service descriptor");
+ } else {
+ log_info(LD_REND, "Stored hidden service descriptor successfully.");
+ TO_CONN(conn)->purpose = DIR_PURPOSE_HAS_FETCHED_HSDESC;
+ hs_client_desc_has_arrived(conn->hs_ident);
+ }
+ break;
+ case 404:
+ /* Not there. We'll retry when connection_about_to_close_connection()
+ * tries to clean this conn up. */
+ log_info(LD_REND, "Fetching hidden service v3 descriptor not found: "
+ "Retrying at another directory.");
+ /* TODO: Inform the control port */
+ break;
+ case 400:
+ log_warn(LD_REND, "Fetching v3 hidden service descriptor failed: "
+ "http status 400 (%s). Dirserver didn't like our "
+ "query? Retrying at another directory.",
+ escaped(reason));
+ break;
+ default:
+ log_warn(LD_REND, "Fetching v3 hidden service descriptor failed: "
+ "http status %d (%s) response unexpected from HSDir server "
+ "'%s:%d'. Retrying at another directory.",
+ status_code, escaped(reason), TO_CONN(conn)->address,
+ TO_CONN(conn)->port);
+ break;
+ }
+
+ return 0;
+}
+
+/**
* Handler function: processes a response to a request for a v2 hidden service
* descriptor.
**/
@@ -3181,6 +3292,52 @@ handle_response_upload_renddesc_v2(dir_connection_t *conn,
return 0;
}
+/**
+ * Handler function: processes a response to a POST request to upload an
+ * hidden service descriptor.
+ **/
+static int
+handle_response_upload_hsdesc(dir_connection_t *conn,
+ const response_handler_args_t *args)
+{
+ const int status_code = args->status_code;
+ const char *reason = args->reason;
+
+ tor_assert(conn);
+ tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_HSDESC);
+
+ log_info(LD_REND, "Uploaded hidden service descriptor (status %d "
+ "(%s))",
+ status_code, escaped(reason));
+ /* For this directory response, it MUST have an hidden service identifier on
+ * this connection. */
+ tor_assert(conn->hs_ident);
+ switch (status_code) {
+ case 200:
+ log_info(LD_REND, "Uploading hidden service descriptor: "
+ "finished with status 200 (%s)", escaped(reason));
+ /* XXX: Trigger control event. */
+ break;
+ case 400:
+ log_warn(LD_REND, "Uploading hidden service descriptor: http "
+ "status 400 (%s) response from dirserver "
+ "'%s:%d'. Malformed hidden service descriptor?",
+ escaped(reason), conn->base_.address, conn->base_.port);
+ /* XXX: Trigger control event. */
+ break;
+ default:
+ log_warn(LD_REND, "Uploading hidden service descriptor: http "
+ "status %d (%s) response unexpected (server "
+ "'%s:%d').",
+ status_code, escaped(reason), conn->base_.address,
+ conn->base_.port);
+ /* XXX: Trigger control event. */
+ break;
+ }
+
+ return 0;
+}
+
/** Called when a directory connection reaches EOF. */
int
connection_dir_reached_eof(dir_connection_t *conn)
@@ -3252,6 +3409,33 @@ connection_dir_process_inbuf(dir_connection_t *conn)
return 0;
}
+/** We are closing a dir connection: If <b>dir_conn</b> is a dir connection
+ * that tried to fetch an HS descriptor, check if it successfuly fetched it,
+ * or if we need to try again. */
+static void
+refetch_hsdesc_if_needed(dir_connection_t *dir_conn)
+{
+ connection_t *conn = TO_CONN(dir_conn);
+
+ /* If we were trying to fetch a v2 rend desc and did not succeed, retry as
+ * needed. (If a fetch is successful, the connection state is changed to
+ * DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 or DIR_PURPOSE_HAS_FETCHED_HSDESC to
+ * mark that refetching is unnecessary.) */
+ if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 &&
+ dir_conn->rend_data &&
+ rend_valid_v2_service_id(
+ rend_data_get_address(dir_conn->rend_data))) {
+ rend_client_refetch_v2_renddesc(dir_conn->rend_data);
+ }
+
+ /* Check for v3 rend desc fetch */
+ if (conn->purpose == DIR_PURPOSE_FETCH_HSDESC &&
+ dir_conn->hs_ident &&
+ !ed25519_public_key_is_zero(&dir_conn->hs_ident->identity_pk)) {
+ hs_client_refetch_hsdesc(&dir_conn->hs_ident->identity_pk);
+ }
+}
+
/** Called when we're about to finally unlink and free a directory connection:
* perform necessary accounting and cleanup */
void
@@ -3264,15 +3448,8 @@ connection_dir_about_to_close(dir_connection_t *dir_conn)
* failed: forget about this router, and maybe try again. */
connection_dir_request_failed(dir_conn);
}
- /* If we were trying to fetch a v2 rend desc and did not succeed,
- * retry as needed. (If a fetch is successful, the connection state
- * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2 to mark that
- * refetching is unnecessary.) */
- if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 &&
- dir_conn->rend_data &&
- strlen(rend_data_get_address(dir_conn->rend_data)) ==
- REND_SERVICE_ID_LEN_BASE32)
- rend_client_refetch_v2_renddesc(dir_conn->rend_data);
+
+ refetch_hsdesc_if_needed(dir_conn);
}
/** Create an http response for the client <b>conn</b> out of
@@ -4918,7 +5095,7 @@ directory_handle_command_post,(dir_connection_t *conn, const char *headers,
goto done;
}
- if (authdir_mode_handles_descs(options, -1) &&
+ if (authdir_mode(options) &&
!strcmp(url,"/tor/")) { /* server descriptor post */
const char *msg = "[None]";
uint8_t purpose = authdir_mode_bridge(options) ?
@@ -5124,7 +5301,7 @@ connection_dir_finished_connecting(dir_connection_t *conn)
* Helper function for download_status_increment_failure(),
* download_status_reset(), and download_status_increment_attempt(). */
STATIC const smartlist_t *
-find_dl_schedule(download_status_t *dls, const or_options_t *options)
+find_dl_schedule(const download_status_t *dls, const or_options_t *options)
{
const int dir_server = dir_server_mode(options);
const int multi_d = networkstatus_consensus_can_use_multiple_directories(
@@ -5193,6 +5370,8 @@ find_dl_min_and_max_delay(download_status_t *dls, const or_options_t *options,
const smartlist_t *schedule = find_dl_schedule(dls, options);
tor_assert(schedule != NULL && smartlist_len(schedule) >= 2);
*min = *((int *)(smartlist_get(schedule, 0)));
+ /* Increment on failure schedules always use exponential backoff, but they
+ * have a smaller limit when they're deterministic */
if (dls->backoff == DL_SCHED_DETERMINISTIC)
*max = *((int *)((smartlist_get(schedule, smartlist_len(schedule) - 1))));
else
@@ -5201,8 +5380,9 @@ find_dl_min_and_max_delay(download_status_t *dls, const or_options_t *options,
/** Advance one delay step. The algorithm is to use the previous delay to
* compute an increment, we construct a value uniformly at random between
- * delay and MAX(delay*2,delay+1). We then clamp that value to be no larger
- * than max_delay, and return it.
+ * delay+1 and (delay*(DIR_DEFAULT_RANDOM_MULTIPLIER+1))+1 (or
+ * DIR_TEST_NET_RANDOM_MULTIPLIER in test networks).
+ * We then clamp that value to be no larger than max_delay, and return it.
*
* Requires that delay is less than INT_MAX, and delay is in [0,max_delay].
*/
@@ -5221,11 +5401,11 @@ next_random_exponential_delay(int delay, int max_delay)
/* How much are we willing to add to the delay? */
int max_increment;
- int multiplier = 3; /* no more than quadruple the previous delay */
+ int multiplier = DIR_DEFAULT_RANDOM_MULTIPLIER;
if (get_options()->TestingTorNetwork) {
/* Decrease the multiplier in testing networks. This reduces the variance,
* so that bootstrap is more reliable. */
- multiplier = 2; /* no more than triple the previous delay */
+ multiplier = DIR_TEST_NET_RANDOM_MULTIPLIER;
}
if (delay && delay < (INT_MAX-1) / multiplier) {
@@ -5377,6 +5557,11 @@ download_status_increment_failure(download_status_t *dls, int status_code,
tor_assert(dls);
+ /* dls wasn't reset before it was used */
+ if (dls->next_attempt_at == 0) {
+ download_status_reset(dls);
+ }
+
/* count the failure */
if (dls->n_download_failures < IMPOSSIBLE_TO_DOWNLOAD-1) {
++dls->n_download_failures;
@@ -5401,14 +5586,16 @@ download_status_increment_failure(download_status_t *dls, int status_code,
download_status_log_helper(item, !dls->increment_on, "failed",
"concurrently", dls->n_download_failures,
- increment, dls->next_attempt_at, now);
+ increment,
+ download_status_get_next_attempt_at(dls),
+ now);
if (dls->increment_on == DL_SCHED_INCREMENT_ATTEMPT) {
/* stop this schedule retrying on failure, it will launch concurrent
* connections instead */
return TIME_MAX;
} else {
- return dls->next_attempt_at;
+ return download_status_get_next_attempt_at(dls);
}
}
@@ -5429,6 +5616,11 @@ download_status_increment_attempt(download_status_t *dls, const char *item,
tor_assert(dls);
+ /* dls wasn't reset before it was used */
+ if (dls->next_attempt_at == 0) {
+ download_status_reset(dls);
+ }
+
if (dls->increment_on == DL_SCHED_INCREMENT_FAILURE) {
/* this schedule should retry on failure, and not launch any concurrent
attempts */
@@ -5447,9 +5639,19 @@ download_status_increment_attempt(download_status_t *dls, const char *item,
download_status_log_helper(item, dls->increment_on, "attempted",
"on failure", dls->n_download_attempts,
- delay, dls->next_attempt_at, now);
+ delay, download_status_get_next_attempt_at(dls),
+ now);
- return dls->next_attempt_at;
+ return download_status_get_next_attempt_at(dls);
+}
+
+static time_t
+download_status_get_initial_delay_from_now(const download_status_t *dls)
+{
+ const smartlist_t *schedule = find_dl_schedule(dls, get_options());
+ /* We use constant initial delays, even in exponential backoff
+ * schedules. */
+ return time(NULL) + *(int *)smartlist_get(schedule, 0);
}
/** Reset <b>dls</b> so that it will be considered downloadable
@@ -5470,11 +5672,9 @@ download_status_reset(download_status_t *dls)
|| dls->n_download_attempts == IMPOSSIBLE_TO_DOWNLOAD)
return; /* Don't reset this. */
- const smartlist_t *schedule = find_dl_schedule(dls, get_options());
-
dls->n_download_failures = 0;
dls->n_download_attempts = 0;
- dls->next_attempt_at = time(NULL) + *(int *)smartlist_get(schedule, 0);
+ dls->next_attempt_at = download_status_get_initial_delay_from_now(dls);
dls->last_backoff_position = 0;
dls->last_delay_used = 0;
/* Don't reset dls->want_authority or dls->increment_on */
@@ -5501,6 +5701,12 @@ download_status_get_n_attempts(const download_status_t *dls)
time_t
download_status_get_next_attempt_at(const download_status_t *dls)
{
+ /* dls wasn't reset before it was used */
+ if (dls->next_attempt_at == 0) {
+ /* so give the answer we would have given if it had been */
+ return download_status_get_initial_delay_from_now(dls);
+ }
+
return dls->next_attempt_at;
}
diff --git a/src/or/directory.h b/src/or/directory.h
index 14d5ae9ef4..42bcb55eb2 100644
--- a/src/or/directory.h
+++ b/src/or/directory.h
@@ -12,6 +12,8 @@
#ifndef TOR_DIRECTORY_H
#define TOR_DIRECTORY_H
+#include "hs_ident.h"
+
int directories_have_accepted_server_descriptor(void);
void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
dirinfo_type_t type, const char *payload,
@@ -71,6 +73,10 @@ 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_upload_set_hs_ident(directory_request_t *req,
+ const hs_ident_dir_conn_t *ident);
+void directory_request_fetch_set_hs_ident(directory_request_t *req,
+ const hs_ident_dir_conn_t *ident);
void directory_request_set_routerstatus(directory_request_t *req,
const routerstatus_t *rs);
@@ -123,12 +129,19 @@ time_t download_status_increment_attempt(download_status_t *dls,
void download_status_reset(download_status_t *dls);
static int download_status_is_ready(download_status_t *dls, time_t now,
int max_failures);
+time_t download_status_get_next_attempt_at(const download_status_t *dls);
+
/** Return true iff, as of <b>now</b>, the resource tracked by <b>dls</b> is
* ready to get its download reattempted. */
static inline int
download_status_is_ready(download_status_t *dls, time_t now,
int max_failures)
{
+ /* dls wasn't reset before it was used */
+ if (dls->next_attempt_at == 0) {
+ download_status_reset(dls);
+ }
+
if (dls->backoff == DL_SCHED_DETERMINISTIC) {
/* Deterministic schedules can hit an endpoint; exponential backoff
* schedules just wait longer and longer. */
@@ -137,7 +150,7 @@ download_status_is_ready(download_status_t *dls, time_t now,
if (!under_failure_limit)
return 0;
}
- return dls->next_attempt_at <= now;
+ return download_status_get_next_attempt_at(dls) <= now;
}
static void download_status_mark_impossible(download_status_t *dl);
@@ -151,13 +164,22 @@ download_status_mark_impossible(download_status_t *dl)
int download_status_get_n_failures(const download_status_t *dls);
int download_status_get_n_attempts(const download_status_t *dls);
-time_t download_status_get_next_attempt_at(const download_status_t *dls);
int purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose,
const char *resource);
#ifdef DIRECTORY_PRIVATE
+/** A structure to hold arguments passed into each directory response
+ * handler */
+typedef struct response_handler_args_t {
+ int status_code;
+ const char *reason;
+ const char *body;
+ size_t body_len;
+ const char *headers;
+} response_handler_args_t;
+
struct get_handler_args_t;
STATIC int handle_get_hs_descriptor_v3(dir_connection_t *conn,
const struct get_handler_args_t *args);
@@ -166,10 +188,13 @@ STATIC char *accept_encoding_header(void);
STATIC int allowed_anonymous_connection_compression_method(compress_method_t);
STATIC void warn_disallowed_anonymous_compression_method(compress_method_t);
+STATIC int handle_response_fetch_hsdesc_v3(dir_connection_t *conn,
+ const response_handler_args_t *args);
+
#endif
#ifdef TOR_UNIT_TESTS
-/* Used only by test_dir.c */
+/* Used only by test_dir.c and test_hs_cache.c */
STATIC int parse_http_url(const char *headers, char **url);
STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose,
@@ -193,7 +218,7 @@ 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 compression_level_t choose_compression_level(ssize_t n_bytes);
-STATIC const smartlist_t *find_dl_schedule(download_status_t *dls,
+STATIC const smartlist_t *find_dl_schedule(const download_status_t *dls,
const or_options_t *options);
STATIC void find_dl_min_and_max_delay(download_status_t *dls,
const or_options_t *options,
@@ -206,5 +231,15 @@ STATIC int parse_hs_version_from_post(const char *url, const char *prefix,
STATIC unsigned parse_accept_encoding_header(const char *h);
#endif
+#if defined(TOR_UNIT_TESTS) || defined(DIRECTORY_PRIVATE)
+/* Used only by directory.c and test_dir.c */
+
+/* no more than quadruple the previous delay (multiplier + 1) */
+#define DIR_DEFAULT_RANDOM_MULTIPLIER (3)
+/* no more than triple the previous delay */
+#define DIR_TEST_NET_RANDOM_MULTIPLIER (2)
+
+#endif
+
#endif
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index acd00322a1..4faca9454b 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -704,10 +704,22 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source)
/* Do keypinning again ... this time, to add the pin if appropriate */
int keypin_status;
if (ri->cache_info.signing_key_cert) {
+ ed25519_public_key_t *pkey = &ri->cache_info.signing_key_cert->signing_key;
+ /* First let's validate this pubkey before pinning it */
+ if (ed25519_validate_pubkey(pkey) < 0) {
+ log_warn(LD_DIRSERV, "Received bad key from %s (source %s)",
+ router_describe(ri), source);
+ control_event_or_authdir_new_descriptor("REJECTED",
+ ri->cache_info.signed_descriptor_body,
+ desclen, *msg);
+ routerinfo_free(ri);
+ return ROUTER_AUTHDIR_REJECTS;
+ }
+
+ /* Now pin it! */
keypin_status = keypin_check_and_add(
(const uint8_t*)ri->cache_info.identity_digest,
- ri->cache_info.signing_key_cert->signing_key.pubkey,
- ! key_pinning);
+ pkey->pubkey, ! key_pinning);
} else {
keypin_status = keypin_check_lone_rsa(
(const uint8_t*)ri->cache_info.identity_digest);
@@ -2693,7 +2705,7 @@ measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line)
}
cp+=strlen("bw=");
- out->bw_kb = tor_parse_long(cp, 0, 0, LONG_MAX, &parse_ok, &endptr);
+ out->bw_kb = tor_parse_long(cp, 10, 0, LONG_MAX, &parse_ok, &endptr);
if (!parse_ok || (*endptr && !TOR_ISSPACE(*endptr))) {
log_warn(LD_DIRSERV, "Invalid bandwidth in bandwidth file line: %s",
escaped(orig_line));
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index f5e29eb786..c65945fea7 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -306,7 +306,6 @@ format_networkstatus_vote(crypto_pk_t *private_signing_key,
signing_key_fingerprint);
}
- note_crypto_pk_op(SIGN_DIR);
{
char *sig = router_get_dirobj_signature(digest, DIGEST_LEN,
private_signing_key);
@@ -737,12 +736,12 @@ dirvote_get_intermediate_param_value(const smartlist_t *param_list,
}
} SMARTLIST_FOREACH_END(k_v_pair);
- if (n_found == 1)
+ if (n_found == 1) {
return value;
- else if (BUG(n_found > 1))
- return default_val;
- else
+ } else {
+ tor_assert_nonfatal(n_found == 0);
return default_val;
+ }
}
/** Minimum number of directory authorities voting for a parameter to
diff --git a/src/or/dns.c b/src/or/dns.c
index 98b684c904..2d642773f3 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -182,6 +182,18 @@ evdns_log_cb(int warn, const char *msg)
} else if (!strcmp(msg, "All nameservers have failed")) {
control_event_server_status(LOG_WARN, "NAMESERVER_ALL_DOWN");
all_down = 1;
+ } else if (!strcmpstart(msg, "Address mismatch on received DNS")) {
+ static ratelim_t mismatch_limit = RATELIM_INIT(3600);
+ const char *src = strstr(msg, " Apparent source");
+ if (!src || get_options()->SafeLogging) {
+ src = "";
+ }
+ log_fn_ratelim(&mismatch_limit, severity, LD_EXIT,
+ "eventdns: Received a DNS packet from "
+ "an IP address to which we did not send a request. This "
+ "could be a DNS spoofing attempt, or some kind of "
+ "misconfiguration.%s", src);
+ return;
}
tor_log(severity, LD_EXIT, "eventdns: %s", msg);
}
@@ -366,7 +378,7 @@ set_expiry(cached_resolve_t *resolve, time_t expires)
resolve->expire = expires;
smartlist_pqueue_add(cached_resolve_pqueue,
compare_cached_resolves_by_expiry_,
- STRUCT_OFFSET(cached_resolve_t, minheap_idx),
+ offsetof(cached_resolve_t, minheap_idx),
resolve);
}
@@ -413,7 +425,7 @@ purge_expired_resolves(time_t now)
break;
smartlist_pqueue_pop(cached_resolve_pqueue,
compare_cached_resolves_by_expiry_,
- STRUCT_OFFSET(cached_resolve_t, minheap_idx));
+ offsetof(cached_resolve_t, minheap_idx));
if (resolve->state == CACHE_STATE_PENDING) {
log_debug(LD_EXIT,
@@ -1928,7 +1940,7 @@ dns_launch_wildcard_checks(void)
launch_wildcard_check(8, 16, ipv6, ".com");
launch_wildcard_check(8, 16, ipv6, ".org");
launch_wildcard_check(8, 16, ipv6, ".net");
- }
+ }
}
}
@@ -2071,7 +2083,7 @@ assert_cache_ok_(void)
smartlist_pqueue_assert_ok(cached_resolve_pqueue,
compare_cached_resolves_by_expiry_,
- STRUCT_OFFSET(cached_resolve_t, minheap_idx));
+ offsetof(cached_resolve_t, minheap_idx));
SMARTLIST_FOREACH(cached_resolve_pqueue, cached_resolve_t *, res,
{
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index fa768fc4a6..739ec82484 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -813,7 +813,7 @@ STATIC entry_guard_t *
entry_guard_add_to_sample(guard_selection_t *gs,
const node_t *node)
{
- log_info(LD_GUARD, "Adding %s as to the entry guard sample set.",
+ log_info(LD_GUARD, "Adding %s to the entry guard sample set.",
node_describe(node));
/* make sure that the guard is not already sampled. */
diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c
index b60d2e55c8..01dc06ce13 100644
--- a/src/or/ext_orport.c
+++ b/src/or/ext_orport.c
@@ -31,7 +31,7 @@
ext_or_cmd_t *
ext_or_cmd_new(uint16_t len)
{
- size_t size = STRUCT_OFFSET(ext_or_cmd_t, body) + len;
+ size_t size = offsetof(ext_or_cmd_t, body) + len;
ext_or_cmd_t *cmd = tor_malloc(size);
cmd->len = len;
return cmd;
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index f54109fc90..8c48a6f47d 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -587,7 +587,10 @@ accounting_set_wakeup_time(void)
char buf[ISO_TIME_LEN+1];
format_iso_time(buf, interval_start_time);
- crypto_pk_get_digest(get_server_identity_key(), digest);
+ if (crypto_pk_get_digest(get_server_identity_key(), digest) < 0) {
+ log_err(LD_BUG, "Error getting our key's digest.");
+ tor_assert(0);
+ }
d_env = crypto_digest_new();
crypto_digest_add_bytes(d_env, buf, ISO_TIME_LEN);
diff --git a/src/or/hs_cache.c b/src/or/hs_cache.c
index 29681b42b5..6962c5ce44 100644
--- a/src/or/hs_cache.c
+++ b/src/or/hs_cache.c
@@ -9,15 +9,19 @@
/* For unit tests.*/
#define HS_CACHE_PRIVATE
-#include "hs_cache.h"
-
#include "or.h"
#include "config.h"
+#include "hs_ident.h"
#include "hs_common.h"
+#include "hs_client.h"
#include "hs_descriptor.h"
#include "networkstatus.h"
#include "rendcache.h"
+#include "hs_cache.h"
+
+/********************** Directory HS cache ******************/
+
/* Directory descriptor cache. Map indexed by blinded key. */
static digest256map_t *hs_cache_v3_dir;
@@ -98,7 +102,7 @@ cache_dir_desc_new(const char *desc)
/* Return the size of a cache entry in bytes. */
static size_t
-cache_get_entry_size(const hs_cache_dir_descriptor_t *entry)
+cache_get_dir_entry_size(const hs_cache_dir_descriptor_t *entry)
{
return (sizeof(*entry) + hs_desc_plaintext_obj_size(entry->plaintext_data)
+ strlen(entry->encoded_desc));
@@ -124,15 +128,17 @@ cache_store_v3_as_dir(hs_cache_dir_descriptor_t *desc)
if (cache_entry->plaintext_data->revision_counter >=
desc->plaintext_data->revision_counter) {
log_info(LD_REND, "Descriptor revision counter in our cache is "
- "greater or equal than the one we received. "
- "Rejecting!");
+ "greater or equal than the one we received (%d/%d). "
+ "Rejecting!",
+ (int)cache_entry->plaintext_data->revision_counter,
+ (int)desc->plaintext_data->revision_counter);
goto err;
}
/* We now know that the descriptor we just received is a new one so
* remove the entry we currently have from our cache so we can then
* store the new one. */
remove_v3_desc_as_dir(cache_entry);
- rend_cache_decrement_allocation(cache_get_entry_size(cache_entry));
+ rend_cache_decrement_allocation(cache_get_dir_entry_size(cache_entry));
cache_dir_desc_free(cache_entry);
}
/* Store the descriptor we just got. We are sure here that either we
@@ -142,7 +148,7 @@ cache_store_v3_as_dir(hs_cache_dir_descriptor_t *desc)
/* Update our total cache size with this entry for the OOM. This uses the
* old HS protocol cache subsystem for which we are tied with. */
- rend_cache_increment_allocation(cache_get_entry_size(desc));
+ rend_cache_increment_allocation(cache_get_dir_entry_size(desc));
/* XXX: Update HS statistics. We should have specific stats for v3. */
@@ -219,7 +225,7 @@ cache_clean_v3_as_dir(time_t now, time_t global_cutoff)
}
/* Here, our entry has expired, remove and free. */
MAP_DEL_CURRENT(key);
- entry_size = cache_get_entry_size(entry);
+ entry_size = cache_get_dir_entry_size(entry);
bytes_removed += entry_size;
/* Entry is not in the cache anymore, destroy it. */
cache_dir_desc_free(entry);
@@ -313,6 +319,468 @@ hs_cache_clean_as_dir(time_t now)
cache_clean_v3_as_dir(now, 0);
}
+/********************** Client-side HS cache ******************/
+
+/* Client-side HS descriptor cache. Map indexed by service identity key. */
+static digest256map_t *hs_cache_v3_client;
+
+/* Client-side introduction point state cache. Map indexed by service public
+ * identity key (onion address). It contains hs_cache_client_intro_state_t
+ * objects all related to a specific service. */
+static digest256map_t *hs_cache_client_intro_state;
+
+/* Return the size of a client cache entry in bytes. */
+static size_t
+cache_get_client_entry_size(const hs_cache_client_descriptor_t *entry)
+{
+ return sizeof(*entry) +
+ strlen(entry->encoded_desc) + hs_desc_obj_size(entry->desc);
+}
+
+/* Remove a given descriptor from our cache. */
+static void
+remove_v3_desc_as_client(const hs_cache_client_descriptor_t *desc)
+{
+ tor_assert(desc);
+ digest256map_remove(hs_cache_v3_client, desc->key.pubkey);
+ /* Update cache size with this entry for the OOM handler. */
+ rend_cache_decrement_allocation(cache_get_client_entry_size(desc));
+}
+
+/* Store a given descriptor in our cache. */
+static void
+store_v3_desc_as_client(hs_cache_client_descriptor_t *desc)
+{
+ tor_assert(desc);
+ digest256map_set(hs_cache_v3_client, desc->key.pubkey, desc);
+ /* Update cache size with this entry for the OOM handler. */
+ rend_cache_increment_allocation(cache_get_client_entry_size(desc));
+}
+
+/* Query our cache and return the entry or NULL if not found. */
+STATIC hs_cache_client_descriptor_t *
+lookup_v3_desc_as_client(const uint8_t *key)
+{
+ tor_assert(key);
+ return digest256map_get(hs_cache_v3_client, key);
+}
+
+/* Parse the encoded descriptor in <b>desc_str</b> using
+ * <b>service_identity_pk<b> to decrypt it first.
+ *
+ * If everything goes well, allocate and return a new
+ * hs_cache_client_descriptor_t object. In case of error, return NULL. */
+static hs_cache_client_descriptor_t *
+cache_client_desc_new(const char *desc_str,
+ const ed25519_public_key_t *service_identity_pk)
+{
+ hs_descriptor_t *desc = NULL;
+ hs_cache_client_descriptor_t *client_desc = NULL;
+
+ tor_assert(desc_str);
+ tor_assert(service_identity_pk);
+
+ /* Decode the descriptor we just fetched. */
+ if (hs_client_decode_descriptor(desc_str, service_identity_pk, &desc) < 0) {
+ goto end;
+ }
+ tor_assert(desc);
+
+ /* All is good: make a cache object for this descriptor */
+ client_desc = tor_malloc_zero(sizeof(hs_cache_client_descriptor_t));
+ ed25519_pubkey_copy(&client_desc->key, service_identity_pk);
+ client_desc->created_ts = approx_time();
+ client_desc->desc = desc;
+ client_desc->encoded_desc = tor_strdup(desc_str);
+
+ end:
+ return client_desc;
+}
+
+/** Free memory allocated by <b>desc</b>. */
+static void
+cache_client_desc_free(hs_cache_client_descriptor_t *desc)
+{
+ if (desc == NULL) {
+ return;
+ }
+ hs_descriptor_free(desc->desc);
+ memwipe(&desc->key, 0, sizeof(desc->key));
+ memwipe(desc->encoded_desc, 0, strlen(desc->encoded_desc));
+ tor_free(desc->encoded_desc);
+ tor_free(desc);
+}
+
+/** Helper function: Use by the free all function to clear the client cache */
+static void
+cache_client_desc_free_(void *ptr)
+{
+ hs_cache_client_descriptor_t *desc = ptr;
+ cache_client_desc_free(desc);
+}
+
+/* Return a newly allocated and initialized hs_cache_intro_state_t object. */
+static hs_cache_intro_state_t *
+cache_intro_state_new(void)
+{
+ hs_cache_intro_state_t *state = tor_malloc_zero(sizeof(*state));
+ state->created_ts = approx_time();
+ return state;
+}
+
+/* Free an hs_cache_intro_state_t object. */
+static void
+cache_intro_state_free(hs_cache_intro_state_t *state)
+{
+ tor_free(state);
+}
+
+/* Helper function: use by the free all function. */
+static void
+cache_intro_state_free_(void *state)
+{
+ cache_intro_state_free(state);
+}
+
+/* Return a newly allocated and initialized hs_cache_client_intro_state_t
+ * object. */
+static hs_cache_client_intro_state_t *
+cache_client_intro_state_new(void)
+{
+ hs_cache_client_intro_state_t *cache = tor_malloc_zero(sizeof(*cache));
+ cache->intro_points = digest256map_new();
+ return cache;
+}
+
+/* Free a cache client intro state object. */
+static void
+cache_client_intro_state_free(hs_cache_client_intro_state_t *cache)
+{
+ if (cache == NULL) {
+ return;
+ }
+ digest256map_free(cache->intro_points, cache_intro_state_free_);
+ tor_free(cache);
+}
+
+/* Helper function: use by the free all function. */
+static void
+cache_client_intro_state_free_(void *entry)
+{
+ cache_client_intro_state_free(entry);
+}
+
+/* For the given service identity key service_pk and an introduction
+ * authentication key auth_key, lookup the intro state object. Return 1 if
+ * found and put it in entry if not NULL. Return 0 if not found and entry is
+ * untouched. */
+static int
+cache_client_intro_state_lookup(const ed25519_public_key_t *service_pk,
+ const ed25519_public_key_t *auth_key,
+ hs_cache_intro_state_t **entry)
+{
+ hs_cache_intro_state_t *state;
+ hs_cache_client_intro_state_t *cache;
+
+ tor_assert(service_pk);
+ tor_assert(auth_key);
+
+ /* Lookup the intro state cache for this service key. */
+ cache = digest256map_get(hs_cache_client_intro_state, service_pk->pubkey);
+ if (cache == NULL) {
+ goto not_found;
+ }
+
+ /* From the cache we just found for the service, lookup in the introduction
+ * points map for the given authentication key. */
+ state = digest256map_get(cache->intro_points, auth_key->pubkey);
+ if (state == NULL) {
+ goto not_found;
+ }
+ if (entry) {
+ *entry = state;
+ }
+ return 1;
+ not_found:
+ return 0;
+}
+
+/* Note the given failure in state. */
+static void
+cache_client_intro_state_note(hs_cache_intro_state_t *state,
+ rend_intro_point_failure_t failure)
+{
+ tor_assert(state);
+ switch (failure) {
+ case INTRO_POINT_FAILURE_GENERIC:
+ state->error = 1;
+ break;
+ case INTRO_POINT_FAILURE_TIMEOUT:
+ state->timed_out = 1;
+ break;
+ case INTRO_POINT_FAILURE_UNREACHABLE:
+ state->unreachable_count++;
+ break;
+ default:
+ tor_assert_nonfatal_unreached();
+ return;
+ }
+}
+
+/* For the given service identity key service_pk and an introduction
+ * authentication key auth_key, add an entry in the client intro state cache
+ * If no entry exists for the service, it will create one. If state is non
+ * NULL, it will point to the new intro state entry. */
+static void
+cache_client_intro_state_add(const ed25519_public_key_t *service_pk,
+ const ed25519_public_key_t *auth_key,
+ hs_cache_intro_state_t **state)
+{
+ hs_cache_intro_state_t *entry, *old_entry;
+ hs_cache_client_intro_state_t *cache;
+
+ tor_assert(service_pk);
+ tor_assert(auth_key);
+
+ /* Lookup the state cache for this service key. */
+ cache = digest256map_get(hs_cache_client_intro_state, service_pk->pubkey);
+ if (cache == NULL) {
+ cache = cache_client_intro_state_new();
+ digest256map_set(hs_cache_client_intro_state, service_pk->pubkey, cache);
+ }
+
+ entry = cache_intro_state_new();
+ old_entry = digest256map_set(cache->intro_points, auth_key->pubkey, entry);
+ /* This should never happened because the code flow is to lookup the entry
+ * before adding it. But, just in case, non fatal assert and free it. */
+ tor_assert_nonfatal(old_entry == NULL);
+ tor_free(old_entry);
+
+ if (state) {
+ *state = entry;
+ }
+}
+
+/* Remove every intro point state entry from cache that has been created
+ * before or at the cutoff. */
+static void
+cache_client_intro_state_clean(time_t cutoff,
+ hs_cache_client_intro_state_t *cache)
+{
+ tor_assert(cache);
+
+ DIGEST256MAP_FOREACH_MODIFY(cache->intro_points, key,
+ hs_cache_intro_state_t *, entry) {
+ if (entry->created_ts <= cutoff) {
+ cache_intro_state_free(entry);
+ MAP_DEL_CURRENT(key);
+ }
+ } DIGEST256MAP_FOREACH_END;
+}
+
+/* Return true iff no intro points are in this cache. */
+static int
+cache_client_intro_state_is_empty(const hs_cache_client_intro_state_t *cache)
+{
+ return digest256map_isempty(cache->intro_points);
+}
+
+/** Check whether <b>client_desc</b> is useful for us, and store it in the
+ * client-side HS cache if so. The client_desc is freed if we already have a
+ * fresher (higher revision counter count) in the cache. */
+static int
+cache_store_as_client(hs_cache_client_descriptor_t *client_desc)
+{
+ hs_cache_client_descriptor_t *cache_entry;
+
+ /* TODO: Heavy code duplication with cache_store_as_dir(). Consider
+ * refactoring and uniting! */
+
+ tor_assert(client_desc);
+
+ /* Check if we already have a descriptor from this HS in cache. If we do,
+ * check if this descriptor is newer than the cached one */
+ cache_entry = lookup_v3_desc_as_client(client_desc->key.pubkey);
+ if (cache_entry != NULL) {
+ /* If we have an entry in our cache that has a revision counter greater
+ * than the one we just fetched, discard the one we fetched. */
+ if (cache_entry->desc->plaintext_data.revision_counter >
+ client_desc->desc->plaintext_data.revision_counter) {
+ log_info(LD_REND, "We already have fresher descriptor. Ignoring.");
+ cache_client_desc_free(client_desc);
+ goto done;
+ }
+ /* Remove old entry. Make space for the new one! */
+ remove_v3_desc_as_client(cache_entry);
+ cache_client_desc_free(cache_entry);
+ }
+
+ /* Store descriptor in cache */
+ store_v3_desc_as_client(client_desc);
+
+ done:
+ return 0;
+}
+
+/* Clean the client cache using now as the current time. Return the total size
+ * of removed bytes from the cache. */
+static size_t
+cache_clean_v3_as_client(time_t now)
+{
+ size_t bytes_removed = 0;
+
+ if (!hs_cache_v3_client) { /* No cache to clean. Just return. */
+ return 0;
+ }
+
+ DIGEST256MAP_FOREACH_MODIFY(hs_cache_v3_client, key,
+ hs_cache_client_descriptor_t *, entry) {
+ size_t entry_size;
+ time_t cutoff = now - rend_cache_max_entry_lifetime();
+
+ /* If the entry has been created _after_ the cutoff, not expired so
+ * continue to the next entry in our v3 cache. */
+ if (entry->created_ts > cutoff) {
+ continue;
+ }
+ /* Here, our entry has expired, remove and free. */
+ MAP_DEL_CURRENT(key);
+ entry_size = cache_get_client_entry_size(entry);
+ bytes_removed += entry_size;
+ /* Entry is not in the cache anymore, destroy it. */
+ cache_client_desc_free(entry);
+ /* Update our OOM. We didn't use the remove() function because we are in
+ * a loop so we have to explicitely decrement. */
+ rend_cache_decrement_allocation(entry_size);
+ /* Logging. */
+ {
+ char key_b64[BASE64_DIGEST256_LEN + 1];
+ base64_encode(key_b64, sizeof(key_b64), (const char *) key,
+ DIGEST256_LEN, 0);
+ log_info(LD_REND, "Removing hidden service v3 descriptor '%s' "
+ "from client cache",
+ safe_str_client(key_b64));
+ }
+ } DIGEST256MAP_FOREACH_END;
+
+ return bytes_removed;
+}
+
+/** Public API: Given the HS ed25519 identity public key in <b>key</b>, return
+ * its HS descriptor if it's stored in our cache, or NULL if not. */
+const hs_descriptor_t *
+hs_cache_lookup_as_client(const ed25519_public_key_t *key)
+{
+ hs_cache_client_descriptor_t *cached_desc = NULL;
+
+ tor_assert(key);
+
+ cached_desc = lookup_v3_desc_as_client(key->pubkey);
+ if (cached_desc) {
+ tor_assert(cached_desc->desc);
+ return cached_desc->desc;
+ }
+
+ return NULL;
+}
+
+/** Public API: Given an encoded descriptor, store it in the client HS
+ * cache. Return -1 on error, 0 on success .*/
+int
+hs_cache_store_as_client(const char *desc_str,
+ const ed25519_public_key_t *identity_pk)
+{
+ hs_cache_client_descriptor_t *client_desc = NULL;
+
+ tor_assert(desc_str);
+ tor_assert(identity_pk);
+
+ /* Create client cache descriptor object */
+ client_desc = cache_client_desc_new(desc_str, identity_pk);
+ if (!client_desc) {
+ log_warn(LD_GENERAL, "Failed to parse received descriptor %s.",
+ escaped(desc_str));
+ goto err;
+ }
+
+ /* Push it to the cache */
+ if (cache_store_as_client(client_desc) < 0) {
+ goto err;
+ }
+
+ return 0;
+
+ err:
+ cache_client_desc_free(client_desc);
+ return -1;
+}
+
+/* Clean all client caches using the current time now. */
+void
+hs_cache_clean_as_client(time_t now)
+{
+ /* Start with v2 cache cleaning. */
+ rend_cache_clean(now, REND_CACHE_TYPE_CLIENT);
+ /* Now, clean the v3 cache. Set the cutoff to 0 telling the cleanup function
+ * to compute the cutoff by itself using the lifetime value. */
+ cache_clean_v3_as_client(now);
+}
+
+/* For a given service identity public key and an introduction authentication
+ * key, note the given failure in the client intro state cache. */
+void
+hs_cache_client_intro_state_note(const ed25519_public_key_t *service_pk,
+ const ed25519_public_key_t *auth_key,
+ rend_intro_point_failure_t failure)
+{
+ int found;
+ hs_cache_intro_state_t *entry;
+
+ tor_assert(service_pk);
+ tor_assert(auth_key);
+
+ found = cache_client_intro_state_lookup(service_pk, auth_key, &entry);
+ if (!found) {
+ /* Create a new entry and add it to the cache. */
+ cache_client_intro_state_add(service_pk, auth_key, &entry);
+ }
+ /* Note down the entry. */
+ cache_client_intro_state_note(entry, failure);
+}
+
+/* For a given service identity public key and an introduction authentication
+ * key, return true iff it is present in the failure cache. */
+const hs_cache_intro_state_t *
+hs_cache_client_intro_state_find(const ed25519_public_key_t *service_pk,
+ const ed25519_public_key_t *auth_key)
+{
+ hs_cache_intro_state_t *state = NULL;
+ cache_client_intro_state_lookup(service_pk, auth_key, &state);
+ return state;
+}
+
+/* Cleanup the client introduction state cache. */
+void
+hs_cache_client_intro_state_clean(time_t now)
+{
+ time_t cutoff = now - HS_CACHE_CLIENT_INTRO_STATE_MAX_AGE;
+
+ DIGEST256MAP_FOREACH_MODIFY(hs_cache_client_intro_state, key,
+ hs_cache_client_intro_state_t *, cache) {
+ /* Cleanup intro points failure. */
+ cache_client_intro_state_clean(cutoff, cache);
+
+ /* Is this cache empty for this service key? If yes, remove it from the
+ * cache. Else keep it. */
+ if (cache_client_intro_state_is_empty(cache)) {
+ cache_client_intro_state_free(cache);
+ MAP_DEL_CURRENT(key);
+ }
+ } DIGEST256MAP_FOREACH_END;
+}
+
+/**************** Generics *********************************/
+
/* Do a round of OOM cleanup on all directory caches. Return the amount of
* removed bytes. It is possible that the returned value is lower than
* min_remove_bytes if the caches get emptied out so the caller should be
@@ -367,10 +835,7 @@ hs_cache_handle_oom(time_t now, size_t min_remove_bytes)
return bytes_removed;
}
-/**
- * Return the maximum size of an HS descriptor we are willing to accept as an
- * HSDir.
- */
+/* Return the maximum size of a v3 HS descriptor. */
unsigned int
hs_cache_get_max_descriptor_size(void)
{
@@ -386,6 +851,12 @@ hs_cache_init(void)
/* Calling this twice is very wrong code flow. */
tor_assert(!hs_cache_v3_dir);
hs_cache_v3_dir = digest256map_new();
+
+ tor_assert(!hs_cache_v3_client);
+ hs_cache_v3_client = digest256map_new();
+
+ tor_assert(!hs_cache_client_intro_state);
+ hs_cache_client_intro_state = digest256map_new();
}
/* Cleanup the hidden service cache subsystem. */
@@ -394,5 +865,12 @@ hs_cache_free_all(void)
{
digest256map_free(hs_cache_v3_dir, cache_dir_desc_free_);
hs_cache_v3_dir = NULL;
+
+ digest256map_free(hs_cache_v3_client, cache_client_desc_free_);
+ hs_cache_v3_client = NULL;
+
+ digest256map_free(hs_cache_client_intro_state,
+ cache_client_intro_state_free_);
+ hs_cache_client_intro_state = NULL;
}
diff --git a/src/or/hs_cache.h b/src/or/hs_cache.h
index ed00424234..2a4d2dbb2f 100644
--- a/src/or/hs_cache.h
+++ b/src/or/hs_cache.h
@@ -15,8 +15,34 @@
#include "crypto_ed25519.h"
#include "hs_common.h"
#include "hs_descriptor.h"
+#include "rendcommon.h"
#include "torcert.h"
+/* This is the maximum time an introduction point state object can stay in the
+ * client cache in seconds (2 mins or 120 seconds). */
+#define HS_CACHE_CLIENT_INTRO_STATE_MAX_AGE (2 * 60)
+
+/* Introduction point state. */
+typedef struct hs_cache_intro_state_t {
+ /* When this entry was created and put in the cache. */
+ time_t created_ts;
+
+ /* Did it suffered a generic error? */
+ unsigned int error : 1;
+
+ /* Did it timed out? */
+ unsigned int timed_out : 1;
+
+ /* How many times we tried to reached it and it was unreachable. */
+ uint32_t unreachable_count;
+} hs_cache_intro_state_t;
+
+typedef struct hs_cache_client_intro_state_t {
+ /* Contains hs_cache_intro_state_t object indexed by introduction point
+ * authentication key. */
+ digest256map_t *intro_points;
+} hs_cache_client_intro_state_t;
+
/* Descriptor representation on the directory side which is a subset of
* information that the HSDir can decode and serve it. */
typedef struct hs_cache_dir_descriptor_t {
@@ -53,10 +79,44 @@ int hs_cache_store_as_dir(const char *desc);
int hs_cache_lookup_as_dir(uint32_t version, const char *query,
const char **desc_out);
+const hs_descriptor_t *
+hs_cache_lookup_as_client(const ed25519_public_key_t *key);
+int hs_cache_store_as_client(const char *desc_str,
+ const ed25519_public_key_t *identity_pk);
+void hs_cache_clean_as_client(time_t now);
+
+/* Client failure cache. */
+void hs_cache_client_intro_state_note(const ed25519_public_key_t *service_pk,
+ const ed25519_public_key_t *auth_key,
+ rend_intro_point_failure_t failure);
+const hs_cache_intro_state_t *hs_cache_client_intro_state_find(
+ const ed25519_public_key_t *service_pk,
+ const ed25519_public_key_t *auth_key);
+void hs_cache_client_intro_state_clean(time_t now);
+
#ifdef HS_CACHE_PRIVATE
+/** Represents a locally cached HS descriptor on a hidden service client. */
+typedef struct hs_cache_client_descriptor_t {
+ /* This object is indexed using the service identity public key */
+ ed25519_public_key_t key;
+
+ /* When was this entry created. Used to expire entries. */
+ time_t created_ts;
+
+ /* The cached descriptor, this object is the owner. It can't be NULL. A
+ * cache object without a valid descriptor is not possible. */
+ hs_descriptor_t *desc;
+
+ /* Encoded descriptor in string form. Can't be NULL. */
+ char *encoded_desc;
+} hs_cache_client_descriptor_t;
+
STATIC size_t cache_clean_v3_as_dir(time_t now, time_t global_cutoff);
+STATIC hs_cache_client_descriptor_t *
+lookup_v3_desc_as_client(const uint8_t *key);
+
#endif /* HS_CACHE_PRIVATE */
#endif /* TOR_HS_CACHE_H */
diff --git a/src/or/hs_cell.c b/src/or/hs_cell.c
new file mode 100644
index 0000000000..5244cfa3dd
--- /dev/null
+++ b/src/or/hs_cell.c
@@ -0,0 +1,948 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_cell.c
+ * \brief Hidden service API for cell creation and handling.
+ **/
+
+#include "or.h"
+#include "config.h"
+#include "rendservice.h"
+#include "replaycache.h"
+#include "util.h"
+
+#include "hs_cell.h"
+#include "hs_ntor.h"
+
+/* Trunnel. */
+#include "ed25519_cert.h"
+#include "hs/cell_common.h"
+#include "hs/cell_establish_intro.h"
+#include "hs/cell_introduce1.h"
+#include "hs/cell_rendezvous.h"
+
+/* Compute the MAC of an INTRODUCE cell in mac_out. The encoded_cell param is
+ * the cell content up to the ENCRYPTED section of length encoded_cell_len.
+ * The encrypted param is the start of the ENCRYPTED section of length
+ * encrypted_len. The mac_key is the key needed for the computation of the MAC
+ * derived from the ntor handshake of length mac_key_len.
+ *
+ * The length mac_out_len must be at least DIGEST256_LEN. */
+static void
+compute_introduce_mac(const uint8_t *encoded_cell, size_t encoded_cell_len,
+ const uint8_t *encrypted, size_t encrypted_len,
+ const uint8_t *mac_key, size_t mac_key_len,
+ uint8_t *mac_out, size_t mac_out_len)
+{
+ size_t offset = 0;
+ size_t mac_msg_len;
+ uint8_t mac_msg[RELAY_PAYLOAD_SIZE] = {0};
+
+ tor_assert(encoded_cell);
+ tor_assert(encrypted);
+ tor_assert(mac_key);
+ tor_assert(mac_out);
+ tor_assert(mac_out_len >= DIGEST256_LEN);
+
+ /* Compute the size of the message which is basically the entire cell until
+ * the MAC field of course. */
+ mac_msg_len = encoded_cell_len + (encrypted_len - DIGEST256_LEN);
+ tor_assert(mac_msg_len <= sizeof(mac_msg));
+
+ /* First, put the encoded cell in the msg. */
+ memcpy(mac_msg, encoded_cell, encoded_cell_len);
+ offset += encoded_cell_len;
+ /* Second, put the CLIENT_PK + ENCRYPTED_DATA but ommit the MAC field (which
+ * is junk at this point). */
+ memcpy(mac_msg + offset, encrypted, (encrypted_len - DIGEST256_LEN));
+ offset += (encrypted_len - DIGEST256_LEN);
+ tor_assert(offset == mac_msg_len);
+
+ crypto_mac_sha3_256(mac_out, mac_out_len,
+ mac_key, mac_key_len,
+ mac_msg, mac_msg_len);
+ memwipe(mac_msg, 0, sizeof(mac_msg));
+}
+
+/* From a set of keys, subcredential and the ENCRYPTED section of an
+ * INTRODUCE2 cell, return a newly allocated intro cell keys structure.
+ * Finally, the client public key is copied in client_pk. On error, return
+ * NULL. */
+static hs_ntor_intro_cell_keys_t *
+get_introduce2_key_material(const ed25519_public_key_t *auth_key,
+ const curve25519_keypair_t *enc_key,
+ const uint8_t *subcredential,
+ const uint8_t *encrypted_section,
+ curve25519_public_key_t *client_pk)
+{
+ hs_ntor_intro_cell_keys_t *keys;
+
+ tor_assert(auth_key);
+ tor_assert(enc_key);
+ tor_assert(subcredential);
+ tor_assert(encrypted_section);
+ tor_assert(client_pk);
+
+ keys = tor_malloc_zero(sizeof(*keys));
+
+ /* First bytes of the ENCRYPTED section are the client public key. */
+ memcpy(client_pk->public_key, encrypted_section, CURVE25519_PUBKEY_LEN);
+
+ if (hs_ntor_service_get_introduce1_keys(auth_key, enc_key, client_pk,
+ subcredential, keys) < 0) {
+ /* Don't rely on the caller to wipe this on error. */
+ memwipe(client_pk, 0, sizeof(curve25519_public_key_t));
+ tor_free(keys);
+ keys = NULL;
+ }
+ return keys;
+}
+
+/* Using the given encryption key, decrypt the encrypted_section of length
+ * encrypted_section_len of an INTRODUCE2 cell and return a newly allocated
+ * buffer containing the decrypted data. On decryption failure, NULL is
+ * returned. */
+static uint8_t *
+decrypt_introduce2(const uint8_t *enc_key, const uint8_t *encrypted_section,
+ size_t encrypted_section_len)
+{
+ uint8_t *decrypted = NULL;
+ crypto_cipher_t *cipher = NULL;
+
+ tor_assert(enc_key);
+ tor_assert(encrypted_section);
+
+ /* Decrypt ENCRYPTED section. */
+ cipher = crypto_cipher_new_with_bits((char *) enc_key,
+ CURVE25519_PUBKEY_LEN * 8);
+ tor_assert(cipher);
+
+ /* This is symmetric encryption so can't be bigger than the encrypted
+ * section length. */
+ decrypted = tor_malloc_zero(encrypted_section_len);
+ if (crypto_cipher_decrypt(cipher, (char *) decrypted,
+ (const char *) encrypted_section,
+ encrypted_section_len) < 0) {
+ tor_free(decrypted);
+ decrypted = NULL;
+ goto done;
+ }
+
+ done:
+ crypto_cipher_free(cipher);
+ return decrypted;
+}
+
+/* Given a pointer to the decrypted data of the ENCRYPTED section of an
+ * INTRODUCE2 cell of length decrypted_len, parse and validate the cell
+ * content. Return a newly allocated cell structure or NULL on error. The
+ * circuit and service object are only used for logging purposes. */
+static trn_cell_introduce_encrypted_t *
+parse_introduce2_encrypted(const uint8_t *decrypted_data,
+ size_t decrypted_len, const origin_circuit_t *circ,
+ const hs_service_t *service)
+{
+ trn_cell_introduce_encrypted_t *enc_cell = NULL;
+
+ tor_assert(decrypted_data);
+ tor_assert(circ);
+ tor_assert(service);
+
+ if (trn_cell_introduce_encrypted_parse(&enc_cell, decrypted_data,
+ decrypted_len) < 0) {
+ log_info(LD_REND, "Unable to parse the decrypted ENCRYPTED section of "
+ "the INTRODUCE2 cell on circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto err;
+ }
+
+ if (trn_cell_introduce_encrypted_get_onion_key_type(enc_cell) !=
+ HS_CELL_ONION_KEY_TYPE_NTOR) {
+ log_info(LD_REND, "INTRODUCE2 onion key type is invalid. Got %u but "
+ "expected %u on circuit %u for service %s",
+ trn_cell_introduce_encrypted_get_onion_key_type(enc_cell),
+ HS_CELL_ONION_KEY_TYPE_NTOR, TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto err;
+ }
+
+ if (trn_cell_introduce_encrypted_getlen_onion_key(enc_cell) !=
+ CURVE25519_PUBKEY_LEN) {
+ log_info(LD_REND, "INTRODUCE2 onion key length is invalid. Got %u but "
+ "expected %d on circuit %u for service %s",
+ (unsigned)trn_cell_introduce_encrypted_getlen_onion_key(enc_cell),
+ CURVE25519_PUBKEY_LEN, TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto err;
+ }
+ /* XXX: Validate NSPEC field as well. */
+
+ return enc_cell;
+ err:
+ trn_cell_introduce_encrypted_free(enc_cell);
+ return NULL;
+}
+
+/* Build a legacy ESTABLISH_INTRO cell with the given circuit nonce and RSA
+ * encryption key. The encoded cell is put in cell_out that MUST at least be
+ * of the size of RELAY_PAYLOAD_SIZE. Return the encoded cell length on
+ * success else a negative value and cell_out is untouched. */
+static ssize_t
+build_legacy_establish_intro(const char *circ_nonce, crypto_pk_t *enc_key,
+ uint8_t *cell_out)
+{
+ ssize_t cell_len;
+
+ tor_assert(circ_nonce);
+ tor_assert(enc_key);
+ tor_assert(cell_out);
+
+ memwipe(cell_out, 0, RELAY_PAYLOAD_SIZE);
+
+ cell_len = rend_service_encode_establish_intro_cell((char*)cell_out,
+ RELAY_PAYLOAD_SIZE,
+ enc_key, circ_nonce);
+ return cell_len;
+}
+
+/* Parse an INTRODUCE2 cell from payload of size payload_len for the given
+ * service and circuit which are used only for logging purposes. The resulting
+ * parsed cell is put in cell_ptr_out.
+ *
+ * This function only parses prop224 INTRODUCE2 cells even when the intro point
+ * is a legacy intro point. That's because intro points don't actually care
+ * about the contents of the introduce cell. Legacy INTRODUCE cells are only
+ * used by the legacy system now.
+ *
+ * Return 0 on success else a negative value and cell_ptr_out is untouched. */
+static int
+parse_introduce2_cell(const hs_service_t *service,
+ const origin_circuit_t *circ, const uint8_t *payload,
+ size_t payload_len,
+ trn_cell_introduce1_t **cell_ptr_out)
+{
+ trn_cell_introduce1_t *cell = NULL;
+
+ tor_assert(service);
+ tor_assert(circ);
+ tor_assert(payload);
+ tor_assert(cell_ptr_out);
+
+ /* Parse the cell so we can start cell validation. */
+ if (trn_cell_introduce1_parse(&cell, payload, payload_len) < 0) {
+ log_info(LD_PROTOCOL, "Unable to parse INTRODUCE2 cell on circuit %u "
+ "for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto err;
+ }
+
+ /* Success. */
+ *cell_ptr_out = cell;
+ return 0;
+ err:
+ return -1;
+}
+
+/* Set the onion public key onion_pk in cell, the encrypted section of an
+ * INTRODUCE1 cell. */
+static void
+introduce1_set_encrypted_onion_key(trn_cell_introduce_encrypted_t *cell,
+ const uint8_t *onion_pk)
+{
+ tor_assert(cell);
+ tor_assert(onion_pk);
+ /* There is only one possible key type for a non legacy cell. */
+ trn_cell_introduce_encrypted_set_onion_key_type(cell,
+ HS_CELL_ONION_KEY_TYPE_NTOR);
+ trn_cell_introduce_encrypted_set_onion_key_len(cell, CURVE25519_PUBKEY_LEN);
+ trn_cell_introduce_encrypted_setlen_onion_key(cell, CURVE25519_PUBKEY_LEN);
+ memcpy(trn_cell_introduce_encrypted_getarray_onion_key(cell), onion_pk,
+ trn_cell_introduce_encrypted_getlen_onion_key(cell));
+}
+
+/* Set the link specifiers in lspecs in cell, the encrypted section of an
+ * INTRODUCE1 cell. */
+static void
+introduce1_set_encrypted_link_spec(trn_cell_introduce_encrypted_t *cell,
+ const smartlist_t *lspecs)
+{
+ tor_assert(cell);
+ tor_assert(lspecs);
+ tor_assert(smartlist_len(lspecs) > 0);
+ tor_assert(smartlist_len(lspecs) <= UINT8_MAX);
+
+ uint8_t lspecs_num = (uint8_t) smartlist_len(lspecs);
+ trn_cell_introduce_encrypted_set_nspec(cell, lspecs_num);
+ /* We aren't duplicating the link specifiers object here which means that
+ * the ownership goes to the trn_cell_introduce_encrypted_t cell and those
+ * object will be freed when the cell is. */
+ SMARTLIST_FOREACH(lspecs, link_specifier_t *, ls,
+ trn_cell_introduce_encrypted_add_nspecs(cell, ls));
+}
+
+/* Set padding in the enc_cell only if needed that is the total length of both
+ * sections are below the mininum required for an INTRODUCE1 cell. */
+static void
+introduce1_set_encrypted_padding(const trn_cell_introduce1_t *cell,
+ trn_cell_introduce_encrypted_t *enc_cell)
+{
+ tor_assert(cell);
+ tor_assert(enc_cell);
+ /* This is the length we expect to have once encoded of the whole cell. */
+ ssize_t full_len = trn_cell_introduce1_encoded_len(cell) +
+ trn_cell_introduce_encrypted_encoded_len(enc_cell);
+ tor_assert(full_len > 0);
+ if (full_len < HS_CELL_INTRODUCE1_MIN_SIZE) {
+ size_t padding = HS_CELL_INTRODUCE1_MIN_SIZE - full_len;
+ trn_cell_introduce_encrypted_setlen_pad(enc_cell, padding);
+ memset(trn_cell_introduce_encrypted_getarray_pad(enc_cell), 0,
+ trn_cell_introduce_encrypted_getlen_pad(enc_cell));
+ }
+}
+
+/* Encrypt the ENCRYPTED payload and encode it in the cell using the enc_cell
+ * and the INTRODUCE1 data.
+ *
+ * This can't fail but it is very important that the caller sets every field
+ * in data so the computation of the INTRODUCE1 keys doesn't fail. */
+static void
+introduce1_encrypt_and_encode(trn_cell_introduce1_t *cell,
+ const trn_cell_introduce_encrypted_t *enc_cell,
+ const hs_cell_introduce1_data_t *data)
+{
+ size_t offset = 0;
+ ssize_t encrypted_len;
+ ssize_t encoded_cell_len, encoded_enc_cell_len;
+ uint8_t encoded_cell[RELAY_PAYLOAD_SIZE] = {0};
+ uint8_t encoded_enc_cell[RELAY_PAYLOAD_SIZE] = {0};
+ uint8_t *encrypted = NULL;
+ uint8_t mac[DIGEST256_LEN];
+ crypto_cipher_t *cipher = NULL;
+ hs_ntor_intro_cell_keys_t keys;
+
+ tor_assert(cell);
+ tor_assert(enc_cell);
+ tor_assert(data);
+
+ /* Encode the cells up to now of what we have to we can perform the MAC
+ * computation on it. */
+ encoded_cell_len = trn_cell_introduce1_encode(encoded_cell,
+ sizeof(encoded_cell), cell);
+ /* We have a much more serious issue if this isn't true. */
+ tor_assert(encoded_cell_len > 0);
+
+ encoded_enc_cell_len =
+ trn_cell_introduce_encrypted_encode(encoded_enc_cell,
+ sizeof(encoded_enc_cell), enc_cell);
+ /* We have a much more serious issue if this isn't true. */
+ tor_assert(encoded_enc_cell_len > 0);
+
+ /* Get the key material for the encryption. */
+ if (hs_ntor_client_get_introduce1_keys(data->auth_pk, data->enc_pk,
+ data->client_kp,
+ data->subcredential, &keys) < 0) {
+ tor_assert_unreached();
+ }
+
+ /* Prepare cipher with the encryption key just computed. */
+ cipher = crypto_cipher_new_with_bits((const char *) keys.enc_key,
+ sizeof(keys.enc_key) * 8);
+ tor_assert(cipher);
+
+ /* Compute the length of the ENCRYPTED section which is the CLIENT_PK,
+ * ENCRYPTED_DATA and MAC length. */
+ encrypted_len = sizeof(data->client_kp->pubkey) + encoded_enc_cell_len +
+ sizeof(mac);
+ tor_assert(encrypted_len < RELAY_PAYLOAD_SIZE);
+ encrypted = tor_malloc_zero(encrypted_len);
+
+ /* Put the CLIENT_PK first. */
+ memcpy(encrypted, data->client_kp->pubkey.public_key,
+ sizeof(data->client_kp->pubkey.public_key));
+ offset += sizeof(data->client_kp->pubkey.public_key);
+ /* Then encrypt and set the ENCRYPTED_DATA. This can't fail. */
+ crypto_cipher_encrypt(cipher, (char *) encrypted + offset,
+ (const char *) encoded_enc_cell, encoded_enc_cell_len);
+ crypto_cipher_free(cipher);
+ offset += encoded_enc_cell_len;
+ /* Compute MAC from the above and put it in the buffer. This function will
+ * make the adjustment to the encryptled_len to ommit the MAC length. */
+ compute_introduce_mac(encoded_cell, encoded_cell_len,
+ encrypted, encrypted_len,
+ keys.mac_key, sizeof(keys.mac_key),
+ mac, sizeof(mac));
+ memcpy(encrypted + offset, mac, sizeof(mac));
+ offset += sizeof(mac);
+ tor_assert(offset == (size_t) encrypted_len);
+
+ /* Set the ENCRYPTED section in the cell. */
+ trn_cell_introduce1_setlen_encrypted(cell, encrypted_len);
+ memcpy(trn_cell_introduce1_getarray_encrypted(cell),
+ encrypted, encrypted_len);
+
+ /* Cleanup. */
+ memwipe(&keys, 0, sizeof(keys));
+ memwipe(mac, 0, sizeof(mac));
+ memwipe(encrypted, 0, sizeof(encrypted_len));
+ memwipe(encoded_enc_cell, 0, sizeof(encoded_enc_cell));
+ tor_free(encrypted);
+}
+
+/* Using the INTRODUCE1 data, setup the ENCRYPTED section in cell. This means
+ * set it, encrypt it and encode it. */
+static void
+introduce1_set_encrypted(trn_cell_introduce1_t *cell,
+ const hs_cell_introduce1_data_t *data)
+{
+ trn_cell_introduce_encrypted_t *enc_cell;
+ trn_cell_extension_t *ext;
+
+ tor_assert(cell);
+ tor_assert(data);
+
+ enc_cell = trn_cell_introduce_encrypted_new();
+ tor_assert(enc_cell);
+
+ /* Set extension data. None are used. */
+ ext = trn_cell_extension_new();
+ tor_assert(ext);
+ trn_cell_extension_set_num(ext, 0);
+ trn_cell_introduce_encrypted_set_extensions(enc_cell, ext);
+
+ /* Set the rendezvous cookie. */
+ memcpy(trn_cell_introduce_encrypted_getarray_rend_cookie(enc_cell),
+ data->rendezvous_cookie, REND_COOKIE_LEN);
+
+ /* Set the onion public key. */
+ introduce1_set_encrypted_onion_key(enc_cell, data->onion_pk->public_key);
+
+ /* Set the link specifiers. */
+ introduce1_set_encrypted_link_spec(enc_cell, data->link_specifiers);
+
+ /* Set padding. */
+ introduce1_set_encrypted_padding(cell, enc_cell);
+
+ /* Encrypt and encode it in the cell. */
+ introduce1_encrypt_and_encode(cell, enc_cell, data);
+
+ /* Cleanup. */
+ trn_cell_introduce_encrypted_free(enc_cell);
+}
+
+/* Set the authentication key in the INTRODUCE1 cell from the given data. */
+static void
+introduce1_set_auth_key(trn_cell_introduce1_t *cell,
+ const hs_cell_introduce1_data_t *data)
+{
+ tor_assert(cell);
+ tor_assert(data);
+ /* There is only one possible type for a non legacy cell. */
+ trn_cell_introduce1_set_auth_key_type(cell, HS_INTRO_AUTH_KEY_TYPE_ED25519);
+ trn_cell_introduce1_set_auth_key_len(cell, ED25519_PUBKEY_LEN);
+ trn_cell_introduce1_setlen_auth_key(cell, ED25519_PUBKEY_LEN);
+ memcpy(trn_cell_introduce1_getarray_auth_key(cell),
+ data->auth_pk->pubkey, trn_cell_introduce1_getlen_auth_key(cell));
+}
+
+/* Set the legacy ID field in the INTRODUCE1 cell from the given data. */
+static void
+introduce1_set_legacy_id(trn_cell_introduce1_t *cell,
+ const hs_cell_introduce1_data_t *data)
+{
+ tor_assert(cell);
+ tor_assert(data);
+
+ if (data->is_legacy) {
+ uint8_t digest[DIGEST_LEN];
+ if (BUG(crypto_pk_get_digest(data->legacy_key, (char *) digest) < 0)) {
+ return;
+ }
+ memcpy(trn_cell_introduce1_getarray_legacy_key_id(cell),
+ digest, trn_cell_introduce1_getlen_legacy_key_id(cell));
+ } else {
+ /* We have to zeroed the LEGACY_KEY_ID field. */
+ memset(trn_cell_introduce1_getarray_legacy_key_id(cell), 0,
+ trn_cell_introduce1_getlen_legacy_key_id(cell));
+ }
+}
+
+/* ========== */
+/* Public API */
+/* ========== */
+
+/* Build an ESTABLISH_INTRO cell with the given circuit nonce and intro point
+ * object. The encoded cell is put in cell_out that MUST at least be of the
+ * size of RELAY_PAYLOAD_SIZE. Return the encoded cell length on success else
+ * a negative value and cell_out is untouched. This function also supports
+ * legacy cell creation. */
+ssize_t
+hs_cell_build_establish_intro(const char *circ_nonce,
+ const hs_service_intro_point_t *ip,
+ uint8_t *cell_out)
+{
+ ssize_t cell_len = -1;
+ uint16_t sig_len = ED25519_SIG_LEN;
+ trn_cell_extension_t *ext;
+ trn_cell_establish_intro_t *cell = NULL;
+
+ tor_assert(circ_nonce);
+ tor_assert(ip);
+
+ /* Quickly handle the legacy IP. */
+ if (ip->base.is_only_legacy) {
+ tor_assert(ip->legacy_key);
+ cell_len = build_legacy_establish_intro(circ_nonce, ip->legacy_key,
+ cell_out);
+ tor_assert(cell_len <= RELAY_PAYLOAD_SIZE);
+ /* Success or not we are done here. */
+ goto done;
+ }
+
+ /* Set extension data. None used here. */
+ ext = trn_cell_extension_new();
+ trn_cell_extension_set_num(ext, 0);
+ cell = trn_cell_establish_intro_new();
+ trn_cell_establish_intro_set_extensions(cell, ext);
+ /* Set signature size. Array is then allocated in the cell. We need to do
+ * this early so we can use trunnel API to get the signature length. */
+ trn_cell_establish_intro_set_sig_len(cell, sig_len);
+ trn_cell_establish_intro_setlen_sig(cell, sig_len);
+
+ /* Set AUTH_KEY_TYPE: 2 means ed25519 */
+ trn_cell_establish_intro_set_auth_key_type(cell,
+ HS_INTRO_AUTH_KEY_TYPE_ED25519);
+
+ /* Set AUTH_KEY and AUTH_KEY_LEN field. Must also set byte-length of
+ * AUTH_KEY to match */
+ {
+ uint16_t auth_key_len = ED25519_PUBKEY_LEN;
+ trn_cell_establish_intro_set_auth_key_len(cell, auth_key_len);
+ trn_cell_establish_intro_setlen_auth_key(cell, auth_key_len);
+ /* We do this call _after_ setting the length because it's reallocated at
+ * that point only. */
+ uint8_t *auth_key_ptr = trn_cell_establish_intro_getarray_auth_key(cell);
+ memcpy(auth_key_ptr, ip->auth_key_kp.pubkey.pubkey, auth_key_len);
+ }
+
+ /* Calculate HANDSHAKE_AUTH field (MAC). */
+ {
+ ssize_t tmp_cell_enc_len = 0;
+ ssize_t tmp_cell_mac_offset =
+ sig_len + sizeof(cell->sig_len) +
+ trn_cell_establish_intro_getlen_handshake_mac(cell);
+ uint8_t tmp_cell_enc[RELAY_PAYLOAD_SIZE] = {0};
+ uint8_t mac[TRUNNEL_SHA3_256_LEN], *handshake_ptr;
+
+ /* We first encode the current fields we have in the cell so we can
+ * compute the MAC using the raw bytes. */
+ tmp_cell_enc_len = trn_cell_establish_intro_encode(tmp_cell_enc,
+ sizeof(tmp_cell_enc),
+ cell);
+ if (BUG(tmp_cell_enc_len < 0)) {
+ goto done;
+ }
+ /* Sanity check. */
+ tor_assert(tmp_cell_enc_len > tmp_cell_mac_offset);
+
+ /* Circuit nonce is always DIGEST_LEN according to tor-spec.txt. */
+ crypto_mac_sha3_256(mac, sizeof(mac),
+ (uint8_t *) circ_nonce, DIGEST_LEN,
+ tmp_cell_enc, tmp_cell_enc_len - tmp_cell_mac_offset);
+ handshake_ptr = trn_cell_establish_intro_getarray_handshake_mac(cell);
+ memcpy(handshake_ptr, mac, sizeof(mac));
+
+ memwipe(mac, 0, sizeof(mac));
+ memwipe(tmp_cell_enc, 0, sizeof(tmp_cell_enc));
+ }
+
+ /* Calculate the cell signature SIG. */
+ {
+ ssize_t tmp_cell_enc_len = 0;
+ ssize_t tmp_cell_sig_offset = (sig_len + sizeof(cell->sig_len));
+ uint8_t tmp_cell_enc[RELAY_PAYLOAD_SIZE] = {0}, *sig_ptr;
+ ed25519_signature_t sig;
+
+ /* We first encode the current fields we have in the cell so we can
+ * compute the signature from the raw bytes of the cell. */
+ tmp_cell_enc_len = trn_cell_establish_intro_encode(tmp_cell_enc,
+ sizeof(tmp_cell_enc),
+ cell);
+ if (BUG(tmp_cell_enc_len < 0)) {
+ goto done;
+ }
+
+ if (ed25519_sign_prefixed(&sig, tmp_cell_enc,
+ tmp_cell_enc_len - tmp_cell_sig_offset,
+ ESTABLISH_INTRO_SIG_PREFIX, &ip->auth_key_kp)) {
+ log_warn(LD_BUG, "Unable to make signature for ESTABLISH_INTRO cell.");
+ goto done;
+ }
+ /* Copy the signature into the cell. */
+ sig_ptr = trn_cell_establish_intro_getarray_sig(cell);
+ memcpy(sig_ptr, sig.sig, sig_len);
+
+ memwipe(tmp_cell_enc, 0, sizeof(tmp_cell_enc));
+ }
+
+ /* Encode the cell. Can't be bigger than a standard cell. */
+ cell_len = trn_cell_establish_intro_encode(cell_out, RELAY_PAYLOAD_SIZE,
+ cell);
+
+ done:
+ trn_cell_establish_intro_free(cell);
+ return cell_len;
+}
+
+/* Parse the INTRO_ESTABLISHED cell in the payload of size payload_len. If we
+ * are successful at parsing it, return the length of the parsed cell else a
+ * negative value on error. */
+ssize_t
+hs_cell_parse_intro_established(const uint8_t *payload, size_t payload_len)
+{
+ ssize_t ret;
+ trn_cell_intro_established_t *cell = NULL;
+
+ tor_assert(payload);
+
+ /* Try to parse the payload into a cell making sure we do actually have a
+ * valid cell. */
+ ret = trn_cell_intro_established_parse(&cell, payload, payload_len);
+ if (ret >= 0) {
+ /* On success, we do not keep the cell, we just notify the caller that it
+ * was successfully parsed. */
+ trn_cell_intro_established_free(cell);
+ }
+ return ret;
+}
+
+/* Parsse the INTRODUCE2 cell using data which contains everything we need to
+ * do so and contains the destination buffers of information we extract and
+ * compute from the cell. Return 0 on success else a negative value. The
+ * service and circ are only used for logging purposes. */
+ssize_t
+hs_cell_parse_introduce2(hs_cell_introduce2_data_t *data,
+ const origin_circuit_t *circ,
+ const hs_service_t *service)
+{
+ int ret = -1;
+ time_t elapsed;
+ uint8_t *decrypted = NULL;
+ size_t encrypted_section_len;
+ const uint8_t *encrypted_section;
+ trn_cell_introduce1_t *cell = NULL;
+ trn_cell_introduce_encrypted_t *enc_cell = NULL;
+ hs_ntor_intro_cell_keys_t *intro_keys = NULL;
+
+ tor_assert(data);
+ tor_assert(circ);
+ tor_assert(service);
+
+ /* Parse the cell into a decoded data structure pointed by cell_ptr. */
+ if (parse_introduce2_cell(service, circ, data->payload, data->payload_len,
+ &cell) < 0) {
+ goto done;
+ }
+
+ log_info(LD_REND, "Received a decodable INTRODUCE2 cell on circuit %u "
+ "for service %s. Decoding encrypted section...",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+
+ encrypted_section = trn_cell_introduce1_getconstarray_encrypted(cell);
+ encrypted_section_len = trn_cell_introduce1_getlen_encrypted(cell);
+
+ /* Encrypted section must at least contain the CLIENT_PK and MAC which is
+ * defined in section 3.3.2 of the specification. */
+ if (encrypted_section_len < (CURVE25519_PUBKEY_LEN + DIGEST256_LEN)) {
+ log_info(LD_REND, "Invalid INTRODUCE2 encrypted section length "
+ "for service %s. Dropping cell.",
+ safe_str_client(service->onion_address));
+ goto done;
+ }
+
+ /* Check our replay cache for this introduction point. */
+ if (replaycache_add_test_and_elapsed(data->replay_cache, encrypted_section,
+ encrypted_section_len, &elapsed)) {
+ log_warn(LD_REND, "Possible replay detected! An INTRODUCE2 cell with the"
+ "same ENCRYPTED section was seen %ld seconds ago. "
+ "Dropping cell.", (long int) elapsed);
+ goto done;
+ }
+
+ /* Build the key material out of the key material found in the cell. */
+ intro_keys = get_introduce2_key_material(data->auth_pk, data->enc_kp,
+ data->subcredential,
+ encrypted_section,
+ &data->client_pk);
+ if (intro_keys == NULL) {
+ log_info(LD_REND, "Invalid INTRODUCE2 encrypted data. Unable to "
+ "compute key material on circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto done;
+ }
+
+ /* Validate MAC from the cell and our computed key material. The MAC field
+ * in the cell is at the end of the encrypted section. */
+ {
+ uint8_t mac[DIGEST256_LEN];
+ /* The MAC field is at the very end of the ENCRYPTED section. */
+ size_t mac_offset = encrypted_section_len - sizeof(mac);
+ /* Compute the MAC. Use the entire encoded payload with a length up to the
+ * ENCRYPTED section. */
+ compute_introduce_mac(data->payload,
+ data->payload_len - encrypted_section_len,
+ encrypted_section, encrypted_section_len,
+ intro_keys->mac_key, sizeof(intro_keys->mac_key),
+ mac, sizeof(mac));
+ if (tor_memcmp(mac, encrypted_section + mac_offset, sizeof(mac))) {
+ log_info(LD_REND, "Invalid MAC validation for INTRODUCE2 cell on "
+ "circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto done;
+ }
+ }
+
+ {
+ /* The ENCRYPTED_DATA section starts just after the CLIENT_PK. */
+ const uint8_t *encrypted_data =
+ encrypted_section + sizeof(data->client_pk);
+ /* It's symmetric encryption so it's correct to use the ENCRYPTED length
+ * for decryption. Computes the length of ENCRYPTED_DATA meaning removing
+ * the CLIENT_PK and MAC length. */
+ size_t encrypted_data_len =
+ encrypted_section_len - (sizeof(data->client_pk) + DIGEST256_LEN);
+
+ /* This decrypts the ENCRYPTED_DATA section of the cell. */
+ decrypted = decrypt_introduce2(intro_keys->enc_key,
+ encrypted_data, encrypted_data_len);
+ if (decrypted == NULL) {
+ log_info(LD_REND, "Unable to decrypt the ENCRYPTED section of an "
+ "INTRODUCE2 cell on circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto done;
+ }
+
+ /* Parse this blob into an encrypted cell structure so we can then extract
+ * the data we need out of it. */
+ enc_cell = parse_introduce2_encrypted(decrypted, encrypted_data_len,
+ circ, service);
+ memwipe(decrypted, 0, encrypted_data_len);
+ if (enc_cell == NULL) {
+ goto done;
+ }
+ }
+
+ /* XXX: Implement client authorization checks. */
+
+ /* Extract onion key and rendezvous cookie from the cell used for the
+ * rendezvous point circuit e2e encryption. */
+ memcpy(data->onion_pk.public_key,
+ trn_cell_introduce_encrypted_getconstarray_onion_key(enc_cell),
+ CURVE25519_PUBKEY_LEN);
+ memcpy(data->rendezvous_cookie,
+ trn_cell_introduce_encrypted_getconstarray_rend_cookie(enc_cell),
+ sizeof(data->rendezvous_cookie));
+
+ /* Extract rendezvous link specifiers. */
+ for (size_t idx = 0;
+ idx < trn_cell_introduce_encrypted_get_nspec(enc_cell); idx++) {
+ link_specifier_t *lspec =
+ trn_cell_introduce_encrypted_get_nspecs(enc_cell, idx);
+ smartlist_add(data->link_specifiers, hs_link_specifier_dup(lspec));
+ }
+
+ /* Success. */
+ ret = 0;
+ log_info(LD_REND, "Valid INTRODUCE2 cell. Launching rendezvous circuit.");
+
+ done:
+ if (intro_keys) {
+ memwipe(intro_keys, 0, sizeof(hs_ntor_intro_cell_keys_t));
+ tor_free(intro_keys);
+ }
+ tor_free(decrypted);
+ trn_cell_introduce_encrypted_free(enc_cell);
+ trn_cell_introduce1_free(cell);
+ return ret;
+}
+
+/* Build a RENDEZVOUS1 cell with the given rendezvous cookie and handshake
+ * info. The encoded cell is put in cell_out and the length of the data is
+ * returned. This can't fail. */
+ssize_t
+hs_cell_build_rendezvous1(const uint8_t *rendezvous_cookie,
+ size_t rendezvous_cookie_len,
+ const uint8_t *rendezvous_handshake_info,
+ size_t rendezvous_handshake_info_len,
+ uint8_t *cell_out)
+{
+ ssize_t cell_len;
+ trn_cell_rendezvous1_t *cell;
+
+ tor_assert(rendezvous_cookie);
+ tor_assert(rendezvous_handshake_info);
+ tor_assert(cell_out);
+
+ cell = trn_cell_rendezvous1_new();
+ /* Set the RENDEZVOUS_COOKIE. */
+ memcpy(trn_cell_rendezvous1_getarray_rendezvous_cookie(cell),
+ rendezvous_cookie, rendezvous_cookie_len);
+ /* Set the HANDSHAKE_INFO. */
+ trn_cell_rendezvous1_setlen_handshake_info(cell,
+ rendezvous_handshake_info_len);
+ memcpy(trn_cell_rendezvous1_getarray_handshake_info(cell),
+ rendezvous_handshake_info, rendezvous_handshake_info_len);
+ /* Encoding. */
+ cell_len = trn_cell_rendezvous1_encode(cell_out, RELAY_PAYLOAD_SIZE, cell);
+ tor_assert(cell_len > 0);
+
+ trn_cell_rendezvous1_free(cell);
+ return cell_len;
+}
+
+/* Build an INTRODUCE1 cell from the given data. The encoded cell is put in
+ * cell_out which must be of at least size RELAY_PAYLOAD_SIZE. On success, the
+ * encoded length is returned else a negative value and the content of
+ * cell_out should be ignored. */
+ssize_t
+hs_cell_build_introduce1(const hs_cell_introduce1_data_t *data,
+ uint8_t *cell_out)
+{
+ ssize_t cell_len;
+ trn_cell_introduce1_t *cell;
+ trn_cell_extension_t *ext;
+
+ tor_assert(data);
+ tor_assert(cell_out);
+
+ cell = trn_cell_introduce1_new();
+ tor_assert(cell);
+
+ /* Set extension data. None are used. */
+ ext = trn_cell_extension_new();
+ tor_assert(ext);
+ trn_cell_extension_set_num(ext, 0);
+ trn_cell_introduce1_set_extensions(cell, ext);
+
+ /* Set the legacy ID field. */
+ introduce1_set_legacy_id(cell, data);
+
+ /* Set the authentication key. */
+ introduce1_set_auth_key(cell, data);
+
+ /* Set the encrypted section. This will set, encrypt and encode the
+ * ENCRYPTED section in the cell. After this, we'll be ready to encode. */
+ introduce1_set_encrypted(cell, data);
+
+ /* Final encoding. */
+ cell_len = trn_cell_introduce1_encode(cell_out, RELAY_PAYLOAD_SIZE, cell);
+
+ trn_cell_introduce1_free(cell);
+ return cell_len;
+}
+
+/* Build an ESTABLISH_RENDEZVOUS cell from the given rendezvous_cookie. The
+ * encoded cell is put in cell_out which must be of at least
+ * RELAY_PAYLOAD_SIZE. On success, the encoded length is returned and the
+ * caller should clear up the content of the cell.
+ *
+ * This function can't fail. */
+ssize_t
+hs_cell_build_establish_rendezvous(const uint8_t *rendezvous_cookie,
+ uint8_t *cell_out)
+{
+ tor_assert(rendezvous_cookie);
+ tor_assert(cell_out);
+
+ memcpy(cell_out, rendezvous_cookie, HS_REND_COOKIE_LEN);
+ return HS_REND_COOKIE_LEN;
+}
+
+/* Handle an INTRODUCE_ACK cell encoded in payload of length payload_len.
+ * Return the status code on success else a negative value if the cell as not
+ * decodable. */
+int
+hs_cell_parse_introduce_ack(const uint8_t *payload, size_t payload_len)
+{
+ int ret = -1;
+ trn_cell_introduce_ack_t *cell = NULL;
+
+ tor_assert(payload);
+
+ /* If it is a legacy IP, rend-spec.txt specifies that a ACK is 0 byte and a
+ * NACK is 1 byte. We can't use the legacy function for this so we have to
+ * do a special case. */
+ if (payload_len <= 1) {
+ if (payload_len == 0) {
+ ret = HS_CELL_INTRO_ACK_SUCCESS;
+ } else {
+ ret = HS_CELL_INTRO_ACK_FAILURE;
+ }
+ goto end;
+ }
+
+ if (trn_cell_introduce_ack_parse(&cell, payload, payload_len) < 0) {
+ log_info(LD_REND, "Invalid INTRODUCE_ACK cell. Unable to parse it.");
+ goto end;
+ }
+
+ ret = trn_cell_introduce_ack_get_status(cell);
+
+ end:
+ trn_cell_introduce_ack_free(cell);
+ return ret;
+}
+
+/* Handle a RENDEZVOUS2 cell encoded in payload of length payload_len. On
+ * success, handshake_info contains the data in the HANDSHAKE_INFO field, and
+ * 0 is returned. On error, a negative value is returned. */
+int
+hs_cell_parse_rendezvous2(const uint8_t *payload, size_t payload_len,
+ uint8_t *handshake_info, size_t handshake_info_len)
+{
+ int ret = -1;
+ trn_cell_rendezvous2_t *cell = NULL;
+
+ tor_assert(payload);
+ tor_assert(handshake_info);
+
+ if (trn_cell_rendezvous2_parse(&cell, payload, payload_len) < 0) {
+ log_info(LD_REND, "Invalid RENDEZVOUS2 cell. Unable to parse it.");
+ goto end;
+ }
+
+ /* Static size, we should never have an issue with this else we messed up
+ * our code flow. */
+ tor_assert(trn_cell_rendezvous2_getlen_handshake_info(cell) ==
+ handshake_info_len);
+ memcpy(handshake_info,
+ trn_cell_rendezvous2_getconstarray_handshake_info(cell),
+ handshake_info_len);
+ ret = 0;
+
+ end:
+ trn_cell_rendezvous2_free(cell);
+ return ret;
+}
+
+/* Clear the given INTRODUCE1 data structure data. */
+void
+hs_cell_introduce1_data_clear(hs_cell_introduce1_data_t *data)
+{
+ if (data == NULL) {
+ return;
+ }
+ /* Object in this list have been moved to the cell object when building it
+ * so they've been freed earlier. We do that in order to avoid duplicating
+ * them leading to more memory and CPU time being used for nothing. */
+ smartlist_free(data->link_specifiers);
+ /* The data object has no ownership of any members. */
+ memwipe(data, 0, sizeof(hs_cell_introduce1_data_t));
+}
+
diff --git a/src/or/hs_cell.h b/src/or/hs_cell.h
new file mode 100644
index 0000000000..5136fce933
--- /dev/null
+++ b/src/or/hs_cell.h
@@ -0,0 +1,122 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_cell.h
+ * \brief Header file containing cell data for the whole HS subsytem.
+ **/
+
+#ifndef TOR_HS_CELL_H
+#define TOR_HS_CELL_H
+
+#include "or.h"
+#include "hs_service.h"
+
+/* An INTRODUCE1 cell requires at least this amount of bytes (see section
+ * 3.2.2 of the specification). Below this value, the cell must be padded. */
+#define HS_CELL_INTRODUCE1_MIN_SIZE 246
+
+/* Status code of an INTRODUCE_ACK cell. */
+typedef enum {
+ HS_CELL_INTRO_ACK_SUCCESS = 0x0000, /* Cell relayed to service. */
+ HS_CELL_INTRO_ACK_FAILURE = 0x0001, /* Service ID not recognized */
+ HS_CELL_INTRO_ACK_BADFMT = 0x0002, /* Bad message format */
+ HS_CELL_INTRO_ACK_NORELAY = 0x0003, /* Can't relay cell to service */
+} hs_cell_introd_ack_status_t;
+
+/* Onion key type found in the INTRODUCE1 cell. */
+typedef enum {
+ HS_CELL_ONION_KEY_TYPE_NTOR = 1,
+} hs_cell_onion_key_type_t;
+
+/* This data structure contains data that we need to build an INTRODUCE1 cell
+ * used by the INTRODUCE1 build function. */
+typedef struct hs_cell_introduce1_data_t {
+ /* Is this a legacy introduction point? */
+ unsigned int is_legacy : 1;
+ /* (Legacy only) The encryption key for a legacy intro point. Only set if
+ * is_legacy is true. */
+ const crypto_pk_t *legacy_key;
+ /* Introduction point authentication public key. */
+ const ed25519_public_key_t *auth_pk;
+ /* Introduction point encryption public key. */
+ const curve25519_public_key_t *enc_pk;
+ /* Subcredentials of the service. */
+ const uint8_t *subcredential;
+ /* Onion public key for the ntor handshake. */
+ const curve25519_public_key_t *onion_pk;
+ /* Rendezvous cookie. */
+ const uint8_t *rendezvous_cookie;
+ /* Public key put before the encrypted data (CLIENT_PK). */
+ const curve25519_keypair_t *client_kp;
+ /* Rendezvous point link specifiers. */
+ smartlist_t *link_specifiers;
+} hs_cell_introduce1_data_t;
+
+/* This data structure contains data that we need to parse an INTRODUCE2 cell
+ * which is used by the INTRODUCE2 cell parsing function. On a successful
+ * parsing, the onion_pk and rendezvous_cookie will be populated with the
+ * computed key material from the cell data. This structure is only used during
+ * INTRO2 parsing and discarded after that. */
+typedef struct hs_cell_introduce2_data_t {
+ /*** Immutable Section: Set on structure init. ***/
+
+ /* Introduction point authentication public key. Pointer owned by the
+ introduction point object through which we received the INTRO2 cell. */
+ const ed25519_public_key_t *auth_pk;
+ /* Introduction point encryption keypair for the ntor handshake. Pointer
+ owned by the introduction point object through which we received the
+ INTRO2 cell*/
+ const curve25519_keypair_t *enc_kp;
+ /* Subcredentials of the service. Pointer owned by the descriptor that owns
+ the introduction point through which we received the INTRO2 cell. */
+ const uint8_t *subcredential;
+ /* Payload of the received encoded cell. */
+ const uint8_t *payload;
+ /* Size of the payload of the received encoded cell. */
+ size_t payload_len;
+
+ /*** Mutable Section: Set upon parsing INTRODUCE2 cell. ***/
+
+ /* Onion public key computed using the INTRODUCE2 encrypted section. */
+ curve25519_public_key_t onion_pk;
+ /* Rendezvous cookie taken from the INTRODUCE2 encrypted section. */
+ uint8_t rendezvous_cookie[REND_COOKIE_LEN];
+ /* Client public key from the INTRODUCE2 encrypted section. */
+ curve25519_public_key_t client_pk;
+ /* Link specifiers of the rendezvous point. Contains link_specifier_t. */
+ smartlist_t *link_specifiers;
+ /* Replay cache of the introduction point. */
+ replaycache_t *replay_cache;
+} hs_cell_introduce2_data_t;
+
+/* Build cell API. */
+ssize_t hs_cell_build_establish_intro(const char *circ_nonce,
+ const hs_service_intro_point_t *ip,
+ uint8_t *cell_out);
+ssize_t hs_cell_build_rendezvous1(const uint8_t *rendezvous_cookie,
+ size_t rendezvous_cookie_len,
+ const uint8_t *rendezvous_handshake_info,
+ size_t rendezvous_handshake_info_len,
+ uint8_t *cell_out);
+ssize_t hs_cell_build_introduce1(const hs_cell_introduce1_data_t *data,
+ uint8_t *cell_out);
+ssize_t hs_cell_build_establish_rendezvous(const uint8_t *rendezvous_cookie,
+ uint8_t *cell_out);
+
+/* Parse cell API. */
+ssize_t hs_cell_parse_intro_established(const uint8_t *payload,
+ size_t payload_len);
+ssize_t hs_cell_parse_introduce2(hs_cell_introduce2_data_t *data,
+ const origin_circuit_t *circ,
+ const hs_service_t *service);
+int hs_cell_parse_introduce_ack(const uint8_t *payload, size_t payload_len);
+int hs_cell_parse_rendezvous2(const uint8_t *payload, size_t payload_len,
+ uint8_t *handshake_info,
+ size_t handshake_info_len);
+
+/* Util API. */
+void hs_cell_introduce1_data_clear(hs_cell_introduce1_data_t *data);
+
+#endif /* TOR_HS_CELL_H */
+
diff --git a/src/or/hs_circuit.c b/src/or/hs_circuit.c
new file mode 100644
index 0000000000..2bfeac747c
--- /dev/null
+++ b/src/or/hs_circuit.c
@@ -0,0 +1,1133 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_circuit.c
+ **/
+
+#include "or.h"
+#include "circpathbias.h"
+#include "circuitbuild.h"
+#include "circuitlist.h"
+#include "circuituse.h"
+#include "config.h"
+#include "policies.h"
+#include "relay.h"
+#include "rendservice.h"
+#include "rephist.h"
+#include "router.h"
+
+#include "hs_cell.h"
+#include "hs_circuit.h"
+#include "hs_ident.h"
+#include "hs_ntor.h"
+#include "hs_service.h"
+
+/* Trunnel. */
+#include "ed25519_cert.h"
+#include "hs/cell_common.h"
+#include "hs/cell_establish_intro.h"
+
+/* A circuit is about to become an e2e rendezvous circuit. Check
+ * <b>circ_purpose</b> and ensure that it's properly set. Return true iff
+ * circuit purpose is properly set, otherwise return false. */
+static int
+circuit_purpose_is_correct_for_rend(unsigned int circ_purpose,
+ int is_service_side)
+{
+ if (is_service_side) {
+ if (circ_purpose != CIRCUIT_PURPOSE_S_CONNECT_REND) {
+ log_warn(LD_BUG,
+ "HS e2e circuit setup with wrong purpose (%d)", circ_purpose);
+ return 0;
+ }
+ }
+
+ if (!is_service_side) {
+ if (circ_purpose != CIRCUIT_PURPOSE_C_REND_READY &&
+ circ_purpose != CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) {
+ log_warn(LD_BUG,
+ "Client e2e circuit setup with wrong purpose (%d)", circ_purpose);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+/* Create and return a crypt path for the final hop of a v3 prop224 rendezvous
+ * circuit. Initialize the crypt path crypto using the output material from the
+ * ntor key exchange at <b>ntor_key_seed</b>.
+ *
+ * If <b>is_service_side</b> is set, we are the hidden service and the final
+ * hop of the rendezvous circuit is the client on the other side. */
+static crypt_path_t *
+create_rend_cpath(const uint8_t *ntor_key_seed, size_t seed_len,
+ int is_service_side)
+{
+ uint8_t keys[HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN];
+ crypt_path_t *cpath = NULL;
+
+ /* Do the key expansion */
+ if (hs_ntor_circuit_key_expansion(ntor_key_seed, seed_len,
+ keys, sizeof(keys)) < 0) {
+ goto err;
+ }
+
+ /* Setup the cpath */
+ cpath = tor_malloc_zero(sizeof(crypt_path_t));
+ cpath->magic = CRYPT_PATH_MAGIC;
+
+ if (circuit_init_cpath_crypto(cpath, (char*)keys, sizeof(keys),
+ is_service_side, 1) < 0) {
+ tor_free(cpath);
+ goto err;
+ }
+
+ err:
+ memwipe(keys, 0, sizeof(keys));
+ return cpath;
+}
+
+/* We are a v2 legacy HS client: Create and return a crypt path for the hidden
+ * service on the other side of the rendezvous circuit <b>circ</b>. Initialize
+ * the crypt path crypto using the body of the RENDEZVOUS1 cell at
+ * <b>rend_cell_body</b> (which must be at least DH_KEY_LEN+DIGEST_LEN bytes).
+ */
+static crypt_path_t *
+create_rend_cpath_legacy(origin_circuit_t *circ, const uint8_t *rend_cell_body)
+{
+ crypt_path_t *hop = NULL;
+ char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN];
+
+ /* first DH_KEY_LEN bytes are g^y from the service. Finish the dh
+ * handshake...*/
+ tor_assert(circ->build_state);
+ tor_assert(circ->build_state->pending_final_cpath);
+ hop = circ->build_state->pending_final_cpath;
+
+ tor_assert(hop->rend_dh_handshake_state);
+ if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN, hop->rend_dh_handshake_state,
+ (char*)rend_cell_body, DH_KEY_LEN,
+ keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) {
+ log_warn(LD_GENERAL, "Couldn't complete DH handshake.");
+ goto err;
+ }
+ /* ... and set up cpath. */
+ if (circuit_init_cpath_crypto(hop,
+ keys+DIGEST_LEN, sizeof(keys)-DIGEST_LEN,
+ 0, 0) < 0)
+ goto err;
+
+ /* Check whether the digest is right... */
+ if (tor_memneq(keys, rend_cell_body+DH_KEY_LEN, DIGEST_LEN)) {
+ log_warn(LD_PROTOCOL, "Incorrect digest of key material.");
+ goto err;
+ }
+
+ /* clean up the crypto stuff we just made */
+ crypto_dh_free(hop->rend_dh_handshake_state);
+ hop->rend_dh_handshake_state = NULL;
+
+ goto done;
+
+ err:
+ hop = NULL;
+
+ done:
+ memwipe(keys, 0, sizeof(keys));
+ return hop;
+}
+
+/* Append the final <b>hop</b> to the cpath of the rend <b>circ</b>, and mark
+ * <b>circ</b> ready for use to transfer HS relay cells. */
+static void
+finalize_rend_circuit(origin_circuit_t *circ, crypt_path_t *hop,
+ int is_service_side)
+{
+ tor_assert(circ);
+ tor_assert(hop);
+
+ /* Notify the circuit state machine that we are splicing this circuit */
+ int new_circ_purpose = is_service_side ?
+ CIRCUIT_PURPOSE_S_REND_JOINED : CIRCUIT_PURPOSE_C_REND_JOINED;
+ circuit_change_purpose(TO_CIRCUIT(circ), new_circ_purpose);
+
+ /* All is well. Extend the circuit. */
+ hop->state = CPATH_STATE_OPEN;
+ /* Set the windows to default. */
+ hop->package_window = circuit_initial_package_window();
+ hop->deliver_window = CIRCWINDOW_START;
+
+ /* Now that this circuit has finished connecting to its destination,
+ * make sure circuit_get_open_circ_or_launch is willing to return it
+ * so we can actually use it. */
+ circ->hs_circ_has_timed_out = 0;
+
+ /* Append the hop to the cpath of this circuit */
+ onion_append_to_cpath(&circ->cpath, hop);
+
+ /* In legacy code, 'pending_final_cpath' points to the final hop we just
+ * appended to the cpath. We set the original pointer to NULL so that we
+ * don't double free it. */
+ if (circ->build_state) {
+ circ->build_state->pending_final_cpath = NULL;
+ }
+
+ /* Finally, mark circuit as ready to be used for client streams */
+ if (!is_service_side) {
+ circuit_try_attaching_streams(circ);
+ }
+}
+
+/* For a given circuit and a service introduction point object, register the
+ * intro circuit to the circuitmap. This supports legacy intro point. */
+static void
+register_intro_circ(const hs_service_intro_point_t *ip,
+ origin_circuit_t *circ)
+{
+ tor_assert(ip);
+ tor_assert(circ);
+
+ if (ip->base.is_only_legacy) {
+ uint8_t digest[DIGEST_LEN];
+ if (BUG(crypto_pk_get_digest(ip->legacy_key, (char *) digest) < 0)) {
+ return;
+ }
+ hs_circuitmap_register_intro_circ_v2_service_side(circ, digest);
+ } else {
+ hs_circuitmap_register_intro_circ_v3_service_side(circ,
+ &ip->auth_key_kp.pubkey);
+ }
+}
+
+/* Return the number of opened introduction circuit for the given circuit that
+ * is matching its identity key. */
+static unsigned int
+count_opened_desc_intro_point_circuits(const hs_service_t *service,
+ const hs_service_descriptor_t *desc)
+{
+ unsigned int count = 0;
+
+ tor_assert(service);
+ tor_assert(desc);
+
+ DIGEST256MAP_FOREACH(desc->intro_points.map, key,
+ const hs_service_intro_point_t *, ip) {
+ const circuit_t *circ;
+ const origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
+ if (ocirc == NULL) {
+ continue;
+ }
+ circ = TO_CIRCUIT(ocirc);
+ tor_assert(circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
+ circ->purpose == CIRCUIT_PURPOSE_S_INTRO);
+ /* Having a circuit not for the requested service is really bad. */
+ tor_assert(ed25519_pubkey_eq(&service->keys.identity_pk,
+ &ocirc->hs_ident->identity_pk));
+ /* Only count opened circuit and skip circuit that will be closed. */
+ if (!circ->marked_for_close && circ->state == CIRCUIT_STATE_OPEN) {
+ count++;
+ }
+ } DIGEST256MAP_FOREACH_END;
+ return count;
+}
+
+/* From a given service, rendezvous cookie and handshake info, create a
+ * rendezvous point circuit identifier. This can't fail. */
+static hs_ident_circuit_t *
+create_rp_circuit_identifier(const hs_service_t *service,
+ const uint8_t *rendezvous_cookie,
+ const curve25519_public_key_t *server_pk,
+ const hs_ntor_rend_cell_keys_t *keys)
+{
+ hs_ident_circuit_t *ident;
+ uint8_t handshake_info[CURVE25519_PUBKEY_LEN + DIGEST256_LEN];
+
+ tor_assert(service);
+ tor_assert(rendezvous_cookie);
+ tor_assert(server_pk);
+ tor_assert(keys);
+
+ ident = hs_ident_circuit_new(&service->keys.identity_pk,
+ HS_IDENT_CIRCUIT_RENDEZVOUS);
+ /* Copy the RENDEZVOUS_COOKIE which is the unique identifier. */
+ memcpy(ident->rendezvous_cookie, rendezvous_cookie,
+ sizeof(ident->rendezvous_cookie));
+ /* Build the HANDSHAKE_INFO which looks like this:
+ * SERVER_PK [32 bytes]
+ * AUTH_INPUT_MAC [32 bytes]
+ */
+ memcpy(handshake_info, server_pk->public_key, CURVE25519_PUBKEY_LEN);
+ memcpy(handshake_info + CURVE25519_PUBKEY_LEN, keys->rend_cell_auth_mac,
+ DIGEST256_LEN);
+ tor_assert(sizeof(ident->rendezvous_handshake_info) ==
+ sizeof(handshake_info));
+ memcpy(ident->rendezvous_handshake_info, handshake_info,
+ sizeof(ident->rendezvous_handshake_info));
+ /* Finally copy the NTOR_KEY_SEED for e2e encryption on the circuit. */
+ tor_assert(sizeof(ident->rendezvous_ntor_key_seed) ==
+ sizeof(keys->ntor_key_seed));
+ memcpy(ident->rendezvous_ntor_key_seed, keys->ntor_key_seed,
+ sizeof(ident->rendezvous_ntor_key_seed));
+ return ident;
+}
+
+/* From a given service and service intro point, create an introduction point
+ * circuit identifier. This can't fail. */
+static hs_ident_circuit_t *
+create_intro_circuit_identifier(const hs_service_t *service,
+ const hs_service_intro_point_t *ip)
+{
+ hs_ident_circuit_t *ident;
+
+ tor_assert(service);
+ tor_assert(ip);
+
+ ident = hs_ident_circuit_new(&service->keys.identity_pk,
+ HS_IDENT_CIRCUIT_INTRO);
+ ed25519_pubkey_copy(&ident->intro_auth_pk, &ip->auth_key_kp.pubkey);
+
+ return ident;
+}
+
+/* For a given introduction point and an introduction circuit, send the
+ * ESTABLISH_INTRO cell. The service object is used for logging. This can fail
+ * and if so, the circuit is closed and the intro point object is flagged
+ * that the circuit is not established anymore which is important for the
+ * retry mechanism. */
+static void
+send_establish_intro(const hs_service_t *service,
+ hs_service_intro_point_t *ip, origin_circuit_t *circ)
+{
+ ssize_t cell_len;
+ uint8_t payload[RELAY_PAYLOAD_SIZE];
+
+ tor_assert(service);
+ tor_assert(ip);
+ tor_assert(circ);
+
+ /* Encode establish intro cell. */
+ cell_len = hs_cell_build_establish_intro(circ->cpath->prev->rend_circ_nonce,
+ ip, payload);
+ if (cell_len < 0) {
+ log_warn(LD_REND, "Unable to encode ESTABLISH_INTRO cell for service %s "
+ "on circuit %u. Closing circuit.",
+ safe_str_client(service->onion_address),
+ TO_CIRCUIT(circ)->n_circ_id);
+ goto err;
+ }
+
+ /* Send the cell on the circuit. */
+ if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ),
+ RELAY_COMMAND_ESTABLISH_INTRO,
+ (char *) payload, cell_len,
+ circ->cpath->prev) < 0) {
+ log_info(LD_REND, "Unable to send ESTABLISH_INTRO cell for service %s "
+ "on circuit %u.",
+ safe_str_client(service->onion_address),
+ TO_CIRCUIT(circ)->n_circ_id);
+ /* On error, the circuit has been closed. */
+ goto done;
+ }
+
+ /* Record the attempt to use this circuit. */
+ pathbias_count_use_attempt(circ);
+ goto done;
+
+ err:
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
+ done:
+ memwipe(payload, 0, sizeof(payload));
+}
+
+/* For a given service, the ntor onion key and a rendezvous cookie, launch a
+ * circuit to the rendezvous point specified by the link specifiers. On
+ * success, a circuit identifier is attached to the circuit with the needed
+ * data. This function will try to open a circuit for a maximum value of
+ * MAX_REND_FAILURES then it will give up. */
+static void
+launch_rendezvous_point_circuit(const hs_service_t *service,
+ const hs_service_intro_point_t *ip,
+ const hs_cell_introduce2_data_t *data)
+{
+ int circ_needs_uptime;
+ time_t now = time(NULL);
+ extend_info_t *info = NULL;
+ origin_circuit_t *circ;
+
+ tor_assert(service);
+ tor_assert(ip);
+ tor_assert(data);
+
+ circ_needs_uptime = hs_service_requires_uptime_circ(service->config.ports);
+
+ /* Get the extend info data structure for the chosen rendezvous point
+ * specified by the given link specifiers. */
+ info = hs_get_extend_info_from_lspecs(data->link_specifiers,
+ &data->onion_pk,
+ service->config.is_single_onion);
+ if (info == NULL) {
+ /* We are done here, we can't extend to the rendezvous point. */
+ goto end;
+ }
+
+ for (int i = 0; i < MAX_REND_FAILURES; i++) {
+ int circ_flags = CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_IS_INTERNAL;
+ if (circ_needs_uptime) {
+ circ_flags |= CIRCLAUNCH_NEED_UPTIME;
+ }
+ /* Firewall and policies are checked when getting the extend info. */
+ if (service->config.is_single_onion) {
+ circ_flags |= CIRCLAUNCH_ONEHOP_TUNNEL;
+ }
+
+ circ = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND, info,
+ circ_flags);
+ if (circ != NULL) {
+ /* Stop retrying, we have a circuit! */
+ break;
+ }
+ }
+ if (circ == NULL) {
+ log_warn(LD_REND, "Giving up on launching rendezvous circuit to %s "
+ "for service %s",
+ safe_str_client(extend_info_describe(info)),
+ safe_str_client(service->onion_address));
+ goto end;
+ }
+ log_info(LD_REND, "Rendezvous circuit launched to %s with cookie %s "
+ "for service %s",
+ safe_str_client(extend_info_describe(info)),
+ safe_str_client(hex_str((const char *) data->rendezvous_cookie,
+ REND_COOKIE_LEN)),
+ safe_str_client(service->onion_address));
+ tor_assert(circ->build_state);
+ /* Rendezvous circuit have a specific timeout for the time spent on trying
+ * to connect to the rendezvous point. */
+ circ->build_state->expiry_time = now + MAX_REND_TIMEOUT;
+
+ /* Create circuit identifier and key material. */
+ {
+ hs_ntor_rend_cell_keys_t keys;
+ curve25519_keypair_t ephemeral_kp;
+ /* No need for extra strong, this is only for this circuit life time. This
+ * key will be used for the RENDEZVOUS1 cell that will be sent on the
+ * circuit once opened. */
+ curve25519_keypair_generate(&ephemeral_kp, 0);
+ if (hs_ntor_service_get_rendezvous1_keys(&ip->auth_key_kp.pubkey,
+ &ip->enc_key_kp,
+ &ephemeral_kp, &data->client_pk,
+ &keys) < 0) {
+ /* This should not really happened but just in case, don't make tor
+ * freak out, close the circuit and move on. */
+ log_info(LD_REND, "Unable to get RENDEZVOUS1 key material for "
+ "service %s",
+ safe_str_client(service->onion_address));
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
+ goto end;
+ }
+ circ->hs_ident = create_rp_circuit_identifier(service,
+ data->rendezvous_cookie,
+ &ephemeral_kp.pubkey, &keys);
+ memwipe(&ephemeral_kp, 0, sizeof(ephemeral_kp));
+ memwipe(&keys, 0, sizeof(keys));
+ tor_assert(circ->hs_ident);
+ }
+
+ end:
+ extend_info_free(info);
+}
+
+/* Return true iff the given service rendezvous circuit circ is allowed for a
+ * relaunch to the rendezvous point. */
+static int
+can_relaunch_service_rendezvous_point(const origin_circuit_t *circ)
+{
+ tor_assert(circ);
+ /* This is initialized when allocating an origin circuit. */
+ tor_assert(circ->build_state);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
+
+ /* XXX: Retrying under certain condition. This is related to #22455. */
+
+ /* Avoid to relaunch twice a circuit to the same rendezvous point at the
+ * same time. */
+ if (circ->hs_service_side_rend_circ_has_been_relaunched) {
+ log_info(LD_REND, "Rendezvous circuit to %s has already been retried. "
+ "Skipping retry.",
+ safe_str_client(
+ extend_info_describe(circ->build_state->chosen_exit)));
+ goto disallow;
+ }
+
+ /* A failure count that has reached maximum allowed or circuit that expired,
+ * we skip relaunching. */
+ if (circ->build_state->failure_count > MAX_REND_FAILURES ||
+ circ->build_state->expiry_time <= time(NULL)) {
+ log_info(LD_REND, "Attempt to build a rendezvous circuit to %s has "
+ "failed with %d attempts and expiry time %ld. "
+ "Giving up building.",
+ safe_str_client(
+ extend_info_describe(circ->build_state->chosen_exit)),
+ circ->build_state->failure_count,
+ (long int) circ->build_state->expiry_time);
+ goto disallow;
+ }
+
+ /* Allowed to relaunch. */
+ return 1;
+ disallow:
+ return 0;
+}
+
+/* Retry the rendezvous point of circ by launching a new circuit to it. */
+static void
+retry_service_rendezvous_point(const origin_circuit_t *circ)
+{
+ int flags = 0;
+ origin_circuit_t *new_circ;
+ cpath_build_state_t *bstate;
+
+ tor_assert(circ);
+ /* This is initialized when allocating an origin circuit. */
+ tor_assert(circ->build_state);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
+
+ /* Ease our life. */
+ bstate = circ->build_state;
+
+ log_info(LD_REND, "Retrying rendezvous point circuit to %s",
+ safe_str_client(extend_info_describe(bstate->chosen_exit)));
+
+ /* Get the current build state flags for the next circuit. */
+ flags |= (bstate->need_uptime) ? CIRCLAUNCH_NEED_UPTIME : 0;
+ flags |= (bstate->need_capacity) ? CIRCLAUNCH_NEED_CAPACITY : 0;
+ flags |= (bstate->is_internal) ? CIRCLAUNCH_IS_INTERNAL : 0;
+
+ /* We do NOT add the onehop tunnel flag even though it might be a single
+ * onion service. The reason is that if we failed once to connect to the RP
+ * with a direct connection, we consider that chances are that we will fail
+ * again so try a 3-hop circuit and hope for the best. Because the service
+ * has no anonymity (single onion), this change of behavior won't affect
+ * security directly. */
+
+ new_circ = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_CONNECT_REND,
+ bstate->chosen_exit, flags);
+ if (new_circ == NULL) {
+ log_warn(LD_REND, "Failed to launch rendezvous circuit to %s",
+ safe_str_client(extend_info_describe(bstate->chosen_exit)));
+ goto done;
+ }
+
+ /* Transfer build state information to the new circuit state in part to
+ * catch any other failures. */
+ new_circ->build_state->failure_count = bstate->failure_count++;
+ new_circ->build_state->expiry_time = bstate->expiry_time;
+ new_circ->hs_ident = hs_ident_circuit_dup(circ->hs_ident);
+
+ done:
+ return;
+}
+
+/* Using an extend info object ei, set all possible link specifiers in lspecs.
+ * IPv4, legacy ID and ed25519 ID are mandatory thus MUST be present in ei. */
+static void
+get_lspecs_from_extend_info(const extend_info_t *ei, smartlist_t *lspecs)
+{
+ link_specifier_t *ls;
+
+ tor_assert(ei);
+ tor_assert(lspecs);
+
+ /* IPv4 is mandatory. */
+ ls = link_specifier_new();
+ link_specifier_set_ls_type(ls, LS_IPV4);
+ link_specifier_set_un_ipv4_addr(ls, tor_addr_to_ipv4h(&ei->addr));
+ link_specifier_set_un_ipv4_port(ls, ei->port);
+ /* Four bytes IPv4 and two bytes port. */
+ link_specifier_set_ls_len(ls, sizeof(ei->addr.addr.in_addr) +
+ sizeof(ei->port));
+ smartlist_add(lspecs, ls);
+
+ /* Legacy ID is mandatory. */
+ ls = link_specifier_new();
+ link_specifier_set_ls_type(ls, LS_LEGACY_ID);
+ memcpy(link_specifier_getarray_un_legacy_id(ls), ei->identity_digest,
+ link_specifier_getlen_un_legacy_id(ls));
+ link_specifier_set_ls_len(ls, link_specifier_getlen_un_legacy_id(ls));
+ smartlist_add(lspecs, ls);
+
+ /* ed25519 ID is mandatory. */
+ ls = link_specifier_new();
+ link_specifier_set_ls_type(ls, LS_ED25519_ID);
+ memcpy(link_specifier_getarray_un_ed25519_id(ls), &ei->ed_identity,
+ link_specifier_getlen_un_ed25519_id(ls));
+ link_specifier_set_ls_len(ls, link_specifier_getlen_un_ed25519_id(ls));
+ smartlist_add(lspecs, ls);
+
+ /* XXX: IPv6 is not clearly a thing in extend_info_t? */
+}
+
+/* Using the given descriptor intro point ip, the extend information of the
+ * rendezvous point rp_ei and the service's subcredential, populate the
+ * already allocated intro1_data object with the needed key material and link
+ * specifiers.
+ *
+ * This can't fail but the ip MUST be a valid object containing the needed
+ * keys and authentication method. */
+static void
+setup_introduce1_data(const hs_desc_intro_point_t *ip,
+ const extend_info_t *rp_ei,
+ const uint8_t *subcredential,
+ hs_cell_introduce1_data_t *intro1_data)
+{
+ smartlist_t *rp_lspecs;
+
+ tor_assert(ip);
+ tor_assert(rp_ei);
+ tor_assert(subcredential);
+ tor_assert(intro1_data);
+
+ /* Build the link specifiers from the extend information of the rendezvous
+ * circuit that we've picked previously. */
+ rp_lspecs = smartlist_new();
+ get_lspecs_from_extend_info(rp_ei, rp_lspecs);
+
+ /* Populate the introduce1 data object. */
+ memset(intro1_data, 0, sizeof(hs_cell_introduce1_data_t));
+ if (ip->legacy.key != NULL) {
+ intro1_data->is_legacy = 1;
+ intro1_data->legacy_key = ip->legacy.key;
+ }
+ intro1_data->auth_pk = &ip->auth_key_cert->signed_key;
+ intro1_data->enc_pk = &ip->enc_key;
+ intro1_data->subcredential = subcredential;
+ intro1_data->onion_pk = &rp_ei->curve25519_onion_key;
+ intro1_data->link_specifiers = rp_lspecs;
+}
+
+/* ========== */
+/* Public API */
+/* ========== */
+
+/* Return an introduction point circuit matching the given intro point object.
+ * NULL is returned is no such circuit can be found. */
+origin_circuit_t *
+hs_circ_service_get_intro_circ(const hs_service_intro_point_t *ip)
+{
+ origin_circuit_t *circ = NULL;
+
+ tor_assert(ip);
+
+ if (ip->base.is_only_legacy) {
+ uint8_t digest[DIGEST_LEN];
+ if (BUG(crypto_pk_get_digest(ip->legacy_key, (char *) digest) < 0)) {
+ goto end;
+ }
+ circ = hs_circuitmap_get_intro_circ_v2_service_side(digest);
+ } else {
+ circ = hs_circuitmap_get_intro_circ_v3_service_side(
+ &ip->auth_key_kp.pubkey);
+ }
+ end:
+ return circ;
+}
+
+/* Called when we fail building a rendezvous circuit at some point other than
+ * the last hop: launches a new circuit to the same rendezvous point. This
+ * supports legacy service.
+ *
+ * We currently relaunch connections to rendezvous points if:
+ * - A rendezvous circuit timed out before connecting to RP.
+ * - The redenzvous circuit failed to connect to the RP.
+ *
+ * We avoid relaunching a connection to this rendezvous point if:
+ * - We have already tried MAX_REND_FAILURES times to connect to this RP.
+ * - We've been trying to connect to this RP for more than MAX_REND_TIMEOUT
+ * seconds
+ * - We've already retried this specific rendezvous circuit.
+ */
+void
+hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ)
+{
+ tor_assert(circ);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
+
+ /* Check if we are allowed to relaunch to the rendezvous point of circ. */
+ if (!can_relaunch_service_rendezvous_point(circ)) {
+ goto done;
+ }
+
+ /* Flag the circuit that we are relaunching so to avoid to relaunch twice a
+ * circuit to the same rendezvous point at the same time. */
+ circ->hs_service_side_rend_circ_has_been_relaunched = 1;
+
+ /* Legacy service don't have an hidden service ident. */
+ if (circ->hs_ident) {
+ retry_service_rendezvous_point(circ);
+ } else {
+ rend_service_relaunch_rendezvous(circ);
+ }
+
+ done:
+ return;
+}
+
+/* For a given service and a service intro point, launch a circuit to the
+ * extend info ei. If the service is a single onion, a one-hop circuit will be
+ * requested. Return 0 if the circuit was successfully launched and tagged
+ * with the correct identifier. On error, a negative value is returned. */
+int
+hs_circ_launch_intro_point(hs_service_t *service,
+ const hs_service_intro_point_t *ip,
+ extend_info_t *ei)
+{
+ /* Standard flags for introduction circuit. */
+ int ret = -1, circ_flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL;
+ origin_circuit_t *circ;
+
+ tor_assert(service);
+ tor_assert(ip);
+ tor_assert(ei);
+
+ /* Update circuit flags in case of a single onion service that requires a
+ * direct connection. */
+ if (service->config.is_single_onion) {
+ circ_flags |= CIRCLAUNCH_ONEHOP_TUNNEL;
+ }
+
+ log_info(LD_REND, "Launching a circuit to intro point %s for service %s.",
+ safe_str_client(extend_info_describe(ei)),
+ safe_str_client(service->onion_address));
+
+ /* Note down the launch for the retry period. Even if the circuit fails to
+ * be launched, we still want to respect the retry period to avoid stress on
+ * the circuit subsystem. */
+ service->state.num_intro_circ_launched++;
+ circ = circuit_launch_by_extend_info(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO,
+ ei, circ_flags);
+ if (circ == NULL) {
+ goto end;
+ }
+
+ /* Setup the circuit identifier and attach it to it. */
+ circ->hs_ident = create_intro_circuit_identifier(service, ip);
+ tor_assert(circ->hs_ident);
+ /* Register circuit in the global circuitmap. */
+ register_intro_circ(ip, circ);
+
+ /* Success. */
+ ret = 0;
+ end:
+ return ret;
+}
+
+/* Called when a service introduction point circuit is done building. Given
+ * the service and intro point object, this function will send the
+ * ESTABLISH_INTRO cell on the circuit. Return 0 on success. Return 1 if the
+ * circuit has been repurposed to General because we already have too many
+ * opened. */
+int
+hs_circ_service_intro_has_opened(hs_service_t *service,
+ hs_service_intro_point_t *ip,
+ const hs_service_descriptor_t *desc,
+ origin_circuit_t *circ)
+{
+ int ret = 0;
+ unsigned int num_intro_circ, num_needed_circ;
+
+ tor_assert(service);
+ tor_assert(ip);
+ tor_assert(desc);
+ tor_assert(circ);
+
+ /* Cound opened circuits that have sent ESTABLISH_INTRO cells or are already
+ * established introduction circuits */
+ num_intro_circ = count_opened_desc_intro_point_circuits(service, desc);
+ num_needed_circ = service->config.num_intro_points;
+ if (num_intro_circ > num_needed_circ) {
+ /* There are too many opened valid intro circuit for what the service
+ * needs so repurpose this one. */
+
+ /* XXX: Legacy code checks options->ExcludeNodes and if not NULL it just
+ * closes the circuit. I have NO idea why it does that so it hasn't been
+ * added here. I can only assume in case our ExcludeNodes list changes but
+ * in that case, all circuit are flagged unusable (config.c). --dgoulet */
+
+ log_info(LD_CIRC | LD_REND, "Introduction circuit just opened but we "
+ "have enough for service %s. Repurposing "
+ "it to general and leaving internal.",
+ safe_str_client(service->onion_address));
+ tor_assert(circ->build_state->is_internal);
+ /* Remove it from the circuitmap. */
+ hs_circuitmap_remove_circuit(TO_CIRCUIT(circ));
+ /* Cleaning up the hidden service identifier and repurpose. */
+ hs_ident_circuit_free(circ->hs_ident);
+ circ->hs_ident = NULL;
+ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_GENERAL);
+ /* Inform that this circuit just opened for this new purpose. */
+ circuit_has_opened(circ);
+ /* This return value indicate to the caller that the IP object should be
+ * removed from the service because it's corresponding circuit has just
+ * been repurposed. */
+ ret = 1;
+ goto done;
+ }
+
+ log_info(LD_REND, "Introduction circuit %u established for service %s.",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ circuit_log_path(LOG_INFO, LD_REND, circ);
+
+ /* Time to send an ESTABLISH_INTRO cell on this circuit. On error, this call
+ * makes sure the circuit gets closed. */
+ send_establish_intro(service, ip, circ);
+
+ done:
+ return ret;
+}
+
+/* Called when a service rendezvous point circuit is done building. Given the
+ * service and the circuit, this function will send a RENDEZVOUS1 cell on the
+ * circuit using the information in the circuit identifier. If the cell can't
+ * be sent, the circuit is closed. */
+void
+hs_circ_service_rp_has_opened(const hs_service_t *service,
+ origin_circuit_t *circ)
+{
+ size_t payload_len;
+ uint8_t payload[RELAY_PAYLOAD_SIZE] = {0};
+
+ tor_assert(service);
+ tor_assert(circ);
+ tor_assert(circ->hs_ident);
+
+ /* Some useful logging. */
+ log_info(LD_REND, "Rendezvous circuit %u has opened with cookie %s "
+ "for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ hex_str((const char *) circ->hs_ident->rendezvous_cookie,
+ REND_COOKIE_LEN),
+ safe_str_client(service->onion_address));
+ circuit_log_path(LOG_INFO, LD_REND, circ);
+
+ /* This can't fail. */
+ payload_len = hs_cell_build_rendezvous1(
+ circ->hs_ident->rendezvous_cookie,
+ sizeof(circ->hs_ident->rendezvous_cookie),
+ circ->hs_ident->rendezvous_handshake_info,
+ sizeof(circ->hs_ident->rendezvous_handshake_info),
+ payload);
+
+ if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ),
+ RELAY_COMMAND_RENDEZVOUS1,
+ (const char *) payload, payload_len,
+ circ->cpath->prev) < 0) {
+ /* On error, circuit is closed. */
+ log_warn(LD_REND, "Unable to send RENDEZVOUS1 cell on circuit %u "
+ "for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto done;
+ }
+
+ /* Setup end-to-end rendezvous circuit between the client and us. */
+ if (hs_circuit_setup_e2e_rend_circ(circ,
+ circ->hs_ident->rendezvous_ntor_key_seed,
+ sizeof(circ->hs_ident->rendezvous_ntor_key_seed),
+ 1) < 0) {
+ log_warn(LD_GENERAL, "Failed to setup circ");
+ goto done;
+ }
+
+ done:
+ memwipe(payload, 0, sizeof(payload));
+}
+
+/* Circ has been expecting an INTRO_ESTABLISHED cell that just arrived. Handle
+ * the INTRO_ESTABLISHED cell payload of length payload_len arriving on the
+ * given introduction circuit circ. The service is only used for logging
+ * purposes. Return 0 on success else a negative value. */
+int
+hs_circ_handle_intro_established(const hs_service_t *service,
+ const hs_service_intro_point_t *ip,
+ origin_circuit_t *circ,
+ const uint8_t *payload, size_t payload_len)
+{
+ int ret = -1;
+
+ tor_assert(service);
+ tor_assert(ip);
+ tor_assert(circ);
+ tor_assert(payload);
+
+ if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO)) {
+ goto done;
+ }
+
+ /* Try to parse the payload into a cell making sure we do actually have a
+ * valid cell. For a legacy node, it's an empty payload so as long as we
+ * have the cell, we are good. */
+ if (!ip->base.is_only_legacy &&
+ hs_cell_parse_intro_established(payload, payload_len) < 0) {
+ log_warn(LD_REND, "Unable to parse the INTRO_ESTABLISHED cell on "
+ "circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto done;
+ }
+
+ /* Switch the purpose to a fully working intro point. */
+ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_S_INTRO);
+ /* Getting a valid INTRODUCE_ESTABLISHED means we've successfully used the
+ * circuit so update our pathbias subsystem. */
+ pathbias_mark_use_success(circ);
+ /* Success. */
+ ret = 0;
+
+ done:
+ return ret;
+}
+
+/* We just received an INTRODUCE2 cell on the established introduction circuit
+ * circ. Handle the INTRODUCE2 payload of size payload_len for the given
+ * circuit and service. This cell is associated with the intro point object ip
+ * and the subcredential. Return 0 on success else a negative value. */
+int
+hs_circ_handle_introduce2(const hs_service_t *service,
+ const origin_circuit_t *circ,
+ hs_service_intro_point_t *ip,
+ const uint8_t *subcredential,
+ const uint8_t *payload, size_t payload_len)
+{
+ int ret = -1;
+ time_t elapsed;
+ hs_cell_introduce2_data_t data;
+
+ tor_assert(service);
+ tor_assert(circ);
+ tor_assert(ip);
+ tor_assert(subcredential);
+ tor_assert(payload);
+
+ /* Populate the data structure with everything we need for the cell to be
+ * parsed, decrypted and key material computed correctly. */
+ data.auth_pk = &ip->auth_key_kp.pubkey;
+ data.enc_kp = &ip->enc_key_kp;
+ data.subcredential = subcredential;
+ data.payload = payload;
+ data.payload_len = payload_len;
+ data.link_specifiers = smartlist_new();
+ data.replay_cache = ip->replay_cache;
+
+ if (hs_cell_parse_introduce2(&data, circ, service) < 0) {
+ goto done;
+ }
+
+ /* Check whether we've seen this REND_COOKIE before to detect repeats. */
+ if (replaycache_add_test_and_elapsed(
+ service->state.replay_cache_rend_cookie,
+ data.rendezvous_cookie, sizeof(data.rendezvous_cookie),
+ &elapsed)) {
+ /* A Tor client will send a new INTRODUCE1 cell with the same REND_COOKIE
+ * as its previous one if its intro circ times out while in state
+ * CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT. If we received the first
+ * INTRODUCE1 cell (the intro-point relay converts it into an INTRODUCE2
+ * cell), we are already trying to connect to that rend point (and may
+ * have already succeeded); drop this cell. */
+ log_info(LD_REND, "We received an INTRODUCE2 cell with same REND_COOKIE "
+ "field %ld seconds ago. Dropping cell.",
+ (long int) elapsed);
+ goto done;
+ }
+
+ /* At this point, we just confirmed that the full INTRODUCE2 cell is valid
+ * so increment our counter that we've seen one on this intro point. */
+ ip->introduce2_count++;
+
+ /* Launch rendezvous circuit with the onion key and rend cookie. */
+ launch_rendezvous_point_circuit(service, ip, &data);
+ /* Success. */
+ ret = 0;
+
+ done:
+ SMARTLIST_FOREACH(data.link_specifiers, link_specifier_t *, lspec,
+ link_specifier_free(lspec));
+ smartlist_free(data.link_specifiers);
+ memwipe(&data, 0, sizeof(data));
+ return ret;
+}
+
+/* Circuit <b>circ</b> just finished the rend ntor key exchange. Use the key
+ * exchange output material at <b>ntor_key_seed</b> and setup <b>circ</b> to
+ * serve as a rendezvous end-to-end circuit between the client and the
+ * service. If <b>is_service_side</b> is set, then we are the hidden service
+ * and the other side is the client.
+ *
+ * Return 0 if the operation went well; in case of error return -1. */
+int
+hs_circuit_setup_e2e_rend_circ(origin_circuit_t *circ,
+ const uint8_t *ntor_key_seed, size_t seed_len,
+ int is_service_side)
+{
+ if (BUG(!circuit_purpose_is_correct_for_rend(TO_CIRCUIT(circ)->purpose,
+ is_service_side))) {
+ return -1;
+ }
+
+ crypt_path_t *hop = create_rend_cpath(ntor_key_seed, seed_len,
+ is_service_side);
+ if (!hop) {
+ log_warn(LD_REND, "Couldn't get v3 %s cpath!",
+ is_service_side ? "service-side" : "client-side");
+ return -1;
+ }
+
+ finalize_rend_circuit(circ, hop, is_service_side);
+
+ return 0;
+}
+
+/* We are a v2 legacy HS client and we just received a RENDEZVOUS1 cell
+ * <b>rend_cell_body</b> on <b>circ</b>. Finish up the DH key exchange and then
+ * extend the crypt path of <b>circ</b> so that the hidden service is on the
+ * other side. */
+int
+hs_circuit_setup_e2e_rend_circ_legacy_client(origin_circuit_t *circ,
+ const uint8_t *rend_cell_body)
+{
+
+ if (BUG(!circuit_purpose_is_correct_for_rend(
+ TO_CIRCUIT(circ)->purpose, 0))) {
+ return -1;
+ }
+
+ crypt_path_t *hop = create_rend_cpath_legacy(circ, rend_cell_body);
+ if (!hop) {
+ log_warn(LD_GENERAL, "Couldn't get v2 cpath.");
+ return -1;
+ }
+
+ finalize_rend_circuit(circ, hop, 0);
+
+ return 0;
+}
+
+/* Given the introduction circuit intro_circ, the rendezvous circuit
+ * rend_circ, a descriptor intro point object ip and the service's
+ * subcredential, send an INTRODUCE1 cell on intro_circ.
+ *
+ * This will also setup the circuit identifier on rend_circ containing the key
+ * material for the handshake and e2e encryption. Return 0 on success else
+ * negative value. Because relay_send_command_from_edge() closes the circuit
+ * on error, it is possible that intro_circ is closed on error. */
+int
+hs_circ_send_introduce1(origin_circuit_t *intro_circ,
+ origin_circuit_t *rend_circ,
+ const hs_desc_intro_point_t *ip,
+ const uint8_t *subcredential)
+{
+ int ret = -1;
+ ssize_t payload_len;
+ uint8_t payload[RELAY_PAYLOAD_SIZE] = {0};
+ hs_cell_introduce1_data_t intro1_data;
+
+ tor_assert(intro_circ);
+ tor_assert(rend_circ);
+ tor_assert(ip);
+ tor_assert(subcredential);
+
+ /* This takes various objects in order to populate the introduce1 data
+ * object which is used to build the content of the cell. */
+ setup_introduce1_data(ip, rend_circ->build_state->chosen_exit,
+ subcredential, &intro1_data);
+
+ /* Final step before we encode a cell, we setup the circuit identifier which
+ * will generate both the rendezvous cookie and client keypair for this
+ * connection. Those are put in the ident. */
+ intro1_data.rendezvous_cookie = rend_circ->hs_ident->rendezvous_cookie;
+ intro1_data.client_kp = &rend_circ->hs_ident->rendezvous_client_kp;
+
+ memcpy(intro_circ->hs_ident->rendezvous_cookie,
+ rend_circ->hs_ident->rendezvous_cookie,
+ sizeof(intro_circ->hs_ident->rendezvous_cookie));
+
+ /* From the introduce1 data object, this will encode the INTRODUCE1 cell
+ * into payload which is then ready to be sent as is. */
+ payload_len = hs_cell_build_introduce1(&intro1_data, payload);
+ if (BUG(payload_len < 0)) {
+ goto done;
+ }
+
+ if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(intro_circ),
+ RELAY_COMMAND_INTRODUCE1,
+ (const char *) payload, payload_len,
+ intro_circ->cpath->prev) < 0) {
+ /* On error, circuit is closed. */
+ log_warn(LD_REND, "Unable to send INTRODUCE1 cell on circuit %u.",
+ TO_CIRCUIT(intro_circ)->n_circ_id);
+ goto done;
+ }
+
+ /* Success. */
+ ret = 0;
+ goto done;
+
+ done:
+ hs_cell_introduce1_data_clear(&intro1_data);
+ memwipe(payload, 0, sizeof(payload));
+ return ret;
+}
+
+/* Send an ESTABLISH_RENDEZVOUS cell along the rendezvous circuit circ. On
+ * success, 0 is returned else -1 and the circuit is marked for close. */
+int
+hs_circ_send_establish_rendezvous(origin_circuit_t *circ)
+{
+ ssize_t cell_len = 0;
+ uint8_t cell[RELAY_PAYLOAD_SIZE] = {0};
+
+ tor_assert(circ);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND);
+
+ log_info(LD_REND, "Send an ESTABLISH_RENDEZVOUS cell on circuit %u",
+ TO_CIRCUIT(circ)->n_circ_id);
+
+ /* Set timestamp_dirty, because circuit_expire_building expects it,
+ * and the rend cookie also means we've used the circ. */
+ TO_CIRCUIT(circ)->timestamp_dirty = time(NULL);
+
+ /* We've attempted to use this circuit. Probe it if we fail */
+ pathbias_count_use_attempt(circ);
+
+ /* Generate the RENDEZVOUS_COOKIE and place it in the identifier so we can
+ * complete the handshake when receiving the acknowledgement. */
+ crypto_rand((char *) circ->hs_ident->rendezvous_cookie, HS_REND_COOKIE_LEN);
+ /* Generate the client keypair. No need to be extra strong, not long term */
+ curve25519_keypair_generate(&circ->hs_ident->rendezvous_client_kp, 0);
+
+ cell_len =
+ hs_cell_build_establish_rendezvous(circ->hs_ident->rendezvous_cookie,
+ cell);
+ if (BUG(cell_len < 0)) {
+ goto err;
+ }
+
+ if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ),
+ RELAY_COMMAND_ESTABLISH_RENDEZVOUS,
+ (const char *) cell, cell_len,
+ circ->cpath->prev) < 0) {
+ /* Circuit has been marked for close */
+ log_warn(LD_REND, "Unable to send ESTABLISH_RENDEZVOUS cell on "
+ "circuit %u", TO_CIRCUIT(circ)->n_circ_id);
+ memwipe(cell, 0, cell_len);
+ goto err;
+ }
+
+ memwipe(cell, 0, cell_len);
+ return 0;
+ err:
+ return -1;
+}
+
diff --git a/src/or/hs_circuit.h b/src/or/hs_circuit.h
new file mode 100644
index 0000000000..3b0e3aca1c
--- /dev/null
+++ b/src/or/hs_circuit.h
@@ -0,0 +1,63 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_circuit.h
+ * \brief Header file containing circuit data for the whole HS subsytem.
+ **/
+
+#ifndef TOR_HS_CIRCUIT_H
+#define TOR_HS_CIRCUIT_H
+
+#include "or.h"
+#include "crypto.h"
+#include "crypto_ed25519.h"
+
+#include "hs_service.h"
+
+/* Circuit API. */
+int hs_circ_service_intro_has_opened(hs_service_t *service,
+ hs_service_intro_point_t *ip,
+ const hs_service_descriptor_t *desc,
+ origin_circuit_t *circ);
+void hs_circ_service_rp_has_opened(const hs_service_t *service,
+ origin_circuit_t *circ);
+int hs_circ_launch_intro_point(hs_service_t *service,
+ const hs_service_intro_point_t *ip,
+ extend_info_t *ei);
+int hs_circ_launch_rendezvous_point(const hs_service_t *service,
+ const curve25519_public_key_t *onion_key,
+ const uint8_t *rendezvous_cookie);
+void hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ);
+
+origin_circuit_t *hs_circ_service_get_intro_circ(
+ const hs_service_intro_point_t *ip);
+
+/* Cell API. */
+int hs_circ_handle_intro_established(const hs_service_t *service,
+ const hs_service_intro_point_t *ip,
+ origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len);
+int hs_circ_handle_introduce2(const hs_service_t *service,
+ const origin_circuit_t *circ,
+ hs_service_intro_point_t *ip,
+ const uint8_t *subcredential,
+ const uint8_t *payload, size_t payload_len);
+int hs_circ_send_introduce1(origin_circuit_t *intro_circ,
+ origin_circuit_t *rend_circ,
+ const hs_desc_intro_point_t *ip,
+ const uint8_t *subcredential);
+int hs_circ_send_establish_rendezvous(origin_circuit_t *circ);
+
+/* e2e circuit API. */
+
+int hs_circuit_setup_e2e_rend_circ(origin_circuit_t *circ,
+ const uint8_t *ntor_key_seed,
+ size_t seed_len,
+ int is_service_side);
+int hs_circuit_setup_e2e_rend_circ_legacy_client(origin_circuit_t *circ,
+ const uint8_t *rend_cell_body);
+
+#endif /* TOR_HS_CIRCUIT_H */
+
diff --git a/src/or/hs_circuitmap.c b/src/or/hs_circuitmap.c
index ea66fb5194..09704d796c 100644
--- a/src/or/hs_circuitmap.c
+++ b/src/or/hs_circuitmap.c
@@ -5,8 +5,10 @@
* \file hs_circuitmap.c
*
* \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.
+ * introduction and rendezvous circuits; it's used:
+ * (a) by relays acting as intro points and rendezvous points
+ * (b) by hidden services to find intro and rend circuits and
+ * (c) by HS clients to find rendezvous circuits.
**/
#define HS_CIRCUITMAP_PRIVATE
@@ -404,6 +406,37 @@ hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie)
return circ;
}
+/* Public function: Return client-side rendezvous circuit with rendezvous
+ * <b>cookie</b>. It will first lookup for the CIRCUIT_PURPOSE_C_REND_READY
+ * purpose and then try for CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED and then
+ * finally tries for CIRCUIT_PURPOSE_C_ESTABLISH_REND.
+ *
+ * Return NULL if no such circuit is found in the circuitmap. */
+origin_circuit_t *
+hs_circuitmap_get_rend_circ_client_side(const uint8_t *cookie)
+{
+ origin_circuit_t *circ = NULL;
+
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_C_REND_READY);
+ if (circ) {
+ return circ;
+ }
+
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED);
+ if (circ) {
+ return circ;
+ }
+
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_C_ESTABLISH_REND);
+ return circ;
+}
+
/**** Public servide-side setters: */
/* Public function: Register v2 intro circuit with key <b>digest</b> to the
@@ -439,6 +472,21 @@ hs_circuitmap_register_rend_circ_service_side(origin_circuit_t *circ,
REND_TOKEN_LEN, cookie);
}
+/* Public function: Register rendezvous circuit with key <b>cookie</b> to the
+ * client-side circuitmap. */
+void
+hs_circuitmap_register_rend_circ_client_side(origin_circuit_t *or_circ,
+ const uint8_t *cookie)
+{
+ circuit_t *circ = TO_CIRCUIT(or_circ);
+ { /* Basic circ purpose sanity checking */
+ tor_assert_nonfatal(circ->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND);
+ }
+
+ hs_circuitmap_register_circuit(circ, HS_TOKEN_REND_CLIENT_SIDE,
+ REND_TOKEN_LEN, cookie);
+}
+
/**** Misc public functions: */
/** Public function: Remove this circuit from the HS circuitmap. Clear its HS
diff --git a/src/or/hs_circuitmap.h b/src/or/hs_circuitmap.h
index 33d5b64117..0903de2347 100644
--- a/src/or/hs_circuitmap.h
+++ b/src/or/hs_circuitmap.h
@@ -43,6 +43,8 @@ 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);
+struct origin_circuit_t *
+hs_circuitmap_get_rend_circ_client_side(const uint8_t *cookie);
void hs_circuitmap_register_intro_circ_v2_service_side(
struct origin_circuit_t *circ,
@@ -53,6 +55,9 @@ void hs_circuitmap_register_intro_circ_v3_service_side(
void hs_circuitmap_register_rend_circ_service_side(
struct origin_circuit_t *circ,
const uint8_t *cookie);
+void hs_circuitmap_register_rend_circ_client_side(
+ struct origin_circuit_t *circ,
+ const uint8_t *cookie);
void hs_circuitmap_remove_circuit(struct circuit_t *circ);
@@ -76,6 +81,9 @@ typedef enum {
HS_TOKEN_INTRO_V2_SERVICE_SIDE,
/** A v3 introduction point pubkey on a hidden service (256bit) */
HS_TOKEN_INTRO_V3_SERVICE_SIDE,
+
+ /** A rendezvous cookie on the client side (128bit) */
+ HS_TOKEN_REND_CLIENT_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_client.c b/src/or/hs_client.c
new file mode 100644
index 0000000000..99be058eb7
--- /dev/null
+++ b/src/or/hs_client.c
@@ -0,0 +1,1253 @@
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_client.c
+ * \brief Implement next generation hidden service client functionality
+ **/
+
+#include "or.h"
+#include "hs_circuit.h"
+#include "hs_ident.h"
+#include "connection_edge.h"
+#include "container.h"
+#include "rendclient.h"
+#include "hs_descriptor.h"
+#include "hs_cache.h"
+#include "hs_cell.h"
+#include "hs_ident.h"
+#include "config.h"
+#include "directory.h"
+#include "hs_client.h"
+#include "router.h"
+#include "routerset.h"
+#include "circuitlist.h"
+#include "circuituse.h"
+#include "connection.h"
+#include "circpathbias.h"
+#include "connection.h"
+#include "hs_ntor.h"
+#include "circuitbuild.h"
+
+/* Get all connections that are waiting on a circuit and flag them back to
+ * waiting for a hidden service descriptor for the given service key
+ * service_identity_pk. */
+static void
+flag_all_conn_wait_desc(const ed25519_public_key_t *service_identity_pk)
+{
+ tor_assert(service_identity_pk);
+
+ smartlist_t *conns =
+ connection_list_by_type_state(CONN_TYPE_AP, AP_CONN_STATE_CIRCUIT_WAIT);
+
+ SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
+ edge_connection_t *edge_conn;
+ if (BUG(!CONN_IS_EDGE(conn))) {
+ continue;
+ }
+ edge_conn = TO_EDGE_CONN(conn);
+ if (edge_conn->hs_ident &&
+ ed25519_pubkey_eq(&edge_conn->hs_ident->identity_pk,
+ service_identity_pk)) {
+ connection_ap_mark_as_non_pending_circuit(TO_ENTRY_CONN(conn));
+ conn->state = AP_CONN_STATE_RENDDESC_WAIT;
+ }
+ } SMARTLIST_FOREACH_END(conn);
+
+ smartlist_free(conns);
+}
+
+/* Remove tracked HSDir requests from our history for this hidden service
+ * identity public key. */
+static void
+purge_hid_serv_request(const ed25519_public_key_t *identity_pk)
+{
+ char base64_blinded_pk[ED25519_BASE64_LEN + 1];
+ ed25519_public_key_t blinded_pk;
+
+ tor_assert(identity_pk);
+
+ /* Get blinded pubkey of hidden service. It is possible that we just moved
+ * to a new time period meaning that we won't be able to purge the request
+ * from the previous time period. That is fine because they will expire at
+ * some point and we don't care about those anymore. */
+ hs_build_blinded_pubkey(identity_pk, NULL, 0,
+ hs_get_time_period_num(approx_time()), &blinded_pk);
+ if (BUG(ed25519_public_to_base64(base64_blinded_pk, &blinded_pk) < 0)) {
+ return;
+ }
+ /* Purge last hidden service request from cache for this blinded key. */
+ hs_purge_hid_serv_from_last_hid_serv_requests(base64_blinded_pk);
+}
+
+/* A v3 HS circuit successfully connected to the hidden service. Update the
+ * stream state at <b>hs_conn_ident</b> appropriately. */
+static void
+note_connection_attempt_succeeded(const hs_ident_edge_conn_t *hs_conn_ident)
+{
+ tor_assert(hs_conn_ident);
+
+ /* Remove from the hid serv cache all requests for that service so we can
+ * query the HSDir again later on for various reasons. */
+ purge_hid_serv_request(&hs_conn_ident->identity_pk);
+
+ /* The v2 subsystem cleans up the intro point time out flag at this stage.
+ * We don't try to do it here because we still need to keep intact the intro
+ * point state for future connections. Even though we are able to connect to
+ * the service, doesn't mean we should reset the timed out intro points.
+ *
+ * It is not possible to have successfully connected to an intro point
+ * present in our cache that was on error or timed out. Every entry in that
+ * cache have a 2 minutes lifetime so ultimately the intro point(s) state
+ * will be reset and thus possible to be retried. */
+}
+
+/* Given the pubkey of a hidden service in <b>onion_identity_pk</b>, fetch its
+ * descriptor by launching a dir connection to <b>hsdir</b>. Return 1 on
+ * success or -1 on error. */
+static int
+directory_launch_v3_desc_fetch(const ed25519_public_key_t *onion_identity_pk,
+ const routerstatus_t *hsdir)
+{
+ uint64_t current_time_period = hs_get_time_period_num(approx_time());
+ ed25519_public_key_t blinded_pubkey;
+ char base64_blinded_pubkey[ED25519_BASE64_LEN + 1];
+ hs_ident_dir_conn_t hs_conn_dir_ident;
+ int retval;
+
+ tor_assert(hsdir);
+ tor_assert(onion_identity_pk);
+
+ /* Get blinded pubkey */
+ hs_build_blinded_pubkey(onion_identity_pk, NULL, 0,
+ current_time_period, &blinded_pubkey);
+ /* ...and base64 it. */
+ retval = ed25519_public_to_base64(base64_blinded_pubkey, &blinded_pubkey);
+ if (BUG(retval < 0)) {
+ return -1;
+ }
+
+ /* Copy onion pk to a dir_ident so that we attach it to the dir conn */
+ ed25519_pubkey_copy(&hs_conn_dir_ident.identity_pk, onion_identity_pk);
+
+ /* Setup directory request */
+ directory_request_t *req =
+ directory_request_new(DIR_PURPOSE_FETCH_HSDESC);
+ directory_request_set_routerstatus(req, hsdir);
+ directory_request_set_indirection(req, DIRIND_ANONYMOUS);
+ directory_request_set_resource(req, base64_blinded_pubkey);
+ directory_request_fetch_set_hs_ident(req, &hs_conn_dir_ident);
+ directory_initiate_request(req);
+ directory_request_free(req);
+
+ log_info(LD_REND, "Descriptor fetch request for service %s with blinded "
+ "key %s to directory %s",
+ safe_str_client(ed25519_fmt(onion_identity_pk)),
+ safe_str_client(base64_blinded_pubkey),
+ safe_str_client(routerstatus_describe(hsdir)));
+
+ /* Cleanup memory. */
+ memwipe(&blinded_pubkey, 0, sizeof(blinded_pubkey));
+ memwipe(base64_blinded_pubkey, 0, sizeof(base64_blinded_pubkey));
+ memwipe(&hs_conn_dir_ident, 0, sizeof(hs_conn_dir_ident));
+
+ return 1;
+}
+
+/** Return the HSDir we should use to fetch the descriptor of the hidden
+ * service with identity key <b>onion_identity_pk</b>. */
+static routerstatus_t *
+pick_hsdir_v3(const ed25519_public_key_t *onion_identity_pk)
+{
+ int retval;
+ char base64_blinded_pubkey[ED25519_BASE64_LEN + 1];
+ uint64_t current_time_period = hs_get_time_period_num(approx_time());
+ smartlist_t *responsible_hsdirs;
+ ed25519_public_key_t blinded_pubkey;
+ routerstatus_t *hsdir_rs = NULL;
+
+ tor_assert(onion_identity_pk);
+
+ responsible_hsdirs = smartlist_new();
+
+ /* Get blinded pubkey of hidden service */
+ hs_build_blinded_pubkey(onion_identity_pk, NULL, 0,
+ current_time_period, &blinded_pubkey);
+ /* ...and base64 it. */
+ retval = ed25519_public_to_base64(base64_blinded_pubkey, &blinded_pubkey);
+ if (BUG(retval < 0)) {
+ return NULL;
+ }
+
+ /* Get responsible hsdirs of service for this time period */
+ hs_get_responsible_hsdirs(&blinded_pubkey, current_time_period, 0, 1,
+ responsible_hsdirs);
+
+ log_debug(LD_REND, "Found %d responsible HSDirs and about to pick one.",
+ smartlist_len(responsible_hsdirs));
+
+ /* Pick an HSDir from the responsible ones. The ownership of
+ * responsible_hsdirs is given to this function so no need to free it. */
+ hsdir_rs = hs_pick_hsdir(responsible_hsdirs, base64_blinded_pubkey);
+
+ return hsdir_rs;
+}
+
+/** Fetch a v3 descriptor using the given <b>onion_identity_pk</b>.
+ *
+ * On success, 1 is returned. If no hidden service is left to ask, return 0.
+ * On error, -1 is returned. */
+static int
+fetch_v3_desc(const ed25519_public_key_t *onion_identity_pk)
+{
+ routerstatus_t *hsdir_rs =NULL;
+
+ tor_assert(onion_identity_pk);
+
+ hsdir_rs = pick_hsdir_v3(onion_identity_pk);
+ if (!hsdir_rs) {
+ log_info(LD_REND, "Couldn't pick a v3 hsdir.");
+ return 0;
+ }
+
+ return directory_launch_v3_desc_fetch(onion_identity_pk, hsdir_rs);
+}
+
+/* Make sure that the given v3 origin circuit circ is a valid correct
+ * introduction circuit. This will BUG() on any problems and hard assert if
+ * the anonymity of the circuit is not ok. Return 0 on success else -1 where
+ * the circuit should be mark for closed immediately. */
+static int
+intro_circ_is_ok(const origin_circuit_t *circ)
+{
+ int ret = 0;
+
+ tor_assert(circ);
+
+ if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCING &&
+ TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT &&
+ TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) {
+ ret = -1;
+ }
+ if (BUG(circ->hs_ident == NULL)) {
+ ret = -1;
+ }
+ if (BUG(!hs_ident_intro_circ_is_valid(circ->hs_ident))) {
+ ret = -1;
+ }
+
+ /* This can stop the tor daemon but we want that since if we don't have
+ * anonymity on this circuit, something went really wrong. */
+ assert_circ_anonymity_ok(circ, get_options());
+ return ret;
+}
+
+/* Find a descriptor intro point object that matches the given ident in the
+ * given descriptor desc. Return NULL if not found. */
+static const hs_desc_intro_point_t *
+find_desc_intro_point_by_ident(const hs_ident_circuit_t *ident,
+ const hs_descriptor_t *desc)
+{
+ const hs_desc_intro_point_t *intro_point = NULL;
+
+ tor_assert(ident);
+ tor_assert(desc);
+
+ SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points,
+ const hs_desc_intro_point_t *, ip) {
+ if (ed25519_pubkey_eq(&ident->intro_auth_pk,
+ &ip->auth_key_cert->signed_key)) {
+ intro_point = ip;
+ break;
+ }
+ } SMARTLIST_FOREACH_END(ip);
+
+ return intro_point;
+}
+
+/* Find a descriptor intro point object from the descriptor object desc that
+ * matches the given legacy identity digest in legacy_id. Return NULL if not
+ * found. */
+static hs_desc_intro_point_t *
+find_desc_intro_point_by_legacy_id(const char *legacy_id,
+ const hs_descriptor_t *desc)
+{
+ hs_desc_intro_point_t *ret_ip = NULL;
+
+ tor_assert(legacy_id);
+ tor_assert(desc);
+
+ /* We will go over every intro point and try to find which one is linked to
+ * that circuit. Those lists are small so it's not that expensive. */
+ SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points,
+ hs_desc_intro_point_t *, ip) {
+ SMARTLIST_FOREACH_BEGIN(ip->link_specifiers,
+ const hs_desc_link_specifier_t *, lspec) {
+ /* Not all tor node have an ed25519 identity key so we still rely on the
+ * legacy identity digest. */
+ if (lspec->type != LS_LEGACY_ID) {
+ continue;
+ }
+ if (fast_memneq(legacy_id, lspec->u.legacy_id, DIGEST_LEN)) {
+ break;
+ }
+ /* Found it. */
+ ret_ip = ip;
+ goto end;
+ } SMARTLIST_FOREACH_END(lspec);
+ } SMARTLIST_FOREACH_END(ip);
+
+ end:
+ return ret_ip;
+}
+
+/* Send an INTRODUCE1 cell along the intro circuit and populate the rend
+ * circuit identifier with the needed key material for the e2e encryption.
+ * Return 0 on success, -1 if there is a transient error such that an action
+ * has been taken to recover and -2 if there is a permanent error indicating
+ * that both circuits were closed. */
+static int
+send_introduce1(origin_circuit_t *intro_circ,
+ origin_circuit_t *rend_circ)
+{
+ int status;
+ char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1];
+ const ed25519_public_key_t *service_identity_pk = NULL;
+ const hs_desc_intro_point_t *ip;
+
+ tor_assert(rend_circ);
+ if (intro_circ_is_ok(intro_circ) < 0) {
+ goto perm_err;
+ }
+
+ service_identity_pk = &intro_circ->hs_ident->identity_pk;
+ /* For logging purposes. There will be a time where the hs_ident will have a
+ * version number but for now there is none because it's all v3. */
+ hs_build_address(service_identity_pk, HS_VERSION_THREE, onion_address);
+
+ log_info(LD_REND, "Sending INTRODUCE1 cell to service %s on circuit %u",
+ safe_str_client(onion_address), TO_CIRCUIT(intro_circ)->n_circ_id);
+
+ /* 1) Get descriptor from our cache. */
+ const hs_descriptor_t *desc =
+ hs_cache_lookup_as_client(service_identity_pk);
+ if (desc == NULL || !hs_client_any_intro_points_usable(service_identity_pk,
+ desc)) {
+ log_info(LD_REND, "Request to %s %s. Trying to fetch a new descriptor.",
+ safe_str_client(onion_address),
+ (desc) ? "didn't have usable intro points" :
+ "didn't have a descriptor");
+ hs_client_refetch_hsdesc(service_identity_pk);
+ /* We just triggered a refetch, make sure every connections are back
+ * waiting for that descriptor. */
+ flag_all_conn_wait_desc(service_identity_pk);
+ /* We just asked for a refetch so this is a transient error. */
+ goto tran_err;
+ }
+
+ /* We need to find which intro point in the descriptor we are connected to
+ * on intro_circ. */
+ ip = find_desc_intro_point_by_ident(intro_circ->hs_ident, desc);
+ if (BUG(ip == NULL)) {
+ /* If we can find a descriptor from this introduction circuit ident, we
+ * must have a valid intro point object. Permanent error. */
+ goto perm_err;
+ }
+
+ /* Send the INTRODUCE1 cell. */
+ if (hs_circ_send_introduce1(intro_circ, rend_circ, ip,
+ desc->subcredential) < 0) {
+ /* Unable to send the cell, the intro circuit has been marked for close so
+ * this is a permanent error. */
+ tor_assert_nonfatal(TO_CIRCUIT(intro_circ)->marked_for_close);
+ goto perm_err;
+ }
+
+ /* Cell has been sent successfully. Copy the introduction point
+ * authentication and encryption key in the rendezvous circuit identifier so
+ * we can compute the ntor keys when we receive the RENDEZVOUS2 cell. */
+ memcpy(&rend_circ->hs_ident->intro_enc_pk, &ip->enc_key,
+ sizeof(rend_circ->hs_ident->intro_enc_pk));
+ ed25519_pubkey_copy(&rend_circ->hs_ident->intro_auth_pk,
+ &intro_circ->hs_ident->intro_auth_pk);
+
+ /* Now, we wait for an ACK or NAK on this circuit. */
+ circuit_change_purpose(TO_CIRCUIT(intro_circ),
+ CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT);
+ /* Set timestamp_dirty, because circuit_expire_building expects it to
+ * specify when a circuit entered the _C_INTRODUCE_ACK_WAIT state. */
+ TO_CIRCUIT(intro_circ)->timestamp_dirty = time(NULL);
+ pathbias_count_use_attempt(intro_circ);
+
+ /* Success. */
+ status = 0;
+ goto end;
+
+ perm_err:
+ /* Permanent error: it is possible that the intro circuit was closed prior
+ * because we weren't able to send the cell. Make sure we don't double close
+ * it which would result in a warning. */
+ if (!TO_CIRCUIT(intro_circ)->marked_for_close) {
+ circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_INTERNAL);
+ }
+ circuit_mark_for_close(TO_CIRCUIT(rend_circ), END_CIRC_REASON_INTERNAL);
+ status = -2;
+ goto end;
+
+ tran_err:
+ status = -1;
+
+ end:
+ memwipe(onion_address, 0, sizeof(onion_address));
+ return status;
+}
+
+/* Using the introduction circuit circ, setup the authentication key of the
+ * intro point this circuit has extended to. */
+static void
+setup_intro_circ_auth_key(origin_circuit_t *circ)
+{
+ const hs_descriptor_t *desc;
+ const hs_desc_intro_point_t *ip;
+
+ tor_assert(circ);
+
+ desc = hs_cache_lookup_as_client(&circ->hs_ident->identity_pk);
+ if (BUG(desc == NULL)) {
+ /* Opening intro circuit without the descriptor is no good... */
+ goto end;
+ }
+
+ /* We will go over every intro point and try to find which one is linked to
+ * that circuit. Those lists are small so it's not that expensive. */
+ ip = find_desc_intro_point_by_legacy_id(
+ circ->build_state->chosen_exit->identity_digest, desc);
+ if (ip) {
+ /* We got it, copy its authentication key to the identifier. */
+ ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk,
+ &ip->auth_key_cert->signed_key);
+ goto end;
+ }
+
+ /* Reaching this point means we didn't find any intro point for this circuit
+ * which is not suppose to happen. */
+ tor_assert_nonfatal_unreached();
+
+ end:
+ return;
+}
+
+/* Called when an introduction circuit has opened. */
+static void
+client_intro_circ_has_opened(origin_circuit_t *circ)
+{
+ tor_assert(circ);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
+ log_info(LD_REND, "Introduction circuit %u has opened. Attaching streams.",
+ (unsigned int) TO_CIRCUIT(circ)->n_circ_id);
+
+ /* This is an introduction circuit so we'll attach the correct
+ * authentication key to the circuit identifier so it can be identified
+ * properly later on. */
+ setup_intro_circ_auth_key(circ);
+
+ connection_ap_attach_pending(1);
+}
+
+/* Called when a rendezvous circuit has opened. */
+static void
+client_rendezvous_circ_has_opened(origin_circuit_t *circ)
+{
+ tor_assert(circ);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND);
+
+ log_info(LD_REND, "Rendezvous circuit has opened to %s.",
+ safe_str_client(
+ extend_info_describe(circ->build_state->chosen_exit)));
+
+ /* Ignore returned value, nothing we can really do. On failure, the circuit
+ * will be marked for close. */
+ hs_circ_send_establish_rendezvous(circ);
+
+ /* Register rend circuit in circuitmap if it's still alive. */
+ if (!TO_CIRCUIT(circ)->marked_for_close) {
+ hs_circuitmap_register_rend_circ_client_side(circ,
+ circ->hs_ident->rendezvous_cookie);
+ }
+}
+
+/* This is an helper function that convert a descriptor intro point object ip
+ * to a newly allocated extend_info_t object fully initialized. Return NULL if
+ * we can't convert it for which chances are that we are missing or malformed
+ * link specifiers. */
+static extend_info_t *
+desc_intro_point_to_extend_info(const hs_desc_intro_point_t *ip)
+{
+ extend_info_t *ei;
+ smartlist_t *lspecs = smartlist_new();
+
+ tor_assert(ip);
+
+ /* We first encode the descriptor link specifiers into the binary
+ * representation which is a trunnel object. */
+ SMARTLIST_FOREACH_BEGIN(ip->link_specifiers,
+ const hs_desc_link_specifier_t *, desc_lspec) {
+ link_specifier_t *lspec = hs_desc_lspec_to_trunnel(desc_lspec);
+ smartlist_add(lspecs, lspec);
+ } SMARTLIST_FOREACH_END(desc_lspec);
+
+ /* Explicitely put the direct connection option to 0 because this is client
+ * side and there is no such thing as a non anonymous client. */
+ ei = hs_get_extend_info_from_lspecs(lspecs, &ip->onion_key, 0);
+
+ SMARTLIST_FOREACH(lspecs, link_specifier_t *, ls, link_specifier_free(ls));
+ smartlist_free(lspecs);
+ return ei;
+}
+
+/* Return true iff the intro point ip for the service service_pk is usable.
+ * This function checks if the intro point is in the client intro state cache
+ * and checks at the failures. It is considered usable if:
+ * - No error happened (INTRO_POINT_FAILURE_GENERIC)
+ * - It is not flagged as timed out (INTRO_POINT_FAILURE_TIMEOUT)
+ * - The unreachable count is lower than
+ * MAX_INTRO_POINT_REACHABILITY_FAILURES (INTRO_POINT_FAILURE_UNREACHABLE)
+ */
+static int
+intro_point_is_usable(const ed25519_public_key_t *service_pk,
+ const hs_desc_intro_point_t *ip)
+{
+ const hs_cache_intro_state_t *state;
+
+ tor_assert(service_pk);
+ tor_assert(ip);
+
+ state = hs_cache_client_intro_state_find(service_pk,
+ &ip->auth_key_cert->signed_key);
+ if (state == NULL) {
+ /* This means we've never encountered any problem thus usable. */
+ goto usable;
+ }
+ if (state->error) {
+ log_info(LD_REND, "Intro point with auth key %s had an error. Not usable",
+ safe_str_client(ed25519_fmt(&ip->auth_key_cert->signed_key)));
+ goto not_usable;
+ }
+ if (state->timed_out) {
+ log_info(LD_REND, "Intro point with auth key %s timed out. Not usable",
+ safe_str_client(ed25519_fmt(&ip->auth_key_cert->signed_key)));
+ goto not_usable;
+ }
+ if (state->unreachable_count >= MAX_INTRO_POINT_REACHABILITY_FAILURES) {
+ log_info(LD_REND, "Intro point with auth key %s unreachable. Not usable",
+ safe_str_client(ed25519_fmt(&ip->auth_key_cert->signed_key)));
+ goto not_usable;
+ }
+
+ usable:
+ return 1;
+ not_usable:
+ return 0;
+}
+
+/* Using a descriptor desc, return a newly allocated extend_info_t object of a
+ * randomly picked introduction point from its list. Return NULL if none are
+ * usable. */
+static extend_info_t *
+client_get_random_intro(const ed25519_public_key_t *service_pk)
+{
+ extend_info_t *ei = NULL, *ei_excluded = NULL;
+ smartlist_t *usable_ips = NULL;
+ const hs_descriptor_t *desc;
+ const hs_desc_encrypted_data_t *enc_data;
+ const or_options_t *options = get_options();
+
+ tor_assert(service_pk);
+
+ desc = hs_cache_lookup_as_client(service_pk);
+ if (desc == NULL || !hs_client_any_intro_points_usable(service_pk,
+ desc)) {
+ log_info(LD_REND, "Unable to randomly select an introduction point "
+ "because descriptor %s.",
+ (desc) ? "doesn't have usable intro point" : "is missing");
+ goto end;
+ }
+
+ enc_data = &desc->encrypted_data;
+ usable_ips = smartlist_new();
+ smartlist_add_all(usable_ips, enc_data->intro_points);
+ while (smartlist_len(usable_ips) != 0) {
+ int idx;
+ const hs_desc_intro_point_t *ip;
+
+ /* Pick a random intro point and immediately remove it from the usable
+ * list so we don't pick it again if we have to iterate more. */
+ idx = crypto_rand_int(smartlist_len(usable_ips));
+ ip = smartlist_get(usable_ips, idx);
+ smartlist_del(usable_ips, idx);
+
+ /* We need to make sure we have a usable intro points which is in a good
+ * state in our cache. */
+ if (!intro_point_is_usable(service_pk, ip)) {
+ continue;
+ }
+
+ /* Generate an extend info object from the intro point object. */
+ ei = desc_intro_point_to_extend_info(ip);
+ if (ei == NULL) {
+ /* We can get here for instance if the intro point is a private address
+ * and we aren't allowed to extend to those. */
+ continue;
+ }
+
+ /* Test the pick against ExcludeNodes. */
+ if (routerset_contains_extendinfo(options->ExcludeNodes, ei)) {
+ /* If this pick is in the ExcludeNodes list, we keep its reference so if
+ * we ever end up not being able to pick anything else and StrictNodes is
+ * unset, we'll use it. */
+ ei_excluded = ei;
+ continue;
+ }
+
+ /* Good pick! Let's go with this. */
+ goto end;
+ }
+
+ /* Reaching this point means a couple of things. Either we can't use any of
+ * the intro point listed because the IP address can't be extended to or it
+ * is listed in the ExcludeNodes list. In the later case, if StrictNodes is
+ * set, we are forced to not use anything. */
+ ei = ei_excluded;
+ if (options->StrictNodes) {
+ log_warn(LD_REND, "Every introduction points are in the ExcludeNodes set "
+ "and StrictNodes is set. We can't connect.");
+ ei = NULL;
+ }
+
+ end:
+ smartlist_free(usable_ips);
+ return ei;
+}
+
+/* For this introduction circuit, we'll look at if we have any usable
+ * introduction point left for this service. If so, we'll use the circuit to
+ * re-extend to a new intro point. Else, we'll close the circuit and its
+ * corresponding rendezvous circuit. Return 0 if we are re-extending else -1
+ * if we are closing the circuits.
+ *
+ * This is called when getting an INTRODUCE_ACK cell with a NACK. */
+static int
+close_or_reextend_intro_circ(origin_circuit_t *intro_circ)
+{
+ int ret = -1;
+ const hs_descriptor_t *desc;
+ origin_circuit_t *rend_circ;
+
+ tor_assert(intro_circ);
+
+ desc = hs_cache_lookup_as_client(&intro_circ->hs_ident->identity_pk);
+ if (BUG(desc == NULL)) {
+ /* We can't continue without a descriptor. */
+ goto close;
+ }
+ /* We still have the descriptor, great! Let's try to see if we can
+ * re-extend by looking up if there are any usable intro points. */
+ if (!hs_client_any_intro_points_usable(&intro_circ->hs_ident->identity_pk,
+ desc)) {
+ goto close;
+ }
+ /* Try to re-extend now. */
+ if (hs_client_reextend_intro_circuit(intro_circ) < 0) {
+ goto close;
+ }
+ /* Success on re-extending. Don't return an error. */
+ ret = 0;
+ goto end;
+
+ close:
+ /* Change the intro circuit purpose before so we don't report an intro point
+ * failure again triggering an extra descriptor fetch. The circuit can
+ * already be closed on failure to re-extend. */
+ if (!TO_CIRCUIT(intro_circ)->marked_for_close) {
+ circuit_change_purpose(TO_CIRCUIT(intro_circ),
+ CIRCUIT_PURPOSE_C_INTRODUCE_ACKED);
+ circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_FINISHED);
+ }
+ /* Close the related rendezvous circuit. */
+ rend_circ = hs_circuitmap_get_rend_circ_client_side(
+ intro_circ->hs_ident->rendezvous_cookie);
+ /* The rendezvous circuit might have collapsed while the INTRODUCE_ACK was
+ * inflight so we can't expect one every time. */
+ if (rend_circ) {
+ circuit_mark_for_close(TO_CIRCUIT(rend_circ), END_CIRC_REASON_FINISHED);
+ }
+
+ end:
+ return ret;
+}
+
+/* Called when we get an INTRODUCE_ACK success status code. Do the appropriate
+ * actions for the rendezvous point and finally close intro_circ. */
+static void
+handle_introduce_ack_success(origin_circuit_t *intro_circ)
+{
+ origin_circuit_t *rend_circ = NULL;
+
+ tor_assert(intro_circ);
+
+ log_info(LD_REND, "Received INTRODUCE_ACK ack! Informing rendezvous");
+
+ /* Get the rendezvous circuit for this rendezvous cookie. */
+ uint8_t *rendezvous_cookie = intro_circ->hs_ident->rendezvous_cookie;
+ rend_circ = hs_circuitmap_get_rend_circ_client_side(rendezvous_cookie);
+ if (rend_circ == NULL) {
+ log_warn(LD_REND, "Can't find any rendezvous circuit. Stopping");
+ goto end;
+ }
+
+ assert_circ_anonymity_ok(rend_circ, get_options());
+ circuit_change_purpose(TO_CIRCUIT(rend_circ),
+ CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED);
+ /* Set timestamp_dirty, because circuit_expire_building expects it to
+ * specify when a circuit entered the
+ * CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED state. */
+ TO_CIRCUIT(rend_circ)->timestamp_dirty = time(NULL);
+
+ end:
+ /* We don't need the intro circuit anymore. It did what it had to do! */
+ circuit_change_purpose(TO_CIRCUIT(intro_circ),
+ CIRCUIT_PURPOSE_C_INTRODUCE_ACKED);
+ circuit_mark_for_close(TO_CIRCUIT(intro_circ), END_CIRC_REASON_FINISHED);
+
+ /* XXX: Close pending intro circuits we might have in parallel. */
+ return;
+}
+
+/* Called when we get an INTRODUCE_ACK failure status code. Depending on our
+ * failure cache status, either close the circuit or re-extend to a new
+ * introduction point. */
+static void
+handle_introduce_ack_bad(origin_circuit_t *circ, int status)
+{
+ tor_assert(circ);
+
+ log_info(LD_REND, "Received INTRODUCE_ACK nack by %s. Reason: %u",
+ safe_str_client(extend_info_describe(circ->build_state->chosen_exit)),
+ status);
+
+ /* It's a NAK. The introduction point didn't relay our request. */
+ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_INTRODUCING);
+
+ /* Note down this failure in the intro point failure cache. Depending on how
+ * many times we've tried this intro point, close it or reextend. */
+ hs_cache_client_intro_state_note(&circ->hs_ident->identity_pk,
+ &circ->hs_ident->intro_auth_pk,
+ INTRO_POINT_FAILURE_GENERIC);
+}
+
+/* Called when we get an INTRODUCE_ACK on the intro circuit circ. The encoded
+ * cell is in payload of length payload_len. Return 0 on success else a
+ * negative value. The circuit is either close or reuse to re-extend to a new
+ * introduction point. */
+static int
+handle_introduce_ack(origin_circuit_t *circ, const uint8_t *payload,
+ size_t payload_len)
+{
+ int status, ret = -1;
+
+ tor_assert(circ);
+ tor_assert(circ->build_state);
+ tor_assert(circ->build_state->chosen_exit);
+ assert_circ_anonymity_ok(circ, get_options());
+ tor_assert(payload);
+
+ status = hs_cell_parse_introduce_ack(payload, payload_len);
+ switch (status) {
+ case HS_CELL_INTRO_ACK_SUCCESS:
+ ret = 0;
+ handle_introduce_ack_success(circ);
+ goto end;
+ case HS_CELL_INTRO_ACK_FAILURE:
+ case HS_CELL_INTRO_ACK_BADFMT:
+ case HS_CELL_INTRO_ACK_NORELAY:
+ handle_introduce_ack_bad(circ, status);
+ /* We are going to see if we have to close the circuits (IP and RP) or we
+ * can re-extend to a new intro point. */
+ ret = close_or_reextend_intro_circ(circ);
+ break;
+ default:
+ log_info(LD_PROTOCOL, "Unknown INTRODUCE_ACK status code %u from %s",
+ status,
+ safe_str_client(extend_info_describe(circ->build_state->chosen_exit)));
+ break;
+ }
+
+ end:
+ return ret;
+}
+
+/* Called when we get a RENDEZVOUS2 cell on the rendezvous circuit circ. The
+ * encoded cell is in payload of length payload_len. Return 0 on success or a
+ * negative value on error. On error, the circuit is marked for close. */
+static int
+handle_rendezvous2(origin_circuit_t *circ, const uint8_t *payload,
+ size_t payload_len)
+{
+ int ret = -1;
+ curve25519_public_key_t server_pk;
+ uint8_t auth_mac[DIGEST256_LEN] = {0};
+ uint8_t handshake_info[CURVE25519_PUBKEY_LEN + sizeof(auth_mac)] = {0};
+ hs_ntor_rend_cell_keys_t keys;
+ const hs_ident_circuit_t *ident;
+
+ tor_assert(circ);
+ tor_assert(payload);
+
+ /* Make things easier. */
+ ident = circ->hs_ident;
+ tor_assert(ident);
+
+ if (hs_cell_parse_rendezvous2(payload, payload_len, handshake_info,
+ sizeof(handshake_info)) < 0) {
+ goto err;
+ }
+ /* Get from the handshake info the SERVER_PK and AUTH_MAC. */
+ memcpy(&server_pk, handshake_info, CURVE25519_PUBKEY_LEN);
+ memcpy(auth_mac, handshake_info + CURVE25519_PUBKEY_LEN, sizeof(auth_mac));
+
+ /* Generate the handshake info. */
+ if (hs_ntor_client_get_rendezvous1_keys(&ident->intro_auth_pk,
+ &ident->rendezvous_client_kp,
+ &ident->intro_enc_pk, &server_pk,
+ &keys) < 0) {
+ log_info(LD_REND, "Unable to compute the rendezvous keys.");
+ goto err;
+ }
+
+ /* Critical check, make sure that the MAC matches what we got with what we
+ * computed just above. */
+ if (!hs_ntor_client_rendezvous2_mac_is_good(&keys, auth_mac)) {
+ log_info(LD_REND, "Invalid MAC in RENDEZVOUS2. Rejecting cell.");
+ goto err;
+ }
+
+ /* Setup the e2e encryption on the circuit and finalize its state. */
+ if (hs_circuit_setup_e2e_rend_circ(circ, keys.ntor_key_seed,
+ sizeof(keys.ntor_key_seed), 0) < 0) {
+ log_info(LD_REND, "Unable to setup the e2e encryption.");
+ goto err;
+ }
+ /* Success. Hidden service connection finalized! */
+ ret = 0;
+ goto end;
+
+ err:
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
+ end:
+ memwipe(&keys, 0, sizeof(keys));
+ return ret;
+}
+
+/* ========== */
+/* Public API */
+/* ========== */
+
+/** A circuit just finished connecting to a hidden service that the stream
+ * <b>conn</b> has been waiting for. Let the HS subsystem know about this. */
+void
+hs_client_note_connection_attempt_succeeded(const edge_connection_t *conn)
+{
+ tor_assert(connection_edge_is_rendezvous_stream(conn));
+
+ if (BUG(conn->rend_data && conn->hs_ident)) {
+ log_warn(LD_BUG, "Stream had both rend_data and hs_ident..."
+ "Prioritizing hs_ident");
+ }
+
+ if (conn->hs_ident) { /* It's v3: pass it to the prop224 handler */
+ note_connection_attempt_succeeded(conn->hs_ident);
+ return;
+ } else if (conn->rend_data) { /* It's v2: pass it to the legacy handler */
+ rend_client_note_connection_attempt_ended(conn->rend_data);
+ return;
+ }
+}
+
+/* With the given encoded descriptor in desc_str and the service key in
+ * service_identity_pk, decode the descriptor and set the desc pointer with a
+ * newly allocated descriptor object.
+ *
+ * Return 0 on success else a negative value and desc is set to NULL. */
+int
+hs_client_decode_descriptor(const char *desc_str,
+ const ed25519_public_key_t *service_identity_pk,
+ hs_descriptor_t **desc)
+{
+ int ret;
+ uint8_t subcredential[DIGEST256_LEN];
+ ed25519_public_key_t blinded_pubkey;
+
+ tor_assert(desc_str);
+ tor_assert(service_identity_pk);
+ tor_assert(desc);
+
+ /* Create subcredential for this HS so that we can decrypt */
+ {
+ uint64_t current_time_period = hs_get_time_period_num(approx_time());
+ hs_build_blinded_pubkey(service_identity_pk, NULL, 0, current_time_period,
+ &blinded_pubkey);
+ hs_get_subcredential(service_identity_pk, &blinded_pubkey, subcredential);
+ }
+
+ /* Parse descriptor */
+ ret = hs_desc_decode_descriptor(desc_str, subcredential, desc);
+ memwipe(subcredential, 0, sizeof(subcredential));
+ if (ret < 0) {
+ log_warn(LD_GENERAL, "Could not parse received descriptor as client");
+ goto err;
+ }
+
+ /* Make sure the descriptor signing key cross certifies with the computed
+ * blinded key. Without this validation, anyone knowing the subcredential
+ * and onion address can forge a descriptor. */
+ if (tor_cert_checksig((*desc)->plaintext_data.signing_key_cert,
+ &blinded_pubkey, approx_time()) < 0) {
+ log_warn(LD_GENERAL, "Descriptor signing key certificate signature "
+ "doesn't validate with computed blinded key.");
+ goto err;
+ }
+
+ return 0;
+ err:
+ return -1;
+}
+
+/* Return true iff there are at least one usable intro point in the service
+ * descriptor desc. */
+int
+hs_client_any_intro_points_usable(const ed25519_public_key_t *service_pk,
+ const hs_descriptor_t *desc)
+{
+ tor_assert(service_pk);
+ tor_assert(desc);
+
+ SMARTLIST_FOREACH_BEGIN(desc->encrypted_data.intro_points,
+ const hs_desc_intro_point_t *, ip) {
+ if (intro_point_is_usable(service_pk, ip)) {
+ goto usable;
+ }
+ } SMARTLIST_FOREACH_END(ip);
+
+ return 0;
+ usable:
+ return 1;
+}
+
+/** Launch a connection to a hidden service directory to fetch a hidden
+ * service descriptor using <b>identity_pk</b> to get the necessary keys.
+ *
+ * On success, 1 is returned. If no hidden service is left to ask, return 0.
+ * On error, -1 is returned. (retval is only used by unittests right now) */
+int
+hs_client_refetch_hsdesc(const ed25519_public_key_t *identity_pk)
+{
+ tor_assert(identity_pk);
+
+ /* Are we configured to fetch descriptors? */
+ if (!get_options()->FetchHidServDescriptors) {
+ log_warn(LD_REND, "We received an onion address for a hidden service "
+ "descriptor but we are configured to not fetch.");
+ return 0;
+ }
+
+ /* Check if fetching a desc for this HS is useful to us right now */
+ {
+ const hs_descriptor_t *cached_desc = NULL;
+ cached_desc = hs_cache_lookup_as_client(identity_pk);
+ if (cached_desc && hs_client_any_intro_points_usable(identity_pk,
+ cached_desc)) {
+ log_warn(LD_GENERAL, "We would fetch a v3 hidden service descriptor "
+ "but we already have a useable descriprot.");
+ return 0;
+ }
+ }
+
+ return fetch_v3_desc(identity_pk);
+}
+
+/* This is called when we are trying to attach an AP connection to these
+ * hidden service circuits from connection_ap_handshake_attach_circuit().
+ * Return 0 on success, -1 for a transient error that is actions were
+ * triggered to recover or -2 for a permenent error where both circuits will
+ * marked for close.
+ *
+ * The following supports every hidden service version. */
+int
+hs_client_send_introduce1(origin_circuit_t *intro_circ,
+ origin_circuit_t *rend_circ)
+{
+ return (intro_circ->hs_ident) ? send_introduce1(intro_circ, rend_circ) :
+ rend_client_send_introduction(intro_circ,
+ rend_circ);
+}
+
+/* Called when the client circuit circ has been established. It can be either
+ * an introduction or rendezvous circuit. This function handles all hidden
+ * service versions. */
+void
+hs_client_circuit_has_opened(origin_circuit_t *circ)
+{
+ tor_assert(circ);
+
+ /* Handle both version. v2 uses rend_data and v3 uses the hs circuit
+ * identifier hs_ident. Can't be both. */
+ switch (TO_CIRCUIT(circ)->purpose) {
+ case CIRCUIT_PURPOSE_C_INTRODUCING:
+ if (circ->hs_ident) {
+ client_intro_circ_has_opened(circ);
+ } else {
+ rend_client_introcirc_has_opened(circ);
+ }
+ break;
+ case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
+ if (circ->hs_ident) {
+ client_rendezvous_circ_has_opened(circ);
+ } else {
+ rend_client_rendcirc_has_opened(circ);
+ }
+ break;
+ default:
+ tor_assert_nonfatal_unreached();
+ }
+}
+
+/* Called when we receive a RENDEZVOUS_ESTABLISHED cell. Change the state of
+ * the circuit to CIRCUIT_PURPOSE_C_REND_READY. Return 0 on success else a
+ * negative value and the circuit marked for close. */
+int
+hs_client_receive_rendezvous_acked(origin_circuit_t *circ,
+ const uint8_t *payload, size_t payload_len)
+{
+ tor_assert(circ);
+ tor_assert(payload);
+
+ (void) payload_len;
+
+ if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_ESTABLISH_REND) {
+ log_warn(LD_PROTOCOL, "Got a RENDEZVOUS_ESTABLISHED but we were not "
+ "expecting one. Closing circuit.");
+ goto err;
+ }
+
+ log_info(LD_REND, "Received an RENDEZVOUS_ESTABLISHED. This circuit is "
+ "now ready for rendezvous.");
+ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_REND_READY);
+
+ /* Set timestamp_dirty, because circuit_expire_building expects it to
+ * specify when a circuit entered the _C_REND_READY state. */
+ TO_CIRCUIT(circ)->timestamp_dirty = time(NULL);
+
+ /* From a path bias point of view, this circuit is now successfully used.
+ * Waiting any longer opens us up to attacks from malicious hidden services.
+ * They could induce the client to attempt to connect to their hidden
+ * service and never reply to the client's rend requests */
+ pathbias_mark_use_success(circ);
+
+ /* If we already have the introduction circuit built, make sure we send
+ * the INTRODUCE cell _now_ */
+ connection_ap_attach_pending(1);
+
+ return 0;
+ err:
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
+ return -1;
+}
+
+/* This is called when a descriptor has arrived following a fetch request and
+ * has been stored in the client cache. Every entry connection that matches
+ * the service identity key in the ident will get attached to the hidden
+ * service circuit. */
+void
+hs_client_desc_has_arrived(const hs_ident_dir_conn_t *ident)
+{
+ time_t now = time(NULL);
+ smartlist_t *conns = NULL;
+
+ tor_assert(ident);
+
+ conns = connection_list_by_type_state(CONN_TYPE_AP,
+ AP_CONN_STATE_RENDDESC_WAIT);
+ SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) {
+ const hs_descriptor_t *desc;
+ entry_connection_t *entry_conn = TO_ENTRY_CONN(base_conn);
+ const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(entry_conn);
+
+ /* Only consider the entry connections that matches the service for which
+ * we just fetched its descriptor. */
+ if (!edge_conn->hs_ident ||
+ !ed25519_pubkey_eq(&ident->identity_pk,
+ &edge_conn->hs_ident->identity_pk)) {
+ continue;
+ }
+ assert_connection_ok(base_conn, now);
+
+ /* We were just called because we stored the descriptor for this service
+ * so not finding a descriptor means we have a bigger problem. */
+ desc = hs_cache_lookup_as_client(&ident->identity_pk);
+ if (BUG(desc == NULL)) {
+ goto end;
+ }
+
+ if (!hs_client_any_intro_points_usable(&ident->identity_pk, desc)) {
+ log_info(LD_REND, "Hidden service descriptor is unusable. "
+ "Closing streams.");
+ connection_mark_unattached_ap(entry_conn,
+ END_STREAM_REASON_RESOLVEFAILED);
+ /* We are unable to use the descriptor so remove the directory request
+ * from the cache so the next connection can try again. */
+ note_connection_attempt_succeeded(edge_conn->hs_ident);
+ goto end;
+ }
+
+ log_info(LD_REND, "Descriptor has arrived. Launching circuits.");
+
+ /* Restart their timeout values, so they get a fair shake at connecting to
+ * the hidden service. XXX: Improve comment on why this is needed. */
+ base_conn->timestamp_created = now;
+ base_conn->timestamp_lastread = now;
+ base_conn->timestamp_lastwritten = now;
+ /* Change connection's state into waiting for a circuit. */
+ base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
+
+ connection_ap_mark_as_pending_circuit(entry_conn);
+ } SMARTLIST_FOREACH_END(base_conn);
+
+ end:
+ /* We don't have ownership of the objects in this list. */
+ smartlist_free(conns);
+}
+
+/* Return a newly allocated extend_info_t for a randomly chosen introduction
+ * point for the given edge connection identifier ident. Return NULL if we
+ * can't pick any usable introduction points. */
+extend_info_t *
+hs_client_get_random_intro_from_edge(const edge_connection_t *edge_conn)
+{
+ tor_assert(edge_conn);
+
+ return (edge_conn->hs_ident) ?
+ client_get_random_intro(&edge_conn->hs_ident->identity_pk) :
+ rend_client_get_random_intro(edge_conn->rend_data);
+}
+/* Called when get an INTRODUCE_ACK cell on the introduction circuit circ.
+ * Return 0 on success else a negative value is returned. The circuit will be
+ * closed or reuse to extend again to another intro point. */
+int
+hs_client_receive_introduce_ack(origin_circuit_t *circ,
+ const uint8_t *payload, size_t payload_len)
+{
+ int ret = -1;
+
+ tor_assert(circ);
+ tor_assert(payload);
+
+ if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) {
+ log_warn(LD_PROTOCOL, "Unexpected INTRODUCE_ACK on circuit %u.",
+ (unsigned int) TO_CIRCUIT(circ)->n_circ_id);
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
+ goto end;
+ }
+
+ ret = (circ->hs_ident) ? handle_introduce_ack(circ, payload, payload_len) :
+ rend_client_introduction_acked(circ, payload,
+ payload_len);
+ /* For path bias: This circuit was used successfully. NACK or ACK counts. */
+ pathbias_mark_use_success(circ);
+
+ end:
+ return ret;
+}
+
+/* Called when get a RENDEZVOUS2 cell on the rendezvous circuit circ. Return
+ * 0 on success else a negative value is returned. The circuit will be closed
+ * on error. */
+int
+hs_client_receive_rendezvous2(origin_circuit_t *circ,
+ const uint8_t *payload, size_t payload_len)
+{
+ int ret = -1;
+
+ tor_assert(circ);
+ tor_assert(payload);
+
+ /* Circuit can possibly be in both state because we could receive a
+ * RENDEZVOUS2 cell before the INTRODUCE_ACK has been received. */
+ if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_REND_READY &&
+ TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) {
+ log_warn(LD_PROTOCOL, "Unexpected RENDEZVOUS2 cell on circuit %u. "
+ "Closing circuit.",
+ (unsigned int) TO_CIRCUIT(circ)->n_circ_id);
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
+ goto end;
+ }
+
+ log_info(LD_REND, "Got RENDEZVOUS2 cell from hidden service on circuit %u.",
+ TO_CIRCUIT(circ)->n_circ_id);
+
+ ret = (circ->hs_ident) ? handle_rendezvous2(circ, payload, payload_len) :
+ rend_client_receive_rendezvous(circ, payload,
+ payload_len);
+ end:
+ return ret;
+}
+
+/* Extend the introduction circuit circ to another valid introduction point
+ * for the hidden service it is trying to connect to, or mark it and launch a
+ * new circuit if we can't extend it. Return 0 on success or possible
+ * success. Return -1 and mark the introduction circuit for close on permanent
+ * failure.
+ *
+ * On failure, the caller is responsible for marking the associated rendezvous
+ * circuit for close. */
+int
+hs_client_reextend_intro_circuit(origin_circuit_t *circ)
+{
+ int ret = -1;
+ extend_info_t *ei;
+
+ tor_assert(circ);
+
+ ei = (circ->hs_ident) ?
+ client_get_random_intro(&circ->hs_ident->identity_pk) :
+ rend_client_get_random_intro(circ->rend_data);
+ if (ei == NULL) {
+ log_warn(LD_REND, "No usable introduction points left. Closing.");
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
+ goto end;
+ }
+
+ if (circ->remaining_relay_early_cells) {
+ log_info(LD_REND, "Re-extending circ %u, this time to %s.",
+ (unsigned int) TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(extend_info_describe(ei)));
+ ret = circuit_extend_to_new_exit(circ, ei);
+ if (ret == 0) {
+ /* We were able to extend so update the timestamp so we avoid expiring
+ * this circuit too early. The intro circuit is short live so the
+ * linkability issue is minimized, we just need the circuit to hold a
+ * bit longer so we can introduce. */
+ TO_CIRCUIT(circ)->timestamp_dirty = time(NULL);
+ }
+ } else {
+ log_info(LD_REND, "Closing intro circ %u (out of RELAY_EARLY cells).",
+ (unsigned int) TO_CIRCUIT(circ)->n_circ_id);
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
+ /* connection_ap_handshake_attach_circuit will launch a new intro circ. */
+ ret = 0;
+ }
+
+ end:
+ extend_info_free(ei);
+ return ret;
+}
+
diff --git a/src/or/hs_client.h b/src/or/hs_client.h
new file mode 100644
index 0000000000..8ed0501c91
--- /dev/null
+++ b/src/or/hs_client.h
@@ -0,0 +1,50 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_client.h
+ * \brief Header file containing client data for the HS subsytem.
+ **/
+
+#ifndef TOR_HS_CLIENT_H
+#define TOR_HS_CLIENT_H
+
+#include "crypto_ed25519.h"
+#include "hs_descriptor.h"
+#include "hs_ident.h"
+
+void hs_client_note_connection_attempt_succeeded(
+ const edge_connection_t *conn);
+
+int hs_client_decode_descriptor(
+ const char *desc_str,
+ const ed25519_public_key_t *service_identity_pk,
+ hs_descriptor_t **desc);
+int hs_client_any_intro_points_usable(const ed25519_public_key_t *service_pk,
+ const hs_descriptor_t *desc);
+int hs_client_refetch_hsdesc(const ed25519_public_key_t *identity_pk);
+
+int hs_client_send_introduce1(origin_circuit_t *intro_circ,
+ origin_circuit_t *rend_circ);
+
+void hs_client_circuit_has_opened(origin_circuit_t *circ);
+
+int hs_client_receive_rendezvous_acked(origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len);
+int hs_client_receive_introduce_ack(origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len);
+int hs_client_receive_rendezvous2(origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len);
+
+void hs_client_desc_has_arrived(const hs_ident_dir_conn_t *ident);
+
+extend_info_t *hs_client_get_random_intro_from_edge(
+ const edge_connection_t *edge_conn);
+
+int hs_client_reextend_intro_circuit(origin_circuit_t *circ);
+
+#endif /* TOR_HS_CLIENT_H */
+
diff --git a/src/or/hs_common.c b/src/or/hs_common.c
index 42508126f8..03dd07f6ca 100644
--- a/src/or/hs_common.c
+++ b/src/or/hs_common.c
@@ -14,9 +14,142 @@
#include "or.h"
#include "config.h"
+#include "circuitbuild.h"
#include "networkstatus.h"
+#include "nodelist.h"
+#include "hs_cache.h"
#include "hs_common.h"
+#include "hs_ident.h"
+#include "hs_service.h"
+#include "policies.h"
#include "rendcommon.h"
+#include "rendservice.h"
+#include "routerset.h"
+#include "router.h"
+#include "routerset.h"
+#include "shared_random.h"
+#include "shared_random_state.h"
+
+/* Trunnel */
+#include "ed25519_cert.h"
+
+/* Ed25519 Basepoint value. Taken from section 5 of
+ * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03 */
+static const char *str_ed25519_basepoint =
+ "(15112221349535400772501151409588531511"
+ "454012693041857206046113283949847762202, "
+ "463168356949264781694283940034751631413"
+ "07993866256225615783033603165251855960)";
+
+#ifdef HAVE_SYS_UN_H
+
+/** Given <b>ports</b>, a smarlist containing rend_service_port_config_t,
+ * add the given <b>p</b>, a AF_UNIX port to the list. Return 0 on success
+ * else return -ENOSYS if AF_UNIX is not supported (see function in the
+ * #else statement below). */
+static int
+add_unix_port(smartlist_t *ports, rend_service_port_config_t *p)
+{
+ tor_assert(ports);
+ tor_assert(p);
+ tor_assert(p->is_unix_addr);
+
+ smartlist_add(ports, p);
+ return 0;
+}
+
+/** Given <b>conn</b> set it to use the given port <b>p</b> values. Return 0
+ * on success else return -ENOSYS if AF_UNIX is not supported (see function
+ * in the #else statement below). */
+static int
+set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p)
+{
+ tor_assert(conn);
+ tor_assert(p);
+ tor_assert(p->is_unix_addr);
+
+ conn->base_.socket_family = AF_UNIX;
+ tor_addr_make_unspec(&conn->base_.addr);
+ conn->base_.port = 1;
+ conn->base_.address = tor_strdup(p->unix_addr);
+ return 0;
+}
+
+#else /* defined(HAVE_SYS_UN_H) */
+
+static int
+set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p)
+{
+ (void) conn;
+ (void) p;
+ return -ENOSYS;
+}
+
+static int
+add_unix_port(smartlist_t *ports, rend_service_port_config_t *p)
+{
+ (void) ports;
+ (void) p;
+ return -ENOSYS;
+}
+
+#endif /* HAVE_SYS_UN_H */
+
+/* Helper function: The key is a digest that we compare to a node_t object
+ * current hsdir_index. */
+static int
+compare_digest_to_current_hsdir_index(const void *_key, const void **_member)
+{
+ const char *key = _key;
+ const node_t *node = *_member;
+ return tor_memcmp(key, node->hsdir_index->current, DIGEST256_LEN);
+}
+
+/* Helper function: The key is a digest that we compare to a node_t object
+ * next hsdir_index. */
+static int
+compare_digest_to_next_hsdir_index(const void *_key, const void **_member)
+{
+ const char *key = _key;
+ const node_t *node = *_member;
+ return tor_memcmp(key, node->hsdir_index->next, DIGEST256_LEN);
+}
+
+/* Helper function: Compare two node_t objects current hsdir_index. */
+static int
+compare_node_current_hsdir_index(const void **a, const void **b)
+{
+ const node_t *node1= *a;
+ const node_t *node2 = *b;
+ return tor_memcmp(node1->hsdir_index->current,
+ node2->hsdir_index->current,
+ DIGEST256_LEN);
+}
+
+/* Helper function: Compare two node_t objects next hsdir_index. */
+static int
+compare_node_next_hsdir_index(const void **a, const void **b)
+{
+ const node_t *node1= *a;
+ const node_t *node2 = *b;
+ return tor_memcmp(node1->hsdir_index->next,
+ node2->hsdir_index->next,
+ DIGEST256_LEN);
+}
+
+/* Allocate and return a string containing the path to filename in directory.
+ * This function will never return NULL. The caller must free this path. */
+char *
+hs_path_from_filename(const char *directory, const char *filename)
+{
+ char *file_path = NULL;
+
+ tor_assert(directory);
+ tor_assert(filename);
+
+ tor_asprintf(&file_path, "%s%s%s", directory, PATH_SEPARATOR, filename);
+ return file_path;
+}
/* Make sure that the directory for <b>service</b> is private, using the config
* <b>username</b>.
@@ -56,6 +189,17 @@ hs_check_service_private_dir(const char *username, const char *path,
STATIC uint64_t
get_time_period_length(void)
{
+ /* If we are on a test network, make the time period smaller than normal so
+ that we actually see it rotate. Specifically, make it the same length as
+ an SRV protocol run. */
+ if (get_options()->TestingTorNetwork) {
+ unsigned run_duration = sr_state_get_protocol_run_duration();
+ /* An SRV run should take more than a minute (it's 24 rounds) */
+ tor_assert_nonfatal(run_duration > 60);
+ /* Turn it from seconds to minutes before returning: */
+ return sr_state_get_protocol_run_duration() / 60;
+ }
+
int32_t time_period_length = networkstatus_get_param(NULL, "hsdir-interval",
HS_TIME_PERIOD_LENGTH_DEFAULT,
HS_TIME_PERIOD_LENGTH_MIN,
@@ -67,17 +211,22 @@ get_time_period_length(void)
}
/** Get the HS time period number at time <b>now</b> */
-STATIC uint64_t
-get_time_period_num(time_t now)
+uint64_t
+hs_get_time_period_num(time_t now)
{
uint64_t time_period_num;
+
+ /* Start by calculating minutes since the epoch */
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;
+ /* Apply the rotation offset as specified by prop224 (section
+ * [TIME-PERIODS]), so that new time periods synchronize nicely with SRV
+ * publication */
+ unsigned int time_period_rotation_offset = sr_state_get_phase_duration();
+ time_period_rotation_offset /= 60; /* go from seconds to minutes */
+ tor_assert(minutes_since_epoch > time_period_rotation_offset);
+ minutes_since_epoch -= time_period_rotation_offset;
/* Calculate the time period */
time_period_num = minutes_since_epoch / time_period_length;
@@ -89,7 +238,22 @@ get_time_period_num(time_t now)
uint64_t
hs_get_next_time_period_num(time_t now)
{
- return get_time_period_num(now) + 1;
+ return hs_get_time_period_num(now) + 1;
+}
+
+/* Return the start time of the upcoming time period based on <b>now</b>. */
+time_t
+hs_get_start_time_of_next_time_period(time_t now)
+{
+ uint64_t time_period_length = get_time_period_length();
+
+ /* Get start time of next time period */
+ uint64_t next_time_period_num = hs_get_next_time_period_num(now);
+ uint64_t start_of_next_tp_in_mins = next_time_period_num *time_period_length;
+
+ /* Apply rotation offset as specified by prop224 section [TIME-PERIODS] */
+ unsigned int time_period_rotation_offset = sr_state_get_phase_duration();
+ return (time_t)(start_of_next_tp_in_mins * 60 + time_period_rotation_offset);
}
/* Create a new rend_data_t for a specific given <b>version</b>.
@@ -344,3 +508,1232 @@ rend_data_get_pk_digest(const rend_data_t *rend_data, size_t *len_out)
}
}
+/* Using the given time period number, compute the disaster shared random
+ * value and put it in srv_out. It MUST be at least DIGEST256_LEN bytes. */
+static void
+compute_disaster_srv(uint64_t time_period_num, uint8_t *srv_out)
+{
+ crypto_digest_t *digest;
+
+ tor_assert(srv_out);
+
+ digest = crypto_digest256_new(DIGEST_SHA3_256);
+
+ /* Start setting up payload:
+ * H("shared-random-disaster" | INT_8(period_length) | INT_8(period_num)) */
+ crypto_digest_add_bytes(digest, HS_SRV_DISASTER_PREFIX,
+ HS_SRV_DISASTER_PREFIX_LEN);
+
+ /* Setup INT_8(period_length) | INT_8(period_num) */
+ {
+ uint64_t time_period_length = get_time_period_length();
+ char period_stuff[sizeof(uint64_t)*2];
+ size_t offset = 0;
+ set_uint64(period_stuff, tor_htonll(time_period_length));
+ offset += sizeof(uint64_t);
+ set_uint64(period_stuff+offset, tor_htonll(time_period_num));
+ offset += sizeof(uint64_t);
+ tor_assert(offset == sizeof(period_stuff));
+
+ crypto_digest_add_bytes(digest, period_stuff, sizeof(period_stuff));
+ }
+
+ crypto_digest_get_digest(digest, (char *) srv_out, DIGEST256_LEN);
+ crypto_digest_free(digest);
+}
+
+/** Due to the high cost of computing the disaster SRV and that potentially we
+ * would have to do it thousands of times in a row, we always cache the
+ * computer disaster SRV (and its corresponding time period num) in case we
+ * want to reuse it soon after. We need to cache two SRVs, one for each active
+ * time period (in case of overlap mode).
+ */
+static uint8_t cached_disaster_srv[2][DIGEST256_LEN];
+static uint64_t cached_time_period_nums[2] = {0};
+
+/** Compute the disaster SRV value for this <b>time_period_num</b> and put it
+ * in <b>srv_out</b> (of size at least DIGEST256_LEN). First check our caches
+ * to see if we have already computed it. */
+STATIC void
+get_disaster_srv(uint64_t time_period_num, uint8_t *srv_out)
+{
+ if (time_period_num == cached_time_period_nums[0]) {
+ memcpy(srv_out, cached_disaster_srv[0], DIGEST256_LEN);
+ return;
+ } else if (time_period_num == cached_time_period_nums[1]) {
+ memcpy(srv_out, cached_disaster_srv[1], DIGEST256_LEN);
+ return;
+ } else {
+ int replace_idx;
+ // Replace the lower period number.
+ if (cached_time_period_nums[0] <= cached_time_period_nums[1]) {
+ replace_idx = 0;
+ } else {
+ replace_idx = 1;
+ }
+ cached_time_period_nums[replace_idx] = time_period_num;
+ compute_disaster_srv(time_period_num, cached_disaster_srv[replace_idx]);
+ memcpy(srv_out, cached_disaster_srv[replace_idx], DIGEST256_LEN);
+ return;
+ }
+}
+
+#ifdef TOR_UNIT_TESTS
+
+/** Get the first cached disaster SRV. Only used by unittests. */
+STATIC uint8_t *
+get_first_cached_disaster_srv(void)
+{
+ return cached_disaster_srv[0];
+}
+
+/** Get the second cached disaster SRV. Only used by unittests. */
+STATIC uint8_t *
+get_second_cached_disaster_srv(void)
+{
+ return cached_disaster_srv[1];
+}
+
+#endif
+
+/* When creating a blinded key, we need a parameter which construction is as
+ * follow: H(pubkey | [secret] | ed25519-basepoint | nonce).
+ *
+ * The nonce has a pre-defined format which uses the time period number
+ * period_num and the start of the period in second start_time_period.
+ *
+ * The secret of size secret_len is optional meaning that it can be NULL and
+ * thus will be ignored for the param construction.
+ *
+ * The result is put in param_out. */
+static void
+build_blinded_key_param(const ed25519_public_key_t *pubkey,
+ const uint8_t *secret, size_t secret_len,
+ uint64_t period_num, uint64_t period_length,
+ uint8_t *param_out)
+{
+ size_t offset = 0;
+ const char blind_str[] = "Derive temporary signing key";
+ uint8_t nonce[HS_KEYBLIND_NONCE_LEN];
+ crypto_digest_t *digest;
+
+ tor_assert(pubkey);
+ tor_assert(param_out);
+
+ /* Create the nonce N. The construction is as follow:
+ * N = "key-blind" || INT_8(period_num) || INT_8(period_length) */
+ memcpy(nonce, HS_KEYBLIND_NONCE_PREFIX, HS_KEYBLIND_NONCE_PREFIX_LEN);
+ offset += HS_KEYBLIND_NONCE_PREFIX_LEN;
+ set_uint64(nonce + offset, tor_htonll(period_num));
+ offset += sizeof(uint64_t);
+ set_uint64(nonce + offset, tor_htonll(period_length));
+ offset += sizeof(uint64_t);
+ tor_assert(offset == HS_KEYBLIND_NONCE_LEN);
+
+ /* Generate the parameter h and the construction is as follow:
+ * h = H(BLIND_STRING | pubkey | [secret] | ed25519-basepoint | N) */
+ digest = crypto_digest256_new(DIGEST_SHA3_256);
+ crypto_digest_add_bytes(digest, blind_str, sizeof(blind_str));
+ crypto_digest_add_bytes(digest, (char *) pubkey, ED25519_PUBKEY_LEN);
+ /* Optional secret. */
+ if (secret) {
+ crypto_digest_add_bytes(digest, (char *) secret, secret_len);
+ }
+ crypto_digest_add_bytes(digest, str_ed25519_basepoint,
+ strlen(str_ed25519_basepoint));
+ crypto_digest_add_bytes(digest, (char *) nonce, sizeof(nonce));
+
+ /* Extract digest and put it in the param. */
+ crypto_digest_get_digest(digest, (char *) param_out, DIGEST256_LEN);
+ crypto_digest_free(digest);
+
+ memwipe(nonce, 0, sizeof(nonce));
+}
+
+/* Using an ed25519 public key and version to build the checksum of an
+ * address. Put in checksum_out. Format is:
+ * SHA3-256(".onion checksum" || PUBKEY || VERSION)
+ *
+ * checksum_out must be large enough to receive 32 bytes (DIGEST256_LEN). */
+static void
+build_hs_checksum(const ed25519_public_key_t *key, uint8_t version,
+ uint8_t *checksum_out)
+{
+ size_t offset = 0;
+ char data[HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN];
+
+ /* Build checksum data. */
+ memcpy(data, HS_SERVICE_ADDR_CHECKSUM_PREFIX,
+ HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN);
+ offset += HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN;
+ memcpy(data + offset, key->pubkey, ED25519_PUBKEY_LEN);
+ offset += ED25519_PUBKEY_LEN;
+ set_uint8(data + offset, version);
+ offset += sizeof(version);
+ tor_assert(offset == HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN);
+
+ /* Hash the data payload to create the checksum. */
+ crypto_digest256((char *) checksum_out, data, sizeof(data),
+ DIGEST_SHA3_256);
+}
+
+/* Using an ed25519 public key, checksum and version to build the binary
+ * representation of a service address. Put in addr_out. Format is:
+ * addr_out = PUBKEY || CHECKSUM || VERSION
+ *
+ * addr_out must be large enough to receive HS_SERVICE_ADDR_LEN bytes. */
+static void
+build_hs_address(const ed25519_public_key_t *key, const uint8_t *checksum,
+ uint8_t version, char *addr_out)
+{
+ size_t offset = 0;
+
+ tor_assert(key);
+ tor_assert(checksum);
+
+ memcpy(addr_out, key->pubkey, ED25519_PUBKEY_LEN);
+ offset += ED25519_PUBKEY_LEN;
+ memcpy(addr_out + offset, checksum, HS_SERVICE_ADDR_CHECKSUM_LEN_USED);
+ offset += HS_SERVICE_ADDR_CHECKSUM_LEN_USED;
+ set_uint8(addr_out + offset, version);
+ offset += sizeof(uint8_t);
+ tor_assert(offset == HS_SERVICE_ADDR_LEN);
+}
+
+/* Helper for hs_parse_address(): Using a binary representation of a service
+ * address, parse its content into the key_out, checksum_out and version_out.
+ * Any out variable can be NULL in case the caller would want only one field.
+ * checksum_out MUST at least be 2 bytes long. address must be at least
+ * HS_SERVICE_ADDR_LEN bytes but doesn't need to be NUL terminated. */
+static void
+hs_parse_address_impl(const char *address, ed25519_public_key_t *key_out,
+ uint8_t *checksum_out, uint8_t *version_out)
+{
+ size_t offset = 0;
+
+ tor_assert(address);
+
+ if (key_out) {
+ /* First is the key. */
+ memcpy(key_out->pubkey, address, ED25519_PUBKEY_LEN);
+ }
+ offset += ED25519_PUBKEY_LEN;
+ if (checksum_out) {
+ /* Followed by a 2 bytes checksum. */
+ memcpy(checksum_out, address + offset, HS_SERVICE_ADDR_CHECKSUM_LEN_USED);
+ }
+ offset += HS_SERVICE_ADDR_CHECKSUM_LEN_USED;
+ if (version_out) {
+ /* Finally, version value is 1 byte. */
+ *version_out = get_uint8(address + offset);
+ }
+ offset += sizeof(uint8_t);
+ /* Extra safety. */
+ tor_assert(offset == HS_SERVICE_ADDR_LEN);
+}
+
+/* Using the given identity public key and a blinded public key, compute the
+ * subcredential and put it in subcred_out (must be of size DIGEST256_LEN).
+ * This can't fail. */
+void
+hs_get_subcredential(const ed25519_public_key_t *identity_pk,
+ const ed25519_public_key_t *blinded_pk,
+ uint8_t *subcred_out)
+{
+ uint8_t credential[DIGEST256_LEN];
+ crypto_digest_t *digest;
+
+ tor_assert(identity_pk);
+ tor_assert(blinded_pk);
+ tor_assert(subcred_out);
+
+ /* First, build the credential. Construction is as follow:
+ * credential = H("credential" | public-identity-key) */
+ digest = crypto_digest256_new(DIGEST_SHA3_256);
+ crypto_digest_add_bytes(digest, HS_CREDENTIAL_PREFIX,
+ HS_CREDENTIAL_PREFIX_LEN);
+ crypto_digest_add_bytes(digest, (const char *) identity_pk->pubkey,
+ ED25519_PUBKEY_LEN);
+ crypto_digest_get_digest(digest, (char *) credential, DIGEST256_LEN);
+ crypto_digest_free(digest);
+
+ /* Now, compute the subcredential. Construction is as follow:
+ * subcredential = H("subcredential" | credential | blinded-public-key). */
+ digest = crypto_digest256_new(DIGEST_SHA3_256);
+ crypto_digest_add_bytes(digest, HS_SUBCREDENTIAL_PREFIX,
+ HS_SUBCREDENTIAL_PREFIX_LEN);
+ crypto_digest_add_bytes(digest, (const char *) credential,
+ sizeof(credential));
+ crypto_digest_add_bytes(digest, (const char *) blinded_pk->pubkey,
+ ED25519_PUBKEY_LEN);
+ crypto_digest_get_digest(digest, (char *) subcred_out, DIGEST256_LEN);
+ crypto_digest_free(digest);
+
+ memwipe(credential, 0, sizeof(credential));
+}
+
+/* From the given list of hidden service ports, find the ones that much the
+ * given edge connection conn, pick one at random and use it to set the
+ * connection address. Return 0 on success or -1 if none. */
+int
+hs_set_conn_addr_port(const smartlist_t *ports, edge_connection_t *conn)
+{
+ rend_service_port_config_t *chosen_port;
+ unsigned int warn_once = 0;
+ smartlist_t *matching_ports;
+
+ tor_assert(ports);
+ tor_assert(conn);
+
+ matching_ports = smartlist_new();
+ SMARTLIST_FOREACH_BEGIN(ports, rend_service_port_config_t *, p) {
+ if (TO_CONN(conn)->port != p->virtual_port) {
+ continue;
+ }
+ if (!(p->is_unix_addr)) {
+ smartlist_add(matching_ports, p);
+ } else {
+ if (add_unix_port(matching_ports, p)) {
+ if (!warn_once) {
+ /* Unix port not supported so warn only once. */
+ log_warn(LD_REND, "Saw AF_UNIX virtual port mapping for port %d "
+ "which is unsupported on this platform. "
+ "Ignoring it.",
+ TO_CONN(conn)->port);
+ }
+ warn_once++;
+ }
+ }
+ } SMARTLIST_FOREACH_END(p);
+
+ chosen_port = smartlist_choose(matching_ports);
+ smartlist_free(matching_ports);
+ if (chosen_port) {
+ if (!(chosen_port->is_unix_addr)) {
+ /* Get a non-AF_UNIX connection ready for connection_exit_connect() */
+ tor_addr_copy(&TO_CONN(conn)->addr, &chosen_port->real_addr);
+ TO_CONN(conn)->port = chosen_port->real_port;
+ } else {
+ if (set_unix_port(conn, chosen_port)) {
+ /* Simply impossible to end up here else we were able to add a Unix
+ * port without AF_UNIX support... ? */
+ tor_assert(0);
+ }
+ }
+ }
+ return (chosen_port) ? 0 : -1;
+}
+
+/* Using a base32 representation of a service address, parse its content into
+ * the key_out, checksum_out and version_out. Any out variable can be NULL in
+ * case the caller would want only one field. checksum_out MUST at least be 2
+ * bytes long.
+ *
+ * Return 0 if parsing went well; return -1 in case of error. */
+int
+hs_parse_address(const char *address, ed25519_public_key_t *key_out,
+ uint8_t *checksum_out, uint8_t *version_out)
+{
+ char decoded[HS_SERVICE_ADDR_LEN];
+
+ tor_assert(address);
+
+ /* Obvious length check. */
+ if (strlen(address) != HS_SERVICE_ADDR_LEN_BASE32) {
+ log_warn(LD_REND, "Service address %s has an invalid length. "
+ "Expected %lu but got %lu.",
+ escaped_safe_str(address),
+ (unsigned long) HS_SERVICE_ADDR_LEN_BASE32,
+ (unsigned long) strlen(address));
+ goto invalid;
+ }
+
+ /* Decode address so we can extract needed fields. */
+ if (base32_decode(decoded, sizeof(decoded), address, strlen(address)) < 0) {
+ log_warn(LD_REND, "Service address %s can't be decoded.",
+ escaped_safe_str(address));
+ goto invalid;
+ }
+
+ /* Parse the decoded address into the fields we need. */
+ hs_parse_address_impl(decoded, key_out, checksum_out, version_out);
+
+ return 0;
+ invalid:
+ return -1;
+}
+
+/* Validate a given onion address. The length, the base32 decoding and
+ * checksum are validated. Return 1 if valid else 0. */
+int
+hs_address_is_valid(const char *address)
+{
+ uint8_t version;
+ uint8_t checksum[HS_SERVICE_ADDR_CHECKSUM_LEN_USED];
+ uint8_t target_checksum[DIGEST256_LEN];
+ ed25519_public_key_t key;
+
+ /* Parse the decoded address into the fields we need. */
+ if (hs_parse_address(address, &key, checksum, &version) < 0) {
+ goto invalid;
+ }
+
+ /* Get the checksum it's suppose to be and compare it with what we have
+ * encoded in the address. */
+ build_hs_checksum(&key, version, target_checksum);
+ if (tor_memcmp(checksum, target_checksum, sizeof(checksum))) {
+ log_warn(LD_REND, "Service address %s invalid checksum.",
+ escaped_safe_str(address));
+ goto invalid;
+ }
+
+ /* Valid address. */
+ return 1;
+ invalid:
+ return 0;
+}
+
+/* Build a service address using an ed25519 public key and a given version.
+ * The returned address is base32 encoded and put in addr_out. The caller MUST
+ * make sure the addr_out is at least HS_SERVICE_ADDR_LEN_BASE32 + 1 long.
+ *
+ * Format is as follow:
+ * base32(PUBKEY || CHECKSUM || VERSION)
+ * CHECKSUM = H(".onion checksum" || PUBKEY || VERSION)
+ * */
+void
+hs_build_address(const ed25519_public_key_t *key, uint8_t version,
+ char *addr_out)
+{
+ uint8_t checksum[DIGEST256_LEN];
+ char address[HS_SERVICE_ADDR_LEN];
+
+ tor_assert(key);
+ tor_assert(addr_out);
+
+ /* Get the checksum of the address. */
+ build_hs_checksum(key, version, checksum);
+ /* Get the binary address representation. */
+ build_hs_address(key, checksum, version, address);
+
+ /* Encode the address. addr_out will be NUL terminated after this. */
+ base32_encode(addr_out, HS_SERVICE_ADDR_LEN_BASE32 + 1, address,
+ sizeof(address));
+ /* Validate what we just built. */
+ tor_assert(hs_address_is_valid(addr_out));
+}
+
+/* Return a newly allocated copy of lspec. */
+link_specifier_t *
+hs_link_specifier_dup(const link_specifier_t *lspec)
+{
+ link_specifier_t *dup = link_specifier_new();
+ memcpy(dup, lspec, sizeof(*dup));
+ /* The unrecognized field is a dynamic array so make sure to copy its
+ * content and not the pointer. */
+ link_specifier_setlen_un_unrecognized(
+ dup, link_specifier_getlen_un_unrecognized(lspec));
+ if (link_specifier_getlen_un_unrecognized(dup)) {
+ memcpy(link_specifier_getarray_un_unrecognized(dup),
+ link_specifier_getconstarray_un_unrecognized(lspec),
+ link_specifier_getlen_un_unrecognized(dup));
+ }
+ return dup;
+}
+
+/* From a given ed25519 public key pk and an optional secret, compute a
+ * blinded public key and put it in blinded_pk_out. This is only useful to
+ * the client side because the client only has access to the identity public
+ * key of the service. */
+void
+hs_build_blinded_pubkey(const ed25519_public_key_t *pk,
+ const uint8_t *secret, size_t secret_len,
+ uint64_t time_period_num,
+ ed25519_public_key_t *blinded_pk_out)
+{
+ /* Our blinding key API requires a 32 bytes parameter. */
+ uint8_t param[DIGEST256_LEN];
+
+ tor_assert(pk);
+ tor_assert(blinded_pk_out);
+ tor_assert(!tor_mem_is_zero((char *) pk, ED25519_PUBKEY_LEN));
+
+ build_blinded_key_param(pk, secret, secret_len,
+ time_period_num, get_time_period_length(), param);
+ ed25519_public_blind(blinded_pk_out, pk, param);
+
+ memwipe(param, 0, sizeof(param));
+}
+
+/* From a given ed25519 keypair kp and an optional secret, compute a blinded
+ * keypair for the current time period and put it in blinded_kp_out. This is
+ * only useful by the service side because the client doesn't have access to
+ * the identity secret key. */
+void
+hs_build_blinded_keypair(const ed25519_keypair_t *kp,
+ const uint8_t *secret, size_t secret_len,
+ uint64_t time_period_num,
+ ed25519_keypair_t *blinded_kp_out)
+{
+ /* Our blinding key API requires a 32 bytes parameter. */
+ uint8_t param[DIGEST256_LEN];
+
+ tor_assert(kp);
+ tor_assert(blinded_kp_out);
+ /* Extra safety. A zeroed key is bad. */
+ tor_assert(!tor_mem_is_zero((char *) &kp->pubkey, ED25519_PUBKEY_LEN));
+ tor_assert(!tor_mem_is_zero((char *) &kp->seckey, ED25519_SECKEY_LEN));
+
+ build_blinded_key_param(&kp->pubkey, secret, secret_len,
+ time_period_num, get_time_period_length(), param);
+ ed25519_keypair_blind(blinded_kp_out, kp, param);
+
+ memwipe(param, 0, sizeof(param));
+}
+
+/* Return true if overlap mode is active given the date in consensus. If
+ * consensus is NULL, then we use the latest live consensus we can find. */
+MOCK_IMPL(int,
+hs_overlap_mode_is_active, (const networkstatus_t *consensus, time_t now))
+{
+ time_t valid_after;
+ time_t srv_start_time, tp_start_time;
+
+ if (!consensus) {
+ consensus = networkstatus_get_live_consensus(now);
+ if (!consensus) {
+ return 0;
+ }
+ }
+
+ /* We consider to be in overlap mode when we are in the period of time
+ * between a fresh SRV and the beginning of the new time period (in the
+ * normal network this is between 00:00 (inclusive) and 12:00 UTC
+ * (exclusive)) */
+ valid_after = consensus->valid_after;
+ srv_start_time =sr_state_get_start_time_of_current_protocol_run(valid_after);
+ tp_start_time = hs_get_start_time_of_next_time_period(srv_start_time);
+
+ if (valid_after >= srv_start_time && valid_after < tp_start_time) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Return 1 if any virtual port in ports needs a circuit with good uptime.
+ * Else return 0. */
+int
+hs_service_requires_uptime_circ(const smartlist_t *ports)
+{
+ tor_assert(ports);
+
+ SMARTLIST_FOREACH_BEGIN(ports, rend_service_port_config_t *, p) {
+ if (smartlist_contains_int_as_string(get_options()->LongLivedPorts,
+ p->virtual_port)) {
+ return 1;
+ }
+ } SMARTLIST_FOREACH_END(p);
+ return 0;
+}
+
+/* Build hs_index which is used to find the responsible hsdirs. This index
+ * value is used to select the responsible HSDir where their hsdir_index is
+ * closest to this value.
+ * SHA3-256("store-at-idx" | blinded_public_key |
+ * INT_8(replicanum) | INT_8(period_length) | INT_8(period_num) )
+ *
+ * hs_index_out must be large enough to receive DIGEST256_LEN bytes. */
+void
+hs_build_hs_index(uint64_t replica, const ed25519_public_key_t *blinded_pk,
+ uint64_t period_num, uint8_t *hs_index_out)
+{
+ crypto_digest_t *digest;
+
+ tor_assert(blinded_pk);
+ tor_assert(hs_index_out);
+
+ /* Build hs_index. See construction at top of function comment. */
+ digest = crypto_digest256_new(DIGEST_SHA3_256);
+ crypto_digest_add_bytes(digest, HS_INDEX_PREFIX, HS_INDEX_PREFIX_LEN);
+ crypto_digest_add_bytes(digest, (const char *) blinded_pk->pubkey,
+ ED25519_PUBKEY_LEN);
+
+ /* Now setup INT_8(replicanum) | INT_8(period_length) | INT_8(period_num) */
+ {
+ uint64_t period_length = get_time_period_length();
+ char buf[sizeof(uint64_t)*3];
+ size_t offset = 0;
+ set_uint64(buf, tor_htonll(replica));
+ offset += sizeof(uint64_t);
+ set_uint64(buf+offset, tor_htonll(period_length));
+ offset += sizeof(uint64_t);
+ set_uint64(buf+offset, tor_htonll(period_num));
+ offset += sizeof(uint64_t);
+ tor_assert(offset == sizeof(buf));
+
+ crypto_digest_add_bytes(digest, buf, sizeof(buf));
+ }
+
+ crypto_digest_get_digest(digest, (char *) hs_index_out, DIGEST256_LEN);
+ crypto_digest_free(digest);
+}
+
+/* Build hsdir_index which is used to find the responsible hsdirs. This is the
+ * index value that is compare to the hs_index when selecting an HSDir.
+ * SHA3-256("node-idx" | node_identity |
+ * shared_random_value | INT_8(period_length) | INT_8(period_num) )
+ *
+ * hsdir_index_out must be large enough to receive DIGEST256_LEN bytes. */
+void
+hs_build_hsdir_index(const ed25519_public_key_t *identity_pk,
+ const uint8_t *srv_value, uint64_t period_num,
+ uint8_t *hsdir_index_out)
+{
+ crypto_digest_t *digest;
+
+ tor_assert(identity_pk);
+ tor_assert(srv_value);
+ tor_assert(hsdir_index_out);
+
+ /* Build hsdir_index. See construction at top of function comment. */
+ digest = crypto_digest256_new(DIGEST_SHA3_256);
+ crypto_digest_add_bytes(digest, HSDIR_INDEX_PREFIX, HSDIR_INDEX_PREFIX_LEN);
+ crypto_digest_add_bytes(digest, (const char *) identity_pk->pubkey,
+ ED25519_PUBKEY_LEN);
+ crypto_digest_add_bytes(digest, (const char *) srv_value, DIGEST256_LEN);
+
+ {
+ uint64_t time_period_length = get_time_period_length();
+ char period_stuff[sizeof(uint64_t)*2];
+ size_t offset = 0;
+ set_uint64(period_stuff, tor_htonll(period_num));
+ offset += sizeof(uint64_t);
+ set_uint64(period_stuff+offset, tor_htonll(time_period_length));
+ offset += sizeof(uint64_t);
+ tor_assert(offset == sizeof(period_stuff));
+
+ crypto_digest_add_bytes(digest, period_stuff, sizeof(period_stuff));
+ }
+
+ crypto_digest_get_digest(digest, (char *) hsdir_index_out, DIGEST256_LEN);
+ crypto_digest_free(digest);
+}
+
+/* Return a newly allocated buffer containing the current shared random value
+ * or if not present, a disaster value is computed using the given time period
+ * number. If a consensus is provided in <b>ns</b>, use it to get the SRV
+ * value. This function can't fail. */
+uint8_t *
+hs_get_current_srv(uint64_t time_period_num, const networkstatus_t *ns)
+{
+ uint8_t *sr_value = tor_malloc_zero(DIGEST256_LEN);
+ const sr_srv_t *current_srv = sr_get_current(ns);
+
+ if (current_srv) {
+ memcpy(sr_value, current_srv->value, sizeof(current_srv->value));
+ } else {
+ /* Disaster mode. */
+ get_disaster_srv(time_period_num, sr_value);
+ }
+ return sr_value;
+}
+
+/* Return a newly allocated buffer containing the previous shared random
+ * value or if not present, a disaster value is computed using the given time
+ * period number. This function can't fail. */
+uint8_t *
+hs_get_previous_srv(uint64_t time_period_num, const networkstatus_t *ns)
+{
+ uint8_t *sr_value = tor_malloc_zero(DIGEST256_LEN);
+ const sr_srv_t *previous_srv = sr_get_previous(ns);
+
+ if (previous_srv) {
+ memcpy(sr_value, previous_srv->value, sizeof(previous_srv->value));
+ } else {
+ /* Disaster mode. */
+ get_disaster_srv(time_period_num, sr_value);
+ }
+ return sr_value;
+}
+
+/* Return the number of replicas defined by a consensus parameter or the
+ * default value. */
+int32_t
+hs_get_hsdir_n_replicas(void)
+{
+ /* The [1,16] range is a specification requirement. */
+ return networkstatus_get_param(NULL, "hsdir_n_replicas",
+ HS_DEFAULT_HSDIR_N_REPLICAS, 1, 16);
+}
+
+/* Return the spread fetch value defined by a consensus parameter or the
+ * default value. */
+int32_t
+hs_get_hsdir_spread_fetch(void)
+{
+ /* The [1,128] range is a specification requirement. */
+ return networkstatus_get_param(NULL, "hsdir_spread_fetch",
+ HS_DEFAULT_HSDIR_SPREAD_FETCH, 1, 128);
+}
+
+/* Return the spread store value defined by a consensus parameter or the
+ * default value. */
+int32_t
+hs_get_hsdir_spread_store(void)
+{
+ /* The [1,128] range is a specification requirement. */
+ return networkstatus_get_param(NULL, "hsdir_spread_store",
+ HS_DEFAULT_HSDIR_SPREAD_STORE, 1, 128);
+}
+
+/** <b>node</b> is an HSDir so make sure that we have assigned an hsdir index.
+ * If <b>is_for_next_period</b> is set, also check the next HSDir index field.
+ * Return 0 if everything is as expected, else return -1. */
+static int
+node_has_hsdir_index(const node_t *node, int is_for_next_period)
+{
+ tor_assert(node_supports_v3_hsdir(node));
+
+ /* A node can't have an HSDir index without a descriptor since we need desc
+ * to get its ed25519 key */
+ if (!node_has_descriptor(node)) {
+ return 0;
+ }
+
+ /* At this point, since the node has a desc, this node must also have an
+ * hsdir index. If not, something went wrong, so BUG out. */
+ if (BUG(node->hsdir_index == NULL) ||
+ BUG(tor_mem_is_zero((const char*)node->hsdir_index->current,
+ DIGEST256_LEN))) {
+ return 0;
+ }
+
+ if (is_for_next_period &&
+ BUG(tor_mem_is_zero((const char*)node->hsdir_index->next,
+ DIGEST256_LEN))) {
+ return 0;
+ }
+
+ return 1;
+}
+
+/* For a given blinded key and time period number, get the responsible HSDir
+ * and put their routerstatus_t object in the responsible_dirs list. If
+ * is_next_period is true, the next hsdir_index of the node_t is used. If
+ * is_client is true, the spread fetch consensus parameter is used else the
+ * spread store is used which is only for upload. This function can't fail but
+ * it is possible that the responsible_dirs list contains fewer nodes than
+ * expected.
+ *
+ * This function goes over the latest consensus routerstatus list and sorts it
+ * by their node_t hsdir_index then does a binary search to find the closest
+ * node. All of this makes it a bit CPU intensive so use it wisely. */
+void
+hs_get_responsible_hsdirs(const ed25519_public_key_t *blinded_pk,
+ uint64_t time_period_num, int is_next_period,
+ int is_client, smartlist_t *responsible_dirs)
+{
+ smartlist_t *sorted_nodes;
+ /* The compare function used for the smartlist bsearch. We have two
+ * different depending on is_next_period. */
+ int (*cmp_fct)(const void *, const void **);
+
+ tor_assert(blinded_pk);
+ tor_assert(responsible_dirs);
+
+ sorted_nodes = smartlist_new();
+
+ /* Add every node_t that support HSDir v3 for which we do have a valid
+ * hsdir_index already computed for them for this consensus. */
+ {
+ networkstatus_t *c = networkstatus_get_latest_consensus();
+ if (!c || smartlist_len(c->routerstatus_list) == 0) {
+ log_warn(LD_REND, "No valid consensus so we can't get the responsible "
+ "hidden service directories.");
+ goto done;
+ }
+ SMARTLIST_FOREACH_BEGIN(c->routerstatus_list, const routerstatus_t *, rs) {
+ /* Even though this node_t object won't be modified and should be const,
+ * we can't add const object in a smartlist_t. */
+ node_t *n = node_get_mutable_by_id(rs->identity_digest);
+ tor_assert(n);
+ if (node_supports_v3_hsdir(n) && rs->is_hs_dir) {
+ if (!node_has_hsdir_index(n, is_next_period)) {
+ log_info(LD_GENERAL, "Node %s was found without hsdir index.",
+ node_describe(n));
+ continue;
+ }
+ smartlist_add(sorted_nodes, n);
+ }
+ } SMARTLIST_FOREACH_END(rs);
+ }
+ if (smartlist_len(sorted_nodes) == 0) {
+ log_warn(LD_REND, "No nodes found to be HSDir or supporting v3.");
+ goto done;
+ }
+
+ /* First thing we have to do is sort all node_t by hsdir_index. The
+ * is_next_period tells us if we want the current or the next one. Set the
+ * bsearch compare function also while we are at it. */
+ if (is_next_period) {
+ smartlist_sort(sorted_nodes, compare_node_next_hsdir_index);
+ cmp_fct = compare_digest_to_next_hsdir_index;
+ } else {
+ smartlist_sort(sorted_nodes, compare_node_current_hsdir_index);
+ cmp_fct = compare_digest_to_current_hsdir_index;
+ }
+
+ /* For all replicas, we'll select a set of HSDirs using the consensus
+ * parameters and the sorted list. The replica starting at value 1 is
+ * defined by the specification. */
+ for (int replica = 1; replica <= hs_get_hsdir_n_replicas(); replica++) {
+ int idx, start, found, n_added = 0;
+ uint8_t hs_index[DIGEST256_LEN] = {0};
+ /* Number of node to add to the responsible dirs list depends on if we are
+ * trying to fetch or store. A client always fetches. */
+ int n_to_add = (is_client) ? hs_get_hsdir_spread_fetch() :
+ hs_get_hsdir_spread_store();
+
+ /* Get the index that we should use to select the node. */
+ hs_build_hs_index(replica, blinded_pk, time_period_num, hs_index);
+ /* The compare function pointer has been set correctly earlier. */
+ start = idx = smartlist_bsearch_idx(sorted_nodes, hs_index, cmp_fct,
+ &found);
+ /* Getting the length of the list if no member is greater than the key we
+ * are looking for so start at the first element. */
+ if (idx == smartlist_len(sorted_nodes)) {
+ start = idx = 0;
+ }
+ while (n_added < n_to_add) {
+ const node_t *node = smartlist_get(sorted_nodes, idx);
+ /* If the node has already been selected which is possible between
+ * replicas, the specification says to skip over. */
+ if (!smartlist_contains(responsible_dirs, node->rs)) {
+ smartlist_add(responsible_dirs, node->rs);
+ ++n_added;
+ }
+ if (++idx == smartlist_len(sorted_nodes)) {
+ /* Wrap if we've reached the end of the list. */
+ idx = 0;
+ }
+ if (idx == start) {
+ /* We've gone over the whole list, stop and avoid infinite loop. */
+ break;
+ }
+ }
+ }
+
+ done:
+ smartlist_free(sorted_nodes);
+}
+
+/*********************** HSDir request tracking ***************************/
+
+/** Return the period for which a hidden service directory cannot be queried
+ * for the same descriptor ID again, taking TestingTorNetwork into account. */
+time_t
+hs_hsdir_requery_period(const or_options_t *options)
+{
+ tor_assert(options);
+
+ if (options->TestingTorNetwork) {
+ return REND_HID_SERV_DIR_REQUERY_PERIOD_TESTING;
+ } else {
+ return REND_HID_SERV_DIR_REQUERY_PERIOD;
+ }
+}
+
+/** Tracks requests for fetching hidden service descriptors. It's used by
+ * hidden service clients, to avoid querying HSDirs that have already failed
+ * giving back a descriptor. The same data structure is used to track both v2
+ * and v3 HS descriptor requests.
+ *
+ * The string map is a key/value store that contains the last request times to
+ * hidden service directories for certain queries. Specifically:
+ *
+ * key = base32(hsdir_identity) + base32(hs_identity)
+ * value = time_t of last request for that hs_identity to that HSDir
+ *
+ * where 'hsdir_identity' is the identity digest of the HSDir node, and
+ * 'hs_identity' is the descriptor ID of the HS in the v2 case, or the ed25519
+ * identity public key of the HS in the v3 case. */
+static strmap_t *last_hid_serv_requests_ = NULL;
+
+/** Returns last_hid_serv_requests_, initializing it to a new strmap if
+ * necessary. */
+STATIC strmap_t *
+get_last_hid_serv_requests(void)
+{
+ if (!last_hid_serv_requests_)
+ last_hid_serv_requests_ = strmap_new();
+ return last_hid_serv_requests_;
+}
+
+/** Look up the last request time to hidden service directory <b>hs_dir</b>
+ * for descriptor request key <b>req_key_str</b> which is the descriptor ID
+ * for a v2 service or the blinded key for v3. If <b>set</b> is non-zero,
+ * assign the current time <b>now</b> and return that. Otherwise, return the
+ * most recent request time, or 0 if no such request has been sent before. */
+time_t
+hs_lookup_last_hid_serv_request(routerstatus_t *hs_dir,
+ const char *req_key_str,
+ time_t now, int set)
+{
+ char hsdir_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
+ char *hsdir_desc_comb_id = NULL;
+ time_t *last_request_ptr;
+ strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
+
+ /* Create the key */
+ base32_encode(hsdir_id_base32, sizeof(hsdir_id_base32),
+ hs_dir->identity_digest, DIGEST_LEN);
+ tor_asprintf(&hsdir_desc_comb_id, "%s%s", hsdir_id_base32, req_key_str);
+
+ if (set) {
+ time_t *oldptr;
+ last_request_ptr = tor_malloc_zero(sizeof(time_t));
+ *last_request_ptr = now;
+ oldptr = strmap_set(last_hid_serv_requests, hsdir_desc_comb_id,
+ last_request_ptr);
+ tor_free(oldptr);
+ } else {
+ last_request_ptr = strmap_get(last_hid_serv_requests,
+ hsdir_desc_comb_id);
+ }
+
+ tor_free(hsdir_desc_comb_id);
+ return (last_request_ptr) ? *last_request_ptr : 0;
+}
+
+/** Clean the history of request times to hidden service directories, so that
+ * it does not contain requests older than REND_HID_SERV_DIR_REQUERY_PERIOD
+ * seconds any more. */
+void
+hs_clean_last_hid_serv_requests(time_t now)
+{
+ strmap_iter_t *iter;
+ time_t cutoff = now - hs_hsdir_requery_period(get_options());
+ strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
+ for (iter = strmap_iter_init(last_hid_serv_requests);
+ !strmap_iter_done(iter); ) {
+ const char *key;
+ void *val;
+ time_t *ent;
+ strmap_iter_get(iter, &key, &val);
+ ent = (time_t *) val;
+ if (*ent < cutoff) {
+ iter = strmap_iter_next_rmv(last_hid_serv_requests, iter);
+ tor_free(ent);
+ } else {
+ iter = strmap_iter_next(last_hid_serv_requests, iter);
+ }
+ }
+}
+
+/** Remove all requests related to the descriptor request key string
+ * <b>req_key_str</b> from the history of times of requests to hidden service
+ * directories.
+ *
+ * This is called from rend_client_note_connection_attempt_ended(), which
+ * must be idempotent, so any future changes to this function must leave it
+ * idempotent too. */
+void
+hs_purge_hid_serv_from_last_hid_serv_requests(const char *req_key_str)
+{
+ strmap_iter_t *iter;
+ strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
+
+ for (iter = strmap_iter_init(last_hid_serv_requests);
+ !strmap_iter_done(iter); ) {
+ const char *key;
+ void *val;
+ strmap_iter_get(iter, &key, &val);
+
+ /* XXX: The use of REND_DESC_ID_V2_LEN_BASE32 is very wrong in terms of
+ * semantic, see #23305. */
+
+ /* Length check on the strings we are about to compare. The "key" contains
+ * both the base32 HSDir identity digest and the requested key at the
+ * directory. The "req_key_str" can either be a base32 descriptor ID or a
+ * base64 blinded key which should be the second part of "key". BUG on
+ * this check because both strings are internally controlled so this
+ * should never happen. */
+ if (BUG((strlen(req_key_str) + REND_DESC_ID_V2_LEN_BASE32) <
+ strlen(key))) {
+ iter = strmap_iter_next(last_hid_serv_requests, iter);
+ continue;
+ }
+
+ /* Check if the tracked request matches our request key */
+ if (tor_memeq(key + REND_DESC_ID_V2_LEN_BASE32, req_key_str,
+ strlen(req_key_str))) {
+ iter = strmap_iter_next_rmv(last_hid_serv_requests, iter);
+ tor_free(val);
+ } else {
+ iter = strmap_iter_next(last_hid_serv_requests, iter);
+ }
+ }
+}
+
+/** Purge the history of request times to hidden service directories,
+ * so that future lookups of an HS descriptor will not fail because we
+ * accessed all of the HSDir relays responsible for the descriptor
+ * recently. */
+void
+hs_purge_last_hid_serv_requests(void)
+{
+ /* Don't create the table if it doesn't exist yet (and it may very
+ * well not exist if the user hasn't accessed any HSes)... */
+ strmap_t *old_last_hid_serv_requests = last_hid_serv_requests_;
+ /* ... and let get_last_hid_serv_requests re-create it for us if
+ * necessary. */
+ last_hid_serv_requests_ = NULL;
+
+ if (old_last_hid_serv_requests != NULL) {
+ log_info(LD_REND, "Purging client last-HS-desc-request-time table");
+ strmap_free(old_last_hid_serv_requests, tor_free_);
+ }
+}
+
+/***********************************************************************/
+
+/** Given the list of responsible HSDirs in <b>responsible_dirs</b>, pick the
+ * one that we should use to fetch a descriptor right now. Take into account
+ * previous failed attempts at fetching this descriptor from HSDirs using the
+ * string identifier <b>req_key_str</b>.
+ *
+ * Steals ownership of <b>responsible_dirs</b>.
+ *
+ * Return the routerstatus of the chosen HSDir if successful, otherwise return
+ * NULL if no HSDirs are worth trying right now. */
+routerstatus_t *
+hs_pick_hsdir(smartlist_t *responsible_dirs, const char *req_key_str)
+{
+ smartlist_t *usable_responsible_dirs = smartlist_new();
+ const or_options_t *options = get_options();
+ routerstatus_t *hs_dir;
+ time_t now = time(NULL);
+ int excluded_some;
+
+ tor_assert(req_key_str);
+
+ /* Clean outdated request history first. */
+ hs_clean_last_hid_serv_requests(now);
+
+ /* Only select those hidden service directories to which we did not send a
+ * request recently and for which we have a router descriptor here. */
+ SMARTLIST_FOREACH_BEGIN(responsible_dirs, routerstatus_t *, dir) {
+ time_t last = hs_lookup_last_hid_serv_request(dir, req_key_str, 0, 0);
+ const node_t *node = node_get_by_id(dir->identity_digest);
+ if (last + hs_hsdir_requery_period(options) >= now ||
+ !node || !node_has_descriptor(node)) {
+ SMARTLIST_DEL_CURRENT(responsible_dirs, dir);
+ continue;
+ }
+ if (!routerset_contains_node(options->ExcludeNodes, node)) {
+ smartlist_add(usable_responsible_dirs, dir);
+ }
+ } SMARTLIST_FOREACH_END(dir);
+
+ excluded_some =
+ smartlist_len(usable_responsible_dirs) < smartlist_len(responsible_dirs);
+
+ hs_dir = smartlist_choose(usable_responsible_dirs);
+ if (!hs_dir && !options->StrictNodes) {
+ hs_dir = smartlist_choose(responsible_dirs);
+ }
+
+ smartlist_free(responsible_dirs);
+ smartlist_free(usable_responsible_dirs);
+ if (!hs_dir) {
+ log_info(LD_REND, "Could not pick one of the responsible hidden "
+ "service directories, because we requested them all "
+ "recently without success.");
+ if (options->StrictNodes && excluded_some) {
+ log_warn(LD_REND, "Could not pick a hidden service directory for the "
+ "requested hidden service: they are all either down or "
+ "excluded, and StrictNodes is set.");
+ }
+ } else {
+ /* Remember that we are requesting a descriptor from this hidden service
+ * directory now. */
+ hs_lookup_last_hid_serv_request(hs_dir, req_key_str, now, 1);
+ }
+
+ return hs_dir;
+}
+
+/* From a list of link specifier, an onion key and if we are requesting a
+ * direct connection (ex: single onion service), return a newly allocated
+ * extend_info_t object. This function checks the firewall policies and if we
+ * are allowed to extend to the chosen address.
+ *
+ * if either IPv4 or legacy ID is missing, error.
+ * if not direct_conn, IPv4 is prefered.
+ * if direct_conn, IPv6 is prefered if we have one available.
+ * if firewall does not allow the chosen address, error.
+ *
+ * Return NULL if we can fulfill the conditions. */
+extend_info_t *
+hs_get_extend_info_from_lspecs(const smartlist_t *lspecs,
+ const curve25519_public_key_t *onion_key,
+ int direct_conn)
+{
+ int have_v4 = 0, have_v6 = 0, have_legacy_id = 0, have_ed25519_id = 0;
+ char legacy_id[DIGEST_LEN] = {0};
+ uint16_t port_v4 = 0, port_v6 = 0, port = 0;
+ tor_addr_t addr_v4, addr_v6, *addr = NULL;
+ ed25519_public_key_t ed25519_pk;
+ extend_info_t *info = NULL;
+
+ tor_assert(lspecs);
+
+ SMARTLIST_FOREACH_BEGIN(lspecs, const link_specifier_t *, ls) {
+ switch (link_specifier_get_ls_type(ls)) {
+ case LS_IPV4:
+ /* Skip if we already seen a v4. */
+ if (have_v4) continue;
+ tor_addr_from_ipv4h(&addr_v4,
+ link_specifier_get_un_ipv4_addr(ls));
+ port_v4 = link_specifier_get_un_ipv4_port(ls);
+ have_v4 = 1;
+ break;
+ case LS_IPV6:
+ /* Skip if we already seen a v6. */
+ if (have_v6) continue;
+ tor_addr_from_ipv6_bytes(&addr_v6,
+ (const char *) link_specifier_getconstarray_un_ipv6_addr(ls));
+ port_v6 = link_specifier_get_un_ipv6_port(ls);
+ have_v6 = 1;
+ break;
+ case LS_LEGACY_ID:
+ /* Make sure we do have enough bytes for the legacy ID. */
+ if (link_specifier_getlen_un_legacy_id(ls) < sizeof(legacy_id)) {
+ break;
+ }
+ memcpy(legacy_id, link_specifier_getconstarray_un_legacy_id(ls),
+ sizeof(legacy_id));
+ have_legacy_id = 1;
+ break;
+ case LS_ED25519_ID:
+ memcpy(ed25519_pk.pubkey,
+ link_specifier_getconstarray_un_ed25519_id(ls),
+ ED25519_PUBKEY_LEN);
+ have_ed25519_id = 1;
+ break;
+ default:
+ /* Ignore unknown. */
+ break;
+ }
+ } SMARTLIST_FOREACH_END(ls);
+
+ /* IPv4 and legacy ID are mandatory. */
+ if (!have_v4 || !have_legacy_id) {
+ goto done;
+ }
+ /* By default, we pick IPv4 but this might change to v6 if certain
+ * conditions are met. */
+ addr = &addr_v4; port = port_v4;
+
+ /* If we are NOT in a direct connection, we'll use our Guard and a 3-hop
+ * circuit so we can't extend in IPv6. And at this point, we do have an IPv4
+ * address available so go to validation. */
+ if (!direct_conn) {
+ goto validate;
+ }
+
+ /* From this point on, we have a request for a direct connection to the
+ * rendezvous point so make sure we can actually connect through our
+ * firewall. We'll prefer IPv6. */
+
+ /* IPv6 test. */
+ if (have_v6 &&
+ fascist_firewall_allows_address_addr(&addr_v6, port_v6,
+ FIREWALL_OR_CONNECTION, 1, 1)) {
+ /* Direct connection and we can reach it in IPv6 so go for it. */
+ addr = &addr_v6; port = port_v6;
+ goto validate;
+ }
+ /* IPv4 test and we are sure we have a v4 because of the check above. */
+ if (fascist_firewall_allows_address_addr(&addr_v4, port_v4,
+ FIREWALL_OR_CONNECTION, 0, 0)) {
+ /* Direct connection and we can reach it in IPv4 so go for it. */
+ addr = &addr_v4; port = port_v4;
+ goto validate;
+ }
+
+ validate:
+ /* We'll validate now that the address we've picked isn't a private one. If
+ * it is, are we allowing to extend to private address? */
+ if (!extend_info_addr_is_allowed(addr)) {
+ log_warn(LD_REND, "Requested address is private and it is not "
+ "allowed to extend to it: %s:%u",
+ fmt_addr(&addr_v4), port_v4);
+ goto done;
+ }
+
+ /* We do have everything for which we think we can connect successfully. */
+ info = extend_info_new(NULL, legacy_id,
+ (have_ed25519_id) ? &ed25519_pk : NULL, NULL,
+ onion_key, addr, port);
+ done:
+ return info;
+}
+
+/***********************************************************************/
+
+/* Initialize the entire HS subsytem. This is called in tor_init() before any
+ * torrc options are loaded. Only for >= v3. */
+void
+hs_init(void)
+{
+ hs_circuitmap_init();
+ hs_service_init();
+ hs_cache_init();
+}
+
+/* Release and cleanup all memory of the HS subsystem (all version). This is
+ * called by tor_free_all(). */
+void
+hs_free_all(void)
+{
+ hs_circuitmap_free_all();
+ hs_service_free_all();
+ hs_cache_free_all();
+}
+
+/* For the given origin circuit circ, decrement the number of rendezvous
+ * stream counter. This handles every hidden service version. */
+void
+hs_dec_rdv_stream_counter(origin_circuit_t *circ)
+{
+ tor_assert(circ);
+
+ if (circ->rend_data) {
+ circ->rend_data->nr_streams--;
+ } else if (circ->hs_ident) {
+ circ->hs_ident->num_rdv_streams--;
+ } else {
+ /* Should not be called if this circuit is not for hidden service. */
+ tor_assert_nonfatal_unreached();
+ }
+}
+
+/* For the given origin circuit circ, increment the number of rendezvous
+ * stream counter. This handles every hidden service version. */
+void
+hs_inc_rdv_stream_counter(origin_circuit_t *circ)
+{
+ tor_assert(circ);
+
+ if (circ->rend_data) {
+ circ->rend_data->nr_streams++;
+ } else if (circ->hs_ident) {
+ circ->hs_ident->num_rdv_streams++;
+ } else {
+ /* Should not be called if this circuit is not for hidden service. */
+ tor_assert_nonfatal_unreached();
+ }
+}
+
diff --git a/src/or/hs_common.h b/src/or/hs_common.h
index a8fded652a..79d92d915f 100644
--- a/src/or/hs_common.h
+++ b/src/or/hs_common.h
@@ -11,15 +11,21 @@
#include "or.h"
+/* Trunnel */
+#include "ed25519_cert.h"
+
/* Protocol version 2. Use this instead of hardcoding "2" in the code base,
* this adds a clearer semantic to the value when used. */
#define HS_VERSION_TWO 2
/* Version 3 of the protocol (prop224). */
#define HS_VERSION_THREE 3
+/* Earliest and latest version we support. */
+#define HS_VERSION_MIN HS_VERSION_TWO
+#define HS_VERSION_MAX HS_VERSION_THREE
/** Try to maintain this many intro points per service by default. */
#define NUM_INTRO_POINTS_DEFAULT 3
-/** Maximum number of intro points per service. */
+/** Maximum number of intro points per generic and version 2 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. */
@@ -46,12 +52,124 @@
#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 */
+
+/* Prefix of the onion address checksum. */
+#define HS_SERVICE_ADDR_CHECKSUM_PREFIX ".onion checksum"
+/* Length of the checksum prefix minus the NUL terminated byte. */
+#define HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN \
+ (sizeof(HS_SERVICE_ADDR_CHECKSUM_PREFIX) - 1)
+/* Length of the resulting checksum of the address. The construction of this
+ * checksum looks like:
+ * CHECKSUM = ".onion checksum" || PUBKEY || VERSION
+ * where VERSION is 1 byte. This is pre-hashing. */
+#define HS_SERVICE_ADDR_CHECKSUM_INPUT_LEN \
+ (HS_SERVICE_ADDR_CHECKSUM_PREFIX_LEN + ED25519_PUBKEY_LEN + sizeof(uint8_t))
+/* The amount of bytes we use from the address checksum. */
+#define HS_SERVICE_ADDR_CHECKSUM_LEN_USED 2
+/* Length of the binary encoded service address which is of course before the
+ * base32 encoding. Construction is:
+ * PUBKEY || CHECKSUM || VERSION
+ * with 1 byte VERSION and 2 bytes CHECKSUM. The following is 35 bytes. */
+#define HS_SERVICE_ADDR_LEN \
+ (ED25519_PUBKEY_LEN + HS_SERVICE_ADDR_CHECKSUM_LEN_USED + sizeof(uint8_t))
+/* Length of 'y' portion of 'y.onion' URL. This is base32 encoded and the
+ * length ends up to 56 bytes (not counting the terminated NUL byte.) */
+#define HS_SERVICE_ADDR_LEN_BASE32 \
+ (CEIL_DIV(HS_SERVICE_ADDR_LEN * 8, 5))
+
+/* 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 */
+/* Keyblinding parameter construction is as follow:
+ * "key-blind" || INT_8(period_num) || INT_8(start_period_sec) */
+#define HS_KEYBLIND_NONCE_PREFIX "key-blind"
+#define HS_KEYBLIND_NONCE_PREFIX_LEN (sizeof(HS_KEYBLIND_NONCE_PREFIX) - 1)
+#define HS_KEYBLIND_NONCE_LEN \
+ (HS_KEYBLIND_NONCE_PREFIX_LEN + sizeof(uint64_t) + sizeof(uint64_t))
+
+/* Credential and subcredential prefix value. */
+#define HS_CREDENTIAL_PREFIX "credential"
+#define HS_CREDENTIAL_PREFIX_LEN (sizeof(HS_CREDENTIAL_PREFIX) - 1)
+#define HS_SUBCREDENTIAL_PREFIX "subcredential"
+#define HS_SUBCREDENTIAL_PREFIX_LEN (sizeof(HS_SUBCREDENTIAL_PREFIX) - 1)
+
+/* Node hidden service stored at index prefix value. */
+#define HS_INDEX_PREFIX "store-at-idx"
+#define HS_INDEX_PREFIX_LEN (sizeof(HS_INDEX_PREFIX) - 1)
+
+/* Node hidden service directory index prefix value. */
+#define HSDIR_INDEX_PREFIX "node-idx"
+#define HSDIR_INDEX_PREFIX_LEN (sizeof(HSDIR_INDEX_PREFIX) - 1)
+
+/* Prefix of the shared random value disaster mode. */
+#define HS_SRV_DISASTER_PREFIX "shared-random-disaster"
+#define HS_SRV_DISASTER_PREFIX_LEN (sizeof(HS_SRV_DISASTER_PREFIX) - 1)
+
+/* Default value of number of hsdir replicas (hsdir_n_replicas). */
+#define HS_DEFAULT_HSDIR_N_REPLICAS 2
+/* Default value of hsdir spread store (hsdir_spread_store). */
+#define HS_DEFAULT_HSDIR_SPREAD_STORE 3
+/* Default value of hsdir spread fetch (hsdir_spread_fetch). */
+#define HS_DEFAULT_HSDIR_SPREAD_FETCH 3
+
+/* Type of authentication key used by an introduction point. */
+typedef enum {
+ HS_AUTH_KEY_TYPE_LEGACY = 1,
+ HS_AUTH_KEY_TYPE_ED25519 = 2,
+} hs_auth_key_type_t;
+
+/* Represents the mapping from a virtual port of a rendezvous service to a
+ * real port on some IP. */
+typedef struct rend_service_port_config_t {
+ /* The incoming HS virtual port we're mapping */
+ uint16_t virtual_port;
+ /* Is this an AF_UNIX port? */
+ unsigned int is_unix_addr:1;
+ /* The outgoing TCP port to use, if !is_unix_addr */
+ uint16_t real_port;
+ /* The outgoing IPv4 or IPv6 address to use, if !is_unix_addr */
+ tor_addr_t real_addr;
+ /* The socket path to connect to, if is_unix_addr */
+ char unix_addr[FLEXIBLE_ARRAY_MEMBER];
+} rend_service_port_config_t;
+
+/* Hidden service directory index used in a node_t which is set once we set
+ * the consensus. */
+typedef struct hsdir_index_t {
+ /* The hsdir index for the current time period. */
+ uint8_t current[DIGEST256_LEN];
+ /* The hsdir index for the next time period. */
+ uint8_t next[DIGEST256_LEN];
+} hsdir_index_t;
+
+void hs_init(void);
+void hs_free_all(void);
+
int hs_check_service_private_dir(const char *username, const char *path,
unsigned int dir_group_readable,
unsigned int create);
+char *hs_path_from_filename(const char *directory, const char *filename);
+void hs_build_address(const ed25519_public_key_t *key, uint8_t version,
+ char *addr_out);
+int hs_address_is_valid(const char *address);
+int hs_parse_address(const char *address, ed25519_public_key_t *key_out,
+ uint8_t *checksum_out, uint8_t *version_out);
+
+void hs_build_blinded_pubkey(const ed25519_public_key_t *pubkey,
+ const uint8_t *secret, size_t secret_len,
+ uint64_t time_period_num,
+ ed25519_public_key_t *pubkey_out);
+void hs_build_blinded_keypair(const ed25519_keypair_t *kp,
+ const uint8_t *secret, size_t secret_len,
+ uint64_t time_period_num,
+ ed25519_keypair_t *kp_out);
+int hs_service_requires_uptime_circ(const smartlist_t *ports);
void rend_data_free(rend_data_t *data);
rend_data_t *rend_data_dup(const rend_data_t *data);
@@ -69,14 +187,78 @@ 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);
+routerstatus_t *pick_hsdir(const char *desc_id, const char *desc_id_base32);
+
+void hs_get_subcredential(const ed25519_public_key_t *identity_pk,
+ const ed25519_public_key_t *blinded_pk,
+ uint8_t *subcred_out);
+
+uint64_t hs_get_time_period_num(time_t now);
uint64_t hs_get_next_time_period_num(time_t now);
+time_t hs_get_start_time_of_next_time_period(time_t now);
+
+link_specifier_t *hs_link_specifier_dup(const link_specifier_t *lspec);
+
+MOCK_DECL(int, hs_overlap_mode_is_active,
+ (const networkstatus_t *consensus, time_t now));
+
+uint8_t *hs_get_current_srv(uint64_t time_period_num,
+ const networkstatus_t *ns);
+uint8_t *hs_get_previous_srv(uint64_t time_period_num,
+ const networkstatus_t *ns);
+
+void hs_build_hsdir_index(const ed25519_public_key_t *identity_pk,
+ const uint8_t *srv, uint64_t period_num,
+ uint8_t *hsdir_index_out);
+void hs_build_hs_index(uint64_t replica,
+ const ed25519_public_key_t *blinded_pk,
+ uint64_t period_num, uint8_t *hs_index_out);
+
+int32_t hs_get_hsdir_n_replicas(void);
+int32_t hs_get_hsdir_spread_fetch(void);
+int32_t hs_get_hsdir_spread_store(void);
+
+void hs_get_responsible_hsdirs(const ed25519_public_key_t *blinded_pk,
+ uint64_t time_period_num, int is_next_period,
+ int is_client, smartlist_t *responsible_dirs);
+routerstatus_t *hs_pick_hsdir(smartlist_t *responsible_dirs,
+ const char *req_key_str);
+
+time_t hs_hsdir_requery_period(const or_options_t *options);
+time_t hs_lookup_last_hid_serv_request(routerstatus_t *hs_dir,
+ const char *desc_id_base32,
+ time_t now, int set);
+void hs_clean_last_hid_serv_requests(time_t now);
+void hs_purge_hid_serv_from_last_hid_serv_requests(const char *desc_id);
+void hs_purge_last_hid_serv_requests(void);
+
+int hs_set_conn_addr_port(const smartlist_t *ports, edge_connection_t *conn);
+
+void hs_inc_rdv_stream_counter(origin_circuit_t *circ);
+void hs_dec_rdv_stream_counter(origin_circuit_t *circ);
+
+extend_info_t *hs_get_extend_info_from_lspecs(const smartlist_t *lspecs,
+ const curve25519_public_key_t *onion_key,
+ int direct_conn);
#ifdef HS_COMMON_PRIVATE
+STATIC void get_disaster_srv(uint64_t time_period_num, uint8_t *srv_out);
+
+/** The period for which a hidden service directory cannot be queried for
+ * the same descriptor ID again. */
+#define REND_HID_SERV_DIR_REQUERY_PERIOD (15 * 60)
+/** Test networks generate a new consensus every 5 or 10 seconds.
+ * So allow them to requery HSDirs much faster. */
+#define REND_HID_SERV_DIR_REQUERY_PERIOD_TESTING (5)
+
#ifdef TOR_UNIT_TESTS
+STATIC strmap_t *get_last_hid_serv_requests(void);
STATIC uint64_t get_time_period_length(void);
-STATIC uint64_t get_time_period_num(time_t now);
+
+STATIC uint8_t *get_first_cached_disaster_srv(void);
+STATIC uint8_t *get_second_cached_disaster_srv(void);
#endif /* TOR_UNIT_TESTS */
diff --git a/src/or/hs_config.c b/src/or/hs_config.c
new file mode 100644
index 0000000000..5f9282ea79
--- /dev/null
+++ b/src/or/hs_config.c
@@ -0,0 +1,582 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_config.c
+ * \brief Implement hidden service configuration subsystem.
+ *
+ * \details
+ *
+ * This file has basically one main entry point: hs_config_service_all(). It
+ * takes the torrc options and configure hidden service from it. In validate
+ * mode, nothing is added to the global service list or keys are not generated
+ * nor loaded.
+ *
+ * A service is configured in two steps. It is first created using the tor
+ * options and then put in a staging list. It will stay there until
+ * hs_service_load_all_keys() is called. That function is responsible to
+ * load/generate the keys for the service in the staging list and if
+ * successful, transfert the service to the main global service list where
+ * at that point it is ready to be used.
+ *
+ * Configuration functions are per-version and there is a main generic one for
+ * every option that is common to all version (config_generic_service).
+ **/
+
+#define HS_CONFIG_PRIVATE
+
+#include "hs_common.h"
+#include "hs_config.h"
+#include "hs_service.h"
+#include "rendservice.h"
+
+/* Using the given list of services, stage them into our global state. Every
+ * service version are handled. This function can remove entries in the given
+ * service_list.
+ *
+ * Staging a service means that we take all services in service_list and we
+ * put them in the staging list (global) which acts as a temporary list that
+ * is used by the service loading key process. In other words, staging a
+ * service puts it in a list to be considered when loading the keys and then
+ * moved to the main global list. */
+static void
+stage_services(smartlist_t *service_list)
+{
+ tor_assert(service_list);
+
+ /* This is v2 specific. Trigger service pruning which will make sure the
+ * just configured services end up in the main global list. It should only
+ * be done in non validation mode because v2 subsystem handles service
+ * object differently. */
+ rend_service_prune_list();
+
+ /* Cleanup v2 service from the list, we don't need those object anymore
+ * because we validated them all against the others and we want to stage
+ * only >= v3 service. And remember, v2 has a different object type which is
+ * shadow copied from an hs_service_t type. */
+ SMARTLIST_FOREACH_BEGIN(service_list, hs_service_t *, s) {
+ if (s->config.version == HS_VERSION_TWO) {
+ SMARTLIST_DEL_CURRENT(service_list, s);
+ hs_service_free(s);
+ }
+ } SMARTLIST_FOREACH_END(s);
+
+ /* This is >= v3 specific. Using the newly configured service list, stage
+ * them into our global state. Every object ownership is lost after. */
+ hs_service_stage_services(service_list);
+}
+
+/* Validate the given service against all service in the given list. If the
+ * service is ephemeral, this function ignores it. Services with the same
+ * directory path aren't allowed and will return an error. If a duplicate is
+ * found, 1 is returned else 0 if none found. */
+static int
+service_is_duplicate_in_list(const smartlist_t *service_list,
+ const hs_service_t *service)
+{
+ int ret = 0;
+
+ tor_assert(service_list);
+ tor_assert(service);
+
+ /* Ephemeral service don't have a directory configured so no need to check
+ * for a service in the list having the same path. */
+ if (service->config.is_ephemeral) {
+ goto end;
+ }
+
+ /* XXX: Validate if we have any service that has the given service dir path.
+ * This has two problems:
+ *
+ * a) It's O(n^2), but the same comment from the bottom of
+ * rend_config_services() should apply.
+ *
+ * b) We only compare directory paths as strings, so we can't
+ * detect two distinct paths that specify the same directory
+ * (which can arise from symlinks, case-insensitivity, bind
+ * mounts, etc.).
+ *
+ * It also can't detect that two separate Tor instances are trying
+ * to use the same HiddenServiceDir; for that, we would need a
+ * lock file. But this is enough to detect a simple mistake that
+ * at least one person has actually made. */
+ SMARTLIST_FOREACH_BEGIN(service_list, const hs_service_t *, s) {
+ if (!strcmp(s->config.directory_path, service->config.directory_path)) {
+ log_warn(LD_REND, "Another hidden service is already configured "
+ "for directory %s",
+ escaped(service->config.directory_path));
+ ret = 1;
+ goto end;
+ }
+ } SMARTLIST_FOREACH_END(s);
+
+ end:
+ return ret;
+}
+
+/* Helper function: Given an configuration option name, its value, a minimum
+ * min and a maxium max, parse the value as a uint64_t. On success, ok is set
+ * to 1 and ret is the parsed value. On error, ok is set to 0 and ret must be
+ * ignored. This function logs both on error and success. */
+static uint64_t
+helper_parse_uint64(const char *opt, const char *value, uint64_t min,
+ uint64_t max, int *ok)
+{
+ uint64_t ret = 0;
+
+ tor_assert(opt);
+ tor_assert(value);
+ tor_assert(ok);
+
+ *ok = 0;
+ ret = tor_parse_uint64(value, 10, min, max, ok, NULL);
+ if (!*ok) {
+ log_warn(LD_CONFIG, "%s must be between %" PRIu64 " and %"PRIu64
+ ", not %s.",
+ opt, min, max, value);
+ goto err;
+ }
+ log_info(LD_CONFIG, "%s was parsed to %" PRIu64, opt, ret);
+ err:
+ return ret;
+}
+
+/* Return true iff the given options starting at line_ for a hidden service
+ * contains at least one invalid option. Each hidden service option don't
+ * apply to all versions so this function can find out. The line_ MUST start
+ * right after the HiddenServiceDir line of this service.
+ *
+ * This is mainly for usability so we can inform the user of any invalid
+ * option for the hidden service version instead of silently ignoring. */
+static int
+config_has_invalid_options(const config_line_t *line_,
+ const hs_service_t *service)
+{
+ int ret = 0;
+ const char **optlist;
+ const config_line_t *line;
+
+ tor_assert(service);
+ tor_assert(service->config.version <= HS_VERSION_MAX);
+
+ /* List of options that a v3 service doesn't support thus must exclude from
+ * its configuration. */
+ const char *opts_exclude_v3[] = {
+ "HiddenServiceAuthorizeClient",
+ NULL /* End marker. */
+ };
+
+ /* Defining the size explicitly allows us to take advantage of the compiler
+ * which warns us if we ever bump the max version but forget to grow this
+ * array. The plus one is because we have a version 0 :). */
+ struct {
+ const char **list;
+ } exclude_lists[HS_VERSION_MAX + 1] = {
+ { NULL }, /* v0. */
+ { NULL }, /* v1. */
+ { NULL }, /* v2 */
+ { opts_exclude_v3 }, /* v3. */
+ };
+
+ optlist = exclude_lists[service->config.version].list;
+ if (optlist == NULL) {
+ /* No exclude options to look at for this version. */
+ goto end;
+ }
+ for (int i = 0; optlist[i]; i++) {
+ const char *opt = optlist[i];
+ for (line = line_; line; line = line->next) {
+ if (!strcasecmp(line->key, "HiddenServiceDir")) {
+ /* We just hit the next hidden service, stop right now. */
+ goto end;
+ }
+ if (!strcasecmp(line->key, opt)) {
+ log_warn(LD_CONFIG, "Hidden service option %s is incompatible with "
+ "version %" PRIu32 " of service in %s",
+ opt, service->config.version,
+ service->config.directory_path);
+ ret = 1;
+ /* Continue the loop so we can find all possible options. */
+ continue;
+ }
+ }
+ }
+ end:
+ return ret;
+}
+
+/* Validate service configuration. This is used when loading the configuration
+ * and once we've setup a service object, it's config object is passed to this
+ * function for further validation. This does not validate service key
+ * material. Return 0 if valid else -1 if invalid. */
+static int
+config_validate_service(const hs_service_config_t *config)
+{
+ tor_assert(config);
+
+ /* Amount of ports validation. */
+ if (!config->ports || smartlist_len(config->ports) == 0) {
+ log_warn(LD_CONFIG, "Hidden service (%s) with no ports configured.",
+ escaped(config->directory_path));
+ goto invalid;
+ }
+
+ /* Valid. */
+ return 0;
+ invalid:
+ return -1;
+}
+
+/* Configuration funcion for a version 3 service. The line_ must be pointing
+ * to the directive directly after a HiddenServiceDir. That way, when hitting
+ * the next HiddenServiceDir line or reaching the end of the list of lines, we
+ * know that we have to stop looking for more options. The given service
+ * object must be already allocated and passed through
+ * config_generic_service() prior to calling this function.
+ *
+ * Return 0 on success else a negative value. */
+static int
+config_service_v3(const config_line_t *line_,
+ hs_service_config_t *config)
+{
+ int have_num_ip = 0;
+ const char *dup_opt_seen = NULL;
+ const config_line_t *line;
+
+ tor_assert(config);
+
+ for (line = line_; line; line = line->next) {
+ int ok = 0;
+ if (!strcasecmp(line->key, "HiddenServiceDir")) {
+ /* We just hit the next hidden service, stop right now. */
+ break;
+ }
+ /* Number of introduction points. */
+ if (!strcasecmp(line->key, "HiddenServiceNumIntroductionPoints")) {
+ config->num_intro_points =
+ (unsigned int) helper_parse_uint64(line->key, line->value,
+ NUM_INTRO_POINTS_DEFAULT,
+ HS_CONFIG_V3_MAX_INTRO_POINTS,
+ &ok);
+ if (!ok || have_num_ip) {
+ if (have_num_ip)
+ dup_opt_seen = line->key;
+ goto err;
+ }
+ have_num_ip = 1;
+ continue;
+ }
+ }
+
+ /* We do not load the key material for the service at this stage. This is
+ * done later once tor can confirm that it is in a running state. */
+
+ /* We are about to return a fully configured service so do one last pass of
+ * validation at it. */
+ if (config_validate_service(config) < 0) {
+ goto err;
+ }
+
+ return 0;
+ err:
+ if (dup_opt_seen) {
+ log_warn(LD_CONFIG, "Duplicate directive %s.", dup_opt_seen);
+ }
+ return -1;
+}
+
+/* Configure a service using the given options in line_ and options. This is
+ * called for any service regardless of its version which means that all
+ * directives in this function are generic to any service version. This
+ * function will also check the validity of the service directory path.
+ *
+ * The line_ must be pointing to the directive directly after a
+ * HiddenServiceDir. That way, when hitting the next HiddenServiceDir line or
+ * reaching the end of the list of lines, we know that we have to stop looking
+ * for more options.
+ *
+ * Return 0 on success else -1. */
+static int
+config_generic_service(const config_line_t *line_,
+ const or_options_t *options,
+ hs_service_t *service)
+{
+ int dir_seen = 0;
+ const config_line_t *line;
+ hs_service_config_t *config;
+ /* If this is set, we've seen a duplicate of this option. Keep the string
+ * so we can log the directive. */
+ const char *dup_opt_seen = NULL;
+ /* These variables will tell us if we ever have duplicate. */
+ int have_version = 0, have_allow_unknown_ports = 0;
+ int have_dir_group_read = 0, have_max_streams = 0;
+ int have_max_streams_close = 0;
+
+ tor_assert(line_);
+ tor_assert(options);
+ tor_assert(service);
+
+ /* Makes thing easier. */
+ config = &service->config;
+
+ /* The first line starts with HiddenServiceDir so we consider what's next is
+ * the configuration of the service. */
+ for (line = line_; line ; line = line->next) {
+ int ok = 0;
+
+ /* This indicate that we have a new service to configure. */
+ if (!strcasecmp(line->key, "HiddenServiceDir")) {
+ /* This function only configures one service at a time so if we've
+ * already seen one, stop right now. */
+ if (dir_seen) {
+ break;
+ }
+ /* Ok, we've seen one and we are about to configure it. */
+ dir_seen = 1;
+ config->directory_path = tor_strdup(line->value);
+ log_info(LD_CONFIG, "HiddenServiceDir=%s. Configuring...",
+ escaped(config->directory_path));
+ continue;
+ }
+ if (BUG(!dir_seen)) {
+ goto err;
+ }
+ /* Version of the service. */
+ if (!strcasecmp(line->key, "HiddenServiceVersion")) {
+ service->config.version =
+ (uint32_t) helper_parse_uint64(line->key, line->value, HS_VERSION_MIN,
+ HS_VERSION_MAX, &ok);
+ if (!ok || have_version) {
+ if (have_version)
+ dup_opt_seen = line->key;
+ goto err;
+ }
+ have_version = 1;
+ continue;
+ }
+ /* Virtual port. */
+ if (!strcasecmp(line->key, "HiddenServicePort")) {
+ char *err_msg = NULL;
+ /* XXX: Can we rename this? */
+ rend_service_port_config_t *portcfg =
+ rend_service_parse_port_config(line->value, " ", &err_msg);
+ if (!portcfg) {
+ if (err_msg) {
+ log_warn(LD_CONFIG, "%s", err_msg);
+ }
+ tor_free(err_msg);
+ goto err;
+ }
+ tor_assert(!err_msg);
+ smartlist_add(config->ports, portcfg);
+ log_info(LD_CONFIG, "HiddenServicePort=%s for %s",
+ line->value, escaped(config->directory_path));
+ continue;
+ }
+ /* Do we allow unknown ports. */
+ if (!strcasecmp(line->key, "HiddenServiceAllowUnknownPorts")) {
+ config->allow_unknown_ports =
+ (unsigned int) helper_parse_uint64(line->key, line->value, 0, 1, &ok);
+ if (!ok || have_allow_unknown_ports) {
+ if (have_allow_unknown_ports)
+ dup_opt_seen = line->key;
+ goto err;
+ }
+ have_allow_unknown_ports = 1;
+ continue;
+ }
+ /* Directory group readable. */
+ if (!strcasecmp(line->key, "HiddenServiceDirGroupReadable")) {
+ config->dir_group_readable =
+ (unsigned int) helper_parse_uint64(line->key, line->value, 0, 1, &ok);
+ if (!ok || have_dir_group_read) {
+ if (have_dir_group_read)
+ dup_opt_seen = line->key;
+ goto err;
+ }
+ have_dir_group_read = 1;
+ continue;
+ }
+ /* Maximum streams per circuit. */
+ if (!strcasecmp(line->key, "HiddenServiceMaxStreams")) {
+ config->max_streams_per_rdv_circuit =
+ helper_parse_uint64(line->key, line->value, 0,
+ HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT, &ok);
+ if (!ok || have_max_streams) {
+ if (have_max_streams)
+ dup_opt_seen = line->key;
+ goto err;
+ }
+ have_max_streams = 1;
+ continue;
+ }
+ /* Maximum amount of streams before we close the circuit. */
+ if (!strcasecmp(line->key, "HiddenServiceMaxStreamsCloseCircuit")) {
+ config->max_streams_close_circuit =
+ (unsigned int) helper_parse_uint64(line->key, line->value, 0, 1, &ok);
+ if (!ok || have_max_streams_close) {
+ if (have_max_streams_close)
+ dup_opt_seen = line->key;
+ goto err;
+ }
+ have_max_streams_close = 1;
+ continue;
+ }
+ }
+
+ /* Check if we are configured in non anonymous mode and single hop mode
+ * meaning every service become single onion. */
+ if (rend_service_allow_non_anonymous_connection(options) &&
+ rend_service_non_anonymous_mode_enabled(options)) {
+ config->is_single_onion = 1;
+ }
+
+ /* Success */
+ return 0;
+ err:
+ if (dup_opt_seen) {
+ log_warn(LD_CONFIG, "Duplicate directive %s.", dup_opt_seen);
+ }
+ return -1;
+}
+
+/* Configure a service using the given line and options. This function will
+ * call the corresponding configuration function for a specific service
+ * version and validate the service against the other ones. On success, add
+ * the service to the given list and return 0. On error, nothing is added to
+ * the list and a negative value is returned. */
+static int
+config_service(const config_line_t *line, const or_options_t *options,
+ smartlist_t *service_list)
+{
+ int ret;
+ hs_service_t *service = NULL;
+
+ tor_assert(line);
+ tor_assert(options);
+ tor_assert(service_list);
+
+ /* We have a new hidden service. */
+ service = hs_service_new(options);
+ /* We'll configure that service as a generic one and then pass it to a
+ * specific function according to the configured version number. */
+ if (config_generic_service(line, options, service) < 0) {
+ goto err;
+ }
+ tor_assert(service->config.version <= HS_VERSION_MAX);
+ /* Before we configure the service on a per-version basis, we'll make
+ * sure that this set of options for a service are valid that is for
+ * instance an option only for v2 is not used for v3. */
+ if (config_has_invalid_options(line->next, service)) {
+ goto err;
+ }
+ /* Check permission on service directory that was just parsed. And this must
+ * be done regardless of the service version. Do not ask for the directory
+ * to be created, this is done when the keys are loaded because we could be
+ * in validation mode right now. */
+ if (hs_check_service_private_dir(options->User,
+ service->config.directory_path,
+ service->config.dir_group_readable,
+ 0) < 0) {
+ goto err;
+ }
+ /* Different functions are in charge of specific options for a version. We
+ * start just after the service directory line so once we hit another
+ * directory line, the function knows that it has to stop parsing. */
+ switch (service->config.version) {
+ case HS_VERSION_TWO:
+ ret = rend_config_service(line->next, options, &service->config);
+ break;
+ case HS_VERSION_THREE:
+ ret = config_service_v3(line->next, &service->config);
+ break;
+ default:
+ /* We do validate before if we support the parsed version. */
+ tor_assert_nonfatal_unreached();
+ goto err;
+ }
+ if (ret < 0) {
+ goto err;
+ }
+ /* We'll check if this service can be kept depending on the others
+ * configured previously. */
+ if (service_is_duplicate_in_list(service_list, service)) {
+ goto err;
+ }
+ /* Passes, add it to the given list. */
+ smartlist_add(service_list, service);
+ return 0;
+
+ err:
+ hs_service_free(service);
+ return -1;
+}
+
+/* From a set of <b>options</b>, setup every hidden service found. Return 0 on
+ * success or -1 on failure. If <b>validate_only</b> is set, parse, warn and
+ * return as normal, but don't actually change the configured services. */
+int
+hs_config_service_all(const or_options_t *options, int validate_only)
+{
+ int dir_option_seen = 0, ret = -1;
+ const config_line_t *line;
+ smartlist_t *new_service_list = NULL;
+
+ tor_assert(options);
+
+ /* Newly configured service are put in that list which is then used for
+ * validation and staging for >= v3. */
+ new_service_list = smartlist_new();
+
+ for (line = options->RendConfigLines; line; line = line->next) {
+ /* Ignore all directives that aren't the start of a service. */
+ if (strcasecmp(line->key, "HiddenServiceDir")) {
+ if (!dir_option_seen) {
+ log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive",
+ line->key);
+ goto err;
+ }
+ continue;
+ }
+ /* Flag that we've seen a directory directive and we'll use it to make
+ * sure that the torrc options ordering is actually valid. */
+ dir_option_seen = 1;
+
+ /* Try to configure this service now. On success, it will be added to the
+ * list and validated against the service in that same list. */
+ if (config_service(line, options, new_service_list) < 0) {
+ goto err;
+ }
+ }
+
+ /* In non validation mode, we'll stage those services we just successfully
+ * configured. Service ownership is transfered from the list to the global
+ * state. If any service is invalid, it will be removed from the list and
+ * freed. All versions are handled in that function. */
+ if (!validate_only) {
+ stage_services(new_service_list);
+ } else {
+ /* We've just validated that we were able to build a clean working list of
+ * services. We don't need those objects anymore. */
+ SMARTLIST_FOREACH(new_service_list, hs_service_t *, s,
+ hs_service_free(s));
+ /* For the v2 subsystem, the configuration function adds the service
+ * object to the staging list and it is transferred in the main list
+ * through the prunning process. In validation mode, we thus have to purge
+ * the staging list so it's not kept in memory as valid service. */
+ rend_service_free_staging_list();
+ }
+
+ /* Success. Note that the service list has no ownership of its content. */
+ ret = 0;
+ goto end;
+
+ err:
+ SMARTLIST_FOREACH(new_service_list, hs_service_t *, s, hs_service_free(s));
+
+ end:
+ smartlist_free(new_service_list);
+ /* Tor main should call the free all function on error. */
+ return ret;
+}
+
diff --git a/src/or/hs_config.h b/src/or/hs_config.h
new file mode 100644
index 0000000000..2f8cbdc130
--- /dev/null
+++ b/src/or/hs_config.h
@@ -0,0 +1,24 @@
+/* Copyright (c) 2016, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_config.h
+ * \brief Header file containing configuration ABI/API for the HS subsytem.
+ **/
+
+#ifndef TOR_HS_CONFIG_H
+#define TOR_HS_CONFIG_H
+
+#include "or.h"
+
+/* Max value for HiddenServiceMaxStreams */
+#define HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT 65535
+/* Maximum number of intro points per version 3 services. */
+#define HS_CONFIG_V3_MAX_INTRO_POINTS 20
+
+/* API */
+
+int hs_config_service_all(const or_options_t *options, int validate_only);
+
+#endif /* TOR_HS_CONFIG_H */
+
diff --git a/src/or/hs_descriptor.c b/src/or/hs_descriptor.c
index 2a000f5002..4bc54bdb2d 100644
--- a/src/or/hs_descriptor.c
+++ b/src/or/hs_descriptor.c
@@ -55,13 +55,14 @@
/* For unit tests.*/
#define HS_DESCRIPTOR_PRIVATE
-#include "hs_descriptor.h"
-
#include "or.h"
#include "ed25519_cert.h" /* Trunnel interface. */
+#include "hs_descriptor.h"
+#include "circuitbuild.h"
#include "parsecommon.h"
#include "rendcache.h"
#include "hs_cache.h"
+#include "hs_config.h"
#include "torcert.h" /* tor_cert_encode_ed22519() */
/* Constant string value used for the descriptor format. */
@@ -77,6 +78,7 @@
#define str_intro_auth_required "intro-auth-required"
#define str_single_onion "single-onion-service"
#define str_intro_point "introduction-point"
+#define str_ip_onion_key "onion-key"
#define str_ip_auth_key "auth-key"
#define str_ip_enc_key "enc-key"
#define str_ip_enc_key_cert "enc-key-cert"
@@ -135,6 +137,7 @@ static token_rule_t hs_desc_encrypted_v3_token_table[] = {
/* Descriptor ruleset for the introduction points section. */
static token_rule_t hs_desc_intro_point_v3_token_table[] = {
T1_START(str_intro_point, R3_INTRODUCTION_POINT, EQ(1), NO_OBJ),
+ T1N(str_ip_onion_key, R3_INTRO_ONION_KEY, GE(2), OBJ_OK),
T1(str_ip_auth_key, R3_INTRO_AUTH_KEY, NO_ARGS, NEED_OBJ),
T1(str_ip_enc_key, R3_INTRO_ENC_KEY, GE(2), OBJ_OK),
T1(str_ip_enc_key_cert, R3_INTRO_ENC_KEY_CERT, ARGS, OBJ_OK),
@@ -143,31 +146,8 @@ static token_rule_t hs_desc_intro_point_v3_token_table[] = {
END_OF_TABLE
};
-/* Free a descriptor intro point object. */
-STATIC void
-desc_intro_point_free(hs_desc_intro_point_t *ip)
-{
- if (!ip) {
- return;
- }
- if (ip->link_specifiers) {
- SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *,
- ls, tor_free(ls));
- smartlist_free(ip->link_specifiers);
- }
- tor_cert_free(ip->auth_key_cert);
- tor_cert_free(ip->enc_key_cert);
- if (ip->legacy.key) {
- crypto_pk_free(ip->legacy.key);
- }
- if (ip->legacy.cert.encoded) {
- tor_free(ip->legacy.cert.encoded);
- }
- tor_free(ip);
-}
-
/* Free the content of the plaintext section of a descriptor. */
-static void
+STATIC void
desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc)
{
if (!desc) {
@@ -196,7 +176,7 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc)
}
if (desc->intro_points) {
SMARTLIST_FOREACH(desc->intro_points, hs_desc_intro_point_t *, ip,
- desc_intro_point_free(ip));
+ hs_desc_intro_point_free(ip));
smartlist_free(desc->intro_points);
}
memwipe(desc, 0, sizeof(*desc));
@@ -255,7 +235,7 @@ build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen)
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));
+ set_uint64(dst + offset, tor_htonll(desc->plaintext_data.revision_counter));
offset += sizeof(uint64_t);
tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset);
}
@@ -351,42 +331,10 @@ encode_link_specifiers(const smartlist_t *specs)
SMARTLIST_FOREACH_BEGIN(specs, const hs_desc_link_specifier_t *,
spec) {
- link_specifier_t *ls = link_specifier_new();
- link_specifier_set_ls_type(ls, spec->type);
-
- switch (spec->type) {
- case LS_IPV4:
- link_specifier_set_un_ipv4_addr(ls,
- tor_addr_to_ipv4h(&spec->u.ap.addr));
- link_specifier_set_un_ipv4_port(ls, spec->u.ap.port);
- /* Four bytes IPv4 and two bytes port. */
- link_specifier_set_ls_len(ls, sizeof(spec->u.ap.addr.addr.in_addr) +
- sizeof(spec->u.ap.port));
- break;
- case LS_IPV6:
- {
- size_t addr_len = link_specifier_getlen_un_ipv6_addr(ls);
- const uint8_t *in6_addr = tor_addr_to_in6_addr8(&spec->u.ap.addr);
- uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(ls);
- memcpy(ipv6_array, in6_addr, addr_len);
- link_specifier_set_un_ipv6_port(ls, spec->u.ap.port);
- /* Sixteen bytes IPv6 and two bytes port. */
- link_specifier_set_ls_len(ls, addr_len + sizeof(spec->u.ap.port));
- break;
+ link_specifier_t *ls = hs_desc_lspec_to_trunnel(spec);
+ if (ls) {
+ link_specifier_list_add_spec(lslist, ls);
}
- case LS_LEGACY_ID:
- {
- size_t legacy_id_len = link_specifier_getlen_un_legacy_id(ls);
- uint8_t *legacy_id_array = link_specifier_getarray_un_legacy_id(ls);
- memcpy(legacy_id_array, spec->u.legacy_id, legacy_id_len);
- link_specifier_set_ls_len(ls, legacy_id_len);
- break;
- }
- default:
- tor_assert(0);
- }
-
- link_specifier_list_add_spec(lslist, ls);
} SMARTLIST_FOREACH_END(spec);
{
@@ -478,6 +426,26 @@ encode_enc_key(const hs_desc_intro_point_t *ip)
return encoded;
}
+/* Encode an introduction point onion key. Return a newly allocated string
+ * with it. On failure, return NULL. */
+static char *
+encode_onion_key(const hs_desc_intro_point_t *ip)
+{
+ char *encoded = NULL;
+ char key_b64[CURVE25519_BASE64_PADDED_LEN + 1];
+
+ tor_assert(ip);
+
+ /* Base64 encode the encryption key for the "onion-key" field. */
+ if (curve25519_public_to_base64(key_b64, &ip->onion_key) < 0) {
+ goto done;
+ }
+ tor_asprintf(&encoded, "%s ntor %s", str_ip_onion_key, key_b64);
+
+ done:
+ return encoded;
+}
+
/* Encode an introduction point object and return a newly allocated string
* with it. On failure, return NULL. */
static char *
@@ -497,6 +465,16 @@ encode_intro_point(const ed25519_public_key_t *sig_key,
tor_free(ls_str);
}
+ /* Onion key encoding. */
+ {
+ char *encoded_onion_key = encode_onion_key(ip);
+ if (encoded_onion_key == NULL) {
+ goto err;
+ }
+ smartlist_add_asprintf(lines, "%s", encoded_onion_key);
+ tor_free(encoded_onion_key);
+ }
+
/* Authentication key encoding. */
{
char *encoded_cert;
@@ -987,6 +965,10 @@ desc_encode_v3(const hs_descriptor_t *desc,
tor_assert(encoded_out);
tor_assert(desc->plaintext_data.version == 3);
+ if (BUG(desc->subcredential == NULL)) {
+ goto err;
+ }
+
/* Build the non-encrypted values. */
{
char *encoded_cert;
@@ -1133,6 +1115,15 @@ decode_link_specifiers(const char *encoded)
memcpy(hs_spec->u.legacy_id, link_specifier_getarray_un_legacy_id(ls),
sizeof(hs_spec->u.legacy_id));
break;
+ case LS_ED25519_ID:
+ /* Both are known at compile time so let's make sure they are the same
+ * else we can copy memory out of bound. */
+ tor_assert(link_specifier_getlen_un_ed25519_id(ls) ==
+ sizeof(hs_spec->u.ed25519_id));
+ memcpy(hs_spec->u.ed25519_id,
+ link_specifier_getconstarray_un_ed25519_id(ls),
+ sizeof(hs_spec->u.ed25519_id));
+ break;
default:
goto err;
}
@@ -1241,7 +1232,7 @@ cert_is_valid(tor_cert_t *cert, uint8_t type, const char *log_obj_type)
}
/* The following will not only check if the signature matches but also the
* expiration date and overall validity. */
- if (tor_cert_checksig(cert, &cert->signing_key, time(NULL)) < 0) {
+ if (tor_cert_checksig(cert, &cert->signing_key, approx_time()) < 0) {
log_warn(LD_REND, "Invalid signature for %s.", log_obj_type);
goto err;
}
@@ -1625,6 +1616,50 @@ decode_intro_legacy_key(const directory_token_t *tok,
return -1;
}
+/* Dig into the descriptor <b>tokens</b> to find the onion key we should use
+ * for this intro point, and set it into <b>onion_key_out</b>. Return 0 if it
+ * was found and well-formed, otherwise return -1 in case of errors. */
+static int
+set_intro_point_onion_key(curve25519_public_key_t *onion_key_out,
+ const smartlist_t *tokens)
+{
+ int retval = -1;
+ smartlist_t *onion_keys = NULL;
+
+ tor_assert(onion_key_out);
+
+ onion_keys = find_all_by_keyword(tokens, R3_INTRO_ONION_KEY);
+ if (!onion_keys) {
+ log_warn(LD_REND, "Descriptor did not contain intro onion keys");
+ goto err;
+ }
+
+ SMARTLIST_FOREACH_BEGIN(onion_keys, directory_token_t *, tok) {
+ /* This field is using GE(2) so for possible forward compatibility, we
+ * accept more fields but must be at least 2. */
+ tor_assert(tok->n_args >= 2);
+
+ /* Try to find an ntor key, it's the only recognized type right now */
+ if (!strcmp(tok->args[0], "ntor")) {
+ if (curve25519_public_from_base64(onion_key_out, tok->args[1]) < 0) {
+ log_warn(LD_REND, "Introduction point ntor onion-key is invalid");
+ goto err;
+ }
+ /* Got the onion key! Set the appropriate retval */
+ retval = 0;
+ }
+ } SMARTLIST_FOREACH_END(tok);
+
+ /* Log an error if we didn't find it :( */
+ if (retval < 0) {
+ log_warn(LD_REND, "Descriptor did not contain ntor onion keys");
+ }
+
+ err:
+ smartlist_free(onion_keys);
+ return retval;
+}
+
/* 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
@@ -1650,17 +1685,24 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start)
/* Ok we seem to have a well formed section containing enough tokens to
* parse. Allocate our IP object and try to populate it. */
- ip = tor_malloc_zero(sizeof(hs_desc_intro_point_t));
+ ip = hs_desc_intro_point_new();
/* "introduction-point" SP link-specifiers NL */
tok = find_by_keyword(tokens, R3_INTRODUCTION_POINT);
tor_assert(tok->n_args == 1);
+ /* Our constructor creates this list by default so free it. */
+ smartlist_free(ip->link_specifiers);
ip->link_specifiers = decode_link_specifiers(tok->args[0]);
if (!ip->link_specifiers) {
log_warn(LD_REND, "Introduction point has invalid link specifiers");
goto err;
}
+ /* "onion-key" SP ntor SP key NL */
+ if (set_intro_point_onion_key(&ip->onion_key, tokens) < 0) {
+ goto err;
+ }
+
/* "auth-key" NL certificate NL */
tok = find_by_keyword(tokens, R3_INTRO_AUTH_KEY);
tor_assert(tok->object_body);
@@ -1732,7 +1774,7 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start)
goto done;
err:
- desc_intro_point_free(ip);
+ hs_desc_intro_point_free(ip);
ip = NULL;
done:
@@ -1747,18 +1789,13 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start)
/* Given a descriptor string at <b>data</b>, decode all possible introduction
* points that we can find. Add the introduction point object to desc_enc as we
- * find them. Return 0 on success.
- *
- * On error, a negative value is returned. It is possible that some intro
- * point object have been added to the desc_enc, they should be considered
- * invalid. One single bad encoded introduction point will make this function
- * return an error. */
-STATIC int
+ * find them. This function can't fail and it is possible that zero
+ * introduction points can be decoded. */
+static void
decode_intro_points(const hs_descriptor_t *desc,
hs_desc_encrypted_data_t *desc_enc,
const char *data)
{
- int retval = -1;
smartlist_t *chunked_desc = smartlist_new();
smartlist_t *intro_points = smartlist_new();
@@ -1799,22 +1836,19 @@ decode_intro_points(const hs_descriptor_t *desc,
SMARTLIST_FOREACH_BEGIN(intro_points, const char *, intro_point) {
hs_desc_intro_point_t *ip = decode_introduction_point(desc, intro_point);
if (!ip) {
- /* Malformed introduction point section. Stop right away, this
- * descriptor shouldn't be used. */
- goto err;
+ /* Malformed introduction point section. We'll ignore this introduction
+ * point and continue parsing. New or unknown fields are possible for
+ * forward compatibility. */
+ continue;
}
smartlist_add(desc_enc->intro_points, ip);
} SMARTLIST_FOREACH_END(intro_point);
done:
- retval = 0;
-
- err:
SMARTLIST_FOREACH(chunked_desc, char *, a, tor_free(a));
smartlist_free(chunked_desc);
SMARTLIST_FOREACH(intro_points, char *, a, tor_free(a));
smartlist_free(intro_points);
- return retval;
}
/* Return 1 iff the given base64 encoded signature in b64_sig from the encoded
* descriptor in encoded_desc validates the descriptor content. */
@@ -1852,7 +1886,8 @@ desc_sig_is_valid(const char *b64_sig,
sig_start = tor_memstr(encoded_desc, encoded_len, "\n" str_signature);
/* Getting here means the token parsing worked for the signature so if we
* can't find the start of the signature, we have a code flow issue. */
- if (BUG(!sig_start)) {
+ if (!sig_start) {
+ log_warn(LD_GENERAL, "Malformed signature line. Rejecting.");
goto err;
}
/* Skip newline, it has to go in the signature check. */
@@ -2040,14 +2075,14 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc,
/* Initialize the descriptor's introduction point list before we start
* decoding. Having 0 intro point is valid. Then decode them all. */
desc_encrypted_out->intro_points = smartlist_new();
- if (decode_intro_points(desc, desc_encrypted_out, message) < 0) {
- goto err;
- }
+ decode_intro_points(desc, desc_encrypted_out, message);
+
/* Validation of maximum introduction points allowed. */
- if (smartlist_len(desc_encrypted_out->intro_points) > MAX_INTRO_POINTS) {
+ if (smartlist_len(desc_encrypted_out->intro_points) >
+ HS_CONFIG_V3_MAX_INTRO_POINTS) {
log_warn(LD_REND, "Service descriptor contains too many introduction "
"points. Maximum allowed is %d but we have %d",
- MAX_INTRO_POINTS,
+ HS_CONFIG_V3_MAX_INTRO_POINTS,
smartlist_len(desc_encrypted_out->intro_points));
goto err;
}
@@ -2222,7 +2257,7 @@ hs_desc_decode_descriptor(const char *encoded,
const uint8_t *subcredential,
hs_descriptor_t **desc_out)
{
- int ret;
+ int ret = -1;
hs_descriptor_t *desc;
tor_assert(encoded);
@@ -2230,10 +2265,13 @@ hs_desc_decode_descriptor(const char *encoded,
desc = tor_malloc_zero(sizeof(hs_descriptor_t));
/* Subcredentials are optional. */
- if (subcredential) {
- memcpy(desc->subcredential, subcredential, sizeof(desc->subcredential));
+ if (BUG(!subcredential)) {
+ log_warn(LD_GENERAL, "Tried to decrypt without subcred. Impossible!");
+ goto err;
}
+ memcpy(desc->subcredential, subcredential, sizeof(desc->subcredential));
+
ret = hs_desc_decode_plaintext(encoded, &desc->plaintext_data);
if (ret < 0) {
goto err;
@@ -2279,10 +2317,10 @@ static int
*
* Return 0 on success and encoded_out is a valid pointer. On error, -1 is
* returned and encoded_out is set to NULL. */
-int
-hs_desc_encode_descriptor(const hs_descriptor_t *desc,
- const ed25519_keypair_t *signing_kp,
- char **encoded_out)
+MOCK_IMPL(int,
+hs_desc_encode_descriptor,(const hs_descriptor_t *desc,
+ const ed25519_keypair_t *signing_kp,
+ char **encoded_out))
{
int ret = -1;
uint32_t version;
@@ -2359,3 +2397,197 @@ hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data)
data->superencrypted_blob_size);
}
+/* Return the size in bytes of the given encrypted data object. Used by OOM
+ * subsystem. */
+static size_t
+hs_desc_encrypted_obj_size(const hs_desc_encrypted_data_t *data)
+{
+ tor_assert(data);
+ size_t intro_size = 0;
+ if (data->intro_auth_types) {
+ intro_size +=
+ smartlist_len(data->intro_auth_types) * sizeof(intro_auth_types);
+ }
+ if (data->intro_points) {
+ /* XXX could follow pointers here and get more accurate size */
+ intro_size +=
+ smartlist_len(data->intro_points) * sizeof(hs_desc_intro_point_t);
+ }
+
+ return sizeof(*data) + intro_size;
+}
+
+/* Return the size in bytes of the given descriptor object. Used by OOM
+ * subsystem. */
+ size_t
+hs_desc_obj_size(const hs_descriptor_t *data)
+{
+ tor_assert(data);
+ return (hs_desc_plaintext_obj_size(&data->plaintext_data) +
+ hs_desc_encrypted_obj_size(&data->encrypted_data) +
+ sizeof(data->subcredential));
+}
+
+/* Return a newly allocated descriptor intro point. */
+hs_desc_intro_point_t *
+hs_desc_intro_point_new(void)
+{
+ hs_desc_intro_point_t *ip = tor_malloc_zero(sizeof(*ip));
+ ip->link_specifiers = smartlist_new();
+ return ip;
+}
+
+/* Free a descriptor intro point object. */
+void
+hs_desc_intro_point_free(hs_desc_intro_point_t *ip)
+{
+ if (ip == NULL) {
+ return;
+ }
+ if (ip->link_specifiers) {
+ SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *,
+ ls, hs_desc_link_specifier_free(ls));
+ smartlist_free(ip->link_specifiers);
+ }
+ tor_cert_free(ip->auth_key_cert);
+ tor_cert_free(ip->enc_key_cert);
+ crypto_pk_free(ip->legacy.key);
+ tor_free(ip->legacy.cert.encoded);
+ tor_free(ip);
+}
+
+/* Free the given descriptor link specifier. */
+void
+hs_desc_link_specifier_free(hs_desc_link_specifier_t *ls)
+{
+ if (ls == NULL) {
+ return;
+ }
+ tor_free(ls);
+}
+
+/* Return a newly allocated descriptor link specifier using the given extend
+ * info and requested type. Return NULL on error. */
+hs_desc_link_specifier_t *
+hs_desc_link_specifier_new(const extend_info_t *info, uint8_t type)
+{
+ hs_desc_link_specifier_t *ls = NULL;
+
+ tor_assert(info);
+
+ ls = tor_malloc_zero(sizeof(*ls));
+ ls->type = type;
+ switch (ls->type) {
+ case LS_IPV4:
+ if (info->addr.family != AF_INET) {
+ goto err;
+ }
+ tor_addr_copy(&ls->u.ap.addr, &info->addr);
+ ls->u.ap.port = info->port;
+ break;
+ case LS_IPV6:
+ if (info->addr.family != AF_INET6) {
+ goto err;
+ }
+ tor_addr_copy(&ls->u.ap.addr, &info->addr);
+ ls->u.ap.port = info->port;
+ break;
+ case LS_LEGACY_ID:
+ /* Bug out if the identity digest is not set */
+ if (BUG(tor_mem_is_zero(info->identity_digest,
+ sizeof(info->identity_digest)))) {
+ goto err;
+ }
+ memcpy(ls->u.legacy_id, info->identity_digest, sizeof(ls->u.legacy_id));
+ break;
+ case LS_ED25519_ID:
+ /* ed25519 keys are optional for intro points */
+ if (ed25519_public_key_is_zero(&info->ed_identity)) {
+ goto err;
+ }
+ memcpy(ls->u.ed25519_id, info->ed_identity.pubkey,
+ sizeof(ls->u.ed25519_id));
+ break;
+ default:
+ /* Unknown type is code flow error. */
+ tor_assert(0);
+ }
+
+ return ls;
+ err:
+ tor_free(ls);
+ return NULL;
+}
+
+/* From the given descriptor, remove and free every introduction point. */
+void
+hs_descriptor_clear_intro_points(hs_descriptor_t *desc)
+{
+ smartlist_t *ips;
+
+ tor_assert(desc);
+
+ ips = desc->encrypted_data.intro_points;
+ if (ips) {
+ SMARTLIST_FOREACH(ips, hs_desc_intro_point_t *,
+ ip, hs_desc_intro_point_free(ip));
+ smartlist_clear(ips);
+ }
+}
+
+/* From a descriptor link specifier object spec, returned a newly allocated
+ * link specifier object that is the encoded representation of spec. Return
+ * NULL on error. */
+link_specifier_t *
+hs_desc_lspec_to_trunnel(const hs_desc_link_specifier_t *spec)
+{
+ tor_assert(spec);
+
+ link_specifier_t *ls = link_specifier_new();
+ link_specifier_set_ls_type(ls, spec->type);
+
+ switch (spec->type) {
+ case LS_IPV4:
+ link_specifier_set_un_ipv4_addr(ls,
+ tor_addr_to_ipv4h(&spec->u.ap.addr));
+ link_specifier_set_un_ipv4_port(ls, spec->u.ap.port);
+ /* Four bytes IPv4 and two bytes port. */
+ link_specifier_set_ls_len(ls, sizeof(spec->u.ap.addr.addr.in_addr) +
+ sizeof(spec->u.ap.port));
+ break;
+ case LS_IPV6:
+ {
+ size_t addr_len = link_specifier_getlen_un_ipv6_addr(ls);
+ const uint8_t *in6_addr = tor_addr_to_in6_addr8(&spec->u.ap.addr);
+ uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(ls);
+ memcpy(ipv6_array, in6_addr, addr_len);
+ link_specifier_set_un_ipv6_port(ls, spec->u.ap.port);
+ /* Sixteen bytes IPv6 and two bytes port. */
+ link_specifier_set_ls_len(ls, addr_len + sizeof(spec->u.ap.port));
+ break;
+ }
+ case LS_LEGACY_ID:
+ {
+ size_t legacy_id_len = link_specifier_getlen_un_legacy_id(ls);
+ uint8_t *legacy_id_array = link_specifier_getarray_un_legacy_id(ls);
+ memcpy(legacy_id_array, spec->u.legacy_id, legacy_id_len);
+ link_specifier_set_ls_len(ls, legacy_id_len);
+ break;
+ }
+ case LS_ED25519_ID:
+ {
+ size_t ed25519_id_len = link_specifier_getlen_un_ed25519_id(ls);
+ uint8_t *ed25519_id_array = link_specifier_getarray_un_ed25519_id(ls);
+ memcpy(ed25519_id_array, spec->u.ed25519_id, ed25519_id_len);
+ link_specifier_set_ls_len(ls, ed25519_id_len);
+ break;
+ }
+ default:
+ tor_assert_nonfatal_unreached();
+ link_specifier_free(ls);
+ ls = NULL;
+ }
+
+ return ls;
+}
+
diff --git a/src/or/hs_descriptor.h b/src/or/hs_descriptor.h
index b8b94792de..3e82746c35 100644
--- a/src/or/hs_descriptor.h
+++ b/src/or/hs_descriptor.h
@@ -18,17 +18,23 @@
#include "crypto_ed25519.h"
#include "torcert.h"
+/* Trunnel */
+struct link_specifier_t;
+
/* The earliest descriptor format version we support. */
#define HS_DESC_SUPPORTED_FORMAT_VERSION_MIN 3
/* The latest descriptor format version we support. */
#define HS_DESC_SUPPORTED_FORMAT_VERSION_MAX 3
+/* Default lifetime of a descriptor in seconds. The valus is set at 3 hours
+ * which is 180 minutes or 10800 seconds. */
+#define HS_DESC_DEFAULT_LIFETIME (3 * 60 * 60)
/* Maximum lifetime of a descriptor in seconds. The value is set at 12 hours
* which is 720 minutes or 43200 seconds. */
#define HS_DESC_MAX_LIFETIME (12 * 60 * 60)
/* Lifetime of certificate in the descriptor. This defines the lifetime of the
* descriptor signing key and the cross certification cert of that key. */
-#define HS_DESC_CERT_LIFETIME (24 * 60 * 60)
+#define HS_DESC_CERT_LIFETIME (36 * 60 * 60)
/* Length of the salt needed for the encrypted section of a descriptor. */
#define HS_DESC_ENCRYPTED_SALT_LEN 16
/* Length of the secret input needed for the KDF construction which derives
@@ -65,12 +71,14 @@ typedef struct hs_desc_link_specifier_t {
* specification. */
uint8_t type;
- /* It's either an address/port or a legacy identity fingerprint. */
+ /* It must be one of these types, can't be more than one. */
union {
/* IP address and port of the relay use to extend. */
tor_addr_port_t ap;
/* Legacy identity. A 20-byte SHA1 identity fingerprint. */
uint8_t legacy_id[DIGEST_LEN];
+ /* ed25519 identity. A 32-byte key. */
+ uint8_t ed25519_id[ED25519_PUBKEY_LEN];
} u;
} hs_desc_link_specifier_t;
@@ -80,6 +88,10 @@ typedef struct hs_desc_intro_point_t {
* contains hs_desc_link_specifier_t object. It MUST have at least one. */
smartlist_t *link_specifiers;
+ /* Onion key of the introduction point used to extend to it for the ntor
+ * handshake. */
+ curve25519_public_key_t onion_key;
+
/* Authentication key used to establish the introduction point circuit and
* cross-certifies the blinded public key for the replica thus signed by
* the blinded key and in turn signs it. */
@@ -197,9 +209,15 @@ void hs_descriptor_free(hs_descriptor_t *desc);
void hs_desc_plaintext_data_free(hs_desc_plaintext_data_t *desc);
void hs_desc_encrypted_data_free(hs_desc_encrypted_data_t *desc);
-int hs_desc_encode_descriptor(const hs_descriptor_t *desc,
- const ed25519_keypair_t *signing_kp,
- char **encoded_out);
+void hs_desc_link_specifier_free(hs_desc_link_specifier_t *ls);
+hs_desc_link_specifier_t *hs_desc_link_specifier_new(
+ const extend_info_t *info, uint8_t type);
+void hs_descriptor_clear_intro_points(hs_descriptor_t *desc);
+
+MOCK_DECL(int,
+ hs_desc_encode_descriptor,(const hs_descriptor_t *desc,
+ const ed25519_keypair_t *signing_kp,
+ char **encoded_out));
int hs_desc_decode_descriptor(const char *encoded,
const uint8_t *subcredential,
@@ -209,8 +227,15 @@ int hs_desc_decode_plaintext(const char *encoded,
int hs_desc_decode_encrypted(const hs_descriptor_t *desc,
hs_desc_encrypted_data_t *desc_out);
+size_t hs_desc_obj_size(const hs_descriptor_t *data);
size_t hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data);
+hs_desc_intro_point_t *hs_desc_intro_point_new(void);
+void hs_desc_intro_point_free(hs_desc_intro_point_t *ip);
+
+link_specifier_t *hs_desc_lspec_to_trunnel(
+ const hs_desc_link_specifier_t *spec);
+
#ifdef HS_DESCRIPTOR_PRIVATE
/* Encoding. */
@@ -223,18 +248,16 @@ STATIC smartlist_t *decode_link_specifiers(const char *encoded);
STATIC hs_desc_intro_point_t *decode_introduction_point(
const hs_descriptor_t *desc,
const char *text);
-STATIC int decode_intro_points(const hs_descriptor_t *desc,
- hs_desc_encrypted_data_t *desc_enc,
- const char *data);
STATIC int encrypted_data_length_is_valid(size_t len);
STATIC int cert_is_valid(tor_cert_t *cert, uint8_t type,
const char *log_obj_type);
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);
+STATIC void desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc);
+
#endif /* HS_DESCRIPTOR_PRIVATE */
#endif /* TOR_HS_DESCRIPTOR_H */
diff --git a/src/or/hs_ident.c b/src/or/hs_ident.c
new file mode 100644
index 0000000000..df39285158
--- /dev/null
+++ b/src/or/hs_ident.c
@@ -0,0 +1,110 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_ident.c
+ * \brief Contains circuit and connection identifier code for the whole HS
+ * subsytem.
+ **/
+
+#include "hs_ident.h"
+
+/* Return a newly allocated circuit identifier. The given public key is copied
+ * identity_pk into the identifier. */
+hs_ident_circuit_t *
+hs_ident_circuit_new(const ed25519_public_key_t *identity_pk,
+ hs_ident_circuit_type_t circuit_type)
+{
+ tor_assert(circuit_type == HS_IDENT_CIRCUIT_INTRO ||
+ circuit_type == HS_IDENT_CIRCUIT_RENDEZVOUS);
+ hs_ident_circuit_t *ident = tor_malloc_zero(sizeof(*ident));
+ ed25519_pubkey_copy(&ident->identity_pk, identity_pk);
+ ident->circuit_type = circuit_type;
+ return ident;
+}
+
+/* Free the given circuit identifier. */
+void
+hs_ident_circuit_free(hs_ident_circuit_t *ident)
+{
+ if (ident == NULL) {
+ return;
+ }
+ memwipe(ident, 0, sizeof(hs_ident_circuit_t));
+ tor_free(ident);
+}
+
+/* For a given circuit identifier src, return a newly allocated copy of it.
+ * This can't fail. */
+hs_ident_circuit_t *
+hs_ident_circuit_dup(const hs_ident_circuit_t *src)
+{
+ hs_ident_circuit_t *ident = tor_malloc_zero(sizeof(*ident));
+ memcpy(ident, src, sizeof(*ident));
+ return ident;
+}
+
+/* For a given directory connection identifier src, return a newly allocated
+ * copy of it. This can't fail. */
+hs_ident_dir_conn_t *
+hs_ident_dir_conn_dup(const hs_ident_dir_conn_t *src)
+{
+ hs_ident_dir_conn_t *ident = tor_malloc_zero(sizeof(*ident));
+ memcpy(ident, src, sizeof(*ident));
+ return ident;
+}
+
+/* Free the given directory connection identifier. */
+void
+hs_ident_dir_conn_free(hs_ident_dir_conn_t *ident)
+{
+ if (ident == NULL) {
+ return;
+ }
+ memwipe(ident, 0, sizeof(hs_ident_dir_conn_t));
+ tor_free(ident);
+}
+
+/* Return a newly allocated edge connection identifier. The given public key
+ * identity_pk is copied into the identifier. */
+hs_ident_edge_conn_t *
+hs_ident_edge_conn_new(const ed25519_public_key_t *identity_pk)
+{
+ hs_ident_edge_conn_t *ident = tor_malloc_zero(sizeof(*ident));
+ ed25519_pubkey_copy(&ident->identity_pk, identity_pk);
+ return ident;
+}
+
+/* Free the given edge connection identifier. */
+void
+hs_ident_edge_conn_free(hs_ident_edge_conn_t *ident)
+{
+ if (ident == NULL) {
+ return;
+ }
+ memwipe(ident, 0, sizeof(hs_ident_edge_conn_t));
+ tor_free(ident);
+}
+
+/* Return true if the given ident is valid for an introduction circuit. */
+int
+hs_ident_intro_circ_is_valid(const hs_ident_circuit_t *ident)
+{
+ if (ident == NULL) {
+ goto invalid;
+ }
+
+ if (ed25519_public_key_is_zero(&ident->identity_pk)) {
+ goto invalid;
+ }
+
+ if (ed25519_public_key_is_zero(&ident->intro_auth_pk)) {
+ goto invalid;
+ }
+
+ /* Valid. */
+ return 1;
+ invalid:
+ return 0;
+}
+
diff --git a/src/or/hs_ident.h b/src/or/hs_ident.h
new file mode 100644
index 0000000000..cfcde781d1
--- /dev/null
+++ b/src/or/hs_ident.h
@@ -0,0 +1,133 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file hs_ident.h
+ * \brief Header file containing circuit and connection identifier data for
+ * the whole HS subsytem.
+ *
+ * \details
+ * This interface is used to uniquely identify a hidden service on a circuit
+ * or connection using the service identity public key. Once the circuit or
+ * connection subsystem calls in the hidden service one, we use those
+ * identifiers to lookup the corresponding objects like service, intro point
+ * and descriptor.
+ *
+ * Furthermore, the circuit identifier holds cryptographic material needed for
+ * the e2e encryption on the rendezvous circuit which is set once the
+ * rendezvous circuit has opened and ready to be used.
+ **/
+
+#ifndef TOR_HS_IDENT_H
+#define TOR_HS_IDENT_H
+
+#include "crypto.h"
+#include "crypto_ed25519.h"
+
+#include "hs_common.h"
+
+/* Length of the rendezvous cookie that is used to connect circuits at the
+ * rendezvous point. */
+#define HS_REND_COOKIE_LEN DIGEST_LEN
+
+/* Type of circuit an hs_ident_t object is associated with. */
+typedef enum {
+ HS_IDENT_CIRCUIT_INTRO = 1,
+ HS_IDENT_CIRCUIT_RENDEZVOUS = 2,
+} hs_ident_circuit_type_t;
+
+/* Client and service side circuit identifier that is used for hidden service
+ * circuit establishment. Not all fields contain data, it depends on the
+ * circuit purpose. This is attached to an origin_circuit_t. All fields are
+ * used by both client and service. */
+typedef struct hs_ident_circuit_t {
+ /* (All circuit) The public key used to uniquely identify the service. It is
+ * the one found in the onion address. */
+ ed25519_public_key_t identity_pk;
+
+ /* (All circuit) The type of circuit this identifier is attached to.
+ * Accessors of the fields in this object assert non fatal on this circuit
+ * type. In other words, if a rendezvous field is being accessed, the
+ * circuit type MUST BE of type HS_IDENT_CIRCUIT_RENDEZVOUS. This value is
+ * set when an object is initialized in its constructor. */
+ hs_ident_circuit_type_t circuit_type;
+
+ /* (All circuit) Introduction point authentication key. It's also needed on
+ * the rendezvous circuit for the ntor handshake. It's used as the unique key
+ * of the introduction point so it should not be shared between multiple
+ * intro points. */
+ ed25519_public_key_t intro_auth_pk;
+
+ /* (Only client rendezvous circuit) Introduction point encryption public
+ * key. We keep it in the rendezvous identifier for the ntor handshake. */
+ curve25519_public_key_t intro_enc_pk;
+
+ /* (Only rendezvous circuit) Rendezvous cookie sent from the client to the
+ * service with an INTRODUCE1 cell and used by the service in an
+ * RENDEZVOUS1 cell. */
+ uint8_t rendezvous_cookie[HS_REND_COOKIE_LEN];
+
+ /* (Only service rendezvous circuit) The HANDSHAKE_INFO needed in the
+ * RENDEZVOUS1 cell of the service. The construction is as follows:
+ * SERVER_PK [32 bytes]
+ * AUTH_MAC [32 bytes]
+ */
+ uint8_t rendezvous_handshake_info[CURVE25519_PUBKEY_LEN + DIGEST256_LEN];
+
+ /* (Only client rendezvous circuit) Client ephemeral keypair needed for the
+ * e2e encryption with the service. */
+ curve25519_keypair_t rendezvous_client_kp;
+
+ /* (Only rendezvous circuit) The NTOR_KEY_SEED needed for key derivation for
+ * the e2e encryption with the client on the circuit. */
+ uint8_t rendezvous_ntor_key_seed[DIGEST256_LEN];
+
+ /* (Only rendezvous circuit) Number of streams associated with this
+ * rendezvous circuit. We track this because there is a check on a maximum
+ * value. */
+ uint64_t num_rdv_streams;
+} hs_ident_circuit_t;
+
+/* Client and service side directory connection identifier used for a
+ * directory connection to identify which service is being queried. This is
+ * attached to a dir_connection_t. */
+typedef struct hs_ident_dir_conn_t {
+ /* The public key used to uniquely identify the service. It is the one found
+ * in the onion address. */
+ ed25519_public_key_t identity_pk;
+
+ /* XXX: Client authorization. */
+} hs_ident_dir_conn_t;
+
+/* Client and service side edge connection identifier used for an edge
+ * connection to identify which service is being queried. This is attached to
+ * a edge_connection_t. */
+typedef struct hs_ident_edge_conn_t {
+ /* The public key used to uniquely identify the service. It is the one found
+ * in the onion address. */
+ ed25519_public_key_t identity_pk;
+
+ /* XXX: Client authorization. */
+} hs_ident_edge_conn_t;
+
+/* Circuit identifier API. */
+hs_ident_circuit_t *hs_ident_circuit_new(
+ const ed25519_public_key_t *identity_pk,
+ hs_ident_circuit_type_t circuit_type);
+void hs_ident_circuit_free(hs_ident_circuit_t *ident);
+hs_ident_circuit_t *hs_ident_circuit_dup(const hs_ident_circuit_t *src);
+
+/* Directory connection identifier API. */
+hs_ident_dir_conn_t *hs_ident_dir_conn_dup(const hs_ident_dir_conn_t *src);
+void hs_ident_dir_conn_free(hs_ident_dir_conn_t *ident);
+
+/* Edge connection identifier API. */
+hs_ident_edge_conn_t *hs_ident_edge_conn_new(
+ const ed25519_public_key_t *identity_pk);
+void hs_ident_edge_conn_free(hs_ident_edge_conn_t *ident);
+
+/* Validators */
+int hs_ident_intro_circ_is_valid(const hs_ident_circuit_t *ident);
+
+#endif /* TOR_HS_IDENT_H */
+
diff --git a/src/or/hs_intropoint.c b/src/or/hs_intropoint.c
index 2abbfcd6c3..cb4d6c02e5 100644
--- a/src/or/hs_intropoint.c
+++ b/src/or/hs_intropoint.c
@@ -24,6 +24,7 @@
#include "hs/cell_introduce1.h"
#include "hs_circuitmap.h"
+#include "hs_descriptor.h"
#include "hs_intropoint.h"
#include "hs_common.h"
@@ -191,7 +192,7 @@ handle_verified_establish_intro_cell(or_circuit_t *circ,
/* Then notify the hidden service that the intro point is established by
sending an INTRO_ESTABLISHED cell */
if (hs_intro_send_intro_established_cell(circ)) {
- log_warn(LD_BUG, "Couldn't send INTRO_ESTABLISHED cell.");
+ log_warn(LD_PROTOCOL, "Couldn't send INTRO_ESTABLISHED cell.");
return -1;
}
@@ -249,9 +250,6 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request,
goto err;
}
- log_warn(LD_GENERAL, "Established prop224 intro point on circuit %" PRIu32,
- circ->p_circ_id);
-
/* We are done! */
retval = 0;
goto done;
@@ -481,7 +479,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request,
if (relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(service_circ),
RELAY_COMMAND_INTRODUCE2,
(char *) request, request_len, NULL)) {
- log_warn(LD_REND, "Unable to send INTRODUCE2 cell to the service.");
+ log_warn(LD_PROTOCOL, "Unable to send INTRODUCE2 cell to the service.");
/* Inform the client that we can't relay the cell. */
status = HS_INTRO_ACK_STATUS_CANT_RELAY;
goto send_ack;
@@ -494,8 +492,8 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request,
send_ack:
/* Send INTRODUCE_ACK or INTRODUCE_NACK to client */
if (send_introduce_ack_cell(client_circ, status) < 0) {
- log_warn(LD_REND, "Unable to send an INTRODUCE ACK status %d to client.",
- status);
+ log_warn(LD_PROTOCOL, "Unable to send an INTRODUCE ACK status %d "
+ "to client.", status);
/* Circuit has been closed on failure of transmission. */
goto done;
}
@@ -594,3 +592,18 @@ hs_intro_received_introduce1(or_circuit_t *circ, const uint8_t *request,
return -1;
}
+/* Clear memory allocated by the given intropoint object ip (but don't free the
+ * object itself). */
+void
+hs_intropoint_clear(hs_intropoint_t *ip)
+{
+ if (ip == NULL) {
+ return;
+ }
+ tor_cert_free(ip->auth_key_cert);
+ SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *, ls,
+ hs_desc_link_specifier_free(ls));
+ smartlist_free(ip->link_specifiers);
+ memset(ip, 0, sizeof(hs_intropoint_t));
+}
+
diff --git a/src/or/hs_intropoint.h b/src/or/hs_intropoint.h
index 163ed810e7..5c77f07ec3 100644
--- a/src/or/hs_intropoint.h
+++ b/src/or/hs_intropoint.h
@@ -9,12 +9,15 @@
#ifndef TOR_HS_INTRO_H
#define TOR_HS_INTRO_H
+#include "crypto_curve25519.h"
+#include "torcert.h"
+
/* Authentication key type in an ESTABLISH_INTRO cell. */
-enum hs_intro_auth_key_type {
+typedef enum {
HS_INTRO_AUTH_KEY_TYPE_LEGACY0 = 0x00,
HS_INTRO_AUTH_KEY_TYPE_LEGACY1 = 0x01,
HS_INTRO_AUTH_KEY_TYPE_ED25519 = 0x02,
-};
+} hs_intro_auth_key_type_t;
/* INTRODUCE_ACK status code. */
typedef enum {
@@ -24,6 +27,18 @@ typedef enum {
HS_INTRO_ACK_STATUS_CANT_RELAY = 0x0003,
} hs_intro_ack_status_t;
+/* Object containing introduction point common data between the service and
+ * the client side. */
+typedef struct hs_intropoint_t {
+ /* Does this intro point only supports legacy ID ?. */
+ unsigned int is_only_legacy : 1;
+
+ /* Authentication key certificate from the descriptor. */
+ tor_cert_t *auth_key_cert;
+ /* A list of link specifier. */
+ smartlist_t *link_specifiers;
+} hs_intropoint_t;
+
int hs_intro_received_establish_intro(or_circuit_t *circ,
const uint8_t *request,
size_t request_len);
@@ -35,6 +50,9 @@ MOCK_DECL(int, hs_intro_send_intro_established_cell,(or_circuit_t *circ));
/* also used by rendservice.c */
int hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ);
+hs_intropoint_t *hs_intro_new(void);
+void hs_intropoint_clear(hs_intropoint_t *ip);
+
#ifdef HS_INTROPOINT_PRIVATE
#include "hs/cell_establish_intro.h"
diff --git a/src/or/hs_ntor.c b/src/or/hs_ntor.c
index 119899817e..a416bc46c3 100644
--- a/src/or/hs_ntor.c
+++ b/src/or/hs_ntor.c
@@ -578,49 +578,41 @@ hs_ntor_client_rendezvous2_mac_is_good(
/* 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)
+
+/** Given the rendezvous key seed in <b>ntor_key_seed</b> (of size
+ * DIGEST256_LEN), do the circuit key expansion as specified by section
+ * '4.2.1. Key expansion' and place the keys in <b>keys_out</b> (which must be
+ * of size HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN).
+ *
+ * Return 0 if things went well, else return -1. */
+int
+hs_ntor_circuit_key_expansion(const uint8_t *ntor_key_seed, size_t seed_len,
+ uint8_t *keys_out, size_t keys_out_len)
{
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;
+
+ /* Sanity checks on lengths to make sure we are good */
+ if (BUG(seed_len != DIGEST256_LEN)) {
+ return -1;
+ }
+ if (BUG(keys_out_len != HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN)) {
+ return -1;
+ }
/* 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, 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_squeeze_bytes(xof, keys_out, HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN);
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;
+ return 0;
}
diff --git a/src/or/hs_ntor.h b/src/or/hs_ntor.h
index cd75f46a4c..d07bff8cf0 100644
--- a/src/or/hs_ntor.h
+++ b/src/or/hs_ntor.h
@@ -6,6 +6,10 @@
#include "or.h"
+/* Output length of KDF for key expansion */
+#define HS_NTOR_KEY_EXPANSION_KDF_OUT_LEN \
+ (DIGEST256_LEN*2 + CIPHER256_KEY_LEN*2)
+
/* Key material needed to encode/decode INTRODUCE1 cells */
typedef struct {
/* Key used for encryption of encrypted INTRODUCE1 blob */
@@ -23,21 +27,6 @@ typedef struct {
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,
@@ -66,8 +55,9 @@ int hs_ntor_service_get_rendezvous1_keys(
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_circuit_key_expansion(const uint8_t *ntor_key_seed,
+ size_t seed_len,
+ uint8_t *keys_out, size_t keys_out_len);
int hs_ntor_client_rendezvous2_mac_is_good(
const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys,
diff --git a/src/or/hs_service.c b/src/or/hs_service.c
index 205ef11c92..5ff118222d 100644
--- a/src/or/hs_service.c
+++ b/src/or/hs_service.c
@@ -6,169 +6,3273 @@
* \brief Implement next generation hidden service functionality
**/
+#define HS_SERVICE_PRIVATE
+
#include "or.h"
+#include "circpathbias.h"
+#include "circuitbuild.h"
+#include "circuitlist.h"
+#include "circuituse.h"
+#include "config.h"
+#include "directory.h"
+#include "main.h"
+#include "networkstatus.h"
+#include "nodelist.h"
#include "relay.h"
#include "rendservice.h"
-#include "circuitlist.h"
-#include "circpathbias.h"
+#include "router.h"
+#include "routerkeys.h"
+#include "routerlist.h"
+#include "statefile.h"
+#include "hs_circuit.h"
+#include "hs_common.h"
+#include "hs_config.h"
+#include "hs_circuit.h"
+#include "hs_descriptor.h"
+#include "hs_ident.h"
#include "hs_intropoint.h"
#include "hs_service.h"
-#include "hs_common.h"
-#include "hs/cell_establish_intro.h"
+/* Trunnel */
+#include "ed25519_cert.h"
#include "hs/cell_common.h"
+#include "hs/cell_establish_intro.h"
+
+/* Helper macro. Iterate over every service in the global map. The var is the
+ * name of the service pointer. */
+#define FOR_EACH_SERVICE_BEGIN(var) \
+ STMT_BEGIN \
+ hs_service_t **var##_iter, *var; \
+ HT_FOREACH(var##_iter, hs_service_ht, hs_service_map) { \
+ var = *var##_iter;
+#define FOR_EACH_SERVICE_END } STMT_END ;
+
+/* Helper macro. Iterate over both current and previous descriptor of a
+ * service. The var is the name of the descriptor pointer. This macro skips
+ * any descriptor object of the service that is NULL. */
+#define FOR_EACH_DESCRIPTOR_BEGIN(service, var) \
+ STMT_BEGIN \
+ hs_service_descriptor_t *var; \
+ for (int var ## _loop_idx = 0; var ## _loop_idx < 2; \
+ ++var ## _loop_idx) { \
+ (var ## _loop_idx == 0) ? (var = service->desc_current) : \
+ (var = service->desc_next); \
+ if (var == NULL) continue;
+#define FOR_EACH_DESCRIPTOR_END } STMT_END ;
+
+/* Onion service directory file names. */
+static const char fname_keyfile_prefix[] = "hs_ed25519";
+static const char fname_hostname[] = "hostname";
+static const char address_tld[] = "onion";
+
+/* Staging list of service object. When configuring service, we add them to
+ * this list considered a staging area and they will get added to our global
+ * map once the keys have been loaded. These two steps are seperated because
+ * loading keys requires that we are an actual running tor process. */
+static smartlist_t *hs_service_staging_list;
+
+/** True if the list of available router descriptors might have changed which
+ * might result in an altered hash ring. Check if the hash ring changed and
+ * reupload if needed */
+static int consider_republishing_hs_descriptors = 0;
-/* 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. */
+static void set_descriptor_revision_counter(hs_descriptor_t *hs_desc);
-/** 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. */
-ssize_t
-get_establish_intro_payload(uint8_t *buf_out, size_t buf_out_len,
- const trn_cell_establish_intro_t *cell)
+/* Helper: Function to compare two objects in the service map. Return 1 if the
+ * two service have the same master public identity key. */
+static inline int
+hs_service_ht_eq(const hs_service_t *first, const hs_service_t *second)
{
- ssize_t bytes_used = 0;
+ tor_assert(first);
+ tor_assert(second);
+ /* Simple key compare. */
+ return ed25519_pubkey_eq(&first->keys.identity_pk,
+ &second->keys.identity_pk);
+}
+
+/* Helper: Function for the service hash table code below. The key used is the
+ * master public identity key which is ultimately the onion address. */
+static inline unsigned int
+hs_service_ht_hash(const hs_service_t *service)
+{
+ tor_assert(service);
+ return (unsigned int) siphash24g(service->keys.identity_pk.pubkey,
+ sizeof(service->keys.identity_pk.pubkey));
+}
+
+/* This is _the_ global hash map of hidden services which indexed the service
+ * contained in it by master public identity key which is roughly the onion
+ * address of the service. */
+static struct hs_service_ht *hs_service_map;
+
+/* Register the service hash table. */
+HT_PROTOTYPE(hs_service_ht, /* Name of hashtable. */
+ hs_service_t, /* Object contained in the map. */
+ hs_service_node, /* The name of the HT_ENTRY member. */
+ hs_service_ht_hash, /* Hashing function. */
+ hs_service_ht_eq) /* Compare function for objects. */
+
+HT_GENERATE2(hs_service_ht, hs_service_t, hs_service_node,
+ hs_service_ht_hash, hs_service_ht_eq,
+ 0.6, tor_reallocarray, tor_free_)
- if (buf_out_len < RELAY_PAYLOAD_SIZE) {
+/* Query the given service map with a public key and return a service object
+ * if found else NULL. It is also possible to set a directory path in the
+ * search query. If pk is NULL, then it will be set to zero indicating the
+ * hash table to compare the directory path instead. */
+STATIC hs_service_t *
+find_service(hs_service_ht *map, const ed25519_public_key_t *pk)
+{
+ hs_service_t dummy_service;
+ tor_assert(map);
+ tor_assert(pk);
+ memset(&dummy_service, 0, sizeof(dummy_service));
+ ed25519_pubkey_copy(&dummy_service.keys.identity_pk, pk);
+ return HT_FIND(hs_service_ht, map, &dummy_service);
+}
+
+/* Register the given service in the given map. If the service already exists
+ * in the map, -1 is returned. On success, 0 is returned and the service
+ * ownership has been transfered to the global map. */
+STATIC int
+register_service(hs_service_ht *map, hs_service_t *service)
+{
+ tor_assert(map);
+ tor_assert(service);
+ tor_assert(!ed25519_public_key_is_zero(&service->keys.identity_pk));
+
+ if (find_service(map, &service->keys.identity_pk)) {
+ /* Existing service with the same key. Do not register it. */
return -1;
}
+ /* Taking ownership of the object at this point. */
+ HT_INSERT(hs_service_ht, map, service);
+ return 0;
+}
- bytes_used = trn_cell_establish_intro_encode(buf_out, buf_out_len,
- cell);
- return bytes_used;
+/* Remove a given service from the given map. If service is NULL or the
+ * service key is unset, return gracefully. */
+STATIC void
+remove_service(hs_service_ht *map, hs_service_t *service)
+{
+ hs_service_t *elm;
+
+ tor_assert(map);
+
+ /* Ignore if no service or key is zero. */
+ if (BUG(service == NULL) ||
+ BUG(ed25519_public_key_is_zero(&service->keys.identity_pk))) {
+ return;
+ }
+
+ elm = HT_REMOVE(hs_service_ht, map, service);
+ if (elm) {
+ tor_assert(elm == service);
+ } else {
+ log_warn(LD_BUG, "Could not find service in the global map "
+ "while removing service %s",
+ escaped(service->config.directory_path));
+ }
}
-/* Set the cell extensions of <b>cell</b>. */
+/* Set the default values for a service configuration object <b>c</b>. */
static void
-set_trn_cell_extensions(trn_cell_establish_intro_t *cell)
+set_service_default_config(hs_service_config_t *c,
+ const or_options_t *options)
+{
+ (void) options;
+ tor_assert(c);
+ c->ports = smartlist_new();
+ c->directory_path = NULL;
+ c->max_streams_per_rdv_circuit = 0;
+ c->max_streams_close_circuit = 0;
+ c->num_intro_points = NUM_INTRO_POINTS_DEFAULT;
+ c->allow_unknown_ports = 0;
+ c->is_single_onion = 0;
+ c->dir_group_readable = 0;
+ c->is_ephemeral = 0;
+}
+
+/* From a service configuration object config, clear everything from it
+ * meaning free allocated pointers and reset the values. */
+static void
+service_clear_config(hs_service_config_t *config)
+{
+ if (config == NULL) {
+ return;
+ }
+ tor_free(config->directory_path);
+ if (config->ports) {
+ SMARTLIST_FOREACH(config->ports, rend_service_port_config_t *, p,
+ rend_service_port_config_free(p););
+ smartlist_free(config->ports);
+ }
+ memset(config, 0, sizeof(*config));
+}
+
+/* Return the lower bound of maximum INTRODUCE2 cells per circuit before we
+ * rotate intro point (defined by a consensus parameter or the default
+ * value). */
+static int32_t
+get_intro_point_min_introduce2(void)
{
- trn_cell_extension_t *trn_cell_extensions = trn_cell_extension_new();
+ /* The [0, 2147483647] range is quite large to accomodate anything we decide
+ * in the future. */
+ return networkstatus_get_param(NULL, "hs_intro_min_introduce2",
+ INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS,
+ 0, INT32_MAX);
+}
- /* For now, we don't use extensions at all. */
- trn_cell_extensions->num = 0; /* It's already zeroed, but be explicit. */
- trn_cell_establish_intro_set_extensions(cell, trn_cell_extensions);
+/* Return the upper bound of maximum INTRODUCE2 cells per circuit before we
+ * rotate intro point (defined by a consensus parameter or the default
+ * value). */
+static int32_t
+get_intro_point_max_introduce2(void)
+{
+ /* The [0, 2147483647] range is quite large to accomodate anything we decide
+ * in the future. */
+ return networkstatus_get_param(NULL, "hs_intro_max_introduce2",
+ INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS,
+ 0, INT32_MAX);
}
-/** 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. */
-trn_cell_establish_intro_t *
-generate_establish_intro_cell(const uint8_t *circuit_key_material,
- size_t circuit_key_material_len)
+/* Return the minimum lifetime in seconds of an introduction point defined by a
+ * consensus parameter or the default value. */
+static int32_t
+get_intro_point_min_lifetime(void)
{
- trn_cell_establish_intro_t *cell = NULL;
- ssize_t encoded_len;
+#define MIN_INTRO_POINT_LIFETIME_TESTING 10
+ if (get_options()->TestingTorNetwork) {
+ return MIN_INTRO_POINT_LIFETIME_TESTING;
+ }
- log_warn(LD_GENERAL,
- "Generating ESTABLISH_INTRO cell (key_material_len: %u)",
- (unsigned) circuit_key_material_len);
+ /* The [0, 2147483647] range is quite large to accomodate anything we decide
+ * in the future. */
+ return networkstatus_get_param(NULL, "hs_intro_min_lifetime",
+ INTRO_POINT_LIFETIME_MIN_SECONDS,
+ 0, INT32_MAX);
+}
- /* Generate short-term keypair for use in ESTABLISH_INTRO */
- ed25519_keypair_t key_struct;
- if (ed25519_keypair_generate(&key_struct, 0) < 0) {
- goto err;
+/* Return the maximum lifetime in seconds of an introduction point defined by a
+ * consensus parameter or the default value. */
+static int32_t
+get_intro_point_max_lifetime(void)
+{
+#define MAX_INTRO_POINT_LIFETIME_TESTING 30
+ if (get_options()->TestingTorNetwork) {
+ return MAX_INTRO_POINT_LIFETIME_TESTING;
+ }
+
+ /* The [0, 2147483647] range is quite large to accomodate anything we decide
+ * in the future. */
+ return networkstatus_get_param(NULL, "hs_intro_max_lifetime",
+ INTRO_POINT_LIFETIME_MAX_SECONDS,
+ 0, INT32_MAX);
+}
+
+/* Return the number of extra introduction point defined by a consensus
+ * parameter or the default value. */
+static int32_t
+get_intro_point_num_extra(void)
+{
+ /* The [0, 128] range bounds the number of extra introduction point allowed.
+ * Above 128 intro points, it's getting a bit crazy. */
+ return networkstatus_get_param(NULL, "hs_intro_num_extra",
+ NUM_INTRO_POINTS_EXTRA, 0, 128);
+}
+
+/* Helper: Function that needs to return 1 for the HT for each loop which
+ * frees every service in an hash map. */
+static int
+ht_free_service_(struct hs_service_t *service, void *data)
+{
+ (void) data;
+ hs_service_free(service);
+ /* This function MUST return 1 so the given object is then removed from the
+ * service map leading to this free of the object being safe. */
+ return 1;
+}
+
+/* Free every service that can be found in the global map. Once done, clear
+ * and free the global map. */
+static void
+service_free_all(void)
+{
+ if (hs_service_map) {
+ /* The free helper function returns 1 so this is safe. */
+ hs_service_ht_HT_FOREACH_FN(hs_service_map, ht_free_service_, NULL);
+ HT_CLEAR(hs_service_ht, hs_service_map);
+ tor_free(hs_service_map);
+ hs_service_map = NULL;
}
- cell = trn_cell_establish_intro_new();
+ if (hs_service_staging_list) {
+ /* Cleanup staging list. */
+ SMARTLIST_FOREACH(hs_service_staging_list, hs_service_t *, s,
+ hs_service_free(s));
+ smartlist_free(hs_service_staging_list);
+ hs_service_staging_list = NULL;
+ }
+}
- /* Set AUTH_KEY_TYPE: 2 means ed25519 */
- trn_cell_establish_intro_set_auth_key_type(cell,
- HS_INTRO_AUTH_KEY_TYPE_ED25519);
+/* Free a given service intro point object. */
+STATIC void
+service_intro_point_free(hs_service_intro_point_t *ip)
+{
+ if (!ip) {
+ return;
+ }
+ memwipe(&ip->auth_key_kp, 0, sizeof(ip->auth_key_kp));
+ memwipe(&ip->enc_key_kp, 0, sizeof(ip->enc_key_kp));
+ crypto_pk_free(ip->legacy_key);
+ replaycache_free(ip->replay_cache);
+ hs_intropoint_clear(&ip->base);
+ tor_free(ip);
+}
- /* Set AUTH_KEY_LEN field */
- /* Must also set byte-length of AUTH_KEY to match */
- int auth_key_len = ED25519_PUBKEY_LEN;
- trn_cell_establish_intro_set_auth_key_len(cell, auth_key_len);
- trn_cell_establish_intro_setlen_auth_key(cell, auth_key_len);
+/* Helper: free an hs_service_intro_point_t object. This function is used by
+ * digest256map_free() which requires a void * pointer. */
+static void
+service_intro_point_free_(void *obj)
+{
+ service_intro_point_free(obj);
+}
- /* Set AUTH_KEY field */
- uint8_t *auth_key_ptr = trn_cell_establish_intro_getarray_auth_key(cell);
- memcpy(auth_key_ptr, key_struct.pubkey.pubkey, auth_key_len);
+/* Return a newly allocated service intro point and fully initialized from the
+ * given extend_info_t ei if non NULL. If is_legacy is true, we also generate
+ * the legacy key. On error, NULL is returned. */
+STATIC hs_service_intro_point_t *
+service_intro_point_new(const extend_info_t *ei, unsigned int is_legacy)
+{
+ hs_desc_link_specifier_t *ls;
+ hs_service_intro_point_t *ip;
- /* No cell extensions needed */
- set_trn_cell_extensions(cell);
+ ip = tor_malloc_zero(sizeof(*ip));
+ /* We'll create the key material. No need for extra strong, those are short
+ * term keys. */
+ ed25519_keypair_generate(&ip->auth_key_kp, 0);
- /* 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;
- trn_cell_establish_intro_set_sig_len(cell, sig_len);
- trn_cell_establish_intro_setlen_sig(cell, sig_len);
+ { /* Set introduce2 max cells limit */
+ int32_t min_introduce2_cells = get_intro_point_min_introduce2();
+ int32_t max_introduce2_cells = get_intro_point_max_introduce2();
+ if (BUG(max_introduce2_cells < min_introduce2_cells)) {
+ goto err;
+ }
+ ip->introduce2_max = crypto_rand_int_range(min_introduce2_cells,
+ max_introduce2_cells);
+ }
+ { /* Set intro point lifetime */
+ int32_t intro_point_min_lifetime = get_intro_point_min_lifetime();
+ int32_t intro_point_max_lifetime = get_intro_point_max_lifetime();
+ if (BUG(intro_point_max_lifetime < intro_point_min_lifetime)) {
+ goto err;
+ }
+ ip->time_to_expire = time(NULL) +
+ crypto_rand_int_range(intro_point_min_lifetime,intro_point_max_lifetime);
+ }
- /* XXX How to make this process easier and nicer? */
+ ip->replay_cache = replaycache_new(0, 0);
- /* Calculate the cell MAC (aka HANDSHAKE_AUTH). */
- {
- /* To calculate HANDSHAKE_AUTH, we dump the cell in bytes, and then derive
- the MAC from it. */
- uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0};
- uint8_t mac[TRUNNEL_SHA3_256_LEN];
-
- encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp,
- sizeof(cell_bytes_tmp),
- cell);
- if (encoded_len < 0) {
- log_warn(LD_OR, "Unable to pre-encode ESTABLISH_INTRO cell.");
+ /* Initialize the base object. We don't need the certificate object. */
+ ip->base.link_specifiers = smartlist_new();
+
+ /* Generate the encryption key for this intro point. */
+ curve25519_keypair_generate(&ip->enc_key_kp, 0);
+ /* Figure out if this chosen node supports v3 or is legacy only. */
+ if (is_legacy) {
+ ip->base.is_only_legacy = 1;
+ /* Legacy mode that is doesn't support v3+ with ed25519 auth key. */
+ ip->legacy_key = crypto_pk_new();
+ if (crypto_pk_generate_key(ip->legacy_key) < 0) {
goto err;
}
+ }
+
+ if (ei == NULL) {
+ goto done;
+ }
+
+ /* We'll try to add all link specifier. Legacy, IPv4 and ed25519 are
+ * mandatory. */
+ ls = hs_desc_link_specifier_new(ei, LS_IPV4);
+ /* It is impossible to have an extend info object without a v4. */
+ if (BUG(!ls)) {
+ goto err;
+ }
+ smartlist_add(ip->base.link_specifiers, ls);
+
+ ls = hs_desc_link_specifier_new(ei, LS_LEGACY_ID);
+ /* It is impossible to have an extend info object without an identity
+ * digest. */
+ if (BUG(!ls)) {
+ goto err;
+ }
+ smartlist_add(ip->base.link_specifiers, ls);
+
+ /* ed25519 identity key is optional for intro points */
+ ls = hs_desc_link_specifier_new(ei, LS_ED25519_ID);
+ if (ls) {
+ smartlist_add(ip->base.link_specifiers, ls);
+ }
+
+ /* IPv6 is optional. */
+ ls = hs_desc_link_specifier_new(ei, LS_IPV6);
+ if (ls) {
+ smartlist_add(ip->base.link_specifiers, ls);
+ }
+
+ /* Finally, copy onion key from the extend_info_t object. */
+ memcpy(&ip->onion_key, &ei->curve25519_onion_key, sizeof(ip->onion_key));
+
+ done:
+ return ip;
+ err:
+ service_intro_point_free(ip);
+ return NULL;
+}
+
+/* Add the given intro point object to the given intro point map. The intro
+ * point MUST have its RSA encryption key set if this is a legacy type or the
+ * authentication key set otherwise. */
+STATIC void
+service_intro_point_add(digest256map_t *map, hs_service_intro_point_t *ip)
+{
+ hs_service_intro_point_t *old_ip_entry;
+
+ tor_assert(map);
+ tor_assert(ip);
+
+ old_ip_entry = digest256map_set(map, ip->auth_key_kp.pubkey.pubkey, ip);
+ /* Make sure we didn't just try to double-add an intro point */
+ tor_assert_nonfatal(!old_ip_entry);
+}
+
+/* For a given service, remove the intro point from that service's descriptors
+ * (check both current and next descriptor) */
+STATIC void
+service_intro_point_remove(const hs_service_t *service,
+ const hs_service_intro_point_t *ip)
+{
+ tor_assert(service);
+ tor_assert(ip);
+
+ /* Trying all descriptors. */
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ /* We'll try to remove the descriptor on both descriptors which is not
+ * very expensive to do instead of doing loopup + remove. */
+ digest256map_remove(desc->intro_points.map,
+ ip->auth_key_kp.pubkey.pubkey);
+ } FOR_EACH_DESCRIPTOR_END;
+}
+
+/* For a given service and authentication key, return the intro point or NULL
+ * if not found. This will check both descriptors in the service. */
+STATIC hs_service_intro_point_t *
+service_intro_point_find(const hs_service_t *service,
+ const ed25519_public_key_t *auth_key)
+{
+ hs_service_intro_point_t *ip = NULL;
+
+ tor_assert(service);
+ tor_assert(auth_key);
+
+ /* Trying all descriptors to find the right intro point.
+ *
+ * Even if we use the same node as intro point in both descriptors, the node
+ * will have a different intro auth key for each descriptor since we generate
+ * a new one everytime we pick an intro point.
+ *
+ * After #22893 gets implemented, intro points will be moved to be
+ * per-service instead of per-descriptor so this function will need to
+ * change.
+ */
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ if ((ip = digest256map_get(desc->intro_points.map,
+ auth_key->pubkey)) != NULL) {
+ break;
+ }
+ } FOR_EACH_DESCRIPTOR_END;
+
+ return ip;
+}
+
+/* For a given service and intro point, return the descriptor for which the
+ * intro point is assigned to. NULL is returned if not found. */
+STATIC hs_service_descriptor_t *
+service_desc_find_by_intro(const hs_service_t *service,
+ const hs_service_intro_point_t *ip)
+{
+ hs_service_descriptor_t *descp = NULL;
+
+ tor_assert(service);
+ tor_assert(ip);
+
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ if (digest256map_get(desc->intro_points.map,
+ ip->auth_key_kp.pubkey.pubkey)) {
+ descp = desc;
+ break;
+ }
+ } FOR_EACH_DESCRIPTOR_END;
+
+ return descp;
+}
+
+/* From a circuit identifier, get all the possible objects associated with the
+ * ident. If not NULL, service, ip or desc are set if the object can be found.
+ * They are untouched if they can't be found.
+ *
+ * This is an helper function because we do those lookups often so it's more
+ * convenient to simply call this functions to get all the things at once. */
+STATIC void
+get_objects_from_ident(const hs_ident_circuit_t *ident,
+ hs_service_t **service, hs_service_intro_point_t **ip,
+ hs_service_descriptor_t **desc)
+{
+ hs_service_t *s;
+
+ tor_assert(ident);
+
+ /* Get service object from the circuit identifier. */
+ s = find_service(hs_service_map, &ident->identity_pk);
+ if (s && service) {
+ *service = s;
+ }
+
+ /* From the service object, get the intro point object of that circuit. The
+ * following will query both descriptors intro points list. */
+ if (s && ip) {
+ *ip = service_intro_point_find(s, &ident->intro_auth_pk);
+ }
+
+ /* Get the descriptor for this introduction point and service. */
+ if (s && ip && *ip && desc) {
+ *desc = service_desc_find_by_intro(s, *ip);
+ }
+}
+
+/* From a given intro point, return the first link specifier of type
+ * encountered in the link specifier list. Return NULL if it can't be found.
+ *
+ * The caller does NOT have ownership of the object, the intro point does. */
+static hs_desc_link_specifier_t *
+get_link_spec_by_type(const hs_service_intro_point_t *ip, uint8_t type)
+{
+ hs_desc_link_specifier_t *lnk_spec = NULL;
+
+ tor_assert(ip);
+
+ SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers,
+ hs_desc_link_specifier_t *, ls) {
+ if (ls->type == type) {
+ lnk_spec = ls;
+ goto end;
+ }
+ } SMARTLIST_FOREACH_END(ls);
+
+ end:
+ return lnk_spec;
+}
+
+/* Given a service intro point, return the node_t associated to it. This can
+ * return NULL if the given intro point has no legacy ID or if the node can't
+ * be found in the consensus. */
+STATIC const node_t *
+get_node_from_intro_point(const hs_service_intro_point_t *ip)
+{
+ const hs_desc_link_specifier_t *ls;
+
+ tor_assert(ip);
+
+ ls = get_link_spec_by_type(ip, LS_LEGACY_ID);
+ if (BUG(!ls)) {
+ return NULL;
+ }
+ /* XXX In the future, we want to only use the ed25519 ID (#22173). */
+ return node_get_by_id((const char *) ls->u.legacy_id);
+}
+
+/* Given a service intro point, return the extend_info_t for it. This can
+ * return NULL if the node can't be found for the intro point or the extend
+ * info can't be created for the found node. If direct_conn is set, the extend
+ * info is validated on if we can connect directly. */
+static extend_info_t *
+get_extend_info_from_intro_point(const hs_service_intro_point_t *ip,
+ unsigned int direct_conn)
+{
+ extend_info_t *info = NULL;
+ const node_t *node;
+
+ tor_assert(ip);
+
+ node = get_node_from_intro_point(ip);
+ if (node == NULL) {
+ /* This can happen if the relay serving as intro point has been removed
+ * from the consensus. In that case, the intro point will be removed from
+ * the descriptor during the scheduled events. */
+ goto end;
+ }
+
+ /* In the case of a direct connection (single onion service), it is possible
+ * our firewall policy won't allow it so this can return a NULL value. */
+ info = extend_info_from_node(node, direct_conn);
+
+ end:
+ return info;
+}
+
+/* Return the number of introduction points that are established for the
+ * given descriptor. */
+static unsigned int
+count_desc_circuit_established(const hs_service_descriptor_t *desc)
+{
+ unsigned int count = 0;
+
+ tor_assert(desc);
+
+ DIGEST256MAP_FOREACH(desc->intro_points.map, key,
+ const hs_service_intro_point_t *, ip) {
+ count += ip->circuit_established;
+ } DIGEST256MAP_FOREACH_END;
+
+ return count;
+}
+
+/* Close all rendezvous circuits for the given service. */
+static void
+close_service_rp_circuits(hs_service_t *service)
+{
+ origin_circuit_t *ocirc = NULL;
+
+ tor_assert(service);
+
+ /* The reason we go over all circuit instead of using the circuitmap API is
+ * because most hidden service circuits are rendezvous circuits so there is
+ * no real improvement at getting all rendezvous circuits from the
+ * circuitmap and then going over them all to find the right ones.
+ * Furthermore, another option would have been to keep a list of RP cookies
+ * for a service but it creates an engineering complexity since we don't
+ * have a "RP circuit closed" event to clean it up properly so we avoid a
+ * memory DoS possibility. */
+
+ while ((ocirc = circuit_get_next_service_rp_circ(ocirc))) {
+ /* Only close circuits that are v3 and for this service. */
+ if (ocirc->hs_ident != NULL &&
+ ed25519_pubkey_eq(&ocirc->hs_ident->identity_pk,
+ &service->keys.identity_pk)) {
+ /* Reason is FINISHED because service has been removed and thus the
+ * circuit is considered old/uneeded. When freed, it is removed from the
+ * hs circuitmap. */
+ circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED);
+ }
+ }
+}
+
+/* Close the circuit(s) for the given map of introduction points. */
+static void
+close_intro_circuits(hs_service_intropoints_t *intro_points)
+{
+ tor_assert(intro_points);
+
+ DIGEST256MAP_FOREACH(intro_points->map, key,
+ const hs_service_intro_point_t *, ip) {
+ origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
+ if (ocirc) {
+ /* Reason is FINISHED because service has been removed and thus the
+ * circuit is considered old/uneeded. When freed, the circuit is removed
+ * from the HS circuitmap. */
+ circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED);
+ }
+ } DIGEST256MAP_FOREACH_END;
+}
+
+/* Close all introduction circuits for the given service. */
+static void
+close_service_intro_circuits(hs_service_t *service)
+{
+ tor_assert(service);
+
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ close_intro_circuits(&desc->intro_points);
+ } FOR_EACH_DESCRIPTOR_END;
+}
+
+/* Close any circuits related to the given service. */
+static void
+close_service_circuits(hs_service_t *service)
+{
+ tor_assert(service);
+
+ /* Only support for version >= 3. */
+ if (BUG(service->config.version < HS_VERSION_THREE)) {
+ return;
+ }
+ /* Close intro points. */
+ close_service_intro_circuits(service);
+ /* Close rendezvous points. */
+ close_service_rp_circuits(service);
+}
+
+/* Move introduction points from the src descriptor to the dst descriptor. The
+ * destination service intropoints are wiped out if any before moving. */
+static void
+move_descriptor_intro_points(hs_service_descriptor_t *src,
+ hs_service_descriptor_t *dst)
+{
+ tor_assert(src);
+ tor_assert(dst);
+
+ digest256map_free(dst->intro_points.map, service_intro_point_free_);
+ dst->intro_points.map = src->intro_points.map;
+ /* Nullify the source. */
+ src->intro_points.map = NULL;
+}
+
+/* Move introduction points from the src service to the dst service. The
+ * destination service intropoints are wiped out if any before moving. */
+static void
+move_intro_points(hs_service_t *src, hs_service_t *dst)
+{
+ tor_assert(src);
+ tor_assert(dst);
+
+ if (src->desc_current && dst->desc_current) {
+ move_descriptor_intro_points(src->desc_current, dst->desc_current);
+ }
+ if (src->desc_next && dst->desc_next) {
+ move_descriptor_intro_points(src->desc_next, dst->desc_next);
+ }
+}
+
+/* Move every ephemeral services from the src service map to the dst service
+ * map. It is possible that a service can't be register to the dst map which
+ * won't stop the process of moving them all but will trigger a log warn. */
+static void
+move_ephemeral_services(hs_service_ht *src, hs_service_ht *dst)
+{
+ hs_service_t **iter, **next;
+
+ tor_assert(src);
+ tor_assert(dst);
+
+ /* Iterate over the map to find ephemeral service and move them to the other
+ * map. We loop using this method to have a safe removal process. */
+ for (iter = HT_START(hs_service_ht, src); iter != NULL; iter = next) {
+ hs_service_t *s = *iter;
+ if (!s->config.is_ephemeral) {
+ /* Yeah, we are in a very manual loop :). */
+ next = HT_NEXT(hs_service_ht, src, iter);
+ continue;
+ }
+ /* Remove service from map and then register to it to the other map.
+ * Reminder that "*iter" and "s" are the same thing. */
+ next = HT_NEXT_RMV(hs_service_ht, src, iter);
+ if (register_service(dst, s) < 0) {
+ log_warn(LD_BUG, "Ephemeral service key is already being used. "
+ "Skipping.");
+ }
+ }
+}
+
+/* Return a const string of the directory path escaped. If this is an
+ * ephemeral service, it returns "[EPHEMERAL]". This can only be called from
+ * the main thread because escaped() uses a static variable. */
+static const char *
+service_escaped_dir(const hs_service_t *s)
+{
+ return (s->config.is_ephemeral) ? "[EPHEMERAL]" :
+ escaped(s->config.directory_path);
+}
+
+/* Register services that are in the staging list. Once this function returns,
+ * the global service map will be set with the right content and all non
+ * surviving services will be cleaned up. */
+static void
+register_all_services(void)
+{
+ struct hs_service_ht *new_service_map;
+
+ tor_assert(hs_service_staging_list);
+
+ /* We'll save us some allocation and computing time. */
+ if (smartlist_len(hs_service_staging_list) == 0) {
+ return;
+ }
+
+ /* Allocate a new map that will replace the current one. */
+ new_service_map = tor_malloc_zero(sizeof(*new_service_map));
+ HT_INIT(hs_service_ht, new_service_map);
+
+ /* First step is to transfer all ephemeral services from the current global
+ * map to the new one we are constructing. We do not prune ephemeral
+ * services as the only way to kill them is by deleting it from the control
+ * port or stopping the tor daemon. */
+ move_ephemeral_services(hs_service_map, new_service_map);
+
+ SMARTLIST_FOREACH_BEGIN(hs_service_staging_list, hs_service_t *, snew) {
+ hs_service_t *s;
+
+ /* Check if that service is already in our global map and if so, we'll
+ * transfer the intro points to it. */
+ s = find_service(hs_service_map, &snew->keys.identity_pk);
+ if (s) {
+ /* Pass ownership of intro points from s (the current service) to snew
+ * (the newly configured one). */
+ move_intro_points(s, snew);
+ /* Remove the service from the global map because after this, we need to
+ * go over the remaining service in that map that aren't surviving the
+ * reload to close their circuits. */
+ remove_service(hs_service_map, s);
+ }
+ /* Great, this service is now ready to be added to our new map. */
+ if (BUG(register_service(new_service_map, snew) < 0)) {
+ /* This should never happen because prior to registration, we validate
+ * every service against the entire set. Not being able to register a
+ * service means we failed to validate correctly. In that case, don't
+ * break tor and ignore the service but tell user. */
+ log_warn(LD_BUG, "Unable to register service with directory %s",
+ service_escaped_dir(snew));
+ SMARTLIST_DEL_CURRENT(hs_service_staging_list, snew);
+ hs_service_free(snew);
+ }
+ } SMARTLIST_FOREACH_END(snew);
+
+ /* Close any circuits associated with the non surviving services. Every
+ * service in the current global map are roaming. */
+ FOR_EACH_SERVICE_BEGIN(service) {
+ close_service_circuits(service);
+ } FOR_EACH_SERVICE_END;
+
+ /* Time to make the switch. We'll clear the staging list because its content
+ * has now changed ownership to the map. */
+ smartlist_clear(hs_service_staging_list);
+ service_free_all();
+ hs_service_map = new_service_map;
+}
+
+/* Write the onion address of a given service to the given filename fname_ in
+ * the service directory. Return 0 on success else -1 on error. */
+STATIC int
+write_address_to_file(const hs_service_t *service, const char *fname_)
+{
+ int ret = -1;
+ char *fname = NULL;
+ char *addr_buf = NULL;
+
+ tor_assert(service);
+ tor_assert(fname_);
+
+ /* Construct the full address with the onion tld and write the hostname file
+ * to disk. */
+ tor_asprintf(&addr_buf, "%s.%s\n", service->onion_address, address_tld);
+ /* Notice here that we use the given "fname_". */
+ fname = hs_path_from_filename(service->config.directory_path, fname_);
+ if (write_str_to_file(fname, addr_buf, 0) < 0) {
+ log_warn(LD_REND, "Could not write onion address to hostname file %s",
+ escaped(fname));
+ goto end;
+ }
+
+#ifndef _WIN32
+ if (service->config.dir_group_readable) {
+ /* Mode to 0640. */
+ if (chmod(fname, S_IRUSR | S_IWUSR | S_IRGRP) < 0) {
+ log_warn(LD_FS, "Unable to make onion service hostname file %s "
+ "group-readable.", escaped(fname));
+ }
+ }
+#endif /* _WIN32 */
+
+ /* Success. */
+ ret = 0;
+ end:
+ tor_free(fname);
+ tor_free(addr_buf);
+ return ret;
+}
+
+/* Load and/or generate private keys for the given service. On success, the
+ * hostname file will be written to disk along with the master private key iff
+ * the service is not configured for offline keys. Return 0 on success else -1
+ * on failure. */
+static int
+load_service_keys(hs_service_t *service)
+{
+ int ret = -1;
+ char *fname = NULL;
+ ed25519_keypair_t *kp;
+ const hs_service_config_t *config;
+
+ tor_assert(service);
+
+ config = &service->config;
+
+ /* Create and fix permission on service directory. We are about to write
+ * files to that directory so make sure it exists and has the right
+ * permissions. We do this here because at this stage we know that Tor is
+ * actually running and the service we have has been validated. */
+ if (BUG(hs_check_service_private_dir(get_options()->User,
+ config->directory_path,
+ config->dir_group_readable, 1) < 0)) {
+ goto end;
+ }
+
+ /* Try to load the keys from file or generate it if not found. */
+ fname = hs_path_from_filename(config->directory_path, fname_keyfile_prefix);
+ /* Don't ask for key creation, we want to know if we were able to load it or
+ * we had to generate it. Better logging! */
+ kp = ed_key_init_from_file(fname, 0, LOG_INFO, NULL, 0, 0, 0, NULL);
+ if (!kp) {
+ log_info(LD_REND, "Unable to load keys from %s. Generating it...", fname);
+ /* We'll now try to generate the keys and for it we want the strongest
+ * randomness for it. The keypair will be written in different files. */
+ uint32_t key_flags = INIT_ED_KEY_CREATE | INIT_ED_KEY_EXTRA_STRONG |
+ INIT_ED_KEY_SPLIT;
+ kp = ed_key_init_from_file(fname, key_flags, LOG_WARN, NULL, 0, 0, 0,
+ NULL);
+ if (!kp) {
+ log_warn(LD_REND, "Unable to generate keys and save in %s.", fname);
+ goto end;
+ }
+ }
+
+ /* Copy loaded or generated keys to service object. */
+ ed25519_pubkey_copy(&service->keys.identity_pk, &kp->pubkey);
+ memcpy(&service->keys.identity_sk, &kp->seckey,
+ sizeof(service->keys.identity_sk));
+ /* This does a proper memory wipe. */
+ ed25519_keypair_free(kp);
+
+ /* Build onion address from the newly loaded keys. */
+ tor_assert(service->config.version <= UINT8_MAX);
+ hs_build_address(&service->keys.identity_pk,
+ (uint8_t) service->config.version,
+ service->onion_address);
+
+ /* Write onion address to hostname file. */
+ if (write_address_to_file(service, fname_hostname) < 0) {
+ goto end;
+ }
+
+ /* Succes. */
+ ret = 0;
+ end:
+ tor_free(fname);
+ return ret;
+}
+
+/* Free a given service descriptor object and all key material is wiped. */
+STATIC void
+service_descriptor_free(hs_service_descriptor_t *desc)
+{
+ if (!desc) {
+ return;
+ }
+ hs_descriptor_free(desc->desc);
+ memwipe(&desc->signing_kp, 0, sizeof(desc->signing_kp));
+ memwipe(&desc->blinded_kp, 0, sizeof(desc->blinded_kp));
+ SMARTLIST_FOREACH(desc->hsdir_missing_info, char *, id, tor_free(id));
+ smartlist_free(desc->hsdir_missing_info);
+ /* Cleanup all intro points. */
+ digest256map_free(desc->intro_points.map, service_intro_point_free_);
+ digestmap_free(desc->intro_points.failed_id, tor_free_);
+ if (desc->previous_hsdirs) {
+ SMARTLIST_FOREACH(desc->previous_hsdirs, char *, s, tor_free(s));
+ smartlist_free(desc->previous_hsdirs);
+ }
+ tor_free(desc);
+}
+
+/* Return a newly allocated service descriptor object. */
+STATIC hs_service_descriptor_t *
+service_descriptor_new(void)
+{
+ hs_service_descriptor_t *sdesc = tor_malloc_zero(sizeof(*sdesc));
+ sdesc->desc = tor_malloc_zero(sizeof(hs_descriptor_t));
+ /* Initialize the intro points map. */
+ sdesc->intro_points.map = digest256map_new();
+ sdesc->intro_points.failed_id = digestmap_new();
+ sdesc->hsdir_missing_info = smartlist_new();
+ sdesc->previous_hsdirs = smartlist_new();
+ return sdesc;
+}
+
+/* From the given service, remove all expired failing intro points for each
+ * descriptor. */
+static void
+remove_expired_failing_intro(hs_service_t *service, time_t now)
+{
+ tor_assert(service);
+
+ /* For both descriptors, cleanup the failing intro points list. */
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ DIGESTMAP_FOREACH_MODIFY(desc->intro_points.failed_id, key, time_t *, t) {
+ time_t failure_time = *t;
+ if ((failure_time + INTRO_CIRC_RETRY_PERIOD) <= now) {
+ MAP_DEL_CURRENT(key);
+ tor_free(t);
+ }
+ } DIGESTMAP_FOREACH_END;
+ } FOR_EACH_DESCRIPTOR_END;
+}
+
+/* For the given descriptor desc, put all node_t object found from its failing
+ * intro point list and put them in the given node_list. */
+static void
+setup_intro_point_exclude_list(const hs_service_descriptor_t *desc,
+ smartlist_t *node_list)
+{
+ tor_assert(desc);
+ tor_assert(node_list);
+
+ DIGESTMAP_FOREACH(desc->intro_points.failed_id, key, time_t *, t) {
+ (void) t; /* Make gcc happy. */
+ const node_t *node = node_get_by_id(key);
+ if (node) {
+ smartlist_add(node_list, (void *) node);
+ }
+ } DIGESTMAP_FOREACH_END;
+}
- /* sanity check */
- tor_assert(encoded_len > ED25519_SIG_LEN + 2 + TRUNNEL_SHA3_256_LEN);
+/* For the given failing intro point ip, we add its time of failure to the
+ * failed map and index it by identity digest (legacy ID) in the descriptor
+ * desc failed id map. */
+static void
+remember_failing_intro_point(const hs_service_intro_point_t *ip,
+ hs_service_descriptor_t *desc, time_t now)
+{
+ time_t *time_of_failure, *prev_ptr;
+ const hs_desc_link_specifier_t *legacy_ls;
+
+ tor_assert(ip);
+ tor_assert(desc);
+
+ time_of_failure = tor_malloc_zero(sizeof(time_t));
+ *time_of_failure = now;
+ legacy_ls = get_link_spec_by_type(ip, LS_LEGACY_ID);
+ tor_assert(legacy_ls);
+ prev_ptr = digestmap_set(desc->intro_points.failed_id,
+ (const char *) legacy_ls->u.legacy_id,
+ time_of_failure);
+ tor_free(prev_ptr);
+}
+
+/* Copy the descriptor link specifier object from src to dst. */
+static void
+link_specifier_copy(hs_desc_link_specifier_t *dst,
+ const hs_desc_link_specifier_t *src)
+{
+ tor_assert(dst);
+ tor_assert(src);
+ memcpy(dst, src, sizeof(hs_desc_link_specifier_t));
+}
+
+/* Using a given descriptor signing keypair signing_kp, a service intro point
+ * object ip and the time now, setup the content of an already allocated
+ * descriptor intro desc_ip.
+ *
+ * Return 0 on success else a negative value. */
+static int
+setup_desc_intro_point(const ed25519_keypair_t *signing_kp,
+ const hs_service_intro_point_t *ip,
+ time_t now, hs_desc_intro_point_t *desc_ip)
+{
+ int ret = -1;
+ time_t nearest_hour = now - (now % 3600);
- /* Calculate MAC of all fields before HANDSHAKE_AUTH */
- crypto_mac_sha3_256(mac, sizeof(mac),
- circuit_key_material, circuit_key_material_len,
- cell_bytes_tmp,
- encoded_len -
- (ED25519_SIG_LEN + 2 + TRUNNEL_SHA3_256_LEN));
- /* Write the MAC to the cell */
- uint8_t *handshake_ptr =
- trn_cell_establish_intro_getarray_handshake_mac(cell);
- memcpy(handshake_ptr, mac, sizeof(mac));
+ tor_assert(signing_kp);
+ tor_assert(ip);
+ tor_assert(desc_ip);
+
+ /* Copy the onion key. */
+ memcpy(&desc_ip->onion_key, &ip->onion_key, sizeof(desc_ip->onion_key));
+
+ /* Key and certificate material. */
+ desc_ip->auth_key_cert = tor_cert_create(signing_kp,
+ CERT_TYPE_AUTH_HS_IP_KEY,
+ &ip->auth_key_kp.pubkey,
+ nearest_hour,
+ HS_DESC_CERT_LIFETIME,
+ CERT_FLAG_INCLUDE_SIGNING_KEY);
+ if (desc_ip->auth_key_cert == NULL) {
+ log_warn(LD_REND, "Unable to create intro point auth-key certificate");
+ goto done;
}
- /* Calculate the cell signature */
+ /* Copy link specifier(s). */
+ SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers,
+ const hs_desc_link_specifier_t *, ls) {
+ hs_desc_link_specifier_t *dup = tor_malloc_zero(sizeof(*dup));
+ link_specifier_copy(dup, ls);
+ smartlist_add(desc_ip->link_specifiers, dup);
+ } SMARTLIST_FOREACH_END(ls);
+
+ /* For a legacy intro point, we'll use an RSA/ed cross certificate. */
+ if (ip->base.is_only_legacy) {
+ desc_ip->legacy.key = crypto_pk_dup_key(ip->legacy_key);
+ /* Create cross certification cert. */
+ ssize_t cert_len = tor_make_rsa_ed25519_crosscert(
+ &signing_kp->pubkey,
+ desc_ip->legacy.key,
+ nearest_hour + HS_DESC_CERT_LIFETIME,
+ &desc_ip->legacy.cert.encoded);
+ if (cert_len < 0) {
+ log_warn(LD_REND, "Unable to create enc key legacy cross cert.");
+ goto done;
+ }
+ desc_ip->legacy.cert.len = cert_len;
+ }
+
+ /* Encryption key and its cross certificate. */
{
- /* To calculate the sig we follow the same procedure as above. We first
- dump the cell up to the sig, and then calculate the sig */
- uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0};
- ed25519_signature_t sig;
-
- encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp,
- sizeof(cell_bytes_tmp),
- cell);
- if (encoded_len < 0) {
- log_warn(LD_OR, "Unable to pre-encode ESTABLISH_INTRO cell (2).");
- goto err;
+ ed25519_public_key_t ed25519_pubkey;
+
+ /* Use the public curve25519 key. */
+ memcpy(&desc_ip->enc_key, &ip->enc_key_kp.pubkey,
+ sizeof(desc_ip->enc_key));
+ /* The following can't fail. */
+ ed25519_public_key_from_curve25519_public_key(&ed25519_pubkey,
+ &ip->enc_key_kp.pubkey,
+ 0);
+ desc_ip->enc_key_cert = tor_cert_create(signing_kp,
+ CERT_TYPE_CROSS_HS_IP_KEYS,
+ &ed25519_pubkey, nearest_hour,
+ HS_DESC_CERT_LIFETIME,
+ CERT_FLAG_INCLUDE_SIGNING_KEY);
+ if (desc_ip->enc_key_cert == NULL) {
+ log_warn(LD_REND, "Unable to create enc key curve25519 cross cert.");
+ goto done;
}
+ }
+ /* Success. */
+ ret = 0;
- tor_assert(encoded_len > ED25519_SIG_LEN);
+ done:
+ return ret;
+}
- if (ed25519_sign_prefixed(&sig,
- cell_bytes_tmp,
- encoded_len -
- (ED25519_SIG_LEN + sizeof(cell->sig_len)),
- ESTABLISH_INTRO_SIG_PREFIX,
- &key_struct)) {
- log_warn(LD_BUG, "Unable to gen signature for ESTABLISH_INTRO cell.");
- goto err;
+/* Using the given descriptor from the given service, build the descriptor
+ * intro point list so we can then encode the descriptor for publication. This
+ * function does not pick intro points, they have to be in the descriptor
+ * current map. Cryptographic material (keys) must be initialized in the
+ * descriptor for this function to make sense. */
+static void
+build_desc_intro_points(const hs_service_t *service,
+ hs_service_descriptor_t *desc, time_t now)
+{
+ hs_desc_encrypted_data_t *encrypted;
+
+ tor_assert(service);
+ tor_assert(desc);
+
+ /* Ease our life. */
+ encrypted = &desc->desc->encrypted_data;
+ /* Cleanup intro points, we are about to set them from scratch. */
+ hs_descriptor_clear_intro_points(desc->desc);
+
+ DIGEST256MAP_FOREACH(desc->intro_points.map, key,
+ const hs_service_intro_point_t *, ip) {
+ hs_desc_intro_point_t *desc_ip = hs_desc_intro_point_new();
+ if (setup_desc_intro_point(&desc->signing_kp, ip, now, desc_ip) < 0) {
+ hs_desc_intro_point_free(desc_ip);
+ continue;
}
+ /* We have a valid descriptor intro point. Add it to the list. */
+ smartlist_add(encrypted->intro_points, desc_ip);
+ } DIGEST256MAP_FOREACH_END;
+}
+
+/* Populate the descriptor encrypted section fomr the given service object.
+ * This will generate a valid list of introduction points that can be used
+ * after for circuit creation. Return 0 on success else -1 on error. */
+static int
+build_service_desc_encrypted(const hs_service_t *service,
+ hs_service_descriptor_t *desc)
+{
+ hs_desc_encrypted_data_t *encrypted;
+
+ tor_assert(service);
+ tor_assert(desc);
+
+ encrypted = &desc->desc->encrypted_data;
+
+ encrypted->create2_ntor = 1;
+ encrypted->single_onion_service = service->config.is_single_onion;
+
+ /* Setup introduction points from what we have in the service. */
+ if (encrypted->intro_points == NULL) {
+ encrypted->intro_points = smartlist_new();
+ }
+ /* We do NOT build introduction point yet, we only do that once the circuit
+ * have been opened. Until we have the right number of introduction points,
+ * we do not encode anything in the descriptor. */
+
+ /* XXX: Support client authorization (#20700). */
+ encrypted->intro_auth_types = NULL;
+ return 0;
+}
+
+/* Populare the descriptor plaintext section from the given service object.
+ * The caller must make sure that the keys in the descriptors are valid that
+ * is are non-zero. Return 0 on success else -1 on error. */
+static int
+build_service_desc_plaintext(const hs_service_t *service,
+ hs_service_descriptor_t *desc, time_t now)
+{
+ int ret = -1;
+ hs_desc_plaintext_data_t *plaintext;
+
+ tor_assert(service);
+ tor_assert(desc);
+ /* XXX: Use a "assert_desc_ok()" ? */
+ tor_assert(!tor_mem_is_zero((char *) &desc->blinded_kp,
+ sizeof(desc->blinded_kp)));
+ tor_assert(!tor_mem_is_zero((char *) &desc->signing_kp,
+ sizeof(desc->signing_kp)));
- /* And write the signature to the cell */
- uint8_t *sig_ptr = trn_cell_establish_intro_getarray_sig(cell);
- memcpy(sig_ptr, sig.sig, sig_len);
+ /* Set the subcredential. */
+ hs_get_subcredential(&service->keys.identity_pk, &desc->blinded_kp.pubkey,
+ desc->desc->subcredential);
+
+ plaintext = &desc->desc->plaintext_data;
+
+ plaintext->version = service->config.version;
+ plaintext->lifetime_sec = HS_DESC_DEFAULT_LIFETIME;
+ plaintext->signing_key_cert =
+ tor_cert_create(&desc->blinded_kp, CERT_TYPE_SIGNING_HS_DESC,
+ &desc->signing_kp.pubkey, now, HS_DESC_CERT_LIFETIME,
+ CERT_FLAG_INCLUDE_SIGNING_KEY);
+ if (plaintext->signing_key_cert == NULL) {
+ log_warn(LD_REND, "Unable to create descriptor signing certificate for "
+ "service %s",
+ safe_str_client(service->onion_address));
+ goto end;
}
+ /* Copy public key material to go in the descriptor. */
+ ed25519_pubkey_copy(&plaintext->signing_pubkey, &desc->signing_kp.pubkey);
+ ed25519_pubkey_copy(&plaintext->blinded_pubkey, &desc->blinded_kp.pubkey);
+ /* Success. */
+ ret = 0;
+
+ end:
+ return ret;
+}
+
+/* For the given service and descriptor object, create the key material which
+ * is the blinded keypair and the descriptor signing keypair. Return 0 on
+ * success else -1 on error where the generated keys MUST be ignored. */
+static int
+build_service_desc_keys(const hs_service_t *service,
+ hs_service_descriptor_t *desc,
+ uint64_t time_period_num)
+{
+ int ret = 0;
+ ed25519_keypair_t kp;
+
+ tor_assert(desc);
+ tor_assert(!tor_mem_is_zero((char *) &service->keys.identity_pk,
+ ED25519_PUBKEY_LEN));
- /* We are done! Return the cell! */
- return cell;
+ /* XXX: Support offline key feature (#18098). */
+
+ /* Copy the identity keys to the keypair so we can use it to create the
+ * blinded key. */
+ memcpy(&kp.pubkey, &service->keys.identity_pk, sizeof(kp.pubkey));
+ memcpy(&kp.seckey, &service->keys.identity_sk, sizeof(kp.seckey));
+ /* Build blinded keypair for this time period. */
+ hs_build_blinded_keypair(&kp, NULL, 0, time_period_num, &desc->blinded_kp);
+ /* Let's not keep too much traces of our keys in memory. */
+ memwipe(&kp, 0, sizeof(kp));
+
+ /* No need for extra strong, this is a temporary key only for this
+ * descriptor. Nothing long term. */
+ if (ed25519_keypair_generate(&desc->signing_kp, 0) < 0) {
+ log_warn(LD_REND, "Can't generate descriptor signing keypair for "
+ "service %s",
+ safe_str_client(service->onion_address));
+ ret = -1;
+ }
+
+ return ret;
+}
+
+/* Given a service and the current time, build a descriptor for the service.
+ * This function does not pick introduction point, this needs to be done by
+ * the update function. On success, desc_out will point to the newly allocated
+ * descriptor object.
+ *
+ * This can error if we are unable to create keys or certificate. */
+static void
+build_service_descriptor(hs_service_t *service, time_t now,
+ uint64_t time_period_num,
+ hs_service_descriptor_t **desc_out)
+{
+ char *encoded_desc;
+ hs_service_descriptor_t *desc;
+
+ tor_assert(service);
+ tor_assert(desc_out);
+
+ desc = service_descriptor_new();
+ desc->time_period_num = time_period_num;
+
+ /* Create the needed keys so we can setup the descriptor content. */
+ if (build_service_desc_keys(service, desc, time_period_num) < 0) {
+ goto err;
+ }
+ /* Setup plaintext descriptor content. */
+ if (build_service_desc_plaintext(service, desc, now) < 0) {
+ goto err;
+ }
+ /* Setup encrypted descriptor content. */
+ if (build_service_desc_encrypted(service, desc) < 0) {
+ goto err;
+ }
+
+ /* Set the revision counter for this descriptor */
+ set_descriptor_revision_counter(desc->desc);
+
+ /* Let's make sure that we've created a descriptor that can actually be
+ * encoded properly. This function also checks if the encoded output is
+ * decodable after. */
+ if (BUG(hs_desc_encode_descriptor(desc->desc, &desc->signing_kp,
+ &encoded_desc) < 0)) {
+ goto err;
+ }
+ tor_free(encoded_desc);
+
+ /* Assign newly built descriptor to the next slot. */
+ *desc_out = desc;
+ return;
err:
- trn_cell_establish_intro_free(cell);
+ service_descriptor_free(desc);
+}
+
+/* Build descriptors for each service if needed. There are conditions to build
+ * a descriptor which are details in the function. */
+STATIC void
+build_all_descriptors(time_t now)
+{
+ FOR_EACH_SERVICE_BEGIN(service) {
+ if (service->desc_current == NULL) {
+ /* This means we just booted up because else this descriptor will never
+ * be NULL as it should always point to the descriptor that was in
+ * desc_next after rotation. */
+ build_service_descriptor(service, now, hs_get_time_period_num(now),
+ &service->desc_current);
+
+ log_info(LD_REND, "Hidden service %s current descriptor successfully "
+ "built. Now scheduled for upload.",
+ safe_str_client(service->onion_address));
+ }
+ /* A next descriptor to NULL indicate that we need to build a fresh one if
+ * we are in the overlap period for the _next_ time period since it means
+ * we either just booted or we just rotated our descriptors. */
+ if (hs_overlap_mode_is_active(NULL, now) && service->desc_next == NULL) {
+ build_service_descriptor(service, now, hs_get_next_time_period_num(now),
+ &service->desc_next);
+ log_info(LD_REND, "Hidden service %s next descriptor successfully "
+ "built. Now scheduled for upload.",
+ safe_str_client(service->onion_address));
+ }
+ } FOR_EACH_DESCRIPTOR_END;
+}
+
+/* Randomly pick a node to become an introduction point but not present in the
+ * given exclude_nodes list. The chosen node is put in the exclude list
+ * regardless of success or not because in case of failure, the node is simply
+ * unsusable from that point on. If direct_conn is set, try to pick a node
+ * that our local firewall/policy allows to directly connect to and if not,
+ * fallback to a normal 3-hop node. Return a newly allocated service intro
+ * point ready to be used for encoding. NULL on error. */
+static hs_service_intro_point_t *
+pick_intro_point(unsigned int direct_conn, smartlist_t *exclude_nodes)
+{
+ const node_t *node;
+ extend_info_t *info = NULL;
+ hs_service_intro_point_t *ip = NULL;
+ /* Normal 3-hop introduction point flags. */
+ router_crn_flags_t flags = CRN_NEED_UPTIME | CRN_NEED_DESC;
+ /* Single onion flags. */
+ router_crn_flags_t direct_flags = flags | CRN_PREF_ADDR | CRN_DIRECT_CONN;
+
+ node = router_choose_random_node(exclude_nodes, get_options()->ExcludeNodes,
+ direct_conn ? direct_flags : flags);
+ if (node == NULL && direct_conn) {
+ /* Unable to find a node for direct connection, let's fall back to a
+ * normal 3-hop node. */
+ node = router_choose_random_node(exclude_nodes,
+ get_options()->ExcludeNodes, flags);
+ }
+ if (!node) {
+ goto err;
+ }
+
+ /* We have a suitable node, add it to the exclude list. We do this *before*
+ * we can validate the extend information because even in case of failure,
+ * we don't want to use that node anymore. */
+ smartlist_add(exclude_nodes, (void *) node);
+
+ /* We do this to ease our life but also this call makes appropriate checks
+ * of the node object such as validating ntor support for instance. */
+ info = extend_info_from_node(node, direct_conn);
+ if (BUG(info == NULL)) {
+ goto err;
+ }
+
+ /* Let's do a basic sanity check here so that we don't end up advertising the
+ * ed25519 identity key of relays that don't actually support the link
+ * protocol */
+ if (!node_supports_ed25519_link_authentication(node)) {
+ tor_assert_nonfatal(ed25519_public_key_is_zero(&info->ed_identity));
+ }
+
+ /* Create our objects and populate them with the node information. */
+ ip = service_intro_point_new(info, !node_supports_ed25519_hs_intro(node));
+ if (ip == NULL) {
+ goto err;
+ }
+ extend_info_free(info);
+ return ip;
+ err:
+ service_intro_point_free(ip);
+ extend_info_free(info);
return NULL;
}
+/* For a given descriptor from the given service, pick any needed intro points
+ * and update the current map with those newly picked intro points. Return the
+ * number node that might have been added to the descriptor current map. */
+static unsigned int
+pick_needed_intro_points(hs_service_t *service,
+ hs_service_descriptor_t *desc)
+{
+ int i = 0, num_needed_ip;
+ smartlist_t *exclude_nodes = smartlist_new();
+
+ tor_assert(service);
+ tor_assert(desc);
+
+ /* Compute how many intro points we actually need to open. */
+ num_needed_ip = service->config.num_intro_points -
+ digest256map_size(desc->intro_points.map);
+ if (BUG(num_needed_ip < 0)) {
+ /* Let's not make tor freak out here and just skip this. */
+ goto done;
+ }
+
+ /* We want to end up with config.num_intro_points intro points, but if we
+ * have no intro points at all (chances are they all cycled or we are
+ * starting up), we launch get_intro_point_num_extra() extra circuits and
+ * use the first config.num_intro_points that complete. See proposal #155,
+ * section 4 for the rationale of this which is purely for performance.
+ *
+ * The ones after the first config.num_intro_points will be converted to
+ * 'General' internal circuits and then we'll drop them from the list of
+ * intro points. */
+ if (digest256map_size(desc->intro_points.map) == 0) {
+ num_needed_ip += get_intro_point_num_extra();
+ }
+
+ /* Build an exclude list of nodes of our intro point(s). The expiring intro
+ * points are OK to pick again because this is afterall a concept of round
+ * robin so they are considered valid nodes to pick again. */
+ DIGEST256MAP_FOREACH(desc->intro_points.map, key,
+ hs_service_intro_point_t *, ip) {
+ const node_t *intro_node = get_node_from_intro_point(ip);
+ if (intro_node) {
+ smartlist_add(exclude_nodes, (void*)intro_node);
+ }
+ } DIGEST256MAP_FOREACH_END;
+ /* Also, add the failing intro points that our descriptor encounteered in
+ * the exclude node list. */
+ setup_intro_point_exclude_list(desc, exclude_nodes);
+
+ for (i = 0; i < num_needed_ip; i++) {
+ hs_service_intro_point_t *ip;
+
+ /* This function will add the picked intro point node to the exclude nodes
+ * list so we don't pick the same one at the next iteration. */
+ ip = pick_intro_point(service->config.is_single_onion, exclude_nodes);
+ if (ip == NULL) {
+ /* If we end up unable to pick an introduction point it is because we
+ * can't find suitable node and calling this again is highly unlikely to
+ * give us a valid node all of the sudden. */
+ log_info(LD_REND, "Unable to find a suitable node to be an "
+ "introduction point for service %s.",
+ safe_str_client(service->onion_address));
+ goto done;
+ }
+ /* Valid intro point object, add it to the descriptor current map. */
+ service_intro_point_add(desc->intro_points.map, ip);
+ }
+ /* We've successfully picked all our needed intro points thus none are
+ * missing which will tell our upload process to expect the number of
+ * circuits to be the number of configured intro points circuits and not the
+ * number of intro points object that we have. */
+ desc->missing_intro_points = 0;
+
+ /* Success. */
+ done:
+ /* We don't have ownership of the node_t object in this list. */
+ smartlist_free(exclude_nodes);
+ return i;
+}
+
+/** Clear previous cached HSDirs in <b>desc</b>. */
+static void
+service_desc_clear_previous_hsdirs(hs_service_descriptor_t *desc)
+{
+ if (BUG(!desc->previous_hsdirs)) {
+ return;
+ }
+
+ SMARTLIST_FOREACH(desc->previous_hsdirs, char*, s, tor_free(s));
+ smartlist_clear(desc->previous_hsdirs);
+}
+
+/** Note that we attempted to upload <b>desc</b> to <b>hsdir</b>. */
+static void
+service_desc_note_upload(hs_service_descriptor_t *desc, const node_t *hsdir)
+{
+ char b64_digest[BASE64_DIGEST_LEN+1] = {0};
+ digest_to_base64(b64_digest, hsdir->identity);
+
+ if (BUG(!desc->previous_hsdirs)) {
+ return;
+ }
+
+ if (!smartlist_contains_string(desc->previous_hsdirs, b64_digest)) {
+ smartlist_add_strdup(desc->previous_hsdirs, b64_digest);
+ smartlist_sort_strings(desc->previous_hsdirs);
+ }
+}
+
+/** Schedule an upload of <b>desc</b>. If <b>descriptor_changed</b> is set, it
+ * means that this descriptor is dirty. */
+STATIC void
+service_desc_schedule_upload(hs_service_descriptor_t *desc,
+ time_t now,
+ int descriptor_changed)
+
+{
+ desc->next_upload_time = now;
+
+ /* If the descriptor changed, clean up the old HSDirs list. We want to
+ * re-upload no matter what. */
+ if (descriptor_changed) {
+ service_desc_clear_previous_hsdirs(desc);
+ }
+}
+
+/* Update the given descriptor from the given service. The possible update
+ * actions includes:
+ * - Picking missing intro points if needed.
+ * - Incrementing the revision counter if needed.
+ */
+static void
+update_service_descriptor(hs_service_t *service,
+ hs_service_descriptor_t *desc, time_t now)
+{
+ unsigned int num_intro_points;
+
+ tor_assert(service);
+ tor_assert(desc);
+ tor_assert(desc->desc);
+
+ num_intro_points = digest256map_size(desc->intro_points.map);
+
+ /* Pick any missing introduction point(s). */
+ if (num_intro_points < service->config.num_intro_points) {
+ unsigned int num_new_intro_points = pick_needed_intro_points(service,
+ desc);
+ if (num_new_intro_points != 0) {
+ log_info(LD_REND, "Service %s just picked %u intro points and wanted "
+ "%u. It currently has %d intro points. "
+ "Launching ESTABLISH_INTRO circuit shortly.",
+ safe_str_client(service->onion_address),
+ num_new_intro_points,
+ service->config.num_intro_points - num_intro_points,
+ num_intro_points);
+ /* We'll build those introduction point into the descriptor once we have
+ * confirmation that the circuits are opened and ready. However,
+ * indicate that this descriptor should be uploaded from now on. */
+ service_desc_schedule_upload(desc, now, 1);
+ }
+ /* Were we able to pick all the intro points we needed? If not, we'll
+ * flag the descriptor that it's missing intro points because it
+ * couldn't pick enough which will trigger a descriptor upload. */
+ if ((num_new_intro_points + num_intro_points) <
+ service->config.num_intro_points) {
+ desc->missing_intro_points = 1;
+ }
+ }
+}
+
+/* Update descriptors for each service if needed. */
+STATIC void
+update_all_descriptors(time_t now)
+{
+ FOR_EACH_SERVICE_BEGIN(service) {
+ /* We'll try to update each descriptor that is if certain conditions apply
+ * in order for the descriptor to be updated. */
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ update_service_descriptor(service, desc, now);
+ } FOR_EACH_DESCRIPTOR_END;
+ } FOR_EACH_SERVICE_END;
+}
+
+/* Return true iff the given intro point has expired that is it has been used
+ * for too long or we've reached our max seen INTRODUCE2 cell. */
+STATIC int
+intro_point_should_expire(const hs_service_intro_point_t *ip,
+ time_t now)
+{
+ tor_assert(ip);
+
+ if (ip->introduce2_count >= ip->introduce2_max) {
+ goto expired;
+ }
+
+ if (ip->time_to_expire <= now) {
+ goto expired;
+ }
+
+ /* Not expiring. */
+ return 0;
+ expired:
+ return 1;
+}
+
+/* Go over the given set of intro points for each service and remove any
+ * invalid ones. The conditions for removal are:
+ *
+ * - The node doesn't exists anymore (not in consensus)
+ * OR
+ * - The intro point maximum circuit retry count has been reached and no
+ * circuit can be found associated with it.
+ * OR
+ * - The intro point has expired and we should pick a new one.
+ *
+ * If an intro point is removed, the circuit (if any) is immediately close.
+ * If a circuit can't be found, the intro point is kept if it hasn't reached
+ * its maximum circuit retry value and thus should be retried. */
+static void
+cleanup_intro_points(hs_service_t *service, time_t now)
+{
+ tor_assert(service);
+
+ /* For both descriptors, cleanup the intro points. */
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ /* Go over the current intro points we have, make sure they are still
+ * valid and remove any of them that aren't. */
+ DIGEST256MAP_FOREACH_MODIFY(desc->intro_points.map, key,
+ hs_service_intro_point_t *, ip) {
+ const node_t *node = get_node_from_intro_point(ip);
+ origin_circuit_t *ocirc = hs_circ_service_get_intro_circ(ip);
+ int has_expired = intro_point_should_expire(ip, now);
+
+ /* We cleanup an intro point if it has expired or if we do not know the
+ * node_t anymore (removed from our latest consensus) or if we've
+ * reached the maximum number of retry with a non existing circuit. */
+ if (has_expired || node == NULL ||
+ ip->circuit_retries > MAX_INTRO_POINT_CIRCUIT_RETRIES) {
+ /* Remove intro point from descriptor map. We'll add it to the failed
+ * map if we retried it too many times. */
+ MAP_DEL_CURRENT(key);
+ service_intro_point_free(ip);
+
+ /* XXX: Legacy code does NOT do that, it keeps the circuit open until
+ * a new descriptor is uploaded and then closed all expiring intro
+ * point circuit. Here, we close immediately and because we just
+ * discarded the intro point, a new one will be selected, a new
+ * descriptor created and uploaded. There is no difference to an
+ * attacker between the timing of a new consensus and intro point
+ * rotation (possibly?). */
+ if (ocirc && !TO_CIRCUIT(ocirc)->marked_for_close) {
+ /* After this, no new cells will be handled on the circuit. */
+ circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED);
+ }
+ continue;
+ }
+ } DIGEST256MAP_FOREACH_END;
+ } FOR_EACH_DESCRIPTOR_END;
+}
+
+/** We just entered overlap period and we need to rotate our <b>service</b>
+ * descriptors */
+static void
+rotate_service_descriptors(hs_service_t *service)
+{
+ if (service->desc_current) {
+ /* Close all IP circuits for the descriptor. */
+ close_intro_circuits(&service->desc_current->intro_points);
+ /* We don't need this one anymore, we won't serve any clients coming with
+ * this service descriptor. */
+ service_descriptor_free(service->desc_current);
+ }
+ /* The next one become the current one and emptying the next will trigger
+ * a descriptor creation for it. */
+ service->desc_current = service->desc_next;
+ service->desc_next = NULL;
+}
+
+/** Return true if <b>service</b> **just** entered overlap mode. */
+static int
+service_just_entered_overlap_mode(const hs_service_t *service,
+ int overlap_mode_is_active)
+{
+ if (overlap_mode_is_active && !service->state.in_overlap_period) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/** Return true if <b>service</b> **just** left overlap mode. */
+static int
+service_just_left_overlap_mode(const hs_service_t *service,
+ int overlap_mode_is_active)
+{
+ if (!overlap_mode_is_active && service->state.in_overlap_period) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Rotate descriptors for each service if needed. If we are just entering or
+ * leaving the overlap period, rotate them that is point the previous
+ * descriptor to the current and cleanup the previous one. A non existing
+ * current descriptor will trigger a descriptor build for the next time
+ * period. */
+STATIC void
+rotate_all_descriptors(time_t now)
+{
+ /* XXX We rotate all our service descriptors at once. In the future it might
+ * be wise, to rotate service descriptors independently to hide that all
+ * those descriptors are on the same tor instance */
+
+ int overlap_mode_is_active = hs_overlap_mode_is_active(NULL, now);
+
+ FOR_EACH_SERVICE_BEGIN(service) {
+ int service_entered_overlap = service_just_entered_overlap_mode(service,
+ overlap_mode_is_active);
+ int service_left_overlap = service_just_left_overlap_mode(service,
+ overlap_mode_is_active);
+ /* This should not be possible */
+ if (BUG(service_entered_overlap && service_left_overlap)) {
+ return;
+ }
+
+ /* No changes in overlap mode: nothing to do here */
+ if (!service_entered_overlap && !service_left_overlap) {
+ return;
+ }
+
+ /* To get down there means that some change happened to overlap mode */
+ tor_assert(service_entered_overlap || service_left_overlap);
+
+ /* Update the overlap marks on this service */
+ if (service_entered_overlap) {
+ /* It's the first time the service encounters the overlap period so flag
+ * it in order to make sure we don't rotate at next check. */
+ service->state.in_overlap_period = 1;
+ } else if (service_left_overlap) {
+ service->state.in_overlap_period = 0;
+ }
+
+ if (service_entered_overlap) {
+ /* We just entered overlap period: recompute all HSDir indices. We need
+ * to do this otherwise nodes can get stuck with old HSDir indices until
+ * we fetch a new consensus, and we might need to reupload our desc
+ * before that. */
+ /* XXX find a better place than rotate_all_descriptors() to do this */
+ nodelist_recompute_all_hsdir_indices();
+ }
+
+ /* If we just entered or left overlap mode, rotate our descriptors */
+ log_info(LD_REND, "We just %s overlap period. About to rotate %s "
+ "descriptors (%p / %p).",
+ service_entered_overlap ? "entered" : "left",
+ safe_str_client(service->onion_address),
+ service->desc_current, service->desc_next);
+
+ /* If we have a next descriptor lined up, rotate the descriptors so that it
+ * becomes current. */
+ if (service->desc_next) {
+ rotate_service_descriptors(service);
+ }
+ } FOR_EACH_SERVICE_END;
+}
+
+/* Scheduled event run from the main loop. Make sure all our services are up
+ * to date and ready for the other scheduled events. This includes looking at
+ * the introduction points status and descriptor rotation time. */
+STATIC void
+run_housekeeping_event(time_t now)
+{
+ /* Note that nothing here opens circuit(s) nor uploads descriptor(s). We are
+ * simply moving things around or removing uneeded elements. */
+
+ FOR_EACH_SERVICE_BEGIN(service) {
+ /* Cleanup invalid intro points from the service descriptor. */
+ cleanup_intro_points(service, now);
+
+ /* Remove expired failing intro point from the descriptor failed list. We
+ * reset them at each INTRO_CIRC_RETRY_PERIOD. */
+ remove_expired_failing_intro(service, now);
+
+ /* At this point, the service is now ready to go through the scheduled
+ * events guaranteeing a valid state. Intro points might be missing from
+ * the descriptors after the cleanup but the update/build process will
+ * make sure we pick those missing ones. */
+ } FOR_EACH_SERVICE_END;
+}
+
+/* Scheduled event run from the main loop. Make sure all descriptors are up to
+ * date. Once this returns, each service descriptor needs to be considered for
+ * new introduction circuits and then for upload. */
+static void
+run_build_descriptor_event(time_t now)
+{
+ /* For v2 services, this step happens in the upload event. */
+
+ /* Run v3+ events. */
+ /* We start by rotating the descriptors only if needed. */
+ rotate_all_descriptors(now);
+
+ /* Then, we'll try to build new descriptors that we might need. The
+ * condition is that the next descriptor is non existing because it has
+ * been rotated or we just started up. */
+ build_all_descriptors(now);
+
+ /* Finally, we'll check if we should update the descriptors. Missing
+ * introduction points will be picked in this function which is useful for
+ * newly built descriptors. */
+ update_all_descriptors(now);
+}
+
+/* For the given service, launch any intro point circuits that could be
+ * needed. This considers every descriptor of the service. */
+static void
+launch_intro_point_circuits(hs_service_t *service)
+{
+ tor_assert(service);
+
+ /* For both descriptors, try to launch any missing introduction point
+ * circuits using the current map. */
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ /* Keep a ref on if we need a direct connection. We use this often. */
+ unsigned int direct_conn = service->config.is_single_onion;
+
+ DIGEST256MAP_FOREACH_MODIFY(desc->intro_points.map, key,
+ hs_service_intro_point_t *, ip) {
+ extend_info_t *ei;
+
+ /* Skip the intro point that already has an existing circuit
+ * (established or not). */
+ if (hs_circ_service_get_intro_circ(ip)) {
+ continue;
+ }
+
+ ei = get_extend_info_from_intro_point(ip, direct_conn);
+ if (ei == NULL) {
+ if (!direct_conn) {
+ /* In case of a multi-hop connection, it should never happen that we
+ * can't get the extend info from the node. Avoid connection and
+ * remove intro point from descriptor in order to recover from this
+ * potential bug. */
+ tor_assert_nonfatal(ei);
+ }
+ MAP_DEL_CURRENT(key);
+ service_intro_point_free(ip);
+ continue;
+ }
+
+ /* Launch a circuit to the intro point. */
+ ip->circuit_retries++;
+ if (hs_circ_launch_intro_point(service, ip, ei) < 0) {
+ log_warn(LD_REND, "Unable to launch intro circuit to node %s "
+ "for service %s.",
+ safe_str_client(extend_info_describe(ei)),
+ safe_str_client(service->onion_address));
+ /* Intro point will be retried if possible after this. */
+ }
+ extend_info_free(ei);
+ } DIGEST256MAP_FOREACH_END;
+ } FOR_EACH_DESCRIPTOR_END;
+}
+
+/* Don't try to build more than this many circuits before giving up for a
+ * while. Dynamically calculated based on the configured number of intro
+ * points for the given service and how many descriptor exists. The default
+ * use case of 3 introduction points and two descriptors will allow 28
+ * circuits for a retry period (((3 + 2) + (3 * 3)) * 2). */
+static unsigned int
+get_max_intro_circ_per_period(const hs_service_t *service)
+{
+ unsigned int count = 0;
+ unsigned int multiplier = 0;
+ unsigned int num_wanted_ip;
+
+ tor_assert(service);
+ tor_assert(service->config.num_intro_points <=
+ HS_CONFIG_V3_MAX_INTRO_POINTS);
+
+/* For a testing network, allow to do it for the maximum amount so circuit
+ * creation and rotation and so on can actually be tested without limit. */
+#define MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING -1
+ if (get_options()->TestingTorNetwork) {
+ return MAX_INTRO_POINT_CIRCUIT_RETRIES_TESTING;
+ }
+
+ num_wanted_ip = service->config.num_intro_points;
+
+ /* The calculation is as follow. We have a number of intro points that we
+ * want configured as a torrc option (num_intro_points). We then add an
+ * extra value so we can launch multiple circuits at once and pick the
+ * quickest ones. For instance, we want 3 intros, we add 2 extra so we'll
+ * pick 5 intros and launch 5 circuits. */
+ count += (num_wanted_ip + get_intro_point_num_extra());
+
+ /* Then we add the number of retries that is possible to do for each intro
+ * point. If we want 3 intros, we'll allow 3 times the number of possible
+ * retry. */
+ count += (num_wanted_ip * MAX_INTRO_POINT_CIRCUIT_RETRIES);
+
+ /* Then, we multiply by a factor of 2 if we have both descriptor or 0 if we
+ * have none. */
+ multiplier += (service->desc_current) ? 1 : 0;
+ multiplier += (service->desc_next) ? 1 : 0;
+
+ return (count * multiplier);
+}
+
+/* For the given service, return 1 if the service is allowed to launch more
+ * introduction circuits else 0 if the maximum has been reached for the retry
+ * period of INTRO_CIRC_RETRY_PERIOD. */
+STATIC int
+can_service_launch_intro_circuit(hs_service_t *service, time_t now)
+{
+ tor_assert(service);
+
+ /* Consider the intro circuit retry period of the service. */
+ if (now > (service->state.intro_circ_retry_started_time +
+ INTRO_CIRC_RETRY_PERIOD)) {
+ service->state.intro_circ_retry_started_time = now;
+ service->state.num_intro_circ_launched = 0;
+ goto allow;
+ }
+ /* Check if we can still launch more circuits in this period. */
+ if (service->state.num_intro_circ_launched <=
+ get_max_intro_circ_per_period(service)) {
+ goto allow;
+ }
+
+ /* Rate limit log that we've reached our circuit creation limit. */
+ {
+ char *msg;
+ time_t elapsed_time = now - service->state.intro_circ_retry_started_time;
+ static ratelim_t rlimit = RATELIM_INIT(INTRO_CIRC_RETRY_PERIOD);
+ if ((msg = rate_limit_log(&rlimit, now))) {
+ log_info(LD_REND, "Hidden service %s exceeded its circuit launch limit "
+ "of %u per %d seconds. It launched %u circuits in "
+ "the last %ld seconds. Will retry in %ld seconds.",
+ safe_str_client(service->onion_address),
+ get_max_intro_circ_per_period(service),
+ INTRO_CIRC_RETRY_PERIOD,
+ service->state.num_intro_circ_launched,
+ (long int) elapsed_time,
+ (long int) (INTRO_CIRC_RETRY_PERIOD - elapsed_time));
+ tor_free(msg);
+ }
+ }
+
+ /* Not allow. */
+ return 0;
+ allow:
+ return 1;
+}
+
+/* Scheduled event run from the main loop. Make sure we have all the circuits
+ * we need for each service. */
+static void
+run_build_circuit_event(time_t now)
+{
+ /* Make sure we can actually have enough information or able to build
+ * internal circuits as required by services. */
+ if (router_have_consensus_path() == CONSENSUS_PATH_UNKNOWN ||
+ !have_completed_a_circuit()) {
+ return;
+ }
+
+ /* Run v2 check. */
+ if (rend_num_services() > 0) {
+ rend_consider_services_intro_points(now);
+ }
+
+ /* Run v3+ check. */
+ FOR_EACH_SERVICE_BEGIN(service) {
+ /* For introduction circuit, we need to make sure we don't stress too much
+ * circuit creation so make sure this service is respecting that limit. */
+ if (can_service_launch_intro_circuit(service, now)) {
+ /* Launch intro point circuits if needed. */
+ launch_intro_point_circuits(service);
+ /* Once the circuits have opened, we'll make sure to update the
+ * descriptor intro point list and cleanup any extraneous. */
+ }
+ } FOR_EACH_SERVICE_END;
+}
+
+/* Encode and sign the service descriptor desc and upload it to the given
+ * hidden service directory. This does nothing if PublishHidServDescriptors
+ * is false. */
+static void
+upload_descriptor_to_hsdir(const hs_service_t *service,
+ hs_service_descriptor_t *desc, const node_t *hsdir)
+{
+ char version_str[4] = {0}, *encoded_desc = NULL;
+ directory_request_t *dir_req;
+ hs_ident_dir_conn_t ident;
+
+ tor_assert(service);
+ tor_assert(desc);
+ tor_assert(hsdir);
+
+ memset(&ident, 0, sizeof(ident));
+
+ /* Let's avoid doing that if tor is configured to not publish. */
+ if (!get_options()->PublishHidServDescriptors) {
+ log_info(LD_REND, "Service %s not publishing descriptor. "
+ "PublishHidServDescriptors is set to 1.",
+ safe_str_client(service->onion_address));
+ goto end;
+ }
+
+ /* First of all, we'll encode the descriptor. This should NEVER fail but
+ * just in case, let's make sure we have an actual usable descriptor. */
+ if (BUG(hs_desc_encode_descriptor(desc->desc, &desc->signing_kp,
+ &encoded_desc) < 0)) {
+ goto end;
+ }
+
+ /* Setup the connection identifier. */
+ ed25519_pubkey_copy(&ident.identity_pk, &service->keys.identity_pk);
+ /* This is our resource when uploading which is used to construct the URL
+ * with the version number: "/tor/hs/<version>/publish". */
+ tor_snprintf(version_str, sizeof(version_str), "%u",
+ service->config.version);
+
+ /* Build the directory request for this HSDir. */
+ dir_req = directory_request_new(DIR_PURPOSE_UPLOAD_HSDESC);
+ directory_request_set_routerstatus(dir_req, hsdir->rs);
+ directory_request_set_indirection(dir_req, DIRIND_ANONYMOUS);
+ directory_request_set_resource(dir_req, version_str);
+ directory_request_set_payload(dir_req, encoded_desc,
+ strlen(encoded_desc));
+ /* The ident object is copied over the directory connection object once
+ * the directory request is initiated. */
+ directory_request_upload_set_hs_ident(dir_req, &ident);
+
+ /* Initiate the directory request to the hsdir.*/
+ directory_initiate_request(dir_req);
+ directory_request_free(dir_req);
+
+ /* Add this node to previous_hsdirs list */
+ service_desc_note_upload(desc, hsdir);
+
+ /* Logging so we know where it was sent. */
+ {
+ int is_next_desc = (service->desc_next == desc);
+ const uint8_t *index = (is_next_desc) ? hsdir->hsdir_index->next :
+ hsdir->hsdir_index->current;
+ log_info(LD_REND, "Service %s %s descriptor of revision %" PRIu64
+ " initiated upload request to %s with index %s",
+ safe_str_client(service->onion_address),
+ (is_next_desc) ? "next" : "current",
+ desc->desc->plaintext_data.revision_counter,
+ safe_str_client(node_describe(hsdir)),
+ safe_str_client(hex_str((const char *) index, 32)));
+ }
+
+ /* XXX: Inform control port of the upload event (#20699). */
+ end:
+ tor_free(encoded_desc);
+ return;
+}
+
+/** Return a newly-allocated string for our state file which contains revision
+ * counter information for <b>desc</b>. The format is:
+ *
+ * HidServRevCounter <blinded_pubkey> <rev_counter>
+ */
+STATIC char *
+encode_desc_rev_counter_for_state(const hs_service_descriptor_t *desc)
+{
+ char *state_str = NULL;
+ char blinded_pubkey_b64[ED25519_BASE64_LEN+1];
+ uint64_t rev_counter = desc->desc->plaintext_data.revision_counter;
+ const ed25519_public_key_t *blinded_pubkey = &desc->blinded_kp.pubkey;
+
+ /* Turn the blinded key into b64 so that we save it on state */
+ tor_assert(blinded_pubkey);
+ if (ed25519_public_to_base64(blinded_pubkey_b64, blinded_pubkey) < 0) {
+ goto done;
+ }
+
+ /* Format is: <blinded key> <rev counter> */
+ tor_asprintf(&state_str, "%s %" PRIu64, blinded_pubkey_b64, rev_counter);
+
+ log_info(LD_GENERAL, "[!] Adding rev counter %" PRIu64 " for %s!",
+ rev_counter, blinded_pubkey_b64);
+
+ done:
+ return state_str;
+}
+
+/** Update HS descriptor revision counters in our state by removing the old
+ * ones and writing down the ones that are currently active. */
+static void
+update_revision_counters_in_state(void)
+{
+ config_line_t *lines = NULL;
+ config_line_t **nextline = &lines;
+ or_state_t *state = get_or_state();
+
+ /* Prepare our state structure with the rev counters */
+ FOR_EACH_SERVICE_BEGIN(service) {
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ /* We don't want to save zero counters */
+ if (desc->desc->plaintext_data.revision_counter == 0) {
+ continue;
+ }
+
+ *nextline = tor_malloc_zero(sizeof(config_line_t));
+ (*nextline)->key = tor_strdup("HidServRevCounter");
+ (*nextline)->value = encode_desc_rev_counter_for_state(desc);
+ nextline = &(*nextline)->next;
+ } FOR_EACH_DESCRIPTOR_END;
+ } FOR_EACH_SERVICE_END;
+
+ /* Remove the old rev counters, and replace them with the new ones */
+ config_free_lines(state->HidServRevCounter);
+ state->HidServRevCounter = lines;
+
+ /* Set the state as dirty since we just edited it */
+ if (!get_options()->AvoidDiskWrites) {
+ or_state_mark_dirty(state, 0);
+ }
+}
+
+/** Scan the string <b>state_line</b> for the revision counter of the service
+ * with <b>blinded_pubkey</b>. Set <b>service_found_out</b> to True if the
+ * line is relevant to this service, and return the cached revision
+ * counter. Else set <b>service_found_out</b> to False. */
+STATIC uint64_t
+check_state_line_for_service_rev_counter(const char *state_line,
+ const ed25519_public_key_t *blinded_pubkey,
+ int *service_found_out)
+{
+ smartlist_t *items = NULL;
+ int ok;
+ ed25519_public_key_t pubkey_in_state;
+ uint64_t rev_counter = 0;
+
+ tor_assert(service_found_out);
+ tor_assert(state_line);
+ tor_assert(blinded_pubkey);
+
+ /* Assume that the line is not for this service */
+ *service_found_out = 0;
+
+ /* Start parsing the state line */
+ items = smartlist_new();
+ smartlist_split_string(items, state_line, NULL,
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
+ if (smartlist_len(items) < 2) {
+ log_warn(LD_GENERAL, "Incomplete rev counter line. Ignoring.");
+ goto done;
+ }
+
+ char *b64_key_str = smartlist_get(items, 0);
+ char *saved_rev_counter_str = smartlist_get(items, 1);
+
+ /* Parse blinded key to check if it's for this hidden service */
+ if (ed25519_public_from_base64(&pubkey_in_state, b64_key_str) < 0) {
+ log_warn(LD_GENERAL, "Unable to base64 key in revcount line. Ignoring.");
+ goto done;
+ }
+ /* State line not for this hidden service */
+ if (!ed25519_pubkey_eq(&pubkey_in_state, blinded_pubkey)) {
+ goto done;
+ }
+
+ rev_counter = tor_parse_uint64(saved_rev_counter_str,
+ 10, 0, UINT64_MAX, &ok, NULL);
+ if (!ok) {
+ log_warn(LD_GENERAL, "Unable to parse rev counter. Ignoring.");
+ goto done;
+ }
+
+ /* Since we got this far, the line was for this service */
+ *service_found_out = 1;
+
+ log_info(LD_GENERAL, "Found rev counter for %s: %" PRIu64,
+ b64_key_str, rev_counter);
+
+ done:
+ tor_assert(items);
+ SMARTLIST_FOREACH(items, char*, s, tor_free(s));
+ smartlist_free(items);
+
+ return rev_counter;
+}
+
+/** Dig into our state file and find the current revision counter for the
+ * service with blinded key <b>blinded_pubkey</b>. If no revision counter is
+ * found, return 0. */
+static uint64_t
+get_rev_counter_for_service(const ed25519_public_key_t *blinded_pubkey)
+{
+ or_state_t *state = get_or_state();
+ config_line_t *line;
+
+ /* Set default value for rev counters (if not found) to 0 */
+ uint64_t final_rev_counter = 0;
+
+ for (line = state->HidServRevCounter ; line ; line = line->next) {
+ int service_found = 0;
+ uint64_t rev_counter = 0;
+
+ tor_assert(!strcmp(line->key, "HidServRevCounter"));
+
+ /* Scan all the HidServRevCounter lines till we find the line for this
+ service: */
+ rev_counter = check_state_line_for_service_rev_counter(line->value,
+ blinded_pubkey,
+ &service_found);
+ if (service_found) {
+ final_rev_counter = rev_counter;
+ goto done;
+ }
+ }
+
+ done:
+ return final_rev_counter;
+}
+
+/** Update the value of the revision counter for <b>hs_desc</b> and save it on
+ our state file. */
+static void
+increment_descriptor_revision_counter(hs_descriptor_t *hs_desc)
+{
+ /* Find stored rev counter if it exists */
+ uint64_t rev_counter =
+ get_rev_counter_for_service(&hs_desc->plaintext_data.blinded_pubkey);
+
+ /* Increment the revision counter of <b>hs_desc</b> so the next update (which
+ * will trigger an upload) will have the right value. We do this at this
+ * stage to only do it once because a descriptor can have many updates before
+ * being uploaded. By doing it at upload, we are sure to only increment by 1
+ * and thus avoid leaking how many operations we made on the descriptor from
+ * the previous one before uploading. */
+ rev_counter++;
+ hs_desc->plaintext_data.revision_counter = rev_counter;
+
+ update_revision_counters_in_state();
+}
+
+/** Set the revision counter in <b>hs_desc</b>, using the state file to find
+ * the current counter value if it exists. */
+static void
+set_descriptor_revision_counter(hs_descriptor_t *hs_desc)
+{
+ /* Find stored rev counter if it exists */
+ uint64_t rev_counter =
+ get_rev_counter_for_service(&hs_desc->plaintext_data.blinded_pubkey);
+
+ hs_desc->plaintext_data.revision_counter = rev_counter;
+}
+
+/* Encode and sign the service descriptor desc and upload it to the
+ * responsible hidden service directories. If for_next_period is true, the set
+ * of directories are selected using the next hsdir_index. This does nothing
+ * if PublishHidServDescriptors is false. */
+STATIC void
+upload_descriptor_to_all(const hs_service_t *service,
+ hs_service_descriptor_t *desc, int for_next_period)
+{
+ smartlist_t *responsible_dirs = NULL;
+
+ tor_assert(service);
+ tor_assert(desc);
+
+ /* Get our list of responsible HSDir. */
+ responsible_dirs = smartlist_new();
+ /* The parameter 0 means that we aren't a client so tell the function to use
+ * the spread store consensus paremeter. */
+ hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num,
+ for_next_period, 0, responsible_dirs);
+
+ /* For each responsible HSDir we have, initiate an upload command. */
+ SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *,
+ hsdir_rs) {
+ const node_t *hsdir_node = node_get_by_id(hsdir_rs->identity_digest);
+ /* Getting responsible hsdir implies that the node_t object exists for the
+ * routerstatus_t found in the consensus else we have a problem. */
+ tor_assert(hsdir_node);
+ /* Do not upload to an HSDir we don't have a descriptor for. */
+ if (!node_has_descriptor(hsdir_node)) {
+ log_info(LD_REND, "Missing descriptor for HSDir %s. Not uploading "
+ "descriptor. We'll try later once we have it.",
+ safe_str_client(node_describe(hsdir_node)));
+ /* Once we get new directory information, this HSDir will be retried if
+ * we ever get the descriptor. */
+ smartlist_add(desc->hsdir_missing_info,
+ tor_memdup(hsdir_rs->identity_digest, DIGEST_LEN));
+ continue;
+ }
+
+ /* Upload this descriptor to the chosen directory. */
+ upload_descriptor_to_hsdir(service, desc, hsdir_node);
+ } SMARTLIST_FOREACH_END(hsdir_rs);
+
+ /* Set the next upload time for this descriptor. Even if we are configured
+ * to not upload, we still want to follow the right cycle of life for this
+ * descriptor. */
+ desc->next_upload_time =
+ (time(NULL) + crypto_rand_int_range(HS_SERVICE_NEXT_UPLOAD_TIME_MIN,
+ HS_SERVICE_NEXT_UPLOAD_TIME_MAX));
+ {
+ char fmt_next_time[ISO_TIME_LEN+1];
+ format_local_iso_time(fmt_next_time, desc->next_upload_time);
+ log_debug(LD_REND, "Service %s set to upload a descriptor at %s",
+ safe_str_client(service->onion_address), fmt_next_time);
+ }
+
+ /* Update the revision counter of this descriptor */
+ increment_descriptor_revision_counter(desc->desc);
+
+ smartlist_free(responsible_dirs);
+ return;
+}
+
+/** The set of HSDirs have changed: check if the change affects our descriptor
+ * HSDir placement, and if it does, reupload the desc. */
+STATIC int
+service_desc_hsdirs_changed(const hs_service_t *service,
+ const hs_service_descriptor_t *desc)
+{
+ int retval = 0;
+ smartlist_t *responsible_dirs = smartlist_new();
+ smartlist_t *b64_responsible_dirs = smartlist_new();
+
+ /* No desc upload has happened yet: it will happen eventually */
+ if (!desc->previous_hsdirs || !smartlist_len(desc->previous_hsdirs)) {
+ goto done;
+ }
+
+ /* Get list of responsible hsdirs */
+ hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num,
+ service->desc_next == desc, 0, responsible_dirs);
+
+ /* Make a second list with their b64ed identity digests, so that we can
+ * compare it with out previous list of hsdirs */
+ SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *, hsdir_rs) {
+ char b64_digest[BASE64_DIGEST_LEN+1] = {0};
+ digest_to_base64(b64_digest, hsdir_rs->identity_digest);
+ smartlist_add_strdup(b64_responsible_dirs, b64_digest);
+ } SMARTLIST_FOREACH_END(hsdir_rs);
+
+ /* Sort this new smartlist so that we can compare it with the other one */
+ smartlist_sort_strings(b64_responsible_dirs);
+
+ /* Check whether the set of HSDirs changed */
+ if (!smartlist_strings_eq(b64_responsible_dirs, desc->previous_hsdirs)) {
+ log_info(LD_GENERAL, "Received new dirinfo and set of hsdirs changed!");
+ retval = 1;
+ } else {
+ log_debug(LD_GENERAL, "No change in hsdir set!");
+ }
+
+ done:
+ smartlist_free(responsible_dirs);
+
+ SMARTLIST_FOREACH(b64_responsible_dirs, char*, s, tor_free(s));
+ smartlist_free(b64_responsible_dirs);
+
+ return retval;
+}
+
+/* Return 1 if the given descriptor from the given service can be uploaded
+ * else return 0 if it can not. */
+static int
+should_service_upload_descriptor(const hs_service_t *service,
+ const hs_service_descriptor_t *desc, time_t now)
+{
+ unsigned int num_intro_points;
+
+ tor_assert(service);
+ tor_assert(desc);
+
+ /* If this descriptors has missing intro points that is that it couldn't get
+ * them all when it was time to pick them, it means that we should upload
+ * instead of waiting an arbitrary amount of time breaking the service.
+ * Else, if we have no missing intro points, we use the value taken from the
+ * service configuration. */
+ if (desc->missing_intro_points) {
+ num_intro_points = digest256map_size(desc->intro_points.map);
+ } else {
+ num_intro_points = service->config.num_intro_points;
+ }
+
+ /* This means we tried to pick intro points but couldn't get any so do not
+ * upload descriptor in this case. We need at least one for the service to
+ * be reachable. */
+ if (desc->missing_intro_points && num_intro_points == 0) {
+ goto cannot;
+ }
+
+ /* Check if all our introduction circuit have been established for all the
+ * intro points we have selected. */
+ if (count_desc_circuit_established(desc) != num_intro_points) {
+ goto cannot;
+ }
+
+ /* Is it the right time to upload? */
+ if (desc->next_upload_time > now) {
+ goto cannot;
+ }
+
+ /* Don't upload desc if we don't have a live consensus */
+ if (!networkstatus_get_live_consensus(now)) {
+ goto cannot;
+ }
+
+ /* Do we know enough router descriptors to have adequate vision of the HSDir
+ hash ring? */
+ if (!router_have_minimum_dir_info()) {
+ goto cannot;
+ }
+
+ /* Can upload! */
+ return 1;
+ cannot:
+ return 0;
+}
+
+/* Scheduled event run from the main loop. Try to upload the descriptor for
+ * each service. */
+STATIC void
+run_upload_descriptor_event(time_t now)
+{
+ /* v2 services use the same function for descriptor creation and upload so
+ * we do everything here because the intro circuits were checked before. */
+ if (rend_num_services() > 0) {
+ rend_consider_services_upload(now);
+ rend_consider_descriptor_republication();
+ }
+
+ /* Run v3+ check. */
+ FOR_EACH_SERVICE_BEGIN(service) {
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ int for_next_period = 0;
+
+ /* If we were asked to re-examine the hash ring, and it changed, then
+ schedule an upload */
+ if (consider_republishing_hs_descriptors &&
+ service_desc_hsdirs_changed(service, desc)) {
+ service_desc_schedule_upload(desc, now, 0);
+ }
+
+ /* Can this descriptor be uploaded? */
+ if (!should_service_upload_descriptor(service, desc, now)) {
+ continue;
+ }
+
+ log_info(LD_REND, "Initiating upload for hidden service %s descriptor "
+ "for service %s with %u/%u introduction points%s.",
+ (desc == service->desc_current) ? "current" : "next",
+ safe_str_client(service->onion_address),
+ digest256map_size(desc->intro_points.map),
+ service->config.num_intro_points,
+ (desc->missing_intro_points) ? " (couldn't pick more)" : "");
+
+ /* At this point, we have to upload the descriptor so start by building
+ * the intro points descriptor section which we are now sure to be
+ * accurate because all circuits have been established. */
+ build_desc_intro_points(service, desc, now);
+
+ /* If the service is in the overlap period and this descriptor is the
+ * next one, it has to be uploaded for the next time period meaning
+ * we'll use the next node_t hsdir_index to pick the HSDirs. */
+ if (desc == service->desc_next) {
+ for_next_period = 1;
+ }
+ upload_descriptor_to_all(service, desc, for_next_period);
+ } FOR_EACH_DESCRIPTOR_END;
+ } FOR_EACH_SERVICE_END;
+
+ /* We are done considering whether to republish rend descriptors */
+ consider_republishing_hs_descriptors = 0;
+}
+
+/* Called when the introduction point circuit is done building and ready to be
+ * used. */
+static void
+service_intro_circ_has_opened(origin_circuit_t *circ)
+{
+ hs_service_t *service = NULL;
+ hs_service_intro_point_t *ip = NULL;
+ hs_service_descriptor_t *desc = NULL;
+
+ tor_assert(circ);
+
+ /* Let's do some basic sanity checking of the circ state */
+ if (BUG(!circ->cpath)) {
+ return;
+ }
+ if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO)) {
+ return;
+ }
+ if (BUG(!circ->hs_ident)) {
+ return;
+ }
+
+ /* Get the corresponding service and intro point. */
+ get_objects_from_ident(circ->hs_ident, &service, &ip, &desc);
+
+ if (service == NULL) {
+ log_warn(LD_REND, "Unknown service identity key %s on the introduction "
+ "circuit %u. Can't find onion service.",
+ safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
+ TO_CIRCUIT(circ)->n_circ_id);
+ goto err;
+ }
+ if (ip == NULL) {
+ log_warn(LD_REND, "Unknown introduction point auth key on circuit %u "
+ "for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto err;
+ }
+ /* We can't have an IP object without a descriptor. */
+ tor_assert(desc);
+
+ if (hs_circ_service_intro_has_opened(service, ip, desc, circ)) {
+ /* Getting here means that the circuit has been re-purposed because we
+ * have enough intro circuit opened. Remove the IP from the service. */
+ service_intro_point_remove(service, ip);
+ service_intro_point_free(ip);
+ }
+
+ goto done;
+
+ err:
+ /* Close circuit, we can't use it. */
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOSUCHSERVICE);
+ done:
+ return;
+}
+
+/* Called when a rendezvous circuit is done building and ready to be used. */
+static void
+service_rendezvous_circ_has_opened(origin_circuit_t *circ)
+{
+ hs_service_t *service = NULL;
+
+ tor_assert(circ);
+ tor_assert(circ->cpath);
+ /* Getting here means this is a v3 rendezvous circuit. */
+ tor_assert(circ->hs_ident);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
+
+ /* Declare the circuit dirty to avoid reuse, and for path-bias */
+ if (!TO_CIRCUIT(circ)->timestamp_dirty)
+ TO_CIRCUIT(circ)->timestamp_dirty = time(NULL);
+ pathbias_count_use_attempt(circ);
+
+ /* Get the corresponding service and intro point. */
+ get_objects_from_ident(circ->hs_ident, &service, NULL, NULL);
+ if (service == NULL) {
+ log_warn(LD_REND, "Unknown service identity key %s on the rendezvous "
+ "circuit %u with cookie %s. Can't find onion service.",
+ safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
+ TO_CIRCUIT(circ)->n_circ_id,
+ hex_str((const char *) circ->hs_ident->rendezvous_cookie,
+ REND_COOKIE_LEN));
+ goto err;
+ }
+
+ /* If the cell can't be sent, the circuit will be closed within this
+ * function. */
+ hs_circ_service_rp_has_opened(service, circ);
+ goto done;
+
+ err:
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NOSUCHSERVICE);
+ done:
+ return;
+}
+
+/* We've been expecting an INTRO_ESTABLISHED cell on this circuit and it just
+ * arrived. Handle the INTRO_ESTABLISHED cell arriving on the given
+ * introduction circuit. Return 0 on success else a negative value. */
+static int
+service_handle_intro_established(origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len)
+{
+ hs_service_t *service = NULL;
+ hs_service_intro_point_t *ip = NULL;
+
+ tor_assert(circ);
+ tor_assert(payload);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO);
+
+ /* We need the service and intro point for this cell. */
+ get_objects_from_ident(circ->hs_ident, &service, &ip, NULL);
+
+ /* Get service object from the circuit identifier. */
+ if (service == NULL) {
+ log_warn(LD_REND, "Unknown service identity key %s on the introduction "
+ "circuit %u. Can't find onion service.",
+ safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
+ TO_CIRCUIT(circ)->n_circ_id);
+ goto err;
+ }
+ if (ip == NULL) {
+ /* We don't recognize the key. */
+ log_warn(LD_REND, "Introduction circuit established without an intro "
+ "point object on circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto err;
+ }
+
+ /* Try to parse the payload into a cell making sure we do actually have a
+ * valid cell. On success, the ip object and circuit purpose is updated to
+ * reflect the fact that the introduction circuit is established. */
+ if (hs_circ_handle_intro_established(service, ip, circ, payload,
+ payload_len) < 0) {
+ goto err;
+ }
+
+ /* Flag that we have an established circuit for this intro point. This value
+ * is what indicates the upload scheduled event if we are ready to build the
+ * intro point into the descriptor and upload. */
+ ip->circuit_established = 1;
+
+ log_info(LD_REND, "Successfully received an INTRO_ESTABLISHED cell "
+ "on circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ return 0;
+
+ err:
+ return -1;
+}
+
+/* We just received an INTRODUCE2 cell on the established introduction circuit
+ * circ. Handle the cell and return 0 on success else a negative value. */
+static int
+service_handle_introduce2(origin_circuit_t *circ, const uint8_t *payload,
+ size_t payload_len)
+{
+ hs_service_t *service = NULL;
+ hs_service_intro_point_t *ip = NULL;
+ hs_service_descriptor_t *desc = NULL;
+
+ tor_assert(circ);
+ tor_assert(payload);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_INTRO);
+
+ /* We'll need every object associated with this circuit. */
+ get_objects_from_ident(circ->hs_ident, &service, &ip, &desc);
+
+ /* Get service object from the circuit identifier. */
+ if (service == NULL) {
+ log_warn(LD_BUG, "Unknown service identity key %s when handling "
+ "an INTRODUCE2 cell on circuit %u",
+ safe_str_client(ed25519_fmt(&circ->hs_ident->identity_pk)),
+ TO_CIRCUIT(circ)->n_circ_id);
+ goto err;
+ }
+ if (ip == NULL) {
+ /* We don't recognize the key. */
+ log_warn(LD_BUG, "Unknown introduction auth key when handling "
+ "an INTRODUCE2 cell on circuit %u for service %s",
+ TO_CIRCUIT(circ)->n_circ_id,
+ safe_str_client(service->onion_address));
+ goto err;
+ }
+ /* If we have an IP object, we MUST have a descriptor object. */
+ tor_assert(desc);
+
+ /* The following will parse, decode and launch the rendezvous point circuit.
+ * Both current and legacy cells are handled. */
+ if (hs_circ_handle_introduce2(service, circ, ip, desc->desc->subcredential,
+ payload, payload_len) < 0) {
+ goto err;
+ }
+
+ return 0;
+ err:
+ return -1;
+}
+
+/* For a given service and a descriptor of that service, consider retrying to
+ * upload the descriptor to any directories from which we had missing
+ * information when originally tried to be uploaded. This is called when our
+ * directory information has changed. */
+static void
+consider_hsdir_upload_retry(const hs_service_t *service,
+ hs_service_descriptor_t *desc)
+{
+ smartlist_t *responsible_dirs = NULL;
+ smartlist_t *still_missing_dirs = NULL;
+
+ tor_assert(service);
+ tor_assert(desc);
+
+ responsible_dirs = smartlist_new();
+ still_missing_dirs = smartlist_new();
+
+ /* We first need to get responsible directories from the latest consensus so
+ * we can then make sure that the node that we were missing information for
+ * is still responsible for this descriptor. */
+ hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num,
+ service->desc_next == desc, 0, responsible_dirs);
+
+ SMARTLIST_FOREACH_BEGIN(responsible_dirs, const routerstatus_t *, rs) {
+ const node_t *node;
+ const char *id = rs->identity_digest;
+ if (!smartlist_contains_digest(desc->hsdir_missing_info, id)) {
+ continue;
+ }
+ /* We do need a node_t object and descriptor to perform an upload. If
+ * found, we remove the id from the missing dir list else we add it to the
+ * still missing dir list to keep track of id that are still missing. */
+ node = node_get_by_id(id);
+ if (node && node_has_descriptor(node)) {
+ upload_descriptor_to_hsdir(service, desc, node);
+ smartlist_remove(desc->hsdir_missing_info, id);
+ } else {
+ smartlist_add(still_missing_dirs, tor_memdup(id, DIGEST_LEN));
+ }
+ } SMARTLIST_FOREACH_END(rs);
+
+ /* Switch the still missing dir list with the current missing dir list in
+ * the descriptor. It is possible that the list ends up empty which is what
+ * we want if we have no more missing dir. */
+ SMARTLIST_FOREACH(desc->hsdir_missing_info, char *, id, tor_free(id));
+ smartlist_free(desc->hsdir_missing_info);
+ desc->hsdir_missing_info = still_missing_dirs;
+
+ /* No ownership of the routerstatus_t object in this list. */
+ smartlist_free(responsible_dirs);
+}
+
+/* Add to list every filename used by service. This is used by the sandbox
+ * subsystem. */
+static void
+service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list)
+{
+ const char *s_dir;
+ char fname[128] = {0};
+
+ tor_assert(service);
+ tor_assert(list);
+
+ /* Ease our life. */
+ s_dir = service->config.directory_path;
+ /* The hostname file. */
+ smartlist_add(list, hs_path_from_filename(s_dir, fname_hostname));
+ /* The key files splitted in two. */
+ tor_snprintf(fname, sizeof(fname), "%s_secret_key", fname_keyfile_prefix);
+ smartlist_add(list, hs_path_from_filename(s_dir, fname));
+ tor_snprintf(fname, sizeof(fname), "%s_public_key", fname_keyfile_prefix);
+ smartlist_add(list, hs_path_from_filename(s_dir, fname));
+}
+
+/* ========== */
+/* Public API */
+/* ========== */
+
+/* We just received a new batch of descriptors which might affect the shape of
+ * the HSDir hash ring. Signal that we should reexamine the hash ring and
+ * re-upload our HS descriptors if needed. */
+void
+hs_hsdir_set_changed_consider_reupload(void)
+{
+ log_info(LD_REND, "New dirinfo arrived: consider reuploading descriptor");
+ consider_republishing_hs_descriptors = 1;
+}
+
+/* Return the number of service we have configured and usable. */
+unsigned int
+hs_service_get_num_services(void)
+{
+ if (hs_service_map == NULL) {
+ return 0;
+ }
+ return HT_SIZE(hs_service_map);
+}
+
+/* Called once an introduction circuit is closed. If the circuit doesn't have
+ * a v3 identifier, it is ignored. */
+void
+hs_service_intro_circ_has_closed(origin_circuit_t *circ)
+{
+ hs_service_t *service = NULL;
+ hs_service_intro_point_t *ip = NULL;
+ hs_service_descriptor_t *desc = NULL;
+
+ tor_assert(circ);
+
+ if (circ->hs_ident == NULL) {
+ /* This is not a v3 circuit, ignore. */
+ goto end;
+ }
+
+ get_objects_from_ident(circ->hs_ident, &service, &ip, &desc);
+ if (service == NULL) {
+ log_warn(LD_REND, "Unable to find any hidden service associated "
+ "identity key %s on intro circuit %u.",
+ ed25519_fmt(&circ->hs_ident->identity_pk),
+ TO_CIRCUIT(circ)->n_circ_id);
+ goto end;
+ }
+ if (ip == NULL) {
+ /* The introduction point object has already been removed probably by our
+ * cleanup process so ignore. */
+ goto end;
+ }
+ /* Can't have an intro point object without a descriptor. */
+ tor_assert(desc);
+
+ /* Circuit disappeared so make sure the intro point is updated. By
+ * keeping the object in the descriptor, we'll be able to retry. */
+ ip->circuit_established = 0;
+
+ /* We've retried too many times, remember it as a failed intro point so we
+ * don't pick it up again. It will be retried in INTRO_CIRC_RETRY_PERIOD
+ * seconds. */
+ if (ip->circuit_retries > MAX_INTRO_POINT_CIRCUIT_RETRIES) {
+ remember_failing_intro_point(ip, desc, approx_time());
+ service_intro_point_remove(service, ip);
+ service_intro_point_free(ip);
+ }
+
+ end:
+ return;
+}
+
+/* Given conn, a rendezvous edge connection acting as an exit stream, look up
+ * the hidden service for the circuit circ, and look up the port and address
+ * based on the connection port. Assign the actual connection address.
+ *
+ * Return 0 on success. Return -1 on failure and the caller should NOT close
+ * the circuit. Return -2 on failure and the caller MUST close the circuit for
+ * security reasons. */
+int
+hs_service_set_conn_addr_port(const origin_circuit_t *circ,
+ edge_connection_t *conn)
+{
+ hs_service_t *service = NULL;
+
+ tor_assert(circ);
+ tor_assert(conn);
+ tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_REND_JOINED);
+ tor_assert(circ->hs_ident);
+
+ get_objects_from_ident(circ->hs_ident, &service, NULL, NULL);
+
+ if (service == NULL) {
+ log_warn(LD_REND, "Unable to find any hidden service associated "
+ "identity key %s on rendezvous circuit %u.",
+ ed25519_fmt(&circ->hs_ident->identity_pk),
+ TO_CIRCUIT(circ)->n_circ_id);
+ /* We want the caller to close the circuit because it's not a valid
+ * service so no danger. Attempting to bruteforce the entire key space by
+ * opening circuits to learn which service is being hosted here is
+ * impractical. */
+ goto err_close;
+ }
+
+ /* Enforce the streams-per-circuit limit, and refuse to provide a mapping if
+ * this circuit will exceed the limit. */
+ if (service->config.max_streams_per_rdv_circuit > 0 &&
+ (circ->hs_ident->num_rdv_streams >=
+ service->config.max_streams_per_rdv_circuit)) {
+#define MAX_STREAM_WARN_INTERVAL 600
+ static struct ratelim_t stream_ratelim =
+ RATELIM_INIT(MAX_STREAM_WARN_INTERVAL);
+ log_fn_ratelim(&stream_ratelim, LOG_WARN, LD_REND,
+ "Maximum streams per circuit limit reached on "
+ "rendezvous circuit %u for service %s. Circuit has "
+ "%" PRIu64 " out of %" PRIu64 " streams. %s.",
+ TO_CIRCUIT(circ)->n_circ_id,
+ service->onion_address,
+ circ->hs_ident->num_rdv_streams,
+ service->config.max_streams_per_rdv_circuit,
+ service->config.max_streams_close_circuit ?
+ "Closing circuit" : "Ignoring open stream request");
+ if (service->config.max_streams_close_circuit) {
+ /* Service explicitly configured to close immediately. */
+ goto err_close;
+ }
+ /* Exceeding the limit makes tor silently ignore the stream creation
+ * request and keep the circuit open. */
+ goto err_no_close;
+ }
+
+ /* Find a virtual port of that service mathcing the one in the connection if
+ * succesful, set the address in the connection. */
+ if (hs_set_conn_addr_port(service->config.ports, conn) < 0) {
+ log_info(LD_REND, "No virtual port mapping exists for port %d for "
+ "hidden service %s.",
+ TO_CONN(conn)->port, service->onion_address);
+ if (service->config.allow_unknown_ports) {
+ /* Service explicitly allow connection to unknown ports so close right
+ * away because we do not care about port mapping. */
+ goto err_close;
+ }
+ /* If the service didn't explicitly allow it, we do NOT close the circuit
+ * here to raise the bar in terms of performance for port mapping. */
+ goto err_no_close;
+ }
+
+ /* Success. */
+ return 0;
+ err_close:
+ /* Indicate the caller that the circuit should be closed. */
+ return -2;
+ err_no_close:
+ /* Indicate the caller to NOT close the circuit. */
+ return -1;
+}
+
+/* Add to file_list every filename used by a configured hidden service, and to
+ * dir_list every directory path used by a configured hidden service. This is
+ * used by the sandbox subsystem to whitelist those. */
+void
+hs_service_lists_fnames_for_sandbox(smartlist_t *file_list,
+ smartlist_t *dir_list)
+{
+ tor_assert(file_list);
+ tor_assert(dir_list);
+
+ /* Add files and dirs for legacy services. */
+ rend_services_add_filenames_to_lists(file_list, dir_list);
+
+ /* Add files and dirs for v3+. */
+ FOR_EACH_SERVICE_BEGIN(service) {
+ /* Skip ephemeral service, they don't touch the disk. */
+ if (service->config.is_ephemeral) {
+ continue;
+ }
+ service_add_fnames_to_list(service, file_list);
+ smartlist_add_strdup(dir_list, service->config.directory_path);
+ } FOR_EACH_DESCRIPTOR_END;
+}
+
+/* Called when our internal view of the directory has changed. We might have
+ * new descriptors for hidden service directories that we didn't have before
+ * so try them if it's the case. */
+void
+hs_service_dir_info_changed(void)
+{
+ /* For each service we have, check every descriptor and consider retrying to
+ * upload it to directories that we might have had missing information
+ * previously that is missing a router descriptor. */
+ FOR_EACH_SERVICE_BEGIN(service) {
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ /* This cleans up the descriptor missing hsdir information list if a
+ * successful upload is made or if any of the directory aren't
+ * responsible anymore for the service descriptor. */
+ consider_hsdir_upload_retry(service, desc);
+ } FOR_EACH_DESCRIPTOR_END;
+ } FOR_EACH_SERVICE_END;
+}
+
+/* Called when we get an INTRODUCE2 cell on the circ. Respond to the cell and
+ * launch a circuit to the rendezvous point. */
+int
+hs_service_receive_introduce2(origin_circuit_t *circ, const uint8_t *payload,
+ size_t payload_len)
+{
+ int ret = -1;
+
+ tor_assert(circ);
+ tor_assert(payload);
+
+ /* Do some initial validation and logging before we parse the cell */
+ if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_INTRO) {
+ log_warn(LD_PROTOCOL, "Received an INTRODUCE2 cell on a "
+ "non introduction circuit of purpose %d",
+ TO_CIRCUIT(circ)->purpose);
+ goto done;
+ }
+
+ if (circ->hs_ident) {
+ ret = service_handle_introduce2(circ, payload, payload_len);
+ } else {
+ ret = rend_service_receive_introduction(circ, payload, payload_len);
+ }
+
+ done:
+ return ret;
+}
+
+/* Called when we get an INTRO_ESTABLISHED cell. Mark the circuit as an
+ * established introduction point. Return 0 on success else a negative value
+ * and the circuit is closed. */
+int
+hs_service_receive_intro_established(origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len)
+{
+ int ret = -1;
+
+ tor_assert(circ);
+ tor_assert(payload);
+
+ if (TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) {
+ log_warn(LD_PROTOCOL, "Received an INTRO_ESTABLISHED cell on a "
+ "non introduction circuit of purpose %d",
+ TO_CIRCUIT(circ)->purpose);
+ goto err;
+ }
+
+ /* Handle both version. v2 uses rend_data and v3 uses the hs circuit
+ * identifier hs_ident. Can't be both. */
+ if (circ->hs_ident) {
+ ret = service_handle_intro_established(circ, payload, payload_len);
+ } else {
+ ret = rend_service_intro_established(circ, payload, payload_len);
+ }
+
+ if (ret < 0) {
+ goto err;
+ }
+ return 0;
+ err:
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
+ return -1;
+}
+
+/* Called when any kind of hidden service circuit is done building thus
+ * opened. This is the entry point from the circuit subsystem. */
+void
+hs_service_circuit_has_opened(origin_circuit_t *circ)
+{
+ tor_assert(circ);
+
+ /* Handle both version. v2 uses rend_data and v3 uses the hs circuit
+ * identifier hs_ident. Can't be both. */
+ switch (TO_CIRCUIT(circ)->purpose) {
+ case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
+ if (circ->hs_ident) {
+ service_intro_circ_has_opened(circ);
+ } else {
+ rend_service_intro_has_opened(circ);
+ }
+ break;
+ case CIRCUIT_PURPOSE_S_CONNECT_REND:
+ if (circ->hs_ident) {
+ service_rendezvous_circ_has_opened(circ);
+ } else {
+ rend_service_rendezvous_has_opened(circ);
+ }
+ break;
+ default:
+ tor_assert(0);
+ }
+}
+
+/* Load and/or generate keys for all onion services including the client
+ * authorization if any. Return 0 on success, -1 on failure. */
+int
+hs_service_load_all_keys(void)
+{
+ /* Load v2 service keys if we have v2. */
+ if (rend_num_services() != 0) {
+ if (rend_service_load_all_keys(NULL) < 0) {
+ goto err;
+ }
+ }
+
+ /* Load or/and generate them for v3+. */
+ SMARTLIST_FOREACH_BEGIN(hs_service_staging_list, hs_service_t *, service) {
+ /* Ignore ephemeral service, they already have their keys set. */
+ if (service->config.is_ephemeral) {
+ continue;
+ }
+ log_info(LD_REND, "Loading v3 onion service keys from %s",
+ service_escaped_dir(service));
+ if (load_service_keys(service) < 0) {
+ goto err;
+ }
+ /* XXX: Load/Generate client authorization keys. (#20700) */
+ } SMARTLIST_FOREACH_END(service);
+
+ /* Final step, the staging list contains service in a quiescent state that
+ * is ready to be used. Register them to the global map. Once this is over,
+ * the staging list will be cleaned up. */
+ register_all_services();
+
+ /* All keys have been loaded successfully. */
+ return 0;
+ err:
+ return -1;
+}
+
+/* Put all service object in the given service list. After this, the caller
+ * looses ownership of every elements in the list and responsible to free the
+ * list pointer. */
+void
+hs_service_stage_services(const smartlist_t *service_list)
+{
+ tor_assert(service_list);
+ /* This list is freed at registration time but this function can be called
+ * multiple time. */
+ if (hs_service_staging_list == NULL) {
+ hs_service_staging_list = smartlist_new();
+ }
+ /* Add all service object to our staging list. Caller is responsible for
+ * freeing the service_list. */
+ smartlist_add_all(hs_service_staging_list, service_list);
+}
+
+/* Allocate and initilize a service object. The service configuration will
+ * contain the default values. Return the newly allocated object pointer. This
+ * function can't fail. */
+hs_service_t *
+hs_service_new(const or_options_t *options)
+{
+ hs_service_t *service = tor_malloc_zero(sizeof(hs_service_t));
+ /* Set default configuration value. */
+ set_service_default_config(&service->config, options);
+ /* Set the default service version. */
+ service->config.version = HS_SERVICE_DEFAULT_VERSION;
+ /* Allocate the CLIENT_PK replay cache in service state. */
+ service->state.replay_cache_rend_cookie =
+ replaycache_new(REND_REPLAY_TIME_INTERVAL, REND_REPLAY_TIME_INTERVAL);
+ return service;
+}
+
+/* Free the given <b>service</b> object and all its content. This function
+ * also takes care of wiping service keys from memory. It is safe to pass a
+ * NULL pointer. */
+void
+hs_service_free(hs_service_t *service)
+{
+ if (service == NULL) {
+ return;
+ }
+
+ /* Free descriptors. Go over both descriptor with this loop. */
+ FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
+ service_descriptor_free(desc);
+ } FOR_EACH_DESCRIPTOR_END;
+
+ /* Free service configuration. */
+ service_clear_config(&service->config);
+
+ /* Free replay cache from state. */
+ if (service->state.replay_cache_rend_cookie) {
+ replaycache_free(service->state.replay_cache_rend_cookie);
+ }
+
+ /* Wipe service keys. */
+ memwipe(&service->keys.identity_sk, 0, sizeof(service->keys.identity_sk));
+
+ tor_free(service);
+}
+
+/* Periodic callback. Entry point from the main loop to the HS service
+ * subsystem. This is call every second. This is skipped if tor can't build a
+ * circuit or the network is disabled. */
+void
+hs_service_run_scheduled_events(time_t now)
+{
+ /* First thing we'll do here is to make sure our services are in a
+ * quiescent state for the scheduled events. */
+ run_housekeeping_event(now);
+
+ /* Order matters here. We first make sure the descriptor object for each
+ * service contains the latest data. Once done, we check if we need to open
+ * new introduction circuit. Finally, we try to upload the descriptor for
+ * each service. */
+
+ /* Make sure descriptors are up to date. */
+ run_build_descriptor_event(now);
+ /* Make sure services have enough circuits. */
+ run_build_circuit_event(now);
+ /* Upload the descriptors if needed/possible. */
+ run_upload_descriptor_event(now);
+}
+
+/* Initialize the service HS subsystem. */
+void
+hs_service_init(void)
+{
+ /* Should never be called twice. */
+ tor_assert(!hs_service_map);
+ tor_assert(!hs_service_staging_list);
+
+ /* v2 specific. */
+ rend_service_init();
+
+ hs_service_map = tor_malloc_zero(sizeof(struct hs_service_ht));
+ HT_INIT(hs_service_ht, hs_service_map);
+
+ hs_service_staging_list = smartlist_new();
+}
+
+/* Release all global storage of the hidden service subsystem. */
+void
+hs_service_free_all(void)
+{
+ rend_service_free_all();
+ service_free_all();
+}
+
+#ifdef TOR_UNIT_TESTS
+
+/* Return the global service map size. Only used by unit test. */
+STATIC unsigned int
+get_hs_service_map_size(void)
+{
+ return HT_SIZE(hs_service_map);
+}
+
+/* Return the staging list size. Only used by unit test. */
+STATIC int
+get_hs_service_staging_list_size(void)
+{
+ return smartlist_len(hs_service_staging_list);
+}
+
+STATIC hs_service_ht *
+get_hs_service_map(void)
+{
+ return hs_service_map;
+}
+
+STATIC hs_service_t *
+get_first_service(void)
+{
+ hs_service_t **obj = HT_START(hs_service_ht, hs_service_map);
+ if (obj == NULL) {
+ return NULL;
+ }
+ return *obj;
+}
+
+#endif /* TOR_UNIT_TESTS */
+
diff --git a/src/or/hs_service.h b/src/or/hs_service.h
index 3302592762..57717fc927 100644
--- a/src/or/hs_service.h
+++ b/src/or/hs_service.h
@@ -3,25 +3,362 @@
/**
* \file hs_service.h
- * \brief Header file for hs_service.c.
+ * \brief Header file containing service data for the HS subsytem.
**/
#ifndef TOR_HS_SERVICE_H
#define TOR_HS_SERVICE_H
-#include "or.h"
+#include "crypto_curve25519.h"
+#include "crypto_ed25519.h"
+#include "replaycache.h"
+
+#include "hs_common.h"
+#include "hs_descriptor.h"
+#include "hs_ident.h"
+#include "hs_intropoint.h"
+
+/* Trunnel */
#include "hs/cell_establish_intro.h"
-/* 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. */
+/* When loading and configuring a service, this is the default version it will
+ * be configured for as it is possible that no HiddenServiceVersion is
+ * present. */
+#define HS_SERVICE_DEFAULT_VERSION HS_VERSION_TWO
+
+/* As described in the specification, service publishes their next descriptor
+ * at a random time between those two values (in seconds). */
+#define HS_SERVICE_NEXT_UPLOAD_TIME_MIN (60 * 60)
+#define HS_SERVICE_NEXT_UPLOAD_TIME_MAX (120 * 60)
+
+/* Service side introduction point. */
+typedef struct hs_service_intro_point_t {
+ /* Top level intropoint "shared" data between client/service. */
+ hs_intropoint_t base;
+
+ /* Onion key of the introduction point used to extend to it for the ntor
+ * handshake. */
+ curve25519_public_key_t onion_key;
+
+ /* Authentication keypair used to create the authentication certificate
+ * which is published in the descriptor. */
+ ed25519_keypair_t auth_key_kp;
+
+ /* Encryption keypair for the "ntor" type. */
+ curve25519_keypair_t enc_key_kp;
+
+ /* Legacy key if that intro point doesn't support v3. This should be used if
+ * the base object legacy flag is set. */
+ crypto_pk_t *legacy_key;
+
+ /* Amount of INTRODUCE2 cell accepted from this intro point. */
+ uint64_t introduce2_count;
+
+ /* Maximum number of INTRODUCE2 cell this intro point should accept. */
+ uint64_t introduce2_max;
+
+ /* The time at which this intro point should expire and stop being used. */
+ time_t time_to_expire;
+
+ /* The amount of circuit creation we've made to this intro point. This is
+ * incremented every time we do a circuit relaunch on this intro point which
+ * is triggered when the circuit dies but the node is still in the
+ * consensus. After MAX_INTRO_POINT_CIRCUIT_RETRIES, we give up on it. */
+ uint32_t circuit_retries;
+
+ /* Set if this intro point has an established circuit. */
+ unsigned int circuit_established : 1;
+
+ /* Replay cache recording the encrypted part of an INTRODUCE2 cell that the
+ * circuit associated with this intro point has received. This is used to
+ * prevent replay attacks. */
+ replaycache_t *replay_cache;
+} hs_service_intro_point_t;
+
+/* Object handling introduction points of a service. */
+typedef struct hs_service_intropoints_t {
+ /* The time at which we've started our retry period to build circuits. We
+ * don't want to stress circuit creation so we can only retry for a certain
+ * time and then after we stop and wait. */
+ time_t retry_period_started;
+
+ /* Number of circuit we've launched during a single retry period. */
+ unsigned int num_circuits_launched;
+
+ /* Contains the current hs_service_intro_point_t objects indexed by
+ * authentication public key. */
+ digest256map_t *map;
+
+ /* Contains node's identity key digest that were introduction point for this
+ * descriptor but were retried to many times. We keep those so we avoid
+ * re-picking them over and over for a circuit retry period.
+ * XXX: Once we have #22173, change this to only use ed25519 identity. */
+ digestmap_t *failed_id;
+} hs_service_intropoints_t;
+
+/* Representation of a service descriptor. */
+typedef struct hs_service_descriptor_t {
+ /* Decoded descriptor. This object is used for encoding when the service
+ * publishes the descriptor. */
+ hs_descriptor_t *desc;
+
+ /* Descriptor signing keypair. */
+ ed25519_keypair_t signing_kp;
+
+ /* Blinded keypair derived from the master identity public key. */
+ ed25519_keypair_t blinded_kp;
+
+ /* When is the next time when we should upload the descriptor. */
+ time_t next_upload_time;
+
+ /* Introduction points assign to this descriptor which contains
+ * hs_service_intropoints_t object indexed by authentication key (the RSA
+ * key if the node is legacy). */
+ hs_service_intropoints_t intro_points;
+
+ /* The time period number this descriptor has been created for. */
+ uint64_t time_period_num;
+
+ /* True iff we have missing intro points for this descriptor because we
+ * couldn't pick any nodes. */
+ unsigned int missing_intro_points : 1;
+
+ /* List of identity digests for hidden service directories to which we
+ * couldn't upload this descriptor because we didn't have its router
+ * descriptor at the time. If this list is non-empty, only the relays in this
+ * list are re-tried to upload this descriptor when our directory information
+ * have been updated. */
+ smartlist_t *hsdir_missing_info;
+
+ /** List of the responsible HSDirs (their b64ed identity digest) last time we
+ * uploaded this descriptor. If the set of responsible HSDirs is different
+ * from this list, this means we received new dirinfo and we need to
+ * reupload our descriptor. This list is always sorted lexicographically. */
+ smartlist_t *previous_hsdirs;
+} hs_service_descriptor_t;
+
+/* Service key material. */
+typedef struct hs_service_keys_t {
+ /* Master identify public key. */
+ ed25519_public_key_t identity_pk;
+ /* Master identity private key. */
+ ed25519_secret_key_t identity_sk;
+ /* True iff the key is kept offline which means the identity_sk MUST not be
+ * used in that case. */
+ unsigned int is_identify_key_offline : 1;
+} hs_service_keys_t;
+
+/* Service configuration. The following are set from the torrc options either
+ * set by the configuration file or by the control port. Nothing else should
+ * change those values. */
+typedef struct hs_service_config_t {
+ /* Protocol version of the service. Specified by HiddenServiceVersion
+ * option. */
+ uint32_t version;
+
+ /* List of rend_service_port_config_t */
+ smartlist_t *ports;
+
+ /* Path on the filesystem where the service persistent data is stored. NULL
+ * if the service is ephemeral. Specified by HiddenServiceDir option. */
+ char *directory_path;
+
+ /* The maximum number of simultaneous streams per rendezvous circuit that
+ * are allowed to be created. No limit if 0. Specified by
+ * HiddenServiceMaxStreams option. */
+ uint64_t max_streams_per_rdv_circuit;
+
+ /* If true, we close circuits that exceed the max_streams_per_rdv_circuit
+ * limit. Specified by HiddenServiceMaxStreamsCloseCircuit option. */
+ unsigned int max_streams_close_circuit : 1;
+
+ /* How many introduction points this service has. Specified by
+ * HiddenServiceNumIntroductionPoints option. */
+ unsigned int num_intro_points;
+
+ /* True iff we allow request made on unknown ports. Specified by
+ * HiddenServiceAllowUnknownPorts option. */
+ unsigned int allow_unknown_ports : 1;
+
+ /* If true, this service is a Single Onion Service. Specified by
+ * HiddenServiceSingleHopMode and HiddenServiceNonAnonymousMode options. */
+ unsigned int is_single_onion : 1;
+
+ /* If true, allow group read permissions on the directory_path. Specified by
+ * HiddenServiceDirGroupReadable option. */
+ unsigned int dir_group_readable : 1;
+
+ /* Is this service ephemeral? */
+ unsigned int is_ephemeral : 1;
+} hs_service_config_t;
+
+/* Service state. */
+typedef struct hs_service_state_t {
+ /* The time at which we've started our retry period to build circuits. We
+ * don't want to stress circuit creation so we can only retry for a certain
+ * time and then after we stop and wait. */
+ time_t intro_circ_retry_started_time;
+
+ /* Number of circuit we've launched during a single retry period. This
+ * should never go over MAX_INTRO_CIRCS_PER_PERIOD. */
+ unsigned int num_intro_circ_launched;
+
+ /* Indicate that the service has entered the overlap period. We use this
+ * flag to check for descriptor rotation. */
+ unsigned int in_overlap_period : 1;
+
+ /* Replay cache tracking the REND_COOKIE found in INTRODUCE2 cell to detect
+ * repeats. Clients may send INTRODUCE1 cells for the same rendezvous point
+ * through two or more different introduction points; when they do, this
+ * keeps us from launching multiple simultaneous attempts to connect to the
+ * same rend point. */
+ replaycache_t *replay_cache_rend_cookie;
+} hs_service_state_t;
+
+/* Representation of a service running on this tor instance. */
+typedef struct hs_service_t {
+ /* Onion address base32 encoded and NUL terminated. We keep it for logging
+ * purposes so we don't have to build it everytime. */
+ char onion_address[HS_SERVICE_ADDR_LEN_BASE32 + 1];
+
+ /* Hashtable node: use to look up the service by its master public identity
+ * key in the service global map. */
+ HT_ENTRY(hs_service_t) hs_service_node;
+
+ /* Service state which contains various flags and counters. */
+ hs_service_state_t state;
+
+ /* Key material of the service. */
+ hs_service_keys_t keys;
+
+ /* Configuration of the service. */
+ hs_service_config_t config;
+
+ /* Current descriptor. */
+ hs_service_descriptor_t *desc_current;
+ /* Next descriptor that we need for the overlap period for which we have to
+ * keep two sets of opened introduction point circuits. */
+ hs_service_descriptor_t *desc_next;
+
+ /* XXX: Credential (client auth.) #20700. */
+
+} hs_service_t;
+
+/* For the service global hash map, we define a specific type for it which
+ * will make it safe to use and specific to some controlled parameters such as
+ * the hashing function and how to compare services. */
+typedef HT_HEAD(hs_service_ht, hs_service_t) hs_service_ht;
+
+/* API */
+
+/* Global initializer and cleanup function. */
+void hs_service_init(void);
+void hs_service_free_all(void);
+
+/* Service new/free functions. */
+hs_service_t *hs_service_new(const or_options_t *options);
+void hs_service_free(hs_service_t *service);
+
+unsigned int hs_service_get_num_services(void);
+void hs_service_stage_services(const smartlist_t *service_list);
+int hs_service_load_all_keys(void);
+void hs_service_lists_fnames_for_sandbox(smartlist_t *file_list,
+ smartlist_t *dir_list);
+int hs_service_set_conn_addr_port(const origin_circuit_t *circ,
+ edge_connection_t *conn);
+void hs_hsdir_set_changed_consider_reupload(void);
+
+void hs_service_dir_info_changed(void);
+void hs_service_run_scheduled_events(time_t now);
+void hs_service_circuit_has_opened(origin_circuit_t *circ);
+int hs_service_receive_intro_established(origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len);
+int hs_service_receive_introduce2(origin_circuit_t *circ,
+ const uint8_t *payload,
+ size_t payload_len);
+
+void hs_service_intro_circ_has_closed(origin_circuit_t *circ);
+
+#ifdef HS_SERVICE_PRIVATE
+
+#ifdef TOR_UNIT_TESTS
+
+/* Useful getters for unit tests. */
+STATIC unsigned int get_hs_service_map_size(void);
+STATIC int get_hs_service_staging_list_size(void);
+STATIC hs_service_ht *get_hs_service_map(void);
+STATIC hs_service_t *get_first_service(void);
+
+/* Service accessors. */
+STATIC hs_service_t *find_service(hs_service_ht *map,
+ const ed25519_public_key_t *pk);
+STATIC void remove_service(hs_service_ht *map, hs_service_t *service);
+STATIC int register_service(hs_service_ht *map, hs_service_t *service);
+/* Service introduction point functions. */
+STATIC hs_service_intro_point_t *service_intro_point_new(
+ const extend_info_t *ei,
+ unsigned int is_legacy);
+STATIC void service_intro_point_free(hs_service_intro_point_t *ip);
+STATIC void service_intro_point_add(digest256map_t *map,
+ hs_service_intro_point_t *ip);
+STATIC void service_intro_point_remove(const hs_service_t *service,
+ const hs_service_intro_point_t *ip);
+STATIC hs_service_intro_point_t *service_intro_point_find(
+ const hs_service_t *service,
+ const ed25519_public_key_t *auth_key);
+STATIC hs_service_intro_point_t *service_intro_point_find_by_ident(
+ const hs_service_t *service,
+ const hs_ident_circuit_t *ident);
+/* Service descriptor functions. */
+STATIC hs_service_descriptor_t *service_descriptor_new(void);
+STATIC hs_service_descriptor_t *service_desc_find_by_intro(
+ const hs_service_t *service,
+ const hs_service_intro_point_t *ip);
+/* Helper functions. */
+STATIC void get_objects_from_ident(const hs_ident_circuit_t *ident,
+ hs_service_t **service,
+ hs_service_intro_point_t **ip,
+ hs_service_descriptor_t **desc);
+STATIC const node_t *
+get_node_from_intro_point(const hs_service_intro_point_t *ip);
+STATIC int can_service_launch_intro_circuit(hs_service_t *service,
+ time_t now);
+STATIC int intro_point_should_expire(const hs_service_intro_point_t *ip,
+ time_t now);
+STATIC void run_housekeeping_event(time_t now);
+STATIC void rotate_all_descriptors(time_t now);
+STATIC void build_all_descriptors(time_t now);
+STATIC void update_all_descriptors(time_t now);
+STATIC void run_upload_descriptor_event(time_t now);
+
+STATIC char *
+encode_desc_rev_counter_for_state(const hs_service_descriptor_t *desc);
+
+STATIC void service_descriptor_free(hs_service_descriptor_t *desc);
+
+STATIC uint64_t
+check_state_line_for_service_rev_counter(const char *state_line,
+ const ed25519_public_key_t *blinded_pubkey,
+ int *service_found_out);
+
+STATIC int
+write_address_to_file(const hs_service_t *service, const char *fname_);
+
+STATIC void upload_descriptor_to_all(const hs_service_t *service,
+ hs_service_descriptor_t *desc,
+ int for_next_period);
+
+STATIC void service_desc_schedule_upload(hs_service_descriptor_t *desc,
+ time_t now,
+ int descriptor_changed);
+
+STATIC int service_desc_hsdirs_changed(const hs_service_t *service,
+ const hs_service_descriptor_t *desc);
+
+#endif /* TOR_UNIT_TESTS */
-trn_cell_establish_intro_t *
-generate_establish_intro_cell(const uint8_t *circuit_key_material,
- size_t circuit_key_material_len);
-ssize_t
-get_establish_intro_payload(uint8_t *buf, size_t buf_len,
- const trn_cell_establish_intro_t *cell);
+#endif /* HS_SERVICE_PRIVATE */
#endif /* TOR_HS_SERVICE_H */
diff --git a/src/or/include.am b/src/or/include.am
index 1ef5afa013..69b505fcd4 100644
--- a/src/or/include.am
+++ b/src/or/include.am
@@ -50,16 +50,21 @@ LIBTOR_A_SOURCES = \
src/or/dnsserv.c \
src/or/fp_pair.c \
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 \
src/or/hibernate.c \
src/or/hs_cache.c \
+ src/or/hs_cell.c \
+ src/or/hs_circuit.c \
+ src/or/hs_circuitmap.c \
+ src/or/hs_client.c \
src/or/hs_common.c \
+ src/or/hs_config.c \
src/or/hs_descriptor.c \
+ src/or/hs_ident.c \
+ src/or/hs_intropoint.c \
+ src/or/hs_ntor.c \
+ src/or/hs_service.c \
src/or/keypin.c \
src/or/main.c \
src/or/microdesc.c \
@@ -122,10 +127,11 @@ 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 \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \
- @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ \
- $(rust_ldadd)
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \
+ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \
+ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
if COVERAGE_ENABLED
src_or_tor_cov_SOURCES = src/or/tor_main.c
@@ -180,12 +186,17 @@ ORHEADERS = \
src/or/entrynodes.h \
src/or/hibernate.h \
src/or/hs_cache.h \
+ src/or/hs_cell.h \
+ src/or/hs_config.h \
+ src/or/hs_circuit.h \
+ src/or/hs_circuitmap.h \
+ src/or/hs_client.h \
src/or/hs_common.h \
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/hs_ident.h \
+ src/or/hs_intropoint.h \
+ src/or/hs_ntor.h \
+ src/or/hs_service.h \
src/or/keypin.h \
src/or/main.h \
src/or/microdesc.h \
diff --git a/src/or/main.c b/src/or/main.c
index cb24fd18c8..5d51d1dead 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -1194,6 +1194,7 @@ CALLBACK(heartbeat);
CALLBACK(clean_consdiffmgr);
CALLBACK(reset_padding_counts);
CALLBACK(check_canonical_channels);
+CALLBACK(hs_service);
#undef CALLBACK
@@ -1229,6 +1230,7 @@ static periodic_event_item_t periodic_events[] = {
CALLBACK(clean_consdiffmgr),
CALLBACK(reset_padding_counts),
CALLBACK(check_canonical_channels),
+ CALLBACK(hs_service),
END_OF_PERIODIC_EVENTS
};
#undef CALLBACK
@@ -1461,12 +1463,6 @@ run_scheduled_events(time_t now)
/* 6. And remove any marked circuits... */
circuit_close_all_marked();
- /* 7. And upload service descriptors if necessary. */
- if (have_completed_a_circuit() && !net_is_disabled()) {
- rend_consider_services_upload(now);
- rend_consider_descriptor_republication();
- }
-
/* 8. and blow away any connections that need to die. have to do this now,
* because if we marked a conn for close and left its socket -1, then
* we'll pass it to poll/select and bad things will happen.
@@ -1713,7 +1709,7 @@ check_expired_networkstatus_callback(time_t now, const or_options_t *options)
* networkstatus_get_reasonably_live_consensus(), but that value is way
* way too high. Arma: is the bridge issue there resolved yet? -NM */
#define NS_EXPIRY_SLOP (24*60*60)
- if (ns && ns->valid_until < now+NS_EXPIRY_SLOP &&
+ if (ns && ns->valid_until < (now - NS_EXPIRY_SLOP) &&
router_have_minimum_dir_info()) {
router_dir_info_changed();
}
@@ -1831,8 +1827,8 @@ clean_caches_callback(time_t now, const or_options_t *options)
{
/* Remove old information from rephist and the rend cache. */
rep_history_clean(now - options->RephistTrackTime);
- rend_cache_clean(now, REND_CACHE_TYPE_CLIENT);
rend_cache_clean(now, REND_CACHE_TYPE_SERVICE);
+ hs_cache_clean_as_client(now);
hs_cache_clean_as_dir(now);
microdesc_cache_rebuild(NULL, 0);
#define CLEAN_CACHES_INTERVAL (30*60)
@@ -1851,6 +1847,7 @@ rend_cache_failure_clean_callback(time_t now, const or_options_t *options)
* clean it as soon as we can since we want to make sure the client waits
* as little as possible for reachability reasons. */
rend_cache_failure_clean(now);
+ hs_cache_client_intro_state_clean(now);
return 30;
}
@@ -2040,7 +2037,8 @@ check_fw_helper_app_callback(time_t now, const or_options_t *options)
{
if (net_is_disabled() ||
! server_mode(options) ||
- ! options->PortForwarding) {
+ ! options->PortForwarding ||
+ options->NoExec) {
return PERIODIC_EVENT_NO_UPDATE;
}
/* 11. check the port forwarding app */
@@ -2060,6 +2058,9 @@ check_fw_helper_app_callback(time_t now, const or_options_t *options)
/**
* Periodic callback: write the heartbeat message in the logs.
+ *
+ * If writing the heartbeat message to the logs fails for some reason, retry
+ * again after <b>MIN_HEARTBEAT_PERIOD</b> seconds.
*/
static int
heartbeat_callback(time_t now, const or_options_t *options)
@@ -2071,14 +2072,20 @@ heartbeat_callback(time_t now, const or_options_t *options)
return PERIODIC_EVENT_NO_UPDATE;
}
- /* Write the heartbeat message */
+ /* Skip the first one. */
if (first) {
- first = 0; /* Skip the first one. */
- } else {
- log_heartbeat(now);
+ first = 0;
+ return options->HeartbeatPeriod;
}
- return options->HeartbeatPeriod;
+ /* Write the heartbeat message */
+ if (log_heartbeat(now) == 0) {
+ return options->HeartbeatPeriod;
+ } else {
+ /* If we couldn't write the heartbeat log message, try again in the minimum
+ * interval of time. */
+ return MIN_HEARTBEAT_PERIOD;
+ }
}
#define CDM_CLEAN_CALLBACK_INTERVAL 600
@@ -2092,6 +2099,28 @@ clean_consdiffmgr_callback(time_t now, const or_options_t *options)
return CDM_CLEAN_CALLBACK_INTERVAL;
}
+/*
+ * Periodic callback: Run scheduled events for HS service. This is called
+ * every second.
+ */
+static int
+hs_service_callback(time_t now, const or_options_t *options)
+{
+ (void) options;
+
+ /* We need to at least be able to build circuits and that we actually have
+ * a working network. */
+ if (!have_completed_a_circuit() || net_is_disabled()) {
+ goto end;
+ }
+
+ hs_service_run_scheduled_events(now);
+
+ end:
+ /* Every 1 second. */
+ return 1;
+}
+
/** 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. */
@@ -2355,7 +2384,7 @@ do_hup(void)
tor_free(msg);
}
}
- if (authdir_mode_handles_descs(options, -1)) {
+ if (authdir_mode(options)) {
/* reload the approved-routers file */
if (dirserv_load_fingerprint_file() < 0) {
/* warnings are logged from dirserv_load_fingerprint_file() directly */
@@ -2499,9 +2528,6 @@ do_main_loop(void)
}
}
- /* Initialize relay-side HS circuitmap */
- hs_circuitmap_init();
-
/* set up once-a-second callback. */
if (! second_timer) {
struct timeval one_second;
@@ -2877,7 +2903,6 @@ dumpstats(int severity)
rep_hist_dump_stats(now,severity);
rend_service_dump_stats(severity);
- dump_pk_ops(severity);
dump_distinct_digest_count(severity);
}
@@ -3014,9 +3039,10 @@ tor_init(int argc, char *argv[])
rep_hist_init();
/* Initialize the service cache. */
rend_cache_init();
- hs_cache_init();
addressmap_init(); /* Init the client dns cache. Do it always, since it's
* cheap. */
+ /* Initialize the HS subsystem. */
+ hs_init();
{
/* We search for the "quiet" option first, since it decides whether we
@@ -3216,10 +3242,8 @@ tor_free_all(int postfork)
networkstatus_free_all();
addressmap_free_all();
dirserv_free_all();
- rend_service_free_all();
rend_cache_free_all();
rend_service_authorization_free_all();
- hs_cache_free_all();
rep_hist_free_all();
dns_free_all();
clear_pending_onions();
@@ -3232,7 +3256,6 @@ tor_free_all(int postfork)
connection_edge_free_all();
scheduler_free_all();
nodelist_free_all();
- hs_circuitmap_free_all();
microdesc_free_all();
routerparse_free_all();
ext_orport_free_all();
@@ -3241,6 +3264,7 @@ tor_free_all(int postfork)
protover_free_all();
bridges_free_all();
consdiffmgr_free_all();
+ hs_free_all();
if (!postfork) {
config_free_all();
or_state_free_all();
@@ -3478,7 +3502,7 @@ sandbox_init_filter(void)
if (options->BridgeAuthoritativeDir)
OPEN_DATADIR_SUFFIX("networkstatus-bridges", ".tmp");
- if (authdir_mode_handles_descs(options, -1))
+ if (authdir_mode(options))
OPEN_DATADIR("approved-routers");
if (options->ServerDNSResolvConfFile)
@@ -3550,7 +3574,7 @@ sandbox_init_filter(void)
{
smartlist_t *files = smartlist_new();
smartlist_t *dirs = smartlist_new();
- rend_services_add_filenames_to_lists(files, dirs);
+ hs_service_lists_fnames_for_sandbox(files, dirs);
SMARTLIST_FOREACH(files, char *, file_name, {
char *tmp_name = NULL;
tor_asprintf(&tmp_name, "%s.tmp", file_name);
@@ -3754,6 +3778,11 @@ tor_main(int argc, char *argv[])
case CMD_KEYGEN:
result = load_ed_keys(get_options(), time(NULL)) < 0;
break;
+ case CMD_KEY_EXPIRATION:
+ init_keys();
+ result = log_cert_expiration();
+ result = 0;
+ break;
case CMD_LIST_FINGERPRINT:
result = do_list_fingerprint();
break;
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index a4e6b409c4..18a6fbded7 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -876,7 +876,7 @@ update_microdesc_downloads(time_t now)
smartlist_free(missing);
}
-/** For every microdescriptor listed in the current microdecriptor consensus,
+/** For every microdescriptor listed in the current microdescriptor consensus,
* update its last_listed field to be at least as recent as the publication
* time of the current microdescriptor consensus.
*/
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index 25d79139b9..69bff55cff 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -76,7 +76,7 @@ static strmap_t *unnamed_server_map = NULL;
* status. */
STATIC networkstatus_t *current_ns_consensus = NULL;
-/** Most recently received and validated v3 "microdec"-flavored consensus
+/** Most recently received and validated v3 "microdesc"-flavored consensus
* network status. */
STATIC networkstatus_t *current_md_consensus = NULL;
@@ -1393,14 +1393,21 @@ networkstatus_get_latest_consensus_by_flavor,(consensus_flavor_t f))
MOCK_IMPL(networkstatus_t *,
networkstatus_get_live_consensus,(time_t now))
{
- if (networkstatus_get_latest_consensus() &&
- networkstatus_get_latest_consensus()->valid_after <= now &&
- now <= networkstatus_get_latest_consensus()->valid_until)
- return networkstatus_get_latest_consensus();
+ networkstatus_t *ns = networkstatus_get_latest_consensus();
+ if (ns && networkstatus_is_live(ns, now))
+ return ns;
else
return NULL;
}
+/** Given a consensus in <b>ns</b>, return true iff currently live and
+ * unexpired. */
+int
+networkstatus_is_live(const networkstatus_t *ns, time_t now)
+{
+ return (ns->valid_after <= now && now <= ns->valid_until);
+}
+
/** Determine if <b>consensus</b> is valid or expired recently enough that
* we can still use it.
*
@@ -1783,7 +1790,7 @@ networkstatus_set_current_consensus(const char *consensus,
if (from_cache && !was_waiting_for_certs) {
/* We previously stored this; check _now_ to make sure that version-kills
- * really work. This happens even before we check signatures: we did so
+ * really work. This happens even before we check signatures: we did so
* before when we stored this to disk. This does mean an attacker who can
* write to the datadir can make us not start: such an attacker could
* already harm us by replacing our guards, which would be worse. */
diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h
index e774c4d266..f9320747d2 100644
--- a/src/or/networkstatus.h
+++ b/src/or/networkstatus.h
@@ -81,6 +81,7 @@ MOCK_DECL(networkstatus_t *,networkstatus_get_latest_consensus,(void));
MOCK_DECL(networkstatus_t *,networkstatus_get_latest_consensus_by_flavor,
(consensus_flavor_t f));
MOCK_DECL(networkstatus_t *, networkstatus_get_live_consensus,(time_t now));
+int networkstatus_is_live(const networkstatus_t *ns, time_t now);
int networkstatus_consensus_reasonably_live(const networkstatus_t *consensus,
time_t now);
int networkstatus_valid_until_is_reasonably_live(time_t valid_until,
diff --git a/src/or/nodelist.c b/src/or/nodelist.c
index 3ac5c3e302..6acc87f967 100644
--- a/src/or/nodelist.c
+++ b/src/or/nodelist.c
@@ -45,6 +45,7 @@
#include "dirserv.h"
#include "entrynodes.h"
#include "geoip.h"
+#include "hs_common.h"
#include "main.h"
#include "microdesc.h"
#include "networkstatus.h"
@@ -54,6 +55,7 @@
#include "rendservice.h"
#include "router.h"
#include "routerlist.h"
+#include "routerparse.h"
#include "routerset.h"
#include "torcert.h"
@@ -164,12 +166,99 @@ node_get_or_create(const char *identity_digest)
smartlist_add(the_nodelist->nodes, node);
node->nodelist_idx = smartlist_len(the_nodelist->nodes) - 1;
+ node->hsdir_index = tor_malloc_zero(sizeof(hsdir_index_t));
node->country = -1;
return node;
}
+/* For a given <b>node</b> for the consensus <b>ns</b>, set the hsdir index
+ * for the node, both current and next if possible. This can only fails if the
+ * node_t ed25519 identity key can't be found which would be a bug. */
+static void
+node_set_hsdir_index(node_t *node, const networkstatus_t *ns)
+{
+ time_t now = approx_time();
+ const ed25519_public_key_t *node_identity_pk;
+ uint8_t *next_hsdir_index_srv = NULL, *current_hsdir_index_srv = NULL;
+ uint64_t next_time_period_num, current_time_period_num;
+
+ tor_assert(node);
+ tor_assert(ns);
+
+ if (!networkstatus_is_live(ns, now)) {
+ log_info(LD_GENERAL, "Not setting hsdir index with a non-live consensus.");
+ goto done;
+ }
+
+ node_identity_pk = node_get_ed25519_id(node);
+ if (node_identity_pk == NULL) {
+ log_debug(LD_GENERAL, "ed25519 identity public key not found when "
+ "trying to build the hsdir indexes for node %s",
+ node_describe(node));
+ goto done;
+ }
+
+ /* Get the current and next time period number, we might use them both. */
+ current_time_period_num = hs_get_time_period_num(now);
+ next_time_period_num = hs_get_next_time_period_num(now);
+
+ if (hs_overlap_mode_is_active(ns, now)) {
+ /* We are in overlap mode, this means that our consensus has just cycled
+ * from current SRV to previous SRV so for the _next_ upcoming time
+ * period, we have to use the current SRV and use the previous SRV for the
+ * current time period. If the current or previous SRV can't be found, the
+ * disaster one is returned. */
+ next_hsdir_index_srv = hs_get_current_srv(next_time_period_num, ns);
+ /* The following can be confusing so again, in overlap mode, we use our
+ * previous SRV for our _current_ hsdir index. */
+ current_hsdir_index_srv = hs_get_previous_srv(current_time_period_num, ns);
+ } else {
+ /* If NOT in overlap mode, we only need to compute the current hsdir index
+ * for the ongoing time period and thus the current SRV. If it can't be
+ * found, the disaster one is returned. */
+ current_hsdir_index_srv = hs_get_current_srv(current_time_period_num, ns);
+ }
+
+ /* Build the current hsdir index. */
+ hs_build_hsdir_index(node_identity_pk, current_hsdir_index_srv,
+ current_time_period_num, node->hsdir_index->current);
+ if (next_hsdir_index_srv) {
+ /* Build the next hsdir index if we have a next SRV that we can use. */
+ hs_build_hsdir_index(node_identity_pk, next_hsdir_index_srv,
+ next_time_period_num, node->hsdir_index->next);
+ } else {
+ memset(node->hsdir_index->next, 0, sizeof(node->hsdir_index->next));
+ }
+
+ done:
+ tor_free(current_hsdir_index_srv);
+ tor_free(next_hsdir_index_srv);
+ return;
+}
+
+/** Recompute all node hsdir indices. */
+void
+nodelist_recompute_all_hsdir_indices(void)
+{
+ networkstatus_t *consensus;
+ if (!the_nodelist) {
+ return;
+ }
+
+ /* Get a live consensus. Abort if not found */
+ consensus = networkstatus_get_live_consensus(approx_time());
+ if (!consensus) {
+ return;
+ }
+
+ /* Recompute all hsdir indices */
+ SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) {
+ node_set_hsdir_index(node, consensus);
+ } SMARTLIST_FOREACH_END(node);
+}
+
/** Called when a node's address changes. */
static void
node_addrs_changed(node_t *node)
@@ -216,6 +305,14 @@ nodelist_set_routerinfo(routerinfo_t *ri, routerinfo_t **ri_old_out)
dirserv_set_node_flags_from_authoritative_status(node, status);
}
+ /* Setting the HSDir index requires the ed25519 identity key which can
+ * only be found either in the ri or md. This is why this is called here.
+ * Only nodes supporting HSDir=2 protocol version needs this index. */
+ if (node->rs && node->rs->supports_v3_hsdir) {
+ node_set_hsdir_index(node,
+ networkstatus_get_latest_consensus());
+ }
+
return node;
}
@@ -246,6 +343,12 @@ nodelist_add_microdesc(microdesc_t *md)
node->md->held_by_nodes--;
node->md = md;
md->held_by_nodes++;
+ /* Setting the HSDir index requires the ed25519 identity key which can
+ * only be found either in the ri or md. This is why this is called here.
+ * Only nodes supporting HSDir=2 protocol version needs this index. */
+ if (rs->supports_v3_hsdir) {
+ node_set_hsdir_index(node, ns);
+ }
}
return node;
}
@@ -283,6 +386,9 @@ nodelist_set_consensus(networkstatus_t *ns)
}
}
+ if (rs->supports_v3_hsdir) {
+ node_set_hsdir_index(node, ns);
+ }
node_set_country(node);
/* If we're not an authdir, believe others. */
@@ -410,6 +516,7 @@ node_free(node_t *node)
if (node->md)
node->md->held_by_nodes--;
tor_assert(node->nodelist_idx == -1);
+ tor_free(node->hsdir_index);
tor_free(node);
}
@@ -630,11 +737,9 @@ node_get_by_nickname,(const char *nickname, int warn_if_unnamed))
if (! node->name_lookup_warned) {
base16_encode(fp, sizeof(fp), node->identity, DIGEST_LEN);
log_warn(LD_CONFIG,
- "You specified a server \"%s\" by name, but the directory "
- "authorities do not have any key registered for this "
- "nickname -- so it could be used by any server, not just "
- "the one you meant. "
- "To make sure you get the same server in the future, refer "
+ "You specified a relay \"%s\" by name, but nicknames can be "
+ "used by any relay, not just the one you meant. "
+ "To make sure you get the same relay in the future, refer "
"to it by key, as \"$%s\".", nickname, fp);
node->name_lookup_warned = 1;
}
@@ -707,6 +812,57 @@ node_supports_ed25519_link_authentication(const node_t *node)
return 0;
}
+/** Return true iff <b>node</b> supports the hidden service directory version
+ * 3 protocol (proposal 224). */
+int
+node_supports_v3_hsdir(const node_t *node)
+{
+ tor_assert(node);
+
+ if (node->rs) {
+ return node->rs->supports_v3_hsdir;
+ }
+ if (node->ri) {
+ if (node->ri->protocol_list == NULL) {
+ return 0;
+ }
+ /* Bug #22447 forces us to filter on tor version:
+ * If platform is a Tor version, and older than 0.3.0.8, return False.
+ * Else, obey the protocol list. */
+ if (node->ri->platform) {
+ if (!strcmpstart(node->ri->platform, "Tor ") &&
+ !tor_version_as_new_as(node->ri->platform, "0.3.0.8")) {
+ return 0;
+ }
+ }
+ return protocol_list_supports_protocol(node->ri->protocol_list,
+ PRT_HSDIR, PROTOVER_HSDIR_V3);
+ }
+ tor_assert_nonfatal_unreached_once();
+ return 0;
+}
+
+/** Return true iff <b>node</b> supports ed25519 authentication as an hidden
+ * service introduction point.*/
+int
+node_supports_ed25519_hs_intro(const node_t *node)
+{
+ tor_assert(node);
+
+ if (node->rs) {
+ return node->rs->supports_ed25519_hs_intro;
+ }
+ if (node->ri) {
+ if (node->ri->protocol_list == NULL) {
+ return 0;
+ }
+ return protocol_list_supports_protocol(node->ri->protocol_list,
+ PRT_HSINTRO, PROTOVER_HS_INTRO_V3);
+ }
+ tor_assert_nonfatal_unreached_once();
+ return 0;
+}
+
/** Return the RSA ID key's SHA1 digest for the provided node. */
const uint8_t *
node_get_rsa_id_digest(const node_t *node)
@@ -1606,8 +1762,8 @@ static char dir_info_status[512] = "";
* no exits in the consensus."
* To obtain the final weighted bandwidth, we multiply the
* weighted bandwidth fraction for each position (guard, middle, exit). */
-int
-router_have_minimum_dir_info(void)
+MOCK_IMPL(int,
+router_have_minimum_dir_info,(void))
{
static int logged_delay=0;
const char *delay_fetches_msg = NULL;
@@ -1654,6 +1810,7 @@ router_dir_info_changed(void)
{
need_to_update_have_min_dir_info = 1;
rend_hsdir_routers_changed();
+ hs_hsdir_set_changed_consider_reupload();
}
/** Return a string describing what we're missing before we have enough
diff --git a/src/or/nodelist.h b/src/or/nodelist.h
index 95ae778a5b..d16cf0ecf7 100644
--- a/src/or/nodelist.h
+++ b/src/or/nodelist.h
@@ -28,6 +28,8 @@ void nodelist_remove_routerinfo(routerinfo_t *ri);
void nodelist_purge(void);
smartlist_t *nodelist_find_nodes_with_microdesc(const microdesc_t *md);
+void nodelist_recompute_all_hsdir_indices(void);
+
void nodelist_free_all(void);
void nodelist_assert_ok(void);
@@ -58,6 +60,8 @@ const ed25519_public_key_t *node_get_ed25519_id(const node_t *node);
int node_ed25519_id_matches(const node_t *node,
const ed25519_public_key_t *id);
int node_supports_ed25519_link_authentication(const node_t *node);
+int node_supports_v3_hsdir(const node_t *node);
+int node_supports_ed25519_hs_intro(const node_t *node);
const uint8_t *node_get_rsa_id_digest(const node_t *node);
int node_has_ipv6_addr(const node_t *node);
@@ -103,7 +107,7 @@ int addrs_in_same_network_family(const tor_addr_t *a1,
* no exits in the consensus, we wait for enough info to create internal
* paths, and should avoid creating exit paths, as they will simply fail.
* We make sure we create all available circuit types at the same time. */
-int router_have_minimum_dir_info(void);
+MOCK_DECL(int, router_have_minimum_dir_info,(void));
/** Set to CONSENSUS_PATH_EXIT if there is at least one exit node
* in the consensus. We update this flag in compute_frac_paths_available if
diff --git a/src/or/ntmain.c b/src/or/ntmain.c
index e087bd6937..7a85ba9708 100644
--- a/src/or/ntmain.c
+++ b/src/or/ntmain.c
@@ -293,6 +293,7 @@ nt_service_body(int argc, char **argv)
* event loop */
service_status.dwCurrentState = SERVICE_RUNNING;
service_fns.SetServiceStatus_fn(hStatus, &service_status);
+ set_main_thread();
do_main_loop();
tor_cleanup();
}
@@ -328,9 +329,10 @@ nt_service_main(void)
case CMD_VERIFY_CONFIG:
case CMD_DUMP_CONFIG:
case CMD_KEYGEN:
+ case CMD_KEY_EXPIRATION:
log_err(LD_CONFIG, "Unsupported command (--list-fingerprint, "
- "--hash-password, --keygen, --dump-config, or --verify-config) "
- "in NT service.");
+ "--hash-password, --keygen, --dump-config, --verify-config, "
+ "or --key-expiration) in NT service.");
break;
case CMD_RUN_UNITTESTS:
default:
diff --git a/src/or/onion.c b/src/or/onion.c
index a98b97cb1d..7e1e89df1b 100644
--- a/src/or/onion.c
+++ b/src/or/onion.c
@@ -1219,7 +1219,7 @@ extend_cell_format(uint8_t *command_out, uint16_t *len_out,
*command_out = RELAY_COMMAND_EXTEND;
*len_out = 6 + TAP_ONIONSKIN_CHALLENGE_LEN + DIGEST_LEN;
set_uint32(p, tor_addr_to_ipv4n(&cell_in->orport_ipv4.addr));
- set_uint16(p+4, ntohs(cell_in->orport_ipv4.port));
+ set_uint16(p+4, htons(cell_in->orport_ipv4.port));
if (cell_in->create_cell.handshake_type == ONION_HANDSHAKE_TYPE_NTOR) {
memcpy(p+6, NTOR_CREATE_MAGIC, 16);
memcpy(p+22, cell_in->create_cell.onionskin, NTOR_ONIONSKIN_LEN);
diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c
index 294fc0df6d..c71fa236ed 100644
--- a/src/or/onion_tap.c
+++ b/src/or/onion_tap.c
@@ -72,10 +72,8 @@ onion_skin_TAP_create(crypto_pk_t *dest_router_key,
if (crypto_dh_get_public(dh, challenge, dhbytes))
goto err;
- note_crypto_pk_op(ENC_ONIONSKIN);
-
/* set meeting point, meeting cookie, etc here. Leave zero for now. */
- if (crypto_pk_public_hybrid_encrypt(dest_router_key, onion_skin_out,
+ if (crypto_pk_obsolete_public_hybrid_encrypt(dest_router_key, onion_skin_out,
TAP_ONIONSKIN_CHALLENGE_LEN,
challenge, DH_KEY_LEN,
PK_PKCS1_OAEP_PADDING, 1)<0)
@@ -124,8 +122,7 @@ onion_skin_TAP_server_handshake(
k = i==0?private_key:prev_private_key;
if (!k)
break;
- note_crypto_pk_op(DEC_ONIONSKIN);
- len = crypto_pk_private_hybrid_decrypt(k, challenge,
+ len = crypto_pk_obsolete_private_hybrid_decrypt(k, challenge,
TAP_ONIONSKIN_CHALLENGE_LEN,
onion_skin,
TAP_ONIONSKIN_CHALLENGE_LEN,
diff --git a/src/or/or.h b/src/or/or.h
index 77207bc031..5d55094a02 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -421,15 +421,23 @@ typedef enum {
#define DIR_PURPOSE_FETCH_RENDDESC_V2 18
/** A connection to a directory server: download a microdescriptor. */
#define DIR_PURPOSE_FETCH_MICRODESC 19
-#define DIR_PURPOSE_MAX_ 19
+/** A connection to a hidden service directory: upload a v3 descriptor. */
+#define DIR_PURPOSE_UPLOAD_HSDESC 20
+/** A connection to a hidden service directory: fetch a v3 descriptor. */
+#define DIR_PURPOSE_FETCH_HSDESC 21
+/** A connection to a directory server: set after a hidden service descriptor
+ * is downloaded. */
+#define DIR_PURPOSE_HAS_FETCHED_HSDESC 22
+#define DIR_PURPOSE_MAX_ 22
/** 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_RENDDESC_V2)
+ (p)==DIR_PURPOSE_UPLOAD_SIGNATURES || \
+ (p)==DIR_PURPOSE_UPLOAD_RENDDESC_V2 || \
+ (p)==DIR_PURPOSE_UPLOAD_HSDESC)
#define EXIT_PURPOSE_MIN_ 1
/** This exit stream wants to do an ordinary connect. */
@@ -846,6 +854,13 @@ rend_data_v2_t *TO_REND_DATA_V2(const rend_data_t *d)
return DOWNCAST(rend_data_v2_t, d);
}
+/* Stub because we can't include hs_ident.h. */
+struct hs_ident_edge_conn_t;
+struct hs_ident_dir_conn_t;
+struct hs_ident_circuit_t;
+/* Stub because we can't include hs_common.h. */
+struct hsdir_index_t;
+
/** Time interval for tracking replays of DH public keys received in
* INTRODUCE2 cells. Used only to avoid launching multiple
* simultaneous attempts to connect to the same rendezvous point. */
@@ -1633,6 +1648,11 @@ typedef struct edge_connection_t {
* an exit)? */
rend_data_t *rend_data;
+ /* Hidden service connection identifier for edge connections. Used by the HS
+ * client-side code to identify client SOCKS connections and by the
+ * service-side code to match HS circuits with their streams. */
+ struct hs_ident_edge_conn_t *hs_ident;
+
uint32_t address_ttl; /**< TTL for address-to-addr mapping on exit
* connection. Exit connections only. */
uint32_t begincell_flags; /** Flags sent or received in the BEGIN cell
@@ -1783,6 +1803,11 @@ typedef struct dir_connection_t {
/** What rendezvous service are we querying for? */
rend_data_t *rend_data;
+ /* Hidden service connection identifier for dir connections: Used by HS
+ client-side code to fetch HS descriptors, and by the service-side code to
+ upload descriptors. */
+ struct hs_ident_dir_conn_t *hs_ident;
+
/** If this is a one-hop connection, tracks the state of the directory guard
* for this connection (if any). */
struct circuit_guard_state_t *guard_state;
@@ -2058,7 +2083,9 @@ typedef struct download_status_t {
* or after each failure? */
download_schedule_backoff_bitfield_t backoff : 1; /**< do we use the
* deterministic schedule, or random
- * exponential backoffs? */
+ * exponential backoffs?
+ * Increment on failure schedules
+ * always use exponential backoff. */
uint8_t last_backoff_position; /**< number of attempts/failures, depending
* on increment_on, when we last recalculated
* the delay. Only updated if backoff
@@ -2473,6 +2500,10 @@ typedef struct node_t {
time_t last_reachable; /* IPv4. */
time_t last_reachable6; /* IPv6. */
+ /* Hidden service directory index data. This is used by a service or client
+ * in order to know what's the hs directory index for this node at the time
+ * the consensus is set. */
+ struct hsdir_index_t *hsdir_index;
} node_t;
/** Linked list of microdesc hash lines for a single router in a directory
@@ -3186,6 +3217,10 @@ typedef struct origin_circuit_t {
/** Holds all rendezvous data on either client or service side. */
rend_data_t *rend_data;
+ /** Holds hidden service identifier on either client or service side. This
+ * is for both introduction and rendezvous circuit. */
+ struct hs_ident_circuit_t *hs_ident;
+
/** Holds the data that the entry guard system uses to track the
* status of the guard this circuit is using, and thereby to determine
* whether this circuit can be used. */
@@ -3567,7 +3602,8 @@ typedef struct {
enum {
CMD_RUN_TOR=0, CMD_LIST_FINGERPRINT, CMD_HASH_PASSWORD,
CMD_VERIFY_CONFIG, CMD_RUN_UNITTESTS, CMD_DUMP_CONFIG,
- CMD_KEYGEN
+ CMD_KEYGEN,
+ CMD_KEY_EXPIRATION,
} command;
char *command_arg; /**< Argument for command-line option. */
@@ -4563,6 +4599,10 @@ typedef struct {
* consensuses around so that we can generate diffs from them. If 0,
* use the default. */
int MaxConsensusAgeForDiffs;
+
+ /** Bool (default: 0). Tells Tor to never try to exec another program.
+ */
+ int NoExec;
} or_options_t;
/** Persistent state for an onion router, as saved to disk. */
@@ -4594,6 +4634,9 @@ typedef struct {
config_line_t *TransportProxies;
+ /** Cached revision counters for active hidden services on this host */
+ config_line_t *HidServRevCounter;
+
/** These fields hold information on the history of bandwidth usage for
* servers. The "Ends" fields hold the time when we last updated the
* bandwidth usage. The "Interval" fields hold the granularity, in seconds,
diff --git a/src/or/parsecommon.c b/src/or/parsecommon.c
index 7959867875..6b5359303a 100644
--- a/src/or/parsecommon.c
+++ b/src/or/parsecommon.c
@@ -436,7 +436,7 @@ find_opt_by_keyword(smartlist_t *s, directory_keyword keyword)
* in the same order in which they occur in <b>s</b>. Otherwise return
* NULL. */
smartlist_t *
-find_all_by_keyword(smartlist_t *s, directory_keyword k)
+find_all_by_keyword(const smartlist_t *s, directory_keyword k)
{
smartlist_t *out = NULL;
SMARTLIST_FOREACH(s, directory_token_t *, t,
diff --git a/src/or/parsecommon.h b/src/or/parsecommon.h
index b9f1613457..5e5f9f4db6 100644
--- a/src/or/parsecommon.h
+++ b/src/or/parsecommon.h
@@ -160,6 +160,7 @@ typedef enum {
R3_INTRO_AUTH_REQUIRED,
R3_SINGLE_ONION_SERVICE,
R3_INTRODUCTION_POINT,
+ R3_INTRO_ONION_KEY,
R3_INTRO_AUTH_KEY,
R3_INTRO_ENC_KEY,
R3_INTRO_ENC_KEY_CERT,
@@ -315,7 +316,7 @@ directory_token_t *find_by_keyword_(smartlist_t *s,
directory_token_t *find_opt_by_keyword(smartlist_t *s,
directory_keyword keyword);
-smartlist_t * find_all_by_keyword(smartlist_t *s, directory_keyword k);
+smartlist_t * find_all_by_keyword(const smartlist_t *s, directory_keyword k);
#endif /* TOR_PARSECOMMON_H */
diff --git a/src/or/policies.c b/src/or/policies.c
index 3d49a6110c..4c24bfbc32 100644
--- a/src/or/policies.c
+++ b/src/or/policies.c
@@ -2731,7 +2731,7 @@ parse_short_policy(const char *summary)
}
{
- size_t size = STRUCT_OFFSET(short_policy_t, entries) +
+ size_t size = offsetof(short_policy_t, entries) +
sizeof(short_policy_entry_t)*(n_entries);
result = tor_malloc_zero(size);
diff --git a/src/or/protover.h b/src/or/protover.h
index 22667bed79..2066aeec72 100644
--- a/src/or/protover.h
+++ b/src/or/protover.h
@@ -17,6 +17,11 @@
/* This is a guess. */
#define FIRST_TOR_VERSION_TO_ADVERTISE_PROTOCOLS "0.2.9.3-alpha"
+/** The protover version number that signifies HSDir support for HSv3 */
+#define PROTOVER_HSDIR_V3 2
+/** The protover version number that signifies HSv3 intro point support */
+#define PROTOVER_HS_INTRO_V3 4
+
/** List of recognized subprotocols. */
typedef enum protocol_type_t {
PRT_LINK,
diff --git a/src/or/relay.c b/src/or/relay.c
index 0ff53ed5e9..18ccc65b80 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -184,18 +184,12 @@ relay_digest_matches(crypto_digest_t *digest, cell_t *cell)
/** Apply <b>cipher</b> to CELL_PAYLOAD_SIZE bytes of <b>in</b>
* (in place).
*
- * If <b>encrypt_mode</b> is 1 then encrypt, else decrypt.
- *
- * Returns 0.
+ * Note that we use the same operation for encrypting and for decrypting.
*/
-static int
-relay_crypt_one_payload(crypto_cipher_t *cipher, uint8_t *in,
- int encrypt_mode)
+static void
+relay_crypt_one_payload(crypto_cipher_t *cipher, uint8_t *in)
{
- (void)encrypt_mode;
crypto_cipher_crypt_inplace(cipher, (char*) in, CELL_PAYLOAD_SIZE);
-
- return 0;
}
/**
@@ -449,8 +443,8 @@ relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction,
do { /* Remember: cpath is in forward order, that is, first hop first. */
tor_assert(thishop);
- if (relay_crypt_one_payload(thishop->b_crypto, cell->payload, 0) < 0)
- return -1;
+ /* decrypt one layer */
+ relay_crypt_one_payload(thishop->b_crypto, cell->payload);
relay_header_unpack(&rh, cell->payload);
if (rh.recognized == 0) {
@@ -467,19 +461,14 @@ relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction,
log_fn(LOG_PROTOCOL_WARN, LD_OR,
"Incoming cell at client not recognized. Closing.");
return -1;
- } else { /* we're in the middle. Just one crypt. */
- if (relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->p_crypto,
- cell->payload, 1) < 0)
- return -1;
-// log_fn(LOG_DEBUG,"Skipping recognized check, because we're not "
-// "the client.");
+ } else {
+ /* We're in the middle. Encrypt one layer. */
+ relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->p_crypto, cell->payload);
}
} else /* cell_direction == CELL_DIRECTION_OUT */ {
- /* we're in the middle. Just one crypt. */
+ /* We're in the middle. Decrypt one layer. */
- if (relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->n_crypto,
- cell->payload, 0) < 0)
- return -1;
+ relay_crypt_one_payload(TO_OR_CIRCUIT(circ)->n_crypto, cell->payload);
relay_header_unpack(&rh, cell->payload);
if (rh.recognized == 0) {
@@ -525,11 +514,8 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ,
/* moving from farthest to nearest hop */
do {
tor_assert(thishop);
- /* XXXX RD This is a bug, right? */
- log_debug(LD_OR,"crypting a layer of the relay cell.");
- if (relay_crypt_one_payload(thishop->f_crypto, cell->payload, 1) < 0) {
- return -1;
- }
+ log_debug(LD_OR,"encrypting a layer of the relay cell.");
+ relay_crypt_one_payload(thishop->f_crypto, cell->payload);
thishop = thishop->prev;
} while (thishop != TO_ORIGIN_CIRCUIT(circ)->cpath->prev);
@@ -546,8 +532,8 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ,
or_circ = TO_OR_CIRCUIT(circ);
chan = or_circ->p_chan;
relay_set_digest(or_circ->p_digest, cell);
- if (relay_crypt_one_payload(or_circ->p_crypto, cell->payload, 1) < 0)
- return -1;
+ /* encrypt one layer */
+ relay_crypt_one_payload(or_circ->p_crypto, cell->payload);
}
++stats_n_relay_cells_relayed;
diff --git a/src/or/rendcache.c b/src/or/rendcache.c
index 11b60b36a1..792f6a1302 100644
--- a/src/or/rendcache.c
+++ b/src/or/rendcache.c
@@ -512,7 +512,7 @@ rend_cache_lookup_entry(const char *query, int version, rend_cache_entry_t **e)
tor_assert(rend_cache);
tor_assert(query);
- if (!rend_valid_service_id(query)) {
+ if (!rend_valid_v2_service_id(query)) {
ret = -EINVAL;
goto end;
}
@@ -558,7 +558,7 @@ rend_cache_lookup_v2_desc_as_service(const char *query, rend_cache_entry_t **e)
tor_assert(rend_cache_local_service);
tor_assert(query);
- if (!rend_valid_service_id(query)) {
+ if (!rend_valid_v2_service_id(query)) {
ret = -EINVAL;
goto end;
}
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index 9bc2d6289d..55f79c50fb 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -17,6 +17,8 @@
#include "connection_edge.h"
#include "directory.h"
#include "hs_common.h"
+#include "hs_circuit.h"
+#include "hs_client.h"
#include "main.h"
#include "networkstatus.h"
#include "nodelist.h"
@@ -41,7 +43,7 @@ rend_client_purge_state(void)
rend_cache_purge();
rend_cache_failure_purge();
rend_client_cancel_descriptor_fetches();
- rend_client_purge_last_hid_serv_requests();
+ hs_purge_last_hid_serv_requests();
}
/** Called when we've established a circuit to an introduction point:
@@ -88,46 +90,6 @@ rend_client_send_establish_rendezvous(origin_circuit_t *circ)
return 0;
}
-/** Extend the introduction circuit <b>circ</b> to another valid
- * introduction point for the hidden service it is trying to connect
- * to, or mark it and launch a new circuit if we can't extend it.
- * Return 0 on success or possible success. Return -1 and mark the
- * introduction circuit for close on permanent failure.
- *
- * On failure, the caller is responsible for marking the associated
- * rendezvous circuit for close. */
-static int
-rend_client_reextend_intro_circuit(origin_circuit_t *circ)
-{
- extend_info_t *extend_info;
- int result;
- extend_info = rend_client_get_random_intro(circ->rend_data);
- if (!extend_info) {
- log_warn(LD_REND,
- "No usable introduction points left for %s. Closing.",
- safe_str_client(rend_data_get_address(circ->rend_data)));
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
- return -1;
- }
- // XXX: should we not re-extend if hs_circ_has_timed_out?
- if (circ->remaining_relay_early_cells) {
- log_info(LD_REND,
- "Re-extending circ %u, this time to %s.",
- (unsigned)circ->base_.n_circ_id,
- safe_str_client(extend_info_describe(extend_info)));
- result = circuit_extend_to_new_exit(circ, extend_info);
- } else {
- log_info(LD_REND,
- "Closing intro circ %u (out of RELAY_EARLY cells).",
- (unsigned)circ->base_.n_circ_id);
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
- /* connection_ap_handshake_attach_circuit will launch a new intro circ. */
- result = 0;
- }
- extend_info_free(extend_info);
- return result;
-}
-
/** Called when we're trying to connect an ap conn; sends an INTRODUCE1 cell
* down introcirc if possible.
*/
@@ -201,7 +163,7 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
introcirc->build_state->chosen_exit)),
smartlist_len(entry->parsed->intro_nodes));
- if (rend_client_reextend_intro_circuit(introcirc)) {
+ if (hs_client_reextend_intro_circuit(introcirc)) {
status = -2;
goto perm_err;
} else {
@@ -265,6 +227,11 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
klen = crypto_pk_asn1_encode(extend_info->onion_key,
tmp+v3_shift+7+DIGEST_LEN+2,
sizeof(tmp)-(v3_shift+7+DIGEST_LEN+2));
+ if (klen < 0) {
+ log_warn(LD_BUG,"Internal error: can't encode public key.");
+ status = -2;
+ goto perm_err;
+ }
set_uint16(tmp+v3_shift+7+DIGEST_LEN, htons(klen));
memcpy(tmp+v3_shift+7+DIGEST_LEN+2+klen, rendcirc->rend_data->rend_cookie,
REND_COOKIE_LEN);
@@ -285,10 +252,9 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
goto perm_err;
}
- note_crypto_pk_op(REND_CLIENT);
- /*XXX maybe give crypto_pk_public_hybrid_encrypt a max_len arg,
+ /*XXX maybe give crypto_pk_obsolete_public_hybrid_encrypt a max_len arg,
* to avoid buffer overflows? */
- r = crypto_pk_public_hybrid_encrypt(intro_key, payload+DIGEST_LEN,
+ r = crypto_pk_obsolete_public_hybrid_encrypt(intro_key, payload+DIGEST_LEN,
sizeof(payload)-DIGEST_LEN,
tmp,
(int)(dh_offset+DH_KEY_LEN),
@@ -391,23 +357,11 @@ rend_client_introduction_acked(origin_circuit_t *circ,
origin_circuit_t *rendcirc;
(void) request; // XXXX Use this.
- if (circ->base_.purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) {
- log_warn(LD_PROTOCOL,
- "Received REND_INTRODUCE_ACK on unexpected circuit %u.",
- (unsigned)circ->base_.n_circ_id);
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
- return -1;
- }
-
tor_assert(circ->build_state);
tor_assert(circ->build_state->chosen_exit);
assert_circ_anonymity_ok(circ, options);
tor_assert(circ->rend_data);
- /* For path bias: This circuit was used successfully. Valid
- * nacks and acks count. */
- pathbias_mark_use_success(circ);
-
if (request_len == 0) {
/* It's an ACK; the introduction point relayed our introduction request. */
/* Locate the rend circ which is waiting to hear about this ack,
@@ -449,7 +403,7 @@ rend_client_introduction_acked(origin_circuit_t *circ,
INTRO_POINT_FAILURE_GENERIC)>0) {
/* There are introduction points left. Re-extend the circuit to
* another intro point and try again. */
- int result = rend_client_reextend_intro_circuit(circ);
+ int result = hs_client_reextend_intro_circuit(circ);
/* XXXX If that call failed, should we close the rend circuit,
* too? */
return result;
@@ -465,230 +419,6 @@ rend_client_introduction_acked(origin_circuit_t *circ,
return 0;
}
-/** The period for which a hidden service directory cannot be queried for
- * the same descriptor ID again. */
-#define REND_HID_SERV_DIR_REQUERY_PERIOD (15 * 60)
-/** Test networks generate a new consensus every 5 or 10 seconds.
- * So allow them to requery HSDirs much faster. */
-#define REND_HID_SERV_DIR_REQUERY_PERIOD_TESTING (5)
-
-/** Return the period for which a hidden service directory cannot be queried
- * for the same descriptor ID again, taking TestingTorNetwork into account. */
-static time_t
-hsdir_requery_period(const or_options_t *options)
-{
- tor_assert(options);
-
- if (options->TestingTorNetwork) {
- return REND_HID_SERV_DIR_REQUERY_PERIOD_TESTING;
- } else {
- return REND_HID_SERV_DIR_REQUERY_PERIOD;
- }
-}
-
-/** Contains the last request times to hidden service directories for
- * certain queries; each key is a string consisting of the
- * concatenation of a base32-encoded HS directory identity digest and
- * base32-encoded HS descriptor ID; each value is a pointer to a time_t
- * holding the time of the last request for that descriptor ID to that
- * HS directory. */
-static strmap_t *last_hid_serv_requests_ = NULL;
-
-/** Returns last_hid_serv_requests_, initializing it to a new strmap if
- * necessary. */
-static strmap_t *
-get_last_hid_serv_requests(void)
-{
- if (!last_hid_serv_requests_)
- last_hid_serv_requests_ = strmap_new();
- return last_hid_serv_requests_;
-}
-
-#define LAST_HID_SERV_REQUEST_KEY_LEN (REND_DESC_ID_V2_LEN_BASE32 + \
- REND_DESC_ID_V2_LEN_BASE32)
-
-/** Look up the last request time to hidden service directory <b>hs_dir</b>
- * for descriptor ID <b>desc_id_base32</b>. If <b>set</b> is non-zero,
- * assign the current time <b>now</b> and return that. Otherwise, return the
- * most recent request time, or 0 if no such request has been sent before.
- */
-static time_t
-lookup_last_hid_serv_request(routerstatus_t *hs_dir,
- const char *desc_id_base32,
- time_t now, int set)
-{
- char hsdir_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
- char hsdir_desc_comb_id[LAST_HID_SERV_REQUEST_KEY_LEN + 1];
- time_t *last_request_ptr;
- strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
- base32_encode(hsdir_id_base32, sizeof(hsdir_id_base32),
- hs_dir->identity_digest, DIGEST_LEN);
- tor_snprintf(hsdir_desc_comb_id, sizeof(hsdir_desc_comb_id), "%s%s",
- hsdir_id_base32,
- desc_id_base32);
- /* XXX++?? tor_assert(strlen(hsdir_desc_comb_id) ==
- LAST_HID_SERV_REQUEST_KEY_LEN); */
- if (set) {
- time_t *oldptr;
- last_request_ptr = tor_malloc_zero(sizeof(time_t));
- *last_request_ptr = now;
- oldptr = strmap_set(last_hid_serv_requests, hsdir_desc_comb_id,
- last_request_ptr);
- tor_free(oldptr);
- } else
- last_request_ptr = strmap_get_lc(last_hid_serv_requests,
- hsdir_desc_comb_id);
- return (last_request_ptr) ? *last_request_ptr : 0;
-}
-
-/** Clean the history of request times to hidden service directories, so that
- * it does not contain requests older than REND_HID_SERV_DIR_REQUERY_PERIOD
- * seconds any more. */
-static void
-directory_clean_last_hid_serv_requests(time_t now)
-{
- strmap_iter_t *iter;
- time_t cutoff = now - hsdir_requery_period(get_options());
- strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
- for (iter = strmap_iter_init(last_hid_serv_requests);
- !strmap_iter_done(iter); ) {
- const char *key;
- void *val;
- time_t *ent;
- strmap_iter_get(iter, &key, &val);
- ent = (time_t *) val;
- if (*ent < cutoff) {
- iter = strmap_iter_next_rmv(last_hid_serv_requests, iter);
- tor_free(ent);
- } else {
- iter = strmap_iter_next(last_hid_serv_requests, iter);
- }
- }
-}
-
-/** Remove all requests related to the descriptor ID <b>desc_id</b> from the
- * history of times of requests to hidden service directories.
- * <b>desc_id</b> is an unencoded descriptor ID of size DIGEST_LEN.
- *
- * This is called from rend_client_note_connection_attempt_ended(), which
- * must be idempotent, so any future changes to this function must leave it
- * idempotent too. */
-static void
-purge_hid_serv_from_last_hid_serv_requests(const char *desc_id)
-{
- strmap_iter_t *iter;
- strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
- char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
-
- /* Key is stored with the base32 encoded desc_id. */
- base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_id,
- DIGEST_LEN);
- for (iter = strmap_iter_init(last_hid_serv_requests);
- !strmap_iter_done(iter); ) {
- const char *key;
- void *val;
- strmap_iter_get(iter, &key, &val);
- /* XXX++?? tor_assert(strlen(key) == LAST_HID_SERV_REQUEST_KEY_LEN); */
- if (tor_memeq(key + LAST_HID_SERV_REQUEST_KEY_LEN -
- REND_DESC_ID_V2_LEN_BASE32,
- desc_id_base32,
- REND_DESC_ID_V2_LEN_BASE32)) {
- iter = strmap_iter_next_rmv(last_hid_serv_requests, iter);
- tor_free(val);
- } else {
- iter = strmap_iter_next(last_hid_serv_requests, iter);
- }
- }
-}
-
-/** Purge the history of request times to hidden service directories,
- * so that future lookups of an HS descriptor will not fail because we
- * accessed all of the HSDir relays responsible for the descriptor
- * recently. */
-void
-rend_client_purge_last_hid_serv_requests(void)
-{
- /* Don't create the table if it doesn't exist yet (and it may very
- * well not exist if the user hasn't accessed any HSes)... */
- strmap_t *old_last_hid_serv_requests = last_hid_serv_requests_;
- /* ... and let get_last_hid_serv_requests re-create it for us if
- * necessary. */
- last_hid_serv_requests_ = NULL;
-
- if (old_last_hid_serv_requests != NULL) {
- log_info(LD_REND, "Purging client last-HS-desc-request-time table");
- strmap_free(old_last_hid_serv_requests, tor_free_);
- }
-}
-
-/** This returns a good valid hs dir that should be used for the given
- * descriptor id.
- *
- * Return NULL on error else the hsdir node pointer. */
-static routerstatus_t *
-pick_hsdir(const char *desc_id, const char *desc_id_base32)
-{
- smartlist_t *responsible_dirs = smartlist_new();
- smartlist_t *usable_responsible_dirs = smartlist_new();
- const or_options_t *options = get_options();
- routerstatus_t *hs_dir;
- time_t now = time(NULL);
- int excluded_some;
-
- tor_assert(desc_id);
- tor_assert(desc_id_base32);
-
- /* Determine responsible dirs. Even if we can't get all we want, work with
- * the ones we have. If it's empty, we'll notice below. */
- hid_serv_get_responsible_directories(responsible_dirs, desc_id);
-
- /* Clean request history first. */
- directory_clean_last_hid_serv_requests(now);
-
- /* Only select those hidden service directories to which we did not send a
- * request recently and for which we have a router descriptor here. */
- SMARTLIST_FOREACH_BEGIN(responsible_dirs, routerstatus_t *, dir) {
- time_t last = lookup_last_hid_serv_request(dir, desc_id_base32,
- 0, 0);
- const node_t *node = node_get_by_id(dir->identity_digest);
- if (last + hsdir_requery_period(options) >= now ||
- !node || !node_has_descriptor(node)) {
- SMARTLIST_DEL_CURRENT(responsible_dirs, dir);
- continue;
- }
- if (!routerset_contains_node(options->ExcludeNodes, node)) {
- smartlist_add(usable_responsible_dirs, dir);
- }
- } SMARTLIST_FOREACH_END(dir);
-
- excluded_some =
- smartlist_len(usable_responsible_dirs) < smartlist_len(responsible_dirs);
-
- hs_dir = smartlist_choose(usable_responsible_dirs);
- if (!hs_dir && !options->StrictNodes) {
- hs_dir = smartlist_choose(responsible_dirs);
- }
-
- smartlist_free(responsible_dirs);
- smartlist_free(usable_responsible_dirs);
- if (!hs_dir) {
- log_info(LD_REND, "Could not pick one of the responsible hidden "
- "service directories, because we requested them all "
- "recently without success.");
- if (options->StrictNodes && excluded_some) {
- log_warn(LD_REND, "Could not pick a hidden service directory for the "
- "requested hidden service: they are all either down or "
- "excluded, and StrictNodes is set.");
- }
- } else {
- /* Remember that we are requesting a descriptor from this hidden service
- * directory now. */
- lookup_last_hid_serv_request(hs_dir, desc_id_base32, now, 1);
- }
-
- return hs_dir;
-}
-
/** Determine the responsible hidden service directories for <b>desc_id</b>
* and fetch the descriptor with that ID from one of them. Only
* send a request to a hidden service directory that we have not yet tried
@@ -721,7 +451,12 @@ directory_get_from_hs_dir(const char *desc_id,
/* Automatically pick an hs dir if none given. */
if (!rs_hsdir) {
- hs_dir = pick_hsdir(desc_id, desc_id_base32);
+ /* Determine responsible dirs. Even if we can't get all we want, work with
+ * the ones we have. If it's empty, we'll notice in hs_pick_hsdir(). */
+ smartlist_t *responsible_dirs = smartlist_new();
+ hid_serv_get_responsible_directories(responsible_dirs, desc_id);
+
+ hs_dir = hs_pick_hsdir(responsible_dirs, 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");
@@ -786,6 +521,20 @@ directory_get_from_hs_dir(const char *desc_id,
return 1;
}
+/** Remove tracked HSDir requests from our history for this hidden service
+ * descriptor <b>desc_id</b> (of size DIGEST_LEN) */
+static void
+purge_v2_hidserv_req(const char *desc_id)
+{
+ char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
+
+ /* The hsdir request tracker stores v2 keys using the base32 encoded
+ desc_id. Do it: */
+ base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_id,
+ DIGEST_LEN);
+ hs_purge_hid_serv_from_last_hid_serv_requests(desc_id_base32);
+}
+
/** Fetch a v2 descriptor using the given descriptor id. If any hsdir(s) are
* given, they will be used instead.
*
@@ -860,8 +609,7 @@ fetch_v2_desc_by_addr(rend_data_t *rend_query, smartlist_t *hsdirs)
sizeof(descriptor_id)) != 0) {
/* Not equal from what we currently have so purge the last hid serv
* request cache and update the descriptor ID with the new value. */
- purge_hid_serv_from_last_hid_serv_requests(
- rend_data->descriptor_id[chosen_replica]);
+ purge_v2_hidserv_req(rend_data->descriptor_id[chosen_replica]);
memcpy(rend_data->descriptor_id[chosen_replica], descriptor_id,
sizeof(rend_data->descriptor_id[chosen_replica]));
}
@@ -1107,118 +855,24 @@ rend_client_report_intro_point_failure(extend_info_t *failed_intro,
return 1;
}
-/** Called when we receive a RENDEZVOUS_ESTABLISHED cell; changes the state of
- * the circuit to C_REND_READY.
- */
-int
-rend_client_rendezvous_acked(origin_circuit_t *circ, const uint8_t *request,
- size_t request_len)
-{
- (void) request;
- (void) request_len;
- /* we just got an ack for our establish-rendezvous. switch purposes. */
- if (circ->base_.purpose != CIRCUIT_PURPOSE_C_ESTABLISH_REND) {
- log_warn(LD_PROTOCOL,"Got a rendezvous ack when we weren't expecting one. "
- "Closing circ.");
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
- return -1;
- }
- log_info(LD_REND,"Got rendezvous ack. This circuit is now ready for "
- "rendezvous.");
- circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_REND_READY);
- /* Set timestamp_dirty, because circuit_expire_building expects it
- * to specify when a circuit entered the _C_REND_READY state. */
- circ->base_.timestamp_dirty = time(NULL);
-
- /* From a path bias point of view, this circuit is now successfully used.
- * Waiting any longer opens us up to attacks from malicious hidden services.
- * They could induce the client to attempt to connect to their hidden
- * service and never reply to the client's rend requests */
- pathbias_mark_use_success(circ);
-
- /* XXXX++ This is a pretty brute-force approach. It'd be better to
- * attach only the connections that are waiting on this circuit, rather
- * than trying to attach them all. See comments bug 743. */
- /* If we already have the introduction circuit built, make sure we send
- * the INTRODUCE cell _now_ */
- connection_ap_attach_pending(1);
- return 0;
-}
-
/** The service sent us a rendezvous cell; join the circuits. */
int
rend_client_receive_rendezvous(origin_circuit_t *circ, const uint8_t *request,
size_t request_len)
{
- crypt_path_t *hop;
- char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN];
-
- if ((circ->base_.purpose != CIRCUIT_PURPOSE_C_REND_READY &&
- circ->base_.purpose != CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED)
- || !circ->build_state->pending_final_cpath) {
- log_warn(LD_PROTOCOL,"Got rendezvous2 cell from hidden service, but not "
- "expecting it. Closing.");
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
- return -1;
- }
-
if (request_len != DH_KEY_LEN+DIGEST_LEN) {
log_warn(LD_PROTOCOL,"Incorrect length (%d) on RENDEZVOUS2 cell.",
(int)request_len);
goto err;
}
- log_info(LD_REND,"Got RENDEZVOUS2 cell from hidden service.");
-
- /* first DH_KEY_LEN bytes are g^y from the service. Finish the dh
- * handshake...*/
- tor_assert(circ->build_state);
- tor_assert(circ->build_state->pending_final_cpath);
- hop = circ->build_state->pending_final_cpath;
- tor_assert(hop->rend_dh_handshake_state);
- if (crypto_dh_compute_secret(LOG_PROTOCOL_WARN,
- hop->rend_dh_handshake_state, (char*)request,
- DH_KEY_LEN,
- keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN)<0) {
- log_warn(LD_GENERAL, "Couldn't complete DH handshake.");
+ if (hs_circuit_setup_e2e_rend_circ_legacy_client(circ, request) < 0) {
+ log_warn(LD_GENERAL, "Failed to setup circ");
goto err;
}
- /* ... and set up cpath. */
- if (circuit_init_cpath_crypto(hop, keys+DIGEST_LEN, 0)<0)
- goto err;
-
- /* Check whether the digest is right... */
- if (tor_memneq(keys, request+DH_KEY_LEN, DIGEST_LEN)) {
- log_warn(LD_PROTOCOL, "Incorrect digest of key material.");
- goto err;
- }
-
- crypto_dh_free(hop->rend_dh_handshake_state);
- hop->rend_dh_handshake_state = NULL;
-
- /* All is well. Extend the circuit. */
- circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_REND_JOINED);
- hop->state = CPATH_STATE_OPEN;
- /* set the windows to default. these are the windows
- * that the client thinks the service has.
- */
- hop->package_window = circuit_initial_package_window();
- hop->deliver_window = CIRCWINDOW_START;
-
- /* Now that this circuit has finished connecting to its destination,
- * make sure circuit_get_open_circ_or_launch is willing to return it
- * so we can actually use it. */
- circ->hs_circ_has_timed_out = 0;
-
- onion_append_to_cpath(&circ->cpath, hop);
- circ->build_state->pending_final_cpath = NULL; /* prevent double-free */
-
- circuit_try_attaching_streams(circ);
-
- memwipe(keys, 0, sizeof(keys));
return 0;
+
err:
- memwipe(keys, 0, sizeof(keys));
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
return -1;
}
@@ -1305,14 +959,14 @@ rend_client_note_connection_attempt_ended(const rend_data_t *rend_data)
for (replica = 0; replica < ARRAY_LENGTH(rend_data_v2->descriptor_id);
replica++) {
const char *desc_id = rend_data_v2->descriptor_id[replica];
- purge_hid_serv_from_last_hid_serv_requests(desc_id);
+ purge_v2_hidserv_req(desc_id);
}
log_info(LD_REND, "Connection attempt for %s has ended; "
"cleaning up temporary state.",
safe_str_client(onion_address));
} else {
/* We only have an ID for a fetch. Probably used by HSFETCH. */
- purge_hid_serv_from_last_hid_serv_requests(rend_data_v2->desc_id_fetch);
+ purge_v2_hidserv_req(rend_data_v2->desc_id_fetch);
}
}
@@ -1511,7 +1165,7 @@ rend_parse_service_authorization(const or_options_t *options,
goto err;
}
strlcpy(auth->onion_address, onion_address, REND_SERVICE_ID_LEN_BASE32+1);
- if (!rend_valid_service_id(auth->onion_address)) {
+ if (!rend_valid_v2_service_id(auth->onion_address)) {
log_warn(LD_CONFIG, "Onion address has wrong format: '%s'",
onion_address);
goto err;
diff --git a/src/or/rendclient.h b/src/or/rendclient.h
index ff0f4084fd..ac0503bade 100644
--- a/src/or/rendclient.h
+++ b/src/or/rendclient.h
@@ -24,15 +24,11 @@ int rend_client_introduction_acked(origin_circuit_t *circ,
void rend_client_refetch_v2_renddesc(rend_data_t *rend_query);
int rend_client_fetch_v2_desc(rend_data_t *query, smartlist_t *hsdirs);
void rend_client_cancel_descriptor_fetches(void);
-void rend_client_purge_last_hid_serv_requests(void);
int rend_client_report_intro_point_failure(extend_info_t *failed_intro,
rend_data_t *rend_data,
unsigned int failure_type);
-int rend_client_rendezvous_acked(origin_circuit_t *circ,
- const uint8_t *request,
- size_t request_len);
int rend_client_receive_rendezvous(origin_circuit_t *circ,
const uint8_t *request,
size_t request_len);
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c
index e1236bdd0f..458a90058f 100644
--- a/src/or/rendcommon.c
+++ b/src/or/rendcommon.c
@@ -8,6 +8,8 @@
* introducers, services, clients, and rendezvous points.
**/
+#define RENDCOMMON_PRIVATE
+
#include "or.h"
#include "circuitbuild.h"
#include "config.h"
@@ -17,6 +19,7 @@
#include "rendcommon.h"
#include "rendmid.h"
#include "hs_intropoint.h"
+#include "hs_client.h"
#include "rendservice.h"
#include "rephist.h"
#include "router.h"
@@ -395,7 +398,7 @@ rend_encrypt_v2_intro_points_stealth(char **encrypted_out,
/** Attempt to parse the given <b>desc_str</b> and return true if this
* succeeds, false otherwise. */
-static int
+STATIC int
rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc)
{
rend_service_descriptor_t *test_parsed = NULL;
@@ -477,7 +480,10 @@ rend_encode_v2_descriptors(smartlist_t *descs_out,
tor_assert(descriptor_cookie);
}
/* Obtain service_id from public key. */
- crypto_pk_get_digest(service_key, service_id);
+ if (crypto_pk_get_digest(service_key, service_id) < 0) {
+ log_warn(LD_BUG, "Couldn't compute service key digest.");
+ return -1;
+ }
/* Calculate current time-period. */
time_period = get_time_period(now, period, service_id);
/* Determine how many seconds the descriptor will be valid. */
@@ -693,7 +699,7 @@ rend_get_service_id(crypto_pk_t *pk, char *out)
/** Return true iff <b>query</b> is a syntactically valid service ID (as
* generated by rend_get_service_id). */
int
-rend_valid_service_id(const char *query)
+rend_valid_v2_service_id(const char *query)
{
if (strlen(query) != REND_SERVICE_ID_LEN_BASE32)
return 0;
@@ -775,11 +781,11 @@ rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint,
break;
case RELAY_COMMAND_INTRODUCE2:
if (origin_circ)
- r = rend_service_receive_introduction(origin_circ,payload,length);
+ r = hs_service_receive_introduce2(origin_circ,payload,length);
break;
case RELAY_COMMAND_INTRODUCE_ACK:
if (origin_circ)
- r = rend_client_introduction_acked(origin_circ,payload,length);
+ r = hs_client_receive_introduce_ack(origin_circ,payload,length);
break;
case RELAY_COMMAND_RENDEZVOUS1:
if (or_circ)
@@ -787,15 +793,15 @@ rend_process_relay_cell(circuit_t *circ, const crypt_path_t *layer_hint,
break;
case RELAY_COMMAND_RENDEZVOUS2:
if (origin_circ)
- r = rend_client_receive_rendezvous(origin_circ,payload,length);
+ r = hs_client_receive_rendezvous2(origin_circ,payload,length);
break;
case RELAY_COMMAND_INTRO_ESTABLISHED:
if (origin_circ)
- r = rend_service_intro_established(origin_circ,payload,length);
+ r = hs_service_receive_intro_established(origin_circ,payload,length);
break;
case RELAY_COMMAND_RENDEZVOUS_ESTABLISHED:
if (origin_circ)
- r = rend_client_rendezvous_acked(origin_circ,payload,length);
+ r = hs_client_receive_rendezvous_acked(origin_circ,payload,length);
break;
default:
tor_fragile_assert();
@@ -988,7 +994,7 @@ rend_non_anonymous_mode_enabled(const or_options_t *options)
* service.
*/
void
-assert_circ_anonymity_ok(origin_circuit_t *circ,
+assert_circ_anonymity_ok(const origin_circuit_t *circ,
const or_options_t *options)
{
tor_assert(options);
diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h
index 94c2480d86..af8dd60099 100644
--- a/src/or/rendcommon.h
+++ b/src/or/rendcommon.h
@@ -30,7 +30,7 @@ void rend_encoded_v2_service_descriptor_free(
rend_encoded_v2_service_descriptor_t *desc);
void rend_intro_point_free(rend_intro_point_t *intro);
-int rend_valid_service_id(const char *query);
+int rend_valid_v2_service_id(const char *query);
int rend_valid_descriptor_id(const char *query);
int rend_valid_client_name(const char *client_name);
int rend_encode_v2_descriptors(smartlist_t *descs_out,
@@ -60,8 +60,15 @@ int rend_auth_decode_cookie(const char *cookie_in,
int rend_allow_non_anonymous_connection(const or_options_t* options);
int rend_non_anonymous_mode_enabled(const or_options_t *options);
-void assert_circ_anonymity_ok(origin_circuit_t *circ,
+void assert_circ_anonymity_ok(const origin_circuit_t *circ,
const or_options_t *options);
+#ifdef RENDCOMMON_PRIVATE
+
+STATIC int
+rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc);
+
+#endif
+
#endif
diff --git a/src/or/rendmid.c b/src/or/rendmid.c
index 23c3deddaa..66d2f93113 100644
--- a/src/or/rendmid.c
+++ b/src/or/rendmid.c
@@ -71,7 +71,6 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request,
goto err;
}
/* Rest of body: signature of previous data */
- note_crypto_pk_op(REND_MID);
if (crypto_pk_public_checksig_digest(pk,
(char*)request, 2+asn1len+DIGEST_LEN,
(char*)(request+2+DIGEST_LEN+asn1len),
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index f3b78c4663..99ba9b3d83 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -18,6 +18,7 @@
#include "control.h"
#include "directory.h"
#include "hs_common.h"
+#include "hs_config.h"
#include "main.h"
#include "networkstatus.h"
#include "nodelist.h"
@@ -82,22 +83,6 @@ 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.
- */
-struct rend_service_port_config_s {
- /* The incoming HS virtual port we're mapping */
- uint16_t virtual_port;
- /* Is this an AF_UNIX port? */
- unsigned int is_unix_addr:1;
- /* The outgoing TCP port to use, if !is_unix_addr */
- uint16_t real_port;
- /* The outgoing IPv4 or IPv6 address to use, if !is_unix_addr */
- tor_addr_t real_addr;
- /* The socket path to connect to, if is_unix_addr */
- char unix_addr[FLEXIBLE_ARRAY_MEMBER];
-};
-
/* Hidden service directory file names:
* new file names should be added to rend_service_add_filenames_to_list()
* for sandboxing purposes. */
@@ -163,7 +148,7 @@ rend_service_escaped_dir(const struct rend_service_t *s)
/** Return the number of rendezvous services we have configured. */
int
-num_rend_services(void)
+rend_num_services(void)
{
if (!rend_service_list)
return 0;
@@ -231,18 +216,41 @@ rend_service_free(rend_service_t *service)
tor_free(service);
}
-/** Release all the storage held in rend_service_list.
- */
+/* Release all the storage held in rend_service_staging_list. */
+void
+rend_service_free_staging_list(void)
+{
+ if (rend_service_staging_list) {
+ SMARTLIST_FOREACH(rend_service_staging_list, rend_service_t*, ptr,
+ rend_service_free(ptr));
+ smartlist_free(rend_service_staging_list);
+ rend_service_staging_list = NULL;
+ }
+}
+
+/** Release all the storage held in both rend_service_list and
+ * rend_service_staging_list. */
void
rend_service_free_all(void)
{
- if (!rend_service_list)
- return;
+ if (rend_service_list) {
+ SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr,
+ rend_service_free(ptr));
+ smartlist_free(rend_service_list);
+ rend_service_list = NULL;
+ }
+ rend_service_free_staging_list();
+}
+
+/* Initialize the subsystem. */
+void
+rend_service_init(void)
+{
+ tor_assert(!rend_service_list);
+ tor_assert(!rend_service_staging_list);
- SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr,
- rend_service_free(ptr));
- smartlist_free(rend_service_list);
- rend_service_list = NULL;
+ rend_service_list = smartlist_new();
+ rend_service_staging_list = smartlist_new();
}
/* Validate a <b>service</b>. Use the <b>service_list</b> to make sure there
@@ -252,8 +260,6 @@ static int
rend_validate_service(const smartlist_t *service_list,
const rend_service_t *service)
{
- int dupe = 0;
-
tor_assert(service_list);
tor_assert(service);
@@ -286,34 +292,6 @@ rend_validate_service(const smartlist_t *service_list,
goto invalid;
}
- /* XXX This duplicate check has two problems:
- *
- * a) It's O(n^2), but the same comment from the bottom of
- * rend_config_services() should apply.
- *
- * b) We only compare directory paths as strings, so we can't
- * detect two distinct paths that specify the same directory
- * (which can arise from symlinks, case-insensitivity, bind
- * mounts, etc.).
- *
- * It also can't detect that two separate Tor instances are trying
- * to use the same HiddenServiceDir; for that, we would need a
- * lock file. But this is enough to detect a simple mistake that
- * at least one person has actually made.
- */
- if (!rend_service_is_ephemeral(service)) {
- /* Skip dupe for ephemeral services. */
- SMARTLIST_FOREACH(service_list, rend_service_t *, ptr,
- dupe = dupe ||
- !strcmp(ptr->directory, service->directory));
- if (dupe) {
- log_warn(LD_REND, "Another hidden service is already configured for "
- "directory %s.",
- rend_service_escaped_dir(service));
- goto invalid;
- }
- }
-
/* Valid. */
return 0;
invalid:
@@ -335,6 +313,7 @@ rend_add_service(smartlist_t *service_list, rend_service_t *service)
/* We must have a service list, even if it's a temporary one, so we can
* check for duplicate services */
if (BUG(!s_list)) {
+ rend_service_free(service);
return -1;
}
@@ -496,41 +475,6 @@ rend_service_port_config_free(rend_service_port_config_t *p)
tor_free(p);
}
-/* Check the directory for <b>service</b>, and add the service to
- * <b>service_list</b>, or to the global list if <b>service_list</b> is NULL.
- * Only add the service to the list if <b>validate_only</b> is false.
- * If <b>validate_only</b> is true, free the service.
- * If <b>service</b> is NULL, ignore it, and return 0.
- * Returns 0 on success, and -1 on failure.
- * Takes ownership of <b>service</b>, either freeing it, or adding it to the
- * global service list.
- */
-STATIC int
-rend_service_check_dir_and_add(smartlist_t *service_list,
- const or_options_t *options,
- rend_service_t *service,
- int validate_only)
-{
- if (!service) {
- /* It is ok for a service to be NULL, this means there are no services */
- return 0;
- }
-
- if (rend_service_check_private_dir(options, service, !validate_only)
- < 0) {
- rend_service_free(service);
- return -1;
- }
-
- smartlist_t *s_list = rend_get_service_list_mutable(service_list);
- /* We must have a service list, even if it's a temporary one, so we can
- * check for duplicate services */
- if (BUG(!s_list)) {
- return -1;
- }
- return rend_add_service(s_list, service);
-}
-
/* 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
@@ -657,19 +601,54 @@ rend_service_prune_list(void)
}
}
-/** 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
- * normal, but don't actually change the configured services.)
- */
+/* Copy all the relevant data that the hs_service object contains over to the
+ * rend_service_t object. The reason to do so is because when configuring a
+ * service, we go through a generic handler that creates an hs_service_t
+ * object which so we have to copy the parsed values to a rend service object
+ * which is version 2 specific. */
+static void
+service_config_shadow_copy(rend_service_t *service,
+ hs_service_config_t *config)
+{
+ tor_assert(service);
+ tor_assert(config);
+
+ service->directory = tor_strdup(config->directory_path);
+ service->dir_group_readable = config->dir_group_readable;
+ service->allow_unknown_ports = config->allow_unknown_ports;
+ /* This value can't go above HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT (65535)
+ * if the code flow is right so this cast is safe. But just in case, we'll
+ * check it. */
+ service->max_streams_per_circuit = (int) config->max_streams_per_rdv_circuit;
+ if (BUG(config->max_streams_per_rdv_circuit >
+ HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT)) {
+ service->max_streams_per_circuit = HS_CONFIG_MAX_STREAMS_PER_RDV_CIRCUIT;
+ }
+ service->max_streams_close_circuit = config->max_streams_close_circuit;
+ service->n_intro_points_wanted = config->num_intro_points;
+ /* Switching ownership of the ports to the rend service object. */
+ smartlist_add_all(service->ports, config->ports);
+ smartlist_free(config->ports);
+ config->ports = NULL;
+}
+
+/* Parse the hidden service configuration starting at <b>line_</b> using the
+ * already configured generic service configuration in <b>config</b>. This
+ * function will translate the config object to a rend_service_t and add it to
+ * the temporary list if valid. If <b>validate_only</b> is set, parse, warn
+ * and return as normal but don't actually add the service to the list. */
int
-rend_config_services(const or_options_t *options, int validate_only)
+rend_config_service(const config_line_t *line_,
+ const or_options_t *options,
+ hs_service_config_t *config)
{
- config_line_t *line;
+ const config_line_t *line;
rend_service_t *service = NULL;
- rend_service_port_config_t *portcfg;
- int ok = 0;
- int rv = -1;
+
+ /* line_ can be NULL which would mean that the service configuration only
+ * have one line that is the directory directive. */
+ tor_assert(options);
+ tor_assert(config);
/* Use the staging service list so that we can check then do the pruning
* process using the main list at the end. */
@@ -677,100 +656,23 @@ rend_config_services(const or_options_t *options, int validate_only)
rend_service_staging_list = smartlist_new();
}
- for (line = options->RendConfigLines; line; line = line->next) {
+ /* Initialize service. */
+ service = tor_malloc_zero(sizeof(rend_service_t));
+ service->intro_period_started = time(NULL);
+ service->ports = smartlist_new();
+ /* From the hs_service object which has been used to load the generic
+ * options, we'll copy over the useful data to the rend_service_t object. */
+ service_config_shadow_copy(service, config);
+
+ for (line = line_; line; line = line->next) {
if (!strcasecmp(line->key, "HiddenServiceDir")) {
- if (service) {
- /* Validate and register the service we just finished parsing this
- * code registers every service except the last one parsed, which is
- * validated and registered below the loop. */
- if (rend_validate_service(rend_service_staging_list, service) < 0) {
- goto free_and_return;
- }
- if (rend_service_check_dir_and_add(rend_service_staging_list, options,
- service, validate_only) < 0) {
- /* The above frees the service on error so nullify the pointer. */
- service = NULL;
- goto free_and_return;
- }
- }
- service = tor_malloc_zero(sizeof(rend_service_t));
- service->directory = tor_strdup(line->value);
- service->ports = smartlist_new();
- service->intro_period_started = time(NULL);
- service->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT;
- continue;
- }
- if (!service) {
- log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive",
- line->key);
- goto free_and_return;
+ /* We just hit the next hidden service, stop right now. */
+ break;
}
- if (!strcasecmp(line->key, "HiddenServicePort")) {
- char *err_msg = NULL;
- portcfg = rend_service_parse_port_config(line->value, " ", &err_msg);
- if (!portcfg) {
- if (err_msg)
- log_warn(LD_CONFIG, "%s", err_msg);
- tor_free(err_msg);
- goto free_and_return;
- }
- tor_assert(!err_msg);
- smartlist_add(service->ports, portcfg);
- } else if (!strcasecmp(line->key, "HiddenServiceAllowUnknownPorts")) {
- service->allow_unknown_ports = (int)tor_parse_long(line->value,
- 10, 0, 1, &ok, NULL);
- if (!ok) {
- log_warn(LD_CONFIG,
- "HiddenServiceAllowUnknownPorts should be 0 or 1, not %s",
- line->value);
- goto free_and_return;
- }
- log_info(LD_CONFIG,
- "HiddenServiceAllowUnknownPorts=%d for %s",
- (int)service->allow_unknown_ports,
- rend_service_escaped_dir(service));
- } else if (!strcasecmp(line->key,
- "HiddenServiceDirGroupReadable")) {
- service->dir_group_readable = (int)tor_parse_long(line->value,
- 10, 0, 1, &ok, NULL);
- if (!ok) {
- log_warn(LD_CONFIG,
- "HiddenServiceDirGroupReadable should be 0 or 1, not %s",
- line->value);
- goto free_and_return;
- }
- log_info(LD_CONFIG,
- "HiddenServiceDirGroupReadable=%d for %s",
- service->dir_group_readable,
- rend_service_escaped_dir(service));
- } else if (!strcasecmp(line->key, "HiddenServiceMaxStreams")) {
- service->max_streams_per_circuit = (int)tor_parse_long(line->value,
- 10, 0, 65535, &ok, NULL);
- if (!ok) {
- log_warn(LD_CONFIG,
- "HiddenServiceMaxStreams should be between 0 and %d, not %s",
- 65535, line->value);
- goto free_and_return;
- }
- log_info(LD_CONFIG,
- "HiddenServiceMaxStreams=%d for %s",
- service->max_streams_per_circuit,
- rend_service_escaped_dir(service));
- } else if (!strcasecmp(line->key, "HiddenServiceMaxStreamsCloseCircuit")) {
- service->max_streams_close_circuit = (int)tor_parse_long(line->value,
- 10, 0, 1, &ok, NULL);
- if (!ok) {
- log_warn(LD_CONFIG,
- "HiddenServiceMaxStreamsCloseCircuit should be 0 or 1, "
- "not %s",
- line->value);
- goto free_and_return;
- }
- log_info(LD_CONFIG,
- "HiddenServiceMaxStreamsCloseCircuit=%d for %s",
- (int)service->max_streams_close_circuit,
- rend_service_escaped_dir(service));
- } else if (!strcasecmp(line->key, "HiddenServiceNumIntroductionPoints")) {
+ /* Number of introduction points. */
+ if (!strcasecmp(line->key, "HiddenServiceNumIntroductionPoints")) {
+ int ok = 0;
+ /* Those are specific defaults for version 2. */
service->n_intro_points_wanted =
(unsigned int) tor_parse_long(line->value, 10,
0, NUM_INTRO_POINTS_MAX, &ok, NULL);
@@ -779,12 +681,13 @@ rend_config_services(const or_options_t *options, int validate_only)
"HiddenServiceNumIntroductionPoints "
"should be between %d and %d, not %s",
0, NUM_INTRO_POINTS_MAX, line->value);
- goto free_and_return;
+ goto err;
}
log_info(LD_CONFIG, "HiddenServiceNumIntroductionPoints=%d for %s",
- service->n_intro_points_wanted,
- rend_service_escaped_dir(service));
- } else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) {
+ service->n_intro_points_wanted, escaped(service->directory));
+ continue;
+ }
+ if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) {
/* Parse auth type and comma-separated list of client names and add a
* rend_authorized_client_t for each client to the service's list
* of authorized clients. */
@@ -794,7 +697,7 @@ rend_config_services(const or_options_t *options, int validate_only)
if (service->auth_type != REND_NO_AUTH) {
log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient "
"lines for a single service.");
- goto free_and_return;
+ goto err;
}
type_names_split = smartlist_new();
smartlist_split_string(type_names_split, line->value, " ", 0, 2);
@@ -802,7 +705,8 @@ rend_config_services(const or_options_t *options, int validate_only)
log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This "
"should have been prevented when parsing the "
"configuration.");
- goto free_and_return;
+ smartlist_free(type_names_split);
+ goto err;
}
authname = smartlist_get(type_names_split, 0);
if (!strcasecmp(authname, "basic")) {
@@ -816,7 +720,7 @@ rend_config_services(const or_options_t *options, int validate_only)
(char *) smartlist_get(type_names_split, 0));
SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp));
smartlist_free(type_names_split);
- goto free_and_return;
+ goto err;
}
service->clients = smartlist_new();
if (smartlist_len(type_names_split) < 2) {
@@ -853,7 +757,7 @@ rend_config_services(const or_options_t *options, int validate_only)
client_name, REND_CLIENTNAME_MAX_LEN);
SMARTLIST_FOREACH(clients, char *, cp, tor_free(cp));
smartlist_free(clients);
- goto free_and_return;
+ goto err;
}
client = tor_malloc_zero(sizeof(rend_authorized_client_t));
client->client_name = tor_strdup(client_name);
@@ -875,56 +779,29 @@ rend_config_services(const or_options_t *options, int validate_only)
smartlist_len(service->clients),
service->auth_type == REND_BASIC_AUTH ? 512 : 16,
service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth");
- goto free_and_return;
- }
- } else {
- tor_assert(!strcasecmp(line->key, "HiddenServiceVersion"));
- if (strcmp(line->value, "2")) {
- log_warn(LD_CONFIG,
- "The only supported HiddenServiceVersion is 2.");
- goto free_and_return;
+ goto err;
}
+ continue;
}
}
- /* Validate the last service that we just parsed. */
- if (service &&
- rend_validate_service(rend_service_staging_list, service) < 0) {
- goto free_and_return;
- }
- /* 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(rend_service_staging_list, options,
- service, validate_only) < 0) {
- /* Service object is freed on error so nullify pointer. */
- service = NULL;
- goto free_and_return;
+ /* Validate the service just parsed. */
+ if (rend_validate_service(rend_service_staging_list, service) < 0) {
+ /* Service is in the staging list so don't try to free it. */
+ goto err;
}
- /* The service is in the staging list so nullify pointer to avoid double
- * free of this object in case of error because we lost ownership of it at
- * this point. */
- service = NULL;
- /* Free the newly added services if validating */
- if (validate_only) {
- rv = 0;
- goto free_and_return;
+ /* Add it to the temporary list which we will use to prune our current
+ * list if any after configuring all services. */
+ if (rend_add_service(rend_service_staging_list, service) < 0) {
+ /* The object has been freed on error already. */
+ service = NULL;
+ goto err;
}
- /* 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:
+ err:
rend_service_free(service);
- SMARTLIST_FOREACH(rend_service_staging_list, rend_service_t *, ptr,
- rend_service_free(ptr));
- smartlist_free(rend_service_staging_list);
- rend_service_staging_list = NULL;
- return rv;
+ return -1;
}
/** Add the ephemeral service <b>pk</b>/<b>ports</b> if possible, using
@@ -1013,7 +890,7 @@ int
rend_service_del_ephemeral(const char *service_id)
{
rend_service_t *s;
- if (!rend_valid_service_id(service_id)) {
+ if (!rend_valid_v2_service_id(service_id)) {
log_warn(LD_CONFIG, "Requested malformed Onion Service id for removal.");
return -1;
}
@@ -1170,15 +1047,8 @@ rend_service_update_descriptor(rend_service_t *service)
static char *
rend_service_path(const rend_service_t *service, const char *file_name)
{
- char *file_path = NULL;
-
tor_assert(service->directory);
-
- /* Can never fail: asserts rather than leaving file_path NULL. */
- tor_asprintf(&file_path, "%s%s%s",
- service->directory, PATH_SEPARATOR, file_name);
-
- return file_path;
+ return hs_path_from_filename(service->directory, file_name);
}
/* Allocate and return a string containing the path to the single onion
@@ -1548,9 +1418,9 @@ rend_service_load_keys(rend_service_t *s)
char *fname = NULL;
char buf[128];
- /* Make sure the directory was created and single onion poisoning was
- * checked before calling this function */
- if (BUG(rend_service_check_private_dir(get_options(), s, 0) < 0))
+ /* Create the directory if needed which will also poison it in case of
+ * single onion service. */
+ if (rend_service_check_private_dir(get_options(), s, 1) < 0)
goto err;
/* Load key */
@@ -1808,24 +1678,6 @@ rend_service_get_by_service_id(const char *id)
return NULL;
}
-/** Return 1 if any virtual port in <b>service</b> wants a circuit
- * to have good uptime. Else return 0.
- */
-static int
-rend_service_requires_uptime(rend_service_t *service)
-{
- int i;
- rend_service_port_config_t *p;
-
- for (i=0; i < smartlist_len(service->ports); ++i) {
- p = smartlist_get(service->ports, i);
- if (smartlist_contains_int_as_string(get_options()->LongLivedPorts,
- p->virtual_port))
- return 1;
- }
- return 0;
-}
-
/** Check client authorization of a given <b>descriptor_cookie</b> of
* length <b>cookie_len</b> for <b>service</b>. Return 1 for success
* and 0 for failure. */
@@ -2143,7 +1995,7 @@ rend_service_receive_introduction(origin_circuit_t *circuit,
goto err;
}
- circ_needs_uptime = rend_service_requires_uptime(service);
+ circ_needs_uptime = hs_service_requires_uptime_circ(service->ports);
/* help predict this next time */
rep_hist_note_used_internal(now, circ_needs_uptime, 1);
@@ -2195,7 +2047,9 @@ rend_service_receive_introduction(origin_circuit_t *circuit,
cpath->rend_dh_handshake_state = dh;
dh = NULL;
- if (circuit_init_cpath_crypto(cpath,keys+DIGEST_LEN,1)<0)
+ if (circuit_init_cpath_crypto(cpath,
+ keys+DIGEST_LEN, sizeof(keys)-DIGEST_LEN,
+ 1, 0)<0)
goto err;
memcpy(cpath->rend_circ_nonce, keys, DIGEST_LEN);
@@ -2812,7 +2666,14 @@ rend_service_decrypt_intro(
/* Check that this cell actually matches this service key */
/* first DIGEST_LEN bytes of request is intro or service pk digest */
- crypto_pk_get_digest(key, (char *)key_digest);
+ if (crypto_pk_get_digest(key, (char *)key_digest) < 0) {
+ if (err_msg_out)
+ *err_msg_out = tor_strdup("Couldn't compute RSA digest.");
+ log_warn(LD_BUG, "Couldn't compute key digest.");
+ status = -7;
+ goto err;
+ }
+
if (tor_memneq(key_digest, intro->pk, DIGEST_LEN)) {
if (err_msg_out) {
base32_encode(service_id, REND_SERVICE_ID_LEN_BASE32 + 1,
@@ -2843,10 +2704,8 @@ rend_service_decrypt_intro(
}
/* Decrypt the encrypted part */
-
- note_crypto_pk_op(REND_SERVER);
result =
- crypto_pk_private_hybrid_decrypt(
+ crypto_pk_obsolete_private_hybrid_decrypt(
key, (char *)buf, sizeof(buf),
(const char *)(intro->ciphertext), intro->ciphertext_len,
PK_PKCS1_OAEP_PADDING, 1);
@@ -3040,29 +2899,6 @@ rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc)
tor_assert(oldcirc->base_.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
- /* Don't relaunch the same rend circ twice. */
- if (oldcirc->hs_service_side_rend_circ_has_been_relaunched) {
- log_info(LD_REND, "Rendezvous circuit to %s has already been relaunched; "
- "not relaunching it again.",
- oldcirc->build_state ?
- safe_str(extend_info_describe(oldcirc->build_state->chosen_exit))
- : "*unknown*");
- return;
- }
- oldcirc->hs_service_side_rend_circ_has_been_relaunched = 1;
-
- if (!oldcirc->build_state ||
- oldcirc->build_state->failure_count > MAX_REND_FAILURES ||
- oldcirc->build_state->expiry_time < time(NULL)) {
- log_info(LD_REND,
- "Attempt to build circuit to %s for rendezvous has failed "
- "too many times or expired; giving up.",
- oldcirc->build_state ?
- safe_str(extend_info_describe(oldcirc->build_state->chosen_exit))
- : "*unknown*");
- return;
- }
-
oldstate = oldcirc->build_state;
tor_assert(oldstate);
@@ -3230,10 +3066,11 @@ count_intro_point_circuits(const rend_service_t *service)
crypto material. On success, fill <b>cell_body_out</b> and return the number
of bytes written. On fail, return -1.
*/
-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)
+ssize_t
+rend_service_encode_establish_intro_cell(char *cell_body_out,
+ size_t cell_body_out_len,
+ crypto_pk_t *intro_key,
+ const char *rend_circ_nonce)
{
int retval = -1;
int r;
@@ -3258,7 +3095,6 @@ encode_establish_intro_cell_legacy(char *cell_body_out,
if (crypto_digest(cell_body_out+len, auth, DIGEST_LEN+9))
goto err;
len += 20;
- note_crypto_pk_op(REND_SERVER);
r = crypto_pk_private_sign_digest(intro_key, cell_body_out+len,
cell_body_out_len - len,
cell_body_out, len);
@@ -3371,7 +3207,7 @@ rend_service_intro_has_opened(origin_circuit_t *circuit)
/* Send the ESTABLISH_INTRO cell */
{
ssize_t len;
- len = encode_establish_intro_cell_legacy(buf, sizeof(buf),
+ len = rend_service_encode_establish_intro_cell(buf, sizeof(buf),
circuit->intro_key,
circuit->cpath->prev->rend_circ_nonce);
if (len < 0) {
@@ -4098,10 +3934,9 @@ rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted)
* This is called once a second by the main loop.
*/
void
-rend_consider_services_intro_points(void)
+rend_consider_services_intro_points(time_t now)
{
int i;
- time_t now;
const or_options_t *options = get_options();
/* Are we in single onion mode? */
const int allow_direct = rend_service_allow_non_anonymous_connection(
@@ -4118,7 +3953,6 @@ rend_consider_services_intro_points(void)
exclude_nodes = smartlist_new();
retry_nodes = smartlist_new();
- now = time(NULL);
SMARTLIST_FOREACH_BEGIN(rend_service_list, rend_service_t *, service) {
int r;
@@ -4396,60 +4230,6 @@ rend_service_dump_stats(int severity)
}
}
-#ifdef HAVE_SYS_UN_H
-
-/** Given <b>ports</b>, a smarlist containing rend_service_port_config_t,
- * add the given <b>p</b>, a AF_UNIX port to the list. Return 0 on success
- * else return -ENOSYS if AF_UNIX is not supported (see function in the
- * #else statement below). */
-static int
-add_unix_port(smartlist_t *ports, rend_service_port_config_t *p)
-{
- tor_assert(ports);
- tor_assert(p);
- tor_assert(p->is_unix_addr);
-
- smartlist_add(ports, p);
- return 0;
-}
-
-/** Given <b>conn</b> set it to use the given port <b>p</b> values. Return 0
- * on success else return -ENOSYS if AF_UNIX is not supported (see function
- * in the #else statement below). */
-static int
-set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p)
-{
- tor_assert(conn);
- tor_assert(p);
- tor_assert(p->is_unix_addr);
-
- conn->base_.socket_family = AF_UNIX;
- tor_addr_make_unspec(&conn->base_.addr);
- conn->base_.port = 1;
- conn->base_.address = tor_strdup(p->unix_addr);
- return 0;
-}
-
-#else /* defined(HAVE_SYS_UN_H) */
-
-static int
-set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p)
-{
- (void) conn;
- (void) p;
- return -ENOSYS;
-}
-
-static int
-add_unix_port(smartlist_t *ports, rend_service_port_config_t *p)
-{
- (void) ports;
- (void) p;
- return -ENOSYS;
-}
-
-#endif /* HAVE_SYS_UN_H */
-
/** Given <b>conn</b>, a rendezvous exit stream, look up the hidden service for
* 'circ', and look up the port and address based on conn-\>port.
* Assign the actual conn-\>addr and conn-\>port. Return -2 on failure
@@ -4462,9 +4242,6 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
{
rend_service_t *service;
char serviceid[REND_SERVICE_ID_LEN_BASE32+1];
- smartlist_t *matching_ports;
- rend_service_port_config_t *chosen_port;
- unsigned int warn_once = 0;
const char *rend_pk_digest;
tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED);
@@ -4500,41 +4277,9 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
return service->max_streams_close_circuit ? -2 : -1;
}
}
- matching_ports = smartlist_new();
- SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p,
- {
- if (conn->base_.port != p->virtual_port) {
- continue;
- }
- if (!(p->is_unix_addr)) {
- smartlist_add(matching_ports, p);
- } else {
- if (add_unix_port(matching_ports, p)) {
- if (!warn_once) {
- /* Unix port not supported so warn only once. */
- log_warn(LD_REND,
- "Saw AF_UNIX virtual port mapping for port %d on service "
- "%s, which is unsupported on this platform. Ignoring it.",
- conn->base_.port, serviceid);
- }
- warn_once++;
- }
- }
- });
- chosen_port = smartlist_choose(matching_ports);
- smartlist_free(matching_ports);
- if (chosen_port) {
- if (!(chosen_port->is_unix_addr)) {
- /* Get a non-AF_UNIX connection ready for connection_exit_connect() */
- tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr);
- conn->base_.port = chosen_port->real_port;
- } else {
- if (set_unix_port(conn, chosen_port)) {
- /* Simply impossible to end up here else we were able to add a Unix
- * port without AF_UNIX support... ? */
- tor_assert(0);
- }
- }
+
+ if (hs_set_conn_addr_port(service->ports, conn) == 0) {
+ /* Successfully set the port to the connection. We are done. */
return 0;
}
diff --git a/src/or/rendservice.h b/src/or/rendservice.h
index 1583a6010b..ed1044f04a 100644
--- a/src/or/rendservice.h
+++ b/src/or/rendservice.h
@@ -13,11 +13,9 @@
#define TOR_RENDSERVICE_H
#include "or.h"
+#include "hs_service.h"
typedef struct rend_intro_cell_s rend_intro_cell_t;
-typedef struct rend_service_port_config_s rend_service_port_config_t;
-
-#ifdef RENDSERVICE_PRIVATE
/* This can be used for both INTRODUCE1 and INTRODUCE2 */
@@ -63,6 +61,8 @@ struct rend_intro_cell_s {
uint8_t dh[DH_KEY_LEN];
};
+#ifdef RENDSERVICE_PRIVATE
+
/** Represents a single hidden service running at this OP. */
typedef struct rend_service_t {
/* Fields specified in config file */
@@ -119,20 +119,12 @@ typedef struct rend_service_t {
STATIC void rend_service_free(rend_service_t *service);
STATIC char *rend_service_sos_poison_path(const rend_service_t *service);
-STATIC int rend_service_check_dir_and_add(smartlist_t *service_list,
- const or_options_t *options,
- rend_service_t *service,
- int validate_only);
STATIC int rend_service_verify_single_onion_poison(
const rend_service_t *s,
const or_options_t *options);
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);
#ifdef TOR_UNIT_TESTS
STATIC void set_rend_service_list(smartlist_t *new_list);
@@ -143,13 +135,16 @@ STATIC void rend_service_prune_list_impl_(void);
#endif /* RENDSERVICE_PRIVATE */
-int num_rend_services(void);
-int rend_config_services(const or_options_t *options, int validate_only);
+int rend_num_services(void);
+int rend_config_service(const config_line_t *line_,
+ const or_options_t *options,
+ hs_service_config_t *config);
void rend_service_prune_list(void);
+void rend_service_free_staging_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);
-void rend_consider_services_intro_points(void);
+void rend_consider_services_intro_points(time_t now);
void rend_consider_services_upload(time_t now);
void rend_hsdir_routers_changed(void);
void rend_consider_descriptor_republication(void);
@@ -172,6 +167,10 @@ rend_intro_cell_t * rend_service_begin_parse_intro(const uint8_t *request,
char **err_msg_out);
int rend_service_parse_intro_plaintext(rend_intro_cell_t *intro,
char **err_msg_out);
+ssize_t rend_service_encode_establish_intro_cell(char *cell_body_out,
+ size_t cell_body_out_len,
+ crypto_pk_t *intro_key,
+ const char *rend_circ_nonce);
int rend_service_validate_intro_late(const rend_intro_cell_t *intro,
char **err_msg_out);
void rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc);
@@ -179,6 +178,7 @@ int rend_service_set_connection_addr_port(edge_connection_t *conn,
origin_circuit_t *circ);
void rend_service_dump_stats(int severity);
void rend_service_free_all(void);
+void rend_service_init(void);
rend_service_port_config_t *rend_service_parse_port_config(const char *string,
const char *sep,
diff --git a/src/or/rephist.c b/src/or/rephist.c
index 72a5cc5a9b..ae45c5023a 100644
--- a/src/or/rephist.c
+++ b/src/or/rephist.c
@@ -2064,105 +2064,6 @@ rep_hist_circbuilding_dormant(time_t now)
return 1;
}
-/** Structure to track how many times we've done each public key operation. */
-static struct {
- /** How many directory objects have we signed? */
- unsigned long n_signed_dir_objs;
- /** How many routerdescs have we signed? */
- unsigned long n_signed_routerdescs;
- /** How many directory objects have we verified? */
- unsigned long n_verified_dir_objs;
- /** How many routerdescs have we verified */
- unsigned long n_verified_routerdescs;
- /** How many onionskins have we encrypted to build circuits? */
- unsigned long n_onionskins_encrypted;
- /** How many onionskins have we decrypted to do circuit build requests? */
- unsigned long n_onionskins_decrypted;
- /** How many times have we done the TLS handshake as a client? */
- unsigned long n_tls_client_handshakes;
- /** How many times have we done the TLS handshake as a server? */
- unsigned long n_tls_server_handshakes;
- /** How many PK operations have we done as a hidden service client? */
- unsigned long n_rend_client_ops;
- /** How many PK operations have we done as a hidden service midpoint? */
- unsigned long n_rend_mid_ops;
- /** How many PK operations have we done as a hidden service provider? */
- unsigned long n_rend_server_ops;
-} pk_op_counts = {0,0,0,0,0,0,0,0,0,0,0};
-
-/** Increment the count of the number of times we've done <b>operation</b>. */
-void
-note_crypto_pk_op(pk_op_t operation)
-{
- switch (operation)
- {
- case SIGN_DIR:
- pk_op_counts.n_signed_dir_objs++;
- break;
- case SIGN_RTR:
- pk_op_counts.n_signed_routerdescs++;
- break;
- case VERIFY_DIR:
- pk_op_counts.n_verified_dir_objs++;
- break;
- case VERIFY_RTR:
- pk_op_counts.n_verified_routerdescs++;
- break;
- case ENC_ONIONSKIN:
- pk_op_counts.n_onionskins_encrypted++;
- break;
- case DEC_ONIONSKIN:
- pk_op_counts.n_onionskins_decrypted++;
- break;
- case TLS_HANDSHAKE_C:
- pk_op_counts.n_tls_client_handshakes++;
- break;
- case TLS_HANDSHAKE_S:
- pk_op_counts.n_tls_server_handshakes++;
- break;
- case REND_CLIENT:
- pk_op_counts.n_rend_client_ops++;
- break;
- case REND_MID:
- pk_op_counts.n_rend_mid_ops++;
- break;
- case REND_SERVER:
- pk_op_counts.n_rend_server_ops++;
- break;
- default:
- log_warn(LD_BUG, "Unknown pk operation %d", operation);
- }
-}
-
-/** Log the number of times we've done each public/private-key operation. */
-void
-dump_pk_ops(int severity)
-{
- tor_log(severity, LD_HIST,
- "PK operations: %lu directory objects signed, "
- "%lu directory objects verified, "
- "%lu routerdescs signed, "
- "%lu routerdescs verified, "
- "%lu onionskins encrypted, "
- "%lu onionskins decrypted, "
- "%lu client-side TLS handshakes, "
- "%lu server-side TLS handshakes, "
- "%lu rendezvous client operations, "
- "%lu rendezvous middle operations, "
- "%lu rendezvous server operations.",
- pk_op_counts.n_signed_dir_objs,
- pk_op_counts.n_verified_dir_objs,
- pk_op_counts.n_signed_routerdescs,
- pk_op_counts.n_verified_routerdescs,
- pk_op_counts.n_onionskins_encrypted,
- pk_op_counts.n_onionskins_decrypted,
- pk_op_counts.n_tls_client_handshakes,
- pk_op_counts.n_tls_server_handshakes,
- pk_op_counts.n_rend_client_ops,
- pk_op_counts.n_rend_mid_ops,
- pk_op_counts.n_rend_server_ops);
-}
-
/*** Exit port statistics ***/
/* Some constants */
@@ -2651,7 +2552,7 @@ rep_hist_format_buffer_stats(time_t now)
processed_cells_string,
queued_cells_string,
time_in_queue_string,
- (number_of_circuits + SHARES - 1) / SHARES);
+ CEIL_DIV(number_of_circuits, SHARES));
tor_free(processed_cells_string);
tor_free(queued_cells_string);
tor_free(time_in_queue_string);
diff --git a/src/or/rephist.h b/src/or/rephist.h
index 2b1c2e7ec7..8f6d46616d 100644
--- a/src/or/rephist.h
+++ b/src/or/rephist.h
@@ -62,9 +62,6 @@ int any_predicted_circuits(time_t now);
int rep_hist_circbuilding_dormant(time_t now);
int predicted_ports_prediction_time_remaining(time_t now);
-void note_crypto_pk_op(pk_op_t operation);
-void dump_pk_ops(int severity);
-
void rep_hist_exit_stats_init(time_t now);
void rep_hist_reset_exit_stats(time_t now);
void rep_hist_exit_stats_term(void);
diff --git a/src/or/router.c b/src/or/router.c
index 2187a76b48..c8e78659c0 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -257,7 +257,11 @@ set_server_identity_key(crypto_pk_t *k)
{
crypto_pk_free(server_identitykey);
server_identitykey = k;
- crypto_pk_get_digest(server_identitykey, server_identitykey_digest);
+ if (crypto_pk_get_digest(server_identitykey,
+ server_identitykey_digest) < 0) {
+ log_err(LD_BUG, "Couldn't compute our own identity key digest.");
+ tor_assert(0);
+ }
}
/** Make sure that we have set up our identity keys to match or not match as
@@ -956,8 +960,12 @@ init_keys(void)
}
cert = get_my_v3_authority_cert();
if (cert) {
- crypto_pk_get_digest(get_my_v3_authority_cert()->identity_key,
- v3_digest);
+ if (crypto_pk_get_digest(get_my_v3_authority_cert()->identity_key,
+ v3_digest) < 0) {
+ log_err(LD_BUG, "Couldn't compute my v3 authority identity key "
+ "digest.");
+ return -1;
+ }
v3_digest_set = 1;
}
}
@@ -1065,7 +1073,7 @@ init_keys(void)
/* 4. Build our router descriptor. */
/* Must be called after keys are initialized. */
mydesc = router_get_my_descriptor();
- if (authdir_mode_handles_descs(options, ROUTER_PURPOSE_GENERAL)) {
+ if (authdir_mode_v3(options)) {
const char *m = NULL;
routerinfo_t *ri;
/* We need to add our own fingerprint so it gets recognized. */
@@ -1596,32 +1604,19 @@ authdir_mode_v3(const or_options_t *options)
{
return authdir_mode(options) && options->V3AuthoritativeDir != 0;
}
-/** Return true iff we are a v3 directory authority. */
-int
-authdir_mode_any_main(const or_options_t *options)
-{
- return options->V3AuthoritativeDir;
-}
-/** Return true if we believe ourselves to be any kind of
- * authoritative directory beyond just a hidserv authority. */
-int
-authdir_mode_any_nonhidserv(const or_options_t *options)
-{
- return options->BridgeAuthoritativeDir ||
- authdir_mode_any_main(options);
-}
/** Return true iff we are an authoritative directory server that is
* authoritative about receiving and serving descriptors of type
- * <b>purpose</b> on its dirport. Use -1 for "any purpose". */
+ * <b>purpose</b> on its dirport.
+ */
int
authdir_mode_handles_descs(const or_options_t *options, int purpose)
{
- if (purpose < 0)
- return authdir_mode_any_nonhidserv(options);
+ if (BUG(purpose < 0)) /* Deprecated. */
+ return authdir_mode(options);
else if (purpose == ROUTER_PURPOSE_GENERAL)
- return authdir_mode_any_main(options);
+ return authdir_mode_v3(options);
else if (purpose == ROUTER_PURPOSE_BRIDGE)
- return (options->BridgeAuthoritativeDir);
+ return authdir_mode_bridge(options);
else
return 0;
}
@@ -1633,7 +1628,7 @@ authdir_mode_publishes_statuses(const or_options_t *options)
{
if (authdir_mode_bridge(options))
return 0;
- return authdir_mode_any_nonhidserv(options);
+ return authdir_mode(options);
}
/** Return true iff we are an authoritative directory server that
* tests reachability of the descriptors it learns about.
@@ -1641,7 +1636,7 @@ authdir_mode_publishes_statuses(const or_options_t *options)
int
authdir_mode_tests_reachability(const or_options_t *options)
{
- return authdir_mode_handles_descs(options, -1);
+ return authdir_mode(options);
}
/** Return true iff we believe ourselves to be a bridge authoritative
* directory server.
@@ -1869,7 +1864,7 @@ static const char *desc_gen_reason = NULL;
* now. */
static time_t desc_clean_since = 0;
/** Why did we mark the descriptor dirty? */
-static const char *desc_dirty_reason = NULL;
+static const char *desc_dirty_reason = "Tor just started";
/** Boolean: do we need to regenerate the above? */
static int desc_needs_upload = 0;
@@ -3022,7 +3017,6 @@ router_dump_router_to_string(routerinfo_t *router,
crypto_digest_smartlist(digest, DIGEST_LEN, chunks, "", DIGEST_SHA1);
- note_crypto_pk_op(SIGN_RTR);
{
char *sig;
if (!(sig = router_get_dirobj_signature(digest, DIGEST_LEN, ident_key))) {
diff --git a/src/or/router.h b/src/or/router.h
index 9c5def5218..97f331713a 100644
--- a/src/or/router.h
+++ b/src/or/router.h
@@ -54,8 +54,6 @@ int net_is_disabled(void);
int authdir_mode(const or_options_t *options);
int authdir_mode_v3(const or_options_t *options);
-int authdir_mode_any_main(const or_options_t *options);
-int authdir_mode_any_nonhidserv(const or_options_t *options);
int authdir_mode_handles_descs(const or_options_t *options, int purpose);
int authdir_mode_publishes_statuses(const or_options_t *options);
int authdir_mode_tests_reachability(const or_options_t *options);
diff --git a/src/or/routerkeys.c b/src/or/routerkeys.c
index 71889d2721..4822ff3be3 100644
--- a/src/or/routerkeys.c
+++ b/src/or/routerkeys.c
@@ -1136,6 +1136,108 @@ init_mock_ed_keys(const crypto_pk_t *rsa_identity_key)
#undef MAKECERT
#endif
+/**
+ * Print the ISO8601-formated <b>expiration</b> for a certificate with
+ * some <b>description</b> to stdout.
+ *
+ * For example, for a signing certificate, this might print out:
+ * signing-cert-expiry: 2017-07-25 08:30:15 UTC
+ */
+static void
+print_cert_expiration(const char *expiration,
+ const char *description)
+{
+ fprintf(stderr, "%s-cert-expiry: %s\n", description, expiration);
+}
+
+/**
+ * Log when a certificate, <b>cert</b>, with some <b>description</b> and
+ * stored in a file named <b>fname</b>, is going to expire.
+ */
+static void
+log_ed_cert_expiration(const tor_cert_t *cert,
+ const char *description,
+ const char *fname) {
+ char expiration[ISO_TIME_LEN+1];
+
+ if (BUG(!cert)) { /* If the specified key hasn't been loaded */
+ log_warn(LD_OR, "No %s key loaded; can't get certificate expiration.",
+ description);
+ } else {
+ format_local_iso_time(expiration, cert->valid_until);
+ log_notice(LD_OR, "The %s certificate stored in %s is valid until %s.",
+ description, fname, expiration);
+ print_cert_expiration(expiration, description);
+ }
+}
+
+/**
+ * Log when our master signing key certificate expires. Used when tor is given
+ * the --key-expiration command-line option.
+ *
+ * Returns 0 on success and 1 on failure.
+ */
+static int
+log_master_signing_key_cert_expiration(const or_options_t *options)
+{
+ const tor_cert_t *signing_key;
+ char *fn = NULL;
+ int failed = 0;
+ time_t now = approx_time();
+
+ fn = options_get_datadir_fname2(options, "keys", "ed25519_signing_cert");
+
+ /* Try to grab our cached copy of the key. */
+ signing_key = get_master_signing_key_cert();
+
+ tor_assert(server_identity_key_is_set());
+
+ /* Load our keys from disk, if necessary. */
+ if (!signing_key) {
+ failed = load_ed_keys(options, now) < 0;
+ signing_key = get_master_signing_key_cert();
+ }
+
+ /* If we do have a signing key, log the expiration time. */
+ if (signing_key) {
+ log_ed_cert_expiration(signing_key, "signing", fn);
+ } else {
+ log_warn(LD_OR, "Could not load signing key certificate from %s, so " \
+ "we couldn't learn anything about certificate expiration.", fn);
+ }
+
+ tor_free(fn);
+
+ return failed;
+}
+
+/**
+ * Log when a key certificate expires. Used when tor is given the
+ * --key-expiration command-line option.
+ *
+ * If an command argument is given, which should specify the type of
+ * key to get expiry information about (currently supported arguments
+ * are "sign"), get info about that type of certificate. Otherwise,
+ * print info about the supported arguments.
+ *
+ * Returns 0 on success and -1 on failure.
+ */
+int
+log_cert_expiration(void)
+{
+ const or_options_t *options = get_options();
+ const char *arg = options->command_arg;
+
+ if (!strcmp(arg, "sign")) {
+ return log_master_signing_key_cert_expiration(options);
+ } else {
+ fprintf(stderr, "No valid argument to --key-expiration found!\n");
+ fprintf(stderr, "Currently recognised arguments are: 'sign'\n");
+
+ return -1;
+ }
+}
+
const ed25519_public_key_t *
get_master_identity_key(void)
{
@@ -1236,7 +1338,9 @@ make_tap_onion_key_crosscert(const crypto_pk_t *onion_key,
uint8_t signed_data[DIGEST_LEN + ED25519_PUBKEY_LEN];
*len_out = 0;
- crypto_pk_get_digest(rsa_id_key, (char*)signed_data);
+ if (crypto_pk_get_digest(rsa_id_key, (char*)signed_data) < 0) {
+ return NULL;
+ }
memcpy(signed_data + DIGEST_LEN, master_id_key->pubkey, ED25519_PUBKEY_LEN);
int r = crypto_pk_private_sign(onion_key,
diff --git a/src/or/routerkeys.h b/src/or/routerkeys.h
index c10cf32a71..0cf13e7600 100644
--- a/src/or/routerkeys.h
+++ b/src/or/routerkeys.h
@@ -63,6 +63,7 @@ MOCK_DECL(int, check_tap_onion_key_crosscert,(const uint8_t *crosscert,
const ed25519_public_key_t *master_id_pkey,
const uint8_t *rsa_id_digest));
+int log_cert_expiration(void);
int load_ed_keys(const or_options_t *options, time_t now);
int should_make_new_ed_keys(const or_options_t *options, const time_t now);
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 0e45f63f70..9894019476 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -4971,8 +4971,9 @@ max_dl_per_request(const or_options_t *options, int purpose)
}
/** Don't split our requests so finely that we are requesting fewer than
- * this number per server. */
-#define MIN_DL_PER_REQUEST 4
+ * this number per server. (Grouping more than this at once leads to
+ * diminishing returns.) */
+#define MIN_DL_PER_REQUEST 32
/** To prevent a single screwy cache from confusing us by selective reply,
* try to split our requests into at least this many requests. */
#define MIN_REQUESTS 3
@@ -5033,7 +5034,7 @@ launch_descriptor_downloads(int purpose,
}
}
- if (!authdir_mode_any_nonhidserv(options)) {
+ if (!authdir_mode(options)) {
/* If we wind up going to the authorities, we want to only open one
* connection to each authority at a time, so that we don't overload
* them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH
@@ -5055,8 +5056,9 @@ launch_descriptor_downloads(int purpose,
if (n_per_request > max_dl_per_req)
n_per_request = max_dl_per_req;
- if (n_per_request < MIN_DL_PER_REQUEST)
- n_per_request = MIN_DL_PER_REQUEST;
+ if (n_per_request < MIN_DL_PER_REQUEST) {
+ n_per_request = MIN(MIN_DL_PER_REQUEST, n_downloadable);
+ }
if (n_downloadable > n_per_request)
req_plural = rtr_plural = "s";
@@ -5164,7 +5166,7 @@ update_consensus_router_descriptor_downloads(time_t now, int is_vote,
smartlist_add(downloadable, rs->descriptor_digest);
} SMARTLIST_FOREACH_END(rsp);
- if (!authdir_mode_handles_descs(options, ROUTER_PURPOSE_GENERAL)
+ if (!authdir_mode_v3(options)
&& smartlist_len(no_longer_old)) {
routerlist_t *rl = router_get_routerlist();
log_info(LD_DIR, "%d router descriptors listed in consensus are "
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index 0f6113ccfc..9c11f4d07f 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -1996,7 +1996,6 @@ router_parse_entry_from_string(const char *s, const char *end,
}
tok = find_by_keyword(tokens, K_ROUTER_SIGNATURE);
- note_crypto_pk_op(VERIFY_RTR);
#ifdef COUNT_DISTINCT_DIGESTS
if (!verified_digests)
verified_digests = digestmap_new();
@@ -2231,7 +2230,6 @@ extrainfo_parse_entry_from_string(const char *s, const char *end,
}
if (key) {
- note_crypto_pk_op(VERIFY_RTR);
if (check_signature_token(digest, DIGEST_LEN, tok, key, 0,
"extra-info") < 0)
goto err;
@@ -2708,7 +2706,8 @@ routerstatus_parse_entry_from_string(memarea_t *area,
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);
+ protocol_list_supports_protocol(tok->args[0], PRT_HSDIR,
+ PROTOVER_HSDIR_V3);
}
if ((tok = find_opt_by_keyword(tokens, K_V))) {
tor_assert(tok->n_args == 1);
@@ -2720,6 +2719,12 @@ routerstatus_parse_entry_from_string(memarea_t *area,
tor_version_as_new_as(tok->args[0], "0.2.4.8-alpha");
rs->protocols_known = 1;
}
+ if (!strcmpstart(tok->args[0], "Tor ") && found_protocol_list) {
+ /* Bug #22447 forces us to filter on this version. */
+ if (!tor_version_as_new_as(tok->args[0], "0.3.0.8")) {
+ rs->supports_v3_hsdir = 0;
+ }
+ }
if (vote_rs) {
vote_rs->version = tor_strdup(tok->args[0]);
}
@@ -2856,7 +2861,6 @@ compare_vote_routerstatus_entries(const void **_a, const void **_b)
int
networkstatus_verify_bw_weights(networkstatus_t *ns, int consensus_method)
{
- int64_t weight_scale;
int64_t G=0, M=0, E=0, D=0, T=0;
double Wgg, Wgm, Wgd, Wmg, Wmm, Wme, Wmd, Weg, Wem, Wee, Wed;
double Gtotal=0, Mtotal=0, Etotal=0;
@@ -2864,7 +2868,8 @@ networkstatus_verify_bw_weights(networkstatus_t *ns, int consensus_method)
int valid = 1;
(void) consensus_method;
- weight_scale = networkstatus_get_weight_scale_param(ns);
+ const int64_t weight_scale = networkstatus_get_weight_scale_param(ns);
+ tor_assert(weight_scale >= 1);
Wgg = networkstatus_get_bw_weight(ns, "Wgg", -1);
Wgm = networkstatus_get_bw_weight(ns, "Wgm", -1);
Wgd = networkstatus_get_bw_weight(ns, "Wgd", -1);
@@ -3360,8 +3365,8 @@ extract_shared_random_srvs(networkstatus_t *ns, smartlist_t *tokens)
voter_identity = "consensus";
}
- /* We extract both and on error, everything is stopped because it means
- * the votes is malformed for the shared random value(s). */
+ /* We extract both, and on error everything is stopped because it means
+ * the vote is malformed for the shared random value(s). */
if (extract_one_srv(tokens, K_PREVIOUS_SRV, &ns->sr_info.previous_srv) < 0) {
log_warn(LD_DIR, "SR: Unable to parse previous SRV from %s",
voter_identity);
@@ -5288,12 +5293,14 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
}
/* Parse and verify signature. */
tok = find_by_keyword(tokens, R_SIGNATURE);
- note_crypto_pk_op(VERIFY_RTR);
if (check_signature_token(desc_hash, DIGEST_LEN, tok, result->pk, 0,
"v2 rendezvous service descriptor") < 0)
goto err;
/* Verify that descriptor ID belongs to public key and secret ID part. */
- crypto_pk_get_digest(result->pk, public_key_hash);
+ if (crypto_pk_get_digest(result->pk, public_key_hash) < 0) {
+ log_warn(LD_REND, "Unable to compute rend descriptor public key digest");
+ goto err;
+ }
rend_get_descriptor_id_bytes(test_desc_id, public_key_hash,
secret_id_part);
if (tor_memneq(desc_id_out, test_desc_id, DIGEST_LEN)) {
diff --git a/src/or/scheduler.c b/src/or/scheduler.c
index fac545fba7..0d31c7d58c 100644
--- a/src/or/scheduler.c
+++ b/src/or/scheduler.c
@@ -282,7 +282,7 @@ scheduler_channel_doesnt_want_writes,(channel_t *chan))
*/
smartlist_pqueue_remove(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx),
+ offsetof(channel_t, sched_heap_idx),
chan);
chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE;
log_debug(LD_SCHED,
@@ -324,7 +324,7 @@ scheduler_channel_has_waiting_cells,(channel_t *chan))
chan->scheduler_state = SCHED_CHAN_PENDING;
smartlist_pqueue_add(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx),
+ offsetof(channel_t, sched_heap_idx),
chan);
log_debug(LD_SCHED,
"Channel " U64_FORMAT " at %p went from waiting_for_cells "
@@ -400,7 +400,7 @@ scheduler_release_channel,(channel_t *chan))
if (chan->scheduler_state == SCHED_CHAN_PENDING) {
smartlist_pqueue_remove(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx),
+ offsetof(channel_t, sched_heap_idx),
chan);
}
@@ -430,7 +430,7 @@ scheduler_run, (void))
/* Pop off a channel */
chan = smartlist_pqueue_pop(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx));
+ offsetof(channel_t, sched_heap_idx));
tor_assert(chan);
/* Figure out how many cells we can write */
@@ -531,7 +531,7 @@ scheduler_run, (void))
readd_chan->scheduler_state = SCHED_CHAN_PENDING;
smartlist_pqueue_add(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx),
+ offsetof(channel_t, sched_heap_idx),
readd_chan);
} SMARTLIST_FOREACH_END(readd_chan);
smartlist_free(to_readd);
@@ -581,7 +581,7 @@ scheduler_channel_wants_writes(channel_t *chan)
*/
smartlist_pqueue_add(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx),
+ offsetof(channel_t, sched_heap_idx),
chan);
chan->scheduler_state = SCHED_CHAN_PENDING;
log_debug(LD_SCHED,
@@ -624,11 +624,11 @@ scheduler_touch_channel(channel_t *chan)
/* Remove and re-add it */
smartlist_pqueue_remove(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx),
+ offsetof(channel_t, sched_heap_idx),
chan);
smartlist_pqueue_add(channels_pending,
scheduler_compare_channels,
- STRUCT_OFFSET(channel_t, sched_heap_idx),
+ offsetof(channel_t, sched_heap_idx),
chan);
}
/* else no-op, since it isn't in the queue */
diff --git a/src/or/shared_random.c b/src/or/shared_random.c
index 25ca0611cd..e4ee64139a 100644
--- a/src/or/shared_random.c
+++ b/src/or/shared_random.c
@@ -1390,6 +1390,52 @@ sr_get_previous_for_control(void)
return srv_str;
}
+/* Return current shared random value from the latest consensus. Caller can
+ * NOT keep a reference to the returned pointer. Return NULL if none. */
+const sr_srv_t *
+sr_get_current(const networkstatus_t *ns)
+{
+ const networkstatus_t *consensus;
+
+ /* Use provided ns else get a live one */
+ if (ns) {
+ consensus = ns;
+ } else {
+ consensus = networkstatus_get_live_consensus(approx_time());
+ }
+ /* Ideally we would never be asked for an SRV without a live consensus. Make
+ * sure this assumption is correct. */
+ tor_assert_nonfatal(consensus);
+
+ if (consensus) {
+ return consensus->sr_info.current_srv;
+ }
+ return NULL;
+}
+
+/* Return previous shared random value from the latest consensus. Caller can
+ * NOT keep a reference to the returned pointer. Return NULL if none. */
+const sr_srv_t *
+sr_get_previous(const networkstatus_t *ns)
+{
+ const networkstatus_t *consensus;
+
+ /* Use provided ns else get a live one */
+ if (ns) {
+ consensus = ns;
+ } else {
+ consensus = networkstatus_get_live_consensus(approx_time());
+ }
+ /* Ideally we would never be asked for an SRV without a live consensus. Make
+ * sure this assumption is correct. */
+ tor_assert_nonfatal(consensus);
+
+ if (consensus) {
+ return consensus->sr_info.previous_srv;
+ }
+ return NULL;
+}
+
#ifdef TOR_UNIT_TESTS
/* Set the global value of number of SRV agreements so the test can play
diff --git a/src/or/shared_random.h b/src/or/shared_random.h
index 1f027c70e0..76d5b95422 100644
--- a/src/or/shared_random.h
+++ b/src/or/shared_random.h
@@ -130,6 +130,9 @@ sr_commit_t *sr_generate_our_commit(time_t timestamp,
char *sr_get_current_for_control(void);
char *sr_get_previous_for_control(void);
+const sr_srv_t *sr_get_current(const networkstatus_t *ns);
+const sr_srv_t *sr_get_previous(const networkstatus_t *ns);
+
#ifdef SHARED_RANDOM_PRIVATE
/* Encode */
diff --git a/src/or/shared_random_state.c b/src/or/shared_random_state.c
index 89d2e8d7f6..5fcf88cc4a 100644
--- a/src/or/shared_random_state.c
+++ b/src/or/shared_random_state.c
@@ -42,7 +42,7 @@ static const char dstate_cur_srv_key[] = "SharedRandCurrentValue";
/* These next two are duplicates or near-duplicates from config.c */
#define VAR(name, conftype, member, initvalue) \
- { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(sr_disk_state_t, member), \
+ { name, CONFIG_TYPE_ ## conftype, offsetof(sr_disk_state_t, member), \
initvalue }
/* As VAR, but the option name and member name are the same. */
#define V(member, conftype, initvalue) \
@@ -77,14 +77,14 @@ static config_var_t state_vars[] = {
* lets us preserve options from versions of Tor newer than us. */
static config_var_t state_extra_var = {
"__extra", CONFIG_TYPE_LINELIST,
- STRUCT_OFFSET(sr_disk_state_t, ExtraLines), NULL
+ offsetof(sr_disk_state_t, ExtraLines), NULL
};
/* Configuration format of sr_disk_state_t. */
static const config_format_t state_format = {
sizeof(sr_disk_state_t),
SR_DISK_STATE_MAGIC,
- STRUCT_OFFSET(sr_disk_state_t, magic_),
+ offsetof(sr_disk_state_t, magic_),
NULL,
NULL,
state_vars,
@@ -133,13 +133,13 @@ get_voting_interval(void)
/* Given the time <b>now</b>, return the start time of the current round of
* the SR protocol. For example, if it's 23:47:08, the current round thus
* started at 23:47:00 for a voting interval of 10 seconds. */
-static time_t
+STATIC time_t
get_start_time_of_current_round(time_t now)
{
const or_options_t *options = get_options();
int voting_interval = get_voting_interval();
voting_schedule_t *new_voting_schedule =
- get_voting_schedule(options, now, LOG_INFO);
+ get_voting_schedule(options, now, LOG_DEBUG);
tor_assert(new_voting_schedule);
/* First, get the start time of the next round */
@@ -156,6 +156,42 @@ get_start_time_of_current_round(time_t now)
return curr_start;
}
+/** Return the start time of the current SR protocol run. For example, if the
+ * time is 23/06/2017 23:47:08 and a full SR protocol run is 24 hours, this
+ * function should return 23/06/2017 00:00:00. */
+time_t
+sr_state_get_start_time_of_current_protocol_run(time_t now)
+{
+ int total_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES;
+ int voting_interval = get_voting_interval();
+ /* Find the time the current round started. */
+ time_t beginning_of_current_round = get_start_time_of_current_round(now);
+
+ /* Get current SR protocol round */
+ int current_round = (now / voting_interval) % total_rounds;
+
+ /* Get start time by subtracting the time elapsed from the beginning of the
+ protocol run */
+ time_t time_elapsed_since_start_of_run = current_round * voting_interval;
+ return beginning_of_current_round - time_elapsed_since_start_of_run;
+}
+
+/** Return the time (in seconds) it takes to complete a full SR protocol phase
+ * (e.g. the commit phase). */
+unsigned int
+sr_state_get_phase_duration(void)
+{
+ return SHARED_RANDOM_N_ROUNDS * get_voting_interval();
+}
+
+/** Return the time (in seconds) it takes to complete a full SR protocol run */
+unsigned int
+sr_state_get_protocol_run_duration(void)
+{
+ int total_protocol_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES;
+ return total_protocol_rounds * get_voting_interval();
+}
+
/* Return the time we should expire the state file created at <b>now</b>.
* We expire the state file in the beginning of the next protocol run. */
STATIC time_t
diff --git a/src/or/shared_random_state.h b/src/or/shared_random_state.h
index 3526ad47d3..837fa75392 100644
--- a/src/or/shared_random_state.h
+++ b/src/or/shared_random_state.h
@@ -121,11 +121,16 @@ int sr_state_is_initialized(void);
void sr_state_save(void);
void sr_state_free(void);
+time_t sr_state_get_start_time_of_current_protocol_run(time_t now);
+unsigned int sr_state_get_phase_duration(void);
+unsigned int sr_state_get_protocol_run_duration(void);
+
#ifdef SHARED_RANDOM_STATE_PRIVATE
STATIC int disk_state_load_from_disk_impl(const char *fname);
STATIC sr_phase_t get_sr_protocol_phase(time_t valid_after);
+STATIC time_t get_start_time_of_current_round(time_t now);
STATIC time_t get_state_valid_until_time(time_t now);
STATIC const char *get_phase_str(sr_phase_t phase);
diff --git a/src/or/statefile.c b/src/or/statefile.c
index d0606b3012..18111771da 100644
--- a/src/or/statefile.c
+++ b/src/or/statefile.c
@@ -55,7 +55,7 @@ static config_abbrev_t state_abbrevs_[] = {
/*XXXX these next two are duplicates or near-duplicates from config.c */
#define VAR(name,conftype,member,initvalue) \
- { name, CONFIG_TYPE_ ## conftype, STRUCT_OFFSET(or_state_t, member), \
+ { name, CONFIG_TYPE_ ## conftype, offsetof(or_state_t, member), \
initvalue }
/** As VAR, but the option name and member name are the same. */
#define V(member,conftype,initvalue) \
@@ -85,6 +85,8 @@ static config_var_t state_vars_[] = {
VAR("TransportProxy", LINELIST_S, TransportProxies, NULL),
V(TransportProxies, LINELIST_V, NULL),
+ V(HidServRevCounter, LINELIST, NULL),
+
V(BWHistoryReadEnds, ISOTIME, NULL),
V(BWHistoryReadInterval, UINT, "900"),
V(BWHistoryReadValues, CSV, ""),
@@ -131,14 +133,14 @@ static int or_state_validate_cb(void *old_options, void *options,
/** "Extra" variable in the state that receives lines we can't parse. This
* lets us preserve options from versions of Tor newer than us. */
static config_var_t state_extra_var = {
- "__extra", CONFIG_TYPE_LINELIST, STRUCT_OFFSET(or_state_t, ExtraLines), NULL
+ "__extra", CONFIG_TYPE_LINELIST, offsetof(or_state_t, ExtraLines), NULL
};
/** Configuration format for or_state_t. */
static const config_format_t state_format = {
sizeof(or_state_t),
OR_STATE_MAGIC,
- STRUCT_OFFSET(or_state_t, magic_),
+ offsetof(or_state_t, magic_),
state_abbrevs_,
NULL,
state_vars_,
diff --git a/src/or/torcert.c b/src/or/torcert.c
index 658e620ca5..69b157446a 100644
--- a/src/or/torcert.c
+++ b/src/or/torcert.c
@@ -393,7 +393,7 @@ rsa_ed25519_crosscert_check(const uint8_t *crosscert,
}
const uint32_t expiration_date = rsa_ed_crosscert_get_expiration(cc);
- const uint64_t expiration_time = expiration_date * 3600;
+ const uint64_t expiration_time = ((uint64_t)expiration_date) * 3600;
if (reject_if_expired_before < 0 ||
expiration_time < (uint64_t)reject_if_expired_before) {
diff --git a/src/rust/tor_util/include.am b/src/rust/tor_util/include.am
index f0cd63920c..ec3898577b 100644
--- a/src/rust/tor_util/include.am
+++ b/src/rust/tor_util/include.am
@@ -4,7 +4,7 @@ EXTRA_DIST +=\
src/rust/tor_util/ffi.rs \
src/rust/tor_util/rust_string.rs
-src/rust/target/release/libtor_util.a: FORCE
+src/rust/target/release/@TOR_RUST_UTIL_STATIC_NAME@: FORCE
( cd "$(abs_top_srcdir)/src/rust/tor_util" ; \
CARGO_TARGET_DIR="$(abs_top_builddir)/src/rust/target" \
CARGO_HOME="$(abs_top_builddir)/src/rust" \
diff --git a/src/test/ed25519_exts_ref.py b/src/test/ed25519_exts_ref.py
index af5010415e..f84d3002d3 100644
--- a/src/test/ed25519_exts_ref.py
+++ b/src/test/ed25519_exts_ref.py
@@ -32,8 +32,7 @@ def curve25519ToEd25519(c, sign):
return encodepoint([x,y])
def blindESK(esk, param):
- h = H("Derive temporary signing key" + param)
- mult = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2))
+ mult = 2**(b-2) + sum(2**i * bit(param,i) for i in range(3,b-2))
s = decodeint(esk[:32])
s_prime = (s * mult) % ell
k = esk[32:]
@@ -42,8 +41,7 @@ def blindESK(esk, param):
return encodeint(s_prime) + k_prime
def blindPK(pk, param):
- h = H("Derive temporary signing key" + param)
- mult = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2))
+ mult = 2**(b-2) + sum(2**i * bit(param,i) for i in range(3,b-2))
P = decodepoint(pk)
return encodepoint(scalarmult(P, mult))
@@ -69,6 +67,11 @@ def signatureWithESK(m,h,pk):
def newSK():
return os.urandom(32)
+def random_scalar(entropy_f): # 0..L-1 inclusive
+ # reduce the bias to a safe level by generating 256 extra bits
+ oversized = int(binascii.hexlify(entropy_f(32+32)), 16)
+ return oversized % ell
+
# ------------------------------------------------------------
MSG = "This is extremely silly. But it is also incredibly serious business!"
@@ -126,6 +129,31 @@ class SelfTest(unittest.TestCase):
self._testSignatures(besk, bpk)
+ def testIdentity(self):
+ # Base point:
+ # B is the unique point (x, 4/5) \in E for which x is positive
+ By = 4 * inv(5)
+ Bx = xrecover(By)
+ B = [Bx % q,By % q]
+
+ # Get identity E by doing: E = l*B, where l is the group order
+ identity = scalarmult(B, ell)
+
+ # Get identity E by doing: E = l*A, where A is a random point
+ sk = newSK()
+ pk = decodepoint(publickey(sk))
+ identity2 = scalarmult(pk, ell)
+
+ # Check that identities match
+ assert(identity == identity2)
+ # Check that identity is the point (0,1)
+ assert(identity == [0L,1L])
+
+ # Check identity element: a*E = E, where a is a random scalar
+ scalar = random_scalar(os.urandom)
+ result = scalarmult(identity, scalar)
+ assert(result == identity == identity2)
+
# ------------------------------------------------------------
# From pprint.pprint([ binascii.b2a_hex(os.urandom(32)) for _ in xrange(8) ])
diff --git a/src/test/ed25519_vectors.inc b/src/test/ed25519_vectors.inc
index 760bafb971..60c863beba 100644
--- a/src/test/ed25519_vectors.inc
+++ b/src/test/ed25519_vectors.inc
@@ -91,21 +91,21 @@ static const char *ED25519_BLINDING_PARAMS[] = {
* blinding parameter.
*/
static const char *ED25519_BLINDED_SECRET_KEYS[] = {
- "014e83abadb2ca9a27e0ffe23920333d817729f48700e97656ec2823d694050e171d43"
+ "293c3acff4e902f6f63ddc5d5caa2a57e771db4f24de65d4c28df3232f47fa01171d43"
"f24e3f53e70ec7ac280044ac77d4942dee5d6807118a59bdf3ee647e89",
- "fad8cca0b4335847795288b1452508752b253e64e6c7c78d4a02dbbd7d46aa0eb8ceff"
+ "38b88f9f9440358da544504ee152fb475528f7c51c285bd1c68b14ade8e29a07b8ceff"
"20dfcf53eb52b891fc078c934efbf0353af7242e7dc51bb32a093afa29",
- "116eb0ae0a4a91763365bdf86db427b00862db448487808788cc339ac10e5e089217f5"
+ "4d03ce16a3f3249846aac9de0a0075061495c3b027248eeee47da4ddbaf9e0049217f5"
"2e92797462bd890fc274672e05c98f2c82970d640084781334aae0f940",
- "bd1fbb0ee5acddc4adbcf5f33e95d9445f40326ce579fdd764a24483a9ccb20f509ece"
+ "51d7db01aaa0d937a9fd7c8c7381445a14d8fa61f43347af5460d7cd8fda9904509ece"
"e77082ce088f7c19d5a00e955eeef8df6fa41686abc1030c2d76807733",
- "237f5345cefe8573ce9fa7e216381a1172796c9e3f70668ab503b1352952530fb57b95"
+ "1f76cab834e222bd2546efa7e073425680ab88df186ff41327d3e40770129b00b57b95"
"a440570659a440a3e4771465022a8e67af86bdf2d0990c54e7bb87ff9a",
- "ba8ff23bc4ad2b739e1ccffc9fbc7837053ea81cdfdb15073f56411cfbae1d0ec492fc"
+ "c23588c23ee76093419d07b27c6df5922a03ac58f96c53671456a7d1bdbf560ec492fc"
"87d5ec2a1b185ca5a40541fdef0b1e128fd5c2380c888bfa924711bcab",
- "0fa68f969de038c7a90a4a74ee6167c77582006f2dedecc1956501ba6b6fb10391b476"
+ "3ed249c6932d076e1a2f6916975914b14e8c739da00992358b8f37d3e790650691b476"
"8f8e556d78f4bdcb9a13b6f6066fe81d3134ae965dc48cd0785b3af2b8",
- "deaa3456d1c21944d5dcd361a646858c6cf9336b0a6851d925717eb1ae186902053d9c"
+ "288cbfd923cb286d48c084555b5bdd06c05e92fb81acdb45271367f57515380e053d9c"
"00c81e1331c06ab50087be8cfc7dc11691b132614474f1aa9c2503cccd",
};
@@ -115,14 +115,14 @@ static const char *ED25519_BLINDED_SECRET_KEYS[] = {
* blinding parameter.
*/
static const char *ED25519_BLINDED_PUBLIC_KEYS[] = {
- "722d6da6348e618967ef782e71061e27163a8b35f21856475d9d2023f65b6495",
- "1dffa0586da6cbfcff2024eedf4fc6c818242d9a82dbbe635d6da1b975a1160d",
- "5ed81f98fed5a6acda4ea6da2c34fab0ab359d950c510c256473f1f33ff438b4",
- "6e6f92a54fb282120c46d9603df41135f025bc1f58f283809d04be96aeb04040",
- "cda236f28edc4c7e02d18007b8dab49d669265b0f7aefb1824d7cc8e73a2cd63",
- "367b03b17b67ca7329b89a520bdab91782402a41cd67264e34b5541a4b3f875b",
- "8d486b03ac4e3b486b7a1d563706c7fdac75aee789a7cf6f22789eedeff61a31",
- "9f297ff0aa2ceda91c5ab1b6446f12533d145940de6d850dc323417afde0cb78",
+ "1fc1fa4465bd9d4956fdbdc9d3acb3c7019bb8d5606b951c2e1dfe0b42eaeb41",
+ "1cbbd4a88ce8f165447f159d9f628ada18674158c4f7c5ead44ce8eb0fa6eb7e",
+ "c5419ad133ffde7e0ac882055d942f582054132b092de377d587435722deb028",
+ "3e08d0dc291066272e313014bfac4d39ad84aa93c038478a58011f431648105f",
+ "59381f06acb6bf1389ba305f70874eed3e0f2ab57cdb7bc69ed59a9b8899ff4d",
+ "2b946a484344eb1c17c89dd8b04196a84f3b7222c876a07a4cece85f676f87d9",
+ "c6b585129b135f8769df2eba987e76e089e80ba3a2a6729134d3b28008ac098e",
+ "0eefdc795b59cabbc194c6174e34ba9451e8355108520554ec285acabebb34ac",
};
/**
diff --git a/src/test/fuzz/include.am b/src/test/fuzz/include.am
index 2961dab56f..d90e8283f2 100644
--- a/src/test/fuzz/include.am
+++ b/src/test/fuzz/include.am
@@ -15,13 +15,13 @@ FUZZING_LIBS = \
src/common/libor-ctime-testing.a \
src/common/libor-event-testing.a \
src/trunnel/libor-trunnel-testing.a \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \
- @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
+ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@ \
@TOR_SYSTEMD_LIBS@ \
@TOR_LZMA_LIBS@ \
- @TOR_ZSTD_LIBS@ \
- $(rust_ldadd)
+ @TOR_ZSTD_LIBS@
oss-fuzz-prereqs: \
src/or/libtor-testing.a \
diff --git a/src/test/hs_build_address.py b/src/test/hs_build_address.py
new file mode 100644
index 0000000000..7be9c8b85a
--- /dev/null
+++ b/src/test/hs_build_address.py
@@ -0,0 +1,37 @@
+import sys
+import hashlib
+import struct
+import base64
+
+# Python 3.6+, the SHA3 is available in hashlib natively. Else this requires
+# the pysha3 package (pip install pysha3).
+if sys.version_info < (3, 6):
+ import sha3
+
+# Test vector to make sure the right sha3 version will be used. pysha3 < 1.0
+# used the old Keccak implementation. During the finalization of SHA3, NIST
+# changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge function
+# stayed the same. pysha3 1.0 provides the previous Keccak hash, too.
+TEST_VALUE = "e167f68d6563d75bb25f3aa49c29ef612d41352dc00606de7cbd630bb2665f51"
+if TEST_VALUE != sha3.sha3_256(b"Hello World").hexdigest():
+ print("pysha3 version is < 1.0. Please install from:")
+ print("https://github.com/tiran/pysha3https://github.com/tiran/pysha3")
+ sys.exit(1)
+
+# Checksum is built like so:
+# CHECKSUM = SHA3(".onion checksum" || PUBKEY || VERSION)
+PREFIX = ".onion checksum".encode()
+# 32 bytes ed25519 pubkey.
+PUBKEY = ("\x42" * 32).encode()
+# Version 3 is proposal224
+VERSION = 3
+
+data = struct.pack('15s32sb', PREFIX, PUBKEY, VERSION)
+checksum = hashlib.sha3_256(data).digest()
+
+# Onion address is built like so:
+# onion_address = base32(PUBKEY || CHECKSUM || VERSION) + ".onion"
+address = struct.pack('!32s2sb', PUBKEY, checksum, VERSION)
+onion_addr = base64.b32encode(address).decode().lower()
+
+print("%s" % (onion_addr))
diff --git a/src/test/hs_ntor_ref.py b/src/test/hs_ntor_ref.py
index 813e797828..3dd2d6d6e0 100644
--- a/src/test/hs_ntor_ref.py
+++ b/src/test/hs_ntor_ref.py
@@ -54,11 +54,28 @@ except ImportError:
import slownacl_curve25519
curve25519mod = slownacl_curve25519
+import hashlib
try:
import sha3
except ImportError:
- # error code 77 tells automake to skip this test
- sys.exit(77)
+ # In python 3.6, the sha3 functions are in hashlib whether we
+ # import sha3 or not.
+ sha3 = None
+
+try:
+ # Pull the sha3 functions in.
+ from hashlib import sha3_256, shake_256
+ shake_squeeze = shake_256.digest
+except ImportError:
+ if hasattr(sha3, "SHA3256"):
+ # If this happens, then we have the old "sha3" module which
+ # hashlib and pysha3 superseded.
+ sha3_256 = sha3.SHA3256
+ shake_256 = sha3.SHAKE256
+ shake_squeeze = shake_256.squeeze
+ else:
+ # 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.
@@ -81,7 +98,7 @@ def mac(k,m):
def htonll(num):
return struct.pack('!q', num)
- s = sha3.SHA3256()
+ s = sha3_256()
s.update(htonll(len(k)))
s.update(k)
s.update(m)
@@ -107,9 +124,9 @@ def intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey,
assert(len(secret) == INTRO_SECRET_LEN)
info = M_HSEXPAND + subcredential
- kdf = sha3.SHAKE256()
+ kdf = shake_256()
kdf.update(secret + T_HSENC + info)
- key_material = kdf.squeeze(64*8)
+ key_material = shake_squeeze(kdf, 64*8)
enc_key = key_material[0:32]
mac_key = key_material[32:64]
@@ -139,9 +156,9 @@ def intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, service_enc_pr
assert(len(secret) == INTRO_SECRET_LEN)
info = M_HSEXPAND + subcredential
- kdf = sha3.SHAKE256()
+ kdf = shake_256()
kdf.update(secret + T_HSENC + info)
- key_material = kdf.squeeze(64*8)
+ key_material = shake_squeeze(kdf, 64*8)
enc_key = key_material[0:32]
mac_key = key_material[32:64]
diff --git a/src/test/hs_test_helpers.c b/src/test/hs_test_helpers.c
index 3f0d6a9413..2753d29078 100644
--- a/src/test/hs_test_helpers.c
+++ b/src/test/hs_test_helpers.c
@@ -6,6 +6,7 @@
#include "test.h"
#include "torcert.h"
+#include "hs_common.h"
#include "hs_test_helpers.h"
hs_desc_intro_point_t *
@@ -15,8 +16,7 @@ hs_helper_build_intro_point(const ed25519_keypair_t *signing_kp, time_t now,
int ret;
ed25519_keypair_t auth_kp;
hs_desc_intro_point_t *intro_point = NULL;
- hs_desc_intro_point_t *ip = tor_malloc_zero(sizeof(*ip));
- ip->link_specifiers = smartlist_new();
+ hs_desc_intro_point_t *ip = hs_desc_intro_point_new();
{
hs_desc_link_specifier_t *ls = tor_malloc_zero(sizeof(*ls));
@@ -94,8 +94,7 @@ static hs_descriptor_t *
hs_helper_build_hs_desc_impl(unsigned int no_ip,
const ed25519_keypair_t *signing_kp)
{
- int ret;
- time_t now = time(NULL);
+ time_t now = approx_time();
ed25519_keypair_t blinded_kp;
hs_descriptor_t *descp = NULL, *desc = tor_malloc_zero(sizeof(*desc));
@@ -105,8 +104,9 @@ hs_helper_build_hs_desc_impl(unsigned int no_ip,
memcpy(&desc->plaintext_data.signing_pubkey, &signing_kp->pubkey,
sizeof(ed25519_public_key_t));
- ret = ed25519_keypair_generate(&blinded_kp, 0);
- tt_int_op(ret, ==, 0);
+ uint64_t current_time_period = hs_get_time_period_num(approx_time());
+ hs_build_blinded_keypair(signing_kp, NULL, 0,
+ current_time_period, &blinded_kp);
/* Copy only the public key into the descriptor. */
memcpy(&desc->plaintext_data.blinded_pubkey, &blinded_kp.pubkey,
sizeof(ed25519_public_key_t));
@@ -119,6 +119,9 @@ hs_helper_build_hs_desc_impl(unsigned int no_ip,
desc->plaintext_data.revision_counter = 42;
desc->plaintext_data.lifetime_sec = 3 * 60 * 60;
+ hs_get_subcredential(&signing_kp->pubkey, &blinded_kp.pubkey,
+ desc->subcredential);
+
/* Setup encrypted data section. */
desc->encrypted_data.create2_ntor = 1;
desc->encrypted_data.intro_auth_types = smartlist_new();
@@ -142,6 +145,21 @@ hs_helper_build_hs_desc_impl(unsigned int no_ip,
return descp;
}
+/** Helper function to get the HS subcredential using the identity keypair of
+ * an HS. Used to decrypt descriptors in unittests. */
+void
+hs_helper_get_subcred_from_identity_keypair(ed25519_keypair_t *signing_kp,
+ uint8_t *subcred_out)
+{
+ ed25519_keypair_t blinded_kp;
+ uint64_t current_time_period = hs_get_time_period_num(approx_time());
+ hs_build_blinded_keypair(signing_kp, NULL, 0,
+ current_time_period, &blinded_kp);
+
+ hs_get_subcredential(&signing_kp->pubkey, &blinded_kp.pubkey,
+ subcred_out);
+}
+
/* Build a descriptor with introduction points. */
hs_descriptor_t *
hs_helper_build_hs_desc_with_ip(const ed25519_keypair_t *signing_kp)
diff --git a/src/test/hs_test_helpers.h b/src/test/hs_test_helpers.h
index a7fedab136..05f5aa7b64 100644
--- a/src/test/hs_test_helpers.h
+++ b/src/test/hs_test_helpers.h
@@ -17,6 +17,9 @@ hs_descriptor_t *hs_helper_build_hs_desc_with_ip(
const ed25519_keypair_t *signing_kp);
void hs_helper_desc_equal(const hs_descriptor_t *desc1,
const hs_descriptor_t *desc2);
+void
+hs_helper_get_subcred_from_identity_keypair(ed25519_keypair_t *signing_kp,
+ uint8_t *subcred_out);
#endif /* TOR_HS_TEST_HELPERS_H */
diff --git a/src/test/include.am b/src/test/include.am
index 29ba1ce7c9..d1488057e1 100644
--- a/src/test/include.am
+++ b/src/test/include.am
@@ -34,6 +34,7 @@ endif
TESTS += src/test/test src/test/test-slow src/test/test-memwipe \
src/test/test_workqueue \
src/test/test_keygen.sh \
+ src/test/test_key_expiration.sh \
src/test/test-timers \
$(TESTSCRIPTS)
@@ -114,7 +115,12 @@ src_test_test_SOURCES = \
src/test/test_guardfraction.c \
src/test/test_extorport.c \
src/test/test_hs.c \
+ src/test/test_hs_common.c \
+ src/test/test_hs_config.c \
+ src/test/test_hs_cell.c \
+ src/test/test_hs_ntor.c \
src/test/test_hs_service.c \
+ src/test/test_hs_client.c \
src/test/test_hs_intropoint.c \
src/test/test_handles.c \
src/test/test_hs_cache.c \
@@ -191,9 +197,10 @@ 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 \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \
- @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ \
- $(rust_ldadd)
+ @TOR_LIB_WS32@ @TOR_LIB_USERENV@ \
+ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
@@ -206,10 +213,11 @@ src_test_test_LDADD = src/or/libtor-testing.a \
src/common/libor-event-testing.a \
src/trunnel/libor-trunnel-testing.a \
src/trace/libor-trace.a \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ \
- $(rust_ldadd)
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \
+ @CURVE25519_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)
@@ -231,10 +239,11 @@ src_test_bench_LDADD = src/or/libtor.a src/common/libor.a \
src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \
src/common/libor-event.a src/trunnel/libor-trunnel.a \
src/trace/libor-trace.a \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ \
- $(rust_ldadd)
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \
+ @CURVE25519_LIBS@ \
+ @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
@@ -244,10 +253,11 @@ src_test_test_workqueue_LDADD = src/or/libtor-testing.a \
src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \
src/common/libor-event-testing.a \
src/trace/libor-trace.a \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ \
- $(rust_ldadd)
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \
+ @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)
@@ -256,10 +266,11 @@ src_test_test_timers_LDADD = \
src/common/libor-ctime-testing.a \
src/common/libor-event-testing.a \
src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_LZMA_LIBS@ \
- $(rust_ldadd)
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \
+ @CURVE25519_LIBS@ \
+ @TOR_LZMA_LIBS@
src_test_test_timers_LDFLAGS = $(src_test_test_LDFLAGS)
noinst_HEADERS+= \
@@ -270,11 +281,13 @@ noinst_HEADERS+= \
src/test/test.h \
src/test/test_helpers.h \
src/test/test_dir_common.h \
+ src/test/test_connection.h \
src/test/test_descriptors.inc \
src/test/example_extrainfo.inc \
src/test/failing_routerdescs.inc \
src/test/ed25519_vectors.inc \
src/test/test_descriptors.inc \
+ src/test/test_hs_descriptor.inc \
src/test/vote_descriptors.inc
noinst_PROGRAMS+= src/test/test-ntor-cl
@@ -285,10 +298,10 @@ 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 \
+ $(rust_ldadd) \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- @TOR_LZMA_LIBS@ \
- $(rust_ldadd)
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \
+ @CURVE25519_LIBS@ @TOR_LZMA_LIBS@
src_test_test_ntor_cl_AM_CPPFLAGS = \
-I"$(top_srcdir)/src/or"
@@ -308,9 +321,9 @@ 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 \
+ $(rust_ldadd) \
@TOR_LIB_MATH@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ \
- $(rust_ldadd)
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@
src_test_test_bt_cl_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
src_test_test_bt_cl_CPPFLAGS= $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS)
@@ -322,6 +335,7 @@ EXTRA_DIST += \
src/test/slownacl_curve25519.py \
src/test/zero_length_keys.sh \
src/test/test_keygen.sh \
+ src/test/test_key_expiration.sh \
src/test/test_zero_length_keys.sh \
src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh \
src/test/test-network.sh \
diff --git a/src/test/rend_test_helpers.c b/src/test/rend_test_helpers.c
index f7880046fb..095bfecf21 100644
--- a/src/test/rend_test_helpers.c
+++ b/src/test/rend_test_helpers.c
@@ -71,3 +71,19 @@ create_descriptor(rend_service_descriptor_t **generated, char **service_id,
crypto_pk_free(pk2);
}
+rend_data_t *
+mock_rend_data(const char *onion_address)
+{
+ rend_data_v2_t *v2_data = tor_malloc_zero(sizeof(*v2_data));
+ rend_data_t *rend_query = &v2_data->base_;
+ rend_query->version = 2;
+
+ strlcpy(v2_data->onion_address, onion_address,
+ sizeof(v2_data->onion_address));
+ v2_data->auth_type = REND_NO_AUTH;
+ rend_query->hsdirs_fp = smartlist_new();
+ smartlist_add(rend_query->hsdirs_fp, tor_memdup("aaaaaaaaaaaaaaaaaaaaaaaa",
+ DIGEST_LEN));
+ return rend_query;
+}
+
diff --git a/src/test/rend_test_helpers.h b/src/test/rend_test_helpers.h
index 486adba436..6f0ef114de 100644
--- a/src/test/rend_test_helpers.h
+++ b/src/test/rend_test_helpers.h
@@ -10,6 +10,7 @@ void generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc,
char **service_id, int intro_points);
void create_descriptor(rend_service_descriptor_t **generated,
char **service_id, int intro_points);
+rend_data_t *mock_rend_data(const char *onion_address);
#endif
diff --git a/src/test/test-memwipe.c b/src/test/test-memwipe.c
index d3f2dc0644..484f13dd05 100644
--- a/src/test/test-memwipe.c
+++ b/src/test/test-memwipe.c
@@ -82,7 +82,7 @@ static unsigned
check_a_buffer(void)
{
unsigned int i;
- volatile char buf[1024];
+ volatile char buf[BUF_LEN];
unsigned sum = 0;
/* See if this buffer has the string in it.
diff --git a/src/test/test.c b/src/test/test.c
index 68f5f90fd7..702a13ab38 100644
--- a/src/test/test.c
+++ b/src/test/test.c
@@ -142,7 +142,8 @@ test_bad_onion_handshake(void *arg)
/* Server: Case 1: the encrypted data is degenerate. */
memset(junk_buf, 0, sizeof(junk_buf));
- crypto_pk_public_hybrid_encrypt(pk, junk_buf2, TAP_ONIONSKIN_CHALLENGE_LEN,
+ crypto_pk_obsolete_public_hybrid_encrypt(pk,
+ junk_buf2, TAP_ONIONSKIN_CHALLENGE_LEN,
junk_buf, DH_KEY_LEN, PK_PKCS1_OAEP_PADDING, 1);
tt_int_op(-1, OP_EQ,
onion_skin_TAP_server_handshake(junk_buf2, pk, NULL,
@@ -408,11 +409,11 @@ test_circuit_timeout(void *arg)
} while (fabs(circuit_build_times_cdf(&initial, timeout0) -
circuit_build_times_cdf(&initial, timeout1)) > 0.02);
- tt_assert(estimate.total_build_times <= CBT_NCIRCUITS_TO_OBSERVE);
+ tt_int_op(estimate.total_build_times, OP_LE, CBT_NCIRCUITS_TO_OBSERVE);
circuit_build_times_update_state(&estimate, state);
circuit_build_times_free_timeouts(&final);
- tt_assert(circuit_build_times_parse_state(&final, state) == 0);
+ tt_int_op(circuit_build_times_parse_state(&final, state), OP_EQ, 0);
circuit_build_times_update_alpha(&final);
timeout2 = circuit_build_times_calculate_timeout(&final,
@@ -490,7 +491,7 @@ test_circuit_timeout(void *arg)
}
}
- tt_assert(estimate.liveness.after_firsthop_idx == 0);
+ tt_int_op(estimate.liveness.after_firsthop_idx, OP_EQ, 0);
tt_assert(final.liveness.after_firsthop_idx ==
CBT_DEFAULT_MAX_RECENT_TIMEOUT_COUNT-1);
@@ -533,25 +534,8 @@ test_rend_fns(void *arg)
size_t intro_points_size;
size_t encoded_size;
int i;
- char address1[] = "fooaddress.onion";
- char address2[] = "aaaaaaaaaaaaaaaa.onion";
- char address3[] = "fooaddress.exit";
- char address4[] = "www.torproject.org";
- char address5[] = "foo.abcdefghijklmnop.onion";
- char address6[] = "foo.bar.abcdefghijklmnop.onion";
- char address7[] = ".abcdefghijklmnop.onion";
(void)arg;
- tt_assert(BAD_HOSTNAME == parse_extended_hostname(address1));
- tt_assert(ONION_HOSTNAME == parse_extended_hostname(address2));
- tt_str_op(address2,OP_EQ, "aaaaaaaaaaaaaaaa");
- tt_assert(EXIT_HOSTNAME == parse_extended_hostname(address3));
- tt_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4));
- tt_assert(ONION_HOSTNAME == parse_extended_hostname(address5));
- tt_str_op(address5,OP_EQ, "abcdefghijklmnop");
- tt_assert(ONION_HOSTNAME == parse_extended_hostname(address6));
- tt_str_op(address6,OP_EQ, "abcdefghijklmnop");
- tt_assert(BAD_HOSTNAME == parse_extended_hostname(address7));
/* Initialize the service cache. */
rend_cache_init();
@@ -587,20 +571,21 @@ test_rend_fns(void *arg)
intro->intro_key = crypto_pk_dup_key(pk2);
smartlist_add(generated->intro_nodes, intro);
}
- tt_assert(rend_encode_v2_descriptors(descs, generated, now, 0,
- REND_NO_AUTH, NULL, NULL) > 0);
- tt_assert(rend_compute_v2_desc_id(computed_desc_id, service_id_base32,
- NULL, now, 0) == 0);
+ int rv = rend_encode_v2_descriptors(descs, generated, now, 0,
+ REND_NO_AUTH, NULL, NULL);
+ tt_int_op(rv, OP_GT, 0);
+ rv = rend_compute_v2_desc_id(computed_desc_id, service_id_base32, NULL,
+ now, 0);
+ tt_int_op(rv, OP_EQ, 0);
tt_mem_op(((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0))->desc_id, OP_EQ,
computed_desc_id, DIGEST_LEN);
- tt_assert(rend_parse_v2_service_descriptor(&parsed, parsed_desc_id,
- &intro_points_encrypted,
- &intro_points_size,
- &encoded_size,
- &next_desc,
- ((rend_encoded_v2_service_descriptor_t *)
- smartlist_get(descs, 0))->desc_str, 1) == 0);
+ rv = rend_parse_v2_service_descriptor(&parsed, parsed_desc_id,
+ &intro_points_encrypted, &intro_points_size, &encoded_size,
+ &next_desc,
+ ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0))
+ ->desc_str, 1);
+ tt_int_op(rv, OP_EQ, 0);
tt_assert(parsed);
tt_mem_op(((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0))->desc_id,OP_EQ, parsed_desc_id, DIGEST_LEN);
@@ -802,7 +787,7 @@ test_geoip(void *arg)
/* Start testing bridge statistics by making sure that we don't output
* bridge stats without initializing them. */
s = geoip_format_bridge_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Initialize stats and generate the bridge-stats history string out of
* the connecting clients added above. */
@@ -816,7 +801,7 @@ test_geoip(void *arg)
* string anymore. */
geoip_bridge_stats_term();
s = geoip_format_bridge_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Stop being a bridge and start being a directory mirror that gathers
* directory request statistics. */
@@ -830,7 +815,7 @@ test_geoip(void *arg)
SET_TEST_ADDRESS(100);
geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Initialize stats, note one connecting client, and generate the
* dirreq-stats history string. */
@@ -847,7 +832,7 @@ test_geoip(void *arg)
SET_TEST_ADDRESS(101);
geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Re-start stats, add a connecting client, reset stats, and make sure
* that we get an all empty history string. */
@@ -883,7 +868,7 @@ test_geoip(void *arg)
SET_TEST_ADDRESS(100);
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Initialize stats, note one connecting client, and generate the
* entry-stats history string. */
@@ -900,7 +885,7 @@ test_geoip(void *arg)
SET_TEST_ADDRESS(101);
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Re-start stats, add a connecting client, reset stats, and make sure
* that we get an all empty history string. */
@@ -1011,7 +996,7 @@ test_stats(void *arg)
rep_hist_note_exit_stream_opened(80);
rep_hist_note_exit_bytes(80, 100, 10000);
s = rep_hist_format_exit_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Initialize stats, note some streams and bytes, and generate history
* string. */
@@ -1049,7 +1034,7 @@ test_stats(void *arg)
rep_hist_exit_stats_term();
rep_hist_note_exit_bytes(80, 100, 10000);
s = rep_hist_format_exit_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Re-start stats, add some bytes, reset stats, and see what history we
* get when observing no streams or bytes at all. */
@@ -1068,7 +1053,7 @@ test_stats(void *arg)
* conn stats without initializing them. */
rep_hist_note_or_conn_bytes(1, 20, 400, now);
s = rep_hist_format_conn_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Initialize stats, note bytes, and generate history string. */
rep_hist_conn_stats_init(now);
@@ -1085,7 +1070,7 @@ test_stats(void *arg)
rep_hist_conn_stats_term();
rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15);
s = rep_hist_format_conn_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Re-start stats, add some bytes, reset stats, and see what history we
* get when observing no bytes at all. */
@@ -1103,7 +1088,7 @@ test_stats(void *arg)
* stats without initializing them. */
rep_hist_add_buffer_stats(2.0, 2.0, 20);
s = rep_hist_format_buffer_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Initialize stats, add statistics for a single circuit, and generate
* the history string. */
@@ -1138,7 +1123,7 @@ test_stats(void *arg)
rep_hist_buffer_stats_term();
rep_hist_add_buffer_stats(2.0, 2.0, 20);
s = rep_hist_format_buffer_stats(now + 86400);
- tt_assert(!s);
+ tt_ptr_op(s, OP_EQ, NULL);
/* Re-start stats, add statistics for one circuit, reset stats, and make
* sure that the history has all zeros. */
@@ -1213,8 +1198,13 @@ struct testgroup_t testgroups[] = {
{ "extorport/", extorport_tests },
{ "legacy_hs/", hs_tests },
{ "hs_cache/", hs_cache },
+ { "hs_cell/", hs_cell_tests },
+ { "hs_common/", hs_common_tests },
+ { "hs_config/", hs_config_tests },
{ "hs_descriptor/", hs_descriptor },
+ { "hs_ntor/", hs_ntor_tests },
{ "hs_service/", hs_service_tests },
+ { "hs_client/", hs_client_tests },
{ "hs_intropoint/", hs_intropoint_tests },
{ "introduce/", introduce_tests },
{ "keypin/", keypin_tests },
diff --git a/src/test/test.h b/src/test/test.h
index 6abaf39e6f..f3e826afe1 100644
--- a/src/test/test.h
+++ b/src/test/test.h
@@ -45,8 +45,8 @@
* you're doing. */
#define tt_double_eq(a,b) \
STMT_BEGIN \
- tt_double_op((a), >=, (b)); \
- tt_double_op((a), <=, (b)); \
+ tt_double_op((a), OP_GE, (b)); \
+ tt_double_op((a), OP_LE, (b)); \
STMT_END
#ifdef _MSC_VER
@@ -207,8 +207,13 @@ extern struct testcase_t guardfraction_tests[];
extern struct testcase_t extorport_tests[];
extern struct testcase_t hs_tests[];
extern struct testcase_t hs_cache[];
+extern struct testcase_t hs_cell_tests[];
+extern struct testcase_t hs_common_tests[];
+extern struct testcase_t hs_config_tests[];
extern struct testcase_t hs_descriptor[];
+extern struct testcase_t hs_ntor_tests[];
extern struct testcase_t hs_service_tests[];
+extern struct testcase_t hs_client_tests[];
extern struct testcase_t hs_intropoint_tests[];
extern struct testcase_t introduce_tests[];
extern struct testcase_t keypin_tests[];
diff --git a/src/test/test_addr.c b/src/test/test_addr.c
index 2f591bdfe7..53d1c754ba 100644
--- a/src/test/test_addr.c
+++ b/src/test/test_addr.c
@@ -451,10 +451,10 @@ test_addr_ip6_helpers(void *arg)
"::ffff:6.0.0.0"); /* XXXX wrong. */
tor_addr_parse_mask_ports("[::ffff:2.3.4.5]", 0, &t1, NULL, NULL, NULL);
tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL);
- tt_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) == 0);
+ tt_int_op(tor_addr_compare(&t1, &t2, CMP_SEMANTIC), OP_EQ, 0);
tor_addr_parse_mask_ports("[::ffff:2.3.4.4]", 0, &t1, NULL, NULL, NULL);
tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL);
- tt_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) < 0);
+ tt_int_op(tor_addr_compare(&t1, &t2, CMP_SEMANTIC), OP_LT, 0);
/* test compare_masked */
test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 128);
@@ -637,7 +637,7 @@ test_addr_ip6_helpers(void *arg)
/* Try some long addresses. */
r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111]",
0, &t1, NULL, NULL, NULL);
- tt_assert(r == AF_INET6);
+ tt_int_op(r, OP_EQ, AF_INET6);
r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:11111]",
0, &t1, NULL, NULL, NULL);
tt_int_op(r, OP_EQ, -1);
@@ -686,38 +686,38 @@ test_addr_ip6_helpers(void *arg)
tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("*6",0,&t1, &mask, NULL, NULL);
tt_int_op(r, OP_EQ, -1);
- tt_assert(r == -1);
+ tt_int_op(r, OP_EQ, -1);
/* Try a mask with a wildcard. */
r=tor_addr_parse_mask_ports("*/16",0,&t1, &mask, NULL, NULL);
- tt_assert(r == -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("*4/16",TAPMP_EXTENDED_STAR,
&t1, &mask, NULL, NULL);
- tt_assert(r == -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("*6/30",TAPMP_EXTENDED_STAR,
&t1, &mask, NULL, NULL);
- tt_assert(r == -1);
+ tt_int_op(r, OP_EQ, -1);
/* Basic mask tests*/
r=tor_addr_parse_mask_ports("1.1.2.2/31",0,&t1, &mask, NULL, NULL);
- tt_assert(r == AF_INET);
+ tt_int_op(r, OP_EQ, AF_INET);
tt_int_op(mask,OP_EQ,31);
tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010202);
r=tor_addr_parse_mask_ports("3.4.16.032:1-2",0,&t1, &mask, &port1, &port2);
- tt_assert(r == AF_INET);
+ tt_int_op(r, OP_EQ, AF_INET);
tt_int_op(mask,OP_EQ,32);
tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x03041020);
- tt_assert(port1 == 1);
- tt_assert(port2 == 2);
+ tt_uint_op(port1, OP_EQ, 1);
+ tt_uint_op(port2, OP_EQ, 2);
r=tor_addr_parse_mask_ports("1.1.2.3/255.255.128.0",0,&t1, &mask,NULL,NULL);
- tt_assert(r == AF_INET);
+ tt_int_op(r, OP_EQ, AF_INET);
tt_int_op(mask,OP_EQ,17);
tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010203);
r=tor_addr_parse_mask_ports("[efef::]/112",0,&t1, &mask, &port1, &port2);
- tt_assert(r == AF_INET6);
- tt_assert(port1 == 1);
- tt_assert(port2 == 65535);
+ tt_int_op(r, OP_EQ, AF_INET6);
+ tt_uint_op(port1, OP_EQ, 1);
+ tt_uint_op(port2, OP_EQ, 65535);
/* Try regular wildcard behavior without TAPMP_EXTENDED_STAR */
r=tor_addr_parse_mask_ports("*:80-443",0,&t1,&mask,&port1,&port2);
tt_int_op(r,OP_EQ,AF_INET); /* Old users of this always get inet */
@@ -752,9 +752,9 @@ test_addr_ip6_helpers(void *arg)
tt_int_op(port2,OP_EQ,65535);
/* make sure inet address lengths >= max */
- tt_assert(INET_NTOA_BUF_LEN >= sizeof("255.255.255.255"));
- tt_assert(TOR_ADDR_BUF_LEN >=
- sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"));
+ tt_int_op(INET_NTOA_BUF_LEN, OP_GE, sizeof("255.255.255.255"));
+ tt_int_op(TOR_ADDR_BUF_LEN, OP_GE,
+ sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"));
tt_assert(sizeof(tor_addr_t) >= sizeof(struct in6_addr));
diff --git a/src/test/test_address.c b/src/test/test_address.c
index 50a0574522..8e1fd73033 100644
--- a/src/test/test_address.c
+++ b/src/test/test_address.c
@@ -224,7 +224,7 @@ test_address_ifaddrs_to_smartlist(void *arg)
smartlist = ifaddrs_to_smartlist(ifa, AF_UNSPEC);
tt_assert(smartlist);
- tt_assert(smartlist_len(smartlist) == 3);
+ tt_int_op(smartlist_len(smartlist), OP_EQ, 3);
sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in6));
@@ -233,7 +233,7 @@ test_address_ifaddrs_to_smartlist(void *arg)
tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
sizeof(struct sockaddr_in));
- tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in));
tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check,
ipv4_sockaddr_local));
@@ -242,7 +242,7 @@ test_address_ifaddrs_to_smartlist(void *arg)
tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
sizeof(struct sockaddr_in));
- tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in));
tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check,
ipv4_sockaddr_remote));
@@ -251,7 +251,7 @@ test_address_ifaddrs_to_smartlist(void *arg)
tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
sizeof(struct sockaddr_in6));
- tt_int_op(addr_len,==,sizeof(struct sockaddr_in6));
+ tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in6));
tt_assert(sockaddr_in6_are_equal((struct sockaddr_in6*)sockaddr_to_check,
ipv6_sockaddr));
@@ -319,7 +319,7 @@ test_address_get_if_addrs_win32(void *arg)
results = get_interface_addresses_win32(LOG_ERR, AF_UNSPEC);
- tt_int_op(smartlist_len(results),>=,1);
+ tt_int_op(smartlist_len(results),OP_GE,1);
tt_assert(smartlist_contains_localhost_tor_addr(results));
tt_assert(!smartlist_contains_null_tor_addr(results));
@@ -384,7 +384,7 @@ test_address_ip_adapter_addresses_to_smartlist(void *arg)
result = ip_adapter_addresses_to_smartlist(addrs1);
tt_assert(result);
- tt_assert(smartlist_len(result) == 3);
+ tt_int_op(smartlist_len(result), OP_EQ, 3);
tor_addr = smartlist_get(result,0);
@@ -456,14 +456,14 @@ test_address_ifreq_to_smartlist(void *arg)
ifc->ifc_ifcu.ifcu_req = ifr;
results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len);
- tt_int_op(smartlist_len(results),==,1);
+ tt_int_op(smartlist_len(results),OP_EQ,1);
tor_addr = smartlist_get(results, 0);
addr_len =
tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
sizeof(struct sockaddr_in));
- tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in));
tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check));
ifr = tor_realloc(ifr,2*sizeof(struct ifreq));
@@ -479,14 +479,14 @@ test_address_ifreq_to_smartlist(void *arg)
smartlist_free(results);
results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len);
- tt_int_op(smartlist_len(results),==,2);
+ tt_int_op(smartlist_len(results),OP_EQ,2);
tor_addr = smartlist_get(results, 0);
addr_len =
tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
sizeof(struct sockaddr_in));
- tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in));
tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check));
tor_addr = smartlist_get(results, 1);
@@ -494,7 +494,7 @@ test_address_ifreq_to_smartlist(void *arg)
tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
sizeof(struct sockaddr_in));
- tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_int_op(addr_len,OP_EQ,sizeof(struct sockaddr_in));
tt_assert(sockaddr_in_are_equal(sockaddr_eth1,sockaddr_to_check));
done:
@@ -633,7 +633,7 @@ test_address_udp_socket_trick_whitebox(void *arg)
get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
AF_INET, addr_from_hack);
- tt_int_op(hack_retval,==,0);
+ tt_int_op(hack_retval,OP_EQ,0);
tt_assert(tor_addr_eq_ipv4h(addr_from_hack, 0x1720f676));
/* Now, lets do an IPv6 case. */
@@ -648,7 +648,7 @@ test_address_udp_socket_trick_whitebox(void *arg)
get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
AF_INET6, addr_from_hack);
- tt_int_op(hack_retval,==,0);
+ tt_int_op(hack_retval,OP_EQ,0);
tor_addr_to_sockaddr(addr_from_hack,0,(struct sockaddr *)ipv6_to_check,
sizeof(struct sockaddr_in6));
@@ -693,7 +693,7 @@ test_address_udp_socket_trick_blackbox(void *arg)
AF_INET,
&addr4_to_check);
- tt_int_op(retval,==,retval_reference);
+ tt_int_op(retval,OP_EQ,retval_reference);
tt_assert( (retval == -1 && retval_reference == -1) ||
(tor_addr_compare(&addr4,&addr4_to_check,CMP_EXACT) == 0) );
@@ -702,7 +702,7 @@ test_address_udp_socket_trick_blackbox(void *arg)
AF_INET6,
&addr6_to_check);
- tt_int_op(retval,==,retval_reference);
+ tt_int_op(retval,OP_EQ,retval_reference);
tt_assert( (retval == -1 && retval_reference == -1) ||
(tor_addr_compare(&addr6,&addr6_to_check,CMP_EXACT) == 0) );
@@ -730,7 +730,7 @@ test_address_udp_socket_trick_blackbox(void *arg)
retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
AF_INET+AF_INET6,&addr4);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
return;
@@ -745,11 +745,11 @@ test_address_get_if_addrs_list_internal(void *arg)
results = get_interface_address_list(LOG_ERR, 1);
- tt_assert(results != NULL);
+ tt_ptr_op(results, OP_NE, NULL);
/* When the network is down, a system might not have any non-local
* non-multicast addresseses, not even internal ones.
* Unit tests shouldn't fail because of this. */
- tt_int_op(smartlist_len(results),>=,0);
+ tt_int_op(smartlist_len(results),OP_GE,0);
tt_assert(!smartlist_contains_localhost_tor_addr(results));
tt_assert(!smartlist_contains_multicast_tor_addr(results));
@@ -776,9 +776,9 @@ test_address_get_if_addrs_list_no_internal(void *arg)
results = get_interface_address_list(LOG_ERR, 0);
- tt_assert(results != NULL);
+ tt_ptr_op(results, OP_NE, NULL);
/* Work even on systems with only internal IPv4 addresses */
- tt_int_op(smartlist_len(results),>=,0);
+ tt_int_op(smartlist_len(results),OP_GE,0);
tt_assert(!smartlist_contains_localhost_tor_addr(results));
tt_assert(!smartlist_contains_multicast_tor_addr(results));
@@ -818,9 +818,9 @@ test_address_get_if_addrs6_list_internal(void *arg)
}
teardown_capture_of_logs();
- tt_assert(results != NULL);
+ tt_ptr_op(results, OP_NE, NULL);
/* Work even on systems without IPv6 interfaces */
- tt_int_op(smartlist_len(results),>=,0);
+ tt_int_op(smartlist_len(results),OP_GE,0);
tt_assert(!smartlist_contains_localhost_tor_addr(results));
tt_assert(!smartlist_contains_multicast_tor_addr(results));
@@ -861,9 +861,9 @@ test_address_get_if_addrs6_list_no_internal(void *arg)
}
teardown_capture_of_logs();
- tt_assert(results != NULL);
+ tt_ptr_op(results, OP_NE, NULL);
/* Work even on systems without IPv6 interfaces */
- tt_int_op(smartlist_len(results),>=,0);
+ tt_int_op(smartlist_len(results),OP_GE,0);
tt_assert(!smartlist_contains_localhost_tor_addr(results));
tt_assert(!smartlist_contains_multicast_tor_addr(results));
@@ -927,18 +927,18 @@ test_address_get_if_addrs_internal_fail(void *arg)
mock_get_interface_address6_via_udp_socket_hack_fail);
results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 1);
- tt_assert(results1 != NULL);
- tt_int_op(smartlist_len(results1),==,0);
+ tt_ptr_op(results1, OP_NE, NULL);
+ tt_int_op(smartlist_len(results1),OP_EQ,0);
results2 = get_interface_address_list(LOG_ERR, 1);
- tt_assert(results2 != NULL);
- tt_int_op(smartlist_len(results2),==,0);
+ tt_ptr_op(results2, OP_NE, NULL);
+ tt_int_op(smartlist_len(results2),OP_EQ,0);
rv = get_interface_address6(LOG_ERR, AF_INET6, &ipv6_addr);
- tt_assert(rv == -1);
+ tt_int_op(rv, OP_EQ, -1);
rv = get_interface_address(LOG_ERR, &ipv4h_addr);
- tt_assert(rv == -1);
+ tt_int_op(rv, OP_EQ, -1);
done:
UNMOCK(get_interface_addresses_raw);
@@ -961,12 +961,12 @@ test_address_get_if_addrs_no_internal_fail(void *arg)
mock_get_interface_address6_via_udp_socket_hack_fail);
results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 0);
- tt_assert(results1 != NULL);
- tt_int_op(smartlist_len(results1),==,0);
+ tt_ptr_op(results1, OP_NE, NULL);
+ tt_int_op(smartlist_len(results1),OP_EQ,0);
results2 = get_interface_address_list(LOG_ERR, 0);
- tt_assert(results2 != NULL);
- tt_int_op(smartlist_len(results2),==,0);
+ tt_ptr_op(results2, OP_NE, NULL);
+ tt_int_op(smartlist_len(results2),OP_EQ,0);
done:
UNMOCK(get_interface_addresses_raw);
diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c
index 07114a8571..a85fb95f0a 100644
--- a/src/test/test_buffers.c
+++ b/src/test/test_buffers.c
@@ -762,11 +762,11 @@ test_buffers_tls_read_mocked(void *arg)
buf = buf_new();
next_reply_val[0] = 1024;
- tt_int_op(128, ==, read_to_buf_tls(NULL, 128, buf));
+ tt_int_op(128, OP_EQ, read_to_buf_tls(NULL, 128, buf));
next_reply_val[0] = 5000;
next_reply_val[1] = 5000;
- tt_int_op(6000, ==, read_to_buf_tls(NULL, 6000, buf));
+ tt_int_op(6000, OP_EQ, read_to_buf_tls(NULL, 6000, buf));
done:
UNMOCK(tor_tls_read);
@@ -831,17 +831,44 @@ test_buffers_find_contentlen(void *arg)
r = buf_http_find_content_length(tmp, headerlen, &sz);
tor_free(tmp);
log_debug(LD_DIR, "%d: %s", i, escaped(results[i].headers));
- tt_int_op(r, ==, results[i].r);
- tt_int_op(sz, ==, results[i].contentlen);
+ tt_int_op(r, OP_EQ, results[i].r);
+ tt_int_op(sz, OP_EQ, results[i].contentlen);
}
done:
;
}
+static void
+test_buffer_peek_startswith(void *arg)
+{
+ (void)arg;
+ buf_t *buf;
+ buf = buf_new();
+ tt_ptr_op(buf, OP_NE, NULL);
+
+ tt_assert(peek_buf_startswith(buf, ""));
+ tt_assert(! peek_buf_startswith(buf, "X"));
+
+ write_to_buf("Tor", 3, buf);
+
+ tt_assert(peek_buf_startswith(buf, ""));
+ tt_assert(peek_buf_startswith(buf, "T"));
+ tt_assert(peek_buf_startswith(buf, "To"));
+ tt_assert(peek_buf_startswith(buf, "Tor"));
+ tt_assert(! peek_buf_startswith(buf, "Top"));
+ tt_assert(! peek_buf_startswith(buf, "For"));
+ tt_assert(! peek_buf_startswith(buf, "Tork"));
+ tt_assert(! peek_buf_startswith(buf, "Torpor"));
+
+ done:
+ buf_free(buf);
+}
+
struct testcase_t buffer_tests[] = {
{ "basic", test_buffers_basic, TT_FORK, NULL, NULL },
{ "copy", test_buffer_copy, TT_FORK, NULL, NULL },
{ "pullup", test_buffer_pullup, TT_FORK, NULL, NULL },
+ { "startswith", test_buffer_peek_startswith, 0, NULL, NULL },
{ "ext_or_cmd", test_buffer_ext_or_cmd, TT_FORK, NULL, NULL },
{ "allocation_tracking", test_buffer_allocation_tracking, TT_FORK,
NULL, NULL },
diff --git a/src/test/test_channel.c b/src/test/test_channel.c
index f5999b8e67..023c2950c9 100644
--- a/src/test/test_channel.c
+++ b/src/test/test_channel.c
@@ -86,7 +86,7 @@ channel_note_destroy_not_pending_mock(channel_t *ch,
static const char *
chan_test_describe_transport(channel_t *ch)
{
- tt_assert(ch != NULL);
+ tt_ptr_op(ch, OP_NE, NULL);
done:
return "Fake channel for unit tests";
@@ -100,7 +100,7 @@ chan_test_describe_transport(channel_t *ch)
static void
chan_test_channel_dump_statistics_mock(channel_t *chan, int severity)
{
- tt_assert(chan != NULL);
+ tt_ptr_op(chan, OP_NE, NULL);
(void)severity;
@@ -125,7 +125,7 @@ chan_test_channel_flush_from_first_active_circuit_mock(channel_t *chan,
int result = 0, c = 0;
packed_cell_t *cell = NULL;
- tt_assert(chan != NULL);
+ tt_ptr_op(chan, OP_NE, NULL);
if (test_target_cmux != NULL &&
test_target_cmux == chan->cmux) {
while (c <= max && test_cmux_cells > 0) {
@@ -154,7 +154,7 @@ chan_test_circuitmux_num_cells_mock(circuitmux_t *cmux)
{
unsigned int result = 0;
- tt_assert(cmux != NULL);
+ tt_ptr_op(cmux, OP_NE, NULL);
if (cmux != NULL) {
if (cmux == test_target_cmux) {
result = test_cmux_cells;
@@ -193,7 +193,7 @@ chan_test_cell_handler(channel_t *ch,
static void
chan_test_dumpstats(channel_t *ch, int severity)
{
- tt_assert(ch != NULL);
+ tt_ptr_op(ch, OP_NE, NULL);
(void)severity;
@@ -268,7 +268,7 @@ static const char *
chan_test_get_remote_descr(channel_t *ch, int flags)
{
tt_assert(ch);
- tt_int_op(flags & ~(GRD_FLAG_ORIGINAL | GRD_FLAG_ADDR_ONLY), ==, 0);
+ tt_int_op(flags & ~(GRD_FLAG_ORIGINAL | GRD_FLAG_ADDR_ONLY), OP_EQ, 0);
done:
return "Fake channel for unit tests; no real endpoint";
@@ -286,7 +286,7 @@ chan_test_get_overhead_estimate(channel_t *ch)
static int
chan_test_is_canonical(channel_t *ch, int req)
{
- tt_assert(ch != NULL);
+ tt_ptr_op(ch, OP_NE, NULL);
tt_assert(req == 0 || req == 1);
done:
@@ -380,7 +380,7 @@ chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell)
void
make_fake_cell(cell_t *c)
{
- tt_assert(c != NULL);
+ tt_ptr_op(c, OP_NE, NULL);
c->circ_id = 1;
c->command = CELL_RELAY;
@@ -397,7 +397,7 @@ make_fake_cell(cell_t *c)
void
make_fake_var_cell(var_cell_t *c)
{
- tt_assert(c != NULL);
+ tt_ptr_op(c, OP_NE, NULL);
c->circ_id = 1;
c->command = CELL_VERSIONS;
@@ -552,24 +552,24 @@ test_channel_dumpstats(void *arg)
channel_dumpstats(LOG_DEBUG);
/* Assert that we hit the mock */
- tt_int_op(dump_statistics_mock_matches, ==, 1);
+ tt_int_op(dump_statistics_mock_matches, OP_EQ, 1);
/* Close the channel */
channel_mark_for_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED);
/* Try again and hit the finished channel */
channel_dumpstats(LOG_DEBUG);
- tt_int_op(dump_statistics_mock_matches, ==, 2);
+ tt_int_op(dump_statistics_mock_matches, OP_EQ, 2);
channel_run_cleanup();
ch = NULL;
/* Now we should hit nothing */
channel_dumpstats(LOG_DEBUG);
- tt_int_op(dump_statistics_mock_matches, ==, 2);
+ tt_int_op(dump_statistics_mock_matches, OP_EQ, 2);
/* Unmock */
UNMOCK(channel_dump_statistics);
@@ -594,7 +594,7 @@ test_channel_dumpstats(void *arg)
old_count = test_cells_written;
channel_write_cell(ch, cell);
cell = NULL;
- tt_int_op(test_cells_written, ==, old_count + 1);
+ tt_int_op(test_cells_written, OP_EQ, old_count + 1);
tt_assert(ch->n_bytes_xmitted > 0);
tt_assert(ch->n_cells_xmitted > 0);
@@ -602,14 +602,15 @@ test_channel_dumpstats(void *arg)
channel_set_cell_handlers(ch,
chan_test_cell_handler,
chan_test_var_cell_handler);
- tt_ptr_op(channel_get_cell_handler(ch), ==, chan_test_cell_handler);
- tt_ptr_op(channel_get_var_cell_handler(ch), ==, chan_test_var_cell_handler);
+ tt_ptr_op(channel_get_cell_handler(ch), OP_EQ, chan_test_cell_handler);
+ tt_ptr_op(channel_get_var_cell_handler(ch), OP_EQ,
+ chan_test_var_cell_handler);
cell = tor_malloc_zero(sizeof(cell_t));
make_fake_cell(cell);
old_count = test_chan_fixed_cells_recved;
channel_queue_cell(ch, cell);
tor_free(cell);
- tt_int_op(test_chan_fixed_cells_recved, ==, old_count + 1);
+ tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count + 1);
tt_assert(ch->n_bytes_recved > 0);
tt_assert(ch->n_cells_recved > 0);
@@ -619,13 +620,13 @@ test_channel_dumpstats(void *arg)
ch->is_canonical = chan_test_is_canonical;
old_count = test_dumpstats_calls;
channel_dump_statistics(ch, LOG_DEBUG);
- tt_int_op(test_dumpstats_calls, ==, old_count + 1);
+ tt_int_op(test_dumpstats_calls, OP_EQ, old_count + 1);
/* Close the channel */
channel_mark_for_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED);
channel_run_cleanup();
ch = NULL;
@@ -664,21 +665,21 @@ test_channel_flush(void *arg)
make_fake_cell(cell);
channel_write_cell(ch, cell);
/* It should be queued, so assert that we didn't write it */
- tt_int_op(test_cells_written, ==, init_count);
+ tt_int_op(test_cells_written, OP_EQ, init_count);
/* Queue a var cell */
v_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
make_fake_var_cell(v_cell);
channel_write_var_cell(ch, v_cell);
/* It should be queued, so assert that we didn't write it */
- tt_int_op(test_cells_written, ==, init_count);
+ tt_int_op(test_cells_written, OP_EQ, init_count);
/* Try a packed cell now */
p_cell = packed_cell_new();
tt_assert(p_cell);
channel_write_packed_cell(ch, p_cell);
/* It should be queued, so assert that we didn't write it */
- tt_int_op(test_cells_written, ==, init_count);
+ tt_int_op(test_cells_written, OP_EQ, init_count);
/* Now allow writes through again */
test_chan_accept_cells = 1;
@@ -687,7 +688,7 @@ test_channel_flush(void *arg)
channel_flush_cells(ch);
/* All three should have gone through */
- tt_int_op(test_cells_written, ==, init_count + 3);
+ tt_int_op(test_cells_written, OP_EQ, init_count + 3);
done:
tor_free(ch);
@@ -728,9 +729,9 @@ test_channel_flushmux(void *arg)
result = channel_flush_some_cells(ch, 1);
- tt_int_op(result, ==, 1);
- tt_int_op(test_cells_written, ==, old_count + 1);
- tt_int_op(test_cmux_cells, ==, 0);
+ tt_int_op(result, OP_EQ, 1);
+ tt_int_op(test_cells_written, OP_EQ, old_count + 1);
+ tt_int_op(test_cmux_cells, OP_EQ, 0);
/* Now try it without accepting to force them into the queue */
test_chan_accept_cells = 0;
@@ -740,19 +741,19 @@ test_channel_flushmux(void *arg)
result = channel_flush_some_cells(ch, 1);
/* We should not have actually flushed any */
- tt_int_op(result, ==, 0);
- tt_int_op(test_cells_written, ==, old_count + 1);
+ tt_int_op(result, OP_EQ, 0);
+ tt_int_op(test_cells_written, OP_EQ, old_count + 1);
/* But we should have gotten to the fake cellgen loop */
- tt_int_op(test_cmux_cells, ==, 0);
+ tt_int_op(test_cmux_cells, OP_EQ, 0);
/* ...and we should have a queued cell */
q_len_after = chan_cell_queue_len(&(ch->outgoing_queue));
- tt_int_op(q_len_after, ==, q_len_before + 1);
+ tt_int_op(q_len_after, OP_EQ, q_len_before + 1);
/* Now accept cells again and drain the queue */
test_chan_accept_cells = 1;
channel_flush_cells(ch);
- tt_int_op(test_cells_written, ==, old_count + 2);
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+ tt_int_op(test_cells_written, OP_EQ, old_count + 2);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 0);
test_target_cmux = NULL;
test_cmux_cells = 0;
@@ -803,16 +804,17 @@ test_channel_incoming(void *arg)
chan_test_cell_handler,
chan_test_var_cell_handler);
/* Test cell handler getters */
- tt_ptr_op(channel_get_cell_handler(ch), ==, chan_test_cell_handler);
- tt_ptr_op(channel_get_var_cell_handler(ch), ==, chan_test_var_cell_handler);
+ tt_ptr_op(channel_get_cell_handler(ch), OP_EQ, chan_test_cell_handler);
+ tt_ptr_op(channel_get_var_cell_handler(ch), OP_EQ,
+ chan_test_var_cell_handler);
/* Try to register it */
channel_register(ch);
tt_assert(ch->registered);
/* Open it */
- channel_change_state(ch, CHANNEL_STATE_OPEN);
- tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN);
/* Receive a fixed cell */
cell = tor_malloc_zero(sizeof(cell_t));
@@ -820,7 +822,7 @@ test_channel_incoming(void *arg)
old_count = test_chan_fixed_cells_recved;
channel_queue_cell(ch, cell);
tor_free(cell);
- tt_int_op(test_chan_fixed_cells_recved, ==, old_count + 1);
+ tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_count + 1);
/* Receive a variable-size cell */
var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
@@ -828,13 +830,13 @@ test_channel_incoming(void *arg)
old_count = test_chan_var_cells_recved;
channel_queue_var_cell(ch, var_cell);
tor_free(cell);
- tt_int_op(test_chan_var_cells_recved, ==, old_count + 1);
+ tt_int_op(test_chan_var_cells_recved, OP_EQ, old_count + 1);
/* Close it */
channel_mark_for_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED);
channel_run_cleanup();
ch = NULL;
@@ -896,13 +898,13 @@ test_channel_lifecycle(void *arg)
make_fake_cell(cell);
old_count = test_cells_written;
channel_write_cell(ch1, cell);
- tt_int_op(old_count, ==, test_cells_written);
+ tt_int_op(old_count, OP_EQ, test_cells_written);
/* Move it to OPEN and flush */
- channel_change_state(ch1, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch1);
/* Queue should drain */
- tt_int_op(old_count + 1, ==, test_cells_written);
+ tt_int_op(old_count + 1, OP_EQ, test_cells_written);
/* Get another one */
ch2 = new_fake_channel();
@@ -915,41 +917,42 @@ test_channel_lifecycle(void *arg)
tt_assert(ch2->registered);
/* Check counters */
- tt_int_op(test_doesnt_want_writes_count, ==, init_doesnt_want_writes_count);
- tt_int_op(test_releases_count, ==, init_releases_count);
+ tt_int_op(test_doesnt_want_writes_count, OP_EQ,
+ init_doesnt_want_writes_count);
+ tt_int_op(test_releases_count, OP_EQ, init_releases_count);
/* Move ch1 to MAINT */
channel_change_state(ch1, CHANNEL_STATE_MAINT);
- tt_int_op(test_doesnt_want_writes_count, ==,
+ tt_int_op(test_doesnt_want_writes_count, OP_EQ,
init_doesnt_want_writes_count + 1);
- tt_int_op(test_releases_count, ==, init_releases_count);
+ tt_int_op(test_releases_count, OP_EQ, init_releases_count);
/* Move ch2 to OPEN */
- channel_change_state(ch2, CHANNEL_STATE_OPEN);
- tt_int_op(test_doesnt_want_writes_count, ==,
+ channel_change_state_open(ch2);
+ tt_int_op(test_doesnt_want_writes_count, OP_EQ,
init_doesnt_want_writes_count + 1);
- tt_int_op(test_releases_count, ==, init_releases_count);
+ tt_int_op(test_releases_count, OP_EQ, init_releases_count);
/* Move ch1 back to OPEN */
- channel_change_state(ch1, CHANNEL_STATE_OPEN);
- tt_int_op(test_doesnt_want_writes_count, ==,
+ channel_change_state_open(ch1);
+ tt_int_op(test_doesnt_want_writes_count, OP_EQ,
init_doesnt_want_writes_count + 1);
- tt_int_op(test_releases_count, ==, init_releases_count);
+ tt_int_op(test_releases_count, OP_EQ, init_releases_count);
/* Mark ch2 for close */
channel_mark_for_close(ch2);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING);
- tt_int_op(test_doesnt_want_writes_count, ==,
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING);
+ tt_int_op(test_doesnt_want_writes_count, OP_EQ,
init_doesnt_want_writes_count + 1);
- tt_int_op(test_releases_count, ==, init_releases_count + 1);
+ tt_int_op(test_releases_count, OP_EQ, init_releases_count + 1);
/* Shut down channels */
channel_free_all();
ch1 = ch2 = NULL;
- tt_int_op(test_doesnt_want_writes_count, ==,
+ tt_int_op(test_doesnt_want_writes_count, OP_EQ,
init_doesnt_want_writes_count + 1);
/* channel_free() calls scheduler_release_channel() */
- tt_int_op(test_releases_count, ==, init_releases_count + 4);
+ tt_int_op(test_releases_count, OP_EQ, init_releases_count + 4);
done:
free_fake_channel(ch1);
@@ -1001,11 +1004,11 @@ test_channel_lifecycle_2(void *arg)
/* Try to close it */
channel_mark_for_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
/* Finish closing it */
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED);
channel_run_cleanup();
ch = NULL;
@@ -1018,13 +1021,13 @@ test_channel_lifecycle_2(void *arg)
tt_assert(ch->registered);
/* Finish opening it */
- channel_change_state(ch, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
/* Error exit from lower layer */
chan_test_error(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_ERROR);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_ERROR);
channel_run_cleanup();
ch = NULL;
@@ -1037,20 +1040,20 @@ test_channel_lifecycle_2(void *arg)
tt_assert(ch->registered);
/* Finish opening it */
- channel_change_state(ch, CHANNEL_STATE_OPEN);
- tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN);
/* Go to maintenance state */
channel_change_state(ch, CHANNEL_STATE_MAINT);
- tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT);
/* Lower layer close */
channel_mark_for_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
/* Finish */
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED);
channel_run_cleanup();
ch = NULL;
@@ -1066,20 +1069,20 @@ test_channel_lifecycle_2(void *arg)
tt_assert(ch->registered);
/* Finish opening it */
- channel_change_state(ch, CHANNEL_STATE_OPEN);
- tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN);
/* Go to maintenance state */
channel_change_state(ch, CHANNEL_STATE_MAINT);
- tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT);
/* Lower layer close */
channel_close_from_lower_layer(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
/* Finish */
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED);
channel_run_cleanup();
ch = NULL;
@@ -1092,20 +1095,20 @@ test_channel_lifecycle_2(void *arg)
tt_assert(ch->registered);
/* Finish opening it */
- channel_change_state(ch, CHANNEL_STATE_OPEN);
- tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN);
/* Go to maintenance state */
channel_change_state(ch, CHANNEL_STATE_MAINT);
- tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_MAINT);
/* Lower layer close */
chan_test_error(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
/* Finish */
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_ERROR);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_ERROR);
channel_run_cleanup();
ch = NULL;
@@ -1142,11 +1145,11 @@ test_channel_multi(void *arg)
/* Initial queue size update */
channel_update_xmit_queue_size(ch1);
- tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 0);
channel_update_xmit_queue_size(ch2);
- tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 0);
+ tt_u64_op(global_queue_estimate, OP_EQ, 0);
/* Queue some cells, check queue estimates */
cell = tor_malloc_zero(sizeof(cell_t));
@@ -1159,10 +1162,10 @@ test_channel_multi(void *arg)
channel_update_xmit_queue_size(ch1);
channel_update_xmit_queue_size(ch2);
- tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0);
- tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 0);
+ tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 0);
+ tt_u64_op(global_queue_estimate, OP_EQ, 0);
/* Stop accepting cells at lower layer */
test_chan_accept_cells = 0;
@@ -1173,18 +1176,18 @@ test_channel_multi(void *arg)
channel_write_cell(ch1, cell);
channel_update_xmit_queue_size(ch1);
- tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 512);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 512);
+ tt_u64_op(global_queue_estimate, OP_EQ, 512);
cell = tor_malloc_zero(sizeof(cell_t));
make_fake_cell(cell);
channel_write_cell(ch2, cell);
channel_update_xmit_queue_size(ch2);
- tt_u64_op(ch2->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 512);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 1024);
+ tt_u64_op(global_queue_estimate, OP_EQ, 1024);
/* Allow cells through again */
test_chan_accept_cells = 1;
@@ -1195,10 +1198,10 @@ test_channel_multi(void *arg)
/* Update and check queue sizes */
channel_update_xmit_queue_size(ch1);
channel_update_xmit_queue_size(ch2);
- tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512);
- tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 512);
+ tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 512);
+ tt_u64_op(global_queue_estimate, OP_EQ, 512);
/* Flush chan 1 */
channel_flush_cells(ch1);
@@ -1206,10 +1209,10 @@ test_channel_multi(void *arg)
/* Update and check queue sizes */
channel_update_xmit_queue_size(ch1);
channel_update_xmit_queue_size(ch2);
- tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0);
- tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 0);
+ tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 0);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 0);
+ tt_u64_op(global_queue_estimate, OP_EQ, 0);
/* Now block again */
test_chan_accept_cells = 0;
@@ -1227,10 +1230,10 @@ test_channel_multi(void *arg)
/* Check the estimates */
channel_update_xmit_queue_size(ch1);
channel_update_xmit_queue_size(ch2);
- tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512);
- tt_u64_op(ch2->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch1->bytes_queued_for_xmit, OP_EQ, 512);
+ tt_u64_op(ch2->bytes_queued_for_xmit, OP_EQ, 512);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 1024);
+ tt_u64_op(global_queue_estimate, OP_EQ, 1024);
/* Now close channel 2; it should be subtracted from the global queue */
MOCK(scheduler_release_channel, scheduler_release_channel_mock);
@@ -1238,7 +1241,7 @@ test_channel_multi(void *arg)
UNMOCK(scheduler_release_channel);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 512);
+ tt_u64_op(global_queue_estimate, OP_EQ, 512);
/*
* Since the fake channels aren't registered, channel_free_all() can't
@@ -1249,7 +1252,7 @@ test_channel_multi(void *arg)
UNMOCK(scheduler_release_channel);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 0);
+ tt_u64_op(global_queue_estimate, OP_EQ, 0);
/* Now free everything */
MOCK(scheduler_release_channel, scheduler_release_channel_mock);
@@ -1297,7 +1300,7 @@ test_channel_queue_impossible(void *arg)
old_count = test_cells_written;
/* Assert that the queue is initially empty */
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 0);
/* Get a fresh cell and write it to the channel*/
cell = tor_malloc_zero(sizeof(cell_t));
@@ -1306,11 +1309,11 @@ test_channel_queue_impossible(void *arg)
channel_write_cell(ch, cell);
/* Now it should be queued */
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 1);
q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
tt_assert(q);
if (q) {
- tt_int_op(q->type, ==, CELL_QUEUE_FIXED);
+ tt_int_op(q->type, OP_EQ, CELL_QUEUE_FIXED);
tt_assert((uintptr_t)q->u.fixed.cell == cellintptr);
}
/* Do perverse things to it */
@@ -1322,9 +1325,9 @@ test_channel_queue_impossible(void *arg)
* gets thrown away properly.
*/
test_chan_accept_cells = 1;
- channel_change_state(ch, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
tt_assert(test_cells_written == old_count);
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 0);
/* Same thing but for a var_cell */
@@ -1336,11 +1339,11 @@ test_channel_queue_impossible(void *arg)
channel_write_var_cell(ch, var_cell);
/* Check that it's queued */
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 1);
q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
tt_assert(q);
if (q) {
- tt_int_op(q->type, ==, CELL_QUEUE_VAR);
+ tt_int_op(q->type, OP_EQ, CELL_QUEUE_VAR);
tt_assert((uintptr_t)q->u.var.var_cell == cellintptr);
}
@@ -1350,9 +1353,9 @@ test_channel_queue_impossible(void *arg)
/* Let it drain and check that the bad entry is discarded */
test_chan_accept_cells = 1;
- channel_change_state(ch, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
tt_assert(test_cells_written == old_count);
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 0);
/* Same thing with a packed_cell */
@@ -1364,11 +1367,11 @@ test_channel_queue_impossible(void *arg)
channel_write_packed_cell(ch, packed_cell);
/* Check that it's queued */
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 1);
q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
tt_assert(q);
if (q) {
- tt_int_op(q->type, ==, CELL_QUEUE_PACKED);
+ tt_int_op(q->type, OP_EQ, CELL_QUEUE_PACKED);
tt_assert((uintptr_t)q->u.packed.packed_cell == cellintptr);
}
@@ -1378,9 +1381,9 @@ test_channel_queue_impossible(void *arg)
/* Let it drain and check that the bad entry is discarded */
test_chan_accept_cells = 1;
- channel_change_state(ch, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
tt_assert(test_cells_written == old_count);
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 0);
/* Unknown cell type case */
test_chan_accept_cells = 0;
@@ -1391,11 +1394,11 @@ test_channel_queue_impossible(void *arg)
channel_write_cell(ch, cell);
/* Check that it's queued */
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 1);
q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
tt_assert(q);
if (q) {
- tt_int_op(q->type, ==, CELL_QUEUE_FIXED);
+ tt_int_op(q->type, OP_EQ, CELL_QUEUE_FIXED);
tt_assert((uintptr_t)q->u.fixed.cell == cellintptr);
}
/* Clobber it, including the queue entry type */
@@ -1406,11 +1409,11 @@ test_channel_queue_impossible(void *arg)
/* Let it drain and check that the bad entry is discarded */
test_chan_accept_cells = 1;
tor_capture_bugs_(1);
- channel_change_state(ch, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
tt_assert(test_cells_written == old_count);
- tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), OP_EQ, 0);
- tt_int_op(smartlist_len(tor_get_captured_bug_log_()), ==, 1);
+ tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1);
tor_end_capture_bugs_();
done:
@@ -1455,16 +1458,16 @@ test_channel_queue_incoming(void *arg)
ch->cmux = circuitmux_alloc();
/* Test cell handler getters */
- tt_ptr_op(channel_get_cell_handler(ch), ==, NULL);
- tt_ptr_op(channel_get_var_cell_handler(ch), ==, NULL);
+ tt_ptr_op(channel_get_cell_handler(ch), OP_EQ, NULL);
+ tt_ptr_op(channel_get_var_cell_handler(ch), OP_EQ, NULL);
/* Try to register it */
channel_register(ch);
tt_assert(ch->registered);
/* Open it */
- channel_change_state(ch, CHANNEL_STATE_OPEN);
- tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_OPEN);
/* Assert that the incoming queue is empty */
tt_assert(TOR_SIMPLEQ_EMPTY(&(ch->incoming_queue)));
@@ -1475,7 +1478,7 @@ test_channel_queue_incoming(void *arg)
channel_queue_cell(ch, cell);
/* Assert that the incoming queue has one entry */
- tt_int_op(chan_cell_queue_len(&(ch->incoming_queue)), ==, 1);
+ tt_int_op(chan_cell_queue_len(&(ch->incoming_queue)), OP_EQ, 1);
/* Queue an incoming var cell */
var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
@@ -1483,7 +1486,7 @@ test_channel_queue_incoming(void *arg)
channel_queue_var_cell(ch, var_cell);
/* Assert that the incoming queue has two entries */
- tt_int_op(chan_cell_queue_len(&(ch->incoming_queue)), ==, 2);
+ tt_int_op(chan_cell_queue_len(&(ch->incoming_queue)), OP_EQ, 2);
/*
* Install cell handlers; this will drain the queue, so save the old
@@ -1494,12 +1497,13 @@ test_channel_queue_incoming(void *arg)
channel_set_cell_handlers(ch,
chan_test_cell_handler,
chan_test_var_cell_handler);
- tt_ptr_op(channel_get_cell_handler(ch), ==, chan_test_cell_handler);
- tt_ptr_op(channel_get_var_cell_handler(ch), ==, chan_test_var_cell_handler);
+ tt_ptr_op(channel_get_cell_handler(ch), OP_EQ, chan_test_cell_handler);
+ tt_ptr_op(channel_get_var_cell_handler(ch), OP_EQ,
+ chan_test_var_cell_handler);
/* Assert cells were received */
- tt_int_op(test_chan_fixed_cells_recved, ==, old_fixed_count + 1);
- tt_int_op(test_chan_var_cells_recved, ==, old_var_count + 1);
+ tt_int_op(test_chan_fixed_cells_recved, OP_EQ, old_fixed_count + 1);
+ tt_int_op(test_chan_var_cells_recved, OP_EQ, old_var_count + 1);
/*
* Assert that the pointers are different from the cells we allocated;
@@ -1508,17 +1512,17 @@ test_channel_queue_incoming(void *arg)
* delivery. These pointers will have already been freed by the time
* we get here, so don't dereference them.
*/
- tt_ptr_op(test_chan_last_seen_fixed_cell_ptr, !=, cell);
- tt_ptr_op(test_chan_last_seen_var_cell_ptr, !=, var_cell);
+ tt_ptr_op(test_chan_last_seen_fixed_cell_ptr, OP_NE, cell);
+ tt_ptr_op(test_chan_last_seen_var_cell_ptr, OP_NE, var_cell);
/* Assert queue is now empty */
tt_assert(TOR_SIMPLEQ_EMPTY(&(ch->incoming_queue)));
/* Close it; this contains an assertion that the incoming queue is empty */
channel_mark_for_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSING);
chan_test_finish_close(ch);
- tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch->state, OP_EQ, CHANNEL_STATE_CLOSED);
channel_run_cleanup();
ch = NULL;
@@ -1548,14 +1552,14 @@ test_channel_queue_size(void *arg)
/* Initial queue size update */
channel_update_xmit_queue_size(ch);
- tt_u64_op(ch->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 0);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 0);
+ tt_u64_op(global_queue_estimate, OP_EQ, 0);
/* Test the call-through to our fake lower layer */
n = channel_num_cells_writeable(ch);
/* chan_test_num_cells_writeable() always returns 32 */
- tt_int_op(n, ==, 32);
+ tt_int_op(n, OP_EQ, 32);
/*
* Now we queue some cells and check that channel_num_cells_writeable()
@@ -1574,72 +1578,73 @@ test_channel_queue_size(void *arg)
old_count = test_cells_written;
channel_write_cell(ch, cell);
/* Assert that it got queued, not written through, correctly */
- tt_int_op(test_cells_written, ==, old_count);
+ tt_int_op(test_cells_written, OP_EQ, old_count);
/* Now check chan_test_num_cells_writeable() again */
n = channel_num_cells_writeable(ch);
- tt_int_op(n, ==, 0); /* Should return 0 since we're in CHANNEL_STATE_MAINT */
+ /* Should return 0 since we're in CHANNEL_STATE_MAINT */
+ tt_int_op(n, OP_EQ, 0);
/* Update queue size estimates */
channel_update_xmit_queue_size(ch);
/* One cell, times an overhead factor of 1.0 */
- tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
/* Try a different overhead factor */
test_overhead_estimate = 0.5;
/* This one should be ignored since it's below 1.0 */
channel_update_xmit_queue_size(ch);
- tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
/* Now try a larger one */
test_overhead_estimate = 2.0;
channel_update_xmit_queue_size(ch);
- tt_u64_op(ch->bytes_queued_for_xmit, ==, 1024);
+ tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 1024);
/* Go back to 1.0 */
test_overhead_estimate = 1.0;
channel_update_xmit_queue_size(ch);
- tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
/* Check the global estimate too */
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 512);
+ tt_u64_op(global_queue_estimate, OP_EQ, 512);
/* Go to open */
old_count = test_cells_written;
- channel_change_state(ch, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
/*
* It should try to write, but we aren't accepting cells right now, so
* it'll requeue
*/
- tt_int_op(test_cells_written, ==, old_count);
+ tt_int_op(test_cells_written, OP_EQ, old_count);
/* Check the queue size again */
channel_update_xmit_queue_size(ch);
- tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 512);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 512);
+ tt_u64_op(global_queue_estimate, OP_EQ, 512);
/*
* Now the cell is in the queue, and we're open, so we should get 31
* writeable cells.
*/
n = channel_num_cells_writeable(ch);
- tt_int_op(n, ==, 31);
+ tt_int_op(n, OP_EQ, 31);
/* Accept cells again */
test_chan_accept_cells = 1;
/* ...and re-process the queue */
old_count = test_cells_written;
channel_flush_cells(ch);
- tt_int_op(test_cells_written, ==, old_count + 1);
+ tt_int_op(test_cells_written, OP_EQ, old_count + 1);
/* Should have 32 writeable now */
n = channel_num_cells_writeable(ch);
- tt_int_op(n, ==, 32);
+ tt_int_op(n, OP_EQ, 32);
/* Should have queue size estimate of zero */
channel_update_xmit_queue_size(ch);
- tt_u64_op(ch->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch->bytes_queued_for_xmit, OP_EQ, 0);
global_queue_estimate = channel_get_global_queue_estimate();
- tt_u64_op(global_queue_estimate, ==, 0);
+ tt_u64_op(global_queue_estimate, OP_EQ, 0);
/* Okay, now we're done with this one */
MOCK(scheduler_release_channel, scheduler_release_channel_mock);
@@ -1706,7 +1711,7 @@ test_channel_write(void *arg)
* gets drained from the queue.
*/
test_chan_accept_cells = 1;
- channel_change_state(ch, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch);
tt_assert(test_cells_written == old_count + 1);
/*
@@ -1780,7 +1785,7 @@ test_channel_id_map(void *arg)
ed25519_public_key_t ed_zero;
memset(&ed_zero, 0, sizeof(ed_zero));
- tt_assert(sizeof(rsa_id[0]) == DIGEST_LEN); // Do I remember C?
+ tt_int_op(DIGEST_LEN, OP_EQ, sizeof(rsa_id[0])); // Do I remember C?
for (i = 0; i < N_CHAN; ++i) {
crypto_rand(rsa_id[i], DIGEST_LEN);
@@ -1822,7 +1827,7 @@ test_channel_id_map(void *arg)
ch = channel_next_with_rsa_identity(ch);
tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]);
ch = channel_next_with_rsa_identity(ch);
- tt_assert(ch == NULL);
+ tt_ptr_op(ch, OP_EQ, NULL);
/* As above, but with zero Ed25519 ID (meaning "any ID") */
tt_ptr_op(chan[0], OP_EQ,
@@ -1838,7 +1843,7 @@ test_channel_id_map(void *arg)
ch = channel_next_with_rsa_identity(ch);
tt_assert(ch == chan[2] || ch == chan[4] || ch == chan[5]);
ch = channel_next_with_rsa_identity(ch);
- tt_assert(ch == NULL);
+ tt_ptr_op(ch, OP_EQ, NULL);
/* Lookup nonexistent RSA identity */
tt_ptr_op(NULL, OP_EQ,
diff --git a/src/test/test_channeltls.c b/src/test/test_channeltls.c
index 96c5eba9a5..94f1893cae 100644
--- a/src/test/test_channeltls.c
+++ b/src/test/test_channeltls.c
@@ -72,7 +72,7 @@ test_channeltls_create(void *arg)
/* Try connecting */
ch = channel_tls_connect(&test_addr, 567, test_digest, NULL);
- tt_assert(ch != NULL);
+ tt_ptr_op(ch, OP_NE, NULL);
done:
if (ch) {
@@ -121,7 +121,7 @@ test_channeltls_num_bytes_queued(void *arg)
/* Try connecting */
ch = channel_tls_connect(&test_addr, 567, test_digest, NULL);
- tt_assert(ch != NULL);
+ tt_ptr_op(ch, OP_NE, NULL);
/*
* Next, we have to test ch->num_bytes_queued, which is
@@ -132,7 +132,7 @@ test_channeltls_num_bytes_queued(void *arg)
tt_assert(ch->num_bytes_queued != NULL);
tlschan = BASE_CHAN_TO_TLS(ch);
- tt_assert(tlschan != NULL);
+ tt_ptr_op(tlschan, OP_NE, NULL);
if (TO_CONN(tlschan->conn)->outbuf == NULL) {
/* We need an outbuf to make sure buf_datalen() gets called */
fake_outbuf = 1;
@@ -142,7 +142,7 @@ test_channeltls_num_bytes_queued(void *arg)
tlschan_buf_datalen_mock_size = 1024;
MOCK(buf_datalen, tlschan_buf_datalen_mock);
len = ch->num_bytes_queued(ch);
- tt_int_op(len, ==, tlschan_buf_datalen_mock_size);
+ tt_int_op(len, OP_EQ, tlschan_buf_datalen_mock_size);
/*
* We also cover num_cells_writeable here; since wide_circ_ids = 0 on
* the fake tlschans, cell_network_size returns 512, and so with
@@ -151,7 +151,7 @@ test_channeltls_num_bytes_queued(void *arg)
* - 2 cells.
*/
n = ch->num_cells_writeable(ch);
- tt_int_op(n, ==, CEIL_DIV(OR_CONN_HIGHWATER, 512) - 2);
+ tt_int_op(n, OP_EQ, CEIL_DIV(OR_CONN_HIGHWATER, 512) - 2);
UNMOCK(buf_datalen);
tlschan_buf_datalen_mock_target = NULL;
tlschan_buf_datalen_mock_size = 0;
@@ -206,11 +206,11 @@ test_channeltls_overhead_estimate(void *arg)
/* Try connecting */
ch = channel_tls_connect(&test_addr, 567, test_digest, NULL);
- tt_assert(ch != NULL);
+ tt_ptr_op(ch, OP_NE, NULL);
/* First case: silly low ratios should get clamped to 1.0 */
tlschan = BASE_CHAN_TO_TLS(ch);
- tt_assert(tlschan != NULL);
+ tt_ptr_op(tlschan, OP_NE, NULL);
tlschan->conn->bytes_xmitted = 128;
tlschan->conn->bytes_xmitted_by_tls = 64;
r = ch->get_overhead_estimate(ch);
@@ -273,10 +273,10 @@ tlschan_connection_or_connect_mock(const tor_addr_t *addr,
or_connection_t *result = NULL;
(void) ed_id; // XXXX Not yet used.
- tt_assert(addr != NULL);
- tt_assert(port != 0);
- tt_assert(digest != NULL);
- tt_assert(tlschan != NULL);
+ tt_ptr_op(addr, OP_NE, NULL);
+ tt_uint_op(port, OP_NE, 0);
+ tt_ptr_op(digest, OP_NE, NULL);
+ tt_ptr_op(tlschan, OP_NE, NULL);
/* Make a fake orconn */
result = tor_malloc_zero(sizeof(*result));
@@ -301,11 +301,11 @@ tlschan_fake_close_method(channel_t *chan)
{
channel_tls_t *tlschan = NULL;
- tt_assert(chan != NULL);
- tt_int_op(chan->magic, ==, TLS_CHAN_MAGIC);
+ tt_ptr_op(chan, OP_NE, NULL);
+ tt_int_op(chan->magic, OP_EQ, TLS_CHAN_MAGIC);
tlschan = BASE_CHAN_TO_TLS(chan);
- tt_assert(tlschan != NULL);
+ tt_ptr_op(tlschan, OP_NE, NULL);
/* Just free the fake orconn */
tor_free(tlschan->conn->base_.address);
@@ -320,7 +320,7 @@ tlschan_fake_close_method(channel_t *chan)
static int
tlschan_is_local_addr_mock(const tor_addr_t *addr)
{
- tt_assert(addr != NULL);
+ tt_ptr_op(addr, OP_NE, NULL);
done:
return tlschan_local;
diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c
index 344ab27921..f622704ec5 100644
--- a/src/test/test_circuitlist.c
+++ b/src/test/test_circuitlist.c
@@ -180,6 +180,7 @@ static void
test_rend_token_maps(void *arg)
{
or_circuit_t *c1, *c2, *c3, *c4;
+ origin_circuit_t *c5;
const uint8_t tok1[REND_TOKEN_LEN] = "The cat can't tell y";
const uint8_t tok2[REND_TOKEN_LEN] = "ou its name, and it ";
const uint8_t tok3[REND_TOKEN_LEN] = "doesn't really care.";
@@ -194,6 +195,7 @@ test_rend_token_maps(void *arg)
c2 = or_circuit_new(0, NULL);
c3 = or_circuit_new(0, NULL);
c4 = or_circuit_new(0, NULL);
+ c5 = origin_circuit_new();
/* Make sure we really filled up the tok* variables */
tt_int_op(tok1[REND_TOKEN_LEN-1], OP_EQ, 'y');
@@ -264,6 +266,13 @@ test_rend_token_maps(void *arg)
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));
+ /* Now let's do a check for the client-side rend circuitmap */
+ c5->base_.purpose = CIRCUIT_PURPOSE_C_ESTABLISH_REND;
+ hs_circuitmap_register_rend_circ_client_side(c5, tok1);
+
+ tt_ptr_op(c5, OP_EQ, hs_circuitmap_get_rend_circ_client_side(tok1));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_client_side(tok2));
+
done:
if (c1)
circuit_free(TO_CIRCUIT(c1));
@@ -273,6 +282,8 @@ test_rend_token_maps(void *arg)
circuit_free(TO_CIRCUIT(c3));
if (c4)
circuit_free(TO_CIRCUIT(c4));
+ if (c5)
+ circuit_free(TO_CIRCUIT(c5));
}
static void
diff --git a/src/test/test_circuitmux.c b/src/test/test_circuitmux.c
index 779783299d..c5f4f67fa0 100644
--- a/src/test/test_circuitmux.c
+++ b/src/test/test_circuitmux.c
@@ -48,8 +48,8 @@ test_cmux_destroy_cell_queue(void *arg)
ch->wide_circ_ids = 1;
circ = circuitmux_get_first_active_circuit(cmux, &cq);
- tt_assert(!circ);
- tt_assert(!cq);
+ tt_ptr_op(circ, OP_EQ, NULL);
+ tt_ptr_op(cq, OP_EQ, NULL);
circuitmux_append_destroy_cell(ch, cmux, 100, 10);
circuitmux_append_destroy_cell(ch, cmux, 190, 6);
@@ -58,7 +58,7 @@ test_cmux_destroy_cell_queue(void *arg)
tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 3);
circ = circuitmux_get_first_active_circuit(cmux, &cq);
- tt_assert(!circ);
+ tt_ptr_op(circ, OP_EQ, NULL);
tt_assert(cq);
tt_int_op(cq->n, OP_EQ, 3);
diff --git a/src/test/test_circuituse.c b/src/test/test_circuituse.c
index 5cc9fe571e..df1b43807f 100644
--- a/src/test/test_circuituse.c
+++ b/src/test/test_circuituse.c
@@ -22,7 +22,7 @@ test_circuit_is_available_for_use_ret_false_when_marked_for_close(void *arg)
circuit_t *circ = tor_malloc(sizeof(circuit_t));
circ->marked_for_close = 1;
- tt_int_op(0, ==, circuit_is_available_for_use(circ));
+ tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
done:
tor_free(circ);
@@ -36,7 +36,7 @@ test_circuit_is_available_for_use_ret_false_when_timestamp_dirty(void *arg)
circuit_t *circ = tor_malloc(sizeof(circuit_t));
circ->timestamp_dirty = 1;
- tt_int_op(0, ==, circuit_is_available_for_use(circ));
+ tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
done:
tor_free(circ);
@@ -50,7 +50,7 @@ test_circuit_is_available_for_use_ret_false_for_non_general_purpose(void *arg)
circuit_t *circ = tor_malloc(sizeof(circuit_t));
circ->purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
- tt_int_op(0, ==, circuit_is_available_for_use(circ));
+ tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
done:
tor_free(circ);
@@ -64,7 +64,7 @@ test_circuit_is_available_for_use_ret_false_for_non_general_origin(void *arg)
circuit_t *circ = tor_malloc(sizeof(circuit_t));
circ->purpose = CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT;
- tt_int_op(0, ==, circuit_is_available_for_use(circ));
+ tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
done:
tor_free(circ);
@@ -78,7 +78,7 @@ test_circuit_is_available_for_use_ret_false_for_non_origin_purpose(void *arg)
circuit_t *circ = tor_malloc(sizeof(circuit_t));
circ->purpose = CIRCUIT_PURPOSE_OR;
- tt_int_op(0, ==, circuit_is_available_for_use(circ));
+ tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
done:
tor_free(circ);
@@ -92,7 +92,7 @@ test_circuit_is_available_for_use_ret_false_unusable_for_new_conns(void *arg)
circuit_t *circ = dummy_origin_circuit_new(30);
mark_circuit_unusable_for_new_conns(TO_ORIGIN_CIRCUIT(circ));
- tt_int_op(0, ==, circuit_is_available_for_use(circ));
+ tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
done:
circuit_free(circ);
@@ -108,7 +108,7 @@ test_circuit_is_available_for_use_returns_false_for_onehop_tunnel(void *arg)
oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
oc->build_state->onehop_tunnel = 1;
- tt_int_op(0, ==, circuit_is_available_for_use(circ));
+ tt_int_op(0, OP_EQ, circuit_is_available_for_use(circ));
done:
circuit_free(circ);
@@ -124,7 +124,7 @@ test_circuit_is_available_for_use_returns_true_for_clean_circuit(void *arg)
oc->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
oc->build_state->onehop_tunnel = 0;
- tt_int_op(1, ==, circuit_is_available_for_use(circ));
+ tt_int_op(1, OP_EQ, circuit_is_available_for_use(circ));
done:
circuit_free(circ);
@@ -165,7 +165,8 @@ test_needs_exit_circuits_ret_false_for_predicted_ports_and_path(void *arg)
int needs_capacity = 0;
time_t now = time(NULL);
- tt_int_op(0, ==, needs_exit_circuits(now, &needs_uptime, &needs_capacity));
+ tt_int_op(0, OP_EQ,
+ needs_exit_circuits(now, &needs_uptime, &needs_capacity));
done:
UNMOCK(circuit_all_predicted_ports_handled);
@@ -183,7 +184,8 @@ test_needs_exit_circuits_ret_false_for_non_exit_consensus_path(void *arg)
MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path);
time_t now = time(NULL);
- tt_int_op(0, ==, needs_exit_circuits(now, &needs_uptime, &needs_capacity));
+ tt_int_op(0, OP_EQ,
+ needs_exit_circuits(now, &needs_uptime, &needs_capacity));
done:
UNMOCK(circuit_all_predicted_ports_handled);
@@ -202,7 +204,8 @@ test_needs_exit_circuits_ret_true_for_predicted_ports_and_path(void *arg)
MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path);
time_t now = time(NULL);
- tt_int_op(1, ==, needs_exit_circuits(now, &needs_uptime, &needs_capacity));
+ tt_int_op(1, OP_EQ,
+ needs_exit_circuits(now, &needs_uptime, &needs_capacity));
done:
UNMOCK(circuit_all_predicted_ports_handled);
@@ -214,7 +217,7 @@ test_needs_circuits_for_build_ret_false_consensus_path_unknown(void *arg)
{
(void)arg;
MOCK(router_have_consensus_path, mock_router_have_unknown_consensus_path);
- tt_int_op(0, ==, needs_circuits_for_build(0));
+ tt_int_op(0, OP_EQ, needs_circuits_for_build(0));
done: ;
}
@@ -223,7 +226,7 @@ test_needs_circuits_for_build_ret_false_if_num_less_than_max(void *arg)
{
(void)arg;
MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path);
- tt_int_op(0, ==, needs_circuits_for_build(13));
+ tt_int_op(0, OP_EQ, needs_circuits_for_build(13));
done:
UNMOCK(router_have_consensus_path);
}
@@ -233,7 +236,7 @@ test_needs_circuits_for_build_returns_true_when_more_are_needed(void *arg)
{
(void)arg;
MOCK(router_have_consensus_path, mock_router_have_exit_consensus_path);
- tt_int_op(1, ==, needs_circuits_for_build(0));
+ tt_int_op(1, OP_EQ, needs_circuits_for_build(0));
done:
UNMOCK(router_have_consensus_path);
}
diff --git a/src/test/test_config.c b/src/test/test_config.c
index 40d562a6f8..33ce5a4b3f 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -368,12 +368,12 @@ good_bridge_line_test(const char *string, const char *test_addrport,
/* If we were asked to validate a digest, but we did not get a
digest after parsing, we failed. */
if (test_digest && tor_digest_is_zero(bridge_line->digest))
- tt_assert(0);
+ tt_abort();
/* If we were not asked to validate a digest, and we got a digest
after parsing, we failed again. */
if (!test_digest && !tor_digest_is_zero(bridge_line->digest))
- tt_assert(0);
+ tt_abort();
/* If we were asked to validate a digest, and we got a digest after
parsing, make sure it's correct. */
@@ -387,17 +387,17 @@ good_bridge_line_test(const char *string, const char *test_addrport,
/* If we were asked to validate a transport name, make sure tha it
matches with the transport name that was parsed. */
if (test_transport && !bridge_line->transport_name)
- tt_assert(0);
+ tt_abort();
if (!test_transport && bridge_line->transport_name)
- tt_assert(0);
+ tt_abort();
if (test_transport)
tt_str_op(test_transport,OP_EQ, bridge_line->transport_name);
/* Validate the SOCKS argument smartlist. */
if (test_socks_args && !bridge_line->socks_args)
- tt_assert(0);
+ tt_abort();
if (!test_socks_args && bridge_line->socks_args)
- tt_assert(0);
+ tt_abort();
if (test_socks_args)
tt_assert(smartlist_strings_eq(test_socks_args,
bridge_line->socks_args));
@@ -415,7 +415,7 @@ bad_bridge_line_test(const char *string)
bridge_line_t *bridge_line = parse_bridge_line(string);
if (bridge_line)
TT_FAIL(("%s was supposed to fail, but it didn't.", string));
- tt_assert(!bridge_line);
+ tt_ptr_op(bridge_line, OP_EQ, NULL);
done:
bridge_line_free(bridge_line);
@@ -523,18 +523,18 @@ test_config_parse_transport_options_line(void *arg)
{ /* too small line */
options_sl = get_options_from_transport_options_line("valley", NULL);
- tt_assert(!options_sl);
+ tt_ptr_op(options_sl, OP_EQ, NULL);
}
{ /* no k=v values */
options_sl = get_options_from_transport_options_line("hit it!", NULL);
- tt_assert(!options_sl);
+ tt_ptr_op(options_sl, OP_EQ, NULL);
}
{ /* correct line, but wrong transport specified */
options_sl =
get_options_from_transport_options_line("trebuchet k=v", "rook");
- tt_assert(!options_sl);
+ tt_ptr_op(options_sl, OP_EQ, NULL);
}
{ /* correct -- no transport specified */
@@ -658,84 +658,84 @@ test_config_parse_transport_plugin_line(void *arg)
/* Bad transport lines - too short */
r = parse_transport_line(options, "bad", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options, "bad", 1, 1);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options, "bad bad", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options, "bad bad", 1, 1);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
/* Test transport list parsing */
r = parse_transport_line(options,
"transport_1 exec /usr/bin/fake-transport", 1, 0);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
r = parse_transport_line(options,
"transport_1 exec /usr/bin/fake-transport", 1, 1);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
r = parse_transport_line(options,
"transport_1,transport_2 exec /usr/bin/fake-transport", 1, 0);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
r = parse_transport_line(options,
"transport_1,transport_2 exec /usr/bin/fake-transport", 1, 1);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
/* Bad transport identifiers */
r = parse_transport_line(options,
"transport_* exec /usr/bin/fake-transport", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options,
"transport_* exec /usr/bin/fake-transport", 1, 1);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
/* Check SOCKS cases for client transport */
r = parse_transport_line(options,
"transport_1 socks4 1.2.3.4:567", 1, 0);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
r = parse_transport_line(options,
"transport_1 socks5 1.2.3.4:567", 1, 0);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
/* Proxy case for server transport */
r = parse_transport_line(options,
"transport_1 proxy 1.2.3.4:567", 1, 1);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
/* Multiple-transport error exit */
r = parse_transport_line(options,
"transport_1,transport_2 socks5 1.2.3.4:567", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options,
"transport_1,transport_2 proxy 1.2.3.4:567", 1, 1);
/* No port error exit */
r = parse_transport_line(options,
"transport_1 socks5 1.2.3.4", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options,
"transport_1 proxy 1.2.3.4", 1, 1);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
/* Unparsable address error exit */
r = parse_transport_line(options,
"transport_1 socks5 1.2.3:6x7", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options,
"transport_1 proxy 1.2.3:6x7", 1, 1);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
/* "Strange {Client|Server}TransportPlugin field" error exit */
r = parse_transport_line(options,
"transport_1 foo bar", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options,
"transport_1 foo bar", 1, 1);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
/* No sandbox mode error exit */
tmp = options->Sandbox;
options->Sandbox = 1;
r = parse_transport_line(options,
"transport_1 exec /usr/bin/fake-transport", 1, 0);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
r = parse_transport_line(options,
"transport_1 exec /usr/bin/fake-transport", 1, 1);
- tt_assert(r < 0);
+ tt_int_op(r, OP_LT, 0);
options->Sandbox = tmp;
/*
@@ -747,7 +747,7 @@ test_config_parse_transport_plugin_line(void *arg)
pt_kickstart_proxy_mock_call_count;
r = parse_transport_line(options,
"transport_1 exec /usr/bin/fake-transport", 0, 1);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_assert(pt_kickstart_proxy_mock_call_count ==
old_pt_kickstart_proxy_mock_call_count + 1);
UNMOCK(pt_kickstart_proxy);
@@ -755,7 +755,7 @@ test_config_parse_transport_plugin_line(void *arg)
/* This one hits a log line in the !validate_only case only */
r = parse_transport_line(options,
"transport_1 proxy 1.2.3.4:567", 0, 1);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
/* Check mocked client transport cases */
MOCK(pt_kickstart_proxy, pt_kickstart_proxy_mock);
@@ -773,7 +773,7 @@ test_config_parse_transport_plugin_line(void *arg)
r = parse_transport_line(options,
"transport_1 exec /usr/bin/fake-transport", 0, 0);
/* Should have succeeded */
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
/* transport_is_needed() should have been called */
tt_assert(transport_is_needed_mock_call_count ==
old_transport_is_needed_mock_call_count + 1);
@@ -797,7 +797,7 @@ test_config_parse_transport_plugin_line(void *arg)
r = parse_transport_line(options,
"transport_1 exec /usr/bin/fake-transport", 0, 0);
/* Should have succeeded */
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
/*
* transport_is_needed() and pt_kickstart_proxy() should have been
* called.
@@ -821,7 +821,7 @@ test_config_parse_transport_plugin_line(void *arg)
r = parse_transport_line(options,
"transport_1 socks5 1.2.3.4:567", 0, 0);
/* Should have succeeded */
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
/*
* transport_is_needed() and transport_add_from_config() should have
* been called.
@@ -1139,7 +1139,7 @@ test_config_resolve_my_address(void *arg)
&method_used,&hostname_out);
tt_want(retval == 0);
- tt_want_str_op(method_used,==,"CONFIGURED");
+ tt_want_str_op(method_used,OP_EQ,"CONFIGURED");
tt_want(hostname_out == NULL);
tt_assert(resolved_addr == 0x80348069);
@@ -1164,8 +1164,8 @@ test_config_resolve_my_address(void *arg)
tt_want(retval == 0);
tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1);
- tt_want_str_op(method_used,==,"RESOLVED");
- tt_want_str_op(hostname_out,==,"www.torproject.org");
+ tt_want_str_op(method_used,OP_EQ,"RESOLVED");
+ tt_want_str_op(hostname_out,OP_EQ,"www.torproject.org");
tt_assert(resolved_addr == 0x01010101);
UNMOCK(tor_lookup_hostname);
@@ -1196,8 +1196,8 @@ test_config_resolve_my_address(void *arg)
tt_want(retval == 0);
tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1);
tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1);
- tt_want_str_op(method_used,==,"GETHOSTNAME");
- tt_want_str_op(hostname_out,==,"onionrouter!");
+ tt_want_str_op(method_used,OP_EQ,"GETHOSTNAME");
+ tt_want_str_op(hostname_out,OP_EQ,"onionrouter!");
tt_assert(resolved_addr == 0x01010101);
UNMOCK(tor_gethostname);
@@ -1219,7 +1219,7 @@ test_config_resolve_my_address(void *arg)
&method_used,&hostname_out);
tt_want(resolved_addr == 0);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
tor_free(options->Address);
tor_free(hostname_out);
@@ -1241,7 +1241,7 @@ test_config_resolve_my_address(void *arg)
&method_used,&hostname_out);
tt_want(n_hostname_failure == prev_n_hostname_failure + 1);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
UNMOCK(tor_lookup_hostname);
@@ -1262,7 +1262,7 @@ test_config_resolve_my_address(void *arg)
&method_used,&hostname_out);
tt_want(n_gethostname_failure == prev_n_gethostname_failure + 1);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
UNMOCK(tor_gethostname);
tor_free(hostname_out);
@@ -1285,11 +1285,11 @@ test_config_resolve_my_address(void *arg)
&method_used,&hostname_out);
tt_want(retval == 0);
- tt_want_int_op(n_gethostname_replacement, ==,
+ tt_want_int_op(n_gethostname_replacement, OP_EQ,
prev_n_gethostname_replacement + 1);
- tt_want_int_op(n_get_interface_address, ==,
+ tt_want_int_op(n_get_interface_address, OP_EQ,
prev_n_get_interface_address + 1);
- tt_want_str_op(method_used,==,"INTERFACE");
+ tt_want_str_op(method_used,OP_EQ,"INTERFACE");
tt_want(hostname_out == NULL);
tt_assert(resolved_addr == 0x08080808);
@@ -1315,7 +1315,7 @@ test_config_resolve_my_address(void *arg)
prev_n_get_interface_address_failure + 1);
tt_want(n_gethostname_replacement ==
prev_n_gethostname_replacement + 1);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
UNMOCK(get_interface_address);
tor_free(hostname_out);
@@ -1345,7 +1345,7 @@ test_config_resolve_my_address(void *arg)
tt_want(n_hostname_failure == prev_n_hostname_failure + 1);
tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1);
tt_want(retval == 0);
- tt_want_str_op(method_used,==,"INTERFACE");
+ tt_want_str_op(method_used,OP_EQ,"INTERFACE");
tt_assert(resolved_addr == 0x09090909);
UNMOCK(tor_lookup_hostname);
@@ -1375,7 +1375,7 @@ test_config_resolve_my_address(void *arg)
&method_used,&hostname_out);
tt_want(n_hostname_failure == prev_n_hostname_failure + 1);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
UNMOCK(tor_gethostname);
UNMOCK(tor_lookup_hostname);
@@ -1419,9 +1419,9 @@ test_config_resolve_my_address(void *arg)
tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1);
tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1);
- tt_str_op(method_used,==,"INTERFACE");
- tt_assert(!hostname_out);
- tt_assert(retval == 0);
+ tt_str_op(method_used,OP_EQ,"INTERFACE");
+ tt_ptr_op(hostname_out, OP_EQ, NULL);
+ tt_int_op(retval, OP_EQ, 0);
/*
* CASE 11b:
@@ -1446,7 +1446,7 @@ test_config_resolve_my_address(void *arg)
tt_want(n_get_interface_address6_failure ==
prev_n_get_interface_address6_failure + 1);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
UNMOCK(tor_gethostname);
UNMOCK(tor_lookup_hostname);
@@ -1475,7 +1475,7 @@ test_config_resolve_my_address(void *arg)
&method_used,&hostname_out);
tt_want(n_gethostname_localhost == prev_n_gethostname_localhost + 1);
- tt_assert(retval == -1);
+ tt_int_op(retval, OP_EQ, -1);
UNMOCK(tor_gethostname);
@@ -1510,18 +1510,18 @@ test_config_adding_trusted_dir_server(void *arg)
NULL, V3_DIRINFO, 1.0);
tt_assert(ds);
dir_server_add(ds);
- tt_assert(get_n_authorities(V3_DIRINFO) == 1);
- tt_assert(smartlist_len(router_get_fallback_dir_servers()) == 1);
+ tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 1);
+ tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1);
/* create a trusted ds with an IPv6 address and port */
rv = tor_addr_port_parse(LOG_WARN, "[::1]:9061", &ipv6.addr, &ipv6.port, -1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
ds = trusted_dir_server_new("ds", "127.0.0.1", 9059, 9060, &ipv6, digest,
NULL, V3_DIRINFO, 1.0);
tt_assert(ds);
dir_server_add(ds);
- tt_assert(get_n_authorities(V3_DIRINFO) == 2);
- tt_assert(smartlist_len(router_get_fallback_dir_servers()) == 2);
+ tt_int_op(get_n_authorities(V3_DIRINFO), OP_EQ, 2);
+ tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 2);
done:
clear_dir_servers();
@@ -1543,21 +1543,21 @@ test_config_adding_fallback_dir_server(void *arg)
routerlist_free_all();
rv = tor_addr_parse(&ipv4, "127.0.0.1");
- tt_assert(rv == AF_INET);
+ tt_int_op(rv, OP_EQ, AF_INET);
/* create a trusted ds without an IPv6 address and port */
ds = fallback_dir_server_new(&ipv4, 9059, 9060, NULL, digest, 1.0);
tt_assert(ds);
dir_server_add(ds);
- tt_assert(smartlist_len(router_get_fallback_dir_servers()) == 1);
+ tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1);
/* create a trusted ds with an IPv6 address and port */
rv = tor_addr_port_parse(LOG_WARN, "[::1]:9061", &ipv6.addr, &ipv6.port, -1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
ds = fallback_dir_server_new(&ipv4, 9059, 9060, &ipv6, digest, 1.0);
tt_assert(ds);
dir_server_add(ds);
- tt_assert(smartlist_len(router_get_fallback_dir_servers()) == 2);
+ tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 2);
done:
clear_dir_servers();
@@ -1588,14 +1588,14 @@ test_config_parsing_trusted_dir_server(void *arg)
rv = parse_dir_authority_line(TEST_DIR_AUTH_LINE_START
TEST_DIR_AUTH_LINE_END,
V3_DIRINFO, 1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
/* parse a trusted dir server with an IPv6 address and port */
rv = parse_dir_authority_line(TEST_DIR_AUTH_LINE_START
TEST_DIR_AUTH_IPV6_FLAG
TEST_DIR_AUTH_LINE_END,
V3_DIRINFO, 1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
/* Since we are only validating, there is no cleanup. */
done:
@@ -1623,13 +1623,13 @@ test_config_parsing_fallback_dir_server(void *arg)
/* parse a trusted dir server without an IPv6 address and port */
rv = parse_dir_fallback_line(TEST_DIR_FALLBACK_LINE, 1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
/* parse a trusted dir server with an IPv6 address and port */
rv = parse_dir_fallback_line(TEST_DIR_FALLBACK_LINE
TEST_DIR_FALLBACK_IPV6_FLAG,
1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
/* Since we are only validating, there is no cleanup. */
done:
@@ -1649,8 +1649,8 @@ test_config_adding_default_trusted_dir_servers(void *arg)
/* Assume we only have one bridge authority */
add_default_trusted_dir_authorities(BRIDGE_DIRINFO);
- tt_assert(get_n_authorities(BRIDGE_DIRINFO) == 1);
- tt_assert(smartlist_len(router_get_fallback_dir_servers()) == 1);
+ tt_int_op(get_n_authorities(BRIDGE_DIRINFO), OP_EQ, 1);
+ tt_int_op(smartlist_len(router_get_fallback_dir_servers()), OP_EQ, 1);
/* Assume we have eight V3 authorities */
add_default_trusted_dir_authorities(V3_DIRINFO);
@@ -1838,7 +1838,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 1);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -1857,7 +1857,7 @@ test_config_adding_dir_servers(void *arg)
1 : 0)
);
/* If we have no default bridge authority, something has gone wrong */
- tt_assert(n_default_alt_bridge_authority >= 1);
+ tt_int_op(n_default_alt_bridge_authority, OP_GE, 1);
/* Count v3 Authorities */
SMARTLIST_FOREACH(fallback_servers,
@@ -1869,7 +1869,7 @@ test_config_adding_dir_servers(void *arg)
1 : 0)
);
/* If we have no default authorities, something has gone really wrong */
- tt_assert(n_default_alt_dir_authority >= 1);
+ tt_int_op(n_default_alt_dir_authority, OP_GE, 1);
/* Calculate Fallback Directory Count */
n_default_fallback_dir = (smartlist_len(fallback_servers) -
@@ -1879,7 +1879,7 @@ test_config_adding_dir_servers(void *arg)
* or some authorities aren't being added as fallback directories.
* (networkstatus_consensus_can_use_extra_fallbacks depends on all
* authorities being fallback directories.) */
- tt_assert(n_default_fallback_dir >= 0);
+ tt_int_op(n_default_fallback_dir, OP_GE, 0);
}
}
@@ -1920,7 +1920,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -1929,7 +1929,7 @@ test_config_adding_dir_servers(void *arg)
/* trusted_dir_servers */
const smartlist_t *dir_servers = router_get_trusted_dir_servers();
/* D0, (No B1), (No A2) */
- tt_assert(smartlist_len(dir_servers) == 1);
+ tt_int_op(smartlist_len(dir_servers), OP_EQ, 1);
/* DirAuthority - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -1941,7 +1941,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 1);
+ tt_int_op(found_D0, OP_EQ, 1);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -1953,7 +1953,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -1965,14 +1965,14 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
}
{
/* fallback_dir_servers */
const smartlist_t *fallback_servers = router_get_fallback_dir_servers();
/* D0, (No B1), (No A2), Custom Fallback */
- tt_assert(smartlist_len(fallback_servers) == 2);
+ tt_int_op(smartlist_len(fallback_servers), OP_EQ, 2);
/* DirAuthority - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -1984,7 +1984,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 1);
+ tt_int_op(found_D0, OP_EQ, 1);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -1996,7 +1996,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2008,7 +2008,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* Custom FallbackDir - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -2020,7 +2020,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 1);
+ tt_int_op(found_non_default_fallback, OP_EQ, 1);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -2032,7 +2032,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
}
}
@@ -2061,7 +2061,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we just have the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0);
@@ -2070,7 +2070,7 @@ test_config_adding_dir_servers(void *arg)
/* trusted_dir_servers */
const smartlist_t *dir_servers = router_get_trusted_dir_servers();
/* D0, (No B1), (No A2) */
- tt_assert(smartlist_len(dir_servers) == 1);
+ tt_int_op(smartlist_len(dir_servers), OP_EQ, 1);
/* DirAuthority - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -2082,7 +2082,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 1);
+ tt_int_op(found_D0, OP_EQ, 1);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2094,7 +2094,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2106,14 +2106,14 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
}
{
/* fallback_dir_servers */
const smartlist_t *fallback_servers = router_get_fallback_dir_servers();
/* D0, (No B1), (No A2), (No Fallback) */
- tt_assert(smartlist_len(fallback_servers) == 1);
+ tt_int_op(smartlist_len(fallback_servers), OP_EQ, 1);
/* DirAuthority - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -2125,7 +2125,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 1);
+ tt_int_op(found_D0, OP_EQ, 1);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2137,7 +2137,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2149,7 +2149,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -2161,7 +2161,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 0);
+ tt_int_op(found_non_default_fallback, OP_EQ, 0);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -2173,7 +2173,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
}
}
@@ -2202,7 +2202,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -2211,7 +2211,7 @@ test_config_adding_dir_servers(void *arg)
/* trusted_dir_servers */
const smartlist_t *dir_servers = router_get_trusted_dir_servers();
/* (No D0), B1, A2 */
- tt_assert(smartlist_len(dir_servers) == 2);
+ tt_int_op(smartlist_len(dir_servers), OP_EQ, 2);
/* (No DirAuthority) - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -2223,7 +2223,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2235,7 +2235,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2247,14 +2247,14 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
}
{
/* fallback_dir_servers */
const smartlist_t *fallback_servers = router_get_fallback_dir_servers();
/* (No D0), B1, A2, Custom Fallback */
- tt_assert(smartlist_len(fallback_servers) == 3);
+ tt_int_op(smartlist_len(fallback_servers), OP_EQ, 3);
/* (No DirAuthority) - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -2266,7 +2266,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2278,7 +2278,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2290,7 +2290,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
/* Custom FallbackDir - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -2302,7 +2302,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 1);
+ tt_int_op(found_non_default_fallback, OP_EQ, 1);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -2314,7 +2314,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
}
}
@@ -2344,7 +2344,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0);
@@ -2353,7 +2353,7 @@ test_config_adding_dir_servers(void *arg)
/* trusted_dir_servers */
const smartlist_t *dir_servers = router_get_trusted_dir_servers();
/* (No D0), B1, A2 */
- tt_assert(smartlist_len(dir_servers) == 2);
+ tt_int_op(smartlist_len(dir_servers), OP_EQ, 2);
/* (No DirAuthority) - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -2365,7 +2365,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2377,7 +2377,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2389,14 +2389,14 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
}
{
/* fallback_dir_servers */
const smartlist_t *fallback_servers = router_get_fallback_dir_servers();
/* (No D0), B1, A2, (No Fallback) */
- tt_assert(smartlist_len(fallback_servers) == 2);
+ tt_int_op(smartlist_len(fallback_servers), OP_EQ, 2);
/* (No DirAuthority) - D0 - dir_port: 60090 */
int found_D0 = 0;
@@ -2408,7 +2408,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2420,7 +2420,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2432,7 +2432,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
/* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -2444,7 +2444,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 0);
+ tt_int_op(found_non_default_fallback, OP_EQ, 0);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -2456,7 +2456,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
}
}
@@ -2496,7 +2496,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -2517,7 +2517,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2529,7 +2529,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2541,7 +2541,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default v3 non-Bridge directory authorities, so let's assume that
@@ -2567,7 +2567,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2579,7 +2579,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2591,7 +2591,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* Custom FallbackDir - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -2603,7 +2603,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 1);
+ tt_int_op(found_non_default_fallback, OP_EQ, 1);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -2615,7 +2615,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default v3 non-Bridge directory authorities, so let's assume that
@@ -2650,7 +2650,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 1);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -2671,7 +2671,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2683,7 +2683,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2695,7 +2695,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default v3 non-Bridge directory authorities, so let's assume that
@@ -2721,7 +2721,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* AlternateBridgeAuthority - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2733,7 +2733,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 1);
+ tt_int_op(found_B1, OP_EQ, 1);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2745,7 +2745,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -2757,7 +2757,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 0);
+ tt_int_op(found_non_default_fallback, OP_EQ, 0);
/* Default FallbackDir - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -2769,7 +2769,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 1);
+ tt_int_op(found_default_fallback, OP_EQ, 1);
/* There's no easy way of checking that we have included all the
* default v3 non-Bridge directory authorities, so let's assume that
@@ -2813,7 +2813,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -2835,7 +2835,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2847,7 +2847,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2859,7 +2859,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
/* There's no easy way of checking that we have included all the
* default Bridge authorities (except for hard-coding tonga's details),
@@ -2886,7 +2886,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -2898,7 +2898,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -2910,7 +2910,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
/* Custom FallbackDir - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -2922,7 +2922,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 1);
+ tt_int_op(found_non_default_fallback, OP_EQ, 1);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -2934,7 +2934,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default Bridge authorities (except for hard-coding tonga's details),
@@ -2970,7 +2970,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we just have the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 0);
@@ -2993,7 +2993,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -3005,7 +3005,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -3017,7 +3017,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
/* There's no easy way of checking that we have included all the
* default Bridge authorities (except for hard-coding tonga's details),
@@ -3044,7 +3044,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -3056,7 +3056,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* AlternateDirAuthority - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -3068,7 +3068,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 1);
+ tt_int_op(found_A2, OP_EQ, 1);
/* (No Custom FallbackDir) - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -3080,7 +3080,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 0);
+ tt_int_op(found_non_default_fallback, OP_EQ, 0);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -3092,7 +3092,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default Bridge authorities (except for hard-coding tonga's details),
@@ -3136,7 +3136,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must not have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 0);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 0);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -3158,7 +3158,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -3170,7 +3170,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -3182,7 +3182,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default Bridge & V3 Directory authorities, so let's assume that
@@ -3209,7 +3209,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -3221,7 +3221,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -3233,7 +3233,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* Custom FallbackDir - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -3245,7 +3245,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 1);
+ tt_int_op(found_non_default_fallback, OP_EQ, 1);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -3257,7 +3257,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 0);
+ tt_int_op(found_default_fallback, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default Bridge & V3 Directory authorities, so let's assume that
@@ -3299,7 +3299,7 @@ test_config_adding_dir_servers(void *arg)
/* check outcome */
/* we must have added the default fallback dirs */
- tt_assert(n_add_default_fallback_dir_servers_known_default == 1);
+ tt_int_op(n_add_default_fallback_dir_servers_known_default, OP_EQ, 1);
/* we have more fallbacks than just the authorities */
tt_assert(networkstatus_consensus_can_use_extra_fallbacks(options) == 1);
@@ -3321,7 +3321,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -3333,7 +3333,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -3345,7 +3345,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* There's no easy way of checking that we have included all the
* default Bridge & V3 Directory authorities, so let's assume that
@@ -3372,7 +3372,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60090 ?
1 : 0)
);
- tt_assert(found_D0 == 0);
+ tt_int_op(found_D0, OP_EQ, 0);
/* (No AlternateBridgeAuthority) - B1 - dir_port: 60091 */
int found_B1 = 0;
@@ -3384,7 +3384,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60091 ?
1 : 0)
);
- tt_assert(found_B1 == 0);
+ tt_int_op(found_B1, OP_EQ, 0);
/* (No AlternateDirAuthority) - A2 - dir_port: 60092 */
int found_A2 = 0;
@@ -3396,7 +3396,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60092 ?
1 : 0)
);
- tt_assert(found_A2 == 0);
+ tt_int_op(found_A2, OP_EQ, 0);
/* Custom FallbackDir - No Nickname - dir_port: 60093 */
int found_non_default_fallback = 0;
@@ -3408,7 +3408,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60093 ?
1 : 0)
);
- tt_assert(found_non_default_fallback == 0);
+ tt_int_op(found_non_default_fallback, OP_EQ, 0);
/* (No Default FallbackDir) - No Nickname - dir_port: 60099 */
int found_default_fallback = 0;
@@ -3420,7 +3420,7 @@ test_config_adding_dir_servers(void *arg)
(ds->dir_port == 60099 ?
1 : 0)
);
- tt_assert(found_default_fallback == 1);
+ tt_int_op(found_default_fallback, OP_EQ, 1);
/* There's no easy way of checking that we have included all the
* default Bridge & V3 Directory authorities, and the default
@@ -3477,7 +3477,7 @@ test_config_default_dir_servers(void *arg)
opts = NULL;
/* assume a release will never go out with less than 7 authorities */
- tt_assert(trusted_count >= 7);
+ tt_int_op(trusted_count, OP_GE, 7);
/* if we disable the default fallbacks, there must not be any extra */
tt_assert(fallback_count == trusted_count);
@@ -3490,7 +3490,7 @@ test_config_default_dir_servers(void *arg)
opts = NULL;
/* assume a release will never go out with less than 7 authorities */
- tt_assert(trusted_count >= 7);
+ tt_int_op(trusted_count, OP_GE, 7);
/* XX/teor - allow for default fallbacks to be added without breaking
* the unit tests. Set a minimum fallback count once the list is stable. */
tt_assert(fallback_count >= trusted_count);
@@ -3559,18 +3559,18 @@ test_config_directory_fetch(void *arg)
options->ClientOnly = 1;
tt_assert(server_mode(options) == 0);
tt_assert(public_server_mode(options) == 0);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 1);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 1);
/* Bridge Clients can use multiple directory mirrors for bootstrap */
memset(options, 0, sizeof(or_options_t));
options->UseBridges = 1;
tt_assert(server_mode(options) == 0);
tt_assert(public_server_mode(options) == 0);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 1);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 1);
/* Bridge Relays (Bridges) must act like clients, and use multiple
* directory mirrors for bootstrap */
@@ -3579,9 +3579,9 @@ test_config_directory_fetch(void *arg)
options->ORPort_set = 1;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 0);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 1);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 1);
/* Clients set to FetchDirInfoEarly must fetch it from the authorities,
* but can use multiple authorities for bootstrap */
@@ -3589,9 +3589,9 @@ test_config_directory_fetch(void *arg)
options->FetchDirInfoEarly = 1;
tt_assert(server_mode(options) == 0);
tt_assert(public_server_mode(options) == 0);
- tt_assert(directory_fetches_from_authorities(options) == 1);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 1);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 1);
/* OR servers only fetch the consensus from the authorities when they don't
* know their own address, but never use multiple directories for bootstrap
@@ -3602,16 +3602,16 @@ test_config_directory_fetch(void *arg)
mock_router_pick_published_address_result = -1;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 1);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
mock_router_pick_published_address_result = 0;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
/* Exit OR servers only fetch the consensus from the authorities when they
* refuse unknown exits, but never use multiple directories for bootstrap
@@ -3629,17 +3629,17 @@ test_config_directory_fetch(void *arg)
options->RefuseUnknownExits = 1;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 1);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
options->RefuseUnknownExits = 0;
mock_router_pick_published_address_result = 0;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
/* Dir servers fetch the consensus from the authorities, unless they are not
* advertising themselves (hibernating) or have no routerinfo or are not
@@ -3658,26 +3658,26 @@ test_config_directory_fetch(void *arg)
mock_router_get_my_routerinfo_result = &routerinfo;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 1);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
mock_advertised_server_mode_result = 0;
routerinfo.dir_port = 1;
mock_router_get_my_routerinfo_result = &routerinfo;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
mock_advertised_server_mode_result = 1;
mock_router_get_my_routerinfo_result = NULL;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
mock_advertised_server_mode_result = 1;
routerinfo.dir_port = 0;
@@ -3685,9 +3685,9 @@ test_config_directory_fetch(void *arg)
mock_router_get_my_routerinfo_result = &routerinfo;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 0);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
mock_advertised_server_mode_result = 1;
routerinfo.dir_port = 1;
@@ -3695,9 +3695,9 @@ test_config_directory_fetch(void *arg)
mock_router_get_my_routerinfo_result = &routerinfo;
tt_assert(server_mode(options) == 1);
tt_assert(public_server_mode(options) == 1);
- tt_assert(directory_fetches_from_authorities(options) == 1);
- tt_assert(networkstatus_consensus_can_use_multiple_directories(options)
- == 0);
+ tt_int_op(directory_fetches_from_authorities(options), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_can_use_multiple_directories(options),
+ OP_EQ, 0);
done:
tor_free(options);
@@ -4816,6 +4816,7 @@ test_config_include_limit(void *data)
(void)data;
config_line_t *result = NULL;
+ char *torrc_path = NULL;
char *dir = tor_strdup(get_fname("test_include_limit"));
tt_ptr_op(dir, OP_NE, NULL);
@@ -4825,8 +4826,7 @@ test_config_include_limit(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char torrc_path[PATH_MAX+1];
- tor_snprintf(torrc_path, sizeof(torrc_path), "%s"PATH_SEPARATOR"torrc", dir);
+ tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir);
char torrc_contents[1000];
tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s",
torrc_path);
@@ -4837,6 +4837,7 @@ test_config_include_limit(void *data)
done:
config_free_lines(result);
+ tor_free(torrc_path);
tor_free(dir);
}
@@ -4847,6 +4848,7 @@ test_config_include_does_not_exist(void *data)
config_line_t *result = NULL;
char *dir = tor_strdup(get_fname("test_include_does_not_exist"));
+ char *missing_path = NULL;
tt_ptr_op(dir, OP_NE, NULL);
#ifdef _WIN32
@@ -4855,9 +4857,7 @@ test_config_include_does_not_exist(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char missing_path[PATH_MAX+1];
- tor_snprintf(missing_path, sizeof(missing_path), "%s"PATH_SEPARATOR"missing",
- dir);
+ tor_asprintf(&missing_path, "%s"PATH_SEPARATOR"missing", dir);
char torrc_contents[1000];
tor_snprintf(torrc_contents, sizeof(torrc_contents), "%%include %s",
missing_path);
@@ -4868,6 +4868,7 @@ test_config_include_does_not_exist(void *data)
done:
config_free_lines(result);
tor_free(dir);
+ tor_free(missing_path);
}
static void
@@ -4877,6 +4878,7 @@ test_config_include_error_in_included_file(void *data)
config_line_t *result = NULL;
char *dir = tor_strdup(get_fname("test_error_in_included_file"));
+ char *invalid_path = NULL;
tt_ptr_op(dir, OP_NE, NULL);
#ifdef _WIN32
@@ -4885,9 +4887,7 @@ test_config_include_error_in_included_file(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char invalid_path[PATH_MAX+1];
- tor_snprintf(invalid_path, sizeof(invalid_path), "%s"PATH_SEPARATOR"invalid",
- dir);
+ tor_asprintf(&invalid_path, "%s"PATH_SEPARATOR"invalid", dir);
tt_int_op(write_str_to_file(invalid_path, "unclosed \"", 0), OP_EQ, 0);
char torrc_contents[1000];
@@ -4900,6 +4900,7 @@ test_config_include_error_in_included_file(void *data)
done:
config_free_lines(result);
tor_free(dir);
+ tor_free(invalid_path);
}
static void
@@ -4908,6 +4909,8 @@ test_config_include_empty_file_folder(void *data)
(void)data;
config_line_t *result = NULL;
+ char *folder_path = NULL;
+ char *file_path = NULL;
char *dir = tor_strdup(get_fname("test_include_empty_file_folder"));
tt_ptr_op(dir, OP_NE, NULL);
@@ -4917,17 +4920,13 @@ test_config_include_empty_file_folder(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char folder_path[PATH_MAX+1];
- tor_snprintf(folder_path, sizeof(folder_path), "%s"PATH_SEPARATOR"empty_dir",
- dir);
+ tor_asprintf(&folder_path, "%s"PATH_SEPARATOR"empty_dir", dir);
#ifdef _WIN32
tt_int_op(mkdir(folder_path), OP_EQ, 0);
#else
tt_int_op(mkdir(folder_path, 0700), OP_EQ, 0);
#endif
- char file_path[PATH_MAX+1];
- tor_snprintf(file_path, sizeof(file_path), "%s"PATH_SEPARATOR"empty_file",
- dir);
+ tor_asprintf(&file_path, "%s"PATH_SEPARATOR"empty_file", dir);
tt_int_op(write_str_to_file(file_path, "", 0), OP_EQ, 0);
char torrc_contents[1000];
@@ -4944,6 +4943,8 @@ test_config_include_empty_file_folder(void *data)
done:
config_free_lines(result);
+ tor_free(folder_path);
+ tor_free(file_path);
tor_free(dir);
}
@@ -4953,6 +4954,7 @@ test_config_include_recursion_before_after(void *data)
(void)data;
config_line_t *result = NULL;
+ char *torrc_path = NULL;
char *dir = tor_strdup(get_fname("test_include_recursion_before_after"));
tt_ptr_op(dir, OP_NE, NULL);
@@ -4962,8 +4964,7 @@ test_config_include_recursion_before_after(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char torrc_path[PATH_MAX+1];
- tor_snprintf(torrc_path, sizeof(torrc_path), "%s"PATH_SEPARATOR"torrc", dir);
+ tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir);
char file_contents[1000];
const int limit = MAX_INCLUDE_RECURSION_LEVEL;
@@ -4982,9 +4983,10 @@ test_config_include_recursion_before_after(void *data)
}
if (i > 1) {
- char file_path[PATH_MAX+1];
- tor_snprintf(file_path, sizeof(file_path), "%s%d", torrc_path, i);
+ char *file_path = NULL;
+ tor_asprintf(&file_path, "%s%d", torrc_path, i);
tt_int_op(write_str_to_file(file_path, file_contents, 0), OP_EQ, 0);
+ tor_free(file_path);
}
}
@@ -5008,6 +5010,7 @@ test_config_include_recursion_before_after(void *data)
done:
config_free_lines(result);
tor_free(dir);
+ tor_free(torrc_path);
}
static void
@@ -5016,6 +5019,7 @@ test_config_include_recursion_after_only(void *data)
(void)data;
config_line_t *result = NULL;
+ char *torrc_path = NULL;
char *dir = tor_strdup(get_fname("test_include_recursion_after_only"));
tt_ptr_op(dir, OP_NE, NULL);
@@ -5025,8 +5029,7 @@ test_config_include_recursion_after_only(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char torrc_path[PATH_MAX+1];
- tor_snprintf(torrc_path, sizeof(torrc_path), "%s"PATH_SEPARATOR"torrc", dir);
+ tor_asprintf(&torrc_path, "%s"PATH_SEPARATOR"torrc", dir);
char file_contents[1000];
const int limit = MAX_INCLUDE_RECURSION_LEVEL;
@@ -5045,9 +5048,10 @@ test_config_include_recursion_after_only(void *data)
}
if (i > 1) {
- char file_path[PATH_MAX+1];
- tor_snprintf(file_path, sizeof(file_path), "%s%d", torrc_path, i);
+ char *file_path = NULL;
+ tor_asprintf(&file_path, "%s%d", torrc_path, i);
tt_int_op(write_str_to_file(file_path, file_contents, 0), OP_EQ, 0);
+ tor_free(file_path);
}
}
@@ -5071,6 +5075,7 @@ test_config_include_recursion_after_only(void *data)
done:
config_free_lines(result);
tor_free(dir);
+ tor_free(torrc_path);
}
static void
@@ -5079,6 +5084,9 @@ test_config_include_folder_order(void *data)
(void)data;
config_line_t *result = NULL;
+ char *torrcd = NULL;
+ char *path = NULL;
+ char *path2 = NULL;
char *dir = tor_strdup(get_fname("test_include_folder_order"));
tt_ptr_op(dir, OP_NE, NULL);
@@ -5088,8 +5096,7 @@ test_config_include_folder_order(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char torrcd[PATH_MAX+1];
- tor_snprintf(torrcd, sizeof(torrcd), "%s"PATH_SEPARATOR"%s", dir, "torrc.d");
+ tor_asprintf(&torrcd, "%s"PATH_SEPARATOR"%s", dir, "torrc.d");
#ifdef _WIN32
tt_int_op(mkdir(torrcd), OP_EQ, 0);
@@ -5098,9 +5105,7 @@ test_config_include_folder_order(void *data)
#endif
// test that files in subfolders are ignored
- char path[PATH_MAX+1];
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", torrcd,
- "subfolder");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "subfolder");
#ifdef _WIN32
tt_int_op(mkdir(path), OP_EQ, 0);
@@ -5108,27 +5113,31 @@ test_config_include_folder_order(void *data)
tt_int_op(mkdir(path, 0700), OP_EQ, 0);
#endif
- char path2[PATH_MAX+1];
- tor_snprintf(path2, sizeof(path2), "%s"PATH_SEPARATOR"%s", path,
- "01_ignore");
+ tor_asprintf(&path2, "%s"PATH_SEPARATOR"%s", path, "01_ignore");
tt_int_op(write_str_to_file(path2, "ShouldNotSee 1\n", 0), OP_EQ, 0);
+ tor_free(path);
// test that files starting with . are ignored
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", torrcd, ".dot");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, ".dot");
tt_int_op(write_str_to_file(path, "ShouldNotSee 2\n", 0), OP_EQ, 0);
+ tor_free(path);
// test file order
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", torrcd, "01_1st");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "01_1st");
tt_int_op(write_str_to_file(path, "Test 1\n", 0), OP_EQ, 0);
+ tor_free(path);
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", torrcd, "02_2nd");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "02_2nd");
tt_int_op(write_str_to_file(path, "Test 2\n", 0), OP_EQ, 0);
+ tor_free(path);
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", torrcd, "aa_3rd");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "aa_3rd");
tt_int_op(write_str_to_file(path, "Test 3\n", 0), OP_EQ, 0);
+ tor_free(path);
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", torrcd, "ab_4th");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "ab_4th");
tt_int_op(write_str_to_file(path, "Test 4\n", 0), OP_EQ, 0);
+ tor_free(path);
char torrc_contents[1000];
tor_snprintf(torrc_contents, sizeof(torrc_contents),
@@ -5154,6 +5163,9 @@ test_config_include_folder_order(void *data)
done:
config_free_lines(result);
+ tor_free(torrcd);
+ tor_free(path);
+ tor_free(path2);
tor_free(dir);
}
@@ -5285,6 +5297,7 @@ test_config_include_flag_torrc_only(void *data)
(void)data;
char *errmsg = NULL;
+ char *path = NULL;
char *dir = tor_strdup(get_fname("test_include_flag_torrc_only"));
tt_ptr_op(dir, OP_NE, NULL);
@@ -5294,8 +5307,7 @@ test_config_include_flag_torrc_only(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char path[PATH_MAX+1];
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", dir, "dummy");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", dir, "dummy");
tt_int_op(write_str_to_file(path, "\n", 0), OP_EQ, 0);
char conf_empty[1000];
@@ -5315,6 +5327,7 @@ test_config_include_flag_torrc_only(void *data)
done:
tor_free(errmsg);
+ tor_free(path);
tor_free(dir);
}
@@ -5324,6 +5337,7 @@ test_config_include_flag_defaults_only(void *data)
(void)data;
char *errmsg = NULL;
+ char *path = NULL;
char *dir = tor_strdup(get_fname("test_include_flag_defaults_only"));
tt_ptr_op(dir, OP_NE, NULL);
@@ -5333,8 +5347,7 @@ test_config_include_flag_defaults_only(void *data)
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
- char path[PATH_MAX+1];
- tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", dir, "dummy");
+ tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", dir, "dummy");
tt_int_op(write_str_to_file(path, "\n", 0), OP_EQ, 0);
char conf_empty[1000];
@@ -5354,6 +5367,7 @@ test_config_include_flag_defaults_only(void *data)
done:
tor_free(errmsg);
+ tor_free(path);
tor_free(dir);
}
diff --git a/src/test/test_connection.c b/src/test/test_connection.c
index 7e5193b203..314b90cfda 100644
--- a/src/test/test_connection.c
+++ b/src/test/test_connection.c
@@ -17,9 +17,8 @@
#include "rendcache.h"
#include "directory.h"
-static void test_conn_lookup_addr_helper(const char *address,
- int family,
- tor_addr_t *addr);
+#include "test_connection.h"
+#include "test_helpers.h"
static void * test_conn_get_basic_setup(const struct testcase_t *tc);
static int test_conn_get_basic_teardown(const struct testcase_t *tc,
@@ -62,48 +61,7 @@ static int test_conn_get_rsrc_teardown(const struct testcase_t *tc,
#define TEST_CONN_UNATTACHED_STATE (AP_CONN_STATE_CIRCUIT_WAIT)
#define TEST_CONN_ATTACHED_STATE (AP_CONN_STATE_CONNECT_WAIT)
-#define TEST_CONN_FD_INIT 50
-static int mock_connection_connect_sockaddr_called = 0;
-static int fake_socket_number = TEST_CONN_FD_INIT;
-
-static int
-mock_connection_connect_sockaddr(connection_t *conn,
- const struct sockaddr *sa,
- socklen_t sa_len,
- const struct sockaddr *bindaddr,
- socklen_t bindaddr_len,
- int *socket_error)
-{
- (void)sa_len;
- (void)bindaddr;
- (void)bindaddr_len;
-
- tor_assert(conn);
- tor_assert(sa);
- tor_assert(socket_error);
-
- mock_connection_connect_sockaddr_called++;
-
- conn->s = fake_socket_number++;
- tt_assert(SOCKET_OK(conn->s));
- /* We really should call tor_libevent_initialize() here. Because we don't,
- * we are relying on other parts of the code not checking if the_event_base
- * (and therefore event->ev_base) is NULL. */
- tt_assert(connection_add_connecting(conn) == 0);
-
- done:
- /* Fake "connected" status */
- return 1;
-}
-
-static int
-fake_close_socket(evutil_socket_t sock)
-{
- (void)sock;
- return 0;
-}
-
-static void
+void
test_conn_lookup_addr_helper(const char *address, int family, tor_addr_t *addr)
{
int rv = 0;
@@ -112,7 +70,7 @@ test_conn_lookup_addr_helper(const char *address, int family, tor_addr_t *addr)
rv = tor_addr_lookup(address, family, addr);
/* XXXX - should we retry on transient failure? */
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
tt_assert(tor_addr_is_loopback(addr));
tt_assert(tor_addr_is_v4(addr));
@@ -122,51 +80,6 @@ test_conn_lookup_addr_helper(const char *address, int family, tor_addr_t *addr)
tor_addr_make_null(addr, TEST_CONN_FAMILY);
}
-static connection_t *
-test_conn_get_connection(uint8_t state, uint8_t type, uint8_t purpose)
-{
- connection_t *conn = NULL;
- tor_addr_t addr;
- int socket_err = 0;
- int in_progress = 0;
-
- MOCK(connection_connect_sockaddr,
- mock_connection_connect_sockaddr);
- MOCK(tor_close_socket, fake_close_socket);
-
- init_connection_lists();
-
- conn = connection_new(type, TEST_CONN_FAMILY);
- tt_assert(conn);
-
- test_conn_lookup_addr_helper(TEST_CONN_ADDRESS, TEST_CONN_FAMILY, &addr);
- tt_assert(!tor_addr_is_null(&addr));
-
- tor_addr_copy_tight(&conn->addr, &addr);
- conn->port = TEST_CONN_PORT;
- mock_connection_connect_sockaddr_called = 0;
- in_progress = connection_connect(conn, TEST_CONN_ADDRESS_PORT, &addr,
- TEST_CONN_PORT, &socket_err);
- tt_assert(mock_connection_connect_sockaddr_called == 1);
- tt_assert(!socket_err);
- tt_assert(in_progress == 0 || in_progress == 1);
-
- /* fake some of the attributes so the connection looks OK */
- conn->state = state;
- conn->purpose = purpose;
- assert_connection_ok(conn, time(NULL));
-
- UNMOCK(connection_connect_sockaddr);
- UNMOCK(tor_close_socket);
- return conn;
-
- /* On failure */
- done:
- UNMOCK(connection_connect_sockaddr);
- UNMOCK(tor_close_socket);
- return NULL;
-}
-
static void *
test_conn_get_basic_setup(const struct testcase_t *tc)
{
@@ -379,7 +292,7 @@ test_conn_download_status_teardown(const struct testcase_t *tc, void *arg)
/* connection_free_() cleans up requested_resource */
rv = test_conn_get_rsrc_teardown(tc, conn);
- tt_assert(rv == 1);
+ tt_int_op(rv, OP_EQ, 1);
}
} SMARTLIST_FOREACH_END(conn);
@@ -453,12 +366,13 @@ test_conn_get_basic(void *arg)
* its attributes, but get NULL when we supply a different value. */
tt_assert(connection_get_by_global_id(conn->global_identifier) == conn);
- tt_assert(connection_get_by_global_id(!conn->global_identifier) == NULL);
+ tt_ptr_op(connection_get_by_global_id(!conn->global_identifier), OP_EQ,
+ NULL);
tt_assert(connection_get_by_type(conn->type) == conn);
tt_assert(connection_get_by_type(TEST_CONN_TYPE) == conn);
- tt_assert(connection_get_by_type(!conn->type) == NULL);
- tt_assert(connection_get_by_type(!TEST_CONN_TYPE) == NULL);
+ tt_ptr_op(connection_get_by_type(!conn->type), OP_EQ, NULL);
+ tt_ptr_op(connection_get_by_type(!TEST_CONN_TYPE), OP_EQ, NULL);
tt_assert(connection_get_by_type_state(conn->type, conn->state)
== conn);
@@ -572,7 +486,7 @@ test_conn_get_rend(void *arg)
#define sl_is_conn_assert(sl_input, conn) \
do { \
the_sl = (sl_input); \
- tt_assert(smartlist_len((the_sl)) == 1); \
+ tt_int_op(smartlist_len((the_sl)), OP_EQ, 1); \
tt_assert(smartlist_get((the_sl), 0) == (conn)); \
smartlist_free(the_sl); the_sl = NULL; \
} while (0)
@@ -580,7 +494,7 @@ test_conn_get_rend(void *arg)
#define sl_no_conn_assert(sl_input) \
do { \
the_sl = (sl_input); \
- tt_assert(smartlist_len((the_sl)) == 0); \
+ tt_int_op(smartlist_len((the_sl)), OP_EQ, 0); \
smartlist_free(the_sl); the_sl = NULL; \
} while (0)
@@ -626,43 +540,32 @@ test_conn_get_rsrc(void *arg)
TEST_CONN_RSRC_2,
!TEST_CONN_STATE));
- tt_assert(connection_dir_count_by_purpose_and_resource(
- conn->base_.purpose,
- conn->requested_resource)
- == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- TEST_CONN_RSRC)
- == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- !conn->base_.purpose,
- "")
- == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- !TEST_CONN_RSRC_PURPOSE,
- TEST_CONN_RSRC_2)
- == 0);
-
- tt_assert(connection_dir_count_by_purpose_resource_and_state(
- conn->base_.purpose,
- conn->requested_resource,
- conn->base_.state)
- == 1);
- tt_assert(connection_dir_count_by_purpose_resource_and_state(
- TEST_CONN_RSRC_PURPOSE,
- TEST_CONN_RSRC,
- TEST_CONN_STATE)
- == 1);
- tt_assert(connection_dir_count_by_purpose_resource_and_state(
- !conn->base_.purpose,
- "",
- !conn->base_.state)
- == 0);
- tt_assert(connection_dir_count_by_purpose_resource_and_state(
- !TEST_CONN_RSRC_PURPOSE,
- TEST_CONN_RSRC_2,
- !TEST_CONN_STATE)
- == 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ conn->base_.purpose, conn->requested_resource),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ !conn->base_.purpose, ""),
+ OP_EQ, 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ !TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC_2),
+ OP_EQ, 0);
+
+ tt_int_op(connection_dir_count_by_purpose_resource_and_state(
+ conn->base_.purpose, conn->requested_resource,
+ conn->base_.state),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_resource_and_state(
+ TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC, TEST_CONN_STATE),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_resource_and_state(
+ !conn->base_.purpose, "", !conn->base_.state),
+ OP_EQ, 0);
+ tt_int_op(connection_dir_count_by_purpose_resource_and_state(
+ !TEST_CONN_RSRC_PURPOSE, TEST_CONN_RSRC_2, !TEST_CONN_STATE),
+ OP_EQ, 0);
done:
smartlist_free(the_sl);
@@ -688,117 +591,127 @@ test_conn_download_status(void *arg)
const char *other_res = networkstatus_get_flavor_name(other_flavor);
/* no connections */
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 0);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* one connection, not downloading */
conn = test_conn_download_status_add_a_connection(res);
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 0);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* one connection, downloading but not linked (not possible on a client,
* but possible on a relay) */
conn->base_.state = TEST_CONN_DL_STATE;
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 0);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* one connection, downloading and linked, but not yet attached */
ap_conn = test_conn_get_linked_connection(TO_CONN(conn),
TEST_CONN_UNATTACHED_STATE);
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 0);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* one connection, downloading and linked and attached */
ap_conn->state = TEST_CONN_ATTACHED_STATE;
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 1);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* one connection, linked and attached but not downloading */
conn->base_.state = TEST_CONN_STATE;
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 0);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* two connections, both not downloading */
conn2 = test_conn_download_status_add_a_connection(res);
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 0);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 2);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 2);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* two connections, one downloading */
conn->base_.state = TEST_CONN_DL_STATE;
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 1);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 2);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 2);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
conn->base_.state = TEST_CONN_STATE;
/* more connections, all not downloading */
/* ignore the return value, it's free'd using the connection list */
(void)test_conn_download_status_add_a_connection(res);
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 0);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 3);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 3);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* more connections, one downloading */
conn->base_.state = TEST_CONN_DL_STATE;
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 1);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 3);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 3);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* more connections, two downloading (should never happen, but needs
* to be tested for completeness) */
@@ -806,38 +719,41 @@ test_conn_download_status(void *arg)
/* ignore the return value, it's free'd using the connection list */
(void)test_conn_get_linked_connection(TO_CONN(conn2),
TEST_CONN_ATTACHED_STATE);
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 1);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 3);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 3);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
conn->base_.state = TEST_CONN_STATE;
/* more connections, a different one downloading */
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 1);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 3);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 0);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 3);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 0);
/* a connection for the other flavor (could happen if a client is set to
* cache directory documents), one preferred flavor downloading
*/
conn4 = test_conn_download_status_add_a_connection(other_res);
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 1);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 0);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 3);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 0);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 3);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 1);
/* a connection for the other flavor (could happen if a client is set to
* cache directory documents), both flavors downloading
@@ -846,14 +762,15 @@ test_conn_download_status(void *arg)
/* ignore the return value, it's free'd using the connection list */
(void)test_conn_get_linked_connection(TO_CONN(conn4),
TEST_CONN_ATTACHED_STATE);
- tt_assert(networkstatus_consensus_is_already_downloading(res) == 1);
- tt_assert(networkstatus_consensus_is_already_downloading(other_res) == 1);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- res) == 3);
- tt_assert(connection_dir_count_by_purpose_and_resource(
- TEST_CONN_RSRC_PURPOSE,
- other_res) == 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(res), OP_EQ, 1);
+ tt_int_op(networkstatus_consensus_is_already_downloading(other_res), OP_EQ,
+ 1);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, res),
+ OP_EQ, 3);
+ tt_int_op(connection_dir_count_by_purpose_and_resource(
+ TEST_CONN_RSRC_PURPOSE, other_res),
+ OP_EQ, 1);
done:
/* the teardown function removes all the connections in the global list*/;
diff --git a/src/test/test_connection.h b/src/test/test_connection.h
new file mode 100644
index 0000000000..392783b53b
--- /dev/null
+++ b/src/test/test_connection.h
@@ -0,0 +1,13 @@
+/* Copyright (c) 2014-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/** Some constants used by test_connection and helpers */
+#define TEST_CONN_FAMILY (AF_INET)
+#define TEST_CONN_ADDRESS "127.0.0.1"
+#define TEST_CONN_PORT (12345)
+#define TEST_CONN_ADDRESS_PORT "127.0.0.1:12345"
+#define TEST_CONN_FD_INIT 50
+
+void test_conn_lookup_addr_helper(const char *address,
+ int family, tor_addr_t *addr);
+
diff --git a/src/test/test_conscache.c b/src/test/test_conscache.c
index aee1ba8a06..ddb1bc53c1 100644
--- a/src/test/test_conscache.c
+++ b/src/test/test_conscache.c
@@ -200,7 +200,7 @@ test_conscache_cleanup(void *arg)
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.
+ tt_ptr_op(e_tmp, OP_EQ, NULL); // not found because pending deletion.
/* Delete the pending-deletion items. */
consensus_cache_delete_pending(cache, 0);
@@ -212,9 +212,9 @@ test_conscache_cleanup(void *arg)
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.
+ tt_ptr_op(e_tmp, OP_EQ, NULL); // so deleted.
e_tmp = consensus_cache_find_first(cache, "index", "14"); // refcnt == 2
- tt_assert(e_tmp == NULL); // not deleted; but not found.
+ tt_ptr_op(e_tmp, OP_EQ, NULL); // not deleted; but not found.
/* Now do lazy unmapping. */
// should do nothing.
diff --git a/src/test/test_consdiffmgr.c b/src/test/test_consdiffmgr.c
index 963a6e427a..cb8ed8b649 100644
--- a/src/test/test_consdiffmgr.c
+++ b/src/test/test_consdiffmgr.c
@@ -325,8 +325,8 @@ test_consdiffmgr_add(void *arg)
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));
+ tt_ptr_op(cdm_cache_lookup_consensus(FLAV_MICRODESC, now - 60), OP_EQ, NULL);
+ tt_ptr_op(cdm_cache_lookup_consensus(FLAV_NS, now - 61), OP_EQ, NULL);
done:
networkstatus_vote_free(ns_tmp);
diff --git a/src/test/test_containers.c b/src/test/test_containers.c
index 54484a2a91..279d69754f 100644
--- a/src/test/test_containers.c
+++ b/src/test/test_containers.c
@@ -510,22 +510,22 @@ test_container_smartlist_pos(void *arg)
smartlist_add_strdup(sl, "function");
/* Test string_pos */
- tt_int_op(smartlist_string_pos(NULL, "Fred"), ==, -1);
- tt_int_op(smartlist_string_pos(sl, "Fred"), ==, -1);
- tt_int_op(smartlist_string_pos(sl, "This"), ==, 0);
- tt_int_op(smartlist_string_pos(sl, "a"), ==, 2);
- tt_int_op(smartlist_string_pos(sl, "function"), ==, 6);
+ tt_int_op(smartlist_string_pos(NULL, "Fred"), OP_EQ, -1);
+ tt_int_op(smartlist_string_pos(sl, "Fred"), OP_EQ, -1);
+ tt_int_op(smartlist_string_pos(sl, "This"), OP_EQ, 0);
+ tt_int_op(smartlist_string_pos(sl, "a"), OP_EQ, 2);
+ tt_int_op(smartlist_string_pos(sl, "function"), OP_EQ, 6);
/* Test pos */
- tt_int_op(smartlist_pos(NULL, "Fred"), ==, -1);
- tt_int_op(smartlist_pos(sl, "Fred"), ==, -1);
- tt_int_op(smartlist_pos(sl, "This"), ==, -1);
- tt_int_op(smartlist_pos(sl, "a"), ==, -1);
- tt_int_op(smartlist_pos(sl, "function"), ==, -1);
- tt_int_op(smartlist_pos(sl, smartlist_get(sl,0)), ==, 0);
- tt_int_op(smartlist_pos(sl, smartlist_get(sl,2)), ==, 2);
- tt_int_op(smartlist_pos(sl, smartlist_get(sl,5)), ==, 5);
- tt_int_op(smartlist_pos(sl, smartlist_get(sl,6)), ==, 6);
+ tt_int_op(smartlist_pos(NULL, "Fred"), OP_EQ, -1);
+ tt_int_op(smartlist_pos(sl, "Fred"), OP_EQ, -1);
+ tt_int_op(smartlist_pos(sl, "This"), OP_EQ, -1);
+ tt_int_op(smartlist_pos(sl, "a"), OP_EQ, -1);
+ tt_int_op(smartlist_pos(sl, "function"), OP_EQ, -1);
+ tt_int_op(smartlist_pos(sl, smartlist_get(sl,0)), OP_EQ, 0);
+ tt_int_op(smartlist_pos(sl, smartlist_get(sl,2)), OP_EQ, 2);
+ tt_int_op(smartlist_pos(sl, smartlist_get(sl,5)), OP_EQ, 5);
+ tt_int_op(smartlist_pos(sl, smartlist_get(sl,6)), OP_EQ, 6);
done:
SMARTLIST_FOREACH(sl, char *, str, tor_free(str));
@@ -681,7 +681,7 @@ test_container_pqueue(void *arg)
{
smartlist_t *sl = smartlist_new();
int (*cmp)(const void *, const void*);
- const int offset = STRUCT_OFFSET(pq_entry_t, idx);
+ const int offset = offsetof(pq_entry_t, idx);
#define ENTRY(s) pq_entry_t s = { #s, -1 }
ENTRY(cows);
ENTRY(zebras);
@@ -990,13 +990,13 @@ test_container_order_functions(void *arg)
tt_assert(15 == median_time(times, 5));
int32_t int32s[] = { -5, -10, -50, 100 };
- tt_int_op(-5, ==, median_int32(int32s, 1));
- tt_int_op(-10, ==, median_int32(int32s, 2));
- tt_int_op(-10, ==, median_int32(int32s, 3));
- tt_int_op(-10, ==, median_int32(int32s, 4));
+ tt_int_op(-5, OP_EQ, median_int32(int32s, 1));
+ tt_int_op(-10, OP_EQ, median_int32(int32s, 2));
+ tt_int_op(-10, OP_EQ, median_int32(int32s, 3));
+ tt_int_op(-10, OP_EQ, median_int32(int32s, 4));
long longs[] = { -30, 30, 100, -100, 7 };
- tt_int_op(7, ==, find_nth_long(longs, 5, 2));
+ tt_int_op(7, OP_EQ, find_nth_long(longs, 5, 2));
done:
;
@@ -1153,31 +1153,31 @@ test_container_smartlist_most_frequent(void *arg)
const char *cp;
cp = smartlist_get_most_frequent_string_(sl, &count);
- tt_int_op(count, ==, 0);
- tt_ptr_op(cp, ==, NULL);
+ tt_int_op(count, OP_EQ, 0);
+ tt_ptr_op(cp, OP_EQ, NULL);
/* String must be sorted before we call get_most_frequent */
smartlist_split_string(sl, "abc:def:ghi", ":", 0, 0);
cp = smartlist_get_most_frequent_string_(sl, &count);
- tt_int_op(count, ==, 1);
- tt_str_op(cp, ==, "ghi"); /* Ties broken in favor of later element */
+ tt_int_op(count, OP_EQ, 1);
+ tt_str_op(cp, OP_EQ, "ghi"); /* Ties broken in favor of later element */
smartlist_split_string(sl, "def:ghi", ":", 0, 0);
smartlist_sort_strings(sl);
cp = smartlist_get_most_frequent_string_(sl, &count);
- tt_int_op(count, ==, 2);
- tt_ptr_op(cp, !=, NULL);
- tt_str_op(cp, ==, "ghi"); /* Ties broken in favor of later element */
+ tt_int_op(count, OP_EQ, 2);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_str_op(cp, OP_EQ, "ghi"); /* Ties broken in favor of later element */
smartlist_split_string(sl, "def:abc:qwop", ":", 0, 0);
smartlist_sort_strings(sl);
cp = smartlist_get_most_frequent_string_(sl, &count);
- tt_int_op(count, ==, 3);
- tt_ptr_op(cp, !=, NULL);
- tt_str_op(cp, ==, "def"); /* No tie */
+ tt_int_op(count, OP_EQ, 3);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_str_op(cp, OP_EQ, "def"); /* No tie */
done:
SMARTLIST_FOREACH(sl, char *, str, tor_free(str));
@@ -1206,7 +1206,7 @@ test_container_smartlist_sort_ptrs(void *arg)
smartlist_shuffle(sl);
smartlist_sort_pointers(sl);
for (j = 0; j < ARRAY_LENGTH(arrayptrs); ++j) {
- tt_ptr_op(smartlist_get(sl, j), ==, arrayptrs[j]);
+ tt_ptr_op(smartlist_get(sl, j), OP_EQ, arrayptrs[j]);
}
}
@@ -1232,11 +1232,11 @@ test_container_smartlist_strings_eq(void *arg)
} while (0)
/* Both NULL, so equal */
- tt_int_op(1, ==, smartlist_strings_eq(NULL, NULL));
+ tt_int_op(1, OP_EQ, smartlist_strings_eq(NULL, NULL));
/* One NULL, not equal. */
- tt_int_op(0, ==, smartlist_strings_eq(NULL, sl1));
- tt_int_op(0, ==, smartlist_strings_eq(sl1, NULL));
+ tt_int_op(0, OP_EQ, smartlist_strings_eq(NULL, sl1));
+ tt_int_op(0, OP_EQ, smartlist_strings_eq(sl1, NULL));
/* Both empty, both equal. */
EQ_SHOULD_SAY("", "", 1);
diff --git a/src/test/test_controller.c b/src/test/test_controller.c
index 592f91a988..472fcb8c53 100644
--- a/src/test/test_controller.c
+++ b/src/test/test_controller.c
@@ -31,7 +31,7 @@ test_add_onion_helper_keyarg(void *arg)
tt_assert(pk);
tt_str_op(key_new_alg, OP_EQ, "RSA1024");
tt_assert(key_new_blob);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
/* Test "BEST" key generation (Assumes BEST = RSA1024). */
crypto_pk_free(pk);
@@ -41,7 +41,7 @@ test_add_onion_helper_keyarg(void *arg)
tt_assert(pk);
tt_str_op(key_new_alg, OP_EQ, "RSA1024");
tt_assert(key_new_blob);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
/* Test discarding the private key. */
crypto_pk_free(pk);
@@ -49,17 +49,17 @@ test_add_onion_helper_keyarg(void *arg)
pk = add_onion_helper_keyarg("NEW:BEST", 1, &key_new_alg, &key_new_blob,
&err_msg);
tt_assert(pk);
- tt_assert(!key_new_alg);
- tt_assert(!key_new_blob);
- tt_assert(!err_msg);
+ tt_ptr_op(key_new_alg, OP_EQ, NULL);
+ tt_ptr_op(key_new_blob, OP_EQ, NULL);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
/* Test generating a invalid key type. */
crypto_pk_free(pk);
pk = add_onion_helper_keyarg("NEW:RSA512", 0, &key_new_alg, &key_new_blob,
&err_msg);
- tt_assert(!pk);
- tt_assert(!key_new_alg);
- tt_assert(!key_new_blob);
+ tt_ptr_op(pk, OP_EQ, NULL);
+ tt_ptr_op(key_new_alg, OP_EQ, NULL);
+ tt_ptr_op(key_new_blob, OP_EQ, NULL);
tt_assert(err_msg);
/* Test loading a RSA1024 key. */
@@ -70,10 +70,10 @@ test_add_onion_helper_keyarg(void *arg)
pk2 = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
&err_msg);
tt_assert(pk2);
- tt_assert(!key_new_alg);
- tt_assert(!key_new_blob);
- tt_assert(!err_msg);
- tt_assert(crypto_pk_cmp_keys(pk, pk2) == 0);
+ tt_ptr_op(key_new_alg, OP_EQ, NULL);
+ tt_ptr_op(key_new_blob, OP_EQ, NULL);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
+ tt_int_op(crypto_pk_cmp_keys(pk, pk2), OP_EQ, 0);
/* Test loading a invalid key type. */
tor_free(arg_str);
@@ -81,9 +81,9 @@ test_add_onion_helper_keyarg(void *arg)
tor_asprintf(&arg_str, "RSA512:%s", encoded);
pk = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
&err_msg);
- tt_assert(!pk);
- tt_assert(!key_new_alg);
- tt_assert(!key_new_blob);
+ tt_ptr_op(pk, OP_EQ, NULL);
+ tt_ptr_op(key_new_alg, OP_EQ, NULL);
+ tt_ptr_op(key_new_blob, OP_EQ, NULL);
tt_assert(err_msg);
/* Test loading a invalid key. */
@@ -94,9 +94,9 @@ test_add_onion_helper_keyarg(void *arg)
tor_asprintf(&arg_str, "RSA1024:%s", encoded);
pk = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
&err_msg);
- tt_assert(!pk);
- tt_assert(!key_new_alg);
- tt_assert(!key_new_blob);
+ tt_ptr_op(pk, OP_EQ, NULL);
+ tt_ptr_op(key_new_alg, OP_EQ, NULL);
+ tt_ptr_op(key_new_blob, OP_EQ, NULL);
tt_assert(err_msg);
done:
@@ -123,13 +123,13 @@ test_getinfo_helper_onion(void *arg)
/* successfully get an empty answer */
rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
- tt_assert(rt == 0);
+ tt_int_op(rt, OP_EQ, 0);
tt_str_op(answer, OP_EQ, "");
tor_free(answer);
/* successfully get an empty answer */
rt = getinfo_helper_onions(&dummy, "onions/detached", &answer, &errmsg);
- tt_assert(rt == 0);
+ tt_int_op(rt, OP_EQ, 0);
tt_str_op(answer, OP_EQ, "");
tor_free(answer);
@@ -138,7 +138,7 @@ test_getinfo_helper_onion(void *arg)
dummy.ephemeral_onion_services = smartlist_new();
smartlist_add(dummy.ephemeral_onion_services, service_id);
rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
- tt_assert(rt == 0);
+ tt_int_op(rt, OP_EQ, 0);
tt_str_op(answer, OP_EQ, "dummy_onion_id");
done:
@@ -159,25 +159,25 @@ test_rend_service_parse_port_config(void *arg)
/* Test "VIRTPORT" only. */
cfg = rend_service_parse_port_config("80", sep, &err_msg);
tt_assert(cfg);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
/* Test "VIRTPORT,TARGET" (Target is port). */
rend_service_port_config_free(cfg);
cfg = rend_service_parse_port_config("80,8080", sep, &err_msg);
tt_assert(cfg);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
/* Test "VIRTPORT,TARGET" (Target is IPv4:port). */
rend_service_port_config_free(cfg);
cfg = rend_service_parse_port_config("80,192.0.2.1:8080", sep, &err_msg);
tt_assert(cfg);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
/* Test "VIRTPORT,TARGET" (Target is IPv6:port). */
rend_service_port_config_free(cfg);
cfg = rend_service_parse_port_config("80,[2001:db8::1]:8080", sep, &err_msg);
tt_assert(cfg);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
rend_service_port_config_free(cfg);
cfg = NULL;
@@ -186,13 +186,13 @@ test_rend_service_parse_port_config(void *arg)
/* Test empty config. */
rend_service_port_config_free(cfg);
cfg = rend_service_parse_port_config("", sep, &err_msg);
- tt_assert(!cfg);
+ tt_ptr_op(cfg, OP_EQ, NULL);
tt_assert(err_msg);
/* Test invalid port. */
tor_free(err_msg);
cfg = rend_service_parse_port_config("90001", sep, &err_msg);
- tt_assert(!cfg);
+ tt_ptr_op(cfg, OP_EQ, NULL);
tt_assert(err_msg);
tor_free(err_msg);
@@ -204,7 +204,7 @@ test_rend_service_parse_port_config(void *arg)
cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
" ", &err_msg);
tt_assert(cfg);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
rend_service_port_config_free(cfg);
cfg = NULL;
@@ -213,14 +213,14 @@ test_rend_service_parse_port_config(void *arg)
cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
" ", &err_msg);
tt_assert(cfg);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
rend_service_port_config_free(cfg);
cfg = NULL;
/* quoted unix port, missing end quote */
cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar",
" ", &err_msg);
- tt_assert(!cfg);
+ tt_ptr_op(cfg, OP_EQ, NULL);
tt_str_op(err_msg, OP_EQ, "Couldn't process address <unix:\"/tmp/foo bar> "
"from hidden service configuration");
tor_free(err_msg);
@@ -230,7 +230,7 @@ test_rend_service_parse_port_config(void *arg)
cfg = rend_service_parse_port_config("100 foo!!.example.com:9000",
" ", &err_msg);
UNMOCK(tor_addr_lookup);
- tt_assert(!cfg);
+ tt_ptr_op(cfg, OP_EQ, NULL);
tt_str_op(err_msg, OP_EQ, "Unparseable address in hidden service port "
"configuration.");
tor_free(err_msg);
@@ -238,7 +238,7 @@ test_rend_service_parse_port_config(void *arg)
/* bogus port port */
cfg = rend_service_parse_port_config("100 99999",
" ", &err_msg);
- tt_assert(!cfg);
+ tt_ptr_op(cfg, OP_EQ, NULL);
tt_str_op(err_msg, OP_EQ, "Unparseable or out-of-range port \"99999\" "
"in hidden service port configuration.");
tor_free(err_msg);
@@ -261,7 +261,7 @@ test_add_onion_helper_clientauth(void *arg)
client = add_onion_helper_clientauth("alice", &created, &err_msg);
tt_assert(client);
tt_assert(created);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
rend_authorized_client_free(client);
/* Test "ClientName:Blob" */
@@ -269,26 +269,26 @@ test_add_onion_helper_clientauth(void *arg)
&created, &err_msg);
tt_assert(client);
tt_assert(!created);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
rend_authorized_client_free(client);
/* Test invalid client names */
client = add_onion_helper_clientauth("no*asterisks*allowed", &created,
&err_msg);
- tt_assert(!client);
+ tt_ptr_op(client, OP_EQ, NULL);
tt_assert(err_msg);
tor_free(err_msg);
/* Test invalid auth cookie */
client = add_onion_helper_clientauth("alice:12345", &created, &err_msg);
- tt_assert(!client);
+ tt_ptr_op(client, OP_EQ, NULL);
tt_assert(err_msg);
tor_free(err_msg);
/* Test invalid syntax */
client = add_onion_helper_clientauth(":475hGBHPlq7Mc0cRZitK/B", &created,
&err_msg);
- tt_assert(!client);
+ tt_ptr_op(client, OP_EQ, NULL);
tt_assert(err_msg);
tor_free(err_msg);
@@ -544,7 +544,7 @@ cert_dl_status_def_for_auth_mock(const char *digest)
download_status_t *dl = NULL;
char digest_str[HEX_DIGEST_LEN+1];
- tt_assert(digest != NULL);
+ tt_ptr_op(digest, OP_NE, NULL);
base16_encode(digest_str, HEX_DIGEST_LEN + 1,
digest, DIGEST_LEN);
digest_str[HEX_DIGEST_LEN] = '\0';
@@ -568,7 +568,7 @@ cert_dl_status_sks_for_auth_id_mock(const char *digest)
char *tmp;
int len;
- tt_assert(digest != NULL);
+ tt_ptr_op(digest, OP_NE, NULL);
base16_encode(digest_str, HEX_DIGEST_LEN + 1,
digest, DIGEST_LEN);
digest_str[HEX_DIGEST_LEN] = '\0';
@@ -622,11 +622,11 @@ cert_dl_status_fp_sk_mock(const char *fp_digest, const char *sk_digest)
* dl status we want.
*/
- tt_assert(fp_digest != NULL);
+ tt_ptr_op(fp_digest, OP_NE, NULL);
base16_encode(fp_digest_str, HEX_DIGEST_LEN + 1,
fp_digest, DIGEST_LEN);
fp_digest_str[HEX_DIGEST_LEN] = '\0';
- tt_assert(sk_digest != NULL);
+ tt_ptr_op(sk_digest, OP_NE, NULL);
base16_encode(sk_digest_str, HEX_DIGEST_LEN + 1,
sk_digest, DIGEST_LEN);
sk_digest_str[HEX_DIGEST_LEN] = '\0';
@@ -706,7 +706,7 @@ descbr_get_dl_by_digest_mock(const char *digest)
char digest_str[HEX_DIGEST_LEN+1];
if (!disable_descbr) {
- tt_assert(digest != NULL);
+ tt_ptr_op(digest, OP_NE, NULL);
base16_encode(digest_str, HEX_DIGEST_LEN + 1,
digest, DIGEST_LEN);
digest_str[HEX_DIGEST_LEN] = '\0';
@@ -773,7 +773,7 @@ test_download_status_consensus(void *arg)
/* Check that the unknown prefix case works; no mocks needed yet */
getinfo_helper_downloads(&dummy, "downloads/foo", &answer, &errmsg);
- tt_assert(answer == NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
tt_str_op(errmsg, OP_EQ, "Unknown download status query");
setup_ns_mocks();
@@ -788,8 +788,8 @@ test_download_status_consensus(void *arg)
sizeof(download_status_t));
getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_1_str);
tor_free(answer);
errmsg = NULL;
@@ -799,8 +799,8 @@ test_download_status_consensus(void *arg)
sizeof(download_status_t));
getinfo_helper_downloads(&dummy, "downloads/networkstatus/microdesc",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_2_str);
tor_free(answer);
errmsg = NULL;
@@ -810,8 +810,8 @@ test_download_status_consensus(void *arg)
sizeof(download_status_t));
getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns/bootstrap",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_3_str);
tor_free(answer);
errmsg = NULL;
@@ -822,8 +822,8 @@ test_download_status_consensus(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/networkstatus/microdesc/bootstrap",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_4_str);
tor_free(answer);
errmsg = NULL;
@@ -834,8 +834,8 @@ test_download_status_consensus(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/networkstatus/ns/running",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_5_str);
tor_free(answer);
errmsg = NULL;
@@ -846,8 +846,8 @@ test_download_status_consensus(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/networkstatus/microdesc/running",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_6_str);
tor_free(answer);
errmsg = NULL;
@@ -855,8 +855,8 @@ test_download_status_consensus(void *arg)
/* Now check the error case */
getinfo_helper_downloads(&dummy, "downloads/networkstatus/foo",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "Unknown flavor");
errmsg = NULL;
@@ -890,8 +890,8 @@ test_download_status_cert(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/cert/fps",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, auth_id_digest_expected_list);
tor_free(answer);
errmsg = NULL;
@@ -900,10 +900,10 @@ test_download_status_cert(void *arg)
memcpy(&auth_def_cert_download_status_1, &dls_sample_1,
sizeof(download_status_t));
tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_1_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_1_str);
tor_free(question);
tor_free(answer);
@@ -913,10 +913,10 @@ test_download_status_cert(void *arg)
memcpy(&auth_def_cert_download_status_2, &dls_sample_2,
sizeof(download_status_t));
tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_2_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_2_str);
tor_free(question);
tor_free(answer);
@@ -924,10 +924,10 @@ test_download_status_cert(void *arg)
/* Case 4 - list of signing key digests for 1st auth id */
tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_1_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, auth_1_sk_digest_expected_list);
tor_free(question);
tor_free(answer);
@@ -935,10 +935,10 @@ test_download_status_cert(void *arg)
/* Case 5 - list of signing key digests for 2nd auth id */
tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_2_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, auth_2_sk_digest_expected_list);
tor_free(question);
tor_free(answer);
@@ -949,10 +949,10 @@ test_download_status_cert(void *arg)
sizeof(download_status_t));
tor_asprintf(&question, "downloads/cert/fp/%s/%s",
auth_id_digest_1_str, auth_1_sk_1_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_3_str);
tor_free(question);
tor_free(answer);
@@ -963,10 +963,10 @@ test_download_status_cert(void *arg)
sizeof(download_status_t));
tor_asprintf(&question, "downloads/cert/fp/%s/%s",
auth_id_digest_1_str, auth_1_sk_2_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_4_str);
tor_free(question);
tor_free(answer);
@@ -977,10 +977,10 @@ test_download_status_cert(void *arg)
sizeof(download_status_t));
tor_asprintf(&question, "downloads/cert/fp/%s/%s",
auth_id_digest_2_str, auth_2_sk_1_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_5_str);
tor_free(question);
tor_free(answer);
@@ -991,10 +991,10 @@ test_download_status_cert(void *arg)
sizeof(download_status_t));
tor_asprintf(&question, "downloads/cert/fp/%s/%s",
auth_id_digest_2_str, auth_2_sk_2_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_6_str);
tor_free(question);
tor_free(answer);
@@ -1005,8 +1005,8 @@ test_download_status_cert(void *arg)
/* Case 1 - query is garbage after downloads/cert/ part */
getinfo_helper_downloads(&dummy, "downloads/cert/blahdeblah",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "Unknown certificate download status query");
errmsg = NULL;
@@ -1016,8 +1016,8 @@ test_download_status_cert(void *arg)
*/
getinfo_helper_downloads(&dummy, "downloads/cert/fp/2B1D36D32B2942406",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
errmsg = NULL;
@@ -1028,8 +1028,8 @@ test_download_status_cert(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
errmsg = NULL;
@@ -1040,8 +1040,8 @@ test_download_status_cert(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ,
"Failed to get download status for this authority identity digest");
errmsg = NULL;
@@ -1053,8 +1053,8 @@ test_download_status_cert(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1/blah",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
errmsg = NULL;
@@ -1065,8 +1065,8 @@ test_download_status_cert(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/cert/fp/82F52AF55D25/blah",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
errmsg = NULL;
@@ -1077,8 +1077,8 @@ test_download_status_cert(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/sks",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ,
"Failed to get list of signing key digests for this authority "
"identity digest");
@@ -1092,8 +1092,8 @@ test_download_status_cert(void *arg)
"downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
"82F52AF55D250115FE44D3GC81D49643241D56A1",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
errmsg = NULL;
@@ -1105,8 +1105,8 @@ test_download_status_cert(void *arg)
"downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
"82F52AF55D250115FE44D",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
errmsg = NULL;
@@ -1118,8 +1118,8 @@ test_download_status_cert(void *arg)
"downloads/cert/fp/C6B05DF332F74DB9A13498EE3BBC7AA2F69FCB45/"
"3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ,
"Failed to get download status for this identity/"
"signing key digest pair");
@@ -1133,8 +1133,8 @@ test_download_status_cert(void *arg)
"downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
"3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ,
"Failed to get download status for this identity/"
"signing key digest pair");
@@ -1148,8 +1148,8 @@ test_download_status_cert(void *arg)
"downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
"9451B8F1B10952384EB58B5F230C0BB701626C9B",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ,
"Failed to get download status for this identity/"
"signing key digest pair");
@@ -1185,8 +1185,8 @@ test_download_status_desc(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/desc/descs",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, descbr_expected_list);
tor_free(answer);
errmsg = NULL;
@@ -1195,10 +1195,10 @@ test_download_status_desc(void *arg)
memcpy(&descbr_digest_1_dl, &dls_sample_1,
sizeof(download_status_t));
tor_asprintf(&question, "downloads/desc/%s", descbr_digest_1_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_1_str);
tor_free(question);
tor_free(answer);
@@ -1208,10 +1208,10 @@ test_download_status_desc(void *arg)
memcpy(&descbr_digest_2_dl, &dls_sample_2,
sizeof(download_status_t));
tor_asprintf(&question, "downloads/desc/%s", descbr_digest_2_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_2_str);
tor_free(question);
tor_free(answer);
@@ -1222,8 +1222,8 @@ test_download_status_desc(void *arg)
/* Case 1 - non-digest-length garbage after downloads/desc */
getinfo_helper_downloads(&dummy, "downloads/desc/blahdeblah",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "Unknown router descriptor download status query");
errmsg = NULL;
@@ -1232,8 +1232,8 @@ test_download_status_desc(void *arg)
&dummy,
"downloads/desc/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
errmsg = NULL;
@@ -1242,8 +1242,8 @@ test_download_status_desc(void *arg)
&dummy,
"downloads/desc/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "No such descriptor digest found");
errmsg = NULL;
@@ -1252,8 +1252,8 @@ test_download_status_desc(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/desc/descs",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ,
"We don't seem to have a networkstatus-flavored consensus");
errmsg = NULL;
@@ -1289,8 +1289,8 @@ test_download_status_bridge(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/bridge/bridges",
&answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, descbr_expected_list);
tor_free(answer);
errmsg = NULL;
@@ -1299,10 +1299,10 @@ test_download_status_bridge(void *arg)
memcpy(&descbr_digest_1_dl, &dls_sample_3,
sizeof(download_status_t));
tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_1_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_3_str);
tor_free(question);
tor_free(answer);
@@ -1312,10 +1312,10 @@ test_download_status_bridge(void *arg)
memcpy(&descbr_digest_2_dl, &dls_sample_4,
sizeof(download_status_t));
tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_2_str);
- tt_assert(question != NULL);
+ tt_ptr_op(question, OP_NE, NULL);
getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
- tt_assert(answer != NULL);
- tt_assert(errmsg == NULL);
+ tt_ptr_op(answer, OP_NE, NULL);
+ tt_ptr_op(errmsg, OP_EQ, NULL);
tt_str_op(answer, OP_EQ, dls_sample_4_str);
tor_free(question);
tor_free(answer);
@@ -1326,8 +1326,8 @@ test_download_status_bridge(void *arg)
/* Case 1 - non-digest-length garbage after downloads/bridge */
getinfo_helper_downloads(&dummy, "downloads/bridge/blahdeblah",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "Unknown bridge descriptor download status query");
errmsg = NULL;
@@ -1336,8 +1336,8 @@ test_download_status_bridge(void *arg)
&dummy,
"downloads/bridge/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
errmsg = NULL;
@@ -1346,8 +1346,8 @@ test_download_status_bridge(void *arg)
&dummy,
"downloads/bridge/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "No such bridge identity digest found");
errmsg = NULL;
@@ -1356,8 +1356,8 @@ test_download_status_bridge(void *arg)
getinfo_helper_downloads(&dummy,
"downloads/bridge/bridges",
&answer, &errmsg);
- tt_assert(answer == NULL);
- tt_assert(errmsg != NULL);
+ tt_ptr_op(answer, OP_EQ, NULL);
+ tt_ptr_op(errmsg, OP_NE, NULL);
tt_str_op(errmsg, OP_EQ, "We don't seem to be using bridges");
errmsg = NULL;
disable_descbr = 0;
diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c
index ec9d4e2709..d8c37bd32f 100644
--- a/src/test/test_crypto.c
+++ b/src/test/test_crypto.c
@@ -1139,7 +1139,7 @@ test_crypto_mac_sha3(void *arg)
result = crypto_digest256(hmac_manual, all, all_len, DIGEST_SHA3_256);
tor_free(key_msg_concat);
tor_free(all);
- tt_int_op(result, ==, 0);
+ tt_int_op(result, OP_EQ, 0);
}
/* Now compare the two results */
@@ -1208,12 +1208,12 @@ test_crypto_pk(void *arg)
tt_assert(! crypto_pk_write_private_key_to_filename(pk1,
get_fname("pkey1")));
/* failing case for read: can't read. */
- tt_assert(crypto_pk_read_private_key_from_filename(pk2,
- get_fname("xyzzy")) < 0);
+ tt_int_op(crypto_pk_read_private_key_from_filename(pk2, get_fname("xyzzy")),
+ OP_LT, 0);
write_str_to_file(get_fname("xyzzy"), "foobar", 6);
/* Failing case for read: no key. */
- tt_assert(crypto_pk_read_private_key_from_filename(pk2,
- get_fname("xyzzy")) < 0);
+ tt_int_op(crypto_pk_read_private_key_from_filename(pk2, get_fname("xyzzy")),
+ OP_LT, 0);
tt_assert(! crypto_pk_read_private_key_from_filename(pk2,
get_fname("pkey1")));
tt_int_op(15,OP_EQ,
@@ -1245,17 +1245,17 @@ test_crypto_pk(void *arg)
i = crypto_pk_asn1_encode(pk1, data1, 1024);
tt_int_op(i, OP_GT, 0);
pk2 = crypto_pk_asn1_decode(data1, i);
- tt_assert(crypto_pk_cmp_keys(pk1,pk2) == 0);
+ tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0);
/* Try with hybrid encryption wrappers. */
crypto_rand(data1, 1024);
for (i = 85; i < 140; ++i) {
memset(data2,0,1024);
memset(data3,0,1024);
- len = crypto_pk_public_hybrid_encrypt(pk1,data2,sizeof(data2),
+ len = crypto_pk_obsolete_public_hybrid_encrypt(pk1,data2,sizeof(data2),
data1,i,PK_PKCS1_OAEP_PADDING,0);
tt_int_op(len, OP_GE, 0);
- len = crypto_pk_private_hybrid_decrypt(pk1,data3,sizeof(data3),
+ len = crypto_pk_obsolete_private_hybrid_decrypt(pk1,data3,sizeof(data3),
data2,len,PK_PKCS1_OAEP_PADDING,1);
tt_int_op(len,OP_EQ, i);
tt_mem_op(data1,OP_EQ, data3,i);
@@ -1264,9 +1264,9 @@ test_crypto_pk(void *arg)
/* Try copy_full */
crypto_pk_free(pk2);
pk2 = crypto_pk_copy_full(pk1);
- tt_assert(pk2 != NULL);
+ tt_ptr_op(pk2, OP_NE, NULL);
tt_ptr_op(pk1, OP_NE, pk2);
- tt_assert(crypto_pk_cmp_keys(pk1,pk2) == 0);
+ tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0);
done:
if (pk1)
@@ -1344,17 +1344,17 @@ test_crypto_pk_base64(void *arg)
/* Test decoding a valid key. */
pk2 = crypto_pk_base64_decode(encoded, strlen(encoded));
tt_assert(pk2);
- tt_assert(crypto_pk_cmp_keys(pk1,pk2) == 0);
+ tt_int_op(crypto_pk_cmp_keys(pk1, pk2), OP_EQ, 0);
crypto_pk_free(pk2);
/* Test decoding a invalid key (not Base64). */
static const char *invalid_b64 = "The key is in another castle!";
pk2 = crypto_pk_base64_decode(invalid_b64, strlen(invalid_b64));
- tt_assert(!pk2);
+ tt_ptr_op(pk2, OP_EQ, NULL);
/* Test decoding a truncated Base64 blob. */
pk2 = crypto_pk_base64_decode(encoded, strlen(encoded)/2);
- tt_assert(!pk2);
+ tt_ptr_op(pk2, OP_EQ, NULL);
done:
crypto_pk_free(pk1);
@@ -1495,7 +1495,7 @@ test_crypto_formats(void *arg)
tt_mem_op(data1,OP_EQ, data3, DIGEST_LEN);
tt_int_op(99,OP_EQ, data3[DIGEST_LEN+1]);
- tt_assert(digest_from_base64(data3, "###") < 0);
+ tt_int_op(digest_from_base64(data3, "###"), OP_LT, 0);
/* Encoding SHA256 */
crypto_rand(data2, DIGEST256_LEN);
@@ -2170,6 +2170,9 @@ test_crypto_ed25519_simple(void *arg)
tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub1, &sec1));
tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec1));
+ tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, 0);
+ tt_int_op(ed25519_validate_pubkey(&pub2), OP_EQ, 0);
+
tt_mem_op(pub1.pubkey, OP_EQ, pub2.pubkey, sizeof(pub1.pubkey));
tt_assert(ed25519_pubkey_eq(&pub1, &pub2));
tt_assert(ed25519_pubkey_eq(&pub1, &pub1));
@@ -2541,6 +2544,39 @@ test_crypto_ed25519_blinding(void *arg)
;
}
+/** Test that our blinding functions will fail if we pass them bad pubkeys */
+static void
+test_crypto_ed25519_blinding_fail(void *arg)
+{
+ int retval;
+ uint8_t param[32] = {2};
+ ed25519_public_key_t pub;
+ ed25519_public_key_t pub_blinded;
+
+ (void)arg;
+
+ /* This point is not on the curve: the blind routines should fail */
+ const char badkey[] =
+ "e19c65de75c68cf3b7643ea732ba9eb1a3d20d6d57ba223c2ece1df66feb5af0";
+ retval = base16_decode((char*)pub.pubkey, sizeof(pub.pubkey),
+ badkey, strlen(badkey));
+ tt_int_op(retval, OP_EQ, sizeof(pub.pubkey));
+ retval = ed25519_public_blind(&pub_blinded, &pub, param);
+ tt_int_op(retval, OP_EQ, -1);
+
+ /* This point is legit: blind routines should be happy */
+ const char goodkey[] =
+ "4ba2e44760dff4c559ef3c38768c1c14a8a54740c782c8d70803e9d6e3ad8794";
+ retval = base16_decode((char*)pub.pubkey, sizeof(pub.pubkey),
+ goodkey, strlen(goodkey));
+ tt_int_op(retval, OP_EQ, sizeof(pub.pubkey));
+ retval = ed25519_public_blind(&pub_blinded, &pub, param);
+ tt_int_op(retval, OP_EQ, 0);
+
+ done:
+ ;
+}
+
static void
test_crypto_ed25519_testvectors(void *arg)
{
@@ -2639,8 +2675,8 @@ test_crypto_ed25519_storage(void *arg)
tor_free(tag);
/* whitebox test: truncated keys. */
- tt_int_op(0, ==, do_truncate(fname_1, 40));
- tt_int_op(0, ==, do_truncate(fname_2, 40));
+ tt_int_op(0, OP_EQ, do_truncate(fname_1, 40));
+ tt_int_op(0, OP_EQ, do_truncate(fname_2, 40));
tt_int_op(-1, OP_EQ, ed25519_pubkey_read_from_file(&pub, &tag, fname_2));
tt_ptr_op(tag, OP_EQ, NULL);
tor_free(tag);
@@ -2832,6 +2868,67 @@ crypto_rand_check_failure_mode_predict(void)
#undef FAILURE_MODE_BUFFER_SIZE
+/** Test that our ed25519 validation function rejects evil public keys and
+ * accepts good ones. */
+static void
+test_crypto_ed25519_validation(void *arg)
+{
+ (void) arg;
+
+ int retval;
+ ed25519_public_key_t pub1;
+
+ /* See https://lists.torproject.org/pipermail/tor-dev/2017-April/012230.html
+ for a list of points with torsion components in ed25519. */
+
+ { /* Point with torsion component (order 8l) */
+ const char badkey[] =
+ "300ef2e64e588e1df55b48e4da0416ffb64cc85d5b00af6463d5cc6c2b1c185e";
+ retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey),
+ badkey, strlen(badkey));
+ tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey));
+ tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1);
+ }
+
+ { /* Point with torsion component (order 4l) */
+ const char badkey[] =
+ "f43e3a046db8749164c6e69b193f1e942c7452e7d888736f40b98093d814d5e7";
+ retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey),
+ badkey, strlen(badkey));
+ tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey));
+ tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1);
+ }
+
+ { /* Point with torsion component (order 2l) */
+ const char badkey[] =
+ "c9fff3af0471c28e33e98c2043e44f779d0427b1e37c521a6bddc011ed1869af";
+ retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey),
+ badkey, strlen(badkey));
+ tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey));
+ tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1);
+ }
+
+ { /* This point is not even on the curve */
+ const char badkey[] =
+ "e19c65de75c68cf3b7643ea732ba9eb1a3d20d6d57ba223c2ece1df66feb5af0";
+ retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey),
+ badkey, strlen(badkey));
+ tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey));
+ tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, -1);
+ }
+
+ { /* This one is a good key */
+ const char goodkey[] =
+ "4ba2e44760dff4c559ef3c38768c1c14a8a54740c782c8d70803e9d6e3ad8794";
+ retval = base16_decode((char*)pub1.pubkey, sizeof(pub1.pubkey),
+ goodkey, strlen(goodkey));
+ tt_int_op(retval, OP_EQ, sizeof(pub1.pubkey));
+ tt_int_op(ed25519_validate_pubkey(&pub1), OP_EQ, 0);
+ }
+
+ done: ;
+}
+
static void
test_crypto_failure_modes(void *arg)
{
@@ -2839,17 +2936,17 @@ test_crypto_failure_modes(void *arg)
(void)arg;
rv = crypto_early_init();
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
/* Check random works */
rv = crypto_rand_check_failure_mode_zero();
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
rv = crypto_rand_check_failure_mode_identical();
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
rv = crypto_rand_check_failure_mode_predict();
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
done:
;
@@ -2917,7 +3014,9 @@ struct testcase_t crypto_tests[] = {
ED25519_TEST(encode, 0),
ED25519_TEST(convert, 0),
ED25519_TEST(blinding, 0),
+ ED25519_TEST(blinding_fail, 0),
ED25519_TEST(testvectors, 0),
+ ED25519_TEST(validation, 0),
{ "ed25519_storage", test_crypto_ed25519_storage, 0, NULL, NULL },
{ "siphash", test_crypto_siphash, 0, NULL, NULL },
{ "failure_modes", test_crypto_failure_modes, TT_FORK, NULL, NULL },
diff --git a/src/test/test_crypto_openssl.c b/src/test/test_crypto_openssl.c
index 3d7d2b4639..f6817398da 100644
--- a/src/test/test_crypto_openssl.c
+++ b/src/test/test_crypto_openssl.c
@@ -26,7 +26,7 @@ test_crypto_rng_engine(void *arg)
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_int_op(0, OP_EQ, crypto_force_rand_ssleay());
tt_assert(RAND_get_rand_method() == RAND_OpenSSL());
/* We should correct the method if it's a dummy. */
@@ -34,10 +34,10 @@ test_crypto_rng_engine(void *arg)
#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());
+ tt_int_op(0, OP_EQ, crypto_force_rand_ssleay());
#else
tt_assert(RAND_get_rand_method() == &dummy_method);
- tt_int_op(1, ==, crypto_force_rand_ssleay());
+ tt_int_op(1, OP_EQ, crypto_force_rand_ssleay());
#endif
tt_assert(RAND_get_rand_method() == RAND_OpenSSL());
diff --git a/src/test/test_crypto_slow.c b/src/test/test_crypto_slow.c
index 75c6ba9aaa..b25d472a57 100644
--- a/src/test/test_crypto_slow.c
+++ b/src/test/test_crypto_slow.c
@@ -164,10 +164,10 @@ test_libscrypt_eq_openssl(void *arg)
EVP_PBE_scrypt((const char *)"", 0, (const unsigned char *)"", 0,
N, r, p, maxmem, buf2, dk_len);
- tt_int_op(libscrypt_retval, ==, 0);
- tt_int_op(openssl_retval, ==, 1);
+ tt_int_op(libscrypt_retval, OP_EQ, 0);
+ tt_int_op(openssl_retval, OP_EQ, 1);
- tt_mem_op(buf1, ==, buf2, 64);
+ tt_mem_op(buf1, OP_EQ, buf2, 64);
memset(buf1,0,64);
memset(buf2,0,64);
@@ -185,10 +185,10 @@ test_libscrypt_eq_openssl(void *arg)
(const unsigned char *)"NaCl", strlen("NaCl"),
N, r, p, maxmem, buf2, dk_len);
- tt_int_op(libscrypt_retval, ==, 0);
- tt_int_op(openssl_retval, ==, 1);
+ tt_int_op(libscrypt_retval, OP_EQ, 0);
+ tt_int_op(openssl_retval, OP_EQ, 1);
- tt_mem_op(buf1, ==, buf2, 64);
+ tt_mem_op(buf1, OP_EQ, buf2, 64);
memset(buf1,0,64);
memset(buf2,0,64);
@@ -210,10 +210,10 @@ test_libscrypt_eq_openssl(void *arg)
strlen("SodiumChloride"),
N, r, p, maxmem, buf2, dk_len);
- tt_int_op(libscrypt_retval, ==, 0);
- tt_int_op(openssl_retval, ==, 1);
+ tt_int_op(libscrypt_retval, OP_EQ, 0);
+ tt_int_op(openssl_retval, OP_EQ, 1);
- tt_mem_op(buf1, ==, buf2, 64);
+ tt_mem_op(buf1, OP_EQ, buf2, 64);
memset(buf1,0,64);
memset(buf2,0,64);
@@ -234,10 +234,10 @@ test_libscrypt_eq_openssl(void *arg)
strlen("SodiumChloride"),
N, r, p, maxmem, buf2, dk_len);
- tt_int_op(libscrypt_retval, ==, 0);
- tt_int_op(openssl_retval, ==, 1);
+ tt_int_op(libscrypt_retval, OP_EQ, 0);
+ tt_int_op(openssl_retval, OP_EQ, 1);
- tt_mem_op(buf1, ==, buf2, 64);
+ tt_mem_op(buf1, OP_EQ, buf2, 64);
done:
return;
@@ -516,7 +516,7 @@ test_crypto_ed25519_fuzz_donna(void *arg)
unsigned i;
(void)arg;
- tt_assert(sizeof(msg) == iters);
+ tt_uint_op(iters, OP_EQ, sizeof(msg));
crypto_rand((char*) msg, sizeof(msg));
/* Fuzz Ed25519-donna vs ref10, alternating the implementation used to
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index a9d9cba7df..b6b0936f83 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -275,8 +275,8 @@ test_dir_formats(void *arg)
tt_int_op(rp1->bandwidthrate,OP_EQ, r1->bandwidthrate);
tt_int_op(rp1->bandwidthburst,OP_EQ, r1->bandwidthburst);
tt_int_op(rp1->bandwidthcapacity,OP_EQ, r1->bandwidthcapacity);
- tt_assert(crypto_pk_cmp_keys(rp1->onion_pkey, pk1) == 0);
- tt_assert(crypto_pk_cmp_keys(rp1->identity_pkey, pk2) == 0);
+ tt_int_op(crypto_pk_cmp_keys(rp1->onion_pkey, pk1), OP_EQ, 0);
+ tt_int_op(crypto_pk_cmp_keys(rp1->identity_pkey, pk2), OP_EQ, 0);
tt_assert(rp1->supports_tunnelled_dir_requests);
//tt_assert(rp1->exit_policy == NULL);
tor_free(buf);
@@ -294,9 +294,9 @@ test_dir_formats(void *arg)
strlcat(buf2, "master-key-ed25519 ", sizeof(buf2));
{
char k[ED25519_BASE64_LEN+1];
- tt_assert(ed25519_public_to_base64(k,
- &r2->cache_info.signing_key_cert->signing_key)
- >= 0);
+ tt_int_op(ed25519_public_to_base64(k,
+ &r2->cache_info.signing_key_cert->signing_key),
+ OP_GE, 0);
strlcat(buf2, k, sizeof(buf2));
strlcat(buf2, "\n", sizeof(buf2));
}
@@ -392,8 +392,8 @@ test_dir_formats(void *arg)
tt_mem_op(rp2->onion_curve25519_pkey->public_key,OP_EQ,
r2->onion_curve25519_pkey->public_key,
CURVE25519_PUBKEY_LEN);
- tt_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0);
- tt_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0);
+ tt_int_op(crypto_pk_cmp_keys(rp2->onion_pkey, pk2), OP_EQ, 0);
+ tt_int_op(crypto_pk_cmp_keys(rp2->identity_pkey, pk1), OP_EQ, 0);
tt_assert(rp2->supports_tunnelled_dir_requests);
tt_int_op(smartlist_len(rp2->exit_policy),OP_EQ, 2);
@@ -478,34 +478,34 @@ test_dir_routerinfo_parsing(void *arg)
routerinfo_free(ri);
ri = router_parse_entry_from_string(EX_RI_MINIMAL, NULL, 0, 0,
"@purpose bridge\n", NULL);
- tt_assert(ri != NULL);
+ tt_ptr_op(ri, OP_NE, NULL);
tt_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE);
routerinfo_free(ri);
/* bad annotations prepended. */
ri = router_parse_entry_from_string(EX_RI_MINIMAL,
NULL, 0, 0, "@purpose\n", NULL);
- tt_assert(ri == NULL);
+ tt_ptr_op(ri, OP_EQ, NULL);
/* bad annotations on router. */
ri = router_parse_entry_from_string("@purpose\nrouter x\n", NULL, 0, 1,
NULL, NULL);
- tt_assert(ri == NULL);
+ tt_ptr_op(ri, OP_EQ, NULL);
/* unwanted annotations on router. */
ri = router_parse_entry_from_string("@purpose foo\nrouter x\n", NULL, 0, 0,
NULL, NULL);
- tt_assert(ri == NULL);
+ tt_ptr_op(ri, OP_EQ, NULL);
/* No signature. */
ri = router_parse_entry_from_string("router x\n", NULL, 0, 0,
NULL, NULL);
- tt_assert(ri == NULL);
+ tt_ptr_op(ri, OP_EQ, NULL);
/* Not a router */
routerinfo_free(ri);
ri = router_parse_entry_from_string("hello\n", NULL, 0, 0, NULL, NULL);
- tt_assert(ri == NULL);
+ tt_ptr_op(ri, OP_EQ, NULL);
CHECK_FAIL(EX_RI_BAD_SIG1, 1);
CHECK_FAIL(EX_RI_BAD_SIG2, 1);
@@ -632,11 +632,11 @@ test_dir_extrainfo_parsing(void *arg)
ADD(EX_EI_ED_MISPLACED_SIG);
CHECK_OK(EX_EI_MINIMAL);
- tt_assert(!ei->pending_sig);
+ tt_ptr_op(ei->pending_sig, OP_EQ, NULL);
CHECK_OK(EX_EI_MAXIMAL);
- tt_assert(!ei->pending_sig);
+ tt_ptr_op(ei->pending_sig, OP_EQ, NULL);
CHECK_OK(EX_EI_GOOD_ED_EI);
- tt_assert(!ei->pending_sig);
+ tt_ptr_op(ei->pending_sig, OP_EQ, NULL);
CHECK_FAIL(EX_EI_BAD_SIG1,1);
CHECK_FAIL(EX_EI_BAD_SIG2,1);
@@ -1537,12 +1537,12 @@ test_dir_measured_bw_kb(void *arg)
(void)arg;
for (i = 0; strcmp(lines_fail[i], "end"); i++) {
//fprintf(stderr, "Testing: %s\n", lines_fail[i]);
- tt_assert(measured_bw_line_parse(&mbwl, lines_fail[i]) == -1);
+ tt_int_op(measured_bw_line_parse(&mbwl, lines_fail[i]), OP_EQ, -1);
}
for (i = 0; strcmp(lines_pass[i], "end"); i++) {
//fprintf(stderr, "Testing: %s %d\n", lines_pass[i], TOR_ISSPACE('\n'));
- tt_assert(measured_bw_line_parse(&mbwl, lines_pass[i]) == 0);
+ tt_int_op(measured_bw_line_parse(&mbwl, lines_pass[i]), OP_EQ, 0);
tt_assert(mbwl.bw_kb == 1024);
tt_assert(strcmp(mbwl.node_hex,
"557365204145532d32353620696e73746561642e") == 0);
@@ -1785,7 +1785,7 @@ test_dir_param_voting_lookup(void *arg)
dirvote_get_intermediate_param_value(lst, "moomin", -100));
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,
- "!(n_found > 1)");
+ "n_found == 0");
tor_end_capture_bugs_();
/* There is no 'fred=', so that is treated as not existing. */
tt_int_op(-100, OP_EQ,
@@ -1873,8 +1873,7 @@ vote_tweaks_for_v3ns(networkstatus_t *v, int voter, time_t now)
measured_bw_line_t mbw;
memset(mbw.node_id, 33, sizeof(mbw.node_id));
mbw.bw_kb = 1024;
- tt_assert(measured_bw_line_apply(&mbw,
- v->routerstatus_list) == 1);
+ tt_int_op(measured_bw_line_apply(&mbw, v->routerstatus_list), OP_EQ, 1);
} else if (voter == 2 || voter == 3) {
/* Monkey around with the list a bit */
vrs = smartlist_get(v->routerstatus_list, 2);
@@ -1990,7 +1989,7 @@ test_consensus_for_v3ns(networkstatus_t *con, time_t now)
(void)now;
tt_assert(con);
- tt_assert(!con->cert);
+ tt_ptr_op(con->cert, OP_EQ, NULL);
tt_int_op(2,OP_EQ, smartlist_len(con->routerstatus_list));
/* There should be two listed routers: one with identity 3, one with
* identity 5. */
@@ -2060,7 +2059,7 @@ test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now)
/* XXXX check version */
} else {
/* Weren't expecting this... */
- tt_assert(0);
+ tt_abort();
}
done:
@@ -3004,7 +3003,7 @@ gen_routerstatus_for_umbw(int idx, time_t now)
break;
default:
/* Shouldn't happen */
- tt_assert(0);
+ tt_abort();
}
if (vrs) {
vrs->microdesc = tor_malloc_zero(sizeof(vote_microdesc_hash_t));
@@ -3144,7 +3143,7 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now)
tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2);
tt_int_op(vrs->measured_bw_kb,OP_EQ, 0);
} else {
- tt_assert(0);
+ tt_abort();
}
done:
@@ -3160,9 +3159,9 @@ test_consensus_for_umbw(networkstatus_t *con, time_t now)
(void)now;
tt_assert(con);
- tt_assert(!con->cert);
+ tt_ptr_op(con->cert, OP_EQ, NULL);
// tt_assert(con->consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB);
- tt_assert(con->consensus_method >= 16);
+ tt_int_op(con->consensus_method, OP_GE, 16);
tt_int_op(4,OP_EQ, smartlist_len(con->routerstatus_list));
/* There should be four listed routers; all voters saw the same in this */
@@ -3259,7 +3258,7 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
tt_assert(rs->bw_is_unmeasured);
} else {
/* Weren't expecting this... */
- tt_assert(0);
+ tt_abort();
}
done:
@@ -3427,15 +3426,17 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
* Return values are {2, 3, 4} */
/* We want 3 ("*" means match all addresses) */
- tt_assert(routerset_contains_routerstatus(routerset_all, rs_a, 0) == 3);
- tt_assert(routerset_contains_routerstatus(routerset_all, rs_b, 0) == 3);
+ tt_int_op(routerset_contains_routerstatus(routerset_all, rs_a, 0), OP_EQ, 3);
+ tt_int_op(routerset_contains_routerstatus(routerset_all, rs_b, 0), OP_EQ, 3);
/* We want 4 (match id_digest [or nickname]) */
- tt_assert(routerset_contains_routerstatus(routerset_a, rs_a, 0) == 4);
- tt_assert(routerset_contains_routerstatus(routerset_a, rs_b, 0) == 0);
+ tt_int_op(routerset_contains_routerstatus(routerset_a, rs_a, 0), OP_EQ, 4);
+ tt_int_op(routerset_contains_routerstatus(routerset_a, rs_b, 0), OP_EQ, 0);
- tt_assert(routerset_contains_routerstatus(routerset_none, rs_a, 0) == 0);
- tt_assert(routerset_contains_routerstatus(routerset_none, rs_b, 0) == 0);
+ tt_int_op(routerset_contains_routerstatus(routerset_none, rs_a, 0), OP_EQ,
+ 0);
+ tt_int_op(routerset_contains_routerstatus(routerset_none, rs_b, 0), OP_EQ,
+ 0);
/* Check that "*" sets flags on all routers: Exit
* Check the flags aren't being confused with each other */
@@ -3447,17 +3448,17 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
mock_options->TestingDirAuthVoteExitIsStrict = 0;
dirserv_set_routerstatus_testing(rs_a);
- tt_assert(mock_get_options_calls == 1);
+ tt_int_op(mock_get_options_calls, OP_EQ, 1);
dirserv_set_routerstatus_testing(rs_b);
- tt_assert(mock_get_options_calls == 2);
+ tt_int_op(mock_get_options_calls, OP_EQ, 2);
- tt_assert(rs_a->is_exit == 1);
- tt_assert(rs_b->is_exit == 1);
+ tt_uint_op(rs_a->is_exit, OP_EQ, 1);
+ tt_uint_op(rs_b->is_exit, OP_EQ, 1);
/* Be paranoid - check no other flags are set */
- tt_assert(rs_a->is_possible_guard == 0);
- tt_assert(rs_b->is_possible_guard == 0);
- tt_assert(rs_a->is_hs_dir == 0);
- tt_assert(rs_b->is_hs_dir == 0);
+ tt_uint_op(rs_a->is_possible_guard, OP_EQ, 0);
+ tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0);
+ tt_uint_op(rs_a->is_hs_dir, OP_EQ, 0);
+ tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0);
/* Check that "*" sets flags on all routers: Guard & HSDir
* Cover the remaining flags in one test */
@@ -3471,17 +3472,17 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
mock_options->TestingDirAuthVoteHSDirIsStrict = 0;
dirserv_set_routerstatus_testing(rs_a);
- tt_assert(mock_get_options_calls == 1);
+ tt_int_op(mock_get_options_calls, OP_EQ, 1);
dirserv_set_routerstatus_testing(rs_b);
- tt_assert(mock_get_options_calls == 2);
+ tt_int_op(mock_get_options_calls, OP_EQ, 2);
- tt_assert(rs_a->is_possible_guard == 1);
- tt_assert(rs_b->is_possible_guard == 1);
- tt_assert(rs_a->is_hs_dir == 1);
- tt_assert(rs_b->is_hs_dir == 1);
+ tt_uint_op(rs_a->is_possible_guard, OP_EQ, 1);
+ tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1);
+ tt_uint_op(rs_a->is_hs_dir, OP_EQ, 1);
+ tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1);
/* Be paranoid - check exit isn't set */
- tt_assert(rs_a->is_exit == 0);
- tt_assert(rs_b->is_exit == 0);
+ tt_uint_op(rs_a->is_exit, OP_EQ, 0);
+ tt_uint_op(rs_b->is_exit, OP_EQ, 0);
/* Check routerset A sets all flags on router A,
* but leaves router B unmodified */
@@ -3497,16 +3498,16 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
mock_options->TestingDirAuthVoteHSDirIsStrict = 0;
dirserv_set_routerstatus_testing(rs_a);
- tt_assert(mock_get_options_calls == 1);
+ tt_int_op(mock_get_options_calls, OP_EQ, 1);
dirserv_set_routerstatus_testing(rs_b);
- tt_assert(mock_get_options_calls == 2);
+ tt_int_op(mock_get_options_calls, OP_EQ, 2);
- tt_assert(rs_a->is_exit == 1);
- tt_assert(rs_b->is_exit == 0);
- tt_assert(rs_a->is_possible_guard == 1);
- tt_assert(rs_b->is_possible_guard == 0);
- tt_assert(rs_a->is_hs_dir == 1);
- tt_assert(rs_b->is_hs_dir == 0);
+ tt_uint_op(rs_a->is_exit, OP_EQ, 1);
+ tt_uint_op(rs_b->is_exit, OP_EQ, 0);
+ tt_uint_op(rs_a->is_possible_guard, OP_EQ, 1);
+ tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0);
+ tt_uint_op(rs_a->is_hs_dir, OP_EQ, 1);
+ tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0);
/* Check routerset A unsets all flags on router B when Strict is set */
reset_options(mock_options, &mock_get_options_calls);
@@ -3524,11 +3525,11 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
rs_b->is_hs_dir = 1;
dirserv_set_routerstatus_testing(rs_b);
- tt_assert(mock_get_options_calls == 1);
+ tt_int_op(mock_get_options_calls, OP_EQ, 1);
- tt_assert(rs_b->is_exit == 0);
- tt_assert(rs_b->is_possible_guard == 0);
- tt_assert(rs_b->is_hs_dir == 0);
+ tt_uint_op(rs_b->is_exit, OP_EQ, 0);
+ tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0);
+ tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0);
/* Check routerset A doesn't modify flags on router B without Strict set */
reset_options(mock_options, &mock_get_options_calls);
@@ -3546,11 +3547,11 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
rs_b->is_hs_dir = 1;
dirserv_set_routerstatus_testing(rs_b);
- tt_assert(mock_get_options_calls == 1);
+ tt_int_op(mock_get_options_calls, OP_EQ, 1);
- tt_assert(rs_b->is_exit == 1);
- tt_assert(rs_b->is_possible_guard == 1);
- tt_assert(rs_b->is_hs_dir == 1);
+ tt_uint_op(rs_b->is_exit, OP_EQ, 1);
+ tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1);
+ tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1);
/* Check the empty routerset zeroes all flags
* on routers A & B with Strict set */
@@ -3569,11 +3570,11 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
rs_b->is_hs_dir = 1;
dirserv_set_routerstatus_testing(rs_b);
- tt_assert(mock_get_options_calls == 1);
+ tt_int_op(mock_get_options_calls, OP_EQ, 1);
- tt_assert(rs_b->is_exit == 0);
- tt_assert(rs_b->is_possible_guard == 0);
- tt_assert(rs_b->is_hs_dir == 0);
+ tt_uint_op(rs_b->is_exit, OP_EQ, 0);
+ tt_uint_op(rs_b->is_possible_guard, OP_EQ, 0);
+ tt_uint_op(rs_b->is_hs_dir, OP_EQ, 0);
/* Check the empty routerset doesn't modify any flags
* on A or B without Strict set */
@@ -3593,16 +3594,16 @@ test_dir_dirserv_set_routerstatus_testing(void *arg)
rs_b->is_hs_dir = 1;
dirserv_set_routerstatus_testing(rs_a);
- tt_assert(mock_get_options_calls == 1);
+ tt_int_op(mock_get_options_calls, OP_EQ, 1);
dirserv_set_routerstatus_testing(rs_b);
- tt_assert(mock_get_options_calls == 2);
+ tt_int_op(mock_get_options_calls, OP_EQ, 2);
- tt_assert(rs_a->is_exit == 0);
- tt_assert(rs_a->is_possible_guard == 0);
- tt_assert(rs_a->is_hs_dir == 0);
- tt_assert(rs_b->is_exit == 1);
- tt_assert(rs_b->is_possible_guard == 1);
- tt_assert(rs_b->is_hs_dir == 1);
+ tt_uint_op(rs_a->is_exit, OP_EQ, 0);
+ tt_uint_op(rs_a->is_possible_guard, OP_EQ, 0);
+ tt_uint_op(rs_a->is_hs_dir, OP_EQ, 0);
+ tt_uint_op(rs_b->is_exit, OP_EQ, 1);
+ tt_uint_op(rs_b->is_possible_guard, OP_EQ, 1);
+ tt_uint_op(rs_b->is_hs_dir, OP_EQ, 1);
done:
tor_free(mock_options);
@@ -3658,7 +3659,7 @@ test_dir_http_handling(void *args)
"User-Agent: Mozilla/5.0 (Windows;"
" U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
&url),OP_EQ, -1);
- tt_assert(!url);
+ tt_ptr_op(url, OP_EQ, NULL);
/* Bad headers */
tt_int_op(parse_http_url("GET /a/b/c.txt\r\n"
@@ -3666,23 +3667,23 @@ test_dir_http_handling(void *args)
"User-Agent: Mozilla/5.0 (Windows;"
" U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
&url),OP_EQ, -1);
- tt_assert(!url);
+ tt_ptr_op(url, OP_EQ, NULL);
tt_int_op(parse_http_url("GET /tor/a/b/c.txt", &url),OP_EQ, -1);
- tt_assert(!url);
+ tt_ptr_op(url, OP_EQ, NULL);
tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url),OP_EQ, -1);
- tt_assert(!url);
+ tt_ptr_op(url, OP_EQ, NULL);
tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url),
OP_EQ, -1);
- tt_assert(!url);
+ tt_ptr_op(url, OP_EQ, NULL);
tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url),OP_EQ, -1);
- tt_assert(!url);
+ tt_ptr_op(url, OP_EQ, NULL);
tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url),OP_EQ, -1);
- tt_assert(!url);
+ tt_ptr_op(url, OP_EQ, NULL);
done:
tor_free(url);
@@ -3695,8 +3696,8 @@ test_dir_purpose_needs_anonymity_returns_true_by_default(void *arg)
tor_capture_bugs_(1);
setup_full_capture_of_logs(LOG_WARN);
- tt_int_op(1, ==, purpose_needs_anonymity(0, 0, NULL));
- tt_int_op(1, ==, smartlist_len(tor_get_captured_bug_log_()));
+ tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, 0, NULL));
+ tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_()));
expect_single_log_msg_containing("Called with dir_purpose=0");
tor_end_capture_bugs_();
@@ -3710,11 +3711,12 @@ test_dir_purpose_needs_anonymity_returns_true_for_bridges(void *arg)
{
(void)arg;
- tt_int_op(1, ==, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE, NULL));
- tt_int_op(1, ==, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE,
+ tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE, NULL));
+ tt_int_op(1, OP_EQ, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE,
"foobar"));
- tt_int_op(1, ==, purpose_needs_anonymity(DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2,
- ROUTER_PURPOSE_BRIDGE, NULL));
+ tt_int_op(1, OP_EQ,
+ purpose_needs_anonymity(DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2,
+ ROUTER_PURPOSE_BRIDGE, NULL));
done: ;
}
@@ -3722,7 +3724,7 @@ static void
test_dir_purpose_needs_anonymity_returns_false_for_own_bridge_desc(void *arg)
{
(void)arg;
- tt_int_op(0, ==, purpose_needs_anonymity(DIR_PURPOSE_FETCH_SERVERDESC,
+ tt_int_op(0, OP_EQ, purpose_needs_anonymity(DIR_PURPOSE_FETCH_SERVERDESC,
ROUTER_PURPOSE_BRIDGE,
"authority.z"));
done: ;
@@ -3733,12 +3735,12 @@ test_dir_purpose_needs_anonymity_returns_true_for_sensitive_purpose(void *arg)
{
(void)arg;
- tt_int_op(1, ==, purpose_needs_anonymity(
+ tt_int_op(1, OP_EQ, purpose_needs_anonymity(
DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2,
ROUTER_PURPOSE_GENERAL, NULL));
- tt_int_op(1, ==, purpose_needs_anonymity(
+ tt_int_op(1, OP_EQ, purpose_needs_anonymity(
DIR_PURPOSE_UPLOAD_RENDDESC_V2, 0, NULL));
- tt_int_op(1, ==, purpose_needs_anonymity(
+ tt_int_op(1, OP_EQ, purpose_needs_anonymity(
DIR_PURPOSE_FETCH_RENDDESC_V2, 0, NULL));
done: ;
}
@@ -3748,24 +3750,25 @@ test_dir_purpose_needs_anonymity_ret_false_for_non_sensitive_conn(void *arg)
{
(void)arg;
- tt_int_op(0, ==, purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_DIR,
+ tt_int_op(0, OP_EQ, purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_DIR,
ROUTER_PURPOSE_GENERAL, NULL));
- tt_int_op(0, ==, purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_VOTE, 0, NULL));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
+ purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_VOTE, 0, NULL));
+ tt_int_op(0, OP_EQ,
purpose_needs_anonymity(DIR_PURPOSE_UPLOAD_SIGNATURES, 0, NULL));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
purpose_needs_anonymity(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL));
- tt_int_op(0, ==, purpose_needs_anonymity(
+ tt_int_op(0, OP_EQ, purpose_needs_anonymity(
DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
purpose_needs_anonymity(DIR_PURPOSE_FETCH_CONSENSUS, 0, NULL));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
purpose_needs_anonymity(DIR_PURPOSE_FETCH_CERTIFICATE, 0, NULL));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
purpose_needs_anonymity(DIR_PURPOSE_FETCH_SERVERDESC, 0, NULL));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
purpose_needs_anonymity(DIR_PURPOSE_FETCH_EXTRAINFO, 0, NULL));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
purpose_needs_anonymity(DIR_PURPOSE_FETCH_MICRODESC, 0, NULL));
done: ;
}
@@ -3818,9 +3821,9 @@ test_dir_packages(void *arg)
(void)arg;
#define BAD(s) \
- tt_int_op(0, ==, validate_recommended_package_line(s));
+ tt_int_op(0, OP_EQ, validate_recommended_package_line(s));
#define GOOD(s) \
- tt_int_op(1, ==, validate_recommended_package_line(s));
+ tt_int_op(1, OP_EQ, validate_recommended_package_line(s));
GOOD("tor 0.2.6.3-alpha "
"http://torproject.example.com/dist/tor-0.2.6.3-alpha.tar.gz "
"sha256=sssdlkfjdsklfjdskfljasdklfj");
@@ -3937,7 +3940,7 @@ test_dir_packages(void *arg)
res = compute_consensus_package_lines(votes);
tt_assert(res);
- tt_str_op(res, ==,
+ tt_str_op(res, OP_EQ,
"package cbc 99.1.11.1.1 http://example.com/cbc/ cubehash=ahooy sha512=m\n"
"package clownshoes 22alpha3 http://quumble.example.com/ blake2=fooz\n"
"package clownshoes 22alpha4 http://quumble.example.cam/ blake2=fooa\n"
@@ -4109,40 +4112,69 @@ test_dir_download_status_schedule(void *arg)
}
static void
-test_dir_download_status_random_backoff(void *arg)
+download_status_random_backoff_helper(int min_delay, int max_delay)
{
download_status_t dls_random =
{ 0, 0, 0, DL_SCHED_GENERIC, DL_WANT_AUTHORITY,
DL_SCHED_INCREMENT_FAILURE, DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 };
int increment = -1;
- int old_increment;
+ int old_increment = -1;
time_t current_time = time(NULL);
- const int min_delay = 0;
- const int max_delay = 1000000;
-
- (void)arg;
+ const int exponent = DIR_DEFAULT_RANDOM_MULTIPLIER + 1;
/* Check the random backoff cases */
- old_increment = 0;
do {
increment = download_status_schedule_get_delay(&dls_random,
NULL,
min_delay, max_delay,
current_time);
+
+ log_debug(LD_DIR, "Min: %d, Max: %d, Inc: %d, Old Inc: %d",
+ min_delay, max_delay, increment, old_increment);
+
+ /* Regression test for 20534 and friends
+ * increment must always increase after the first */
+ if (dls_random.last_backoff_position > 0 && max_delay > 0) {
+ /* Always increment the exponential backoff */
+ tt_int_op(increment, OP_GE, 1);
+ }
+
/* Test */
tt_int_op(increment, OP_GE, min_delay);
tt_int_op(increment, OP_LE, max_delay);
- tt_int_op(increment, OP_GE, old_increment);
- /* We at most quadruple, and maybe add one */
- tt_int_op(increment, OP_LE, 4 * old_increment + 1);
+ if (dls_random.last_backoff_position == 0) {
+ /* regression tests for 17750
+ * Always use the minimum delay for the first increment */
+ tt_int_op(increment, OP_EQ, min_delay);
+ } else {
+ /* It's times like these I'd love a good saturating arithmetic
+ * implementation */
+ int min_inc = INT_MAX;
+ if (old_increment <= INT_MAX - 1) {
+ min_inc = old_increment + 1;
+ }
+
+ int max_inc = INT_MAX;
+ if (old_increment <= (INT_MAX - 1)/exponent) {
+ max_inc = (exponent * old_increment) + 1;
+ }
+
+ /* Regression test for 20534 and friends:
+ * increment must always increase after the first */
+ tt_int_op(increment, OP_GE, min_inc);
+ /* We at most quadruple, and always add one */
+ tt_int_op(increment, OP_LE, max_inc);
+ }
/* Advance */
- current_time += increment;
++(dls_random.n_download_attempts);
++(dls_random.n_download_failures);
/* Try another maybe */
old_increment = increment;
+ if (increment >= max_delay)
+ current_time += increment;
+
} while (increment < max_delay);
done:
@@ -4150,6 +4182,27 @@ test_dir_download_status_random_backoff(void *arg)
}
static void
+test_dir_download_status_random_backoff(void *arg)
+{
+ (void)arg;
+
+ /* Do a standard test */
+ download_status_random_backoff_helper(0, 1000000);
+ /* Regression test for 20534 and friends:
+ * try tighter bounds */
+ download_status_random_backoff_helper(0, 100);
+ /* regression tests for 17750: initial delay */
+ download_status_random_backoff_helper(10, 1000);
+ download_status_random_backoff_helper(20, 30);
+
+ /* Pathological cases */
+ download_status_random_backoff_helper(0, 0);
+ download_status_random_backoff_helper(1, 1);
+ download_status_random_backoff_helper(0, INT_MAX);
+ download_status_random_backoff_helper(INT_MAX/2, INT_MAX);
+}
+
+static void
test_dir_download_status_increment(void *arg)
{
(void)arg;
@@ -4161,32 +4214,97 @@ test_dir_download_status_increment(void *arg)
DL_WANT_ANY_DIRSERVER,
DL_SCHED_INCREMENT_ATTEMPT,
DL_SCHED_DETERMINISTIC, 0, 0 };
+ download_status_t dls_exp = { 0, 0, 0, DL_SCHED_GENERIC,
+ DL_WANT_ANY_DIRSERVER,
+ DL_SCHED_INCREMENT_ATTEMPT,
+ DL_SCHED_RANDOM_EXPONENTIAL, 0, 0 };
+ int no_delay = 0;
int delay0 = -1;
int delay1 = -1;
int delay2 = -1;
smartlist_t *schedule = smartlist_new();
+ smartlist_t *schedule_no_initial_delay = smartlist_new();
or_options_t test_options;
time_t next_at = TIME_MAX;
time_t current_time = time(NULL);
- /* Provide some values for the schedule */
+ /* Provide some values for the schedules */
delay0 = 10;
delay1 = 99;
delay2 = 20;
- /* Make the schedule */
+ /* Make the schedules */
smartlist_add(schedule, (void *)&delay0);
smartlist_add(schedule, (void *)&delay1);
smartlist_add(schedule, (void *)&delay2);
+ smartlist_add(schedule_no_initial_delay, (void *)&no_delay);
+ smartlist_add(schedule_no_initial_delay, (void *)&delay1);
+ smartlist_add(schedule_no_initial_delay, (void *)&delay2);
+
/* Put it in the options */
mock_options = &test_options;
reset_options(mock_options, &mock_get_options_calls);
- mock_options->TestingClientDownloadSchedule = schedule;
mock_options->TestingBridgeDownloadSchedule = schedule;
+ mock_options->TestingClientDownloadSchedule = schedule;
MOCK(get_options, mock_get_options);
+ /* Check that the initial value of the schedule is the first value used,
+ * whether or not it was reset before being used */
+
+ /* regression test for 17750: no initial delay */
+ mock_options->TestingClientDownloadSchedule = schedule_no_initial_delay;
+ mock_get_options_calls = 0;
+ /* we really want to test that it's equal to time(NULL) + delay0, but that's
+ * an unrealiable test, because time(NULL) might change. */
+ tt_assert(download_status_get_next_attempt_at(&dls_failure)
+ >= current_time + no_delay);
+ tt_assert(download_status_get_next_attempt_at(&dls_failure)
+ != TIME_MAX);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
+
+ /* regression test for 17750: initial delay */
+ mock_options->TestingClientDownloadSchedule = schedule;
+ mock_get_options_calls = 0;
+ /* we really want to test that it's equal to time(NULL) + delay0, but that's
+ * an unrealiable test, because time(NULL) might change. */
+ tt_assert(download_status_get_next_attempt_at(&dls_failure)
+ >= current_time + delay0);
+ tt_assert(download_status_get_next_attempt_at(&dls_failure)
+ != TIME_MAX);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
+
+ /* regression test for 17750: exponential, no initial delay */
+ mock_options->TestingClientDownloadSchedule = schedule_no_initial_delay;
+ mock_get_options_calls = 0;
+ /* we really want to test that it's equal to time(NULL) + delay0, but that's
+ * an unrealiable test, because time(NULL) might change. */
+ tt_assert(download_status_get_next_attempt_at(&dls_exp)
+ >= current_time + no_delay);
+ tt_assert(download_status_get_next_attempt_at(&dls_exp)
+ != TIME_MAX);
+ tt_int_op(download_status_get_n_failures(&dls_exp), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_exp), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
+
+ /* regression test for 17750: exponential, initial delay */
+ mock_options->TestingClientDownloadSchedule = schedule;
+ mock_get_options_calls = 0;
+ /* we really want to test that it's equal to time(NULL) + delay0, but that's
+ * an unrealiable test, because time(NULL) might change. */
+ tt_assert(download_status_get_next_attempt_at(&dls_exp)
+ >= current_time + delay0);
+ tt_assert(download_status_get_next_attempt_at(&dls_exp)
+ != TIME_MAX);
+ tt_int_op(download_status_get_n_failures(&dls_exp), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_exp), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
+
/* Check that a failure reset works */
mock_get_options_calls = 0;
download_status_reset(&dls_failure);
@@ -4196,76 +4314,76 @@ test_dir_download_status_increment(void *arg)
>= current_time + delay0);
tt_assert(download_status_get_next_attempt_at(&dls_failure)
!= TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_failure) == 0);
- tt_assert(download_status_get_n_attempts(&dls_failure) == 0);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* avoid timing inconsistencies */
dls_failure.next_attempt_at = current_time + delay0;
/* check that a reset schedule becomes ready at the right time */
- tt_assert(download_status_is_ready(&dls_failure,
- current_time + delay0 - 1,
- 1) == 0);
- tt_assert(download_status_is_ready(&dls_failure,
- current_time + delay0,
- 1) == 1);
- tt_assert(download_status_is_ready(&dls_failure,
- current_time + delay0 + 1,
- 1) == 1);
+ tt_int_op(download_status_is_ready(&dls_failure,
+ current_time + delay0 - 1, 1),
+ OP_EQ, 0);
+ tt_int_op(download_status_is_ready(&dls_failure,
+ current_time + delay0, 1),
+ OP_EQ, 1);
+ tt_int_op(download_status_is_ready(&dls_failure,
+ current_time + delay0 + 1, 1),
+ OP_EQ, 1);
/* Check that a failure increment works */
mock_get_options_calls = 0;
next_at = download_status_increment_failure(&dls_failure, 404, "test", 0,
current_time);
tt_assert(next_at == current_time + delay1);
- tt_assert(download_status_get_n_failures(&dls_failure) == 1);
- tt_assert(download_status_get_n_attempts(&dls_failure) == 1);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 1);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 1);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* check that an incremented schedule becomes ready at the right time */
- tt_assert(download_status_is_ready(&dls_failure,
- current_time + delay1 - 1,
- 1) == 0);
- tt_assert(download_status_is_ready(&dls_failure,
- current_time + delay1,
- 1) == 1);
- tt_assert(download_status_is_ready(&dls_failure,
- current_time + delay1 + 1,
- 1) == 1);
+ tt_int_op(download_status_is_ready(&dls_failure,
+ current_time + delay1 - 1, 1),
+ OP_EQ, 0);
+ tt_int_op(download_status_is_ready(&dls_failure,
+ current_time + delay1, 1),
+ OP_EQ, 1);
+ tt_int_op(download_status_is_ready(&dls_failure,
+ current_time + delay1 + 1, 1),
+ OP_EQ, 1);
/* check that a schedule isn't ready if it's had too many failures */
- tt_assert(download_status_is_ready(&dls_failure,
- current_time + delay1 + 10,
- 0) == 0);
+ tt_int_op(download_status_is_ready(&dls_failure,
+ current_time + delay1 + 10, 0),
+ OP_EQ, 0);
/* Check that failure increments do happen on 503 for clients, and
* attempt increments do too. */
mock_get_options_calls = 0;
next_at = download_status_increment_failure(&dls_failure, 503, "test", 0,
current_time);
- tt_i64_op(next_at, ==, current_time + delay2);
- tt_int_op(download_status_get_n_failures(&dls_failure), ==, 2);
- tt_int_op(download_status_get_n_attempts(&dls_failure), ==, 2);
- tt_assert(mock_get_options_calls >= 1);
+ tt_i64_op(next_at, OP_EQ, current_time + delay2);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 2);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 2);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check that failure increments do happen on 503 for servers */
mock_get_options_calls = 0;
next_at = download_status_increment_failure(&dls_failure, 503, "test", 1,
current_time);
tt_assert(next_at == current_time + delay2);
- tt_assert(download_status_get_n_failures(&dls_failure) == 3);
- tt_assert(download_status_get_n_attempts(&dls_failure) == 3);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 3);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 3);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check what happens when we run off the end of the schedule */
mock_get_options_calls = 0;
next_at = download_status_increment_failure(&dls_failure, 404, "test", 0,
current_time);
tt_assert(next_at == current_time + delay2);
- tt_assert(download_status_get_n_failures(&dls_failure) == 4);
- tt_assert(download_status_get_n_attempts(&dls_failure) == 4);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 4);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 4);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check what happens when we hit the failure limit */
mock_get_options_calls = 0;
@@ -4273,22 +4391,22 @@ test_dir_download_status_increment(void *arg)
next_at = download_status_increment_failure(&dls_failure, 404, "test", 0,
current_time);
tt_assert(next_at == TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_failure)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(download_status_get_n_attempts(&dls_failure)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check that a failure reset doesn't reset at the limit */
mock_get_options_calls = 0;
download_status_reset(&dls_failure);
tt_assert(download_status_get_next_attempt_at(&dls_failure)
== TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_failure)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(download_status_get_n_attempts(&dls_failure)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(mock_get_options_calls == 0);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(mock_get_options_calls, OP_EQ, 0);
/* Check that a failure reset resets just before the limit */
mock_get_options_calls = 0;
@@ -4301,9 +4419,9 @@ test_dir_download_status_increment(void *arg)
>= current_time + delay0);
tt_assert(download_status_get_next_attempt_at(&dls_failure)
!= TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_failure) == 0);
- tt_assert(download_status_get_n_attempts(&dls_failure) == 0);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check that failure increments do happen on attempt-based schedules,
* but that the retry is set at the end of time */
@@ -4311,9 +4429,9 @@ test_dir_download_status_increment(void *arg)
next_at = download_status_increment_failure(&dls_attempt, 404, "test", 0,
current_time);
tt_assert(next_at == TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_attempt) == 1);
- tt_assert(download_status_get_n_attempts(&dls_attempt) == 0);
- tt_assert(mock_get_options_calls == 0);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 1);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check that an attempt reset works */
mock_get_options_calls = 0;
@@ -4324,65 +4442,65 @@ test_dir_download_status_increment(void *arg)
>= current_time + delay0);
tt_assert(download_status_get_next_attempt_at(&dls_attempt)
!= TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_attempt) == 0);
- tt_assert(download_status_get_n_attempts(&dls_attempt) == 0);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* avoid timing inconsistencies */
dls_attempt.next_attempt_at = current_time + delay0;
/* check that a reset schedule becomes ready at the right time */
- tt_assert(download_status_is_ready(&dls_attempt,
- current_time + delay0 - 1,
- 1) == 0);
- tt_assert(download_status_is_ready(&dls_attempt,
- current_time + delay0,
- 1) == 1);
- tt_assert(download_status_is_ready(&dls_attempt,
- current_time + delay0 + 1,
- 1) == 1);
+ tt_int_op(download_status_is_ready(&dls_attempt,
+ current_time + delay0 - 1, 1),
+ OP_EQ, 0);
+ tt_int_op(download_status_is_ready(&dls_attempt,
+ current_time + delay0, 1),
+ OP_EQ, 1);
+ tt_int_op(download_status_is_ready(&dls_attempt,
+ current_time + delay0 + 1, 1),
+ OP_EQ, 1);
/* Check that an attempt increment works */
mock_get_options_calls = 0;
next_at = download_status_increment_attempt(&dls_attempt, "test",
current_time);
tt_assert(next_at == current_time + delay1);
- tt_assert(download_status_get_n_failures(&dls_attempt) == 0);
- tt_assert(download_status_get_n_attempts(&dls_attempt) == 1);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 1);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* check that an incremented schedule becomes ready at the right time */
- tt_assert(download_status_is_ready(&dls_attempt,
- current_time + delay1 - 1,
- 1) == 0);
- tt_assert(download_status_is_ready(&dls_attempt,
- current_time + delay1,
- 1) == 1);
- tt_assert(download_status_is_ready(&dls_attempt,
- current_time + delay1 + 1,
- 1) == 1);
+ tt_int_op(download_status_is_ready(&dls_attempt,
+ current_time + delay1 - 1, 1),
+ OP_EQ, 0);
+ tt_int_op(download_status_is_ready(&dls_attempt,
+ current_time + delay1, 1),
+ OP_EQ, 1);
+ tt_int_op(download_status_is_ready(&dls_attempt,
+ current_time + delay1 + 1, 1),
+ OP_EQ, 1);
/* check that a schedule isn't ready if it's had too many attempts */
- tt_assert(download_status_is_ready(&dls_attempt,
- current_time + delay1 + 10,
- 0) == 0);
+ tt_int_op(download_status_is_ready(&dls_attempt,
+ current_time + delay1 + 10, 0),
+ OP_EQ, 0);
/* Check what happens when we reach then run off the end of the schedule */
mock_get_options_calls = 0;
next_at = download_status_increment_attempt(&dls_attempt, "test",
current_time);
tt_assert(next_at == current_time + delay2);
- tt_assert(download_status_get_n_failures(&dls_attempt) == 0);
- tt_assert(download_status_get_n_attempts(&dls_attempt) == 2);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 2);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
mock_get_options_calls = 0;
next_at = download_status_increment_attempt(&dls_attempt, "test",
current_time);
tt_assert(next_at == current_time + delay2);
- tt_assert(download_status_get_n_failures(&dls_attempt) == 0);
- tt_assert(download_status_get_n_attempts(&dls_attempt) == 3);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 3);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check what happens when we hit the attempt limit */
mock_get_options_calls = 0;
@@ -4390,22 +4508,22 @@ test_dir_download_status_increment(void *arg)
next_at = download_status_increment_attempt(&dls_attempt, "test",
current_time);
tt_assert(next_at == TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_attempt)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(download_status_get_n_attempts(&dls_attempt)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check that an attempt reset doesn't reset at the limit */
mock_get_options_calls = 0;
download_status_reset(&dls_attempt);
tt_assert(download_status_get_next_attempt_at(&dls_attempt)
== TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_attempt)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(download_status_get_n_attempts(&dls_attempt)
- == IMPOSSIBLE_TO_DOWNLOAD);
- tt_assert(mock_get_options_calls == 0);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ,
+ IMPOSSIBLE_TO_DOWNLOAD);
+ tt_int_op(mock_get_options_calls, OP_EQ, 0);
/* Check that an attempt reset resets just before the limit */
mock_get_options_calls = 0;
@@ -4418,9 +4536,9 @@ test_dir_download_status_increment(void *arg)
>= current_time + delay0);
tt_assert(download_status_get_next_attempt_at(&dls_attempt)
!= TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_attempt) == 0);
- tt_assert(download_status_get_n_attempts(&dls_attempt) == 0);
- tt_assert(mock_get_options_calls >= 1);
+ tt_int_op(download_status_get_n_failures(&dls_attempt), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_attempt), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_GE, 1);
/* Check that attempt increments don't happen on failure-based schedules,
* and that the attempt is set at the end of time */
@@ -4433,13 +4551,14 @@ test_dir_download_status_increment(void *arg)
"schedule.");
teardown_capture_of_logs();
tt_assert(next_at == TIME_MAX);
- tt_assert(download_status_get_n_failures(&dls_failure) == 0);
- tt_assert(download_status_get_n_attempts(&dls_failure) == 0);
- tt_assert(mock_get_options_calls == 0);
+ tt_int_op(download_status_get_n_failures(&dls_failure), OP_EQ, 0);
+ tt_int_op(download_status_get_n_attempts(&dls_failure), OP_EQ, 0);
+ tt_int_op(mock_get_options_calls, OP_EQ, 0);
done:
/* the pointers in schedule are allocated on the stack */
smartlist_free(schedule);
+ smartlist_free(schedule_no_initial_delay);
UNMOCK(get_options);
mock_options = NULL;
mock_get_options_calls = 0;
@@ -4748,13 +4867,13 @@ mock_get_datadir_fname(const or_options_t *options,
* Assert we were called like get_datadir_fname2() or get_datadir_fname(),
* since that's all we implement here.
*/
- tt_assert(options != NULL);
- tt_assert(sub1 != NULL);
+ tt_ptr_op(options, OP_NE, NULL);
+ tt_ptr_op(sub1, OP_NE, NULL);
/*
* No particular assertions about sub2, since we could be in the
* get_datadir_fname() or get_datadir_fname2() case.
*/
- tt_assert(suffix == NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
/* Just duplicate the basename and return it for this mock */
if (sub2) {
@@ -4781,7 +4900,7 @@ mock_unlink_reset(void)
static int
mock_unlink(const char *path)
{
- tt_assert(path != NULL);
+ tt_ptr_op(path, OP_NE, NULL);
tor_free(last_unlinked_path);
last_unlinked_path = tor_strdup(path);
@@ -4810,8 +4929,8 @@ mock_write_str_to_file(const char *path, const char *str, int bin)
(void)bin;
- tt_assert(path != NULL);
- tt_assert(str != NULL);
+ tt_ptr_op(path, OP_NE, NULL);
+ tt_ptr_op(str, OP_NE, NULL);
len = strlen(str);
crypto_digest256((char *)hash, str, len, DIGEST_SHA256);
@@ -4937,7 +5056,7 @@ test_dir_dump_unparseable_descriptors(void *data)
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -4950,21 +5069,21 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_1));
+ tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_1));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 1);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 1);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256);
/*
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -4972,8 +5091,8 @@ test_dir_dump_unparseable_descriptors(void *data)
*/
mock_unlink_reset();
mock_write_str_to_file_reset();
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 0);
/*
* (2) Fire off dump_desc() twice; this still should trigger no cleanup.
@@ -4985,14 +5104,14 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_2));
+ tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_2));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 1);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 1);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256);
/* Second time */
@@ -5001,21 +5120,22 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_2) + strlen(test_desc_3));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_2) + strlen(test_desc_3));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256);
/*
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -5023,8 +5143,8 @@ test_dir_dump_unparseable_descriptors(void *data)
*/
mock_unlink_reset();
mock_write_str_to_file_reset();
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 0);
/*
* (3) Three calls to dump_desc cause a FIFO cleanup
@@ -5036,14 +5156,14 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_4));
+ tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_4));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 1);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 1);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256);
/* Second time */
@@ -5052,14 +5172,15 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_4) + strlen(test_desc_1));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_4) + strlen(test_desc_1));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256);
/* Third time - we should unlink the dump of test_desc_4 here */
@@ -5068,21 +5189,22 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_1) + strlen(test_desc_2));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_1) + strlen(test_desc_2));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 1);
- tt_int_op(write_str_count, ==, 3);
+ tt_int_op(unlinked_count, OP_EQ, 1);
+ tt_int_op(write_str_count, OP_EQ, 3);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256);
/*
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -5090,8 +5212,8 @@ test_dir_dump_unparseable_descriptors(void *data)
*/
mock_unlink_reset();
mock_write_str_to_file_reset();
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 0);
/*
* (4) But repeating one (A B B) doesn't overflow and cleanup
@@ -5103,14 +5225,14 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_3));
+ tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_3));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 1);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 1);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256);
/* Second time */
@@ -5119,14 +5241,15 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_3) + strlen(test_desc_4));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_3) + strlen(test_desc_4));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256);
/* Third time */
@@ -5135,21 +5258,22 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_3) + strlen(test_desc_4));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_3) + strlen(test_desc_4));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256);
/*
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -5157,8 +5281,8 @@ test_dir_dump_unparseable_descriptors(void *data)
*/
mock_unlink_reset();
mock_write_str_to_file_reset();
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 0);
/*
* (5) Same for the (A B A) repetition
@@ -5170,14 +5294,14 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_1));
+ tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_1));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 1);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 1);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256);
/* Second time */
@@ -5186,14 +5310,15 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_1) + strlen(test_desc_2));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_1) + strlen(test_desc_2));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256);
/* Third time */
@@ -5202,21 +5327,22 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_1) + strlen(test_desc_2));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_1) + strlen(test_desc_2));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256);
/*
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -5224,8 +5350,8 @@ test_dir_dump_unparseable_descriptors(void *data)
*/
mock_unlink_reset();
mock_write_str_to_file_reset();
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 0);
/*
* (6) (A B B C) triggering overflow on C causes A, not B to be unlinked
@@ -5237,14 +5363,14 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_3));
+ tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_3));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 1);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 1);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256);
/* Second time */
@@ -5253,14 +5379,15 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_3) + strlen(test_desc_4));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_3) + strlen(test_desc_4));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256);
/* Third time */
@@ -5269,14 +5396,15 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_3) + strlen(test_desc_4));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_3) + strlen(test_desc_4));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256);
/* Fourth time - we should unlink the dump of test_desc_3 here */
@@ -5285,21 +5413,22 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_4) + strlen(test_desc_1));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_4) + strlen(test_desc_1));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 1);
- tt_int_op(write_str_count, ==, 3);
+ tt_int_op(unlinked_count, OP_EQ, 1);
+ tt_int_op(write_str_count, OP_EQ, 3);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_1_hash, DIGEST_SHA256);
/*
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -5307,8 +5436,8 @@ test_dir_dump_unparseable_descriptors(void *data)
*/
mock_unlink_reset();
mock_write_str_to_file_reset();
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 0);
/*
* (7) (A B A C) triggering overflow on C causes B, not A to be unlinked
@@ -5320,14 +5449,14 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_2));
+ tt_u64_op(len_descs_dumped, OP_EQ, strlen(test_desc_2));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 1);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 1);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 1);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_2_hash, DIGEST_SHA256);
/* Second time */
@@ -5336,14 +5465,15 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_2) + strlen(test_desc_3));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_2) + strlen(test_desc_3));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256);
/* Third time */
@@ -5352,14 +5482,15 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_2) + strlen(test_desc_3));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_2) + strlen(test_desc_3));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 2);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 2);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_3_hash, DIGEST_SHA256);
/* Fourth time - we should unlink the dump of test_desc_3 here */
@@ -5368,21 +5499,22 @@ test_dir_dump_unparseable_descriptors(void *data)
/*
* Assert things about the FIFO state
*/
- tt_u64_op(len_descs_dumped, ==, strlen(test_desc_2) + strlen(test_desc_4));
+ tt_u64_op(len_descs_dumped, OP_EQ,
+ strlen(test_desc_2) + strlen(test_desc_4));
tt_assert(descs_dumped != NULL && smartlist_len(descs_dumped) == 2);
/*
* Assert things about the mocks
*/
- tt_int_op(unlinked_count, ==, 1);
- tt_int_op(write_str_count, ==, 3);
+ tt_int_op(unlinked_count, OP_EQ, 1);
+ tt_int_op(write_str_count, OP_EQ, 3);
tt_mem_op(last_write_str_hash, OP_EQ, test_desc_4_hash, DIGEST_SHA256);
/*
* Reset the FIFO and check its state
*/
dump_desc_fifo_cleanup();
- tt_u64_op(len_descs_dumped, ==, 0);
+ tt_u64_op(len_descs_dumped, OP_EQ, 0);
tt_assert(descs_dumped == NULL || smartlist_len(descs_dumped) == 0);
/*
@@ -5390,8 +5522,8 @@ test_dir_dump_unparseable_descriptors(void *data)
*/
mock_unlink_reset();
mock_write_str_to_file_reset();
- tt_int_op(unlinked_count, ==, 0);
- tt_int_op(write_str_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
+ tt_int_op(write_str_count, OP_EQ, 0);
done:
@@ -5438,7 +5570,7 @@ read_file_to_str_mock(const char *filename, int flags,
char *result = NULL;
/* Insist we got a filename */
- tt_assert(filename != NULL);
+ tt_ptr_op(filename, OP_NE, NULL);
/* We ignore flags */
(void)flags;
@@ -5501,53 +5633,53 @@ test_dir_populate_dump_desc_fifo(void *data)
reset_read_file_to_str_mock();
/* Check state of unlink mock */
- tt_int_op(unlinked_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
/* Some cases that should fail before trying to read the file */
ent = dump_desc_populate_one_file(dirname, "bar");
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 1);
- tt_int_op(read_count, ==, 0);
- tt_int_op(read_call_count, ==, 0);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 1);
+ tt_int_op(read_count, OP_EQ, 0);
+ tt_int_op(read_call_count, OP_EQ, 0);
ent = dump_desc_populate_one_file(dirname, "unparseable-desc");
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 2);
- tt_int_op(read_count, ==, 0);
- tt_int_op(read_call_count, ==, 0);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 2);
+ tt_int_op(read_count, OP_EQ, 0);
+ tt_int_op(read_call_count, OP_EQ, 0);
ent = dump_desc_populate_one_file(dirname, "unparseable-desc.baz");
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 3);
- tt_int_op(read_count, ==, 0);
- tt_int_op(read_call_count, ==, 0);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 3);
+ tt_int_op(read_count, OP_EQ, 0);
+ tt_int_op(read_call_count, OP_EQ, 0);
ent = dump_desc_populate_one_file(
dirname,
"unparseable-desc.08AE85E90461F59E");
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 4);
- tt_int_op(read_count, ==, 0);
- tt_int_op(read_call_count, ==, 0);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 4);
+ tt_int_op(read_count, OP_EQ, 0);
+ tt_int_op(read_call_count, OP_EQ, 0);
ent = dump_desc_populate_one_file(
dirname,
"unparseable-desc.08AE85E90461F59EDF0981323F3A70D02B55AB54B44B04F"
"287D72F7B72F242E85C8CB0EDA8854A99");
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 5);
- tt_int_op(read_count, ==, 0);
- tt_int_op(read_call_count, ==, 0);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 5);
+ tt_int_op(read_count, OP_EQ, 0);
+ tt_int_op(read_call_count, OP_EQ, 0);
/* This is a correct-length digest but base16_decode() will fail */
ent = dump_desc_populate_one_file(
dirname,
"unparseable-desc.68219B8BGE64B705A6FFC728C069DC596216D60A7D7520C"
"D5ECE250D912E686B");
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 6);
- tt_int_op(read_count, ==, 0);
- tt_int_op(read_call_count, ==, 0);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 6);
+ tt_int_op(read_count, OP_EQ, 0);
+ tt_int_op(read_call_count, OP_EQ, 0);
/* This one has a correctly formed filename and should try reading */
@@ -5556,10 +5688,10 @@ test_dir_populate_dump_desc_fifo(void *data)
dirname,
"unparseable-desc.DF0981323F3A70D02B55AB54B44B04F287D72F7B72F242E"
"85C8CB0EDA8854A99");
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 7);
- tt_int_op(read_count, ==, 0);
- tt_int_op(read_call_count, ==, 1);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 7);
+ tt_int_op(read_count, OP_EQ, 0);
+ tt_int_op(read_call_count, OP_EQ, 1);
/* This read will succeed but the digest won't match the file content */
fname =
@@ -5572,10 +5704,10 @@ test_dir_populate_dump_desc_fifo(void *data)
file_stat.st_mtime = 123456;
ent = dump_desc_populate_one_file(dirname, fname);
enforce_expected_filename = 0;
- tt_assert(ent == NULL);
- tt_int_op(unlinked_count, ==, 8);
- tt_int_op(read_count, ==, 1);
- tt_int_op(read_call_count, ==, 2);
+ tt_ptr_op(ent, OP_EQ, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 8);
+ tt_int_op(read_count, OP_EQ, 1);
+ tt_int_op(read_call_count, OP_EQ, 2);
tor_free(expected_filename);
tor_free(file_content);
@@ -5588,13 +5720,13 @@ test_dir_populate_dump_desc_fifo(void *data)
file_content_len = strlen(file_content);
file_stat.st_mtime = 789012;
ent = dump_desc_populate_one_file(dirname, fname);
- tt_assert(ent != NULL);
- tt_int_op(unlinked_count, ==, 8);
- tt_int_op(read_count, ==, 2);
- tt_int_op(read_call_count, ==, 3);
+ tt_ptr_op(ent, OP_NE, NULL);
+ tt_int_op(unlinked_count, OP_EQ, 8);
+ tt_int_op(read_count, OP_EQ, 2);
+ tt_int_op(read_call_count, OP_EQ, 3);
tt_str_op(ent->filename, OP_EQ, expected_filename);
- tt_int_op(ent->len, ==, file_content_len);
- tt_int_op(ent->when, ==, file_stat.st_mtime);
+ tt_int_op(ent->len, OP_EQ, file_content_len);
+ tt_int_op(ent->when, OP_EQ, file_stat.st_mtime);
tor_free(ent->filename);
tor_free(ent);
tor_free(expected_filename);
@@ -5603,9 +5735,9 @@ test_dir_populate_dump_desc_fifo(void *data)
* Reset the mocks and check their state
*/
mock_unlink_reset();
- tt_int_op(unlinked_count, ==, 0);
+ tt_int_op(unlinked_count, OP_EQ, 0);
reset_read_file_to_str_mock();
- tt_int_op(read_count, ==, 0);
+ tt_int_op(read_count, OP_EQ, 0);
done:
diff --git a/src/test/test_dir_common.c b/src/test/test_dir_common.c
index fca70249bd..fdf43533a8 100644
--- a/src/test/test_dir_common.c
+++ b/src/test/test_dir_common.c
@@ -146,7 +146,7 @@ dir_common_gen_routerstatus_for_v3ns(int idx, time_t now)
break;
default:
/* Shouldn't happen */
- tt_assert(0);
+ tt_abort();
}
if (vrs) {
vrs->microdesc = tor_malloc_zero(sizeof(vote_microdesc_hash_t));
diff --git a/src/test/test_dns.c b/src/test/test_dns.c
index 6a8e92cb47..19dcb02931 100644
--- a/src/test/test_dns.c
+++ b/src/test/test_dns.c
@@ -18,9 +18,9 @@ NS(test_main)(void *arg)
uint32_t ttl_mid = MIN_DNS_TTL_AT_EXIT / 2 + MAX_DNS_TTL_AT_EXIT / 2;
- tt_int_op(dns_clip_ttl(MIN_DNS_TTL_AT_EXIT - 1),==,MIN_DNS_TTL_AT_EXIT);
- tt_int_op(dns_clip_ttl(ttl_mid),==,MAX_DNS_TTL_AT_EXIT);
- tt_int_op(dns_clip_ttl(MAX_DNS_TTL_AT_EXIT + 1),==,MAX_DNS_TTL_AT_EXIT);
+ tt_int_op(dns_clip_ttl(MIN_DNS_TTL_AT_EXIT - 1),OP_EQ,MIN_DNS_TTL_AT_EXIT);
+ tt_int_op(dns_clip_ttl(ttl_mid),OP_EQ,MAX_DNS_TTL_AT_EXIT);
+ tt_int_op(dns_clip_ttl(MAX_DNS_TTL_AT_EXIT + 1),OP_EQ,MAX_DNS_TTL_AT_EXIT);
done:
return;
@@ -172,10 +172,10 @@ NS(test_main)(void *arg)
retval = dns_resolve(exitconn);
- tt_int_op(retval,==,1);
- tt_str_op(resolved_name,==,last_resolved_hostname);
+ tt_int_op(retval,OP_EQ,1);
+ tt_str_op(resolved_name,OP_EQ,last_resolved_hostname);
tt_assert(conn_for_resolved_cell == exitconn);
- tt_int_op(n_send_resolved_hostname_cell_replacement,==,
+ tt_int_op(n_send_resolved_hostname_cell_replacement,OP_EQ,
prev_n_send_resolved_hostname_cell_replacement + 1);
tt_assert(exitconn->on_circuit == NULL);
@@ -201,12 +201,12 @@ NS(test_main)(void *arg)
retval = dns_resolve(exitconn);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
tt_assert(conn_for_resolved_cell == exitconn);
- tt_int_op(n_send_resolved_cell_replacement,==,
+ tt_int_op(n_send_resolved_cell_replacement,OP_EQ,
prev_n_send_resolved_cell_replacement + 1);
tt_assert(last_resolved == fake_resolved);
- tt_int_op(last_answer_type,==,0xff);
+ tt_int_op(last_answer_type,OP_EQ,0xff);
tt_assert(exitconn->on_circuit == NULL);
/* CASE 3: The purpose of exit connection is not EXIT_PURPOSE_RESOLVE
@@ -229,12 +229,12 @@ NS(test_main)(void *arg)
retval = dns_resolve(exitconn);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
tt_assert(on_circuit->n_streams == exitconn);
tt_assert(exitconn->next_stream == nextconn);
- tt_int_op(prev_n_send_resolved_cell_replacement,==,
+ tt_int_op(prev_n_send_resolved_cell_replacement,OP_EQ,
n_send_resolved_cell_replacement);
- tt_int_op(prev_n_send_resolved_hostname_cell_replacement,==,
+ tt_int_op(prev_n_send_resolved_hostname_cell_replacement,OP_EQ,
n_send_resolved_hostname_cell_replacement);
/* CASE 4: _impl returns 0.
@@ -253,8 +253,8 @@ NS(test_main)(void *arg)
retval = dns_resolve(exitconn);
- tt_int_op(retval,==,0);
- tt_int_op(exitconn->base_.state,==,EXIT_CONN_STATE_RESOLVING);
+ tt_int_op(retval,OP_EQ,0);
+ tt_int_op(exitconn->base_.state,OP_EQ,EXIT_CONN_STATE_RESOLVING);
tt_assert(on_circuit->resolving_streams == exitconn);
tt_assert(exitconn->next_stream == nextconn);
@@ -278,12 +278,12 @@ NS(test_main)(void *arg)
retval = dns_resolve(exitconn);
- tt_int_op(retval,==,-1);
- tt_int_op(n_send_resolved_cell_replacement,==,
+ tt_int_op(retval,OP_EQ,-1);
+ tt_int_op(n_send_resolved_cell_replacement,OP_EQ,
prev_n_send_resolved_cell_replacement + 1);
- tt_int_op(last_answer_type,==,RESOLVED_TYPE_ERROR);
- tt_int_op(n_dns_cancel_pending_resolve_replacement,==,1);
- tt_int_op(n_connection_free,==,prev_n_connection_free + 1);
+ tt_int_op(last_answer_type,OP_EQ,RESOLVED_TYPE_ERROR);
+ tt_int_op(n_dns_cancel_pending_resolve_replacement,OP_EQ,1);
+ tt_int_op(n_connection_free,OP_EQ,prev_n_connection_free + 1);
tt_assert(last_freed_conn == TO_CONN(exitconn));
done:
@@ -351,9 +351,9 @@ NS(test_main)(void *arg)
resolved_addr = &(exitconn->base_.addr);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
tt_assert(tor_addr_eq(resolved_addr, (const tor_addr_t *)&addr_to_compare));
- tt_int_op(exitconn->address_ttl,==,DEFAULT_DNS_TTL);
+ tt_int_op(exitconn->address_ttl,OP_EQ,DEFAULT_DNS_TTL);
done:
tor_free(on_circ);
@@ -393,7 +393,7 @@ NS(test_main)(void *arg)
retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending,
NULL);
- tt_int_op(retval,==,-1);
+ tt_int_op(retval,OP_EQ,-1);
done:
tor_free(TO_CONN(exitconn)->address);
@@ -436,7 +436,7 @@ NS(test_main)(void *arg)
retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending,
NULL);
- tt_int_op(retval,==,-1);
+ tt_int_op(retval,OP_EQ,-1);
done:
NS_UNMOCK(router_my_exit_policy_is_reject_star);
@@ -478,7 +478,7 @@ NS(test_main)(void *arg)
retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending,
NULL);
- tt_int_op(retval,==,-1);
+ tt_int_op(retval,OP_EQ,-1);
tor_free(TO_CONN(exitconn)->address);
@@ -488,7 +488,7 @@ NS(test_main)(void *arg)
retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending,
NULL);
- tt_int_op(retval,==,-1);
+ tt_int_op(retval,OP_EQ,-1);
done:
NS_UNMOCK(router_my_exit_policy_is_reject_star);
@@ -546,8 +546,8 @@ NS(test_main)(void *arg)
retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending,
NULL);
- tt_int_op(retval,==,0);
- tt_int_op(made_pending,==,1);
+ tt_int_op(retval,OP_EQ,0);
+ tt_int_op(made_pending,OP_EQ,1);
pending_conn = cache_entry->pending_connections;
@@ -628,8 +628,8 @@ NS(test_main)(void *arg)
retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending,
&resolve_out);
- tt_int_op(retval,==,0);
- tt_int_op(made_pending,==,0);
+ tt_int_op(retval,OP_EQ,0);
+ tt_int_op(made_pending,OP_EQ,0);
tt_assert(resolve_out == cache_entry);
tt_assert(last_exitconn == exitconn);
@@ -699,8 +699,8 @@ NS(test_main)(void *arg)
retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending,
NULL);
- tt_int_op(retval,==,0);
- tt_int_op(made_pending,==,1);
+ tt_int_op(retval,OP_EQ,0);
+ tt_int_op(made_pending,OP_EQ,1);
cache_entry = dns_get_cache_entry(&query);
@@ -712,7 +712,7 @@ NS(test_main)(void *arg)
tt_assert(pending_conn->conn == exitconn);
tt_assert(last_launched_resolve == cache_entry);
- tt_str_op(cache_entry->address,==,TO_CONN(exitconn)->address);
+ tt_str_op(cache_entry->address,OP_EQ,TO_CONN(exitconn)->address);
done:
NS_UNMOCK(router_my_exit_policy_is_reject_star);
diff --git a/src/test/test_entryconn.c b/src/test/test_entryconn.c
index 12a631630b..9fe3db26f7 100644
--- a/src/test/test_entryconn.c
+++ b/src/test/test_entryconn.c
@@ -14,6 +14,10 @@
#include "confparse.h"
#include "connection.h"
#include "connection_edge.h"
+#include "nodelist.h"
+
+#include "hs_cache.h"
+#include "rendcache.h"
static void *
entryconn_rewrite_setup(const struct testcase_t *tc)
@@ -743,6 +747,87 @@ test_entryconn_rewrite_mapaddress_automap_onion4(void *arg)
test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 0, 1);
}
+/** Test that rewrite functions can handle v2 addresses */
+static void
+test_entryconn_rewrite_onion_v2(void *arg)
+{
+ int retval;
+ entry_connection_t *conn = arg;
+
+ (void) arg;
+
+ rend_cache_init();
+
+ /* Make a SOCKS request */
+ conn->socks_request->command = SOCKS_COMMAND_CONNECT;
+ strlcpy(conn->socks_request->address,
+ "pqeed46efnwmfuid.onion",
+ sizeof(conn->socks_request->address));
+
+ /* Make an onion connection using the SOCKS request */
+ conn->entry_cfg.onion_traffic = 1;
+ ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT;
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data);
+
+ /* Handle SOCKS and rewrite! */
+ retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /* Check connection state after rewrite */
+ tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT);
+ /* check that the address got rewritten */
+ tt_str_op(conn->socks_request->address, OP_EQ,
+ "pqeed46efnwmfuid");
+ /* check that HS information got attached to the connection */
+ tt_assert(ENTRY_TO_EDGE_CONN(conn)->rend_data);
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident);
+
+ done:
+ rend_cache_free_all();
+ /* 'conn' is cleaned by handler */
+}
+
+/** Test that rewrite functions can handle v3 onion addresses */
+static void
+test_entryconn_rewrite_onion_v3(void *arg)
+{
+ int retval;
+ entry_connection_t *conn = arg;
+
+ (void) arg;
+
+ hs_cache_init();
+
+ /* Make a SOCKS request */
+ conn->socks_request->command = SOCKS_COMMAND_CONNECT;
+ strlcpy(conn->socks_request->address,
+ "git.p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnad.onion",
+ sizeof(conn->socks_request->address));
+
+ /* Make an onion connection using the SOCKS request */
+ conn->entry_cfg.onion_traffic = 1;
+ ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT;
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data);
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident);
+
+ /* Handle SOCKS and rewrite! */
+ retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /* Check connection state after rewrite */
+ tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT);
+ /* check that the address got rewritten */
+ tt_str_op(conn->socks_request->address, OP_EQ,
+ "p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnad");
+ /* check that HS information got attached to the connection */
+ tt_assert(ENTRY_TO_EDGE_CONN(conn)->hs_ident);
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data);
+
+ done:
+ hs_free_all();
+ /* 'conn' is cleaned by handler */
+}
+
#define REWRITE(name) \
{ #name, test_entryconn_##name, TT_FORK, &test_rewrite_setup, NULL }
@@ -763,6 +848,8 @@ struct testcase_t entryconn_tests[] = {
REWRITE(rewrite_mapaddress_automap_onion2),
REWRITE(rewrite_mapaddress_automap_onion3),
REWRITE(rewrite_mapaddress_automap_onion4),
+ REWRITE(rewrite_onion_v2),
+ REWRITE(rewrite_onion_v3),
END_OF_TESTCASES
};
diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c
index 1f008d93b3..f30bb5ffa1 100644
--- a/src/test/test_entrynodes.c
+++ b/src/test/test_entrynodes.c
@@ -455,29 +455,29 @@ test_entry_guard_parse_from_state_failure(void *arg)
/* no selection */
eg = entry_guard_parse_from_state(
"rsa_id=596f75206d6179206e656564206120686f626270");
- tt_assert(! eg);
+ tt_ptr_op(eg, OP_EQ, NULL);
/* no RSA ID. */
eg = entry_guard_parse_from_state("in=default nickname=Fred");
- tt_assert(! eg);
+ tt_ptr_op(eg, OP_EQ, NULL);
/* Bad RSA ID: bad character. */
eg = entry_guard_parse_from_state(
"in=default "
"rsa_id=596f75206d6179206e656564206120686f62627q");
- tt_assert(! eg);
+ tt_ptr_op(eg, OP_EQ, NULL);
/* Bad RSA ID: too long.*/
eg = entry_guard_parse_from_state(
"in=default "
"rsa_id=596f75206d6179206e656564206120686f6262703");
- tt_assert(! eg);
+ tt_ptr_op(eg, OP_EQ, NULL);
/* Bad RSA ID: too short.*/
eg = entry_guard_parse_from_state(
"in=default "
"rsa_id=596f75206d6179206e65656420612");
- tt_assert(! eg);
+ tt_ptr_op(eg, OP_EQ, NULL);
done:
entry_guard_free(eg);
@@ -595,20 +595,20 @@ test_entry_guard_parse_from_state_full(void *arg)
MOCK(get_or_state,
get_or_state_replacement);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_assert(lines);
state->Guard = lines;
/* Try it first without setting the result. */
r = entry_guards_parse_state(state, 0, &msg);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
guard_selection_t *gs_br =
get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0);
- tt_assert(!gs_br);
+ tt_ptr_op(gs_br, OP_EQ, NULL);
r = entry_guards_parse_state(state, 1, &msg);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
gs_br = get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0);
guard_selection_t *gs_df =
get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0);
@@ -625,7 +625,7 @@ test_entry_guard_parse_from_state_full(void *arg)
/* Try again; make sure it doesn't double-add the guards. */
r = entry_guards_parse_state(state, 1, &msg);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
gs_br = get_guard_selection_by_name("bridges", GS_TYPE_BRIDGE, 0);
gs_df = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0);
tt_assert(gs_br);
@@ -730,7 +730,7 @@ test_entry_guard_parse_from_state_broken(void *arg)
MOCK(get_or_state,
get_or_state_replacement);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_assert(lines);
state->Guard = lines;
@@ -742,7 +742,7 @@ test_entry_guard_parse_from_state_broken(void *arg)
/* And we shouldn't have made anything. */
guard_selection_t *gs_df =
get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0);
- tt_assert(gs_df == NULL);
+ tt_ptr_op(gs_df, OP_EQ, NULL);
tor_free(msg);
/* Now see about the set case (which shouldn't happen IRL) */
@@ -750,7 +750,7 @@ test_entry_guard_parse_from_state_broken(void *arg)
tt_int_op(r, OP_LT, 0);
tt_ptr_op(msg, OP_NE, NULL);
gs_df = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0);
- tt_assert(gs_df != NULL);
+ tt_ptr_op(gs_df, OP_NE, NULL);
tt_int_op(smartlist_len(gs_df->sampled_entry_guards), OP_EQ, 1);
done:
@@ -767,26 +767,26 @@ test_entry_guard_get_guard_selection_by_name(void *arg)
guard_selection_t *gs1, *gs2, *gs3;
gs1 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 0);
- tt_assert(gs1 == NULL);
+ tt_ptr_op(gs1, OP_EQ, NULL);
gs1 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 1);
- tt_assert(gs1 != NULL);
+ tt_ptr_op(gs1, OP_NE, NULL);
gs2 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 1);
tt_assert(gs2 == gs1);
gs2 = get_guard_selection_by_name("unlikely", GS_TYPE_NORMAL, 0);
tt_assert(gs2 == gs1);
gs2 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 0);
- tt_assert(gs2 == NULL);
+ tt_ptr_op(gs2, OP_EQ, NULL);
gs2 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 1);
- tt_assert(gs2 != NULL);
+ tt_ptr_op(gs2, OP_NE, NULL);
tt_assert(gs2 != gs1);
gs3 = get_guard_selection_by_name("implausible", GS_TYPE_NORMAL, 0);
tt_assert(gs3 == gs2);
gs3 = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 0);
- tt_assert(gs3 == NULL);
+ tt_ptr_op(gs3, OP_EQ, NULL);
gs3 = get_guard_selection_by_name("default", GS_TYPE_NORMAL, 1);
- tt_assert(gs3 != NULL);
+ tt_ptr_op(gs3, OP_NE, NULL);
tt_assert(gs3 != gs2);
tt_assert(gs3 != gs1);
tt_assert(gs3 == get_guard_selection_info());
@@ -847,16 +847,16 @@ test_entry_guard_add_single_guard(void *arg)
tt_i64_op(g1->sampled_on_date, OP_GE, now - 12*86400);
tt_i64_op(g1->sampled_on_date, OP_LE, now);
tt_str_op(g1->sampled_by_version, OP_EQ, VERSION);
- tt_assert(g1->currently_listed == 1);
+ tt_uint_op(g1->currently_listed, OP_EQ, 1);
tt_i64_op(g1->confirmed_on_date, OP_EQ, 0);
tt_int_op(g1->confirmed_idx, OP_EQ, -1);
tt_int_op(g1->last_tried_to_connect, OP_EQ, 0);
tt_uint_op(g1->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE);
tt_i64_op(g1->failing_since, OP_EQ, 0);
- tt_assert(g1->is_filtered_guard == 1);
- tt_assert(g1->is_usable_filtered_guard == 1);
- tt_assert(g1->is_primary == 0);
- tt_assert(g1->extra_state_fields == NULL);
+ tt_uint_op(g1->is_filtered_guard, OP_EQ, 1);
+ tt_uint_op(g1->is_usable_filtered_guard, OP_EQ, 1);
+ tt_uint_op(g1->is_primary, OP_EQ, 0);
+ tt_ptr_op(g1->extra_state_fields, OP_EQ, NULL);
/* Make sure it got added. */
tt_int_op(1, OP_EQ, smartlist_len(gs->sampled_entry_guards));
@@ -886,16 +886,16 @@ test_entry_guard_node_filter(void *arg)
g[i] = entry_guard_add_to_sample(gs, n[i]);
// everything starts out filtered-in
- tt_assert(g[i]->is_filtered_guard == 1);
- tt_assert(g[i]->is_usable_filtered_guard == 1);
+ tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 1);
+ tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 1);
}
tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, NUM);
/* Make sure refiltering doesn't hurt */
entry_guards_update_filtered_sets(gs);
for (i = 0; i < NUM; ++i) {
- tt_assert(g[i]->is_filtered_guard == 1);
- tt_assert(g[i]->is_usable_filtered_guard == 1);
+ tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 1);
+ tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 1);
}
tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, NUM);
@@ -948,8 +948,8 @@ test_entry_guard_node_filter(void *arg)
});
entry_guards_update_filtered_sets(gs);
for (i = 0; i < NUM; ++i) {
- tt_assert(g[i]->is_filtered_guard == 0);
- tt_assert(g[i]->is_usable_filtered_guard == 0);
+ tt_uint_op(g[i]->is_filtered_guard, OP_EQ, 0);
+ tt_uint_op(g[i]->is_usable_filtered_guard, OP_EQ, 0);
}
tt_int_op(num_reachable_filtered_guards(gs, NULL), OP_EQ, 0);
@@ -992,7 +992,7 @@ test_entry_guard_expand_sample(void *arg)
// Nothing became unusable/unfiltered, so a subsequent expand should
// make no changes.
guard = entry_guards_expand_sample(gs);
- tt_assert(! guard); // no guard was added.
+ tt_ptr_op(guard, OP_EQ, NULL); // no guard was added.
tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ,
num_reachable_filtered_guards(gs, NULL));
@@ -1016,7 +1016,7 @@ test_entry_guard_expand_sample(void *arg)
// Still idempotent.
guard = entry_guards_expand_sample(gs);
- tt_assert(! guard); // no guard was added.
+ tt_ptr_op(guard, OP_EQ, NULL); // no guard was added.
tt_int_op(DFLT_MIN_FILTERED_SAMPLE_SIZE, OP_EQ,
num_reachable_filtered_guards(gs, NULL));
@@ -1707,7 +1707,7 @@ test_entry_guard_select_for_circuit_no_confirmed(void *arg)
tt_assert(g);
tt_assert(g->is_primary);
tt_int_op(g->confirmed_idx, OP_EQ, -1);
- tt_assert(g->is_pending == 0); // primary implies non-pending.
+ tt_uint_op(g->is_pending, OP_EQ, 0); // primary implies non-pending.
tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time());
@@ -1727,7 +1727,7 @@ test_entry_guard_select_for_circuit_no_confirmed(void *arg)
tt_assert(g2);
tt_assert(g2->is_primary);
tt_int_op(g2->confirmed_idx, OP_EQ, -1);
- tt_assert(g2->is_pending == 0); // primary implies non-pending.
+ tt_uint_op(g2->is_pending, OP_EQ, 0); // primary implies non-pending.
tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time());
@@ -1755,7 +1755,7 @@ test_entry_guard_select_for_circuit_no_confirmed(void *arg)
tt_assert(g2);
tt_assert(!g2->is_primary);
tt_int_op(g2->confirmed_idx, OP_EQ, -1);
- tt_assert(g2->is_pending == 1);
+ tt_uint_op(g2->is_pending, OP_EQ, 1);
tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD);
tt_i64_op(g2->last_tried_to_connect, OP_EQ, approx_time());
tt_int_op(g2->is_reachable, OP_EQ, GUARD_REACHABLE_MAYBE);
@@ -1813,7 +1813,7 @@ test_entry_guard_select_for_circuit_confirmed(void *arg)
tt_assert(g);
tt_assert(g->is_primary);
tt_int_op(g->confirmed_idx, OP_EQ, 0);
- tt_assert(g->is_pending == 0); // primary implies non-pending.
+ tt_uint_op(g->is_pending, OP_EQ, 0); // primary implies non-pending.
tt_uint_op(state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
tt_i64_op(g->last_tried_to_connect, OP_EQ, approx_time());
tt_ptr_op(g, OP_EQ, smartlist_get(gs->primary_entry_guards, 0));
@@ -1913,7 +1913,7 @@ test_entry_guard_select_for_circuit_highlevel_primary(void *arg)
int r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL,
&node, &guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_assert(node);
tt_assert(guard);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
@@ -1945,7 +1945,7 @@ test_entry_guard_select_for_circuit_highlevel_primary(void *arg)
update_approx_time(start+35);
r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL,
&node, &guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_assert(node);
tt_assert(guard);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
@@ -1981,7 +1981,7 @@ test_entry_guard_select_for_circuit_highlevel_primary(void *arg)
update_approx_time(start+60);
r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL,
&node, &guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_assert(node);
tt_assert(guard);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
@@ -2036,7 +2036,7 @@ test_entry_guard_select_for_circuit_highlevel_confirm_other(void *arg)
&node, &guard);
tt_assert(node);
tt_assert(guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
entry_guard_failed(&guard);
circuit_guard_state_free(guard);
@@ -2050,7 +2050,7 @@ test_entry_guard_select_for_circuit_highlevel_confirm_other(void *arg)
&node, &guard);
tt_assert(node);
tt_assert(guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
entry_guard_t *g = entry_guard_handle_get(guard->guard);
tt_assert(g);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD);
@@ -2102,7 +2102,7 @@ test_entry_guard_select_for_circuit_highlevel_primary_retry(void *arg)
&node, &guard);
tt_assert(node);
tt_assert(guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
g = entry_guard_handle_get(guard->guard);
make_guard_confirmed(gs, g);
@@ -2119,7 +2119,7 @@ test_entry_guard_select_for_circuit_highlevel_primary_retry(void *arg)
&node, &guard);
tt_assert(node);
tt_assert(guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD);
g = entry_guard_handle_get(guard->guard);
tt_int_op(g->is_primary, OP_EQ, 0);
@@ -2145,7 +2145,7 @@ test_entry_guard_select_for_circuit_highlevel_primary_retry(void *arg)
/* Have a circuit to a primary guard succeed. */
r = entry_guard_pick_for_circuit(gs, GUARD_USAGE_TRAFFIC, NULL,
&node, &guard2);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_int_op(guard2->state, OP_EQ, GUARD_CIRC_STATE_USABLE_ON_COMPLETION);
u = entry_guard_succeeded(&guard2);
tt_assert(u == GUARD_USABLE_NOW);
@@ -2194,7 +2194,7 @@ test_entry_guard_select_and_cancel(void *arg)
&node, &guard);
tt_assert(node);
tt_assert(guard);
- tt_assert(r == 0);
+ tt_int_op(r, OP_EQ, 0);
tt_int_op(guard->state, OP_EQ, GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD);
g = entry_guard_handle_get(guard->guard);
tt_int_op(g->is_primary, OP_EQ, 0);
@@ -2202,7 +2202,7 @@ test_entry_guard_select_and_cancel(void *arg)
/* Whoops! We should never have asked for this guard. Cancel the request! */
entry_guard_cancel(&guard);
- tt_assert(guard == NULL);
+ tt_ptr_op(guard, OP_EQ, NULL);
tt_int_op(g->is_primary, OP_EQ, 0);
tt_int_op(g->is_pending, OP_EQ, 0);
diff --git a/src/test/test_guardfraction.c b/src/test/test_guardfraction.c
index 56006f3cc3..51ca8f08ec 100644
--- a/src/test/test_guardfraction.c
+++ b/src/test/test_guardfraction.c
@@ -38,10 +38,10 @@ gen_vote_routerstatus_for_tests(const char *digest_in_hex, int is_guard)
rs->is_possible_guard = is_guard;
/* Fill in the fpr */
- tt_int_op(strlen(digest_in_hex), ==, HEX_DIGEST_LEN);
+ tt_int_op(strlen(digest_in_hex), OP_EQ, HEX_DIGEST_LEN);
retval = base16_decode(digest_tmp, sizeof(digest_tmp),
digest_in_hex, HEX_DIGEST_LEN);
- tt_int_op(retval, ==, sizeof(digest_tmp));
+ tt_int_op(retval, OP_EQ, sizeof(digest_tmp));
memcpy(rs->identity_digest, digest_tmp, DIGEST_LEN);
}
@@ -88,7 +88,7 @@ test_parse_guardfraction_file_bad(void *arg)
yesterday_date_str);
retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL);
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
tor_free(guardfraction_bad);
/* This one does not have a date! Parsing should fail. */
@@ -100,7 +100,7 @@ test_parse_guardfraction_file_bad(void *arg)
"guard-seen 07B5547026DF3E229806E135CFA8552D56AFBABC 5 420\n");
retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL);
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
tor_free(guardfraction_bad);
/* This one has an incomplete n-inputs line, but parsing should
@@ -114,7 +114,7 @@ test_parse_guardfraction_file_bad(void *arg)
yesterday_date_str);
retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL);
- tt_int_op(retval, ==, 2);
+ tt_int_op(retval, OP_EQ, 2);
tor_free(guardfraction_bad);
/* This one does not have a fingerprint in the guard line! */
@@ -126,7 +126,7 @@ test_parse_guardfraction_file_bad(void *arg)
yesterday_date_str);
retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
tor_free(guardfraction_bad);
/* This one does not even have an integer guardfraction value. */
@@ -139,7 +139,7 @@ test_parse_guardfraction_file_bad(void *arg)
yesterday_date_str);
retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL);
- tt_int_op(retval, ==, 1);
+ tt_int_op(retval, OP_EQ, 1);
tor_free(guardfraction_bad);
/* This one is not a percentage (not in [0, 100]) */
@@ -152,7 +152,7 @@ test_parse_guardfraction_file_bad(void *arg)
yesterday_date_str);
retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL);
- tt_int_op(retval, ==, 1);
+ tt_int_op(retval, OP_EQ, 1);
tor_free(guardfraction_bad);
/* This one is not a percentage either (not in [0, 100]) */
@@ -164,7 +164,7 @@ test_parse_guardfraction_file_bad(void *arg)
yesterday_date_str);
retval = dirserv_read_guardfraction_file_from_str(guardfraction_bad, NULL);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
done:
tor_free(guardfraction_bad);
@@ -216,14 +216,14 @@ test_parse_guardfraction_file_good(void *arg)
/* Read the guardfraction file */
retval = dirserv_read_guardfraction_file_from_str(guardfraction_good,
routerstatuses);
- tt_int_op(retval, ==, 1);
+ tt_int_op(retval, OP_EQ, 1);
{ /* Test that routerstatus fields got filled properly */
/* The guardfraction fields of the guard should be filled. */
tt_assert(vrs_guard->status.has_guardfraction);
tt_int_op(vrs_guard->status.guardfraction_percentage,
- ==,
+ OP_EQ,
guardfraction_value);
/* The guard that was not in the guardfraction file should not have
@@ -252,12 +252,12 @@ test_get_guardfraction_bandwidth(void *arg)
guard_get_guardfraction_bandwidth(&gf_bw,
orig_bw, 25);
- tt_int_op(gf_bw.guard_bw, ==, 250);
- tt_int_op(gf_bw.non_guard_bw, ==, 750);
+ tt_int_op(gf_bw.guard_bw, OP_EQ, 250);
+ tt_int_op(gf_bw.non_guard_bw, OP_EQ, 750);
/* Also check the 'guard_bw + non_guard_bw == original_bw'
* invariant. */
- tt_int_op(gf_bw.non_guard_bw + gf_bw.guard_bw, ==, orig_bw);
+ tt_int_op(gf_bw.non_guard_bw + gf_bw.guard_bw, OP_EQ, orig_bw);
done:
;
@@ -295,9 +295,9 @@ test_parse_guardfraction_consensus(void *arg)
retval = routerstatus_parse_guardfraction(guardfraction_str_good,
NULL, NULL,
&rs_good);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
tt_assert(rs_good.has_guardfraction);
- tt_int_op(rs_good.guardfraction_percentage, ==, 66);
+ tt_int_op(rs_good.guardfraction_percentage, OP_EQ, 66);
}
{ /* Properly formatted GuardFraction but router is not a
@@ -309,7 +309,7 @@ test_parse_guardfraction_consensus(void *arg)
retval = routerstatus_parse_guardfraction(guardfraction_str_good,
NULL, NULL,
&rs_no_guard);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
tt_assert(!rs_no_guard.has_guardfraction);
expect_single_log_msg_containing("Got GuardFraction for non-guard . "
"This is not supposed to happen.");
@@ -323,7 +323,7 @@ test_parse_guardfraction_consensus(void *arg)
retval = routerstatus_parse_guardfraction(guardfraction_str_bad1,
NULL, NULL,
&rs_bad1);
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
tt_assert(!rs_bad1.has_guardfraction);
}
@@ -334,7 +334,7 @@ test_parse_guardfraction_consensus(void *arg)
retval = routerstatus_parse_guardfraction(guardfraction_str_bad2,
NULL, NULL,
&rs_bad2);
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
tt_assert(!rs_bad2.has_guardfraction);
}
@@ -375,27 +375,27 @@ test_should_apply_guardfraction(void *arg)
/* If torrc option is set to yes, we should always use
* guardfraction.*/
options->UseGuardFraction = 1;
- tt_int_op(should_apply_guardfraction(&vote_disabled), ==, 1);
+ tt_int_op(should_apply_guardfraction(&vote_disabled), OP_EQ, 1);
/* If torrc option is set to no, we should never use
* guardfraction.*/
options->UseGuardFraction = 0;
- tt_int_op(should_apply_guardfraction(&vote_enabled), ==, 0);
+ tt_int_op(should_apply_guardfraction(&vote_enabled), OP_EQ, 0);
/* Now let's test torrc option set to auto. */
options->UseGuardFraction = -1;
/* If torrc option is set to auto, and consensus parameter is set to
* yes, we should use guardfraction. */
- tt_int_op(should_apply_guardfraction(&vote_enabled), ==, 1);
+ tt_int_op(should_apply_guardfraction(&vote_enabled), OP_EQ, 1);
/* If torrc option is set to auto, and consensus parameter is set to
* no, we should use guardfraction. */
- tt_int_op(should_apply_guardfraction(&vote_disabled), ==, 0);
+ tt_int_op(should_apply_guardfraction(&vote_disabled), OP_EQ, 0);
/* If torrc option is set to auto, and consensus parameter is not
* set, we should fallback to "no". */
- tt_int_op(should_apply_guardfraction(&vote_missing), ==, 0);
+ tt_int_op(should_apply_guardfraction(&vote_missing), OP_EQ, 0);
done:
SMARTLIST_FOREACH(vote_enabled.net_params, char *, cp, tor_free(cp));
diff --git a/src/test/test_helpers.c b/src/test/test_helpers.c
index 9fada5a675..4c0580cff3 100644
--- a/src/test/test_helpers.c
+++ b/src/test/test_helpers.c
@@ -7,16 +7,25 @@
*/
#define ROUTERLIST_PRIVATE
+#define CONFIG_PRIVATE
+#define CONNECTION_PRIVATE
+#define MAIN_PRIVATE
+
#include "orconfig.h"
#include "or.h"
+#include "buffers.h"
+#include "config.h"
+#include "confparse.h"
+#include "connection.h"
+#include "main.h"
+#include "nodelist.h"
#include "relay.h"
#include "routerlist.h"
-#include "nodelist.h"
-#include "buffers.h"
#include "test.h"
#include "test_helpers.h"
+#include "test_connection.h"
#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS
DISABLE_GCC_WARNING(overlength-strings)
@@ -74,16 +83,16 @@ helper_setup_fake_routerlist(void)
retval = router_load_routers_from_string(TEST_DESCRIPTORS,
NULL, SAVED_IN_JOURNAL,
NULL, 0, NULL);
- tt_int_op(retval, ==, HELPER_NUMBER_OF_DESCRIPTORS);
+ tt_int_op(retval, OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS);
/* Sanity checking of routerlist and nodelist. */
our_routerlist = router_get_routerlist();
- tt_int_op(smartlist_len(our_routerlist->routers), ==,
+ tt_int_op(smartlist_len(our_routerlist->routers), OP_EQ,
HELPER_NUMBER_OF_DESCRIPTORS);
routerlist_assert_ok(our_routerlist);
our_nodelist = nodelist_get_list();
- tt_int_op(smartlist_len(our_nodelist), ==, HELPER_NUMBER_OF_DESCRIPTORS);
+ tt_int_op(smartlist_len(our_nodelist), OP_EQ, HELPER_NUMBER_OF_DESCRIPTORS);
/* Mark all routers as non-guards but up and running! */
SMARTLIST_FOREACH_BEGIN(our_nodelist, node_t *, node) {
@@ -143,3 +152,128 @@ mock_tor_addr_lookup__fail_on_bad_addrs(const char *name,
return tor_addr_lookup__real(name, family, out);
}
+/*********** Helper funcs for making new connections/streams *****************/
+
+/* Helper for test_conn_get_connection() */
+static int
+fake_close_socket(evutil_socket_t sock)
+{
+ (void)sock;
+ return 0;
+}
+
+static int mock_connection_connect_sockaddr_called = 0;
+static int fake_socket_number = TEST_CONN_FD_INIT;
+
+/* Helper for test_conn_get_connection() */
+static int
+mock_connection_connect_sockaddr(connection_t *conn,
+ const struct sockaddr *sa,
+ socklen_t sa_len,
+ const struct sockaddr *bindaddr,
+ socklen_t bindaddr_len,
+ int *socket_error)
+{
+ (void)sa_len;
+ (void)bindaddr;
+ (void)bindaddr_len;
+
+ tor_assert(conn);
+ tor_assert(sa);
+ tor_assert(socket_error);
+
+ mock_connection_connect_sockaddr_called++;
+
+ conn->s = fake_socket_number++;
+ tt_assert(SOCKET_OK(conn->s));
+ /* We really should call tor_libevent_initialize() here. Because we don't,
+ * we are relying on other parts of the code not checking if the_event_base
+ * (and therefore event->ev_base) is NULL. */
+ tt_int_op(connection_add_connecting(conn), OP_EQ, 0);
+
+ done:
+ /* Fake "connected" status */
+ return 1;
+}
+
+/** Create and return a new connection/stream */
+connection_t *
+test_conn_get_connection(uint8_t state, uint8_t type, uint8_t purpose)
+{
+ connection_t *conn = NULL;
+ tor_addr_t addr;
+ int socket_err = 0;
+ int in_progress = 0;
+
+ MOCK(connection_connect_sockaddr,
+ mock_connection_connect_sockaddr);
+ MOCK(tor_close_socket, fake_close_socket);
+
+ init_connection_lists();
+
+ conn = connection_new(type, TEST_CONN_FAMILY);
+ tt_assert(conn);
+
+ test_conn_lookup_addr_helper(TEST_CONN_ADDRESS, TEST_CONN_FAMILY, &addr);
+ tt_assert(!tor_addr_is_null(&addr));
+
+ tor_addr_copy_tight(&conn->addr, &addr);
+ conn->port = TEST_CONN_PORT;
+ mock_connection_connect_sockaddr_called = 0;
+ in_progress = connection_connect(conn, TEST_CONN_ADDRESS_PORT, &addr,
+ TEST_CONN_PORT, &socket_err);
+ tt_int_op(mock_connection_connect_sockaddr_called, OP_EQ, 1);
+ tt_assert(!socket_err);
+ tt_assert(in_progress == 0 || in_progress == 1);
+
+ /* fake some of the attributes so the connection looks OK */
+ conn->state = state;
+ conn->purpose = purpose;
+ assert_connection_ok(conn, time(NULL));
+
+ UNMOCK(connection_connect_sockaddr);
+ UNMOCK(tor_close_socket);
+ return conn;
+
+ /* On failure */
+ done:
+ UNMOCK(connection_connect_sockaddr);
+ UNMOCK(tor_close_socket);
+ return NULL;
+}
+
+/* Helper function to parse a set of torrc options in a text format and return
+ * a newly allocated or_options_t object containing the configuration. On
+ * error, NULL is returned indicating that the conf couldn't be parsed
+ * properly. */
+or_options_t *
+helper_parse_options(const char *conf)
+{
+ int ret = 0;
+ char *msg = NULL;
+ or_options_t *opt = NULL;
+ config_line_t *line = NULL;
+
+ /* Kind of pointless to call this with a NULL value. */
+ tt_assert(conf);
+
+ opt = options_new();
+ tt_assert(opt);
+ ret = config_get_lines(conf, &line, 1);
+ if (ret != 0) {
+ goto done;
+ }
+ ret = config_assign(&options_format, opt, line, 0, &msg);
+ if (ret != 0) {
+ goto done;
+ }
+
+ done:
+ config_free_lines(line);
+ if (ret != 0) {
+ or_options_free(opt);
+ opt = NULL;
+ }
+ return opt;
+}
+
diff --git a/src/test/test_helpers.h b/src/test/test_helpers.h
index 4621631cc1..847104a40a 100644
--- a/src/test/test_helpers.h
+++ b/src/test/test_helpers.h
@@ -1,9 +1,11 @@
-/* Copyright (c) 2014-2017, The Tor Project, Inc. */
+/* Copyright (c) 2017, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TEST_HELPERS_H
#define TOR_TEST_HELPERS_H
+#include "or.h"
+
const char *get_yesterday_date_str(void);
circuit_t * dummy_origin_circuit_new(int num_cells);
@@ -20,7 +22,11 @@ void connection_write_to_buf_mock(const char *string, size_t len,
int mock_tor_addr_lookup__fail_on_bad_addrs(const char *name,
uint16_t family, tor_addr_t *out);
+connection_t *test_conn_get_connection(uint8_t state,
+ uint8_t type, uint8_t purpose);
+or_options_t *helper_parse_options(const char *conf);
+
extern const char TEST_DESCRIPTORS[];
-#endif
+#endif /* TOR_TEST_HELPERS_H */
diff --git a/src/test/test_hs.c b/src/test/test_hs.c
index 5aae6c5b97..7737499f50 100644
--- a/src/test/test_hs.c
+++ b/src/test/test_hs.c
@@ -8,7 +8,9 @@
#define CONTROL_PRIVATE
#define CIRCUITBUILD_PRIVATE
+#define RENDCOMMON_PRIVATE
#define RENDSERVICE_PRIVATE
+#define HS_SERVICE_PRIVATE
#include "or.h"
#include "test.h"
@@ -32,8 +34,9 @@
#define STR_HSDIR_NONE_EXIST_LONGNAME \
"$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
-/* DuckDuckGo descriptor as an example. */
-static const char *hs_desc_content = "\
+/* DuckDuckGo descriptor as an example. This one has extra "\r" at the end so
+ * the control port is happy. */
+static const char *hs_desc_content_control = "\
rendezvous-service-descriptor g5ojobzupf275beh5ra72uyhb3dkpxwg\r\n\
version 2\r\n\
permanent-key\r\n\
@@ -94,6 +97,68 @@ PcftsZf2ztN0sbNCtPgDL3d0PqvxY3iHTQAI8EbaGq/IAJUZ8U4y963dD5+Bn6JQ\r\n\
myE3ctmh0vy5+QxSiRjmQBkuEpCyks7LvWvHYrhnmcg=\r\n\
-----END SIGNATURE-----";
+/* DuckDuckGo descriptor as an example. */
+static const char *hs_desc_content = "\
+rendezvous-service-descriptor g5ojobzupf275beh5ra72uyhb3dkpxwg\n\
+version 2\n\
+permanent-key\n\
+-----BEGIN RSA PUBLIC KEY-----\n\
+MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE\n\
+aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg\n\
+I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE=\n\
+-----END RSA PUBLIC KEY-----\n\
+secret-id-part anmjoxxwiupreyajjt5yasimfmwcnxlf\n\
+publication-time 2015-03-11 19:00:00\n\
+protocol-versions 2,3\n\
+introduction-points\n\
+-----BEGIN MESSAGE-----\n\
+aW50cm9kdWN0aW9uLXBvaW50IDd1bnd4cmg2dG5kNGh6eWt1Z3EzaGZzdHduc2ll\n\
+cmhyCmlwLWFkZHJlc3MgMTg4LjEzOC4xMjEuMTE4Cm9uaW9uLXBvcnQgOTAwMQpv\n\
+bmlvbi1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dC\n\
+QUxGRVVyeVpDbk9ROEhURmV5cDVjMTRObWVqL1BhekFLTTBxRENTNElKUWh0Y3g1\n\
+NXpRSFdOVWIKQ2hHZ0JqR1RjV3ZGRnA0N3FkdGF6WUZhVXE2c0lQKzVqeWZ5b0Q4\n\
+UmJ1bzBwQmFWclJjMmNhYUptWWM0RDh6Vgpuby9sZnhzOVVaQnZ1cWY4eHIrMDB2\n\
+S0JJNmFSMlA2OE1WeDhrMExqcUpUU2RKOE9idm9yQWdNQkFBRT0KLS0tLS1FTkQg\n\
+UlNBIFBVQkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQ\n\
+VUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTnJHb0ozeTlHNXQzN2F2ekI1cTlwN1hG\n\
+VUplRUVYMUNOaExnWmJXWGJhVk5OcXpoZFhyL0xTUQppM1Z6dW5OaUs3cndUVnE2\n\
+K2QyZ1lRckhMMmIvMXBBY3ZKWjJiNSs0bTRRc0NibFpjRENXTktRbHJnRWN5WXRJ\n\
+CkdscXJTbFFEaXA0ZnNrUFMvNDVkWTI0QmJsQ3NGU1k3RzVLVkxJck4zZFpGbmJr\n\
+NEZIS1hBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJv\n\
+ZHVjdGlvbi1wb2ludCBiNGM3enlxNXNheGZzN2prNXFibG1wN3I1b3pwdHRvagpp\n\
+cC1hZGRyZXNzIDEwOS4xNjkuNDUuMjI2Cm9uaW9uLXBvcnQgOTAwMQpvbmlvbi1r\n\
+ZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU8xSXpw\n\
+WFFUTUY3RXZUb1NEUXpzVnZiRVFRQUQrcGZ6NzczMVRXZzVaUEJZY1EyUkRaeVp4\n\
+OEQKNUVQSU1FeUE1RE83cGd0ak5LaXJvYXJGMC8yempjMkRXTUlSaXZyU29YUWVZ\n\
+ZXlMM1pzKzFIajJhMDlCdkYxZAp6MEswblRFdVhoNVR5V3lyMHdsbGI1SFBnTlI0\n\
+MS9oYkprZzkwZitPVCtIeGhKL1duUml2QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBV\n\
+QkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMg\n\
+S0VZLS0tLS0KTUlHSkFvR0JBSzNWZEJ2ajFtQllLL3JrcHNwcm9Ub0llNUtHVmth\n\
+QkxvMW1tK1I2YUVJek1VZFE1SjkwNGtyRwpCd3k5NC8rV0lGNFpGYXh5Z2phejl1\n\
+N2pKY1k3ZGJhd1pFeG1hYXFCRlRwL2h2ZG9rcHQ4a1ByRVk4OTJPRHJ1CmJORUox\n\
+N1FPSmVMTVZZZk5Kcjl4TWZCQ3JQai8zOGh2RUdrbWVRNmRVWElvbVFNaUJGOVRB\n\
+Z01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlv\n\
+bi1wb2ludCBhdjVtcWl0Y2Q3cjJkandsYmN0c2Jlc2R3eGt0ZWtvegppcC1hZGRy\n\
+ZXNzIDE0NC43Ni44LjczCm9uaW9uLXBvcnQgNDQzCm9uaW9uLWtleQotLS0tLUJF\n\
+R0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTzVweVZzQmpZQmNmMXBE\n\
+dklHUlpmWXUzQ05nNldka0ZLMGlvdTBXTGZtejZRVDN0NWhzd3cyVwpjejlHMXhx\n\
+MmN0Nkd6VWkrNnVkTDlITTRVOUdHTi9BbW8wRG9GV1hKWHpBQkFXd2YyMVdsd1lW\n\
+eFJQMHRydi9WCkN6UDkzcHc5OG5vSmdGUGRUZ05iMjdKYmVUZENLVFBrTEtscXFt\n\
+b3NveUN2RitRa25vUS9BZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0t\n\
+LS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpN\n\
+SUdKQW9HQkFMVjNKSmtWN3lTNU9jc1lHMHNFYzFQOTVRclFRR3ZzbGJ6Wi9zRGxl\n\
+RlpKYXFSOUYvYjRUVERNClNGcFMxcU1GbldkZDgxVmRGMEdYRmN2WVpLamRJdHU2\n\
+SndBaTRJeEhxeXZtdTRKdUxrcXNaTEFLaXRLVkx4eGsKeERlMjlDNzRWMmJrOTRJ\n\
+MEgybTNKS2tzTHVwc3VxWWRVUmhOVXN0SElKZmgyZmNIalF0bEFnTUJBQUU9Ci0t\n\
+LS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KCg==\n\
+-----END MESSAGE-----\n\
+signature\n\
+-----BEGIN SIGNATURE-----\n\
+d4OuCE5OLAOnRB6cQN6WyMEmg/BHem144Vec+eYgeWoKwx3MxXFplUjFxgnMlmwN\n\
+PcftsZf2ztN0sbNCtPgDL3d0PqvxY3iHTQAI8EbaGq/IAJUZ8U4y963dD5+Bn6JQ\n\
+myE3ctmh0vy5+QxSiRjmQBkuEpCyks7LvWvHYrhnmcg=\n\
+-----END SIGNATURE-----";
+
/* Helper global variable for hidden service descriptor event test.
* It's used as a pointer to dynamically created message buffer in
* send_control_event_string_replacement function, which mocks
@@ -125,6 +190,30 @@ node_describe_longname_by_id_replacement(const char *id_digest)
}
}
+/** Test that we can parse a hardcoded v2 HS desc. */
+static void
+test_hs_parse_static_v2_desc(void *arg)
+{
+ int ret;
+ rend_encoded_v2_service_descriptor_t desc;
+
+ (void) arg;
+
+ /* Test an obviously not parseable string */
+ desc.desc_str = tor_strdup("ceci n'est pas un HS descriptor");
+ ret = rend_desc_v2_is_parsable(&desc);
+ tor_free(desc.desc_str);
+ tt_int_op(ret, OP_EQ, 0);
+
+ /* Test an actual descriptor */
+ desc.desc_str = tor_strdup(hs_desc_content);
+ ret = rend_desc_v2_is_parsable(&desc);
+ tor_free(desc.desc_str);
+ tt_int_op(ret, OP_EQ, 1);
+
+ done: ;
+}
+
/** Make sure each hidden service descriptor async event generation
*
* function generates the message in expected format.
@@ -161,7 +250,7 @@ test_hs_desc_event(void *arg)
ret = rend_compute_v2_desc_id(rend_query.descriptor_id[0],
rend_query.onion_address,
NULL, 0, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
base32_encode(desc_id_base32, sizeof(desc_id_base32),
rend_query.descriptor_id[0], DIGEST_LEN);
/* Make sure rend_compute_v2_desc_id works properly. */
@@ -235,10 +324,10 @@ test_hs_desc_event(void *arg)
/* test valid content. */
control_event_hs_descriptor_content(rend_query.onion_address,
STR_HS_CONTENT_DESC_ID, HSDIR_EXIST_ID,
- hs_desc_content);
+ hs_desc_content_control);
tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\
STR_HS_CONTENT_DESC_ID " " STR_HSDIR_EXIST_LONGNAME\
- "\r\n%s\r\n.\r\n650 OK\r\n", hs_desc_content);
+ "\r\n%s\r\n.\r\n650 OK\r\n", hs_desc_content_control);
tt_assert(received_msg);
tt_str_op(received_msg, OP_EQ, exp_msg);
@@ -274,14 +363,14 @@ test_pick_tor2web_rendezvous_node(void *arg)
retval = routerset_parse(options->Tor2webRendezvousPoints,
tor2web_rendezvous_str,
"test_tor2web_rp");
- tt_int_op(retval, >=, 0);
+ tt_int_op(retval, OP_GE, 0);
/* Pick rendezvous point. Make sure the correct one is
picked. Repeat many times to make sure it works properly. */
for (i = 0; i < 50 ; i++) {
chosen_rp = pick_tor2web_rendezvous_node(flags, options);
tt_assert(chosen_rp);
- tt_str_op(chosen_rp->ri->nickname, ==, tor2web_rendezvous_str);
+ tt_str_op(chosen_rp->ri->nickname, OP_EQ, tor2web_rendezvous_str);
}
done:
@@ -309,13 +398,13 @@ test_pick_bad_tor2web_rendezvous_node(void *arg)
retval = routerset_parse(options->Tor2webRendezvousPoints,
tor2web_rendezvous_str,
"test_tor2web_rp");
- tt_int_op(retval, >=, 0);
+ tt_int_op(retval, OP_GE, 0);
/* Pick rendezvous point. Since Tor2webRendezvousPoints was set to a
dummy value, we shouldn't find any eligible RPs. */
for (i = 0; i < 50 ; i++) {
chosen_rp = pick_tor2web_rendezvous_node(flags, options);
- tt_assert(!chosen_rp);
+ tt_ptr_op(chosen_rp, OP_EQ, NULL);
}
done:
@@ -346,30 +435,30 @@ test_hs_rend_data(void *arg)
REND_NO_AUTH);
tt_assert(client);
rend_data_v2_t *client_v2 = TO_REND_DATA_V2(client);
- tt_int_op(client_v2->auth_type, ==, REND_NO_AUTH);
+ tt_int_op(client_v2->auth_type, OP_EQ, REND_NO_AUTH);
tt_str_op(client_v2->onion_address, OP_EQ, STR_HS_ADDR);
tt_mem_op(client_v2->desc_id_fetch, OP_EQ, desc_id, sizeof(desc_id));
tt_mem_op(client_v2->descriptor_cookie, OP_EQ, client_cookie,
sizeof(client_cookie));
tt_assert(client->hsdirs_fp);
- tt_int_op(smartlist_len(client->hsdirs_fp), ==, 0);
+ tt_int_op(smartlist_len(client->hsdirs_fp), OP_EQ, 0);
for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) {
int ret = rend_compute_v2_desc_id(desc_id, client_v2->onion_address,
client_v2->descriptor_cookie, now, rep);
/* That shouldn't never fail. */
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
tt_mem_op(client_v2->descriptor_id[rep], OP_EQ, desc_id,
sizeof(desc_id));
}
/* The rest should be zeroed because this is a client request. */
- tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), ==, 1);
- tt_int_op(tor_digest_is_zero(client->rend_cookie), ==, 1);
+ tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), OP_EQ, 1);
+ tt_int_op(tor_digest_is_zero(client->rend_cookie), OP_EQ, 1);
/* Test dup(). */
client_dup = rend_data_dup(client);
tt_assert(client_dup);
rend_data_v2_t *client_dup_v2 = TO_REND_DATA_V2(client_dup);
- tt_int_op(client_dup_v2->auth_type, ==, client_v2->auth_type);
+ tt_int_op(client_dup_v2->auth_type, OP_EQ, client_v2->auth_type);
tt_str_op(client_dup_v2->onion_address, OP_EQ, client_v2->onion_address);
tt_mem_op(client_dup_v2->desc_id_fetch, OP_EQ, client_v2->desc_id_fetch,
sizeof(client_dup_v2->desc_id_fetch));
@@ -378,14 +467,14 @@ test_hs_rend_data(void *arg)
sizeof(client_dup_v2->descriptor_cookie));
tt_assert(client_dup->hsdirs_fp);
- tt_int_op(smartlist_len(client_dup->hsdirs_fp), ==, 0);
+ tt_int_op(smartlist_len(client_dup->hsdirs_fp), OP_EQ, 0);
for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) {
tt_mem_op(client_dup_v2->descriptor_id[rep], OP_EQ,
client_v2->descriptor_id[rep], DIGEST_LEN);
}
/* The rest should be zeroed because this is a client request. */
- tt_int_op(tor_digest_is_zero(client_dup_v2->rend_pk_digest), ==, 1);
- tt_int_op(tor_digest_is_zero(client_dup->rend_cookie), ==, 1);
+ tt_int_op(tor_digest_is_zero(client_dup_v2->rend_pk_digest), OP_EQ, 1);
+ tt_int_op(tor_digest_is_zero(client_dup->rend_cookie), OP_EQ, 1);
rend_data_free(client);
client = NULL;
rend_data_free(client_dup);
@@ -401,19 +490,19 @@ test_hs_rend_data(void *arg)
client = rend_data_client_create(NULL, desc_id, NULL, REND_BASIC_AUTH);
tt_assert(client);
client_v2 = TO_REND_DATA_V2(client);
- tt_int_op(client_v2->auth_type, ==, REND_BASIC_AUTH);
- tt_int_op(strlen(client_v2->onion_address), ==, 0);
+ tt_int_op(client_v2->auth_type, OP_EQ, REND_BASIC_AUTH);
+ tt_int_op(strlen(client_v2->onion_address), OP_EQ, 0);
tt_mem_op(client_v2->desc_id_fetch, OP_EQ, desc_id, sizeof(desc_id));
tt_int_op(tor_mem_is_zero(client_v2->descriptor_cookie,
- sizeof(client_v2->descriptor_cookie)), ==, 1);
+ sizeof(client_v2->descriptor_cookie)), OP_EQ, 1);
tt_assert(client->hsdirs_fp);
- tt_int_op(smartlist_len(client->hsdirs_fp), ==, 0);
+ tt_int_op(smartlist_len(client->hsdirs_fp), OP_EQ, 0);
for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) {
- tt_int_op(tor_digest_is_zero(client_v2->descriptor_id[rep]), ==, 1);
+ tt_int_op(tor_digest_is_zero(client_v2->descriptor_id[rep]), OP_EQ, 1);
}
/* The rest should be zeroed because this is a client request. */
- tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), ==, 1);
- tt_int_op(tor_digest_is_zero(client->rend_cookie), ==, 1);
+ tt_int_op(tor_digest_is_zero(client_v2->rend_pk_digest), OP_EQ, 1);
+ tt_int_op(tor_digest_is_zero(client->rend_cookie), OP_EQ, 1);
rend_data_free(client);
client = NULL;
@@ -427,38 +516,38 @@ test_hs_rend_data(void *arg)
rend_cookie, REND_NO_AUTH);
tt_assert(service);
rend_data_v2_t *service_v2 = TO_REND_DATA_V2(service);
- tt_int_op(service_v2->auth_type, ==, REND_NO_AUTH);
+ tt_int_op(service_v2->auth_type, OP_EQ, REND_NO_AUTH);
tt_str_op(service_v2->onion_address, OP_EQ, STR_HS_ADDR);
tt_mem_op(service_v2->rend_pk_digest, OP_EQ, rend_pk_digest,
sizeof(rend_pk_digest));
tt_mem_op(service->rend_cookie, OP_EQ, rend_cookie, sizeof(rend_cookie));
tt_assert(service->hsdirs_fp);
- tt_int_op(smartlist_len(service->hsdirs_fp), ==, 0);
+ tt_int_op(smartlist_len(service->hsdirs_fp), OP_EQ, 0);
for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) {
- tt_int_op(tor_digest_is_zero(service_v2->descriptor_id[rep]), ==, 1);
+ tt_int_op(tor_digest_is_zero(service_v2->descriptor_id[rep]), OP_EQ, 1);
}
/* The rest should be zeroed because this is a service request. */
- tt_int_op(tor_digest_is_zero(service_v2->descriptor_cookie), ==, 1);
- tt_int_op(tor_digest_is_zero(service_v2->desc_id_fetch), ==, 1);
+ tt_int_op(tor_digest_is_zero(service_v2->descriptor_cookie), OP_EQ, 1);
+ tt_int_op(tor_digest_is_zero(service_v2->desc_id_fetch), OP_EQ, 1);
/* Test dup(). */
service_dup = rend_data_dup(service);
rend_data_v2_t *service_dup_v2 = TO_REND_DATA_V2(service_dup);
tt_assert(service_dup);
- tt_int_op(service_dup_v2->auth_type, ==, service_v2->auth_type);
+ tt_int_op(service_dup_v2->auth_type, OP_EQ, service_v2->auth_type);
tt_str_op(service_dup_v2->onion_address, OP_EQ, service_v2->onion_address);
tt_mem_op(service_dup_v2->rend_pk_digest, OP_EQ, service_v2->rend_pk_digest,
sizeof(service_dup_v2->rend_pk_digest));
tt_mem_op(service_dup->rend_cookie, OP_EQ, service->rend_cookie,
sizeof(service_dup->rend_cookie));
tt_assert(service_dup->hsdirs_fp);
- tt_int_op(smartlist_len(service_dup->hsdirs_fp), ==, 0);
+ tt_int_op(smartlist_len(service_dup->hsdirs_fp), OP_EQ, 0);
for (rep = 0; rep < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; rep++) {
- tt_int_op(tor_digest_is_zero(service_dup_v2->descriptor_id[rep]), ==, 1);
+ tt_assert(tor_digest_is_zero(service_dup_v2->descriptor_id[rep]));
}
/* The rest should be zeroed because this is a service request. */
- tt_int_op(tor_digest_is_zero(service_dup_v2->descriptor_cookie), ==, 1);
- tt_int_op(tor_digest_is_zero(service_dup_v2->desc_id_fetch), ==, 1);
+ tt_int_op(tor_digest_is_zero(service_dup_v2->descriptor_cookie), OP_EQ, 1);
+ tt_int_op(tor_digest_is_zero(service_dup_v2->desc_id_fetch), OP_EQ, 1);
done:
rend_data_free(service);
@@ -497,7 +586,7 @@ test_hs_auth_cookies(void *arg)
re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED, raw_cookie, &auth_type,
&err_msg);
tt_assert(!re);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN);
tt_int_op(auth_type, OP_EQ, REND_BASIC_AUTH);
memset(raw_cookie, 0, sizeof(raw_cookie));
@@ -505,7 +594,7 @@ test_hs_auth_cookies(void *arg)
re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED_STEALTH, raw_cookie,
&auth_type, &err_msg);
tt_assert(!re);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN);
tt_int_op(auth_type, OP_EQ, REND_STEALTH_AUTH);
memset(raw_cookie, 0, sizeof(raw_cookie));
@@ -514,7 +603,7 @@ test_hs_auth_cookies(void *arg)
re = rend_auth_decode_cookie(TEST_COOKIE_ENCODED "==", raw_cookie, NULL,
&err_msg);
tt_assert(!re);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
tt_mem_op(raw_cookie, OP_EQ, TEST_COOKIE_RAW, REND_DESC_COOKIE_LEN);
/* Decoding with an unknown type should fail */
@@ -574,31 +663,22 @@ test_single_onion_poisoning(void *arg)
char *poison_path = NULL;
char *err_msg = NULL;
- /* No services, no service to verify, no problem! */
- mock_options->HiddenServiceSingleHopMode = 0;
- mock_options->HiddenServiceNonAnonymousMode = 0;
- ret = rend_config_services(mock_options, 1);
- tt_assert(ret == 0);
-
- /* Either way, no problem. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
- ret = rend_config_services(mock_options, 1);
- tt_assert(ret == 0);
/* Create the data directory, and, if the correct bit in arg is set,
* create a directory for that service.
* The data directory is required for the lockfile, which is used when
* loading keys. */
ret = check_private_dir(mock_options->DataDirectory, CPD_CREATE, NULL);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
if (create_dir_mask & CREATE_HS_DIR1) {
ret = check_private_dir(dir1, CPD_CREATE, NULL);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
}
if (create_dir_mask & CREATE_HS_DIR2) {
ret = check_private_dir(dir2, CPD_CREATE, NULL);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
}
service_1->directory = dir1;
@@ -611,190 +691,194 @@ test_single_onion_poisoning(void *arg)
rend_service_port_config_t *port1 = rend_service_parse_port_config("80", " ",
&err_msg);
tt_assert(port1);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
smartlist_add(service_1->ports, port1);
rend_service_port_config_t *port2 = rend_service_parse_port_config("90", " ",
&err_msg);
/* Add port to service 2 */
tt_assert(port2);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
smartlist_add(service_2->ports, port2);
/* No services, a service to verify, no problem! */
mock_options->HiddenServiceSingleHopMode = 0;
mock_options->HiddenServiceNonAnonymousMode = 0;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Either way, no problem. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Add the first service */
- ret = rend_service_check_dir_and_add(services, mock_options, service_1, 0);
- tt_assert(ret == 0);
+ ret = hs_check_service_private_dir(mock_options->User, service_1->directory,
+ service_1->dir_group_readable, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ smartlist_add(services, service_1);
/* But don't add the second service yet. */
/* Service directories, but no previous keys, no problem! */
mock_options->HiddenServiceSingleHopMode = 0;
mock_options->HiddenServiceNonAnonymousMode = 0;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Either way, no problem. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Poison! Poison! Poison!
* This can only be done in HiddenServiceSingleHopMode. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Poisoning twice is a no-op. */
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Poisoned service directories, but no previous keys, no problem! */
mock_options->HiddenServiceSingleHopMode = 0;
mock_options->HiddenServiceNonAnonymousMode = 0;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Either way, no problem. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Now add some keys, and we'll have a problem. */
ret = rend_service_load_all_keys(services);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Poisoned service directories with previous keys are not allowed. */
mock_options->HiddenServiceSingleHopMode = 0;
mock_options->HiddenServiceNonAnonymousMode = 0;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret < 0);
+ tt_int_op(ret, OP_LT, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* But they are allowed if we're in non-anonymous mode. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Re-poisoning directories with existing keys is a no-op, because
* directories with existing keys are ignored. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* And it keeps the poison. */
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Now add the second service: it has no key and no poison file */
- ret = rend_service_check_dir_and_add(services, mock_options, service_2, 0);
- tt_assert(ret == 0);
+ ret = hs_check_service_private_dir(mock_options->User, service_2->directory,
+ service_2->dir_group_readable, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ smartlist_add(services, service_2);
/* A new service, and an existing poisoned service. Not ok. */
mock_options->HiddenServiceSingleHopMode = 0;
mock_options->HiddenServiceNonAnonymousMode = 0;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret < 0);
+ tt_int_op(ret, OP_LT, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* But ok to add in non-anonymous mode. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Now remove the poisoning from the first service, and we have the opposite
* problem. */
poison_path = rend_service_sos_poison_path(service_1);
tt_assert(poison_path);
ret = unlink(poison_path);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Unpoisoned service directories with previous keys are ok, as are empty
* directories. */
mock_options->HiddenServiceSingleHopMode = 0;
mock_options->HiddenServiceNonAnonymousMode = 0;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* But the existing unpoisoned key is not ok in non-anonymous mode, even if
* there is an empty service. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret < 0);
+ tt_int_op(ret, OP_LT, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Poisoning directories with existing keys is a no-op, because directories
* with existing keys are ignored. But the new directory should poison. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_poison_new_single_onion_dir(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* And the old directory remains unpoisoned. */
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret < 0);
+ tt_int_op(ret, OP_LT, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* And the new directory should be ignored, because it has no key. */
mock_options->HiddenServiceSingleHopMode = 0;
mock_options->HiddenServiceNonAnonymousMode = 0;
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Re-poisoning directories without existing keys is a no-op. */
mock_options->HiddenServiceSingleHopMode = 1;
mock_options->HiddenServiceNonAnonymousMode = 1;
ret = rend_service_poison_new_single_onion_dir(service_1, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = rend_service_poison_new_single_onion_dir(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* And the old directory remains unpoisoned. */
ret = rend_service_verify_single_onion_poison(service_1, mock_options);
- tt_assert(ret < 0);
+ tt_int_op(ret, OP_LT, 0);
ret = rend_service_verify_single_onion_poison(service_2, mock_options);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
done:
/* The test harness deletes the directories at exit */
@@ -942,6 +1026,8 @@ test_prune_services_on_reload(void *arg)
struct testcase_t hs_tests[] = {
{ "hs_rend_data", test_hs_rend_data, TT_FORK,
NULL, NULL },
+ { "hs_parse_static_v2_desc", test_hs_parse_static_v2_desc, TT_FORK,
+ NULL, NULL },
{ "hs_desc_event", test_hs_desc_event, TT_FORK,
NULL, NULL },
{ "pick_tor2web_rendezvous_node", test_pick_tor2web_rendezvous_node, TT_FORK,
diff --git a/src/test/test_hs_cache.c b/src/test/test_hs_cache.c
index 40f50b322a..cbd88acff1 100644
--- a/src/test/test_hs_cache.c
+++ b/src/test/test_hs_cache.c
@@ -7,6 +7,7 @@
*/
#define CONNECTION_PRIVATE
+#define DIRECTORY_PRIVATE
#define HS_CACHE_PRIVATE
#include "ed25519_cert.h"
@@ -54,7 +55,7 @@ test_directory(void *arg)
init_test();
/* Generate a valid descriptor with normal values. */
ret = ed25519_keypair_generate(&signing_kp1, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
desc1 = hs_helper_build_hs_desc_with_ip(&signing_kp1);
tt_assert(desc1);
ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str);
@@ -78,7 +79,7 @@ test_directory(void *arg)
/* Tell our OOM to run and to at least remove a byte which will result in
* removing the descriptor from our cache. */
oom_size = hs_cache_handle_oom(time(NULL), 1);
- tt_int_op(oom_size, >=, 1);
+ tt_int_op(oom_size, OP_GE, 1);
ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL);
tt_int_op(ret, OP_EQ, 0);
}
@@ -87,7 +88,7 @@ test_directory(void *arg)
{
ed25519_keypair_t signing_kp_zero;
ret = ed25519_keypair_generate(&signing_kp_zero, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
hs_descriptor_t *desc_zero_lifetime;
desc_zero_lifetime = hs_helper_build_hs_desc_with_ip(&signing_kp_zero);
tt_assert(desc_zero_lifetime);
@@ -115,7 +116,7 @@ test_directory(void *arg)
tt_int_op(ret, OP_EQ, 0);
/* Cleanup our entire cache. */
oom_size = hs_cache_handle_oom(time(NULL), 1);
- tt_int_op(oom_size, >=, 1);
+ tt_int_op(oom_size, OP_GE, 1);
hs_descriptor_free(desc_zero_lifetime);
tor_free(desc_zero_lifetime_str);
}
@@ -177,7 +178,7 @@ test_clean_as_dir(void *arg)
/* Generate a valid descriptor with values. */
ret = ed25519_keypair_generate(&signing_kp1, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
desc1 = hs_helper_build_hs_desc_with_ip(&signing_kp1);
tt_assert(desc1);
ret = hs_desc_encode_descriptor(desc1, &signing_kp1, &desc1_str);
@@ -187,21 +188,21 @@ test_clean_as_dir(void *arg)
/* With the lifetime being 3 hours, a cleanup shouldn't remove it. */
ret = cache_clean_v3_as_dir(now, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Should be present after clean up. */
ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL);
tt_int_op(ret, OP_EQ, 1);
/* Set a cutoff 100 seconds in the past. It should not remove the entry
* since the entry is still recent enough. */
ret = cache_clean_v3_as_dir(now, now - 100);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Should be present after clean up. */
ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL);
tt_int_op(ret, OP_EQ, 1);
/* Set a cutoff of 100 seconds in the future. It should remove the entry
* that we've just added since it's not too old for the cutoff. */
ret = cache_clean_v3_as_dir(now, now + 100);
- tt_int_op(ret, >, 0);
+ tt_int_op(ret, OP_GT, 0);
/* Shouldn't be present after clean up. */
ret = hs_cache_lookup_as_dir(3, helper_get_hsdir_query(desc1), NULL);
tt_int_op(ret, OP_EQ, 0);
@@ -231,7 +232,7 @@ helper_fetch_desc_from_hsdir(const ed25519_public_key_t *blinded_key)
retval = ed25519_public_to_base64(hsdir_cache_key,
blinded_key);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
tor_asprintf(&hsdir_query_str, GET("/tor/hs/3/%s"), hsdir_cache_key);
}
@@ -290,7 +291,7 @@ test_upload_and_download_hs_desc(void *arg)
{
ed25519_keypair_t signing_kp;
retval = ed25519_keypair_generate(&signing_kp, 0);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp);
tt_assert(published_desc);
retval = hs_desc_encode_descriptor(published_desc, &signing_kp,
@@ -301,7 +302,7 @@ test_upload_and_download_hs_desc(void *arg)
/* Publish descriptor to the HSDir */
{
retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str);
- tt_int_op(retval, ==, 200);
+ tt_int_op(retval, OP_EQ, 200);
}
/* Simulate a fetch of the previously published descriptor */
@@ -342,6 +343,7 @@ test_hsdir_revision_counter_check(void *arg)
hs_descriptor_t *published_desc = NULL;
char *published_desc_str = NULL;
+ uint8_t subcredential[DIGEST256_LEN];
char *received_desc_str = NULL;
hs_descriptor_t *received_desc = NULL;
@@ -353,7 +355,7 @@ test_hsdir_revision_counter_check(void *arg)
/* Generate a valid descriptor with normal values. */
{
retval = ed25519_keypair_generate(&signing_kp, 0);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp);
tt_assert(published_desc);
retval = hs_desc_encode_descriptor(published_desc, &signing_kp,
@@ -364,13 +366,13 @@ test_hsdir_revision_counter_check(void *arg)
/* Publish descriptor to the HSDir */
{
retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str);
- tt_int_op(retval, ==, 200);
+ tt_int_op(retval, OP_EQ, 200);
}
/* Try publishing again with the same revision counter: Should fail. */
{
retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str);
- tt_int_op(retval, ==, 400);
+ tt_int_op(retval, OP_EQ, 400);
}
/* Fetch the published descriptor and validate the revision counter. */
@@ -378,14 +380,16 @@ test_hsdir_revision_counter_check(void *arg)
const ed25519_public_key_t *blinded_key;
blinded_key = &published_desc->plaintext_data.blinded_pubkey;
+ hs_get_subcredential(&signing_kp.pubkey, blinded_key, subcredential);
received_desc_str = helper_fetch_desc_from_hsdir(blinded_key);
- retval = hs_desc_decode_descriptor(received_desc_str,NULL, &received_desc);
- tt_int_op(retval, ==, 0);
+ retval = hs_desc_decode_descriptor(received_desc_str,
+ subcredential, &received_desc);
+ tt_int_op(retval, OP_EQ, 0);
tt_assert(received_desc);
/* Check that the revision counter is correct */
- tt_u64_op(received_desc->plaintext_data.revision_counter, ==, 42);
+ tt_u64_op(received_desc->plaintext_data.revision_counter, OP_EQ, 42);
hs_descriptor_free(received_desc);
received_desc = NULL;
@@ -401,7 +405,7 @@ test_hsdir_revision_counter_check(void *arg)
tt_int_op(retval, OP_EQ, 0);
retval = handle_post_hs_descriptor("/tor/hs/3/publish",published_desc_str);
- tt_int_op(retval, ==, 200);
+ tt_int_op(retval, OP_EQ, 200);
}
/* Again, fetch the published descriptor and perform the revision counter
@@ -412,12 +416,13 @@ test_hsdir_revision_counter_check(void *arg)
blinded_key = &published_desc->plaintext_data.blinded_pubkey;
received_desc_str = helper_fetch_desc_from_hsdir(blinded_key);
- retval = hs_desc_decode_descriptor(received_desc_str,NULL, &received_desc);
- tt_int_op(retval, ==, 0);
+ retval = hs_desc_decode_descriptor(received_desc_str,
+ subcredential, &received_desc);
+ tt_int_op(retval, OP_EQ, 0);
tt_assert(received_desc);
/* Check that the revision counter is the latest */
- tt_u64_op(received_desc->plaintext_data.revision_counter, ==, 1313);
+ tt_u64_op(received_desc->plaintext_data.revision_counter, OP_EQ, 1313);
}
done:
@@ -427,6 +432,69 @@ test_hsdir_revision_counter_check(void *arg)
tor_free(published_desc_str);
}
+/** Test that we can store HS descriptors in the client HS cache. */
+static void
+test_client_cache(void *arg)
+{
+ int retval;
+ ed25519_keypair_t signing_kp;
+ hs_descriptor_t *published_desc = NULL;
+ char *published_desc_str = NULL;
+
+ response_handler_args_t *args = NULL;
+ dir_connection_t *conn = NULL;
+
+ (void) arg;
+
+ /* Initialize HSDir cache subsystem */
+ init_test();
+
+ /* Generate a valid descriptor with normal values. */
+ {
+ retval = ed25519_keypair_generate(&signing_kp, 0);
+ tt_int_op(retval, OP_EQ, 0);
+ published_desc = hs_helper_build_hs_desc_with_ip(&signing_kp);
+ tt_assert(published_desc);
+ retval = hs_desc_encode_descriptor(published_desc, &signing_kp,
+ &published_desc_str);
+ tt_int_op(retval, OP_EQ, 0);
+ }
+
+ /* Test handle_response_fetch_hsdesc_v3() */
+ {
+ args = tor_malloc_zero(sizeof(response_handler_args_t));
+ args->status_code = 200;
+ args->reason = NULL;
+ args->body = published_desc_str;
+ args->body_len = strlen(published_desc_str);
+
+ conn = tor_malloc_zero(sizeof(dir_connection_t));
+ conn->hs_ident = tor_malloc_zero(sizeof(hs_ident_dir_conn_t));
+ ed25519_pubkey_copy(&conn->hs_ident->identity_pk, &signing_kp.pubkey);
+ }
+
+ /* store the descriptor! */
+ retval = handle_response_fetch_hsdesc_v3(conn, args);
+ tt_int_op(retval, == , 0);
+
+ /* fetch the descriptor and make sure it's there */
+ {
+ hs_cache_client_descriptor_t *cached_desc = NULL;
+ cached_desc = lookup_v3_desc_as_client(signing_kp.pubkey.pubkey);
+ tt_assert(cached_desc);
+ tt_str_op(cached_desc->encoded_desc, OP_EQ, published_desc_str);
+ }
+
+ done:
+ tor_free(args);
+ hs_descriptor_free(published_desc);
+ tor_free(published_desc_str);
+ if (conn) {
+ tor_free(conn->hs_ident);
+ tor_free(conn);
+ }
+}
+
struct testcase_t hs_cache[] = {
/* Encoding tests. */
{ "directory", test_directory, TT_FORK,
@@ -437,6 +505,8 @@ struct testcase_t hs_cache[] = {
NULL, NULL },
{ "upload_and_download_hs_desc", test_upload_and_download_hs_desc, TT_FORK,
NULL, NULL },
+ { "client_cache", test_client_cache, TT_FORK,
+ NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_hs_cell.c b/src/test/test_hs_cell.c
new file mode 100644
index 0000000000..1b3c788a67
--- /dev/null
+++ b/src/test/test_hs_cell.c
@@ -0,0 +1,130 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_hs_cell.c
+ * \brief Test hidden service cell functionality.
+ */
+
+#define HS_INTROPOINT_PRIVATE
+#define HS_SERVICE_PRIVATE
+
+#include "test.h"
+#include "test_helpers.h"
+#include "log_test_helpers.h"
+
+#include "crypto_ed25519.h"
+#include "hs_cell.h"
+#include "hs_intropoint.h"
+#include "hs_service.h"
+
+/* Trunnel. */
+#include "hs/cell_establish_intro.h"
+
+/** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we
+ * parse it from the receiver side. */
+static void
+test_gen_establish_intro_cell(void *arg)
+{
+ (void) arg;
+ ssize_t ret;
+ char circ_nonce[DIGEST_LEN] = {0};
+ uint8_t buf[RELAY_PAYLOAD_SIZE];
+ trn_cell_establish_intro_t *cell_in = NULL;
+
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+
+ /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
+ attempt to parse it. */
+ {
+ /* We only need the auth key pair here. */
+ hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0);
+ /* Auth key pair is generated in the constructor so we are all set for
+ * using this IP object. */
+ ret = hs_cell_build_establish_intro(circ_nonce, ip, buf);
+ service_intro_point_free(ip);
+ tt_u64_op(ret, OP_GT, 0);
+ }
+
+ /* Check the contents of the cell */
+ {
+ /* First byte is the auth key type: make sure its correct */
+ tt_int_op(buf[0], OP_EQ, HS_INTRO_AUTH_KEY_TYPE_ED25519);
+ /* Next two bytes is auth key len */
+ tt_int_op(ntohs(get_uint16(buf+1)), OP_EQ, ED25519_PUBKEY_LEN);
+ /* Skip to the number of extensions: no extensions */
+ tt_int_op(buf[35], OP_EQ, 0);
+ /* Skip to the sig len. Make sure it's the size of an ed25519 sig */
+ tt_int_op(ntohs(get_uint16(buf+35+1+32)), OP_EQ, ED25519_SIG_LEN);
+ }
+
+ /* Parse it as the receiver */
+ {
+ ret = trn_cell_establish_intro_parse(&cell_in, buf, sizeof(buf));
+ tt_u64_op(ret, OP_GT, 0);
+
+ ret = verify_establish_intro_cell(cell_in,
+ (const uint8_t *) circ_nonce,
+ sizeof(circ_nonce));
+ tt_u64_op(ret, OP_EQ, 0);
+ }
+
+ done:
+ trn_cell_establish_intro_free(cell_in);
+}
+
+/* Mocked ed25519_sign_prefixed() function that always fails :) */
+static int
+mock_ed25519_sign_prefixed(ed25519_signature_t *signature_out,
+ const uint8_t *msg, size_t msg_len,
+ const char *prefix_str,
+ const ed25519_keypair_t *keypair) {
+ (void) signature_out;
+ (void) msg;
+ (void) msg_len;
+ (void) prefix_str;
+ (void) keypair;
+ return -1;
+}
+
+/** We simulate a failure to create an ESTABLISH_INTRO cell */
+static void
+test_gen_establish_intro_cell_bad(void *arg)
+{
+ (void) arg;
+ ssize_t cell_len = 0;
+ trn_cell_establish_intro_t *cell = NULL;
+ char circ_nonce[DIGEST_LEN] = {0};
+ hs_service_intro_point_t *ip = NULL;
+
+ MOCK(ed25519_sign_prefixed, mock_ed25519_sign_prefixed);
+
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+
+ setup_full_capture_of_logs(LOG_WARN);
+ /* Easiest way to make that function fail is to mock the
+ ed25519_sign_prefixed() function and make it fail. */
+ cell = trn_cell_establish_intro_new();
+ tt_assert(cell);
+ ip = service_intro_point_new(NULL, 0);
+ cell_len = hs_cell_build_establish_intro(circ_nonce, ip, NULL);
+ service_intro_point_free(ip);
+ expect_log_msg_containing("Unable to make signature for "
+ "ESTABLISH_INTRO cell.");
+ teardown_capture_of_logs();
+ tt_i64_op(cell_len, OP_EQ, -1);
+
+ done:
+ trn_cell_establish_intro_free(cell);
+ UNMOCK(ed25519_sign_prefixed);
+}
+
+struct testcase_t hs_cell_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 },
+
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_hs_client.c b/src/test/test_hs_client.c
new file mode 100644
index 0000000000..af5f5cb576
--- /dev/null
+++ b/src/test/test_hs_client.c
@@ -0,0 +1,286 @@
+/* Copyright (c) 2016-2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_hs_client.c
+ * \brief Test prop224 HS client functionality.
+ */
+
+#define CRYPTO_PRIVATE
+#define MAIN_PRIVATE
+#define TOR_CHANNEL_INTERNAL_
+#define CIRCUITBUILD_PRIVATE
+#define CIRCUITLIST_PRIVATE
+#define CONNECTION_PRIVATE
+
+#include "test.h"
+#include "test_helpers.h"
+#include "log_test_helpers.h"
+#include "rend_test_helpers.h"
+
+#include "config.h"
+#include "crypto.h"
+#include "channeltls.h"
+
+#include "hs_circuit.h"
+#include "hs_ident.h"
+#include "circuitlist.h"
+#include "circuitbuild.h"
+#include "connection.h"
+#include "connection_edge.h"
+
+static int
+mock_connection_ap_handshake_send_begin(entry_connection_t *ap_conn)
+{
+ (void) ap_conn;
+ return 0;
+}
+
+/* Test helper function: Setup a circuit and a stream with the same hidden
+ * service destination, and put them in <b>circ_out</b> and
+ * <b>conn_out</b>. Make the stream wait for circuits to be established to the
+ * hidden service. */
+static int
+helper_get_circ_and_stream_for_test(origin_circuit_t **circ_out,
+ connection_t **conn_out,
+ int is_legacy)
+{
+ int retval;
+ channel_tls_t *n_chan=NULL;
+ rend_data_t *conn_rend_data = NULL;
+ origin_circuit_t *or_circ = NULL;
+ connection_t *conn = NULL;
+ ed25519_public_key_t service_pk;
+
+ /* Make a dummy connection stream and make it wait for our circuit */
+ conn = test_conn_get_connection(AP_CONN_STATE_CIRCUIT_WAIT,
+ CONN_TYPE_AP /* ??? */,
+ 0);
+ if (is_legacy) {
+ /* Legacy: Setup rend_data of stream */
+ char service_id[REND_SERVICE_ID_LEN_BASE32+1] = {0};
+ TO_EDGE_CONN(conn)->rend_data = mock_rend_data(service_id);
+ conn_rend_data = TO_EDGE_CONN(conn)->rend_data;
+ } else {
+ /* prop224: Setup hs conn identifier on the stream */
+ ed25519_secret_key_t sk;
+ tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sk, 0));
+ tt_int_op(0, OP_EQ, ed25519_public_key_generate(&service_pk, &sk));
+
+ /* Setup hs_conn_identifier of stream */
+ TO_EDGE_CONN(conn)->hs_ident = hs_ident_edge_conn_new(&service_pk);
+ }
+
+ /* Make it wait for circuit */
+ connection_ap_mark_as_pending_circuit(TO_ENTRY_CONN(conn));
+
+ /* This is needed to silence a BUG warning from
+ connection_edge_update_circuit_isolation() */
+ TO_ENTRY_CONN(conn)->original_dest_address =
+ tor_strdup(TO_ENTRY_CONN(conn)->socks_request->address);
+
+ /****************************************************/
+
+ /* Now make dummy circuit */
+ or_circ = origin_circuit_new();
+
+ or_circ->base_.purpose = CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED;
+
+ or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
+ or_circ->build_state->is_internal = 1;
+
+ if (is_legacy) {
+ /* Legacy: Setup rend data and final cpath */
+ or_circ->build_state->pending_final_cpath =
+ tor_malloc_zero(sizeof(crypt_path_t));
+ or_circ->build_state->pending_final_cpath->magic = CRYPT_PATH_MAGIC;
+ or_circ->build_state->pending_final_cpath->rend_dh_handshake_state =
+ crypto_dh_new(DH_TYPE_REND);
+ tt_assert(
+ or_circ->build_state->pending_final_cpath->rend_dh_handshake_state);
+ retval = crypto_dh_generate_public(
+ or_circ->build_state->pending_final_cpath->rend_dh_handshake_state);
+ tt_int_op(retval, OP_EQ, 0);
+ or_circ->rend_data = rend_data_dup(conn_rend_data);
+ } else {
+ /* prop224: Setup hs ident on the circuit */
+ or_circ->hs_ident = hs_ident_circuit_new(&service_pk,
+ HS_IDENT_CIRCUIT_RENDEZVOUS);
+ }
+
+ TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN;
+
+ /* fake n_chan */
+ n_chan = tor_malloc_zero(sizeof(channel_tls_t));
+ n_chan->base_.global_identifier = 1;
+ or_circ->base_.n_chan = &(n_chan->base_);
+
+ *circ_out = or_circ;
+ *conn_out = conn;
+
+ return 0;
+
+ done:
+ /* something failed */
+ return -1;
+}
+
+/* Test: Ensure that setting up legacy e2e rendezvous circuits works
+ * correctly. */
+static void
+test_e2e_rend_circuit_setup_legacy(void *arg)
+{
+ ssize_t retval;
+ origin_circuit_t *or_circ = NULL;
+ connection_t *conn = NULL;
+
+ (void) arg;
+
+ /** In this test we create a v2 legacy HS stream and a circuit with the same
+ * hidden service destination. We make the stream wait for circuits to be
+ * established to the hidden service, and then we complete the circuit using
+ * the hs_circuit_setup_e2e_rend_circ_legacy_client() function. We then
+ * check that the end-to-end cpath was setup correctly and that the stream
+ * was attached to the circuit as expected. */
+
+ MOCK(connection_ap_handshake_send_begin,
+ mock_connection_ap_handshake_send_begin);
+
+ /* Setup */
+ retval = helper_get_circ_and_stream_for_test( &or_circ, &conn, 1);
+ tt_int_op(retval, OP_EQ, 0);
+ tt_assert(or_circ);
+ tt_assert(conn);
+
+ /* Check number of hops */
+ retval = cpath_get_n_hops(&or_circ->cpath);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /* Check that our stream is not attached on any circuits */
+ tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, NULL);
+
+ /********************************************** */
+
+ /* Make a good RENDEZVOUS1 cell body because it needs to pass key exchange
+ * digest verification... */
+ uint8_t rend_cell_body[DH_KEY_LEN+DIGEST_LEN] = {2};
+ {
+ char keys[DIGEST_LEN+CPATH_KEY_MATERIAL_LEN];
+ crypto_dh_t *dh_state =
+ or_circ->build_state->pending_final_cpath->rend_dh_handshake_state;
+ /* compute and overwrite digest of cell body with the right value */
+ retval = crypto_dh_compute_secret(LOG_PROTOCOL_WARN, dh_state,
+ (char*)rend_cell_body, DH_KEY_LEN,
+ keys, DIGEST_LEN+CPATH_KEY_MATERIAL_LEN);
+ tt_int_op(retval, OP_GT, 0);
+ memcpy(rend_cell_body+DH_KEY_LEN, keys, DIGEST_LEN);
+ }
+
+ /* Setup the circuit */
+ retval = hs_circuit_setup_e2e_rend_circ_legacy_client(or_circ,
+ rend_cell_body);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /**********************************************/
+
+ /* See that a hop was added to the circuit's cpath */
+ retval = cpath_get_n_hops(&or_circ->cpath);
+ tt_int_op(retval, OP_EQ, 1);
+
+ /* Check the digest algo */
+ tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest),
+ OP_EQ, DIGEST_SHA1);
+ tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest),
+ OP_EQ, DIGEST_SHA1);
+ tt_assert(or_circ->cpath->f_crypto);
+ tt_assert(or_circ->cpath->b_crypto);
+
+ /* Ensure that circ purpose was changed */
+ tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_C_REND_JOINED);
+
+ /* Test that stream got attached */
+ tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, TO_CIRCUIT(or_circ));
+
+ done:
+ connection_free_(conn);
+ tor_free(TO_CIRCUIT(or_circ)->n_chan);
+ circuit_free(TO_CIRCUIT(or_circ));
+}
+
+/* Test: Ensure that setting up v3 rendezvous circuits works correctly. */
+static void
+test_e2e_rend_circuit_setup(void *arg)
+{
+ uint8_t ntor_key_seed[DIGEST256_LEN] = {0};
+ origin_circuit_t *or_circ;
+ int retval;
+ connection_t *conn = NULL;
+
+ (void) arg;
+
+ /** In this test we create a prop224 v3 HS stream and a circuit with the same
+ * hidden service destination. We make the stream wait for circuits to be
+ * established to the hidden service, and then we complete the circuit using
+ * the hs_circuit_setup_e2e_rend_circ() function. We then check that the
+ * end-to-end cpath was setup correctly and that the stream was attached to
+ * the circuit as expected. */
+
+ MOCK(connection_ap_handshake_send_begin,
+ mock_connection_ap_handshake_send_begin);
+
+ /* Setup */
+ retval = helper_get_circ_and_stream_for_test( &or_circ, &conn, 0);
+ tt_int_op(retval, OP_EQ, 0);
+ tt_assert(or_circ);
+ tt_assert(conn);
+
+ /* Check number of hops: There should be no hops yet to this circ */
+ retval = cpath_get_n_hops(&or_circ->cpath);
+ tt_int_op(retval, OP_EQ, 0);
+ tt_ptr_op(or_circ->cpath, OP_EQ, NULL);
+
+ /* Check that our stream is not attached on any circuits */
+ tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, NULL);
+
+ /**********************************************/
+
+ /* Setup the circuit */
+ retval = hs_circuit_setup_e2e_rend_circ(or_circ,
+ ntor_key_seed, sizeof(ntor_key_seed),
+ 0);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /**********************************************/
+
+ /* See that a hop was added to the circuit's cpath */
+ retval = cpath_get_n_hops(&or_circ->cpath);
+ tt_int_op(retval, OP_EQ, 1);
+
+ /* Check that the crypt path has prop224 algorithm parameters */
+ tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest),
+ OP_EQ, DIGEST_SHA3_256);
+ tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest),
+ OP_EQ, DIGEST_SHA3_256);
+ tt_assert(or_circ->cpath->f_crypto);
+ tt_assert(or_circ->cpath->b_crypto);
+
+ /* Ensure that circ purpose was changed */
+ tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_C_REND_JOINED);
+
+ /* Test that stream got attached */
+ tt_ptr_op(TO_EDGE_CONN(conn)->on_circuit, OP_EQ, TO_CIRCUIT(or_circ));
+
+ done:
+ connection_free_(conn);
+ tor_free(TO_CIRCUIT(or_circ)->n_chan);
+ circuit_free(TO_CIRCUIT(or_circ));
+}
+
+struct testcase_t hs_client_tests[] = {
+ { "e2e_rend_circuit_setup_legacy", test_e2e_rend_circuit_setup_legacy,
+ TT_FORK, NULL, NULL },
+ { "e2e_rend_circuit_setup", test_e2e_rend_circuit_setup,
+ TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_hs_common.c b/src/test/test_hs_common.c
new file mode 100644
index 0000000000..b1e47adf24
--- /dev/null
+++ b/src/test/test_hs_common.c
@@ -0,0 +1,855 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_hs_common.c
+ * \brief Test hidden service common functionalities.
+ */
+
+#define HS_COMMON_PRIVATE
+#define HS_SERVICE_PRIVATE
+
+#include "test.h"
+#include "test_helpers.h"
+#include "log_test_helpers.h"
+#include "hs_test_helpers.h"
+
+#include "connection_edge.h"
+#include "hs_common.h"
+#include "hs_service.h"
+#include "config.h"
+#include "networkstatus.h"
+#include "directory.h"
+#include "nodelist.h"
+#include "statefile.h"
+
+/** Test the validation of HS v3 addresses */
+static void
+test_validate_address(void *arg)
+{
+ int ret;
+
+ (void) arg;
+
+ /* Address too short and too long. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_address_is_valid("blah");
+ tt_int_op(ret, OP_EQ, 0);
+ expect_log_msg_containing("has an invalid length");
+ teardown_capture_of_logs();
+
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_address_is_valid(
+ "p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnadb");
+ tt_int_op(ret, OP_EQ, 0);
+ expect_log_msg_containing("has an invalid length");
+ teardown_capture_of_logs();
+
+ /* Invalid checksum (taken from prop224) */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_address_is_valid(
+ "l5satjgud6gucryazcyvyvhuxhr74u6ygigiuyixe3a6ysis67ororad");
+ tt_int_op(ret, OP_EQ, 0);
+ expect_log_msg_containing("invalid checksum");
+ teardown_capture_of_logs();
+
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_address_is_valid(
+ "btojiu7nu5y5iwut64eufevogqdw4wmqzugnoluw232r4t3ecsfv37ad");
+ tt_int_op(ret, OP_EQ, 0);
+ expect_log_msg_containing("invalid checksum");
+ teardown_capture_of_logs();
+
+ /* Non base32 decodable string. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_address_is_valid(
+ "????????????????????????????????????????????????????????");
+ tt_int_op(ret, OP_EQ, 0);
+ expect_log_msg_containing("can't be decoded");
+ teardown_capture_of_logs();
+
+ /* Valid address. */
+ ret = hs_address_is_valid(
+ "p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnad");
+ tt_int_op(ret, OP_EQ, 1);
+
+ done:
+ ;
+}
+
+static int
+mock_write_str_to_file(const char *path, const char *str, int bin)
+{
+ (void)bin;
+ tt_str_op(path, OP_EQ, "/double/five"PATH_SEPARATOR"squared");
+ tt_str_op(str, OP_EQ,
+ "ijbeeqscijbeeqscijbeeqscijbeeqscijbeeqscijbeeqscijbezhid.onion\n");
+
+ done:
+ return 0;
+}
+
+/** Test building HS v3 onion addresses */
+static void
+test_build_address(void *arg)
+{
+ int ret;
+ char onion_addr[HS_SERVICE_ADDR_LEN_BASE32 + 1];
+ ed25519_public_key_t pubkey;
+ hs_service_t *service = NULL;
+
+ (void) arg;
+
+ MOCK(write_str_to_file, mock_write_str_to_file);
+
+ /* The following has been created with hs_build_address.py script that
+ * follows proposal 224 specification to build an onion address. */
+ static const char *test_addr =
+ "ijbeeqscijbeeqscijbeeqscijbeeqscijbeeqscijbeeqscijbezhid";
+
+ /* Let's try to build the same onion address that the script can do. Key is
+ * a long set of very random \x42 :). */
+ memset(&pubkey, '\x42', sizeof(pubkey));
+ hs_build_address(&pubkey, HS_VERSION_THREE, onion_addr);
+ tt_str_op(test_addr, OP_EQ, onion_addr);
+ /* Validate that address. */
+ ret = hs_address_is_valid(onion_addr);
+ tt_int_op(ret, OP_EQ, 1);
+
+ service = tor_malloc_zero(sizeof(hs_service_t));
+ memcpy(service->onion_address, onion_addr, sizeof(service->onion_address));
+ tor_asprintf(&service->config.directory_path, "/double/five");
+ ret = write_address_to_file(service, "squared");
+ tt_int_op(ret, OP_EQ, 0);
+
+ done:
+ hs_service_free(service);
+}
+
+/** 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, correct_time, start_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, OP_EQ, 0);
+
+ /* Check that the time period number is right */
+ tn = hs_get_time_period_num(fake_time);
+ tt_u64_op(tn, OP_EQ, 16903);
+
+ /* Increase current time to 11:59:59 UTC and check that the time period
+ number is still the same */
+ fake_time += 3599;
+ tn = hs_get_time_period_num(fake_time);
+ tt_u64_op(tn, OP_EQ, 16903);
+
+ { /* Check start time of next time period */
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC",
+ &correct_time);
+ tt_int_op(retval, OP_EQ, 0);
+
+ start_time = hs_get_start_time_of_next_time_period(fake_time);
+ tt_int_op(start_time, OP_EQ, correct_time);
+ }
+
+ /* Now take time to 12:00:00 UTC and check that the time period rotated */
+ fake_time += 1;
+ tn = hs_get_time_period_num(fake_time);
+ tt_u64_op(tn, OP_EQ, 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, OP_EQ, 16905);
+
+ { /* Check start time of next time period again */
+ retval = parse_rfc1123_time("Wed, 14 Apr 2016 12:00:00 UTC",
+ &correct_time);
+ tt_int_op(retval, OP_EQ, 0);
+
+ start_time = hs_get_start_time_of_next_time_period(fake_time);
+ tt_int_op(start_time, OP_EQ, correct_time);
+ }
+
+ /* Now do another sanity check: The time period number at the start of the
+ * next time period, must be the same time period number as the one returned
+ * from hs_get_next_time_period_num() */
+ {
+ time_t next_tp_start = hs_get_start_time_of_next_time_period(fake_time);
+ tt_u64_op(hs_get_time_period_num(next_tp_start), OP_EQ,
+ hs_get_next_time_period_num(fake_time));
+ }
+
+ done:
+ ;
+}
+
+/** Test that we can correctly find the start time of the next time period */
+static void
+test_start_time_of_next_time_period(void *arg)
+{
+ (void) arg;
+ int retval;
+ time_t fake_time;
+ char tbuf[ISO_TIME_LEN + 1];
+ time_t next_tp_start_time;
+
+ /* Do some basic tests */
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC",
+ &fake_time);
+ tt_int_op(retval, OP_EQ, 0);
+ next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time);
+ /* Compare it with the correct result */
+ format_iso_time(tbuf, next_tp_start_time);
+ tt_str_op("2016-04-13 12:00:00", OP_EQ, tbuf);
+
+ /* Another test with an edge-case time (start of TP) */
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 12:00:00 UTC",
+ &fake_time);
+ tt_int_op(retval, OP_EQ, 0);
+ next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time);
+ format_iso_time(tbuf, next_tp_start_time);
+ tt_str_op("2016-04-14 12:00:00", OP_EQ, tbuf);
+
+ {
+ /* Now pretend we are on a testing network and alter the voting schedule to
+ be every 10 seconds. This means that a time period has length 10*24
+ seconds (4 minutes). It also means that we apply a rotational offset of
+ 120 seconds to the time period, so that it starts at 00:02:00 instead of
+ 00:00:00. */
+ or_options_t *options = get_options_mutable();
+ options->TestingTorNetwork = 1;
+ options->V3AuthVotingInterval = 10;
+ options->TestingV3AuthInitialVotingInterval = 10;
+
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:00:00 UTC",
+ &fake_time);
+ tt_int_op(retval, OP_EQ, 0);
+ next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time);
+ /* Compare it with the correct result */
+ format_iso_time(tbuf, next_tp_start_time);
+ tt_str_op("2016-04-13 00:02:00", OP_EQ, tbuf);
+
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:02:00 UTC",
+ &fake_time);
+ tt_int_op(retval, OP_EQ, 0);
+ next_tp_start_time = hs_get_start_time_of_next_time_period(fake_time);
+ /* Compare it with the correct result */
+ format_iso_time(tbuf, next_tp_start_time);
+ tt_str_op("2016-04-13 00:06:00", OP_EQ, tbuf);
+ }
+
+ done:
+ ;
+}
+
+/** Test that our HS overlap period functions work properly. */
+static void
+test_desc_overlap_period(void *arg)
+{
+ (void) arg;
+ int retval;
+ time_t now = time(NULL);
+ networkstatus_t *dummy_consensus = NULL;
+
+ /* First try with a consensus just inside the overlap period */
+ dummy_consensus = tor_malloc_zero(sizeof(networkstatus_t));
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:00:00 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 1);
+
+ /* Now increase the valid_after so that it goes to 11:00:00 UTC. Overlap
+ period is still active. */
+ dummy_consensus->valid_after += 3600*11;
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 1);
+
+ /* Now increase the valid_after so that it goes to 11:59:59 UTC. Overlap
+ period is still active. */
+ dummy_consensus->valid_after += 3599;
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 1);
+
+ /* Now increase the valid_after so that it drifts to noon, and check that
+ overlap mode is not active anymore. */
+ dummy_consensus->valid_after += 1;
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /* Check that overlap mode is also inactive at 23:59:59 UTC */
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 23:59:59 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 0);
+
+ done:
+ tor_free(dummy_consensus);
+}
+
+/* Test the overlap period functions on a testnet with altered voting
+ * schedule */
+static void
+test_desc_overlap_period_testnet(void *arg)
+{
+ int retval;
+ time_t now = approx_time();
+ networkstatus_t *dummy_consensus = NULL;
+ or_options_t *options = get_options_mutable();
+
+ (void) arg;
+
+ /* Set the testnet option and a 10-second voting interval */
+ options->TestingTorNetwork = 1;
+ options->V3AuthVotingInterval = 10;
+ options->TestingV3AuthInitialVotingInterval = 10;
+
+ dummy_consensus = tor_malloc_zero(sizeof(networkstatus_t));
+
+ /* A 10-second voting interval means that the lengths of an SRV run and of a
+ * time period are both 10*24 seconds (4 minutes). The SRV gets published at
+ * 00:00:00 and the TP starts at 00:02:00 (rotation offset: 2 mins). Those
+ * two minutes between SRV publish and TP start is the overlap period
+ * window. Let's test it: */
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:00:00 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 1);
+
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:01:59 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 1);
+
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:02:00 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 0);
+
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:04:00 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 1);
+
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:05:59 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 1);
+
+ retval = parse_rfc1123_time("Wed, 13 Apr 2016 00:06:00 UTC",
+ &dummy_consensus->valid_after);
+ tt_int_op(retval, OP_EQ, 0);
+ retval = hs_overlap_mode_is_active(dummy_consensus, now);
+ tt_int_op(retval, OP_EQ, 0);
+
+ done:
+ tor_free(dummy_consensus);
+}
+
+static void
+helper_add_hsdir_to_networkstatus(networkstatus_t *ns,
+ const uint8_t *identity,
+ const uint8_t *curr_hsdir_index,
+ const char *nickname,
+ int is_hsdir)
+{
+ routerstatus_t *rs = tor_malloc_zero(sizeof(routerstatus_t));
+ routerinfo_t *ri = tor_malloc_zero(sizeof(routerinfo_t));
+
+ tor_addr_t ipv4_addr;
+ memcpy(rs->identity_digest, identity, DIGEST_LEN);
+ rs->is_hs_dir = is_hsdir;
+ rs->supports_v3_hsdir = 1;
+ tor_addr_parse(&ipv4_addr, "1.2.3.4");
+ ri->addr = tor_addr_to_ipv4h(&ipv4_addr);
+ ri->nickname = tor_strdup(nickname);
+ ri->protocol_list = tor_strdup("HSDir=1-2 LinkAuth=3");
+ memcpy(ri->cache_info.identity_digest, identity, DIGEST_LEN);
+ tt_assert(nodelist_set_routerinfo(ri, NULL));
+ node_t *node = node_get_mutable_by_id(ri->cache_info.identity_digest);
+ tt_assert(node);
+ node->rs = rs;
+ memcpy(node->hsdir_index->current, curr_hsdir_index,
+ sizeof(node->hsdir_index->current));
+ smartlist_add(ns->routerstatus_list, rs);
+
+ done:
+ ;
+}
+
+static networkstatus_t *mock_ns = NULL;
+
+static networkstatus_t *
+mock_networkstatus_get_latest_consensus(void)
+{
+ time_t now = approx_time();
+
+ /* If initialized, return it */
+ if (mock_ns) {
+ return mock_ns;
+ }
+
+ /* Initialize fake consensus */
+ mock_ns = tor_malloc_zero(sizeof(networkstatus_t));
+
+ /* This consensus is live */
+ mock_ns->valid_after = now-1;
+ mock_ns->fresh_until = now+1;
+ mock_ns->valid_until = now+2;
+ /* Create routerstatus list */
+ mock_ns->routerstatus_list = smartlist_new();
+
+ return mock_ns;
+}
+
+/** Test the responsible HSDirs calculation function */
+static void
+test_responsible_hsdirs(void *arg)
+{
+ time_t now = approx_time();
+ smartlist_t *responsible_dirs = smartlist_new();
+ networkstatus_t *ns = NULL;
+ int retval;
+
+ (void) arg;
+
+ hs_init();
+
+ MOCK(networkstatus_get_latest_consensus,
+ mock_networkstatus_get_latest_consensus);
+
+ ns = networkstatus_get_latest_consensus();
+
+ { /* First router: HSdir */
+ uint8_t identity[DIGEST_LEN];
+ uint8_t curr_hsdir_index[DIGEST256_LEN];
+ char nickname[] = "let_me";
+ memset(identity, 1, sizeof(identity));
+ memset(curr_hsdir_index, 1, sizeof(curr_hsdir_index));
+
+ helper_add_hsdir_to_networkstatus(ns, identity,
+ curr_hsdir_index, nickname, 1);
+ }
+
+ { /* Second HSDir */
+ uint8_t identity[DIGEST_LEN];
+ uint8_t curr_hsdir_index[DIGEST256_LEN];
+ char nickname[] = "show_you";
+ memset(identity, 2, sizeof(identity));
+ memset(curr_hsdir_index, 2, sizeof(curr_hsdir_index));
+
+ helper_add_hsdir_to_networkstatus(ns, identity,
+ curr_hsdir_index, nickname, 1);
+ }
+
+ { /* Third relay but not HSDir */
+ uint8_t identity[DIGEST_LEN];
+ uint8_t curr_hsdir_index[DIGEST256_LEN];
+ char nickname[] = "how_to_dance";
+ memset(identity, 3, sizeof(identity));
+ memset(curr_hsdir_index, 3, sizeof(curr_hsdir_index));
+
+ helper_add_hsdir_to_networkstatus(ns, identity,
+ curr_hsdir_index, nickname, 0);
+ }
+
+ ed25519_keypair_t kp;
+ retval = ed25519_keypair_generate(&kp, 0);
+ tt_int_op(retval, OP_EQ , 0);
+
+ uint64_t time_period_num = hs_get_time_period_num(now);
+ hs_get_responsible_hsdirs(&kp.pubkey, time_period_num,
+ 0, 0, responsible_dirs);
+
+ /* Make sure that we only found 2 responsible HSDirs.
+ * The third relay was not an hsdir! */
+ tt_int_op(smartlist_len(responsible_dirs), OP_EQ, 2);
+
+ /** TODO: Build a bigger network and do more tests here */
+
+ done:
+ SMARTLIST_FOREACH(ns->routerstatus_list,
+ routerstatus_t *, rs, routerstatus_free(rs));
+ smartlist_free(responsible_dirs);
+ smartlist_clear(ns->routerstatus_list);
+ networkstatus_vote_free(mock_ns);
+}
+
+static void
+mock_directory_initiate_request(directory_request_t *req)
+{
+ (void)req;
+ return;
+}
+
+static int
+mock_hs_desc_encode_descriptor(const hs_descriptor_t *desc,
+ const ed25519_keypair_t *signing_kp,
+ char **encoded_out)
+{
+ (void)desc;
+ (void)signing_kp;
+
+ tor_asprintf(encoded_out, "lulu");
+ return 0;
+}
+
+static or_state_t dummy_state;
+
+/* Mock function to get fake or state (used for rev counters) */
+static or_state_t *
+get_or_state_replacement(void)
+{
+ return &dummy_state;
+}
+
+static int
+mock_router_have_minimum_dir_info(void)
+{
+ return 1;
+}
+
+/** Test that we correctly detect when the HSDir hash ring changes so that we
+ * reupload our descriptor. */
+static void
+test_desc_reupload_logic(void *arg)
+{
+ networkstatus_t *ns = NULL;
+
+ (void) arg;
+
+ hs_init();
+
+ MOCK(router_have_minimum_dir_info,
+ mock_router_have_minimum_dir_info);
+ MOCK(get_or_state,
+ get_or_state_replacement);
+ MOCK(networkstatus_get_latest_consensus,
+ mock_networkstatus_get_latest_consensus);
+ MOCK(directory_initiate_request,
+ mock_directory_initiate_request);
+ MOCK(hs_desc_encode_descriptor,
+ mock_hs_desc_encode_descriptor);
+
+ ns = networkstatus_get_latest_consensus();
+
+ /** Test logic:
+ * 1) Upload descriptor to HSDirs
+ * CHECK that previous_hsdirs list was populated.
+ * 2) Then call router_dir_info_changed() without an HSDir set change.
+ * CHECK that no reuplod occurs.
+ * 3) Now change the HSDir set, and call dir_info_changed() again.
+ * CHECK that reupload occurs.
+ * 4) Finally call service_desc_schedule_upload().
+ * CHECK that previous_hsdirs list was cleared.
+ **/
+
+ /* Let's start by building our descriptor and service */
+ hs_service_descriptor_t *desc = service_descriptor_new();
+ hs_service_t *service = NULL;
+ char onion_addr[HS_SERVICE_ADDR_LEN_BASE32 + 1];
+ ed25519_public_key_t pubkey;
+ memset(&pubkey, '\x42', sizeof(pubkey));
+ hs_build_address(&pubkey, HS_VERSION_THREE, onion_addr);
+ service = tor_malloc_zero(sizeof(hs_service_t));
+ memcpy(service->onion_address, onion_addr, sizeof(service->onion_address));
+ ed25519_secret_key_generate(&service->keys.identity_sk, 0);
+ ed25519_public_key_generate(&service->keys.identity_pk,
+ &service->keys.identity_sk);
+ service->desc_current = desc;
+ /* Also add service to service map */
+ hs_service_ht *service_map = get_hs_service_map();
+ tt_assert(service_map);
+ tt_int_op(hs_service_get_num_services(), OP_EQ, 0);
+ register_service(service_map, service);
+ tt_int_op(hs_service_get_num_services(), OP_EQ, 1);
+
+ /* Now let's create our hash ring: */
+ { /* First HSDir */
+ uint8_t identity[DIGEST_LEN];
+ uint8_t curr_hsdir_index[DIGEST256_LEN];
+ char nickname[] = "let_me";
+ memset(identity, 1, sizeof(identity));
+ memset(curr_hsdir_index, 1, sizeof(curr_hsdir_index));
+
+ helper_add_hsdir_to_networkstatus(ns, identity,
+ curr_hsdir_index, nickname, 1);
+ }
+
+ { /* Second HSDir */
+ uint8_t identity[DIGEST_LEN];
+ uint8_t curr_hsdir_index[DIGEST256_LEN];
+ char nickname[] = "show_you";
+ memset(identity, 2, sizeof(identity));
+ memset(curr_hsdir_index, 2, sizeof(curr_hsdir_index));
+
+ helper_add_hsdir_to_networkstatus(ns, identity,
+ curr_hsdir_index, nickname, 1);
+ }
+
+ /* Now let's upload our desc to all hsdirs */
+ upload_descriptor_to_all(service, desc, 0);
+ /* Check that previous hsdirs were populated */
+ tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 2);
+
+ /* Poison next upload time so that we can see if it was changed by
+ * router_dir_info_changed(). No changes in hash ring so far, so the upload
+ * time should stay as is. */
+ desc->next_upload_time = 42;
+ router_dir_info_changed();
+ tt_int_op(desc->next_upload_time, OP_EQ, 42);
+
+ /* Now change the HSDir hash ring by adding another node */
+
+ { /* Third HSDir */
+ uint8_t identity[DIGEST_LEN];
+ uint8_t curr_hsdir_index[DIGEST256_LEN];
+ char nickname[] = "how_to_dance";
+ memset(identity, 3, sizeof(identity));
+ memset(curr_hsdir_index, 3, sizeof(curr_hsdir_index));
+
+ helper_add_hsdir_to_networkstatus(ns, identity,
+ curr_hsdir_index, nickname, 1);
+ }
+
+ /* Now call service_desc_hsdirs_changed() and see that it detected the hash
+ ring change */
+ time_t now = approx_time();
+ tt_assert(now);
+ tt_int_op(service_desc_hsdirs_changed(service, desc), OP_EQ, 1);
+
+ /* Now pretend that the descriptor changed, and order a reupload to all
+ HSDirs. Make sure that the set of previous HSDirs was cleared. */
+ service_desc_schedule_upload(desc, now, 1);
+ tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 0);
+
+ /* Now reupload again: see that the prev hsdir set got populated again. */
+ upload_descriptor_to_all(service, desc, 0);
+ tt_int_op(smartlist_len(desc->previous_hsdirs), OP_EQ, 3);
+
+ done:
+ hs_free_all();
+}
+
+/** Test disaster SRV computation and caching */
+static void
+test_disaster_srv(void *arg)
+{
+ uint8_t *cached_disaster_srv_one = NULL;
+ uint8_t *cached_disaster_srv_two = NULL;
+ uint8_t srv_one[DIGEST256_LEN] = {0};
+ uint8_t srv_two[DIGEST256_LEN] = {0};
+ uint8_t srv_three[DIGEST256_LEN] = {0};
+ uint8_t srv_four[DIGEST256_LEN] = {0};
+ uint8_t srv_five[DIGEST256_LEN] = {0};
+
+ (void) arg;
+
+ /* Get the cached SRVs: we gonna use them later for verification */
+ cached_disaster_srv_one = get_first_cached_disaster_srv();
+ cached_disaster_srv_two = get_second_cached_disaster_srv();
+
+ /* Compute some srvs */
+ get_disaster_srv(1, srv_one);
+ get_disaster_srv(2, srv_two);
+
+ /* Check that the cached ones where updated */
+ tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_one, DIGEST256_LEN);
+ tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN);
+
+ /* Ask for an SRV that has already been computed */
+ get_disaster_srv(2, srv_two);
+ /* and check that the cache entries have not changed */
+ tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_one, DIGEST256_LEN);
+ tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN);
+
+ /* Ask for a new SRV */
+ get_disaster_srv(3, srv_three);
+ tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_three, DIGEST256_LEN);
+ tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_two, DIGEST256_LEN);
+
+ /* Ask for another SRV: none of the original SRVs should now be cached */
+ get_disaster_srv(4, srv_four);
+ tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_three, DIGEST256_LEN);
+ tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_four, DIGEST256_LEN);
+
+ /* Ask for yet another SRV */
+ get_disaster_srv(5, srv_five);
+ tt_mem_op(cached_disaster_srv_one, OP_EQ, srv_five, DIGEST256_LEN);
+ tt_mem_op(cached_disaster_srv_two, OP_EQ, srv_four, DIGEST256_LEN);
+
+ done:
+ ;
+}
+
+/** Test our HS descriptor request tracker by making various requests and
+ * checking whether they get tracked properly. */
+static void
+test_hid_serv_request_tracker(void *arg)
+{
+ (void) arg;
+ time_t retval;
+ routerstatus_t *hsdir = NULL, *hsdir2 = NULL;
+ time_t now = approx_time();
+
+ const char *req_key_str_first =
+ "vd4zb6zesaubtrjvdqcr2w7x7lhw2up4Xnw4526ThUNbL5o1go+EdUuEqlKxHkNbnK41pRzizzs";
+ const char *req_key_str_second =
+ "g53o7iavcd62oihswhr24u6czmqws5kpXnw4526ThUNbL5o1go+EdUuEqlKxHkNbnK41pRzizzs";
+
+ /*************************** basic test *******************************/
+
+ /* Get request tracker and make sure it's empty */
+ strmap_t *request_tracker = get_last_hid_serv_requests();
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 0);
+
+ /* Let's register a hid serv request */
+ hsdir = tor_malloc_zero(sizeof(routerstatus_t));
+ memset(hsdir->identity_digest, 'Z', DIGEST_LEN);
+ retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first,
+ now, 1);
+ tt_int_op(retval, OP_EQ, now);
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 1);
+
+ /* Let's lookup a non-existent hidserv request */
+ retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_second,
+ now+1, 0);
+ tt_int_op(retval, OP_EQ, 0);
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 1);
+
+ /* Let's lookup a real hidserv request */
+ retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first,
+ now+2, 0);
+ tt_int_op(retval, OP_EQ, now); /* we got it */
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 1);
+
+ /**********************************************************************/
+
+ /* Let's add another request for the same HS but on a different HSDir. */
+ hsdir2 = tor_malloc_zero(sizeof(routerstatus_t));
+ memset(hsdir->identity_digest, 2, DIGEST_LEN);
+ retval = hs_lookup_last_hid_serv_request(hsdir2, req_key_str_first,
+ now+3, 1);
+ tt_int_op(retval, OP_EQ, now+3);
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 2);
+
+ /* Check that we can clean the first request based on time */
+ hs_clean_last_hid_serv_requests(now+3+REND_HID_SERV_DIR_REQUERY_PERIOD);
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 1);
+ /* Check that it doesn't exist anymore */
+ retval = hs_lookup_last_hid_serv_request(hsdir, req_key_str_first,
+ now+2, 0);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /*************************** deleting entries **************************/
+
+ /* Add another request with very short key */
+ retval = hs_lookup_last_hid_serv_request(hsdir, "l", now, 1);
+
+ /* Try deleting entries with a dummy key. Check that our previous requests
+ * are still there */
+ tor_capture_bugs_(1);
+ hs_purge_hid_serv_from_last_hid_serv_requests("a");
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 2);
+ tor_end_capture_bugs_();
+
+ /* Try another dummy key. Check that requests are still there */
+ {
+ char dummy[2000];
+ memset(dummy, 'Z', 2000);
+ dummy[1999] = '\x00';
+ hs_purge_hid_serv_from_last_hid_serv_requests(dummy);
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 2);
+ }
+
+ /* Another dummy key! */
+ hs_purge_hid_serv_from_last_hid_serv_requests(req_key_str_second);
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 2);
+
+ /* Now actually delete a request! */
+ hs_purge_hid_serv_from_last_hid_serv_requests(req_key_str_first);
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 1);
+
+ /* Purge it all! */
+ hs_purge_last_hid_serv_requests();
+ request_tracker = get_last_hid_serv_requests();
+ tt_int_op(strmap_size(request_tracker),OP_EQ, 0);
+
+ done:
+ tor_free(hsdir);
+ tor_free(hsdir2);
+}
+
+static void
+test_parse_extended_hostname(void *arg)
+{
+ (void) arg;
+
+ char address1[] = "fooaddress.onion";
+ char address2[] = "aaaaaaaaaaaaaaaa.onion";
+ char address3[] = "fooaddress.exit";
+ char address4[] = "www.torproject.org";
+ char address5[] = "foo.abcdefghijklmnop.onion";
+ char address6[] = "foo.bar.abcdefghijklmnop.onion";
+ char address7[] = ".abcdefghijklmnop.onion";
+ char address8[] =
+ "www.p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnad.onion";
+
+ tt_assert(BAD_HOSTNAME == parse_extended_hostname(address1));
+ tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address2));
+ tt_str_op(address2,OP_EQ, "aaaaaaaaaaaaaaaa");
+ tt_assert(EXIT_HOSTNAME == parse_extended_hostname(address3));
+ tt_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4));
+ tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address5));
+ tt_str_op(address5,OP_EQ, "abcdefghijklmnop");
+ tt_assert(ONION_V2_HOSTNAME == parse_extended_hostname(address6));
+ tt_str_op(address6,OP_EQ, "abcdefghijklmnop");
+ tt_assert(BAD_HOSTNAME == parse_extended_hostname(address7));
+ tt_assert(ONION_V3_HOSTNAME == parse_extended_hostname(address8));
+ tt_str_op(address8, OP_EQ,
+ "p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnad");
+
+ done: ;
+}
+
+struct testcase_t hs_common_tests[] = {
+ { "build_address", test_build_address, TT_FORK,
+ NULL, NULL },
+ { "validate_address", test_validate_address, TT_FORK,
+ NULL, NULL },
+ { "time_period", test_time_period, TT_FORK,
+ NULL, NULL },
+ { "start_time_of_next_time_period", test_start_time_of_next_time_period,
+ TT_FORK, NULL, NULL },
+ { "desc_overlap_period", test_desc_overlap_period, TT_FORK,
+ NULL, NULL },
+ { "desc_overlap_period_testnet", test_desc_overlap_period_testnet, TT_FORK,
+ NULL, NULL },
+ { "responsible_hsdirs", test_responsible_hsdirs, TT_FORK,
+ NULL, NULL },
+ { "desc_reupload_logic", test_desc_reupload_logic, TT_FORK,
+ NULL, NULL },
+ { "disaster_srv", test_disaster_srv, TT_FORK,
+ NULL, NULL },
+ { "hid_serv_request_tracker", test_hid_serv_request_tracker, TT_FORK,
+ NULL, NULL },
+ { "parse_extended_hostname", test_parse_extended_hostname, TT_FORK,
+ NULL, NULL },
+
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_hs_config.c b/src/test/test_hs_config.c
new file mode 100644
index 0000000000..a76be301d3
--- /dev/null
+++ b/src/test/test_hs_config.c
@@ -0,0 +1,487 @@
+/* Copyright (c) 2016, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_hs_config.c
+ * \brief Test hidden service configuration functionality.
+ */
+
+#define CONFIG_PRIVATE
+#define HS_SERVICE_PRIVATE
+
+#include "test.h"
+#include "test_helpers.h"
+#include "log_test_helpers.h"
+
+#include "config.h"
+#include "hs_common.h"
+#include "hs_config.h"
+#include "hs_service.h"
+#include "rendservice.h"
+
+static int
+helper_config_service(const char *conf, int validate_only)
+{
+ int ret = 0;
+ or_options_t *options = NULL;
+ tt_assert(conf);
+ options = helper_parse_options(conf);
+ tt_assert(options);
+ ret = hs_config_service_all(options, validate_only);
+ done:
+ or_options_free(options);
+ return ret;
+}
+
+static void
+test_invalid_service(void *arg)
+{
+ int ret;
+
+ (void) arg;
+
+ /* Try with a missing port configuration. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 1\n"; /* Wrong not supported version. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceVersion must be between 2 and 3");
+ teardown_capture_of_logs();
+ }
+
+ /* Bad value of HiddenServiceAllowUnknownPorts. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServiceAllowUnknownPorts 2\n"; /* Should be 0 or 1. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceAllowUnknownPorts must be "
+ "between 0 and 1, not 2");
+ teardown_capture_of_logs();
+ }
+
+ /* Bad value of HiddenServiceDirGroupReadable */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServiceDirGroupReadable 2\n"; /* Should be 0 or 1. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceDirGroupReadable must be "
+ "between 0 and 1, not 2");
+ teardown_capture_of_logs();
+ }
+
+ /* Bad value of HiddenServiceMaxStreamsCloseCircuit */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServiceMaxStreamsCloseCircuit 2\n"; /* Should be 0 or 1. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceMaxStreamsCloseCircuit must "
+ "be between 0 and 1, not 2");
+ teardown_capture_of_logs();
+ }
+
+ /* Too much max streams. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceMaxStreams 65536\n"; /* One too many. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceMaxStreams must be between "
+ "0 and 65535, not 65536");
+ teardown_capture_of_logs();
+ }
+
+ /* Duplicate directory directive. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 81\n";
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Another hidden service is already "
+ "configured for directory");
+ teardown_capture_of_logs();
+ }
+
+ /* Bad port. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 65536\n";
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Missing or invalid port");
+ teardown_capture_of_logs();
+ }
+
+ /* Out of order directives. */
+ {
+ const char *conf =
+ "HiddenServiceVersion 2\n"
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServicePort 80\n";
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceVersion with no preceding "
+ "HiddenServiceDir directive");
+ teardown_capture_of_logs();
+ }
+
+ done:
+ ;
+}
+
+static void
+test_valid_service(void *arg)
+{
+ int ret;
+
+ (void) arg;
+
+ /* Mix of v2 and v3. Still valid. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
+ "HiddenServiceVersion 3\n"
+ "HiddenServicePort 81\n"
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 82\n";
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ }
+
+ done:
+ ;
+}
+
+static void
+test_invalid_service_v2(void *arg)
+{
+ int validate_only = 1, ret;
+
+ (void) arg;
+
+ /* Try with a missing port configuration. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n";
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, validate_only);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("with no ports configured.");
+ teardown_capture_of_logs();
+ }
+
+ /* Too many introduction points. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceNumIntroductionPoints 11\n"; /* One too many. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, validate_only);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceNumIntroductionPoints should "
+ "be between 0 and 10, not 11");
+ teardown_capture_of_logs();
+ }
+
+ /* Too little introduction points. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceNumIntroductionPoints -1\n";
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, validate_only);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceNumIntroductionPoints should "
+ "be between 0 and 10, not -1");
+ teardown_capture_of_logs();
+ }
+
+ /* Bad authorized client type. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceAuthorizeClient blah alice,bob\n"; /* blah is no good. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, validate_only);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceAuthorizeClient contains "
+ "unrecognized auth-type");
+ teardown_capture_of_logs();
+ }
+
+ done:
+ ;
+}
+
+static void
+test_valid_service_v2(void *arg)
+{
+ int ret;
+
+ (void) arg;
+
+ /* Valid complex configuration. Basic client authorization. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServicePort 22 localhost:22\n"
+#ifdef HAVE_SYS_UN_H
+ "HiddenServicePort 42 unix:/path/to/socket\n"
+#endif
+ "HiddenServiceAuthorizeClient basic alice,bob,eve\n"
+ "HiddenServiceAllowUnknownPorts 1\n"
+ "HiddenServiceMaxStreams 42\n"
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
+ "HiddenServiceDirGroupReadable 1\n"
+ "HiddenServiceNumIntroductionPoints 7\n";
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ }
+
+ /* Valid complex configuration. Stealth client authorization. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 65535\n"
+ "HiddenServicePort 22 1.1.1.1:22\n"
+#ifdef HAVE_SYS_UN_H
+ "HiddenServicePort 9000 unix:/path/to/socket\n"
+#endif
+ "HiddenServiceAuthorizeClient stealth charlie,romeo\n"
+ "HiddenServiceAllowUnknownPorts 0\n"
+ "HiddenServiceMaxStreams 42\n"
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
+ "HiddenServiceDirGroupReadable 1\n"
+ "HiddenServiceNumIntroductionPoints 8\n";
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ }
+
+ done:
+ ;
+}
+
+static void
+test_invalid_service_v3(void *arg)
+{
+ int validate_only = 1, ret;
+
+ (void) arg;
+
+ /* Try with a missing port configuration. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 3\n";
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, validate_only);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("with no ports configured.");
+ teardown_capture_of_logs();
+ }
+
+ /* Too many introduction points. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 3\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceNumIntroductionPoints 21\n"; /* One too many. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, validate_only);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceNumIntroductionPoints must "
+ "be between 3 and 20, not 21.");
+ teardown_capture_of_logs();
+ }
+
+ /* Too little introduction points. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 3\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceNumIntroductionPoints 1\n";
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = helper_config_service(conf, validate_only);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("HiddenServiceNumIntroductionPoints must "
+ "be between 3 and 20, not 1.");
+ teardown_capture_of_logs();
+ }
+
+ done:
+ ;
+}
+
+static void
+test_valid_service_v3(void *arg)
+{
+ int ret;
+
+ (void) arg;
+
+ /* Valid complex configuration. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 3\n"
+ "HiddenServicePort 80\n"
+ "HiddenServicePort 22 localhost:22\n"
+#ifdef HAVE_SYS_UN_H
+ "HiddenServicePort 42 unix:/path/to/socket\n"
+#endif
+ "HiddenServiceAllowUnknownPorts 1\n"
+ "HiddenServiceMaxStreams 42\n"
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
+ "HiddenServiceDirGroupReadable 1\n"
+ "HiddenServiceNumIntroductionPoints 7\n";
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ }
+
+ /* Valid complex configuration. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
+ "HiddenServiceVersion 3\n"
+ "HiddenServicePort 65535\n"
+ "HiddenServicePort 22 1.1.1.1:22\n"
+#ifdef HAVE_SYS_UN_H
+ "HiddenServicePort 9000 unix:/path/to/socket\n"
+#endif
+ "HiddenServiceAllowUnknownPorts 0\n"
+ "HiddenServiceMaxStreams 42\n"
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
+ "HiddenServiceDirGroupReadable 1\n"
+ "HiddenServiceNumIntroductionPoints 20\n";
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ }
+
+ /* Mix of v2 and v3. Still valid. */
+ {
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 80\n"
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
+ "HiddenServiceVersion 3\n"
+ "HiddenServicePort 81\n"
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n"
+ "HiddenServiceVersion 2\n"
+ "HiddenServicePort 82\n";
+ ret = helper_config_service(conf, 1);
+ tt_int_op(ret, OP_EQ, 0);
+ }
+
+ done:
+ ;
+}
+
+static void
+test_staging_service_v3(void *arg)
+{
+ int ret;
+
+ (void) arg;
+
+ /* We don't validate a service object, this is the service test that are in
+ * charge of doing so. We just check for the stable state after
+ * registration. */
+
+ hs_init();
+
+ /* Time for a valid v3 service that should get staged. */
+ const char *conf =
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
+ "HiddenServiceVersion 3\n"
+ "HiddenServicePort 65535\n"
+ "HiddenServicePort 22 1.1.1.1:22\n"
+#ifdef HAVE_SYS_UN_H
+ "HiddenServicePort 9000 unix:/path/to/socket\n"
+#endif
+ "HiddenServiceAllowUnknownPorts 0\n"
+ "HiddenServiceMaxStreams 42\n"
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
+ "HiddenServiceDirGroupReadable 1\n"
+ "HiddenServiceNumIntroductionPoints 20\n";
+ ret = helper_config_service(conf, 0);
+ tt_int_op(ret, OP_EQ, 0);
+ /* Ok, we have a service in our map! Registration went well. */
+ tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1);
+ /* Make sure we don't have a magic v2 service out of this. */
+ tt_int_op(rend_num_services(), OP_EQ, 0);
+
+ done:
+ hs_free_all();
+}
+
+struct testcase_t hs_config_tests[] = {
+ /* Invalid service not specific to any version. */
+ { "invalid_service", test_invalid_service, TT_FORK,
+ NULL, NULL },
+ { "valid_service", test_valid_service, TT_FORK,
+ NULL, NULL },
+
+ /* Test case only for version 2. */
+ { "invalid_service_v2", test_invalid_service_v2, TT_FORK,
+ NULL, NULL },
+ { "valid_service_v2", test_valid_service_v2, TT_FORK,
+ NULL, NULL },
+
+ /* Test case only for version 3. */
+ { "invalid_service_v3", test_invalid_service_v3, TT_FORK,
+ NULL, NULL },
+ { "valid_service_v3", test_valid_service_v3, TT_FORK,
+ NULL, NULL },
+
+ /* Test service staging. */
+ { "staging_service_v3", test_staging_service_v3, TT_FORK,
+ NULL, NULL },
+
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_hs_descriptor.c b/src/test/test_hs_descriptor.c
index b1abe381d4..7f0d1dd189 100644
--- a/src/test/test_hs_descriptor.c
+++ b/src/test/test_hs_descriptor.c
@@ -19,6 +19,14 @@
#include "test_helpers.h"
#include "log_test_helpers.h"
+#ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS
+DISABLE_GCC_WARNING(overlength-strings)
+/* We allow huge string constants in the unit tests, but not in the code
+ * at large. */
+#endif
+#include "test_hs_descriptor.inc"
+ENABLE_GCC_WARNING(overlength-strings)
+
/* Test certificate encoding put in a descriptor. */
static void
test_cert_encoding(void *arg)
@@ -46,7 +54,7 @@ test_cert_encoding(void *arg)
/* Test the certificate encoding function. */
ret = tor_cert_encode_ed22519(cert, &encoded);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Validated the certificate string. */
{
@@ -55,7 +63,7 @@ test_cert_encoding(void *arg)
size_t b64_cert_len;
tor_cert_t *parsed_cert;
- tt_int_op(strcmpstart(pos, "-----BEGIN ED25519 CERT-----\n"), ==, 0);
+ tt_int_op(strcmpstart(pos, "-----BEGIN ED25519 CERT-----\n"), OP_EQ, 0);
pos += strlen("-----BEGIN ED25519 CERT-----\n");
/* Isolate the base64 encoded certificate and try to decode it. */
@@ -64,23 +72,23 @@ test_cert_encoding(void *arg)
b64_cert = pos;
b64_cert_len = end - pos;
ret = base64_decode(buf, sizeof(buf), b64_cert, b64_cert_len);
- tt_int_op(ret, >, 0);
+ tt_int_op(ret, OP_GT, 0);
/* Parseable? */
parsed_cert = tor_cert_parse((uint8_t *) buf, ret);
tt_assert(parsed_cert);
/* Signature is valid? */
ret = tor_cert_checksig(parsed_cert, &kp.pubkey, now + 10);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = tor_cert_eq(cert, parsed_cert);
- tt_int_op(ret, ==, 1);
+ tt_int_op(ret, OP_EQ, 1);
/* The cert did have the signing key? */
ret= ed25519_pubkey_eq(&parsed_cert->signing_key, &kp.pubkey);
- tt_int_op(ret, ==, 1);
+ tt_int_op(ret, OP_EQ, 1);
tor_cert_free(parsed_cert);
/* Get to the end part of the certificate. */
pos += b64_cert_len;
- tt_int_op(strcmpstart(pos, "-----END ED25519 CERT-----"), ==, 0);
+ tt_int_op(strcmpstart(pos, "-----END ED25519 CERT-----"), OP_EQ, 0);
pos += strlen("-----END ED25519 CERT-----");
}
@@ -180,22 +188,22 @@ test_link_specifier(void *arg)
spec.type = LS_IPV4;
ret = tor_addr_parse(&spec.u.ap.addr, "1.2.3.4");
- tt_int_op(ret, ==, AF_INET);
+ tt_int_op(ret, OP_EQ, AF_INET);
b64 = encode_link_specifiers(link_specifiers);
tt_assert(b64);
/* Decode it and validate the format. */
ret = base64_decode(buf, sizeof(buf), b64, strlen(b64));
- tt_int_op(ret, >, 0);
+ tt_int_op(ret, OP_GT, 0);
/* First byte is the number of link specifier. */
- tt_int_op(get_uint8(buf), ==, 1);
+ tt_int_op(get_uint8(buf), OP_EQ, 1);
ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1);
- tt_int_op(ret, ==, 8);
+ tt_int_op(ret, OP_EQ, 8);
/* Should be 2 bytes for port and 4 bytes for IPv4. */
- tt_int_op(link_specifier_get_ls_len(ls), ==, 6);
+ tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, 6);
ipv4 = link_specifier_get_un_ipv4_addr(ls);
- tt_int_op(tor_addr_to_ipv4h(&spec.u.ap.addr), ==, ipv4);
- tt_int_op(link_specifier_get_un_ipv4_port(ls), ==, spec.u.ap.port);
+ tt_int_op(tor_addr_to_ipv4h(&spec.u.ap.addr), OP_EQ, ipv4);
+ tt_int_op(link_specifier_get_un_ipv4_port(ls), OP_EQ, spec.u.ap.port);
link_specifier_free(ls);
tor_free(b64);
@@ -209,24 +217,25 @@ test_link_specifier(void *arg)
spec.type = LS_IPV6;
ret = tor_addr_parse(&spec.u.ap.addr, "[1:2:3:4::]");
- tt_int_op(ret, ==, AF_INET6);
+ tt_int_op(ret, OP_EQ, AF_INET6);
b64 = encode_link_specifiers(link_specifiers);
tt_assert(b64);
/* Decode it and validate the format. */
ret = base64_decode(buf, sizeof(buf), b64, strlen(b64));
- tt_int_op(ret, >, 0);
+ tt_int_op(ret, OP_GT, 0);
/* First byte is the number of link specifier. */
- tt_int_op(get_uint8(buf), ==, 1);
+ tt_int_op(get_uint8(buf), OP_EQ, 1);
ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1);
- tt_int_op(ret, ==, 20);
+ tt_int_op(ret, OP_EQ, 20);
/* Should be 2 bytes for port and 16 bytes for IPv6. */
- tt_int_op(link_specifier_get_ls_len(ls), ==, 18);
+ tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, 18);
for (unsigned int i = 0; i < sizeof(ipv6); i++) {
ipv6[i] = link_specifier_get_un_ipv6_addr(ls, i);
}
- tt_mem_op(tor_addr_to_in6_addr8(&spec.u.ap.addr), ==, ipv6, sizeof(ipv6));
- tt_int_op(link_specifier_get_un_ipv6_port(ls), ==, spec.u.ap.port);
+ tt_mem_op(tor_addr_to_in6_addr8(&spec.u.ap.addr), OP_EQ, ipv6,
+ sizeof(ipv6));
+ tt_int_op(link_specifier_get_un_ipv6_port(ls), OP_EQ, spec.u.ap.port);
link_specifier_free(ls);
tor_free(b64);
@@ -245,12 +254,12 @@ test_link_specifier(void *arg)
/* Decode it and validate the format. */
ret = base64_decode(buf, sizeof(buf), b64, strlen(b64));
- tt_int_op(ret, >, 0);
+ tt_int_op(ret, OP_GT, 0);
/* First byte is the number of link specifier. */
- tt_int_op(get_uint8(buf), ==, 1);
+ tt_int_op(get_uint8(buf), OP_EQ, 1);
ret = link_specifier_parse(&ls, (uint8_t *) buf + 1, ret - 1);
/* 20 bytes digest + 1 byte type + 1 byte len. */
- tt_int_op(ret, ==, 22);
+ tt_int_op(ret, OP_EQ, 22);
tt_int_op(link_specifier_getlen_un_legacy_id(ls), OP_EQ, DIGEST_LEN);
/* Digest length is 20 bytes. */
tt_int_op(link_specifier_get_ls_len(ls), OP_EQ, DIGEST_LEN);
@@ -276,10 +285,10 @@ test_encode_descriptor(void *arg)
(void) arg;
ret = ed25519_keypair_generate(&signing_kp, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
desc = hs_helper_build_hs_desc_with_ip(&signing_kp);
ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
tt_assert(encoded);
done:
@@ -296,23 +305,27 @@ test_decode_descriptor(void *arg)
hs_descriptor_t *desc = NULL;
hs_descriptor_t *decoded = NULL;
hs_descriptor_t *desc_no_ip = NULL;
+ uint8_t subcredential[DIGEST256_LEN];
(void) arg;
ret = ed25519_keypair_generate(&signing_kp, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
desc = hs_helper_build_hs_desc_with_ip(&signing_kp);
+ hs_helper_get_subcred_from_identity_keypair(&signing_kp,
+ subcredential);
+
/* Give some bad stuff to the decoding function. */
- ret = hs_desc_decode_descriptor("hladfjlkjadf", NULL, &decoded);
+ ret = hs_desc_decode_descriptor("hladfjlkjadf", subcredential, &decoded);
tt_int_op(ret, OP_EQ, -1);
ret = hs_desc_encode_descriptor(desc, &signing_kp, &encoded);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
tt_assert(encoded);
- ret = hs_desc_decode_descriptor(encoded, NULL, &decoded);
- tt_int_op(ret, ==, 0);
+ ret = hs_desc_decode_descriptor(encoded, subcredential, &decoded);
+ tt_int_op(ret, OP_EQ, 0);
tt_assert(decoded);
hs_helper_desc_equal(desc, decoded);
@@ -321,16 +334,18 @@ test_decode_descriptor(void *arg)
{
ed25519_keypair_t signing_kp_no_ip;
ret = ed25519_keypair_generate(&signing_kp_no_ip, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
+ hs_helper_get_subcred_from_identity_keypair(&signing_kp_no_ip,
+ subcredential);
desc_no_ip = hs_helper_build_hs_desc_no_ip(&signing_kp_no_ip);
tt_assert(desc_no_ip);
tor_free(encoded);
ret = hs_desc_encode_descriptor(desc_no_ip, &signing_kp_no_ip, &encoded);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
tt_assert(encoded);
hs_descriptor_free(decoded);
- ret = hs_desc_decode_descriptor(encoded, NULL, &decoded);
- tt_int_op(ret, ==, 0);
+ ret = hs_desc_decode_descriptor(encoded, subcredential, &decoded);
+ tt_int_op(ret, OP_EQ, 0);
tt_assert(decoded);
}
@@ -422,12 +437,12 @@ test_decode_invalid_intro_point(void *arg)
hs_descriptor_free(desc);
desc = NULL;
ret = ed25519_keypair_generate(&signing_kp, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
desc = hs_helper_build_hs_desc_with_ip(&signing_kp);
const char *junk = "this is not a descriptor";
ip = decode_introduction_point(desc, junk);
- tt_assert(!ip);
- desc_intro_point_free(ip);
+ tt_ptr_op(ip, OP_EQ, NULL);
+ hs_desc_intro_point_free(ip);
ip = NULL;
}
@@ -442,10 +457,10 @@ test_decode_invalid_intro_point(void *arg)
encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out);
tt_assert(encoded_ip);
ip = decode_introduction_point(desc, encoded_ip);
- tt_assert(!ip);
+ tt_ptr_op(ip, OP_EQ, NULL);
tor_free(encoded_ip);
smartlist_free(lines);
- desc_intro_point_free(ip);
+ hs_desc_intro_point_free(ip);
ip = NULL;
}
@@ -469,7 +484,7 @@ test_decode_invalid_intro_point(void *arg)
encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out);
tt_assert(encoded_ip);
ip = decode_introduction_point(desc, encoded_ip);
- tt_assert(!ip);
+ tt_ptr_op(ip, OP_EQ, NULL);
tor_free(encoded_ip);
smartlist_free(lines);
}
@@ -487,7 +502,7 @@ test_decode_invalid_intro_point(void *arg)
encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out);
tt_assert(encoded_ip);
ip = decode_introduction_point(desc, encoded_ip);
- tt_assert(!ip);
+ tt_ptr_op(ip, OP_EQ, NULL);
tor_free(encoded_ip);
smartlist_free(lines);
}
@@ -504,7 +519,7 @@ test_decode_invalid_intro_point(void *arg)
encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out);
tt_assert(encoded_ip);
ip = decode_introduction_point(desc, encoded_ip);
- tt_assert(!ip);
+ tt_ptr_op(ip, OP_EQ, NULL);
tor_free(encoded_ip);
smartlist_free(lines);
}
@@ -521,7 +536,7 @@ test_decode_invalid_intro_point(void *arg)
encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out);
tt_assert(encoded_ip);
ip = decode_introduction_point(desc, encoded_ip);
- tt_assert(!ip);
+ tt_ptr_op(ip, OP_EQ, NULL);
tor_free(encoded_ip);
smartlist_free(lines);
}
@@ -538,14 +553,36 @@ test_decode_invalid_intro_point(void *arg)
encoded_ip = smartlist_join_strings(lines, "\n", 0, &len_out);
tt_assert(encoded_ip);
ip = decode_introduction_point(desc, encoded_ip);
- tt_assert(!ip);
+ tt_ptr_op(ip, OP_EQ, NULL);
tor_free(encoded_ip);
smartlist_free(lines);
}
done:
hs_descriptor_free(desc);
- desc_intro_point_free(ip);
+ hs_desc_intro_point_free(ip);
+}
+
+/** Make sure we fail gracefully when decoding the bad desc from #23233. */
+static void
+test_decode_bad_signature(void *arg)
+{
+ hs_desc_plaintext_data_t desc_plaintext;
+ int ret;
+
+ (void) arg;
+
+ /* Update approx time to dodge cert expiration */
+ update_approx_time(1502661599);
+
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_desc_decode_plaintext(HS_DESC_BAD_SIG, &desc_plaintext);
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Malformed signature line. Rejecting.");
+ teardown_capture_of_logs();
+
+ done:
+ desc_plaintext_data_free_contents(&desc_plaintext);
}
static void
@@ -594,7 +631,7 @@ test_decode_plaintext(void *arg)
{
size_t big = 64000;
/* Must always be bigger than HS_DESC_MAX_LEN. */
- tt_int_op(HS_DESC_MAX_LEN, <, big);
+ tt_int_op(HS_DESC_MAX_LEN, OP_LT, big);
char *plaintext = tor_malloc_zero(big);
memset(plaintext, 'a', big);
plaintext[big - 1] = '\0';
@@ -654,7 +691,7 @@ test_validate_cert(void *arg)
(void) arg;
ret = ed25519_keypair_generate(&kp, 0);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Cert of type CERT_TYPE_AUTH_HS_IP_KEY. */
cert = tor_cert_create(&kp, CERT_TYPE_AUTH_HS_IP_KEY,
@@ -705,16 +742,16 @@ test_desc_signature(void *arg)
tor_asprintf(&data, "This is a signed descriptor\n");
ret = ed25519_sign_prefixed(&sig, (const uint8_t *) data, strlen(data),
"Tor onion service descriptor sig v3", &kp);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = ed25519_signature_to_base64(sig_b64, &sig);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Build the descriptor that should be valid. */
tor_asprintf(&desc, "%ssignature %s\n", data, sig_b64);
ret = desc_sig_is_valid(sig_b64, &kp.pubkey, desc, strlen(desc));
- tt_int_op(ret, ==, 1);
+ tt_int_op(ret, OP_EQ, 1);
/* Junk signature. */
ret = desc_sig_is_valid("JUNK", &kp.pubkey, desc, strlen(desc));
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
done:
tor_free(desc);
@@ -776,8 +813,8 @@ test_parse_hs_desc_superencrypted(void *arg)
retval = decode_superencrypted(bad_superencrypted_text1,
strlen(bad_superencrypted_text1),
&encrypted_out);
- tt_u64_op(retval, ==, 0);
- tt_assert(!encrypted_out);
+ tt_u64_op(retval, OP_EQ, 0);
+ tt_ptr_op(encrypted_out, OP_EQ, NULL);
expect_log_msg_containing("Unrecognized desc auth type");
teardown_capture_of_logs();
}
@@ -787,8 +824,8 @@ test_parse_hs_desc_superencrypted(void *arg)
retval = decode_superencrypted(bad_superencrypted_text2,
strlen(bad_superencrypted_text2),
&encrypted_out);
- tt_u64_op(retval, ==, 0);
- tt_assert(!encrypted_out);
+ tt_u64_op(retval, OP_EQ, 0);
+ tt_ptr_op(encrypted_out, OP_EQ, NULL);
expect_log_msg_containing("Bogus desc auth key in HS desc");
teardown_capture_of_logs();
}
@@ -798,8 +835,8 @@ test_parse_hs_desc_superencrypted(void *arg)
retval = decode_superencrypted(bad_superencrypted_text3,
strlen(bad_superencrypted_text3),
&encrypted_out);
- tt_u64_op(retval, ==, 0);
- tt_assert(!encrypted_out);
+ tt_u64_op(retval, OP_EQ, 0);
+ tt_ptr_op(encrypted_out, OP_EQ, NULL);
expect_log_msg_containing("Length of descriptor\'s encrypted data "
"is too small.");
teardown_capture_of_logs();
@@ -810,7 +847,7 @@ test_parse_hs_desc_superencrypted(void *arg)
strlen(correct_superencrypted_text),
&encrypted_out);
- tt_u64_op(retval, ==, strlen(correct_encrypted_plaintext));
+ tt_u64_op(retval, OP_EQ, strlen(correct_encrypted_plaintext));
tt_mem_op(encrypted_out, OP_EQ, correct_encrypted_plaintext,
strlen(correct_encrypted_plaintext));
@@ -838,6 +875,8 @@ struct testcase_t hs_descriptor[] = {
NULL, NULL },
{ "decode_plaintext", test_decode_plaintext, TT_FORK,
NULL, NULL },
+ { "decode_bad_signature", test_decode_bad_signature, TT_FORK,
+ NULL, NULL },
/* Misc. */
{ "version", test_supported_version, TT_FORK,
diff --git a/src/test/test_hs_descriptor.inc b/src/test/test_hs_descriptor.inc
new file mode 100644
index 0000000000..70a2c7c2f7
--- /dev/null
+++ b/src/test/test_hs_descriptor.inc
@@ -0,0 +1,224 @@
+static const char* HS_DESC_BAD_SIG =
+"hs-descriptor 3\n"
+"descriptor-lifetime 180\n"
+"descriptor-signing-key-cert\n"
+"-----BEGIN ED25519 CERT-----\n"
+"AQgABl5+AQoPXRnCGEOxIup3AcjQXb8npNiUFm2Qv7A6JKk/K+EuAQAgBAD18iUD\n"
+"nbkUblnUvTHzipq4bcr6aPyFVB42Ptobg4xr8s3VjHiJtjs9MDEdr6nXS7UlyhEl\n"
+"78vsuFEvLp7cvAgGxYY1xGXdn5RdHMCdi8W9yZLKMQX9OuJckmp1C6q+cA4=\n"
+"-----END ED25519 CERT-----\n"
+"revision-counter 42\n"
+"superencrypted\n"
+"-----BEGIN MESSAGE-----\n"
+"BxzghAOjM4De6Z6eGTvBrTP2SJDdQOYV/u9qtvlFsa2FRQWk20Adv3zJ/AI10CQO\n"
+"mUP4DNXM8FWQYGTvmD7wGz2/cXGjKwBXg1qO7zF5eP/D/My1sXsIfCcb41mkheNt\n"
+"xn1I5eKXcnghtd4lw7OkPVjSb/Z+VARUMmf+0qSNgmHLgEVnAoGJsn8W8B4qtIay\n"
+"4h4PuV0jPPlqJx6jMFOOEW72uqnfmqeNvClENXXW60xhnaxsf0up62fuW8ktu6Wf\n"
+"lnX/lvTstBFZZQ8/XI1+G+BPf8TZf7mxu0WYVg1s/KWYasYMSw46as59nkqdq2Ii\n"
+"qJnqHX/R20mWBhgpLse6wO0aNpky/rozEnikaPqyO1DShf6a6jXY8ADBg7spnK2/\n"
+"h7sf1+F1xfi2dy2WGxc1EUMP1kTVUmbft7kOo2nA7+3YZwQuSJHaN/66HrzU2x5z\n"
+"ayRUJ8+qDtfpEf17xthc/Uh253blFK96IoJJiqBfI6xt3IqOdHJq0OOC9zBbF6Rj\n"
+"vKMsaxmc/nc6uOB2WePYSgkZ0qs/dRKBJs6+Ahn1KdGkadyd8mDKL86Oe8lncHdB\n"
+"m/6sQjhKqFgngkCDOIlEJyWizqfN84AGqD5Zyxq0rbsN+9KLsHFfEbCRjgqjO5nS\n"
+"FYSFtuKgCZl2gaYEslL1pIEYE6BD2Whjn/HWTRyWiULJr6SuavgcbxeNEQDuVCC+\n"
+"fm0X7Z+qERaMAMR0vTMJK/NzT4GifrDpgmgbxc+34CtNBF5TriM8aXTNZZlsW00k\n"
+"d0XRxFbbbtiT5VOaEHbny7R3MdTVutEc9E/BhLBvjSSrGX7vrryh6Oj++nthIIzm\n"
+"F4M7I11S0TyA+UE06qF1C8rKmhcqU9MWy1SiccJ9KOWhJ5xwlsXBIID7wVygUhVl\n"
+"ovzfKkDDPfRoBch6NdVkxNJx3gb63CUmC2TzfwOMh973nntMVzqqw9A7jYkro9ln\n"
+"217kHUwMk3e83UgFL4nn7NCf3Kj0zhJ4jSfAsuQpV6e7dhzrlNya0lqrUsY2zFXP\n"
+"xv8wUtg6Vo1KewgVQas4oElkgFjDN8RJ7uBAwfuE/b9NnYJoQd76G8DHei/1PHbu\n"
+"tbtwN9I5RHaTvEOfetsJFnIAkCG6O4CQpzwHu1DdvEP4s6/el10b/4awBJ4VwOVZ\n"
+"YHSe4X0DStTV4Cu6aLh5OvrOmGbieRj6HdGQ6syYCaEBTuxbBUUpjIAfVlReAIph\n"
+"6aOrY6HNcCmeVmL5qm4dKr2XXOREsnUFuMqmfQuQd9pN3zlmS+RqCgSJuFrguFpd\n"
+"mjo6UxZvbjE7yJjtCih38HRe5BaigP5RDRkXmiXjqJ4koLJpyjQh19k3BYGcdxUC\n"
+"RCcYXydbGF7qHlnoaX9HnX7y6ZRsyKQpt91PMTGOUsB4fS8NhsqPpl2gdp4poLNs\n"
+"+hqjWZJ3uuLotXBcgM39Dtq9tqqu9vM12T80UAfWnVEHrBphmukh49EhEr2sx/la\n"
+"kAzRoTbLyTdlGVei8hI7/RtZIaIcOkzlhcFI5zmBlydyrv6/79vzt6WI/w9GVGpM\n"
+"OuSM0NS2CDJ7Iw412nz3CV1pEXB551ZBmbme6NHUe4EtEsDbgkP1Z201H4j51yVz\n"
+"wNoIksE5Bh5XRKuu4We5f9KZb+AEG9kxKJ5DbJk2YGJEQFTyfv0H68pl9urstPXD\n"
+"aMQF806COe2uhGm5gV/skvPVTeEvStE3K8DxZgcWNcTMVk8ZjrUHNfguVVToP8hT\n"
+"Fl4Iqo3r+JZEAGXnAbTpxUVC2Xxspf3jsT5xhUfB/NOexZxrXWnQZ+pscsbow0ba\n"
+"GATtakD3TF2WBqq5WscmOex+lrJcBCWVIzVWdwi5ngAtm1S7efkJlFUvmi4OuYnN\n"
+"RyZfxVIpoer8f2/xPXvxkOWFminDy5sFEvlh2/pnymfKOUV+CKih9ZApt+izlRJn\n"
+"+sMIOW6Jhf/WYyjeN6KQpwi6CDpclQJXA1SVoOVVL5A3lotLjs0x7ThIcBoxCZBq\n"
+"rFBhBu1gJgJ8guMySAHssIvhHHwXJsYEwzWCVAg/zIUXy4PLwIkgHApl+vGcldGv\n"
+"Br5HNCuqQ2pD9z2RvzNneB/LrYB214i+BP2piO5HbmeJBhby93blGXVfQewQT6aF\n"
+"dBlK8/jQM0rvb+LkmvQm2ypOttRpX2kyQXooJHYTTusaUr4jVmgngCvGtgqAQVqD\n"
+"HULXfHWvugZbAh6dXF7gKnnsyDOWwAgy4OJRi8i0jCaZ8aWSFRUjeGKT26dg/ayB\n"
+"U4QfMb8vL8tMdXVBfQLGcBgvrzQYrY69//pV6bX3SbLfUfWXV9eqUVWVPqVyPEwa\n"
+"Tz/aGVnGv/dY8h2cVnrgSXJGlOO+mCwSl+k9nk7VcEaKYuNlaOP3ZlKJvVj1LefM\n"
+"FODh4qTDBo5NkyfKu5fcZcOqDMBeGWXZzltE7CmvY7fOpDNMsuAoXYWI7q9gK82F\n"
+"w+nS0tVFCIWYa9DgGMv9GKTOk4Ia9elkbWypdRE/4oz4QxmHsArEsK4gDI+wmcp7\n"
+"/NsAZeuy96r2YDIUam4uASKOiAqrEfCv6B6cYctdYwZbAEXdo4fkGrCIjNRZmZGv\n"
+"kcZzHzIymnAmKRTkPt/LQ7Rx27Qd/Vt++B3zt2ORFuopqowOP0ocGZtkm0daK3Fc\n"
+"YDXMwIpf6Z8PwvvsG1bQHcSR+cUZi7vK7+hj/LGhMPafHM7HmFUbAxpJYr5CvR6y\n"
+"V1pZQYltT8xWayCeMHlLAAg10RgDkqCnY4dHnrY4GdwI2O7Wpxomni7qVHMjn+cN\n"
+"UTrd7EeVw+dxAIYosuqG7ua7ee3VGoOs+XMLrscAqHahfGbyYC+j+6Tow4qwWBdU\n"
+"/W3NJXnRWaHTXFHllpClnxggPRQx4yPtgTOmBBVl/O0T6i4Bv0ygsJeZAqC3VmAJ\n"
+"QodQTzGf2jwqsZf4uHKQa0EKGQvTGjFVgAFNpHmAuzyqh0b1pq5JeXiFERGsKC3j\n"
+"xcJilq1XeIx4SL38YNuCxi4pnyJyLnGGHpNjdjeFO5lvgCaKPegsPo4hpNpTvBJ1\n"
+"D7+o3E5CqxzjRt9kQmtwBbuH/SQX2T0x8aQ6vhwjj8ftDfw+FbjpMR9zfU0Lf8V7\n"
+"UjVGIl2yiVBGScBZu1nSD83PxjFy3XdFtBYoU5OrlXwBEYQs91jwK7UCiGtjI2Ao\n"
+"ZGkJaBd4AqP6voyJiGnC3LWFcmeMyzfExgiclQwfhFqqf762TX5JwG6xGqtdcNKS\n"
+"k54LlcI/RfvJw3ncSs9YsodZr6Jz5irpRTHX5WwCrX9mLukP96SXo29bIXEZAqEr\n"
+"ZxEcF0zlYE+km5bRfRCRcVVrScugCshSNLOdQp6fOAtHCl7rdQ/8Rz7oHuqieLVi\n"
+"UldRsAmpk9fIfRLphXj4j24jRP0VtL/LoJwakWTa0xO8K7eBAMVITI+HgFfN4wSO\n"
+"Yh1B+bGD5WKxFsWSgBMmW+YLF5ZtxVmmbg7wK2dIpJs4pjg2YO/MTO7SifJ9kjcb\n"
+"bCc74Tjs5mLLGGjGCIoXfda6WXbt2it40XhFk2zUAcPPsgjbctftkaWph7JSZpmZ\n"
+"fVcPqKdhmA1U0LA2XEOMTxGyCAeseH6pJXZm9LdBozc1CwyWP8XEDHHJf35vfPKY\n"
+"JDe2PanFepIOHaoRTgE7ZkGWKzOIKlS0Ucr1ezVfcxiFgQUNM+MYXXbUz51BVVq1\n"
+"Dulg4VvX104nt/ULijcfa/TsE+uklEnkyk1mhavH337NQg38XF4cAngNlUF4nSW/\n"
+"j0jizbAtaSx1f7q6xqPm3zPRlHrGQizHXLyl+SLzDUVPOXbPwcoeev97YeeyB6h5\n"
+"NBbIK9hmekNDmYIwI0bmlrg6IXhC5pyvRe8sQlV+9wBY2liF0M1mq5onW3a55afp\n"
+"+ynxXfQucb1HxZLXvRIGMBgWSQ7HfIPASqSE90Vu6qQCfkOW5PDqONr4BM65V4+g\n"
+"AYsVEgaosgHw9CF7yKgkvmZpToOtGpCHVcdUeeY2/rrQnAQeSy19gj/baJ+OKl6Q\n"
+"i1EGU8Yqo2r0d4XDFp/eKgC4sv57qp1PwkYQ/HKqoelJ09IAZL2sQWc05BGwt1A0\n"
+"11qDIEdkZBjzK3qUnY3QlOuoZtALZrnPg56SlF1RGDOPqbcF+3opqsvzBoiikh4V\n"
+"WV5OUYjRDMUDLQqf/OkuktdYf5N3RcbYP0XsAvY0ZWG3Gp068b3p8peCpkDzrF9p\n"
+"bQ2ZvS304tN7+p0hif3+JyZy5/sxl17RxTeg5I3mo2+J0ptQDYwF/WadONO8r7uU\n"
+"YlRltFtQfyMzyVzHON4NHGjZh7dDGtWp0MGeHRBHQsC8bEChhvWme19VXhgZoWpl\n"
+"dUIZkSuvRwiURXjhKbZrEdJbVmr9FX6zoyOahv3VnmcEARoR+umxzvo3hGQPbHyH\n"
+"jTsQtSBjs75/9fCxcYmBWkh3JHVDVsCbV+z+5KZpk3m50J4Y1hC8hvepC9CaBqOM\n"
+"DjfyXh58x1yKiueEbcjSWsRuF7CjcrYnFUBHOs9U1j9WytCI3fhOWPMgR4UZpGuU\n"
+"WlcR1BXg1wYxX273xOS/jYn9MLAVlbRpPTUMIH9VRP+sc8+XaxKpJSCl4C+vcwNY\n"
+"1YdKD2QiuoBJ3fXGtqMVRtn9eZvatSJuY9CnRKRbf0hWmFD4D5RkiwE0WkdtwoHR\n"
+"uEXJ47RlF0/JDU1fY1mXBkq3usvB4Absy78qL06vh45xkk9bHbdf+7Ao1RQKmqiB\n"
+"NL5XnjBu+YX535WG7t7Su3mTCJXYHvn72ATxry8yhSLgWqt81STkRwc14HmrOGG8\n"
+"Gw7bz7y5vikj/rnPyr7ry+QRgNNDDayAqenAu2vEAzWir0RQC/iZ9rc/r7YQWGgL\n"
+"Xrd4TQ6rTZePARhwB3VomnLDDvLvi2oq/jPzLKSYM2a7qj/vBSbJ/NnNaDW5Ccew\n"
+"RjMI1lIHeedqYTVAW/CKoSEPcFSAzi/Ija0gcWLgX5xsFDGIYBepAX0KS9426kMu\n"
+"0r/V66zmPMusMilqRTx7KW+jZMVxXVc2zClcdmohMmtjsbqLkczprfSbdGswMv9Q\n"
+"I1ktHJHIRD0vPeZXnvKZsRKZw3sKb0ltZi33ZxCJFQPeGGtM5aAFthj6awcXy6Tt\n"
+"DPUQdCU/vh1zmGRAX17/Xb0irfvN+GhQLEl42pzhigJXc/rCG3a4Na8wT+xAIZVf\n"
+"WUI7hMslx5wA+iB4lrAjCq0YIrjINI/lHYpotXUZGmz5wz0jOciTmXMSx9du4cpk\n"
+"fIQJfR+fr5tG3fjHMgSP+p+RewHkd/7RUAmHC2k3cuk5pCJvUVJrhUIqsi1fa0LG\n"
+"GA0UU6Nr9tpYdNr1WkbKQjxTg0D//AXe61jmUS5XUU4AQf6zQVfN0TMtmuYeacbK\n"
+"4r6Z1CSIRbsgcnL1BN8GSd4KddkCqSk941aJUCoX+77ou4t0btVSB9FnLKipigtE\n"
+"E/Rpmv+81lA4fLiIag62/pcJ3uppsZ9aaHdR10SMmuCjAVLYHqhJfrHHn32dyqLK\n"
+"UI8kEZJ6GQzHLUXcGbbdnk1Qm6JwO8TeF/oQvh9y9py+oAyFy0qzP2UeUMUI2yRQ\n"
+"mlWSy+wX1DbVDQ3UHwJjWp65CgyYXuW8eCB0AbyF0kF4KGf7/7Ae7tEGbmYSm5MA\n"
+"71z+Azxtv5gRyRb787V2dyo0wcmbRlL7iUBVXNM/czQo31tAZIwLc+lKNp0SPH6g\n"
+"gJ2yX/GeDSFNAeEVUZ/f4KZIa7QQsnGWrUr+agSnQFkySmIjWYjwC/abJwah0v0d\n"
+"ulwr3tECaaXtoWVdYXa3utEclBz9umBwMJ9MQCm4Kx7dTYUWFT3bMM/ESTkGPcfm\n"
+"m+C4FsqFBs80WY0ududu50vTDSdJt1RqZ7Sg6DNH6acBvWyXOpT5mPJKUjnSFwyG\n"
+"oVLgv0aDDx7lLZdCkhyz/Ff5LNmBgQsjGllPszJ2gTZxZ5LD68S4kUirQG/qtzlS\n"
+"PGfDOC79SMZGgsoAnr4wV3RUTxsTVFlxVHsBMB+EXOFHAr3wHTVxUGBbGzxBlQ9w\n"
+"I/jlu8LIIexXAU75HS5KCGGfg0Z7BLqEzqpMKqcBQC7BD7GnCXrDSQ2DCXnl7bLN\n"
+"lIrQ/z2Y8AgSdED46R40MqyyN6CPPNiOCjONHZ30fLEXuEgCp4R/+x0WWsWpjGk2\n"
+"Ydkc03cx/X6moUYxB5HTqTodBmAQuWMX0rxFDrnR0SWghWjdWth9gjd+dvZ82tt1\n"
+"UMUywDPhcYchtUi2lnqnYJm5p00GN9Mk14MC5ZC5qP57IJVqxu0ktOMpks+CLPnz\n"
+"qp9OBpI4sIzd0y0aUJC2Gd+E9aAhlREIiicyBDmxLdk1i37QeeCralI3eubLNmE+\n"
+"CjDjD8t8FUGPpKglSD3lfLTqbp2TUvyWfvJC6ulFPNsAbeLHTnPnpyPQmWxhMNGt\n"
+"h67B9tbYww2TvNwqIgmB4+YIR4/pSs15TpAqvuUvjpmRwGklqgiSmrQrlIxCxux/\n"
+"mfsaL3KE97wm8BsaMpMkjUL7ByTIFhFZ/gHPTxaFpbqTZ4G+lABLgp3bIsB9Dl/P\n"
+"ovoqX+qL2Mq9T0GrVJGfRBuA5hISw63hx5zdsj2Cj3A3khHPqR+GRN/rVYUuOpLm\n"
+"z3v5pU/74vZRmNMAIhyhmweSEPNtyVkgSdgbFErqvhxN0om2Cd/7cWh2g5BXHyUL\n"
+"PBr7ZkgfsE9TnuDH7Z0JoBqXJki+MO6nqz73oH2Mm86yxcXp6O/ieKTollrUJ3yQ\n"
+"P6hLcEbYPzUV99del7Va5Wi0nn0wbRXCGVQdwY+iWc7pT+VVlncyg0TvLXi0OtOt\n"
+"O8xbT2DAzVXxMwOsKV9ZgS/0dtwzwICpnTzBI/47V8GYhHbOUNTBPZ52GaXMeWlX\n"
+"cuRGb0+7OkKWuriyOQ5z5xaASCVfqgnOwSZYiAk0gcDoK+JHdr64/sMoJhH87R4i\n"
+"2TO90whkScgiGR7A06Ba42bT1nJtI6pxvzdB2b4BDAs2Lr2OdcB3BY1dtzKjFkw/\n"
+"qfIw3F55UQwcs84ZEFQDAB/tmfNHajblDFpXR4N5QvU/PdWVWJUub7oNyhIX6ruu\n"
+"ln4H7lpTUHJZ7jkr1qpnvkztZtHGlpJ0QdUHgyMYER1xU58Hg77yzIW3EdAa2PyK\n"
+"1t4udKbQKChShlShIMzwzj57ss/69QobrpYAHYi6IRMaMUGBfipGBACK3yeXsXz0\n"
+"c3Q2J5vI6QbxNsiJ5t7Ry1IqotbJcU7HND/yVUAUbEg5CpEDOSeSOW/ulyLuFxEV\n"
+"lRTwIO/68BoIoR7umlP23/1N5OYzaBHhH2nThILBovHeJRXnGXSgeFfwSj7LIYEV\n"
+"c1MdDSg/HzoADPXyEPLzqFzHRHeNiqEolmOPnFh0hRzbMZ0W5TQPDGWJdF21g816\n"
+"vA0WW4UQjLM+vnX9kKKLA1ut+9JWk1dGKsmWtdWUDfJjUP/L6dS4OYEl6O6+SjM9\n"
+"GcyGvHTiC5OpJllYpvELP/NjtTf9or8Bmruuga/axeOuS5ocYLK/sGRlmO6Z96da\n"
+"QSlyGWEQAnM2D1cDmdd4CetPslOVIcQ41+coWCi2xg3UjO/bFK1CA4R1rb4ekXfs\n"
+"s5U2XChyHhUPgl57y1r0ILXRXWJTJ0/F9hhu4aYQVFeIV/IuzJbmTKKkAcCOH6ys\n"
+"qnu2BXz8Pm2tU10JFfRcuZ8rHuUyUErA40ESsLijON98GMwL4Rat9ZSCNS5hlK7y\n"
+"yRJdr0ITp8oTbduAoulgWOvtcw1L87QBVojWz3cbhXra+WITirYuGNbzfmZn1WQM\n"
+"kukEZUEHSypGOrHr1XiuY4Rw/DBaJSLyZ+VybEOfXqXkDBh5s1ayypBvzrzFZCIn\n"
+"PJxIVsvrkhrpEbTJ9d7zLWjhOa9ZWw8lAubllbGm+7qCfdHmGsfBtvJdzx6zhB1Y\n"
+"otL/PCis2XVTBEDJeB8pGqKFOZjNz8PC5qP+ymtAfy2ktl/u4HsFlxV7CsEKGYPm\n"
+"p3LqnhPUy5M5gin4E4uPPyzzD2kcM3way49FKWUKlblQU0SyWtHRmMB3vcVmyT85\n"
+"BRULXF7jgog7XR/EMltwQyJI6GcUCrnWZu+G0BEwXG+CsgCzE7assDavc1NSGLZM\n"
+"rmzXiFFyfk7CE6lW2Lm+oWaFwKdvpmNZJFGGX8ZHRE9ZvkFMnfw9MYf2W7xa0jf7\n"
+"k3c6X5wMuk9mznVtq5itNFVXh1mT1ujeWOiiqyH5UhQQjj6O+ZXt4gqt/jT6dd1i\n"
+"jRuhhxaUGOlhpVBW/ySXhZ+HgOy9aCJ/bgjRGaqGixogk4f4rcgigHruwTpOQuDn\n"
+"xDZ3Xns70S40WtHSYN+Gbl9nIh4yl78aNnA4FVtTAuLlVKEKlMJi9OBFuP5TEczG\n"
+"+0HTwL/VPSCI+8FUZBhlz3YwecYq6dY5mS46+luPW+5Wl+5jtzb8V9oxVnRx2hQq\n"
+"B5HJsM5FOOhHDHMXoCsevj7N/ufK7cU7Wbr0DkgYRwvb0ZJB5WYgcaQ0W7aduhGb\n"
+"MQsandhP8Ajb2cmLobi3mHHPbcEkvjT8JP9Sim5xtfF+oCMMB5ByA5bI2aIFybZm\n"
+"jX9e/V8wNgtpDKDVKPjB3+9dj5gU1N5JsrjQwQDB0kVRMWdpJCtD4hZ2+T/QE3SI\n"
+"f8Rdk8pj8qBzRPbnhW6qsoWZdjMRC8qixZqHw4jol09UF7Ab9hjEF5ZDTfNGXwy8\n"
+"/hz8su+mr8hhrlCrOF2vBYUayAA96zhbDWfg3Pdxo9bTn3/DmyAngL4J5Gu679xK\n"
+"rWN4j7uQG4bzTa8WJb09/lW49UzWvmrz0c6/yexk3T//xDD067FafdnP5pYs4Cvp\n"
+"rCoHpXbKjxx99DJmb5iXW0JRLSpFSCbf1HPHbmzST3minSXap5FCWDJcSgExKIJp\n"
+"DXZ9rk0LMnQA74MWC5gjjM+5t0AHKuNRhJbQSwYWTKqeApXho53T/COlfDlSs2tb\n"
+"Vz1Ia5z7IOfu1QheE93huNAHT3Ob+mSmUq782SqFPr6uwud/l5uP3HpcuwugdlFm\n"
+"Jw8uBBOQ53W4lLbYfQYTVgieClVhmYMu7Ye0xYZ5B2jf714sjZRMa0LCbsyj58xH\n"
+"uzs8ddNN1fLMzb0JRBE8JWj5PbxhA/sTwMkD7SnEMBUTtP0obmuQ982aTfyvQCH/\n"
+"ve8OUPtYf5XWNv18mpR+h+riMt1Y8Eb6BJzTMFNWagMJAe3JV6A6upHroNFo2FxY\n"
+"1XPRM1Rt0zKo7GD+oXnixfpl1aG8yqZhYo1ZC9buaHwH6zvM+xoiGD0iujeDtpVy\n"
+"Vp6cAqqaGmrNwcPVBLc7hNKrJnbFKyhjL5/xp9j6jQov1aWQ8HsaNvh0p2ljmlwb\n"
+"daTYZcwLgSgPna7HhiqnOSAmXZ7St/qe/b9TqBtIVzwzmtevgMyG98QV0syFP5X6\n"
+"2Jc1g9733sTZp7njq4Cu07JhpICpinhLWR3nkODJbjk/mpLcQZgtV6W749AUo8oT\n"
+"jRVEJ8MpCo1h0bVDxsRnA3DrMneD88L8/b10aHs+bPm1HKbCmT+kJAFaUQNa8JvJ\n"
+"pReN37qTWvZCte7vaPAIP5cboATMu/J4t3izpm+YJoJlWcIegGx3kQ+17P4MbgDl\n"
+"S93U4sOLvTk9+MoyPo9yGWU/zHgzcQ6wCFdzWMDRswuh+/4TJ2+yg6maq3iBtj39\n"
+"gNLMR+sRgGGvYisqE9bfvNQy5IWrABBKcSBTXeTM1DmW6jv3TI8DoCzCbpjqcIwT\n"
+"u2J+7k8wJEHPcAwnBjlyWphVvwNwM0cXqOnlJZ/4z7OGgjiNEem7TMuvxk+YkiXK\n"
+"OzftdTjeIpzBwsGRP8/teMBpjS95M7GloKtxO+muBVxXbmsq8GBRC9vtNJ2Ma/xP\n"
+"bXvd+7caytD3ob6ZfOzCpi4ZS8uByEfIMxlgZ5Sn3jhgEkcIU+YW9b3teMZOuWdA\n"
+"QpDCoMpXaHVyRqwVV59JjmftiBnNBEo1/QzRj2UxRi7fHMfmNxL5LRM4CHSLUSCq\n"
+"Y3A3pkxvBHUzemhynSFvtCPa8GHiUpe9so0V/2hlgaENAVELPjMlWytaYufRllgy\n"
+"tUnCd32C5PrrmYzMKnxKRPXLcxLgziruJGSks9vIspoPk0pWgkZm+M9fRpJKlWHF\n"
+"yT9OOGBW2yynw/yvXssxJmdUDxVcWL4uS2bZc4s0Zc6RSL9uQPjZVX0JLj+cXfx4\n"
+"93Gn5bDhMgm+CGM6j3RiAAD7tT5V0sytNFjXd1A4U1u8yj3wzhKqOtZpDmuGUlMn\n"
+"EODu7I5KtWxOTPThy7TecI5r+F/6KL+2MOtRhj2PmlT/Xed6PaAmDkQeiXGps08x\n"
+"u0JIpuB61axvT4PAsKZNUd4ExbzNxRDAARUMgY8krpmyKZyHVFIQ19uHM2lGl9/i\n"
+"h3PKlLHYI8RsHutHElzq+F5tWd5AA99LVRZX4axAVIQNiqRg8IMSoCwUaCCbjUMz\n"
+"sJCo2t36GYk5S2BRnfrCqYoZRHw+ENYN0tDEMhXq1OqjvNHW3TzL3DsUhM6EZU5n\n"
+"cRR4ynUvPqqWFphLefRW10vCtaW9roJQZyFYf9kd8xgW/BhcDNbTTaQ1U6xCHgX+\n"
+"78DKee/NvY1WIEBR8X0iVk5XlSJb14eRtxNawXFyebVdmC/DiMNgnTBncMbePnZi\n"
+"KCl1r5xqo7tSIoJ6Z0l6qINd89T9fcg9mujTVwsfQ+5/kdEy0Iw7CQcTOGvMaoPX\n"
+"IAJlWSVeZ8eu8kmsD1Z8ewoPufMKiY4cPRAK5bCDgsrK6bAExOlCwPnNNM8Ym1Hz\n"
+"aYFeGs5sW468Qww+Nbl5xcNFKtwUKZ6EebRHjwttiyTgCdAhv9wL1u2WFydWWgkG\n"
+"rwUbNpSLKls+pijCeJAscvxzbZz96iOaYrY8IyzGBFwfgFAESfnzBc8SQjZzMzoO\n"
+"vmYIRon2m/5w5AZA2IjQ4VxXJDK6XExD/ZLsxNXzMnROD++hE+s8DvPlRPmN4egF\n"
+"gAzJs/9t7IyE/dDf7gSSBqzEBbwduD8ozzYHwELUc4ERdRzjEdBM0azT61g7Yilr\n"
+"iT5Hy+2iw/pNwiqVOYiAbj2lwcoMlFZmdxviD4IMXdsNVWsCAVJL0PqIh1UDDb3z\n"
+"Urv3idBJeSBuuFr6AFS6kAgvrwV/pEGoBoHuyii/rZxVugGKeuMynKEvSHuFNuQU\n"
+"qIHcNgqQR34v2Ut5pQ1R8s7K3Rae/AhE5GncJa6FJmB9TF8MYMu9PlSZV/eGv8UL\n"
+"IDWQ7sY3NdhZini//xtwPqIw29yOeZ0X6Aqsek9tfh21UwKSpHb7T+PwXYmoB+23\n"
+"p3FXkP/rv4AGRq1xJqFYzKJvwsXqTFuNFWP74yhTg6rC90w2p5TeH1rJMAnv4u0L\n"
+"hGtG/NL+D1Tzdf00TYAjno5Ia5dQJDd/eO+Ygqnhl6hAqGtS6r9JhIEXw1nQD7SC\n"
+"lj96ZuKdUWO8rpIiAtvHAsn++xvMVPm/S1SwA8oE049iVwS8/eNNiMKoSlTlYc7o\n"
+"pusBZQrVF4We4HHYFjysBbcXlvoXDd8LkZ8Nh63VQPnoIGNKH2U6aXCnQcJ8dZqO\n"
+"DNxL4uyM4A578FUUR6vxqt2asnLHQ0Z7pPE4uqtz/WgbiHI/i2oHS8oe1clsifCw\n"
+"3ZY33kflqLftkTNka1oiftDb0OqFLjkS7/AUorqHazw53gM3gqJY5EXA3Px9+nhu\n"
+"NzxSK/t41JoCfgQJHMkIWb3yUcO4OFZeGCeAxIJY95hv/brt6/WNielXjNaohYvc\n"
+"lsSUHEJRHwVxQmWK0LS+g13HAgOI7cNt3MA8sSkzTneHGFgEvmrSyb0wCEmushC9\n"
+"mjQThvaxfQk9douA/cR2bHr7axXqv9vjztmxUr0a30a7lvLMBQbJmFtJJylW+tJe\n"
+"v/vKNOB+9mK793cttr2JFnMhwUKFKWiFDQJtxw/eLQWY4BJ19Rs2x4BJgmV+u1jB\n"
+"zR8uvxuArG/cqVEJsoC6uuSzhAWSwdvumijO6yuyWF6nHY6aAcy8dyFQlDFHAd+/\n"
+"J05Lrbzj4N9lcI7hPalh0uMdERGvtUdT8QRm5ebP1zogYEkZk/1GOU29dMawkAt/\n"
+"SWhp2yWdjLt8f5HQKu72vUF/yyTfzfdqQqJwfthP7+vp+sHDO85AMF45uU9g3pxW\n"
+"IbXSbZ4fFGC1/41db/2GOHFgaheMXj0SIWHqQE1jtihr3BBBO4b3Ccz5QCnrn48J\n"
+"8L+QRdh4a/cAx4ty/oHEiXwpSBBSFRl5+y2NijC8GITA5dRjCRWP+Y0zuTrJ7j1a\n"
+"h+3kGs1kxqskhaEuhXnXyknGLjXrU+ewRGhHzP23o5betVhX+c1XjVqmJNZ5OPn/\n"
+"wrqx/XwoIl/3F5lMmGDG9mPtyg0E227nKl9Sy0Vbwx2tu1unjOlzSCa7lpoD4TIX\n"
+"PBJ5+Zb0CE6HEt3V0ec1m4uUe/xObAnzyr4UbzdqLaMy8vTcF/qsncXyPBjwqdjR\n"
+"ReDAtt99bAPY4roPKGt8dgKUPE0t/XoY+SlmUp75TkZDXrOIJXpEW0GpLPf53T+W\n"
+"Ex3KtfLAnZzrw8+dIageY7IgoQ85h3sYE7uEI8QlcO/o4udqUzTp4Sn4sWvdTLrx\n"
+"W7ImvK2rsU5ubVdsEaFKM7+7nxGn2JyMpIWFz0SbP34CkXHhrXxyRD+GhMIDHFxV\n"
+"uBnZnjJsw+ooIm1rL4I7/VMWEwmVegreT6w9Gsmb5igw+zu9v2YBgTOhysA9XZd4\n"
+"7O3VjqKkhTXcBqdpRWuz8gPQ+4rfwij28Gg2alG04Eh3G3868NOCFJhhaHVmwYR2\n"
+"ygRm6N9eDW1bHhYSN75HSEb6aIebk+1AT4S1QtJaPSH0EduIXO++JYAs+jIFKy2c\n"
+"jCVFlO/LbXl7iCdXurJHpSbMNmZFNUri6zEolENODLwke836jBOKiVrWzLnEMxHI\n"
+"WDDTpLTYhR3C7sEprpEQm9SX2Eik3WxVb4ZTb7SZFU1y1d4tWnjGu3U1D+vO9wVq\n"
+"Sss9lDipbkhQ9k4j1/Pqozaxvi8lYLbh3WEjK3Iwpr66Bk6Ai2oRg4b+7vzV4o+6\n"
+"L47JPJhajdHac0CIlmupyA4eejECS6OpoLDf5Wr/616k3dxM//3kAWGUnXVw9GSo\n"
+"UF5W8AaKlaGZ6EZk09NyGSFRjEs18z+g5ckviGF0EhZI7ZPWQQmlqWUsL9O0S4GO\n"
+"ZZ9f0UhNmHEspcugbs7e1yfjwGVyxIBkrmxpkmfHE4Gb47UGlJevg2OvZOPT3wMH\n"
+"vOds2BtqdT3tuss9k+7hsISGse7isEOb7TN5MHb6yyzqnCUZhp5m3Iag7TUkiyfU\n"
+"jKH5R13tHqKUoJ2rofWoLO2H5xSfp/lqF9sLd4rJ+Pbjhiuvfwz5copYsuTNL4kB\n"
+"SPUikHlTxSOgTBYNV77qxpsqOI3+iziCrSqHsxNdlaA1T3fiq6SeZBNdD822AYm9\n"
+"L5hbcgpDPEEwT/n5kWNbRNueerJkJwboaOnT1ZX1601Pwj5QDi+YM1NYy5PsdWxb\n"
+"bPGpQyZ+uf917q9gV7Ykr5cic10YD11khAghr0n6fYfb8Ijc22uP6m47KItDqQc1\n"
+"eFym149F56B0yg5FR85Arg==\n"
+"-----END MESSAGE-----\n"
+" signature Of+jvQKzH9ot2NV5twlDO2CFbzLSB4absWTwG58TCHb+TWgQi3z6SZIoTnGGY/uicJgEkCN++bZZR49GiyHyCQ\n";
diff --git a/src/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c
index c6197875b5..2cce8a3703 100644
--- a/src/test/test_hs_intropoint.c
+++ b/src/test/test_hs_intropoint.c
@@ -17,21 +17,66 @@
#include "log_test_helpers.h"
#include "or.h"
+#include "circuitlist.h"
+#include "circuituse.h"
#include "ht.h"
+#include "relay.h"
+#include "rendservice.h"
+
+#include "hs_cell.h"
+#include "hs_circuitmap.h"
+#include "hs_common.h"
+#include "hs_intropoint.h"
+#include "hs_service.h"
/* Trunnel. */
#include "hs/cell_establish_intro.h"
#include "hs/cell_introduce1.h"
#include "hs/cell_common.h"
-#include "hs_service.h"
-#include "hs_common.h"
-#include "hs_circuitmap.h"
-#include "hs_intropoint.h"
-#include "circuitlist.h"
-#include "circuituse.h"
-#include "rendservice.h"
-#include "relay.h"
+static size_t
+new_establish_intro_cell(const char *circ_nonce,
+ trn_cell_establish_intro_t **cell_out)
+{
+ ssize_t cell_len = 0;
+ uint8_t buf[RELAY_PAYLOAD_SIZE] = {0};
+ trn_cell_establish_intro_t *cell = NULL;
+ hs_service_intro_point_t *ip = NULL;
+
+ /* Auth key pair is generated in the constructor so we are all set for
+ * using this IP object. */
+ ip = service_intro_point_new(NULL, 0);
+ tt_assert(ip);
+ cell_len = hs_cell_build_establish_intro(circ_nonce, ip, buf);
+ tt_i64_op(cell_len, OP_GT, 0);
+
+ cell_len = trn_cell_establish_intro_parse(&cell, buf, sizeof(buf));
+ tt_i64_op(cell_len, OP_GT, 0);
+ tt_assert(cell);
+ *cell_out = cell;
+
+ done:
+ service_intro_point_free(ip);
+ return cell_len;
+}
+
+static ssize_t
+new_establish_intro_encoded_cell(const char *circ_nonce, uint8_t *cell_out)
+{
+ ssize_t cell_len = 0;
+ hs_service_intro_point_t *ip = NULL;
+
+ /* Auth key pair is generated in the constructor so we are all set for
+ * using this IP object. */
+ ip = service_intro_point_new(NULL, 0);
+ tt_assert(ip);
+ cell_len = hs_cell_build_establish_intro(circ_nonce, ip, cell_out);
+ tt_i64_op(cell_len, OP_GT, 0);
+
+ done:
+ service_intro_point_free(ip);
+ return cell_len;
+}
/* Mock function to avoid networking in unittests */
static int
@@ -122,50 +167,43 @@ static void
test_establish_intro_wrong_purpose(void *arg)
{
int retval;
- 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;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ char circ_nonce[DIGEST_LEN] = {0};
+ uint8_t cell_body[RELAY_PAYLOAD_SIZE];
+ or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
(void)arg;
/* Get the auth key of the intro point */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- memcpy(intro_circ->rend_circ_nonce, circuit_key_material, DIGEST_LEN);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ memcpy(intro_circ->rend_circ_nonce, circ_nonce, DIGEST_LEN);
/* Set a bad circuit purpose!! :) */
circuit_change_purpose(TO_CIRCUIT(intro_circ), CIRCUIT_PURPOSE_INTRO_POINT);
/* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
attempt to parse it. */
- establish_intro_cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(establish_intro_cell);
- cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
- establish_intro_cell);
- tt_int_op(cell_len, >, 0);
+ cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body);
+ tt_i64_op(cell_len, OP_GT, 0);
/* Receive the cell. Should fail. */
setup_full_capture_of_logs(LOG_INFO);
retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len);
expect_log_msg_containing("Rejecting ESTABLISH_INTRO on non-OR circuit.");
teardown_capture_of_logs();
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
- trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
/* Prepare a circuit for accepting an ESTABLISH_INTRO cell */
static void
-helper_prepare_circ_for_intro(or_circuit_t *circ,
- uint8_t *circuit_key_material)
+helper_prepare_circ_for_intro(or_circuit_t *circ, const char *circ_nonce)
{
/* Prepare the circuit for the incoming ESTABLISH_INTRO */
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_OR);
- memcpy(circ->rend_circ_nonce, circuit_key_material, DIGEST_LEN);
+ memcpy(circ->rend_circ_nonce, circ_nonce, DIGEST_LEN);
}
/* Send an empty ESTABLISH_INTRO cell. Should fail. */
@@ -174,20 +212,20 @@ test_establish_intro_wrong_keytype(void *arg)
{
int retval;
or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ char circ_nonce[DIGEST_LEN] = {0};
- (void)arg;
+ (void) arg;
/* Get the auth key of the intro point */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Receive the cell. Should fail. */
setup_full_capture_of_logs(LOG_INFO);
- retval = hs_intro_received_establish_intro(intro_circ, (uint8_t*)"", 0);
+ retval = hs_intro_received_establish_intro(intro_circ, (uint8_t *) "", 0);
expect_log_msg_containing("Empty ESTABLISH_INTRO cell.");
teardown_capture_of_logs();
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
circuit_free(TO_CIRCUIT(intro_circ));
@@ -198,26 +236,21 @@ static void
test_establish_intro_wrong_keytype2(void *arg)
{
int retval;
- trn_cell_establish_intro_t *establish_intro_cell = NULL;
- or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
+ char circ_nonce[DIGEST_LEN] = {0};
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
- (void)arg;
+ (void) arg;
/* Get the auth key of the intro point */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
- attempt to parse it. */
- establish_intro_cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(establish_intro_cell);
- cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
- establish_intro_cell);
- tt_int_op(cell_len, >, 0);
+ * attempt to parse it. */
+ cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body);
+ tt_i64_op(cell_len, OP_GT, 0);
/* Mutate the auth key type! :) */
cell_body[0] = 42;
@@ -227,10 +260,9 @@ test_establish_intro_wrong_keytype2(void *arg)
retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len);
expect_log_msg_containing("Unrecognized AUTH_KEY_TYPE 42.");
teardown_capture_of_logs();
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
- trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -239,26 +271,27 @@ static void
test_establish_intro_wrong_mac(void *arg)
{
int retval;
- 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];
+ char circ_nonce[DIGEST_LEN] = {0};
ssize_t cell_len = 0;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ uint8_t cell_body[RELAY_PAYLOAD_SIZE];
+ trn_cell_establish_intro_t *cell = NULL;
+ or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
- (void)arg;
+ (void) arg;
/* Get the auth key of the intro point */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
- attempt to parse it. */
- establish_intro_cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(establish_intro_cell);
+ * attempt to parse it. */
+ cell_len = new_establish_intro_cell(circ_nonce, &cell);
+ tt_i64_op(cell_len, OP_GT, 0);
+ tt_assert(cell);
+
/* Mangle one byte of the MAC. */
uint8_t *handshake_ptr =
- trn_cell_establish_intro_getarray_handshake_mac(establish_intro_cell);
+ trn_cell_establish_intro_getarray_handshake_mac(cell);
handshake_ptr[TRUNNEL_SHA3_256_LEN - 1]++;
/* We need to resign the payload with that change. */
{
@@ -269,26 +302,26 @@ 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 =
- trn_cell_establish_intro_getarray_auth_key(establish_intro_cell);
+ trn_cell_establish_intro_getarray_auth_key(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),
- establish_intro_cell);
- tt_int_op(cell_len, >, 0);
+ cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body),
+ cell);
+ tt_i64_op(cell_len, OP_GT, 0);
retval = ed25519_sign_prefixed(&sig, cell_body,
cell_len -
- (ED25519_SIG_LEN +
- sizeof(establish_intro_cell->sig_len)),
+ (ED25519_SIG_LEN + sizeof(cell->sig_len)),
ESTABLISH_INTRO_SIG_PREFIX, &key_struct);
tt_int_op(retval, OP_EQ, 0);
/* And write the signature to the cell */
uint8_t *sig_ptr =
- trn_cell_establish_intro_getarray_sig(establish_intro_cell);
- memcpy(sig_ptr, sig.sig, establish_intro_cell->sig_len);
+ trn_cell_establish_intro_getarray_sig(cell);
+ memcpy(sig_ptr, sig.sig, cell->sig_len);
/* Re-encode with the new signature. */
- cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
- establish_intro_cell);
+ cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body),
+ cell);
+ tt_i64_op(cell_len, OP_GT, 0);
}
/* Receive the cell. Should fail because our MAC is wrong. */
@@ -296,10 +329,10 @@ test_establish_intro_wrong_mac(void *arg)
retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len);
expect_log_msg_containing("ESTABLISH_INTRO handshake_auth not as expected");
teardown_capture_of_logs();
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
- trn_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -309,42 +342,42 @@ static void
test_establish_intro_wrong_auth_key_len(void *arg)
{
int retval;
- trn_cell_establish_intro_t *establish_intro_cell = NULL;
- or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
+ char circ_nonce[DIGEST_LEN] = {0};
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
size_t bad_auth_key_len = ED25519_PUBKEY_LEN - 1;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ trn_cell_establish_intro_t *cell = NULL;
+ or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
- (void)arg;
+ (void) arg;
/* Get the auth key of the intro point */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
- attempt to parse it. */
- establish_intro_cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(establish_intro_cell);
+ * attempt to parse it. */
+ cell_len = new_establish_intro_cell(circ_nonce, &cell);
+ tt_i64_op(cell_len, OP_GT, 0);
+ tt_assert(cell);
+
/* Mangle the auth key length. */
- trn_cell_establish_intro_set_auth_key_len(establish_intro_cell,
- bad_auth_key_len);
- 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);
- tt_int_op(cell_len, >, 0);
+ trn_cell_establish_intro_set_auth_key_len(cell, bad_auth_key_len);
+ trn_cell_establish_intro_setlen_auth_key(cell, bad_auth_key_len);
+ /* Encode cell. */
+ cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body),
+ cell);
+ tt_int_op(cell_len, OP_GT, 0);
/* Receive the cell. Should fail. */
setup_full_capture_of_logs(LOG_INFO);
retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len);
expect_log_msg_containing("ESTABLISH_INTRO auth key length is invalid");
teardown_capture_of_logs();
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
- trn_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -354,40 +387,42 @@ static void
test_establish_intro_wrong_sig_len(void *arg)
{
int retval;
- trn_cell_establish_intro_t *establish_intro_cell = NULL;
- or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
+ char circ_nonce[DIGEST_LEN] = {0};
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
size_t bad_sig_len = ED25519_SIG_LEN - 1;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ trn_cell_establish_intro_t *cell = NULL;
+ or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
- (void)arg;
+ (void) arg;
/* Get the auth key of the intro point */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
- attempt to parse it. */
- establish_intro_cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(establish_intro_cell);
+ * attempt to parse it. */
+ cell_len = new_establish_intro_cell(circ_nonce, &cell);
+ tt_i64_op(cell_len, OP_GT, 0);
+ tt_assert(cell);
+
/* Mangle the signature length. */
- 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);
+ trn_cell_establish_intro_set_sig_len(cell, bad_sig_len);
+ trn_cell_establish_intro_setlen_sig(cell, bad_sig_len);
+ /* Encode cell. */
+ cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body),
+ cell);
+ tt_int_op(cell_len, OP_GT, 0);
/* Receive the cell. Should fail. */
setup_full_capture_of_logs(LOG_INFO);
retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len);
expect_log_msg_containing("ESTABLISH_INTRO sig len is invalid");
teardown_capture_of_logs();
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
- trn_cell_establish_intro_free(establish_intro_cell);
+ trn_cell_establish_intro_free(cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -397,39 +432,34 @@ static void
test_establish_intro_wrong_sig(void *arg)
{
int retval;
- trn_cell_establish_intro_t *establish_intro_cell = NULL;
- or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
+ char circ_nonce[DIGEST_LEN] = {0};
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ or_circuit_t *intro_circ = or_circuit_new(0,NULL);;
- (void)arg;
+ (void) arg;
/* Get the auth key of the intro point */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
attempt to parse it. */
- establish_intro_cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(establish_intro_cell);
- cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
- establish_intro_cell);
- tt_int_op(cell_len, >, 0);
+ cell_len = new_establish_intro_encoded_cell(circ_nonce, cell_body);
+ tt_i64_op(cell_len, OP_GT, 0);
/* Mutate the last byte (signature)! :) */
- cell_body[cell_len-1]++;
+ cell_body[cell_len - 1]++;
/* Receive the cell. Should fail. */
setup_full_capture_of_logs(LOG_INFO);
- retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len);
+ retval = hs_intro_received_establish_intro(intro_circ, cell_body,
+ (size_t)cell_len);
expect_log_msg_containing("Failed to verify ESTABLISH_INTRO cell.");
teardown_capture_of_logs();
- tt_int_op(retval, ==, -1);
+ tt_int_op(retval, OP_EQ, -1);
done:
- trn_cell_establish_intro_free(establish_intro_cell);
circuit_free(TO_CIRCUIT(intro_circ));
}
@@ -439,32 +469,33 @@ static trn_cell_establish_intro_t *
helper_establish_intro_v3(or_circuit_t *intro_circ)
{
int retval;
- trn_cell_establish_intro_t *establish_intro_cell = NULL;
+ char circ_nonce[DIGEST_LEN] = {0};
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ trn_cell_establish_intro_t *cell = NULL;
tt_assert(intro_circ);
/* Prepare the circuit for the incoming ESTABLISH_INTRO */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
- attempt to parse it. */
- establish_intro_cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(establish_intro_cell);
- cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body),
- establish_intro_cell);
- tt_int_op(cell_len, >, 0);
+ * attempt to parse it. */
+ cell_len = new_establish_intro_cell(circ_nonce, &cell);
+ tt_i64_op(cell_len, OP_GT, 0);
+ tt_assert(cell);
+ cell_len = trn_cell_establish_intro_encode(cell_body, sizeof(cell_body),
+ cell);
+ tt_int_op(cell_len, OP_GT, 0);
/* Receive the cell */
- retval = hs_intro_received_establish_intro(intro_circ, cell_body, cell_len);
- tt_int_op(retval, ==, 0);
+ retval = hs_intro_received_establish_intro(intro_circ, cell_body,
+ (size_t) cell_len);
+ tt_int_op(retval, OP_EQ, 0);
done:
- return establish_intro_cell;
+ return cell;
}
/* Helper function: Send a well-formed v2 ESTABLISH_INTRO cell to
@@ -476,28 +507,28 @@ helper_establish_intro_v2(or_circuit_t *intro_circ)
int retval;
uint8_t cell_body[RELAY_PAYLOAD_SIZE];
ssize_t cell_len = 0;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
+ char circ_nonce[DIGEST_LEN] = {0};
tt_assert(intro_circ);
/* Prepare the circuit for the incoming ESTABLISH_INTRO */
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
- helper_prepare_circ_for_intro(intro_circ, circuit_key_material);
+ crypto_rand(circ_nonce, sizeof(circ_nonce));
+ helper_prepare_circ_for_intro(intro_circ, circ_nonce);
/* Send legacy establish_intro */
key1 = pk_generate(0);
- /* 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);
+ /* Use old circ_nonce why not */
+ cell_len = rend_service_encode_establish_intro_cell(
+ (char*)cell_body,
+ sizeof(cell_body), key1,
+ circ_nonce);
+ tt_int_op(cell_len, OP_GT, 0);
/* Receive legacy establish_intro */
retval = hs_intro_received_establish_intro(intro_circ,
- cell_body, cell_len);
- tt_int_op(retval, ==, 0);
+ cell_body, (size_t) cell_len);
+ tt_int_op(retval, OP_EQ, 0);
done:
return key1;
@@ -516,7 +547,7 @@ test_circuitmap_free_all(void)
tt_assert(the_hs_circuitmap);
hs_circuitmap_free_all();
the_hs_circuitmap = get_hs_circuitmap();
- tt_assert(!the_hs_circuitmap);
+ tt_ptr_op(the_hs_circuitmap, OP_EQ, NULL);
done:
;
}
@@ -548,10 +579,10 @@ test_intro_point_registration(void *arg)
{
the_hs_circuitmap = get_hs_circuitmap();
tt_assert(the_hs_circuitmap);
- tt_int_op(0, ==, HT_SIZE(the_hs_circuitmap));
+ tt_int_op(0, OP_EQ, HT_SIZE(the_hs_circuitmap));
/* Do a circuitmap query in any case */
returned_intro_circ =hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
- tt_ptr_op(returned_intro_circ, ==, NULL);
+ tt_ptr_op(returned_intro_circ, OP_EQ, NULL);
}
/* Create a v3 intro point */
@@ -563,12 +594,12 @@ test_intro_point_registration(void *arg)
/* Check that the intro point was registered on the HS circuitmap */
the_hs_circuitmap = get_hs_circuitmap();
tt_assert(the_hs_circuitmap);
- tt_int_op(1, ==, HT_SIZE(the_hs_circuitmap));
+ tt_int_op(1, OP_EQ, 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_relay_side(&auth_key);
- tt_ptr_op(intro_circ, ==, returned_intro_circ);
+ tt_ptr_op(intro_circ, OP_EQ, returned_intro_circ);
}
/* Create a v2 intro point */
@@ -583,14 +614,14 @@ test_intro_point_registration(void *arg)
/* Check that the circuitmap now has two elements */
the_hs_circuitmap = get_hs_circuitmap();
tt_assert(the_hs_circuitmap);
- tt_int_op(2, ==, HT_SIZE(the_hs_circuitmap));
+ tt_int_op(2, OP_EQ, HT_SIZE(the_hs_circuitmap));
/* 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);
+ tt_int_op(retval, OP_EQ, 0);
returned_intro_circ =
hs_circuitmap_get_intro_circ_v2_relay_side((uint8_t*)key_digest);
- tt_ptr_op(legacy_intro_circ, ==, returned_intro_circ);
+ tt_ptr_op(legacy_intro_circ, OP_EQ, returned_intro_circ);
}
/* XXX Continue test and try to register a second v3 intro point with the
diff --git a/src/test/test_hs_ntor.c b/src/test/test_hs_ntor.c
new file mode 100644
index 0000000000..8eee54d4b4
--- /dev/null
+++ b/src/test/test_hs_ntor.c
@@ -0,0 +1,114 @@
+/* Copyright (c) 2017, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_hs_ntor.c
+ * \brief Test hidden service ntor functionality.
+ */
+
+#include "test.h"
+#include "test_helpers.h"
+#include "log_test_helpers.h"
+
+#include "hs_ntor.h"
+
+/* 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, OP_EQ, 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, OP_EQ, 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, OP_EQ, 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, OP_EQ, 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:
+ ;
+}
+
+struct testcase_t hs_ntor_tests[] = {
+ { "hs_ntor", test_hs_ntor, TT_FORK,
+ NULL, NULL },
+
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c
index fcfb3b992d..4c7880c0ee 100644
--- a/src/test/test_hs_service.c
+++ b/src/test/test_hs_service.c
@@ -6,243 +6,1326 @@
* \brief Test hidden service functionality.
*/
+#define CIRCUITBUILD_PRIVATE
+#define CIRCUITLIST_PRIVATE
+#define CONFIG_PRIVATE
+#define CONNECTION_PRIVATE
+#define CRYPTO_PRIVATE
#define HS_COMMON_PRIVATE
#define HS_SERVICE_PRIVATE
#define HS_INTROPOINT_PRIVATE
+#define MAIN_PRIVATE
+#define NETWORKSTATUS_PRIVATE
+#define STATEFILE_PRIVATE
+#define TOR_CHANNEL_INTERNAL_
#include "test.h"
+#include "test_helpers.h"
#include "log_test_helpers.h"
+#include "rend_test_helpers.h"
+#include "hs_test_helpers.h"
+
+#include "or.h"
+#include "config.h"
+#include "circuitbuild.h"
+#include "circuitlist.h"
+#include "circuituse.h"
#include "crypto.h"
+#include "networkstatus.h"
+#include "nodelist.h"
+#include "relay.h"
-#include "hs/cell_establish_intro.h"
#include "hs_common.h"
-#include "hs_service.h"
+#include "hs_config.h"
+#include "hs_circuit.h"
+#include "hs_ident.h"
#include "hs_intropoint.h"
-
#include "hs_ntor.h"
+#include "hs_service.h"
+#include "main.h"
+#include "rendservice.h"
+#include "statefile.h"
+
+/* Trunnel */
+#include "hs/cell_establish_intro.h"
+
+static networkstatus_t mock_ns;
+
+static networkstatus_t *
+mock_networkstatus_get_live_consensus(time_t now)
+{
+ (void) now;
+ return &mock_ns;
+}
+
+static or_state_t *dummy_state = NULL;
+
+/* Mock function to get fake or state (used for rev counters) */
+static or_state_t *
+get_or_state_replacement(void)
+{
+ return dummy_state;
+}
+
+/* Mock function because we are not trying to test the close circuit that does
+ * an awful lot of checks on the circuit object. */
+static void
+mock_circuit_mark_for_close(circuit_t *circ, int reason, int line,
+ const char *file)
+{
+ (void) circ;
+ (void) reason;
+ (void) line;
+ (void) file;
+ return;
+}
+
+static int
+mock_relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ,
+ uint8_t relay_command, const char *payload,
+ size_t payload_len,
+ crypt_path_t *cpath_layer,
+ const char *filename, int lineno)
+{
+ (void) stream_id;
+ (void) circ;
+ (void) relay_command;
+ (void) payload;
+ (void) payload_len;
+ (void) cpath_layer;
+ (void) filename;
+ (void) lineno;
+ return 0;
+}
+
+/* Mock function that always return true so we can test the descriptor
+ * creation of the next time period deterministically. */
+static int
+mock_hs_overlap_mode_is_active_true(const networkstatus_t *consensus,
+ time_t now)
+{
+ (void) consensus;
+ (void) now;
+ return 1;
+}
-/** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we
- * parse it from the receiver side. */
+/* Helper: from a set of options in conf, configure a service which will add
+ * it to the staging list of the HS subsytem. */
+static int
+helper_config_service(const char *conf)
+{
+ int ret = 0;
+ or_options_t *options = NULL;
+ tt_assert(conf);
+ options = helper_parse_options(conf);
+ tt_assert(options);
+ ret = hs_config_service_all(options, 0);
+ done:
+ or_options_free(options);
+ return ret;
+}
+
+/* Test: Ensure that setting up rendezvous circuits works correctly. */
static void
-test_gen_establish_intro_cell(void *arg)
+test_e2e_rend_circuit_setup(void *arg)
{
+ ed25519_public_key_t service_pk;
+ origin_circuit_t *or_circ;
+ int retval;
+
+ /** In this test we create a v3 prop224 service-side rendezvous circuit.
+ * We simulate an HS ntor key exchange with a client, and check that
+ * the circuit was setup correctly and is ready to accept rendezvous data */
+
(void) arg;
- ssize_t retval;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
- uint8_t buf[RELAY_PAYLOAD_SIZE];
- 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));
+ /* Now make dummy circuit */
+ {
+ or_circ = origin_circuit_new();
+
+ or_circ->base_.purpose = CIRCUIT_PURPOSE_S_CONNECT_REND;
+
+ or_circ->build_state = tor_malloc_zero(sizeof(cpath_build_state_t));
+ or_circ->build_state->is_internal = 1;
+
+ /* prop224: Setup hs conn identifier on the stream */
+ ed25519_secret_key_t sk;
+ tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sk, 0));
+ tt_int_op(0, OP_EQ, ed25519_public_key_generate(&service_pk, &sk));
- /* Create outgoing ESTABLISH_INTRO cell and extract its payload so that we
- attempt to parse it. */
+ or_circ->hs_ident = hs_ident_circuit_new(&service_pk,
+ HS_IDENT_CIRCUIT_RENDEZVOUS);
+
+ TO_CIRCUIT(or_circ)->state = CIRCUIT_STATE_OPEN;
+ }
+
+ /* Check number of hops */
+ retval = cpath_get_n_hops(&or_circ->cpath);
+ tt_int_op(retval, OP_EQ, 0);
+
+ /* Setup the circuit: do the ntor key exchange */
{
- cell_out = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- tt_assert(cell_out);
+ uint8_t ntor_key_seed[DIGEST256_LEN] = {2};
+ retval = hs_circuit_setup_e2e_rend_circ(or_circ,
+ ntor_key_seed, sizeof(ntor_key_seed),
+ 1);
+ tt_int_op(retval, OP_EQ, 0);
+ }
+
+ /* See that a hop was added to the circuit's cpath */
+ retval = cpath_get_n_hops(&or_circ->cpath);
+ tt_int_op(retval, OP_EQ, 1);
+
+ /* Check the digest algo */
+ tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->f_digest),
+ OP_EQ, DIGEST_SHA3_256);
+ tt_int_op(crypto_digest_get_algorithm(or_circ->cpath->b_digest),
+ OP_EQ, DIGEST_SHA3_256);
+ tt_assert(or_circ->cpath->f_crypto);
+ tt_assert(or_circ->cpath->b_crypto);
+
+ /* Ensure that circ purpose was changed */
+ tt_int_op(or_circ->base_.purpose, OP_EQ, CIRCUIT_PURPOSE_S_REND_JOINED);
+
+ done:
+ circuit_free(TO_CIRCUIT(or_circ));
+}
+
+/* Helper: Return a newly allocated and initialized origin circuit with
+ * purpose and flags. A default HS identifier is set to an ed25519
+ * authentication key for introduction point. */
+static origin_circuit_t *
+helper_create_origin_circuit(int purpose, int flags)
+{
+ origin_circuit_t *circ = NULL;
+
+ circ = origin_circuit_init(purpose, flags);
+ tt_assert(circ);
+ circ->cpath = tor_malloc_zero(sizeof(crypt_path_t));
+ circ->cpath->magic = CRYPT_PATH_MAGIC;
+ circ->cpath->state = CPATH_STATE_OPEN;
+ circ->cpath->package_window = circuit_initial_package_window();
+ circ->cpath->deliver_window = CIRCWINDOW_START;
+ circ->cpath->prev = circ->cpath;
+ /* Random nonce. */
+ crypto_rand(circ->cpath->prev->rend_circ_nonce, DIGEST_LEN);
+ /* Create a default HS identifier. */
+ circ->hs_ident = tor_malloc_zero(sizeof(hs_ident_circuit_t));
+
+ done:
+ return circ;
+}
+
+/* Helper: Return a newly allocated service object with the identity keypair
+ * sets and the current descriptor. Then register it to the global map.
+ * Caller should us hs_free_all() to free this service or remove it from the
+ * global map before freeing. */
+static hs_service_t *
+helper_create_service(void)
+{
+ /* Set a service for this circuit. */
+ hs_service_t *service = hs_service_new(get_options());
+ tt_assert(service);
+ service->config.version = HS_VERSION_THREE;
+ ed25519_secret_key_generate(&service->keys.identity_sk, 0);
+ ed25519_public_key_generate(&service->keys.identity_pk,
+ &service->keys.identity_sk);
+ service->desc_current = service_descriptor_new();
+ tt_assert(service->desc_current);
+ /* Register service to global map. */
+ int ret = register_service(get_hs_service_map(), service);
+ tt_int_op(ret, OP_EQ, 0);
+
+ done:
+ return service;
+}
+
+/* Helper: Return a newly allocated service intro point with two link
+ * specifiers, one IPv4 and one legacy ID set to As. */
+static hs_service_intro_point_t *
+helper_create_service_ip(void)
+{
+ hs_desc_link_specifier_t *ls;
+ hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0);
+ tt_assert(ip);
+ /* Add a first unused link specifier. */
+ ls = tor_malloc_zero(sizeof(*ls));
+ ls->type = LS_IPV4;
+ smartlist_add(ip->base.link_specifiers, ls);
+ /* Add a second link specifier used by a test. */
+ ls = tor_malloc_zero(sizeof(*ls));
+ ls->type = LS_LEGACY_ID;
+ memset(ls->u.legacy_id, 'A', sizeof(ls->u.legacy_id));
+ smartlist_add(ip->base.link_specifiers, ls);
+
+ done:
+ return ip;
+}
+
+static void
+test_load_keys(void *arg)
+{
+ int ret;
+ char *conf = NULL;
+ char *hsdir_v2 = tor_strdup(get_fname("hs2"));
+ char *hsdir_v3 = tor_strdup(get_fname("hs3"));
+ char addr[HS_SERVICE_ADDR_LEN_BASE32 + 1];
+
+ (void) arg;
+
+ /* We'll register two services, a v2 and a v3, then we'll load keys and
+ * validate that both are in a correct state. */
- retval = get_establish_intro_payload(buf, sizeof(buf), cell_out);
- tt_int_op(retval, >=, 0);
+ hs_init();
+
+#define conf_fmt \
+ "HiddenServiceDir %s\n" \
+ "HiddenServiceVersion %d\n" \
+ "HiddenServicePort 65535\n"
+
+ /* v2 service. */
+ tor_asprintf(&conf, conf_fmt, hsdir_v2, HS_VERSION_TWO);
+ ret = helper_config_service(conf);
+ tor_free(conf);
+ tt_int_op(ret, OP_EQ, 0);
+ /* This one should now be registered into the v2 list. */
+ tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 0);
+ tt_int_op(rend_num_services(), OP_EQ, 1);
+
+ /* v3 service. */
+ tor_asprintf(&conf, conf_fmt, hsdir_v3, HS_VERSION_THREE);
+ ret = helper_config_service(conf);
+ tor_free(conf);
+ tt_int_op(ret, OP_EQ, 0);
+ /* It's in staging? */
+ tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1);
+
+ /* Load the keys for these. After that, the v3 service should be registered
+ * in the global map. */
+ hs_service_load_all_keys();
+ tt_int_op(get_hs_service_map_size(), OP_EQ, 1);
+ hs_service_t *s = get_first_service();
+ tt_assert(s);
+
+ /* Ok we have the service object. Validate few things. */
+ tt_assert(!tor_mem_is_zero(s->onion_address, sizeof(s->onion_address)));
+ tt_int_op(hs_address_is_valid(s->onion_address), OP_EQ, 1);
+ tt_assert(!tor_mem_is_zero((char *) s->keys.identity_sk.seckey,
+ ED25519_SECKEY_LEN));
+ tt_assert(!tor_mem_is_zero((char *) s->keys.identity_pk.pubkey,
+ ED25519_PUBKEY_LEN));
+ /* Check onion address from identity key. */
+ hs_build_address(&s->keys.identity_pk, s->config.version, addr);
+ tt_int_op(hs_address_is_valid(addr), OP_EQ, 1);
+ tt_str_op(addr, OP_EQ, s->onion_address);
+
+ done:
+ tor_free(hsdir_v2);
+ tor_free(hsdir_v3);
+ hs_free_all();
+}
+
+static void
+test_access_service(void *arg)
+{
+ int ret;
+ char *conf = NULL;
+ char *hsdir_v3 = tor_strdup(get_fname("hs3"));
+ hs_service_ht *global_map;
+ hs_service_t *s = NULL;
+
+ (void) arg;
+
+ /* We'll register two services, a v2 and a v3, then we'll load keys and
+ * validate that both are in a correct state. */
+
+ hs_init();
+
+#define conf_fmt \
+ "HiddenServiceDir %s\n" \
+ "HiddenServiceVersion %d\n" \
+ "HiddenServicePort 65535\n"
+
+ /* v3 service. */
+ tor_asprintf(&conf, conf_fmt, hsdir_v3, HS_VERSION_THREE);
+ ret = helper_config_service(conf);
+ tor_free(conf);
+ tt_int_op(ret, OP_EQ, 0);
+ /* It's in staging? */
+ tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1);
+
+ /* Load the keys for these. After that, the v3 service should be registered
+ * in the global map. */
+ hs_service_load_all_keys();
+ tt_int_op(get_hs_service_map_size(), OP_EQ, 1);
+ s = get_first_service();
+ tt_assert(s);
+ global_map = get_hs_service_map();
+ tt_assert(global_map);
+
+ /* From here, we'll try the service accessors. */
+ hs_service_t *query = find_service(global_map, &s->keys.identity_pk);
+ tt_assert(query);
+ tt_mem_op(query, OP_EQ, s, sizeof(hs_service_t));
+ /* Remove service, check if it actually works and then put it back. */
+ remove_service(global_map, s);
+ tt_int_op(get_hs_service_map_size(), OP_EQ, 0);
+ query = find_service(global_map, &s->keys.identity_pk);
+ tt_ptr_op(query, OP_EQ, NULL);
+
+ /* Register back the service in the map. */
+ ret = register_service(global_map, s);
+ tt_int_op(ret, OP_EQ, 0);
+ tt_int_op(get_hs_service_map_size(), OP_EQ, 1);
+ /* Twice should fail. */
+ ret = register_service(global_map, s);
+ tt_int_op(ret, OP_EQ, -1);
+ /* Remove service from map so we don't double free on cleanup. */
+ remove_service(global_map, s);
+ tt_int_op(get_hs_service_map_size(), OP_EQ, 0);
+ query = find_service(global_map, &s->keys.identity_pk);
+ tt_ptr_op(query, OP_EQ, NULL);
+ /* Let's try to remove twice for fun. */
+ setup_full_capture_of_logs(LOG_WARN);
+ remove_service(global_map, s);
+ expect_log_msg_containing("Could not find service in the global map");
+ teardown_capture_of_logs();
+
+ done:
+ hs_service_free(s);
+ tor_free(hsdir_v3);
+ hs_free_all();
+}
+
+/** Test that we can create intro point objects, index them and find them */
+static void
+test_service_intro_point(void *arg)
+{
+ hs_service_t *service = NULL;
+ hs_service_intro_point_t *ip = NULL;
+
+ (void) arg;
+
+ /* Test simple creation of an object. */
+ {
+ time_t now = time(NULL);
+ ip = helper_create_service_ip();
+ tt_assert(ip);
+ /* Make sure the authentication keypair is not zeroes. */
+ tt_int_op(tor_mem_is_zero((const char *) &ip->auth_key_kp,
+ sizeof(ed25519_keypair_t)), OP_EQ, 0);
+ /* The introduce2_max MUST be in that range. */
+ tt_u64_op(ip->introduce2_max, OP_GE,
+ INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS);
+ tt_u64_op(ip->introduce2_max, OP_LE,
+ INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS);
+ /* Time to expire MUST also be in that range. We add 5 seconds because
+ * there could be a gap between setting now and the time taken in
+ * service_intro_point_new. On ARM, it can be surprisingly slow... */
+ tt_u64_op(ip->time_to_expire, OP_GE,
+ now + INTRO_POINT_LIFETIME_MIN_SECONDS + 5);
+ tt_u64_op(ip->time_to_expire, OP_LE,
+ now + INTRO_POINT_LIFETIME_MAX_SECONDS + 5);
+ tt_assert(ip->replay_cache);
+ tt_assert(ip->base.link_specifiers);
+ /* By default, this is NOT a legacy object. */
+ tt_int_op(ip->base.is_only_legacy, OP_EQ, 0);
}
- /* Parse it as the receiver */
+ /* Test functions that uses a service intropoints map with that previously
+ * created object (non legacy). */
{
- ssize_t parse_result = trn_cell_establish_intro_parse(&cell_in,
- buf, sizeof(buf));
- tt_int_op(parse_result, >=, 0);
+ uint8_t garbage[DIGEST256_LEN] = {0};
+ hs_service_intro_point_t *query;
- retval = verify_establish_intro_cell(cell_in,
- circuit_key_material,
- sizeof(circuit_key_material));
- tt_int_op(retval, >=, 0);
+ service = hs_service_new(get_options());
+ tt_assert(service);
+ service->desc_current = service_descriptor_new();
+ tt_assert(service->desc_current);
+ /* Add intropoint to descriptor map. */
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ query = service_intro_point_find(service, &ip->auth_key_kp.pubkey);
+ tt_mem_op(query, OP_EQ, ip, sizeof(hs_service_intro_point_t));
+ query = service_intro_point_find(service,
+ (const ed25519_public_key_t *) garbage);
+ tt_ptr_op(query, OP_EQ, NULL);
+
+ /* While at it, can I find the descriptor with the intro point? */
+ hs_service_descriptor_t *desc_lookup =
+ service_desc_find_by_intro(service, ip);
+ tt_mem_op(service->desc_current, OP_EQ, desc_lookup,
+ sizeof(hs_service_descriptor_t));
+
+ /* Remove object from service descriptor and make sure it is out. */
+ service_intro_point_remove(service, ip);
+ query = service_intro_point_find(service, &ip->auth_key_kp.pubkey);
+ tt_ptr_op(query, OP_EQ, NULL);
}
done:
- trn_cell_establish_intro_free(cell_out);
- trn_cell_establish_intro_free(cell_in);
+ /* If the test succeed, this object is no longer referenced in the service
+ * so we can free it without use after free. Else, it might explode because
+ * it's still in the service descriptor map. */
+ service_intro_point_free(ip);
+ hs_service_free(service);
+}
+
+static node_t mock_node;
+static const node_t *
+mock_node_get_by_id(const char *digest)
+{
+ (void) digest;
+ memset(mock_node.identity, 'A', DIGEST_LEN);
+ /* Only return the matchin identity of As */
+ if (!tor_memcmp(mock_node.identity, digest, DIGEST_LEN)) {
+ return &mock_node;
+ }
+ return NULL;
}
-/* Mocked ed25519_sign_prefixed() function that always fails :) */
-static int
-mock_ed25519_sign_prefixed(ed25519_signature_t *signature_out,
- const uint8_t *msg, size_t msg_len,
- const char *prefix_str,
- const ed25519_keypair_t *keypair) {
- (void) signature_out;
- (void) msg;
- (void) msg_len;
- (void) prefix_str;
- (void) keypair;
- return -1;
-}
-
-/** We simulate a failure to create an ESTABLISH_INTRO cell */
static void
-test_gen_establish_intro_cell_bad(void *arg)
+test_helper_functions(void *arg)
{
+ int ret;
+ hs_service_t *service = NULL;
+ hs_service_intro_point_t *ip = NULL;
+ hs_ident_circuit_t ident;
+
(void) arg;
- trn_cell_establish_intro_t *cell = NULL;
- uint8_t circuit_key_material[DIGEST_LEN] = {0};
- MOCK(ed25519_sign_prefixed, mock_ed25519_sign_prefixed);
+ MOCK(node_get_by_id, mock_node_get_by_id);
+
+ hs_service_init();
+
+ service = helper_create_service();
+
+ ip = helper_create_service_ip();
+ /* Immediately add the intro point to the service so the free service at the
+ * end cleans it as well. */
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+
+ /* Setup the circuit identifier. */
+ ed25519_pubkey_copy(&ident.intro_auth_pk, &ip->auth_key_kp.pubkey);
+ ed25519_pubkey_copy(&ident.identity_pk, &service->keys.identity_pk);
+
+ /* Testing get_objects_from_ident(). */
+ {
+ hs_service_t *s_lookup = NULL;
+ hs_service_intro_point_t *ip_lookup = NULL;
+ hs_service_descriptor_t *desc_lookup = NULL;
+
+ get_objects_from_ident(&ident, &s_lookup, &ip_lookup, &desc_lookup);
+ tt_mem_op(s_lookup, OP_EQ, service, sizeof(hs_service_t));
+ tt_mem_op(ip_lookup, OP_EQ, ip, sizeof(hs_service_intro_point_t));
+ tt_mem_op(desc_lookup, OP_EQ, service->desc_current,
+ sizeof(hs_service_descriptor_t));
+ /* Reset */
+ s_lookup = NULL; ip_lookup = NULL; desc_lookup = NULL;
- crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material));
+ /* NULL parameter should work. */
+ get_objects_from_ident(&ident, NULL, &ip_lookup, &desc_lookup);
+ tt_mem_op(ip_lookup, OP_EQ, ip, sizeof(hs_service_intro_point_t));
+ tt_mem_op(desc_lookup, OP_EQ, service->desc_current,
+ sizeof(hs_service_descriptor_t));
+ /* Reset. */
+ s_lookup = NULL; ip_lookup = NULL; desc_lookup = NULL;
+ /* Break the ident and we should find nothing. */
+ memset(&ident, 0, sizeof(ident));
+ get_objects_from_ident(&ident, &s_lookup, &ip_lookup, &desc_lookup);
+ tt_ptr_op(s_lookup, OP_EQ, NULL);
+ tt_ptr_op(ip_lookup, OP_EQ, NULL);
+ tt_ptr_op(desc_lookup, OP_EQ, NULL);
+ }
+
+ /* Testing get_node_from_intro_point() */
+ {
+ const node_t *node = get_node_from_intro_point(ip);
+ tt_ptr_op(node, OP_EQ, &mock_node);
+ SMARTLIST_FOREACH_BEGIN(ip->base.link_specifiers,
+ hs_desc_link_specifier_t *, ls) {
+ if (ls->type == LS_LEGACY_ID) {
+ /* Change legacy id in link specifier which is not the mock node. */
+ memset(ls->u.legacy_id, 'B', sizeof(ls->u.legacy_id));
+ }
+ } SMARTLIST_FOREACH_END(ls);
+ node = get_node_from_intro_point(ip);
+ tt_ptr_op(node, OP_EQ, NULL);
+ }
+
+ /* Testing can_service_launch_intro_circuit() */
+ {
+ time_t now = time(NULL);
+ /* Put the start of the retry period back in time, we should be allowed.
+ * to launch intro circuit. */
+ service->state.num_intro_circ_launched = 2;
+ service->state.intro_circ_retry_started_time =
+ (now - INTRO_CIRC_RETRY_PERIOD - 1);
+ ret = can_service_launch_intro_circuit(service, now);
+ tt_int_op(ret, OP_EQ, 1);
+ tt_u64_op(service->state.intro_circ_retry_started_time, OP_EQ, now);
+ tt_u64_op(service->state.num_intro_circ_launched, OP_EQ, 0);
+ /* Call it again, we should still be allowed because we are under
+ * MAX_INTRO_CIRCS_PER_PERIOD which been set to 0 previously. */
+ ret = can_service_launch_intro_circuit(service, now);
+ tt_int_op(ret, OP_EQ, 1);
+ tt_u64_op(service->state.intro_circ_retry_started_time, OP_EQ, now);
+ tt_u64_op(service->state.num_intro_circ_launched, OP_EQ, 0);
+ /* Too many intro circuit launched means we are not allowed. */
+ service->state.num_intro_circ_launched = 20;
+ ret = can_service_launch_intro_circuit(service, now);
+ tt_int_op(ret, OP_EQ, 0);
+ }
+
+ /* Testing intro_point_should_expire(). */
+ {
+ time_t now = time(NULL);
+ /* Just some basic test of the current state. */
+ tt_u64_op(ip->introduce2_max, OP_GE,
+ INTRO_POINT_MIN_LIFETIME_INTRODUCTIONS);
+ tt_u64_op(ip->introduce2_max, OP_LE,
+ INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS);
+ tt_u64_op(ip->time_to_expire, OP_GE,
+ now + INTRO_POINT_LIFETIME_MIN_SECONDS);
+ tt_u64_op(ip->time_to_expire, OP_LE,
+ now + INTRO_POINT_LIFETIME_MAX_SECONDS);
+
+ /* This newly created IP from above shouldn't expire now. */
+ ret = intro_point_should_expire(ip, now);
+ tt_int_op(ret, OP_EQ, 0);
+ /* Maximum number of INTRODUCE2 cell reached, it should expire. */
+ ip->introduce2_count = INTRO_POINT_MAX_LIFETIME_INTRODUCTIONS + 1;
+ ret = intro_point_should_expire(ip, now);
+ tt_int_op(ret, OP_EQ, 1);
+ ip->introduce2_count = 0;
+ /* It should expire if time to expire has been reached. */
+ ip->time_to_expire = now - 1000;
+ ret = intro_point_should_expire(ip, now);
+ tt_int_op(ret, OP_EQ, 1);
+ }
+
+ done:
+ /* This will free the service and all objects associated to it. */
+ hs_service_free_all();
+ UNMOCK(node_get_by_id);
+}
+
+/** Test that we do the right operations when an intro circuit opens */
+static void
+test_intro_circuit_opened(void *arg)
+{
+ int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL;
+ hs_service_t *service;
+ origin_circuit_t *circ = NULL;
+
+ (void) arg;
+
+ hs_init();
+ MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close);
+ MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge);
+
+ circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO,
+ flags);
+
+ /* No service associated with this circuit. */
setup_full_capture_of_logs(LOG_WARN);
- /* Easiest way to make that function fail is to mock the
- ed25519_sign_prefixed() function and make it fail. */
- cell = generate_establish_intro_cell(circuit_key_material,
- sizeof(circuit_key_material));
- expect_log_msg_containing("Unable to gen signature for "
- "ESTABLISH_INTRO cell.");
+ hs_service_circuit_has_opened(circ);
+ expect_log_msg_containing("Unknown service identity key");
+ teardown_capture_of_logs();
+
+ /* Set a service for this circuit. */
+ {
+ service = helper_create_service();
+ ed25519_pubkey_copy(&circ->hs_ident->identity_pk,
+ &service->keys.identity_pk);
+
+ /* No intro point associated with this circuit. */
+ setup_full_capture_of_logs(LOG_WARN);
+ hs_service_circuit_has_opened(circ);
+ expect_log_msg_containing("Unknown introduction point auth key");
+ teardown_capture_of_logs();
+ }
+
+ /* Set an IP object now for this circuit. */
+ {
+ hs_service_intro_point_t *ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ /* Update ident to contain the intro point auth key. */
+ ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk,
+ &ip->auth_key_kp.pubkey);
+ }
+
+ /* This one should go all the way. */
+ setup_full_capture_of_logs(LOG_INFO);
+ hs_service_circuit_has_opened(circ);
+ expect_log_msg_containing("Introduction circuit 0 established for service");
teardown_capture_of_logs();
- tt_assert(!cell);
done:
- trn_cell_establish_intro_free(cell);
- UNMOCK(ed25519_sign_prefixed);
+ circuit_free(TO_CIRCUIT(circ));
+ hs_free_all();
+ UNMOCK(circuit_mark_for_close_);
+ UNMOCK(relay_send_command_from_edge_);
}
-/** 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. */
+/** Test the operations we do on a circuit after we learn that we successfuly
+ * established an intro point on it */
static void
-test_hs_ntor(void *arg)
+test_intro_established(void *arg)
{
- int retval;
+ int ret;
+ int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL;
+ uint8_t payload[RELAY_PAYLOAD_SIZE] = {0};
+ origin_circuit_t *circ = NULL;
+ hs_service_t *service;
+ hs_service_intro_point_t *ip = NULL;
+
+ (void) arg;
+
+ hs_init();
+ MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close);
+
+ circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO,
+ flags);
+ /* Test a wrong purpose. */
+ TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_INTRO;
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_service_receive_intro_established(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Received an INTRO_ESTABLISHED cell on a "
+ "non introduction circuit of purpose");
+ teardown_capture_of_logs();
+
+ /* Back to normal. */
+ TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO;
+
+ /* No service associated to it. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_service_receive_intro_established(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Unknown service identity key");
+ teardown_capture_of_logs();
- uint8_t subcredential[DIGEST256_LEN];
+ /* Set a service for this circuit. */
+ service = helper_create_service();
+ ed25519_pubkey_copy(&circ->hs_ident->identity_pk,
+ &service->keys.identity_pk);
+ /* No introduction point associated to it. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_service_receive_intro_established(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Introduction circuit established without an "
+ "intro point object on circuit");
+ teardown_capture_of_logs();
- ed25519_keypair_t service_intro_auth_keypair;
- curve25519_keypair_t service_intro_enc_keypair;
- curve25519_keypair_t service_ephemeral_rend_keypair;
+ /* Set an IP object now for this circuit. */
+ {
+ ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ /* Update ident to contain the intro point auth key. */
+ ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk,
+ &ip->auth_key_kp.pubkey);
+ }
- curve25519_keypair_t client_ephemeral_enc_keypair;
+ /* Send an empty payload. INTRO_ESTABLISHED cells are basically zeroes. */
+ ret = hs_service_receive_intro_established(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, 0);
+ tt_u64_op(ip->circuit_established, OP_EQ, 1);
+ tt_int_op(TO_CIRCUIT(circ)->purpose, OP_EQ, CIRCUIT_PURPOSE_S_INTRO);
- hs_ntor_intro_cell_keys_t client_hs_ntor_intro_cell_keys;
- hs_ntor_intro_cell_keys_t service_hs_ntor_intro_cell_keys;
+ done:
+ circuit_free(TO_CIRCUIT(circ));
+ hs_free_all();
+ UNMOCK(circuit_mark_for_close_);
+}
- hs_ntor_rend_cell_keys_t service_hs_ntor_rend_cell_keys;
- hs_ntor_rend_cell_keys_t client_hs_ntor_rend_cell_keys;
+/** Check the operations we do on a rendezvous circuit after we learn it's
+ * open */
+static void
+test_rdv_circuit_opened(void *arg)
+{
+ int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL;
+ origin_circuit_t *circ = NULL;
+ hs_service_t *service;
(void) arg;
- /* Generate fake data for this unittest */
+ hs_init();
+ MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close);
+ MOCK(relay_send_command_from_edge_, mock_relay_send_command_from_edge);
+
+ circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_CONNECT_REND, flags);
+ crypto_rand((char *) circ->hs_ident->rendezvous_cookie, REND_COOKIE_LEN);
+ crypto_rand((char *) circ->hs_ident->rendezvous_handshake_info,
+ sizeof(circ->hs_ident->rendezvous_handshake_info));
+
+ /* No service associated with this circuit. */
+ setup_full_capture_of_logs(LOG_WARN);
+ hs_service_circuit_has_opened(circ);
+ expect_log_msg_containing("Unknown service identity key");
+ teardown_capture_of_logs();
+ /* This should be set to a non zero timestamp. */
+ tt_u64_op(TO_CIRCUIT(circ)->timestamp_dirty, OP_NE, 0);
+
+ /* Set a service for this circuit. */
+ service = helper_create_service();
+ ed25519_pubkey_copy(&circ->hs_ident->identity_pk,
+ &service->keys.identity_pk);
+ /* Should be all good. */
+ hs_service_circuit_has_opened(circ);
+ tt_int_op(TO_CIRCUIT(circ)->purpose, OP_EQ, CIRCUIT_PURPOSE_S_REND_JOINED);
+
+ done:
+ circuit_free(TO_CIRCUIT(circ));
+ hs_free_all();
+ UNMOCK(circuit_mark_for_close_);
+ UNMOCK(relay_send_command_from_edge_);
+}
+
+/** Test sending and receiving introduce2 cells */
+static void
+test_introduce2(void *arg)
+{
+ int ret;
+ int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL;
+ uint8_t payload[RELAY_PAYLOAD_SIZE] = {0};
+ origin_circuit_t *circ = NULL;
+ hs_service_t *service;
+ hs_service_intro_point_t *ip = NULL;
+
+ (void) arg;
+
+ hs_init();
+ MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close);
+ MOCK(get_or_state,
+ get_or_state_replacement);
+
+ dummy_state = tor_malloc_zero(sizeof(or_state_t));
+
+ circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_INTRO, flags);
+
+ /* Test a wrong purpose. */
+ TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO;
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_service_receive_introduce2(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Received an INTRODUCE2 cell on a "
+ "non introduction circuit of purpose");
+ teardown_capture_of_logs();
+
+ /* Back to normal. */
+ TO_CIRCUIT(circ)->purpose = CIRCUIT_PURPOSE_S_INTRO;
+
+ /* No service associated to it. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_service_receive_introduce2(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Unknown service identity key");
+ teardown_capture_of_logs();
+
+ /* Set a service for this circuit. */
+ service = helper_create_service();
+ ed25519_pubkey_copy(&circ->hs_ident->identity_pk,
+ &service->keys.identity_pk);
+ /* No introduction point associated to it. */
+ setup_full_capture_of_logs(LOG_WARN);
+ ret = hs_service_receive_introduce2(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, -1);
+ expect_log_msg_containing("Unknown introduction auth key when handling "
+ "an INTRODUCE2 cell on circuit");
+ teardown_capture_of_logs();
+
+ /* Set an IP object now for this circuit. */
{
- /* 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 */
+ ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ /* Update ident to contain the intro point auth key. */
+ ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk,
+ &ip->auth_key_kp.pubkey);
+ }
+
+ /* This will fail because receiving an INTRODUCE2 cell implies a valid cell
+ * and then launching circuits so let's not do that and instead test that
+ * behaviour differently. */
+ ret = hs_service_receive_introduce2(circ, payload, sizeof(payload));
+ tt_int_op(ret, OP_EQ, -1);
+ tt_u64_op(ip->introduce2_count, OP_EQ, 0);
+
+ done:
+ or_state_free(dummy_state);
+ dummy_state = NULL;
+ circuit_free(TO_CIRCUIT(circ));
+ hs_free_all();
+ UNMOCK(circuit_mark_for_close_);
+}
+
+/** Test basic hidden service housekeeping operations (maintaining intro
+ * points, etc) */
static void
-test_time_period(void *arg)
+test_service_event(void *arg)
{
+ int flags = CIRCLAUNCH_NEED_UPTIME | CIRCLAUNCH_IS_INTERNAL;
+ time_t now = time(NULL);
+ hs_service_t *service;
+ origin_circuit_t *circ = NULL;
+
(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);
+ hs_init();
+ MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close);
+
+ circ = helper_create_origin_circuit(CIRCUIT_PURPOSE_S_INTRO, flags);
+
+ /* Set a service for this circuit. */
+ service = helper_create_service();
+ ed25519_pubkey_copy(&circ->hs_ident->identity_pk,
+ &service->keys.identity_pk);
+
+ /* Currently this consists of cleaning invalid intro points. So adding IPs
+ * here that should get cleaned up. */
+ {
+ hs_service_intro_point_t *ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ /* This run will remove the IP because we have no circuits nor node_t
+ * associated with it. */
+ run_housekeeping_event(now);
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 0);
+ /* We'll trigger a removal because we've reached our maximum amount of
+ * times we should retry a circuit. For this, we need to have a node_t
+ * that matches the identity of this IP. */
+ routerinfo_t ri;
+ ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ memset(ri.cache_info.identity_digest, 'A', DIGEST_LEN);
+ /* This triggers a node_t creation. */
+ tt_assert(nodelist_set_routerinfo(&ri, NULL));
+ ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES + 1;
+ run_housekeeping_event(now);
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 0);
+ /* No removal but no circuit so this means the IP object will stay in the
+ * descriptor map so we can retry it. */
+ ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ ip->circuit_established = 1; /* We'll test that, it MUST be 0 after. */
+ run_housekeeping_event(now);
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 1);
+ /* Remove the IP object at once for the next test. */
+ ip->circuit_retries = MAX_INTRO_POINT_CIRCUIT_RETRIES + 1;
+ run_housekeeping_event(now);
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 0);
+ /* Now, we'll create an IP with a registered circuit. The IP object
+ * shouldn't go away. */
+ ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+ ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk,
+ &ip->auth_key_kp.pubkey);
+ hs_circuitmap_register_intro_circ_v3_service_side(
+ circ, &ip->auth_key_kp.pubkey);
+ run_housekeeping_event(now);
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 1);
+ /* We'll mangle the IP object to expire. */
+ ip->time_to_expire = now;
+ run_housekeeping_event(now);
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 0);
+ }
+
+ done:
+ hs_circuitmap_remove_circuit(TO_CIRCUIT(circ));
+ circuit_free(TO_CIRCUIT(circ));
+ hs_free_all();
+ UNMOCK(circuit_mark_for_close_);
+}
+
+/** Test that we rotate descriptors correctly in overlap period */
+static void
+test_rotate_descriptors(void *arg)
+{
+ int ret;
+ time_t now = time(NULL);
+ hs_service_t *service;
+ hs_service_descriptor_t *desc_next;
+ hs_service_intro_point_t *ip;
+
+ (void) arg;
+
+ hs_init();
+ MOCK(circuit_mark_for_close_, mock_circuit_mark_for_close);
+ MOCK(networkstatus_get_live_consensus,
+ mock_networkstatus_get_live_consensus);
+
+ /* Setup the valid_after time to be 13:00 UTC, not in overlap period. The
+ * overlap check doesn't care about the year. */
+ ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC",
+ &mock_ns.valid_after);
+ ret = parse_rfc1123_time("Sat, 26 Oct 1985 14:00:00 UTC",
+ &mock_ns.fresh_until);
+ tt_int_op(ret, OP_EQ, 0);
+
+ /* Create a service with a default descriptor and state. It's added to the
+ * global map. */
+ service = helper_create_service();
+ ip = helper_create_service_ip();
+ service_intro_point_add(service->desc_current->intro_points.map, ip);
+
+ /* Nothing should happen because we are not in the overlap period. */
+ rotate_all_descriptors(now);
+ tt_int_op(service->state.in_overlap_period, OP_EQ, 0);
+ tt_assert(service->desc_current);
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 1);
+
+ /* Entering an overlap period. */
+ ret = parse_rfc1123_time("Sat, 26 Oct 1985 01:00:00 UTC",
+ &mock_ns.valid_after);
+ ret = parse_rfc1123_time("Sat, 26 Oct 1985 02:00:00 UTC",
+ &mock_ns.fresh_until);
+ tt_int_op(ret, OP_EQ, 0);
+ desc_next = service_descriptor_new();
+ desc_next->next_upload_time = 42; /* Our marker to recognize it. */
+ service->desc_next = desc_next;
+ /* We should have our state flagged to be in the overlap period, our current
+ * descriptor cleaned up and the next descriptor becoming the current. */
+ rotate_all_descriptors(now);
+ tt_int_op(service->state.in_overlap_period, OP_EQ, 1);
+ tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next));
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 0);
+ tt_assert(service->desc_next == NULL);
+ /* A second time should do nothing. */
+ rotate_all_descriptors(now);
+ tt_int_op(service->state.in_overlap_period, OP_EQ, 1);
+ tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next));
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 0);
+ tt_assert(service->desc_next == NULL);
+
+ /* Now let's re-create desc_next and get out of overlap period. We should
+ test that desc_current gets replaced by desc_next, and desc_next becomes
+ NULL. */
+ desc_next = service_descriptor_new();
+ desc_next->next_upload_time = 240; /* Our marker to recognize it. */
+ service->desc_next = desc_next;
+
+ /* Going out of the overlap period. */
+ ret = parse_rfc1123_time("Sat, 26 Oct 1985 12:00:00 UTC",
+ &mock_ns.valid_after);
+ ret = parse_rfc1123_time("Sat, 26 Oct 1985 13:00:00 UTC",
+ &mock_ns.fresh_until);
+ /* This should reset the state and not touch the current descriptor. */
+ tt_int_op(ret, OP_EQ, 0);
+ rotate_all_descriptors(now);
+ tt_int_op(service->state.in_overlap_period, OP_EQ, 0);
+ tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next));
+ tt_assert(service->desc_next == NULL);
+
+ /* Calling rotate_all_descriptors() another time should do nothing */
+ rotate_all_descriptors(now);
+ tt_int_op(service->state.in_overlap_period, OP_EQ, 0);
+ tt_mem_op(service->desc_current, OP_EQ, desc_next, sizeof(*desc_next));
+ tt_assert(service->desc_next == NULL);
+
+ done:
+ hs_free_all();
+ UNMOCK(circuit_mark_for_close_);
+ UNMOCK(networkstatus_get_live_consensus);
+}
+
+/** Test building descriptors: picking intro points, setting up their link
+ * specifiers, etc. */
+static void
+test_build_update_descriptors(void *arg)
+{
+ int ret;
+ time_t now = time(NULL);
+ uint64_t period_num = hs_get_time_period_num(now);
+ uint64_t next_period_num = hs_get_next_time_period_num(now);
+ node_t *node;
+ hs_service_t *service;
+ hs_service_intro_point_t *ip_cur, *ip_next;
+
+ (void) arg;
+
+ hs_init();
+ MOCK(hs_overlap_mode_is_active, mock_hs_overlap_mode_is_active_true);
+ MOCK(get_or_state,
+ get_or_state_replacement);
+
+ dummy_state = tor_malloc_zero(sizeof(or_state_t));
+
+ /* Create a service without a current descriptor to trigger a build. */
+ service = hs_service_new(get_options());
+ tt_assert(service);
+ service->config.version = HS_VERSION_THREE;
+ ed25519_secret_key_generate(&service->keys.identity_sk, 0);
+ ed25519_public_key_generate(&service->keys.identity_pk,
+ &service->keys.identity_sk);
+ /* Register service to global map. */
+ ret = register_service(get_hs_service_map(), service);
+ tt_int_op(ret, OP_EQ, 0);
+
+ build_all_descriptors(now);
+ /* Check *current* descriptor. */
+ tt_assert(service->desc_current);
+ tt_assert(service->desc_current->desc);
+ tt_assert(service->desc_current->intro_points.map);
+ tt_u64_op(service->desc_current->time_period_num, OP_EQ, period_num);
+ /* This should be untouched, the update descriptor process changes it. */
+ tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0);
+
+ /* Check *next* descriptor. */
+ tt_assert(service->desc_next);
+ tt_assert(service->desc_next->desc);
+ tt_assert(service->desc_next->intro_points.map);
+ tt_assert(service->desc_current != service->desc_next);
+ tt_u64_op(service->desc_next->time_period_num, OP_EQ, next_period_num);
+ /* This should be untouched, the update descriptor process changes it. */
+ tt_u64_op(service->desc_next->next_upload_time, OP_EQ, 0);
+
+ /* Time to test the update of those descriptors. At first, we have no node
+ * in the routerlist so this will find NO suitable node for the IPs. */
+ setup_full_capture_of_logs(LOG_INFO);
+ update_all_descriptors(now);
+ expect_log_msg_containing("Unable to find a suitable node to be an "
+ "introduction point for service");
+ teardown_capture_of_logs();
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 0);
+ tt_int_op(digest256map_size(service->desc_next->intro_points.map),
+ OP_EQ, 0);
+
+ /* Now, we'll setup a node_t. */
+ {
+ routerinfo_t ri;
+ tor_addr_t ipv4_addr;
+ curve25519_secret_key_t curve25519_secret_key;
- /* Check that the time period number is right */
- tn = get_time_period_num(fake_time);
- tt_u64_op(tn, ==, 16903);
+ memset(&ri, 0, sizeof(routerinfo_t));
- /* 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);
+ tor_addr_parse(&ipv4_addr, "127.0.0.1");
+ ri.addr = tor_addr_to_ipv4h(&ipv4_addr);
+ ri.or_port = 1337;
+ ri.purpose = ROUTER_PURPOSE_GENERAL;
+ /* Ugly yes but we never free the "ri" object so this just makes things
+ * easier. */
+ ri.protocol_list = (char *) "HSDir=1-2 LinkAuth=3";
+ ret = curve25519_secret_key_generate(&curve25519_secret_key, 0);
+ tt_int_op(ret, OP_EQ, 0);
+ ri.onion_curve25519_pkey =
+ tor_malloc_zero(sizeof(curve25519_public_key_t));
+ ri.onion_pkey = crypto_pk_new();
+ curve25519_public_key_generate(ri.onion_curve25519_pkey,
+ &curve25519_secret_key);
+ memset(ri.cache_info.identity_digest, 'A', DIGEST_LEN);
+ /* Setup ed25519 identity */
+ ed25519_keypair_t kp1;
+ ed25519_keypair_generate(&kp1, 0);
+ ri.cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t));
+ tt_assert(ri.cache_info.signing_key_cert);
+ ed25519_pubkey_copy(&ri.cache_info.signing_key_cert->signing_key,
+ &kp1.pubkey);
+ nodelist_set_routerinfo(&ri, NULL);
+ node = node_get_mutable_by_id(ri.cache_info.identity_digest);
+ tt_assert(node);
+ node->is_running = node->is_valid = node->is_fast = node->is_stable = 1;
+ }
- /* 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);
+ /* We expect to pick only one intro point from the node above. */
+ setup_full_capture_of_logs(LOG_INFO);
+ update_all_descriptors(now);
+ tor_free(node->ri->onion_curve25519_pkey); /* Avoid memleak. */
+ tor_free(node->ri->cache_info.signing_key_cert);
+ crypto_pk_free(node->ri->onion_pkey);
+ expect_log_msg_containing("just picked 1 intro points and wanted 3. It "
+ "currently has 0 intro points. Launching "
+ "ESTABLISH_INTRO circuit shortly.");
+ teardown_capture_of_logs();
+ tt_int_op(digest256map_size(service->desc_current->intro_points.map),
+ OP_EQ, 1);
+ tt_int_op(digest256map_size(service->desc_next->intro_points.map),
+ OP_EQ, 1);
+ /* Get the IP object. Because we don't have the auth key of the IP, we can't
+ * query it so get the first element in the map. */
+ {
+ void *obj = NULL;
+ const uint8_t *key;
+ digest256map_iter_t *iter =
+ digest256map_iter_init(service->desc_current->intro_points.map);
+ digest256map_iter_get(iter, &key, &obj);
+ tt_assert(obj);
+ ip_cur = obj;
+ /* Get also the IP from the next descriptor. We'll make sure it's not the
+ * same object as in the current descriptor. */
+ iter = digest256map_iter_init(service->desc_next->intro_points.map);
+ digest256map_iter_get(iter, &key, &obj);
+ tt_assert(obj);
+ ip_next = obj;
+ }
+ tt_mem_op(ip_cur, OP_NE, ip_next, sizeof(hs_desc_intro_point_t));
- /* 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);
+ /* We won't test the service IP object because there is a specific test
+ * already for this but we'll make sure that the state is coherent.*/
+
+ /* Three link specifiers are mandatoy so make sure we do have them. */
+ tt_int_op(smartlist_len(ip_cur->base.link_specifiers), OP_EQ, 3);
+ /* Make sure we have a valid encryption keypair generated when we pick an
+ * intro point in the update process. */
+ tt_assert(!tor_mem_is_zero((char *) ip_cur->enc_key_kp.seckey.secret_key,
+ CURVE25519_SECKEY_LEN));
+ tt_assert(!tor_mem_is_zero((char *) ip_cur->enc_key_kp.pubkey.public_key,
+ CURVE25519_PUBKEY_LEN));
+ tt_u64_op(ip_cur->time_to_expire, OP_GE, now +
+ INTRO_POINT_LIFETIME_MIN_SECONDS);
+ tt_u64_op(ip_cur->time_to_expire, OP_LE, now +
+ INTRO_POINT_LIFETIME_MAX_SECONDS);
done:
- ;
+ hs_free_all();
+ nodelist_free_all();
+ UNMOCK(hs_overlap_mode_is_active);
+}
+
+static void
+test_upload_descriptors(void *arg)
+{
+ int ret;
+ time_t now = time(NULL);
+ hs_service_t *service;
+
+ (void) arg;
+
+ hs_init();
+ MOCK(hs_overlap_mode_is_active, mock_hs_overlap_mode_is_active_true);
+ MOCK(get_or_state,
+ get_or_state_replacement);
+ dummy_state = tor_malloc_zero(sizeof(or_state_t));
+
+ /* Create a service with no descriptor. It's added to the global map. */
+ service = hs_service_new(get_options());
+ tt_assert(service);
+ service->config.version = HS_VERSION_THREE;
+ ed25519_secret_key_generate(&service->keys.identity_sk, 0);
+ ed25519_public_key_generate(&service->keys.identity_pk,
+ &service->keys.identity_sk);
+ /* Register service to global map. */
+ ret = register_service(get_hs_service_map(), service);
+ tt_int_op(ret, OP_EQ, 0);
+ /* But first, build our descriptor. */
+ build_all_descriptors(now);
+
+ /* Nothing should happen because we have 0 introduction circuit established
+ * and we want (by default) 3 intro points. */
+ run_upload_descriptor_event(now);
+ /* If no upload happened, this should be untouched. */
+ tt_u64_op(service->desc_current->next_upload_time, OP_EQ, 0);
+ /* We'll simulate that we've opened our intro point circuit and that we only
+ * want one intro point. */
+ service->config.num_intro_points = 1;
+
+ /* Set our next upload time after now which will skip the upload. */
+ service->desc_current->next_upload_time = now + 1000;
+ run_upload_descriptor_event(now);
+ /* If no upload happened, this should be untouched. */
+ tt_u64_op(service->desc_current->next_upload_time, OP_EQ, now + 1000);
+
+ done:
+ hs_free_all();
+ UNMOCK(hs_overlap_mode_is_active);
+ UNMOCK(get_or_state);
+}
+
+/** Test the functions that save and load HS revision counters to state. */
+static void
+test_revision_counter_state(void *arg)
+{
+ char *state_line_one = NULL;
+ char *state_line_two = NULL;
+
+ hs_service_descriptor_t *desc_one = service_descriptor_new();
+ hs_service_descriptor_t *desc_two = service_descriptor_new();
+
+ (void) arg;
+
+ /* Prepare both descriptors */
+ desc_one->desc->plaintext_data.revision_counter = 42;
+ desc_two->desc->plaintext_data.revision_counter = 240;
+ memset(&desc_one->blinded_kp.pubkey.pubkey, 66,
+ sizeof(desc_one->blinded_kp.pubkey.pubkey));
+ memset(&desc_two->blinded_kp.pubkey.pubkey, 240,
+ sizeof(desc_one->blinded_kp.pubkey.pubkey));
+
+ /* Turn the descriptor rev counters into state lines */
+ state_line_one = encode_desc_rev_counter_for_state(desc_one);
+ tt_str_op(state_line_one, OP_EQ,
+ "QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkI 42");
+
+ state_line_two = encode_desc_rev_counter_for_state(desc_two);
+ tt_str_op(state_line_two, OP_EQ,
+ "8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PA 240");
+
+ /* Now let's test our state parsing function: */
+ int service_found;
+ uint64_t cached_rev_counter;
+
+ /* First's try with wrong pubkey and check that no service was found */
+ cached_rev_counter =check_state_line_for_service_rev_counter(state_line_one,
+ &desc_two->blinded_kp.pubkey,
+ &service_found);
+ tt_int_op(service_found, OP_EQ, 0);
+
+ /* Now let's try with the right pubkeys */
+ cached_rev_counter =check_state_line_for_service_rev_counter(state_line_one,
+ &desc_one->blinded_kp.pubkey,
+ &service_found);
+ tt_int_op(service_found, OP_EQ, 1);
+ tt_u64_op(cached_rev_counter, OP_EQ, 42);
+
+ cached_rev_counter =check_state_line_for_service_rev_counter(state_line_two,
+ &desc_two->blinded_kp.pubkey,
+ &service_found);
+ tt_int_op(service_found, OP_EQ, 1);
+ tt_u64_op(cached_rev_counter, OP_EQ, 240);
+
+ done:
+ tor_free(state_line_one);
+ tor_free(state_line_two);
+ service_descriptor_free(desc_one);
+ service_descriptor_free(desc_two);
}
struct testcase_t hs_service_tests[] = {
- { "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK,
+ { "e2e_rend_circuit_setup", test_e2e_rend_circuit_setup, TT_FORK,
+ NULL, NULL },
+ { "load_keys", test_load_keys, TT_FORK,
+ NULL, NULL },
+ { "access_service", test_access_service, TT_FORK,
+ NULL, NULL },
+ { "service_intro_point", test_service_intro_point, TT_FORK,
+ NULL, NULL },
+ { "helper_functions", test_helper_functions, TT_FORK,
+ NULL, NULL },
+ { "intro_circuit_opened", test_intro_circuit_opened, TT_FORK,
+ NULL, NULL },
+ { "intro_established", test_intro_established, TT_FORK,
+ NULL, NULL },
+ { "rdv_circuit_opened", test_rdv_circuit_opened, TT_FORK,
+ NULL, NULL },
+ { "introduce2", test_introduce2, TT_FORK,
+ NULL, NULL },
+ { "service_event", test_service_event, TT_FORK,
+ NULL, NULL },
+ { "rotate_descriptors", test_rotate_descriptors, TT_FORK,
NULL, NULL },
- { "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK,
+ { "build_update_descriptors", test_build_update_descriptors, TT_FORK,
NULL, NULL },
- { "hs_ntor", test_hs_ntor, TT_FORK,
+ { "upload_descriptors", test_upload_descriptors, TT_FORK,
NULL, NULL },
- { "time_period", test_time_period, TT_FORK,
+ { "revision_counter_state", test_revision_counter_state, TT_FORK,
NULL, NULL },
END_OF_TESTCASES
diff --git a/src/test/test_introduce.c b/src/test/test_introduce.c
index cfb8d83b1d..d502bdddb1 100644
--- a/src/test/test_introduce.c
+++ b/src/test/test_introduce.c
@@ -307,7 +307,7 @@ do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase)
/* Do early parsing */
parsed_req = rend_service_begin_parse_intro(cell, cell_len, 2, &err_msg);
tt_assert(parsed_req);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
tt_mem_op(parsed_req->pk,OP_EQ, digest, DIGEST_LEN);
tt_assert(parsed_req->ciphertext);
tt_assert(parsed_req->ciphertext_len > 0);
@@ -318,7 +318,7 @@ do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase)
/* Do decryption */
r = rend_service_decrypt_intro(parsed_req, k, &err_msg);
tt_assert(!r);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
tt_assert(parsed_req->plaintext);
tt_assert(parsed_req->plaintext_len > 0);
@@ -328,7 +328,7 @@ do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase)
/* Do late parsing */
r = rend_service_parse_intro_plaintext(parsed_req, &err_msg);
tt_assert(!r);
- tt_assert(!err_msg);
+ tt_ptr_op(err_msg, OP_EQ, NULL);
tt_assert(parsed_req->parsed);
done:
@@ -355,7 +355,7 @@ make_intro_from_plaintext(
/*
* Figure out an upper bound on how big the ciphertext will be
- * (see crypto_pk_public_hybrid_encrypt())
+ * (see crypto_pk_obsolete_public_hybrid_encrypt())
*/
ciphertext_size = PKCS1_OAEP_PADDING_OVERHEAD;
ciphertext_size += crypto_pk_keysize(key);
@@ -372,7 +372,7 @@ make_intro_from_plaintext(
tt_assert(r >= 0);
/* Do encryption */
- r = crypto_pk_public_hybrid_encrypt(
+ r = crypto_pk_obsolete_public_hybrid_encrypt(
key, cell + DIGEST_LEN, ciphertext_size,
buf, len,
PK_PKCS1_OAEP_PADDING, 0);
diff --git a/src/test/test_key_expiration.sh b/src/test/test_key_expiration.sh
new file mode 100755
index 0000000000..95d7911f04
--- /dev/null
+++ b/src/test/test_key_expiration.sh
@@ -0,0 +1,129 @@
+#!/bin/sh
+
+# Note: some of this code is lifted from zero_length_keys.sh and
+# test_keygen.sh, and could be unified.
+
+umask 077
+set -e
+
+if [ $# -eq 0 ] || [ ! -f ${1} ] || [ ! -x ${1} ]; then
+ if [ "$TESTING_TOR_BINARY" = "" ] ; then
+ echo "Usage: ${0} PATH_TO_TOR [case-number]"
+ exit 1
+ fi
+fi
+
+if [ $# -ge 1 ]; then
+ TOR_BINARY="${1}"
+ shift
+else
+ TOR_BINARY="${TESTING_TOR_BINARY}"
+fi
+
+if [ $# -ge 1 ]; then
+ dflt=0
+else
+ dflt=1
+fi
+
+CASE1=$dflt
+CASE2=$dflt
+CASE3=$dflt
+
+if [ $# -ge 1 ]; then
+ eval "CASE${1}"=1
+fi
+
+
+dump() { xxd -p "$1" | tr -d '\n '; }
+die() { echo "$1" >&2 ; exit 5; }
+check_dir() { [ -d "$1" ] || die "$1 did not exist"; }
+check_file() { [ -e "$1" ] || die "$1 did not exist"; }
+check_no_file() { [ -e "$1" ] && die "$1 was not supposed to exist" || true; }
+check_files_eq() { cmp "$1" "$2" || die "$1 and $2 did not match: `dump $1` vs `dump $2`"; }
+check_keys_eq() { check_files_eq "${SRC}/keys/${1}" "${ME}/keys/${1}"; }
+
+DATA_DIR=`mktemp -d -t tor_key_expiration_tests.XXXXXX`
+if [ -z "$DATA_DIR" ]; then
+ echo "Failure: mktemp invocation returned empty string" >&2
+ exit 3
+fi
+if [ ! -d "$DATA_DIR" ]; then
+ echo "Failure: mktemp invocation result doesn't point to directory" >&2
+ exit 3
+fi
+trap "rm -rf '$DATA_DIR'" 0
+
+# Use an absolute path for this or Tor will complain
+DATA_DIR=`cd "${DATA_DIR}" && pwd`
+
+touch "${DATA_DIR}/empty_torrc"
+
+QUIETLY="--hush"
+SILENTLY="--quiet"
+TOR="${TOR_BINARY} --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0 -f ${DATA_DIR}/empty_torrc --DataDirectory ${DATA_DIR}"
+
+##### SETUP
+#
+# Here we create a set of keys.
+
+# Step 1: Start Tor with --list-fingerprint --quiet. Make sure everything is there.
+echo "Setup step #1"
+${TOR} --list-fingerprint ${SILENTLY} > /dev/null
+
+check_dir "${DATA_DIR}/keys"
+check_file "${DATA_DIR}/keys/ed25519_master_id_public_key"
+check_file "${DATA_DIR}/keys/ed25519_master_id_secret_key"
+check_file "${DATA_DIR}/keys/ed25519_signing_cert"
+check_file "${DATA_DIR}/keys/ed25519_signing_secret_key"
+check_file "${DATA_DIR}/keys/secret_id_key"
+check_file "${DATA_DIR}/keys/secret_onion_key"
+check_file "${DATA_DIR}/keys/secret_onion_key_ntor"
+
+##### TEST CASES
+
+echo "=== Starting key expiration tests."
+
+FN="${DATA_DIR}/stderr"
+
+if [ "$CASE1" = 1 ]; then
+ echo "==== Case 1: Test --key-expiration without argument and ensure usage"
+ echo " instructions are printed."
+
+ ${TOR} ${QUIETLY} --key-expiration 2>"$FN"
+ grep "No valid argument to --key-expiration found!" "$FN" >/dev/null || \
+ die "Tor didn't mention supported --key-expiration argmuents"
+
+ echo "==== Case 1: ok"
+fi
+
+if [ "$CASE2" = 1 ]; then
+ echo "==== Case 2: Start Tor with --key-expiration 'sign' and make sure it prints an expiration."
+
+ ${TOR} ${QUIETLY} --key-expiration sign 2>"$FN"
+ grep "signing-cert-expiry:" "$FN" >/dev/null || \
+ die "Tor didn't print an expiration"
+
+ echo "==== Case 2: ok"
+fi
+
+if [ "$CASE3" = 1 ]; then
+ echo "==== Case 3: Start Tor with --key-expiration 'sign', when there is no"
+ echo " signing key, and make sure that Tor generates a new key"
+ echo " and prints its certificate's expiration."
+
+ mv "${DATA_DIR}/keys/ed25519_signing_cert" \
+ "${DATA_DIR}/keys/ed25519_signing_cert.bak"
+
+ ${TOR} --key-expiration sign > "$FN" 2>&1
+ grep "It looks like I need to generate and sign a new medium-term signing key" "$FN" >/dev/null || \
+ die "Tor didn't create a new signing key"
+ check_file "${DATA_DIR}/keys/ed25519_signing_cert"
+ grep "signing-cert-expiry:" "$FN" >/dev/null || \
+ die "Tor didn't print an expiration"
+
+ mv "${DATA_DIR}/keys/ed25519_signing_cert.bak" \
+ "${DATA_DIR}/keys/ed25519_signing_cert"
+
+ echo "==== Case 3: ok"
+fi
diff --git a/src/test/test_keypin.c b/src/test/test_keypin.c
index d2ec8e9ca7..79d7bac902 100644
--- a/src/test/test_keypin.c
+++ b/src/test/test_keypin.c
@@ -20,8 +20,8 @@ test_keypin_parse_line(void *arg)
"aGVyZSBpcyBhIGdvb2Qgc2hhMSE "
"VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4");
tt_assert(ent);
- tt_mem_op(ent->rsa_id, ==, "here is a good sha1!", 20);
- tt_mem_op(ent->ed25519_key, ==, "This ed25519 scoffs at the sha1.", 32);
+ tt_mem_op(ent->rsa_id, OP_EQ, "here is a good sha1!", 20);
+ tt_mem_op(ent->ed25519_key, OP_EQ, "This ed25519 scoffs at the sha1.", 32);
tor_free(ent); ent = NULL;
/* Good line with extra stuff we will ignore. */
@@ -29,27 +29,27 @@ test_keypin_parse_line(void *arg)
"aGVyZSBpcyBhIGdvb2Qgc2hhMSE "
"VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4helloworld");
tt_assert(ent);
- tt_mem_op(ent->rsa_id, ==, "here is a good sha1!", 20);
- tt_mem_op(ent->ed25519_key, ==, "This ed25519 scoffs at the sha1.", 32);
+ tt_mem_op(ent->rsa_id, OP_EQ, "here is a good sha1!", 20);
+ tt_mem_op(ent->ed25519_key, OP_EQ, "This ed25519 scoffs at the sha1.", 32);
tor_free(ent); ent = NULL;
/* Bad line: no space in the middle. */
ent = keypin_parse_journal_line(
"aGVyZSBpcyBhIGdvb2Qgc2hhMSE?"
"VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4");
- tt_assert(! ent);
+ tt_ptr_op(ent, OP_EQ, NULL);
/* Bad line: bad base64 in RSA ID */
ent = keypin_parse_journal_line(
"aGVyZSBpcyBhIGdv!2Qgc2hhMSE "
"VGhpcyBlZDI1NTE5IHNjb2ZmcyBhdCB0aGUgc2hhMS4");
- tt_assert(! ent);
+ tt_ptr_op(ent, OP_EQ, NULL);
/* Bad line: bad base64 in Ed25519 */
ent = keypin_parse_journal_line(
"aGVyZSBpcyBhIGdvb2Qgc2hhMSE "
"VGhpcyBlZDI1NTE5IHNjb2ZmcyB!dCB0aGUgc2hhMS4");
- tt_assert(! ent);
+ tt_ptr_op(ent, OP_EQ, NULL);
done:
tor_free(ent);
@@ -82,11 +82,11 @@ test_keypin_parse_file(void *arg)
"Z2dsZSBpbiBzd29tZWVzd2FucyA aW4gdm9sdXB0YXRlIGF4ZS1oYWNrZXIgZXNzZSByaXA\n"
"cHVsdXMgY3J1bW1paSBldSBtb28 ZiBudWxsYSBzbnV2di5QTFVHSFBMT1ZFUlhZWlpZLi4\n";
- tt_int_op(0, ==, keypin_load_journal_impl(data1, strlen(data1)));
- tt_int_op(8, ==, smartlist_len(mock_addent_got));
+ tt_int_op(0, OP_EQ, keypin_load_journal_impl(data1, strlen(data1)));
+ tt_int_op(8, OP_EQ, smartlist_len(mock_addent_got));
keypin_ent_t *ent = smartlist_get(mock_addent_got, 2);
- tt_mem_op(ent->rsa_id, ==, "r lerkim, sed do bar", 20);
- tt_mem_op(ent->ed25519_key, ==, "baloot tempor gluppitus ut labor", 32);
+ tt_mem_op(ent->rsa_id, OP_EQ, "r lerkim, sed do bar", 20);
+ tt_mem_op(ent->ed25519_key, OP_EQ, "baloot tempor gluppitus ut labor", 32);
/* More complex example: weird lines, bogus lines,
duplicate/conflicting lines */
@@ -107,24 +107,25 @@ test_keypin_parse_file(void *arg)
"ZHMgc3BlYWsgdHJ1dGgsIGFuZCA aXQgd2FzIHRydaUgdGhhdCBhbGwgdGhlIG1hc3Rlcgo\n"
;
- tt_int_op(0, ==, keypin_load_journal_impl(data2, strlen(data2)));
- tt_int_op(13, ==, smartlist_len(mock_addent_got));
+ tt_int_op(0, OP_EQ, keypin_load_journal_impl(data2, strlen(data2)));
+ tt_int_op(13, OP_EQ, smartlist_len(mock_addent_got));
ent = smartlist_get(mock_addent_got, 9);
- tt_mem_op(ent->rsa_id, ==, "\"You have made a goo", 20);
- tt_mem_op(ent->ed25519_key, ==, "d beginning.\" But no more. Wizar", 32);
+ tt_mem_op(ent->rsa_id, OP_EQ, "\"You have made a goo", 20);
+ tt_mem_op(ent->ed25519_key, OP_EQ, "d beginning.\" But no more. Wizar", 32);
ent = smartlist_get(mock_addent_got, 12);
- tt_mem_op(ent->rsa_id, ==, "ds speak truth, and ", 20);
- tt_mem_op(ent->ed25519_key, ==, "it was tru\xa5 that all the master\n", 32);
+ tt_mem_op(ent->rsa_id, OP_EQ, "ds speak truth, and ", 20);
+ tt_mem_op(ent->ed25519_key, OP_EQ,
+ "it was tru\xa5 that all the master\n", 32);
/* File truncated before NL */
const char data3[] =
"Tm8gZHJhZ29uIGNhbiByZXNpc3Q IHRoZSBmYXNjaW5hdGlvbiBvZiByaWRkbGluZyB0YWw";
- tt_int_op(0, ==, keypin_load_journal_impl(data3, strlen(data3)));
- tt_int_op(14, ==, smartlist_len(mock_addent_got));
+ tt_int_op(0, OP_EQ, keypin_load_journal_impl(data3, strlen(data3)));
+ tt_int_op(14, OP_EQ, smartlist_len(mock_addent_got));
ent = smartlist_get(mock_addent_got, 13);
- tt_mem_op(ent->rsa_id, ==, "No dragon can resist", 20);
- tt_mem_op(ent->ed25519_key, ==, " the fascination of riddling tal", 32);
+ tt_mem_op(ent->rsa_id, OP_EQ, "No dragon can resist", 20);
+ tt_mem_op(ent->ed25519_key, OP_EQ, " the fascination of riddling tal", 32);
done:
keypin_clear();
@@ -141,32 +142,32 @@ test_keypin_add_entry(void *arg)
(void)arg;
keypin_clear();
- tt_int_op(KEYPIN_ADDED, ==, ADD("ambassadors-at-large",
+ tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("ambassadors-at-large",
"bread-and-butter thing-in-itself"));
- tt_int_op(KEYPIN_ADDED, ==, ADD("gentleman-adventurer",
+ tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("gentleman-adventurer",
"cloak-and-dagger what's-his-face"));
- tt_int_op(KEYPIN_FOUND, ==, ADD("ambassadors-at-large",
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("ambassadors-at-large",
"bread-and-butter thing-in-itself"));
- tt_int_op(KEYPIN_FOUND, ==, ADD("ambassadors-at-large",
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("ambassadors-at-large",
"bread-and-butter thing-in-itself"));
- tt_int_op(KEYPIN_FOUND, ==, ADD("gentleman-adventurer",
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("gentleman-adventurer",
"cloak-and-dagger what's-his-face"));
- tt_int_op(KEYPIN_ADDED, ==, ADD("Johnnies-come-lately",
+ tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("Johnnies-come-lately",
"run-of-the-mill root-mean-square"));
- tt_int_op(KEYPIN_MISMATCH, ==, ADD("gentleman-adventurer",
+ tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("gentleman-adventurer",
"hypersentimental closefistedness"));
- tt_int_op(KEYPIN_MISMATCH, ==, ADD("disestablismentarian",
+ tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("disestablismentarian",
"cloak-and-dagger what's-his-face"));
- tt_int_op(KEYPIN_FOUND, ==, ADD("gentleman-adventurer",
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("gentleman-adventurer",
"cloak-and-dagger what's-his-face"));
- tt_int_op(KEYPIN_NOT_FOUND, ==, LONE_RSA("Llanfairpwllgwyngyll"));
- tt_int_op(KEYPIN_MISMATCH, ==, LONE_RSA("Johnnies-come-lately"));
+ tt_int_op(KEYPIN_NOT_FOUND, OP_EQ, LONE_RSA("Llanfairpwllgwyngyll"));
+ tt_int_op(KEYPIN_MISMATCH, OP_EQ, LONE_RSA("Johnnies-come-lately"));
done:
keypin_clear();
@@ -179,51 +180,51 @@ test_keypin_journal(void *arg)
char *contents = NULL;
const char *fname = get_fname("keypin-journal");
- tt_int_op(0, ==, keypin_load_journal(fname)); /* ENOENT is okay */
+ tt_int_op(0, OP_EQ, keypin_load_journal(fname)); /* ENOENT is okay */
update_approx_time(1217709000);
- tt_int_op(0, ==, keypin_open_journal(fname));
+ tt_int_op(0, OP_EQ, keypin_open_journal(fname));
- tt_int_op(KEYPIN_ADDED, ==, ADD("king-of-the-herrings",
+ tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("king-of-the-herrings",
"good-for-nothing attorney-at-law"));
- tt_int_op(KEYPIN_ADDED, ==, ADD("yellowish-red-yellow",
+ tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("yellowish-red-yellow",
"salt-and-pepper high-muck-a-muck"));
- tt_int_op(KEYPIN_FOUND, ==, ADD("yellowish-red-yellow",
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow",
"salt-and-pepper high-muck-a-muck"));
keypin_close_journal();
keypin_clear();
- tt_int_op(0, ==, keypin_load_journal(fname));
+ tt_int_op(0, OP_EQ, keypin_load_journal(fname));
update_approx_time(1231041600);
- tt_int_op(0, ==, keypin_open_journal(fname));
- tt_int_op(KEYPIN_FOUND, ==, ADD("yellowish-red-yellow",
+ tt_int_op(0, OP_EQ, keypin_open_journal(fname));
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow",
"salt-and-pepper high-muck-a-muck"));
- tt_int_op(KEYPIN_ADDED, ==, ADD("theatre-in-the-round",
+ tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("theatre-in-the-round",
"holier-than-thou jack-in-the-box"));
- tt_int_op(KEYPIN_ADDED, ==, ADD("no-deposit-no-return",
+ tt_int_op(KEYPIN_ADDED, OP_EQ, ADD("no-deposit-no-return",
"across-the-board will-o-the-wisp"));
- tt_int_op(KEYPIN_MISMATCH, ==, ADD("intellectualizations",
+ tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("intellectualizations",
"salt-and-pepper high-muck-a-muck"));
keypin_close_journal();
keypin_clear();
- tt_int_op(0, ==, keypin_load_journal(fname));
+ tt_int_op(0, OP_EQ, keypin_load_journal(fname));
update_approx_time(1412278354);
- tt_int_op(0, ==, keypin_open_journal(fname));
- tt_int_op(KEYPIN_FOUND, ==, ADD("yellowish-red-yellow",
+ tt_int_op(0, OP_EQ, keypin_open_journal(fname));
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("yellowish-red-yellow",
"salt-and-pepper high-muck-a-muck"));
- tt_int_op(KEYPIN_MISMATCH, ==, ADD("intellectualizations",
+ tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("intellectualizations",
"salt-and-pepper high-muck-a-muck"));
- tt_int_op(KEYPIN_FOUND, ==, ADD("theatre-in-the-round",
+ tt_int_op(KEYPIN_FOUND, OP_EQ, ADD("theatre-in-the-round",
"holier-than-thou jack-in-the-box"));
- tt_int_op(KEYPIN_MISMATCH, ==, ADD("counterrevolutionary",
+ tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("counterrevolutionary",
"holier-than-thou jack-in-the-box"));
- tt_int_op(KEYPIN_MISMATCH, ==, ADD("no-deposit-no-return",
+ tt_int_op(KEYPIN_MISMATCH, OP_EQ, ADD("no-deposit-no-return",
"floccinaucinihilipilificationism"));
keypin_close_journal();
contents = read_file_to_str(fname, RFTS_BIN, NULL);
tt_assert(contents);
- tt_str_op(contents,==,
+ tt_str_op(contents,OP_EQ,
"\n"
"@opened-at 2008-08-02 20:30:00\n"
"a2luZy1vZi10aGUtaGVycmluZ3M Z29vZC1mb3Itbm90aGluZyBhdHRvcm5leS1hdC1sYXc\n"
diff --git a/src/test/test_link_handshake.c b/src/test/test_link_handshake.c
index c5508b0f04..422d419078 100644
--- a/src/test/test_link_handshake.c
+++ b/src/test/test_link_handshake.c
@@ -136,7 +136,7 @@ test_link_handshake_certs_ok(void *arg)
* actually generate a CERTS cell.
*/
tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
- key1, key2, 86400), ==, 0);
+ key1, key2, 86400), OP_EQ, 0);
if (with_ed) {
/* If we're making a CERTS cell for an ed handshake, let's make sure we
@@ -155,63 +155,63 @@ test_link_handshake_certs_ok(void *arg)
c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
c1->link_proto = 3;
- tt_int_op(connection_init_or_handshake_state(c1, 1), ==, 0);
+ tt_int_op(connection_init_or_handshake_state(c1, 1), OP_EQ, 0);
/* c2 has started_here == 0 */
c2->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
c2->link_proto = 3;
- tt_int_op(connection_init_or_handshake_state(c2, 0), ==, 0);
+ tt_int_op(connection_init_or_handshake_state(c2, 0), OP_EQ, 0);
- tt_int_op(0, ==, connection_or_send_certs_cell(c1));
+ tt_int_op(0, OP_EQ, connection_or_send_certs_cell(c1));
tt_assert(mock_got_var_cell);
cell1 = mock_got_var_cell;
- tt_int_op(0, ==, connection_or_send_certs_cell(c2));
+ tt_int_op(0, OP_EQ, connection_or_send_certs_cell(c2));
tt_assert(mock_got_var_cell);
cell2 = mock_got_var_cell;
- tt_int_op(cell1->command, ==, CELL_CERTS);
- tt_int_op(cell1->payload_len, >, 1);
+ tt_int_op(cell1->command, OP_EQ, CELL_CERTS);
+ tt_int_op(cell1->payload_len, OP_GT, 1);
- tt_int_op(cell2->command, ==, CELL_CERTS);
- tt_int_op(cell2->payload_len, >, 1);
+ tt_int_op(cell2->command, OP_EQ, CELL_CERTS);
+ tt_int_op(cell2->payload_len, OP_GT, 1);
- tt_int_op(cell1->payload_len, ==,
+ tt_int_op(cell1->payload_len, OP_EQ,
certs_cell_parse(&cc1, cell1->payload, cell1->payload_len));
- tt_int_op(cell2->payload_len, ==,
+ tt_int_op(cell2->payload_len, OP_EQ,
certs_cell_parse(&cc2, cell2->payload, cell2->payload_len));
if (with_ed) {
- tt_int_op(5, ==, cc1->n_certs);
- tt_int_op(5, ==, cc2->n_certs);
+ tt_int_op(5, OP_EQ, cc1->n_certs);
+ tt_int_op(5, OP_EQ, cc2->n_certs);
} else {
- tt_int_op(2, ==, cc1->n_certs);
- tt_int_op(2, ==, cc2->n_certs);
+ tt_int_op(2, OP_EQ, cc1->n_certs);
+ tt_int_op(2, OP_EQ, cc2->n_certs);
}
- tt_int_op(certs_cell_get_certs(cc1, 0)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc1, 0)->cert_type, OP_EQ,
CERTTYPE_RSA1024_ID_AUTH);
- tt_int_op(certs_cell_get_certs(cc1, 1)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc1, 1)->cert_type, OP_EQ,
CERTTYPE_RSA1024_ID_ID);
- tt_int_op(certs_cell_get_certs(cc2, 0)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc2, 0)->cert_type, OP_EQ,
CERTTYPE_RSA1024_ID_LINK);
- tt_int_op(certs_cell_get_certs(cc2, 1)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc2, 1)->cert_type, OP_EQ,
CERTTYPE_RSA1024_ID_ID);
if (with_ed) {
- tt_int_op(certs_cell_get_certs(cc1, 2)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc1, 2)->cert_type, OP_EQ,
CERTTYPE_ED_ID_SIGN);
- tt_int_op(certs_cell_get_certs(cc1, 3)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc1, 3)->cert_type, OP_EQ,
CERTTYPE_ED_SIGN_AUTH);
- tt_int_op(certs_cell_get_certs(cc1, 4)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc1, 4)->cert_type, OP_EQ,
CERTTYPE_RSA1024_ID_EDID);
- tt_int_op(certs_cell_get_certs(cc2, 2)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc2, 2)->cert_type, OP_EQ,
CERTTYPE_ED_ID_SIGN);
- tt_int_op(certs_cell_get_certs(cc2, 3)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc2, 3)->cert_type, OP_EQ,
CERTTYPE_ED_SIGN_LINK);
- tt_int_op(certs_cell_get_certs(cc2, 4)->cert_type, ==,
+ tt_int_op(certs_cell_get_certs(cc2, 4)->cert_type, OP_EQ,
CERTTYPE_RSA1024_ID_EDID);
}
@@ -240,8 +240,8 @@ test_link_handshake_certs_ok(void *arg)
tor_assert(c1->handshake_state->authenticated);
tt_assert(c1->handshake_state->received_certs_cell);
- tt_assert(c1->handshake_state->certs->auth_cert == NULL);
- tt_assert(c1->handshake_state->certs->ed_sign_auth == NULL);
+ tt_ptr_op(c1->handshake_state->certs->auth_cert, OP_EQ, NULL);
+ tt_ptr_op(c1->handshake_state->certs->ed_sign_auth, OP_EQ, NULL);
tt_assert(c1->handshake_state->certs->id_cert);
if (with_ed) {
tt_assert(c1->handshake_state->certs->ed_sign_link);
@@ -250,9 +250,9 @@ test_link_handshake_certs_ok(void *arg)
tt_assert(c1->handshake_state->authenticated_rsa);
tt_assert(c1->handshake_state->authenticated_ed25519);
} else {
- tt_assert(c1->handshake_state->certs->ed_sign_link == NULL);
- tt_assert(c1->handshake_state->certs->ed_rsa_crosscert == NULL);
- tt_assert(c1->handshake_state->certs->ed_id_sign == NULL);
+ tt_ptr_op(c1->handshake_state->certs->ed_sign_link, OP_EQ, NULL);
+ tt_ptr_op(c1->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL);
+ tt_ptr_op(c1->handshake_state->certs->ed_id_sign, OP_EQ, NULL);
tt_assert(c1->handshake_state->authenticated_rsa);
tt_assert(! c1->handshake_state->authenticated_ed25519);
}
@@ -278,9 +278,9 @@ test_link_handshake_certs_ok(void *arg)
tt_assert(c2->handshake_state->certs->ed_id_sign);
} else {
tt_assert(c2->handshake_state->certs->auth_cert);
- tt_assert(c2->handshake_state->certs->ed_sign_auth == NULL);
- tt_assert(c2->handshake_state->certs->ed_rsa_crosscert == NULL);
- tt_assert(c2->handshake_state->certs->ed_id_sign == NULL);
+ tt_ptr_op(c2->handshake_state->certs->ed_sign_auth, OP_EQ, NULL);
+ tt_ptr_op(c2->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL);
+ tt_ptr_op(c2->handshake_state->certs->ed_id_sign, OP_EQ, NULL);
}
tt_assert(c2->handshake_state->certs->id_cert);
tt_assert(tor_mem_is_zero(
@@ -376,14 +376,14 @@ recv_certs_setup(const struct testcase_t *test)
tor_addr_from_ipv4h(&d->c->base_.addr, 0x801f0127);
d->c->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
d->chan->conn = d->c;
- tt_int_op(connection_init_or_handshake_state(d->c, 1), ==, 0);
+ tt_int_op(connection_init_or_handshake_state(d->c, 1), OP_EQ, 0);
d->c->link_proto = 4;
d->key1 = pk_generate(2);
d->key2 = pk_generate(3);
tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
- d->key1, d->key2, 86400), ==, 0);
+ d->key1, d->key2, 86400), OP_EQ, 0);
if (is_ed) {
init_mock_ed_keys(d->key2);
} else {
@@ -452,7 +452,7 @@ recv_certs_setup(const struct testcase_t *test)
d->cell->command = CELL_CERTS;
n = certs_cell_encode(d->cell->payload, 4096, d->ccell);
- tt_int_op(n, >, 0);
+ tt_int_op(n, OP_GT, 0);
d->cell->payload_len = n;
MOCK(tor_tls_cert_matches_key, mock_tls_cert_matches_key);
@@ -465,9 +465,9 @@ recv_certs_setup(const struct testcase_t *test)
mock_peer_cert = tor_x509_cert_dup(a);
}
- tt_int_op(0, ==, d->c->handshake_state->received_certs_cell);
- tt_int_op(0, ==, mock_send_authenticate_called);
- tt_int_op(0, ==, mock_send_netinfo_called);
+ tt_int_op(0, OP_EQ, d->c->handshake_state->received_certs_cell);
+ tt_int_op(0, OP_EQ, mock_send_authenticate_called);
+ tt_int_op(0, OP_EQ, mock_send_netinfo_called);
return d;
done:
@@ -485,25 +485,25 @@ test_link_handshake_recv_certs_ok(void *arg)
{
certs_data_t *d = arg;
channel_tls_process_certs_cell(d->cell, d->chan);
- tt_int_op(0, ==, mock_close_called);
- tt_int_op(d->c->handshake_state->authenticated, ==, 1);
- tt_int_op(d->c->handshake_state->authenticated_rsa, ==, 1);
- tt_int_op(d->c->handshake_state->received_certs_cell, ==, 1);
- tt_assert(d->c->handshake_state->certs->id_cert != NULL);
- tt_assert(d->c->handshake_state->certs->auth_cert == NULL);
+ tt_int_op(0, OP_EQ, mock_close_called);
+ tt_int_op(d->c->handshake_state->authenticated, OP_EQ, 1);
+ tt_int_op(d->c->handshake_state->authenticated_rsa, OP_EQ, 1);
+ tt_int_op(d->c->handshake_state->received_certs_cell, OP_EQ, 1);
+ tt_ptr_op(d->c->handshake_state->certs->id_cert, OP_NE, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_EQ, NULL);
if (d->is_ed) {
- tt_assert(d->c->handshake_state->certs->ed_id_sign != NULL);
- tt_assert(d->c->handshake_state->certs->ed_sign_link != NULL);
- tt_assert(d->c->handshake_state->certs->ed_sign_auth == NULL);
- tt_assert(d->c->handshake_state->certs->ed_rsa_crosscert != NULL);
- tt_int_op(d->c->handshake_state->authenticated_ed25519, ==, 1);
+ tt_ptr_op(d->c->handshake_state->certs->ed_id_sign, OP_NE, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_sign_link, OP_NE, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_rsa_crosscert, OP_NE, NULL);
+ tt_int_op(d->c->handshake_state->authenticated_ed25519, OP_EQ, 1);
} else {
- tt_assert(d->c->handshake_state->certs->ed_id_sign == NULL);
- tt_assert(d->c->handshake_state->certs->ed_sign_link == NULL);
- tt_assert(d->c->handshake_state->certs->ed_sign_auth == NULL);
- tt_assert(d->c->handshake_state->certs->ed_rsa_crosscert == NULL);
- tt_int_op(d->c->handshake_state->authenticated_ed25519, ==, 0);
+ tt_ptr_op(d->c->handshake_state->certs->ed_id_sign, OP_EQ, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_sign_link, OP_EQ, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_rsa_crosscert, OP_EQ, NULL);
+ tt_int_op(d->c->handshake_state->authenticated_ed25519, OP_EQ, 0);
}
done:
@@ -517,17 +517,17 @@ test_link_handshake_recv_certs_ok_server(void *arg)
d->c->handshake_state->started_here = 0;
d->c->handshake_state->certs->started_here = 0;
channel_tls_process_certs_cell(d->cell, d->chan);
- tt_int_op(0, ==, mock_close_called);
- tt_int_op(d->c->handshake_state->authenticated, ==, 0);
- tt_int_op(d->c->handshake_state->received_certs_cell, ==, 1);
- tt_assert(d->c->handshake_state->certs->id_cert != NULL);
- tt_assert(d->c->handshake_state->certs->link_cert == NULL);
+ tt_int_op(0, OP_EQ, mock_close_called);
+ tt_int_op(d->c->handshake_state->authenticated, OP_EQ, 0);
+ tt_int_op(d->c->handshake_state->received_certs_cell, OP_EQ, 1);
+ tt_ptr_op(d->c->handshake_state->certs->id_cert, OP_NE, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->link_cert, OP_EQ, NULL);
if (d->is_ed) {
- tt_assert(d->c->handshake_state->certs->ed_sign_auth != NULL);
- tt_assert(d->c->handshake_state->certs->auth_cert == NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_NE, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_EQ, NULL);
} else {
- tt_assert(d->c->handshake_state->certs->ed_sign_auth == NULL);
- tt_assert(d->c->handshake_state->certs->auth_cert != NULL);
+ tt_ptr_op(d->c->handshake_state->certs->ed_sign_auth, OP_EQ, NULL);
+ tt_ptr_op(d->c->handshake_state->certs->auth_cert, OP_NE, NULL);
}
done:
@@ -543,11 +543,11 @@ test_link_handshake_recv_certs_ok_server(void *arg)
setup_capture_of_logs(LOG_INFO); \
{ code ; } \
channel_tls_process_certs_cell(d->cell, d->chan); \
- tt_int_op(1, ==, mock_close_called); \
- tt_int_op(0, ==, mock_send_authenticate_called); \
- tt_int_op(0, ==, mock_send_netinfo_called); \
- tt_int_op(0, ==, d->c->handshake_state->authenticated_rsa); \
- tt_int_op(0, ==, d->c->handshake_state->authenticated_ed25519); \
+ tt_int_op(1, OP_EQ, mock_close_called); \
+ tt_int_op(0, OP_EQ, mock_send_authenticate_called); \
+ tt_int_op(0, OP_EQ, mock_send_netinfo_called); \
+ tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_rsa); \
+ tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_ed25519); \
if (require_failure_message) { \
expect_log_msg_containing(require_failure_message); \
} \
@@ -603,7 +603,7 @@ CERTS_FAIL(truncated_5, /* ed25519 */
const char *msg = certs_cell_check(d->ccell); \
if (msg) puts(msg); \
ssize_t n = certs_cell_encode(d->cell->payload, 4096, d->ccell); \
- tt_int_op(n, >, 0); \
+ tt_int_op(n, OP_GT, 0); \
d->cell->payload_len = n; \
} while (0)
@@ -686,9 +686,9 @@ test_link_handshake_recv_certs_missing_id(void *arg) /* ed25519 */
/* This handshake succeeds, but since we have no ID cert, we will
* just do the RSA handshake. */
channel_tls_process_certs_cell(d->cell, d->chan);
- tt_int_op(0, ==, mock_close_called);
- tt_int_op(0, ==, d->c->handshake_state->authenticated_ed25519);
- tt_int_op(1, ==, d->c->handshake_state->authenticated_rsa);
+ tt_int_op(0, OP_EQ, mock_close_called);
+ tt_int_op(0, OP_EQ, d->c->handshake_state->authenticated_ed25519);
+ tt_int_op(1, OP_EQ, d->c->handshake_state->authenticated_rsa);
done:
;
}
@@ -697,7 +697,7 @@ CERTS_FAIL(missing_signing_key, /* ed25519 */
require_failure_message = "No Ed25519 signing key";
tt_int_op(certs_cell_getlen_certs(d->ccell), OP_EQ, 5);
certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 2);
- tt_int_op(cert->cert_type, ==, CERTTYPE_ED_ID_SIGN);
+ tt_int_op(cert->cert_type, OP_EQ, CERTTYPE_ED_ID_SIGN);
/* replace this with a valid master->signing cert, but with no
* signing key. */
const ed25519_keypair_t *mk = get_master_identity_keypair();
@@ -905,28 +905,28 @@ test_link_handshake_send_authchallenge(void *arg)
crypto_pk_t *rsa0 = pk_generate(0), *rsa1 = pk_generate(1);
tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
- rsa0, rsa1, 86400), ==, 0);
+ rsa0, rsa1, 86400), OP_EQ, 0);
init_mock_ed_keys(rsa0);
MOCK(connection_or_write_var_cell_to_buf, mock_write_var_cell);
- tt_int_op(connection_init_or_handshake_state(c1, 0), ==, 0);
+ tt_int_op(connection_init_or_handshake_state(c1, 0), OP_EQ, 0);
c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
- tt_assert(! mock_got_var_cell);
- tt_int_op(0, ==, connection_or_send_auth_challenge_cell(c1));
+ tt_ptr_op(mock_got_var_cell, OP_EQ, NULL);
+ tt_int_op(0, OP_EQ, connection_or_send_auth_challenge_cell(c1));
cell1 = mock_got_var_cell;
- tt_int_op(0, ==, connection_or_send_auth_challenge_cell(c1));
+ tt_int_op(0, OP_EQ, connection_or_send_auth_challenge_cell(c1));
cell2 = mock_got_var_cell;
- tt_int_op(38, ==, cell1->payload_len);
- tt_int_op(38, ==, cell2->payload_len);
- tt_int_op(0, ==, cell1->circ_id);
- tt_int_op(0, ==, cell2->circ_id);
- tt_int_op(CELL_AUTH_CHALLENGE, ==, cell1->command);
- tt_int_op(CELL_AUTH_CHALLENGE, ==, cell2->command);
+ tt_int_op(38, OP_EQ, cell1->payload_len);
+ tt_int_op(38, OP_EQ, cell2->payload_len);
+ tt_int_op(0, OP_EQ, cell1->circ_id);
+ tt_int_op(0, OP_EQ, cell2->circ_id);
+ tt_int_op(CELL_AUTH_CHALLENGE, OP_EQ, cell1->command);
+ tt_int_op(CELL_AUTH_CHALLENGE, OP_EQ, cell2->command);
- tt_mem_op("\x00\x02\x00\x01\x00\x03", ==, cell1->payload + 32, 6);
- tt_mem_op("\x00\x02\x00\x01\x00\x03", ==, cell2->payload + 32, 6);
- tt_mem_op(cell1->payload, !=, cell2->payload, 32);
+ tt_mem_op("\x00\x02\x00\x01\x00\x03", OP_EQ, cell1->payload + 32, 6);
+ tt_mem_op("\x00\x02\x00\x01\x00\x03", OP_EQ, cell2->payload + 32, 6);
+ tt_mem_op(cell1->payload, OP_NE, cell2->payload, 32);
done:
UNMOCK(connection_or_write_var_cell_to_buf);
@@ -974,7 +974,7 @@ recv_authchallenge_setup(const struct testcase_t *test)
d->c->base_.address = tor_strdup("HaveAnAddress");
d->c->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
d->chan->conn = d->c;
- tt_int_op(connection_init_or_handshake_state(d->c, 1), ==, 0);
+ tt_int_op(connection_init_or_handshake_state(d->c, 1), OP_EQ, 0);
d->c->link_proto = 4;
d->c->handshake_state->received_certs_cell = 1;
d->cell = var_cell_new(128);
@@ -989,9 +989,9 @@ recv_authchallenge_setup(const struct testcase_t *test)
MOCK(connection_or_close_for_error, mock_close_for_err);
MOCK(connection_or_send_netinfo, mock_send_netinfo);
MOCK(connection_or_send_authenticate_cell, mock_send_authenticate);
- tt_int_op(0, ==, d->c->handshake_state->received_auth_challenge);
- tt_int_op(0, ==, mock_send_authenticate_called);
- tt_int_op(0, ==, mock_send_netinfo_called);
+ tt_int_op(0, OP_EQ, d->c->handshake_state->received_auth_challenge);
+ tt_int_op(0, OP_EQ, mock_send_authenticate_called);
+ tt_int_op(0, OP_EQ, mock_send_netinfo_called);
return d;
done:
@@ -1010,11 +1010,11 @@ test_link_handshake_recv_authchallenge_ok(void *arg)
authchallenge_data_t *d = arg;
channel_tls_process_auth_challenge_cell(d->cell, d->chan);
- tt_int_op(0, ==, mock_close_called);
- tt_int_op(1, ==, d->c->handshake_state->received_auth_challenge);
- tt_int_op(1, ==, mock_send_authenticate_called);
- tt_int_op(1, ==, mock_send_netinfo_called);
- tt_int_op(1, ==, mock_send_authenticate_called_with_type); /* RSA */
+ tt_int_op(0, OP_EQ, mock_close_called);
+ tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge);
+ tt_int_op(1, OP_EQ, mock_send_authenticate_called);
+ tt_int_op(1, OP_EQ, mock_send_netinfo_called);
+ tt_int_op(1, OP_EQ, mock_send_authenticate_called_with_type); /* RSA */
done:
;
}
@@ -1029,11 +1029,11 @@ test_link_handshake_recv_authchallenge_ok_ed25519(void *arg)
d->cell->payload[39] = 3;
d->cell->payload_len += 2;
channel_tls_process_auth_challenge_cell(d->cell, d->chan);
- tt_int_op(0, ==, mock_close_called);
- tt_int_op(1, ==, d->c->handshake_state->received_auth_challenge);
- tt_int_op(1, ==, mock_send_authenticate_called);
- tt_int_op(1, ==, mock_send_netinfo_called);
- tt_int_op(3, ==, mock_send_authenticate_called_with_type); /* Ed25519 */
+ tt_int_op(0, OP_EQ, mock_close_called);
+ tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge);
+ tt_int_op(1, OP_EQ, mock_send_authenticate_called);
+ tt_int_op(1, OP_EQ, mock_send_netinfo_called);
+ tt_int_op(3, OP_EQ, mock_send_authenticate_called_with_type); /* Ed25519 */
done:
;
}
@@ -1045,10 +1045,10 @@ test_link_handshake_recv_authchallenge_ok_noserver(void *arg)
get_options_mutable()->ORPort_set = 0;
channel_tls_process_auth_challenge_cell(d->cell, d->chan);
- tt_int_op(0, ==, mock_close_called);
- tt_int_op(1, ==, d->c->handshake_state->received_auth_challenge);
- tt_int_op(0, ==, mock_send_authenticate_called);
- tt_int_op(0, ==, mock_send_netinfo_called);
+ tt_int_op(0, OP_EQ, mock_close_called);
+ tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge);
+ tt_int_op(0, OP_EQ, mock_send_authenticate_called);
+ tt_int_op(0, OP_EQ, mock_send_netinfo_called);
done:
;
}
@@ -1060,10 +1060,10 @@ test_link_handshake_recv_authchallenge_ok_unrecognized(void *arg)
d->cell->payload[37] = 99;
channel_tls_process_auth_challenge_cell(d->cell, d->chan);
- tt_int_op(0, ==, mock_close_called);
- tt_int_op(1, ==, d->c->handshake_state->received_auth_challenge);
- tt_int_op(0, ==, mock_send_authenticate_called);
- tt_int_op(1, ==, mock_send_netinfo_called);
+ tt_int_op(0, OP_EQ, mock_close_called);
+ tt_int_op(1, OP_EQ, d->c->handshake_state->received_auth_challenge);
+ tt_int_op(0, OP_EQ, mock_send_authenticate_called);
+ tt_int_op(1, OP_EQ, mock_send_netinfo_called);
done:
;
}
@@ -1077,9 +1077,9 @@ test_link_handshake_recv_authchallenge_ok_unrecognized(void *arg)
setup_capture_of_logs(LOG_INFO); \
{ code ; } \
channel_tls_process_auth_challenge_cell(d->cell, d->chan); \
- tt_int_op(1, ==, mock_close_called); \
- tt_int_op(0, ==, mock_send_authenticate_called); \
- tt_int_op(0, ==, mock_send_netinfo_called); \
+ tt_int_op(1, OP_EQ, mock_close_called); \
+ tt_int_op(0, OP_EQ, mock_send_authenticate_called); \
+ tt_int_op(0, OP_EQ, mock_send_netinfo_called); \
if (require_failure_message) { \
expect_log_msg_containing(require_failure_message); \
} \
@@ -1197,17 +1197,17 @@ authenticate_data_setup(const struct testcase_t *test)
d->key1 = pk_generate(2);
d->key2 = pk_generate(3);
tt_int_op(tor_tls_context_init(TOR_TLS_CTX_IS_PUBLIC_SERVER,
- d->key1, d->key2, 86400), ==, 0);
+ d->key1, d->key2, 86400), OP_EQ, 0);
init_mock_ed_keys(d->key2);
d->c1->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
d->c1->link_proto = 3;
- tt_int_op(connection_init_or_handshake_state(d->c1, 1), ==, 0);
+ tt_int_op(connection_init_or_handshake_state(d->c1, 1), OP_EQ, 0);
d->c2->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
d->c2->link_proto = 3;
- tt_int_op(connection_init_or_handshake_state(d->c2, 0), ==, 0);
+ tt_int_op(connection_init_or_handshake_state(d->c2, 0), OP_EQ, 0);
var_cell_t *cell = var_cell_new(16);
cell->command = CELL_CERTS;
or_handshake_state_record_var_cell(d->c1, d->c1->handshake_state, cell, 1);
@@ -1260,7 +1260,7 @@ authenticate_data_setup(const struct testcase_t *test)
authtype = AUTHTYPE_ED25519_SHA256_RFC5705;
else
authtype = AUTHTYPE_RSA_SHA256_TLSSECRET;
- tt_int_op(0, ==, connection_or_send_authenticate_cell(d->c1, authtype));
+ tt_int_op(0, OP_EQ, connection_or_send_authenticate_cell(d->c1, authtype));
tt_assert(mock_got_var_cell);
d->cell = mock_got_var_cell;
@@ -1285,65 +1285,65 @@ test_link_handshake_auth_cell(void *arg)
crypto_pk_t *auth_pubkey = NULL;
/* Is the cell well-formed on the outer layer? */
- tt_int_op(d->cell->command, ==, CELL_AUTHENTICATE);
- tt_int_op(d->cell->payload[0], ==, 0);
+ tt_int_op(d->cell->command, OP_EQ, CELL_AUTHENTICATE);
+ tt_int_op(d->cell->payload[0], OP_EQ, 0);
if (d->is_ed)
- tt_int_op(d->cell->payload[1], ==, 3);
+ tt_int_op(d->cell->payload[1], OP_EQ, 3);
else
- tt_int_op(d->cell->payload[1], ==, 1);
- tt_int_op(ntohs(get_uint16(d->cell->payload + 2)), ==,
+ tt_int_op(d->cell->payload[1], OP_EQ, 1);
+ tt_int_op(ntohs(get_uint16(d->cell->payload + 2)), OP_EQ,
d->cell->payload_len - 4);
/* Check it out for plausibility... */
auth_ctx_t ctx;
ctx.is_ed = d->is_ed;
- tt_int_op(d->cell->payload_len-4, ==, auth1_parse(&auth1,
+ tt_int_op(d->cell->payload_len-4, OP_EQ, auth1_parse(&auth1,
d->cell->payload+4,
d->cell->payload_len - 4, &ctx));
tt_assert(auth1);
if (d->is_ed) {
- tt_mem_op(auth1->type, ==, "AUTH0003", 8);
+ tt_mem_op(auth1->type, OP_EQ, "AUTH0003", 8);
} else {
- tt_mem_op(auth1->type, ==, "AUTH0001", 8);
+ tt_mem_op(auth1->type, OP_EQ, "AUTH0001", 8);
}
- tt_mem_op(auth1->tlssecrets, ==, "int getRandomNumber(){return 4;}", 32);
+ tt_mem_op(auth1->tlssecrets, OP_EQ, "int getRandomNumber(){return 4;}", 32);
/* Is the signature okay? */
const uint8_t *start = d->cell->payload+4, *end = auth1->end_of_signed;
if (d->is_ed) {
ed25519_signature_t sig;
- tt_int_op(auth1_getlen_sig(auth1), ==, ED25519_SIG_LEN);
+ tt_int_op(auth1_getlen_sig(auth1), OP_EQ, ED25519_SIG_LEN);
memcpy(&sig.sig, auth1_getarray_sig(auth1), ED25519_SIG_LEN);
tt_assert(!ed25519_checksig(&sig, start, end-start,
&get_current_auth_keypair()->pubkey));
} else {
uint8_t sig[128];
uint8_t digest[32];
- tt_int_op(auth1_getlen_sig(auth1), >, 120);
+ tt_int_op(auth1_getlen_sig(auth1), OP_GT, 120);
auth_pubkey = tor_tls_cert_get_key(
d->c2->handshake_state->certs->auth_cert);
int n = crypto_pk_public_checksig(
auth_pubkey,
(char*)sig, sizeof(sig), (char*)auth1_getarray_sig(auth1),
auth1_getlen_sig(auth1));
- tt_int_op(n, ==, 32);
+ tt_int_op(n, OP_EQ, 32);
crypto_digest256((char*)digest,
(const char*)start, end-start, DIGEST_SHA256);
- tt_mem_op(sig, ==, digest, 32);
+ tt_mem_op(sig, OP_EQ, digest, 32);
}
/* Then feed it to c2. */
- tt_int_op(d->c2->handshake_state->authenticated, ==, 0);
+ tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0);
channel_tls_process_authenticate_cell(d->cell, d->chan2);
- tt_int_op(mock_close_called, ==, 0);
- tt_int_op(d->c2->handshake_state->authenticated, ==, 1);
+ tt_int_op(mock_close_called, OP_EQ, 0);
+ tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 1);
if (d->is_ed) {
- tt_int_op(d->c2->handshake_state->authenticated_ed25519, ==, 1);
- tt_int_op(d->c2->handshake_state->authenticated_rsa, ==, 1);
+ tt_int_op(d->c2->handshake_state->authenticated_ed25519, OP_EQ, 1);
+ tt_int_op(d->c2->handshake_state->authenticated_rsa, OP_EQ, 1);
} else {
- tt_int_op(d->c2->handshake_state->authenticated_ed25519, ==, 0);
- tt_int_op(d->c2->handshake_state->authenticated_rsa, ==, 1);
+ tt_int_op(d->c2->handshake_state->authenticated_ed25519, OP_EQ, 0);
+ tt_int_op(d->c2->handshake_state->authenticated_rsa, OP_EQ, 1);
}
done:
@@ -1359,10 +1359,10 @@ test_link_handshake_auth_cell(void *arg)
const char *require_failure_message = NULL; \
setup_capture_of_logs(LOG_INFO); \
{ code ; } \
- tt_int_op(d->c2->handshake_state->authenticated, ==, 0); \
+ tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); \
channel_tls_process_authenticate_cell(d->cell, d->chan2); \
- tt_int_op(mock_close_called, ==, 1); \
- tt_int_op(d->c2->handshake_state->authenticated, ==, 0); \
+ tt_int_op(mock_close_called, OP_EQ, 1); \
+ tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 0); \
if (require_failure_message) { \
expect_log_msg_containing(require_failure_message); \
} \
@@ -1390,8 +1390,8 @@ test_link_handshake_auth_already_authenticated(void *arg)
setup_capture_of_logs(LOG_INFO);
d->c2->handshake_state->authenticated = 1;
channel_tls_process_authenticate_cell(d->cell, d->chan2);
- tt_int_op(mock_close_called, ==, 1);
- tt_int_op(d->c2->handshake_state->authenticated, ==, 1);
+ tt_int_op(mock_close_called, OP_EQ, 1);
+ tt_int_op(d->c2->handshake_state->authenticated, OP_EQ, 1);
expect_log_msg_containing("The peer is already authenticated");
done:
teardown_capture_of_logs();
@@ -1425,7 +1425,7 @@ AUTHENTICATE_FAIL(truncated_2,
d->cell->payload[3]++)
AUTHENTICATE_FAIL(tooshort_1,
require_failure_message = "Authenticator was too short";
- tt_int_op(d->cell->payload_len, >=, 260);
+ tt_int_op(d->cell->payload_len, OP_GE, 260);
d->cell->payload[2] -= 1;
d->cell->payload_len -= 256;)
AUTHENTICATE_FAIL(badcontent,
diff --git a/src/test/test_logging.c b/src/test/test_logging.c
index 94b3e4ea68..e373158e34 100644
--- a/src/test/test_logging.c
+++ b/src/test/test_logging.c
@@ -107,7 +107,7 @@ test_sigsafe_err(void *arg)
close(STDERR_FILENO);
content = read_file_to_str(fn, 0, NULL);
- tt_assert(content != NULL);
+ tt_ptr_op(content, OP_NE, NULL);
tor_split_lines(lines, content, (int)strlen(content));
tt_int_op(smartlist_len(lines), OP_GE, 5);
@@ -140,7 +140,7 @@ test_ratelim(void *arg)
char *msg = NULL;
msg = rate_limit_log(&ten_min, now);
- tt_assert(msg != NULL);
+ tt_ptr_op(msg, OP_NE, NULL);
tt_str_op(msg, OP_EQ, ""); /* nothing was suppressed. */
tt_int_op(ten_min.last_allowed, OP_EQ, now);
@@ -150,14 +150,14 @@ test_ratelim(void *arg)
for (i = 0; i < 9; ++i) {
now += 60; /* one minute has passed. */
msg = rate_limit_log(&ten_min, now);
- tt_assert(msg == NULL);
+ tt_ptr_op(msg, OP_EQ, NULL);
tt_int_op(ten_min.last_allowed, OP_EQ, start);
tt_int_op(ten_min.n_calls_since_last_time, OP_EQ, i + 1);
}
now += 240; /* Okay, we can be done. */
msg = rate_limit_log(&ten_min, now);
- tt_assert(msg != NULL);
+ tt_ptr_op(msg, OP_NE, NULL);
tt_str_op(msg, OP_EQ,
" [9 similar message(s) suppressed in last 600 seconds]");
done:
diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c
index c78fda3b69..cb195d6e2a 100644
--- a/src/test/test_microdesc.c
+++ b/src/test/test_microdesc.c
@@ -464,7 +464,7 @@ test_md_generate(void *arg)
microdesc_free(md);
md = NULL;
md = dirvote_create_microdescriptor(ri, 21);
- tt_str_op(md->body, ==, test_md_18);
+ tt_str_op(md->body, OP_EQ, test_md_18);
routerinfo_free(ri);
ri = router_parse_entry_from_string(test_ri2, NULL, 0, 0, NULL, NULL);
@@ -472,12 +472,12 @@ test_md_generate(void *arg)
microdesc_free(md);
md = NULL;
md = dirvote_create_microdescriptor(ri, 18);
- tt_str_op(md->body, ==, test_md2_18);
+ tt_str_op(md->body, OP_EQ, test_md2_18);
microdesc_free(md);
md = NULL;
md = dirvote_create_microdescriptor(ri, 21);
- tt_str_op(md->body, ==, test_md2_21);
+ tt_str_op(md->body, OP_EQ, test_md2_21);
tt_assert(ed25519_pubkey_eq(md->ed25519_identity_pkey,
&ri->cache_info.signing_key_cert->signing_key));
@@ -823,14 +823,14 @@ test_md_corrupt_desc(void *arg)
"@last-listed 2015-06-22 10:00:00\n"
"onion-k\n",
NULL, SAVED_IN_JOURNAL, 0, time(NULL), NULL);
- tt_int_op(smartlist_len(sl), ==, 0);
+ tt_int_op(smartlist_len(sl), OP_EQ, 0);
smartlist_free(sl);
sl = microdescs_add_to_cache(get_microdesc_cache(),
"@last-listed 2015-06-22 10:00:00\n"
"wiggly\n",
NULL, SAVED_IN_JOURNAL, 0, time(NULL), NULL);
- tt_int_op(smartlist_len(sl), ==, 0);
+ tt_int_op(smartlist_len(sl), OP_EQ, 0);
smartlist_free(sl);
tor_asprintf(&cp, "%s\n%s", test_md1, "@foobar\nonion-wobble\n");
@@ -838,7 +838,7 @@ test_md_corrupt_desc(void *arg)
sl = microdescs_add_to_cache(get_microdesc_cache(),
cp, cp+strlen(cp),
SAVED_IN_JOURNAL, 0, time(NULL), NULL);
- tt_int_op(smartlist_len(sl), ==, 0);
+ tt_int_op(smartlist_len(sl), OP_EQ, 0);
done:
tor_free(cp);
diff --git a/src/test/test_oos.c b/src/test/test_oos.c
index 9fd6bce5ae..e72fcf5de9 100644
--- a/src/test/test_oos.c
+++ b/src/test/test_oos.c
@@ -52,7 +52,7 @@ kill_conn_list_mock(smartlist_t *conns)
{
++kill_conn_list_calls;
- tt_assert(conns != NULL);
+ tt_ptr_op(conns, OP_NE, NULL);
kill_conn_list_killed += smartlist_len(conns);
@@ -248,7 +248,7 @@ close_for_error_mock(or_connection_t *orconn, int flush)
{
(void)flush;
- tt_assert(orconn != NULL);
+ tt_ptr_op(orconn, OP_NE, NULL);
++cfe_calls;
done:
@@ -264,7 +264,7 @@ mark_for_close_oos_mock(connection_t *conn,
(void)line;
(void)file;
- tt_assert(conn != NULL);
+ tt_ptr_op(conn, OP_NE, NULL);
++mark_calls;
done:
@@ -298,8 +298,8 @@ test_oos_kill_conn_list(void *arg)
dir_c2->base_.purpose = DIR_PURPOSE_MIN_;
c2 = TO_CONN(dir_c2);
- tt_assert(c1 != NULL);
- tt_assert(c2 != NULL);
+ tt_ptr_op(c1, OP_NE, NULL);
+ tt_ptr_op(c2, OP_NE, NULL);
/* Make list */
l = smartlist_new();
@@ -345,7 +345,7 @@ get_num_circuits_mock(or_connection_t *conn)
{
int circs = 0;
- tt_assert(conn != NULL);
+ tt_ptr_op(conn, OP_NE, NULL);
if (conns_with_circs &&
smartlist_contains(conns_with_circs, TO_CONN(conn))) {
@@ -397,7 +397,7 @@ test_oos_pick_oos_victims(void *arg)
/* Try picking one */
picked = pick_oos_victims(1);
/* It should be the one with circuits */
- tt_assert(picked != NULL);
+ tt_ptr_op(picked, OP_NE, NULL);
tt_int_op(smartlist_len(picked), OP_EQ, 1);
tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0)));
smartlist_free(picked);
@@ -405,14 +405,14 @@ test_oos_pick_oos_victims(void *arg)
/* Try picking none */
picked = pick_oos_victims(0);
/* We should get an empty list */
- tt_assert(picked != NULL);
+ tt_ptr_op(picked, OP_NE, NULL);
tt_int_op(smartlist_len(picked), OP_EQ, 0);
smartlist_free(picked);
/* Try picking two */
picked = pick_oos_victims(2);
/* We should get both active orconns */
- tt_assert(picked != NULL);
+ tt_ptr_op(picked, OP_NE, NULL);
tt_int_op(smartlist_len(picked), OP_EQ, 2);
tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 0)));
tt_assert(smartlist_contains(picked, smartlist_get(conns_for_mock, 1)));
diff --git a/src/test/test_options.c b/src/test/test_options.c
index ad735b72a6..5f35c47f79 100644
--- a/src/test/test_options.c
+++ b/src/test/test_options.c
@@ -299,7 +299,7 @@ test_have_enough_mem_for_dircache(void *arg)
/* 300 MB RAM available, DirCache enabled */
r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg);
tt_int_op(r, OP_EQ, 0);
- tt_assert(!msg);
+ tt_ptr_op(msg, OP_EQ, NULL);
/* 200 MB RAM available, DirCache enabled */
r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg);
@@ -322,7 +322,7 @@ test_have_enough_mem_for_dircache(void *arg)
/* 300 MB RAM available, DirCache enabled, Bridge */
r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg);
tt_int_op(r, OP_EQ, 0);
- tt_assert(!msg);
+ tt_ptr_op(msg, OP_EQ, NULL);
/* 200 MB RAM available, DirCache enabled, Bridge */
r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg);
@@ -345,7 +345,7 @@ test_have_enough_mem_for_dircache(void *arg)
/* 200 MB RAM available, DirCache disabled */
r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(200), &msg);
tt_int_op(r, OP_EQ, 0);
- tt_assert(!msg);
+ tt_ptr_op(msg, OP_EQ, NULL);
/* 300 MB RAM available, DirCache disabled */
r = have_enough_mem_for_dircache(opt, MEGABYTEIFY(300), &msg);
@@ -430,24 +430,24 @@ get_options_test_data(const char *conf)
result->opt->ConnectionPadding = -1; // default must be "auto"
rv = config_get_lines(conf, &cl, 1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
rv = config_assign(&options_format, result->opt, cl, 0, &msg);
if (msg) {
/* Display the parse error message by comparing it with an empty string */
tt_str_op(msg, OP_EQ, "");
}
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
config_free_lines(cl);
result->opt->LogTimeGranularity = 1;
result->opt->TokenBucketRefillInterval = 1;
rv = config_get_lines(TEST_OPTIONS_OLD_VALUES, &cl, 1);
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
rv = config_assign(&options_format, result->def_opt, cl, 0, &msg);
if (msg) {
/* Display the parse error message by comparing it with an empty string */
tt_str_op(msg, OP_EQ, "");
}
- tt_assert(rv == 0);
+ tt_int_op(rv, OP_EQ, 0);
done:
config_free_lines(cl);
diff --git a/src/test/test_policy.c b/src/test/test_policy.c
index 1b2fac4325..83dca2d431 100644
--- a/src/test/test_policy.c
+++ b/src/test/test_policy.c
@@ -59,7 +59,7 @@ test_policy_summary_helper_family_flags(const char *policy_str,
summary = policy_summarize(policy, family);
- tt_assert(summary != NULL);
+ tt_ptr_op(summary, OP_NE, NULL);
tt_str_op(summary,OP_EQ, expected_summary);
short_policy = parse_short_policy(summary);
@@ -147,7 +147,7 @@ test_policies_general(void *arg)
p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
tt_int_op(ADDR_POLICY_REJECT,OP_EQ, p->policy_type);
tor_addr_from_ipv4h(&tar, 0xc0a80000u);
tt_int_op(0,OP_EQ, tor_addr_compare(&p->addr, &tar, CMP_EXACT));
@@ -192,75 +192,75 @@ test_policies_general(void *arg)
policy3 = smartlist_new();
p = router_parse_addr_policy_item_from_string("reject *:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy3, p);
p = router_parse_addr_policy_item_from_string("accept *:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy3, p);
policy4 = smartlist_new();
p = router_parse_addr_policy_item_from_string("accept *:443", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy4, p);
p = router_parse_addr_policy_item_from_string("accept *:443", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy4, p);
policy5 = smartlist_new();
p = router_parse_addr_policy_item_from_string("reject 0.0.0.0/8:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject 169.254.0.0/16:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject 127.0.0.0/8:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",
-1, &malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject 10.0.0.0/8:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject 172.16.0.0/12:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject 80.190.250.90:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject *:1-65534", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("reject *:65535", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
p = router_parse_addr_policy_item_from_string("accept *:1-65535", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy5, p);
policy6 = smartlist_new();
p = router_parse_addr_policy_item_from_string("accept 43.3.0.0/9:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy6, p);
policy7 = smartlist_new();
p = router_parse_addr_policy_item_from_string("accept 0.0.0.0/8:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy7, p);
tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy8,
@@ -282,13 +282,13 @@ test_policies_general(void *arg)
policy10 = smartlist_new();
p = router_parse_addr_policy_item_from_string("accept6 *:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy10, p);
policy11 = smartlist_new();
p = router_parse_addr_policy_item_from_string("reject6 *:*", -1,
&malformed_list);
- tt_assert(p != NULL);
+ tt_ptr_op(p, OP_NE, NULL);
smartlist_add(policy11, p);
tt_assert(!exit_policy_is_general_exit(policy));
@@ -392,21 +392,21 @@ test_policies_general(void *arg)
p = router_parse_addr_policy_item_from_string("acce::abcd",
ADDR_POLICY_ACCEPT,
&malformed_list);
- tt_assert(!p);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
malformed_list = 0;
p = router_parse_addr_policy_item_from_string("7:1234",
ADDR_POLICY_ACCEPT,
&malformed_list);
- tt_assert(!p);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
malformed_list = 0;
p = router_parse_addr_policy_item_from_string("::",
ADDR_POLICY_ACCEPT,
&malformed_list);
- tt_assert(!p);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
malformed_list = 0;
@@ -968,63 +968,63 @@ test_policies_general(void *arg)
/* Make sure that IPv4 addresses are ignored in accept6/reject6 lines. */
p = router_parse_addr_policy_item_from_string("accept6 1.2.3.4:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(!malformed_list);
p = router_parse_addr_policy_item_from_string("reject6 2.4.6.0/24:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(!malformed_list);
p = router_parse_addr_policy_item_from_string("accept6 *4:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(!malformed_list);
/* Make sure malformed policies are detected as such. */
p = router_parse_addr_policy_item_from_string("bad_token *4:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("accept6 **:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("accept */15:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("reject6 */:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("accept 127.0.0.1/33:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("accept6 [::1]/129:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("reject 8.8.8.8/-1:*", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("reject 8.8.4.4:10-5", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
p = router_parse_addr_policy_item_from_string("reject 1.2.3.4:-1", -1,
&malformed_list);
- tt_assert(p == NULL);
+ tt_ptr_op(p, OP_EQ, NULL);
tt_assert(malformed_list);
/* Test a too-long policy. */
@@ -1148,7 +1148,7 @@ test_policies_reject_exit_address(void *arg)
/* test that IPv4 addresses are rejected on an IPv4-only exit */
policies_parse_exit_policy_reject_private(&policy, 0, ipv4_list, 0, 0);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 1);
+ tt_int_op(smartlist_len(policy), OP_EQ, 1);
tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
addr_policy_list_free(policy);
policy = NULL;
@@ -1158,12 +1158,12 @@ test_policies_reject_exit_address(void *arg)
* on IPv4-only exits, so policies_parse_exit_policy_reject_private doesn't
* need to do anything) */
policies_parse_exit_policy_reject_private(&policy, 0, ipv6_list, 0, 0);
- tt_assert(policy == NULL);
+ tt_ptr_op(policy, OP_EQ, NULL);
/* test that only IPv4 addresses are rejected on an IPv4-only exit */
policies_parse_exit_policy_reject_private(&policy, 0, both_list, 0, 0);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 1);
+ tt_int_op(smartlist_len(policy), OP_EQ, 1);
tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
addr_policy_list_free(policy);
policy = NULL;
@@ -1171,7 +1171,7 @@ test_policies_reject_exit_address(void *arg)
/* Test that lists with duplicate entries produce the same results */
policies_parse_exit_policy_reject_private(&policy, 0, dupl_list, 0, 0);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 1);
+ tt_int_op(smartlist_len(policy), OP_EQ, 1);
tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
addr_policy_list_free(policy);
policy = NULL;
@@ -1181,7 +1181,7 @@ test_policies_reject_exit_address(void *arg)
/* test that IPv4 addresses are rejected on an IPv4/IPv6 exit */
policies_parse_exit_policy_reject_private(&policy, 1, ipv4_list, 0, 0);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 1);
+ tt_int_op(smartlist_len(policy), OP_EQ, 1);
tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
addr_policy_list_free(policy);
policy = NULL;
@@ -1189,7 +1189,7 @@ test_policies_reject_exit_address(void *arg)
/* test that IPv6 addresses are rejected on an IPv4/IPv6 exit */
policies_parse_exit_policy_reject_private(&policy, 1, ipv6_list, 0, 0);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 1);
+ tt_int_op(smartlist_len(policy), OP_EQ, 1);
tt_assert(test_policy_has_address_helper(policy, &ipv6_addr));
addr_policy_list_free(policy);
policy = NULL;
@@ -1197,7 +1197,7 @@ test_policies_reject_exit_address(void *arg)
/* test that IPv4 and IPv6 addresses are rejected on an IPv4/IPv6 exit */
policies_parse_exit_policy_reject_private(&policy, 1, both_list, 0, 0);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 2);
+ tt_int_op(smartlist_len(policy), OP_EQ, 2);
tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
tt_assert(test_policy_has_address_helper(policy, &ipv6_addr));
addr_policy_list_free(policy);
@@ -1206,7 +1206,7 @@ test_policies_reject_exit_address(void *arg)
/* Test that lists with duplicate entries produce the same results */
policies_parse_exit_policy_reject_private(&policy, 1, dupl_list, 0, 0);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 2);
+ tt_int_op(smartlist_len(policy), OP_EQ, 2);
tt_assert(test_policy_has_address_helper(policy, &ipv4_addr));
tt_assert(test_policy_has_address_helper(policy, &ipv6_addr));
addr_policy_list_free(policy);
@@ -1258,7 +1258,7 @@ test_policies_reject_port_address(void *arg)
* with IPv6 addresses on IPv4-only exits) */
policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 1);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 1);
+ tt_int_op(smartlist_len(policy), OP_EQ, 1);
tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr));
addr_policy_list_free(policy);
policy = NULL;
@@ -1266,7 +1266,7 @@ test_policies_reject_port_address(void *arg)
/* test that IPv4 and IPv6 ports are rejected on an IPv4/IPv6 exit */
policies_parse_exit_policy_reject_private(&policy, 1, NULL, 0, 1);
tt_assert(policy);
- tt_assert(smartlist_len(policy) == 2);
+ tt_int_op(smartlist_len(policy), OP_EQ, 2);
tt_assert(test_policy_has_address_helper(policy, &ipv4_port->addr));
tt_assert(test_policy_has_address_helper(policy, &ipv6_port->addr));
addr_policy_list_free(policy);
@@ -1337,7 +1337,7 @@ test_policies_reject_interface_address(void *arg)
/* test that no addresses are rejected when none are supplied/requested */
policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0);
- tt_assert(policy == NULL);
+ tt_ptr_op(policy, OP_EQ, NULL);
/* test that only IPv4 interface addresses are rejected on an IPv4-only exit
* (and allow for duplicates)
@@ -1372,7 +1372,7 @@ test_policies_reject_interface_address(void *arg)
/* test that no addresses are rejected when none are supplied/requested */
policies_parse_exit_policy_reject_private(&policy, 0, NULL, 0, 0);
- tt_assert(policy == NULL);
+ tt_ptr_op(policy, OP_EQ, NULL);
/* test that only IPv4 interface addresses are rejected on an IPv4-only exit
*/
@@ -1528,15 +1528,15 @@ test_policies_getinfo_helper_policies(void *arg)
memset(&mock_my_routerinfo, 0, sizeof(mock_my_routerinfo));
rv = getinfo_helper_policies(NULL, "exit-policy/default", &answer, &errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) > 0);
tor_free(answer);
rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/default",
&answer, &errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) > 0);
tor_free(answer);
@@ -1550,15 +1550,15 @@ test_policies_getinfo_helper_policies(void *arg)
rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
&answer, &errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) == 0);
tor_free(answer);
rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer,
&errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
ipv4_len = strlen(answer);
tt_assert(ipv4_len == 0 || ipv4_len == strlen(DEFAULT_POLICY_STRING));
tt_assert(ipv4_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING));
@@ -1566,8 +1566,8 @@ test_policies_getinfo_helper_policies(void *arg)
rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer,
&errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
ipv6_len = strlen(answer);
tt_assert(ipv6_len == 0 || ipv6_len == strlen(DEFAULT_POLICY_STRING));
tt_assert(ipv6_len == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING));
@@ -1575,8 +1575,8 @@ test_policies_getinfo_helper_policies(void *arg)
rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
&errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
/* It's either empty or it's the default */
tt_assert(strlen(answer) == 0 || !strcasecmp(answer, DEFAULT_POLICY_STRING));
tor_free(answer);
@@ -1599,8 +1599,8 @@ test_policies_getinfo_helper_policies(void *arg)
rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
&answer, &errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) > 0);
tor_free(answer);
@@ -1609,8 +1609,8 @@ test_policies_getinfo_helper_policies(void *arg)
rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
&answer, &errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) > 0);
tor_free(answer);
@@ -1619,8 +1619,8 @@ test_policies_getinfo_helper_policies(void *arg)
rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
&answer, &errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) > 0);
tor_free(answer);
@@ -1629,31 +1629,31 @@ test_policies_getinfo_helper_policies(void *arg)
rv = getinfo_helper_policies(NULL, "exit-policy/reject-private/relay",
&answer, &errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) == 0);
tor_free(answer);
rv = getinfo_helper_policies(NULL, "exit-policy/ipv4", &answer,
&errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
ipv4_len = strlen(answer);
tt_assert(ipv4_len > 0);
tor_free(answer);
rv = getinfo_helper_policies(NULL, "exit-policy/ipv6", &answer,
&errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
ipv6_len = strlen(answer);
tt_assert(ipv6_len > 0);
tor_free(answer);
rv = getinfo_helper_policies(NULL, "exit-policy/full", &answer,
&errmsg);
- tt_assert(rv == 0);
- tt_assert(answer != NULL);
+ tt_int_op(rv, OP_EQ, 0);
+ tt_ptr_op(answer, OP_NE, NULL);
tt_assert(strlen(answer) > 0);
tt_assert(strlen(answer) == ipv4_len + ipv6_len + 1);
tor_free(answer);
@@ -1746,34 +1746,34 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 1;
mock_options.UseBridges = 0;
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
/* Preferring IPv4 */
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0),
+ OP_EQ, 0);
/* Preferring IPv6 */
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1)
- == 0);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1)
- == 1);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1),
+ OP_EQ, 0);
/* Test the function's address matching with UseBridges on */
memset(&mock_options, 0, sizeof(or_options_t));
@@ -1781,46 +1781,46 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 1;
mock_options.UseBridges = 1;
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
/* Preferring IPv4 */
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0),
+ OP_EQ, 0);
/* Preferring IPv6 */
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1)
- == 0);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1)
- == 1);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1),
+ OP_EQ, 0);
/* bridge clients always use IPv6, regardless of ClientUseIPv6 */
mock_options.ClientUseIPv4 = 1;
mock_options.ClientUseIPv6 = 0;
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
/* Test the function's address matching with IPv4 on */
memset(&mock_options, 0, sizeof(or_options_t));
@@ -1828,14 +1828,14 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 0;
mock_options.UseBridges = 0;
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
/* Test the function's address matching with IPv6 on */
memset(&mock_options, 0, sizeof(or_options_t));
@@ -1843,14 +1843,14 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 1;
mock_options.UseBridges = 0;
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
/* Test the function's address matching with ClientUseIPv4 0.
* This means "use IPv6" regardless of the other settings. */
@@ -1859,14 +1859,14 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 0;
mock_options.UseBridges = 0;
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
/* Test the function's address matching for unusual inputs */
memset(&mock_options, 0, sizeof(or_options_t));
@@ -1875,27 +1875,28 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.UseBridges = 1;
/* NULL and tor_addr_is_null addresses are rejected */
- tt_assert(fascist_firewall_allows_address(NULL, port, policy, 0, 0) == 0);
- tt_assert(fascist_firewall_allows_address(&n_ipv4_addr, port, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&n_ipv6_addr, port, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(NULL, port, policy, 0, 0), OP_EQ,
+ 0);
+ tt_int_op(fascist_firewall_allows_address(&n_ipv4_addr, port, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&n_ipv6_addr, port, policy, 0, 0),
+ OP_EQ, 0);
/* zero ports are rejected */
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, 0, policy, 0, 0)
- == 0);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, 0, policy, 0, 0)
- == 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, 0, policy, 0, 0),
+ OP_EQ, 0);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, 0, policy, 0, 0),
+ OP_EQ, 0);
/* NULL and empty policies accept everything */
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, NULL, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, NULL, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv4_addr, port, e_policy, 0, 0)
- == 1);
- tt_assert(fascist_firewall_allows_address(&ipv6_addr, port, e_policy, 0, 0)
- == 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, NULL, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, NULL, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, e_policy, 0, 0),
+ OP_EQ, 1);
+ tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, e_policy, 0, 0),
+ OP_EQ, 1);
done:
addr_policy_free(item);
@@ -2032,12 +2033,12 @@ test_policies_fascist_firewall_choose_address(void *arg)
== &ipv6_or_ap);
/* null both OR addresses */
- tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
- FIREWALL_OR_CONNECTION, 0, 1)
- == NULL);
- tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
- FIREWALL_OR_CONNECTION, 0, 0)
- == NULL);
+ tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
+ FIREWALL_OR_CONNECTION, 0, 1),
+ OP_EQ, NULL);
+ tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
+ FIREWALL_OR_CONNECTION, 0, 0),
+ OP_EQ, NULL);
/* null preferred Dir addresses */
tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &n_ipv6_ap, 0,
@@ -2048,12 +2049,12 @@ test_policies_fascist_firewall_choose_address(void *arg)
== &ipv6_dir_ap);
/* null both Dir addresses */
- tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
- FIREWALL_DIR_CONNECTION, 0, 1)
- == NULL);
- tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
- FIREWALL_DIR_CONNECTION, 0, 0)
- == NULL);
+ tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
+ FIREWALL_DIR_CONNECTION, 0, 1),
+ OP_EQ, NULL);
+ tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
+ FIREWALL_DIR_CONNECTION, 0, 0),
+ OP_EQ, NULL);
/* Prefer IPv4 but want IPv6 (contradictory) */
tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
diff --git a/src/test/test_protover.c b/src/test/test_protover.c
index 5626816024..6ce54890d6 100644
--- a/src/test/test_protover.c
+++ b/src/test/test_protover.c
@@ -88,27 +88,27 @@ test_protover_parse_fail(void *arg)
/* random junk */
elts = parse_protocol_list("!!3@*");
- tt_assert(elts == NULL);
+ tt_ptr_op(elts, OP_EQ, NULL);
/* Missing equals sign in an entry */
elts = parse_protocol_list("Link=4 Haprauxymatyve Desc=9");
- tt_assert(elts == NULL);
+ tt_ptr_op(elts, OP_EQ, NULL);
/* Missing word. */
elts = parse_protocol_list("Link=4 =3 Desc=9");
- tt_assert(elts == NULL);
+ tt_ptr_op(elts, OP_EQ, NULL);
/* Broken numbers */
elts = parse_protocol_list("Link=fred");
- tt_assert(elts == NULL);
+ tt_ptr_op(elts, OP_EQ, NULL);
elts = parse_protocol_list("Link=1,fred");
- tt_assert(elts == NULL);
+ tt_ptr_op(elts, OP_EQ, NULL);
elts = parse_protocol_list("Link=1,fred,3");
- tt_assert(elts == NULL);
+ tt_ptr_op(elts, OP_EQ, NULL);
/* Broken range */
elts = parse_protocol_list("Link=1,9-8,3");
- tt_assert(elts == NULL);
+ tt_ptr_op(elts, OP_EQ, NULL);
done:
;
@@ -151,16 +151,16 @@ test_protover_all_supported(void *arg)
char *msg = NULL;
tt_assert(protover_all_supported(NULL, &msg));
- tt_assert(msg == NULL);
+ tt_ptr_op(msg, OP_EQ, NULL);
tt_assert(protover_all_supported("", &msg));
- tt_assert(msg == NULL);
+ tt_ptr_op(msg, OP_EQ, NULL);
// Some things that we do support
tt_assert(protover_all_supported("Link=3-4", &msg));
- tt_assert(msg == NULL);
+ tt_ptr_op(msg, OP_EQ, NULL);
tt_assert(protover_all_supported("Link=3-4 Desc=2", &msg));
- tt_assert(msg == NULL);
+ tt_ptr_op(msg, OP_EQ, NULL);
// Some things we don't support
tt_assert(! protover_all_supported("Wombat=9", &msg));
diff --git a/src/test/test_pt.c b/src/test/test_pt.c
index 79b03171bc..07b6712ff9 100644
--- a/src/test/test_pt.c
+++ b/src/test/test_pt.c
@@ -40,34 +40,34 @@ test_pt_parsing(void *arg)
/* incomplete cmethod */
strlcpy(line,"CMETHOD trebuchet",sizeof(line));
- tt_assert(parse_cmethod_line(line, mp) < 0);
+ tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0);
reset_mp(mp);
/* wrong proxy type */
strlcpy(line,"CMETHOD trebuchet dog 127.0.0.1:1999",sizeof(line));
- tt_assert(parse_cmethod_line(line, mp) < 0);
+ tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0);
reset_mp(mp);
/* wrong addrport */
strlcpy(line,"CMETHOD trebuchet socks4 abcd",sizeof(line));
- tt_assert(parse_cmethod_line(line, mp) < 0);
+ tt_int_op(parse_cmethod_line(line, mp), OP_LT, 0);
reset_mp(mp);
/* correct line */
strlcpy(line,"CMETHOD trebuchet socks5 127.0.0.1:1999",sizeof(line));
- tt_assert(parse_cmethod_line(line, mp) == 0);
- tt_assert(smartlist_len(mp->transports) == 1);
+ tt_int_op(parse_cmethod_line(line, mp), OP_EQ, 0);
+ tt_int_op(smartlist_len(mp->transports), OP_EQ, 1);
transport = smartlist_get(mp->transports, 0);
/* test registered address of transport */
tor_addr_parse(&test_addr, "127.0.0.1");
tt_assert(tor_addr_eq(&test_addr, &transport->addr));
/* test registered port of transport */
- tt_assert(transport->port == 1999);
+ tt_uint_op(transport->port, OP_EQ, 1999);
/* test registered SOCKS version of transport */
- tt_assert(transport->socks_version == PROXY_SOCKS5);
+ tt_int_op(transport->socks_version, OP_EQ, PROXY_SOCKS5);
/* test registered name of transport */
tt_str_op(transport->name,OP_EQ, "trebuchet");
@@ -75,26 +75,26 @@ test_pt_parsing(void *arg)
/* incomplete smethod */
strlcpy(line,"SMETHOD trebuchet",sizeof(line));
- tt_assert(parse_smethod_line(line, mp) < 0);
+ tt_int_op(parse_smethod_line(line, mp), OP_LT, 0);
reset_mp(mp);
/* wrong addr type */
strlcpy(line,"SMETHOD trebuchet abcd",sizeof(line));
- tt_assert(parse_smethod_line(line, mp) < 0);
+ tt_int_op(parse_smethod_line(line, mp), OP_LT, 0);
reset_mp(mp);
/* cowwect */
strlcpy(line,"SMETHOD trebuchy 127.0.0.2:2999",sizeof(line));
- tt_assert(parse_smethod_line(line, mp) == 0);
- tt_assert(smartlist_len(mp->transports) == 1);
+ tt_int_op(parse_smethod_line(line, mp), OP_EQ, 0);
+ tt_int_op(smartlist_len(mp->transports), OP_EQ, 1);
transport = smartlist_get(mp->transports, 0);
/* test registered address of transport */
tor_addr_parse(&test_addr, "127.0.0.2");
tt_assert(tor_addr_eq(&test_addr, &transport->addr));
/* test registered port of transport */
- tt_assert(transport->port == 2999);
+ tt_uint_op(transport->port, OP_EQ, 2999);
/* test registered name of transport */
tt_str_op(transport->name,OP_EQ, "trebuchy");
@@ -104,7 +104,7 @@ test_pt_parsing(void *arg)
strlcpy(line,"SMETHOD trebuchet 127.0.0.1:9999 "
"ARGS:counterweight=3,sling=snappy",
sizeof(line));
- tt_assert(parse_smethod_line(line, mp) == 0);
+ tt_int_op(parse_smethod_line(line, mp), OP_EQ, 0);
tt_int_op(1, OP_EQ, smartlist_len(mp->transports));
{
const transport_t *transport_ = smartlist_get(mp->transports, 0);
@@ -119,15 +119,15 @@ test_pt_parsing(void *arg)
/* unsupported version */
strlcpy(line,"VERSION 666",sizeof(line));
- tt_assert(parse_version(line, mp) < 0);
+ tt_int_op(parse_version(line, mp), OP_LT, 0);
/* incomplete VERSION */
strlcpy(line,"VERSION ",sizeof(line));
- tt_assert(parse_version(line, mp) < 0);
+ tt_int_op(parse_version(line, mp), OP_LT, 0);
/* correct VERSION */
strlcpy(line,"VERSION 1",sizeof(line));
- tt_assert(parse_version(line, mp) == 0);
+ tt_int_op(parse_version(line, mp), OP_EQ, 0);
done:
reset_mp(mp);
@@ -461,7 +461,7 @@ test_get_pt_proxy_uri(void *arg)
/* Test with no proxy. */
uri = get_pt_proxy_uri();
- tt_assert(uri == NULL);
+ tt_ptr_op(uri, OP_EQ, NULL);
/* Test with a SOCKS4 proxy. */
options->Socks4Proxy = tor_strdup("192.0.2.1:1080");
diff --git a/src/test/test_relay.c b/src/test/test_relay.c
index 238d4c5baf..e3489627a0 100644
--- a/src/test/test_relay.c
+++ b/src/test/test_relay.c
@@ -91,14 +91,14 @@ test_relay_append_cell_to_circuit_queue(void *arg)
append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), nchan, cell,
CELL_DIRECTION_OUT, 0);
new_count = get_mock_scheduler_has_waiting_cells_count();
- tt_int_op(new_count, ==, old_count + 1);
+ tt_int_op(new_count, OP_EQ, old_count + 1);
/* Now try the reverse direction */
old_count = get_mock_scheduler_has_waiting_cells_count();
append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), pchan, cell,
CELL_DIRECTION_IN, 0);
new_count = get_mock_scheduler_has_waiting_cells_count();
- tt_int_op(new_count, ==, old_count + 1);
+ tt_int_op(new_count, OP_EQ, old_count + 1);
UNMOCK(scheduler_channel_has_waiting_cells);
diff --git a/src/test/test_rendcache.c b/src/test/test_rendcache.c
index feba8f664e..0db52292c7 100644
--- a/src/test/test_rendcache.c
+++ b/src/test/test_rendcache.c
@@ -21,22 +21,6 @@ static const int TIME_IN_THE_PAST = -(REND_CACHE_MAX_AGE + \
REND_CACHE_MAX_SKEW + 60);
static const int TIME_IN_THE_FUTURE = REND_CACHE_MAX_SKEW + 60;
-static rend_data_t *
-mock_rend_data(const char *onion_address)
-{
- rend_data_v2_t *v2_data = tor_malloc_zero(sizeof(*v2_data));
- rend_data_t *rend_query = &v2_data->base_;
- rend_query->version = 2;
-
- strlcpy(v2_data->onion_address, onion_address,
- sizeof(v2_data->onion_address));
- v2_data->auth_type = REND_NO_AUTH;
- rend_query->hsdirs_fp = smartlist_new();
- smartlist_add(rend_query->hsdirs_fp, tor_memdup("aaaaaaaaaaaaaaaaaaaaaaaa",
- DIGEST_LEN));
- return rend_query;
-}
-
static void
test_rend_cache_lookup_entry(void *data)
{
@@ -962,9 +946,9 @@ test_rend_cache_free_all(void *data)
rend_cache_free_all();
- tt_assert(!rend_cache);
- tt_assert(!rend_cache_v2_dir);
- tt_assert(!rend_cache_failure);
+ tt_ptr_op(rend_cache, OP_EQ, NULL);
+ tt_ptr_op(rend_cache_v2_dir, OP_EQ, NULL);
+ tt_ptr_op(rend_cache_failure, OP_EQ, NULL);
tt_assert(!rend_cache_total_allocation);
done:
diff --git a/src/test/test_replay.c b/src/test/test_replay.c
index 80e7203716..c379cafa7c 100644
--- a/src/test/test_replay.c
+++ b/src/test/test_replay.c
@@ -38,7 +38,7 @@ test_replaycache_alloc(void *arg)
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
done:
if (r) replaycache_free(r);
@@ -54,15 +54,15 @@ test_replaycache_badalloc(void *arg)
/* Negative horizon should fail */
(void)arg;
r = replaycache_new(-600, 300);
- tt_assert(r == NULL);
+ tt_ptr_op(r, OP_EQ, NULL);
/* Negative interval should get adjusted to zero */
r = replaycache_new(600, -300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
tt_int_op(r->scrub_interval,OP_EQ, 0);
replaycache_free(r);
/* Negative horizon and negative interval should still fail */
r = replaycache_new(-600, -300);
- tt_assert(r == NULL);
+ tt_ptr_op(r, OP_EQ, NULL);
done:
if (r) replaycache_free(r);
@@ -90,7 +90,7 @@ test_replaycache_miss(void *arg)
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
@@ -123,7 +123,7 @@ test_replaycache_hit(void *arg)
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
@@ -161,7 +161,7 @@ test_replaycache_age(void *arg)
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
@@ -193,7 +193,7 @@ test_replaycache_elapsed(void *arg)
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
@@ -220,7 +220,7 @@ test_replaycache_noexpire(void *arg)
(void)arg;
r = replaycache_new(0, 0);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
@@ -251,7 +251,7 @@ test_replaycache_scrub(void *arg)
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
/* Set up like in test_replaycache_hit() */
result =
@@ -294,7 +294,7 @@ test_replaycache_future(void *arg)
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
/* Set up like in test_replaycache_hit() */
result =
@@ -343,7 +343,7 @@ test_replaycache_realtime(void *arg)
/* Test the realtime as well as *_internal() entry points */
(void)arg;
r = replaycache_new(600, 300);
- tt_assert(r != NULL);
+ tt_ptr_op(r, OP_NE, NULL);
/* This should miss */
result =
diff --git a/src/test/test_routerkeys.c b/src/test/test_routerkeys.c
index db6b9b3872..821faa5052 100644
--- a/src/test/test_routerkeys.c
+++ b/src/test/test_routerkeys.c
@@ -92,8 +92,8 @@ test_routerkeys_ed_certs(void *args)
uint8_t *junk = NULL;
char *base64 = NULL;
- tt_int_op(0,==,ed25519_keypair_generate(&kp1, 0));
- tt_int_op(0,==,ed25519_keypair_generate(&kp2, 0));
+ tt_int_op(0,OP_EQ,ed25519_keypair_generate(&kp1, 0));
+ tt_int_op(0,OP_EQ,ed25519_keypair_generate(&kp2, 0));
for (int i = 0; i <= 1; ++i) {
uint32_t flags = i ? CERT_FLAG_INCLUDE_SIGNING_KEY : 0;
@@ -101,45 +101,45 @@ test_routerkeys_ed_certs(void *args)
cert[i] = tor_cert_create(&kp1, 5, &kp2.pubkey, now, 10000, flags);
tt_assert(cert[i]);
- tt_assert(cert[i]->sig_bad == 0);
- tt_assert(cert[i]->sig_ok == 1);
- tt_assert(cert[i]->cert_expired == 0);
- tt_assert(cert[i]->cert_valid == 1);
- tt_int_op(cert[i]->cert_type, ==, 5);
- tt_mem_op(cert[i]->signed_key.pubkey, ==, &kp2.pubkey.pubkey, 32);
- tt_mem_op(cert[i]->signing_key.pubkey, ==, &kp1.pubkey.pubkey, 32);
- tt_int_op(cert[i]->signing_key_included, ==, i);
+ tt_uint_op(cert[i]->sig_bad, OP_EQ, 0);
+ tt_uint_op(cert[i]->sig_ok, OP_EQ, 1);
+ tt_uint_op(cert[i]->cert_expired, OP_EQ, 0);
+ tt_uint_op(cert[i]->cert_valid, OP_EQ, 1);
+ tt_int_op(cert[i]->cert_type, OP_EQ, 5);
+ tt_mem_op(cert[i]->signed_key.pubkey, OP_EQ, &kp2.pubkey.pubkey, 32);
+ tt_mem_op(cert[i]->signing_key.pubkey, OP_EQ, &kp1.pubkey.pubkey, 32);
+ tt_int_op(cert[i]->signing_key_included, OP_EQ, i);
tt_assert(cert[i]->encoded);
- tt_int_op(cert[i]->encoded_len, ==, 104 + 36 * i);
- tt_int_op(cert[i]->encoded[0], ==, 1);
- tt_int_op(cert[i]->encoded[1], ==, 5);
+ tt_int_op(cert[i]->encoded_len, OP_EQ, 104 + 36 * i);
+ tt_int_op(cert[i]->encoded[0], OP_EQ, 1);
+ tt_int_op(cert[i]->encoded[1], OP_EQ, 5);
parsed_cert[i] = tor_cert_parse(cert[i]->encoded, cert[i]->encoded_len);
tt_assert(parsed_cert[i]);
- tt_int_op(cert[i]->encoded_len, ==, parsed_cert[i]->encoded_len);
- tt_mem_op(cert[i]->encoded, ==, parsed_cert[i]->encoded,
+ tt_int_op(cert[i]->encoded_len, OP_EQ, parsed_cert[i]->encoded_len);
+ tt_mem_op(cert[i]->encoded, OP_EQ, parsed_cert[i]->encoded,
cert[i]->encoded_len);
- tt_assert(parsed_cert[i]->sig_bad == 0);
- tt_assert(parsed_cert[i]->sig_ok == 0);
- tt_assert(parsed_cert[i]->cert_expired == 0);
- tt_assert(parsed_cert[i]->cert_valid == 0);
+ tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0);
+ tt_uint_op(parsed_cert[i]->sig_ok, OP_EQ, 0);
+ tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 0);
+ tt_uint_op(parsed_cert[i]->cert_valid, OP_EQ, 0);
/* Expired */
tt_int_op(tor_cert_checksig(parsed_cert[i], &kp1.pubkey, now + 30000),
- <, 0);
- tt_assert(parsed_cert[i]->cert_expired == 1);
+ OP_LT, 0);
+ tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 1);
parsed_cert[i]->cert_expired = 0;
/* Wrong key */
- tt_int_op(tor_cert_checksig(parsed_cert[i], &kp2.pubkey, now), <, 0);
- tt_assert(parsed_cert[i]->sig_bad== 1);
+ tt_int_op(tor_cert_checksig(parsed_cert[i], &kp2.pubkey, now), OP_LT, 0);
+ tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 1);
parsed_cert[i]->sig_bad = 0;
/* Missing key */
int ok = tor_cert_checksig(parsed_cert[i], NULL, now);
- tt_int_op(ok < 0, ==, i == 0);
- tt_assert(parsed_cert[i]->sig_bad == 0);
+ tt_int_op(ok < 0, OP_EQ, i == 0);
+ tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0);
tt_assert(parsed_cert[i]->sig_ok == (i != 0));
tt_assert(parsed_cert[i]->cert_valid == (i != 0));
parsed_cert[i]->sig_bad = 0;
@@ -147,29 +147,29 @@ test_routerkeys_ed_certs(void *args)
parsed_cert[i]->cert_valid = 0;
/* Right key */
- tt_int_op(tor_cert_checksig(parsed_cert[i], &kp1.pubkey, now), ==, 0);
- tt_assert(parsed_cert[i]->sig_bad == 0);
- tt_assert(parsed_cert[i]->sig_ok == 1);
- tt_assert(parsed_cert[i]->cert_expired == 0);
- tt_assert(parsed_cert[i]->cert_valid == 1);
+ tt_int_op(tor_cert_checksig(parsed_cert[i], &kp1.pubkey, now), OP_EQ, 0);
+ tt_uint_op(parsed_cert[i]->sig_bad, OP_EQ, 0);
+ tt_uint_op(parsed_cert[i]->sig_ok, OP_EQ, 1);
+ tt_uint_op(parsed_cert[i]->cert_expired, OP_EQ, 0);
+ tt_uint_op(parsed_cert[i]->cert_valid, OP_EQ, 1);
}
/* Now try some junky certs. */
/* - Truncated */
nocert = tor_cert_parse(cert[0]->encoded, cert[0]->encoded_len-1);
- tt_ptr_op(NULL, ==, nocert);
+ tt_ptr_op(NULL, OP_EQ, nocert);
/* - First byte modified */
cert[0]->encoded[0] = 99;
nocert = tor_cert_parse(cert[0]->encoded, cert[0]->encoded_len);
- tt_ptr_op(NULL, ==, nocert);
+ tt_ptr_op(NULL, OP_EQ, nocert);
cert[0]->encoded[0] = 1;
/* - Extra byte at the end*/
junk = tor_malloc_zero(cert[0]->encoded_len + 1);
memcpy(junk, cert[0]->encoded, cert[0]->encoded_len);
nocert = tor_cert_parse(junk, cert[0]->encoded_len+1);
- tt_ptr_op(NULL, ==, nocert);
+ tt_ptr_op(NULL, OP_EQ, nocert);
/* - Multiple signing key instances */
tor_free(junk);
@@ -183,7 +183,7 @@ test_routerkeys_ed_certs(void *args)
junk[77] = 32; /* extlen */
junk[78] = 4; /* exttype */
nocert = tor_cert_parse(junk, 104 + 36 * 2);
- tt_ptr_op(NULL, ==, nocert);
+ tt_ptr_op(NULL, OP_EQ, nocert);
done:
tor_cert_free(cert[0]);
@@ -211,11 +211,12 @@ test_routerkeys_ed_key_create(void *arg)
kp2 = ed_key_new(kp1, INIT_ED_KEY_NEEDCERT, now, 3600, 4, &cert);
tt_assert(kp2);
tt_assert(cert);
- tt_mem_op(&cert->signed_key, ==, &kp2->pubkey, sizeof(ed25519_public_key_t));
+ tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey,
+ sizeof(ed25519_public_key_t));
tt_assert(! cert->signing_key_included);
- tt_int_op(cert->valid_until, >=, now);
- tt_int_op(cert->valid_until, <=, now+7200);
+ tt_int_op(cert->valid_until, OP_GE, now);
+ tt_int_op(cert->valid_until, OP_LE, now+7200);
/* Create a new key-including certificate signed by kp1 */
ed25519_keypair_free(kp2);
@@ -227,8 +228,10 @@ test_routerkeys_ed_key_create(void *arg)
tt_assert(kp2);
tt_assert(cert);
tt_assert(cert->signing_key_included);
- tt_mem_op(&cert->signed_key, ==, &kp2->pubkey, sizeof(ed25519_public_key_t));
- tt_mem_op(&cert->signing_key, ==, &kp1->pubkey,sizeof(ed25519_public_key_t));
+ tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey,
+ sizeof(ed25519_public_key_t));
+ tt_mem_op(&cert->signing_key, OP_EQ, &kp1->pubkey,
+ sizeof(ed25519_public_key_t));
done:
ed25519_keypair_free(kp1);
@@ -261,8 +264,8 @@ test_routerkeys_ed_key_init_basic(void *arg)
NULL, now, 0, 7, &cert);
tt_assert(kp1 != NULL);
tt_assert(cert == NULL);
- tt_int_op(stat(get_fname("test_ed_key_1_cert"), &st), <, 0);
- tt_int_op(stat(get_fname("test_ed_key_1_secret_key"), &st), ==, 0);
+ tt_int_op(stat(get_fname("test_ed_key_1_cert"), &st), OP_LT, 0);
+ tt_int_op(stat(get_fname("test_ed_key_1_secret_key"), &st), OP_EQ, 0);
/* Fail to load if we say we need a cert */
kp2 = ed_key_init_from_file(fname1, INIT_ED_KEY_NEEDCERT, LOG_INFO,
@@ -279,14 +282,14 @@ test_routerkeys_ed_key_init_basic(void *arg)
NULL, now, 0, 7, &cert);
tt_assert(kp2 != NULL);
tt_assert(cert == NULL);
- tt_mem_op(kp1, ==, kp2, sizeof(*kp1));
+ tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp1));
ed25519_keypair_free(kp2); kp2 = NULL;
kp2 = ed_key_init_from_file(fname1, 0, LOG_INFO,
NULL, now, 0, 7, &cert);
tt_assert(kp2 != NULL);
tt_assert(cert == NULL);
- tt_mem_op(kp1, ==, kp2, sizeof(*kp1));
+ tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp1));
ed25519_keypair_free(kp2); kp2 = NULL;
/* Now create a key with a cert. */
@@ -295,34 +298,34 @@ test_routerkeys_ed_key_init_basic(void *arg)
LOG_INFO, kp1, now, 7200, 7, &cert);
tt_assert(kp2 != NULL);
tt_assert(cert != NULL);
- tt_mem_op(kp1, !=, kp2, sizeof(*kp1));
- tt_int_op(stat(get_fname("test_ed_key_2_cert"), &st), ==, 0);
- tt_int_op(stat(get_fname("test_ed_key_2_secret_key"), &st), ==, 0);
+ tt_mem_op(kp1, OP_NE, kp2, sizeof(*kp1));
+ tt_int_op(stat(get_fname("test_ed_key_2_cert"), &st), OP_EQ, 0);
+ tt_int_op(stat(get_fname("test_ed_key_2_secret_key"), &st), OP_EQ, 0);
tt_assert(cert->cert_valid == 1);
- tt_mem_op(&cert->signed_key, ==, &kp2->pubkey, 32);
+ tt_mem_op(&cert->signed_key, OP_EQ, &kp2->pubkey, 32);
/* Now verify we can load the cert... */
kp3 = ed_key_init_from_file(fname2, (INIT_ED_KEY_CREATE|
INIT_ED_KEY_NEEDCERT),
LOG_INFO, kp1, now, 7200, 7, &cert2);
- tt_mem_op(kp2, ==, kp3, sizeof(*kp2));
- tt_mem_op(cert2->encoded, ==, cert->encoded, cert->encoded_len);
+ tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2));
+ tt_mem_op(cert2->encoded, OP_EQ, cert->encoded, cert->encoded_len);
ed25519_keypair_free(kp3); kp3 = NULL;
tor_cert_free(cert2); cert2 = NULL;
/* ... even without create... */
kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT,
LOG_INFO, kp1, now, 7200, 7, &cert2);
- tt_mem_op(kp2, ==, kp3, sizeof(*kp2));
- tt_mem_op(cert2->encoded, ==, cert->encoded, cert->encoded_len);
+ tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2));
+ tt_mem_op(cert2->encoded, OP_EQ, cert->encoded, cert->encoded_len);
ed25519_keypair_free(kp3); kp3 = NULL;
tor_cert_free(cert2); cert2 = NULL;
/* ... but that we don't crash or anything if we say we don't want it. */
kp3 = ed_key_init_from_file(fname2, INIT_ED_KEY_NEEDCERT,
LOG_INFO, kp1, now, 7200, 7, NULL);
- tt_mem_op(kp2, ==, kp3, sizeof(*kp2));
+ tt_mem_op(kp2, OP_EQ, kp3, sizeof(*kp2));
ed25519_keypair_free(kp3); kp3 = NULL;
/* Fail if we're told the wrong signing key */
@@ -367,16 +370,16 @@ test_routerkeys_ed_key_init_split(void *arg)
LOG_INFO, NULL, now, 0, 7, &cert);
tt_assert(kp1 != NULL);
tt_assert(cert == NULL);
- tt_int_op(stat(get_fname("test_ed_key_3_cert"), &st), <, 0);
- tt_int_op(stat(get_fname("test_ed_key_3_secret_key"), &st), ==, 0);
- tt_int_op(stat(get_fname("test_ed_key_3_public_key"), &st), ==, 0);
+ tt_int_op(stat(get_fname("test_ed_key_3_cert"), &st), OP_LT, 0);
+ tt_int_op(stat(get_fname("test_ed_key_3_secret_key"), &st), OP_EQ, 0);
+ tt_int_op(stat(get_fname("test_ed_key_3_public_key"), &st), OP_EQ, 0);
/* Load it. */
kp2 = ed_key_init_from_file(fname1, flags|INIT_ED_KEY_CREATE,
LOG_INFO, NULL, now, 0, 7, &cert);
tt_assert(kp2 != NULL);
tt_assert(cert == NULL);
- tt_mem_op(kp1, ==, kp2, sizeof(*kp2));
+ tt_mem_op(kp1, OP_EQ, kp2, sizeof(*kp2));
ed25519_keypair_free(kp2); kp2 = NULL;
/* Okay, try killing the secret key and loading it. */
@@ -385,7 +388,7 @@ test_routerkeys_ed_key_init_split(void *arg)
LOG_INFO, NULL, now, 0, 7, &cert);
tt_assert(kp2 != NULL);
tt_assert(cert == NULL);
- tt_mem_op(&kp1->pubkey, ==, &kp2->pubkey, sizeof(kp2->pubkey));
+ tt_mem_op(&kp1->pubkey, OP_EQ, &kp2->pubkey, sizeof(kp2->pubkey));
tt_assert(tor_mem_is_zero((char*)kp2->seckey.seckey,
sizeof(kp2->seckey.seckey)));
ed25519_keypair_free(kp2); kp2 = NULL;
@@ -395,7 +398,7 @@ test_routerkeys_ed_key_init_split(void *arg)
LOG_INFO, NULL, now, 0, 7, &cert);
tt_assert(kp2 != NULL);
tt_assert(cert == NULL);
- tt_mem_op(&kp1->pubkey, ==, &kp2->pubkey, sizeof(kp2->pubkey));
+ tt_mem_op(&kp1->pubkey, OP_EQ, &kp2->pubkey, sizeof(kp2->pubkey));
tt_assert(tor_mem_is_zero((char*)kp2->seckey.seckey,
sizeof(kp2->seckey.seckey)));
ed25519_keypair_free(kp2); kp2 = NULL;
@@ -450,8 +453,8 @@ test_routerkeys_ed_keys_init_all(void *arg)
options->DataDirectory = dir;
- tt_int_op(1, ==, load_ed_keys(options, now));
- tt_int_op(0, ==, generate_ed_link_cert(options, now, 0));
+ tt_int_op(1, OP_EQ, load_ed_keys(options, now));
+ tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0));
tt_assert(get_master_identity_key());
tt_assert(get_master_identity_key());
tt_assert(get_master_signing_keypair());
@@ -465,21 +468,21 @@ test_routerkeys_ed_keys_init_all(void *arg)
link_cert = tor_cert_dup(get_current_link_cert_cert());
/* Call load_ed_keys again, but nothing has changed. */
- tt_int_op(0, ==, load_ed_keys(options, now));
- tt_int_op(0, ==, generate_ed_link_cert(options, now, 0));
- tt_mem_op(&id, ==, get_master_identity_key(), sizeof(id));
- tt_mem_op(&sign, ==, get_master_signing_keypair(), sizeof(sign));
- tt_mem_op(&auth, ==, get_current_auth_keypair(), sizeof(auth));
+ tt_int_op(0, OP_EQ, load_ed_keys(options, now));
+ tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0));
+ tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id));
+ tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign));
+ tt_mem_op(&auth, OP_EQ, get_current_auth_keypair(), sizeof(auth));
tt_assert(tor_cert_eq(link_cert, get_current_link_cert_cert()));
/* Force a reload: we make new link/auth keys. */
routerkeys_free_all();
- tt_int_op(1, ==, load_ed_keys(options, now));
- tt_int_op(0, ==, generate_ed_link_cert(options, now, 0));
- tt_mem_op(&id, ==, get_master_identity_key(), sizeof(id));
- tt_mem_op(&sign, ==, get_master_signing_keypair(), sizeof(sign));
+ tt_int_op(1, OP_EQ, load_ed_keys(options, now));
+ tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0));
+ tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id));
+ tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign));
tt_assert(tor_cert_eq(link_cert, get_current_link_cert_cert()));
- tt_mem_op(&auth, !=, get_current_auth_keypair(), sizeof(auth));
+ tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth));
tt_assert(get_master_signing_key_cert());
tt_assert(get_current_link_cert_cert());
tt_assert(get_current_auth_key_cert());
@@ -488,12 +491,12 @@ test_routerkeys_ed_keys_init_all(void *arg)
memcpy(&auth, get_current_auth_keypair(), sizeof(auth));
/* Force a link/auth-key regeneration by advancing time. */
- tt_int_op(0, ==, load_ed_keys(options, now+3*86400));
- tt_int_op(0, ==, generate_ed_link_cert(options, now+3*86400, 0));
- tt_mem_op(&id, ==, get_master_identity_key(), sizeof(id));
- tt_mem_op(&sign, ==, get_master_signing_keypair(), sizeof(sign));
+ tt_int_op(0, OP_EQ, load_ed_keys(options, now+3*86400));
+ tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now+3*86400, 0));
+ tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id));
+ tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign));
tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert()));
- tt_mem_op(&auth, !=, get_current_auth_keypair(), sizeof(auth));
+ tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth));
tt_assert(get_master_signing_key_cert());
tt_assert(get_current_link_cert_cert());
tt_assert(get_current_auth_key_cert());
@@ -502,12 +505,12 @@ test_routerkeys_ed_keys_init_all(void *arg)
memcpy(&auth, get_current_auth_keypair(), sizeof(auth));
/* Force a signing-key regeneration by advancing time. */
- tt_int_op(1, ==, load_ed_keys(options, now+100*86400));
- tt_int_op(0, ==, generate_ed_link_cert(options, now+100*86400, 0));
- tt_mem_op(&id, ==, get_master_identity_key(), sizeof(id));
- tt_mem_op(&sign, !=, get_master_signing_keypair(), sizeof(sign));
+ tt_int_op(1, OP_EQ, load_ed_keys(options, now+100*86400));
+ tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now+100*86400, 0));
+ tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id));
+ tt_mem_op(&sign, OP_NE, get_master_signing_keypair(), sizeof(sign));
tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert()));
- tt_mem_op(&auth, !=, get_current_auth_keypair(), sizeof(auth));
+ tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth));
tt_assert(get_master_signing_key_cert());
tt_assert(get_current_link_cert_cert());
tt_assert(get_current_auth_key_cert());
@@ -520,12 +523,12 @@ test_routerkeys_ed_keys_init_all(void *arg)
routerkeys_free_all();
unlink(get_fname("test_ed_keys_init_all/keys/"
"ed25519_master_id_secret_key"));
- tt_int_op(1, ==, load_ed_keys(options, now));
- tt_int_op(0, ==, generate_ed_link_cert(options, now, 0));
- tt_mem_op(&id, ==, get_master_identity_key(), sizeof(id));
- tt_mem_op(&sign, ==, get_master_signing_keypair(), sizeof(sign));
+ tt_int_op(1, OP_EQ, load_ed_keys(options, now));
+ tt_int_op(0, OP_EQ, generate_ed_link_cert(options, now, 0));
+ tt_mem_op(&id, OP_EQ, get_master_identity_key(), sizeof(id));
+ tt_mem_op(&sign, OP_EQ, get_master_signing_keypair(), sizeof(sign));
tt_assert(! tor_cert_eq(link_cert, get_current_link_cert_cert()));
- tt_mem_op(&auth, !=, get_current_auth_keypair(), sizeof(auth));
+ tt_mem_op(&auth, OP_NE, get_current_auth_keypair(), sizeof(auth));
tt_assert(get_master_signing_key_cert());
tt_assert(get_current_link_cert_cert());
tt_assert(get_current_auth_key_cert());
@@ -535,7 +538,7 @@ test_routerkeys_ed_keys_init_all(void *arg)
log_global_min_severity_ = LOG_ERR; /* Suppress warnings.
* XXX (better way to do this)? */
routerkeys_free_all();
- tt_int_op(-1, ==, load_ed_keys(options, now+200*86400));
+ tt_int_op(-1, OP_EQ, load_ed_keys(options, now+200*86400));
done:
tor_free(dir);
@@ -556,20 +559,20 @@ test_routerkeys_cross_certify_ntor(void *args)
time_t now = time(NULL);
int sign;
- tt_int_op(0, ==, ed25519_public_from_base64(&master_key,
+ tt_int_op(0, OP_EQ, ed25519_public_from_base64(&master_key,
"IamwritingthesetestsOnARainyAfternoonin2014"));
- tt_int_op(0, ==, curve25519_keypair_generate(&onion_keys, 0));
+ tt_int_op(0, OP_EQ, curve25519_keypair_generate(&onion_keys, 0));
cert = make_ntor_onion_key_crosscert(&onion_keys,
&master_key,
now, 10000,
&sign);
tt_assert(cert);
tt_assert(sign == 0 || sign == 1);
- tt_int_op(cert->cert_type, ==, CERT_TYPE_ONION_ID);
- tt_int_op(1, ==, ed25519_pubkey_eq(&cert->signed_key, &master_key));
- tt_int_op(0, ==, ed25519_public_key_from_curve25519_public_key(
+ tt_int_op(cert->cert_type, OP_EQ, CERT_TYPE_ONION_ID);
+ tt_int_op(1, OP_EQ, ed25519_pubkey_eq(&cert->signed_key, &master_key));
+ tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key(
&onion_check_key, &onion_keys.pubkey, sign));
- tt_int_op(0, ==, tor_cert_checksig(cert, &onion_check_key, now));
+ tt_int_op(0, OP_EQ, tor_cert_checksig(cert, &onion_check_key, now));
done:
tor_cert_free(cert);
@@ -587,7 +590,7 @@ test_routerkeys_cross_certify_tap(void *args)
char buf[128];
int n;
- tt_int_op(0, ==, ed25519_public_from_base64(&master_key,
+ tt_int_op(0, OP_EQ, ed25519_public_from_base64(&master_key,
"IAlreadyWroteTestsForRouterdescsUsingTheseX"));
cc = make_tap_onion_key_crosscert(onion_key,
@@ -598,14 +601,14 @@ test_routerkeys_cross_certify_tap(void *args)
n = crypto_pk_public_checksig(onion_key, buf, sizeof(buf),
(char*)cc, cc_len);
- tt_int_op(n,>,0);
- tt_int_op(n,==,52);
+ tt_int_op(n,OP_GT,0);
+ tt_int_op(n,OP_EQ,52);
crypto_pk_get_digest(id_key, digest);
- tt_mem_op(buf,==,digest,20);
- tt_mem_op(buf+20,==,master_key.pubkey,32);
+ tt_mem_op(buf,OP_EQ,digest,20);
+ tt_mem_op(buf+20,OP_EQ,master_key.pubkey,32);
- tt_int_op(0, ==, check_tap_onion_key_crosscert(cc, cc_len,
+ tt_int_op(0, OP_EQ, check_tap_onion_key_crosscert(cc, cc_len,
onion_key, &master_key, (uint8_t*)digest));
done:
diff --git a/src/test/test_routerlist.c b/src/test/test_routerlist.c
index 0b4b6c5c44..3b0e943ce5 100644
--- a/src/test/test_routerlist.c
+++ b/src/test/test_routerlist.c
@@ -117,7 +117,7 @@ test_routerlist_launch_descriptor_downloads(void *arg)
MOCK(initiate_descriptor_downloads, mock_initiate_descriptor_downloads);
launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, downloadable,
NULL, now);
- tt_int_op(3, ==, count);
+ tt_int_op(3, OP_EQ, count);
UNMOCK(initiate_descriptor_downloads);
done:
@@ -148,24 +148,24 @@ construct_consensus(char **consensus_text_md)
&v1, &n_vrs, now, 1);
networkstatus_vote_free(vote);
tt_assert(v1);
- tt_int_op(n_vrs, ==, 4);
- tt_int_op(smartlist_len(v1->routerstatus_list), ==, 4);
+ tt_int_op(n_vrs, OP_EQ, 4);
+ tt_int_op(smartlist_len(v1->routerstatus_list), OP_EQ, 4);
dir_common_construct_vote_2(&vote, cert2, sign_skey_2,
&dir_common_gen_routerstatus_for_v3ns,
&v2, &n_vrs, now, 1);
networkstatus_vote_free(vote);
tt_assert(v2);
- tt_int_op(n_vrs, ==, 4);
- tt_int_op(smartlist_len(v2->routerstatus_list), ==, 4);
+ tt_int_op(n_vrs, OP_EQ, 4);
+ tt_int_op(smartlist_len(v2->routerstatus_list), OP_EQ, 4);
dir_common_construct_vote_3(&vote, cert3, sign_skey_3,
&dir_common_gen_routerstatus_for_v3ns,
&v3, &n_vrs, now, 1);
tt_assert(v3);
- tt_int_op(n_vrs, ==, 4);
- tt_int_op(smartlist_len(v3->routerstatus_list), ==, 4);
+ tt_int_op(n_vrs, OP_EQ, 4);
+ tt_int_op(smartlist_len(v3->routerstatus_list), OP_EQ, 4);
networkstatus_vote_free(vote);
votes = smartlist_new();
smartlist_add(votes, v1);
@@ -247,16 +247,16 @@ test_router_pick_directory_server_impl(void *arg)
/* No consensus available, fail early */
rs = router_pick_directory_server_impl(V3_DIRINFO, (const int) 0, NULL);
- tt_assert(rs == NULL);
+ tt_ptr_op(rs, OP_EQ, NULL);
construct_consensus(&consensus_text_md);
tt_assert(consensus_text_md);
con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL,
NS_TYPE_CONSENSUS);
tt_assert(con_md);
- tt_int_op(con_md->flavor,==, FLAV_MICRODESC);
+ tt_int_op(con_md->flavor,OP_EQ, FLAV_MICRODESC);
tt_assert(con_md->routerstatus_list);
- tt_int_op(smartlist_len(con_md->routerstatus_list), ==, 3);
+ tt_int_op(smartlist_len(con_md->routerstatus_list), OP_EQ, 3);
tt_assert(!networkstatus_set_current_consensus_from_ns(con_md,
"microdesc"));
@@ -287,7 +287,7 @@ test_router_pick_directory_server_impl(void *arg)
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
/* We should not fail now we have a consensus and routerstatus_list
* and nodelist are populated. */
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
/* Manipulate the nodes so we get the dir server we expect */
router1_id = tor_malloc(DIGEST_LEN);
@@ -306,7 +306,7 @@ test_router_pick_directory_server_impl(void *arg)
node_router1->is_running = 0;
node_router3->is_running = 0;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN));
rs = NULL;
node_router1->is_running = 1;
@@ -319,7 +319,7 @@ test_router_pick_directory_server_impl(void *arg)
node_router1->rs->dir_port = 0;
node_router3->rs->dir_port = 0;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN));
rs = NULL;
node_router1->rs->is_v2_dir = 1;
@@ -330,7 +330,7 @@ test_router_pick_directory_server_impl(void *arg)
node_router1->is_valid = 0;
node_router3->is_valid = 0;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router2_id, DIGEST_LEN));
rs = NULL;
node_router1->is_valid = 1;
@@ -341,7 +341,7 @@ test_router_pick_directory_server_impl(void *arg)
node_router2->rs->last_dir_503_at = now;
node_router3->rs->last_dir_503_at = now;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN));
node_router2->rs->last_dir_503_at = 0;
node_router3->rs->last_dir_503_at = 0;
@@ -358,13 +358,13 @@ test_router_pick_directory_server_impl(void *arg)
node_router2->rs->or_port = 443;
node_router3->rs->or_port = 442;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router3_id, DIGEST_LEN));
node_router1->rs->or_port = 442;
node_router2->rs->or_port = 443;
node_router3->rs->or_port = 444;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN));
/* Fascist firewall and overloaded */
@@ -373,7 +373,7 @@ test_router_pick_directory_server_impl(void *arg)
node_router3->rs->or_port = 442;
node_router3->rs->last_dir_503_at = now;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN));
node_router3->rs->last_dir_503_at = 0;
@@ -391,7 +391,7 @@ test_router_pick_directory_server_impl(void *arg)
node_router3->rs->dir_port = 81;
node_router1->rs->last_dir_503_at = now;
rs = router_pick_directory_server_impl(V3_DIRINFO, flags, NULL);
- tt_assert(rs != NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
tt_assert(tor_memeq(rs->identity_digest, router1_id, DIGEST_LEN));
node_router1->rs->last_dir_503_at = 0;
@@ -449,27 +449,27 @@ test_routerlist_router_is_already_dir_fetching(void *arg)
/* Test that we never get 1 from a NULL connection */
mocked_connection = NULL;
- tt_assert(router_is_already_dir_fetching(&test_ap, 1, 1) == 0);
- tt_assert(router_is_already_dir_fetching(&test_ap, 1, 0) == 0);
- tt_assert(router_is_already_dir_fetching(&test_ap, 0, 1) == 0);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 1), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 0), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 1), OP_EQ, 0);
/* We always expect 0 in these cases */
- tt_assert(router_is_already_dir_fetching(&test_ap, 0, 0) == 0);
- tt_assert(router_is_already_dir_fetching(NULL, 1, 1) == 0);
- tt_assert(router_is_already_dir_fetching(&null_addr_ap, 1, 1) == 0);
- tt_assert(router_is_already_dir_fetching(&zero_port_ap, 1, 1) == 0);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 0), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(NULL, 1, 1), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(&null_addr_ap, 1, 1), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(&zero_port_ap, 1, 1), OP_EQ, 0);
/* Test that we get 1 with a connection in the appropriate circumstances */
mocked_connection = connection_new(CONN_TYPE_DIR, AF_INET);
- tt_assert(router_is_already_dir_fetching(&test_ap, 1, 1) == 1);
- tt_assert(router_is_already_dir_fetching(&test_ap, 1, 0) == 1);
- tt_assert(router_is_already_dir_fetching(&test_ap, 0, 1) == 1);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 1), OP_EQ, 1);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 1, 0), OP_EQ, 1);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 1), OP_EQ, 1);
/* Test that we get 0 even with a connection in the appropriate
* circumstances */
- tt_assert(router_is_already_dir_fetching(&test_ap, 0, 0) == 0);
- tt_assert(router_is_already_dir_fetching(NULL, 1, 1) == 0);
- tt_assert(router_is_already_dir_fetching(&null_addr_ap, 1, 1) == 0);
- tt_assert(router_is_already_dir_fetching(&zero_port_ap, 1, 1) == 0);
+ tt_int_op(router_is_already_dir_fetching(&test_ap, 0, 0), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(NULL, 1, 1), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(&null_addr_ap, 1, 1), OP_EQ, 0);
+ tt_int_op(router_is_already_dir_fetching(&zero_port_ap, 1, 1), OP_EQ, 0);
done:
/* If a connection is never set up, connection_free chokes on it. */
diff --git a/src/test/test_scheduler.c b/src/test/test_scheduler.c
index 4c536b0905..b0490ccfcf 100644
--- a/src/test/test_scheduler.c
+++ b/src/test/test_scheduler.c
@@ -68,14 +68,14 @@ static void test_scheduler_queue_heuristic(void *arg);
static void
mock_event_free_all(void)
{
- tt_assert(mock_event_base != NULL);
+ tt_ptr_op(mock_event_base, OP_NE, NULL);
if (mock_event_base) {
event_base_free(mock_event_base);
mock_event_base = NULL;
}
- tt_ptr_op(mock_event_base, ==, NULL);
+ tt_ptr_op(mock_event_base, OP_EQ, NULL);
done:
return;
@@ -86,7 +86,7 @@ mock_event_init(void)
{
struct event_config *cfg = NULL;
- tt_ptr_op(mock_event_base, ==, NULL);
+ tt_ptr_op(mock_event_base, OP_EQ, NULL);
/*
* Really cut down from tor_libevent_initialize of
@@ -104,7 +104,7 @@ mock_event_init(void)
event_config_free(cfg);
}
- tt_assert(mock_event_base != NULL);
+ tt_ptr_op(mock_event_base, OP_NE, NULL);
done:
return;
@@ -181,7 +181,7 @@ channel_flush_some_cells_mock(channel_t *chan, ssize_t num_cells)
char unlimited = 0;
flush_mock_channel_t *found = NULL;
- tt_assert(chan != NULL);
+ tt_ptr_op(chan, OP_NE, NULL);
if (chan) {
if (num_cells < 0) {
num_cells = 0;
@@ -234,8 +234,8 @@ circuitmux_compare_muxes_mock(circuitmux_t *cmux_1,
{
int result = 0;
- tt_assert(cmux_1 != NULL);
- tt_assert(cmux_2 != NULL);
+ tt_ptr_op(cmux_1, OP_NE, NULL);
+ tt_ptr_op(cmux_2, OP_NE, NULL);
if (cmux_1 != cmux_2) {
if (cmux_1 == mock_ccm_tgt_1 && cmux_2 == mock_ccm_tgt_2) result = -1;
@@ -261,7 +261,7 @@ circuitmux_get_policy_mock(circuitmux_t *cmux)
{
const circuitmux_policy_t *result = NULL;
- tt_assert(cmux != NULL);
+ tt_ptr_op(cmux, OP_NE, NULL);
if (cmux) {
if (cmux == mock_cgp_tgt_1) result = mock_cgp_val_1;
else if (cmux == mock_cgp_tgt_2) result = mock_cgp_val_2;
@@ -326,7 +326,7 @@ test_scheduler_channel_states(void *arg)
*/
MOCK(scheduler_run, scheduler_run_noop_mock);
- tt_int_op(smartlist_len(channels_pending), ==, 0);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 0);
/* Set up a fake channel */
ch1 = new_fake_channel();
@@ -341,7 +341,7 @@ test_scheduler_channel_states(void *arg)
tt_assert(ch1->registered);
/* It should start off in SCHED_CHAN_IDLE */
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_IDLE);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_IDLE);
/* Now get another one */
ch2 = new_fake_channel();
@@ -353,39 +353,39 @@ test_scheduler_channel_states(void *arg)
/* Send it to SCHED_CHAN_WAITING_TO_WRITE */
scheduler_channel_has_waiting_cells(ch1);
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE);
/* This should send it to SCHED_CHAN_PENDING */
scheduler_channel_wants_writes(ch1);
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING);
- tt_int_op(smartlist_len(channels_pending), ==, 1);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 1);
/* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */
scheduler_channel_wants_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS);
/* Drop ch2 back to idle */
scheduler_channel_doesnt_want_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_IDLE);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_IDLE);
/* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */
scheduler_channel_wants_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS);
/* ...and this should kick ch2 into SCHED_CHAN_PENDING */
scheduler_channel_has_waiting_cells(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
- tt_int_op(smartlist_len(channels_pending), ==, 2);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 2);
/* This should send ch2 to SCHED_CHAN_WAITING_TO_WRITE */
scheduler_channel_doesnt_want_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE);
- tt_int_op(smartlist_len(channels_pending), ==, 1);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 1);
/* ...and back to SCHED_CHAN_PENDING */
scheduler_channel_wants_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
- tt_int_op(smartlist_len(channels_pending), ==, 2);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 2);
/* Now we exercise scheduler_touch_channel */
old_count = scheduler_compare_channels_mock_ctr;
@@ -394,14 +394,14 @@ test_scheduler_channel_states(void *arg)
/* Close */
channel_mark_for_close(ch1);
- tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSING);
channel_mark_for_close(ch2);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING);
channel_closed(ch1);
- tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSED);
ch1 = NULL;
channel_closed(ch2);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSED);
ch2 = NULL;
/* Shut things down */
@@ -464,21 +464,21 @@ test_scheduler_compare_channels(void *arg)
/* Equal-channel case */
result = scheduler_compare_channels(&c1, &c1);
- tt_int_op(result, ==, 0);
+ tt_int_op(result, OP_EQ, 0);
/* Distinct channels, distinct policies */
result = scheduler_compare_channels(&c1, &c2);
- tt_int_op(result, ==, -1);
+ tt_int_op(result, OP_EQ, -1);
result = scheduler_compare_channels(&c2, &c1);
- tt_int_op(result, ==, 1);
+ tt_int_op(result, OP_EQ, 1);
/* Distinct channels, same policy */
tor_free(mock_cgp_val_2);
mock_cgp_val_2 = mock_cgp_val_1;
result = scheduler_compare_channels(&c1, &c2);
- tt_int_op(result, ==, -1);
+ tt_int_op(result, OP_EQ, -1);
result = scheduler_compare_channels(&c2, &c1);
- tt_int_op(result, ==, 1);
+ tt_int_op(result, OP_EQ, 1);
done:
@@ -507,24 +507,24 @@ test_scheduler_initfree(void *arg)
{
(void)arg;
- tt_ptr_op(channels_pending, ==, NULL);
- tt_ptr_op(run_sched_ev, ==, NULL);
+ tt_ptr_op(channels_pending, OP_EQ, NULL);
+ tt_ptr_op(run_sched_ev, OP_EQ, NULL);
mock_event_init();
MOCK(tor_libevent_get_base, tor_libevent_get_base_mock);
scheduler_init();
- tt_assert(channels_pending != NULL);
- tt_assert(run_sched_ev != NULL);
+ tt_ptr_op(channels_pending, OP_NE, NULL);
+ tt_ptr_op(run_sched_ev, OP_NE, NULL);
scheduler_free_all();
UNMOCK(tor_libevent_get_base);
mock_event_free_all();
- tt_ptr_op(channels_pending, ==, NULL);
- tt_ptr_op(run_sched_ev, ==, NULL);
+ tt_ptr_op(channels_pending, OP_EQ, NULL);
+ tt_ptr_op(run_sched_ev, OP_EQ, NULL);
done:
return;
@@ -553,7 +553,7 @@ test_scheduler_loop(void *arg)
*/
MOCK(scheduler_run, scheduler_run_noop_mock);
- tt_int_op(smartlist_len(channels_pending), ==, 0);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 0);
/* Set up a fake channel */
ch1 = new_fake_channel();
@@ -567,10 +567,10 @@ test_scheduler_loop(void *arg)
channel_register(ch1);
tt_assert(ch1->registered);
/* Finish opening it */
- channel_change_state(ch1, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch1);
/* It should start off in SCHED_CHAN_IDLE */
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_IDLE);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_IDLE);
/* Now get another one */
ch2 = new_fake_channel();
@@ -584,34 +584,34 @@ test_scheduler_loop(void *arg)
* zero and we'll get coverage of that exception case in scheduler_run()
*/
- tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_OPENING);
+ tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN);
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPENING);
/* Send it to SCHED_CHAN_WAITING_TO_WRITE */
scheduler_channel_has_waiting_cells(ch1);
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_TO_WRITE);
/* This should send it to SCHED_CHAN_PENDING */
scheduler_channel_wants_writes(ch1);
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING);
- tt_int_op(smartlist_len(channels_pending), ==, 1);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 1);
/* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */
scheduler_channel_wants_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS);
/* Drop ch2 back to idle */
scheduler_channel_doesnt_want_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_IDLE);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_IDLE);
/* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */
scheduler_channel_wants_writes(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS);
/* ...and this should kick ch2 into SCHED_CHAN_PENDING */
scheduler_channel_has_waiting_cells(ch2);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
- tt_int_op(smartlist_len(channels_pending), ==, 2);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 2);
/*
* Now we've got two pending channels and need to fire off
@@ -629,23 +629,23 @@ test_scheduler_loop(void *arg)
* Assert that they're still in the states we left and aren't still
* pending
*/
- tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_OPENING);
+ tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN);
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPENING);
tt_assert(ch1->scheduler_state != SCHED_CHAN_PENDING);
tt_assert(ch2->scheduler_state != SCHED_CHAN_PENDING);
- tt_int_op(smartlist_len(channels_pending), ==, 0);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 0);
/* Now, finish opening ch2, and get both back to pending */
- channel_change_state(ch2, CHANNEL_STATE_OPEN);
+ channel_change_state_open(ch2);
scheduler_channel_wants_writes(ch1);
scheduler_channel_wants_writes(ch2);
scheduler_channel_has_waiting_cells(ch1);
scheduler_channel_has_waiting_cells(ch2);
- tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_OPEN);
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING);
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
- tt_int_op(smartlist_len(channels_pending), ==, 2);
+ tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_OPEN);
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_OPEN);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_PENDING);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), OP_EQ, 2);
/* Now, set up the channel_flush_some_cells() mock */
MOCK(channel_flush_some_cells, channel_flush_some_cells_mock);
@@ -675,24 +675,24 @@ test_scheduler_loop(void *arg)
* ch1 should have gone to SCHED_CHAN_WAITING_FOR_CELLS, with 16 flushed
* and 32 writeable.
*/
- tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+ tt_int_op(ch1->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS);
/*
* ...ch2 should also have gone to SCHED_CHAN_WAITING_FOR_CELLS, with
* channel_more_to_flush() returning false and channel_num_cells_writeable()
* > 0/
*/
- tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+ tt_int_op(ch2->scheduler_state, OP_EQ, SCHED_CHAN_WAITING_FOR_CELLS);
/* Close */
channel_mark_for_close(ch1);
- tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSING);
channel_mark_for_close(ch2);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSING);
channel_closed(ch1);
- tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch1->state, OP_EQ, CHANNEL_STATE_CLOSED);
ch1 = NULL;
channel_closed(ch2);
- tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSED);
+ tt_int_op(ch2->state, OP_EQ, CHANNEL_STATE_CLOSED);
ch2 = NULL;
/* Shut things down */
@@ -724,22 +724,22 @@ test_scheduler_queue_heuristic(void *arg)
/* Not yet inited case */
scheduler_update_queue_heuristic(now - 180);
- tt_u64_op(queue_heuristic, ==, 0);
- tt_int_op(queue_heuristic_timestamp, ==, now - 180);
+ tt_u64_op(queue_heuristic, OP_EQ, 0);
+ tt_int_op(queue_heuristic_timestamp, OP_EQ, now - 180);
queue_heuristic = 1000000000L;
queue_heuristic_timestamp = now - 120;
scheduler_update_queue_heuristic(now - 119);
- tt_u64_op(queue_heuristic, ==, 500000000L);
- tt_int_op(queue_heuristic_timestamp, ==, now - 119);
+ tt_u64_op(queue_heuristic, OP_EQ, 500000000L);
+ tt_int_op(queue_heuristic_timestamp, OP_EQ, now - 119);
scheduler_update_queue_heuristic(now - 116);
- tt_u64_op(queue_heuristic, ==, 62500000L);
- tt_int_op(queue_heuristic_timestamp, ==, now - 116);
+ tt_u64_op(queue_heuristic, OP_EQ, 62500000L);
+ tt_int_op(queue_heuristic_timestamp, OP_EQ, now - 116);
qh = scheduler_get_queue_heuristic();
- tt_u64_op(qh, ==, 0);
+ tt_u64_op(qh, OP_EQ, 0);
done:
return;
diff --git a/src/test/test_shared_random.c b/src/test/test_shared_random.c
index 026a0f3825..4c303cbb35 100644
--- a/src/test/test_shared_random.c
+++ b/src/test/test_shared_random.c
@@ -73,58 +73,58 @@ test_get_sr_protocol_phase(void *arg)
{
retval = parse_rfc1123_time("Wed, 20 Apr 2015 23:59:00 UTC", &the_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
phase = get_sr_protocol_phase(the_time);
- tt_int_op(phase, ==, SR_PHASE_REVEAL);
+ tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL);
}
{
retval = parse_rfc1123_time("Wed, 20 Apr 2015 00:00:00 UTC", &the_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
phase = get_sr_protocol_phase(the_time);
- tt_int_op(phase, ==, SR_PHASE_COMMIT);
+ tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT);
}
{
retval = parse_rfc1123_time("Wed, 20 Apr 2015 00:00:01 UTC", &the_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
phase = get_sr_protocol_phase(the_time);
- tt_int_op(phase, ==, SR_PHASE_COMMIT);
+ tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT);
}
{
retval = parse_rfc1123_time("Wed, 20 Apr 2015 11:59:00 UTC", &the_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
phase = get_sr_protocol_phase(the_time);
- tt_int_op(phase, ==, SR_PHASE_COMMIT);
+ tt_int_op(phase, OP_EQ, SR_PHASE_COMMIT);
}
{
retval = parse_rfc1123_time("Wed, 20 Apr 2015 12:00:00 UTC", &the_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
phase = get_sr_protocol_phase(the_time);
- tt_int_op(phase, ==, SR_PHASE_REVEAL);
+ tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL);
}
{
retval = parse_rfc1123_time("Wed, 20 Apr 2015 12:00:01 UTC", &the_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
phase = get_sr_protocol_phase(the_time);
- tt_int_op(phase, ==, SR_PHASE_REVEAL);
+ tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL);
}
{
retval = parse_rfc1123_time("Wed, 20 Apr 2015 13:00:00 UTC", &the_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
phase = get_sr_protocol_phase(the_time);
- tt_int_op(phase, ==, SR_PHASE_REVEAL);
+ tt_int_op(phase, OP_EQ, SR_PHASE_REVEAL);
}
done:
@@ -147,7 +147,7 @@ test_get_state_valid_until_time(void *arg)
/* Get the valid until time if called at 00:00:01 */
retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC",
&current_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
valid_until_time = get_state_valid_until_time(current_time);
/* Compare it with the correct result */
@@ -158,7 +158,7 @@ test_get_state_valid_until_time(void *arg)
{
retval = parse_rfc1123_time("Mon, 20 Apr 2015 19:22:00 UTC",
&current_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
valid_until_time = get_state_valid_until_time(current_time);
format_iso_time(tbuf, valid_until_time);
@@ -168,7 +168,7 @@ test_get_state_valid_until_time(void *arg)
{
retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:00 UTC",
&current_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
valid_until_time = get_state_valid_until_time(current_time);
format_iso_time(tbuf, valid_until_time);
@@ -178,7 +178,7 @@ test_get_state_valid_until_time(void *arg)
{
retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC",
&current_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
valid_until_time = get_state_valid_until_time(current_time);
format_iso_time(tbuf, valid_until_time);
@@ -189,6 +189,120 @@ test_get_state_valid_until_time(void *arg)
;
}
+/** Test the function that calculates the start time of the current SRV
+ * protocol run. */
+static void
+test_get_start_time_of_current_run(void *arg)
+{
+ int retval;
+ char tbuf[ISO_TIME_LEN + 1];
+ time_t current_time, run_start_time;
+
+ (void) arg;
+
+ {
+ /* Get start time if called at 00:00:01 */
+ retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC",
+ &current_time);
+ tt_int_op(retval, OP_EQ, 0);
+ run_start_time =
+ sr_state_get_start_time_of_current_protocol_run(current_time);
+
+ /* Compare it with the correct result */
+ format_iso_time(tbuf, run_start_time);
+ tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf);
+ }
+
+ {
+ retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:59 UTC",
+ &current_time);
+ tt_int_op(retval, OP_EQ, 0);
+ run_start_time =
+ sr_state_get_start_time_of_current_protocol_run(current_time);
+
+ /* Compare it with the correct result */
+ format_iso_time(tbuf, run_start_time);
+ tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf);
+ }
+
+ {
+ retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC",
+ &current_time);
+ tt_int_op(retval, OP_EQ, 0);
+ run_start_time =
+ sr_state_get_start_time_of_current_protocol_run(current_time);
+
+ /* Compare it with the correct result */
+ format_iso_time(tbuf, run_start_time);
+ tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf);
+ }
+
+ /* Now let's alter the voting schedule and check the correctness of the
+ * function. Voting interval of 10 seconds, means that an SRV protocol run
+ * takes 10 seconds * 24 rounds = 4 mins */
+ {
+ or_options_t *options = get_options_mutable();
+ options->V3AuthVotingInterval = 10;
+ options->TestingV3AuthInitialVotingInterval = 10;
+ retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:15:32 UTC",
+ &current_time);
+
+ tt_int_op(retval, OP_EQ, 0);
+ run_start_time =
+ sr_state_get_start_time_of_current_protocol_run(current_time);
+
+ /* Compare it with the correct result */
+ format_iso_time(tbuf, run_start_time);
+ tt_str_op("2015-04-20 00:12:00", OP_EQ, tbuf);
+ }
+
+ done:
+ ;
+}
+
+/** Do some rudimentary consistency checks between the functions that
+ * understand the shared random protocol schedule */
+static void
+test_get_start_time_functions(void *arg)
+{
+ (void) arg;
+ time_t now = approx_time();
+
+ time_t start_time_of_protocol_run =
+ sr_state_get_start_time_of_current_protocol_run(now);
+ tt_assert(start_time_of_protocol_run);
+
+ /* Check that the round start time of the beginning of the run, is itself */
+ tt_int_op(get_start_time_of_current_round(start_time_of_protocol_run), OP_EQ,
+ start_time_of_protocol_run);
+
+ /* Check that even if we increment the start time, we still get the start
+ time of the run as the beginning of the round. */
+ tt_int_op(get_start_time_of_current_round(start_time_of_protocol_run+1),
+ OP_EQ, start_time_of_protocol_run);
+
+ done: ;
+}
+
+static void
+test_get_sr_protocol_duration(void *arg)
+{
+ (void) arg;
+
+ /* Check that by default an SR phase is 12 hours */
+ tt_int_op(sr_state_get_phase_duration(), OP_EQ, 12*60*60);
+ tt_int_op(sr_state_get_protocol_run_duration(), OP_EQ, 24*60*60);
+
+ /* Now alter the voting interval and check that the SR phase is 2 mins long
+ * if voting happens every 10 seconds (10*12 seconds = 2 mins) */
+ or_options_t *options = get_options_mutable();
+ options->V3AuthVotingInterval = 10;
+ tt_int_op(sr_state_get_phase_duration(), OP_EQ, 2*60);
+ tt_int_op(sr_state_get_protocol_run_duration(), OP_EQ, 4*60);
+
+ done: ;
+}
+
/* Mock function to immediately return our local 'mock_consensus'. */
static networkstatus_t *
mock_networkstatus_get_live_consensus(time_t now)
@@ -215,11 +329,11 @@ test_get_next_valid_after_time(void *arg)
retval = parse_rfc1123_time("Mon, 13 Jan 2016 16:00:00 UTC",
&mock_consensus->fresh_until);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
retval = parse_rfc1123_time("Mon, 13 Jan 2016 15:00:00 UTC",
&mock_consensus->valid_after);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
MOCK(networkstatus_get_live_consensus,
mock_networkstatus_get_live_consensus);
@@ -229,7 +343,7 @@ test_get_next_valid_after_time(void *arg)
/* Get the valid after time if called at 00:00:00 */
retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC",
&current_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
valid_after_time = get_next_valid_after_time(current_time);
/* Compare it with the correct result */
@@ -241,7 +355,7 @@ test_get_next_valid_after_time(void *arg)
/* Get the valid until time if called at 00:00:01 */
retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC",
&current_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
valid_after_time = get_next_valid_after_time(current_time);
/* Compare it with the correct result */
@@ -252,7 +366,7 @@ test_get_next_valid_after_time(void *arg)
{
retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:30:01 UTC",
&current_time);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
valid_after_time = get_next_valid_after_time(current_time);
/* Compare it with the correct result */
@@ -304,18 +418,18 @@ test_sr_commit(void *arg)
tt_assert(!tor_mem_is_zero((char *) our_commit->random_number,
sizeof(our_commit->random_number)));
/* Commit and reveal timestamp should be the same. */
- tt_u64_op(our_commit->commit_ts, ==, our_commit->reveal_ts);
+ tt_u64_op(our_commit->commit_ts, OP_EQ, our_commit->reveal_ts);
/* We should have a hashed reveal. */
tt_assert(!tor_mem_is_zero(our_commit->hashed_reveal,
sizeof(our_commit->hashed_reveal)));
/* Do we have a valid encoded commit and reveal. Note the following only
* tests if the generated values are correct. Their could be a bug in
* the decode function but we test them seperately. */
- tt_int_op(0, ==, reveal_decode(our_commit->encoded_reveal,
+ tt_int_op(0, OP_EQ, reveal_decode(our_commit->encoded_reveal,
&test_commit));
- tt_int_op(0, ==, commit_decode(our_commit->encoded_commit,
+ tt_int_op(0, OP_EQ, commit_decode(our_commit->encoded_commit,
&test_commit));
- tt_int_op(0, ==, verify_commit_and_reveal(our_commit));
+ tt_int_op(0, OP_EQ, verify_commit_and_reveal(our_commit));
}
/* Let's make sure our verify commit and reveal function works. We'll
@@ -328,21 +442,21 @@ test_sr_commit(void *arg)
/* Timestamp MUST match. */
test_commit.commit_ts = test_commit.reveal_ts - 42;
setup_full_capture_of_logs(LOG_WARN);
- tt_int_op(-1, ==, verify_commit_and_reveal(&test_commit));
+ tt_int_op(-1, OP_EQ, verify_commit_and_reveal(&test_commit));
expect_log_msg_containing("doesn't match reveal timestamp");
teardown_capture_of_logs();
memcpy(&test_commit, our_commit, sizeof(test_commit));
- tt_int_op(0, ==, verify_commit_and_reveal(&test_commit));
+ tt_int_op(0, OP_EQ, verify_commit_and_reveal(&test_commit));
/* Hashed reveal must match the H(encoded_reveal). */
memset(test_commit.hashed_reveal, 'X',
sizeof(test_commit.hashed_reveal));
setup_full_capture_of_logs(LOG_WARN);
- tt_int_op(-1, ==, verify_commit_and_reveal(&test_commit));
+ tt_int_op(-1, OP_EQ, verify_commit_and_reveal(&test_commit));
expect_single_log_msg_containing("doesn't match the commit value");
teardown_capture_of_logs();
memcpy(&test_commit, our_commit, sizeof(test_commit));
- tt_int_op(0, ==, verify_commit_and_reveal(&test_commit));
+ tt_int_op(0, OP_EQ, verify_commit_and_reveal(&test_commit));
}
/* We'll build a list of values from our commit that our parsing function
@@ -396,26 +510,26 @@ test_encoding(void *arg)
/* Hash random number because we don't expose bytes of the RNG. */
ret = crypto_digest256(hashed_rand, raw_rand,
sizeof(raw_rand), SR_DIGEST_ALG);
- tt_int_op(0, ==, ret);
+ tt_int_op(0, OP_EQ, ret);
/* Hash reveal value. */
- tt_int_op(SR_REVEAL_BASE64_LEN, ==, strlen(encoded_reveal));
+ tt_int_op(SR_REVEAL_BASE64_LEN, OP_EQ, strlen(encoded_reveal));
ret = crypto_digest256(hashed_reveal, encoded_reveal,
strlen(encoded_reveal), SR_DIGEST_ALG);
- tt_int_op(0, ==, ret);
- tt_int_op(SR_COMMIT_BASE64_LEN, ==, strlen(encoded_commit));
+ tt_int_op(0, OP_EQ, ret);
+ tt_int_op(SR_COMMIT_BASE64_LEN, OP_EQ, strlen(encoded_commit));
/* Test our commit/reveal decode functions. */
{
/* Test the reveal encoded value. */
- tt_int_op(0, ==, reveal_decode(encoded_reveal, &parsed_commit));
- tt_u64_op(ts, ==, parsed_commit.reveal_ts);
+ tt_int_op(0, OP_EQ, reveal_decode(encoded_reveal, &parsed_commit));
+ tt_u64_op(ts, OP_EQ, parsed_commit.reveal_ts);
tt_mem_op(hashed_rand, OP_EQ, parsed_commit.random_number,
sizeof(hashed_rand));
/* Test the commit encoded value. */
memset(&parsed_commit, 0, sizeof(parsed_commit));
- tt_int_op(0, ==, commit_decode(encoded_commit, &parsed_commit));
- tt_u64_op(ts, ==, parsed_commit.commit_ts);
+ tt_int_op(0, OP_EQ, commit_decode(encoded_commit, &parsed_commit));
+ tt_u64_op(ts, OP_EQ, parsed_commit.commit_ts);
tt_mem_op(encoded_commit, OP_EQ, parsed_commit.encoded_commit,
sizeof(parsed_commit.encoded_commit));
tt_mem_op(hashed_reveal, OP_EQ, parsed_commit.hashed_reveal,
@@ -430,7 +544,7 @@ test_encoding(void *arg)
memcpy(parsed_commit.random_number, hashed_rand,
sizeof(parsed_commit.random_number));
ret = reveal_encode(&parsed_commit, encoded, sizeof(encoded));
- tt_int_op(SR_REVEAL_BASE64_LEN, ==, ret);
+ tt_int_op(SR_REVEAL_BASE64_LEN, OP_EQ, ret);
tt_mem_op(encoded_reveal, OP_EQ, encoded, strlen(encoded_reveal));
}
@@ -441,7 +555,7 @@ test_encoding(void *arg)
memcpy(parsed_commit.hashed_reveal, hashed_reveal,
sizeof(parsed_commit.hashed_reveal));
ret = commit_encode(&parsed_commit, encoded, sizeof(encoded));
- tt_int_op(SR_COMMIT_BASE64_LEN, ==, ret);
+ tt_int_op(SR_COMMIT_BASE64_LEN, OP_EQ, ret);
tt_mem_op(encoded_commit, OP_EQ, encoded, strlen(encoded_commit));
}
@@ -518,7 +632,7 @@ test_vote(void *arg)
tt_assert(lines);
/* Split the lines. We expect 2 here. */
ret = smartlist_split_string(chunks, lines, "\n", SPLIT_IGNORE_BLANK, 0);
- tt_int_op(ret, ==, 4);
+ tt_int_op(ret, OP_EQ, 4);
tt_str_op(smartlist_get(chunks, 0), OP_EQ, "shared-rand-participate");
/* Get our commitment line and will validate it agains our commit. The
* format is as follow:
@@ -528,7 +642,7 @@ test_vote(void *arg)
char *commit_line = smartlist_get(chunks, 1);
tt_assert(commit_line);
ret = smartlist_split_string(tokens, commit_line, " ", 0, 0);
- tt_int_op(ret, ==, 6);
+ tt_int_op(ret, OP_EQ, 6);
tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-commit");
tt_str_op(smartlist_get(tokens, 1), OP_EQ, "1");
tt_str_op(smartlist_get(tokens, 2), OP_EQ,
@@ -536,7 +650,7 @@ test_vote(void *arg)
char digest[DIGEST_LEN];
base16_decode(digest, sizeof(digest), smartlist_get(tokens, 3),
HEX_DIGEST_LEN);
- tt_mem_op(digest, ==, our_commit->rsa_identity, sizeof(digest));
+ tt_mem_op(digest, OP_EQ, our_commit->rsa_identity, sizeof(digest));
tt_str_op(smartlist_get(tokens, 4), OP_EQ, our_commit->encoded_commit);
tt_str_op(smartlist_get(tokens, 5), OP_EQ, our_commit->encoded_reveal)
;
@@ -552,7 +666,7 @@ test_vote(void *arg)
/* Set valid flag explicitly here to compare since it's not set by
* simply parsing the commit. */
parsed_commit->valid = 1;
- tt_mem_op(parsed_commit, ==, our_commit, sizeof(*our_commit));
+ tt_mem_op(parsed_commit, OP_EQ, our_commit, sizeof(*our_commit));
/* minor cleanup */
SMARTLIST_FOREACH(tokens, char *, s, tor_free(s));
@@ -562,7 +676,7 @@ test_vote(void *arg)
char *prev_srv_line = smartlist_get(chunks, 2);
tt_assert(prev_srv_line);
ret = smartlist_split_string(tokens, prev_srv_line, " ", 0, 0);
- tt_int_op(ret, ==, 3);
+ tt_int_op(ret, OP_EQ, 3);
tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-previous-value");
tt_str_op(smartlist_get(tokens, 1), OP_EQ, "42");
tt_str_op(smartlist_get(tokens, 2), OP_EQ,
@@ -576,7 +690,7 @@ test_vote(void *arg)
char *current_srv_line = smartlist_get(chunks, 3);
tt_assert(current_srv_line);
ret = smartlist_split_string(tokens, current_srv_line, " ", 0, 0);
- tt_int_op(ret, ==, 3);
+ tt_int_op(ret, OP_EQ, 3);
tt_str_op(smartlist_get(tokens, 0), OP_EQ, "shared-rand-current-value");
tt_str_op(smartlist_get(tokens, 1), OP_EQ, "128");
tt_str_op(smartlist_get(tokens, 2), OP_EQ,
@@ -629,7 +743,7 @@ test_state_load_from_disk(void *arg)
/* First try with a nonexistent path. */
ret = disk_state_load_from_disk_impl("NONEXISTENTNONEXISTENT");
- tt_assert(ret == -ENOENT);
+ tt_int_op(ret, OP_EQ, -ENOENT);
/* Now create a mock state directory and state file */
#ifdef _WIN32
@@ -637,9 +751,9 @@ test_state_load_from_disk(void *arg)
#else
ret = mkdir(dir, 0700);
#endif
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
ret = write_str_to_file(sr_state_path, sr_state_str, 0);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Try to load the directory itself. Should fail. */
ret = disk_state_load_from_disk_impl(dir);
@@ -647,11 +761,11 @@ test_state_load_from_disk(void *arg)
/* State should be non-existent at this point. */
the_sr_state = get_sr_state();
- tt_assert(!the_sr_state);
+ tt_ptr_op(the_sr_state, OP_EQ, NULL);
/* Now try to load the correct file! */
ret = disk_state_load_from_disk_impl(sr_state_path);
- tt_assert(ret == 0);
+ tt_int_op(ret, OP_EQ, 0);
/* Check the content of the state */
/* XXX check more deeply!!! */
@@ -689,7 +803,7 @@ test_sr_setup_commits(void)
tt_assert(auth_cert);
options->AuthoritativeDir = 1;
- tt_int_op(0, ==, load_ed_keys(options, now));
+ tt_int_op(0, OP_EQ, load_ed_keys(options, now));
}
/* Generate three dummy commits according to sr_srv_calc_ref.py . Then
@@ -775,7 +889,7 @@ test_sr_setup_commits(void)
save_commit_to_state(commit_b);
save_commit_to_state(commit_c);
save_commit_to_state(commit_d);
- tt_int_op(digestmap_size(get_sr_state()->commits), ==, 4);
+ tt_int_op(digestmap_size(get_sr_state()->commits), OP_EQ, 4);
/* Now during REVEAL phase save commit D by restoring its reveal. */
set_sr_phase(SR_PHASE_REVEAL);
@@ -820,9 +934,9 @@ test_sr_compute_srv(void *arg)
/* Check the result against the test vector */
current_srv = sr_state_get_current_srv();
tt_assert(current_srv);
- tt_u64_op(current_srv->num_reveals, ==, 3);
+ tt_u64_op(current_srv->num_reveals, OP_EQ, 3);
tt_str_op(hex_str((char*)current_srv->value, 32),
- ==,
+ OP_EQ,
SRV_TEST_VECTOR);
done:
@@ -878,7 +992,7 @@ test_sr_get_majority_srv_from_votes(void *arg)
/* Since it's only one vote with an SRV, it should not achieve majority and
hence no SRV will be returned. */
chosen_srv = get_majority_srv_from_votes(votes, 1);
- tt_assert(!chosen_srv);
+ tt_ptr_op(chosen_srv, OP_EQ, NULL);
{ /* Now put in 8 more votes. Let SRV_1 have majority. */
int i;
@@ -897,21 +1011,21 @@ test_sr_get_majority_srv_from_votes(void *arg)
smartlist_add(votes, vote);
}
- tt_int_op(smartlist_len(votes), ==, 9);
+ tt_int_op(smartlist_len(votes), OP_EQ, 9);
}
/* Now we achieve majority for SRV_1, but not the AuthDirNumSRVAgreements
requirement. So still not picking an SRV. */
set_num_srv_agreements(8);
chosen_srv = get_majority_srv_from_votes(votes, 1);
- tt_assert(!chosen_srv);
+ tt_ptr_op(chosen_srv, OP_EQ, NULL);
/* We will now lower the AuthDirNumSRVAgreements requirement by tweaking the
* consensus parameter and we will try again. This time it should work. */
set_num_srv_agreements(7);
chosen_srv = get_majority_srv_from_votes(votes, 1);
tt_assert(chosen_srv);
- tt_u64_op(chosen_srv->num_reveals, ==, 42);
+ tt_u64_op(chosen_srv->num_reveals, OP_EQ, 42);
tt_mem_op(chosen_srv->value, OP_EQ, SRV_1, sizeof(chosen_srv->value));
done:
@@ -935,7 +1049,7 @@ test_utils(void *arg)
memcpy(srv->value, srv_value, sizeof(srv->value));
dup_srv = srv_dup(srv);
tt_assert(dup_srv);
- tt_u64_op(dup_srv->num_reveals, ==, srv->num_reveals);
+ tt_u64_op(dup_srv->num_reveals, OP_EQ, srv->num_reveals);
tt_mem_op(dup_srv->value, OP_EQ, srv->value, sizeof(srv->value));
tor_free(srv);
tor_free(dup_srv);
@@ -955,10 +1069,10 @@ test_utils(void *arg)
sr_commit_t commit1, commit2;
memcpy(commit1.encoded_commit, payload, sizeof(commit1.encoded_commit));
memcpy(commit2.encoded_commit, payload, sizeof(commit2.encoded_commit));
- tt_int_op(commitments_are_the_same(&commit1, &commit2), ==, 1);
+ tt_int_op(commitments_are_the_same(&commit1, &commit2), OP_EQ, 1);
/* Let's corrupt one of them. */
memset(commit1.encoded_commit, 'A', sizeof(commit1.encoded_commit));
- tt_int_op(commitments_are_the_same(&commit1, &commit2), ==, 0);
+ tt_int_op(commitments_are_the_same(&commit1, &commit2), OP_EQ, 0);
}
/* Testing commit_is_authoritative(). */
@@ -969,32 +1083,32 @@ test_utils(void *arg)
tt_assert(!crypto_pk_generate_key(k));
- tt_int_op(0, ==, crypto_pk_get_digest(k, digest));
+ tt_int_op(0, OP_EQ, crypto_pk_get_digest(k, digest));
memcpy(commit.rsa_identity, digest, sizeof(commit.rsa_identity));
- tt_int_op(commit_is_authoritative(&commit, digest), ==, 1);
+ tt_int_op(commit_is_authoritative(&commit, digest), OP_EQ, 1);
/* Change the pubkey. */
memset(commit.rsa_identity, 0, sizeof(commit.rsa_identity));
- tt_int_op(commit_is_authoritative(&commit, digest), ==, 0);
+ tt_int_op(commit_is_authoritative(&commit, digest), OP_EQ, 0);
crypto_pk_free(k);
}
/* Testing get_phase_str(). */
{
- tt_str_op(get_phase_str(SR_PHASE_REVEAL), ==, "reveal");
- tt_str_op(get_phase_str(SR_PHASE_COMMIT), ==, "commit");
+ tt_str_op(get_phase_str(SR_PHASE_REVEAL), OP_EQ, "reveal");
+ tt_str_op(get_phase_str(SR_PHASE_COMMIT), OP_EQ, "commit");
}
/* Testing phase transition */
{
init_authority_state();
set_sr_phase(SR_PHASE_COMMIT);
- tt_int_op(is_phase_transition(SR_PHASE_REVEAL), ==, 1);
- tt_int_op(is_phase_transition(SR_PHASE_COMMIT), ==, 0);
+ tt_int_op(is_phase_transition(SR_PHASE_REVEAL), OP_EQ, 1);
+ tt_int_op(is_phase_transition(SR_PHASE_COMMIT), OP_EQ, 0);
set_sr_phase(SR_PHASE_REVEAL);
- tt_int_op(is_phase_transition(SR_PHASE_REVEAL), ==, 0);
- tt_int_op(is_phase_transition(SR_PHASE_COMMIT), ==, 1);
+ tt_int_op(is_phase_transition(SR_PHASE_REVEAL), OP_EQ, 0);
+ tt_int_op(is_phase_transition(SR_PHASE_COMMIT), OP_EQ, 1);
/* Junk. */
- tt_int_op(is_phase_transition(42), ==, 1);
+ tt_int_op(is_phase_transition(42), OP_EQ, 1);
}
done:
@@ -1022,24 +1136,24 @@ test_state_transition(void *arg)
sr_commit_t *commit = sr_generate_our_commit(now, mock_cert);
tt_assert(commit);
sr_state_add_commit(commit);
- tt_int_op(digestmap_size(state->commits), ==, 1);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 1);
/* Let's test our delete feature. */
sr_state_delete_commits();
- tt_int_op(digestmap_size(state->commits), ==, 0);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 0);
/* Add it back so we can continue the rest of the test because after
* deletiong our commit will be freed so generate a new one. */
commit = sr_generate_our_commit(now, mock_cert);
tt_assert(commit);
sr_state_add_commit(commit);
- tt_int_op(digestmap_size(state->commits), ==, 1);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 1);
state->n_reveal_rounds = 42;
state->n_commit_rounds = 43;
state->n_protocol_runs = 44;
reset_state_for_new_protocol_run(now);
- tt_int_op(state->n_reveal_rounds, ==, 0);
- tt_int_op(state->n_commit_rounds, ==, 0);
- tt_u64_op(state->n_protocol_runs, ==, 45);
- tt_int_op(digestmap_size(state->commits), ==, 0);
+ tt_int_op(state->n_reveal_rounds, OP_EQ, 0);
+ tt_int_op(state->n_commit_rounds, OP_EQ, 0);
+ tt_u64_op(state->n_protocol_runs, OP_EQ, 45);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 0);
}
/* Test SRV rotation in our state. */
@@ -1052,7 +1166,7 @@ test_state_transition(void *arg)
state_rotate_srv();
prev = sr_state_get_previous_srv();
tt_assert(prev == cur);
- tt_assert(!sr_state_get_current_srv());
+ tt_ptr_op(sr_state_get_current_srv(), OP_EQ, NULL);
sr_state_clean_srvs();
}
@@ -1077,18 +1191,18 @@ test_state_transition(void *arg)
/* Also, make sure we did change the current. */
tt_assert(sr_state_get_current_srv() != cur);
/* We should have our commitment alone. */
- tt_int_op(digestmap_size(state->commits), ==, 1);
- tt_int_op(state->n_reveal_rounds, ==, 0);
- tt_int_op(state->n_commit_rounds, ==, 0);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 1);
+ tt_int_op(state->n_reveal_rounds, OP_EQ, 0);
+ tt_int_op(state->n_commit_rounds, OP_EQ, 0);
/* 46 here since we were at 45 just before. */
- tt_u64_op(state->n_protocol_runs, ==, 46);
+ tt_u64_op(state->n_protocol_runs, OP_EQ, 46);
}
/* Cleanup of SRVs. */
{
sr_state_clean_srvs();
- tt_assert(!sr_state_get_current_srv());
- tt_assert(!sr_state_get_previous_srv());
+ tt_ptr_op(sr_state_get_current_srv(), OP_EQ, NULL);
+ tt_ptr_op(sr_state_get_previous_srv(), OP_EQ, NULL);
}
done:
@@ -1125,21 +1239,21 @@ test_keep_commit(void *arg)
/* Set us in COMMIT phase for starter. */
set_sr_phase(SR_PHASE_COMMIT);
/* We should never keep a commit from a non authoritative authority. */
- tt_int_op(should_keep_commit(commit, fp, SR_PHASE_COMMIT), ==, 0);
+ tt_int_op(should_keep_commit(commit, fp, SR_PHASE_COMMIT), OP_EQ, 0);
/* This should NOT be kept because it has a reveal value in it. */
tt_assert(commit_has_reveal_value(commit));
tt_int_op(should_keep_commit(commit, commit->rsa_identity,
- SR_PHASE_COMMIT), ==, 0);
+ SR_PHASE_COMMIT), OP_EQ, 0);
/* Add it to the state which should return to not keep it. */
sr_state_add_commit(commit);
tt_int_op(should_keep_commit(commit, commit->rsa_identity,
- SR_PHASE_COMMIT), ==, 0);
+ SR_PHASE_COMMIT), OP_EQ, 0);
/* Remove it from state so we can continue our testing. */
digestmap_remove(state->commits, commit->rsa_identity);
/* Let's remove our reveal value which should make it OK to keep it. */
memset(commit->encoded_reveal, 0, sizeof(commit->encoded_reveal));
tt_int_op(should_keep_commit(commit, commit->rsa_identity,
- SR_PHASE_COMMIT), ==, 1);
+ SR_PHASE_COMMIT), OP_EQ, 1);
/* Let's reset our commit and go into REVEAL phase. */
sr_commit_free(commit);
@@ -1151,17 +1265,17 @@ test_keep_commit(void *arg)
memset(dup_commit->encoded_reveal, 0, sizeof(dup_commit->encoded_reveal));
set_sr_phase(SR_PHASE_REVEAL);
/* We should never keep a commit from a non authoritative authority. */
- tt_int_op(should_keep_commit(commit, fp, SR_PHASE_REVEAL), ==, 0);
+ tt_int_op(should_keep_commit(commit, fp, SR_PHASE_REVEAL), OP_EQ, 0);
/* We shouldn't accept a commit that is not in our state. */
tt_int_op(should_keep_commit(commit, commit->rsa_identity,
- SR_PHASE_REVEAL), ==, 0);
+ SR_PHASE_REVEAL), OP_EQ, 0);
/* Important to add the commit _without_ the reveal here. */
sr_state_add_commit(dup_commit);
- tt_int_op(digestmap_size(state->commits), ==, 1);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 1);
/* Our commit should be valid that is authoritative, contains a reveal, be
* in the state and commitment and reveal values match. */
tt_int_op(should_keep_commit(commit, commit->rsa_identity,
- SR_PHASE_REVEAL), ==, 1);
+ SR_PHASE_REVEAL), OP_EQ, 1);
/* The commit shouldn't be kept if it's not verified that is no matchin
* hashed reveal. */
{
@@ -1172,7 +1286,7 @@ test_keep_commit(void *arg)
memset(commit->hashed_reveal, 0, sizeof(commit->hashed_reveal));
setup_full_capture_of_logs(LOG_WARN);
tt_int_op(should_keep_commit(commit, commit->rsa_identity,
- SR_PHASE_REVEAL), ==, 0);
+ SR_PHASE_REVEAL), OP_EQ, 0);
expect_log_msg_containing("doesn't match the commit value.");
expect_log_msg_containing("has an invalid reveal value.");
assert_log_predicate(mock_saved_log_n_entries() == 2,
@@ -1183,11 +1297,11 @@ test_keep_commit(void *arg)
}
/* We shouldn't keep a commit that has no reveal. */
tt_int_op(should_keep_commit(dup_commit, dup_commit->rsa_identity,
- SR_PHASE_REVEAL), ==, 0);
+ SR_PHASE_REVEAL), OP_EQ, 0);
/* We must not keep a commit that is not the same from the commit phase. */
memset(commit->encoded_commit, 0, sizeof(commit->encoded_commit));
tt_int_op(should_keep_commit(commit, commit->rsa_identity,
- SR_PHASE_REVEAL), ==, 0);
+ SR_PHASE_REVEAL), OP_EQ, 0);
done:
teardown_capture_of_logs();
@@ -1225,35 +1339,35 @@ test_state_update(void *arg)
/* We are in COMMIT phase here and we'll trigger a state update but no
* transition. */
sr_state_update(commit_phase_time);
- tt_int_op(state->valid_after, ==, commit_phase_time);
- tt_int_op(state->n_commit_rounds, ==, 1);
- tt_int_op(state->phase, ==, SR_PHASE_COMMIT);
- tt_int_op(digestmap_size(state->commits), ==, 1);
+ tt_int_op(state->valid_after, OP_EQ, commit_phase_time);
+ tt_int_op(state->n_commit_rounds, OP_EQ, 1);
+ tt_int_op(state->phase, OP_EQ, SR_PHASE_COMMIT);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 1);
/* We are still in the COMMIT phase here but we'll trigger a state
* transition to the REVEAL phase. */
sr_state_update(reveal_phase_time);
- tt_int_op(state->phase, ==, SR_PHASE_REVEAL);
- tt_int_op(state->valid_after, ==, reveal_phase_time);
+ tt_int_op(state->phase, OP_EQ, SR_PHASE_REVEAL);
+ tt_int_op(state->valid_after, OP_EQ, reveal_phase_time);
/* Only our commit should be in there. */
- tt_int_op(digestmap_size(state->commits), ==, 1);
- tt_int_op(state->n_reveal_rounds, ==, 1);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 1);
+ tt_int_op(state->n_reveal_rounds, OP_EQ, 1);
/* We can't update a state with a valid after _lower_ than the creation
* time so here it is. */
sr_state_update(commit_phase_time);
- tt_int_op(state->valid_after, ==, reveal_phase_time);
+ tt_int_op(state->valid_after, OP_EQ, reveal_phase_time);
/* Finally, let's go back in COMMIT phase so we can test the state update
* of a new protocol run. */
state->valid_after = 0;
sr_state_update(commit_phase_time);
- tt_int_op(state->valid_after, ==, commit_phase_time);
- tt_int_op(state->n_commit_rounds, ==, 1);
- tt_int_op(state->n_reveal_rounds, ==, 0);
- tt_u64_op(state->n_protocol_runs, ==, 1);
- tt_int_op(state->phase, ==, SR_PHASE_COMMIT);
- tt_int_op(digestmap_size(state->commits), ==, 1);
+ tt_int_op(state->valid_after, OP_EQ, commit_phase_time);
+ tt_int_op(state->n_commit_rounds, OP_EQ, 1);
+ tt_int_op(state->n_reveal_rounds, OP_EQ, 0);
+ tt_u64_op(state->n_protocol_runs, OP_EQ, 1);
+ tt_int_op(state->phase, OP_EQ, SR_PHASE_COMMIT);
+ tt_int_op(digestmap_size(state->commits), OP_EQ, 1);
tt_assert(state->current_srv);
done:
@@ -1272,6 +1386,12 @@ struct testcase_t sr_tests[] = {
NULL, NULL },
{ "get_next_valid_after_time", test_get_next_valid_after_time, TT_FORK,
NULL, NULL },
+ { "get_start_time_of_current_run", test_get_start_time_of_current_run,
+ TT_FORK, NULL, NULL },
+ { "get_start_time_functions", test_get_start_time_functions,
+ TT_FORK, NULL, NULL },
+ { "get_sr_protocol_duration", test_get_sr_protocol_duration, TT_FORK,
+ NULL, NULL },
{ "get_state_valid_until_time", test_get_state_valid_until_time, TT_FORK,
NULL, NULL },
{ "vote", test_vote, TT_FORK,
diff --git a/src/test/test_socks.c b/src/test/test_socks.c
index bb1be11f2b..7c0960f0f9 100644
--- a/src/test/test_socks.c
+++ b/src/test/test_socks.c
@@ -61,8 +61,9 @@ test_socks_4_unsupported_commands(void *ptr)
/* SOCKS 4 Send BIND [02] to IP address 2.2.2.2:4369 */
ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00");
- tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == -1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, -1);
tt_int_op(4,OP_EQ, socks->socks_version);
tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
@@ -80,8 +81,9 @@ test_socks_4_supported_commands(void *ptr)
/* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */
ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00");
- tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, 1);
tt_int_op(4,OP_EQ, socks->socks_version);
tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command);
@@ -95,8 +97,9 @@ test_socks_4_supported_commands(void *ptr)
/* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/
ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00");
- tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, 1);
tt_int_op(4,OP_EQ, socks->socks_version);
tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command);
@@ -112,8 +115,9 @@ test_socks_4_supported_commands(void *ptr)
/* SOCKS 4a Send RESOLVE [F0] request for torproject.org */
ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00");
- tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, 1);
tt_int_op(4,OP_EQ, socks->socks_version);
tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
tt_str_op("torproject.org",OP_EQ, socks->address);
@@ -218,8 +222,9 @@ test_socks_5_supported_commands(void *ptr)
/* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02");
- tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, 1);
tt_int_op(5,OP_EQ, socks->socks_version);
tt_int_op(2,OP_EQ, socks->replylen);
tt_int_op(5,OP_EQ, socks->reply[0]);
@@ -229,47 +234,46 @@ test_socks_5_supported_commands(void *ptr)
tt_int_op(0,OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
- /* SOCKS 5 Should reject RESOLVE [F0] request for IPv4 address
+ /* SOCKS 5 Should NOT reject RESOLVE [F0] request for IPv4 address
* string if SafeSocks is enabled. */
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\xF0\x00\x03\x07");
ADD_DATA(buf, "8.8.8.8");
- ADD_DATA(buf, "\x01\x02");
- tt_assert(fetch_from_buf_socks(buf,socks,get_options()->TestSocks,1)
- == -1);
+ ADD_DATA(buf, "\x11\x11");
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),
+ OP_EQ, 1);
- tt_int_op(5,OP_EQ,socks->socks_version);
- tt_int_op(10,OP_EQ,socks->replylen);
- tt_int_op(5,OP_EQ,socks->reply[0]);
- tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]);
- tt_int_op(1,OP_EQ,socks->reply[3]);
+ tt_str_op("8.8.8.8", OP_EQ, socks->address);
+ tt_int_op(4369, OP_EQ, socks->port);
+
+ tt_int_op(0, OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
- /* SOCKS 5 should reject RESOLVE [F0] reject for IPv6 address
+ /* SOCKS 5 should NOT reject RESOLVE [F0] reject for IPv6 address
* string if SafeSocks is enabled. */
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\xF0\x00\x03\x27");
ADD_DATA(buf, "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
ADD_DATA(buf, "\x01\x02");
- tt_assert(fetch_from_buf_socks(buf,socks,get_options()->TestSocks,1)
- == -1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),
+ OP_EQ, -1);
- tt_int_op(5,OP_EQ,socks->socks_version);
- tt_int_op(10,OP_EQ,socks->replylen);
- tt_int_op(5,OP_EQ,socks->reply[0]);
- tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]);
- tt_int_op(1,OP_EQ,socks->reply[3]);
+ tt_str_op("2001:0db8:85a3:0000:0000:8a2e:0370:7334", OP_EQ, socks->address);
+ tt_int_op(258, OP_EQ, socks->port);
+
+ tt_int_op(0, OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
/* SOCKS 5 Send RESOLVE_PTR [F1] for IP address 2.2.2.5 */
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03");
- tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, 1);
tt_int_op(5,OP_EQ, socks->socks_version);
tt_int_op(2,OP_EQ, socks->replylen);
tt_int_op(5,OP_EQ, socks->reply[0]);
@@ -380,9 +384,9 @@ test_socks_5_authenticate_with_data(void *ptr)
/* SOCKS 5 Send username/password */
/* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
ADD_DATA(buf, "\x01\x02me\x03you\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
- tt_assert(fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks) == 1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, 1);
tt_int_op(5,OP_EQ, socks->socks_version);
tt_int_op(2,OP_EQ, socks->replylen);
tt_int_op(1,OP_EQ, socks->reply[0]);
@@ -408,9 +412,9 @@ test_socks_5_auth_before_negotiation(void *ptr)
/* SOCKS 5 Send username/password */
ADD_DATA(buf, "\x01\x02me\x02me");
- tt_assert(fetch_from_buf_socks(buf, socks,
- get_options()->TestSocks,
- get_options()->SafeSocks) == -1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
+ get_options()->SafeSocks),
+ OP_EQ, -1);
tt_int_op(0,OP_EQ, socks->socks_version);
tt_int_op(0,OP_EQ, socks->replylen);
tt_int_op(0,OP_EQ, socks->reply[0]);
diff --git a/src/test/test_status.c b/src/test/test_status.c
index a3b1a2af87..f86f8e3b9e 100644
--- a/src/test/test_status.c
+++ b/src/test/test_status.c
@@ -889,8 +889,8 @@ NS(logv)(int severity, log_domain_mask_t domain, const char *funcname,
tt_str_op(format, OP_EQ,
"Average packaged cell fullness: %2.3f%%. "
"TLS write overhead: %.f%%");
- tt_double_op(fabs(va_arg(ap, double) - 50.0), <=, DBL_EPSILON);
- tt_double_op(fabs(va_arg(ap, double) - 0.0), <=, DBL_EPSILON);
+ tt_double_op(fabs(va_arg(ap, double) - 50.0), OP_LE, DBL_EPSILON);
+ tt_double_op(fabs(va_arg(ap, double) - 0.0), OP_LE, DBL_EPSILON);
break;
default:
tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
@@ -1039,7 +1039,7 @@ NS(logv)(int severity, log_domain_mask_t domain,
"Average packaged cell fullness: %2.3f%%. "
"TLS write overhead: %.f%%");
tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, OP_EQ, 1);
- tt_double_op(fabs(va_arg(ap, double) - 100.0), <=, DBL_EPSILON);
+ tt_double_op(fabs(va_arg(ap, double) - 100.0), OP_LE, DBL_EPSILON);
break;
default:
tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
diff --git a/src/test/test_storagedir.c b/src/test/test_storagedir.c
index 19e5de4ea3..a27074c21f 100644
--- a/src/test/test_storagedir.c
+++ b/src/test/test_storagedir.c
@@ -338,7 +338,7 @@ test_storagedir_read_labeled(void *arg)
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);
+ tt_ptr_op(labels->next->next->next, OP_EQ, NULL);
/* Try reading this time. */
sz = 0;
diff --git a/src/test/test_threads.c b/src/test/test_threads.c
index 18a9407ff7..ed6d8f04aa 100644
--- a/src/test/test_threads.c
+++ b/src/test/test_threads.c
@@ -139,8 +139,8 @@ test_threads_basic(void *arg)
!strcmp(strmap_get(thread_test_strmap_, "thread 2"),
strmap_get(thread_test_strmap_, "last to run")));
- tt_int_op(thread_fns_failed, ==, 0);
- tt_int_op(thread_fn_tid1, !=, thread_fn_tid2);
+ tt_int_op(thread_fns_failed, OP_EQ, 0);
+ tt_int_op(thread_fn_tid1, OP_NE, thread_fn_tid2);
done:
tor_free(s1);
@@ -275,14 +275,14 @@ test_threads_conditionvar(void *arg)
SPIN();
tor_mutex_release(ti->mutex);
- tt_int_op(ti->value, ==, 1337);
+ tt_int_op(ti->value, OP_EQ, 1337);
if (!timeout) {
- tt_int_op(ti->n_shutdown, ==, 4);
+ tt_int_op(ti->n_shutdown, OP_EQ, 4);
} else {
tor_sleep_msec(200);
tor_mutex_acquire(ti->mutex);
- tt_int_op(ti->n_shutdown, ==, 2);
- tt_int_op(ti->n_timeouts, ==, 2);
+ tt_int_op(ti->n_shutdown, OP_EQ, 2);
+ tt_int_op(ti->n_timeouts, OP_EQ, 2);
tor_mutex_release(ti->mutex);
}
diff --git a/src/test/test_tortls.c b/src/test/test_tortls.c
index 7aa3051464..ce21bb28ee 100644
--- a/src/test/test_tortls.c
+++ b/src/test/test_tortls.c
@@ -136,7 +136,7 @@ test_tortls_tor_tls_new(void *data)
SSL_CTX_free(client_tls_context->ctx);
client_tls_context->ctx = NULL;
tls = tor_tls_new(-1, 0);
- tt_assert(!tls);
+ tt_ptr_op(tls, OP_EQ, NULL);
#ifndef OPENSSL_OPAQUE
method = give_me_a_test_method();
@@ -144,7 +144,7 @@ test_tortls_tor_tls_new(void *data)
method->num_ciphers = fake_num_ciphers;
client_tls_context->ctx = ctx;
tls = tor_tls_new(-1, 0);
- tt_assert(!tls);
+ tt_ptr_op(tls, OP_EQ, NULL);
#endif
done:
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 7db93324d1..b7818202c3 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -70,7 +70,7 @@ test_util_read_until_eof_impl(const char *fname, size_t file_len,
fd = open(fifo_name, O_RDONLY|O_BINARY);
tt_int_op(fd, OP_GE, 0);
str = read_file_to_str_until_eof(fd, read_limit, &sz);
- tt_assert(str != NULL);
+ tt_ptr_op(str, OP_NE, NULL);
if (read_limit < file_len)
tt_int_op(sz, OP_EQ, read_limit);
@@ -1674,14 +1674,14 @@ test_util_config_line_crlf(void *arg)
tt_assert(str);
tt_str_op(k,OP_EQ,"Hello");
tt_str_op(v,OP_EQ,"world");
- tt_assert(!err);
+ tt_ptr_op(err, OP_EQ, NULL);
tor_free(k); tor_free(v);
str = parse_config_line_from_str_verbose(str, &k, &v, &err);
tt_assert(str);
tt_str_op(k,OP_EQ,"Hello");
tt_str_op(v,OP_EQ,"nice big world");
- tt_assert(!err);
+ tt_ptr_op(err, OP_EQ, NULL);
tor_free(k); tor_free(v);
tt_str_op(str,OP_EQ, "");
@@ -1941,7 +1941,7 @@ test_util_strmisc(void *arg)
tt_assert(!tor_mem_is_zero(buf, 10));
/* Test 'escaped' */
- tt_assert(NULL == escaped(NULL));
+ tt_ptr_op(escaped(NULL), OP_EQ, NULL);
tt_str_op("\"\"",OP_EQ, escaped(""));
tt_str_op("\"abcd\"",OP_EQ, escaped("abcd"));
tt_str_op("\"\\\\ \\n\\r\\t\\\"\\'\"",OP_EQ, escaped("\\ \n\r\t\"'"));
@@ -1999,23 +1999,23 @@ test_util_strmisc(void *arg)
/* Test memmem and memstr */
{
const char *haystack = "abcde";
- tt_assert(!tor_memmem(haystack, 5, "ef", 2));
+ tt_ptr_op(tor_memmem(haystack, 5, "ef", 2), OP_EQ, NULL);
tt_ptr_op(tor_memmem(haystack, 5, "cd", 2),OP_EQ, haystack + 2);
tt_ptr_op(tor_memmem(haystack, 5, "cde", 3),OP_EQ, haystack + 2);
- tt_assert(!tor_memmem(haystack, 4, "cde", 3));
+ tt_ptr_op(tor_memmem(haystack, 4, "cde", 3), OP_EQ, NULL);
haystack = "ababcad";
tt_ptr_op(tor_memmem(haystack, 7, "abc", 3),OP_EQ, haystack + 2);
tt_ptr_op(tor_memmem(haystack, 7, "ad", 2),OP_EQ, haystack + 5);
tt_ptr_op(tor_memmem(haystack, 7, "cad", 3),OP_EQ, haystack + 4);
- tt_assert(!tor_memmem(haystack, 7, "dadad", 5));
- tt_assert(!tor_memmem(haystack, 7, "abcdefghij", 10));
+ tt_ptr_op(tor_memmem(haystack, 7, "dadad", 5), OP_EQ, NULL);
+ tt_ptr_op(tor_memmem(haystack, 7, "abcdefghij", 10), OP_EQ, NULL);
/* memstr */
tt_ptr_op(tor_memstr(haystack, 7, "abc"),OP_EQ, haystack + 2);
tt_ptr_op(tor_memstr(haystack, 7, "cad"),OP_EQ, haystack + 4);
- tt_assert(!tor_memstr(haystack, 6, "cad"));
- tt_assert(!tor_memstr(haystack, 7, "cadd"));
- tt_assert(!tor_memstr(haystack, 7, "fe"));
- tt_assert(!tor_memstr(haystack, 7, "ababcade"));
+ tt_ptr_op(tor_memstr(haystack, 6, "cad"), OP_EQ, NULL);
+ tt_ptr_op(tor_memstr(haystack, 7, "cadd"), OP_EQ, NULL);
+ tt_ptr_op(tor_memstr(haystack, 7, "fe"), OP_EQ, NULL);
+ tt_ptr_op(tor_memstr(haystack, 7, "ababcade"), OP_EQ, NULL);
}
/* Test hex_str */
@@ -2125,10 +2125,13 @@ test_util_parse_integer(void *arg)
/* Base different than 10 */
tt_int_op(2L,OP_EQ, tor_parse_long("10",2,0,100,NULL,NULL));
tt_int_op(0L,OP_EQ, tor_parse_long("2",2,0,100,NULL,NULL));
- tt_int_op(0L,OP_EQ, tor_parse_long("10",-2,0,100,NULL,NULL));
tt_int_op(68284L,OP_EQ, tor_parse_long("10abc",16,0,70000,NULL,NULL));
tt_int_op(68284L,OP_EQ, tor_parse_long("10ABC",16,0,70000,NULL,NULL));
+ tor_capture_bugs_(2);
+ tt_int_op(0L,OP_EQ, tor_parse_long("10",-2,0,100,NULL,NULL));
tt_int_op(0,OP_EQ, tor_parse_long("10ABC",-1,0,70000,&i,NULL));
+ tt_int_op(2, OP_EQ, smartlist_len(tor_get_captured_bug_log_()));
+ tor_end_capture_bugs_();
tt_int_op(i,OP_EQ, 0);
/* Test parse_ulong */
@@ -2141,7 +2144,10 @@ test_util_parse_integer(void *arg)
tt_int_op(0UL,OP_EQ, tor_parse_ulong("8",8,0,100,NULL,NULL));
tt_int_op(50UL,OP_EQ, tor_parse_ulong("50",10,50,100,NULL,NULL));
tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,0,100,NULL,NULL));
+ tor_capture_bugs_(1);
tt_int_op(0UL,OP_EQ, tor_parse_ulong("50",-1,50,100,&i,NULL));
+ tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_()));
+ tor_end_capture_bugs_();
tt_int_op(0,OP_EQ, i);
tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,0,100,&i,NULL));
tt_int_op(0,OP_EQ, i);
@@ -2157,8 +2163,11 @@ test_util_parse_integer(void *arg)
tt_assert(U64_LITERAL(0) ==
tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp));
tt_int_op(0,OP_EQ, i);
+ tor_capture_bugs_(1);
tt_assert(U64_LITERAL(0) ==
tor_parse_uint64("123",-1,0,INT32_MAX, &i, &cp));
+ tt_int_op(1, OP_EQ, smartlist_len(tor_get_captured_bug_log_()));
+ tor_end_capture_bugs_();
tt_int_op(0,OP_EQ, i);
{
@@ -2250,11 +2259,16 @@ test_util_compress_impl(compress_method_t method)
tt_assert(tor_compress_supports_method(method));
+ if (method != NO_METHOD) {
+ tt_ptr_op(tor_compress_version_str(method), OP_NE, NULL);
+ tt_ptr_op(tor_compress_header_version_str(method), OP_NE, NULL);
+ }
+
buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ");
tt_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD);
tt_assert(!tor_compress(&buf2, &len1, buf1, strlen(buf1)+1, method));
- tt_assert(buf2 != NULL);
+ tt_ptr_op(buf2, OP_NE, NULL);
if (method == NO_METHOD) {
// The identity transform doesn't actually compress, and it isn't
// detectable as "the identity transform."
@@ -2266,7 +2280,7 @@ test_util_compress_impl(compress_method_t method)
}
tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1, method, 1, LOG_INFO));
- tt_assert(buf3 != NULL);
+ tt_ptr_op(buf3, OP_NE, 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);
@@ -2313,7 +2327,7 @@ test_util_compress_impl(compress_method_t method)
if (method != NO_METHOD) {
tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16,
method, 1, LOG_INFO));
- tt_assert(buf3 == NULL);
+ tt_ptr_op(buf3, OP_EQ, NULL);
}
done:
@@ -2353,6 +2367,8 @@ test_util_compress_stream_impl(compress_method_t method,
tt_assert(cp1 > cp2); /* Make sure we really added something. */
}
+ tt_int_op(tor_compress_state_size(state), OP_GT, 0);
+
tt_assert(!tor_uncompress(&buf3, &len2, buf1, 1024-len1,
method, 1, LOG_WARN));
/* Make sure it compressed right. */
@@ -2518,7 +2534,7 @@ test_util_mmap(void *arg)
crypto_rand(buf, buflen);
mapping = tor_mmap_file(fname1);
- tt_assert(! mapping);
+ tt_ptr_op(mapping, OP_EQ, NULL);
write_str_to_file(fname1, "Short file.", 1);
@@ -2547,7 +2563,7 @@ test_util_mmap(void *arg)
/* Make sure that we fail to map a no-longer-existent file. */
mapping = tor_mmap_file(fname1);
- tt_assert(! mapping);
+ tt_ptr_op(mapping, OP_EQ, NULL);
/* Now try a big file that stretches across a few pages and isn't aligned */
write_bytes_to_file(fname2, buf, buflen, 1);
@@ -3615,8 +3631,8 @@ test_util_strtok(void *arg)
}
tor_snprintf(buf, sizeof(buf), "%s", pad1);
tor_snprintf(buf2, sizeof(buf2), "%s", pad2);
- tt_assert(NULL == tor_strtok_r_impl(buf, " ", &cp1));
- tt_assert(NULL == tor_strtok_r_impl(buf2, ".!..;!", &cp2));
+ tt_ptr_op(tor_strtok_r_impl(buf, " ", &cp1), OP_EQ, NULL);
+ tt_ptr_op(tor_strtok_r_impl(buf2, ".!..;!", &cp2), OP_EQ, NULL);
tor_snprintf(buf, sizeof(buf),
"%sGraved on the dark in gestures of descent%s", pad1, pad1);
@@ -4360,7 +4376,7 @@ test_util_split_lines(void *ptr)
/* Check we have not got too many lines */
tt_int_op(MAX_SPLIT_LINE_COUNT, OP_GT, j);
/* Check that there actually should be a line here */
- tt_assert(tests[i].split_line[j] != NULL);
+ tt_ptr_op(tests[i].split_line[j], OP_NE, NULL);
log_info(LD_GENERAL, "Line %d of test %d, should be <%s>",
j, i, tests[i].split_line[j]);
/* Check that the line is as expected */
@@ -4476,11 +4492,11 @@ test_util_di_map(void *arg)
char dflt_entry[] = "'You have made a good beginning', but no more";
- tt_int_op(32, ==, sizeof(key1));
- tt_int_op(32, ==, sizeof(key2));
- tt_int_op(32, ==, sizeof(key3));
+ tt_int_op(32, OP_EQ, sizeof(key1));
+ tt_int_op(32, OP_EQ, sizeof(key2));
+ tt_int_op(32, OP_EQ, sizeof(key3));
- tt_ptr_op(dflt_entry, ==, dimap_search(dimap, key1, dflt_entry));
+ tt_ptr_op(dflt_entry, OP_EQ, dimap_search(dimap, key1, dflt_entry));
char *str1 = tor_strdup("You are precisely as big as what you love"
" and precisely as small as what you allow"
@@ -4498,10 +4514,10 @@ test_util_di_map(void *arg)
dimap_add_entry(&dimap, key2, str2);
dimap_add_entry(&dimap, key3, str3);
- tt_ptr_op(str1, ==, dimap_search(dimap, key1, dflt_entry));
- tt_ptr_op(str3, ==, dimap_search(dimap, key3, dflt_entry));
- tt_ptr_op(str2, ==, dimap_search(dimap, key2, dflt_entry));
- tt_ptr_op(dflt_entry, ==, dimap_search(dimap, key4, dflt_entry));
+ tt_ptr_op(str1, OP_EQ, dimap_search(dimap, key1, dflt_entry));
+ tt_ptr_op(str3, OP_EQ, dimap_search(dimap, key3, dflt_entry));
+ tt_ptr_op(str2, OP_EQ, dimap_search(dimap, key2, dflt_entry));
+ tt_ptr_op(dflt_entry, OP_EQ, dimap_search(dimap, key4, dflt_entry));
done:
dimap_free(dimap, tor_free_);
@@ -4968,34 +4984,34 @@ test_util_round_to_next_multiple_of(void *arg)
{
(void)arg;
- tt_u64_op(round_uint64_to_next_multiple_of(0,1), ==, 0);
- tt_u64_op(round_uint64_to_next_multiple_of(0,7), ==, 0);
+ tt_u64_op(round_uint64_to_next_multiple_of(0,1), OP_EQ, 0);
+ tt_u64_op(round_uint64_to_next_multiple_of(0,7), OP_EQ, 0);
- tt_u64_op(round_uint64_to_next_multiple_of(99,1), ==, 99);
- tt_u64_op(round_uint64_to_next_multiple_of(99,7), ==, 105);
- tt_u64_op(round_uint64_to_next_multiple_of(99,9), ==, 99);
+ tt_u64_op(round_uint64_to_next_multiple_of(99,1), OP_EQ, 99);
+ tt_u64_op(round_uint64_to_next_multiple_of(99,7), OP_EQ, 105);
+ tt_u64_op(round_uint64_to_next_multiple_of(99,9), OP_EQ, 99);
- tt_u64_op(round_uint64_to_next_multiple_of(UINT64_MAX,2), ==,
+ tt_u64_op(round_uint64_to_next_multiple_of(UINT64_MAX,2), OP_EQ,
UINT64_MAX);
- tt_int_op(round_uint32_to_next_multiple_of(0,1), ==, 0);
- tt_int_op(round_uint32_to_next_multiple_of(0,7), ==, 0);
+ tt_int_op(round_uint32_to_next_multiple_of(0,1), OP_EQ, 0);
+ tt_int_op(round_uint32_to_next_multiple_of(0,7), OP_EQ, 0);
- tt_int_op(round_uint32_to_next_multiple_of(99,1), ==, 99);
- tt_int_op(round_uint32_to_next_multiple_of(99,7), ==, 105);
- tt_int_op(round_uint32_to_next_multiple_of(99,9), ==, 99);
+ tt_int_op(round_uint32_to_next_multiple_of(99,1), OP_EQ, 99);
+ tt_int_op(round_uint32_to_next_multiple_of(99,7), OP_EQ, 105);
+ tt_int_op(round_uint32_to_next_multiple_of(99,9), OP_EQ, 99);
- tt_int_op(round_uint32_to_next_multiple_of(UINT32_MAX,2), ==,
+ tt_int_op(round_uint32_to_next_multiple_of(UINT32_MAX,2), OP_EQ,
UINT32_MAX);
- tt_uint_op(round_to_next_multiple_of(0,1), ==, 0);
- tt_uint_op(round_to_next_multiple_of(0,7), ==, 0);
+ tt_uint_op(round_to_next_multiple_of(0,1), OP_EQ, 0);
+ tt_uint_op(round_to_next_multiple_of(0,7), OP_EQ, 0);
- tt_uint_op(round_to_next_multiple_of(99,1), ==, 99);
- tt_uint_op(round_to_next_multiple_of(99,7), ==, 105);
- tt_uint_op(round_to_next_multiple_of(99,9), ==, 99);
+ tt_uint_op(round_to_next_multiple_of(99,1), OP_EQ, 99);
+ tt_uint_op(round_to_next_multiple_of(99,7), OP_EQ, 105);
+ tt_uint_op(round_to_next_multiple_of(99,9), OP_EQ, 99);
- tt_uint_op(round_to_next_multiple_of(UINT_MAX,2), ==,
+ tt_uint_op(round_to_next_multiple_of(UINT_MAX,2), OP_EQ,
UINT_MAX);
done:
;
@@ -5016,26 +5032,26 @@ test_util_laplace(void *arg)
const double delta_f = 15.0, epsilon = 0.3; /* b = 15.0 / 0.3 = 50.0 */
(void)arg;
- tt_i64_op(INT64_MIN, ==, sample_laplace_distribution(mu, b, 0.0));
- tt_i64_op(-69, ==, sample_laplace_distribution(mu, b, 0.01));
- tt_i64_op(24, ==, sample_laplace_distribution(mu, b, 0.5));
- tt_i64_op(24, ==, sample_laplace_distribution(mu, b, 0.51));
- tt_i64_op(117, ==, sample_laplace_distribution(mu, b, 0.99));
+ tt_i64_op(INT64_MIN, OP_EQ, sample_laplace_distribution(mu, b, 0.0));
+ tt_i64_op(-69, OP_EQ, sample_laplace_distribution(mu, b, 0.01));
+ tt_i64_op(24, OP_EQ, sample_laplace_distribution(mu, b, 0.5));
+ tt_i64_op(24, OP_EQ, sample_laplace_distribution(mu, b, 0.51));
+ tt_i64_op(117, OP_EQ, sample_laplace_distribution(mu, b, 0.99));
/* >>> laplace.ppf([0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99],
* ... loc = 0, scale = 50)
* array([ -inf, -80.47189562, -34.65735903, 0. ,
* 34.65735903, 80.47189562, 195.60115027])
*/
- tt_i64_op(INT64_MIN + 20, ==,
+ tt_i64_op(INT64_MIN + 20, OP_EQ,
add_laplace_noise(20, 0.0, delta_f, epsilon));
- tt_i64_op(-60, ==, add_laplace_noise(20, 0.1, delta_f, epsilon));
- tt_i64_op(-14, ==, add_laplace_noise(20, 0.25, delta_f, epsilon));
- tt_i64_op(20, ==, add_laplace_noise(20, 0.5, delta_f, epsilon));
- tt_i64_op(54, ==, add_laplace_noise(20, 0.75, delta_f, epsilon));
- tt_i64_op(100, ==, add_laplace_noise(20, 0.9, delta_f, epsilon));
- tt_i64_op(215, ==, add_laplace_noise(20, 0.99, delta_f, epsilon));
+ tt_i64_op(-60, OP_EQ, add_laplace_noise(20, 0.1, delta_f, epsilon));
+ tt_i64_op(-14, OP_EQ, add_laplace_noise(20, 0.25, delta_f, epsilon));
+ tt_i64_op(20, OP_EQ, add_laplace_noise(20, 0.5, delta_f, epsilon));
+ tt_i64_op(54, OP_EQ, add_laplace_noise(20, 0.75, delta_f, epsilon));
+ tt_i64_op(100, OP_EQ, add_laplace_noise(20, 0.9, delta_f, epsilon));
+ tt_i64_op(215, OP_EQ, add_laplace_noise(20, 0.99, delta_f, epsilon));
/* Test extreme values of signal with maximally negative values of noise
* 1.0000000000000002 is the smallest number > 1
@@ -5048,54 +5064,54 @@ test_util_laplace(void *arg)
*/
const double noscale_df = 1.0, noscale_eps = 1.0;
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(0, 0.0, noscale_df, noscale_eps));
/* is it clipped to INT64_MIN? */
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(-1, 0.0, noscale_df, noscale_eps));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(INT64_MIN, 0.0,
noscale_df, noscale_eps));
/* ... even when scaled? */
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(0, 0.0, delta_f, epsilon));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(0, 0.0,
DBL_MAX, 1));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(INT64_MIN, 0.0,
DBL_MAX, 1));
/* does it play nice with INT64_MAX? */
- tt_i64_op((INT64_MIN + INT64_MAX), ==,
+ tt_i64_op((INT64_MIN + INT64_MAX), OP_EQ,
add_laplace_noise(INT64_MAX, 0.0,
noscale_df, noscale_eps));
/* do near-zero fractional values work? */
const double min_dbl_error = 0.0000000000000002;
- tt_i64_op(-35, ==,
+ tt_i64_op(-35, OP_EQ,
add_laplace_noise(0, min_dbl_error,
noscale_df, noscale_eps));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(INT64_MIN, min_dbl_error,
noscale_df, noscale_eps));
- tt_i64_op((-35 + INT64_MAX), ==,
+ tt_i64_op((-35 + INT64_MAX), OP_EQ,
add_laplace_noise(INT64_MAX, min_dbl_error,
noscale_df, noscale_eps));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(0, min_dbl_error,
DBL_MAX, 1));
- tt_i64_op((INT64_MAX + INT64_MIN), ==,
+ tt_i64_op((INT64_MAX + INT64_MIN), OP_EQ,
add_laplace_noise(INT64_MAX, min_dbl_error,
DBL_MAX, 1));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
add_laplace_noise(INT64_MIN, min_dbl_error,
DBL_MAX, 1));
/* does it play nice with INT64_MAX? */
- tt_i64_op((INT64_MAX - 35), ==,
+ tt_i64_op((INT64_MAX - 35), OP_EQ,
add_laplace_noise(INT64_MAX, min_dbl_error,
noscale_df, noscale_eps));
@@ -5110,31 +5126,31 @@ test_util_laplace(void *arg)
const double max_dbl_lt_one = 0.9999999999999998;
/* do near-one fractional values work? */
- tt_i64_op(35, ==,
+ tt_i64_op(35, OP_EQ,
add_laplace_noise(0, max_dbl_lt_one, noscale_df, noscale_eps));
/* is it clipped to INT64_MAX? */
- tt_i64_op(INT64_MAX, ==,
+ tt_i64_op(INT64_MAX, OP_EQ,
add_laplace_noise(INT64_MAX - 35, max_dbl_lt_one,
noscale_df, noscale_eps));
- tt_i64_op(INT64_MAX, ==,
+ tt_i64_op(INT64_MAX, OP_EQ,
add_laplace_noise(INT64_MAX - 34, max_dbl_lt_one,
noscale_df, noscale_eps));
- tt_i64_op(INT64_MAX, ==,
+ tt_i64_op(INT64_MAX, OP_EQ,
add_laplace_noise(INT64_MAX, max_dbl_lt_one,
noscale_df, noscale_eps));
/* ... even when scaled? */
- tt_i64_op(INT64_MAX, ==,
+ tt_i64_op(INT64_MAX, OP_EQ,
add_laplace_noise(INT64_MAX, max_dbl_lt_one,
delta_f, epsilon));
- tt_i64_op((INT64_MIN + INT64_MAX), ==,
+ tt_i64_op((INT64_MIN + INT64_MAX), OP_EQ,
add_laplace_noise(INT64_MIN, max_dbl_lt_one,
DBL_MAX, 1));
- tt_i64_op(INT64_MAX, ==,
+ tt_i64_op(INT64_MAX, OP_EQ,
add_laplace_noise(INT64_MAX, max_dbl_lt_one,
DBL_MAX, 1));
/* does it play nice with INT64_MIN? */
- tt_i64_op((INT64_MIN + 35), ==,
+ tt_i64_op((INT64_MIN + 35), OP_EQ,
add_laplace_noise(INT64_MIN, max_dbl_lt_one,
noscale_df, noscale_eps));
@@ -5147,32 +5163,32 @@ test_util_clamp_double_to_int64(void *arg)
{
(void)arg;
- tt_i64_op(INT64_MIN, ==, clamp_double_to_int64(-INFINITY_DBL));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ, clamp_double_to_int64(-INFINITY_DBL));
+ tt_i64_op(INT64_MIN, OP_EQ,
clamp_double_to_int64(-1.0 * pow(2.0, 64.0) - 1.0));
- tt_i64_op(INT64_MIN, ==,
+ tt_i64_op(INT64_MIN, OP_EQ,
clamp_double_to_int64(-1.0 * pow(2.0, 63.0) - 1.0));
- tt_i64_op(((uint64_t) -1) << 53, ==,
+ tt_i64_op(((uint64_t) -1) << 53, OP_EQ,
clamp_double_to_int64(-1.0 * pow(2.0, 53.0)));
- tt_i64_op((((uint64_t) -1) << 53) + 1, ==,
+ tt_i64_op((((uint64_t) -1) << 53) + 1, OP_EQ,
clamp_double_to_int64(-1.0 * pow(2.0, 53.0) + 1.0));
- tt_i64_op(-1, ==, clamp_double_to_int64(-1.0));
- tt_i64_op(0, ==, clamp_double_to_int64(-0.9));
- tt_i64_op(0, ==, clamp_double_to_int64(-0.1));
- tt_i64_op(0, ==, clamp_double_to_int64(0.0));
- tt_i64_op(0, ==, clamp_double_to_int64(NAN_DBL));
- tt_i64_op(0, ==, clamp_double_to_int64(0.1));
- tt_i64_op(0, ==, clamp_double_to_int64(0.9));
- tt_i64_op(1, ==, clamp_double_to_int64(1.0));
- tt_i64_op((((int64_t) 1) << 53) - 1, ==,
+ tt_i64_op(-1, OP_EQ, clamp_double_to_int64(-1.0));
+ tt_i64_op(0, OP_EQ, clamp_double_to_int64(-0.9));
+ tt_i64_op(0, OP_EQ, clamp_double_to_int64(-0.1));
+ tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.0));
+ tt_i64_op(0, OP_EQ, clamp_double_to_int64(NAN_DBL));
+ tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.1));
+ tt_i64_op(0, OP_EQ, clamp_double_to_int64(0.9));
+ tt_i64_op(1, OP_EQ, clamp_double_to_int64(1.0));
+ tt_i64_op((((int64_t) 1) << 53) - 1, OP_EQ,
clamp_double_to_int64(pow(2.0, 53.0) - 1.0));
- tt_i64_op(((int64_t) 1) << 53, ==,
+ tt_i64_op(((int64_t) 1) << 53, OP_EQ,
clamp_double_to_int64(pow(2.0, 53.0)));
- tt_i64_op(INT64_MAX, ==,
+ tt_i64_op(INT64_MAX, OP_EQ,
clamp_double_to_int64(pow(2.0, 63.0)));
- tt_i64_op(INT64_MAX, ==,
+ tt_i64_op(INT64_MAX, OP_EQ,
clamp_double_to_int64(pow(2.0, 64.0)));
- tt_i64_op(INT64_MAX, ==, clamp_double_to_int64(INFINITY_DBL));
+ tt_i64_op(INT64_MAX, OP_EQ, clamp_double_to_int64(INFINITY_DBL));
done:
;
@@ -5540,25 +5556,25 @@ test_util_pwdb(void *arg)
/* Uncached case. */
/* Let's assume that we exist. */
me = tor_getpwuid(getuid());
- tt_assert(me != NULL);
+ tt_ptr_op(me, OP_NE, NULL);
name = tor_strdup(me->pw_name);
/* Uncached case */
me2 = tor_getpwnam(name);
- tt_assert(me2 != NULL);
+ tt_ptr_op(me2, OP_NE, NULL);
tt_int_op(me2->pw_uid, OP_EQ, getuid());
/* Cached case */
me3 = tor_getpwuid(getuid());
- tt_assert(me3 != NULL);
+ tt_ptr_op(me3, OP_NE, NULL);
tt_str_op(me3->pw_name, OP_EQ, name);
me3 = tor_getpwnam(name);
- tt_assert(me3 != NULL);
+ tt_ptr_op(me3, OP_NE, NULL);
tt_int_op(me3->pw_uid, OP_EQ, getuid());
dir = get_user_homedir(name);
- tt_assert(dir != NULL);
+ tt_ptr_op(dir, OP_NE, NULL);
/* Try failing cases. First find a user that doesn't exist by name */
char randbytes[4];
@@ -5578,7 +5594,7 @@ test_util_pwdb(void *arg)
/* We should do a LOG_ERR */
setup_full_capture_of_logs(LOG_ERR);
dir = get_user_homedir(badname);
- tt_assert(dir == NULL);
+ tt_ptr_op(dir, OP_EQ, NULL);
expect_log_msg_containing("not found");
tt_int_op(smartlist_len(mock_saved_logs()), OP_EQ, 1);
teardown_capture_of_logs();
diff --git a/src/test/test_util_format.c b/src/test/test_util_format.c
index ea0a86499f..683d5fdac1 100644
--- a/src/test/test_util_format.c
+++ b/src/test/test_util_format.c
@@ -345,7 +345,7 @@ test_util_format_base32_decode(void *arg)
const char *src = "mjwgc2dcnrswqmjs";
ret = base32_decode(dst, strlen(expected), src, strlen(src));
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
tt_str_op(expected, OP_EQ, dst);
}
@@ -356,7 +356,7 @@ test_util_format_base32_decode(void *arg)
const char *src = "mjwgc2dcnrswq";
ret = base32_decode(dst, strlen(expected), src, strlen(src));
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
tt_mem_op(expected, OP_EQ, dst, strlen(expected));
}
@@ -364,9 +364,9 @@ test_util_format_base32_decode(void *arg)
{
/* Invalid character '#'. */
ret = base32_decode(dst, real_dstlen, "#abcde", 6);
- tt_int_op(ret, ==, -1);
+ tt_int_op(ret, OP_EQ, -1);
/* Make sure the destination buffer has been zeroed even on error. */
- tt_int_op(tor_mem_is_zero(dst, real_dstlen), ==, 1);
+ tt_int_op(tor_mem_is_zero(dst, real_dstlen), OP_EQ, 1);
}
done:
diff --git a/src/test/test_util_slow.c b/src/test/test_util_slow.c
index 3e5d78948d..b120c91083 100644
--- a/src/test/test_util_slow.c
+++ b/src/test/test_util_slow.c
@@ -78,7 +78,7 @@ run_util_spawn_background(const char *argv[], const char *expected_out,
return;
}
- tt_assert(process_handle != NULL);
+ tt_ptr_op(process_handle, OP_NE, NULL);
/* When a spawned process forks, fails, then exits very quickly,
* (this typically occurs when exec fails)
diff --git a/src/tools/include.am b/src/tools/include.am
index 717af9e2ae..37936c742f 100644
--- a/src/tools/include.am
+++ b/src/tools/include.am
@@ -8,8 +8,8 @@ src_tools_tor_resolve_SOURCES = src/tools/tor-resolve.c
src_tools_tor_resolve_LDFLAGS =
src_tools_tor_resolve_LDADD = src/common/libor.a \
src/common/libor-ctime.a \
- @TOR_LIB_MATH@ @TOR_LIB_WS32@ \
- $(rust_ldadd)
+ $(rust_ldadd) \
+ @TOR_LIB_MATH@ @TOR_LIB_WS32@ @TOR_LIB_USERENV@
if COVERAGE_ENABLED
src_tools_tor_cov_resolve_SOURCES = src/tools/tor-resolve.c
@@ -26,9 +26,9 @@ src_tools_tor_gencert_LDADD = src/common/libor.a src/common/libor-crypto.a \
src/common/libor-ctime.a \
$(LIBKECCAK_TINY) \
$(LIBDONNA) \
+ $(rust_ldadd) \
@TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
- $(rust_ldadd)
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@
if COVERAGE_ENABLED
src_tools_tor_cov_gencert_SOURCES = src/tools/tor-gencert.c
diff --git a/src/trunnel/channelpadding_negotiation.c b/src/trunnel/channelpadding_negotiation.c
index 172d6f8a03..59e6b38384 100644
--- a/src/trunnel/channelpadding_negotiation.c
+++ b/src/trunnel/channelpadding_negotiation.c
@@ -1,4 +1,4 @@
-/* channelpadding_negotiation.c -- generated by Trunnel v1.4.3.
+/* channelpadding_negotiation.c -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -13,7 +13,7 @@
} while (0)
#if defined(__COVERITY__) || defined(__clang_analyzer__)
-/* If we're runnning a static analysis tool, we don't want it to complain
+/* If we're running a static analysis tool, we don't want it to complain
* that some of our remaining-bytes checks are dead-code. */
int channelpaddingnegotiation_deadcode_dummy__ = 0;
#define OR_DEADCODE_DUMMY || channelpaddingnegotiation_deadcode_dummy__
@@ -57,7 +57,7 @@ channelpadding_negotiate_free(channelpadding_negotiate_t *obj)
}
uint8_t
-channelpadding_negotiate_get_version(channelpadding_negotiate_t *inp)
+channelpadding_negotiate_get_version(const channelpadding_negotiate_t *inp)
{
return inp->version;
}
@@ -72,7 +72,7 @@ channelpadding_negotiate_set_version(channelpadding_negotiate_t *inp, uint8_t va
return 0;
}
uint8_t
-channelpadding_negotiate_get_command(channelpadding_negotiate_t *inp)
+channelpadding_negotiate_get_command(const channelpadding_negotiate_t *inp)
{
return inp->command;
}
@@ -87,7 +87,7 @@ channelpadding_negotiate_set_command(channelpadding_negotiate_t *inp, uint8_t va
return 0;
}
uint16_t
-channelpadding_negotiate_get_ito_low_ms(channelpadding_negotiate_t *inp)
+channelpadding_negotiate_get_ito_low_ms(const channelpadding_negotiate_t *inp)
{
return inp->ito_low_ms;
}
@@ -98,7 +98,7 @@ channelpadding_negotiate_set_ito_low_ms(channelpadding_negotiate_t *inp, uint16_
return 0;
}
uint16_t
-channelpadding_negotiate_get_ito_high_ms(channelpadding_negotiate_t *inp)
+channelpadding_negotiate_get_ito_high_ms(const channelpadding_negotiate_t *inp)
{
return inp->ito_high_ms;
}
diff --git a/src/trunnel/channelpadding_negotiation.h b/src/trunnel/channelpadding_negotiation.h
index e58bda3be1..fcfc232fea 100644
--- a/src/trunnel/channelpadding_negotiation.h
+++ b/src/trunnel/channelpadding_negotiation.h
@@ -1,4 +1,4 @@
-/* channelpadding_negotiation.h -- generated by by Trunnel v1.4.3.
+/* channelpadding_negotiation.h -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -60,7 +60,7 @@ int channelpadding_negotiate_clear_errors(channelpadding_negotiate_t *obj);
/** Return the value of the version field of the
* channelpadding_negotiate_t in 'inp'
*/
-uint8_t channelpadding_negotiate_get_version(channelpadding_negotiate_t *inp);
+uint8_t channelpadding_negotiate_get_version(const channelpadding_negotiate_t *inp);
/** Set the value of the version field of the
* channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
@@ -69,7 +69,7 @@ int channelpadding_negotiate_set_version(channelpadding_negotiate_t *inp, uint8_
/** Return the value of the command field of the
* channelpadding_negotiate_t in 'inp'
*/
-uint8_t channelpadding_negotiate_get_command(channelpadding_negotiate_t *inp);
+uint8_t channelpadding_negotiate_get_command(const channelpadding_negotiate_t *inp);
/** Set the value of the command field of the
* channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
@@ -78,7 +78,7 @@ int channelpadding_negotiate_set_command(channelpadding_negotiate_t *inp, uint8_
/** Return the value of the ito_low_ms field of the
* channelpadding_negotiate_t in 'inp'
*/
-uint16_t channelpadding_negotiate_get_ito_low_ms(channelpadding_negotiate_t *inp);
+uint16_t channelpadding_negotiate_get_ito_low_ms(const channelpadding_negotiate_t *inp);
/** Set the value of the ito_low_ms field of the
* channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
@@ -87,7 +87,7 @@ int channelpadding_negotiate_set_ito_low_ms(channelpadding_negotiate_t *inp, uin
/** Return the value of the ito_high_ms field of the
* channelpadding_negotiate_t in 'inp'
*/
-uint16_t channelpadding_negotiate_get_ito_high_ms(channelpadding_negotiate_t *inp);
+uint16_t channelpadding_negotiate_get_ito_high_ms(const channelpadding_negotiate_t *inp);
/** Set the value of the ito_high_ms field of the
* channelpadding_negotiate_t in 'inp' to 'val'. Return 0 on success;
* return -1 and set the error code on 'inp' on failure.
diff --git a/src/trunnel/ed25519_cert.c b/src/trunnel/ed25519_cert.c
index ee02fda646..1276c7a505 100644
--- a/src/trunnel/ed25519_cert.c
+++ b/src/trunnel/ed25519_cert.c
@@ -1,4 +1,4 @@
-/* ed25519_cert.c -- generated by Trunnel v1.5.1.
+/* ed25519_cert.c -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -13,7 +13,7 @@
} while (0)
#if defined(__COVERITY__) || defined(__clang_analyzer__)
-/* If we're runnning a static analysis tool, we don't want it to complain
+/* If we're running a static analysis tool, we don't want it to complain
* that some of our remaining-bytes checks are dead-code. */
int edcert_deadcode_dummy__ = 0;
#define OR_DEADCODE_DUMMY || edcert_deadcode_dummy__
diff --git a/src/trunnel/ed25519_cert.h b/src/trunnel/ed25519_cert.h
index 782bd59585..e086c6fced 100644
--- a/src/trunnel/ed25519_cert.h
+++ b/src/trunnel/ed25519_cert.h
@@ -1,4 +1,4 @@
-/* ed25519_cert.h -- generated by by Trunnel v1.5.1.
+/* ed25519_cert.h -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/trunnel/ed25519_cert.trunnel b/src/trunnel/ed25519_cert.trunnel
index e424ce5464..8d6483d558 100644
--- a/src/trunnel/ed25519_cert.trunnel
+++ b/src/trunnel/ed25519_cert.trunnel
@@ -28,6 +28,12 @@ const LS_IPV6 = 0x01;
const LS_LEGACY_ID = 0x02;
const LS_ED25519_ID = 0x03;
+// XXX hs_link_specifier_dup() violates the opaqueness of link_specifier_t by
+// taking its sizeof(). If we ever want to turn on TRUNNEL_OPAQUE, or
+// if we ever make link_specifier contain other types, we will
+// need to refactor that function to do the copy by encoding and decoding the
+// object.
+
// amended from tor.trunnel
struct link_specifier {
u8 ls_type;
diff --git a/src/trunnel/hs/cell_common.c b/src/trunnel/hs/cell_common.c
index b7f19ffc60..af223560c1 100644
--- a/src/trunnel/hs/cell_common.c
+++ b/src/trunnel/hs/cell_common.c
@@ -1,4 +1,4 @@
-/* cell_common.c -- generated by Trunnel v1.5.1.
+/* cell_common.c -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -13,7 +13,7 @@
} while (0)
#if defined(__COVERITY__) || defined(__clang_analyzer__)
-/* If we're runnning a static analysis tool, we don't want it to complain
+/* If we're running a static analysis tool, we don't want it to complain
* that some of our remaining-bytes checks are dead-code. */
int cellcommon_deadcode_dummy__ = 0;
#define OR_DEADCODE_DUMMY || cellcommon_deadcode_dummy__
diff --git a/src/trunnel/hs/cell_common.h b/src/trunnel/hs/cell_common.h
index 4d98a54cf4..e08eedfdb3 100644
--- a/src/trunnel/hs/cell_common.h
+++ b/src/trunnel/hs/cell_common.h
@@ -1,4 +1,4 @@
-/* cell_common.h -- generated by by Trunnel v1.5.1.
+/* cell_common.h -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/trunnel/hs/cell_establish_intro.c b/src/trunnel/hs/cell_establish_intro.c
index 22e198c369..ae3b7b1bc8 100644
--- a/src/trunnel/hs/cell_establish_intro.c
+++ b/src/trunnel/hs/cell_establish_intro.c
@@ -1,4 +1,4 @@
-/* cell_establish_intro.c -- generated by Trunnel v1.5.1.
+/* cell_establish_intro.c -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -13,7 +13,7 @@
} while (0)
#if defined(__COVERITY__) || defined(__clang_analyzer__)
-/* If we're runnning a static analysis tool, we don't want it to complain
+/* If we're running a static analysis tool, we don't want it to complain
* that some of our remaining-bytes checks are dead-code. */
int cellestablishintro_deadcode_dummy__ = 0;
#define OR_DEADCODE_DUMMY || cellestablishintro_deadcode_dummy__
diff --git a/src/trunnel/hs/cell_establish_intro.h b/src/trunnel/hs/cell_establish_intro.h
index 2f0d893659..ccaef5488c 100644
--- a/src/trunnel/hs/cell_establish_intro.h
+++ b/src/trunnel/hs/cell_establish_intro.h
@@ -1,4 +1,4 @@
-/* cell_establish_intro.h -- generated by by Trunnel v1.5.1.
+/* cell_establish_intro.h -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/trunnel/hs/cell_introduce1.c b/src/trunnel/hs/cell_introduce1.c
index 7501f6f196..358b355cda 100644
--- a/src/trunnel/hs/cell_introduce1.c
+++ b/src/trunnel/hs/cell_introduce1.c
@@ -1,4 +1,4 @@
-/* cell_introduce1.c -- generated by Trunnel v1.5.1.
+/* cell_introduce1.c -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -13,7 +13,7 @@
} while (0)
#if defined(__COVERITY__) || defined(__clang_analyzer__)
-/* If we're runnning a static analysis tool, we don't want it to complain
+/* If we're running a static analysis tool, we don't want it to complain
* that some of our remaining-bytes checks are dead-code. */
int cellintroduce_deadcode_dummy__ = 0;
#define OR_DEADCODE_DUMMY || cellintroduce_deadcode_dummy__
diff --git a/src/trunnel/hs/cell_introduce1.h b/src/trunnel/hs/cell_introduce1.h
index cca825a431..fa218adc6d 100644
--- a/src/trunnel/hs/cell_introduce1.h
+++ b/src/trunnel/hs/cell_introduce1.h
@@ -1,4 +1,4 @@
-/* cell_introduce1.h -- generated by by Trunnel v1.5.1.
+/* cell_introduce1.h -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/trunnel/hs/cell_rendezvous.c b/src/trunnel/hs/cell_rendezvous.c
new file mode 100644
index 0000000000..53cb609138
--- /dev/null
+++ b/src/trunnel/hs/cell_rendezvous.c
@@ -0,0 +1,470 @@
+/* cell_rendezvous.c -- generated by Trunnel v1.5.2.
+ * https://gitweb.torproject.org/trunnel.git
+ * You probably shouldn't edit this file.
+ */
+#include <stdlib.h>
+#include "trunnel-impl.h"
+
+#include "cell_rendezvous.h"
+
+#define TRUNNEL_SET_ERROR_CODE(obj) \
+ do { \
+ (obj)->trunnel_error_code_ = 1; \
+ } while (0)
+
+#if defined(__COVERITY__) || defined(__clang_analyzer__)
+/* If we're running a static analysis tool, we don't want it to complain
+ * that some of our remaining-bytes checks are dead-code. */
+int cellrendezvous_deadcode_dummy__ = 0;
+#define OR_DEADCODE_DUMMY || cellrendezvous_deadcode_dummy__
+#else
+#define OR_DEADCODE_DUMMY
+#endif
+
+#define CHECK_REMAINING(nbytes, label) \
+ do { \
+ if (remaining < (nbytes) OR_DEADCODE_DUMMY) { \
+ goto label; \
+ } \
+ } while (0)
+
+trn_cell_rendezvous1_t *
+trn_cell_rendezvous1_new(void)
+{
+ trn_cell_rendezvous1_t *val = trunnel_calloc(1, sizeof(trn_cell_rendezvous1_t));
+ if (NULL == val)
+ return NULL;
+ return val;
+}
+
+/** Release all storage held inside 'obj', but do not free 'obj'.
+ */
+static void
+trn_cell_rendezvous1_clear(trn_cell_rendezvous1_t *obj)
+{
+ (void) obj;
+ TRUNNEL_DYNARRAY_WIPE(&obj->handshake_info);
+ TRUNNEL_DYNARRAY_CLEAR(&obj->handshake_info);
+}
+
+void
+trn_cell_rendezvous1_free(trn_cell_rendezvous1_t *obj)
+{
+ if (obj == NULL)
+ return;
+ trn_cell_rendezvous1_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_rendezvous1_t));
+ trunnel_free_(obj);
+}
+
+size_t
+trn_cell_rendezvous1_getlen_rendezvous_cookie(const trn_cell_rendezvous1_t *inp)
+{
+ (void)inp; return TRUNNEL_REND_COOKIE_LEN;
+}
+
+uint8_t
+trn_cell_rendezvous1_get_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx)
+{
+ trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN);
+ return inp->rendezvous_cookie[idx];
+}
+
+uint8_t
+trn_cell_rendezvous1_getconst_rendezvous_cookie(const trn_cell_rendezvous1_t *inp, size_t idx)
+{
+ return trn_cell_rendezvous1_get_rendezvous_cookie((trn_cell_rendezvous1_t*)inp, idx);
+}
+int
+trn_cell_rendezvous1_set_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt)
+{
+ trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN);
+ inp->rendezvous_cookie[idx] = elt;
+ return 0;
+}
+
+uint8_t *
+trn_cell_rendezvous1_getarray_rendezvous_cookie(trn_cell_rendezvous1_t *inp)
+{
+ return inp->rendezvous_cookie;
+}
+const uint8_t *
+trn_cell_rendezvous1_getconstarray_rendezvous_cookie(const trn_cell_rendezvous1_t *inp)
+{
+ return (const uint8_t *)trn_cell_rendezvous1_getarray_rendezvous_cookie((trn_cell_rendezvous1_t*)inp);
+}
+size_t
+trn_cell_rendezvous1_getlen_handshake_info(const trn_cell_rendezvous1_t *inp)
+{
+ return TRUNNEL_DYNARRAY_LEN(&inp->handshake_info);
+}
+
+uint8_t
+trn_cell_rendezvous1_get_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx)
+{
+ return TRUNNEL_DYNARRAY_GET(&inp->handshake_info, idx);
+}
+
+uint8_t
+trn_cell_rendezvous1_getconst_handshake_info(const trn_cell_rendezvous1_t *inp, size_t idx)
+{
+ return trn_cell_rendezvous1_get_handshake_info((trn_cell_rendezvous1_t*)inp, idx);
+}
+int
+trn_cell_rendezvous1_set_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt)
+{
+ TRUNNEL_DYNARRAY_SET(&inp->handshake_info, idx, elt);
+ return 0;
+}
+int
+trn_cell_rendezvous1_add_handshake_info(trn_cell_rendezvous1_t *inp, uint8_t elt)
+{
+ TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->handshake_info, elt, {});
+ return 0;
+ trunnel_alloc_failed:
+ TRUNNEL_SET_ERROR_CODE(inp);
+ return -1;
+}
+
+uint8_t *
+trn_cell_rendezvous1_getarray_handshake_info(trn_cell_rendezvous1_t *inp)
+{
+ return inp->handshake_info.elts_;
+}
+const uint8_t *
+trn_cell_rendezvous1_getconstarray_handshake_info(const trn_cell_rendezvous1_t *inp)
+{
+ return (const uint8_t *)trn_cell_rendezvous1_getarray_handshake_info((trn_cell_rendezvous1_t*)inp);
+}
+int
+trn_cell_rendezvous1_setlen_handshake_info(trn_cell_rendezvous1_t *inp, size_t newlen)
+{
+ uint8_t *newptr;
+ newptr = trunnel_dynarray_setlen(&inp->handshake_info.allocated_,
+ &inp->handshake_info.n_, inp->handshake_info.elts_, newlen,
+ sizeof(inp->handshake_info.elts_[0]), (trunnel_free_fn_t) NULL,
+ &inp->trunnel_error_code_);
+ if (newlen != 0 && newptr == NULL)
+ goto trunnel_alloc_failed;
+ inp->handshake_info.elts_ = newptr;
+ return 0;
+ trunnel_alloc_failed:
+ TRUNNEL_SET_ERROR_CODE(inp);
+ return -1;
+}
+const char *
+trn_cell_rendezvous1_check(const trn_cell_rendezvous1_t *obj)
+{
+ if (obj == NULL)
+ return "Object was NULL";
+ if (obj->trunnel_error_code_)
+ return "A set function failed on this object";
+ return NULL;
+}
+
+ssize_t
+trn_cell_rendezvous1_encoded_len(const trn_cell_rendezvous1_t *obj)
+{
+ ssize_t result = 0;
+
+ if (NULL != trn_cell_rendezvous1_check(obj))
+ return -1;
+
+
+ /* Length of u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */
+ result += TRUNNEL_REND_COOKIE_LEN;
+
+ /* Length of u8 handshake_info[] */
+ result += TRUNNEL_DYNARRAY_LEN(&obj->handshake_info);
+ return result;
+}
+int
+trn_cell_rendezvous1_clear_errors(trn_cell_rendezvous1_t *obj)
+{
+ int r = obj->trunnel_error_code_;
+ obj->trunnel_error_code_ = 0;
+ return r;
+}
+ssize_t
+trn_cell_rendezvous1_encode(uint8_t *output, const size_t avail, const trn_cell_rendezvous1_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 = trn_cell_rendezvous1_encoded_len(obj);
+#endif
+
+ if (NULL != (msg = trn_cell_rendezvous1_check(obj)))
+ goto check_failed;
+
+#ifdef TRUNNEL_CHECK_ENCODED_LEN
+ trunnel_assert(encoded_len >= 0);
+#endif
+
+ /* Encode u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */
+ trunnel_assert(written <= avail);
+ if (avail - written < TRUNNEL_REND_COOKIE_LEN)
+ goto truncated;
+ memcpy(ptr, obj->rendezvous_cookie, TRUNNEL_REND_COOKIE_LEN);
+ written += TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN;
+
+ /* Encode u8 handshake_info[] */
+ {
+ size_t elt_len = TRUNNEL_DYNARRAY_LEN(&obj->handshake_info);
+ trunnel_assert(written <= avail);
+ if (avail - written < elt_len)
+ goto truncated;
+ if (elt_len)
+ memcpy(ptr, obj->handshake_info.elts_, elt_len);
+ written += elt_len; ptr += elt_len;
+ }
+
+
+ trunnel_assert(ptr == output + written);
+#ifdef TRUNNEL_CHECK_ENCODED_LEN
+ {
+ trunnel_assert(encoded_len >= 0);
+ trunnel_assert((size_t)encoded_len == written);
+ }
+
+#endif
+
+ return written;
+
+ truncated:
+ result = -2;
+ goto fail;
+ check_failed:
+ (void)msg;
+ result = -1;
+ goto fail;
+ fail:
+ trunnel_assert(result < 0);
+ return result;
+}
+
+/** As trn_cell_rendezvous1_parse(), but do not allocate the output
+ * object.
+ */
+static ssize_t
+trn_cell_rendezvous1_parse_into(trn_cell_rendezvous1_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 u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN] */
+ CHECK_REMAINING(TRUNNEL_REND_COOKIE_LEN, truncated);
+ memcpy(obj->rendezvous_cookie, ptr, TRUNNEL_REND_COOKIE_LEN);
+ remaining -= TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN;
+
+ /* Parse u8 handshake_info[] */
+ TRUNNEL_DYNARRAY_EXPAND(uint8_t, &obj->handshake_info, remaining, {});
+ obj->handshake_info.n_ = remaining;
+ if (remaining)
+ memcpy(obj->handshake_info.elts_, ptr, remaining);
+ ptr += remaining; remaining -= remaining;
+ trunnel_assert(ptr + remaining == input + len_in);
+ return len_in - remaining;
+
+ truncated:
+ return -2;
+ trunnel_alloc_failed:
+ return -1;
+}
+
+ssize_t
+trn_cell_rendezvous1_parse(trn_cell_rendezvous1_t **output, const uint8_t *input, const size_t len_in)
+{
+ ssize_t result;
+ *output = trn_cell_rendezvous1_new();
+ if (NULL == *output)
+ return -1;
+ result = trn_cell_rendezvous1_parse_into(*output, input, len_in);
+ if (result < 0) {
+ trn_cell_rendezvous1_free(*output);
+ *output = NULL;
+ }
+ return result;
+}
+trn_cell_rendezvous2_t *
+trn_cell_rendezvous2_new(void)
+{
+ trn_cell_rendezvous2_t *val = trunnel_calloc(1, sizeof(trn_cell_rendezvous2_t));
+ if (NULL == val)
+ return NULL;
+ return val;
+}
+
+/** Release all storage held inside 'obj', but do not free 'obj'.
+ */
+static void
+trn_cell_rendezvous2_clear(trn_cell_rendezvous2_t *obj)
+{
+ (void) obj;
+}
+
+void
+trn_cell_rendezvous2_free(trn_cell_rendezvous2_t *obj)
+{
+ if (obj == NULL)
+ return;
+ trn_cell_rendezvous2_clear(obj);
+ trunnel_memwipe(obj, sizeof(trn_cell_rendezvous2_t));
+ trunnel_free_(obj);
+}
+
+size_t
+trn_cell_rendezvous2_getlen_handshake_info(const trn_cell_rendezvous2_t *inp)
+{
+ (void)inp; return TRUNNEL_HANDSHAKE_INFO_LEN;
+}
+
+uint8_t
+trn_cell_rendezvous2_get_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx)
+{
+ trunnel_assert(idx < TRUNNEL_HANDSHAKE_INFO_LEN);
+ return inp->handshake_info[idx];
+}
+
+uint8_t
+trn_cell_rendezvous2_getconst_handshake_info(const trn_cell_rendezvous2_t *inp, size_t idx)
+{
+ return trn_cell_rendezvous2_get_handshake_info((trn_cell_rendezvous2_t*)inp, idx);
+}
+int
+trn_cell_rendezvous2_set_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx, uint8_t elt)
+{
+ trunnel_assert(idx < TRUNNEL_HANDSHAKE_INFO_LEN);
+ inp->handshake_info[idx] = elt;
+ return 0;
+}
+
+uint8_t *
+trn_cell_rendezvous2_getarray_handshake_info(trn_cell_rendezvous2_t *inp)
+{
+ return inp->handshake_info;
+}
+const uint8_t *
+trn_cell_rendezvous2_getconstarray_handshake_info(const trn_cell_rendezvous2_t *inp)
+{
+ return (const uint8_t *)trn_cell_rendezvous2_getarray_handshake_info((trn_cell_rendezvous2_t*)inp);
+}
+const char *
+trn_cell_rendezvous2_check(const trn_cell_rendezvous2_t *obj)
+{
+ if (obj == NULL)
+ return "Object was NULL";
+ if (obj->trunnel_error_code_)
+ return "A set function failed on this object";
+ return NULL;
+}
+
+ssize_t
+trn_cell_rendezvous2_encoded_len(const trn_cell_rendezvous2_t *obj)
+{
+ ssize_t result = 0;
+
+ if (NULL != trn_cell_rendezvous2_check(obj))
+ return -1;
+
+
+ /* Length of u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */
+ result += TRUNNEL_HANDSHAKE_INFO_LEN;
+ return result;
+}
+int
+trn_cell_rendezvous2_clear_errors(trn_cell_rendezvous2_t *obj)
+{
+ int r = obj->trunnel_error_code_;
+ obj->trunnel_error_code_ = 0;
+ return r;
+}
+ssize_t
+trn_cell_rendezvous2_encode(uint8_t *output, const size_t avail, const trn_cell_rendezvous2_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 = trn_cell_rendezvous2_encoded_len(obj);
+#endif
+
+ if (NULL != (msg = trn_cell_rendezvous2_check(obj)))
+ goto check_failed;
+
+#ifdef TRUNNEL_CHECK_ENCODED_LEN
+ trunnel_assert(encoded_len >= 0);
+#endif
+
+ /* Encode u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */
+ trunnel_assert(written <= avail);
+ if (avail - written < TRUNNEL_HANDSHAKE_INFO_LEN)
+ goto truncated;
+ memcpy(ptr, obj->handshake_info, TRUNNEL_HANDSHAKE_INFO_LEN);
+ written += TRUNNEL_HANDSHAKE_INFO_LEN; ptr += TRUNNEL_HANDSHAKE_INFO_LEN;
+
+
+ trunnel_assert(ptr == output + written);
+#ifdef TRUNNEL_CHECK_ENCODED_LEN
+ {
+ trunnel_assert(encoded_len >= 0);
+ trunnel_assert((size_t)encoded_len == written);
+ }
+
+#endif
+
+ return written;
+
+ truncated:
+ result = -2;
+ goto fail;
+ check_failed:
+ (void)msg;
+ result = -1;
+ goto fail;
+ fail:
+ trunnel_assert(result < 0);
+ return result;
+}
+
+/** As trn_cell_rendezvous2_parse(), but do not allocate the output
+ * object.
+ */
+static ssize_t
+trn_cell_rendezvous2_parse_into(trn_cell_rendezvous2_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 u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN] */
+ CHECK_REMAINING(TRUNNEL_HANDSHAKE_INFO_LEN, truncated);
+ memcpy(obj->handshake_info, ptr, TRUNNEL_HANDSHAKE_INFO_LEN);
+ remaining -= TRUNNEL_HANDSHAKE_INFO_LEN; ptr += TRUNNEL_HANDSHAKE_INFO_LEN;
+ trunnel_assert(ptr + remaining == input + len_in);
+ return len_in - remaining;
+
+ truncated:
+ return -2;
+}
+
+ssize_t
+trn_cell_rendezvous2_parse(trn_cell_rendezvous2_t **output, const uint8_t *input, const size_t len_in)
+{
+ ssize_t result;
+ *output = trn_cell_rendezvous2_new();
+ if (NULL == *output)
+ return -1;
+ result = trn_cell_rendezvous2_parse_into(*output, input, len_in);
+ if (result < 0) {
+ trn_cell_rendezvous2_free(*output);
+ *output = NULL;
+ }
+ return result;
+}
diff --git a/src/trunnel/hs/cell_rendezvous.h b/src/trunnel/hs/cell_rendezvous.h
new file mode 100644
index 0000000000..39e14da25b
--- /dev/null
+++ b/src/trunnel/hs/cell_rendezvous.h
@@ -0,0 +1,187 @@
+/* cell_rendezvous.h -- generated by Trunnel v1.5.2.
+ * https://gitweb.torproject.org/trunnel.git
+ * You probably shouldn't edit this file.
+ */
+#ifndef TRUNNEL_CELL_RENDEZVOUS_H
+#define TRUNNEL_CELL_RENDEZVOUS_H
+
+#include <stdint.h>
+#include "trunnel.h"
+
+#define TRUNNEL_REND_COOKIE_LEN 20
+#define TRUNNEL_HANDSHAKE_INFO_LEN 64
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_RENDEZVOUS1)
+struct trn_cell_rendezvous1_st {
+ uint8_t rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN];
+ TRUNNEL_DYNARRAY_HEAD(, uint8_t) handshake_info;
+ uint8_t trunnel_error_code_;
+};
+#endif
+typedef struct trn_cell_rendezvous1_st trn_cell_rendezvous1_t;
+#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_RENDEZVOUS2)
+struct trn_cell_rendezvous2_st {
+ uint8_t handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN];
+ uint8_t trunnel_error_code_;
+};
+#endif
+typedef struct trn_cell_rendezvous2_st trn_cell_rendezvous2_t;
+/** Return a newly allocated trn_cell_rendezvous1 with all elements
+ * set to zero.
+ */
+trn_cell_rendezvous1_t *trn_cell_rendezvous1_new(void);
+/** Release all storage held by the trn_cell_rendezvous1 in 'victim'.
+ * (Do nothing if 'victim' is NULL.)
+ */
+void trn_cell_rendezvous1_free(trn_cell_rendezvous1_t *victim);
+/** Try to parse a trn_cell_rendezvous1 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_rendezvous1_t. On failure, return -2 if the
+ * input appears truncated, and -1 if the input is otherwise invalid.
+ */
+ssize_t trn_cell_rendezvous1_parse(trn_cell_rendezvous1_t **output, const uint8_t *input, const size_t len_in);
+/** Return the number of bytes we expect to need to encode the
+ * trn_cell_rendezvous1 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 trn_cell_rendezvous1_encoded_len(const trn_cell_rendezvous1_t *obj);
+/** Try to encode the trn_cell_rendezvous1 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 trn_cell_rendezvous1_encode(uint8_t *output, size_t avail, const trn_cell_rendezvous1_t *input);
+/** Check whether the internal state of the trn_cell_rendezvous1 in
+ * 'obj' is consistent. Return NULL if it is, and a short message if
+ * it is not.
+ */
+const char *trn_cell_rendezvous1_check(const trn_cell_rendezvous1_t *obj);
+/** Clear any errors that were set on the object 'obj' by its setter
+ * functions. Return true iff errors were cleared.
+ */
+int trn_cell_rendezvous1_clear_errors(trn_cell_rendezvous1_t *obj);
+/** Return the (constant) length of the array holding the
+ * rendezvous_cookie field of the trn_cell_rendezvous1_t in 'inp'.
+ */
+size_t trn_cell_rendezvous1_getlen_rendezvous_cookie(const trn_cell_rendezvous1_t *inp);
+/** Return the element at position 'idx' of the fixed array field
+ * rendezvous_cookie of the trn_cell_rendezvous1_t in 'inp'.
+ */
+uint8_t trn_cell_rendezvous1_get_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx);
+/** As trn_cell_rendezvous1_get_rendezvous_cookie, but take and return
+ * a const pointer
+ */
+uint8_t trn_cell_rendezvous1_getconst_rendezvous_cookie(const trn_cell_rendezvous1_t *inp, size_t idx);
+/** Change the element at position 'idx' of the fixed array field
+ * rendezvous_cookie of the trn_cell_rendezvous1_t in 'inp', so that
+ * it will hold the value 'elt'.
+ */
+int trn_cell_rendezvous1_set_rendezvous_cookie(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt);
+/** Return a pointer to the TRUNNEL_REND_COOKIE_LEN-element array
+ * field rendezvous_cookie of 'inp'.
+ */
+uint8_t * trn_cell_rendezvous1_getarray_rendezvous_cookie(trn_cell_rendezvous1_t *inp);
+/** As trn_cell_rendezvous1_get_rendezvous_cookie, but take and return
+ * a const pointer
+ */
+const uint8_t * trn_cell_rendezvous1_getconstarray_rendezvous_cookie(const trn_cell_rendezvous1_t *inp);
+/** Return the length of the dynamic array holding the handshake_info
+ * field of the trn_cell_rendezvous1_t in 'inp'.
+ */
+size_t trn_cell_rendezvous1_getlen_handshake_info(const trn_cell_rendezvous1_t *inp);
+/** Return the element at position 'idx' of the dynamic array field
+ * handshake_info of the trn_cell_rendezvous1_t in 'inp'.
+ */
+uint8_t trn_cell_rendezvous1_get_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx);
+/** As trn_cell_rendezvous1_get_handshake_info, but take and return a
+ * const pointer
+ */
+uint8_t trn_cell_rendezvous1_getconst_handshake_info(const trn_cell_rendezvous1_t *inp, size_t idx);
+/** Change the element at position 'idx' of the dynamic array field
+ * handshake_info of the trn_cell_rendezvous1_t in 'inp', so that it
+ * will hold the value 'elt'.
+ */
+int trn_cell_rendezvous1_set_handshake_info(trn_cell_rendezvous1_t *inp, size_t idx, uint8_t elt);
+/** Append a new element 'elt' to the dynamic array field
+ * handshake_info of the trn_cell_rendezvous1_t in 'inp'.
+ */
+int trn_cell_rendezvous1_add_handshake_info(trn_cell_rendezvous1_t *inp, uint8_t elt);
+/** Return a pointer to the variable-length array field handshake_info
+ * of 'inp'.
+ */
+uint8_t * trn_cell_rendezvous1_getarray_handshake_info(trn_cell_rendezvous1_t *inp);
+/** As trn_cell_rendezvous1_get_handshake_info, but take and return a
+ * const pointer
+ */
+const uint8_t * trn_cell_rendezvous1_getconstarray_handshake_info(const trn_cell_rendezvous1_t *inp);
+/** Change the length of the variable-length array field
+ * handshake_info 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 trn_cell_rendezvous1_setlen_handshake_info(trn_cell_rendezvous1_t *inp, size_t newlen);
+/** Return a newly allocated trn_cell_rendezvous2 with all elements
+ * set to zero.
+ */
+trn_cell_rendezvous2_t *trn_cell_rendezvous2_new(void);
+/** Release all storage held by the trn_cell_rendezvous2 in 'victim'.
+ * (Do nothing if 'victim' is NULL.)
+ */
+void trn_cell_rendezvous2_free(trn_cell_rendezvous2_t *victim);
+/** Try to parse a trn_cell_rendezvous2 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_rendezvous2_t. On failure, return -2 if the
+ * input appears truncated, and -1 if the input is otherwise invalid.
+ */
+ssize_t trn_cell_rendezvous2_parse(trn_cell_rendezvous2_t **output, const uint8_t *input, const size_t len_in);
+/** Return the number of bytes we expect to need to encode the
+ * trn_cell_rendezvous2 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 trn_cell_rendezvous2_encoded_len(const trn_cell_rendezvous2_t *obj);
+/** Try to encode the trn_cell_rendezvous2 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 trn_cell_rendezvous2_encode(uint8_t *output, size_t avail, const trn_cell_rendezvous2_t *input);
+/** Check whether the internal state of the trn_cell_rendezvous2 in
+ * 'obj' is consistent. Return NULL if it is, and a short message if
+ * it is not.
+ */
+const char *trn_cell_rendezvous2_check(const trn_cell_rendezvous2_t *obj);
+/** Clear any errors that were set on the object 'obj' by its setter
+ * functions. Return true iff errors were cleared.
+ */
+int trn_cell_rendezvous2_clear_errors(trn_cell_rendezvous2_t *obj);
+/** Return the (constant) length of the array holding the
+ * handshake_info field of the trn_cell_rendezvous2_t in 'inp'.
+ */
+size_t trn_cell_rendezvous2_getlen_handshake_info(const trn_cell_rendezvous2_t *inp);
+/** Return the element at position 'idx' of the fixed array field
+ * handshake_info of the trn_cell_rendezvous2_t in 'inp'.
+ */
+uint8_t trn_cell_rendezvous2_get_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx);
+/** As trn_cell_rendezvous2_get_handshake_info, but take and return a
+ * const pointer
+ */
+uint8_t trn_cell_rendezvous2_getconst_handshake_info(const trn_cell_rendezvous2_t *inp, size_t idx);
+/** Change the element at position 'idx' of the fixed array field
+ * handshake_info of the trn_cell_rendezvous2_t in 'inp', so that it
+ * will hold the value 'elt'.
+ */
+int trn_cell_rendezvous2_set_handshake_info(trn_cell_rendezvous2_t *inp, size_t idx, uint8_t elt);
+/** Return a pointer to the TRUNNEL_HANDSHAKE_INFO_LEN-element array
+ * field handshake_info of 'inp'.
+ */
+uint8_t * trn_cell_rendezvous2_getarray_handshake_info(trn_cell_rendezvous2_t *inp);
+/** As trn_cell_rendezvous2_get_handshake_info, but take and return a
+ * const pointer
+ */
+const uint8_t * trn_cell_rendezvous2_getconstarray_handshake_info(const trn_cell_rendezvous2_t *inp);
+
+
+#endif
diff --git a/src/trunnel/hs/cell_rendezvous.trunnel b/src/trunnel/hs/cell_rendezvous.trunnel
new file mode 100644
index 0000000000..2128b4d126
--- /dev/null
+++ b/src/trunnel/hs/cell_rendezvous.trunnel
@@ -0,0 +1,29 @@
+/*
+ * This contains the definition of the RENDEZVOUS1/2 cell for onion service
+ * version 3 and onward. The following format is specified in proposal 224
+ * section 4.2.
+ */
+
+/* Rendezvous cookie length. */
+const TRUNNEL_REND_COOKIE_LEN = 20;
+/* The HANDSHAKE_INFO field layout is as follow:
+ * SERVER_PK [PK_PUBKEY_LEN bytes]
+ * AUTH [MAC_LEN bytes]
+ * This means, the size is 32 bytes + 32 bytes. */
+const TRUNNEL_HANDSHAKE_INFO_LEN = 64;
+
+/* RENDEZVOUS1 payload. See details in section 4.2. */
+struct trn_cell_rendezvous1 {
+ /* The RENDEZVOUS_COOKIE field. */
+ u8 rendezvous_cookie[TRUNNEL_REND_COOKIE_LEN];
+
+ /* The HANDSHAKE_INFO field which has a variable length depending on the
+ * handshake type used. */
+ u8 handshake_info[];
+};
+
+/* RENDEZVOUS2 payload. See details in section 4.2. */
+struct trn_cell_rendezvous2 {
+ /* The HANDSHAKE_INFO field. */
+ u8 handshake_info[TRUNNEL_HANDSHAKE_INFO_LEN];
+};
diff --git a/src/trunnel/include.am b/src/trunnel/include.am
index de6cf4781f..ca79ff3a39 100644
--- a/src/trunnel/include.am
+++ b/src/trunnel/include.am
@@ -22,6 +22,7 @@ TRUNNELSOURCES = \
src/trunnel/hs/cell_common.c \
src/trunnel/hs/cell_establish_intro.c \
src/trunnel/hs/cell_introduce1.c \
+ src/trunnel/hs/cell_rendezvous.c \
src/trunnel/channelpadding_negotiation.c
TRUNNELHEADERS = \
@@ -34,6 +35,7 @@ TRUNNELHEADERS = \
src/trunnel/hs/cell_common.h \
src/trunnel/hs/cell_establish_intro.h \
src/trunnel/hs/cell_introduce1.h \
+ src/trunnel/hs/cell_rendezvous.h \
src/trunnel/channelpadding_negotiation.h
src_trunnel_libor_trunnel_a_SOURCES = $(TRUNNELSOURCES)
diff --git a/src/trunnel/link_handshake.c b/src/trunnel/link_handshake.c
index 887f710d9c..03ead31c62 100644
--- a/src/trunnel/link_handshake.c
+++ b/src/trunnel/link_handshake.c
@@ -1,4 +1,4 @@
-/* link_handshake.c -- generated by Trunnel v1.5.1.
+/* link_handshake.c -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -13,7 +13,7 @@
} while (0)
#if defined(__COVERITY__) || defined(__clang_analyzer__)
-/* If we're runnning a static analysis tool, we don't want it to complain
+/* If we're running a static analysis tool, we don't want it to complain
* that some of our remaining-bytes checks are dead-code. */
int linkhandshake_deadcode_dummy__ = 0;
#define OR_DEADCODE_DUMMY || linkhandshake_deadcode_dummy__
diff --git a/src/trunnel/link_handshake.h b/src/trunnel/link_handshake.h
index 418662631a..6a23483adc 100644
--- a/src/trunnel/link_handshake.h
+++ b/src/trunnel/link_handshake.h
@@ -1,4 +1,4 @@
-/* link_handshake.h -- generated by by Trunnel v1.5.1.
+/* link_handshake.h -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/trunnel/pwbox.c b/src/trunnel/pwbox.c
index f4b910bdab..c356515d36 100644
--- a/src/trunnel/pwbox.c
+++ b/src/trunnel/pwbox.c
@@ -1,4 +1,4 @@
-/* pwbox.c -- generated by Trunnel v1.5.1.
+/* pwbox.c -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
@@ -13,7 +13,7 @@
} while (0)
#if defined(__COVERITY__) || defined(__clang_analyzer__)
-/* If we're runnning a static analysis tool, we don't want it to complain
+/* If we're running a static analysis tool, we don't want it to complain
* that some of our remaining-bytes checks are dead-code. */
int pwbox_deadcode_dummy__ = 0;
#define OR_DEADCODE_DUMMY || pwbox_deadcode_dummy__
diff --git a/src/trunnel/pwbox.h b/src/trunnel/pwbox.h
index 939b3c41a7..a9a421408a 100644
--- a/src/trunnel/pwbox.h
+++ b/src/trunnel/pwbox.h
@@ -1,4 +1,4 @@
-/* pwbox.h -- generated by by Trunnel v1.5.1.
+/* pwbox.h -- generated by Trunnel v1.5.2.
* https://gitweb.torproject.org/trunnel.git
* You probably shouldn't edit this file.
*/
diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h
index 7253ddbbb8..9b16c64752 100644
--- a/src/win32/orconfig.h
+++ b/src/win32/orconfig.h
@@ -218,7 +218,7 @@
#define USING_TWOS_COMPLEMENT
/* Version number of package */
-#define VERSION "0.3.1.5-alpha"
+#define VERSION "0.3.2.0-alpha-dev"