libp2p 0.36.2 → 0.37.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/LICENSE +3 -21
- package/README.md +13 -10
- package/dist/src/address-manager/index.d.ts +34 -52
- package/dist/src/address-manager/index.d.ts.map +1 -1
- package/dist/src/address-manager/index.js +81 -0
- package/dist/src/address-manager/index.js.map +1 -0
- package/dist/src/circuit/auto-relay.d.ts +24 -85
- package/dist/src/circuit/auto-relay.d.ts.map +1 -1
- package/dist/src/circuit/auto-relay.js +216 -0
- package/dist/src/circuit/auto-relay.js.map +1 -0
- package/dist/src/circuit/circuit/hop.d.ts +26 -53
- package/dist/src/circuit/circuit/hop.d.ts.map +1 -1
- package/dist/src/circuit/circuit/hop.js +138 -0
- package/dist/src/circuit/circuit/hop.js.map +1 -0
- package/dist/src/circuit/circuit/stop.d.ts +18 -10
- package/dist/src/circuit/circuit/stop.d.ts.map +1 -1
- package/dist/src/circuit/circuit/stop.js +49 -0
- package/dist/src/circuit/circuit/stop.js.map +1 -0
- package/dist/src/circuit/circuit/stream-handler.d.ts +19 -38
- package/dist/src/circuit/circuit/stream-handler.d.ts.map +1 -1
- package/dist/src/circuit/circuit/stream-handler.js +59 -0
- package/dist/src/circuit/circuit/stream-handler.js.map +1 -0
- package/dist/src/circuit/circuit/utils.d.ts +3 -6
- package/dist/src/circuit/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/circuit/utils.js +43 -0
- package/dist/src/circuit/circuit/utils.js.map +1 -0
- package/dist/src/circuit/constants.d.ts +24 -6
- package/dist/src/circuit/constants.d.ts.map +1 -1
- package/dist/src/circuit/constants.js +26 -0
- package/dist/src/circuit/constants.js.map +1 -0
- package/dist/src/circuit/index.d.ts +41 -74
- package/dist/src/circuit/index.d.ts.map +1 -1
- package/dist/src/circuit/index.js +69 -0
- package/dist/src/circuit/index.js.map +1 -0
- package/dist/src/circuit/listener.d.ts +8 -3
- package/dist/src/circuit/listener.d.ts.map +1 -1
- package/dist/src/circuit/listener.js +62 -0
- package/dist/src/circuit/listener.js.map +1 -0
- package/dist/src/circuit/multicodec.d.ts +1 -1
- package/dist/src/circuit/multicodec.d.ts.map +1 -1
- package/dist/src/circuit/multicodec.js +2 -0
- package/dist/src/circuit/multicodec.js.map +1 -0
- package/dist/src/circuit/pb/index.d.ts +52 -0
- package/dist/src/circuit/pb/index.d.ts.map +1 -0
- package/dist/src/circuit/pb/index.js +98 -0
- package/dist/src/circuit/pb/index.js.map +1 -0
- package/dist/src/circuit/transport.d.ts +18 -78
- package/dist/src/circuit/transport.d.ts.map +1 -1
- package/dist/src/circuit/transport.js +192 -0
- package/dist/src/circuit/transport.js.map +1 -0
- package/dist/src/circuit/utils.d.ts +5 -2
- package/dist/src/circuit/utils.d.ts.map +1 -1
- package/dist/src/circuit/utils.js +11 -0
- package/dist/src/circuit/utils.js.map +1 -0
- package/dist/src/config.d.ts +3 -85
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +91 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/connection-manager/auto-dialler.d.ts +24 -41
- package/dist/src/connection-manager/auto-dialler.d.ts.map +1 -1
- package/dist/src/connection-manager/auto-dialler.js +105 -0
- package/dist/src/connection-manager/auto-dialler.js.map +1 -0
- package/dist/src/connection-manager/dialer/auto-dialer.d.ts +16 -0
- package/dist/src/connection-manager/dialer/auto-dialer.d.ts.map +1 -0
- package/dist/src/connection-manager/dialer/auto-dialer.js +37 -0
- package/dist/src/connection-manager/dialer/auto-dialer.js.map +1 -0
- package/dist/src/connection-manager/dialer/dial-request.d.ts +27 -0
- package/dist/src/connection-manager/dialer/dial-request.d.ts.map +1 -0
- package/dist/src/connection-manager/dialer/dial-request.js +83 -0
- package/dist/src/connection-manager/dialer/dial-request.js.map +1 -0
- package/dist/src/connection-manager/dialer/index.d.ts +104 -0
- package/dist/src/connection-manager/dialer/index.d.ts.map +1 -0
- package/dist/src/connection-manager/dialer/index.js +267 -0
- package/dist/src/connection-manager/dialer/index.js.map +1 -0
- package/dist/src/connection-manager/index.d.ts +102 -136
- package/dist/src/connection-manager/index.d.ts.map +1 -1
- package/dist/src/connection-manager/index.js +333 -0
- package/dist/src/connection-manager/index.js.map +1 -0
- package/dist/src/connection-manager/latency-monitor.d.ts +72 -97
- package/dist/src/connection-manager/latency-monitor.d.ts.map +1 -1
- package/dist/src/connection-manager/latency-monitor.js +220 -0
- package/dist/src/connection-manager/latency-monitor.js.map +1 -0
- package/dist/src/connection-manager/visibility-change-emitter.d.ts +15 -16
- package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +1 -1
- package/dist/src/connection-manager/visibility-change-emitter.js +118 -0
- package/dist/src/connection-manager/visibility-change-emitter.js.map +1 -0
- package/dist/src/constants.d.ts +22 -10
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +27 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/content-routing/index.d.ts +27 -81
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +99 -0
- package/dist/src/content-routing/index.js.map +1 -0
- package/dist/src/content-routing/utils.d.ts +6 -49
- package/dist/src/content-routing/utils.d.ts.map +1 -1
- package/dist/src/content-routing/utils.js +42 -0
- package/dist/src/content-routing/utils.js.map +1 -0
- package/dist/src/dht/dht-content-routing.d.ts +10 -24
- package/dist/src/dht/dht-content-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-content-routing.js +32 -0
- package/dist/src/dht/dht-content-routing.js.map +1 -0
- package/dist/src/dht/dht-peer-routing.d.ts +9 -24
- package/dist/src/dht/dht-peer-routing.d.ts.map +1 -1
- package/dist/src/dht/dht-peer-routing.js +26 -0
- package/dist/src/dht/dht-peer-routing.js.map +1 -0
- package/dist/src/dht/dummy-dht.d.ts +20 -0
- package/dist/src/dht/dummy-dht.d.ts.map +1 -0
- package/dist/src/dht/dummy-dht.js +46 -0
- package/dist/src/dht/dummy-dht.js.map +1 -0
- package/dist/src/errors.d.ts +70 -63
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +75 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/fetch/constants.d.ts +1 -1
- package/dist/src/fetch/constants.d.ts.map +1 -1
- package/dist/src/fetch/constants.js +3 -0
- package/dist/src/fetch/constants.js.map +1 -0
- package/dist/src/fetch/index.d.ts +30 -49
- package/dist/src/fetch/index.d.ts.map +1 -1
- package/dist/src/fetch/index.js +129 -0
- package/dist/src/fetch/index.js.map +1 -0
- package/dist/src/fetch/pb/proto.d.ts +27 -0
- package/dist/src/fetch/pb/proto.d.ts.map +1 -0
- package/dist/src/fetch/pb/proto.js +50 -0
- package/dist/src/fetch/pb/proto.js.map +1 -0
- package/dist/src/get-peer.d.ts +4 -11
- package/dist/src/get-peer.d.ts.map +1 -1
- package/dist/src/get-peer.js +43 -0
- package/dist/src/get-peer.js.map +1 -0
- package/dist/src/identify/consts.d.ts +9 -9
- package/dist/src/identify/consts.d.ts.map +1 -1
- package/dist/src/identify/consts.js +11 -0
- package/dist/src/identify/consts.js.map +1 -0
- package/dist/src/identify/index.d.ts +42 -96
- package/dist/src/identify/index.d.ts.map +1 -1
- package/dist/src/identify/index.js +322 -0
- package/dist/src/identify/index.js.map +1 -0
- package/dist/src/identify/pb/message.d.ts +16 -0
- package/dist/src/identify/pb/message.d.ts.map +1 -0
- package/dist/src/identify/pb/message.js +24 -0
- package/dist/src/identify/pb/message.js.map +1 -0
- package/dist/src/index.d.ts +150 -496
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/insecure/index.d.ts +9 -0
- package/dist/src/insecure/index.d.ts.map +1 -0
- package/dist/src/insecure/index.js +81 -0
- package/dist/src/insecure/index.js.map +1 -0
- package/dist/src/insecure/pb/proto.d.ts +29 -0
- package/dist/src/insecure/pb/proto.d.ts.map +1 -0
- package/dist/src/insecure/pb/proto.js +53 -0
- package/dist/src/insecure/pb/proto.js.map +1 -0
- package/dist/src/keychain/cms.d.ts +6 -14
- package/dist/src/keychain/cms.d.ts.map +1 -1
- package/dist/src/keychain/cms.js +129 -0
- package/dist/src/keychain/cms.js.map +1 -0
- package/dist/src/keychain/index.d.ts +60 -81
- package/dist/src/keychain/index.d.ts.map +1 -1
- package/dist/src/keychain/index.js +492 -0
- package/dist/src/keychain/index.js.map +1 -0
- package/dist/src/keychain/util.d.ts +3 -6
- package/dist/src/keychain/util.d.ts.map +1 -1
- package/dist/src/keychain/util.js +79 -0
- package/dist/src/keychain/util.js.map +1 -0
- package/dist/src/libp2p.d.ts +80 -0
- package/dist/src/libp2p.d.ts.map +1 -0
- package/dist/src/libp2p.js +397 -0
- package/dist/src/libp2p.js.map +1 -0
- package/dist/src/metrics/index.d.ts +47 -104
- package/dist/src/metrics/index.d.ts.map +1 -1
- package/dist/src/metrics/index.js +231 -0
- package/dist/src/metrics/index.js.map +1 -0
- package/dist/src/metrics/moving-average.d.ts +14 -0
- package/dist/src/metrics/moving-average.d.ts.map +1 -0
- package/dist/src/metrics/moving-average.js +40 -0
- package/dist/src/metrics/moving-average.js.map +1 -0
- package/dist/src/metrics/stats.d.ts +41 -93
- package/dist/src/metrics/stats.d.ts.map +1 -1
- package/dist/src/metrics/stats.js +183 -0
- package/dist/src/metrics/stats.js.map +1 -0
- package/dist/src/nat-manager.d.ts +42 -99
- package/dist/src/nat-manager.d.ts.map +1 -1
- package/dist/src/nat-manager.js +114 -0
- package/dist/src/nat-manager.js.map +1 -0
- package/dist/src/peer-record-updater.d.ts +15 -0
- package/dist/src/peer-record-updater.d.ts.map +1 -0
- package/dist/src/peer-record-updater.js +44 -0
- package/dist/src/peer-record-updater.js.map +1 -0
- package/dist/src/peer-routing.d.ts +40 -84
- package/dist/src/peer-routing.d.ts.map +1 -1
- package/dist/src/peer-routing.js +108 -0
- package/dist/src/peer-routing.js.map +1 -0
- package/dist/src/ping/constants.d.ts +4 -4
- package/dist/src/ping/constants.d.ts.map +1 -1
- package/dist/src/ping/constants.js +5 -0
- package/dist/src/ping/constants.js.map +1 -0
- package/dist/src/ping/index.d.ts +17 -31
- package/dist/src/ping/index.d.ts.map +1 -1
- package/dist/src/ping/index.js +57 -0
- package/dist/src/ping/index.js.map +1 -0
- package/dist/src/pnet/crypto.d.ts +15 -5
- package/dist/src/pnet/crypto.d.ts.map +1 -1
- package/dist/src/pnet/crypto.js +60 -0
- package/dist/src/pnet/crypto.js.map +1 -0
- package/dist/src/pnet/errors.d.ts +5 -5
- package/dist/src/pnet/errors.d.ts.map +1 -1
- package/dist/src/pnet/errors.js +6 -0
- package/dist/src/pnet/errors.js.map +1 -0
- package/dist/src/pnet/index.d.ts +12 -20
- package/dist/src/pnet/index.d.ts.map +1 -1
- package/dist/src/pnet/index.js +67 -0
- package/dist/src/pnet/index.js.map +1 -0
- package/dist/src/pnet/key-generator.d.ts +3 -7
- package/dist/src/pnet/key-generator.d.ts.map +1 -1
- package/dist/src/pnet/key-generator.js +25 -0
- package/dist/src/pnet/key-generator.js.map +1 -0
- package/dist/src/pubsub/dummy-pubsub.d.ts +17 -0
- package/dist/src/pubsub/dummy-pubsub.d.ts.map +1 -0
- package/dist/src/pubsub/dummy-pubsub.js +37 -0
- package/dist/src/pubsub/dummy-pubsub.js.map +1 -0
- package/dist/src/registrar.d.ts +26 -65
- package/dist/src/registrar.d.ts.map +1 -1
- package/dist/src/registrar.js +144 -0
- package/dist/src/registrar.js.map +1 -0
- package/dist/src/transport-manager.d.ts +36 -82
- package/dist/src/transport-manager.d.ts.map +1 -1
- package/dist/src/transport-manager.js +223 -0
- package/dist/src/transport-manager.js.map +1 -0
- package/dist/src/upgrader.d.ts +49 -129
- package/dist/src/upgrader.d.ts.map +1 -1
- package/dist/src/upgrader.js +402 -0
- package/dist/src/upgrader.js.map +1 -0
- package/dist/src/version.d.ts +3 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +3 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +144 -201
- package/src/address-manager/index.ts +130 -0
- package/src/circuit/README.md +16 -11
- package/src/circuit/auto-relay.ts +286 -0
- package/src/circuit/circuit/hop.ts +211 -0
- package/src/circuit/circuit/stop.ts +78 -0
- package/src/circuit/circuit/stream-handler.ts +86 -0
- package/src/circuit/circuit/{utils.js → utils.ts} +9 -25
- package/src/circuit/constants.ts +31 -0
- package/src/circuit/index.ts +120 -0
- package/src/circuit/listener.ts +82 -0
- package/src/circuit/multicodec.ts +2 -0
- package/src/circuit/{protocol → pb}/index.proto +1 -1
- package/src/circuit/pb/index.ts +117 -0
- package/src/circuit/transport.ts +219 -0
- package/src/circuit/utils.ts +12 -0
- package/src/config.ts +99 -0
- package/src/connection-manager/auto-dialler.ts +154 -0
- package/src/connection-manager/dialer/auto-dialer.ts +59 -0
- package/src/{dialer/dial-request.js → connection-manager/dialer/dial-request.ts} +60 -51
- package/src/connection-manager/dialer/index.ts +382 -0
- package/src/connection-manager/index.ts +508 -0
- package/src/connection-manager/latency-monitor.ts +319 -0
- package/src/connection-manager/{visibility-change-emitter.js → visibility-change-emitter.ts} +48 -38
- package/src/constants.ts +31 -0
- package/src/content-routing/index.ts +144 -0
- package/src/content-routing/utils.ts +54 -0
- package/src/dht/dht-content-routing.ts +43 -0
- package/src/dht/dht-peer-routing.ts +35 -0
- package/src/dht/dummy-dht.ts +60 -0
- package/src/errors.ts +73 -0
- package/src/fetch/README.md +1 -1
- package/src/fetch/constants.ts +3 -0
- package/src/fetch/index.ts +167 -0
- package/src/fetch/{proto.proto → pb/proto.proto} +0 -0
- package/src/fetch/pb/proto.ts +65 -0
- package/src/get-peer.ts +57 -0
- package/src/identify/consts.ts +13 -0
- package/src/identify/index.ts +445 -0
- package/src/identify/{message.proto → pb/message.proto} +0 -0
- package/src/identify/pb/message.ts +37 -0
- package/src/index.ts +220 -0
- package/src/insecure/index.ts +101 -0
- package/src/insecure/{proto.proto → pb/proto.proto} +0 -0
- package/src/insecure/pb/proto.ts +68 -0
- package/src/keychain/{cms.js → cms.ts} +62 -58
- package/src/keychain/index.ts +587 -0
- package/src/keychain/{util.js → util.ts} +7 -17
- package/src/libp2p.ts +538 -0
- package/src/metrics/index.ts +310 -0
- package/src/metrics/moving-average.ts +53 -0
- package/src/metrics/stats.ts +238 -0
- package/src/nat-manager.ts +194 -0
- package/src/peer-record-updater.ts +55 -0
- package/src/peer-routing.ts +186 -0
- package/src/ping/README.md +1 -1
- package/src/ping/constants.ts +5 -0
- package/src/ping/index.ts +84 -0
- package/src/pnet/README.md +2 -2
- package/src/pnet/crypto.ts +67 -0
- package/src/pnet/errors.ts +5 -0
- package/src/pnet/index.ts +97 -0
- package/src/pnet/key-generator.ts +28 -0
- package/src/pubsub/dummy-pubsub.ts +51 -0
- package/src/registrar.ts +189 -0
- package/src/transport-manager.ts +281 -0
- package/src/upgrader.ts +499 -0
- package/src/version.ts +3 -0
- package/dist/index.min.js +0 -55
- package/dist/src/circuit/protocol/index.d.ts +0 -173
- package/dist/src/dialer/dial-request.d.ts +0 -55
- package/dist/src/dialer/dial-request.d.ts.map +0 -1
- package/dist/src/dialer/index.d.ts +0 -182
- package/dist/src/dialer/index.d.ts.map +0 -1
- package/dist/src/fetch/proto.d.ts +0 -134
- package/dist/src/identify/message.d.ts +0 -95
- package/dist/src/insecure/plaintext.d.ts +0 -12
- package/dist/src/insecure/plaintext.d.ts.map +0 -1
- package/dist/src/insecure/proto.d.ts +0 -128
- package/dist/src/metrics/old-peers.d.ts +0 -3
- package/dist/src/metrics/old-peers.d.ts.map +0 -1
- package/dist/src/metrics/tracked-map.d.ts +0 -8
- package/dist/src/metrics/tracked-map.d.ts.map +0 -1
- package/dist/src/peer-store/address-book.d.ts +0 -67
- package/dist/src/peer-store/address-book.d.ts.map +0 -1
- package/dist/src/peer-store/index.d.ts +0 -58
- package/dist/src/peer-store/index.d.ts.map +0 -1
- package/dist/src/peer-store/key-book.d.ts +0 -40
- package/dist/src/peer-store/key-book.d.ts.map +0 -1
- package/dist/src/peer-store/metadata-book.d.ts +0 -58
- package/dist/src/peer-store/metadata-book.d.ts.map +0 -1
- package/dist/src/peer-store/pb/peer.d.ts +0 -222
- package/dist/src/peer-store/proto-book.d.ts +0 -43
- package/dist/src/peer-store/proto-book.d.ts.map +0 -1
- package/dist/src/peer-store/store.d.ts +0 -73
- package/dist/src/peer-store/store.d.ts.map +0 -1
- package/dist/src/peer-store/types.d.ts +0 -202
- package/dist/src/peer-store/types.d.ts.map +0 -1
- package/dist/src/ping/util.d.ts +0 -5
- package/dist/src/ping/util.d.ts.map +0 -1
- package/dist/src/pubsub-adapter.d.ts +0 -22
- package/dist/src/pubsub-adapter.d.ts.map +0 -1
- package/dist/src/record/envelope/envelope.d.ts +0 -77
- package/dist/src/record/envelope/index.d.ts +0 -80
- package/dist/src/record/envelope/index.d.ts.map +0 -1
- package/dist/src/record/peer-record/consts.d.ts +0 -4
- package/dist/src/record/peer-record/consts.d.ts.map +0 -1
- package/dist/src/record/peer-record/index.d.ts +0 -60
- package/dist/src/record/peer-record/index.d.ts.map +0 -1
- package/dist/src/record/peer-record/peer-record.d.ts +0 -133
- package/dist/src/record/utils.d.ts +0 -12
- package/dist/src/record/utils.d.ts.map +0 -1
- package/dist/src/types.d.ts +0 -90
- package/dist/src/types.d.ts.map +0 -1
- package/src/address-manager/index.js +0 -96
- package/src/circuit/auto-relay.js +0 -302
- package/src/circuit/circuit/hop.js +0 -205
- package/src/circuit/circuit/stop.js +0 -81
- package/src/circuit/circuit/stream-handler.js +0 -94
- package/src/circuit/constants.js +0 -12
- package/src/circuit/index.js +0 -102
- package/src/circuit/listener.js +0 -75
- package/src/circuit/multicodec.js +0 -5
- package/src/circuit/protocol/index.d.ts +0 -173
- package/src/circuit/protocol/index.js +0 -530
- package/src/circuit/transport.js +0 -229
- package/src/circuit/utils.js +0 -17
- package/src/config.js +0 -114
- package/src/connection-manager/auto-dialler.js +0 -132
- package/src/connection-manager/index.js +0 -374
- package/src/connection-manager/latency-monitor.js +0 -264
- package/src/constants.js +0 -18
- package/src/content-routing/index.js +0 -163
- package/src/content-routing/utils.js +0 -89
- package/src/dht/dht-content-routing.js +0 -44
- package/src/dht/dht-peer-routing.js +0 -51
- package/src/dialer/index.js +0 -376
- package/src/errors.js +0 -66
- package/src/fetch/constants.js +0 -6
- package/src/fetch/index.js +0 -159
- package/src/fetch/proto.d.ts +0 -134
- package/src/fetch/proto.js +0 -333
- package/src/get-peer.js +0 -49
- package/src/identify/consts.js +0 -15
- package/src/identify/index.js +0 -384
- package/src/identify/message.d.ts +0 -95
- package/src/identify/message.js +0 -328
- package/src/index.js +0 -813
- package/src/insecure/plaintext.js +0 -95
- package/src/insecure/proto.d.ts +0 -128
- package/src/insecure/proto.js +0 -371
- package/src/keychain/index.js +0 -561
- package/src/metrics/index.js +0 -290
- package/src/metrics/old-peers.js +0 -16
- package/src/metrics/stats.js +0 -270
- package/src/metrics/tracked-map.js +0 -94
- package/src/nat-manager.js +0 -197
- package/src/peer-routing.js +0 -176
- package/src/peer-store/README.md +0 -145
- package/src/peer-store/address-book.js +0 -382
- package/src/peer-store/index.js +0 -121
- package/src/peer-store/key-book.js +0 -141
- package/src/peer-store/metadata-book.js +0 -250
- package/src/peer-store/pb/peer.d.ts +0 -222
- package/src/peer-store/pb/peer.js +0 -643
- package/src/peer-store/pb/peer.proto +0 -31
- package/src/peer-store/proto-book.js +0 -237
- package/src/peer-store/store.js +0 -263
- package/src/peer-store/types.ts +0 -245
- package/src/ping/constants.js +0 -8
- package/src/ping/index.js +0 -84
- package/src/ping/util.js +0 -18
- package/src/pnet/crypto.js +0 -84
- package/src/pnet/errors.js +0 -7
- package/src/pnet/index.js +0 -86
- package/src/pnet/key-generator.js +0 -33
- package/src/pubsub-adapter.js +0 -61
- package/src/record/README.md +0 -130
- package/src/record/envelope/envelope.d.ts +0 -77
- package/src/record/envelope/envelope.js +0 -243
- package/src/record/envelope/envelope.proto +0 -19
- package/src/record/envelope/index.js +0 -183
- package/src/record/peer-record/consts.js +0 -14
- package/src/record/peer-record/index.js +0 -113
- package/src/record/peer-record/peer-record.d.ts +0 -133
- package/src/record/peer-record/peer-record.js +0 -367
- package/src/record/peer-record/peer-record.proto +0 -18
- package/src/record/utils.js +0 -25
- package/src/registrar.js +0 -127
- package/src/transport-manager.js +0 -269
- package/src/types.ts +0 -98
- package/src/upgrader.js +0 -492
package/src/keychain/index.js
DELETED
|
@@ -1,561 +0,0 @@
|
|
|
1
|
-
/* eslint max-nested-callbacks: ["error", 5] */
|
|
2
|
-
'use strict'
|
|
3
|
-
const debug = require('debug')
|
|
4
|
-
const log = Object.assign(debug('libp2p:keychain'), {
|
|
5
|
-
error: debug('libp2p:keychain:err')
|
|
6
|
-
})
|
|
7
|
-
const sanitize = require('sanitize-filename')
|
|
8
|
-
const mergeOptions = require('merge-options')
|
|
9
|
-
const crypto = require('libp2p-crypto')
|
|
10
|
-
const { Key } = require('interface-datastore/key')
|
|
11
|
-
const CMS = require('./cms')
|
|
12
|
-
const errcode = require('err-code')
|
|
13
|
-
const { codes } = require('../errors')
|
|
14
|
-
const { toString: uint8ArrayToString } = require('uint8arrays/to-string')
|
|
15
|
-
const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string')
|
|
16
|
-
|
|
17
|
-
// @ts-ignore node-forge sha512 types not exported
|
|
18
|
-
require('node-forge/lib/sha512')
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @typedef {import('peer-id')} PeerId
|
|
22
|
-
* @typedef {import('interface-datastore').Datastore} Datastore
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @typedef {Object} DekOptions
|
|
27
|
-
* @property {string} hash
|
|
28
|
-
* @property {string} salt
|
|
29
|
-
* @property {number} iterationCount
|
|
30
|
-
* @property {number} keyLength
|
|
31
|
-
*
|
|
32
|
-
* @typedef {Object} KeychainOptions
|
|
33
|
-
* @property {string} [pass]
|
|
34
|
-
* @property {DekOptions} [dek]
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Information about a key.
|
|
39
|
-
*
|
|
40
|
-
* @typedef {Object} KeyInfo
|
|
41
|
-
* @property {string} id - The universally unique key id.
|
|
42
|
-
* @property {string} name - The local key name.
|
|
43
|
-
*/
|
|
44
|
-
|
|
45
|
-
const keyPrefix = '/pkcs8/'
|
|
46
|
-
const infoPrefix = '/info/'
|
|
47
|
-
const privates = new WeakMap()
|
|
48
|
-
|
|
49
|
-
// NIST SP 800-132
|
|
50
|
-
const NIST = {
|
|
51
|
-
minKeyLength: 112 / 8,
|
|
52
|
-
minSaltLength: 128 / 8,
|
|
53
|
-
minIterationCount: 1000
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const defaultOptions = {
|
|
57
|
-
// See https://cryptosense.com/parametesr-choice-for-pbkdf2/
|
|
58
|
-
dek: {
|
|
59
|
-
keyLength: 512 / 8,
|
|
60
|
-
iterationCount: 10000,
|
|
61
|
-
salt: 'you should override this value with a crypto secure random number',
|
|
62
|
-
hash: 'sha2-512'
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* @param {string} name
|
|
68
|
-
*/
|
|
69
|
-
function validateKeyName (name) {
|
|
70
|
-
if (!name) return false
|
|
71
|
-
if (typeof name !== 'string') return false
|
|
72
|
-
return name === sanitize(name.trim())
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Throws an error after a delay
|
|
77
|
-
*
|
|
78
|
-
* This assumes than an error indicates that the keychain is under attack. Delay returning an
|
|
79
|
-
* error to make brute force attacks harder.
|
|
80
|
-
*
|
|
81
|
-
* @param {string|Error} err - The error
|
|
82
|
-
* @returns {Promise<never>}
|
|
83
|
-
* @private
|
|
84
|
-
*/
|
|
85
|
-
async function throwDelayed (err) {
|
|
86
|
-
const min = 200
|
|
87
|
-
const max = 1000
|
|
88
|
-
const delay = Math.random() * (max - min) + min
|
|
89
|
-
|
|
90
|
-
await new Promise(resolve => setTimeout(resolve, delay))
|
|
91
|
-
throw err
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Converts a key name into a datastore name.
|
|
96
|
-
*
|
|
97
|
-
* @param {string} name
|
|
98
|
-
* @returns {Key}
|
|
99
|
-
* @private
|
|
100
|
-
*/
|
|
101
|
-
function DsName (name) {
|
|
102
|
-
return new Key(keyPrefix + name)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Converts a key name into a datastore info name.
|
|
107
|
-
*
|
|
108
|
-
* @param {string} name
|
|
109
|
-
* @returns {Key}
|
|
110
|
-
* @private
|
|
111
|
-
*/
|
|
112
|
-
function DsInfoName (name) {
|
|
113
|
-
return new Key(infoPrefix + name)
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Manages the lifecycle of a key. Keys are encrypted at rest using PKCS #8.
|
|
118
|
-
*
|
|
119
|
-
* A key in the store has two entries
|
|
120
|
-
* - '/info/*key-name*', contains the KeyInfo for the key
|
|
121
|
-
* - '/pkcs8/*key-name*', contains the PKCS #8 for the key
|
|
122
|
-
*
|
|
123
|
-
*/
|
|
124
|
-
class Keychain {
|
|
125
|
-
/**
|
|
126
|
-
* Creates a new instance of a key chain.
|
|
127
|
-
*
|
|
128
|
-
* @param {Datastore} store - where the key are.
|
|
129
|
-
* @param {KeychainOptions} options
|
|
130
|
-
* @class
|
|
131
|
-
*/
|
|
132
|
-
constructor (store, options) {
|
|
133
|
-
if (!store) {
|
|
134
|
-
throw new Error('store is required')
|
|
135
|
-
}
|
|
136
|
-
this.store = store
|
|
137
|
-
|
|
138
|
-
this.opts = mergeOptions(defaultOptions, options)
|
|
139
|
-
|
|
140
|
-
// Enforce NIST SP 800-132
|
|
141
|
-
if (this.opts.pass && this.opts.pass.length < 20) {
|
|
142
|
-
throw new Error('pass must be least 20 characters')
|
|
143
|
-
}
|
|
144
|
-
if (this.opts.dek.keyLength < NIST.minKeyLength) {
|
|
145
|
-
throw new Error(`dek.keyLength must be least ${NIST.minKeyLength} bytes`)
|
|
146
|
-
}
|
|
147
|
-
if (this.opts.dek.salt.length < NIST.minSaltLength) {
|
|
148
|
-
throw new Error(`dek.saltLength must be least ${NIST.minSaltLength} bytes`)
|
|
149
|
-
}
|
|
150
|
-
if (this.opts.dek.iterationCount < NIST.minIterationCount) {
|
|
151
|
-
throw new Error(`dek.iterationCount must be least ${NIST.minIterationCount}`)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const dek = this.opts.pass
|
|
155
|
-
? crypto.pbkdf2(
|
|
156
|
-
this.opts.pass,
|
|
157
|
-
this.opts.dek.salt,
|
|
158
|
-
this.opts.dek.iterationCount,
|
|
159
|
-
this.opts.dek.keyLength,
|
|
160
|
-
this.opts.dek.hash)
|
|
161
|
-
: ''
|
|
162
|
-
|
|
163
|
-
privates.set(this, { dek })
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Gets an object that can encrypt/decrypt protected data
|
|
168
|
-
* using the Cryptographic Message Syntax (CMS).
|
|
169
|
-
*
|
|
170
|
-
* CMS describes an encapsulation syntax for data protection. It
|
|
171
|
-
* is used to digitally sign, digest, authenticate, or encrypt
|
|
172
|
-
* arbitrary message content.
|
|
173
|
-
*
|
|
174
|
-
* @returns {CMS}
|
|
175
|
-
*/
|
|
176
|
-
get cms () {
|
|
177
|
-
return new CMS(this, privates.get(this).dek)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Generates the options for a keychain. A random salt is produced.
|
|
182
|
-
*
|
|
183
|
-
* @returns {Object}
|
|
184
|
-
*/
|
|
185
|
-
static generateOptions () {
|
|
186
|
-
const options = Object.assign({}, defaultOptions)
|
|
187
|
-
const saltLength = Math.ceil(NIST.minSaltLength / 3) * 3 // no base64 padding
|
|
188
|
-
options.dek.salt = uint8ArrayToString(crypto.randomBytes(saltLength), 'base64')
|
|
189
|
-
return options
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Gets an object that can encrypt/decrypt protected data.
|
|
194
|
-
* The default options for a keychain.
|
|
195
|
-
*
|
|
196
|
-
* @returns {Object}
|
|
197
|
-
*/
|
|
198
|
-
static get options () {
|
|
199
|
-
return defaultOptions
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Create a new key.
|
|
204
|
-
*
|
|
205
|
-
* @param {string} name - The local key name; cannot already exist.
|
|
206
|
-
* @param {string} type - One of the key types; 'rsa'.
|
|
207
|
-
* @param {number} [size = 2048] - The key size in bits. Used for rsa keys only.
|
|
208
|
-
* @returns {Promise<KeyInfo>}
|
|
209
|
-
*/
|
|
210
|
-
async createKey (name, type, size = 2048) {
|
|
211
|
-
const self = this
|
|
212
|
-
|
|
213
|
-
if (!validateKeyName(name) || name === 'self') {
|
|
214
|
-
return throwDelayed(errcode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME))
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
if (typeof type !== 'string') {
|
|
218
|
-
return throwDelayed(errcode(new Error(`Invalid key type '${type}'`), codes.ERR_INVALID_KEY_TYPE))
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const dsname = DsName(name)
|
|
222
|
-
const exists = await self.store.has(dsname)
|
|
223
|
-
if (exists) return throwDelayed(errcode(new Error(`Key '${name}' already exists`), codes.ERR_KEY_ALREADY_EXISTS))
|
|
224
|
-
|
|
225
|
-
switch (type.toLowerCase()) {
|
|
226
|
-
case 'rsa':
|
|
227
|
-
if (!Number.isSafeInteger(size) || size < 2048) {
|
|
228
|
-
return throwDelayed(errcode(new Error(`Invalid RSA key size ${size}`), codes.ERR_INVALID_KEY_SIZE))
|
|
229
|
-
}
|
|
230
|
-
break
|
|
231
|
-
default:
|
|
232
|
-
break
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
let keyInfo
|
|
236
|
-
try {
|
|
237
|
-
// @ts-ignore Differences between several crypto return types need to be fixed in libp2p-crypto
|
|
238
|
-
const keypair = await crypto.keys.generateKeyPair(type, size)
|
|
239
|
-
const kid = await keypair.id()
|
|
240
|
-
/** @type {string} */
|
|
241
|
-
const dek = privates.get(this).dek
|
|
242
|
-
const pem = await keypair.export(dek)
|
|
243
|
-
keyInfo = {
|
|
244
|
-
name: name,
|
|
245
|
-
id: kid
|
|
246
|
-
}
|
|
247
|
-
const batch = self.store.batch()
|
|
248
|
-
batch.put(dsname, uint8ArrayFromString(pem))
|
|
249
|
-
batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
|
|
250
|
-
|
|
251
|
-
await batch.commit()
|
|
252
|
-
} catch (/** @type {any} */ err) {
|
|
253
|
-
return throwDelayed(err)
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
return keyInfo
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* List all the keys.
|
|
261
|
-
*
|
|
262
|
-
* @returns {Promise<KeyInfo[]>}
|
|
263
|
-
*/
|
|
264
|
-
async listKeys () {
|
|
265
|
-
const self = this
|
|
266
|
-
const query = {
|
|
267
|
-
prefix: infoPrefix
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const info = []
|
|
271
|
-
for await (const value of self.store.query(query)) {
|
|
272
|
-
info.push(JSON.parse(uint8ArrayToString(value.value)))
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
return info
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Find a key by it's id.
|
|
280
|
-
*
|
|
281
|
-
* @param {string} id - The universally unique key identifier.
|
|
282
|
-
* @returns {Promise<KeyInfo|undefined>}
|
|
283
|
-
*/
|
|
284
|
-
async findKeyById (id) {
|
|
285
|
-
try {
|
|
286
|
-
const keys = await this.listKeys()
|
|
287
|
-
return keys.find((k) => k.id === id)
|
|
288
|
-
} catch (/** @type {any} */ err) {
|
|
289
|
-
return throwDelayed(err)
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Find a key by it's name.
|
|
295
|
-
*
|
|
296
|
-
* @param {string} name - The local key name.
|
|
297
|
-
* @returns {Promise<KeyInfo>}
|
|
298
|
-
*/
|
|
299
|
-
async findKeyByName (name) {
|
|
300
|
-
if (!validateKeyName(name)) {
|
|
301
|
-
return throwDelayed(errcode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME))
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const dsname = DsInfoName(name)
|
|
305
|
-
try {
|
|
306
|
-
const res = await this.store.get(dsname)
|
|
307
|
-
return JSON.parse(uint8ArrayToString(res))
|
|
308
|
-
} catch (/** @type {any} */ err) {
|
|
309
|
-
return throwDelayed(errcode(new Error(`Key '${name}' does not exist. ${err.message}`), codes.ERR_KEY_NOT_FOUND))
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* Remove an existing key.
|
|
315
|
-
*
|
|
316
|
-
* @param {string} name - The local key name; must already exist.
|
|
317
|
-
* @returns {Promise<KeyInfo>}
|
|
318
|
-
*/
|
|
319
|
-
async removeKey (name) {
|
|
320
|
-
const self = this
|
|
321
|
-
if (!validateKeyName(name) || name === 'self') {
|
|
322
|
-
return throwDelayed(errcode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME))
|
|
323
|
-
}
|
|
324
|
-
const dsname = DsName(name)
|
|
325
|
-
const keyInfo = await self.findKeyByName(name)
|
|
326
|
-
const batch = self.store.batch()
|
|
327
|
-
batch.delete(dsname)
|
|
328
|
-
batch.delete(DsInfoName(name))
|
|
329
|
-
await batch.commit()
|
|
330
|
-
return keyInfo
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Rename a key
|
|
335
|
-
*
|
|
336
|
-
* @param {string} oldName - The old local key name; must already exist.
|
|
337
|
-
* @param {string} newName - The new local key name; must not already exist.
|
|
338
|
-
* @returns {Promise<KeyInfo>}
|
|
339
|
-
*/
|
|
340
|
-
async renameKey (oldName, newName) {
|
|
341
|
-
const self = this
|
|
342
|
-
if (!validateKeyName(oldName) || oldName === 'self') {
|
|
343
|
-
return throwDelayed(errcode(new Error(`Invalid old key name '${oldName}'`), codes.ERR_OLD_KEY_NAME_INVALID))
|
|
344
|
-
}
|
|
345
|
-
if (!validateKeyName(newName) || newName === 'self') {
|
|
346
|
-
return throwDelayed(errcode(new Error(`Invalid new key name '${newName}'`), codes.ERR_NEW_KEY_NAME_INVALID))
|
|
347
|
-
}
|
|
348
|
-
const oldDsname = DsName(oldName)
|
|
349
|
-
const newDsname = DsName(newName)
|
|
350
|
-
const oldInfoName = DsInfoName(oldName)
|
|
351
|
-
const newInfoName = DsInfoName(newName)
|
|
352
|
-
|
|
353
|
-
const exists = await self.store.has(newDsname)
|
|
354
|
-
if (exists) return throwDelayed(errcode(new Error(`Key '${newName}' already exists`), codes.ERR_KEY_ALREADY_EXISTS))
|
|
355
|
-
|
|
356
|
-
try {
|
|
357
|
-
const pem = await self.store.get(oldDsname)
|
|
358
|
-
const res = await self.store.get(oldInfoName)
|
|
359
|
-
|
|
360
|
-
const keyInfo = JSON.parse(uint8ArrayToString(res))
|
|
361
|
-
keyInfo.name = newName
|
|
362
|
-
const batch = self.store.batch()
|
|
363
|
-
batch.put(newDsname, pem)
|
|
364
|
-
batch.put(newInfoName, uint8ArrayFromString(JSON.stringify(keyInfo)))
|
|
365
|
-
batch.delete(oldDsname)
|
|
366
|
-
batch.delete(oldInfoName)
|
|
367
|
-
await batch.commit()
|
|
368
|
-
return keyInfo
|
|
369
|
-
} catch (/** @type {any} */ err) {
|
|
370
|
-
return throwDelayed(err)
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Export an existing key as a PEM encrypted PKCS #8 string
|
|
376
|
-
*
|
|
377
|
-
* @param {string} name - The local key name; must already exist.
|
|
378
|
-
* @param {string} password - The password
|
|
379
|
-
* @returns {Promise<string>}
|
|
380
|
-
*/
|
|
381
|
-
async exportKey (name, password) {
|
|
382
|
-
if (!validateKeyName(name)) {
|
|
383
|
-
return throwDelayed(errcode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME))
|
|
384
|
-
}
|
|
385
|
-
if (!password) {
|
|
386
|
-
return throwDelayed(errcode(new Error('Password is required'), codes.ERR_PASSWORD_REQUIRED))
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
const dsname = DsName(name)
|
|
390
|
-
try {
|
|
391
|
-
const res = await this.store.get(dsname)
|
|
392
|
-
const pem = uint8ArrayToString(res)
|
|
393
|
-
/** @type {string} */
|
|
394
|
-
const dek = privates.get(this).dek
|
|
395
|
-
const privateKey = await crypto.keys.import(pem, dek)
|
|
396
|
-
return privateKey.export(password)
|
|
397
|
-
} catch (/** @type {any} */ err) {
|
|
398
|
-
return throwDelayed(err)
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* Import a new key from a PEM encoded PKCS #8 string
|
|
404
|
-
*
|
|
405
|
-
* @param {string} name - The local key name; must not already exist.
|
|
406
|
-
* @param {string} pem - The PEM encoded PKCS #8 string
|
|
407
|
-
* @param {string} password - The password.
|
|
408
|
-
* @returns {Promise<KeyInfo>}
|
|
409
|
-
*/
|
|
410
|
-
async importKey (name, pem, password) {
|
|
411
|
-
const self = this
|
|
412
|
-
if (!validateKeyName(name) || name === 'self') {
|
|
413
|
-
return throwDelayed(errcode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME))
|
|
414
|
-
}
|
|
415
|
-
if (!pem) {
|
|
416
|
-
return throwDelayed(errcode(new Error('PEM encoded key is required'), codes.ERR_PEM_REQUIRED))
|
|
417
|
-
}
|
|
418
|
-
const dsname = DsName(name)
|
|
419
|
-
const exists = await self.store.has(dsname)
|
|
420
|
-
if (exists) return throwDelayed(errcode(new Error(`Key '${name}' already exists`), codes.ERR_KEY_ALREADY_EXISTS))
|
|
421
|
-
|
|
422
|
-
let privateKey
|
|
423
|
-
try {
|
|
424
|
-
privateKey = await crypto.keys.import(pem, password)
|
|
425
|
-
} catch (/** @type {any} */ err) {
|
|
426
|
-
return throwDelayed(errcode(new Error('Cannot read the key, most likely the password is wrong'), codes.ERR_CANNOT_READ_KEY))
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
let kid
|
|
430
|
-
try {
|
|
431
|
-
kid = await privateKey.id()
|
|
432
|
-
/** @type {string} */
|
|
433
|
-
const dek = privates.get(this).dek
|
|
434
|
-
pem = await privateKey.export(dek)
|
|
435
|
-
} catch (/** @type {any} */ err) {
|
|
436
|
-
return throwDelayed(err)
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
const keyInfo = {
|
|
440
|
-
name: name,
|
|
441
|
-
id: kid
|
|
442
|
-
}
|
|
443
|
-
const batch = self.store.batch()
|
|
444
|
-
batch.put(dsname, uint8ArrayFromString(pem))
|
|
445
|
-
batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
|
|
446
|
-
await batch.commit()
|
|
447
|
-
|
|
448
|
-
return keyInfo
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
/**
|
|
452
|
-
* Import a peer key
|
|
453
|
-
*
|
|
454
|
-
* @param {string} name - The local key name; must not already exist.
|
|
455
|
-
* @param {PeerId} peer - The PEM encoded PKCS #8 string
|
|
456
|
-
* @returns {Promise<KeyInfo>}
|
|
457
|
-
*/
|
|
458
|
-
async importPeer (name, peer) {
|
|
459
|
-
const self = this
|
|
460
|
-
if (!validateKeyName(name)) {
|
|
461
|
-
return throwDelayed(errcode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME))
|
|
462
|
-
}
|
|
463
|
-
if (!peer || !peer.privKey) {
|
|
464
|
-
return throwDelayed(errcode(new Error('Peer.privKey is required'), codes.ERR_MISSING_PRIVATE_KEY))
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
const privateKey = peer.privKey
|
|
468
|
-
const dsname = DsName(name)
|
|
469
|
-
const exists = await self.store.has(dsname)
|
|
470
|
-
if (exists) return throwDelayed(errcode(new Error(`Key '${name}' already exists`), codes.ERR_KEY_ALREADY_EXISTS))
|
|
471
|
-
|
|
472
|
-
try {
|
|
473
|
-
const kid = await privateKey.id()
|
|
474
|
-
/** @type {string} */
|
|
475
|
-
const dek = privates.get(this).dek
|
|
476
|
-
const pem = await privateKey.export(dek)
|
|
477
|
-
const keyInfo = {
|
|
478
|
-
name: name,
|
|
479
|
-
id: kid
|
|
480
|
-
}
|
|
481
|
-
const batch = self.store.batch()
|
|
482
|
-
batch.put(dsname, uint8ArrayFromString(pem))
|
|
483
|
-
batch.put(DsInfoName(name), uint8ArrayFromString(JSON.stringify(keyInfo)))
|
|
484
|
-
await batch.commit()
|
|
485
|
-
return keyInfo
|
|
486
|
-
} catch (/** @type {any} */ err) {
|
|
487
|
-
return throwDelayed(err)
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
/**
|
|
492
|
-
* Gets the private key as PEM encoded PKCS #8 string.
|
|
493
|
-
*
|
|
494
|
-
* @param {string} name
|
|
495
|
-
* @returns {Promise<string>}
|
|
496
|
-
*/
|
|
497
|
-
async _getPrivateKey (name) {
|
|
498
|
-
if (!validateKeyName(name)) {
|
|
499
|
-
return throwDelayed(errcode(new Error(`Invalid key name '${name}'`), codes.ERR_INVALID_KEY_NAME))
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
try {
|
|
503
|
-
const dsname = DsName(name)
|
|
504
|
-
const res = await this.store.get(dsname)
|
|
505
|
-
return uint8ArrayToString(res)
|
|
506
|
-
} catch (/** @type {any} */ err) {
|
|
507
|
-
return throwDelayed(errcode(new Error(`Key '${name}' does not exist. ${err.message}`), codes.ERR_KEY_NOT_FOUND))
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
/**
|
|
512
|
-
* Rotate keychain password and re-encrypt all assosciated keys
|
|
513
|
-
*
|
|
514
|
-
* @param {string} oldPass - The old local keychain password
|
|
515
|
-
* @param {string} newPass - The new local keychain password
|
|
516
|
-
*/
|
|
517
|
-
async rotateKeychainPass (oldPass, newPass) {
|
|
518
|
-
if (typeof oldPass !== 'string') {
|
|
519
|
-
return throwDelayed(errcode(new Error(`Invalid old pass type '${typeof oldPass}'`), codes.ERR_INVALID_OLD_PASS_TYPE))
|
|
520
|
-
}
|
|
521
|
-
if (typeof newPass !== 'string') {
|
|
522
|
-
return throwDelayed(errcode(new Error(`Invalid new pass type '${typeof newPass}'`), codes.ERR_INVALID_NEW_PASS_TYPE))
|
|
523
|
-
}
|
|
524
|
-
if (newPass.length < 20) {
|
|
525
|
-
return throwDelayed(errcode(new Error(`Invalid pass length ${newPass.length}`), codes.ERR_INVALID_PASS_LENGTH))
|
|
526
|
-
}
|
|
527
|
-
log('recreating keychain')
|
|
528
|
-
const oldDek = privates.get(this).dek
|
|
529
|
-
this.opts.pass = newPass
|
|
530
|
-
const newDek = newPass
|
|
531
|
-
? crypto.pbkdf2(
|
|
532
|
-
newPass,
|
|
533
|
-
this.opts.dek.salt,
|
|
534
|
-
this.opts.dek.iterationCount,
|
|
535
|
-
this.opts.dek.keyLength,
|
|
536
|
-
this.opts.dek.hash)
|
|
537
|
-
: ''
|
|
538
|
-
privates.set(this, { dek: newDek })
|
|
539
|
-
const keys = await this.listKeys()
|
|
540
|
-
for (const key of keys) {
|
|
541
|
-
const res = await this.store.get(DsName(key.name))
|
|
542
|
-
const pem = uint8ArrayToString(res)
|
|
543
|
-
const privateKey = await crypto.keys.import(pem, oldDek)
|
|
544
|
-
const password = newDek.toString()
|
|
545
|
-
const keyAsPEM = await privateKey.export(password)
|
|
546
|
-
|
|
547
|
-
// Update stored key
|
|
548
|
-
const batch = this.store.batch()
|
|
549
|
-
const keyInfo = {
|
|
550
|
-
name: key.name,
|
|
551
|
-
id: key.id
|
|
552
|
-
}
|
|
553
|
-
batch.put(DsName(key.name), uint8ArrayFromString(keyAsPEM))
|
|
554
|
-
batch.put(DsInfoName(key.name), uint8ArrayFromString(JSON.stringify(keyInfo)))
|
|
555
|
-
await batch.commit()
|
|
556
|
-
}
|
|
557
|
-
log('keychain reconstructed')
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
module.exports = Keychain
|