@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/dist/src/nonce.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { alloc as uint8ArrayAlloc } from 'uint8arrays/alloc';
1
2
  export const MIN_NONCE = 0;
2
3
  // For performance reasons, the nonce is represented as a JS `number`
3
4
  // Although JS `number` can safely represent integers up to 2 ** 53 - 1, we choose to only use
@@ -6,7 +7,7 @@ export const MIN_NONCE = 0;
6
7
  // The effect is that this implementation will need a new handshake to be performed after fewer messages are exchanged than other implementations with full uint64 nonces.
7
8
  // this MAX_NONCE is still a large number of messages, so the practical effect of this is negligible.
8
9
  export const MAX_NONCE = 0xffffffff;
9
- const ERR_MAX_NONCE = 'Cipherstate has reached maximum n, a new handshake must be performed';
10
+ const ERR_MAX_NONCE = 'Cipher state has reached maximum n, a new handshake must be performed';
10
11
  /**
11
12
  * The nonce is an uint that's increased over time.
12
13
  * Maintaining different representations help improve performance.
@@ -17,7 +18,7 @@ export class Nonce {
17
18
  view;
18
19
  constructor(n = MIN_NONCE) {
19
20
  this.n = n;
20
- this.bytes = new Uint8Array(12);
21
+ this.bytes = uint8ArrayAlloc(12);
21
22
  this.view = new DataView(this.bytes.buffer, this.bytes.byteOffset, this.bytes.byteLength);
22
23
  this.view.setUint32(4, n, true);
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nonce.js","sourceRoot":"","sources":["../../src/nonce.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAA;AAC1B,qEAAqE;AACrE,8FAA8F;AAC9F,oDAAoD;AACpD,+FAA+F;AAC/F,0KAA0K;AAC1K,qGAAqG;AACrG,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAA;AAEnC,MAAM,aAAa,GAAG,sEAAsE,CAAA;AAE5F;;;GAGG;AACH,MAAM,OAAO,KAAK;IACR,CAAC,CAAQ;IACA,KAAK,CAAO;IACZ,IAAI,CAAU;IAE/B,YAAa,CAAC,GAAG,SAAS;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACzF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,SAAS;QACP,IAAI,CAAC,CAAC,EAAE,CAAA;QACR,2FAA2F;QAC3F,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,CAAC,CAAA;IACf,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,CAAC,GAAG,SAAS,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;SAC/B;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"nonce.js","sourceRoot":"","sources":["../../src/nonce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE5D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAA;AAC1B,qEAAqE;AACrE,8FAA8F;AAC9F,oDAAoD;AACpD,+FAA+F;AAC/F,0KAA0K;AAC1K,qGAAqG;AACrG,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAA;AAEnC,MAAM,aAAa,GAAG,uEAAuE,CAAA;AAE7F;;;GAGG;AACH,MAAM,OAAO,KAAK;IACR,CAAC,CAAQ;IACA,KAAK,CAAY;IACjB,IAAI,CAAU;IAE/B,YAAa,CAAC,GAAG,SAAS;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACzF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,SAAS;QACP,IAAI,CAAC,CAAC,EAAE,CAAA;QACR,2FAA2F;QAC3F,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,CAAC,CAAA;IACf,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { HandshakeResult, HandshakeParams } from './types.js';
2
+ import type { AbortOptions } from '@libp2p/interface';
3
+ export declare function performHandshakeInitiator(init: HandshakeParams, options?: AbortOptions): Promise<HandshakeResult>;
4
+ export declare function performHandshakeResponder(init: HandshakeParams, options?: AbortOptions): Promise<HandshakeResult>;
5
+ //# sourceMappingURL=performHandshake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performHandshake.d.ts","sourceRoot":"","sources":["../../src/performHandshake.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,wBAAsB,yBAAyB,CAAE,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAwCxH;AAED,wBAAsB,yBAAyB,CAAE,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAoCxH"}
@@ -0,0 +1,69 @@
1
+ import { logLocalStaticKeys, logLocalEphemeralKeys, logRemoteEphemeralKey, logRemoteStaticKey, logCipherState } from './logger.js';
2
+ import { ZEROLEN, XXHandshakeState } from './protocol.js';
3
+ import { createHandshakePayload, decodeHandshakePayload } from './utils.js';
4
+ export async function performHandshakeInitiator(init, options) {
5
+ const { log, connection, crypto, privateKey, prologue, s, remoteIdentityKey, extensions } = init;
6
+ const payload = await createHandshakePayload(privateKey, s.publicKey, extensions);
7
+ const xx = new XXHandshakeState({
8
+ crypto,
9
+ protocolName: 'Noise_XX_25519_ChaChaPoly_SHA256',
10
+ initiator: true,
11
+ prologue,
12
+ s
13
+ });
14
+ logLocalStaticKeys(xx.s, log);
15
+ log.trace('Stage 0 - Initiator starting to send first message.');
16
+ await connection.write(xx.writeMessageA(ZEROLEN), options);
17
+ log.trace('Stage 0 - Initiator finished sending first message.');
18
+ logLocalEphemeralKeys(xx.e, log);
19
+ log.trace('Stage 1 - Initiator waiting to receive first message from responder...');
20
+ const plaintext = xx.readMessageB(await connection.read(options));
21
+ log.trace('Stage 1 - Initiator received the message.');
22
+ logRemoteEphemeralKey(xx.re, log);
23
+ logRemoteStaticKey(xx.rs, log);
24
+ log.trace("Initiator going to check remote's signature...");
25
+ const receivedPayload = await decodeHandshakePayload(plaintext, xx.rs, remoteIdentityKey);
26
+ log.trace('All good with the signature!');
27
+ log.trace('Stage 2 - Initiator sending third handshake message.');
28
+ await connection.write(xx.writeMessageC(payload), options);
29
+ log.trace('Stage 2 - Initiator sent message with signed payload.');
30
+ const [cs1, cs2] = xx.ss.split();
31
+ logCipherState(cs1, cs2, log);
32
+ return {
33
+ payload: receivedPayload,
34
+ encrypt: (plaintext) => cs1.encryptWithAd(ZEROLEN, plaintext),
35
+ decrypt: (ciphertext, dst) => cs2.decryptWithAd(ZEROLEN, ciphertext, dst)
36
+ };
37
+ }
38
+ export async function performHandshakeResponder(init, options) {
39
+ const { log, connection, crypto, privateKey, prologue, s, remoteIdentityKey, extensions } = init;
40
+ const payload = await createHandshakePayload(privateKey, s.publicKey, extensions);
41
+ const xx = new XXHandshakeState({
42
+ crypto,
43
+ protocolName: 'Noise_XX_25519_ChaChaPoly_SHA256',
44
+ initiator: false,
45
+ prologue,
46
+ s
47
+ });
48
+ logLocalStaticKeys(xx.s, log);
49
+ log.trace('Stage 0 - Responder waiting to receive first message.');
50
+ xx.readMessageA(await connection.read(options));
51
+ log.trace('Stage 0 - Responder received first message.');
52
+ logRemoteEphemeralKey(xx.re, log);
53
+ log.trace('Stage 1 - Responder sending out first message with signed payload and static key.');
54
+ await connection.write(xx.writeMessageB(payload), options);
55
+ log.trace('Stage 1 - Responder sent the second handshake message with signed payload.');
56
+ logLocalEphemeralKeys(xx.e, log);
57
+ log.trace('Stage 2 - Responder waiting for third handshake message...');
58
+ const plaintext = xx.readMessageC(await connection.read(options));
59
+ log.trace('Stage 2 - Responder received the message, finished handshake.');
60
+ const receivedPayload = await decodeHandshakePayload(plaintext, xx.rs, remoteIdentityKey);
61
+ const [cs1, cs2] = xx.ss.split();
62
+ logCipherState(cs1, cs2, log);
63
+ return {
64
+ payload: receivedPayload,
65
+ encrypt: (plaintext) => cs2.encryptWithAd(ZEROLEN, plaintext),
66
+ decrypt: (ciphertext, dst) => cs1.decryptWithAd(ZEROLEN, ciphertext, dst)
67
+ };
68
+ }
69
+ //# sourceMappingURL=performHandshake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performHandshake.js","sourceRoot":"","sources":["../../src/performHandshake.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
- import type { Codec } from 'protons-runtime';
1
+ import type { Codec, DecodeOptions } from 'protons-runtime';
2
2
  import type { Uint8ArrayList } from 'uint8arraylist';
3
3
  export interface NoiseExtensions {
4
4
  webtransportCerthashes: Uint8Array[];
5
+ streamMuxers: string[];
5
6
  }
6
7
  export declare namespace NoiseExtensions {
7
8
  const codec: () => Codec<NoiseExtensions>;
8
9
  const encode: (obj: Partial<NoiseExtensions>) => Uint8Array;
9
- const decode: (buf: Uint8Array | Uint8ArrayList) => NoiseExtensions;
10
+ const decode: (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<NoiseExtensions>) => NoiseExtensions;
10
11
  }
11
12
  export interface NoiseHandshakePayload {
12
13
  identityKey: Uint8Array;
@@ -16,6 +17,6 @@ export interface NoiseHandshakePayload {
16
17
  export declare namespace NoiseHandshakePayload {
17
18
  const codec: () => Codec<NoiseHandshakePayload>;
18
19
  const encode: (obj: Partial<NoiseHandshakePayload>) => Uint8Array;
19
- const decode: (buf: Uint8Array | Uint8ArrayList) => NoiseHandshakePayload;
20
+ const decode: (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<NoiseHandshakePayload>) => NoiseHandshakePayload;
20
21
  }
21
22
  //# sourceMappingURL=payload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../src/proto/payload.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,eAAe;IAC9B,sBAAsB,EAAE,UAAU,EAAE,CAAA;CACrC;AAED,yBAAiB,eAAe,CAAC;IAGxB,MAAM,KAAK,QAAO,MAAM,eAAe,CA0C7C,CAAA;IAEM,MAAM,MAAM,QAAS,QAAQ,eAAe,CAAC,KAAG,UAEtD,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,GAAG,cAAc,KAAG,eAEzD,CAAA;CACF;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,UAAU,CAAA;IACvB,WAAW,EAAE,UAAU,CAAA;IACvB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAED,yBAAiB,qBAAqB,CAAC;IAG9B,MAAM,KAAK,QAAO,MAAM,qBAAqB,CA2DnD,CAAA;IAEM,MAAM,MAAM,QAAS,QAAQ,qBAAqB,CAAC,KAAG,UAE5D,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,GAAG,cAAc,KAAG,qBAEzD,CAAA;CACF"}
1
+ {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../src/proto/payload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,eAAe;IAC9B,sBAAsB,EAAE,UAAU,EAAE,CAAA;IACpC,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,yBAAiB,eAAe,CAAC;IAGxB,MAAM,KAAK,QAAO,KAAK,CAAC,eAAe,CAgE7C,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,OAAO,CAAC,eAAe,CAAC,KAAG,UAEtD,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,UAAU,GAAG,cAAc,EAAE,OAAO,aAAa,CAAC,eAAe,CAAC,KAAG,eAEhG,CAAA;CACF;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,UAAU,CAAA;IACvB,WAAW,EAAE,UAAU,CAAA;IACvB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAED,yBAAiB,qBAAqB,CAAC;IAG9B,MAAM,KAAK,QAAO,KAAK,CAAC,qBAAqB,CA+DnD,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,OAAO,CAAC,qBAAqB,CAAC,KAAG,UAE5D,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,UAAU,GAAG,cAAc,EAAE,OAAO,aAAa,CAAC,qBAAqB,CAAC,KAAG,qBAEtG,CAAA;CACF"}
@@ -1,9 +1,5 @@
1
- /* eslint-disable import/export */
2
- /* eslint-disable complexity */
3
- /* eslint-disable @typescript-eslint/no-namespace */
4
- /* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
5
- /* eslint-disable @typescript-eslint/no-empty-interface */
6
- import { encodeMessage, decodeMessage, message } from 'protons-runtime';
1
+ import { decodeMessage, encodeMessage, MaxLengthError, message } from 'protons-runtime';
2
+ import { alloc as uint8ArrayAlloc } from 'uint8arrays/alloc';
7
3
  export var NoiseExtensions;
