@libp2p/noise 12.0.1 → 16.1.4-8484de8a2
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 +95 -0
- package/dist/index.min.js +16 -20
- package/dist/index.min.js.map +7 -0
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +1 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/crypto/index.browser.d.ts +2 -0
- package/dist/src/crypto/index.browser.d.ts.map +1 -0
- package/dist/src/crypto/index.browser.js +3 -0
- package/dist/src/crypto/index.browser.js.map +1 -0
- package/dist/src/crypto/index.d.ts +3 -0
- package/dist/src/crypto/index.d.ts.map +1 -0
- package/dist/src/crypto/index.js +188 -0
- package/dist/src/crypto/index.js.map +1 -0
- package/dist/src/crypto/js.d.ts.map +1 -1
- package/dist/src/crypto/js.js +18 -17
- package/dist/src/crypto/js.js.map +1 -1
- package/dist/src/crypto.d.ts +11 -10
- package/dist/src/crypto.d.ts.map +1 -1
- package/dist/src/crypto.js +10 -1
- package/dist/src/crypto.js.map +1 -1
- package/dist/src/encoder.d.ts +5 -10
- package/dist/src/encoder.d.ts.map +1 -1
- package/dist/src/encoder.js +10 -51
- package/dist/src/encoder.js.map +1 -1
- package/dist/src/errors.d.ts +6 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +9 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +50 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +38 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/logger.d.ts +9 -10
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +39 -28
- package/dist/src/logger.js.map +1 -1
- package/dist/src/metrics.d.ts +1 -1
- package/dist/src/metrics.d.ts.map +1 -1
- package/dist/src/noise.d.ts +33 -30
- package/dist/src/noise.d.ts.map +1 -1
- package/dist/src/noise.js +122 -78
- package/dist/src/noise.js.map +1 -1
- package/dist/src/nonce.d.ts +2 -3
- package/dist/src/nonce.d.ts.map +1 -1
- package/dist/src/nonce.js +3 -2
- package/dist/src/nonce.js.map +1 -1
- package/dist/src/performHandshake.d.ts +5 -0
- package/dist/src/performHandshake.d.ts.map +1 -0
- package/dist/src/performHandshake.js +69 -0
- package/dist/src/performHandshake.js.map +1 -0
- package/dist/src/proto/payload.d.ts +4 -3
- package/dist/src/proto/payload.d.ts.map +1 -1
- package/dist/src/proto/payload.js +48 -29
- package/dist/src/proto/payload.js.map +1 -1
- package/dist/src/protocol.d.ts +71 -0
- package/dist/src/protocol.d.ts.map +1 -0
- package/dist/src/protocol.js +257 -0
- package/dist/src/protocol.js.map +1 -0
- package/dist/src/types.d.ts +98 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils.d.ts +10 -19
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +159 -57
- package/dist/src/utils.js.map +1 -1
- package/package.json +43 -48
- package/src/constants.ts +1 -0
- package/src/crypto/index.browser.ts +3 -0
- package/src/crypto/index.ts +219 -0
- package/src/crypto/js.ts +25 -27
- package/src/crypto.ts +21 -10
- package/src/encoder.ts +10 -67
- package/src/errors.ts +10 -0
- package/src/index.ts +54 -6
- package/src/logger.ts +46 -32
- package/src/metrics.ts +1 -1
- package/src/noise.ts +176 -131
- package/src/nonce.ts +7 -7
- package/src/performHandshake.ts +91 -0
- package/src/proto/payload.proto +2 -1
- package/src/proto/payload.ts +53 -31
- package/src/protocol.ts +313 -0
- package/src/types.ts +105 -0
- package/src/utils.ts +189 -79
- package/dist/src/@types/basic.d.ts +0 -5
- package/dist/src/@types/basic.d.ts.map +0 -1
- package/dist/src/@types/basic.js +0 -2
- package/dist/src/@types/basic.js.map +0 -1
- package/dist/src/@types/handshake-interface.d.ts +0 -15
- package/dist/src/@types/handshake-interface.d.ts.map +0 -1
- package/dist/src/@types/handshake-interface.js +0 -2
- package/dist/src/@types/handshake-interface.js.map +0 -1
- package/dist/src/@types/handshake.d.ts +0 -40
- package/dist/src/@types/handshake.d.ts.map +0 -1
- package/dist/src/@types/handshake.js +0 -2
- package/dist/src/@types/handshake.js.map +0 -1
- package/dist/src/@types/libp2p.d.ts +0 -10
- package/dist/src/@types/libp2p.d.ts.map +0 -1
- package/dist/src/@types/libp2p.js +0 -2
- package/dist/src/@types/libp2p.js.map +0 -1
- package/dist/src/crypto/streaming.d.ts +0 -7
- package/dist/src/crypto/streaming.d.ts.map +0 -1
- package/dist/src/crypto/streaming.js +0 -50
- package/dist/src/crypto/streaming.js.map +0 -1
- package/dist/src/handshake-xx.d.ts +0 -33
- package/dist/src/handshake-xx.d.ts.map +0 -1
- package/dist/src/handshake-xx.js +0 -139
- package/dist/src/handshake-xx.js.map +0 -1
- package/dist/src/handshakes/abstract-handshake.d.ts +0 -36
- package/dist/src/handshakes/abstract-handshake.d.ts.map +0 -1
- package/dist/src/handshakes/abstract-handshake.js +0 -140
- package/dist/src/handshakes/abstract-handshake.js.map +0 -1
- package/dist/src/handshakes/xx.d.ts +0 -18
- package/dist/src/handshakes/xx.d.ts.map +0 -1
- package/dist/src/handshakes/xx.js +0 -161
- package/dist/src/handshakes/xx.js.map +0 -1
- package/src/@types/basic.ts +0 -5
- package/src/@types/handshake-interface.ts +0 -12
- package/src/@types/handshake.ts +0 -48
- package/src/@types/libp2p.ts +0 -10
- package/src/crypto/streaming.ts +0 -58
- package/src/handshake-xx.ts +0 -177
- package/src/handshakes/abstract-handshake.ts +0 -180
- package/src/handshakes/xx.ts +0 -184
package/src/utils.ts
CHANGED
|
@@ -1,111 +1,221 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { publicKeyFromProtobuf, publicKeyToProtobuf } from '@libp2p/crypto/keys'
|
|
2
|
+
import { StreamMessageEvent, UnexpectedPeerError } from '@libp2p/interface'
|
|
3
|
+
import { AbstractMessageStream, LengthPrefixedDecoder } from '@libp2p/utils'
|
|
4
|
+
import { Uint8ArrayList } from 'uint8arraylist'
|
|
3
5
|
import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
|
|
4
6
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
import { CHACHA_TAG_LENGTH, NOISE_MSG_MAX_LENGTH_BYTES, NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG } from './constants.ts'
|
|
8
|
+
import { uint16BEEncode, uint16BEDecode } from './encoder.ts'
|
|
9
|
+
import { NoiseHandshakePayload } from './proto/payload.js'
|
|
10
|
+
import type { MetricsRegistry } from './metrics.ts'
|
|
11
|
+
import type { NoiseExtensions } from './proto/payload.js'
|
|
12
|
+
import type { HandshakeResult } from './types.ts'
|
|
13
|
+
import type { AbortOptions, MessageStream, PrivateKey, PublicKey, StreamCloseEvent } from '@libp2p/interface'
|
|
14
|
+
import type { SendResult } from '@libp2p/utils'
|
|
15
|
+
|
|
16
|
+
export async function createHandshakePayload (
|
|
17
|
+
privateKey: PrivateKey,
|
|
18
|
+
staticPublicKey: Uint8Array | Uint8ArrayList,
|
|
12
19
|
extensions?: NoiseExtensions
|
|
13
|
-
): Promise<
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
if (localPeer.publicKey == null) {
|
|
17
|
-
throw new Error('PublicKey was missing from local PeerId')
|
|
18
|
-
}
|
|
20
|
+
): Promise<Uint8Array | Uint8ArrayList> {
|
|
21
|
+
const identitySig = await privateKey.sign(getSignaturePayload(staticPublicKey))
|
|
19
22
|
|
|
20
|
-
return
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
return NoiseHandshakePayload.encode({
|
|
24
|
+
identityKey: publicKeyToProtobuf(privateKey.publicKey),
|
|
25
|
+
identitySig,
|
|
23
26
|
extensions
|
|
24
|
-
)
|
|
27
|
+
})
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
export function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
):
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
extensions: extensions ?? { webtransportCerthashes: [] }
|
|
36
|
-
}).subarray()
|
|
37
|
-
}
|
|
30
|
+
export async function decodeHandshakePayload (
|
|
31
|
+
payloadBytes: Uint8Array | Uint8ArrayList,
|
|
32
|
+
remoteStaticKey?: Uint8Array | Uint8ArrayList,
|
|
33
|
+
remoteIdentityKey?: PublicKey
|
|
34
|
+
): Promise<NoiseHandshakePayload> {
|
|
35
|
+
try {
|
|
36
|
+
const payload = NoiseHandshakePayload.decode(payloadBytes)
|
|
37
|
+
const publicKey = publicKeyFromProtobuf(payload.identityKey)
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
39
|
+
if (remoteIdentityKey?.equals(publicKey) === false) {
|
|
40
|
+
throw new Error(`Payload identity key ${publicKey} does not match expected remote identity key ${remoteIdentityKey}`)
|
|
41
|
+
}
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
if (!remoteStaticKey) {
|
|
44
|
+
throw new Error('Remote static does not exist')
|
|
45
|
+
}
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
}
|
|
47
|
+
const signaturePayload = getSignaturePayload(remoteStaticKey)
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
49
|
+
if (!(await publicKey.verify(signaturePayload, payload.identitySig))) {
|
|
50
|
+
throw new Error('Invalid payload signature')
|
|
51
|
+
}
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
return payload
|
|
54
|
+
} catch (e) {
|
|
55
|
+
throw new UnexpectedPeerError((e as Error).message)
|
|
56
|
+
}
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
export function
|
|
59
|
+
export function getSignaturePayload (publicKey: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList {
|
|
58
60
|
const prefix = uint8ArrayFromString('noise-libp2p-static-key:')
|
|
59
|
-
return uint8ArrayConcat([prefix, publicKey], prefix.length + publicKey.length)
|
|
60
|
-
}
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*
|
|
65
|
-
* @param {bytes} noiseStaticKey - owner's noise static key
|
|
66
|
-
* @param {bytes} payload - decoded payload
|
|
67
|
-
* @param {PeerId} remotePeer - owner's libp2p peer ID
|
|
68
|
-
* @returns {Promise<PeerId>} - peer ID of payload owner
|
|
69
|
-
*/
|
|
70
|
-
export async function verifySignedPayload (
|
|
71
|
-
noiseStaticKey: bytes,
|
|
72
|
-
payload: NoiseHandshakePayload,
|
|
73
|
-
remotePeer: PeerId
|
|
74
|
-
): Promise<PeerId> {
|
|
75
|
-
// Unmarshaling from PublicKey protobuf
|
|
76
|
-
const payloadPeerId = await peerIdFromKeys(payload.identityKey)
|
|
77
|
-
if (!payloadPeerId.equals(remotePeer)) {
|
|
78
|
-
throw new Error(`Payload identity key ${payloadPeerId.toString()} does not match expected remote peer ${remotePeer.toString()}`)
|
|
62
|
+
if (publicKey instanceof Uint8Array) {
|
|
63
|
+
return uint8ArrayConcat([prefix, publicKey], prefix.length + publicKey.length)
|
|
79
64
|
}
|
|
80
|
-
const generatedPayload = getHandshakePayload(noiseStaticKey)
|
|
81
65
|
|
|
82
|
-
|
|
83
|
-
|
|
66
|
+
publicKey.prepend(prefix)
|
|
67
|
+
|
|
68
|
+
return publicKey
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
class EncryptedMessageStream extends AbstractMessageStream {
|
|
72
|
+
private stream: MessageStream
|
|
73
|
+
private handshake: HandshakeResult
|
|
74
|
+
private metrics?: MetricsRegistry
|
|
75
|
+
private decoder: LengthPrefixedDecoder
|
|
76
|
+
|
|
77
|
+
constructor (stream: MessageStream, handshake: HandshakeResult, metrics?: MetricsRegistry) {
|
|
78
|
+
super({
|
|
79
|
+
log: stream.log,
|
|
80
|
+
inactivityTimeout: stream.inactivityTimeout,
|
|
81
|
+
maxReadBufferLength: stream.maxReadBufferLength,
|
|
82
|
+
direction: stream.direction
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
this.stream = stream
|
|
86
|
+
this.handshake = handshake
|
|
87
|
+
this.metrics = metrics
|
|
88
|
+
this.decoder = new LengthPrefixedDecoder({
|
|
89
|
+
lengthDecoder: uint16BEDecode,
|
|
90
|
+
maxBufferSize: 16 * 1024 * 1024,
|
|
91
|
+
encodingLength: () => 2
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
const noiseOnMessageDecrypt = (evt: StreamMessageEvent): void => {
|
|
95
|
+
try {
|
|
96
|
+
for (const buf of this.decoder.decode(evt.data)) {
|
|
97
|
+
this.onData(this.decrypt(buf))
|
|
98
|
+
}
|
|
99
|
+
} catch (err: any) {
|
|
100
|
+
this.abort(err)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
this.stream.addEventListener('message', noiseOnMessageDecrypt)
|
|
104
|
+
|
|
105
|
+
const noiseOnClose = (evt: StreamCloseEvent): void => {
|
|
106
|
+
if (evt.error != null) {
|
|
107
|
+
if (evt.local === true) {
|
|
108
|
+
this.abort(evt.error)
|
|
109
|
+
} else {
|
|
110
|
+
this.onRemoteReset()
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
this.onTransportClosed()
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
this.stream.addEventListener('close', noiseOnClose)
|
|
117
|
+
|
|
118
|
+
const noiseOnDrain = (): void => {
|
|
119
|
+
this.safeDispatchEvent('drain')
|
|
120
|
+
}
|
|
121
|
+
this.stream.addEventListener('drain', noiseOnDrain)
|
|
122
|
+
|
|
123
|
+
const noiseOnRemoteCloseWrite = (): void => {
|
|
124
|
+
this.onRemoteCloseWrite()
|
|
125
|
+
}
|
|
126
|
+
this.stream.addEventListener('remoteCloseWrite', noiseOnRemoteCloseWrite)
|
|
84
127
|
}
|
|
85
128
|
|
|
86
|
-
|
|
87
|
-
|
|
129
|
+
encrypt (chunk: Uint8Array | Uint8ArrayList): Uint8ArrayList {
|
|
130
|
+
const output = new Uint8ArrayList()
|
|
131
|
+
|
|
132
|
+
for (let i = 0; i < chunk.byteLength; i += NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG) {
|
|
133
|
+
let end = i + NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG
|
|
134
|
+
if (end > chunk.byteLength) {
|
|
135
|
+
end = chunk.byteLength
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let data: Uint8Array | Uint8ArrayList
|
|
139
|
+
|
|
140
|
+
if (chunk instanceof Uint8Array) {
|
|
141
|
+
data = this.handshake.encrypt(chunk.subarray(i, end))
|
|
142
|
+
} else {
|
|
143
|
+
data = this.handshake.encrypt(chunk.sublist(i, end))
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
this.metrics?.encryptedPackets.increment()
|
|
147
|
+
|
|
148
|
+
output.append(uint16BEEncode(data.byteLength))
|
|
149
|
+
output.append(data)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return output
|
|
88
153
|
}
|
|
89
154
|
|
|
90
|
-
|
|
155
|
+
decrypt (chunk: Uint8Array | Uint8ArrayList): Uint8ArrayList {
|
|
156
|
+
const output = new Uint8ArrayList()
|
|
157
|
+
|
|
158
|
+
for (let i = 0; i < chunk.byteLength; i += NOISE_MSG_MAX_LENGTH_BYTES) {
|
|
159
|
+
let end = i + NOISE_MSG_MAX_LENGTH_BYTES
|
|
160
|
+
if (end > chunk.byteLength) {
|
|
161
|
+
end = chunk.byteLength
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (end - CHACHA_TAG_LENGTH < i) {
|
|
165
|
+
throw new Error('Invalid chunk')
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
let encrypted: Uint8Array | Uint8ArrayList
|
|
169
|
+
|
|
170
|
+
if (chunk instanceof Uint8Array) {
|
|
171
|
+
encrypted = chunk.subarray(i, end)
|
|
172
|
+
} else {
|
|
173
|
+
encrypted = chunk.sublist(i, end)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// memory allocation is not cheap so reuse the encrypted Uint8Array
|
|
177
|
+
// see https://github.com/ChainSafe/js-libp2p-noise/pull/242#issue-1422126164
|
|
178
|
+
// this is ok because chacha20 reads bytes one by one and don't reread after that
|
|
179
|
+
// it's also tested in https://github.com/ChainSafe/as-chacha20poly1305/pull/1/files#diff-25252846b58979dcaf4e41d47b3eadd7e4f335e7fb98da6c049b1f9cd011f381R48
|
|
180
|
+
const dst = chunk.subarray(i, end - CHACHA_TAG_LENGTH)
|
|
181
|
+
try {
|
|
182
|
+
const plaintext = this.handshake.decrypt(encrypted, dst)
|
|
183
|
+
this.metrics?.decryptedPackets.increment()
|
|
184
|
+
|
|
185
|
+
output.append(plaintext)
|
|
186
|
+
} catch (e) {
|
|
187
|
+
this.metrics?.decryptErrors.increment()
|
|
188
|
+
throw e
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return output
|
|
193
|
+
}
|
|
91
194
|
|
|
92
|
-
|
|
195
|
+
close (options?: AbortOptions): Promise<void> {
|
|
196
|
+
return this.stream.close(options)
|
|
197
|
+
}
|
|
93
198
|
|
|
94
|
-
|
|
95
|
-
|
|
199
|
+
sendPause (): void {
|
|
200
|
+
this.stream.pause()
|
|
96
201
|
}
|
|
97
202
|
|
|
98
|
-
|
|
99
|
-
|
|
203
|
+
sendResume (): void {
|
|
204
|
+
this.stream.resume()
|
|
205
|
+
}
|
|
100
206
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
return false
|
|
207
|
+
sendReset (err: Error): void {
|
|
208
|
+
this.stream.abort(err)
|
|
104
209
|
}
|
|
105
210
|
|
|
106
|
-
|
|
107
|
-
return
|
|
211
|
+
sendData (data: Uint8ArrayList): SendResult {
|
|
212
|
+
return {
|
|
213
|
+
sentBytes: data.byteLength,
|
|
214
|
+
canSendMore: this.stream.send(this.encrypt(data))
|
|
215
|
+
}
|
|
108
216
|
}
|
|
217
|
+
}
|
|
109
218
|
|
|
110
|
-
|
|
219
|
+
export function toMessageStream (connection: MessageStream, handshake: HandshakeResult, metrics?: MetricsRegistry): MessageStream {
|
|
220
|
+
return new EncryptedMessageStream(connection, handshake, metrics)
|
|
111
221
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../../../src/@types/basic.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,UAAU,CAAA;AAC9B,MAAM,MAAM,OAAO,GAAG,UAAU,CAAA;AAChC,MAAM,MAAM,OAAO,GAAG,UAAU,CAAA;AAEhC,MAAM,MAAM,MAAM,GAAG,MAAM,CAAA"}
|
package/dist/src/@types/basic.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"basic.js","sourceRoot":"","sources":["../../../src/@types/basic.ts"],"names":[],"mappings":""}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { bytes } from './basic.js';
|
|
2
|
-
import type { NoiseSession } from './handshake.js';
|
|
3
|
-
import type { NoiseExtensions } from '../proto/payload.js';
|
|
4
|
-
import type { PeerId } from '@libp2p/interface/peer-id';
|
|
5
|
-
export interface IHandshake {
|
|
6
|
-
session: NoiseSession;
|
|
7
|
-
remotePeer: PeerId;
|
|
8
|
-
remoteExtensions: NoiseExtensions;
|
|
9
|
-
encrypt: (plaintext: bytes, session: NoiseSession) => bytes;
|
|
10
|
-
decrypt: (ciphertext: bytes, session: NoiseSession, dst?: Uint8Array) => {
|
|
11
|
-
plaintext: bytes;
|
|
12
|
-
valid: boolean;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=handshake-interface.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-interface.d.ts","sourceRoot":"","sources":["../../../src/@types/handshake-interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,YAAY,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,eAAe,CAAA;IACjC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,KAAK,KAAK,CAAA;IAC3D,OAAO,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,UAAU,KAAK;QAAE,SAAS,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;CAC9G"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-interface.js","sourceRoot":"","sources":["../../../src/@types/handshake-interface.ts"],"names":[],"mappings":""}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { bytes, bytes32, uint64 } from './basic.js';
|
|
2
|
-
import type { KeyPair } from './libp2p.js';
|
|
3
|
-
import type { Nonce } from '../nonce.js';
|
|
4
|
-
export type Hkdf = [bytes, bytes, bytes];
|
|
5
|
-
export interface MessageBuffer {
|
|
6
|
-
ne: bytes32;
|
|
7
|
-
ns: bytes;
|
|
8
|
-
ciphertext: bytes;
|
|
9
|
-
}
|
|
10
|
-
export interface CipherState {
|
|
11
|
-
k: bytes32;
|
|
12
|
-
n: Nonce;
|
|
13
|
-
}
|
|
14
|
-
export interface SymmetricState {
|
|
15
|
-
cs: CipherState;
|
|
16
|
-
ck: bytes32;
|
|
17
|
-
h: bytes32;
|
|
18
|
-
}
|
|
19
|
-
export interface HandshakeState {
|
|
20
|
-
ss: SymmetricState;
|
|
21
|
-
s: KeyPair;
|
|
22
|
-
e?: KeyPair;
|
|
23
|
-
rs: bytes32;
|
|
24
|
-
re: bytes32;
|
|
25
|
-
psk: bytes32;
|
|
26
|
-
}
|
|
27
|
-
export interface NoiseSession {
|
|
28
|
-
hs: HandshakeState;
|
|
29
|
-
h?: bytes32;
|
|
30
|
-
cs1?: CipherState;
|
|
31
|
-
cs2?: CipherState;
|
|
32
|
-
mc: uint64;
|
|
33
|
-
i: boolean;
|
|
34
|
-
}
|
|
35
|
-
export interface INoisePayload {
|
|
36
|
-
identityKey: bytes;
|
|
37
|
-
identitySig: bytes;
|
|
38
|
-
data: bytes;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=handshake.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../src/@types/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAExC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAA;IACX,EAAE,EAAE,KAAK,CAAA;IACT,UAAU,EAAE,KAAK,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,OAAO,CAAA;IAGV,CAAC,EAAE,KAAK,CAAA;CACT;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,WAAW,CAAA;IACf,EAAE,EAAE,OAAO,CAAA;IACX,CAAC,EAAE,OAAO,CAAA;CACX;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,cAAc,CAAA;IAClB,CAAC,EAAE,OAAO,CAAA;IACV,CAAC,CAAC,EAAE,OAAO,CAAA;IACX,EAAE,EAAE,OAAO,CAAA;IACX,EAAE,EAAE,OAAO,CAAA;IACX,GAAG,EAAE,OAAO,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,cAAc,CAAA;IAClB,CAAC,CAAC,EAAE,OAAO,CAAA;IACX,GAAG,CAAC,EAAE,WAAW,CAAA;IACjB,GAAG,CAAC,EAAE,WAAW,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,EAAE,OAAO,CAAA;CACX;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,KAAK,CAAA;IAClB,WAAW,EAAE,KAAK,CAAA;IAClB,IAAI,EAAE,KAAK,CAAA;CACZ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../src/@types/handshake.ts"],"names":[],"mappings":""}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { bytes32 } from './basic.js';
|
|
2
|
-
import type { NoiseExtensions } from '../proto/payload.js';
|
|
3
|
-
import type { ConnectionEncrypter } from '@libp2p/interface/connection-encrypter';
|
|
4
|
-
export interface KeyPair {
|
|
5
|
-
publicKey: bytes32;
|
|
6
|
-
privateKey: bytes32;
|
|
7
|
-
}
|
|
8
|
-
export interface INoiseConnection extends ConnectionEncrypter<NoiseExtensions> {
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=libp2p.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p.d.ts","sourceRoot":"","sources":["../../../src/@types/libp2p.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAEjF,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB,CAAC,eAAe,CAAC;CAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../../src/@types/libp2p.ts"],"names":[],"mappings":""}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { IHandshake } from '../@types/handshake-interface.js';
|
|
2
|
-
import type { MetricsRegistry } from '../metrics.js';
|
|
3
|
-
import type { Transform } from 'it-stream-types';
|
|
4
|
-
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
5
|
-
export declare function encryptStream(handshake: IHandshake, metrics?: MetricsRegistry): Transform<AsyncIterable<Uint8Array>>;
|
|
6
|
-
export declare function decryptStream(handshake: IHandshake, metrics?: MetricsRegistry): Transform<AsyncIterable<Uint8ArrayList>, AsyncIterable<Uint8Array>>;
|
|
7
|
-
//# sourceMappingURL=streaming.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../../src/crypto/streaming.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,wBAAgB,aAAa,CAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAiBrH;AAGD,wBAAgB,aAAa,CAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,CA4BpJ"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { TAG_LENGTH } from '@stablelib/chacha20poly1305';
|
|
2
|
-
import { NOISE_MSG_MAX_LENGTH_BYTES, NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG } from '../constants.js';
|
|
3
|
-
import { uint16BEEncode } from '../encoder.js';
|
|
4
|
-
// Returns generator that encrypts payload from the user
|
|
5
|
-
export function encryptStream(handshake, metrics) {
|
|
6
|
-
return async function* (source) {
|
|
7
|
-
for await (const chunk of source) {
|
|
8
|
-
for (let i = 0; i < chunk.length; i += NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG) {
|
|
9
|
-
let end = i + NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG;
|
|
10
|
-
if (end > chunk.length) {
|
|
11
|
-
end = chunk.length;
|
|
12
|
-
}
|
|
13
|
-
const data = handshake.encrypt(chunk.subarray(i, end), handshake.session);
|
|
14
|
-
metrics?.encryptedPackets.increment();
|
|
15
|
-
yield uint16BEEncode(data.byteLength);
|
|
16
|
-
yield data;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
// Decrypt received payload to the user
|
|
22
|
-
export function decryptStream(handshake, metrics) {
|
|
23
|
-
return async function* (source) {
|
|
24
|
-
for await (const chunk of source) {
|
|
25
|
-
for (let i = 0; i < chunk.length; i += NOISE_MSG_MAX_LENGTH_BYTES) {
|
|
26
|
-
let end = i + NOISE_MSG_MAX_LENGTH_BYTES;
|
|
27
|
-
if (end > chunk.length) {
|
|
28
|
-
end = chunk.length;
|
|
29
|
-
}
|
|
30
|
-
if (end - TAG_LENGTH < i) {
|
|
31
|
-
throw new Error('Invalid chunk');
|
|
32
|
-
}
|
|
33
|
-
const encrypted = chunk.subarray(i, end);
|
|
34
|
-
// memory allocation is not cheap so reuse the encrypted Uint8Array
|
|
35
|
-
// see https://github.com/ChainSafe/js-libp2p-noise/pull/242#issue-1422126164
|
|
36
|
-
// this is ok because chacha20 reads bytes one by one and don't reread after that
|
|
37
|
-
// it's also tested in https://github.com/ChainSafe/as-chacha20poly1305/pull/1/files#diff-25252846b58979dcaf4e41d47b3eadd7e4f335e7fb98da6c049b1f9cd011f381R48
|
|
38
|
-
const dst = chunk.subarray(i, end - TAG_LENGTH);
|
|
39
|
-
const { plaintext: decrypted, valid } = handshake.decrypt(encrypted, handshake.session, dst);
|
|
40
|
-
if (!valid) {
|
|
41
|
-
metrics?.decryptErrors.increment();
|
|
42
|
-
throw new Error('Failed to validate decrypted chunk');
|
|
43
|
-
}
|
|
44
|
-
metrics?.decryptedPackets.increment();
|
|
45
|
-
yield decrypted;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=streaming.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/crypto/streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,0BAA0B,EAAE,sCAAsC,EAAE,MAAM,iBAAiB,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAM9C,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAE,SAAqB,EAAE,OAAyB;IAC7E,OAAO,KAAK,SAAU,CAAC,EAAE,MAAM;QAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,sCAAsC,EAAE;gBAC7E,IAAI,GAAG,GAAG,CAAC,GAAG,sCAAsC,CAAA;gBACpD,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;oBACtB,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;iBACnB;gBAED,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;gBACzE,OAAO,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAA;gBAErC,MAAM,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACrC,MAAM,IAAI,CAAA;aACX;SACF;IACH,CAAC,CAAA;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,aAAa,CAAE,SAAqB,EAAE,OAAyB;IAC7E,OAAO,KAAK,SAAU,CAAC,EAAE,MAAM;QAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,0BAA0B,EAAE;gBACjE,IAAI,GAAG,GAAG,CAAC,GAAG,0BAA0B,CAAA;gBACxC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;oBACtB,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;iBACnB;gBAED,IAAI,GAAG,GAAG,UAAU,GAAG,CAAC,EAAE;oBACxB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;iBACjC;gBACD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;gBACxC,mEAAmE;gBACnE,6EAA6E;gBAC7E,iFAAiF;gBACjF,6JAA6J;gBAC7J,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,CAAA;gBAC/C,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;gBAC5F,IAAI,CAAC,KAAK,EAAE;oBACV,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,CAAA;oBAClC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;gBACD,OAAO,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAA;gBACrC,MAAM,SAAS,CAAA;aAChB;SACF;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { XX } from './handshakes/xx.js';
|
|
2
|
-
import type { bytes, bytes32 } from './@types/basic.js';
|
|
3
|
-
import type { IHandshake } from './@types/handshake-interface.js';
|
|
4
|
-
import type { NoiseSession } from './@types/handshake.js';
|
|
5
|
-
import type { KeyPair } from './@types/libp2p.js';
|
|
6
|
-
import type { ICryptoInterface } from './crypto.js';
|
|
7
|
-
import type { NoiseExtensions } from './proto/payload.js';
|
|
8
|
-
import type { PeerId } from '@libp2p/interface/peer-id';
|
|
9
|
-
import type { LengthPrefixedStream } from 'it-length-prefixed-stream';
|
|
10
|
-
export declare class XXHandshake implements IHandshake {
|
|
11
|
-
isInitiator: boolean;
|
|
12
|
-
session: NoiseSession;
|
|
13
|
-
remotePeer: PeerId;
|
|
14
|
-
remoteExtensions: NoiseExtensions;
|
|
15
|
-
protected payload: bytes;
|
|
16
|
-
protected connection: LengthPrefixedStream;
|
|
17
|
-
protected xx: XX;
|
|
18
|
-
protected staticKeypair: KeyPair;
|
|
19
|
-
private readonly prologue;
|
|
20
|
-
constructor(isInitiator: boolean, payload: bytes, prologue: bytes32, crypto: ICryptoInterface, staticKeypair: KeyPair, connection: LengthPrefixedStream, remotePeer?: PeerId, handshake?: XX);
|
|
21
|
-
propose(): Promise<void>;
|
|
22
|
-
exchange(): Promise<void>;
|
|
23
|
-
finish(): Promise<void>;
|
|
24
|
-
encrypt(plaintext: Uint8Array, session: NoiseSession): bytes;
|
|
25
|
-
decrypt(ciphertext: Uint8Array, session: NoiseSession, dst?: Uint8Array): {
|
|
26
|
-
plaintext: bytes;
|
|
27
|
-
valid: boolean;
|
|
28
|
-
};
|
|
29
|
-
getRemoteStaticKey(): bytes;
|
|
30
|
-
private getCS;
|
|
31
|
-
protected setRemoteNoiseExtension(e: NoiseExtensions | null | undefined): void;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=handshake-xx.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handshake-xx.d.ts","sourceRoot":"","sources":["../../src/handshake-xx.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAcvC,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAErE,qBAAa,WAAY,YAAW,UAAU;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,YAAY,CAAA;IACrB,UAAU,EAAG,MAAM,CAAA;IACnB,gBAAgB,EAAE,eAAe,CAAiC;IAEzE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAA;IACxB,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAA;IAC1C,SAAS,CAAC,EAAE,EAAE,EAAE,CAAA;IAChB,SAAS,CAAC,aAAa,EAAE,OAAO,CAAA;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGhC,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,KAAK,EACd,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,gBAAgB,EACxB,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,oBAAoB,EAChC,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,EAAE;IAeH,OAAO,IAAK,OAAO,CAAC,IAAI,CAAC;IAqBzB,QAAQ,IAAK,OAAO,CAAC,IAAI,CAAC;IAiC1B,MAAM,IAAK,OAAO,CAAC,IAAI,CAAC;IA4B9B,OAAO,CAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,KAAK;IAM7D,OAAO,CAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG;QAAE,SAAS,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE;IAM/G,kBAAkB,IAAK,KAAK;IAInC,OAAO,CAAC,KAAK;IAYb,SAAS,CAAC,uBAAuB,CAAE,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;CAKhF"}
|