librats 1.0.2 → 2.1.4

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.
Files changed (313) hide show
  1. package/README.md +137 -332
  2. package/binding.gyp +16 -3
  3. package/lib/index.d.ts +271 -696
  4. package/lib/index.js +383 -44
  5. package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
  6. package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
  7. package/native-src/CMakeLists.txt +396 -179
  8. package/native-src/LICENSE +1 -1
  9. package/native-src/src/librats/bindings/rats.cpp +731 -0
  10. package/native-src/src/librats/bindings/rats.h +352 -0
  11. package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
  12. package/native-src/src/librats/bittorrent/bencode.h +176 -0
  13. package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
  14. package/native-src/src/librats/bittorrent/bitfield.h +76 -0
  15. package/native-src/src/librats/bittorrent/byte_io.h +58 -0
  16. package/native-src/src/librats/bittorrent/choker.cpp +25 -0
  17. package/native-src/src/librats/bittorrent/choker.h +46 -0
  18. package/native-src/src/librats/bittorrent/client.cpp +413 -0
  19. package/native-src/src/librats/bittorrent/client.h +227 -0
  20. package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
  21. package/native-src/src/librats/bittorrent/disk_io.h +150 -0
  22. package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
  23. package/native-src/src/librats/bittorrent/extensions.h +94 -0
  24. package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
  25. package/native-src/src/librats/bittorrent/file_storage.h +79 -0
  26. package/native-src/src/librats/bittorrent/log.h +42 -0
  27. package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
  28. package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
  29. package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
  30. package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
  31. package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
  32. package/native-src/src/librats/bittorrent/peer_list.h +75 -0
  33. package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
  34. package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
  35. package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
  36. package/native-src/src/librats/bittorrent/reactor.h +89 -0
  37. package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
  38. package/native-src/src/librats/bittorrent/resume_data.h +41 -0
  39. package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
  40. package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
  41. package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
  42. package/native-src/src/librats/bittorrent/torrent.h +260 -0
  43. package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
  44. package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
  45. package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
  46. package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
  47. package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
  48. package/native-src/src/librats/bittorrent/tracker.h +108 -0
  49. package/native-src/src/librats/bittorrent/types.cpp +206 -0
  50. package/native-src/src/librats/bittorrent/types.h +86 -0
  51. package/native-src/src/librats/core/address.cpp +35 -0
  52. package/native-src/src/librats/core/address.h +78 -0
  53. package/native-src/src/librats/core/bytes.h +69 -0
  54. package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
  55. package/native-src/src/librats/core/chained_send_buffer.h +183 -0
  56. package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
  57. package/native-src/src/librats/core/endpoint_parse.h +31 -0
  58. package/native-src/src/librats/core/event_bus.h +70 -0
  59. package/native-src/src/librats/core/host_endpoint.h +56 -0
  60. package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
  61. package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
  62. package/native-src/src/librats/core/ip_address.cpp +120 -0
  63. package/native-src/src/librats/core/ip_address.h +109 -0
  64. package/native-src/src/librats/core/mpsc_queue.h +47 -0
  65. package/native-src/src/librats/core/notifier.h +74 -0
  66. package/native-src/src/librats/core/receive_buffer.cpp +219 -0
  67. package/native-src/src/librats/core/receive_buffer.h +171 -0
  68. package/native-src/src/librats/core/service_registry.h +58 -0
  69. package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
  70. package/native-src/src/librats/core/socket.h +496 -0
  71. package/native-src/src/librats/core/timer_queue.h +105 -0
  72. package/native-src/src/librats/core/types.cpp +42 -0
  73. package/native-src/src/librats/core/types.h +93 -0
  74. package/native-src/src/librats/core/wakeup_pipe.h +83 -0
  75. package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
  76. package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
  77. package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
  78. package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
  79. package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
  80. package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
  81. package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
  82. package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
  83. package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
  84. package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
  85. package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
  86. package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
  87. package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
  88. package/native-src/src/librats/crypto/hkdf.c +266 -0
  89. package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
  90. package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
  91. package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
  92. package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
  93. package/native-src/src/librats/crypto/poly1305.h +37 -0
  94. package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
  95. package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
  96. package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
  97. package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
  98. package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
  99. package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
  100. package/native-src/src/librats/dht/announce.cpp +37 -0
  101. package/native-src/src/librats/dht/announce.h +41 -0
  102. package/native-src/src/librats/dht/bep42.cpp +109 -0
  103. package/native-src/src/librats/dht/bep42.h +48 -0
  104. package/native-src/src/librats/dht/dht.cpp +501 -0
  105. package/native-src/src/librats/dht/dht.h +119 -0
  106. package/native-src/src/librats/dht/dht_runner.cpp +103 -0
  107. package/native-src/src/librats/dht/dht_runner.h +71 -0
  108. package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
  109. package/native-src/src/librats/dht/dos_blocker.h +47 -0
  110. package/native-src/src/librats/dht/find_peers.cpp +52 -0
  111. package/native-src/src/librats/dht/find_peers.h +73 -0
  112. package/native-src/src/librats/dht/id.h +167 -0
  113. package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
  114. package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
  115. package/native-src/src/librats/dht/log.h +38 -0
  116. package/native-src/src/librats/dht/node.cpp +473 -0
  117. package/native-src/src/librats/dht/node.h +164 -0
  118. package/native-src/src/librats/dht/node_entry.h +81 -0
  119. package/native-src/src/librats/dht/observer.h +72 -0
  120. package/native-src/src/librats/dht/persistence.cpp +90 -0
  121. package/native-src/src/librats/dht/persistence.h +32 -0
  122. package/native-src/src/librats/dht/routing_table.cpp +559 -0
  123. package/native-src/src/librats/dht/routing_table.h +185 -0
  124. package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
  125. package/native-src/src/librats/dht/rpc_manager.h +77 -0
  126. package/native-src/src/librats/dht/storage.cpp +92 -0
  127. package/native-src/src/librats/dht/storage.h +74 -0
  128. package/native-src/src/librats/dht/transport.h +27 -0
  129. package/native-src/src/librats/dht/traversal.cpp +326 -0
  130. package/native-src/src/librats/dht/traversal.h +120 -0
  131. package/native-src/src/librats/dht/udp_transport.cpp +49 -0
  132. package/native-src/src/librats/dht/udp_transport.h +51 -0
  133. package/native-src/src/librats/mdns/log.h +22 -0
  134. package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
  135. package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
  136. package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
  137. package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
  138. package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
  139. package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
  140. package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
  141. package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
  142. package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
  143. package/native-src/src/librats/node/config.h +110 -0
  144. package/native-src/src/librats/node/dial_service.h +54 -0
  145. package/native-src/src/librats/node/dialer.cpp +264 -0
  146. package/native-src/src/librats/node/dialer.h +188 -0
  147. package/native-src/src/librats/node/host_events.h +26 -0
  148. package/native-src/src/librats/node/identify.cpp +130 -0
  149. package/native-src/src/librats/node/identify.h +71 -0
  150. package/native-src/src/librats/node/nat_status.cpp +103 -0
  151. package/native-src/src/librats/node/nat_status.h +118 -0
  152. package/native-src/src/librats/node/node.cpp +826 -0
  153. package/native-src/src/librats/node/node.h +333 -0
  154. package/native-src/src/librats/node/node_context.h +33 -0
  155. package/native-src/src/librats/node/peer_network.h +91 -0
  156. package/native-src/src/librats/peer/peer.h +49 -0
  157. package/native-src/src/librats/peer/peer_book.cpp +181 -0
  158. package/native-src/src/librats/peer/peer_book.h +88 -0
  159. package/native-src/src/librats/peer/peer_id.cpp +72 -0
  160. package/native-src/src/librats/peer/peer_id.h +62 -0
  161. package/native-src/src/librats/peer/peer_info.h +37 -0
  162. package/native-src/src/librats/peer/peer_table.cpp +137 -0
  163. package/native-src/src/librats/peer/peer_table.h +148 -0
  164. package/native-src/src/librats/security/handshaker.h +66 -0
  165. package/native-src/src/librats/security/identity.h +43 -0
  166. package/native-src/src/librats/security/noise_security.cpp +122 -0
  167. package/native-src/src/librats/security/noise_security.h +37 -0
  168. package/native-src/src/librats/security/plaintext_security.h +106 -0
  169. package/native-src/src/librats/security/session.h +37 -0
  170. package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
  171. package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
  172. package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
  173. package/native-src/src/librats/subsystems/bittorrent.h +136 -0
  174. package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
  175. package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
  176. package/native-src/src/librats/subsystems/dht_service.h +36 -0
  177. package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
  178. package/native-src/src/librats/subsystems/file_transfer.h +367 -0
  179. package/native-src/src/librats/subsystems/hole_punch.cpp +532 -0
  180. package/native-src/src/librats/subsystems/hole_punch.h +266 -0
  181. package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
  182. package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
  183. package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
  184. package/native-src/src/librats/subsystems/message_json.cpp +112 -0
  185. package/native-src/src/librats/subsystems/message_json.h +88 -0
  186. package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
  187. package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
  188. package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
  189. package/native-src/src/librats/subsystems/ping_service.h +66 -0
  190. package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
  191. package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
  192. package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
  193. package/native-src/src/librats/subsystems/pubsub.h +175 -0
  194. package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
  195. package/native-src/src/librats/subsystems/reconnection.h +126 -0
  196. package/native-src/src/librats/transport/connection.cpp +343 -0
  197. package/native-src/src/librats/transport/connection.h +283 -0
  198. package/native-src/src/librats/transport/link.h +96 -0
  199. package/native-src/src/librats/transport/reactor.cpp +540 -0
  200. package/native-src/src/librats/transport/reactor.h +224 -0
  201. package/native-src/src/librats/transport/reactor_pool.h +81 -0
  202. package/native-src/src/librats/transport/tcp_link.cpp +49 -0
  203. package/native-src/src/librats/transport/tcp_link.h +43 -0
  204. package/native-src/src/librats/transport/udp_mux.cpp +617 -0
  205. package/native-src/src/librats/transport/udp_mux.h +363 -0
  206. package/native-src/src/librats/transport/udp_packet.cpp +121 -0
  207. package/native-src/src/librats/transport/udp_packet.h +190 -0
  208. package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
  209. package/native-src/src/librats/transport/udp_stream.h +614 -0
  210. package/native-src/src/librats/util/features.h.in +51 -0
  211. package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
  212. package/native-src/src/librats/util/fs.h +136 -0
  213. package/native-src/src/librats/util/json.cpp +1002 -0
  214. package/native-src/src/librats/util/json.h +444 -0
  215. package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
  216. package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
  217. package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
  218. package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
  219. package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
  220. package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
  221. package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
  222. package/native-src/src/librats/util/rats_export.h +69 -0
  223. package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
  224. package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
  225. package/native-src/src/librats/wire/frame.cpp +76 -0
  226. package/native-src/src/librats/wire/frame.h +110 -0
  227. package/native-src/src/librats/wire/message_router.cpp +45 -0
  228. package/native-src/src/librats/wire/message_router.h +47 -0
  229. package/package.json +5 -4
  230. package/scripts/build-librats.js +1 -0
  231. package/scripts/postinstall.js +3 -3
  232. package/scripts/prepare-package.js +4 -4
  233. package/scripts/verify-installation.js +63 -105
  234. package/src/librats_node.cpp +1042 -1324
  235. package/native-src/src/bencode.cpp +0 -485
  236. package/native-src/src/bencode.h +0 -145
  237. package/native-src/src/bittorrent.cpp +0 -14
  238. package/native-src/src/bittorrent.h +0 -74
  239. package/native-src/src/bt_bitfield.cpp +0 -372
  240. package/native-src/src/bt_bitfield.h +0 -316
  241. package/native-src/src/bt_choker.cpp +0 -228
  242. package/native-src/src/bt_choker.h +0 -147
  243. package/native-src/src/bt_client.cpp +0 -1047
  244. package/native-src/src/bt_client.h +0 -445
  245. package/native-src/src/bt_create_torrent.cpp +0 -677
  246. package/native-src/src/bt_create_torrent.h +0 -473
  247. package/native-src/src/bt_extension.cpp +0 -469
  248. package/native-src/src/bt_extension.h +0 -309
  249. package/native-src/src/bt_file_storage.cpp +0 -261
  250. package/native-src/src/bt_file_storage.h +0 -298
  251. package/native-src/src/bt_handshake.cpp +0 -134
  252. package/native-src/src/bt_handshake.h +0 -157
  253. package/native-src/src/bt_messages.cpp +0 -364
  254. package/native-src/src/bt_messages.h +0 -324
  255. package/native-src/src/bt_network.cpp +0 -1007
  256. package/native-src/src/bt_network.h +0 -417
  257. package/native-src/src/bt_peer_connection.cpp +0 -742
  258. package/native-src/src/bt_peer_connection.h +0 -592
  259. package/native-src/src/bt_piece_picker.cpp +0 -786
  260. package/native-src/src/bt_piece_picker.h +0 -473
  261. package/native-src/src/bt_resume_data.cpp +0 -410
  262. package/native-src/src/bt_resume_data.h +0 -249
  263. package/native-src/src/bt_torrent.cpp +0 -2120
  264. package/native-src/src/bt_torrent.h +0 -641
  265. package/native-src/src/bt_torrent_info.cpp +0 -659
  266. package/native-src/src/bt_torrent_info.h +0 -418
  267. package/native-src/src/bt_types.h +0 -621
  268. package/native-src/src/chained_send_buffer.cpp +0 -75
  269. package/native-src/src/chained_send_buffer.h +0 -137
  270. package/native-src/src/crypto/hkdf.c +0 -266
  271. package/native-src/src/crypto/poly1305.h +0 -36
  272. package/native-src/src/dht.cpp +0 -3311
  273. package/native-src/src/dht.h +0 -717
  274. package/native-src/src/disk_io.cpp +0 -632
  275. package/native-src/src/disk_io.h +0 -315
  276. package/native-src/src/file_transfer.cpp +0 -1415
  277. package/native-src/src/file_transfer.h +0 -286
  278. package/native-src/src/fs.h +0 -108
  279. package/native-src/src/gossipsub.cpp +0 -1139
  280. package/native-src/src/gossipsub.h +0 -403
  281. package/native-src/src/ice.cpp +0 -893
  282. package/native-src/src/ice.h +0 -559
  283. package/native-src/src/json.hpp +0 -25526
  284. package/native-src/src/librats.cpp +0 -2378
  285. package/native-src/src/librats.h +0 -2324
  286. package/native-src/src/librats_bittorrent.cpp +0 -601
  287. package/native-src/src/librats_c.cpp +0 -1557
  288. package/native-src/src/librats_c.h +0 -323
  289. package/native-src/src/librats_discovery.cpp +0 -402
  290. package/native-src/src/librats_encryption.cpp +0 -275
  291. package/native-src/src/librats_file_transfer.cpp +0 -144
  292. package/native-src/src/librats_gossipsub.cpp +0 -289
  293. package/native-src/src/librats_ice.cpp +0 -213
  294. package/native-src/src/librats_log_macros.h +0 -36
  295. package/native-src/src/librats_logging.cpp +0 -173
  296. package/native-src/src/librats_mdns.cpp +0 -166
  297. package/native-src/src/librats_persistence.cpp +0 -796
  298. package/native-src/src/librats_portmap.cpp +0 -419
  299. package/native-src/src/librats_reconnection.cpp +0 -218
  300. package/native-src/src/librats_statistic.cpp +0 -105
  301. package/native-src/src/librats_storage.cpp +0 -189
  302. package/native-src/src/rats_export.h +0 -17
  303. package/native-src/src/receive_buffer.cpp +0 -82
  304. package/native-src/src/receive_buffer.h +0 -127
  305. package/native-src/src/socket.h +0 -228
  306. package/native-src/src/threadmanager.cpp +0 -105
  307. package/native-src/src/threadmanager.h +0 -53
  308. package/native-src/src/tracker.cpp +0 -1264
  309. package/native-src/src/tracker.h +0 -319
  310. package/native-src/src/turn.cpp +0 -762
  311. package/native-src/src/turn.h +0 -460
  312. package/native-src/src/wakeup_pipe.h +0 -60
  313. /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 SHA512_HASH_SIZE 64
34
- #define SHA512_BLOCK_SIZE 128
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
- } sha512_context_t;
44
+ } rats_sha512_context_t;
44
45
 
45
- void sha512_reset(sha512_context_t *context);
46
- void sha512_update(sha512_context_t *context, const void *data, size_t size);
47
- void sha512_finish(sha512_context_t *context, uint8_t *hash);
48
- void sha512_hash(uint8_t *hash, const void *data, size_t size);
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