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.
- package/README.md +4 -4
- package/dist/index.min.js +29 -29
- package/dist/src/address-manager/index.d.ts +1 -10
- package/dist/src/address-manager/index.d.ts.map +1 -1
- package/dist/src/address-manager/index.js +46 -29
- package/dist/src/address-manager/index.js.map +1 -1
- package/dist/src/autonat/constants.d.ts +4 -0
- package/dist/src/autonat/constants.d.ts.map +1 -0
- package/dist/src/autonat/constants.js +4 -0
- package/dist/src/autonat/constants.js.map +1 -0
- package/dist/src/autonat/index.d.ts +64 -0
- package/dist/src/autonat/index.d.ts.map +1 -0
- package/dist/src/autonat/index.js +417 -0
- package/dist/src/autonat/index.js.map +1 -0
- package/dist/src/autonat/pb/index.d.ts +57 -0
- package/dist/src/autonat/pb/index.d.ts.map +1 -0
- package/dist/src/autonat/pb/index.js +250 -0
- package/dist/src/autonat/pb/index.js.map +1 -0
- package/dist/src/circuit/constants.d.ts +31 -6
- package/dist/src/circuit/constants.d.ts.map +1 -1
- package/dist/src/circuit/constants.js +37 -7
- package/dist/src/circuit/constants.js.map +1 -1
- package/dist/src/circuit/index.d.ts +16 -61
- package/dist/src/circuit/index.d.ts.map +1 -1
- package/dist/src/circuit/index.js +2 -68
- package/dist/src/circuit/index.js.map +1 -1
- package/dist/src/circuit/pb/index.d.ts +83 -43
- package/dist/src/circuit/pb/index.d.ts.map +1 -1
- package/dist/src/circuit/pb/index.js +363 -127
- package/dist/src/circuit/pb/index.js.map +1 -1
- package/dist/src/circuit/server/advert-service.d.ts +43 -0
- package/dist/src/circuit/server/advert-service.d.ts.map +1 -0
- package/dist/src/circuit/server/advert-service.js +69 -0
- package/dist/src/circuit/server/advert-service.js.map +1 -0
- package/dist/src/circuit/server/index.d.ts +60 -0
- package/dist/src/circuit/server/index.d.ts.map +1 -0
- package/dist/src/circuit/server/index.js +287 -0
- package/dist/src/circuit/server/index.js.map +1 -0
- package/dist/src/circuit/server/reservation-store.d.ts +49 -0
- package/dist/src/circuit/server/reservation-store.d.ts.map +1 -0
- package/dist/src/circuit/server/reservation-store.js +57 -0
- package/dist/src/circuit/server/reservation-store.js.map +1 -0
- package/dist/src/circuit/server/reservation-voucher.d.ts +18 -0
- package/dist/src/circuit/server/reservation-voucher.d.ts.map +1 -0
- package/dist/src/circuit/server/reservation-voucher.js +33 -0
- package/dist/src/circuit/server/reservation-voucher.js.map +1 -0
- package/dist/src/circuit/transport/discovery.d.ts +45 -0
- package/dist/src/circuit/transport/discovery.d.ts.map +1 -0
- package/dist/src/circuit/transport/discovery.js +82 -0
- package/dist/src/circuit/transport/discovery.js.map +1 -0
- package/dist/src/circuit/transport/index.d.ts +33 -0
- package/dist/src/circuit/transport/index.d.ts.map +1 -0
- package/dist/src/circuit/transport/index.js +225 -0
- package/dist/src/circuit/transport/index.js.map +1 -0
- package/dist/src/circuit/transport/listener.d.ts +9 -0
- package/dist/src/circuit/transport/listener.d.ts.map +1 -0
- package/dist/src/circuit/transport/listener.js +76 -0
- package/dist/src/circuit/transport/listener.js.map +1 -0
- package/dist/src/circuit/transport/reservation-store.d.ts +60 -0
- package/dist/src/circuit/transport/reservation-store.d.ts.map +1 -0
- package/dist/src/circuit/transport/reservation-store.js +165 -0
- package/dist/src/circuit/transport/reservation-store.js.map +1 -0
- package/dist/src/circuit/utils.d.ts +7 -0
- package/dist/src/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/utils.js +87 -0
- package/dist/src/circuit/utils.js.map +1 -1
- package/dist/src/components.d.ts +2 -1
- package/dist/src/components.d.ts.map +1 -1
- package/dist/src/components.js +13 -13
- package/dist/src/components.js.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +21 -25
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection/index.d.ts +2 -2
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/index.js +4 -4
- package/dist/src/connection/index.js.map +1 -1
- package/dist/src/connection-manager/auto-dialler.d.ts +0 -4
- package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
- package/dist/src/connection-manager/auto-dialler.js +18 -18
- package/dist/src/connection-manager/auto-dialler.js.map +1 -1
- package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -1
- package/dist/src/connection-manager/dialer/dial-request.js +13 -6
- package/dist/src/connection-manager/dialer/dial-request.js.map +1 -1
- package/dist/src/connection-manager/dialer/index.d.ts +10 -1
- package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
- package/dist/src/connection-manager/dialer/index.js +24 -9
- package/dist/src/connection-manager/dialer/index.js.map +1 -1
- package/dist/src/connection-manager/index.d.ts +1 -4
- package/dist/src/connection-manager/index.d.ts.map +1 -1
- package/dist/src/connection-manager/index.js +8 -5
- package/dist/src/connection-manager/index.js.map +1 -1
- package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
- package/dist/src/connection-manager/latency-monitor.js +1 -1
- package/dist/src/connection-manager/latency-monitor.js.map +1 -1
- package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
- package/dist/src/content-routing/index.d.ts +6 -4
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +9 -9
- package/dist/src/content-routing/index.js.map +1 -1
- package/dist/src/content-routing/utils.d.ts +3 -3
- package/dist/src/content-routing/utils.d.ts.map +1 -1
- package/dist/src/content-routing/utils.js +2 -2
- package/dist/src/content-routing/utils.js.map +1 -1
- package/dist/src/dht/dht-content-routing.d.ts +2 -1
- package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-content-routing.js +2 -2
- package/dist/src/dht/dht-content-routing.js.map +1 -1
- package/dist/src/dht/dht-peer-routing.d.ts +3 -2
- package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-peer-routing.js +2 -2
- package/dist/src/dht/dht-peer-routing.js.map +1 -1
- package/dist/src/dht/dummy-dht.d.ts +1 -1
- package/dist/src/dht/dummy-dht.d.ts.map +1 -1
- package/dist/src/dht/dummy-dht.js +12 -12
- package/dist/src/dht/dummy-dht.js.map +1 -1
- package/dist/src/errors.d.ts +2 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/fetch/index.d.ts.map +1 -1
- package/dist/src/fetch/index.js +6 -6
- package/dist/src/fetch/index.js.map +1 -1
- package/dist/src/fetch/pb/proto.d.ts +3 -3
- package/dist/src/fetch/pb/proto.d.ts.map +1 -1
- package/dist/src/fetch/pb/proto.js +4 -3
- package/dist/src/fetch/pb/proto.js.map +1 -1
- package/dist/src/get-peer.js +2 -2
- package/dist/src/get-peer.js.map +1 -1
- package/dist/src/identify/index.d.ts +3 -1
- package/dist/src/identify/index.d.ts.map +1 -1
- package/dist/src/identify/index.js +19 -14
- package/dist/src/identify/index.js.map +1 -1
- package/dist/src/identify/pb/message.d.ts +2 -2
- package/dist/src/identify/pb/message.d.ts.map +1 -1
- package/dist/src/identify/pb/message.js +1 -0
- package/dist/src/identify/pb/message.js.map +1 -1
- package/dist/src/index.d.ts +14 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/insecure/index.d.ts.map +1 -1
- package/dist/src/insecure/index.js.map +1 -1
- package/dist/src/insecure/pb/proto.d.ts +3 -3
- package/dist/src/insecure/pb/proto.d.ts.map +1 -1
- package/dist/src/insecure/pb/proto.js +4 -5
- package/dist/src/insecure/pb/proto.js.map +1 -1
- package/dist/src/libp2p.d.ts +7 -3
- package/dist/src/libp2p.d.ts.map +1 -1
- package/dist/src/libp2p.js +35 -35
- package/dist/src/libp2p.js.map +1 -1
- package/dist/src/nat-manager.d.ts.map +1 -1
- package/dist/src/nat-manager.js +5 -3
- package/dist/src/nat-manager.js.map +1 -1
- package/dist/src/peer-record-updater.d.ts.map +1 -1
- package/dist/src/peer-routing.d.ts.map +1 -1
- package/dist/src/peer-routing.js +5 -5
- package/dist/src/peer-routing.js.map +1 -1
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/ping/index.js +2 -2
- package/dist/src/ping/index.js.map +1 -1
- package/dist/src/pnet/crypto.d.ts +1 -1
- package/dist/src/pnet/crypto.d.ts.map +1 -1
- package/dist/src/pnet/crypto.js +1 -1
- package/dist/src/pnet/crypto.js.map +1 -1
- package/dist/src/pnet/index.js +3 -3
- package/dist/src/pnet/index.js.map +1 -1
- package/dist/src/pnet/key-generator.d.ts.map +1 -1
- package/dist/src/pubsub/dummy-pubsub.js +9 -9
- package/dist/src/pubsub/dummy-pubsub.js.map +1 -1
- package/dist/src/registrar.d.ts.map +1 -1
- package/dist/src/registrar.js +4 -4
- package/dist/src/registrar.js.map +1 -1
- package/dist/src/transport-manager.d.ts.map +1 -1
- package/dist/src/transport-manager.js +8 -9
- package/dist/src/transport-manager.js.map +1 -1
- package/dist/src/upgrader.d.ts +2 -1
- package/dist/src/upgrader.d.ts.map +1 -1
- package/dist/src/upgrader.js +38 -33
- package/dist/src/upgrader.js.map +1 -1
- package/dist/typedoc-urls.json +19 -6
- package/package.json +36 -33
- package/src/address-manager/index.ts +62 -35
- package/src/autonat/constants.ts +4 -0
- package/src/autonat/index.ts +567 -0
- package/src/autonat/pb/index.proto +35 -0
- package/src/autonat/pb/index.ts +320 -0
- package/src/circuit/constants.ts +48 -7
- package/src/circuit/index.ts +17 -129
- package/src/circuit/pb/index.proto +57 -32
- package/src/circuit/pb/index.ts +448 -138
- package/src/circuit/server/advert-service.ts +108 -0
- package/src/circuit/server/index.ts +421 -0
- package/src/circuit/server/reservation-store.ts +111 -0
- package/src/circuit/server/reservation-voucher.ts +51 -0
- package/src/circuit/transport/discovery.ts +127 -0
- package/src/circuit/transport/index.ts +325 -0
- package/src/circuit/transport/listener.ts +99 -0
- package/src/circuit/transport/reservation-store.ts +249 -0
- package/src/circuit/utils.ts +108 -0
- package/src/components.ts +22 -21
- package/src/config.ts +21 -25
- package/src/connection/index.ts +10 -10
- package/src/connection-manager/auto-dialler.ts +36 -40
- package/src/connection-manager/dialer/dial-request.ts +13 -6
- package/src/connection-manager/dialer/index.ts +34 -15
- package/src/connection-manager/index.ts +22 -23
- package/src/connection-manager/latency-monitor.ts +9 -9
- package/src/connection-manager/visibility-change-emitter.ts +4 -4
- package/src/content-routing/index.ts +18 -16
- package/src/content-routing/utils.ts +5 -5
- package/src/dht/dht-content-routing.ts +5 -4
- package/src/dht/dht-peer-routing.ts +5 -4
- package/src/dht/dummy-dht.ts +13 -13
- package/src/errors.ts +2 -1
- package/src/fetch/index.ts +13 -13
- package/src/fetch/pb/proto.ts +8 -7
- package/src/get-peer.ts +3 -3
- package/src/identify/index.ts +29 -24
- package/src/identify/pb/message.ts +3 -2
- package/src/index.ts +15 -8
- package/src/insecure/index.ts +2 -1
- package/src/insecure/pb/proto.ts +8 -9
- package/src/libp2p.ts +52 -46
- package/src/nat-manager.ts +11 -9
- package/src/peer-record-updater.ts +4 -4
- package/src/peer-routing.ts +9 -9
- package/src/ping/index.ts +6 -6
- package/src/pnet/crypto.ts +3 -3
- package/src/pnet/index.ts +3 -3
- package/src/pnet/key-generator.ts +1 -1
- package/src/pubsub/dummy-pubsub.ts +9 -9
- package/src/registrar.ts +12 -12
- package/src/transport-manager.ts +17 -18
- package/src/upgrader.ts +43 -42
- package/src/version.ts +1 -1
- package/dist/src/circuit/auto-relay.d.ts +0 -46
- package/dist/src/circuit/auto-relay.d.ts.map +0 -1
- package/dist/src/circuit/auto-relay.js +0 -220
- package/dist/src/circuit/auto-relay.js.map +0 -1
- package/dist/src/circuit/circuit/hop.d.ts +0 -42
- package/dist/src/circuit/circuit/hop.d.ts.map +0 -1
- package/dist/src/circuit/circuit/hop.js +0 -142
- package/dist/src/circuit/circuit/hop.js.map +0 -1
- package/dist/src/circuit/circuit/stop.d.ts +0 -24
- package/dist/src/circuit/circuit/stop.d.ts.map +0 -1
- package/dist/src/circuit/circuit/stop.js +0 -51
- package/dist/src/circuit/circuit/stop.js.map +0 -1
- package/dist/src/circuit/circuit/stream-handler.d.ts +0 -40
- package/dist/src/circuit/circuit/stream-handler.d.ts.map +0 -1
- package/dist/src/circuit/circuit/stream-handler.js +0 -59
- package/dist/src/circuit/circuit/stream-handler.js.map +0 -1
- package/dist/src/circuit/circuit/utils.d.ts +0 -7
- package/dist/src/circuit/circuit/utils.d.ts.map +0 -1
- package/dist/src/circuit/circuit/utils.js +0 -43
- package/dist/src/circuit/circuit/utils.js.map +0 -1
- package/dist/src/circuit/listener.d.ts +0 -9
- package/dist/src/circuit/listener.d.ts.map +0 -1
- package/dist/src/circuit/listener.js +0 -62
- package/dist/src/circuit/listener.js.map +0 -1
- package/dist/src/circuit/multicodec.d.ts +0 -2
- package/dist/src/circuit/multicodec.d.ts.map +0 -1
- package/dist/src/circuit/multicodec.js +0 -2
- package/dist/src/circuit/multicodec.js.map +0 -1
- package/dist/src/circuit/transport.d.ts +0 -51
- package/dist/src/circuit/transport.d.ts.map +0 -1
- package/dist/src/circuit/transport.js +0 -223
- package/dist/src/circuit/transport.js.map +0 -1
- package/dist/src/keychain/cms.d.ts +0 -33
- package/dist/src/keychain/cms.d.ts.map +0 -1
- package/dist/src/keychain/cms.js +0 -129
- package/dist/src/keychain/cms.js.map +0 -1
- package/dist/src/keychain/index.d.ts +0 -151
- package/dist/src/keychain/index.d.ts.map +0 -1
- package/dist/src/keychain/index.js +0 -519
- package/dist/src/keychain/index.js.map +0 -1
- package/dist/src/keychain/util.d.ts +0 -21
- package/dist/src/keychain/util.d.ts.map +0 -1
- package/dist/src/keychain/util.js +0 -79
- package/dist/src/keychain/util.js.map +0 -1
- package/src/circuit/IMPLEMENTATION_NOTES.md +0 -128
- package/src/circuit/README.md +0 -111
- package/src/circuit/auto-relay.ts +0 -292
- package/src/circuit/circuit/hop.ts +0 -220
- package/src/circuit/circuit/stop.ts +0 -83
- package/src/circuit/circuit/stream-handler.ts +0 -87
- package/src/circuit/circuit/utils.ts +0 -44
- package/src/circuit/listener.ts +0 -83
- package/src/circuit/multicodec.ts +0 -2
- package/src/circuit/transport.ts +0 -278
- package/src/keychain/README.md +0 -55
- package/src/keychain/cms.ts +0 -150
- package/src/keychain/doc/private-key.png +0 -0
- package/src/keychain/doc/private-key.xml +0 -1
- package/src/keychain/index.ts +0 -629
- package/src/keychain/util.ts +0 -82
package/src/circuit/transport.ts
DELETED
|
@@ -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
|
-
}
|
package/src/keychain/README.md
DELETED
|
@@ -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
|
-

|
|
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.
|
package/src/keychain/cms.ts
DELETED
|
@@ -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>
|