@bsv/sdk 1.2.20 → 1.2.22

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 (160) hide show
  1. package/dist/cjs/package.json +3 -3
  2. package/dist/cjs/src/auth/Peer.js +536 -0
  3. package/dist/cjs/src/auth/Peer.js.map +1 -0
  4. package/dist/cjs/src/auth/SessionManager.js +66 -0
  5. package/dist/cjs/src/auth/SessionManager.js.map +1 -0
  6. package/dist/cjs/src/auth/{Certificate.js → certificates/Certificate.js} +22 -26
  7. package/dist/cjs/src/auth/certificates/Certificate.js.map +1 -0
  8. package/dist/cjs/src/auth/certificates/MasterCertificate.js +79 -0
  9. package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -0
  10. package/dist/cjs/src/auth/certificates/VerifiableCertificate.js +49 -0
  11. package/dist/cjs/src/auth/certificates/VerifiableCertificate.js.map +1 -0
  12. package/dist/cjs/src/auth/certificates/index.js +25 -0
  13. package/dist/cjs/src/auth/certificates/index.js.map +1 -0
  14. package/dist/cjs/src/auth/clients/AuthFetch.js +411 -0
  15. package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -0
  16. package/dist/cjs/src/auth/clients/index.js +18 -0
  17. package/dist/cjs/src/auth/clients/index.js.map +1 -0
  18. package/dist/cjs/src/auth/index.js +20 -5
  19. package/dist/cjs/src/auth/index.js.map +1 -1
  20. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +259 -0
  21. package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -0
  22. package/dist/cjs/src/auth/transports/index.js +18 -0
  23. package/dist/cjs/src/auth/transports/index.js.map +1 -0
  24. package/dist/cjs/src/auth/types.js +3 -0
  25. package/dist/cjs/src/auth/types.js.map +1 -0
  26. package/dist/cjs/src/auth/utils/certificateHelpers.js +51 -0
  27. package/dist/cjs/src/auth/utils/certificateHelpers.js.map +1 -0
  28. package/dist/cjs/src/auth/utils/createNonce.js +19 -0
  29. package/dist/cjs/src/auth/utils/createNonce.js.map +1 -0
  30. package/dist/cjs/src/auth/utils/getVerifiableCertificates.js +31 -0
  31. package/dist/cjs/src/auth/utils/getVerifiableCertificates.js.map +1 -0
  32. package/dist/cjs/src/auth/utils/index.js +22 -0
  33. package/dist/cjs/src/auth/utils/index.js.map +1 -0
  34. package/dist/cjs/src/auth/utils/validateCertificates.js +42 -0
  35. package/dist/cjs/src/auth/utils/validateCertificates.js.map +1 -0
  36. package/dist/cjs/src/auth/utils/verifyNonce.js +27 -0
  37. package/dist/cjs/src/auth/utils/verifyNonce.js.map +1 -0
  38. package/dist/cjs/src/primitives/Point.js +1 -1
  39. package/dist/cjs/src/primitives/Point.js.map +1 -1
  40. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1 -1
  41. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  42. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +148 -148
  43. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  44. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  45. package/dist/esm/src/auth/Peer.js +533 -0
  46. package/dist/esm/src/auth/Peer.js.map +1 -0
  47. package/dist/esm/src/auth/SessionManager.js +63 -0
  48. package/dist/esm/src/auth/SessionManager.js.map +1 -0
  49. package/dist/esm/src/auth/{Certificate.js → certificates/Certificate.js} +1 -2
  50. package/dist/esm/src/auth/certificates/Certificate.js.map +1 -0
  51. package/dist/esm/src/auth/certificates/MasterCertificate.js +73 -0
  52. package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -0
  53. package/dist/esm/src/auth/certificates/VerifiableCertificate.js +44 -0
  54. package/dist/esm/src/auth/certificates/VerifiableCertificate.js.map +1 -0
  55. package/dist/esm/src/auth/certificates/index.js +4 -0
  56. package/dist/esm/src/auth/certificates/index.js.map +1 -0
  57. package/dist/esm/src/auth/clients/AuthFetch.js +409 -0
  58. package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -0
  59. package/dist/esm/src/auth/clients/index.js +2 -0
  60. package/dist/esm/src/auth/clients/index.js.map +1 -0
  61. package/dist/esm/src/auth/index.js +7 -1
  62. package/dist/esm/src/auth/index.js.map +1 -1
  63. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js +258 -0
  64. package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -0
  65. package/dist/esm/src/auth/transports/index.js +2 -0
  66. package/dist/esm/src/auth/transports/index.js.map +1 -0
  67. package/dist/esm/src/auth/types.js +2 -0
  68. package/dist/esm/src/auth/types.js.map +1 -0
  69. package/dist/esm/src/auth/utils/certificateHelpers.js +47 -0
  70. package/dist/esm/src/auth/utils/certificateHelpers.js.map +1 -0
  71. package/dist/esm/src/auth/utils/createNonce.js +16 -0
  72. package/dist/esm/src/auth/utils/createNonce.js.map +1 -0
  73. package/dist/esm/src/auth/utils/getVerifiableCertificates.js +27 -0
  74. package/dist/esm/src/auth/utils/getVerifiableCertificates.js.map +1 -0
  75. package/dist/esm/src/auth/utils/index.js +6 -0
  76. package/dist/esm/src/auth/utils/index.js.map +1 -0
  77. package/dist/esm/src/auth/utils/validateCertificates.js +38 -0
  78. package/dist/esm/src/auth/utils/validateCertificates.js.map +1 -0
  79. package/dist/esm/src/auth/utils/verifyNonce.js +24 -0
  80. package/dist/esm/src/auth/utils/verifyNonce.js.map +1 -0
  81. package/dist/esm/src/primitives/Point.js +1 -1
  82. package/dist/esm/src/primitives/Point.js.map +1 -1
  83. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1 -1
  84. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
  85. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +1 -1
  86. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
  87. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  88. package/dist/types/src/auth/Peer.d.ts +193 -0
  89. package/dist/types/src/auth/Peer.d.ts.map +1 -0
  90. package/dist/types/src/auth/SessionManager.d.ts +42 -0
  91. package/dist/types/src/auth/SessionManager.d.ts.map +1 -0
  92. package/dist/types/src/auth/{Certificate.d.ts → certificates/Certificate.d.ts} +1 -1
  93. package/dist/types/src/auth/certificates/Certificate.d.ts.map +1 -0
  94. package/dist/types/src/auth/certificates/MasterCertificate.d.ts +38 -0
  95. package/dist/types/src/auth/certificates/MasterCertificate.d.ts.map +1 -0
  96. package/dist/types/src/auth/certificates/VerifiableCertificate.d.ts +26 -0
  97. package/dist/types/src/auth/certificates/VerifiableCertificate.d.ts.map +1 -0
  98. package/dist/types/src/auth/certificates/index.d.ts +4 -0
  99. package/dist/types/src/auth/certificates/index.d.ts.map +1 -0
  100. package/dist/types/src/auth/clients/AuthFetch.d.ts +87 -0
  101. package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -0
  102. package/dist/types/src/auth/clients/index.d.ts +2 -0
  103. package/dist/types/src/auth/clients/index.d.ts.map +1 -0
  104. package/dist/types/src/auth/index.d.ts +7 -1
  105. package/dist/types/src/auth/index.d.ts.map +1 -1
  106. package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts +51 -0
  107. package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts.map +1 -0
  108. package/dist/types/src/auth/transports/index.d.ts +2 -0
  109. package/dist/types/src/auth/transports/index.d.ts.map +1 -0
  110. package/dist/types/src/auth/types.d.ts +31 -0
  111. package/dist/types/src/auth/types.d.ts.map +1 -0
  112. package/dist/types/src/auth/utils/certificateHelpers.d.ts +26 -0
  113. package/dist/types/src/auth/utils/certificateHelpers.d.ts.map +1 -0
  114. package/dist/types/src/auth/utils/createNonce.d.ts +8 -0
  115. package/dist/types/src/auth/utils/createNonce.d.ts.map +1 -0
  116. package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts +13 -0
  117. package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts.map +1 -0
  118. package/dist/types/src/auth/utils/index.d.ts +6 -0
  119. package/dist/types/src/auth/utils/index.d.ts.map +1 -0
  120. package/dist/types/src/auth/utils/validateCertificates.d.ts +12 -0
  121. package/dist/types/src/auth/utils/validateCertificates.d.ts.map +1 -0
  122. package/dist/types/src/auth/utils/verifyNonce.d.ts +9 -0
  123. package/dist/types/src/auth/utils/verifyNonce.d.ts.map +1 -0
  124. package/dist/types/src/primitives/Point.d.ts.map +1 -1
  125. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  126. package/dist/umd/bundle.js +1 -1
  127. package/docs/README.md +1 -0
  128. package/docs/auth.md +1193 -0
  129. package/package.json +13 -3
  130. package/src/auth/Peer.ts +600 -0
  131. package/src/auth/SessionManager.ts +71 -0
  132. package/src/auth/__tests/Peer.test.ts +599 -0
  133. package/src/auth/__tests/SessionManager.test.ts +87 -0
  134. package/src/auth/{Certificate.ts → certificates/Certificate.ts} +15 -8
  135. package/src/auth/certificates/MasterCertificate.ts +106 -0
  136. package/src/auth/certificates/VerifiableCertificate.ts +73 -0
  137. package/src/auth/certificates/__tests/Certificate.test.ts +282 -0
  138. package/src/auth/certificates/index.ts +3 -0
  139. package/src/auth/clients/AuthFetch.ts +482 -0
  140. package/src/auth/clients/index.ts +1 -0
  141. package/src/auth/index.ts +7 -1
  142. package/src/auth/transports/SimplifiedFetchTransport.ts +288 -0
  143. package/src/auth/transports/index.ts +1 -0
  144. package/src/auth/types.ts +41 -0
  145. package/src/auth/utils/__tests/cryptononce.test.ts +84 -0
  146. package/src/auth/utils/__tests/getVerifiableCertificates.test.ts +126 -0
  147. package/src/auth/utils/__tests/validateCertificates.test.ts +142 -0
  148. package/src/auth/utils/certificateHelpers.ts +86 -0
  149. package/src/auth/utils/createNonce.ts +16 -0
  150. package/src/auth/utils/getVerifiableCertificates.ts +40 -0
  151. package/src/auth/utils/index.ts +5 -0
  152. package/src/auth/utils/validateCertificates.ts +54 -0
  153. package/src/auth/utils/verifyNonce.ts +27 -0
  154. package/src/primitives/Point.ts +59 -59
  155. package/src/wallet/substrates/WalletWireProcessor.ts +1 -1
  156. package/src/wallet/substrates/WalletWireTransceiver.ts +1 -1
  157. package/dist/cjs/src/auth/Certificate.js.map +0 -1
  158. package/dist/esm/src/auth/Certificate.js.map +0 -1
  159. package/dist/types/src/auth/Certificate.d.ts.map +0 -1
  160. package/src/auth/__tests/Certificate.test.ts +0 -282
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsv/sdk",
3
- "version": "1.2.20",
3
+ "version": "1.2.22",
4
4
  "type": "commonjs",
