@libp2p/noise 12.0.1

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 (98) hide show
  1. package/dist/index.min.js +27 -0
  2. package/dist/src/@types/basic.d.ts +5 -0
  3. package/dist/src/@types/basic.d.ts.map +1 -0
  4. package/dist/src/@types/basic.js +2 -0
  5. package/dist/src/@types/basic.js.map +1 -0
  6. package/dist/src/@types/handshake-interface.d.ts +15 -0
  7. package/dist/src/@types/handshake-interface.d.ts.map +1 -0
  8. package/dist/src/@types/handshake-interface.js +2 -0
  9. package/dist/src/@types/handshake-interface.js.map +1 -0
  10. package/dist/src/@types/handshake.d.ts +40 -0
  11. package/dist/src/@types/handshake.d.ts.map +1 -0
  12. package/dist/src/@types/handshake.js +2 -0
  13. package/dist/src/@types/handshake.js.map +1 -0
  14. package/dist/src/@types/libp2p.d.ts +10 -0
  15. package/dist/src/@types/libp2p.d.ts.map +1 -0
  16. package/dist/src/@types/libp2p.js +2 -0
  17. package/dist/src/@types/libp2p.js.map +1 -0
  18. package/dist/src/constants.d.ts +4 -0
  19. package/dist/src/constants.d.ts.map +1 -0
  20. package/dist/src/constants.js +4 -0
  21. package/dist/src/constants.js.map +1 -0
  22. package/dist/src/crypto/js.d.ts +3 -0
  23. package/dist/src/crypto/js.d.ts.map +1 -0
  24. package/dist/src/crypto/js.js +42 -0
  25. package/dist/src/crypto/js.js.map +1 -0
  26. package/dist/src/crypto/streaming.d.ts +7 -0
  27. package/dist/src/crypto/streaming.d.ts.map +1 -0
  28. package/dist/src/crypto/streaming.js +50 -0
  29. package/dist/src/crypto/streaming.js.map +1 -0
  30. package/dist/src/crypto.d.ts +13 -0
  31. package/dist/src/crypto.d.ts.map +1 -0
  32. package/dist/src/crypto.js +2 -0
  33. package/dist/src/crypto.js.map +1 -0
  34. package/dist/src/encoder.d.ts +15 -0
  35. package/dist/src/encoder.d.ts.map +1 -0
  36. package/dist/src/encoder.js +63 -0
  37. package/dist/src/encoder.js.map +1 -0
  38. package/dist/src/handshake-xx.d.ts +33 -0
  39. package/dist/src/handshake-xx.d.ts.map +1 -0
  40. package/dist/src/handshake-xx.js +139 -0
  41. package/dist/src/handshake-xx.js.map +1 -0
  42. package/dist/src/handshakes/abstract-handshake.d.ts +36 -0
  43. package/dist/src/handshakes/abstract-handshake.d.ts.map +1 -0
  44. package/dist/src/handshakes/abstract-handshake.js +140 -0
  45. package/dist/src/handshakes/abstract-handshake.js.map +1 -0
  46. package/dist/src/handshakes/xx.d.ts +18 -0
  47. package/dist/src/handshakes/xx.d.ts.map +1 -0
  48. package/dist/src/handshakes/xx.js +161 -0
  49. package/dist/src/handshakes/xx.js.map +1 -0
  50. package/dist/src/index.d.ts +7 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +6 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/dist/src/logger.d.ts +11 -0
  55. package/dist/src/logger.d.ts.map +1 -0
  56. package/dist/src/logger.js +45 -0
  57. package/dist/src/logger.js.map +1 -0
  58. package/dist/src/metrics.d.ts +4 -0
  59. package/dist/src/metrics.d.ts.map +1 -0
  60. package/dist/src/metrics.js +20 -0
  61. package/dist/src/metrics.js.map +1 -0
  62. package/dist/src/noise.d.ts +55 -0
  63. package/dist/src/noise.d.ts.map +1 -0
  64. package/dist/src/noise.js +130 -0
  65. package/dist/src/noise.js.map +1 -0
  66. package/dist/src/nonce.d.ts +18 -0
  67. package/dist/src/nonce.d.ts.map +1 -0
  68. package/dist/src/nonce.js +41 -0
  69. package/dist/src/nonce.js.map +1 -0
  70. package/dist/src/proto/payload.d.ts +21 -0
  71. package/dist/src/proto/payload.d.ts.map +1 -0
  72. package/dist/src/proto/payload.js +114 -0
  73. package/dist/src/proto/payload.js.map +1 -0
  74. package/dist/src/utils.d.ts +20 -0
  75. package/dist/src/utils.d.ts.map +1 -0
  76. package/dist/src/utils.js +74 -0
  77. package/dist/src/utils.js.map +1 -0
  78. package/package.json +99 -0
  79. package/src/@types/basic.ts +5 -0
  80. package/src/@types/handshake-interface.ts +12 -0
  81. package/src/@types/handshake.ts +48 -0
  82. package/src/@types/libp2p.ts +10 -0
  83. package/src/constants.ts +4 -0
  84. package/src/crypto/js.ts +58 -0
  85. package/src/crypto/streaming.ts +58 -0
  86. package/src/crypto.ts +16 -0
  87. package/src/encoder.ts +81 -0
  88. package/src/handshake-xx.ts +177 -0
  89. package/src/handshakes/abstract-handshake.ts +180 -0
  90. package/src/handshakes/xx.ts +184 -0
  91. package/src/index.ts +10 -0
  92. package/src/logger.ts +51 -0
  93. package/src/metrics.ts +32 -0
  94. package/src/noise.ts +192 -0
  95. package/src/nonce.ts +49 -0
  96. package/src/proto/payload.proto +11 -0
  97. package/src/proto/payload.ts +148 -0
  98. package/src/utils.ts +111 -0
