libp2p 0.42.2 → 0.43.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 (295) hide show
  1. package/README.md +4 -4
  2. package/dist/index.min.js +29 -29
  3. package/dist/src/address-manager/index.d.ts +1 -10
  4. package/dist/src/address-manager/index.d.ts.map +1 -1
  5. package/dist/src/address-manager/index.js +46 -29
  6. package/dist/src/address-manager/index.js.map +1 -1
  7. package/dist/src/autonat/constants.d.ts +4 -0
  8. package/dist/src/autonat/constants.d.ts.map +1 -0
  9. package/dist/src/autonat/constants.js +4 -0
  10. package/dist/src/autonat/constants.js.map +1 -0
  11. package/dist/src/autonat/index.d.ts +64 -0
  12. package/dist/src/autonat/index.d.ts.map +1 -0
  13. package/dist/src/autonat/index.js +417 -0
  14. package/dist/src/autonat/index.js.map +1 -0
  15. package/dist/src/autonat/pb/index.d.ts +57 -0
  16. package/dist/src/autonat/pb/index.d.ts.map +1 -0
  17. package/dist/src/autonat/pb/index.js +250 -0
  18. package/dist/src/autonat/pb/index.js.map +1 -0
  19. package/dist/src/circuit/constants.d.ts +31 -6
  20. package/dist/src/circuit/constants.d.ts.map +1 -1
  21. package/dist/src/circuit/constants.js +37 -7
  22. package/dist/src/circuit/constants.js.map +1 -1
  23. package/dist/src/circuit/index.d.ts +16 -61
  24. package/dist/src/circuit/index.d.ts.map +1 -1
  25. package/dist/src/circuit/index.js +2 -68
  26. package/dist/src/circuit/index.js.map +1 -1
  27. package/dist/src/circuit/pb/index.d.ts +83 -43
  28. package/dist/src/circuit/pb/index.d.ts.map +1 -1
  29. package/dist/src/circuit/pb/index.js +363 -127
  30. package/dist/src/circuit/pb/index.js.map +1 -1
  31. package/dist/src/circuit/server/advert-service.d.ts +43 -0
  32. package/dist/src/circuit/server/advert-service.d.ts.map +1 -0
  33. package/dist/src/circuit/server/advert-service.js +69 -0
  34. package/dist/src/circuit/server/advert-service.js.map +1 -0
  35. package/dist/src/circuit/server/index.d.ts +60 -0
  36. package/dist/src/circuit/server/index.d.ts.map +1 -0
  37. package/dist/src/circuit/server/index.js +287 -0
  38. package/dist/src/circuit/server/index.js.map +1 -0
  39. package/dist/src/circuit/server/reservation-store.d.ts +49 -0
  40. package/dist/src/circuit/server/reservation-store.d.ts.map +1 -0
  41. package/dist/src/circuit/server/reservation-store.js +57 -0
  42. package/dist/src/circuit/server/reservation-store.js.map +1 -0
  43. package/dist/src/circuit/server/reservation-voucher.d.ts +18 -0
  44. package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
  45. package/dist/src/circuit/server/reservation-voucher.js +33 -0
  46. package/dist/src/circuit/server/reservation-voucher.js.map +1 -0
  47. package/dist/src/circuit/transport/discovery.d.ts +45 -0
  48. package/dist/src/circuit/transport/discovery.d.ts.map +1 -0
  49. package/dist/src/circuit/transport/discovery.js +82 -0
  50. package/dist/src/circuit/transport/discovery.js.map +1 -0
  51. package/dist/src/circuit/transport/index.d.ts +33 -0
  52. package/dist/src/circuit/transport/index.d.ts.map +1 -0
  53. package/dist/src/circuit/transport/index.js +225 -0
  54. package/dist/src/circuit/transport/index.js.map +1 -0
  55. package/dist/src/circuit/transport/listener.d.ts +9 -0
  56. package/dist/src/circuit/transport/listener.d.ts.map +1 -0
  57. package/dist/src/circuit/transport/listener.js +76 -0
  58. package/dist/src/circuit/transport/listener.js.map +1 -0
  59. package/dist/src/circuit/transport/reservation-store.d.ts +60 -0
  60. package/dist/src/circuit/transport/reservation-store.d.ts.map +1 -0
  61. package/dist/src/circuit/transport/reservation-store.js +165 -0
  62. package/dist/src/circuit/transport/reservation-store.js.map +1 -0
  63. package/dist/src/circuit/utils.d.ts +7 -0
  64. package/dist/src/circuit/utils.d.ts.map +1 -1
  65. package/dist/src/circuit/utils.js +87 -0
  66. package/dist/src/circuit/utils.js.map +1 -1
  67. package/dist/src/components.d.ts +2 -1
  68. package/dist/src/components.d.ts.map +1 -1
  69. package/dist/src/components.js +13 -13
  70. package/dist/src/components.js.map +1 -1
  71. package/dist/src/config.d.ts.map +1 -1
  72. package/dist/src/config.js +21 -25
  73. package/dist/src/config.js.map +1 -1
  74. package/dist/src/connection/index.d.ts +2 -2
  75. package/dist/src/connection/index.d.ts.map +1 -1
  76. package/dist/src/connection/index.js +4 -4
  77. package/dist/src/connection/index.js.map +1 -1
  78. package/dist/src/connection-manager/auto-dialler.d.ts +0 -4
  79. package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
  80. package/dist/src/connection-manager/auto-dialler.js +18 -18
  81. package/dist/src/connection-manager/auto-dialler.js.map +1 -1
  82. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -1
  83. package/dist/src/connection-manager/dialer/dial-request.js +13 -6
  84. package/dist/src/connection-manager/dialer/dial-request.js.map +1 -1
  85. package/dist/src/connection-manager/dialer/index.d.ts +10 -1
  86. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
  87. package/dist/src/connection-manager/dialer/index.js +24 -9
  88. package/dist/src/connection-manager/dialer/index.js.map +1 -1
  89. package/dist/src/connection-manager/index.d.ts +1 -4
  90. package/dist/src/connection-manager/index.d.ts.map +1 -1
  91. package/dist/src/connection-manager/index.js +8 -5
  92. package/dist/src/connection-manager/index.js.map +1 -1
  93. package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
  94. package/dist/src/connection-manager/latency-monitor.js +1 -1
  95. package/dist/src/connection-manager/latency-monitor.js.map +1 -1
  96. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
  97. package/dist/src/content-routing/index.d.ts +6 -4
  98. package/dist/src/content-routing/index.d.ts.map +1 -1
  99. package/dist/src/content-routing/index.js +9 -9
  100. package/dist/src/content-routing/index.js.map +1 -1
  101. package/dist/src/content-routing/utils.d.ts +3 -3
  102. package/dist/src/content-routing/utils.d.ts.map +1 -1
  103. package/dist/src/content-routing/utils.js +2 -2
  104. package/dist/src/content-routing/utils.js.map +1 -1
  105. package/dist/src/dht/dht-content-routing.d.ts +2 -1
  106. package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
  107. package/dist/src/dht/dht-content-routing.js +2 -2
  108. package/dist/src/dht/dht-content-routing.js.map +1 -1
  109. package/dist/src/dht/dht-peer-routing.d.ts +3 -2
  110. package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
  111. package/dist/src/dht/dht-peer-routing.js +2 -2
  112. package/dist/src/dht/dht-peer-routing.js.map +1 -1
  113. package/dist/src/dht/dummy-dht.d.ts +1 -1
  114. package/dist/src/dht/dummy-dht.d.ts.map +1 -1
  115. package/dist/src/dht/dummy-dht.js +12 -12
  116. package/dist/src/dht/dummy-dht.js.map +1 -1
  117. package/dist/src/errors.d.ts +2 -1
  118. package/dist/src/errors.d.ts.map +1 -1
  119. package/dist/src/errors.js +1 -0
  120. package/dist/src/errors.js.map +1 -1
  121. package/dist/src/fetch/index.d.ts.map +1 -1
  122. package/dist/src/fetch/index.js +6 -6
  123. package/dist/src/fetch/index.js.map +1 -1
  124. package/dist/src/fetch/pb/proto.d.ts +3 -3
  125. package/dist/src/fetch/pb/proto.d.ts.map +1 -1
  126. package/dist/src/fetch/pb/proto.js +4 -3
  127. package/dist/src/fetch/pb/proto.js.map +1 -1
  128. package/dist/src/get-peer.js +2 -2
  129. package/dist/src/get-peer.js.map +1 -1
  130. package/dist/src/identify/index.d.ts +3 -1
  131. package/dist/src/identify/index.d.ts.map +1 -1
  132. package/dist/src/identify/index.js +19 -14
  133. package/dist/src/identify/index.js.map +1 -1
  134. package/dist/src/identify/pb/message.d.ts +2 -2
  135. package/dist/src/identify/pb/message.d.ts.map +1 -1
  136. package/dist/src/identify/pb/message.js +1 -0
  137. package/dist/src/identify/pb/message.js.map +1 -1
  138. package/dist/src/index.d.ts +14 -8
  139. package/dist/src/index.d.ts.map +1 -1
  140. package/dist/src/index.js.map +1 -1
  141. package/dist/src/insecure/index.d.ts.map +1 -1
  142. package/dist/src/insecure/index.js.map +1 -1
  143. package/dist/src/insecure/pb/proto.d.ts +3 -3
  144. package/dist/src/insecure/pb/proto.d.ts.map +1 -1
  145. package/dist/src/insecure/pb/proto.js +4 -5
  146. package/dist/src/insecure/pb/proto.js.map +1 -1
  147. package/dist/src/libp2p.d.ts +7 -3
  148. package/dist/src/libp2p.d.ts.map +1 -1
  149. package/dist/src/libp2p.js +35 -35
  150. package/dist/src/libp2p.js.map +1 -1
  151. package/dist/src/nat-manager.d.ts.map +1 -1
  152. package/dist/src/nat-manager.js +5 -3
  153. package/dist/src/nat-manager.js.map +1 -1
  154. package/dist/src/peer-record-updater.d.ts.map +1 -1
  155. package/dist/src/peer-routing.d.ts.map +1 -1
  156. package/dist/src/peer-routing.js +5 -5
  157. package/dist/src/peer-routing.js.map +1 -1
  158. package/dist/src/ping/index.d.ts.map +1 -1
  159. package/dist/src/ping/index.js +2 -2
  160. package/dist/src/ping/index.js.map +1 -1
  161. package/dist/src/pnet/crypto.d.ts +1 -1
  162. package/dist/src/pnet/crypto.d.ts.map +1 -1
  163. package/dist/src/pnet/crypto.js +1 -1
  164. package/dist/src/pnet/crypto.js.map +1 -1
  165. package/dist/src/pnet/index.js +3 -3
  166. package/dist/src/pnet/index.js.map +1 -1
  167. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  168. package/dist/src/pubsub/dummy-pubsub.js +9 -9
  169. package/dist/src/pubsub/dummy-pubsub.js.map +1 -1
  170. package/dist/src/registrar.d.ts.map +1 -1
  171. package/dist/src/registrar.js +4 -4
  172. package/dist/src/registrar.js.map +1 -1
  173. package/dist/src/transport-manager.d.ts.map +1 -1
  174. package/dist/src/transport-manager.js +8 -9
  175. package/dist/src/transport-manager.js.map +1 -1
  176. package/dist/src/upgrader.d.ts +2 -1
  177. package/dist/src/upgrader.d.ts.map +1 -1
  178. package/dist/src/upgrader.js +38 -33
  179. package/dist/src/upgrader.js.map +1 -1
  180. package/dist/typedoc-urls.json +19 -6
  181. package/package.json +36 -33
  182. package/src/address-manager/index.ts +62 -35
  183. package/src/autonat/constants.ts +4 -0
  184. package/src/autonat/index.ts +567 -0
  185. package/src/autonat/pb/index.proto +35 -0
  186. package/src/autonat/pb/index.ts +320 -0
  187. package/src/circuit/constants.ts +48 -7
  188. package/src/circuit/index.ts +17 -129
  189. package/src/circuit/pb/index.proto +57 -32
  190. package/src/circuit/pb/index.ts +448 -138
  191. package/src/circuit/server/advert-service.ts +108 -0
  192. package/src/circuit/server/index.ts +421 -0
  193. package/src/circuit/server/reservation-store.ts +111 -0
  194. package/src/circuit/server/reservation-voucher.ts +51 -0
  195. package/src/circuit/transport/discovery.ts +127 -0
  196. package/src/circuit/transport/index.ts +325 -0
  197. package/src/circuit/transport/listener.ts +99 -0
  198. package/src/circuit/transport/reservation-store.ts +249 -0
  199. package/src/circuit/utils.ts +108 -0
  200. package/src/components.ts +22 -21
  201. package/src/config.ts +21 -25
  202. package/src/connection/index.ts +10 -10
  203. package/src/connection-manager/auto-dialler.ts +36 -40
  204. package/src/connection-manager/dialer/dial-request.ts +13 -6
  205. package/src/connection-manager/dialer/index.ts +34 -15
  206. package/src/connection-manager/index.ts +22 -23
  207. package/src/connection-manager/latency-monitor.ts +9 -9
  208. package/src/connection-manager/visibility-change-emitter.ts +4 -4
  209. package/src/content-routing/index.ts +18 -16
  210. package/src/content-routing/utils.ts +5 -5
  211. package/src/dht/dht-content-routing.ts +5 -4
  212. package/src/dht/dht-peer-routing.ts +5 -4
  213. package/src/dht/dummy-dht.ts +13 -13
  214. package/src/errors.ts +2 -1
  215. package/src/fetch/index.ts +13 -13
  216. package/src/fetch/pb/proto.ts +8 -7
  217. package/src/get-peer.ts +3 -3
  218. package/src/identify/index.ts +29 -24
  219. package/src/identify/pb/message.ts +3 -2
  220. package/src/index.ts +15 -8
  221. package/src/insecure/index.ts +2 -1
  222. package/src/insecure/pb/proto.ts +8 -9
  223. package/src/libp2p.ts +52 -46
  224. package/src/nat-manager.ts +11 -9
  225. package/src/peer-record-updater.ts +4 -4
  226. package/src/peer-routing.ts +9 -9
  227. package/src/ping/index.ts +6 -6
  228. package/src/pnet/crypto.ts +3 -3
  229. package/src/pnet/index.ts +3 -3
  230. package/src/pnet/key-generator.ts +1 -1
  231. package/src/pubsub/dummy-pubsub.ts +9 -9
  232. package/src/registrar.ts +12 -12
  233. package/src/transport-manager.ts +17 -18
  234. package/src/upgrader.ts +43 -42
  235. package/src/version.ts +1 -1
  236. package/dist/src/circuit/auto-relay.d.ts +0 -46
  237. package/dist/src/circuit/auto-relay.d.ts.map +0 -1
  238. package/dist/src/circuit/auto-relay.js +0 -220
  239. package/dist/src/circuit/auto-relay.js.map +0 -1
  240. package/dist/src/circuit/circuit/hop.d.ts +0 -42
  241. package/dist/src/circuit/circuit/hop.d.ts.map +0 -1
  242. package/dist/src/circuit/circuit/hop.js +0 -142
  243. package/dist/src/circuit/circuit/hop.js.map +0 -1
  244. package/dist/src/circuit/circuit/stop.d.ts +0 -24
  245. package/dist/src/circuit/circuit/stop.d.ts.map +0 -1
  246. package/dist/src/circuit/circuit/stop.js +0 -51
  247. package/dist/src/circuit/circuit/stop.js.map +0 -1
  248. package/dist/src/circuit/circuit/stream-handler.d.ts +0 -40
  249. package/dist/src/circuit/circuit/stream-handler.d.ts.map +0 -1
  250. package/dist/src/circuit/circuit/stream-handler.js +0 -59
  251. package/dist/src/circuit/circuit/stream-handler.js.map +0 -1
  252. package/dist/src/circuit/circuit/utils.d.ts +0 -7
  253. package/dist/src/circuit/circuit/utils.d.ts.map +0 -1
  254. package/dist/src/circuit/circuit/utils.js +0 -43
  255. package/dist/src/circuit/circuit/utils.js.map +0 -1
  256. package/dist/src/circuit/listener.d.ts +0 -9
  257. package/dist/src/circuit/listener.d.ts.map +0 -1
  258. package/dist/src/circuit/listener.js +0 -62
  259. package/dist/src/circuit/listener.js.map +0 -1
  260. package/dist/src/circuit/multicodec.d.ts +0 -2
  261. package/dist/src/circuit/multicodec.d.ts.map +0 -1
  262. package/dist/src/circuit/multicodec.js +0 -2
  263. package/dist/src/circuit/multicodec.js.map +0 -1
  264. package/dist/src/circuit/transport.d.ts +0 -51
  265. package/dist/src/circuit/transport.d.ts.map +0 -1
  266. package/dist/src/circuit/transport.js +0 -223
  267. package/dist/src/circuit/transport.js.map +0 -1
  268. package/dist/src/keychain/cms.d.ts +0 -33
  269. package/dist/src/keychain/cms.d.ts.map +0 -1
  270. package/dist/src/keychain/cms.js +0 -129
  271. package/dist/src/keychain/cms.js.map +0 -1
  272. package/dist/src/keychain/index.d.ts +0 -151
  273. package/dist/src/keychain/index.d.ts.map +0 -1
  274. package/dist/src/keychain/index.js +0 -519
  275. package/dist/src/keychain/index.js.map +0 -1
  276. package/dist/src/keychain/util.d.ts +0 -21
  277. package/dist/src/keychain/util.d.ts.map +0 -1
  278. package/dist/src/keychain/util.js +0 -79
  279. package/dist/src/keychain/util.js.map +0 -1
  280. package/src/circuit/IMPLEMENTATION_NOTES.md +0 -128
  281. package/src/circuit/README.md +0 -111
  282. package/src/circuit/auto-relay.ts +0 -292
  283. package/src/circuit/circuit/hop.ts +0 -220
  284. package/src/circuit/circuit/stop.ts +0 -83
  285. package/src/circuit/circuit/stream-handler.ts +0 -87
  286. package/src/circuit/circuit/utils.ts +0 -44
  287. package/src/circuit/listener.ts +0 -83
  288. package/src/circuit/multicodec.ts +0 -2
  289. package/src/circuit/transport.ts +0 -278
  290. package/src/keychain/README.md +0 -55
  291. package/src/keychain/cms.ts +0 -150
  292. package/src/keychain/doc/private-key.png +0 -0
  293. package/src/keychain/doc/private-key.xml +0 -1
  294. package/src/keychain/index.ts +0 -629
  295. package/src/keychain/util.ts +0 -82