5
5
  "description": "BSV Blockchain Software Development Kit",
6
6
  "files": [
@@ -20,7 +20,7 @@
20
20
  "build:umd": "webpack --config webpack.config.js",
21
21
  "dev": "tsc -b -w",
22
22
  "prepublish": "npm run build",
23
- "doc": "ts2md --inputFilename=src/script/index.ts --outputFilename=docs/script.md --filenameSubString=script --firstHeadingLevel=1 && ts2md --inputFilename=src/primitives/index.ts --outputFilename=docs/primitives.md --filenameSubString=primitives --firstHeadingLevel=1 && ts2md --inputFilename=src/transaction/index.ts --outputFilename=docs/transaction.md --filenameSubString=transaction --firstHeadingLevel=1 && ts2md --inputFilename=src/messages/index.ts --outputFilename=docs/messages.md --filenameSubString=messages --firstHeadingLevel=1 && ts2md --inputFilename=src/compat/index.ts --outputFilename=docs/compat.md --filenameSubString=compat --firstHeadingLevel=1 && ts2md --inputFilename=src/wallet/index.ts --outputFilename=docs/wallet.md --filenameSubString=wallet --firstHeadingLevel=1 && ts2md --inputFilename=src/wallet/substrates/index.ts --outputFilename=docs/wallet-substrates.md --filenameSubString=wallet/substrates --firstHeadingLevel=1 && ts2md --inputFilename=src/totp/index.ts --outputFilename=docs/totp.md --filenameSubString=totp --firstHeadingLevel=1 && ts2md --inputFilename=src/overlay-tools/index.ts --outputFilename=docs/overlay-tools.md --filenameSubString=overlay-tools --firstHeadingLevel=1"
23
+ "doc": "ts2md"
24
24
  },
