librats 1.0.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -331
- package/binding.gyp +16 -3
- package/lib/index.d.ts +288 -696
- package/lib/index.js +407 -44
- package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
- package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
- package/native-src/CMakeLists.txt +404 -179
- package/native-src/LICENSE +1 -1
- package/native-src/src/librats/bindings/rats.cpp +762 -0
- package/native-src/src/librats/bindings/rats.h +380 -0
- package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
- package/native-src/src/librats/bittorrent/bencode.h +176 -0
- package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
- package/native-src/src/librats/bittorrent/bitfield.h +76 -0
- package/native-src/src/librats/bittorrent/byte_io.h +58 -0
- package/native-src/src/librats/bittorrent/choker.cpp +25 -0
- package/native-src/src/librats/bittorrent/choker.h +46 -0
- package/native-src/src/librats/bittorrent/client.cpp +413 -0
- package/native-src/src/librats/bittorrent/client.h +227 -0
- package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
- package/native-src/src/librats/bittorrent/disk_io.h +150 -0
- package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
- package/native-src/src/librats/bittorrent/extensions.h +94 -0
- package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
- package/native-src/src/librats/bittorrent/file_storage.h +79 -0
- package/native-src/src/librats/bittorrent/log.h +42 -0
- package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
- package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
- package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
- package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
- package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
- package/native-src/src/librats/bittorrent/peer_list.h +75 -0
- package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
- package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
- package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
- package/native-src/src/librats/bittorrent/reactor.h +89 -0
- package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
- package/native-src/src/librats/bittorrent/resume_data.h +41 -0
- package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
- package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
- package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
- package/native-src/src/librats/bittorrent/torrent.h +260 -0
- package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
- package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
- package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
- package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
- package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
- package/native-src/src/librats/bittorrent/tracker.h +108 -0
- package/native-src/src/librats/bittorrent/types.cpp +206 -0
- package/native-src/src/librats/bittorrent/types.h +86 -0
- package/native-src/src/librats/core/address.cpp +35 -0
- package/native-src/src/librats/core/address.h +78 -0
- package/native-src/src/librats/core/bytes.h +69 -0
- package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
- package/native-src/src/librats/core/chained_send_buffer.h +183 -0
- package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
- package/native-src/src/librats/core/endpoint_parse.h +31 -0
- package/native-src/src/librats/core/event_bus.h +70 -0
- package/native-src/src/librats/core/host_endpoint.h +56 -0
- package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
- package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
- package/native-src/src/librats/core/ip_address.cpp +120 -0
- package/native-src/src/librats/core/ip_address.h +109 -0
- package/native-src/src/librats/core/mpsc_queue.h +47 -0
- package/native-src/src/librats/core/notifier.h +74 -0
- package/native-src/src/librats/core/receive_buffer.cpp +219 -0
- package/native-src/src/librats/core/receive_buffer.h +171 -0
- package/native-src/src/librats/core/service_registry.h +58 -0
- package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
- package/native-src/src/librats/core/socket.h +496 -0
- package/native-src/src/librats/core/timer_queue.h +105 -0
- package/native-src/src/librats/core/types.cpp +43 -0
- package/native-src/src/librats/core/types.h +103 -0
- package/native-src/src/librats/core/wakeup_pipe.h +83 -0
- package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
- package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
- package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
- package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
- package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
- package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
- package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
- package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
- package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
- package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
- package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
- package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
- package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
- package/native-src/src/librats/crypto/hkdf.c +266 -0
- package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
- package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
- package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
- package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
- package/native-src/src/librats/crypto/poly1305.h +37 -0
- package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
- package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
- package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
- package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
- package/native-src/src/librats/dht/announce.cpp +37 -0
- package/native-src/src/librats/dht/announce.h +41 -0
- package/native-src/src/librats/dht/bep42.cpp +109 -0
- package/native-src/src/librats/dht/bep42.h +48 -0
- package/native-src/src/librats/dht/dht.cpp +501 -0
- package/native-src/src/librats/dht/dht.h +119 -0
- package/native-src/src/librats/dht/dht_runner.cpp +103 -0
- package/native-src/src/librats/dht/dht_runner.h +71 -0
- package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
- package/native-src/src/librats/dht/dos_blocker.h +47 -0
- package/native-src/src/librats/dht/find_peers.cpp +52 -0
- package/native-src/src/librats/dht/find_peers.h +73 -0
- package/native-src/src/librats/dht/id.h +167 -0
- package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
- package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
- package/native-src/src/librats/dht/log.h +38 -0
- package/native-src/src/librats/dht/node.cpp +473 -0
- package/native-src/src/librats/dht/node.h +164 -0
- package/native-src/src/librats/dht/node_entry.h +81 -0
- package/native-src/src/librats/dht/observer.h +72 -0
- package/native-src/src/librats/dht/persistence.cpp +90 -0
- package/native-src/src/librats/dht/persistence.h +32 -0
- package/native-src/src/librats/dht/routing_table.cpp +559 -0
- package/native-src/src/librats/dht/routing_table.h +185 -0
- package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
- package/native-src/src/librats/dht/rpc_manager.h +77 -0
- package/native-src/src/librats/dht/storage.cpp +92 -0
- package/native-src/src/librats/dht/storage.h +74 -0
- package/native-src/src/librats/dht/transport.h +27 -0
- package/native-src/src/librats/dht/traversal.cpp +326 -0
- package/native-src/src/librats/dht/traversal.h +120 -0
- package/native-src/src/librats/dht/udp_transport.cpp +49 -0
- package/native-src/src/librats/dht/udp_transport.h +51 -0
- package/native-src/src/librats/mdns/log.h +22 -0
- package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
- package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
- package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
- package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
- package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
- package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
- package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
- package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
- package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
- package/native-src/src/librats/node/circuit_service.h +84 -0
- package/native-src/src/librats/node/config.h +110 -0
- package/native-src/src/librats/node/dial_service.h +54 -0
- package/native-src/src/librats/node/dialer.cpp +264 -0
- package/native-src/src/librats/node/dialer.h +188 -0
- package/native-src/src/librats/node/host_events.h +26 -0
- package/native-src/src/librats/node/identify.cpp +130 -0
- package/native-src/src/librats/node/identify.h +71 -0
- package/native-src/src/librats/node/nat_status.cpp +103 -0
- package/native-src/src/librats/node/nat_status.h +118 -0
- package/native-src/src/librats/node/node.cpp +865 -0
- package/native-src/src/librats/node/node.h +344 -0
- package/native-src/src/librats/node/node_context.h +33 -0
- package/native-src/src/librats/node/peer_network.h +91 -0
- package/native-src/src/librats/peer/peer.h +49 -0
- package/native-src/src/librats/peer/peer_book.cpp +181 -0
- package/native-src/src/librats/peer/peer_book.h +88 -0
- package/native-src/src/librats/peer/peer_id.cpp +72 -0
- package/native-src/src/librats/peer/peer_id.h +62 -0
- package/native-src/src/librats/peer/peer_info.h +37 -0
- package/native-src/src/librats/peer/peer_table.cpp +170 -0
- package/native-src/src/librats/peer/peer_table.h +148 -0
- package/native-src/src/librats/security/handshaker.h +66 -0
- package/native-src/src/librats/security/identity.h +43 -0
- package/native-src/src/librats/security/noise_security.cpp +122 -0
- package/native-src/src/librats/security/noise_security.h +37 -0
- package/native-src/src/librats/security/plaintext_security.h +106 -0
- package/native-src/src/librats/security/session.h +37 -0
- package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
- package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
- package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
- package/native-src/src/librats/subsystems/bittorrent.h +136 -0
- package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
- package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
- package/native-src/src/librats/subsystems/dht_service.h +36 -0
- package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
- package/native-src/src/librats/subsystems/file_transfer.h +367 -0
- package/native-src/src/librats/subsystems/hole_punch.cpp +605 -0
- package/native-src/src/librats/subsystems/hole_punch.h +290 -0
- package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
- package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
- package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
- package/native-src/src/librats/subsystems/message_json.cpp +112 -0
- package/native-src/src/librats/subsystems/message_json.h +88 -0
- package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
- package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
- package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
- package/native-src/src/librats/subsystems/ping_service.h +66 -0
- package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
- package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
- package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
- package/native-src/src/librats/subsystems/pubsub.h +175 -0
- package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
- package/native-src/src/librats/subsystems/reconnection.h +126 -0
- package/native-src/src/librats/subsystems/relay.cpp +1142 -0
- package/native-src/src/librats/subsystems/relay.h +211 -0
- package/native-src/src/librats/subsystems/relay_service.h +46 -0
- package/native-src/src/librats/transport/connection.cpp +343 -0
- package/native-src/src/librats/transport/connection.h +283 -0
- package/native-src/src/librats/transport/link.h +96 -0
- package/native-src/src/librats/transport/reactor.cpp +588 -0
- package/native-src/src/librats/transport/reactor.h +262 -0
- package/native-src/src/librats/transport/reactor_pool.h +81 -0
- package/native-src/src/librats/transport/relay_link.cpp +208 -0
- package/native-src/src/librats/transport/relay_link.h +303 -0
- package/native-src/src/librats/transport/tcp_link.cpp +49 -0
- package/native-src/src/librats/transport/tcp_link.h +43 -0
- package/native-src/src/librats/transport/udp_mux.cpp +617 -0
- package/native-src/src/librats/transport/udp_mux.h +363 -0
- package/native-src/src/librats/transport/udp_packet.cpp +121 -0
- package/native-src/src/librats/transport/udp_packet.h +190 -0
- package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
- package/native-src/src/librats/transport/udp_stream.h +614 -0
- package/native-src/src/librats/util/features.h.in +51 -0
- package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
- package/native-src/src/librats/util/fs.h +136 -0
- package/native-src/src/librats/util/json.cpp +1002 -0
- package/native-src/src/librats/util/json.h +444 -0
- package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
- package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
- package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
- package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
- package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
- package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
- package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
- package/native-src/src/librats/util/rats_export.h +69 -0
- package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
- package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
- package/native-src/src/librats/wire/frame.cpp +76 -0
- package/native-src/src/librats/wire/frame.h +111 -0
- package/native-src/src/librats/wire/message_router.cpp +45 -0
- package/native-src/src/librats/wire/message_router.h +47 -0
- package/package.json +5 -4
- package/scripts/build-librats.js +1 -0
- package/scripts/postinstall.js +3 -3
- package/scripts/prepare-package.js +4 -4
- package/scripts/verify-installation.js +63 -105
- package/src/librats_node.cpp +1067 -1323
- package/native-src/src/bencode.cpp +0 -485
- package/native-src/src/bencode.h +0 -145
- package/native-src/src/bittorrent.cpp +0 -14
- package/native-src/src/bittorrent.h +0 -74
- package/native-src/src/bt_bitfield.cpp +0 -372
- package/native-src/src/bt_bitfield.h +0 -316
- package/native-src/src/bt_choker.cpp +0 -228
- package/native-src/src/bt_choker.h +0 -147
- package/native-src/src/bt_client.cpp +0 -1047
- package/native-src/src/bt_client.h +0 -445
- package/native-src/src/bt_create_torrent.cpp +0 -677
- package/native-src/src/bt_create_torrent.h +0 -473
- package/native-src/src/bt_extension.cpp +0 -469
- package/native-src/src/bt_extension.h +0 -309
- package/native-src/src/bt_file_storage.cpp +0 -261
- package/native-src/src/bt_file_storage.h +0 -298
- package/native-src/src/bt_handshake.cpp +0 -134
- package/native-src/src/bt_handshake.h +0 -157
- package/native-src/src/bt_messages.cpp +0 -364
- package/native-src/src/bt_messages.h +0 -324
- package/native-src/src/bt_network.cpp +0 -1007
- package/native-src/src/bt_network.h +0 -417
- package/native-src/src/bt_peer_connection.cpp +0 -742
- package/native-src/src/bt_peer_connection.h +0 -592
- package/native-src/src/bt_piece_picker.cpp +0 -786
- package/native-src/src/bt_piece_picker.h +0 -473
- package/native-src/src/bt_resume_data.cpp +0 -410
- package/native-src/src/bt_resume_data.h +0 -249
- package/native-src/src/bt_torrent.cpp +0 -2120
- package/native-src/src/bt_torrent.h +0 -641
- package/native-src/src/bt_torrent_info.cpp +0 -659
- package/native-src/src/bt_torrent_info.h +0 -418
- package/native-src/src/bt_types.h +0 -621
- package/native-src/src/chained_send_buffer.cpp +0 -75
- package/native-src/src/chained_send_buffer.h +0 -137
- package/native-src/src/crypto/hkdf.c +0 -266
- package/native-src/src/crypto/poly1305.h +0 -36
- package/native-src/src/dht.cpp +0 -3311
- package/native-src/src/dht.h +0 -717
- package/native-src/src/disk_io.cpp +0 -632
- package/native-src/src/disk_io.h +0 -315
- package/native-src/src/file_transfer.cpp +0 -1415
- package/native-src/src/file_transfer.h +0 -286
- package/native-src/src/fs.h +0 -108
- package/native-src/src/gossipsub.cpp +0 -1139
- package/native-src/src/gossipsub.h +0 -403
- package/native-src/src/ice.cpp +0 -893
- package/native-src/src/ice.h +0 -559
- package/native-src/src/json.hpp +0 -25526
- package/native-src/src/librats.cpp +0 -2378
- package/native-src/src/librats.h +0 -2324
- package/native-src/src/librats_bittorrent.cpp +0 -601
- package/native-src/src/librats_c.cpp +0 -1557
- package/native-src/src/librats_c.h +0 -323
- package/native-src/src/librats_discovery.cpp +0 -402
- package/native-src/src/librats_encryption.cpp +0 -275
- package/native-src/src/librats_file_transfer.cpp +0 -144
- package/native-src/src/librats_gossipsub.cpp +0 -289
- package/native-src/src/librats_ice.cpp +0 -213
- package/native-src/src/librats_log_macros.h +0 -36
- package/native-src/src/librats_logging.cpp +0 -173
- package/native-src/src/librats_mdns.cpp +0 -166
- package/native-src/src/librats_persistence.cpp +0 -796
- package/native-src/src/librats_portmap.cpp +0 -419
- package/native-src/src/librats_reconnection.cpp +0 -218
- package/native-src/src/librats_statistic.cpp +0 -105
- package/native-src/src/librats_storage.cpp +0 -189
- package/native-src/src/rats_export.h +0 -17
- package/native-src/src/receive_buffer.cpp +0 -82
- package/native-src/src/receive_buffer.h +0 -127
- package/native-src/src/socket.h +0 -228
- package/native-src/src/threadmanager.cpp +0 -105
- package/native-src/src/threadmanager.h +0 -53
- package/native-src/src/tracker.cpp +0 -1264
- package/native-src/src/tracker.h +0 -319
- package/native-src/src/turn.cpp +0 -762
- package/native-src/src/turn.h +0 -460
- package/native-src/src/wakeup_pipe.h +0 -60
- /package/native-src/src/{os.h → librats/util/os.h} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: MIT */
|
|
1
2
|
/*
|
|
2
3
|
* Copyright (C) 2016 Southern Storm Software, Pty Ltd.
|
|
3
4
|
*
|
|
@@ -30,8 +31,8 @@
|
|
|
30
31
|
extern "C" {
|
|
31
32
|
#endif
|
|
32
33
|
|
|
33
|
-
#define
|
|
34
|
-
#define
|
|
34
|
+
#define RATS_SHA512_HASH_SIZE 64
|
|
35
|
+
#define RATS_SHA512_BLOCK_SIZE 128
|
|
35
36
|
|
|
36
37
|
typedef struct
|
|
37
38
|
{
|
|
@@ -40,12 +41,12 @@ typedef struct
|
|
|
40
41
|
uint64_t length; /* Restricted to 2^56 bytes of input */
|
|
41
42
|
uint8_t posn;
|
|
42
43
|
|
|
43
|
-
}
|
|
44
|
+
} rats_sha512_context_t;
|
|
44
45
|
|
|
45
|
-
void
|
|
46
|
-
void
|
|
47
|
-
void
|
|
48
|
-
void
|
|
46
|
+
void rats_sha512_reset(rats_sha512_context_t *context);
|
|
47
|
+
void rats_sha512_update(rats_sha512_context_t *context, const void *data, size_t size);
|
|
48
|
+
void rats_sha512_finish(rats_sha512_context_t *context, uint8_t *hash);
|
|
49
|
+
void rats_sha512_hash(uint8_t *hash, const void *data, size_t size);
|
|
49
50
|
|
|
50
51
|
#ifdef __cplusplus
|
|
51
52
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#include "librats/dht/announce.h"
|
|
2
|
+
#include "librats/dht/krpc.h"
|
|
3
|
+
|
|
4
|
+
#include <utility>
|
|
5
|
+
|
|
6
|
+
namespace librats {
|
|
7
|
+
namespace dht {
|
|
8
|
+
|
|
9
|
+
Announce::Announce(RoutingTable& table, RpcManager& rpc, const NodeId& self,
|
|
10
|
+
const InfoHash& info_hash, uint16_t port, bool implied_port,
|
|
11
|
+
PeersCallback on_peers, DoneCallback on_done)
|
|
12
|
+
: FindPeers(table, rpc, self, info_hash, std::move(on_peers), std::move(on_done)),
|
|
13
|
+
port_(port),
|
|
14
|
+
implied_port_(implied_port) {}
|
|
15
|
+
|
|
16
|
+
void Announce::on_complete() {
|
|
17
|
+
// Announce to the closest nodes that replied AND gave us a token. results_ is
|
|
18
|
+
// sorted by distance, so walking it front-to-back yields the closest first.
|
|
19
|
+
int announced = 0;
|
|
20
|
+
for (const auto& obs : results_) {
|
|
21
|
+
if (announced >= static_cast<int>(kBucketSize)) break;
|
|
22
|
+
if (!obs->has(Observer::kAlive)) continue;
|
|
23
|
+
|
|
24
|
+
const auto token = tokens_.find(obs->id());
|
|
25
|
+
if (token == tokens_.end()) continue; // no token → we may not announce here
|
|
26
|
+
|
|
27
|
+
KrpcMessage msg = KrpcProtocol::create_announce_peer_query(
|
|
28
|
+
/*txn set by rpc*/ "", self_, target(), port_, token->second, implied_port_);
|
|
29
|
+
rpc_.send_oneshot(msg, obs->endpoint()); // the ack carries nothing we need
|
|
30
|
+
++announced;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
FindPeers::on_complete(); // still deliver whatever peers we discovered
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
} // namespace dht
|
|
37
|
+
} // namespace librats
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file announce.h
|
|
5
|
+
* @brief announce_peer lookup: tell the k closest nodes we're a peer (BEP 5).
|
|
6
|
+
*
|
|
7
|
+
* Runs exactly like a FindPeers lookup (it must, to collect write tokens), then on
|
|
8
|
+
* completion sends announce_peer — with each node's token — to the closest nodes
|
|
9
|
+
* that answered. Any peers it discovered along the way are still delivered through
|
|
10
|
+
* the FindPeers callbacks.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
#include "librats/dht/find_peers.h"
|
|
14
|
+
#include "librats/dht/id.h"
|
|
15
|
+
|
|
16
|
+
#include <cstdint>
|
|
17
|
+
|
|
18
|
+
namespace librats {
|
|
19
|
+
namespace dht {
|
|
20
|
+
|
|
21
|
+
class Announce : public FindPeers {
|
|
22
|
+
public:
|
|
23
|
+
// `port` is the TCP port we're announcing; with implied_port the receiver uses
|
|
24
|
+
// our UDP source port instead (better behind NAT).
|
|
25
|
+
Announce(RoutingTable& table, RpcManager& rpc, const NodeId& self, const InfoHash& info_hash,
|
|
26
|
+
uint16_t port, bool implied_port,
|
|
27
|
+
PeersCallback on_peers = {}, DoneCallback on_done = {});
|
|
28
|
+
|
|
29
|
+
bool is_announce() const noexcept override { return true; }
|
|
30
|
+
|
|
31
|
+
protected:
|
|
32
|
+
void on_complete() override;
|
|
33
|
+
const char* name() const override { return "announce"; }
|
|
34
|
+
|
|
35
|
+
private:
|
|
36
|
+
uint16_t port_;
|
|
37
|
+
bool implied_port_;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
} // namespace dht
|
|
41
|
+
} // namespace librats
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#include "librats/dht/bep42.h"
|
|
2
|
+
#include "librats/util/network_utils.h"
|
|
3
|
+
|
|
4
|
+
#include <algorithm>
|
|
5
|
+
#include <cstddef>
|
|
6
|
+
#include <cstdint>
|
|
7
|
+
|
|
8
|
+
namespace librats {
|
|
9
|
+
namespace dht {
|
|
10
|
+
|
|
11
|
+
namespace {
|
|
12
|
+
|
|
13
|
+
// CRC-32C (Castagnoli), the polynomial mandated by BEP 42: reflected, init
|
|
14
|
+
// 0xFFFFFFFF, final XOR 0xFFFFFFFF, bytes processed in array order. These exact
|
|
15
|
+
// parameters reproduce the BEP 42 reference test vectors.
|
|
16
|
+
uint32_t crc32c(const uint8_t* data, std::size_t len) {
|
|
17
|
+
uint32_t crc = 0xFFFFFFFFu;
|
|
18
|
+
for (std::size_t i = 0; i < len; ++i) {
|
|
19
|
+
crc ^= data[i];
|
|
20
|
+
for (int k = 0; k < 8; ++k)
|
|
21
|
+
crc = (crc & 1u) ? (crc >> 1) ^ 0x82F63B78u : (crc >> 1);
|
|
22
|
+
}
|
|
23
|
+
return crc ^ 0xFFFFFFFFu;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Mask the leading octets of `ip` per BEP 42 (4 for IPv4, 8 for IPv6). Returns the
|
|
27
|
+
// number of octets written to `out`, or 0 for the unspecified address. The address
|
|
28
|
+
// bytes are already in network order, so no byte-swapping is needed.
|
|
29
|
+
int masked_octets(const IpAddress& ip, uint8_t out[8]) {
|
|
30
|
+
static const uint8_t v4_mask[4] = {0x03, 0x0f, 0x3f, 0xff};
|
|
31
|
+
static const uint8_t v6_mask[8] = {0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
|
|
32
|
+
|
|
33
|
+
const uint8_t* b = ip.bytes().data();
|
|
34
|
+
if (ip.is_v6()) {
|
|
35
|
+
for (int i = 0; i < 8; ++i) out[i] = b[i] & v6_mask[i];
|
|
36
|
+
return 8;
|
|
37
|
+
}
|
|
38
|
+
if (ip.is_v4()) {
|
|
39
|
+
for (int i = 0; i < 4; ++i) out[i] = b[i] & v4_mask[i];
|
|
40
|
+
return 4;
|
|
41
|
+
}
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Compute the 3 deterministic prefix bytes of the BEP 42 id for (ip, seed). Only
|
|
46
|
+
// the high 5 bits of prefix[2] are deterministic — the low 3 are random in a real
|
|
47
|
+
// id, so they're returned cleared (and masked off again on verify).
|
|
48
|
+
bool bep42_prefix(const IpAddress& ip, uint8_t seed, uint8_t prefix[3]) {
|
|
49
|
+
uint8_t octets[8];
|
|
50
|
+
const int num = masked_octets(ip, octets);
|
|
51
|
+
if (num == 0) return false;
|
|
52
|
+
octets[0] |= static_cast<uint8_t>((seed & 0x7) << 5);
|
|
53
|
+
const uint32_t c = crc32c(octets, static_cast<std::size_t>(num));
|
|
54
|
+
prefix[0] = static_cast<uint8_t>((c >> 24) & 0xff);
|
|
55
|
+
prefix[1] = static_cast<uint8_t>((c >> 16) & 0xff);
|
|
56
|
+
prefix[2] = static_cast<uint8_t>((c >> 8) & 0xf8);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
} // namespace
|
|
61
|
+
|
|
62
|
+
bool is_public_address(const IpAddress& ip) {
|
|
63
|
+
return network_utils::is_public_ip(ip);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
bool generate_node_id_from_ip(const IpAddress& ip, NodeId& out, std::mt19937& rng) {
|
|
67
|
+
std::uniform_int_distribution<int> byte(0, 255);
|
|
68
|
+
const uint8_t seed = static_cast<uint8_t>(byte(rng));
|
|
69
|
+
|
|
70
|
+
uint8_t prefix[3];
|
|
71
|
+
if (!bep42_prefix(ip, seed, prefix)) return false;
|
|
72
|
+
|
|
73
|
+
NodeId id{};
|
|
74
|
+
id[0] = prefix[0];
|
|
75
|
+
id[1] = prefix[1];
|
|
76
|
+
id[2] = static_cast<uint8_t>(prefix[2] | (byte(rng) & 0x7)); // low 3 bits random
|
|
77
|
+
for (int i = 3; i < 19; ++i) id[i] = static_cast<uint8_t>(byte(rng));
|
|
78
|
+
id[19] = seed;
|
|
79
|
+
out = id;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
bool verify_node_id_for_ip(const NodeId& id, const IpAddress& ip) {
|
|
84
|
+
if (!is_public_address(ip)) return true; // can't verify non-public IPs
|
|
85
|
+
uint8_t prefix[3];
|
|
86
|
+
if (!bep42_prefix(ip, id[19], prefix)) return true; // unspecified -> don't reject
|
|
87
|
+
return id[0] == prefix[0]
|
|
88
|
+
&& id[1] == prefix[1]
|
|
89
|
+
&& (id[2] & 0xf8) == prefix[2];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
bool verify_node_id_for_ip(const NodeId& id, const std::string& ip) {
|
|
93
|
+
const auto a = IpAddress::parse(ip);
|
|
94
|
+
if (!a) return true; // unparseable -> don't reject on uncertainty
|
|
95
|
+
return verify_node_id_for_ip(id, *a);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
bool ip_too_close(const IpAddress& a, const IpAddress& b) noexcept {
|
|
99
|
+
if (a.family() != b.family()) return false; // different networks, never "close"
|
|
100
|
+
// /24 for IPv4, /64 for IPv6: compare the leading network bytes. The address bytes
|
|
101
|
+
// are in network order, so a plain prefix compare is the CIDR test.
|
|
102
|
+
const std::size_t network_bytes = a.is_v6() ? 8 : (a.is_v4() ? 3 : 0);
|
|
103
|
+
if (network_bytes == 0) return false; // unspecified
|
|
104
|
+
return std::equal(a.bytes().begin(), a.bytes().begin() + network_bytes,
|
|
105
|
+
b.bytes().begin());
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
} // namespace dht
|
|
109
|
+
} // namespace librats
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file bep42.h
|
|
5
|
+
* @brief BEP 42 — deriving a DHT node id from a node's external IP.
|
|
6
|
+
*
|
|
7
|
+
* Binding the id to the IP stops a node from freely choosing where it sits in the
|
|
8
|
+
* keyspace, which is the basis of the DHT's Sybil resistance. The first ~21 bits of
|
|
9
|
+
* the id are a CRC32C of the masked IP plus a one-byte seed (stored in the last id
|
|
10
|
+
* byte); the remaining bits are random. Only publicly routable IPs are constrained —
|
|
11
|
+
* private/loopback/reserved addresses can't be verified and are exempt.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
#include "librats/core/ip_address.h"
|
|
15
|
+
#include "librats/dht/id.h"
|
|
16
|
+
|
|
17
|
+
#include <random>
|
|
18
|
+
#include <string>
|
|
19
|
+
|
|
20
|
+
namespace librats {
|
|
21
|
+
namespace dht {
|
|
22
|
+
|
|
23
|
+
// Is `ip` publicly routable? Only public IPs can be (and must be) verified. Thin
|
|
24
|
+
// wrapper over network_utils::is_public_ip so every subsystem shares one definition.
|
|
25
|
+
bool is_public_address(const IpAddress& ip);
|
|
26
|
+
|
|
27
|
+
// Build a fresh BEP 42-compliant id for `ip`. Returns false and leaves `out`
|
|
28
|
+
// untouched only if `ip` is unspecified. `rng` supplies the seed and random tail.
|
|
29
|
+
bool generate_node_id_from_ip(const IpAddress& ip, NodeId& out, std::mt19937& rng);
|
|
30
|
+
|
|
31
|
+
// Does `id` satisfy BEP 42 for a peer observed at `ip`? Always true for non-public
|
|
32
|
+
// or unspecified IPs (they can't be verified), so it never rejects on uncertainty.
|
|
33
|
+
// The IpAddress overload is the hot path (routing-table admission); the string one
|
|
34
|
+
// parses then delegates, and backs the public DhtClient::verify_node_id_for_ip API.
|
|
35
|
+
bool verify_node_id_for_ip(const NodeId& id, const IpAddress& ip);
|
|
36
|
+
bool verify_node_id_for_ip(const NodeId& id, const std::string& ip);
|
|
37
|
+
|
|
38
|
+
// Are `a` and `b` close enough to be treated as one identity for Sybil/eclipse
|
|
39
|
+
// resistance? Two addresses count as "too close" when they fall in the same /24
|
|
40
|
+
// (IPv4) or /64 (IPv6) block — the granularity at which a single operator typically
|
|
41
|
+
// controls every address. Different families (or an unspecified address) are never
|
|
42
|
+
// too close. The routing table uses this to keep one subnet from filling a bucket,
|
|
43
|
+
// and a lookup to keep it from flooding the candidate set (libtorrent's
|
|
44
|
+
// dht_restrict_routing_ips / dht_restrict_search_ips).
|
|
45
|
+
bool ip_too_close(const IpAddress& a, const IpAddress& b) noexcept;
|
|
46
|
+
|
|
47
|
+
} // namespace dht
|
|
48
|
+
} // namespace librats
|