@@ -1,278 +0,0 @@
1
- import { logger } from '@libp2p/logger'
2
- import errCode from 'err-code'
3
- import * as mafmt from '@multiformats/mafmt'
4
- import type { Multiaddr } from '@multiformats/multiaddr'
5
- import { multiaddr } from '@multiformats/multiaddr'
6
- import { CircuitRelay as CircuitPB } from './pb/index.js'
7
- import { codes } from '../errors.js'
8
- import { streamToMaConnection } from '@libp2p/utils/stream-to-ma-conn'
9
- import { RELAY_CODEC } from './multicodec.js'
10
- import { createListener } from './listener.js'
11
- import { handleCanHop, handleHop, hop } from './circuit/hop.js'
12
- import { handleStop } from './circuit/stop.js'
13
- import { StreamHandler } from './circuit/stream-handler.js'
14
- import { symbol, Upgrader } from '@libp2p/interface-transport'
15
- import { peerIdFromString } from '@libp2p/peer-id'
16
- import type { AbortOptions } from '@libp2p/interfaces'
17
- import type { IncomingStreamData, Registrar } from '@libp2p/interface-registrar'
18
- import type { Listener, Transport, CreateListenerOptions, ConnectionHandler } from '@libp2p/interface-transport'
19
- import type { Connection } from '@libp2p/interface-connection'
20
- import type { RelayConfig } from './index.js'
21
- import { abortableDuplex } from 'abortable-iterator'
22
- import { TimeoutController } from 'timeout-abort-controller'
23
- import { setMaxListeners } from 'events'
24
- import type { Uint8ArrayList } from 'uint8arraylist'
25
- import type { Duplex } from 'it-stream-types'
26
- import type { Startable } from '@libp2p/interfaces/startable'
27
- import type { ConnectionManager } from '@libp2p/interface-connection-manager'
28
- import type { PeerId } from '@libp2p/interface-peer-id'
29
- import type { PeerStore } from '@libp2p/interface-peer-store'
30
- import type { AddressManager } from '@libp2p/interface-address-manager'
31
-
32
- const log = logger('libp2p:circuit')
33
-
34
- export interface CircuitComponents {
35
- peerId: PeerId
36
- peerStore: PeerStore
37
- registrar: Registrar
38
- connectionManager: ConnectionManager
39
- upgrader: Upgrader
40
- addressManager: AddressManager
41
- }
42
-
43
- export class Circuit implements Transport, Startable {
44
- private handler?: ConnectionHandler
45
- private readonly components: CircuitComponents
46
- private readonly _init: RelayConfig
47
- private _started: boolean
48
-
49
- constructor (components: CircuitComponents, init: RelayConfig) {
50
- this._init = init
51
- this.components = components
52
- this._started = false
53
- }
54
-
55
- isStarted () {
56
- return this._started
57
- }
58
-
59
- async start (): Promise<void> {
60
- if (this._started) {
61
- return
62
- }
63
-
64
- this._started = true
65
-
66
- await this.components.registrar.handle(RELAY_CODEC, (data) => {
67
- void this._onProtocol(data).catch(err => {
68
- log.error(err)
69
- })
70
- }, { ...this._init })
71
- .catch(err => {
72
- log.error(err)
73
- })
74
- }
75
-
76
- async stop () {
77
- await this.components.registrar.unhandle(RELAY_CODEC)
78
- }
79
-
80
- hopEnabled () {
81
- return true
82
- }
83
-
84
- hopActive () {
85
- return true
86
- }
87
-
88
- get [symbol] (): true {
89
- return true
90
- }
91
-
92
- get [Symbol.toStringTag] () {
93
- return 'libp2p/circuit-relay-v1'
94
- }
95
-
96
- async _onProtocol (data: IncomingStreamData) {
97
- const { connection, stream } = data
98
- const controller = new TimeoutController(this._init.hop.timeout)
99
-
100
- try {
101
- // fails on node < 15.4
102
- setMaxListeners?.(Infinity, controller.signal)
103
- } catch {}
104
-
105
- try {
106
- const source = abortableDuplex(stream, controller.signal)
107
- const streamHandler = new StreamHandler({
108
- stream: {
109
- ...stream,
110
- ...source
111
- }
112
- })
113
- const request = await streamHandler.read()
114
-
115
- if (request == null) {
116
- log('request was invalid, could not read from stream')
117
- streamHandler.write({
118
- type: CircuitPB.Type.STATUS,
119
- code: CircuitPB.Status.MALFORMED_MESSAGE
120
- })
121
- streamHandler.close()
122
- return
123
- }
124
-
125
- let virtualConnection: Duplex<Uint8ArrayList, Uint8ArrayList | Uint8Array> | undefined
126
-
127
- switch (request.type) {
128
- case CircuitPB.Type.CAN_HOP: {
129
- log('received CAN_HOP request from %p', connection.remotePeer)
130
- await handleCanHop({ circuit: this, connection, streamHandler })
131
- break
132
- }
133
- case CircuitPB.Type.HOP: {
134
- log('received HOP request from %p', connection.remotePeer)
135
- await handleHop({
136
- connection,
137
- request,
138
- streamHandler,
139
- circuit: this,
140
- connectionManager: this.components.connectionManager
141
- })
142
- break
143
- }
144
- case CircuitPB.Type.STOP: {
145
- log('received STOP request from %p', connection.remotePeer)
146
- virtualConnection = await handleStop({
147
- connection,
148
- request,
149
- streamHandler
150
- })
151
- break
152
- }
153
- default: {
154
- log('Request of type %s not supported', request.type)
155
- streamHandler.write({
156
- type: CircuitPB.Type.STATUS,
157
- code: CircuitPB.Status.MALFORMED_MESSAGE
158
- })
159
- streamHandler.close()
160
- return
161
- }
162
- }
163
-
164
- if (virtualConnection != null) {
165
- const remoteAddr = connection.remoteAddr
166
- .encapsulate('/p2p-circuit')
167
- .encapsulate(multiaddr(request.dstPeer?.addrs[0]))
168
- const localAddr = multiaddr(request.srcPeer?.addrs[0])
169
- const maConn = streamToMaConnection({
170
- stream: virtualConnection,
171
- remoteAddr,
172
- localAddr
173
- })
174
- const type = request.type === CircuitPB.Type.HOP ? 'relay' : 'inbound'
175
- log('new %s connection %s', type, maConn.remoteAddr)
176
-
177
- const conn = await this.components.upgrader.upgradeInbound(maConn)
178
- log('%s connection %s upgraded', type, maConn.remoteAddr)
179
-
180
- if (this.handler != null) {
181
- this.handler(conn)
182
- }
183
- }
184
- } finally {
185
- controller.clear()
186
- }
187
- }
188
-
189
- /**
190
- * Dial a peer over a relay
191
- */
192
- async dial (ma: Multiaddr, options: AbortOptions = {}): Promise<Connection> {
193
- // Check the multiaddr to see if it contains a relay and a destination peer
194
- const addrs = ma.toString().split('/p2p-circuit')
195
- const relayAddr = multiaddr(addrs[0])
196
- const destinationAddr = multiaddr(addrs[addrs.length - 1])
197
- const relayId = relayAddr.getPeerId()
198
- const destinationId = destinationAddr.getPeerId()
199
-
200
- if (relayId == null || destinationId == null) {
201
- const errMsg = 'Circuit relay dial failed as addresses did not have peer id'
202
- log.error(errMsg)
203
- throw errCode(new Error(errMsg), codes.ERR_RELAYED_DIAL)
204
- }
205
-
206
- const relayPeer = peerIdFromString(relayId)
207
- const destinationPeer = peerIdFromString(destinationId)
208
-
209
- let disconnectOnFailure = false
210
- const relayConnections = this.components.connectionManager.getConnections(relayPeer)
211
- let relayConnection = relayConnections[0]
212
-
213
- if (relayConnection == null) {
214
- await this.components.peerStore.addressBook.add(relayPeer, [relayAddr])
215
- relayConnection = await this.components.connectionManager.openConnection(relayPeer, options)
216
- disconnectOnFailure = true
217
- }
218
-
219
- try {
220
- const virtualConnection = await hop({
221
- ...options,
222
- connection: relayConnection,
223
- request: {
224
- type: CircuitPB.Type.HOP,
225
- srcPeer: {
226
- id: this.components.peerId.toBytes(),
227
- addrs: this.components.addressManager.getAddresses().map(addr => addr.bytes)
228
- },
229
- dstPeer: {
230
- id: destinationPeer.toBytes(),
231
- addrs: [multiaddr(destinationAddr).bytes]
232
- }
233
- }
234
- })
235
-
236
- const localAddr = relayAddr.encapsulate(`/p2p-circuit/p2p/${this.components.peerId.toString()}`)
237
- const maConn = streamToMaConnection({
238
- stream: virtualConnection,
239
- remoteAddr: ma,
240
- localAddr
241
- })
242
- log('new outbound connection %s', maConn.remoteAddr)
243
-
244
- return await this.components.upgrader.upgradeOutbound(maConn)
245
- } catch (err: any) {
246
- log.error('Circuit relay dial failed', err)
247
- disconnectOnFailure && await relayConnection.close()
248
- throw err
249
- }
250
- }
251
-
252
- /**
253
- * Create a listener
254
- */
255
- createListener (options: CreateListenerOptions): Listener {
256
- // Called on successful HOP and STOP requests
257
- this.handler = options.handler
258
-
259
- return createListener({
260
- connectionManager: this.components.connectionManager,
261
- peerStore: this.components.peerStore
262
- })
263
- }
264
-
265
- /**
266
- * Filter check for all Multiaddrs that this transport can dial on
267
- *
268
- * @param {Multiaddr[]} multiaddrs
269
- * @returns {Multiaddr[]}
270
- */
271
- filter (multiaddrs: Multiaddr[]): Multiaddr[] {
272
- multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
273
-
274
- return multiaddrs.filter((ma) => {
275
- return mafmt.Circuit.matches(ma)
276
- })
277
- }
278
- }
@@ -1,55 +0,0 @@
1
- # js-libp2p-keychain
2
-
3
- > A secure key chain for libp2p in JavaScript
4
-
5
- ## Features
6
-
7
- - Manages the lifecycle of a key
8
- - Keys are encrypted at rest
9
- - Enforces the use of safe key names
10
- - Uses encrypted PKCS 8 for key storage
11
- - Uses PBKDF2 for a "stetched" key encryption key
12
- - Enforces NIST SP 800-131A and NIST SP 800-132
13
- - Uses PKCS 7: CMS (aka RFC 5652) to provide cryptographically protected messages
14
- - Delays reporting errors to slow down brute force attacks
15
-
16
- ### KeyInfo
17
-
18
- The key management and naming service API all return a `KeyInfo` object. The `id` is a universally unique identifier for the key. The `name` is local to the key chain.
19
-
20
- ```js
21
- {
22
- name: 'rsa-key',
23
- id: 'QmYWYSUZ4PV6MRFYpdtEDJBiGs4UrmE6g8wmAWSePekXVW'
24
- }
25
- ```
26
-
27
- The **key id** is the SHA-256 [multihash](https://github.com/multiformats/multihash) of its public key. The *public key* is a [protobuf encoding](https://github.com/libp2p/js-libp2p-crypto/blob/master/src/keys/keys.proto.js) containing a type and the [DER encoding](https://en.wikipedia.org/wiki/X.690) of the PKCS [SubjectPublicKeyInfo](https://www.ietf.org/rfc/rfc3279.txt).
28
-
29
- ### Private key storage
30
-
31
- A private key is stored as an encrypted PKCS 8 structure in the PEM format. It is protected by a key generated from the key chain's *passPhrase* using **PBKDF2**.
32
-
33
- The default options for generating the derived encryption key are in the `dek` object. This, along with the passPhrase, is the input to a `PBKDF2` function.
34
-
35
- ```js
36
- const defaultOptions = {
37
- //See https://cryptosense.com/parameter-choice-for-pbkdf2/
38
- dek: {
39
- keyLength: 512 / 8,
40
- iterationCount: 1000,
41
- salt: 'at least 16 characters long',
42
- hash: 'sha2-512'
43
- }
44
- }
45
- ```
46
-
47
- ![key storage](./doc/private-key.png?raw=true)
48
-
49
- ### Physical storage
50
-
51
- The actual physical storage of an encrypted key is left to implementations of [interface-datastore](https://github.com/ipfs/interface-datastore/). A key benifit is that now the key chain can be used in browser with the [js-datastore-level](https://github.com/ipfs/js-datastore-level) implementation.
52
-
53
- ### Cryptographic Message Syntax (CMS)
54
-
55
- CMS, aka [PKCS #7](https://en.wikipedia.org/wiki/PKCS) and [RFC 5652](https://tools.ietf.org/html/rfc5652), describes an encapsulation syntax for data protection. It is used to digitally sign, digest, authenticate, or encrypt arbitrary message content. Basically, `cms.encrypt` creates a DER message that can be only be read by someone holding the private key.
@@ -1,150 +0,0 @@
1
- import 'node-forge/lib/pkcs7.js'
2
- import 'node-forge/lib/pbe.js'
3
- // @ts-expect-error types are missing
4
- import forge from 'node-forge/lib/forge.js'
5
- import { certificateForKey, findAsync } from './util.js'
6
- import errCode from 'err-code'
7
- import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
8
- import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
9
- import { codes } from '../errors.js'
10
- import { logger } from '@libp2p/logger'
11
- import type { KeyChain } from './index.js'
12
-
13
- const log = logger('libp2p:keychain:cms')
14
-
15
- const privates = new WeakMap<object, { dek: string }>()
16
-
17
- /**
18
- * Cryptographic Message Syntax (aka PKCS #7)
19
- *
20
- * CMS describes an encapsulation syntax for data protection. It
21
- * is used to digitally sign, digest, authenticate, or encrypt
22
- * arbitrary message content.
23
- *
24
- * See RFC 5652 for all the details.
25
- */
26
- export class CMS {
27
- private readonly keychain: KeyChain
28
-
29
- /**
30
- * Creates a new instance with a keychain
31
- */
32
- constructor (keychain: KeyChain, dek: string) {
33
- if (keychain == null) {
34
- throw errCode(new Error('keychain is required'), codes.ERR_KEYCHAIN_REQUIRED)
35
- }
36
-
37
- this.keychain = keychain
38
- privates.set(this, { dek })
39
- }
40
-
41
- /**
42
- * Creates some protected data.
43
- *
44
- * The output Uint8Array contains the PKCS #7 message in DER.
45
- */
46
- async encrypt (name: string, plain: Uint8Array): Promise<Uint8Array> {
47
- if (!(plain instanceof Uint8Array)) {
48
- throw errCode(new Error('Plain data must be a Uint8Array'), codes.ERR_INVALID_PARAMETERS)
49
- }
50
-
51
- const key = await this.keychain.findKeyByName(name)
52
- const pem = await this.keychain.getPrivateKey(name)
53
- const cached = privates.get(this)
54
-
55
- if (cached == null) {
56
- throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
57
- }
58
-
59
- const dek = cached.dek
60
- const privateKey = forge.pki.decryptRsaPrivateKey(pem, dek)
61
- const certificate = await certificateForKey(key, privateKey)
62
-
63
- // create a p7 enveloped message
64
- const p7 = forge.pkcs7.createEnvelopedData()
65
- p7.addRecipient(certificate)
66
- p7.content = forge.util.createBuffer(plain)
67
- p7.encrypt()
68
-
69
- // convert message to DER
70
- const der = forge.asn1.toDer(p7.toAsn1()).getBytes()
71
- return uint8ArrayFromString(der, 'ascii')
72
- }
73
-
74
- /**
75
- * Reads some protected data.
76
- *
77
- * The keychain must contain one of the keys used to encrypt the data. If none of the keys
78
- * exists, an Error is returned with the property 'missingKeys'. It is array of key ids.
79
- */
80
- async decrypt (cmsData: Uint8Array): Promise<Uint8Array> {
81
- if (!(cmsData instanceof Uint8Array)) {
82
- throw errCode(new Error('CMS data is required'), codes.ERR_INVALID_PARAMETERS)
83
- }
84
-
85
- let cms: any
86
- try {
87
- const buf = forge.util.createBuffer(uint8ArrayToString(cmsData, 'ascii'))
88
- const obj = forge.asn1.fromDer(buf)
89
-
90
- cms = forge.pkcs7.messageFromAsn1(obj)
91
- } catch (err: any) {
92
- log.error(err)
93
- throw errCode(new Error('Invalid CMS'), codes.ERR_INVALID_CMS)
94
- }
95
-
96
- // Find a recipient whose key we hold. We only deal with recipient certs
97
- // issued by ipfs (O=ipfs).
98
- const recipients: any = cms.recipients
99
- // @ts-expect-error cms types not defined
100
- .filter(r => r.issuer.find(a => a.shortName === 'O' && a.value === 'ipfs'))
101
- // @ts-expect-error cms types not defined
102
- .filter(r => r.issuer.find(a => a.shortName === 'CN'))
103
- // @ts-expect-error cms types not defined
104
- .map(r => {
105
- return {
106
- recipient: r,
107
- // @ts-expect-error cms types not defined
108
- keyId: r.issuer.find(a => a.shortName === 'CN').value
109
- }
110
- })
111
-
112
- const r = await findAsync(recipients, async (recipient: any) => {
113
- try {
114
- const key = await this.keychain.findKeyById(recipient.keyId)
115
- if (key != null) {
116
- return true
117
- }
118
- } catch (err: any) {
119
- return false
120
- }
121
- return false
122
- })
123
-
124
- if (r == null) {
125
- // @ts-expect-error cms types not defined
126
- const missingKeys: string[] = recipients.map(r => r.keyId)
127
- throw errCode(new Error(`Decryption needs one of the key(s): ${missingKeys.join(', ')}`), codes.ERR_MISSING_KEYS, {
128
- missingKeys
129
- })
130
- }
131
-
132
- const key = await this.keychain.findKeyById(r.keyId)
133
-
134
- if (key == null) {
135
- throw errCode(new Error('No key available to decrypto'), codes.ERR_NO_KEY)
136
- }
137
-
138
- const pem = await this.keychain.getPrivateKey(key.name)
139
- const cached = privates.get(this)
140
-
141
- if (cached == null) {
142
- throw errCode(new Error('dek missing'), codes.ERR_INVALID_PARAMETERS)
143
- }
144
-
145
- const dek = cached.dek
146
- const privateKey = forge.pki.decryptRsaPrivateKey(pem, dek)
147
- cms.decrypt(r.recipient, privateKey)
148
- return uint8ArrayFromString(cms.content.getBytes(), 'ascii')
149
- }
150
- }
Binary file
@@ -1 +0,0 @@
1
- <mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" version="7.8.2" editor="www.draw.io"><diagram id="a8b2919f-aefc-d24c-c550-ea0bf34e92af" name="Page-1">7VlNb6MwEP01HLfCGBJ6bNJ2V9pdqVIP2x4dcMAKYGScJumvXxNsvkw+SmgSVe2hMs9mbL839swQA07j9U+G0vAv9XFkWKa/NuC9YVmua4n/ObApAOjCAggY8QsIVMAzeccSNCW6JD7OGgM5pREnaRP0aJJgjzcwxBhdNYfNadScNUUB1oBnD0U6+o/4PJTbssYV/guTIFQzg9Ft0TND3iJgdJnI+QwLzrd/RXeMlC250SxEPl3VIPhgwCmjlBeteD3FUU6toq1473FHb7luhhN+zAtSpzcULeXWU5RluYmQoQzLRfKNIobjtbA7CXkcCQCIZsYZXeApjSgTSEITMXIyJ1HUglBEgkQ8emJlWOCTN8w4EZTfyY6Y+H4+zWQVEo6fU+Tlc66EfwlsSynOF22KJ7loYQCvd24clHQKL8U0xpxtxBDlolIA6aBgJJ9Xldy2hMKa0ko3JB0sKA1XJIuG5Lmbc6hx/jT5ff9oaWQL50jzZsqoh4Uq3dTUtBiAF9AmxtaJAVYHM6MBmLE1Zny8EABNOaFJ9nW9sfQryfr4fN7oaJxrNOPEv8sv1ZyvSFwPxGuSLjbJNi85GzcmGCvgdQvAUQk8YUbE8nK6a7xhX7uKD7JWo8XpoEVhDEeIk7em+S6u5AxPlIiJq6PQEgWMraaJjC6Zh+Vb9Uu2bUiFw12GOGIB5pqhrXTlto9SczSomk5Dyw9IJsL1dku1C+9SKpYHR5Fvmj1VhE1D2ukbTkX3WlQsuGmErbqw4KLnE5oHBDlWWbt10K22i+xQVgiANrVhaT4g271g22xfKI3kTDQKi33d5rY7fB4Mmgxn5B3NtgNy/5D7EKOdieHcfyhcRmiGo0mZBauwW+XBe+KlzOblSoxSz7pjunvj6A8RgcpaY9Mw3tfZ1BA6n2f41IOt6puaRAucrz/AiSbUNaR/Fjxj+geAxk668PJqRLiPexX8QPuS/OjVmo84yjhleqV2CXac9o18Vnb06uEm3e01PvWW8XZfh4iZFdn+n9mQTLWSCQhcjanRntB5ElF6yl9cQl++zGpfbo7unp9VZgE9M2dJoFFdbRmc5cRarRMLLd0P3S5KnAEoGWuUaHwcTHPXhL/U2q/NjPdF+k6tIHV6J8AqeF9PBtzyZxu2HLVvaQPdlqHhShswaG0zmLQdVWsRbb+lPV5avf44Qdpm2Vo/67JLnfb+oo86RDeNKxLdHkr0208TXcXGz/pW0S066C+61SG6/S36x0TXC7VTRP9SH43VLahyzHZpc/xHY7DfUG85xWP1A2MxvPoRFz78Bw==</diagram></mxfile>