25
25
  "repository": {
26
26
  "type": "git",
@@ -46,7 +46,7 @@
46
46
  "ts-jest": "^29.1.1",
47
47
  "ts-loader": "^9.5.1",
48
48
  "ts-standard": "^12.0.2",
49
- "ts2md": "^0.2.4",
49
+ "ts2md": "^0.2.5",
50
50
  "tsconfig-to-dual-package": "^1.2.0",
51
51
  "typescript": "^5.2.2",
52
52
  "webpack": "^5.95.0",
@@ -0,0 +1,536 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Peer = void 0;
4
+ const SessionManager_js_1 = require("./SessionManager.js");
5
+ const index_js_1 = require("./utils/index.js");
6
+ const mod_js_1 = require("../../mod.js");
7
+ const AUTH_VERSION = '0.1';
8
+ /**
9
+ * Represents a peer capable of performing mutual authentication.
10
+ * Manages sessions, handles authentication handshakes, certificate requests and responses,
11
+ * and sending and receiving general messages over a transport layer.
12
+ */
13
+ class Peer {
14
+ /**
15
+ * Creates a new Peer instance
16
+ *
17
+ * @param {Wallet} wallet - The wallet instance used for cryptographic operations.
18
+ * @param {Transport} transport - The transport mechanism used for sending and receiving messages.
19
+ * @param {RequestedCertificateSet} [certificatesToRequest] - Optional set of certificates to request from a peer during the initial handshake.
20
+ * @param {SessionManager} [sessionManager] - Optional SessionManager to be used for managing peer sessions.
21
+ */
22
+ constructor(wallet, transport, certificatesToRequest, sessionManager) {
23
+ this.onGeneralMessageReceivedCallbacks = new Map();
24
+ this.onCertificatesReceivedCallbacks = new Map();
25
+ this.onCertificateRequestReceivedCallbacks = new Map();
26
+ this.onInitialResponseReceivedCallbacks = new Map();
27
+ // Single shared counter for all callback types
28
+ this.callbackIdCounter = 0;
29
+ this.wallet = wallet;
30
+ this.transport = transport;
31
+ this.certificatesToRequest = certificatesToRequest !== null && certificatesToRequest !== void 0 ? certificatesToRequest : { certifiers: [], types: {} };
32
+ this.transport.onData(this.handleIncomingMessage.bind(this));
33
+ this.sessionManager = sessionManager || new SessionManager_js_1.SessionManager();
34
+ }
35
+ /**
36
+ * Sends a general message to a peer, and initiates a handshake if necessary.
37
+ *
38
+ * @param {number[]} message - The message payload to send.
39
+ * @param {string} [identityKey] - The identity public key of the peer. If not provided, a handshake will be initiated.
40
+ * @returns {Promise<void>}
41
+ * @throws Will throw an error if the message fails to send.
42
+ */
43
+ async toPeer(message, identityKey, maxWaitTime) {
44
+ const peerSession = await this.getAuthenticatedSession(identityKey, maxWaitTime);
45
+ // Prepare the general message
46
+ const requestNonce = mod_js_1.Utils.toBase64((0, mod_js_1.Random)(32));
47
+ const { signature } = await this.wallet.createSignature({
48
+ data: message,
49
+ protocolID: [2, 'auth message signature'],
50
+ keyID: `${requestNonce} ${peerSession.peerNonce}`,
51
+ counterparty: peerSession.peerIdentityKey
52
+ });
53
+ const generalMessage = {
54
+ version: AUTH_VERSION,
55
+ messageType: 'general',
56
+ identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
57
+ nonce: requestNonce,
58
+ yourNonce: peerSession.peerNonce,
59
+ payload: message,
60
+ signature
61
+ };
62
+ try {
63
+ await this.transport.send(generalMessage);
64
+ }
65
+ catch (error) {
66
+ const e = new Error(`Failed to send message to peer ${peerSession.peerIdentityKey}: ${error.message}`);
67
+ e.stack = error.stack;
68
+ throw e;
69
+ }
70
+ }
71
+ /**
72
+ * Sends a request for certificates to a peer.
73
+ * This method allows a peer to dynamically request specific certificates after
74
+ * an initial handshake or message has been exchanged.
75
+ *
76
+ * @param {RequestedCertificateSet} certificatesToRequest - Specifies the certifiers and types of certificates required from the peer.
77
+ * @param {string} [identityKey] - The identity public key of the peer. If not provided, the current session identity is used.
78
+ * @param {number} [maxWaitTime=10000] - Maximum time in milliseconds to wait for the peer session to be authenticated.
79
+ * @returns {Promise<void>} Resolves if the certificate request message is successfully sent.
80
+ * @throws Will throw an error if the peer session is not authenticated or if sending the request fails.
81
+ */
82
+ async requestCertificates(certificatesToRequest, identityKey, maxWaitTime = 10000) {
83
+ const peerSession = await this.getAuthenticatedSession(identityKey, maxWaitTime);
84
+ // Prepare the general message
85
+ const requestNonce = mod_js_1.Utils.toBase64((0, mod_js_1.Random)(32));
86
+ const { signature } = await this.wallet.createSignature({
87
+ data: mod_js_1.Utils.toArray(JSON.stringify(certificatesToRequest), 'utf8'),
88
+ protocolID: [2, 'auth message signature'],
89
+ keyID: `${requestNonce} ${peerSession.peerNonce}`,
90
+ counterparty: peerSession.peerIdentityKey
91
+ });
92
+ const certRequestMessage = {
93
+ version: AUTH_VERSION,
94
+ messageType: 'certificateRequest',
95
+ identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
96
+ nonce: requestNonce,
97
+ initialNonce: peerSession.sessionNonce,
98
+ yourNonce: peerSession.peerNonce,
99
+ requestedCertificates: certificatesToRequest,
100
+ signature
101
+ };
102
+ try {
103
+ await this.transport.send(certRequestMessage);
104
+ }
105
+ catch (error) {
106
+ throw new Error(`Failed to send certificate request message to peer ${peerSession.peerIdentityKey}: ${error.message}`);
107
+ }
108
+ }
109
+ /**
110
+ * Retrieves an authenticated session for a given peer identity. If no session exists
111
+ * or the session is not authenticated, initiates a handshake to create or authenticate the session.
112
+ *
113
+ * @param {string} [identityKey] - The identity public key of the peer. If provided, it attempts
114
+ * to retrieve an existing session associated with this identity.
115
+ * @param {number} [maxWaitTime] - The maximum time in milliseconds to wait for the handshake
116
+ * to complete if a new session is required. Defaults to a pre-defined timeout if not specified.
117
+ * @returns {Promise<PeerSession>} - A promise that resolves with an authenticated `PeerSession`.
118
+ * @throws {Error} - Throws an error if the transport is not connected or if the handshake fails.
119
+ */
120
+ async getAuthenticatedSession(identityKey, maxWaitTime) {
121
+ if (!this.transport) {
122
+ throw new Error('Peer transport is not connected!');
123
+ }
124
+ let peerSession = identityKey ? this.sessionManager.getSession(identityKey) : undefined;
125
+ if (!peerSession || !peerSession.isAuthenticated) {
126
+ const sessionNonce = await this.initiateHandshake(identityKey, maxWaitTime);
127
+ peerSession = this.sessionManager.getSession(identityKey || sessionNonce);
128
+ if (!peerSession.isAuthenticated) {
129
+ throw new Error('Unable to establish mutual authentication with peer!');
130
+ }
131
+ }
132
+ return peerSession;
133
+ }
134
+ /**
135
+ * Registers a callback to listen for general messages from peers.
136
+ *
137
+ * @param {(senderPublicKey: string, payload: number[]) => void} callback - The function to call when a general message is received.
138
+ * @returns {number} The ID of the callback listener.
139
+ */
140
+ listenForGeneralMessages(callback) {
141
+ const callbackID = this.callbackIdCounter++;
142
+ this.onGeneralMessageReceivedCallbacks.set(callbackID, callback);
143
+ return callbackID;
144
+ }
145
+ /**
146
+ * Removes a general message listener.
147
+ *
148
+ * @param {number} callbackID - The ID of the callback to remove.
149
+ */
150
+ stopListeningForGeneralMessages(callbackID) {
151
+ this.onGeneralMessageReceivedCallbacks.delete(callbackID);
152
+ }
153
+ /**
154
+ * Registers a callback to listen for certificates received from peers.
155
+ *
156
+ * @param {(certs: VerifiableCertificate[]) => void} callback - The function to call when certificates are received.
157
+ * @returns {number} The ID of the callback listener.
158
+ */
159
+ listenForCertificatesReceived(callback) {
160
+ const callbackID = this.callbackIdCounter++;
161
+ this.onCertificatesReceivedCallbacks.set(callbackID, callback);
162
+ return callbackID;
163
+ }
164
+ /**
165
+ * Cancels and unsubscribes a certificatesReceived listener.
166
+ *
167
+ * @param {number} callbackID - The ID of the certificates received callback to cancel.
168
+ */
169
+ stopListeningForCertificatesReceived(callbackID) {
170
+ this.onCertificatesReceivedCallbacks.delete(callbackID);
171
+ }
172
+ /**
173
+ * Registers a callback to listen for certificates requested from peers.
174
+ *
175
+ * @param {(requestedCertificates: RequestedCertificateSet) => void} callback - The function to call when a certificate request is received
176
+ * @returns {number} The ID of the callback listener.
177
+ */
178
+ listenForCertificatesRequested(callback) {
179
+ const callbackID = this.callbackIdCounter++;
180
+ this.onCertificateRequestReceivedCallbacks.set(callbackID, callback);
181
+ return callbackID;
182
+ }
183
+ /**
184
+ * Cancels and unsubscribes a certificatesRequested listener.
185
+ *
186
+ * @param {number} callbackID - The ID of the requested certificates callback to cancel.
187
+ */
188
+ stopListeningForCertificatesRequested(callbackID) {
189
+ this.onCertificateRequestReceivedCallbacks.delete(callbackID);
190
+ }
191
+ /**
192
+ * Initiates the mutual authentication handshake with a peer.
193
+ *
194
+ * @private
195
+ * @param {string} [identityKey] - The identity public key of the peer.
196
+ * @returns {Promise<string>} A promise that resolves to the session nonce.
197
+ */
198
+ async initiateHandshake(identityKey, maxWaitTime = 10000) {
199
+ const sessionNonce = await (0, index_js_1.createNonce)(this.wallet); // Initial request nonce
200
+ this.sessionManager.addSession({
201
+ isAuthenticated: false,
202
+ sessionNonce,
203
+ peerIdentityKey: identityKey
204
+ });
205
+ const initialRequest = {
206
+ version: AUTH_VERSION,
207
+ messageType: 'initialRequest',
208
+ identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
209
+ initialNonce: sessionNonce,
210
+ requestedCertificates: this.certificatesToRequest
211
+ };
212
+ await this.transport.send(initialRequest);
213
+ return await this.waitForInitialResponse(sessionNonce, maxWaitTime);
214
+ }
215
+ /**
216
+ * Waits for the initial response from the peer after sending an initial handshake request message.
217
+ *
218
+ * @param {string} sessionNonce - The session nonce created in the initial request.
219
+ * @returns {Promise<string>} A promise that resolves with the session nonce when the initial response is received.
220
+ */
221
+ async waitForInitialResponse(sessionNonce, maxWaitTime = 10000) {
222
+ return await new Promise((resolve, reject) => {
223
+ const callbackID = this.listenForInitialResponse(sessionNonce, (sessionNonce) => {
224
+ clearTimeout(timeoutHandle);
225
+ this.stopListeningForInitialResponses(callbackID);
226
+ resolve(sessionNonce);
227
+ });
228
+ const timeoutHandle = setTimeout(() => {
229
+ this.stopListeningForInitialResponses(callbackID);
230
+ reject(new Error('Initial response timed out.'));
231
+ }, maxWaitTime);
232
+ });
233
+ }
234
+ /**
235
+ * Adds a listener for an initial response message matching a specific initial nonce.
236
+ *
237
+ * @private
238
+ * @param {string} sessionNonce - The session nonce to match.
239
+ * @param {(sessionNonce: string) => void} callback - The callback to invoke when the initial response is received.
240
+ * @returns {number} The ID of the callback listener.
241
+ */
242
+ listenForInitialResponse(sessionNonce, callback) {
243
+ const callbackID = this.callbackIdCounter++;
244
+ this.onInitialResponseReceivedCallbacks.set(callbackID, { callback, sessionNonce });
245
+ return callbackID;
246
+ }
247
+ /**
248
+ * Removes a listener for initial responses.
249
+ *
250
+ * @private
251
+ * @param {number} callbackID - The ID of the callback to remove.
252
+ */
253
+ stopListeningForInitialResponses(callbackID) {
254
+ this.onInitialResponseReceivedCallbacks.delete(callbackID);
255
+ }
256
+ /**
257
+ * Handles incoming messages from the transport.
258
+ *
259
+ * @param {AuthMessage} message - The incoming message to process.
260
+ * @returns {Promise<void>}
261
+ */
262
+ async handleIncomingMessage(message) {
263
+ if (!message.version || message.version !== AUTH_VERSION) {
264
+ console.error(`Invalid message auth version! Received: ${message.version}, expected: ${AUTH_VERSION}`);
265
+ return;
266
+ }
267
+ switch (message.messageType) {
268
+ case 'initialRequest':
269
+ await this.processInitialRequest(message);
270
+ break;
271
+ case 'initialResponse':
272
+ await this.processInitialResponse(message);
273
+ break;
274
+ case 'certificateRequest':
275
+ await this.processCertificateRequest(message);
276
+ break;
277
+ case 'certificateResponse':
278
+ await this.processCertificateResponse(message);
279
+ break;
280
+ case 'general':
281
+ await this.processGeneralMessage(message);
282
+ break;
283
+ default:
284
+ console.error(`Unknown message type of ${message.messageType} from ${message.identityKey}`);
285
+ }
286
+ }
287
+ /**
288
+ * Processes an initial request message from a peer.
289
+ *
290
+ * @param {AuthMessage} message - The incoming initial request message.
291
+ * @returns {Promise<void>}
292
+ */
293
+ async processInitialRequest(message) {
294
+ var _a, _b;
295
+ if (!message.identityKey || !message.initialNonce) {
296
+ throw new Error('Missing required fields in initialResponse message.');
297
+ }
298
+ // Create an initial session nonce
299
+ const sessionNonce = await (0, index_js_1.createNonce)(this.wallet);
300
+ this.sessionManager.addSession({
301
+ isAuthenticated: true,
302
+ sessionNonce,
303
+ peerNonce: message.initialNonce,
304
+ peerIdentityKey: message.identityKey
305
+ });
306
+ // Handle initial certificate requests
307
+ let certificatesToInclude;
308
+ if (((_b = (_a = message.requestedCertificates) === null || _a === void 0 ? void 0 : _a.certifiers) === null || _b === void 0 ? void 0 : _b.length) > 0) {
309
+ if (this.onCertificateRequestReceivedCallbacks.size > 0) {
310
+ // The application wants to handle certificate requests
311
+ this.onCertificateRequestReceivedCallbacks.forEach(callback => {
312
+ callback(message.identityKey, message.requestedCertificates);
313
+ });
314
+ }
315
+ else {
316
+ // Attempt to find exact matching certificates to return automatically to save round trips
317
+ certificatesToInclude = await (0, index_js_1.getVerifiableCertificates)(this.wallet, message.requestedCertificates, message.identityKey);
318
+ }
319
+ }
320
+ // Create the signature for the message
321
+ const { signature } = await this.wallet.createSignature({
322
+ data: mod_js_1.Utils.toArray(message.initialNonce + sessionNonce, 'base64'),
323
+ protocolID: [2, 'auth message signature'],
324
+ keyID: `${message.initialNonce} ${sessionNonce}`,
325
+ counterparty: message.identityKey
326
+ });
327
+ const initialResponseMessage = {
328
+ version: AUTH_VERSION,
329
+ messageType: 'initialResponse',
330
+ identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
331
+ initialNonce: sessionNonce,
332
+ yourNonce: message.initialNonce,
333
+ certificates: certificatesToInclude,
334
+ requestedCertificates: this.certificatesToRequest,
335
+ signature
336
+ };
337
+ await this.transport.send(initialResponseMessage);
338
+ }
339
+ /**
340
+ * Processes an initial response message from a peer.
341
+ *
342
+ * @private
343
+ * @param {AuthMessage} message - The incoming initial response message.
344
+ * @returns {Promise<void>}
345
+ * @throws Will throw an error if nonce verification or signature verification fails.
346
+ */
347
+ async processInitialResponse(message) {
348
+ var _a, _b, _c, _d, _e;
349
+ const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
350
+ if (!validNonce) {
351
+ throw new Error(`Initial response nonce verification failed from peer: ${message.identityKey}`);
352
+ }
353
+ const peerSession = this.sessionManager.getSession(message.yourNonce);
354
+ if (!peerSession) {
355
+ throw new Error(`Peer session not found for peer: ${message.identityKey}`);
356
+ }
357
+ // Validate message signature
358
+ const { valid } = await this.wallet.verifySignature({
359
+ data: mod_js_1.Utils.toArray(peerSession.sessionNonce + message.initialNonce, 'base64'),
360
+ signature: message.signature,
361
+ protocolID: [2, 'auth message signature'],
362
+ keyID: `${peerSession.sessionNonce} ${message.initialNonce}`,
363
+ counterparty: message.identityKey
364
+ });
365
+ if (!valid) {
366
+ throw new Error(`Unable to verify initial response signature for peer: ${message.identityKey}`);
367
+ }
368
+ // After signature and nonce verification is complete, the peer is considered authenticated
369
+ // Save the peer's identity key and initial nonce
370
+ // This allows future requests to be linked to the same session
371
+ peerSession.peerNonce = message.initialNonce;
372
+ peerSession.peerIdentityKey = message.identityKey;
373
+ peerSession.isAuthenticated = true;
374
+ // Run update to ensure lookup is available by both peerIdentityKey and sessionNonce
375
+ this.sessionManager.updateSession(peerSession);
376
+ // Process certificates received
377
+ if (((_b = (_a = this.certificatesToRequest) === null || _a === void 0 ? void 0 : _a.certifiers) === null || _b === void 0 ? void 0 : _b.length) && ((_c = message.certificates) === null || _c === void 0 ? void 0 : _c.length)) {
378
+ await (0, index_js_1.validateCertificates)(this.wallet, message, this.certificatesToRequest);
379
+ this.onCertificatesReceivedCallbacks.forEach(callback => callback(message.identityKey, message.certificates));
380
+ }
381
+ this.onInitialResponseReceivedCallbacks.forEach((entry) => {
382
+ if (entry && entry.sessionNonce === peerSession.sessionNonce) {
383
+ entry.callback(peerSession.sessionNonce);
384
+ }
385
+ });
386
+ // Check if the peer requested certificates from us
387
+ if (((_e = (_d = message.requestedCertificates) === null || _d === void 0 ? void 0 : _d.certifiers) === null || _e === void 0 ? void 0 : _e.length) > 0) {
388
+ if (this.onCertificateRequestReceivedCallbacks.size > 0) {
389
+ // Application wants to handle certificate requests
390
+ this.onCertificateRequestReceivedCallbacks.forEach(callback => {
391
+ callback(message.identityKey, message.requestedCertificates);
392
+ });
393
+ }
394
+ else {
395
+ // Attempt to find exact matching certificates to respond automatically and save round trips
396
+ const verifiableCertificates = await (0, index_js_1.getVerifiableCertificates)(this.wallet, message.requestedCertificates, message.identityKey);
397
+ await this.sendCertificateResponse(message.identityKey, verifiableCertificates);
398
+ }
399
+ }
400
+ }
401
+ /**
402
+ * Processes an incoming certificate request message from a peer.
403
+ * Verifies the nonce and signature to ensure the authenticity of the request,
404
+ * then initiates a response with any requested certificates that are available.
405
+ *
406
+ * @param {AuthMessage} message - The certificate request message received from the peer.
407
+ * @throws {Error} Throws an error if nonce verification fails, or the message signature is invalid.
408
+ */
409
+ async processCertificateRequest(message) {
410
+ var _a, _b;
411
+ const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
412
+ if (!validNonce) {
413
+ throw new Error(`Unable to verify nonce for certificate request message from: ${message.identityKey}`);
414
+ }
415
+ const peerSession = this.sessionManager.getSession(message.yourNonce);
416
+ const { valid } = await this.wallet.verifySignature({
417
+ data: mod_js_1.Utils.toArray(JSON.stringify(message.requestedCertificates), 'utf8'),
418
+ signature: message.signature,
419
+ protocolID: [2, 'auth message signature'],
420
+ keyID: `${message.nonce} ${peerSession.sessionNonce}`,
421
+ counterparty: peerSession.peerIdentityKey
422
+ });
423
+ if (!valid) {
424
+ throw new Error(`Invalid signature in certificate request message from ${peerSession.peerIdentityKey}`);
425
+ }
426
+ if (((_b = (_a = message.requestedCertificates) === null || _a === void 0 ? void 0 : _a.certifiers) === null || _b === void 0 ? void 0 : _b.length) > 0) {
427
+ if (this.onCertificateRequestReceivedCallbacks.size > 0) {
428
+ // Application wants to handle certificate requests
429
+ this.onCertificateRequestReceivedCallbacks.forEach(callback => {
430
+ callback(message.identityKey, message.requestedCertificates);
431
+ });
432
+ }
433
+ else {
434
+ // Attempt to find exact matching certificates to respond automatically and save round trips
435
+ const verifiableCertificates = await (0, index_js_1.getVerifiableCertificates)(this.wallet, message.requestedCertificates, message.identityKey);
436
+ await this.sendCertificateResponse(message.identityKey, verifiableCertificates);
437
+ }
438
+ }
439
+ }
440
+ /**
441
+ * Sends a certificate response message containing the specified certificates to a peer.
442
+ *
443
+ * @param {string} verifierIdentityKey - The identity key of the peer requesting the certificates.
444
+ * @param {VerifiableCertificate[]} certificates - The list of certificates to be included in the response.
445
+ * @returns {Promise<void>} - A promise that resolves once the certificate response has been sent successfully.
446
+ *
447
+ * @throws {Error} Throws an error if the peer session could not be authenticated or if message signing fails.
448
+ */
449
+ async sendCertificateResponse(verifierIdentityKey, certificates) {
450
+ const peerSession = await this.getAuthenticatedSession(verifierIdentityKey);
451
+ const requestNonce = mod_js_1.Utils.toBase64((0, mod_js_1.Random)(32));
452
+ const { signature } = await this.wallet.createSignature({
453
+ data: mod_js_1.Utils.toArray(JSON.stringify(certificates), 'utf8'),
454
+ protocolID: [2, 'auth message signature'],
455
+ keyID: `${requestNonce} ${peerSession.peerNonce}`,
456
+ counterparty: peerSession.peerIdentityKey
457
+ });
458
+ const certificateResponse = {
459
+ version: AUTH_VERSION,
460
+ messageType: 'certificateResponse',
461
+ identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
462
+ nonce: requestNonce,
463
+ initialNonce: peerSession.sessionNonce,
464
+ yourNonce: peerSession.peerNonce,
465
+ certificates,
466
+ signature
467
+ };
468
+ try {
469
+ await this.transport.send(certificateResponse);
470
+ }
471
+ catch (error) {
472
+ throw new Error(`Failed to send certificate response message to peer ${peerSession.peerIdentityKey}: ${error.message}`);
473
+ }
474
+ }
475
+ /**
476
+ * Processes a certificate response message from a peer.
477
+ *
478
+ * @private
479
+ * @param {AuthMessage} message - The incoming certificate response message.
480
+ * @returns {Promise<void>}
481
+ * @throws Will throw an error if nonce verification or signature verification fails.
482
+ */
483
+ async processCertificateResponse(message) {
484
+ const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
485
+ if (!validNonce) {
486
+ throw new Error(`Unable to verify nonce for certificate response from: ${message.identityKey}!`);
487
+ }
488
+ const peerSession = this.sessionManager.getSession(message.yourNonce);
489
+ // Validate message signature
490
+ const { valid } = await this.wallet.verifySignature({
491
+ data: mod_js_1.Utils.toArray(JSON.stringify(message.certificates), 'utf8'),
492
+ signature: message.signature,
493
+ protocolID: [2, 'auth message signature'],
494
+ keyID: `${message.nonce} ${peerSession.sessionNonce}`,
495
+ counterparty: message.identityKey
496
+ });
497
+ if (!valid) {
498
+ throw new Error(`Unable to verify certificate response signature for peer: ${message.identityKey}`);
499
+ }
500
+ // Process and verify any certificates received
501
+ await (0, index_js_1.validateCertificates)(this.wallet, message, message.requestedCertificates);
502
+ this.onCertificatesReceivedCallbacks.forEach(callback => {
503
+ callback(message.identityKey, message.certificates);
504
+ });
505
+ }
506
+ /**
507
+ * Processes a general message from a peer.
508
+ *
509
+ * @private
510
+ * @param {AuthMessage} message - The incoming general message.
511
+ * @returns {Promise<void>}
512
+ * @throws Will throw an error if nonce verification or signature verification fails.
513
+ */
514
+ async processGeneralMessage(message) {
515
+ const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
516
+ if (!validNonce) {
517
+ throw new Error(`Unable to verify nonce for general message from: ${message.identityKey}`);
518
+ }
519
+ const peerSession = this.sessionManager.getSession(message.yourNonce);
520
+ const { valid } = await this.wallet.verifySignature({
521
+ data: message.payload,
522
+ signature: message.signature,
523
+ protocolID: [2, 'auth message signature'],
524
+ keyID: `${message.nonce} ${peerSession.sessionNonce}`,
525
+ counterparty: peerSession.peerIdentityKey
526
+ });
527
+ if (!valid) {
528
+ throw new Error(`Invalid signature in generalMessage from ${peerSession.peerIdentityKey}`);
529
+ }
530
+ this.onGeneralMessageReceivedCallbacks.forEach(callback => {
531
+ callback(message.identityKey, message.payload);
532
+ });
533
+ }
534
+ }
535
+ exports.Peer = Peer;
536
+ //# sourceMappingURL=Peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Peer.js","sourceRoot":"","sources":["../../../../src/auth/Peer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionManager = void 0;
4
+ /**
5
+ * Manages sessions for peers, allowing sessions to be added, retrieved, updated, and removed
6
+ * by relevant identifiers (sessionNonce and peerIdentityKey).
7
+ */
8
+ class SessionManager {
9
+ constructor() {
10
+ this.identifierToSession = new Map();
11
+ }
12
+ /**
13
+ * Adds a session to the manager, associating it with relevant identifiers for retrieval.
14
+ *
15
+ * @param {PeerSession} session - The peer session to add.
16
+ */
17
+ addSession(session) {
18
+ if (!session.sessionNonce && !session.peerIdentityKey) {
19
+ throw new Error('Invalid session: at least one of sessionNonce or peerIdentityKey is required.');
20
+ }
21
+ if (session.sessionNonce) {
22
+ this.identifierToSession.set(session.sessionNonce, session);
23
+ }
24
+ if (session.peerIdentityKey) {
25
+ this.identifierToSession.set(session.peerIdentityKey, session);
26
+ }
27
+ }
28
+ /**
29
+ * Updates a session in the manager, ensuring that all identifiers are correctly associated.
30
+ *
31
+ * @param {PeerSession} session - The peer session to update.
32
+ */
33
+ updateSession(session) {
34
+ this.removeSession(session);
35
+ this.addSession(session);
36
+ }
37
+ /**
38
+ * Retrieves a session based on a given identifier.
39
+ *
40
+ * @param {string} identifier - The identifier for the session (sessionNonce or peerIdentityKey).
41
+ * @returns {PeerSession | undefined} - The matching peer session, or undefined if not found.
42
+ */
43
+ getSession(identifier) {
44
+ return this.identifierToSession.get(identifier);
45
+ }
46
+ /**
47
+ * Removes a session from the manager by clearing all associated identifiers.
48
+ *
49
+ * @param {PeerSession} session - The peer session to remove.
50
+ */
51
+ removeSession(session) {
52
+ this.identifierToSession.delete(session.sessionNonce);
53
+ this.identifierToSession.delete(session.peerIdentityKey);
54
+ }
55
+ /**
56
+ * Checks if a session exists based on a given identifier.
57
+ *
58
+ * @param {string} identifier - The identifier to check.
59
+ * @returns {boolean} - True if the session exists, false otherwise.
60
+ */
61
+ hasSession(identifier) {
62
+ return this.identifierToSession.has(identifier);
63
+ }
64
+ }
65
+ exports.SessionManager = SessionManager;
66
+ //# sourceMappingURL=SessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../../src/auth/SessionManager.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,cAAc;IAGzB;QACE,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC3D,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAE,OAAoB;QAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAA;QAClG,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAC7D,CAAC;QACD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED;;;;MAIE;IACF,aAAa,CAAE,OAAoB;QACjC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAE,UAAkB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACjD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAE,OAAoB;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACrD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAE,UAAkB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACjD,CAAC;CACF;AAhED,wCAgEC"}