@bitgo-beta/sdk-hmac 1.0.1-beta.102 → 1.0.1-beta.1021
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.
- package/dist/src/browser.d.ts +4 -0
- package/dist/src/browser.d.ts.map +1 -0
- package/dist/src/browser.js +20 -0
- package/dist/src/defaultStrategy.d.ts +11 -0
- package/dist/src/defaultStrategy.d.ts.map +1 -0
- package/dist/src/defaultStrategy.js +21 -0
- package/dist/src/hmac.d.ts +9 -6
- package/dist/src/hmac.d.ts.map +1 -1
- package/dist/src/hmac.js +41 -22
- package/dist/src/hmacv4.d.ts +185 -0
- package/dist/src/hmacv4.d.ts.map +1 -0
- package/dist/src/hmacv4.js +274 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -1
- package/dist/src/indexedDbTokenStore.d.ts +12 -0
- package/dist/src/indexedDbTokenStore.d.ts.map +1 -0
- package/dist/src/indexedDbTokenStore.js +79 -0
- package/dist/src/types.d.ts +105 -11
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/util.d.ts +49 -0
- package/dist/src/util.d.ts.map +1 -0
- package/dist/src/util.js +85 -0
- package/dist/src/webCryptoStrategy.d.ts +75 -0
- package/dist/src/webCryptoStrategy.d.ts.map +1 -0
- package/dist/src/webCryptoStrategy.js +189 -0
- package/package.json +21 -4
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @prettier
|
|
4
|
+
*
|
|
5
|
+
* V4 HMAC Authentication Module
|
|
6
|
+
*
|
|
7
|
+
* This module implements the v4 authentication scheme which uses a canonical
|
|
8
|
+
* preimage construction with newline-separated fields and body hashing.
|
|
9
|
+
*
|
|
10
|
+
* Key differences from v2/v3:
|
|
11
|
+
* - Separator: newline (\n) instead of pipe (|)
|
|
12
|
+
* - Body: SHA256 hash of raw bytes instead of actual body content
|
|
13
|
+
* - Timestamp: seconds instead of milliseconds
|
|
14
|
+
* - New field: authRequestId for request tracking
|
|
15
|
+
* - Trailing newline in preimage
|
|
16
|
+
* - Support for x-original-* headers (proxy scenarios)
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.calculateV4Preimage = calculateV4Preimage;
|
|
20
|
+
exports.calculateBodyHash = calculateBodyHash;
|
|
21
|
+
exports.calculateV4RequestHmac = calculateV4RequestHmac;
|
|
22
|
+
exports.calculateV4RequestHeaders = calculateV4RequestHeaders;
|
|
23
|
+
exports.calculateV4ResponsePreimage = calculateV4ResponsePreimage;
|
|
24
|
+
exports.verifyV4Response = verifyV4Response;
|
|
25
|
+
exports.getPathWithQuery = getPathWithQuery;
|
|
26
|
+
exports.getMethod = getMethod;
|
|
27
|
+
const crypto_1 = require("crypto");
|
|
28
|
+
const util_1 = require("./util");
|
|
29
|
+
/**
|
|
30
|
+
* Build canonical preimage for v4 authentication.
|
|
31
|
+
*
|
|
32
|
+
* The preimage is constructed as newline-separated values with a trailing newline:
|
|
33
|
+
* ```
|
|
34
|
+
* {timestampSec}
|
|
35
|
+
* {METHOD}
|
|
36
|
+
* {pathWithQuery}
|
|
37
|
+
* {bodyHashHex}
|
|
38
|
+
* {authRequestId}
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* This function normalizes the HTTP method to uppercase and handles the
|
|
42
|
+
* legacy 'del' method conversion to 'DELETE'.
|
|
43
|
+
*
|
|
44
|
+
* @param options - The preimage components
|
|
45
|
+
* @returns Newline-separated canonical preimage string with trailing newline
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const preimage = calculateV4Preimage({
|
|
50
|
+
* timestampSec: 1761100000,
|
|
51
|
+
* method: 'post',
|
|
52
|
+
* pathWithQuery: '/v2/wallets/transfer?foo=bar',
|
|
53
|
+
* bodyHashHex: '0d5e3b7a8f9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e',
|
|
54
|
+
* authRequestId: '1b7a1d2b-7a2f-4e4b-a1f8-c2a5a0f84e3e',
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* // Result:
|
|
58
|
+
* // "1761100000\nPOST\n/v2/wallets/transfer?foo=bar\n0d5e3b...d6e\n1b7a1d2b-7a2f-4e4b-a1f8-c2a5a0f84e3e\n"
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
function calculateV4Preimage({ timestampSec, method, pathWithQuery, bodyHashHex, authRequestId, }) {
|
|
62
|
+
const normalizedMethod = (0, util_1.normalizeMethod)(method);
|
|
63
|
+
// Build newline-separated preimage with trailing newline
|
|
64
|
+
const components = [timestampSec.toString(), normalizedMethod, pathWithQuery, bodyHashHex, authRequestId];
|
|
65
|
+
return components.join('\n') + '\n';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Calculate SHA256 hash of body and return as lowercase hex string.
|
|
69
|
+
*
|
|
70
|
+
* This is used to compute the bodyHashHex field for v4 authentication.
|
|
71
|
+
* The hash is computed over the raw bytes of the request body, ensuring
|
|
72
|
+
* that the exact bytes sent over the wire are used for signature calculation.
|
|
73
|
+
*
|
|
74
|
+
* Accepts common byte representations for Node.js and browser environments,
|
|
75
|
+
* including Uint8Array and ArrayBuffer for Fetch API compatibility.
|
|
76
|
+
*
|
|
77
|
+
* @param body - Raw request body (string, Buffer, Uint8Array, or ArrayBuffer)
|
|
78
|
+
* @returns Lowercase hex SHA256 hash (64 characters)
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* // Node.js with Buffer
|
|
83
|
+
* const hash1 = calculateBodyHash(Buffer.from('{"address":"tb1q...","amount":100000}'));
|
|
84
|
+
*
|
|
85
|
+
* // Browser with Uint8Array
|
|
86
|
+
* const hash2 = calculateBodyHash(new TextEncoder().encode('{"address":"tb1q..."}'));
|
|
87
|
+
*
|
|
88
|
+
* // Browser with ArrayBuffer
|
|
89
|
+
* const hash3 = calculateBodyHash(await response.arrayBuffer());
|
|
90
|
+
*
|
|
91
|
+
* // All return: '0d5e3b7a8f...' (64 character hex string)
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
function calculateBodyHash(body) {
|
|
95
|
+
return (0, util_1.sha256Hex)(body);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Calculate the HMAC-SHA256 signature for a v4 HTTP request.
|
|
99
|
+
*
|
|
100
|
+
* This function:
|
|
101
|
+
* 1. Builds the canonical preimage from the provided options
|
|
102
|
+
* 2. Computes HMAC-SHA256 of the preimage using the raw access token
|
|
103
|
+
*
|
|
104
|
+
* @param options - Request parameters and raw access token
|
|
105
|
+
* @returns Lowercase hex HMAC-SHA256 signature
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const hmac = calculateV4RequestHmac({
|
|
110
|
+
* timestampSec: 1761100000,
|
|
111
|
+
* method: 'POST',
|
|
112
|
+
* pathWithQuery: '/v2/wallets/transfer',
|
|
113
|
+
* bodyHashHex: '0d5e3b...',
|
|
114
|
+
* authRequestId: '1b7a1d2b-7a2f-4e4b-a1f8-c2a5a0f84e3e',
|
|
115
|
+
* rawToken: 'your-token',
|
|
116
|
+
* });
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
function calculateV4RequestHmac({ timestampSec, method, pathWithQuery, bodyHashHex, authRequestId, rawToken, }) {
|
|
120
|
+
const preimage = calculateV4Preimage({
|
|
121
|
+
timestampSec,
|
|
122
|
+
method,
|
|
123
|
+
pathWithQuery,
|
|
124
|
+
bodyHashHex,
|
|
125
|
+
authRequestId,
|
|
126
|
+
});
|
|
127
|
+
return (0, util_1.createHmacWithSha256)(rawToken, preimage);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Generate all headers required for v4 authenticated requests.
|
|
131
|
+
*
|
|
132
|
+
* This is a convenience function that:
|
|
133
|
+
* 1. Generates the current timestamp (in seconds)
|
|
134
|
+
* 2. Calculates the body hash from raw bytes
|
|
135
|
+
* 3. Computes the HMAC signature
|
|
136
|
+
* 4. Returns all values needed for request headers
|
|
137
|
+
*
|
|
138
|
+
* @param options - Request parameters including raw body and raw token
|
|
139
|
+
* @returns Object containing all v4 authentication header values
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const headers = calculateV4RequestHeaders({
|
|
144
|
+
* method: 'POST',
|
|
145
|
+
* pathWithQuery: '/v2/wallets/transfer?foo=bar',
|
|
146
|
+
* rawBody: Buffer.from('{"address":"tb1q..."}'),
|
|
147
|
+
* rawToken: 'your-token',
|
|
148
|
+
* authRequestId: '1b7a1d2b-7a2f-4e4b-a1f8-c2a5a0f84e3e',
|
|
149
|
+
* });
|
|
150
|
+
*
|
|
151
|
+
* // Use headers to set:
|
|
152
|
+
* // - X-Request-Timestamp: headers.timestampSec
|
|
153
|
+
* // - X-Signature: headers.hmac
|
|
154
|
+
* // - X-Content-SHA256: headers.bodyHashHex
|
|
155
|
+
* // - X-Auth-Request-Id: headers.authRequestId
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
function calculateV4RequestHeaders({ method, pathWithQuery, rawBody, rawToken, authRequestId, }) {
|
|
159
|
+
const timestampSec = (0, util_1.getTimestampSec)();
|
|
160
|
+
const bodyHashHex = calculateBodyHash(rawBody);
|
|
161
|
+
const hmac = calculateV4RequestHmac({
|
|
162
|
+
timestampSec,
|
|
163
|
+
method,
|
|
164
|
+
pathWithQuery,
|
|
165
|
+
bodyHashHex,
|
|
166
|
+
authRequestId,
|
|
167
|
+
rawToken,
|
|
168
|
+
});
|
|
169
|
+
return {
|
|
170
|
+
hmac,
|
|
171
|
+
timestampSec,
|
|
172
|
+
bodyHashHex,
|
|
173
|
+
authRequestId,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Build canonical preimage for v4 response verification.
|
|
178
|
+
*
|
|
179
|
+
* Response preimage includes the status code and uses the same format:
|
|
180
|
+
* ```
|
|
181
|
+
* {timestampSec}
|
|
182
|
+
* {METHOD}
|
|
183
|
+
* {pathWithQuery}
|
|
184
|
+
* {statusCode}
|
|
185
|
+
* {bodyHashHex}
|
|
186
|
+
* {authRequestId}
|
|
187
|
+
* ```
|
|
188
|
+
*
|
|
189
|
+
* @param options - Response verification parameters
|
|
190
|
+
* @returns Newline-separated canonical preimage string with trailing newline
|
|
191
|
+
*/
|
|
192
|
+
function calculateV4ResponsePreimage({ timestampSec, method, pathWithQuery, statusCode, bodyHashHex, authRequestId, }) {
|
|
193
|
+
const normalizedMethod = (0, util_1.normalizeMethod)(method);
|
|
194
|
+
const components = [
|
|
195
|
+
timestampSec.toString(),
|
|
196
|
+
normalizedMethod,
|
|
197
|
+
pathWithQuery,
|
|
198
|
+
statusCode.toString(),
|
|
199
|
+
bodyHashHex,
|
|
200
|
+
authRequestId,
|
|
201
|
+
];
|
|
202
|
+
return components.join('\n') + '\n';
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Verify the HMAC signature of a v4 HTTP response.
|
|
206
|
+
*
|
|
207
|
+
* This function:
|
|
208
|
+
* 1. Reconstructs the canonical preimage from response data
|
|
209
|
+
* 2. Calculates the expected HMAC
|
|
210
|
+
* 3. Compares with the received HMAC
|
|
211
|
+
* 4. Checks if the timestamp is within the validity window
|
|
212
|
+
*
|
|
213
|
+
* The validity window is:
|
|
214
|
+
* - 5 minutes backwards (to account for clock skew and network latency)
|
|
215
|
+
* - 1 minute forwards (to account for minor clock differences)
|
|
216
|
+
*
|
|
217
|
+
* @param options - Response data and raw token for verification
|
|
218
|
+
* @returns Verification result including validity and diagnostic info
|
|
219
|
+
*/
|
|
220
|
+
function verifyV4Response({ hmac, timestampSec, method, pathWithQuery, bodyHashHex, authRequestId, statusCode, rawToken, }) {
|
|
221
|
+
// Build the response preimage
|
|
222
|
+
const preimage = calculateV4ResponsePreimage({
|
|
223
|
+
timestampSec,
|
|
224
|
+
method,
|
|
225
|
+
pathWithQuery,
|
|
226
|
+
statusCode,
|
|
227
|
+
bodyHashHex,
|
|
228
|
+
authRequestId,
|
|
229
|
+
});
|
|
230
|
+
// Calculate expected HMAC
|
|
231
|
+
const expectedHmac = (0, util_1.createHmacWithSha256)(rawToken, preimage);
|
|
232
|
+
// Use constant-time comparison to prevent timing side-channel attacks
|
|
233
|
+
const hmacBuffer = Buffer.from(hmac, 'hex');
|
|
234
|
+
const expectedHmacBuffer = Buffer.from(expectedHmac, 'hex');
|
|
235
|
+
const isHmacValid = hmacBuffer.length === expectedHmacBuffer.length && (0, crypto_1.timingSafeEqual)(hmacBuffer, expectedHmacBuffer);
|
|
236
|
+
// Check timestamp validity window
|
|
237
|
+
const nowSec = (0, util_1.getTimestampSec)();
|
|
238
|
+
const backwardValidityWindowSec = 5 * 60; // 5 minutes
|
|
239
|
+
const forwardValidityWindowSec = 1 * 60; // 1 minute
|
|
240
|
+
const isInResponseValidityWindow = timestampSec >= nowSec - backwardValidityWindowSec && timestampSec <= nowSec + forwardValidityWindowSec;
|
|
241
|
+
return {
|
|
242
|
+
isValid: isHmacValid,
|
|
243
|
+
expectedHmac,
|
|
244
|
+
preimage,
|
|
245
|
+
isInResponseValidityWindow,
|
|
246
|
+
verificationTime: Date.now(),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Extract path with query from x-original-uri header or request URL.
|
|
251
|
+
* Always canonicalizes to pathname + search to handle absolute URLs.
|
|
252
|
+
*
|
|
253
|
+
* @param xOriginalUri - Value of x-original-uri header (if present)
|
|
254
|
+
* @param requestUrl - The actual request URL
|
|
255
|
+
* @returns The canonical path with query to use for preimage calculation
|
|
256
|
+
*
|
|
257
|
+
*/
|
|
258
|
+
function getPathWithQuery(xOriginalUri, requestUrl) {
|
|
259
|
+
// Prefer x-original-uri if available (proxy scenario)
|
|
260
|
+
const rawPath = xOriginalUri ?? requestUrl;
|
|
261
|
+
return (0, util_1.extractPathWithQuery)(rawPath);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get method from x-original-method header or actual request method.
|
|
265
|
+
*
|
|
266
|
+
* @param xOriginalMethod - Value of x-original-method header (if present)
|
|
267
|
+
* @param requestMethod - The actual request method
|
|
268
|
+
* @returns The method to use for preimage calculation
|
|
269
|
+
*/
|
|
270
|
+
function getMethod(xOriginalMethod, requestMethod) {
|
|
271
|
+
// Prefer x-original-method if available (proxy scenario)
|
|
272
|
+
return xOriginalMethod ?? requestMethod;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1hY3Y0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2htYWN2NC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQW9ESCxrREFhQztBQTZCRCw4Q0FFQztBQXdCRCx3REFpQkM7QUErQkQsOERBeUJDO0FBa0JELGtFQW9CQztBQWtCRCw0Q0EyQ0M7QUFXRCw0Q0FJQztBQVNELDhCQUdDO0FBN1RELG1DQUF5QztBQUN6QyxpQ0FPZ0I7QUFVaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxFQUNsQyxZQUFZLEVBQ1osTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsYUFBYSxHQUNjO0lBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxzQkFBZSxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpELHlEQUF5RDtJQUN6RCxNQUFNLFVBQVUsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRTFHLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLElBQWtCO0lBQ2xELE9BQU8sSUFBQSxnQkFBUyxFQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsRUFDckMsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEVBQ2IsV0FBVyxFQUNYLGFBQWEsRUFDYixRQUFRLEdBQ3NCO0lBQzlCLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDO1FBQ25DLFlBQVk7UUFDWixNQUFN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QUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxZQUFnQyxFQUFFLFVBQWtCO0lBQ25GLHNEQUFzRDtJQUN0RCxNQUFNLE9BQU8sR0FBRyxZQUFZLElBQUksVUFBVSxDQUFDO0lBQzNDLE9BQU8sSUFBQSwyQkFBb0IsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLGVBQW1DLEVBQUUsYUFBcUI7SUFDbEYseURBQXlEO0lBQ3pELE9BQU8sZUFBZSxJQUFJLGFBQWEsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBWNCBITUFDIEF1dGhlbnRpY2F0aW9uIE1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHY0IGF1dGhlbnRpY2F0aW9uIHNjaGVtZSB3aGljaCB1c2VzIGEgY2Fub25pY2FsXG4gKiBwcmVpbWFnZSBjb25zdHJ1Y3Rpb24gd2l0aCBuZXdsaW5lLXNlcGFyYXRlZCBmaWVsZHMgYW5kIGJvZHkgaGFzaGluZy5cbiAqXG4gKiBLZXkgZGlmZmVyZW5jZXMgZnJvbSB2Mi92MzpcbiAqIC0gU2VwYXJhdG9yOiBuZXdsaW5lIChcXG4pIGluc3RlYWQgb2YgcGlwZSAofClcbiAqIC0gQm9keTogU0hBMjU2IGhhc2ggb2YgcmF3IGJ5dGVzIGluc3RlYWQgb2YgYWN0dWFsIGJvZHkgY29udGVudFxuICogLSBUaW1lc3RhbXA6IHNlY29uZHMgaW5zdGVhZCBvZiBtaWxsaXNlY29uZHNcbiAqIC0gTmV3IGZpZWxkOiBhdXRoUmVxdWVzdElkIGZvciByZXF1ZXN0IHRyYWNraW5nXG4gKiAtIFRyYWlsaW5nIG5ld2xpbmUgaW4gcHJlaW1hZ2VcbiAqIC0gU3VwcG9ydCBmb3IgeC1vcmlnaW5hbC0qIGhlYWRlcnMgKHByb3h5IHNjZW5hcmlvcylcbiAqL1xuXG5pbXBvcnQgeyB0aW1pbmdTYWZlRXF1YWwgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHtcbiAgY3JlYXRlSG1hY1dpdGhTaGEyNTYsXG4gIHNoYTI1NkhleCxcbiAgbm9ybWFsaXplTWV0aG9kLFxuICBnZXRUaW1lc3RhbXBTZWMsXG4gIGV4dHJhY3RQYXRoV2l0aFF1ZXJ5LFxuICB0eXBlIEhhc2hhYmxlRGF0YSxcbn0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7XG4gIENhbGN1bGF0ZVY0UHJlaW1hZ2VPcHRpb25zLFxuICBDYWxjdWxhdGVWNFJlcXVlc3RIbWFjT3B0aW9ucyxcbiAgQ2FsY3VsYXRlVjRSZXF1ZXN0SGVhZGVyc09wdGlvbnMsXG4gIFY0UmVxdWVzdEhlYWRlcnMsXG4gIFZlcmlmeVY0UmVzcG9uc2VPcHRpb25zLFxuICBWZXJpZnlWNFJlc3BvbnNlSW5mbyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQnVpbGQgY2Fub25pY2FsIHByZWltYWdlIGZvciB2NCBhdXRoZW50aWNhdGlvbi5cbiAqXG4gKiBUaGUgcHJlaW1hZ2UgaXMgY29uc3RydWN0ZWQgYXMgbmV3bGluZS1zZXBhcmF0ZWQgdmFsdWVzIHdpdGggYSB0cmFpbGluZyBuZXdsaW5lOlxuICogYGBgXG4gKiB7dGltZXN0YW1wU2VjfVxuICoge01FVEhPRH1cbiAqIHtwYXRoV2l0aFF1ZXJ5fVxuICoge2JvZHlIYXNoSGV4fVxuICoge2F1dGhSZXF1ZXN0SWR9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG5vcm1hbGl6ZXMgdGhlIEhUVFAgbWV0aG9kIHRvIHVwcGVyY2FzZSBhbmQgaGFuZGxlcyB0aGVcbiAqIGxlZ2FjeSAnZGVsJyBtZXRob2QgY29udmVyc2lvbiB0byAnREVMRVRFJy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwcmVpbWFnZSBjb21wb25lbnRzXG4gKiBAcmV0dXJucyBOZXdsaW5lLXNlcGFyYXRlZCBjYW5vbmljYWwgcHJlaW1hZ2Ugc3RyaW5nIHdpdGggdHJhaWxpbmcgbmV3bGluZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwcmVpbWFnZSA9IGNhbGN1bGF0ZVY0UHJlaW1hZ2Uoe1xuICogICB0aW1lc3RhbXBTZWM6IDE3NjExMDAwMDAsXG4gKiAgIG1ldGhvZDogJ3Bvc3QnLFxuICogICBwYXRoV2l0aFF1ZXJ5OiAnL3YyL3dhbGxldHMvdHJhbnNmZXI/Zm9vPWJhcicsXG4gKiAgIGJvZHlIYXNoSGV4OiAnMGQ1ZTNiN2E4ZjljMWQyZTNmNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNmE3YjhjOWQwZTFmMmEzYjRjNWQ2ZScsXG4gKiAgIGF1dGhSZXF1ZXN0SWQ6ICcxYjdhMWQyYi03YTJmLTRlNGItYTFmOC1jMmE1YTBmODRlM2UnLFxuICogfSk7XG4gKlxuICogLy8gUmVzdWx0OlxuICogLy8gXCIxNzYxMTAwMDAwXFxuUE9TVFxcbi92Mi93YWxsZXRzL3RyYW5zZmVyP2Zvbz1iYXJcXG4wZDVlM2IuLi5kNmVcXG4xYjdhMWQyYi03YTJmLTRlNGItYTFmOC1jMmE1YTBmODRlM2VcXG5cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVWNFByZWltYWdlKHtcbiAgdGltZXN0YW1wU2VjLFxuICBtZXRob2QsXG4gIHBhdGhXaXRoUXVlcnksXG4gIGJvZHlIYXNoSGV4LFxuICBhdXRoUmVxdWVzdElkLFxufTogQ2FsY3VsYXRlVjRQcmVpbWFnZU9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkTWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCk7XG5cbiAgLy8gQnVpbGQgbmV3bGluZS1zZXBhcmF0ZWQgcHJlaW1hZ2Ugd2l0aCB0cmFpbGluZyBuZXdsaW5lXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBbdGltZXN0YW1wU2VjLnRvU3RyaW5nKCksIG5vcm1hbGl6ZWRNZXRob2QsIHBhdGhXaXRoUXVlcnksIGJvZHlIYXNoSGV4LCBhdXRoUmVxdWVzdElkXTtcblxuICByZXR1cm4gY29tcG9uZW50cy5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBTSEEyNTYgaGFzaCBvZiBib2R5IGFuZCByZXR1cm4gYXMgbG93ZXJjYXNlIGhleCBzdHJpbmcuXG4gKlxuICogVGhpcyBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGJvZHlIYXNoSGV4IGZpZWxkIGZvciB2NCBhdXRoZW50aWNhdGlvbi5cbiAqIFRoZSBoYXNoIGlzIGNvbXB1dGVkIG92ZXIgdGhlIHJhdyBieXRlcyBvZiB0aGUgcmVxdWVzdCBib2R5LCBlbnN1cmluZ1xuICogdGhhdCB0aGUgZXhhY3QgYnl0ZXMgc2VudCBvdmVyIHRoZSB3aXJlIGFyZSB1c2VkIGZvciBzaWduYXR1cmUgY2FsY3VsYXRpb24uXG4gKlxuICogQWNjZXB0cyBjb21tb24gYnl0ZSByZXByZXNlbnRhdGlvbnMgZm9yIE5vZGUuanMgYW5kIGJyb3dzZXIgZW52aXJvbm1lbnRzLFxuICogaW5jbHVkaW5nIFVpbnQ4QXJyYXkgYW5kIEFycmF5QnVmZmVyIGZvciBGZXRjaCBBUEkgY29tcGF0aWJpbGl0eS5cbiAqXG4gKiBAcGFyYW0gYm9keSAtIFJhdyByZXF1ZXN0IGJvZHkgKHN0cmluZywgQnVmZmVyLCBVaW50OEFycmF5LCBvciBBcnJheUJ1ZmZlcilcbiAqIEByZXR1cm5zIExvd2VyY2FzZSBoZXggU0hBMjU2IGhhc2ggKDY0IGNoYXJhY3RlcnMpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIE5vZGUuanMgd2l0aCBCdWZmZXJcbiAqIGNvbnN0IGhhc2gxID0gY2FsY3VsYXRlQm9keUhhc2goQnVmZmVyLmZyb20oJ3tcImFkZHJlc3NcIjpcInRiMXEuLi5cIixcImFtb3VudFwiOjEwMDAwMH0nKSk7XG4gKlxuICogLy8gQnJvd3NlciB3aXRoIFVpbnQ4QXJyYXlcbiAqIGNvbnN0IGhhc2gyID0gY2FsY3VsYXRlQm9keUhhc2gobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCd7XCJhZGRyZXNzXCI6XCJ0YjFxLi4uXCJ9JykpO1xuICpcbiAqIC8vIEJyb3dzZXIgd2l0aCBBcnJheUJ1ZmZlclxuICogY29uc3QgaGFzaDMgPSBjYWxjdWxhdGVCb2R5SGFzaChhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAqXG4gKiAvLyBBbGwgcmV0dXJuOiAnMGQ1ZTNiN2E4Zi4uLicgKDY0IGNoYXJhY3RlciBoZXggc3RyaW5nKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVCb2R5SGFzaChib2R5OiBIYXNoYWJsZURhdGEpOiBzdHJpbmcge1xuICByZXR1cm4gc2hhMjU2SGV4KGJvZHkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgSE1BQy1TSEEyNTYgc2lnbmF0dXJlIGZvciBhIHY0IEhUVFAgcmVxdWVzdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uOlxuICogMS4gQnVpbGRzIHRoZSBjYW5vbmljYWwgcHJlaW1hZ2UgZnJvbSB0aGUgcHJvdmlkZWQgb3B0aW9uc1xuICogMi4gQ29tcHV0ZXMgSE1BQy1TSEEyNTYgb2YgdGhlIHByZWltYWdlIHVzaW5nIHRoZSByYXcgYWNjZXNzIHRva2VuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBSZXF1ZXN0IHBhcmFtZXRlcnMgYW5kIHJhdyBhY2Nlc3MgdG9rZW5cbiAqIEByZXR1cm5zIExvd2VyY2FzZSBoZXggSE1BQy1TSEEyNTYgc2lnbmF0dXJlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGhtYWMgPSBjYWxjdWxhdGVWNFJlcXVlc3RIbWFjKHtcbiAqICAgdGltZXN0YW1wU2VjOiAxNzYxMTAwMDAwLFxuICogICBtZXRob2Q6ICdQT1NUJyxcbiAqICAgcGF0aFdpdGhRdWVyeTogJy92Mi93YWxsZXRzL3RyYW5zZmVyJyxcbiAqICAgYm9keUhhc2hIZXg6ICcwZDVlM2IuLi4nLFxuICogICBhdXRoUmVxdWVzdElkOiAnMWI3YTFkMmItN2EyZi00ZTRiLWExZjgtYzJhNWEwZjg0ZTNlJyxcbiAqICAgcmF3VG9rZW46ICd5b3VyLXRva2VuJyxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVWNFJlcXVlc3RIbWFjKHtcbiAgdGltZXN0YW1wU2VjLFxuICBtZXRob2QsXG4gIHBhdGhXaXRoUXVlcnksXG4gIGJvZHlIYXNoSGV4LFxuICBhdXRoUmVxdWVzdElkLFxuICByYXdUb2tlbixcbn06IENhbGN1bGF0ZVY0UmVxdWVzdEhtYWNPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgcHJlaW1hZ2UgPSBjYWxjdWxhdGVWNFByZWltYWdlKHtcbiAgICB0aW1lc3RhbXBTZWMsXG4gICAgbWV0aG9kLFxuICAgIHBhdGhXaXRoUXVlcnksXG4gICAgYm9keUhhc2hIZXgsXG4gICAgYXV0aFJlcXVlc3RJZCxcbiAgfSk7XG5cbiAgcmV0dXJuIGNyZWF0ZUhtYWNXaXRoU2hhMjU2KHJhd1Rva2VuLCBwcmVpbWFnZSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYWxsIGhlYWRlcnMgcmVxdWlyZWQgZm9yIHY0IGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMuXG4gKlxuICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQ6XG4gKiAxLiBHZW5lcmF0ZXMgdGhlIGN1cnJlbnQgdGltZXN0YW1wIChpbiBzZWNvbmRzKVxuICogMi4gQ2FsY3VsYXRlcyB0aGUgYm9keSBoYXNoIGZyb20gcmF3IGJ5dGVzXG4gKiAzLiBDb21wdXRlcyB0aGUgSE1BQyBzaWduYXR1cmVcbiAqIDQuIFJldHVybnMgYWxsIHZhbHVlcyBuZWVkZWQgZm9yIHJlcXVlc3QgaGVhZGVyc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gUmVxdWVzdCBwYXJhbWV0ZXJzIGluY2x1ZGluZyByYXcgYm9keSBhbmQgcmF3IHRva2VuXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgdjQgYXV0aGVudGljYXRpb24gaGVhZGVyIHZhbHVlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBoZWFkZXJzID0gY2FsY3VsYXRlVjRSZXF1ZXN0SGVhZGVycyh7XG4gKiAgIG1ldGhvZDogJ1BPU1QnLFxuICogICBwYXRoV2l0aFF1ZXJ5OiAnL3YyL3dhbGxldHMvdHJhbnNmZXI/Zm9vPWJhcicsXG4gKiAgIHJhd0JvZHk6IEJ1ZmZlci5mcm9tKCd7XCJhZGRyZXNzXCI6XCJ0YjFxLi4uXCJ9JyksXG4gKiAgIHJhd1Rva2VuOiAneW91ci10b2tlbicsXG4gKiAgIGF1dGhSZXF1ZXN0SWQ6ICcxYjdhMWQyYi03YTJmLTRlNGItYTFmOC1jMmE1YTBmODRlM2UnLFxuICogfSk7XG4gKlxuICogLy8gVXNlIGhlYWRlcnMgdG8gc2V0OlxuICogLy8gLSBYLVJlcXVlc3QtVGltZXN0YW1wOiBoZWFkZXJzLnRpbWVzdGFtcFNlY1xuICogLy8gLSBYLVNpZ25hdHVyZTogaGVhZGVycy5obWFjXG4gKiAvLyAtIFgtQ29udGVudC1TSEEyNTY6IGhlYWRlcnMuYm9keUhhc2hIZXhcbiAqIC8vIC0gWC1BdXRoLVJlcXVlc3QtSWQ6IGhlYWRlcnMuYXV0aFJlcXVlc3RJZFxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVWNFJlcXVlc3RIZWFkZXJzKHtcbiAgbWV0aG9kLFxuICBwYXRoV2l0aFF1ZXJ5LFxuICByYXdCb2R5LFxuICByYXdUb2tlbixcbiAgYXV0aFJlcXVlc3RJZCxcbn06IENhbGN1bGF0ZVY0UmVxdWVzdEhlYWRlcnNPcHRpb25zKTogVjRSZXF1ZXN0SGVhZGVycyB7XG4gIGNvbnN0IHRpbWVzdGFtcFNlYyA9IGdldFRpbWVzdGFtcFNlYygpO1xuICBjb25zdCBib2R5SGFzaEhleCA9IGNhbGN1bGF0ZUJvZHlIYXNoKHJhd0JvZHkpO1xuXG4gIGNvbnN0IGhtYWMgPSBjYWxjdWxhdGVWNFJlcXVlc3RIbWFjKHtcbiAgICB0aW1lc3RhbXBTZWMsXG4gICAgbWV0aG9kLFxuICAgIHBhdGhXaXRoUXVlcnksXG4gICAgYm9keUhhc2hIZXgsXG4gICAgYXV0aFJlcXVlc3RJZCxcbiAgICByYXdUb2tlbixcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBobWFjLFxuICAgIHRpbWVzdGFtcFNlYyxcbiAgICBib2R5SGFzaEhleCxcbiAgICBhdXRoUmVxdWVzdElkLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGNhbm9uaWNhbCBwcmVpbWFnZSBmb3IgdjQgcmVzcG9uc2UgdmVyaWZpY2F0aW9uLlxuICpcbiAqIFJlc3BvbnNlIHByZWltYWdlIGluY2x1ZGVzIHRoZSBzdGF0dXMgY29kZSBhbmQgdXNlcyB0aGUgc2FtZSBmb3JtYXQ6XG4gKiBgYGBcbiAqIHt0aW1lc3RhbXBTZWN9XG4gKiB7TUVUSE9EfVxuICoge3BhdGhXaXRoUXVlcnl9XG4gKiB7c3RhdHVzQ29kZX1cbiAqIHtib2R5SGFzaEhleH1cbiAqIHthdXRoUmVxdWVzdElkfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBSZXNwb25zZSB2ZXJpZmljYXRpb24gcGFyYW1ldGVyc1xuICogQHJldHVybnMgTmV3bGluZS1zZXBhcmF0ZWQgY2Fub25pY2FsIHByZWltYWdlIHN0cmluZyB3aXRoIHRyYWlsaW5nIG5ld2xpbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVY0UmVzcG9uc2VQcmVpbWFnZSh7XG4gIHRpbWVzdGFtcFNlYyxcbiAgbWV0aG9kLFxuICBwYXRoV2l0aFF1ZXJ5LFxuICBzdGF0dXNDb2RlLFxuICBib2R5SGFzaEhleCxcbiAgYXV0aFJlcXVlc3RJZCxcbn06IE9taXQ8VmVyaWZ5VjRSZXNwb25zZU9wdGlvbnMsICdobWFjJyB8ICdyYXdUb2tlbic+KTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZE1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpO1xuXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBbXG4gICAgdGltZXN0YW1wU2VjLnRvU3RyaW5nKCksXG4gICAgbm9ybWFsaXplZE1ldGhvZCxcbiAgICBwYXRoV2l0aFF1ZXJ5LFxuICAgIHN0YXR1c0NvZGUudG9TdHJpbmcoKSxcbiAgICBib2R5SGFzaEhleCxcbiAgICBhdXRoUmVxdWVzdElkLFxuICBdO1xuXG4gIHJldHVybiBjb21wb25lbnRzLmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbi8qKlxuICogVmVyaWZ5IHRoZSBITUFDIHNpZ25hdHVyZSBvZiBhIHY0IEhUVFAgcmVzcG9uc2UuXG4gKlxuICogVGhpcyBmdW5jdGlvbjpcbiAqIDEuIFJlY29uc3RydWN0cyB0aGUgY2Fub25pY2FsIHByZWltYWdlIGZyb20gcmVzcG9uc2UgZGF0YVxuICogMi4gQ2FsY3VsYXRlcyB0aGUgZXhwZWN0ZWQgSE1BQ1xuICogMy4gQ29tcGFyZXMgd2l0aCB0aGUgcmVjZWl2ZWQgSE1BQ1xuICogNC4gQ2hlY2tzIGlmIHRoZSB0aW1lc3RhbXAgaXMgd2l0aGluIHRoZSB2YWxpZGl0eSB3aW5kb3dcbiAqXG4gKiBUaGUgdmFsaWRpdHkgd2luZG93IGlzOlxuICogLSA1IG1pbnV0ZXMgYmFja3dhcmRzICh0byBhY2NvdW50IGZvciBjbG9jayBza2V3IGFuZCBuZXR3b3JrIGxhdGVuY3kpXG4gKiAtIDEgbWludXRlIGZvcndhcmRzICh0byBhY2NvdW50IGZvciBtaW5vciBjbG9jayBkaWZmZXJlbmNlcylcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFJlc3BvbnNlIGRhdGEgYW5kIHJhdyB0b2tlbiBmb3IgdmVyaWZpY2F0aW9uXG4gKiBAcmV0dXJucyBWZXJpZmljYXRpb24gcmVzdWx0IGluY2x1ZGluZyB2YWxpZGl0eSBhbmQgZGlhZ25vc3RpYyBpbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlWNFJlc3BvbnNlKHtcbiAgaG1hYyxcbiAgdGltZXN0YW1wU2VjLFxuICBtZXRob2QsXG4gIHBhdGhXaXRoUXVlcnksXG4gIGJvZHlIYXNoSGV4LFxuICBhdXRoUmVxdWVzdElkLFxuICBzdGF0dXNDb2RlLFxuICByYXdUb2tlbixcbn06IFZlcmlmeVY0UmVzcG9uc2VPcHRpb25zKTogVmVyaWZ5VjRSZXNwb25zZUluZm8ge1xuICAvLyBCdWlsZCB0aGUgcmVzcG9uc2UgcHJlaW1hZ2VcbiAgY29uc3QgcHJlaW1hZ2UgPSBjYWxjdWxhdGVWNFJlc3BvbnNlUHJlaW1hZ2Uoe1xuICAgIHRpbWVzdGFtcFNlYyxcbiAgICBtZXRob2QsXG4gICAgcGF0aFdpdGhRdWVyeSxcbiAgICBzdGF0dXNDb2RlLFxuICAgIGJvZHlIYXNoSGV4LFxuICAgIGF1dGhSZXF1ZXN0SWQsXG4gIH0pO1xuXG4gIC8vIENhbGN1bGF0ZSBleHBlY3RlZCBITUFDXG4gIGNvbnN0IGV4cGVjdGVkSG1hYyA9IGNyZWF0ZUhtYWNXaXRoU2hhMjU2KHJhd1Rva2VuLCBwcmVpbWFnZSk7XG5cbiAgLy8gVXNlIGNvbnN0YW50LXRpbWUgY29tcGFyaXNvbiB0byBwcmV2ZW50IHRpbWluZyBzaWRlLWNoYW5uZWwgYXR0YWNrc1xuICBjb25zdCBobWFjQnVmZmVyID0gQnVmZmVyLmZyb20oaG1hYywgJ2hleCcpO1xuICBjb25zdCBleHBlY3RlZEhtYWNCdWZmZXIgPSBCdWZmZXIuZnJvbShleHBlY3RlZEhtYWMsICdoZXgnKTtcbiAgY29uc3QgaXNIbWFjVmFsaWQgPVxuICAgIGhtYWNCdWZmZXIubGVuZ3RoID09PSBleHBlY3RlZEhtYWNCdWZmZXIubGVuZ3RoICYmIHRpbWluZ1NhZmVFcXVhbChobWFjQnVmZmVyLCBleHBlY3RlZEhtYWNCdWZmZXIpO1xuXG4gIC8vIENoZWNrIHRpbWVzdGFtcCB2YWxpZGl0eSB3aW5kb3dcbiAgY29uc3Qgbm93U2VjID0gZ2V0VGltZXN0YW1wU2VjKCk7XG4gIGNvbnN0IGJhY2t3YXJkVmFsaWRpdHlXaW5kb3dTZWMgPSA1ICogNjA7IC8vIDUgbWludXRlc1xuICBjb25zdCBmb3J3YXJkVmFsaWRpdHlXaW5kb3dTZWMgPSAxICogNjA7IC8vIDEgbWludXRlXG4gIGNvbnN0IGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93ID1cbiAgICB0aW1lc3RhbXBTZWMgPj0gbm93U2VjIC0gYmFja3dhcmRWYWxpZGl0eVdpbmRvd1NlYyAmJiB0aW1lc3RhbXBTZWMgPD0gbm93U2VjICsgZm9yd2FyZFZhbGlkaXR5V2luZG93U2VjO1xuXG4gIHJldHVybiB7XG4gICAgaXNWYWxpZDogaXNIbWFjVmFsaWQsXG4gICAgZXhwZWN0ZWRIbWFjLFxuICAgIHByZWltYWdlLFxuICAgIGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93LFxuICAgIHZlcmlmaWNhdGlvblRpbWU6IERhdGUubm93KCksXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdCBwYXRoIHdpdGggcXVlcnkgZnJvbSB4LW9yaWdpbmFsLXVyaSBoZWFkZXIgb3IgcmVxdWVzdCBVUkwuXG4gKiBBbHdheXMgY2Fub25pY2FsaXplcyB0byBwYXRobmFtZSArIHNlYXJjaCB0byBoYW5kbGUgYWJzb2x1dGUgVVJMcy5cbiAqXG4gKiBAcGFyYW0geE9yaWdpbmFsVXJpIC0gVmFsdWUgb2YgeC1vcmlnaW5hbC11cmkgaGVhZGVyIChpZiBwcmVzZW50KVxuICogQHBhcmFtIHJlcXVlc3RVcmwgLSBUaGUgYWN0dWFsIHJlcXVlc3QgVVJMXG4gKiBAcmV0dXJucyBUaGUgY2Fub25pY2FsIHBhdGggd2l0aCBxdWVyeSB0byB1c2UgZm9yIHByZWltYWdlIGNhbGN1bGF0aW9uXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aFdpdGhRdWVyeSh4T3JpZ2luYWxVcmk6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUHJlZmVyIHgtb3JpZ2luYWwtdXJpIGlmIGF2YWlsYWJsZSAocHJveHkgc2NlbmFyaW8pXG4gIGNvbnN0IHJhd1BhdGggPSB4T3JpZ2luYWxVcmkgPz8gcmVxdWVzdFVybDtcbiAgcmV0dXJuIGV4dHJhY3RQYXRoV2l0aFF1ZXJ5KHJhd1BhdGgpO1xufVxuXG4vKipcbiAqIEdldCBtZXRob2QgZnJvbSB4LW9yaWdpbmFsLW1ldGhvZCBoZWFkZXIgb3IgYWN0dWFsIHJlcXVlc3QgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB4T3JpZ2luYWxNZXRob2QgLSBWYWx1ZSBvZiB4LW9yaWdpbmFsLW1ldGhvZCBoZWFkZXIgKGlmIHByZXNlbnQpXG4gKiBAcGFyYW0gcmVxdWVzdE1ldGhvZCAtIFRoZSBhY3R1YWwgcmVxdWVzdCBtZXRob2RcbiAqIEByZXR1cm5zIFRoZSBtZXRob2QgdG8gdXNlIGZvciBwcmVpbWFnZSBjYWxjdWxhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWV0aG9kKHhPcmlnaW5hbE1ldGhvZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXF1ZXN0TWV0aG9kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBQcmVmZXIgeC1vcmlnaW5hbC1tZXRob2QgaWYgYXZhaWxhYmxlIChwcm94eSBzY2VuYXJpbylcbiAgcmV0dXJuIHhPcmlnaW5hbE1ldGhvZCA/PyByZXF1ZXN0TWV0aG9kO1xufVxuIl19
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -15,5 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./hmac"), exports);
|
|
18
|
+
__exportStar(require("./hmacv4"), exports);
|
|
19
|
+
__exportStar(require("./util"), exports);
|
|
18
20
|
__exportStar(require("./types"), exports);
|
|
19
|
-
|
|
21
|
+
__exportStar(require("./defaultStrategy"), exports);
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUF1QjtBQUN2QiwyQ0FBeUI7QUFDekIseUNBQXVCO0FBQ3ZCLDBDQUF3QjtBQUN4QixvREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2htYWMnO1xuZXhwb3J0ICogZnJvbSAnLi9obWFjdjQnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZWZhdWx0U3RyYXRlZ3knO1xuIl19
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CryptoSigning, ITokenStore } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Persists {@link CryptoSigning} material in the browser's IndexedDB.
|
|
4
|
+
* The raw bearer token is never stored — only the non-extractable CryptoKey
|
|
5
|
+
* and the SHA-256 token hash are persisted via the structured clone algorithm.
|
|
6
|
+
*/
|
|
7
|
+
export declare class IndexedDbTokenStore implements ITokenStore {
|
|
8
|
+
save(signing: CryptoSigning): Promise<void>;
|
|
9
|
+
load(): Promise<CryptoSigning | null>;
|
|
10
|
+
remove(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=indexedDbTokenStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexedDbTokenStore.d.ts","sourceRoot":"","sources":["../../src/indexedDbTokenStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwE1D;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IAC/C,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,IAAI,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IndexedDbTokenStore = void 0;
|
|
4
|
+
const CRYPTO_DB_NAME = 'bitgo-auth';
|
|
5
|
+
const CRYPTO_STORE_NAME = 'crypto-signing';
|
|
6
|
+
const CRYPTO_RECORD_KEY = 'current';
|
|
7
|
+
function hasIndexedDB() {
|
|
8
|
+
return typeof indexedDB !== 'undefined';
|
|
9
|
+
}
|
|
10
|
+
function openCryptoDb() {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const request = indexedDB.open(CRYPTO_DB_NAME, 1);
|
|
13
|
+
request.onupgradeneeded = () => {
|
|
14
|
+
const db = request.result;
|
|
15
|
+
if (!db.objectStoreNames.contains(CRYPTO_STORE_NAME)) {
|
|
16
|
+
db.createObjectStore(CRYPTO_STORE_NAME);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
request.onsuccess = () => resolve(request.result);
|
|
20
|
+
request.onerror = () => reject(request.error);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async function withDb(fn) {
|
|
24
|
+
const db = await openCryptoDb();
|
|
25
|
+
try {
|
|
26
|
+
return await fn(db);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
db.close();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function persistCryptoSigning(signing) {
|
|
33
|
+
if (!hasIndexedDB())
|
|
34
|
+
return;
|
|
35
|
+
await withDb((db) => new Promise((resolve, reject) => {
|
|
36
|
+
const tx = db.transaction(CRYPTO_STORE_NAME, 'readwrite');
|
|
37
|
+
tx.objectStore(CRYPTO_STORE_NAME).put(signing, CRYPTO_RECORD_KEY);
|
|
38
|
+
tx.oncomplete = () => resolve();
|
|
39
|
+
tx.onerror = () => reject(tx.error);
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
async function loadCryptoSigning() {
|
|
43
|
+
if (!hasIndexedDB())
|
|
44
|
+
return null;
|
|
45
|
+
return withDb((db) => new Promise((resolve, reject) => {
|
|
46
|
+
const tx = db.transaction(CRYPTO_STORE_NAME, 'readonly');
|
|
47
|
+
const request = tx.objectStore(CRYPTO_STORE_NAME).get(CRYPTO_RECORD_KEY);
|
|
48
|
+
request.onsuccess = () => resolve(request.result ?? null);
|
|
49
|
+
request.onerror = () => reject(request.error);
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
async function removeCryptoSigning() {
|
|
53
|
+
if (!hasIndexedDB())
|
|
54
|
+
return;
|
|
55
|
+
await withDb((db) => new Promise((resolve, reject) => {
|
|
56
|
+
const tx = db.transaction(CRYPTO_STORE_NAME, 'readwrite');
|
|
57
|
+
tx.objectStore(CRYPTO_STORE_NAME).delete(CRYPTO_RECORD_KEY);
|
|
58
|
+
tx.oncomplete = () => resolve();
|
|
59
|
+
tx.onerror = () => reject(tx.error);
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Persists {@link CryptoSigning} material in the browser's IndexedDB.
|
|
64
|
+
* The raw bearer token is never stored — only the non-extractable CryptoKey
|
|
65
|
+
* and the SHA-256 token hash are persisted via the structured clone algorithm.
|
|
66
|
+
*/
|
|
67
|
+
class IndexedDbTokenStore {
|
|
68
|
+
async save(signing) {
|
|
69
|
+
await persistCryptoSigning(signing);
|
|
70
|
+
}
|
|
71
|
+
async load() {
|
|
72
|
+
return loadCryptoSigning();
|
|
73
|
+
}
|
|
74
|
+
async remove() {
|
|
75
|
+
await removeCryptoSigning();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.IndexedDbTokenStore = IndexedDbTokenStore;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZERiVG9rZW5TdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleGVkRGJUb2tlblN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUNwQyxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO0FBQzNDLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDO0FBRXBDLFNBQVMsWUFBWTtJQUNuQixPQUFPLE9BQU8sU0FBUyxLQUFLLFdBQVcsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxZQUFZO0lBQ25CLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsT0FBTyxDQUFDLGVBQWUsR0FBRyxHQUFHLEVBQUU7WUFDN0IsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixPQUFPLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxNQUFNLENBQUksRUFBbUM7SUFDMUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxZQUFZLEVBQUUs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O0NBQ0Y7QUFaRCxrREFZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ3J5cHRvU2lnbmluZywgSVRva2VuU3RvcmUgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQ1JZUFRPX0RCX05BTUUgPSAnYml0Z28tYXV0aCc7XG5jb25zdCBDUllQVE9fU1RPUkVfTkFNRSA9ICdjcnlwdG8tc2lnbmluZyc7XG5jb25zdCBDUllQVE9fUkVDT1JEX0tFWSA9ICdjdXJyZW50JztcblxuZnVuY3Rpb24gaGFzSW5kZXhlZERCKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGluZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIG9wZW5DcnlwdG9EYigpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKENSWVBUT19EQl9OQU1FLCAxKTtcbiAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGRiID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoQ1JZUFRPX1NUT1JFX05BTUUpKSB7XG4gICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKENSWVBUT19TVE9SRV9OQU1FKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2l0aERiPFQ+KGZuOiAoZGI6IElEQkRhdGFiYXNlKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGRiID0gYXdhaXQgb3BlbkNyeXB0b0RiKCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKGRiKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBkYi5jbG9zZSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RDcnlwdG9TaWduaW5nKHNpZ25pbmc6IENyeXB0b1NpZ25pbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFoYXNJbmRleGVkREIoKSkgcmV0dXJuO1xuICBhd2FpdCB3aXRoRGIoXG4gICAgKGRiKSA9PlxuICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKENSWVBUT19TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgIHR4Lm9iamVjdFN0b3JlKENSWVBUT19TVE9SRV9OQU1FKS5wdXQoc2lnbmluZywgQ1JZUFRPX1JFQ09SRF9LRVkpO1xuICAgICAgICB0eC5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICB0eC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHR4LmVycm9yKTtcbiAgICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRDcnlwdG9TaWduaW5nKCk6IFByb21pc2U8Q3J5cHRvU2lnbmluZyB8IG51bGw+IHtcbiAgaWYgKCFoYXNJbmRleGVkREIoKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB3aXRoRGIoXG4gICAgKGRiKSA9PlxuICAgICAgbmV3IFByb21pc2U8Q3J5cHRvU2lnbmluZyB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdHggPSBkYi50cmFuc2FjdGlvbihDUllQVE9fU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0eC5vYmplY3RTdG9yZShDUllQVE9fU1RPUkVfTkFNRSkuZ2V0KENSWVBUT19SRUNPUkRfS0VZKTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcXVlc3QucmVzdWx0ID8/IG51bGwpO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICB9KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVDcnlwdG9TaWduaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWhhc0luZGV4ZWREQigpKSByZXR1cm47XG4gIGF3YWl0IHdpdGhEYihcbiAgICAoZGIpID0+XG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHR4ID0gZGIudHJhbnNhY3Rpb24oQ1JZUFRPX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgdHgub2JqZWN0U3RvcmUoQ1JZUFRPX1NUT1JFX05BTUUpLmRlbGV0ZShDUllQVE9fUkVDT1JEX0tFWSk7XG4gICAgICAgIHR4Lm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHR4Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QodHguZXJyb3IpO1xuICAgICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBQZXJzaXN0cyB7QGxpbmsgQ3J5cHRvU2lnbmluZ30gbWF0ZXJpYWwgaW4gdGhlIGJyb3dzZXIncyBJbmRleGVkREIuXG4gKiBUaGUgcmF3IGJlYXJlciB0b2tlbiBpcyBuZXZlciBzdG9yZWQg4oCUIG9ubHkgdGhlIG5vbi1leHRyYWN0YWJsZSBDcnlwdG9LZXlcbiAqIGFuZCB0aGUgU0hBLTI1NiB0b2tlbiBoYXNoIGFyZSBwZXJzaXN0ZWQgdmlhIHRoZSBzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobS5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZGV4ZWREYlRva2VuU3RvcmUgaW1wbGVtZW50cyBJVG9rZW5TdG9yZSB7XG4gIGFzeW5jIHNhdmUoc2lnbmluZzogQ3J5cHRvU2lnbmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHBlcnNpc3RDcnlwdG9TaWduaW5nKHNpZ25pbmcpO1xuICB9XG5cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPENyeXB0b1NpZ25pbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIGxvYWRDcnlwdG9TaWduaW5nKCk7XG4gIH1cblxuICBhc3luYyByZW1vdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgcmVtb3ZlQ3J5cHRvU2lnbmluZygpO1xuICB9XG59XG4iXX0=
|
package/dist/src/types.d.ts
CHANGED
|
@@ -1,47 +1,141 @@
|
|
|
1
|
-
export declare const supportedRequestMethods: readonly ["get", "post", "put", "del", "patch", "options"];
|
|
1
|
+
export declare const supportedRequestMethods: readonly ["get", "post", "put", "del", "patch", "options", "delete"];
|
|
2
2
|
export type AuthVersion = 2 | 3;
|
|
3
|
-
export interface CalculateHmacSubjectOptions {
|
|
3
|
+
export interface CalculateHmacSubjectOptions<T> {
|
|
4
4
|
urlPath: string;
|
|
5
|
-
text:
|
|
5
|
+
text: T;
|
|
6
6
|
timestamp: number;
|
|
7
7
|
method: (typeof supportedRequestMethods)[number];
|
|
8
8
|
statusCode?: number;
|
|
9
9
|
authVersion: AuthVersion;
|
|
10
10
|
}
|
|
11
|
-
export interface CalculateRequestHmacOptions {
|
|
11
|
+
export interface CalculateRequestHmacOptions<T extends string | Buffer = string> {
|
|
12
12
|
url: string;
|
|
13
|
-
text:
|
|
13
|
+
text: T;
|
|
14
14
|
timestamp: number;
|
|
15
15
|
token: string;
|
|
16
16
|
method: (typeof supportedRequestMethods)[number];
|
|
17
17
|
authVersion: AuthVersion;
|
|
18
18
|
}
|
|
19
|
-
export interface CalculateRequestHeadersOptions {
|
|
19
|
+
export interface CalculateRequestHeadersOptions<T extends string | Buffer = string> {
|
|
20
20
|
url: string;
|
|
21
|
-
text:
|
|
21
|
+
text: T;
|
|
22
22
|
token: string;
|
|
23
23
|
method: (typeof supportedRequestMethods)[number];
|
|
24
24
|
authVersion: AuthVersion;
|
|
25
25
|
}
|
|
26
|
+
export type CalculateRequestHeadersWebCryptoOptions<T extends string | Buffer = string> = Omit<CalculateRequestHeadersOptions<T>, 'token'>;
|
|
26
27
|
export interface RequestHeaders {
|
|
27
28
|
hmac: string;
|
|
28
29
|
timestamp: number;
|
|
29
30
|
tokenHash: string;
|
|
30
31
|
}
|
|
31
|
-
export interface VerifyResponseOptions extends CalculateRequestHeadersOptions {
|
|
32
|
+
export interface VerifyResponseOptions<T extends string | Buffer = string> extends CalculateRequestHeadersOptions<T> {
|
|
32
33
|
hmac: string;
|
|
33
34
|
url: string;
|
|
34
|
-
text:
|
|
35
|
+
text: T;
|
|
35
36
|
timestamp: number;
|
|
36
37
|
method: (typeof supportedRequestMethods)[number];
|
|
37
38
|
statusCode?: number;
|
|
38
39
|
authVersion: AuthVersion;
|
|
39
40
|
}
|
|
40
|
-
export interface VerifyResponseInfo {
|
|
41
|
+
export interface VerifyResponseInfo<T extends string | Buffer = string> {
|
|
41
42
|
isValid: boolean;
|
|
42
43
|
expectedHmac: string;
|
|
43
|
-
signatureSubject:
|
|
44
|
+
signatureSubject: T;
|
|
44
45
|
isInResponseValidityWindow: boolean;
|
|
45
46
|
verificationTime: number;
|
|
46
47
|
}
|
|
48
|
+
export interface CalculateV4PreimageOptions {
|
|
49
|
+
timestampSec: number;
|
|
50
|
+
method: string;
|
|
51
|
+
pathWithQuery: string;
|
|
52
|
+
bodyHashHex: string;
|
|
53
|
+
authRequestId: string;
|
|
54
|
+
}
|
|
55
|
+
export interface CalculateV4RequestHmacOptions extends CalculateV4PreimageOptions {
|
|
56
|
+
rawToken: string;
|
|
57
|
+
}
|
|
58
|
+
import type { HashableData } from './util';
|
|
59
|
+
export interface CalculateV4RequestHeadersOptions {
|
|
60
|
+
method: string;
|
|
61
|
+
pathWithQuery: string;
|
|
62
|
+
rawBody: HashableData;
|
|
63
|
+
rawToken: string;
|
|
64
|
+
authRequestId: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Headers generated for V4 authenticated requests.
|
|
68
|
+
*/
|
|
69
|
+
export interface V4RequestHeaders {
|
|
70
|
+
hmac: string;
|
|
71
|
+
timestampSec: number;
|
|
72
|
+
bodyHashHex: string;
|
|
73
|
+
authRequestId: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Options for verifying V4 response HMAC.
|
|
77
|
+
*/
|
|
78
|
+
export interface VerifyV4ResponseOptions {
|
|
79
|
+
hmac: string;
|
|
80
|
+
timestampSec: number;
|
|
81
|
+
method: string;
|
|
82
|
+
pathWithQuery: string;
|
|
83
|
+
bodyHashHex: string;
|
|
84
|
+
authRequestId: string;
|
|
85
|
+
statusCode: number;
|
|
86
|
+
rawToken: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Result of V4 response HMAC verification.
|
|
90
|
+
*/
|
|
91
|
+
export interface VerifyV4ResponseInfo {
|
|
92
|
+
isValid: boolean;
|
|
93
|
+
expectedHmac: string;
|
|
94
|
+
preimage: string;
|
|
95
|
+
isInResponseValidityWindow: boolean;
|
|
96
|
+
verificationTime: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Strategy interface for pluggable HMAC authentication.
|
|
100
|
+
*
|
|
101
|
+
* Implementations handle request signing, response verification, and general HMAC
|
|
102
|
+
* computation. All methods are async to support browser WebCrypto (crypto.subtle).
|
|
103
|
+
*
|
|
104
|
+
* The `token` field in params is provided for implementations that use it directly
|
|
105
|
+
* (e.g. DefaultHmacAuthStrategy). Implementations that manage their own key material
|
|
106
|
+
* (e.g. WebCryptoHmacStrategy with a CryptoKey) may ignore it.
|
|
107
|
+
*/
|
|
108
|
+
export interface IHmacAuthStrategy {
|
|
109
|
+
calculateRequestHeaders(params: CalculateRequestHeadersOptions): Promise<RequestHeaders>;
|
|
110
|
+
verifyResponse(params: VerifyResponseOptions): Promise<VerifyResponseInfo>;
|
|
111
|
+
calculateHMAC(key: string, message: string): Promise<string>;
|
|
112
|
+
/**
|
|
113
|
+
* Optional. Returns true if the strategy has its own signing material
|
|
114
|
+
* (e.g. a CryptoKey restored from IndexedDB) and can sign requests
|
|
115
|
+
* independently of BitGoAPI._token.
|
|
116
|
+
*
|
|
117
|
+
* When this returns true, BitGoAPI.requestPatch will delegate signing
|
|
118
|
+
* to the strategy even if no raw token string is available.
|
|
119
|
+
*/
|
|
120
|
+
isAuthenticated?(): boolean;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Opaque signing material derived from a bearer token.
|
|
124
|
+
* Stored in IndexedDB (CryptoKey is preserved via structured clone).
|
|
125
|
+
* The raw token is never persisted — only the non-extractable key and the hash.
|
|
126
|
+
*/
|
|
127
|
+
export type CryptoSigning = {
|
|
128
|
+
cryptoKey: CryptoKey;
|
|
129
|
+
tokenHash: string;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Pluggable persistence interface for {@link CryptoSigning} material.
|
|
133
|
+
* Allows different storage backends (IndexedDB, in-memory for tests) for
|
|
134
|
+
* persisting signing keys across page refreshes or app restarts.
|
|
135
|
+
*/
|
|
136
|
+
export interface ITokenStore {
|
|
137
|
+
save(signing: CryptoSigning): Promise<void>;
|
|
138
|
+
load(): Promise<CryptoSigning | null>;
|
|
139
|
+
remove(): Promise<void>;
|
|
140
|
+
}
|
|
47
141
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.supportedRequestMethods = void 0;
|
|
4
|
-
exports.supportedRequestMethods = ['get', 'post', 'put', 'del', 'patch', 'options'];
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
exports.supportedRequestMethods = ['get', 'post', 'put', 'del', 'patch', 'options', 'delete'];
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSx1QkFBdUIsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHN1cHBvcnRlZFJlcXVlc3RNZXRob2RzID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsJywgJ3BhdGNoJywgJ29wdGlvbnMnLCAnZGVsZXRlJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEF1dGhWZXJzaW9uID0gMiB8IDM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zPFQ+IHtcbiAgdXJsUGF0aDogc3RyaW5nO1xuICB0ZXh0OiBUO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgbWV0aG9kOiAodHlwZW9mIHN1cHBvcnRlZFJlcXVlc3RNZXRob2RzKVtudW1iZXJdO1xuICBzdGF0dXNDb2RlPzogbnVtYmVyO1xuICBhdXRoVmVyc2lvbjogQXV0aFZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsY3VsYXRlUmVxdWVzdEhtYWNPcHRpb25zPFQgZXh0ZW5kcyBzdHJpbmcgfCBCdWZmZXIgPSBzdHJpbmc+IHtcbiAgdXJsOiBzdHJpbmc7XG4gIHRleHQ6IFQ7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICB0b2tlbjogc3RyaW5nO1xuICBtZXRob2Q6ICh0eXBlb2Ygc3VwcG9ydGVkUmVxdWVzdE1ldGhvZHMpW251bWJlcl07XG4gIGF1dGhWZXJzaW9uOiBBdXRoVmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnM8VCBleHRlbmRzIHN0cmluZyB8IEJ1ZmZlciA9IHN0cmluZz4ge1xuICB1cmw6IHN0cmluZztcbiAgdGV4dDogVDtcbiAgdG9rZW46IHN0cmluZztcbiAgbWV0aG9kOiAodHlwZW9mIHN1cHBvcnRlZFJlcXVlc3RNZXRob2RzKVtudW1iZXJdO1xuICBhdXRoVmVyc2lvbjogQXV0aFZlcnNpb247XG59XG5cbmV4cG9ydCB0eXBlIENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzV2ViQ3J5cHRvT3B0aW9uczxUIGV4dGVuZHMgc3RyaW5nIHwgQnVmZmVyID0gc3RyaW5nPiA9IE9taXQ8XG4gIENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzT3B0aW9uczxUPixcbiAgJ3Rva2VuJ1xuPjtcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0SGVhZGVycyB7XG4gIGhtYWM6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIHRva2VuSGFzaDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVJlc3BvbnNlT3B0aW9uczxUIGV4dGVuZHMgc3RyaW5nIHwgQnVmZmVyID0gc3RyaW5nPiBleHRlbmRzIENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzT3B0aW9uczxUPiB7XG4gIGhtYWM6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHRleHQ6IFQ7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBtZXRob2Q6ICh0eXBlb2Ygc3VwcG9ydGVkUmVxdWVzdE1ldGhvZHMpW251bWJlcl07XG4gIHN0YXR1c0NvZGU/OiBudW1iZXI7XG4gIGF1dGhWZXJzaW9uOiBBdXRoVmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlSZXNwb25zZUluZm88VCBleHRlbmRzIHN0cmluZyB8IEJ1ZmZlciA9IHN0cmluZz4ge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBleHBlY3RlZEhtYWM6IHN0cmluZztcbiAgc2lnbmF0dXJlU3ViamVjdDogVDtcbiAgaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3c6IGJvb2xlYW47XG4gIHZlcmlmaWNhdGlvblRpbWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxjdWxhdGVWNFByZWltYWdlT3B0aW9ucyB7XG4gIHRpbWVzdGFtcFNlYzogbnVtYmVyO1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGF0aFdpdGhRdWVyeTogc3RyaW5nO1xuICBib2R5SGFzaEhleDogc3RyaW5nO1xuICBhdXRoUmVxdWVzdElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsY3VsYXRlVjRSZXF1ZXN0SG1hY09wdGlvbnMgZXh0ZW5kcyBDYWxjdWxhdGVWNFByZWltYWdlT3B0aW9ucyB7XG4gIHJhd1Rva2VuOiBzdHJpbmc7XG59XG5cbmltcG9ydCB0eXBlIHsgSGFzaGFibGVEYXRhIH0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBDYWxjdWxhdGVWNFJlcXVlc3RIZWFkZXJzT3B0aW9ucyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXRoV2l0aFF1ZXJ5OiBzdHJpbmc7XG4gIHJhd0JvZHk6IEhhc2hhYmxlRGF0YTtcbiAgcmF3VG9rZW46IHN0cmluZztcbiAgYXV0aFJlcXVlc3RJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlYWRlcnMgZ2VuZXJhdGVkIGZvciBWNCBhdXRoZW50aWNhdGVkIHJlcXVlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFY0UmVxdWVzdEhlYWRlcnMge1xuICBobWFjOiBzdHJpbmc7XG4gIHRpbWVzdGFtcFNlYzogbnVtYmVyO1xuICBib2R5SGFzaEhleDogc3RyaW5nO1xuICBhdXRoUmVxdWVzdElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdmVyaWZ5aW5nIFY0IHJlc3BvbnNlIEhNQUMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VjRSZXNwb25zZU9wdGlvbnMge1xuICBobWFjOiBzdHJpbmc7XG4gIHRpbWVzdGFtcFNlYzogbnVtYmVyO1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGF0aFdpdGhRdWVyeTogc3RyaW5nO1xuICBib2R5SGFzaEhleDogc3RyaW5nO1xuICBhdXRoUmVxdWVzdElkOiBzdHJpbmc7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmF3VG9rZW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgVjQgcmVzcG9uc2UgSE1BQyB2ZXJpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VjRSZXNwb25zZUluZm8ge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBleHBlY3RlZEhtYWM6IHN0cmluZztcbiAgcHJlaW1hZ2U6IHN0cmluZztcbiAgaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3c6IGJvb2xlYW47XG4gIHZlcmlmaWNhdGlvblRpbWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHBsdWdnYWJsZSBITUFDIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEltcGxlbWVudGF0aW9ucyBoYW5kbGUgcmVxdWVzdCBzaWduaW5nLCByZXNwb25zZSB2ZXJpZmljYXRpb24sIGFuZCBnZW5lcmFsIEhNQUNcbiAqIGNvbXB1dGF0aW9uLiBBbGwgbWV0aG9kcyBhcmUgYXN5bmMgdG8gc3VwcG9ydCBicm93c2VyIFdlYkNyeXB0byAoY3J5cHRvLnN1YnRsZSkuXG4gKlxuICogVGhlIGB0b2tlbmAgZmllbGQgaW4gcGFyYW1zIGlzIHByb3ZpZGVkIGZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgaXQgZGlyZWN0bHlcbiAqIChlLmcuIERlZmF1bHRIbWFjQXV0aFN0cmF0ZWd5KS4gSW1wbGVtZW50YXRpb25zIHRoYXQgbWFuYWdlIHRoZWlyIG93biBrZXkgbWF0ZXJpYWxcbiAqIChlLmcuIFdlYkNyeXB0b0htYWNTdHJhdGVneSB3aXRoIGEgQ3J5cHRvS2V5KSBtYXkgaWdub3JlIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIbWFjQXV0aFN0cmF0ZWd5IHtcbiAgY2FsY3VsYXRlUmVxdWVzdEhlYWRlcnMocGFyYW1zOiBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnMpOiBQcm9taXNlPFJlcXVlc3RIZWFkZXJzPjtcblxuICB2ZXJpZnlSZXNwb25zZShwYXJhbXM6IFZlcmlmeVJlc3BvbnNlT3B0aW9ucyk6IFByb21pc2U8VmVyaWZ5UmVzcG9uc2VJbmZvPjtcblxuICBjYWxjdWxhdGVITUFDKGtleTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsLiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmF0ZWd5IGhhcyBpdHMgb3duIHNpZ25pbmcgbWF0ZXJpYWxcbiAgICogKGUuZy4gYSBDcnlwdG9LZXkgcmVzdG9yZWQgZnJvbSBJbmRleGVkREIpIGFuZCBjYW4gc2lnbiByZXF1ZXN0c1xuICAgKiBpbmRlcGVuZGVudGx5IG9mIEJpdEdvQVBJLl90b2tlbi5cbiAgICpcbiAgICogV2hlbiB0aGlzIHJldHVybnMgdHJ1ZSwgQml0R29BUEkucmVxdWVzdFBhdGNoIHdpbGwgZGVsZWdhdGUgc2lnbmluZ1xuICAgKiB0byB0aGUgc3RyYXRlZ3kgZXZlbiBpZiBubyByYXcgdG9rZW4gc3RyaW5nIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIGlzQXV0aGVudGljYXRlZD8oKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcGFxdWUgc2lnbmluZyBtYXRlcmlhbCBkZXJpdmVkIGZyb20gYSBiZWFyZXIgdG9rZW4uXG4gKiBTdG9yZWQgaW4gSW5kZXhlZERCIChDcnlwdG9LZXkgaXMgcHJlc2VydmVkIHZpYSBzdHJ1Y3R1cmVkIGNsb25lKS5cbiAqIFRoZSByYXcgdG9rZW4gaXMgbmV2ZXIgcGVyc2lzdGVkIOKAlCBvbmx5IHRoZSBub24tZXh0cmFjdGFibGUga2V5IGFuZCB0aGUgaGFzaC5cbiAqL1xuZXhwb3J0IHR5cGUgQ3J5cHRvU2lnbmluZyA9IHtcbiAgY3J5cHRvS2V5OiBDcnlwdG9LZXk7XG4gIHRva2VuSGFzaDogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQbHVnZ2FibGUgcGVyc2lzdGVuY2UgaW50ZXJmYWNlIGZvciB7QGxpbmsgQ3J5cHRvU2lnbmluZ30gbWF0ZXJpYWwuXG4gKiBBbGxvd3MgZGlmZmVyZW50IHN0b3JhZ2UgYmFja2VuZHMgKEluZGV4ZWREQiwgaW4tbWVtb3J5IGZvciB0ZXN0cykgZm9yXG4gKiBwZXJzaXN0aW5nIHNpZ25pbmcga2V5cyBhY3Jvc3MgcGFnZSByZWZyZXNoZXMgb3IgYXBwIHJlc3RhcnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElUb2tlblN0b3JlIHtcbiAgc2F2ZShzaWduaW5nOiBDcnlwdG9TaWduaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgbG9hZCgpOiBQcm9taXNlPENyeXB0b1NpZ25pbmcgfCBudWxsPjtcbiAgcmVtb3ZlKCk6IFByb21pc2U8dm9pZD47XG59XG4iXX0=
|