@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,140 @@
1
+ import { fromString as uint8ArrayFromString } from 'uint8arrays';
2
+ import { concat as uint8ArrayConcat } from 'uint8arrays/concat';
3
+ import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
4
+ import { logger } from '../logger.js';
5
+ import { Nonce } from '../nonce.js';
6
+ export class AbstractHandshake {
7
+ crypto;
8
+ constructor(crypto) {
9
+ this.crypto = crypto;
10
+ }
11
+ encryptWithAd(cs, ad, plaintext) {
12
+ const e = this.encrypt(cs.k, cs.n, ad, plaintext);
13
+ cs.n.increment();
14
+ return e;
15
+ }
16
+ decryptWithAd(cs, ad, ciphertext, dst) {
17
+ const { plaintext, valid } = this.decrypt(cs.k, cs.n, ad, ciphertext, dst);
18
+ if (valid)
19
+ cs.n.increment();
20
+ return { plaintext, valid };
21
+ }
22
+ // Cipher state related
23
+ hasKey(cs) {
24
+ return !this.isEmptyKey(cs.k);
25
+ }
26
+ createEmptyKey() {
27
+ return new Uint8Array(32);
28
+ }
29
+ isEmptyKey(k) {
30
+ const emptyKey = this.createEmptyKey();
31
+ return uint8ArrayEquals(emptyKey, k);
32
+ }
33
+ encrypt(k, n, ad, plaintext) {
34
+ n.assertValue();
35
+ return this.crypto.chaCha20Poly1305Encrypt(plaintext, n.getBytes(), ad, k);
36
+ }
37
+ encryptAndHash(ss, plaintext) {
38
+ let ciphertext;
39
+ if (this.hasKey(ss.cs)) {
40
+ ciphertext = this.encryptWithAd(ss.cs, ss.h, plaintext);
41
+ }
42
+ else {
43
+ ciphertext = plaintext;
44
+ }
45
+ this.mixHash(ss, ciphertext);
46
+ return ciphertext;
47
+ }
48
+ decrypt(k, n, ad, ciphertext, dst) {
49
+ n.assertValue();
50
+ const encryptedMessage = this.crypto.chaCha20Poly1305Decrypt(ciphertext, n.getBytes(), ad, k, dst);
51
+ if (encryptedMessage) {
52
+ return {
53
+ plaintext: encryptedMessage,
54
+ valid: true
55
+ };
56
+ }
57
+ else {
58
+ return {
59
+ plaintext: new Uint8Array(0),
60
+ valid: false
61
+ };
62
+ }
63
+ }
64
+ decryptAndHash(ss, ciphertext) {
65
+ let plaintext;
66
+ let valid = true;
67
+ if (this.hasKey(ss.cs)) {
68
+ ({ plaintext, valid } = this.decryptWithAd(ss.cs, ss.h, ciphertext));
69
+ }
70
+ else {
71
+ plaintext = ciphertext;
72
+ }
73
+ this.mixHash(ss, ciphertext);
74
+ return { plaintext, valid };
75
+ }
76
+ dh(privateKey, publicKey) {
77
+ try {
78
+ const derivedU8 = this.crypto.generateX25519SharedKey(privateKey, publicKey);
79
+ if (derivedU8.length === 32) {
80
+ return derivedU8;
81
+ }
82
+ return derivedU8.subarray(0, 32);
83
+ }
84
+ catch (e) {
85
+ const err = e;
86
+ logger.error(err);
87
+ return new Uint8Array(32);
88
+ }
89
+ }
90
+ mixHash(ss, data) {
91
+ ss.h = this.getHash(ss.h, data);
92
+ }
93
+ getHash(a, b) {
94
+ const u = this.crypto.hashSHA256(uint8ArrayConcat([a, b], a.length + b.length));
95
+ return u;
96
+ }
97
+ mixKey(ss, ikm) {
98
+ const [ck, tempK] = this.crypto.getHKDF(ss.ck, ikm);
99
+ ss.cs = this.initializeKey(tempK);
100
+ ss.ck = ck;
101
+ }
102
+ initializeKey(k) {
103
+ return { k, n: new Nonce() };
104
+ }
105
+ // Symmetric state related
106
+ initializeSymmetric(protocolName) {
107
+ const protocolNameBytes = uint8ArrayFromString(protocolName, 'utf-8');
108
+ const h = this.hashProtocolName(protocolNameBytes);
109
+ const ck = h;
110
+ const key = this.createEmptyKey();
111
+ const cs = this.initializeKey(key);
112
+ return { cs, ck, h };
113
+ }
114
+ hashProtocolName(protocolName) {
115
+ if (protocolName.length <= 32) {
116
+ const h = new Uint8Array(32);
117
+ h.set(protocolName);
118
+ return h;
119
+ }
120
+ else {
121
+ return this.getHash(protocolName, new Uint8Array(0));
122
+ }
123
+ }
124
+ split(ss) {
125
+ const [tempk1, tempk2] = this.crypto.getHKDF(ss.ck, new Uint8Array(0));
126
+ const cs1 = this.initializeKey(tempk1);
127
+ const cs2 = this.initializeKey(tempk2);
128
+ return { cs1, cs2 };
129
+ }
130
+ writeMessageRegular(cs, payload) {
131
+ const ciphertext = this.encryptWithAd(cs, new Uint8Array(0), payload);
132
+ const ne = this.createEmptyKey();
133
+ const ns = new Uint8Array(0);
134
+ return { ne, ns, ciphertext };
135
+ }
136
+ readMessageRegular(cs, message) {
137
+ return this.decryptWithAd(cs, new Uint8Array(0), message.ciphertext);
138
+ }
139
+ }
140
+ //# sourceMappingURL=abstract-handshake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract-handshake.js","sourceRoot":"","sources":["../../../src/handshakes/abstract-handshake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { AbstractHandshake, type DecryptedResult } from './abstract-handshake.js';
2
+ import type { bytes32, bytes } from '../@types/basic.js';
3
+ import type { MessageBuffer, NoiseSession } from '../@types/handshake.js';
4
+ import type { KeyPair } from '../@types/libp2p.js';
5
+ export declare class XX extends AbstractHandshake {
6
+ private initializeInitiator;
7
+ private initializeResponder;
8
+ private writeMessageA;
9
+ private writeMessageB;
10
+ private writeMessageC;
11
+ private readMessageA;
12
+ private readMessageB;
13
+ private readMessageC;
14
+ initSession(initiator: boolean, prologue: bytes32, s: KeyPair): NoiseSession;
15
+ sendMessage(session: NoiseSession, message: bytes, ephemeral?: KeyPair): MessageBuffer;
16
+ recvMessage(session: NoiseSession, message: MessageBuffer): DecryptedResult;
17
+ }
18
+ //# sourceMappingURL=xx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xx.d.ts","sourceRoot":"","sources":["../../../src/handshakes/xx.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACjF,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAA+B,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACtG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,qBAAa,EAAG,SAAQ,iBAAiB;IACvC,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,YAAY;IAgBb,WAAW,CAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,YAAY;IAkB7E,WAAW,CAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,aAAa;IAkCvF,WAAW,CAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe;CAkBpF"}
@@ -0,0 +1,161 @@
1
+ import { isValidPublicKey } from '../utils.js';
2
+ import { AbstractHandshake } from './abstract-handshake.js';
3
+ export class XX extends AbstractHandshake {
4
+ initializeInitiator(prologue, s, rs, psk) {
5
+ const name = 'Noise_XX_25519_ChaChaPoly_SHA256';
6
+ const ss = this.initializeSymmetric(name);
7
+ this.mixHash(ss, prologue);
8
+ const re = new Uint8Array(32);
9
+ return { ss, s, rs, psk, re };
10
+ }
11
+ initializeResponder(prologue, s, rs, psk) {
12
+ const name = 'Noise_XX_25519_ChaChaPoly_SHA256';
13
+ const ss = this.initializeSymmetric(name);
14
+ this.mixHash(ss, prologue);
15
+ const re = new Uint8Array(32);
16
+ return { ss, s, rs, psk, re };
17
+ }
18
+ writeMessageA(hs, payload, e) {
19
+ const ns = new Uint8Array(0);
20
+ if (e !== undefined) {
21
+ hs.e = e;
22
+ }
23
+ else {
24
+ hs.e = this.crypto.generateX25519KeyPair();
25
+ }
26
+ const ne = hs.e.publicKey;
27
+ this.mixHash(hs.ss, ne);
28
+ const ciphertext = this.encryptAndHash(hs.ss, payload);
29
+ return { ne, ns, ciphertext };
30
+ }
31
+ writeMessageB(hs, payload) {
32
+ hs.e = this.crypto.generateX25519KeyPair();
33
+ const ne = hs.e.publicKey;
34
+ this.mixHash(hs.ss, ne);
35
+ this.mixKey(hs.ss, this.dh(hs.e.privateKey, hs.re));
36
+ const spk = hs.s.publicKey;
37
+ const ns = this.encryptAndHash(hs.ss, spk);
38
+ this.mixKey(hs.ss, this.dh(hs.s.privateKey, hs.re));
39
+ const ciphertext = this.encryptAndHash(hs.ss, payload);
40
+ return { ne, ns, ciphertext };
41
+ }
42
+ writeMessageC(hs, payload) {
43
+ const spk = hs.s.publicKey;
44
+ const ns = this.encryptAndHash(hs.ss, spk);
45
+ this.mixKey(hs.ss, this.dh(hs.s.privateKey, hs.re));
46
+ const ciphertext = this.encryptAndHash(hs.ss, payload);
47
+ const ne = this.createEmptyKey();
48
+ const messageBuffer = { ne, ns, ciphertext };
49
+ const { cs1, cs2 } = this.split(hs.ss);
50
+ return { h: hs.ss.h, messageBuffer, cs1, cs2 };
51
+ }
52
+ readMessageA(hs, message) {
53
+ if (isValidPublicKey(message.ne)) {
54
+ hs.re = message.ne;
55
+ }
56
+ this.mixHash(hs.ss, hs.re);
57
+ return this.decryptAndHash(hs.ss, message.ciphertext);
58
+ }
59
+ readMessageB(hs, message) {
60
+ if (isValidPublicKey(message.ne)) {
61
+ hs.re = message.ne;
62
+ }
63
+ this.mixHash(hs.ss, hs.re);
64
+ if (!hs.e) {
65
+ throw new Error('Handshake state `e` param is missing.');
66
+ }
67
+ this.mixKey(hs.ss, this.dh(hs.e.privateKey, hs.re));
68
+ const { plaintext: ns, valid: valid1 } = this.decryptAndHash(hs.ss, message.ns);
69
+ if (valid1 && isValidPublicKey(ns)) {
70
+ hs.rs = ns;
71
+ }
72
+ this.mixKey(hs.ss, this.dh(hs.e.privateKey, hs.rs));
73
+ const { plaintext, valid: valid2 } = this.decryptAndHash(hs.ss, message.ciphertext);
74
+ return { plaintext, valid: (valid1 && valid2) };
75
+ }
76
+ readMessageC(hs, message) {
77
+ const { plaintext: ns, valid: valid1 } = this.decryptAndHash(hs.ss, message.ns);
78
+ if (valid1 && isValidPublicKey(ns)) {
79
+ hs.rs = ns;
80
+ }
81
+ if (!hs.e) {
82
+ throw new Error('Handshake state `e` param is missing.');
83
+ }
84
+ this.mixKey(hs.ss, this.dh(hs.e.privateKey, hs.rs));
85
+ const { plaintext, valid: valid2 } = this.decryptAndHash(hs.ss, message.ciphertext);
86
+ const { cs1, cs2 } = this.split(hs.ss);
87
+ return { h: hs.ss.h, plaintext, valid: (valid1 && valid2), cs1, cs2 };
88
+ }
89
+ initSession(initiator, prologue, s) {
90
+ const psk = this.createEmptyKey();
91
+ const rs = new Uint8Array(32); // no static key yet
92
+ let hs;
93
+ if (initiator) {
94
+ hs = this.initializeInitiator(prologue, s, rs, psk);
95
+ }
96
+ else {
97
+ hs = this.initializeResponder(prologue, s, rs, psk);
98
+ }
99
+ return {
100
+ hs,
101
+ i: initiator,
102
+ mc: 0
103
+ };
104
+ }
105
+ sendMessage(session, message, ephemeral) {
106
+ let messageBuffer;
107
+ if (session.mc === 0) {
108
+ messageBuffer = this.writeMessageA(session.hs, message, ephemeral);
109
+ }
110
+ else if (session.mc === 1) {
111
+ messageBuffer = this.writeMessageB(session.hs, message);
112
+ }
113
+ else if (session.mc === 2) {
114
+ const { h, messageBuffer: resultingBuffer, cs1, cs2 } = this.writeMessageC(session.hs, message);
115
+ messageBuffer = resultingBuffer;
116
+ session.h = h;
117
+ session.cs1 = cs1;
118
+ session.cs2 = cs2;
119
+ }
120
+ else if (session.mc > 2) {
121
+ if (session.i) {
122
+ if (!session.cs1) {
123
+ throw new Error('CS1 (cipher state) is not defined');
124
+ }
125
+ messageBuffer = this.writeMessageRegular(session.cs1, message);
126
+ }
127
+ else {
128
+ if (!session.cs2) {
129
+ throw new Error('CS2 (cipher state) is not defined');
130
+ }
131
+ messageBuffer = this.writeMessageRegular(session.cs2, message);
132
+ }
133
+ }
134
+ else {
135
+ throw new Error('Session invalid.');
136
+ }
137
+ session.mc++;
138
+ return messageBuffer;
139
+ }
140
+ recvMessage(session, message) {
141
+ let plaintext = new Uint8Array(0);
142
+ let valid = false;
143
+ if (session.mc === 0) {
144
+ ({ plaintext, valid } = this.readMessageA(session.hs, message));
145
+ }
146
+ else if (session.mc === 1) {
147
+ ({ plaintext, valid } = this.readMessageB(session.hs, message));
148
+ }
149
+ else if (session.mc === 2) {
150
+ const { h, plaintext: resultingPlaintext, valid: resultingValid, cs1, cs2 } = this.readMessageC(session.hs, message);
151
+ plaintext = resultingPlaintext;
152
+ valid = resultingValid;
153
+ session.h = h;
154
+ session.cs1 = cs1;
155
+ session.cs2 = cs2;
156
+ }
157
+ session.mc++;
158
+ return { plaintext, valid };
159
+ }
160
+ }
161
+ //# sourceMappingURL=xx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xx.js","sourceRoot":"","sources":["../../../src/handshakes/xx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { NoiseInit } from './noise.js';
2
+ import type { NoiseExtensions } from './proto/payload.js';
3
+ import type { ConnectionEncrypter } from '@libp2p/interface/connection-encrypter';
4
+ export type { ICryptoInterface } from './crypto.js';
5
+ export { pureJsCrypto } from './crypto/js.js';
6
+ export declare function noise(init?: NoiseInit): () => ConnectionEncrypter<NoiseExtensions>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,wBAAgB,KAAK,CAAE,IAAI,GAAE,SAAc,GAAG,MAAM,mBAAmB,CAAC,eAAe,CAAC,CAEvF"}
@@ -0,0 +1,6 @@
1
+ import { Noise } from './noise.js';
2
+ export { pureJsCrypto } from './crypto/js.js';
3
+ export function noise(init = {}) {
4
+ return () => new Noise(init);
5
+ }
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAKlC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,UAAU,KAAK,CAAE,OAAkB,EAAE;IACzC,OAAO,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type Logger } from '@libp2p/logger';
2
+ import type { NoiseSession } from './@types/handshake.js';
3
+ import type { KeyPair } from './@types/libp2p.js';
4
+ declare const log: Logger;
5
+ export { log as logger };
6
+ export declare function logLocalStaticKeys(s: KeyPair): void;
7
+ export declare function logLocalEphemeralKeys(e: KeyPair | undefined): void;
8
+ export declare function logRemoteStaticKey(rs: Uint8Array): void;
9
+ export declare function logRemoteEphemeralKey(re: Uint8Array): void;
10
+ export declare function logCipherState(session: NoiseSession): void;
11
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAU,MAAM,gBAAgB,CAAA;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjD,QAAA,MAAM,GAAG,QAAyB,CAAA;AAElC,OAAO,EAAE,GAAG,IAAI,MAAM,EAAE,CAAA;AAaxB,wBAAgB,kBAAkB,CAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CAGpD;AAED,wBAAgB,qBAAqB,CAAE,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAOnE;AAED,wBAAgB,kBAAkB,CAAE,EAAE,EAAE,UAAU,GAAG,IAAI,CAExD;AAED,wBAAgB,qBAAqB,CAAE,EAAE,EAAE,UAAU,GAAG,IAAI,CAE3D;AAED,wBAAgB,cAAc,CAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAO3D"}
@@ -0,0 +1,45 @@
1
+ import { logger } from '@libp2p/logger';
2
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
3
+ import { DUMP_SESSION_KEYS } from './constants.js';
4
+ const log = logger('libp2p:noise');
5
+ export { log as logger };
6
+ let keyLogger;
7
+ if (DUMP_SESSION_KEYS) {
8
+ keyLogger = log;
9
+ }
10
+ else {
11
+ keyLogger = Object.assign(() => { }, {
12
+ enabled: false,
13
+ trace: () => { },
14
+ error: () => { }
15
+ });
16
+ }
17
+ export function logLocalStaticKeys(s) {
18
+ keyLogger(`LOCAL_STATIC_PUBLIC_KEY ${uint8ArrayToString(s.publicKey, 'hex')}`);
19
+ keyLogger(`LOCAL_STATIC_PRIVATE_KEY ${uint8ArrayToString(s.privateKey, 'hex')}`);
20
+ }
21
+ export function logLocalEphemeralKeys(e) {
22
+ if (e) {
23
+ keyLogger(`LOCAL_PUBLIC_EPHEMERAL_KEY ${uint8ArrayToString(e.publicKey, 'hex')}`);
24
+ keyLogger(`LOCAL_PRIVATE_EPHEMERAL_KEY ${uint8ArrayToString(e.privateKey, 'hex')}`);
25
+ }
26
+ else {
27
+ keyLogger('Missing local ephemeral keys.');
28
+ }
29
+ }
30
+ export function logRemoteStaticKey(rs) {
31
+ keyLogger(`REMOTE_STATIC_PUBLIC_KEY ${uint8ArrayToString(rs, 'hex')}`);
32
+ }
33
+ export function logRemoteEphemeralKey(re) {
34
+ keyLogger(`REMOTE_EPHEMERAL_PUBLIC_KEY ${uint8ArrayToString(re, 'hex')}`);
35
+ }
36
+ export function logCipherState(session) {
37
+ if (session.cs1 && session.cs2) {
38
+ keyLogger(`CIPHER_STATE_1 ${session.cs1.n.getUint64()} ${uint8ArrayToString(session.cs1.k, 'hex')}`);
39
+ keyLogger(`CIPHER_STATE_2 ${session.cs2.n.getUint64()} ${uint8ArrayToString(session.cs2.k, 'hex')}`);
40
+ }
41
+ else {
42
+ keyLogger('Missing cipher state.');
43
+ }
44
+ }
45
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAIlD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;AAElC,OAAO,EAAE,GAAG,IAAI,MAAM,EAAE,CAAA;AAExB,IAAI,SAAiB,CAAA;AACrB,IAAI,iBAAiB,EAAE;IACrB,SAAS,GAAG,GAAG,CAAA;CAChB;KAAM;IACL,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAoB,CAAC,EAAE;QACpD,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;QACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;KAChB,CAAC,CAAA;CACH;AAED,MAAM,UAAU,kBAAkB,CAAE,CAAU;IAC5C,SAAS,CAAC,2BAA2B,kBAAkB,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9E,SAAS,CAAC,4BAA4B,kBAAkB,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,CAAsB;IAC3D,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,8BAA8B,kBAAkB,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QACjF,SAAS,CAAC,+BAA+B,kBAAkB,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KACpF;SAAM;QACL,SAAS,CAAC,+BAA+B,CAAC,CAAA;KAC3C;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAE,EAAc;IAChD,SAAS,CAAC,4BAA4B,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,EAAc;IACnD,SAAS,CAAC,+BAA+B,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAAE,OAAqB;IACnD,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QAC9B,SAAS,CAAC,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QACpG,SAAS,CAAC,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KACrG;SAAM;QACL,SAAS,CAAC,uBAAuB,CAAC,CAAA;KACnC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Counter, Metrics } from '@libp2p/interface/metrics';
2
+ export type MetricsRegistry = Record<string, Counter>;
3
+ export declare function registerMetrics(metrics: Metrics): MetricsRegistry;
4
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAEjE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAErD,wBAAgB,eAAe,CAAE,OAAO,EAAE,OAAO,GAAG,eAAe,CA2BlE"}
@@ -0,0 +1,20 @@
1
+ export function registerMetrics(metrics) {
2
+ return {
3
+ xxHandshakeSuccesses: metrics.registerCounter('libp2p_noise_xxhandshake_successes_total', {
4
+ help: 'Total count of noise xxHandshakes successes_'
5
+ }),
6
+ xxHandshakeErrors: metrics.registerCounter('libp2p_noise_xxhandshake_error_total', {
7
+ help: 'Total count of noise xxHandshakes errors'
8
+ }),
9
+ encryptedPackets: metrics.registerCounter('libp2p_noise_encrypted_packets_total', {
10
+ help: 'Total count of noise encrypted packets successfully'
11
+ }),
12
+ decryptedPackets: metrics.registerCounter('libp2p_noise_decrypted_packets_total', {
13
+ help: 'Total count of noise decrypted packets'
14
+ }),
15
+ decryptErrors: metrics.registerCounter('libp2p_noise_decrypt_errors_total', {
16
+ help: 'Total count of noise decrypt errors'
17
+ })
18
+ };
19
+ }
20
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,eAAe,CAAE,OAAgB;IAC/C,OAAO;QACL,oBAAoB,EAAE,OAAO,CAAC,eAAe,CAC3C,0CAA0C,EAAE;YAC1C,IAAI,EAAE,8CAA8C;SACrD,CAAC;QAEJ,iBAAiB,EAAE,OAAO,CAAC,eAAe,CACxC,sCAAsC,EAAE;YACtC,IAAI,EAAE,0CAA0C;SACjD,CAAC;QAEJ,gBAAgB,EAAE,OAAO,CAAC,eAAe,CACvC,sCAAsC,EAAE;YACtC,IAAI,EAAE,qDAAqD;SAC5D,CAAC;QAEJ,gBAAgB,EAAE,OAAO,CAAC,eAAe,CACvC,sCAAsC,EAAE;YACtC,IAAI,EAAE,wCAAwC;SAC/C,CAAC;QAEJ,aAAa,EAAE,OAAO,CAAC,eAAe,CACpC,mCAAmC,EAAE;YACnC,IAAI,EAAE,qCAAqC;SAC5C,CAAC;KACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { bytes } from './@types/basic.js';
2
+ import type { INoiseConnection } from './@types/libp2p.js';
3
+ import type { ICryptoInterface } from './crypto.js';
4
+ import type { NoiseExtensions } from './proto/payload.js';
5
+ import type { SecuredConnection } from '@libp2p/interface/connection-encrypter';
6
+ import type { Metrics } from '@libp2p/interface/metrics';
7
+ import type { PeerId } from '@libp2p/interface/peer-id';
8
+ import type { Duplex } from 'it-stream-types';
9
+ export interface NoiseInit {
10
+ /**
11
+ * x25519 private key, reuse for faster handshakes
12
+ */
13
+ staticNoiseKey?: bytes;
14
+ extensions?: NoiseExtensions;
15
+ crypto?: ICryptoInterface;
16
+ prologueBytes?: Uint8Array;
17
+ metrics?: Metrics;
18
+ }
19
+ export declare class Noise implements INoiseConnection {
20
+ protocol: string;
21
+ crypto: ICryptoInterface;
22
+ private readonly prologue;
23
+ private readonly staticKeys;
24
+ private readonly extensions?;
25
+ private readonly metrics?;
26
+ constructor(init?: NoiseInit);
27
+ /**
28
+ * Encrypt outgoing data to the remote party (handshake as initiator)
29
+ *
30
+ * @param {PeerId} localPeer - PeerId of the receiving peer
31
+ * @param {Duplex<AsyncGenerator<Uint8Array>, AsyncIterable<Uint8Array>, Promise<void>>} connection - streaming iterable duplex that will be encrypted
32
+ * @param {PeerId} remotePeer - PeerId of the remote peer. Used to validate the integrity of the remote peer.
33
+ * @returns {Promise<SecuredConnection>}
34
+ */
35
+ secureOutbound(localPeer: PeerId, connection: Duplex<AsyncGenerator<Uint8Array>, AsyncIterable<Uint8Array>, Promise<void>>, remotePeer?: PeerId): Promise<SecuredConnection<NoiseExtensions>>;
36
+ /**
37
+ * Decrypt incoming data (handshake as responder).
38
+ *
39
+ * @param {PeerId} localPeer - PeerId of the receiving peer.
40
+ * @param {Duplex<AsyncGenerator<Uint8Array>, AsyncIterable<Uint8Array>, Promise<void>>} connection - streaming iterable duplex that will be encryption.
41
+ * @param {PeerId} remotePeer - optional PeerId of the initiating peer, if known. This may only exist during transport upgrades.
42
+ * @returns {Promise<SecuredConnection>}
43
+ */
44
+ secureInbound(localPeer: PeerId, connection: Duplex<AsyncGenerator<Uint8Array>, AsyncIterable<Uint8Array>, Promise<void>>, remotePeer?: PeerId): Promise<SecuredConnection<NoiseExtensions>>;
45
+ /**
46
+ * If Noise pipes supported, tries IK handshake first with XX as fallback if it fails.
47
+ * If noise pipes disabled or remote peer static key is unknown, use XX.
48
+ *
49
+ * @param {HandshakeParams} params
50
+ */
51
+ private performHandshake;
52
+ private performXXHandshake;
53
+ private createSecureConnection;
54
+ }
55
+ //# sourceMappingURL=noise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../../src/noise.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,oBAAoB,CAAA;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAA;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,iBAAiB,CAAA;AASrD,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAA;IACtB,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,aAAa,CAAC,EAAE,UAAU,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,qBAAa,KAAM,YAAW,gBAAgB;IACrC,QAAQ,SAAW;IACnB,MAAM,EAAE,gBAAgB,CAAA;IAE/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAiB;gBAE7B,IAAI,GAAE,SAAc;IAgBjC;;;;;;;OAOG;IACU,cAAc,CAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAwB3M;;;;;;;OAOG;IACU,aAAa,CAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAwB1M;;;;;OAKG;YACW,gBAAgB;YAOhB,kBAAkB;YA+BlB,sBAAsB;CAmBrC"}