@@ -0,0 +1,5 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=basic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.js","sourceRoot":"","sources":["../../../src/@types/basic.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handshake-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake-interface.js","sourceRoot":"","sources":["../../../src/@types/handshake-interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handshake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../src/@types/handshake.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=libp2p.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../../src/@types/libp2p.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export declare const NOISE_MSG_MAX_LENGTH_BYTES = 65535;
2
+ export declare const NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG: number;
3
+ export declare const DUMP_SESSION_KEYS: boolean;
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,QAAQ,CAAA;AAC/C,eAAO,MAAM,sCAAsC,QAAkC,CAAA;AAErF,eAAO,MAAM,iBAAiB,SAAsD,CAAA"}
@@ -0,0 +1,4 @@
1
+ export const NOISE_MSG_MAX_LENGTH_BYTES = 65535;
2
+ export const NOISE_MSG_MAX_LENGTH_BYTES_WITHOUT_TAG = NOISE_MSG_MAX_LENGTH_BYTES - 16;
3
+ export const DUMP_SESSION_KEYS = Boolean(globalThis.process?.env?.DUMP_SESSION_KEYS);
4
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAA;AAC/C,MAAM,CAAC,MAAM,sCAAsC,GAAG,0BAA0B,GAAG,EAAE,CAAA;AAErF,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ICryptoInterface } from '../crypto.js';
2
+ export declare const pureJsCrypto: ICryptoInterface;
3
+ //# sourceMappingURL=js.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.d.ts","sourceRoot":"","sources":["../../../src/crypto/js.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,eAAO,MAAM,YAAY,EAAE,gBAgD1B,CAAA"}
@@ -0,0 +1,42 @@
1
+ import { hkdf } from '@noble/hashes/hkdf';
2
+ import { sha256 } from '@noble/hashes/sha256';
3
+ import { ChaCha20Poly1305 } from '@stablelib/chacha20poly1305';
4
+ import * as x25519 from '@stablelib/x25519';
5
+ export const pureJsCrypto = {
6
+ hashSHA256(data) {
7
+ return sha256(data);
8
+ },
9
+ getHKDF(ck, ikm) {
10
+ const okm = hkdf(sha256, ikm, ck, undefined, 96);
11
+ const k1 = okm.subarray(0, 32);
12
+ const k2 = okm.subarray(32, 64);
13
+ const k3 = okm.subarray(64, 96);
14
+ return [k1, k2, k3];
15
+ },
16
+ generateX25519KeyPair() {
17
+ const keypair = x25519.generateKeyPair();
18
+ return {
19
+ publicKey: keypair.publicKey,
20
+ privateKey: keypair.secretKey
21
+ };
22
+ },
23
+ generateX25519KeyPairFromSeed(seed) {
24
+ const keypair = x25519.generateKeyPairFromSeed(seed);
25
+ return {
26
+ publicKey: keypair.publicKey,
27
+ privateKey: keypair.secretKey
28
+ };
29
+ },
30
+ generateX25519SharedKey(privateKey, publicKey) {
31
+ return x25519.sharedKey(privateKey, publicKey);
32
+ },
33
+ chaCha20Poly1305Encrypt(plaintext, nonce, ad, k) {
34
+ const ctx = new ChaCha20Poly1305(k);
35
+ return ctx.seal(nonce, plaintext, ad);
36
+ },
37
+ chaCha20Poly1305Decrypt(ciphertext, nonce, ad, k, dst) {
38
+ const ctx = new ChaCha20Poly1305(k);
39
+ return ctx.open(nonce, ciphertext, ad, dst);
40
+ }
41
+ };
42
+ //# sourceMappingURL=js.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.js","sourceRoot":"","sources":["../../../src/crypto/js.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAM3C,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C,UAAU,CAAE,IAAgB;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,CAAE,EAAW,EAAE,GAAe;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QAEhD,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC/B,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAE/B,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACrB,CAAC;IAED,qBAAqB;QACnB,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,CAAA;QAExC,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,SAAS;SAC9B,CAAA;IACH,CAAC;IAED,6BAA6B,CAAE,IAAgB;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAA;QAEpD,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,SAAS;SAC9B,CAAA;IACH,CAAC;IAED,uBAAuB,CAAE,UAAsB,EAAE,SAAqB;QACpE,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IAChD,CAAC;IAED,uBAAuB,CAAE,SAAqB,EAAE,KAAiB,EAAE,EAAc,EAAE,CAAU;QAC3F,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAEnC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;IACvC,CAAC;IAED,uBAAuB,CAAE,UAAsB,EAAE,KAAiB,EAAE,EAAc,EAAE,CAAU,EAAE,GAAgB;QAC9G,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAEnC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC;CACF,CAAA"}
@@ -0,0 +1,7 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,50 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,13 @@
1
+ import type { bytes32, bytes } from './@types/basic.js';
2
+ import type { Hkdf } from './@types/handshake.js';
3
+ import type { KeyPair } from './@types/libp2p.js';
4
+ export interface ICryptoInterface {
5
+ hashSHA256: (data: Uint8Array) => Uint8Array;
6
+ getHKDF: (ck: bytes32, ikm: Uint8Array) => Hkdf;
7
+ generateX25519KeyPair: () => KeyPair;
8
+ generateX25519KeyPairFromSeed: (seed: Uint8Array) => KeyPair;
9
+ generateX25519SharedKey: (privateKey: Uint8Array, publicKey: Uint8Array) => Uint8Array;
10
+ chaCha20Poly1305Encrypt: (plaintext: Uint8Array, nonce: Uint8Array, ad: Uint8Array, k: bytes32) => bytes;
11
+ chaCha20Poly1305Decrypt: (ciphertext: Uint8Array, nonce: Uint8Array, ad: Uint8Array, k: bytes32, dst?: Uint8Array) => bytes | null;
12
+ }
13
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,CAAA;IAE5C,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,CAAA;IAE/C,qBAAqB,EAAE,MAAM,OAAO,CAAA;IACpC,6BAA6B,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAA;IAC5D,uBAAuB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,KAAK,UAAU,CAAA;IAEtF,uBAAuB,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,KAAK,KAAK,CAAA;IACxG,uBAAuB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,UAAU,KAAK,KAAK,GAAG,IAAI,CAAA;CACnI"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { bytes } from './@types/basic.js';
2
+ import type { MessageBuffer } from './@types/handshake.js';
3
+ import type { LengthDecoderFunction } from 'it-length-prefixed';
4
+ export declare const uint16BEEncode: {
5
+ (value: number): Uint8Array;
6
+ bytes: number;
7
+ };
8
+ export declare const uint16BEDecode: LengthDecoderFunction;
9
+ export declare function encode0(message: MessageBuffer): bytes;
10
+ export declare function encode1(message: MessageBuffer): bytes;
11
+ export declare function encode2(message: MessageBuffer): bytes;
12
+ export declare function decode0(input: bytes): MessageBuffer;
13
+ export declare function decode1(input: bytes): MessageBuffer;
14
+ export declare function decode2(input: bytes): MessageBuffer;
15
+ //# sourceMappingURL=encoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../src/encoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAW/D,eAAO,MAAM,cAAc;YAAW,MAAM,GAAG,UAAU;;CAIxD,CAAA;AAGD,eAAO,MAAM,cAAc,EAAE,qBAQ5B,CAAA;AAKD,wBAAgB,OAAO,CAAE,OAAO,EAAE,aAAa,GAAG,KAAK,CAEtD;AAED,wBAAgB,OAAO,CAAE,OAAO,EAAE,aAAa,GAAG,KAAK,CAEtD;AAED,wBAAgB,OAAO,CAAE,OAAO,EAAE,aAAa,GAAG,KAAK,CAEtD;AAED,wBAAgB,OAAO,CAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAUpD;AAED,wBAAgB,OAAO,CAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAUpD;AAED,wBAAgB,OAAO,CAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAUpD"}
@@ -0,0 +1,63 @@
1
+ import { concat as uint8ArrayConcat } from 'uint8arrays/concat';
2
+ const allocUnsafe = (len) => {
3
+ if (globalThis.Buffer) {
4
+ return globalThis.Buffer.allocUnsafe(len);
5
+ }
6
+ return new Uint8Array(len);
7
+ };
8
+ export const uint16BEEncode = (value) => {
9
+ const target = allocUnsafe(2);
10
+ new DataView(target.buffer, target.byteOffset, target.byteLength).setUint16(0, value, false);
11
+ return target;
12
+ };
13
+ uint16BEEncode.bytes = 2;
14
+ export const uint16BEDecode = (data) => {
15
+ if (data.length < 2)
16
+ throw RangeError('Could not decode int16BE');
17
+ if (data instanceof Uint8Array) {
18
+ return new DataView(data.buffer, data.byteOffset, data.byteLength).getUint16(0, false);
19
+ }
20
+ return data.getUint16(0);
21
+ };
22
+ uint16BEDecode.bytes = 2;
23
+ // Note: IK and XX encoder usage is opposite (XX uses in stages encode0 where IK uses encode1)
24
+ export function encode0(message) {
25
+ return uint8ArrayConcat([message.ne, message.ciphertext], message.ne.length + message.ciphertext.length);
26
+ }
27
+ export function encode1(message) {
28
+ return uint8ArrayConcat([message.ne, message.ns, message.ciphertext], message.ne.length + message.ns.length + message.ciphertext.length);
29
+ }
30
+ export function encode2(message) {
31
+ return uint8ArrayConcat([message.ns, message.ciphertext], message.ns.length + message.ciphertext.length);
32
+ }
33
+ export function decode0(input) {
34
+ if (input.length < 32) {
35
+ throw new Error('Cannot decode stage 0 MessageBuffer: length less than 32 bytes.');
36
+ }
37
+ return {
38
+ ne: input.subarray(0, 32),
39
+ ciphertext: input.subarray(32, input.length),
40
+ ns: new Uint8Array(0)
41
+ };
42
+ }
43
+ export function decode1(input) {
44
+ if (input.length < 80) {
45
+ throw new Error('Cannot decode stage 1 MessageBuffer: length less than 80 bytes.');
46
+ }
47
+ return {
48
+ ne: input.subarray(0, 32),
49
+ ns: input.subarray(32, 80),
50
+ ciphertext: input.subarray(80, input.length)
51
+ };
52
+ }
53
+ export function decode2(input) {
54
+ if (input.length < 48) {
55
+ throw new Error('Cannot decode stage 2 MessageBuffer: length less than 48 bytes.');
56
+ }
57
+ return {
58
+ ne: new Uint8Array(0),
59
+ ns: input.subarray(0, 48),
60
+ ciphertext: input.subarray(48, input.length)
61
+ };
62
+ }
63
+ //# sourceMappingURL=encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../src/encoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,139 @@
1
+ import { InvalidCryptoExchangeError, UnexpectedPeerError } from '@libp2p/interface/errors';
2
+ import { decode0, decode1, decode2, encode0, encode1, encode2 } from './encoder.js';
3
+ import { XX } from './handshakes/xx.js';
4
+ import { logger, logLocalStaticKeys, logLocalEphemeralKeys, logRemoteEphemeralKey, logRemoteStaticKey, logCipherState } from './logger.js';
5
+ import { decodePayload, getPeerIdFromPayload, verifySignedPayload } from './utils.js';
6
+ export class XXHandshake {
7
+ isInitiator;
8
+ session;
9
+ remotePeer;
10
+ remoteExtensions = { webtransportCerthashes: [] };
11
+ payload;
12
+ connection;
13
+ xx;
14
+ staticKeypair;
15
+ prologue;
16
+ constructor(isInitiator, payload, prologue, crypto, staticKeypair, connection, remotePeer, handshake) {
17
+ this.isInitiator = isInitiator;
18
+ this.payload = payload;
19
+ this.prologue = prologue;
20
+ this.staticKeypair = staticKeypair;
21
+ this.connection = connection;
22
+ if (remotePeer) {
23
+ this.remotePeer = remotePeer;
24
+ }
25
+ this.xx = handshake ?? new XX(crypto);
26
+ this.session = this.xx.initSession(this.isInitiator, this.prologue, this.staticKeypair);
27
+ }
28
+ // stage 0
29
+ async propose() {
30
+ logLocalStaticKeys(this.session.hs.s);
31
+ if (this.isInitiator) {
32
+ logger.trace('Stage 0 - Initiator starting to send first message.');
33
+ const messageBuffer = this.xx.sendMessage(this.session, new Uint8Array(0));
34
+ await this.connection.write(encode0(messageBuffer));
35
+ logger.trace('Stage 0 - Initiator finished sending first message.');
36
+ logLocalEphemeralKeys(this.session.hs.e);
37
+ }
38
+ else {
39
+ logger.trace('Stage 0 - Responder waiting to receive first message...');
40
+ const receivedMessageBuffer = decode0((await this.connection.read()).subarray());
41
+ const { valid } = this.xx.recvMessage(this.session, receivedMessageBuffer);
42
+ if (!valid) {
43
+ throw new InvalidCryptoExchangeError('xx handshake stage 0 validation fail');
44
+ }
45
+ logger.trace('Stage 0 - Responder received first message.');
46
+ logRemoteEphemeralKey(this.session.hs.re);
47
+ }
48
+ }
49
+ // stage 1
50
+ async exchange() {
51
+ if (this.isInitiator) {
52
+ logger.trace('Stage 1 - Initiator waiting to receive first message from responder...');
53
+ const receivedMessageBuffer = decode1((await this.connection.read()).subarray());
54
+ const { plaintext, valid } = this.xx.recvMessage(this.session, receivedMessageBuffer);
55
+ if (!valid) {
56
+ throw new InvalidCryptoExchangeError('xx handshake stage 1 validation fail');
57
+ }
58
+ logger.trace('Stage 1 - Initiator received the message.');
59
+ logRemoteEphemeralKey(this.session.hs.re);
60
+ logRemoteStaticKey(this.session.hs.rs);
61
+ logger.trace("Initiator going to check remote's signature...");
62
+ try {
63
+ const decodedPayload = decodePayload(plaintext);
64
+ this.remotePeer = this.remotePeer || await getPeerIdFromPayload(decodedPayload);
65
+ await verifySignedPayload(this.session.hs.rs, decodedPayload, this.remotePeer);
66
+ this.setRemoteNoiseExtension(decodedPayload.extensions);
67
+ }
68
+ catch (e) {
69
+ const err = e;
70
+ throw new UnexpectedPeerError(`Error occurred while verifying signed payload: ${err.message}`);
71
+ }
72
+ logger.trace('All good with the signature!');
73
+ }
74
+ else {
75
+ logger.trace('Stage 1 - Responder sending out first message with signed payload and static key.');
76
+ const messageBuffer = this.xx.sendMessage(this.session, this.payload);
77
+ await this.connection.write(encode1(messageBuffer));
78
+ logger.trace('Stage 1 - Responder sent the second handshake message with signed payload.');
79
+ logLocalEphemeralKeys(this.session.hs.e);
80
+ }
81
+ }
82
+ // stage 2
83
+ async finish() {
84
+ if (this.isInitiator) {
85
+ logger.trace('Stage 2 - Initiator sending third handshake message.');
86
+ const messageBuffer = this.xx.sendMessage(this.session, this.payload);
87
+ await this.connection.write(encode2(messageBuffer));
88
+ logger.trace('Stage 2 - Initiator sent message with signed payload.');
89
+ }
90
+ else {
91
+ logger.trace('Stage 2 - Responder waiting for third handshake message...');
92
+ const receivedMessageBuffer = decode2((await this.connection.read()).subarray());
93
+ const { plaintext, valid } = this.xx.recvMessage(this.session, receivedMessageBuffer);
94
+ if (!valid) {
95
+ throw new InvalidCryptoExchangeError('xx handshake stage 2 validation fail');
96
+ }
97
+ logger.trace('Stage 2 - Responder received the message, finished handshake.');
98
+ try {
99
+ const decodedPayload = decodePayload(plaintext);
100
+ this.remotePeer = this.remotePeer || await getPeerIdFromPayload(decodedPayload);
101
+ await verifySignedPayload(this.session.hs.rs, decodedPayload, this.remotePeer);
102
+ this.setRemoteNoiseExtension(decodedPayload.extensions);
103
+ }
104
+ catch (e) {
105
+ const err = e;
106
+ throw new UnexpectedPeerError(`Error occurred while verifying signed payload: ${err.message}`);
107
+ }
108
+ }
109
+ logCipherState(this.session);
110
+ }
111
+ encrypt(plaintext, session) {
112
+ const cs = this.getCS(session);
113
+ return this.xx.encryptWithAd(cs, new Uint8Array(0), plaintext);
114
+ }
115
+ decrypt(ciphertext, session, dst) {
116
+ const cs = this.getCS(session, false);
117
+ return this.xx.decryptWithAd(cs, new Uint8Array(0), ciphertext, dst);
118
+ }
119
+ getRemoteStaticKey() {
120
+ return this.session.hs.rs;
121
+ }
122
+ getCS(session, encryption = true) {
123
+ if (!session.cs1 || !session.cs2) {
124
+ throw new InvalidCryptoExchangeError('Handshake not completed properly, cipher state does not exist.');
125
+ }
126
+ if (this.isInitiator) {
127
+ return encryption ? session.cs1 : session.cs2;
128
+ }
129
+ else {
130
+ return encryption ? session.cs2 : session.cs1;
131
+ }
132
+ }
133
+ setRemoteNoiseExtension(e) {
134
+ if (e) {
135
+ this.remoteExtensions = e;
136
+ }
137
+ }
138
+ }
139
+ //# sourceMappingURL=handshake-xx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake-xx.js","sourceRoot":"","sources":["../../src/handshake-xx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Nonce } from '../nonce.js';
2
+ import type { bytes, bytes32 } from '../@types/basic.js';
3
+ import type { CipherState, MessageBuffer, SymmetricState } from '../@types/handshake.js';
4
+ import type { ICryptoInterface } from '../crypto.js';
5
+ export interface DecryptedResult {
6
+ plaintext: bytes;
7
+ valid: boolean;
8
+ }
9
+ export interface SplitState {
10
+ cs1: CipherState;
11
+ cs2: CipherState;
12
+ }
13
+ export declare abstract class AbstractHandshake {
14
+ crypto: ICryptoInterface;
15
+ constructor(crypto: ICryptoInterface);
16
+ encryptWithAd(cs: CipherState, ad: Uint8Array, plaintext: Uint8Array): bytes;
17
+ decryptWithAd(cs: CipherState, ad: Uint8Array, ciphertext: Uint8Array, dst?: Uint8Array): DecryptedResult;
18
+ protected hasKey(cs: CipherState): boolean;
19
+ protected createEmptyKey(): bytes32;
20
+ protected isEmptyKey(k: bytes32): boolean;
21
+ protected encrypt(k: bytes32, n: Nonce, ad: Uint8Array, plaintext: Uint8Array): bytes;
22
+ protected encryptAndHash(ss: SymmetricState, plaintext: bytes): bytes;
23
+ protected decrypt(k: bytes32, n: Nonce, ad: bytes, ciphertext: bytes, dst?: Uint8Array): DecryptedResult;
24
+ protected decryptAndHash(ss: SymmetricState, ciphertext: bytes): DecryptedResult;
25
+ protected dh(privateKey: bytes32, publicKey: bytes32): bytes32;
26
+ protected mixHash(ss: SymmetricState, data: bytes): void;
27
+ protected getHash(a: Uint8Array, b: Uint8Array): bytes32;
28
+ protected mixKey(ss: SymmetricState, ikm: bytes32): void;
29
+ protected initializeKey(k: bytes32): CipherState;
30
+ protected initializeSymmetric(protocolName: string): SymmetricState;
31
+ protected hashProtocolName(protocolName: Uint8Array): bytes32;
32
+ protected split(ss: SymmetricState): SplitState;
33
+ protected writeMessageRegular(cs: CipherState, payload: bytes): MessageBuffer;
34
+ protected readMessageRegular(cs: CipherState, message: MessageBuffer): DecryptedResult;
35
+ }
36
+ //# sourceMappingURL=abstract-handshake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract-handshake.d.ts","sourceRoot":"","sources":["../../../src/handshakes/abstract-handshake.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,KAAK,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,WAAW,CAAA;IAChB,GAAG,EAAE,WAAW,CAAA;CACjB;AAED,8BAAsB,iBAAiB;IAC9B,MAAM,EAAE,gBAAgB,CAAA;gBAElB,MAAM,EAAE,gBAAgB;IAI9B,aAAa,CAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,KAAK;IAO7E,aAAa,CAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,eAAe;IAQjH,SAAS,CAAC,MAAM,CAAE,EAAE,EAAE,WAAW,GAAG,OAAO;IAI3C,SAAS,CAAC,cAAc,IAAK,OAAO;IAIpC,SAAS,CAAC,UAAU,CAAE,CAAC,EAAE,OAAO,GAAG,OAAO;IAK1C,SAAS,CAAC,OAAO,CAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,KAAK;IAMtF,SAAS,CAAC,cAAc,CAAE,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK;IAYtE,SAAS,CAAC,OAAO,CAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,eAAe;IAkBzG,SAAS,CAAC,cAAc,CAAE,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,GAAG,eAAe;IAYjF,SAAS,CAAC,EAAE,CAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO;IAgB/D,SAAS,CAAC,OAAO,CAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;IAIzD,SAAS,CAAC,OAAO,CAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO;IAKzD,SAAS,CAAC,MAAM,CAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IAMzD,SAAS,CAAC,aAAa,CAAE,CAAC,EAAE,OAAO,GAAG,WAAW;IAMjD,SAAS,CAAC,mBAAmB,CAAE,YAAY,EAAE,MAAM,GAAG,cAAc;IAWpE,SAAS,CAAC,gBAAgB,CAAE,YAAY,EAAE,UAAU,GAAG,OAAO;IAU9D,SAAS,CAAC,KAAK,CAAE,EAAE,EAAE,cAAc,GAAG,UAAU;IAQhD,SAAS,CAAC,mBAAmB,CAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,GAAG,aAAa;IAQ9E,SAAS,CAAC,kBAAkB,CAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe;CAGxF"}