8
4
  (function (NoiseExtensions) {
9
5
  let _codec;
@@ -19,23 +15,42 @@ export var NoiseExtensions;
19
15
  w.bytes(value);
20
16
  }
21
17
  }
18
+ if (obj.streamMuxers != null) {
19
+ for (const value of obj.streamMuxers) {
20
+ w.uint32(18);
21
+ w.string(value);
22
+ }
23
+ }
22
24
  if (opts.lengthDelimited !== false) {
23
25
  w.ldelim();
24
26
  }
25
- }, (reader, length) => {
27
+ }, (reader, length, opts = {}) => {
26
28
  const obj = {
27
- webtransportCerthashes: []
29
+ webtransportCerthashes: [],
30
+ streamMuxers: []
28
31
  };
29
32
  const end = length == null ? reader.len : reader.pos + length;
30
33
  while (reader.pos < end) {
31
34
  const tag = reader.uint32();
32
35
  switch (tag >>> 3) {
33
- case 1:
36
+ case 1: {
37
+ if (opts.limits?.webtransportCerthashes != null && obj.webtransportCerthashes.length === opts.limits.webtransportCerthashes) {
38
+ throw new MaxLengthError('Decode error - map field "webtransportCerthashes" had too many elements');
39
+ }
34
40
  obj.webtransportCerthashes.push(reader.bytes());
35
41
  break;
36
- default:
42
+ }
43
+ case 2: {
44
+ if (opts.limits?.streamMuxers != null && obj.streamMuxers.length === opts.limits.streamMuxers) {
45
+ throw new MaxLengthError('Decode error - map field "streamMuxers" had too many elements');
46
+ }
47
+ obj.streamMuxers.push(reader.string());
48
+ break;
49
+ }
50
+ default: {
37
51
  reader.skipType(tag & 7);
38
52
  break;
53
+ }
39
54
  }
40
55
  }
41
56
  return obj;
@@ -46,8 +61,8 @@ export var NoiseExtensions;
46
61
  NoiseExtensions.encode = (obj) => {
47
62
  return encodeMessage(obj, NoiseExtensions.codec());
48
63
  };
49
- NoiseExtensions.decode = (buf) => {
50
- return decodeMessage(buf, NoiseExtensions.codec());
64
+ NoiseExtensions.decode = (buf, opts) => {
65
+ return decodeMessage(buf, NoiseExtensions.codec(), opts);
51
66
  };
52
67
  })(NoiseExtensions || (NoiseExtensions = {}));
