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.
Files changed (319) hide show
  1. package/README.md +145 -331
  2. package/binding.gyp +16 -3
  3. package/lib/index.d.ts +288 -696
  4. package/lib/index.js +407 -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 +404 -179
  8. package/native-src/LICENSE +1 -1
  9. package/native-src/src/librats/bindings/rats.cpp +762 -0
  10. package/native-src/src/librats/bindings/rats.h +380 -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 +43 -0
  73. package/native-src/src/librats/core/types.h +103 -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/circuit_service.h +84 -0
  144. package/native-src/src/librats/node/config.h +110 -0
  145. package/native-src/src/librats/node/dial_service.h +54 -0
  146. package/native-src/src/librats/node/dialer.cpp +264 -0
  147. package/native-src/src/librats/node/dialer.h +188 -0
  148. package/native-src/src/librats/node/host_events.h +26 -0
  149. package/native-src/src/librats/node/identify.cpp +130 -0
  150. package/native-src/src/librats/node/identify.h +71 -0
  151. package/native-src/src/librats/node/nat_status.cpp +103 -0
  152. package/native-src/src/librats/node/nat_status.h +118 -0
  153. package/native-src/src/librats/node/node.cpp +865 -0
  154. package/native-src/src/librats/node/node.h +344 -0
  155. package/native-src/src/librats/node/node_context.h +33 -0
  156. package/native-src/src/librats/node/peer_network.h +91 -0
  157. package/native-src/src/librats/peer/peer.h +49 -0
  158. package/native-src/src/librats/peer/peer_book.cpp +181 -0
  159. package/native-src/src/librats/peer/peer_book.h +88 -0
  160. package/native-src/src/librats/peer/peer_id.cpp +72 -0
  161. package/native-src/src/librats/peer/peer_id.h +62 -0
  162. package/native-src/src/librats/peer/peer_info.h +37 -0
  163. package/native-src/src/librats/peer/peer_table.cpp +170 -0
  164. package/native-src/src/librats/peer/peer_table.h +148 -0
  165. package/native-src/src/librats/security/handshaker.h +66 -0
  166. package/native-src/src/librats/security/identity.h +43 -0
  167. package/native-src/src/librats/security/noise_security.cpp +122 -0
  168. package/native-src/src/librats/security/noise_security.h +37 -0
  169. package/native-src/src/librats/security/plaintext_security.h +106 -0
  170. package/native-src/src/librats/security/session.h +37 -0
  171. package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
  172. package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
  173. package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
  174. package/native-src/src/librats/subsystems/bittorrent.h +136 -0
  175. package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
  176. package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
  177. package/native-src/src/librats/subsystems/dht_service.h +36 -0
  178. package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
  179. package/native-src/src/librats/subsystems/file_transfer.h +367 -0
  180. package/native-src/src/librats/subsystems/hole_punch.cpp +605 -0
  181. package/native-src/src/librats/subsystems/hole_punch.h +290 -0
  182. package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
  183. package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
  184. package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
  185. package/native-src/src/librats/subsystems/message_json.cpp +112 -0
  186. package/native-src/src/librats/subsystems/message_json.h +88 -0
  187. package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
  188. package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
  189. package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
  190. package/native-src/src/librats/subsystems/ping_service.h +66 -0
  191. package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
  192. package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
  193. package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
  194. package/native-src/src/librats/subsystems/pubsub.h +175 -0
  195. package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
  196. package/native-src/src/librats/subsystems/reconnection.h +126 -0
  197. package/native-src/src/librats/subsystems/relay.cpp +1142 -0
  198. package/native-src/src/librats/subsystems/relay.h +211 -0
  199. package/native-src/src/librats/subsystems/relay_service.h +46 -0
  200. package/native-src/src/librats/transport/connection.cpp +343 -0
  201. package/native-src/src/librats/transport/connection.h +283 -0
  202. package/native-src/src/librats/transport/link.h +96 -0
  203. package/native-src/src/librats/transport/reactor.cpp +588 -0
  204. package/native-src/src/librats/transport/reactor.h +262 -0
  205. package/native-src/src/librats/transport/reactor_pool.h +81 -0
  206. package/native-src/src/librats/transport/relay_link.cpp +208 -0
  207. package/native-src/src/librats/transport/relay_link.h +303 -0
  208. package/native-src/src/librats/transport/tcp_link.cpp +49 -0
  209. package/native-src/src/librats/transport/tcp_link.h +43 -0
  210. package/native-src/src/librats/transport/udp_mux.cpp +617 -0
  211. package/native-src/src/librats/transport/udp_mux.h +363 -0
  212. package/native-src/src/librats/transport/udp_packet.cpp +121 -0
  213. package/native-src/src/librats/transport/udp_packet.h +190 -0
  214. package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
  215. package/native-src/src/librats/transport/udp_stream.h +614 -0
  216. package/native-src/src/librats/util/features.h.in +51 -0
  217. package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
  218. package/native-src/src/librats/util/fs.h +136 -0
  219. package/native-src/src/librats/util/json.cpp +1002 -0
  220. package/native-src/src/librats/util/json.h +444 -0
  221. package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
  222. package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
  223. package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
  224. package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
  225. package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
  226. package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
  227. package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
  228. package/native-src/src/librats/util/rats_export.h +69 -0
  229. package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
  230. package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
  231. package/native-src/src/librats/wire/frame.cpp +76 -0
  232. package/native-src/src/librats/wire/frame.h +111 -0
  233. package/native-src/src/librats/wire/message_router.cpp +45 -0
  234. package/native-src/src/librats/wire/message_router.h +47 -0
  235. package/package.json +5 -4
  236. package/scripts/build-librats.js +1 -0
  237. package/scripts/postinstall.js +3 -3
  238. package/scripts/prepare-package.js +4 -4
  239. package/scripts/verify-installation.js +63 -105
  240. package/src/librats_node.cpp +1067 -1323
  241. package/native-src/src/bencode.cpp +0 -485
  242. package/native-src/src/bencode.h +0 -145
  243. package/native-src/src/bittorrent.cpp +0 -14
  244. package/native-src/src/bittorrent.h +0 -74
  245. package/native-src/src/bt_bitfield.cpp +0 -372
  246. package/native-src/src/bt_bitfield.h +0 -316
  247. package/native-src/src/bt_choker.cpp +0 -228
  248. package/native-src/src/bt_choker.h +0 -147
  249. package/native-src/src/bt_client.cpp +0 -1047
  250. package/native-src/src/bt_client.h +0 -445
  251. package/native-src/src/bt_create_torrent.cpp +0 -677
  252. package/native-src/src/bt_create_torrent.h +0 -473
  253. package/native-src/src/bt_extension.cpp +0 -469
  254. package/native-src/src/bt_extension.h +0 -309
  255. package/native-src/src/bt_file_storage.cpp +0 -261
  256. package/native-src/src/bt_file_storage.h +0 -298
  257. package/native-src/src/bt_handshake.cpp +0 -134
  258. package/native-src/src/bt_handshake.h +0 -157
  259. package/native-src/src/bt_messages.cpp +0 -364
  260. package/native-src/src/bt_messages.h +0 -324
  261. package/native-src/src/bt_network.cpp +0 -1007
  262. package/native-src/src/bt_network.h +0 -417
  263. package/native-src/src/bt_peer_connection.cpp +0 -742
  264. package/native-src/src/bt_peer_connection.h +0 -592
  265. package/native-src/src/bt_piece_picker.cpp +0 -786
  266. package/native-src/src/bt_piece_picker.h +0 -473
  267. package/native-src/src/bt_resume_data.cpp +0 -410
  268. package/native-src/src/bt_resume_data.h +0 -249
  269. package/native-src/src/bt_torrent.cpp +0 -2120
  270. package/native-src/src/bt_torrent.h +0 -641
  271. package/native-src/src/bt_torrent_info.cpp +0 -659
  272. package/native-src/src/bt_torrent_info.h +0 -418
  273. package/native-src/src/bt_types.h +0 -621
  274. package/native-src/src/chained_send_buffer.cpp +0 -75
  275. package/native-src/src/chained_send_buffer.h +0 -137
  276. package/native-src/src/crypto/hkdf.c +0 -266
  277. package/native-src/src/crypto/poly1305.h +0 -36
  278. package/native-src/src/dht.cpp +0 -3311
  279. package/native-src/src/dht.h +0 -717
  280. package/native-src/src/disk_io.cpp +0 -632
  281. package/native-src/src/disk_io.h +0 -315
  282. package/native-src/src/file_transfer.cpp +0 -1415
  283. package/native-src/src/file_transfer.h +0 -286
  284. package/native-src/src/fs.h +0 -108
  285. package/native-src/src/gossipsub.cpp +0 -1139
  286. package/native-src/src/gossipsub.h +0 -403
  287. package/native-src/src/ice.cpp +0 -893
  288. package/native-src/src/ice.h +0 -559
  289. package/native-src/src/json.hpp +0 -25526
  290. package/native-src/src/librats.cpp +0 -2378
  291. package/native-src/src/librats.h +0 -2324
  292. package/native-src/src/librats_bittorrent.cpp +0 -601
  293. package/native-src/src/librats_c.cpp +0 -1557
  294. package/native-src/src/librats_c.h +0 -323
  295. package/native-src/src/librats_discovery.cpp +0 -402
  296. package/native-src/src/librats_encryption.cpp +0 -275
  297. package/native-src/src/librats_file_transfer.cpp +0 -144
  298. package/native-src/src/librats_gossipsub.cpp +0 -289
  299. package/native-src/src/librats_ice.cpp +0 -213
  300. package/native-src/src/librats_log_macros.h +0 -36
  301. package/native-src/src/librats_logging.cpp +0 -173
  302. package/native-src/src/librats_mdns.cpp +0 -166
  303. package/native-src/src/librats_persistence.cpp +0 -796
  304. package/native-src/src/librats_portmap.cpp +0 -419
  305. package/native-src/src/librats_reconnection.cpp +0 -218
  306. package/native-src/src/librats_statistic.cpp +0 -105
  307. package/native-src/src/librats_storage.cpp +0 -189
  308. package/native-src/src/rats_export.h +0 -17
  309. package/native-src/src/receive_buffer.cpp +0 -82
  310. package/native-src/src/receive_buffer.h +0 -127
  311. package/native-src/src/socket.h +0 -228
  312. package/native-src/src/threadmanager.cpp +0 -105
  313. package/native-src/src/threadmanager.h +0 -53
  314. package/native-src/src/tracker.cpp +0 -1264
  315. package/native-src/src/tracker.h +0 -319
  316. package/native-src/src/turn.cpp +0 -762
  317. package/native-src/src/turn.h +0 -460
  318. package/native-src/src/wakeup_pipe.h +0 -60
  319. /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