@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.
Files changed (127) hide show
  1. package/README.md +95 -0
  2. package/dist/index.min.js +16 -20
  3. package/dist/index.min.js.map +7 -0
  4. package/dist/src/constants.d.ts +1 -0
  5. package/dist/src/constants.d.ts.map +1 -1
  6. package/dist/src/constants.js +1 -0
  7. package/dist/src/constants.js.map +1 -1
  8. package/dist/src/crypto/index.browser.d.ts +2 -0
  9. package/dist/src/crypto/index.browser.d.ts.map +1 -0
  10. package/dist/src/crypto/index.browser.js +3 -0
  11. package/dist/src/crypto/index.browser.js.map +1 -0
  12. package/dist/src/crypto/index.d.ts +3 -0
  13. package/dist/src/crypto/index.d.ts.map +1 -0
  14. package/dist/src/crypto/index.js +188 -0
  15. package/dist/src/crypto/index.js.map +1 -0
  16. package/dist/src/crypto/js.d.ts.map +1 -1
  17. package/dist/src/crypto/js.js +18 -17
  18. package/dist/src/crypto/js.js.map +1 -1
  19. package/dist/src/crypto.d.ts +11 -10
  20. package/dist/src/crypto.d.ts.map +1 -1
  21. package/dist/src/crypto.js +10 -1
  22. package/dist/src/crypto.js.map +1 -1
  23. package/dist/src/encoder.d.ts +5 -10
  24. package/dist/src/encoder.d.ts.map +1 -1
  25. package/dist/src/encoder.js +10 -51
  26. package/dist/src/encoder.js.map +1 -1
  27. package/dist/src/errors.d.ts +6 -0
  28. package/dist/src/errors.d.ts.map +1 -0
  29. package/dist/src/errors.js +9 -0
  30. package/dist/src/errors.js.map +1 -0
  31. package/dist/src/index.d.ts +50 -5
  32. package/dist/src/index.d.ts.map +1 -1
  33. package/dist/src/index.js +38 -1
  34. package/dist/src/index.js.map +1 -1
  35. package/dist/src/logger.d.ts +9 -10
  36. package/dist/src/logger.d.ts.map +1 -1
  37. package/dist/src/logger.js +39 -28
  38. package/dist/src/logger.js.map +1 -1
  39. package/dist/src/metrics.d.ts +1 -1
  40. package/dist/src/metrics.d.ts.map +1 -1
  41. package/dist/src/noise.d.ts +33 -30
  42. package/dist/src/noise.d.ts.map +1 -1
  43. package/dist/src/noise.js +122 -78
  44. package/dist/src/noise.js.map +1 -1
  45. package/dist/src/nonce.d.ts +2 -3
  46. package/dist/src/nonce.d.ts.map +1 -1
  47. package/dist/src/nonce.js +3 -2
  48. package/dist/src/nonce.js.map +1 -1
  49. package/dist/src/performHandshake.d.ts +5 -0
  50. package/dist/src/performHandshake.d.ts.map +1 -0
  51. package/dist/src/performHandshake.js +69 -0
  52. package/dist/src/performHandshake.js.map +1 -0
  53. package/dist/src/proto/payload.d.ts +4 -3
  54. package/dist/src/proto/payload.d.ts.map +1 -1
  55. package/dist/src/proto/payload.js +48 -29
  56. package/dist/src/proto/payload.js.map +1 -1
  57. package/dist/src/protocol.d.ts +71 -0
  58. package/dist/src/protocol.d.ts.map +1 -0
  59. package/dist/src/protocol.js +257 -0
  60. package/dist/src/protocol.js.map +1 -0
  61. package/dist/src/types.d.ts +98 -0
  62. package/dist/src/types.d.ts.map +1 -0
  63. package/dist/src/types.js +2 -0
  64. package/dist/src/types.js.map +1 -0
  65. package/dist/src/utils.d.ts +10 -19
  66. package/dist/src/utils.d.ts.map +1 -1
  67. package/dist/src/utils.js +159 -57
  68. package/dist/src/utils.js.map +1 -1
  69. package/package.json +43 -48
  70. package/src/constants.ts +1 -0
  71. package/src/crypto/index.browser.ts +3 -0
  72. package/src/crypto/index.ts +219 -0
  73. package/src/crypto/js.ts +25 -27
  74. package/src/crypto.ts +21 -10
  75. package/src/encoder.ts +10 -67
  76. package/src/errors.ts +10 -0
  77. package/src/index.ts +54 -6
  78. package/src/logger.ts +46 -32
  79. package/src/metrics.ts +1 -1
  80. package/src/noise.ts +176 -131
  81. package/src/nonce.ts +7 -7
  82. package/src/performHandshake.ts +91 -0
  83. package/src/proto/payload.proto +2 -1
  84. package/src/proto/payload.ts +53 -31
  85. package/src/protocol.ts +313 -0
  86. package/src/types.ts +105 -0
  87. package/src/utils.ts +189 -79
  88. package/dist/src/@types/basic.d.ts +0 -5
  89. package/dist/src/@types/basic.d.ts.map +0 -1
  90. package/dist/src/@types/basic.js +0 -2
  91. package/dist/src/@types/basic.js.map +0 -1
  92. package/dist/src/@types/handshake-interface.d.ts +0 -15
  93. package/dist/src/@types/handshake-interface.d.ts.map +0 -1
  94. package/dist/src/@types/handshake-interface.js +0 -2
  95. package/dist/src/@types/handshake-interface.js.map +0 -1
  96. package/dist/src/@types/handshake.d.ts +0 -40
  97. package/dist/src/@types/handshake.d.ts.map +0 -1
  98. package/dist/src/@types/handshake.js +0 -2
  99. package/dist/src/@types/handshake.js.map +0 -1
  100. package/dist/src/@types/libp2p.d.ts +0 -10
  101. package/dist/src/@types/libp2p.d.ts.map +0 -1
  102. package/dist/src/@types/libp2p.js +0 -2
  103. package/dist/src/@types/libp2p.js.map +0 -1
  104. package/dist/src/crypto/streaming.d.ts +0 -7
  105. package/dist/src/crypto/streaming.d.ts.map +0 -1
  106. package/dist/src/crypto/streaming.js +0 -50
  107. package/dist/src/crypto/streaming.js.map +0 -1
  108. package/dist/src/handshake-xx.d.ts +0 -33
  109. package/dist/src/handshake-xx.d.ts.map +0 -1
  110. package/dist/src/handshake-xx.js +0 -139
  111. package/dist/src/handshake-xx.js.map +0 -1
  112. package/dist/src/handshakes/abstract-handshake.d.ts +0 -36
  113. package/dist/src/handshakes/abstract-handshake.d.ts.map +0 -1
  114. package/dist/src/handshakes/abstract-handshake.js +0 -140
  115. package/dist/src/handshakes/abstract-handshake.js.map +0 -1
  116. package/dist/src/handshakes/xx.d.ts +0 -18
  117. package/dist/src/handshakes/xx.d.ts.map +0 -1
  118. package/dist/src/handshakes/xx.js +0 -161
  119. package/dist/src/handshakes/xx.js.map +0 -1
  120. package/src/@types/basic.ts +0 -5
  121. package/src/@types/handshake-interface.ts +0 -12
  122. package/src/@types/handshake.ts +0 -48
  123. package/src/@types/libp2p.ts +0 -10
  124. package/src/crypto/streaming.ts +0 -58
  125. package/src/handshake-xx.ts +0 -177
  126. package/src/handshakes/abstract-handshake.ts +0 -180
  127. package/src/handshakes/xx.ts +0 -184