53
68
  export var NoiseHandshakePayload;
@@ -59,44 +74,48 @@ export var NoiseHandshakePayload;
59
74
  if (opts.lengthDelimited !== false) {
60
75
  w.fork();
61
76
  }
62
- if (opts.writeDefaults === true || (obj.identityKey != null && obj.identityKey.byteLength > 0)) {
77
+ if ((obj.identityKey != null && obj.identityKey.byteLength > 0)) {
63
78
  w.uint32(10);
64
- w.bytes(obj.identityKey ?? new Uint8Array(0));
79
+ w.bytes(obj.identityKey);
65
80
  }
66
- if (opts.writeDefaults === true || (obj.identitySig != null && obj.identitySig.byteLength > 0)) {
81
+ if ((obj.identitySig != null && obj.identitySig.byteLength > 0)) {
67
82
  w.uint32(18);
68
- w.bytes(obj.identitySig ?? new Uint8Array(0));
83
+ w.bytes(obj.identitySig);
69
84
  }
70
85
  if (obj.extensions != null) {
71
86
  w.uint32(34);
72
- NoiseExtensions.codec().encode(obj.extensions, w, {
73
- writeDefaults: false
74
- });
87
+ NoiseExtensions.codec().encode(obj.extensions, w);
75
88
  }
76
89
  if (opts.lengthDelimited !== false) {
77
90
  w.ldelim();
78
91
  }
79
- }, (reader, length) => {
92
+ }, (reader, length, opts = {}) => {
80
93
  const obj = {
81
- identityKey: new Uint8Array(0),
82
- identitySig: new Uint8Array(0)
94
+ identityKey: uint8ArrayAlloc(0),
95
+ identitySig: uint8ArrayAlloc(0)
83
96
  };
84
97
  const end = length == null ? reader.len : reader.pos + length;
85
98
  while (reader.pos < end) {
86
99
  const tag = reader.uint32();
87
100
  switch (tag >>> 3) {
88
- case 1:
101
+ case 1: {
89
102
  obj.identityKey = reader.bytes();
90
103
  break;
91
- case 2:
104
+ }
105
+ case 2: {
92
106
  obj.identitySig = reader.bytes();
93
107
  break;
94
- case 4:
95
- obj.extensions = NoiseExtensions.codec().decode(reader, reader.uint32());
108
+ }
109
+ case 4: {
110
+ obj.extensions = NoiseExtensions.codec().decode(reader, reader.uint32(), {
111
+ limits: opts.limits?.extensions
112
+ });
96
113
  break;
97
- default:
114
+ }
115
+ default: {
98
116
  reader.skipType(tag & 7);
99
117
  break;
118
+ }
100
119
  }
101
120
  }
102
121
  return obj;
@@ -107,8 +126,8 @@ export var NoiseHandshakePayload;
107
126
  NoiseHandshakePayload.encode = (obj) => {
108
127
  return encodeMessage(obj, NoiseHandshakePayload.codec());
109
128
  };
110
- NoiseHandshakePayload.decode = (buf) => {
111
- return decodeMessage(buf, NoiseHandshakePayload.codec());
129
+ NoiseHandshakePayload.decode = (buf, opts) => {
130
+ return decodeMessage(buf, NoiseHandshakePayload.codec(), opts);
112
131
  };
113
132
  })(NoiseHandshakePayload || (NoiseHandshakePayload = {}));
114
133
  //# sourceMappingURL=payload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../src/proto/payload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../src/proto/payload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { Uint8ArrayList } from 'uint8arraylist';
2
+ import { Nonce } from './nonce.js';
3
+ import type { ICipherState, ISymmetricState, IHandshakeState, KeyPair, ICrypto } from './types.js';
4
+ export declare const ZEROLEN: Uint8Array<ArrayBufferLike>;
5
+ interface ICipherStateWithKey extends ICipherState {
6
+ k: Uint8Array;
7
+ }
8
+ export declare class CipherState implements ICipherState {
9
+ k?: Uint8Array;
10
+ n: Nonce;
11
+ private readonly crypto;
12
+ constructor(crypto: ICrypto, k?: Uint8Array | undefined, n?: number);
13
+ hasKey(): this is ICipherStateWithKey;
14
+ encryptWithAd(ad: Uint8Array, plaintext: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList;
15
+ decryptWithAd(ad: Uint8Array, ciphertext: Uint8Array | Uint8ArrayList, dst?: Uint8Array): Uint8Array | Uint8ArrayList;
16
+ }
17
+ export declare class SymmetricState implements ISymmetricState {
18
+ cs: CipherState;
19
+ ck: Uint8Array;
20
+ h: Uint8Array;
21
+ private readonly crypto;
22
+ constructor(crypto: ICrypto, protocolName: string);
23
+ mixKey(ikm: Uint8Array): void;
24
+ mixHash(data: Uint8Array | Uint8ArrayList): void;
25
+ encryptAndHash(plaintext: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList;
26
+ decryptAndHash(ciphertext: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList;
27
+ split(): [CipherState, CipherState];
28
+ }
29
+ export interface HandshakeStateInit {
30
+ crypto: ICrypto;
31
+ protocolName: string;
32
+ initiator: boolean;
33
+ prologue: Uint8Array;
34
+ s?: KeyPair;
35
+ e?: KeyPair;
36
+ rs?: Uint8Array | Uint8ArrayList;
37
+ re?: Uint8Array | Uint8ArrayList;
38
+ }
39
+ export declare abstract class AbstractHandshakeState implements IHandshakeState {
40
+ ss: SymmetricState;
41
+ s?: KeyPair;
42
+ e?: KeyPair;
43
+ rs?: Uint8Array | Uint8ArrayList;
44
+ re?: Uint8Array | Uint8ArrayList;
45
+ initiator: boolean;
46
+ protected readonly crypto: ICrypto;
47
+ constructor(init: HandshakeStateInit);
48
+ protected writeE(): Uint8Array;
49
+ protected writeS(): Uint8Array | Uint8ArrayList;
50
+ protected writeEE(): void;
51
+ protected writeES(): void;
52
+ protected writeSE(): void;
53
+ protected readE(message: Uint8ArrayList, offset?: number): void;
54
+ protected readS(message: Uint8ArrayList, offset?: number): number;
55
+ protected readEE(): void;
56
+ protected readES(): void;
57
+ protected readSE(): void;
58
+ }
59
+ /**
60
+ * A IHandshakeState that's optimized for the XX pattern
61
+ */
62
+ export declare class XXHandshakeState extends AbstractHandshakeState {
63
+ writeMessageA(payload: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList;
64
+ writeMessageB(payload: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList;
65
+ writeMessageC(payload: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList;
66
+ readMessageA(message: Uint8ArrayList): Uint8Array | Uint8ArrayList;
67
+ readMessageB(message: Uint8ArrayList): Uint8Array | Uint8ArrayList;
68
+ readMessageC(message: Uint8ArrayList): Uint8Array | Uint8ArrayList;
69
+ }
70
+ export {};
71
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,257 @@
1
+ import { Uint8ArrayList } from 'uint8arraylist';
2
+ import { fromString as uint8ArrayFromString } from 'uint8arrays';
3
+ import { alloc as uint8ArrayAlloc } from 'uint8arrays/alloc';
4
+ import { InvalidCryptoExchangeError } from './errors.js';
5
+ import { Nonce } from './nonce.js';
6
+ // Code in this file is a direct translation of a subset of the noise protocol https://noiseprotocol.org/noise.html,
7
+ // agnostic to libp2p's usage of noise
8
+ export const ZEROLEN = uint8ArrayAlloc(0);
9
+ export class CipherState {
10
+ k;
11
+ n;
12
+ crypto;
13
+ constructor(crypto, k = undefined, n = 0) {
14
+ this.crypto = crypto;
15
+ this.k = k;
16
+ this.n = new Nonce(n);
17
+ }
18
+ hasKey() {
19
+ return Boolean(this.k);
20
+ }
21
+ encryptWithAd(ad, plaintext) {
22
+ if (!this.hasKey()) {
23
+ return plaintext;
24
+ }
25
+ this.n.assertValue();
26
+ const e = this.crypto.encrypt(plaintext, this.n.getBytes(), ad, this.k);
27
+ this.n.increment();
28
+ return e;
29
+ }
30
+ decryptWithAd(ad, ciphertext, dst) {
31
+ if (!this.hasKey()) {
32
+ return ciphertext;
33
+ }
34
+ this.n.assertValue();
35
+ const plaintext = this.crypto.decrypt(ciphertext, this.n.getBytes(), ad, this.k, dst);
36
+ this.n.increment();
37
+ return plaintext;
38
+ }
39
+ }
40
+ export class SymmetricState {
41
+ cs;
42
+ ck;
43
+ h;
44
+ crypto;
45
+ constructor(crypto, protocolName) {
46
+ this.crypto = crypto;
47
+ const protocolNameBytes = uint8ArrayFromString(protocolName, 'utf-8');
48
+ this.h = hashProtocolName(crypto, protocolNameBytes);
49
+ this.ck = this.h;
50
+ this.cs = new CipherState(crypto);
51
+ }
52
+ mixKey(ikm) {
53
+ const [ck, tempK] = this.crypto.hkdf(this.ck, ikm);
54
+ this.ck = ck;
55
+ this.cs = new CipherState(this.crypto, tempK);
56
+ }
57
+ mixHash(data) {
58
+ this.h = this.crypto.hash(new Uint8ArrayList(this.h, data));
59
+ }
60
+ encryptAndHash(plaintext) {
61
+ const ciphertext = this.cs.encryptWithAd(this.h, plaintext);
62
+ this.mixHash(ciphertext);
63
+ return ciphertext;
64
+ }
65
+ decryptAndHash(ciphertext) {
66
+ const plaintext = this.cs.decryptWithAd(this.h, ciphertext);
67
+ this.mixHash(ciphertext);
68
+ return plaintext;
69
+ }
70
+ split() {
71
+ const [tempK1, tempK2] = this.crypto.hkdf(this.ck, ZEROLEN);
72
+ return [new CipherState(this.crypto, tempK1), new CipherState(this.crypto, tempK2)];
73
+ }
74
+ }
75
+ export class AbstractHandshakeState {
76
+ ss;
77
+ s;
78
+ e;
79
+ rs;
80
+ re;
81
+ initiator;
82
+ crypto;
83
+ constructor(init) {
84
+ const { crypto, protocolName, prologue, initiator, s, e, rs, re } = init;
85
+ this.crypto = crypto;
86
+ this.ss = new SymmetricState(crypto, protocolName);
87
+ this.ss.mixHash(prologue);
88
+ this.initiator = initiator;
89
+ this.s = s;
90
+ this.e = e;
91
+ this.rs = rs;
92
+ this.re = re;
93
+ }
94
+ writeE() {
95
+ if (this.e) {
96
+ throw new Error('ephemeral keypair is already set');
97
+ }
98
+ const e = this.crypto.generateKeypair();
99
+ this.ss.mixHash(e.publicKey);
100
+ this.e = e;
101
+ return e.publicKey;
102
+ }
103
+ writeS() {
104
+ if (!this.s) {
105
+ throw new Error('static keypair is not set');
106
+ }
107
+ return this.ss.encryptAndHash(this.s.publicKey);
108
+ }
109
+ writeEE() {
110
+ if (!this.e) {
111
+ throw new Error('ephemeral keypair is not set');
112
+ }
113
+ if (!this.re) {
114
+ throw new Error('remote ephemeral public key is not set');
115
+ }
116
+ this.ss.mixKey(this.crypto.dh(this.e, this.re));
117
+ }
118
+ writeES() {
119
+ if (this.initiator) {
120
+ if (!this.e) {
121
+ throw new Error('ephemeral keypair is not set');
122
+ }
123
+ if (!this.rs) {
124
+ throw new Error('remote static public key is not set');
125
+ }
126
+ this.ss.mixKey(this.crypto.dh(this.e, this.rs));
127
+ }
128
+ else {
129
+ if (!this.s) {
130
+ throw new Error('static keypair is not set');
131
+ }
132
+ if (!this.re) {
133
+ throw new Error('remote ephemeral public key is not set');
134
+ }
135
+ this.ss.mixKey(this.crypto.dh(this.s, this.re));
136
+ }
137
+ }
138
+ writeSE() {
139
+ if (this.initiator) {
140
+ if (!this.s) {
141
+ throw new Error('static keypair is not set');
142
+ }
143
+ if (!this.re) {
144
+ throw new Error('remote ephemeral public key is not set');
145
+ }
146
+ this.ss.mixKey(this.crypto.dh(this.s, this.re));
147
+ }
148
+ else {
149
+ if (!this.e) {
150
+ throw new Error('ephemeral keypair is not set');
151
+ }
152
+ if (!this.rs) {
153
+ throw new Error('remote static public key is not set');
154
+ }
155
+ this.ss.mixKey(this.crypto.dh(this.e, this.rs));
156
+ }
157
+ }
158
+ readE(message, offset = 0) {
159
+ if (this.re) {
160
+ throw new Error('remote ephemeral public key is already set');
161
+ }
162
+ if (message.byteLength < offset + 32) {
163
+ throw new Error('message is not long enough');
164
+ }
165
+ this.re = message.sublist(offset, offset + 32);
166
+ this.ss.mixHash(this.re);
167
+ }
168
+ readS(message, offset = 0) {
169
+ if (this.rs) {
170
+ throw new Error('remote static public key is already set');
171
+ }
172
+ const cipherLength = 32 + (this.ss.cs.hasKey() ? 16 : 0);
173
+ if (message.byteLength < offset + cipherLength) {
174
+ throw new Error('message is not long enough');
175
+ }
176
+ const temp = message.sublist(offset, offset + cipherLength);
177
+ this.rs = this.ss.decryptAndHash(temp);
178
+ return cipherLength;
179
+ }
180
+ readEE() {
181
+ this.writeEE();
182
+ }
183
+ readES() {
184
+ this.writeES();
185
+ }
186
+ readSE() {
187
+ this.writeSE();
188
+ }
189
+ }
190
+ /**
191
+ * A IHandshakeState that's optimized for the XX pattern
192
+ */
193
+ export class XXHandshakeState extends AbstractHandshakeState {
194
+ // e
195
+ writeMessageA(payload) {
196
+ return new Uint8ArrayList(this.writeE(), this.ss.encryptAndHash(payload));
197
+ }
198
+ // e, ee, s, es
199
+ writeMessageB(payload) {
200
+ const e = this.writeE();
201
+ this.writeEE();
202
+ const encS = this.writeS();
203
+ this.writeES();
204
+ return new Uint8ArrayList(e, encS, this.ss.encryptAndHash(payload));
205
+ }
206
+ // s, se
207
+ writeMessageC(payload) {
208
+ const encS = this.writeS();
209
+ this.writeSE();
210
+ return new Uint8ArrayList(encS, this.ss.encryptAndHash(payload));
211
+ }
212
+ // e
213
+ readMessageA(message) {
214
+ try {
215
+ this.readE(message);
216
+ return this.ss.decryptAndHash(message.sublist(32));
217
+ }
218
+ catch (e) {
219
+ throw new InvalidCryptoExchangeError(`handshake stage 0 validation fail: ${e.message}`);
220
+ }
221
+ }
222
+ // e, ee, s, es
223
+ readMessageB(message) {
224
+ try {
225
+ this.readE(message);
226
+ this.readEE();
227
+ const consumed = this.readS(message, 32);
228
+ this.readES();
229
+ return this.ss.decryptAndHash(message.sublist(32 + consumed));
230
+ }
231
+ catch (e) {
232
+ throw new InvalidCryptoExchangeError(`handshake stage 1 validation fail: ${e.message}`);
233
+ }
234
+ }
235
+ // s, se
236
+ readMessageC(message) {
237
+ try {
238
+ const consumed = this.readS(message);
239
+ this.readSE();
240
+ return this.ss.decryptAndHash(message.sublist(consumed));
241
+ }
242
+ catch (e) {
243
+ throw new InvalidCryptoExchangeError(`handshake stage 2 validation fail: ${e.message}`);
244
+ }
245
+ }
246
+ }
247
+ function hashProtocolName(crypto, protocolName) {
248
+ if (protocolName.length <= 32) {
249
+ const h = uint8ArrayAlloc(32);
250
+ h.set(protocolName);
251
+ return h;
252
+ }
253
+ else {
254
+ return crypto.hash(protocolName);
255
+ }
256
+ }
257
+ //# sourceMappingURL=protocol.js.map