package/src/utils.ts CHANGED
@@ -1,111 +1,221 @@
1
- import { unmarshalPublicKey, unmarshalPrivateKey } from '@libp2p/crypto/keys'
2
- import { peerIdFromKeys } from '@libp2p/peer-id'
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 { type NoiseExtensions, NoiseHandshakePayload } from './proto/payload.js'
6
- import type { bytes } from './@types/basic.js'
7
- import type { PeerId } from '@libp2p/interface/peer-id'
8
-
9
- export async function getPayload (
10
- localPeer: PeerId,
11
- staticPublicKey: bytes,
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<bytes> {
14
- const signedPayload = await signPayload(localPeer, getHandshakePayload(staticPublicKey))
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 createHandshakePayload(
21
- localPeer.publicKey,
22
- signedPayload,
23
+ return NoiseHandshakePayload.encode({
24
+ identityKey: publicKeyToProtobuf(privateKey.publicKey),
25
+ identitySig,
23
26
  extensions
24
- )
27
+ })
25
28
  }
26
29
 
27
- export function createHandshakePayload (
28
- libp2pPublicKey: Uint8Array,
29
- signedPayload: Uint8Array,
30
- extensions?: NoiseExtensions
31
- ): bytes {
32
- return NoiseHandshakePayload.encode({
33
- identityKey: libp2pPublicKey,
34
- identitySig: signedPayload,
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
- export async function signPayload (peerId: PeerId, payload: bytes): Promise<bytes> {
40
- if (peerId.privateKey == null) {
41
- throw new Error('PrivateKey was missing from PeerId')
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
- const privateKey = await unmarshalPrivateKey(peerId.privateKey)
43
+ if (!remoteStaticKey) {
44
+ throw new Error('Remote static does not exist')
45
+ }
45
46
 
46
- return privateKey.sign(payload)
47
- }
47
+ const signaturePayload = getSignaturePayload(remoteStaticKey)
48
48
 
49
- export async function getPeerIdFromPayload (payload: NoiseHandshakePayload): Promise<PeerId> {
50
- return peerIdFromKeys(payload.identityKey)
51
- }
49
+ if (!(await publicKey.verify(signaturePayload, payload.identitySig))) {
50
+ throw new Error('Invalid payload signature')
51
+ }
52
52
 
53
- export function decodePayload (payload: bytes | Uint8Array): NoiseHandshakePayload {
54
- return NoiseHandshakePayload.decode(payload)
53
+ return payload
54
+ } catch (e) {
55
+ throw new UnexpectedPeerError((e as Error).message)
56
+ }
55
57
  }
56
58
 
57
- export function getHandshakePayload (publicKey: bytes): bytes {
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
- * Verifies signed payload, throws on any irregularities.
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
- if (payloadPeerId.publicKey == null) {
83
- throw new Error('PublicKey was missing from PeerId')
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
- if (payload.identitySig == null) {
87
- throw new Error('Signature was missing from message')
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
- const publicKey = unmarshalPublicKey(payloadPeerId.publicKey)
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
- const valid = await publicKey.verify(generatedPayload, payload.identitySig)
195
+ close (options?: AbortOptions): Promise<void> {
196
+ return this.stream.close(options)
197
+ }
93
198
 
94
- if (!valid) {
95
- throw new Error("Static key doesn't match to peer that signed payload!")
199
+ sendPause (): void {
200
+ this.stream.pause()
96
201
  }
97
202
 
98
- return payloadPeerId
99
- }
203
+ sendResume (): void {
204
+ this.stream.resume()
205
+ }
100
206
 
101
- export function isValidPublicKey (pk: bytes): boolean {
102
- if (!(pk instanceof Uint8Array)) {
103
- return false
207
+ sendReset (err: Error): void {
208
+ this.stream.abort(err)
104
209
  }
105
210
 
106
- if (pk.length !== 32) {
107
- return false
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
- return true
219
+ export function toMessageStream (connection: MessageStream, handshake: HandshakeResult, metrics?: MetricsRegistry): MessageStream {
220
+ return new EncryptedMessageStream(connection, handshake, metrics)
111
221
  }
@@ -1,5 +0,0 @@
1
- export type bytes = Uint8Array;
2
- export type bytes32 = Uint8Array;
3
- export type bytes16 = Uint8Array;
4
- export type uint64 = number;
5
- //# sourceMappingURL=basic.d.ts.map
@@ -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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=basic.js.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=handshake-interface.js.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=handshake.js.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=libp2p.js.map
@@ -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"}