@bitgo-beta/sdk-api 1.10.1-beta.199 → 1.10.1-beta.1990

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 (91) hide show
  1. package/dist/package.json +23 -27
  2. package/dist/src/api.d.ts +8 -5
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +134 -72
  5. package/dist/src/bitgoAPI.d.ts +108 -29
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +674 -330
  8. package/dist/src/decryptV1.d.ts +60 -0
  9. package/dist/src/decryptV1.d.ts.map +1 -0
  10. package/dist/src/decryptV1.js +140 -0
  11. package/dist/src/encrypt.d.ts +37 -6
  12. package/dist/src/encrypt.d.ts.map +1 -1
  13. package/dist/src/encrypt.js +171 -15
  14. package/dist/src/encryptV2.d.ts +68 -0
  15. package/dist/src/encryptV2.d.ts.map +1 -0
  16. package/dist/src/encryptV2.js +202 -0
  17. package/dist/src/encryptionSession.d.ts +34 -0
  18. package/dist/src/encryptionSession.d.ts.map +1 -0
  19. package/dist/src/encryptionSession.js +95 -0
  20. package/dist/src/index.d.ts +3 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +9 -2
  23. package/dist/src/types.d.ts +70 -43
  24. package/dist/src/types.d.ts.map +1 -1
  25. package/dist/src/types.js +4 -2
  26. package/dist/src/util.d.ts +12 -0
  27. package/dist/src/util.d.ts.map +1 -1
  28. package/dist/src/util.js +57 -4
  29. package/dist/src/v1/blockchain.js +25 -12
  30. package/dist/src/v1/keychains.js +39 -26
  31. package/dist/src/v1/markets.js +10 -5
  32. package/dist/src/v1/pendingapproval.d.ts.map +1 -1
  33. package/dist/src/v1/pendingapproval.js +57 -18
  34. package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
  35. package/dist/src/v1/pendingapprovals.js +41 -7
  36. package/dist/src/v1/signPsbt.d.ts +14 -0
  37. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  38. package/dist/src/v1/signPsbt.js +69 -0
  39. package/dist/src/v1/transactionBuilder.js +221 -91
  40. package/dist/src/v1/travelRule.js +125 -66
  41. package/dist/src/v1/verifyAddress.d.ts +6 -0
  42. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  43. package/dist/src/v1/verifyAddress.js +50 -0
  44. package/dist/src/v1/wallet.d.ts.map +1 -1
  45. package/dist/src/v1/wallet.js +498 -230
  46. package/dist/src/v1/wallets.js +118 -53
  47. package/dist/test/unit/api.d.ts +2 -0
  48. package/dist/test/unit/api.d.ts.map +1 -0
  49. package/dist/test/unit/api.js +307 -0
  50. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  51. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  52. package/dist/test/unit/bitgoAPI.js +1061 -0
  53. package/dist/test/unit/decryptV1.browser.d.ts +2 -0
  54. package/dist/test/unit/decryptV1.browser.d.ts.map +1 -0
  55. package/dist/test/unit/decryptV1.browser.js +133 -0
  56. package/dist/test/unit/decryptV1.d.ts +2 -0
  57. package/dist/test/unit/decryptV1.d.ts.map +1 -0
  58. package/dist/test/unit/decryptV1.js +230 -0
  59. package/dist/test/unit/encrypt.d.ts +2 -0
  60. package/dist/test/unit/encrypt.d.ts.map +1 -0
  61. package/dist/test/unit/encrypt.js +377 -0
  62. package/dist/test/unit/fixtures/keycard.d.ts +25 -0
  63. package/dist/test/unit/fixtures/keycard.d.ts.map +1 -0
  64. package/dist/test/unit/fixtures/keycard.js +28 -0
  65. package/dist/test/unit/hmacStrategy.d.ts +2 -0
  66. package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
  67. package/dist/test/unit/hmacStrategy.js +136 -0
  68. package/dist/test/unit/utils.d.ts +2 -0
  69. package/dist/test/unit/utils.d.ts.map +1 -0
  70. package/dist/test/unit/utils.js +65 -0
  71. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  72. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  73. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  74. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  75. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  76. package/dist/test/unit/v1/fixtures/index.js +24 -0
  77. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  78. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  79. package/dist/test/unit/v1/signPsbt.js +53 -0
  80. package/dist/test/unit/v1/travelRule.d.ts +2 -0
  81. package/dist/test/unit/v1/travelRule.d.ts.map +1 -0
  82. package/dist/test/unit/v1/travelRule.js +125 -0
  83. package/dist/test/unit/v1/wallet.d.ts +2 -0
  84. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  85. package/dist/test/unit/v1/wallet.js +1717 -0
  86. package/dist/tsconfig.tsbuildinfo +1 -0
  87. package/package.json +23 -27
  88. package/.eslintignore +0 -5
  89. package/CHANGELOG.md +0 -605
  90. package/dist/web/main.js +0 -2
  91. package/dist/web/main.js.LICENSE.txt +0 -110
@@ -0,0 +1,377 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const crypto_1 = require("crypto");
8
+ const src_1 = require("../../src");
9
+ const bitgoAPI_1 = require("../../src/bitgoAPI");
10
+ describe('encryption methods tests', () => {
11
+ describe('encrypt (async, default v2)', () => {
12
+ const password = 'myPassword';
13
+ const plaintext = 'Hello, World!';
14
+ it('encrypts the plaintext with the given password', async () => {
15
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext);
16
+ (0, assert_1.default)(ciphertext !== plaintext, 'ciphertext should not be equal to plaintext');
17
+ });
18
+ it('produces a v2 envelope by default', async () => {
19
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext);
20
+ const envelope = JSON.parse(ciphertext);
21
+ assert_1.default.strictEqual(envelope.v, 2);
22
+ });
23
+ it('returns a different ciphertext for the same plaintext and password', async () => {
24
+ const ciphertext1 = await (0, src_1.encrypt)(password, plaintext);
25
+ const ciphertext2 = await (0, src_1.encrypt)(password, plaintext);
26
+ (0, assert_1.default)(ciphertext1 !== ciphertext2, 'ciphertexts should not be equal');
27
+ });
28
+ it('forwards adata to the v2 envelope', async () => {
29
+ const adata = 'txhash:m/0/1';
30
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext, { adata });
31
+ const envelope = JSON.parse(ciphertext);
32
+ assert_1.default.strictEqual(envelope.adata, adata);
33
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ciphertext), plaintext);
34
+ });
35
+ });
36
+ describe('encrypt with encryptionVersion: 1 (legacy v1)', () => {
37
+ const password = 'myPassword';
38
+ const plaintext = 'Hello, World!';
39
+ it('produces a v1 envelope that decrypts back via decrypt', async () => {
40
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1 });
41
+ const envelope = JSON.parse(ciphertext);
42
+ assert_1.default.notStrictEqual(envelope.v, 2, 'encryptionVersion 1 should not produce a v2 envelope');
43
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ciphertext), plaintext);
44
+ });
45
+ it('throws an error if the salt length is not 8 bytes', async () => {
46
+ await assert_1.default.rejects(() => (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1, salt: (0, crypto_1.randomBytes)(4) }), /salt must be 8 bytes/);
47
+ });
48
+ it('throws an error if the iv length is not 16 bytes', async () => {
49
+ await assert_1.default.rejects(() => (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1, iv: (0, crypto_1.randomBytes)(4) }), /iv must be 16 bytes/);
50
+ });
51
+ it('forwards salt and iv options for deterministic v1 output', async () => {
52
+ const salt = (0, crypto_1.randomBytes)(8);
53
+ const iv = (0, crypto_1.randomBytes)(16);
54
+ const ct1 = await (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1, salt, iv });
55
+ const ct2 = await (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1, salt, iv });
56
+ assert_1.default.strictEqual(ct1, ct2);
57
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ct1), plaintext);
58
+ });
59
+ });
60
+ describe('decrypt (auto-detect v1/v2)', () => {
61
+ const password = 'myPassword';
62
+ const plaintext = 'Hello, World!';
63
+ it('decrypts default v2 data', async () => {
64
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext);
65
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ciphertext), plaintext);
66
+ });
67
+ it('decrypts legacy v1 data', async () => {
68
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1 });
69
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ciphertext), plaintext);
70
+ });
71
+ it('throws on wrong password for v1', async () => {
72
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1 });
73
+ await assert_1.default.rejects(() => (0, src_1.decrypt)('wrongPassword', ciphertext));
74
+ });
75
+ it('throws on wrong password for v2', async () => {
76
+ const ciphertext = await (0, src_1.encrypt)(password, plaintext);
77
+ await assert_1.default.rejects(() => (0, src_1.decrypt)('wrongPassword', ciphertext));
78
+ });
79
+ it('throws on invalid JSON input', async () => {
80
+ await assert_1.default.rejects(() => (0, src_1.decrypt)(password, 'not-json'), /ciphertext is not valid JSON/);
81
+ });
82
+ it('wrong password on v2 data does not fall through to v1 decrypt', async () => {
83
+ const v2ct = await (0, src_1.encryptV2)(password, plaintext, { memorySize: 1024, iterations: 1, parallelism: 1 });
84
+ let caughtError;
85
+ try {
86
+ await (0, src_1.decrypt)('wrong', v2ct);
87
+ }
88
+ catch (e) {
89
+ caughtError = e;
90
+ }
91
+ assert_1.default.ok(caughtError, 'should have thrown');
92
+ assert_1.default.ok(!caughtError.message?.includes('sjcl'), 'error must not be from SJCL');
93
+ });
94
+ });
95
+ describe('v2 encrypt/decrypt (Argon2id + AES-256-GCM)', () => {
96
+ const password = 'myPassword';
97
+ const plaintext = 'Hello, World!';
98
+ it('encrypts and decrypts round-trip', async () => {
99
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
100
+ const decrypted = await (0, src_1.decryptV2)(password, ciphertext);
101
+ assert_1.default.strictEqual(decrypted, plaintext);
102
+ });
103
+ it('produces a valid v2 envelope', async () => {
104
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
105
+ const envelope = JSON.parse(ciphertext);
106
+ assert_1.default.strictEqual(envelope.v, 2);
107
+ assert_1.default.strictEqual(envelope.m, 65536);
108
+ assert_1.default.strictEqual(envelope.t, 3);
109
+ assert_1.default.strictEqual(envelope.p, 4);
110
+ assert_1.default.ok(envelope.salt, 'envelope must have salt');
111
+ assert_1.default.ok(envelope.iv, 'envelope must have iv');
112
+ assert_1.default.ok(envelope.ct, 'envelope must have ct');
113
+ });
114
+ it('returns different ciphertext for the same plaintext and password', async () => {
115
+ const ct1 = await (0, src_1.encryptV2)(password, plaintext);
116
+ const ct2 = await (0, src_1.encryptV2)(password, plaintext);
117
+ assert_1.default.notStrictEqual(ct1, ct2);
118
+ });
119
+ it('decrypts with custom Argon2id parameters', async () => {
120
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext, {
121
+ memorySize: 1024,
122
+ iterations: 1,
123
+ parallelism: 1,
124
+ });
125
+ const envelope = JSON.parse(ciphertext);
126
+ assert_1.default.strictEqual(envelope.m, 1024);
127
+ assert_1.default.strictEqual(envelope.t, 1);
128
+ assert_1.default.strictEqual(envelope.p, 1);
129
+ const decrypted = await (0, src_1.decryptV2)(password, ciphertext);
130
+ assert_1.default.strictEqual(decrypted, plaintext);
131
+ });
132
+ it('throws on wrong password', async () => {
133
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
134
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)('wrongPassword', ciphertext));
135
+ });
136
+ it('throws on invalid JSON', async () => {
137
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, 'not-json'), /invalid JSON envelope/);
138
+ });
139
+ it('throws on wrong envelope version', async () => {
140
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify({ v: 99 })), /invalid envelope/);
141
+ });
142
+ it('throws on invalid salt length', async () => {
143
+ await assert_1.default.rejects(() => (0, src_1.encryptV2)(password, plaintext, { salt: new Uint8Array(8) }), /salt must be 16 bytes/);
144
+ });
145
+ it('throws on invalid iv length', async () => {
146
+ await assert_1.default.rejects(() => (0, src_1.encryptV2)(password, plaintext, { iv: new Uint8Array(8) }), /iv must be 12 bytes/);
147
+ });
148
+ it('encrypts and decrypts with adata (AAD)', async () => {
149
+ const adata = 'txhash:m/0/1';
150
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext, { adata });
151
+ const envelope = JSON.parse(ciphertext);
152
+ assert_1.default.strictEqual(envelope.adata, adata);
153
+ const decrypted = await (0, src_1.decryptV2)(password, ciphertext);
154
+ assert_1.default.strictEqual(decrypted, plaintext);
155
+ });
156
+ it('adata mismatch causes GCM decryption failure', async () => {
157
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext, { adata: 'context-A' });
158
+ const envelope = JSON.parse(ciphertext);
159
+ envelope.adata = 'context-B';
160
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /operation-specific reason|incorrect/i);
161
+ });
162
+ it('adata: undefined is equivalent to omitting adata', async () => {
163
+ const fixedOpts = {
164
+ memorySize: 1024,
165
+ iterations: 1,
166
+ parallelism: 1,
167
+ salt: new Uint8Array(16).fill(0xaa),
168
+ iv: new Uint8Array(12).fill(0xbb),
169
+ };
170
+ const withUndefined = await (0, src_1.encryptV2)(password, plaintext, { ...fixedOpts, adata: undefined });
171
+ const withOmitted = await (0, src_1.encryptV2)(password, plaintext, fixedOpts);
172
+ assert_1.default.strictEqual(withUndefined, withOmitted);
173
+ assert_1.default.strictEqual(await (0, src_1.decryptV2)(password, withUndefined), plaintext);
174
+ });
175
+ it('ciphertext bound to enterprise-A cannot be re-attributed to enterprise-B', async () => {
176
+ const prv = 'xprv-private-key-bytes';
177
+ const prfKey = 'prf-derived-key';
178
+ const ct = await (0, src_1.encryptV2)(prfKey, prv, { adata: 'enterprise-A' });
179
+ // Attacker moves blob to enterprise-B by altering the stored adata field
180
+ const envelope = JSON.parse(ct);
181
+ envelope.adata = 'enterprise-B';
182
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(prfKey, JSON.stringify(envelope)));
183
+ });
184
+ it('v1 and v2 are independent (v1 data does not decrypt with v2)', async () => {
185
+ const v1ct = await (0, src_1.encrypt)(password, plaintext, { encryptionVersion: 1 });
186
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, v1ct), /invalid envelope/);
187
+ });
188
+ it('rejects envelope with memorySize exceeding max', async () => {
189
+ const envelope = { v: 2, m: 999999999, t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
190
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
191
+ });
192
+ it('rejects envelope with iterations exceeding max', async () => {
193
+ const envelope = { v: 2, m: 65536, t: 100, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
194
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
195
+ });
196
+ it('rejects envelope with parallelism exceeding max', async () => {
197
+ const envelope = { v: 2, m: 65536, t: 3, p: 100, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
198
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
199
+ });
200
+ it('rejects envelope with zero-valued parameters', async () => {
201
+ const envelope = { v: 2, m: 0, t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
202
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
203
+ });
204
+ it('rejects envelope with non-numeric parameter types', async () => {
205
+ const envelope = { v: 2, m: '65536', t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
206
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
207
+ });
208
+ it('rejects envelope with empty salt', async () => {
209
+ const envelope = { v: 2, m: 65536, t: 3, p: 4, salt: '', iv: 'AAAA', ct: 'AAAA' };
210
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
211
+ });
212
+ });
213
+ describe('EncryptionSession (HKDF caching)', () => {
214
+ const opts = { memorySize: 1024, iterations: 1, parallelism: 1 };
215
+ const password = 'test-password';
216
+ const plaintext = 'hello session';
217
+ it('session-produced envelope contains salt and hkdfSalt', async () => {
218
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
219
+ const ct = await session.encrypt(plaintext);
220
+ session.destroy();
221
+ const envelope = JSON.parse(ct);
222
+ assert_1.default.strictEqual(envelope.v, 2);
223
+ assert_1.default.ok(envelope.salt, 'must have argon2 salt');
224
+ assert_1.default.ok(envelope.hkdfSalt, 'must have hkdf salt');
225
+ assert_1.default.ok(envelope.iv, 'must have iv');
226
+ assert_1.default.ok(envelope.ct, 'must have ciphertext');
227
+ });
228
+ it('session round-trip via session.decrypt', async () => {
229
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
230
+ const ct = await session.encrypt(plaintext);
231
+ const result = await session.decrypt(ct);
232
+ session.destroy();
233
+ assert_1.default.strictEqual(result, plaintext);
234
+ });
235
+ it('session envelope can be decrypted standalone via decryptV2', async () => {
236
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
237
+ const ct = await session.encrypt(plaintext);
238
+ session.destroy();
239
+ const result = await (0, src_1.decryptV2)(password, ct);
240
+ assert_1.default.strictEqual(result, plaintext);
241
+ });
242
+ it('session envelope can be decrypted via decrypt', async () => {
243
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
244
+ const ct = await session.encrypt(plaintext);
245
+ session.destroy();
246
+ const result = await (0, src_1.decrypt)(password, ct);
247
+ assert_1.default.strictEqual(result, plaintext);
248
+ });
249
+ it('multiple encrypts produce different hkdfSalt values', async () => {
250
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
251
+ const ct1 = await session.encrypt(plaintext);
252
+ const ct2 = await session.encrypt(plaintext);
253
+ session.destroy();
254
+ const e1 = JSON.parse(ct1);
255
+ const e2 = JSON.parse(ct2);
256
+ assert_1.default.notStrictEqual(e1.hkdfSalt, e2.hkdfSalt);
257
+ });
258
+ it('all session encrypts share the same argon2 salt', async () => {
259
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
260
+ const ct1 = await session.encrypt(plaintext);
261
+ const ct2 = await session.encrypt(plaintext);
262
+ session.destroy();
263
+ const e1 = JSON.parse(ct1);
264
+ const e2 = JSON.parse(ct2);
265
+ assert_1.default.strictEqual(e1.salt, e2.salt);
266
+ });
267
+ it('wrong password rejected by decryptV2', async () => {
268
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
269
+ const ct = await session.encrypt(plaintext);
270
+ session.destroy();
271
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)('wrong-password', ct));
272
+ });
273
+ it('destroy prevents further encrypt calls', async () => {
274
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
275
+ session.destroy();
276
+ await assert_1.default.rejects(() => session.encrypt(plaintext), /destroyed/);
277
+ });
278
+ it('destroy prevents further decrypt calls', async () => {
279
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
280
+ const ct = await session.encrypt(plaintext);
281
+ session.destroy();
282
+ await assert_1.default.rejects(() => session.decrypt(ct), /destroyed/);
283
+ });
284
+ it('session rejects envelopes from a different session', async () => {
285
+ const session1 = await (0, src_1.createEncryptionSession)(password, opts);
286
+ const session2 = await (0, src_1.createEncryptionSession)(password, opts);
287
+ const ct = await session1.encrypt(plaintext);
288
+ await assert_1.default.rejects(() => session2.decrypt(ct), /not encrypted with this session/);
289
+ session1.destroy();
290
+ session2.destroy();
291
+ });
292
+ it('session encrypt with adata round-trip', async () => {
293
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
294
+ const adata = 'txhash:m/0/1:round1';
295
+ const ct = await session.encrypt(plaintext, adata);
296
+ const envelope = JSON.parse(ct);
297
+ assert_1.default.strictEqual(envelope.adata, adata);
298
+ const result = await session.decrypt(ct);
299
+ assert_1.default.strictEqual(result, plaintext);
300
+ session.destroy();
301
+ });
302
+ it('session encrypt with adata is decryptable via decryptV2', async () => {
303
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
304
+ const ct = await session.encrypt(plaintext, 'context-binding');
305
+ session.destroy();
306
+ const result = await (0, src_1.decryptV2)(password, ct);
307
+ assert_1.default.strictEqual(result, plaintext);
308
+ });
309
+ it('session adata mismatch causes GCM failure', async () => {
310
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
311
+ const ct = await session.encrypt(plaintext, 'original-context');
312
+ const envelope = JSON.parse(ct);
313
+ envelope.adata = 'tampered-context';
314
+ await assert_1.default.rejects(() => session.decrypt(JSON.stringify(envelope)), /operation-specific reason|incorrect/i);
315
+ session.destroy();
316
+ });
317
+ it('session rejects standard v2 envelopes (no hkdfSalt)', async () => {
318
+ const v2ct = await (0, src_1.encryptV2)(password, plaintext, opts);
319
+ const session = await (0, src_1.createEncryptionSession)(password, opts);
320
+ await assert_1.default.rejects(() => session.decrypt(v2ct), /use decryptV2/);
321
+ session.destroy();
322
+ });
323
+ it('Argon2id params are stored in envelope', async () => {
324
+ const session = await (0, src_1.createEncryptionSession)(password, { memorySize: 2048, iterations: 2, parallelism: 2 });
325
+ const ct = await session.encrypt(plaintext);
326
+ session.destroy();
327
+ const envelope = JSON.parse(ct);
328
+ assert_1.default.strictEqual(envelope.m, 2048);
329
+ assert_1.default.strictEqual(envelope.t, 2);
330
+ assert_1.default.strictEqual(envelope.p, 2);
331
+ });
332
+ });
333
+ describe('BitGoAPI.encrypt', () => {
334
+ let bitgo;
335
+ const password = 'test-password';
336
+ const plaintext = 'hello encrypt';
337
+ before(() => {
338
+ bitgo = new bitgoAPI_1.BitGoAPI({ env: 'test' });
339
+ });
340
+ it('produces a v2 envelope by default and output is decryptable via decrypt', async () => {
341
+ const ct = await bitgo.encrypt({ input: plaintext, password });
342
+ const envelope = JSON.parse(ct);
343
+ assert_1.default.strictEqual(envelope.v, 2);
344
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ct), plaintext);
345
+ });
346
+ it('produces a v1 envelope when encryptionVersion: 1', async () => {
347
+ const ct = await bitgo.encrypt({ input: plaintext, password, encryptionVersion: 1 });
348
+ const envelope = JSON.parse(ct);
349
+ assert_1.default.notStrictEqual(envelope.v, 2);
350
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ct), plaintext);
351
+ });
352
+ it('forwards adata to v2 envelope', async () => {
353
+ const adata = 'txhash:m/0/1';
354
+ const ct = await bitgo.encrypt({ input: plaintext, password, adata });
355
+ const envelope = JSON.parse(ct);
356
+ assert_1.default.strictEqual(envelope.adata, adata);
357
+ assert_1.default.strictEqual(await (0, src_1.decrypt)(password, ct), plaintext);
358
+ });
359
+ });
360
+ describe('BitGoAPI.createEncryptionSession', () => {
361
+ let bitgo;
362
+ const password = 'test-password';
363
+ const plaintext = 'hello session';
364
+ before(() => {
365
+ bitgo = new bitgoAPI_1.BitGoAPI({ env: 'test' });
366
+ });
367
+ it('returns working session (encrypt/decrypt/destroy)', async () => {
368
+ const session = await bitgo.createEncryptionSession(password);
369
+ const ct = await session.encrypt(plaintext);
370
+ const result = await session.decrypt(ct);
371
+ assert_1.default.strictEqual(result, plaintext);
372
+ session.destroy();
373
+ await assert_1.default.rejects(() => session.encrypt(plaintext), /destroyed/);
374
+ });
375
+ });
376
+ });
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFxQztBQUVyQyxtQ0FBd0c7QUFDeEcsaURBQThDO0FBRTlDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1FBRWxDLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM5RCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN0RCxJQUFBLGdCQUFNLEVBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sUUFBUSxHQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsRixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsYUFBTyxFQUFDLFFBQVEs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LENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2xGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxlQUFTLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pFLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3hGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxlQUFTLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2xGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxlQUFTLEVBQUMsUUFBUSxF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QUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IGRlY3J5cHQsIGRlY3J5cHRWMiwgZW5jcnlwdCwgZW5jcnlwdFYyLCBWMkVudmVsb3BlLCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJy4uLy4uL3NyYy9iaXRnb0FQSSc7XG5cbmRlc2NyaWJlKCdlbmNyeXB0aW9uIG1ldGhvZHMgdGVzdHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdlbmNyeXB0IChhc3luYywgZGVmYXVsdCB2MiknLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuXG4gICAgaXQoJ2VuY3J5cHRzIHRoZSBwbGFpbnRleHQgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGFzc2VydChjaXBoZXJ0ZXh0ICE9PSBwbGFpbnRleHQsICdjaXBoZXJ0ZXh0IHNob3VsZCBub3QgYmUgZXF1YWwgdG8gcGxhaW50ZXh0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvZHVjZXMgYSB2MiBlbnZlbG9wZSBieSBkZWZhdWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBhIGRpZmZlcmVudCBjaXBoZXJ0ZXh0IGZvciB0aGUgc2FtZSBwbGFpbnRleHQgYW5kIHBhc3N3b3JkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dDEgPSBhd2FpdCBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDIgPSBhd2FpdCBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXNzZXJ0KGNpcGhlcnRleHQxICE9PSBjaXBoZXJ0ZXh0MiwgJ2NpcGhlcnRleHRzIHNob3VsZCBub3QgYmUgZXF1YWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3J3YXJkcyBhZGF0YSB0byB0aGUgdjIgZW52ZWxvcGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhZGF0YSA9ICd0eGhhc2g6bS8wLzEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgeyBhZGF0YSB9KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5hZGF0YSwgYWRhdGEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGF3YWl0IGRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpLCBwbGFpbnRleHQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW5jcnlwdCB3aXRoIGVuY3J5cHRpb25WZXJzaW9uOiAxIChsZWdhY3kgdjEpJywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcblxuICAgIGl0KCdwcm9kdWNlcyBhIHYxIGVudmVsb3BlIHRoYXQgZGVjcnlwdHMgYmFjayB2aWEgZGVjcnlwdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgZW5jcnlwdGlvblZlcnNpb246IDEgfSk7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMiwgJ2VuY3J5cHRpb25WZXJzaW9uIDEgc2hvdWxkIG5vdCBwcm9kdWNlIGEgdjIgZW52ZWxvcGUnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhd2FpdCBkZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KSwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNhbHQgbGVuZ3RoIGlzIG5vdCA4IGJ5dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgeyBlbmNyeXB0aW9uVmVyc2lvbjogMSwgc2FsdDogcmFuZG9tQnl0ZXMoNCkgfSksXG4gICAgICAgIC9zYWx0IG11c3QgYmUgOCBieXRlcy9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIGFuIGVycm9yIGlmIHRoZSBpdiBsZW5ndGggaXMgbm90IDE2IGJ5dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgeyBlbmNyeXB0aW9uVmVyc2lvbjogMSwgaXY6IHJhbmRvbUJ5dGVzKDQpIH0pLFxuICAgICAgICAvaXYgbXVzdCBiZSAxNiBieXRlcy9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yd2FyZHMgc2FsdCBhbmQgaXYgb3B0aW9ucyBmb3IgZGV0ZXJtaW5pc3RpYyB2MSBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYWx0ID0gcmFuZG9tQnl0ZXMoOCk7XG4gICAgICBjb25zdCBpdiA9IHJhbmRvbUJ5dGVzKDE2KTtcbiAgICAgIGNvbnN0IGN0MSA9IGF3YWl0IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgeyBlbmNyeXB0aW9uVmVyc2lvbjogMSwgc2FsdCwgaXYgfSk7XG4gICAgICBjb25zdCBjdDIgPSBhd2FpdCBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgZW5jcnlwdGlvblZlcnNpb246IDEsIHNhbHQsIGl2IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN0MSwgY3QyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhd2FpdCBkZWNyeXB0KHBhc3N3b3JkLCBjdDEpLCBwbGFpbnRleHQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVjcnlwdCAoYXV0by1kZXRlY3QgdjEvdjIpJywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcblxuICAgIGl0KCdkZWNyeXB0cyBkZWZhdWx0IHYyIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhd2FpdCBkZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KSwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyBsZWdhY3kgdjEgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgZW5jcnlwdGlvblZlcnNpb246IDEgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYXdhaXQgZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCksIHBsYWludGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIHBhc3N3b3JkIGZvciB2MScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgZW5jcnlwdGlvblZlcnNpb246IDEgfSk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0KCd3cm9uZ1Bhc3N3b3JkJywgY2lwaGVydGV4dCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiB3cm9uZyBwYXNzd29yZCBmb3IgdjInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHQoJ3dyb25nUGFzc3dvcmQnLCBjaXBoZXJ0ZXh0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIGludmFsaWQgSlNPTiBpbnB1dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHQocGFzc3dvcmQsICdub3QtanNvbicpLCAvY2lwaGVydGV4dCBpcyBub3QgdmFsaWQgSlNPTi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dyb25nIHBhc3N3b3JkIG9uIHYyIGRhdGEgZG9lcyBub3QgZmFsbCB0aHJvdWdoIHRvIHYxIGRlY3J5cHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MmN0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgbWVtb3J5U2l6ZTogMTAyNCwgaXRlcmF0aW9uczogMSwgcGFyYWxsZWxpc206IDEgfSk7XG4gICAgICBsZXQgY2F1Z2h0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGVjcnlwdCgnd3JvbmcnLCB2MmN0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgfVxuICAgICAgYXNzZXJ0Lm9rKGNhdWdodEVycm9yLCAnc2hvdWxkIGhhdmUgdGhyb3duJyk7XG4gICAgICBhc3NlcnQub2soIWNhdWdodEVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdzamNsJyksICdlcnJvciBtdXN0IG5vdCBiZSBmcm9tIFNKQ0wnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3YyIGVuY3J5cHQvZGVjcnlwdCAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSknLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuXG4gICAgaXQoJ2VuY3J5cHRzIGFuZCBkZWNyeXB0cyByb3VuZC10cmlwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHRWMihwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkLCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Byb2R1Y2VzIGEgdmFsaWQgdjIgZW52ZWxvcGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgZW52ZWxvcGU6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnYsIDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLm0sIDY1NTM2KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS50LCAzKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5wLCA0KTtcbiAgICAgIGFzc2VydC5vayhlbnZlbG9wZS5zYWx0LCAnZW52ZWxvcGUgbXVzdCBoYXZlIHNhbHQnKTtcbiAgICAgIGFzc2VydC5vayhlbnZlbG9wZS5pdiwgJ2VudmVsb3BlIG11c3QgaGF2ZSBpdicpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLmN0LCAnZW52ZWxvcGUgbXVzdCBoYXZlIGN0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBkaWZmZXJlbnQgY2lwaGVydGV4dCBmb3IgdGhlIHNhbWUgcGxhaW50ZXh0IGFuZCBwYXNzd29yZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN0MSA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGN0MiA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChjdDEsIGN0Mik7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVjcnlwdHMgd2l0aCBjdXN0b20gQXJnb24yaWQgcGFyYW1ldGVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwge1xuICAgICAgICBtZW1vcnlTaXplOiAxMDI0LFxuICAgICAgICBpdGVyYXRpb25zOiAxLFxuICAgICAgICBwYXJhbGxlbGlzbTogMSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZW52ZWxvcGU6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLm0sIDEwMjQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnQsIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnAsIDEpO1xuXG4gICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY3J5cHRlZCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gd3JvbmcgcGFzc3dvcmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKCd3cm9uZ1Bhc3N3b3JkJywgY2lwaGVydGV4dCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIEpTT04nLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsICdub3QtanNvbicpLCAvaW52YWxpZCBKU09OIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIGVudmVsb3BlIHZlcnNpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KHsgdjogOTkgfSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIHNhbHQgbGVuZ3RoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgc2FsdDogbmV3IFVpbnQ4QXJyYXkoOCkgfSksIC9zYWx0IG11c3QgYmUgMTYgYnl0ZXMvKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gaW52YWxpZCBpdiBsZW5ndGgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBpdjogbmV3IFVpbnQ4QXJyYXkoOCkgfSksIC9pdiBtdXN0IGJlIDEyIGJ5dGVzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5jcnlwdHMgYW5kIGRlY3J5cHRzIHdpdGggYWRhdGEgKEFBRCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhZGF0YSA9ICd0eGhhc2g6bS8wLzEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhIH0pO1xuICAgICAgY29uc3QgZW52ZWxvcGU6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLmFkYXRhLCBhZGF0YSk7XG4gICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY3J5cHRlZCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdhZGF0YSBtaXNtYXRjaCBjYXVzZXMgR0NNIGRlY3J5cHRpb24gZmFpbHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBhZGF0YTogJ2NvbnRleHQtQScgfSk7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgICBlbnZlbG9wZS5hZGF0YSA9ICdjb250ZXh0LUInO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvb3BlcmF0aW9uLXNwZWNpZmljIHJlYXNvbnxpbmNvcnJlY3QvaSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWRhdGE6IHVuZGVmaW5lZCBpcyBlcXVpdmFsZW50IHRvIG9taXR0aW5nIGFkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZml4ZWRPcHRzID0ge1xuICAgICAgICBtZW1vcnlTaXplOiAxMDI0LFxuICAgICAgICBpdGVyYXRpb25zOiAxLFxuICAgICAgICBwYXJhbGxlbGlzbTogMSxcbiAgICAgICAgc2FsdDogbmV3IFVpbnQ4QXJyYXkoMTYpLmZpbGwoMHhhYSksXG4gICAgICAgIGl2OiBuZXcgVWludDhBcnJheSgxMikuZmlsbCgweGJiKSxcbiAgICAgIH07XG4gICAgICBjb25zdCB3aXRoVW5kZWZpbmVkID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgLi4uZml4ZWRPcHRzLCBhZGF0YTogdW5kZWZpbmVkIH0pO1xuICAgICAgY29uc3Qgd2l0aE9taXR0ZWQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgZml4ZWRPcHRzKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3aXRoVW5kZWZpbmVkLCB3aXRoT21pdHRlZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYXdhaXQgZGVjcnlwdFYyKHBhc3N3b3JkLCB3aXRoVW5kZWZpbmVkKSwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdjaXBoZXJ0ZXh0IGJvdW5kIHRvIGVudGVycHJpc2UtQSBjYW5ub3QgYmUgcmUtYXR0cmlidXRlZCB0byBlbnRlcnByaXNlLUInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwcnYgPSAneHBydi1wcml2YXRlLWtleS1ieXRlcyc7XG4gICAgICBjb25zdCBwcmZLZXkgPSAncHJmLWRlcml2ZWQta2V5JztcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgZW5jcnlwdFYyKHByZktleSwgcHJ2LCB7IGFkYXRhOiAnZW50ZXJwcmlzZS1BJyB9KTtcbiAgICAgIC8vIEF0dGFja2VyIG1vdmVzIGJsb2IgdG8gZW50ZXJwcmlzZS1CIGJ5IGFsdGVyaW5nIHRoZSBzdG9yZWQgYWRhdGEgZmllbGRcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShjdCk7XG4gICAgICBlbnZlbG9wZS5hZGF0YSA9ICdlbnRlcnByaXNlLUInO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHByZktleSwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndjEgYW5kIHYyIGFyZSBpbmRlcGVuZGVudCAodjEgZGF0YSBkb2VzIG5vdCBkZWNyeXB0IHdpdGggdjIpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjFjdCA9IGF3YWl0IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgeyBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgdjFjdCksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIG1lbW9yeVNpemUgZXhjZWVkaW5nIG1heCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA5OTk5OTk5OTksIHQ6IDMsIHA6IDQsIHNhbHQ6ICdBQUFBJywgaXY6ICdBQUFBJywgY3Q6ICdBQUFBJyB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgZW52ZWxvcGUgd2l0aCBpdGVyYXRpb25zIGV4Y2VlZGluZyBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogNjU1MzYsIHQ6IDEwMCwgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIHBhcmFsbGVsaXNtIGV4Y2VlZGluZyBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogNjU1MzYsIHQ6IDMsIHA6IDEwMCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIHplcm8tdmFsdWVkIHBhcmFtZXRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogMCwgdDogMywgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIG5vbi1udW1lcmljIHBhcmFtZXRlciB0eXBlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiAnNjU1MzYnLCB0OiAzLCBwOiA0LCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggZW1wdHkgc2FsdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA2NTUzNiwgdDogMywgcDogNCwgc2FsdDogJycsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VuY3J5cHRpb25TZXNzaW9uIChIS0RGIGNhY2hpbmcpJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdHMgPSB7IG1lbW9yeVNpemU6IDEwMjQsIGl0ZXJhdGlvbnM6IDEsIHBhcmFsbGVsaXNtOiAxIH07XG4gICAgY29uc3QgcGFzc3dvcmQgPSAndGVzdC1wYXNzd29yZCc7XG4gICAgY29uc3QgcGxhaW50ZXh0ID0gJ2hlbGxvIHNlc3Npb24nO1xuXG4gICAgaXQoJ3Nlc3Npb24tcHJvZHVjZWQgZW52ZWxvcGUgY29udGFpbnMgc2FsdCBhbmQgaGtkZlNhbHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuXG4gICAgICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnYsIDIpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLnNhbHQsICdtdXN0IGhhdmUgYXJnb24yIHNhbHQnKTtcbiAgICAgIGFzc2VydC5vayhlbnZlbG9wZS5oa2RmU2FsdCwgJ211c3QgaGF2ZSBoa2RmIHNhbHQnKTtcbiAgICAgIGFzc2VydC5vayhlbnZlbG9wZS5pdiwgJ211c3QgaGF2ZSBpdicpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLmN0LCAnbXVzdCBoYXZlIGNpcGhlcnRleHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXNzaW9uIHJvdW5kLXRyaXAgdmlhIHNlc3Npb24uZGVjcnlwdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5kZWNyeXB0KGN0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXNzaW9uIGVudmVsb3BlIGNhbiBiZSBkZWNyeXB0ZWQgc3RhbmRhbG9uZSB2aWEgZGVjcnlwdFYyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRWMihwYXNzd29yZCwgY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXNzaW9uIGVudmVsb3BlIGNhbiBiZSBkZWNyeXB0ZWQgdmlhIGRlY3J5cHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjcnlwdChwYXNzd29yZCwgY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdtdWx0aXBsZSBlbmNyeXB0cyBwcm9kdWNlIGRpZmZlcmVudCBoa2RmU2FsdCB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QxID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBjb25zdCBjdDIgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgZTE6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0MSk7XG4gICAgICBjb25zdCBlMjogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY3QyKTtcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChlMS5oa2RmU2FsdCwgZTIuaGtkZlNhbHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FsbCBzZXNzaW9uIGVuY3J5cHRzIHNoYXJlIHRoZSBzYW1lIGFyZ29uMiBzYWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0MSA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY3QyID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IGUxOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdDEpO1xuICAgICAgY29uc3QgZTI6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0Mik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZTEuc2FsdCwgZTIuc2FsdCk7XG4gICAgfSk7XG5cbiAgICBpdCgnd3JvbmcgcGFzc3dvcmQgcmVqZWN0ZWQgYnkgZGVjcnlwdFYyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMignd3JvbmctcGFzc3dvcmQnLCBjdCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rlc3Ryb3kgcHJldmVudHMgZnVydGhlciBlbmNyeXB0IGNhbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCksIC9kZXN0cm95ZWQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZXN0cm95IHByZXZlbnRzIGZ1cnRoZXIgZGVjcnlwdCBjYWxscycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uLmRlY3J5cHQoY3QpLCAvZGVzdHJveWVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2Vzc2lvbiByZWplY3RzIGVudmVsb3BlcyBmcm9tIGEgZGlmZmVyZW50IHNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uMSA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IHNlc3Npb24yID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uMS5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uMi5kZWNyeXB0KGN0KSwgL25vdCBlbmNyeXB0ZWQgd2l0aCB0aGlzIHNlc3Npb24vKTtcbiAgICAgIHNlc3Npb24xLmRlc3Ryb3koKTtcbiAgICAgIHNlc3Npb24yLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXNzaW9uIGVuY3J5cHQgd2l0aCBhZGF0YSByb3VuZC10cmlwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGFkYXRhID0gJ3R4aGFzaDptLzAvMTpyb3VuZDEnO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0LCBhZGF0YSk7XG4gICAgICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLmFkYXRhLCBhZGF0YSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmRlY3J5cHQoY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nlc3Npb24gZW5jcnlwdCB3aXRoIGFkYXRhIGlzIGRlY3J5cHRhYmxlIHZpYSBkZWNyeXB0VjInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0LCAnY29udGV4dC1iaW5kaW5nJyk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRWMihwYXNzd29yZCwgY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXNzaW9uIGFkYXRhIG1pc21hdGNoIGNhdXNlcyBHQ00gZmFpbHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQsICdvcmlnaW5hbC1jb250ZXh0Jyk7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY3QpO1xuICAgICAgZW52ZWxvcGUuYWRhdGEgPSAndGFtcGVyZWQtY29udGV4dCc7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uLmRlY3J5cHQoSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL29wZXJhdGlvbi1zcGVjaWZpYyByZWFzb258aW5jb3JyZWN0L2kpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2Vzc2lvbiByZWplY3RzIHN0YW5kYXJkIHYyIGVudmVsb3BlcyAobm8gaGtkZlNhbHQpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjJjdCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCBvcHRzKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uLmRlY3J5cHQodjJjdCksIC91c2UgZGVjcnlwdFYyLyk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdBcmdvbjJpZCBwYXJhbXMgYXJlIHN0b3JlZCBpbiBlbnZlbG9wZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgeyBtZW1vcnlTaXplOiAyMDQ4LCBpdGVyYXRpb25zOiAyLCBwYXJhbGxlbGlzbTogMiB9KTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUubSwgMjA0OCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudCwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUucCwgMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCaXRHb0FQSS5lbmNyeXB0JywgKCkgPT4ge1xuICAgIGxldCBiaXRnbzogQml0R29BUEk7XG4gICAgY29uc3QgcGFzc3dvcmQgPSAndGVzdC1wYXNzd29yZCc7XG4gICAgY29uc3QgcGxhaW50ZXh0ID0gJ2hlbGxvIGVuY3J5cHQnO1xuXG4gICAgYmVmb3JlKCgpID0+IHtcbiAgICAgIGJpdGdvID0gbmV3IEJpdEdvQVBJKHsgZW52OiAndGVzdCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvZHVjZXMgYSB2MiBlbnZlbG9wZSBieSBkZWZhdWx0IGFuZCBvdXRwdXQgaXMgZGVjcnlwdGFibGUgdmlhIGRlY3J5cHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IGJpdGdvLmVuY3J5cHQoeyBpbnB1dDogcGxhaW50ZXh0LCBwYXNzd29yZCB9KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYXdhaXQgZGVjcnlwdChwYXNzd29yZCwgY3QpLCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Byb2R1Y2VzIGEgdjEgZW52ZWxvcGUgd2hlbiBlbmNyeXB0aW9uVmVyc2lvbjogMScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgYml0Z28uZW5jcnlwdCh7IGlucHV0OiBwbGFpbnRleHQsIHBhc3N3b3JkLCBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShjdCk7XG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYXdhaXQgZGVjcnlwdChwYXNzd29yZCwgY3QpLCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvcndhcmRzIGFkYXRhIHRvIHYyIGVudmVsb3BlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWRhdGEgPSAndHhoYXNoOm0vMC8xJztcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgYml0Z28uZW5jcnlwdCh7IGlucHV0OiBwbGFpbnRleHQsIHBhc3N3b3JkLCBhZGF0YSB9KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUuYWRhdGEsIGFkYXRhKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhd2FpdCBkZWNyeXB0KHBhc3N3b3JkLCBjdCksIHBsYWludGV4dCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCaXRHb0FQSS5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbicsICgpID0+IHtcbiAgICBsZXQgYml0Z286IEJpdEdvQVBJO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gJ3Rlc3QtcGFzc3dvcmQnO1xuICAgIGNvbnN0IHBsYWludGV4dCA9ICdoZWxsbyBzZXNzaW9uJztcblxuICAgIGJlZm9yZSgoKSA9PiB7XG4gICAgICBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7IGVudjogJ3Rlc3QnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgd29ya2luZyBzZXNzaW9uIChlbmNyeXB0L2RlY3J5cHQvZGVzdHJveSknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb24uZGVjcnlwdChjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KSwgL2Rlc3Ryb3llZC8pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Fixtures for real-world v1 decrypt parity tests.
3
+ *
4
+ * These come from a purpose-built BitGo test keycard (wallet name: "sol")
5
+ * created 2026-08-14 solely for this test suite. The wallet is a throwaway
6
+ * testnet Solana wallet with no real funds; the ciphertexts, wallet, and
7
+ * password below are safe to check in.
8
+ *
9
+ * Boxes A + B are the user and backup MPC key shares (uShare), encrypted
10
+ * client-side with the wallet password using the exact envelope shape BitGo
11
+ * produces in production (`iter=10000, ks=256, ts=64, mode=ccm, cipher=aes,
12
+ * adata=""`).
13
+ *
14
+ * Purpose: catch any regression where the native/shim decrypt paths diverge
15
+ * from SJCL on real production-shaped envelopes.
16
+ */
17
+ export declare const KEYCARD_PASSWORD = "97IoV9Qs3fuhBKYCg6ju0y6LPBHTywBY";
18
+ export declare const KEYCARD_BOX_A = "{\"iv\":\"iury+nZhVfoWjpzbzrN1Yw==\",\"v\":1,\"iter\":10000,\"ks\":256,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"salt\":\"WiUMqHlpxiQ=\",\"ct\":\"Qx6nr/Q+oEaHmmsIq75cHcR4hR4XzowpJvdgNuzcGD6v113dimT8tg2FAWAGj+syRfH19X5cDBhFX6k3ifWMbyQHneHs0OGh86kjm/v4ddNHaGgGEzhsQCWX2tAOyhxT+oG5PewnSr+xFGZePvo0GFakmPFLzF9gfvG8K3o30i0iU5UyzPdp5iAZGbZTseqp6d3KXcleA712Gnv5eT0mlDYJwoi9Io7TwCjdaa2M5r1PFkN8ZaC1aIzba3A+f7b7PDrfFckGGDIl6o2ytjNEpCKvvbfiTbk9/WOIXtMibW1e3ysmuPl5tiw2lSAtYXHQOl9rqwEvtoIMtM2uZqAE+ELf8UiabdBpdCYFiSVBgD+jjEfgUocd7xCRh2bW/Uqhu8ye7SDdZowMaTI3d/sGW8QubquPaHWQZTkhvDXttT0l1YXsIld3L2mQfDw+FpFD+SihNDiCf4fVYHFI/I9bYMx03QnUV+wXyo0dl1QXnkyVxTVOeaoJ7dM7Tp7h5cY2m5Dlp2YvAY2twRzOSPKjYu8M+rUuY0GsbodZW8mKXCLVfTyNmonSgqmLZ7V8MlZ4oR2gGfPn39XrGG9fRPj3lKb4gaFCSweHWfXAAXLN+MP9BquE57cphKn8RcuwwGPnH0j/tKOdcqKtn1XcAKtf8+s3L7utIXS+dijADqTLrjfG/2gKe4NbpykiW/vOPQ+2BbZO7d0F0YMnd2di/KD2VL5Y3M6Iib1zZAQX1r41X9Zb1/ShEsKtFyObi2zG0atYrQ6g4+f11nBbwJa6BD6n3P+UAaHvIJoXEFnaccvq3OWowlHQppQUOqCkdg5kwf2fXJqkR9hGGSBpXM48gm61hgwR12n2rDQxks6wwtdtm5BMKZrJy25x/ZAqYaQejm+0dT9SVa0qpNNOa1IdDzrPnI0AL1aLNGOVQ9EwEt9OOYoS/DBTp7JmVwhShDC5w8Br3KOKsm5qlWz/uslhfWBR7l6+BFft2jjfeCmfjZORCuhV5tX5nnQXuc13HjQkrdzaJE+LXZYtal+U83i2SfdwZnWuplTQqxKk+C0ikfGGJd7PDNb+8VEoR3rEIXk4YKJyI/HyPAVwNJN48tm/364SOm/iPV+wW5HvwPDmRJBan5vs66pTT2GtkZsZD1L+BxN4s8ycM4BWO1xyjgTI7mKjSatSnBqeJ0Cm0bIHq8hsbM9lH8yc0VsJ\"}";
19
+ export declare const KEYCARD_BOX_B = "{\"iv\":\"QZw8ZmHqaBqQh6X6PSCcMg==\",\"v\":1,\"iter\":10000,\"ks\":256,\"ts\":64,\"mode\":\"ccm\",\"adata\":\"\",\"cipher\":\"aes\",\"salt\":\"yM+BoSyVwaY=\",\"ct\":\"oPtcvWYf287IRi9To/UobTLrm5m+YCs6Tp1CuYvPJ5oazTcbmzZkS+gn2hxAGCvojGGV61qieEgrKEKDdKLE4/jSWUhY/VXyFE6BRb2uB5pFny8NwSsVb5Gw5R38bgs0XZ0aL4RCEQgByIkWGKJn3ZbpfmzFcD+x226WZkL0gS1DN5RK8bwAfgrabVp6MupLa/NN7M/YiH9aO9PELdvu/mbyC0zdAwwY8MHpMdf5IPOJi3ieMorUtEsuzfP4SBI2EAHdFi3/VmzIKG69sZS1uIULHB5Xya5ury7+qp6nihlxJOB4S8zpri/rXow+0EQL2bKUSkQz6r6GTL5MclyfkxVcCptVMPrCcsDdVc9P0sR36iP/AsdCTJGuHbzv0AERs776+cUyqivlQj1CQ3GkIHNQKyYjktKLx1PmEMTo29hEEbKVavM8ZoxTbjL/uIaxpz9Di1zh3RB8f1HXmq2JD2XEAPAky+Ukh8FSavROG64GRkPJY4AtUxXvvzUc2M9QCy6wbDIC8prJEio5jWyKZSZ4KVpMSEK98/htMjgB8hH07CdfiJnvMVy7xe9hHOtl3zThMP6r+9g8WpGdT02Y2kWWOVZlhBaPohuiCiJLHOigiN86Tt7i5kgSTB6w8zT4tcZWzSeOBh68eAupDt0qOdfadNESQICJ3fAgfQfeR7pPzjt54npB7c9KpLnJgDhrl4LpwicwZwuYKv0gJ7t9KKKTLFHRp5RD5Nr+8tk10aIxDQxLWCVSwalie5HhTzPsF8OUqNrJJ9mSBGtsTh/Saf5osvE/ETYdU7PTJpVHDYCS5/DaCrV7acZn1ZBzCD9P9FzttzF8RlwPOideEsYDWLORvwdmNHYgTavNnOY4UnISgA07UtFsgzgJ4gC4ubCE32C5MNkX4hGIi/15O4Y0ZaiAeOu2Qnm9r6zfdYZP4TCeQAZEGKy5DsO+VYOLImvhRZD8aOoFvxmQJWM5MEMozEImms8cwJuDRP60WhZqUCgemmmyHHDRPG3+EmUGU2W4QWDQt7G6uADcDCFsYojyshg0+6QRMdc5pLR3wUa4MRug7t49kit0Q/yFMn8kHn6/jhokRdIHt8Yvo1/wnGmw7aGvKX3rtUKOpqZ4AkOakhKuqRJyJvh3nsfz6BXtjx0UnW80Dt8WgAol+x0IFLcbcnwjICotU9uupfn+ONGK0C4NUSiJVg==\"}";
20
+ /** Prefix of the decrypted plaintext for structural sanity checking. Both boxes are MPC uShare JSON. */
21
+ export declare const KEYCARD_PLAINTEXT_PREFIX = "{\"uShare\":{\"i\":";
22
+ /** Expected plaintext lengths, verified against sjcl.decrypt during test authoring. */
23
+ export declare const KEYCARD_BOX_A_LENGTH = 895;
24
+ export declare const KEYCARD_BOX_B_LENGTH = 893;
25
+ //# sourceMappingURL=keycard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keycard.d.ts","sourceRoot":"","sources":["../../../../test/unit/fixtures/keycard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,gBAAgB,qCAAqC,CAAC;AAEnE,eAAO,MAAM,aAAa,m2CACwyC,CAAC;AAEn0C,eAAO,MAAM,aAAa,m2CACwyC,CAAC;AAEn0C,wGAAwG;AACxG,eAAO,MAAM,wBAAwB,wBAAoB,CAAC;AAE1D,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,oBAAoB,MAAM,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Fixtures for real-world v1 decrypt parity tests.
4
+ *
5
+ * These come from a purpose-built BitGo test keycard (wallet name: "sol")
6
+ * created 2026-08-14 solely for this test suite. The wallet is a throwaway
7
+ * testnet Solana wallet with no real funds; the ciphertexts, wallet, and
8
+ * password below are safe to check in.
9
+ *
10
+ * Boxes A + B are the user and backup MPC key shares (uShare), encrypted
11
+ * client-side with the wallet password using the exact envelope shape BitGo
12
+ * produces in production (`iter=10000, ks=256, ts=64, mode=ccm, cipher=aes,
13
+ * adata=""`).
14
+ *
15
+ * Purpose: catch any regression where the native/shim decrypt paths diverge
16
+ * from SJCL on real production-shaped envelopes.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.KEYCARD_BOX_B_LENGTH = exports.KEYCARD_BOX_A_LENGTH = exports.KEYCARD_PLAINTEXT_PREFIX = exports.KEYCARD_BOX_B = exports.KEYCARD_BOX_A = exports.KEYCARD_PASSWORD = void 0;
20
+ exports.KEYCARD_PASSWORD = '97IoV9Qs3fuhBKYCg6ju0y6LPBHTywBY';
21
+ exports.KEYCARD_BOX_A = '{"iv":"iury+nZhVfoWjpzbzrN1Yw==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"WiUMqHlpxiQ=","ct":"Qx6nr/Q+oEaHmmsIq75cHcR4hR4XzowpJvdgNuzcGD6v113dimT8tg2FAWAGj+syRfH19X5cDBhFX6k3ifWMbyQHneHs0OGh86kjm/v4ddNHaGgGEzhsQCWX2tAOyhxT+oG5PewnSr+xFGZePvo0GFakmPFLzF9gfvG8K3o30i0iU5UyzPdp5iAZGbZTseqp6d3KXcleA712Gnv5eT0mlDYJwoi9Io7TwCjdaa2M5r1PFkN8ZaC1aIzba3A+f7b7PDrfFckGGDIl6o2ytjNEpCKvvbfiTbk9/WOIXtMibW1e3ysmuPl5tiw2lSAtYXHQOl9rqwEvtoIMtM2uZqAE+ELf8UiabdBpdCYFiSVBgD+jjEfgUocd7xCRh2bW/Uqhu8ye7SDdZowMaTI3d/sGW8QubquPaHWQZTkhvDXttT0l1YXsIld3L2mQfDw+FpFD+SihNDiCf4fVYHFI/I9bYMx03QnUV+wXyo0dl1QXnkyVxTVOeaoJ7dM7Tp7h5cY2m5Dlp2YvAY2twRzOSPKjYu8M+rUuY0GsbodZW8mKXCLVfTyNmonSgqmLZ7V8MlZ4oR2gGfPn39XrGG9fRPj3lKb4gaFCSweHWfXAAXLN+MP9BquE57cphKn8RcuwwGPnH0j/tKOdcqKtn1XcAKtf8+s3L7utIXS+dijADqTLrjfG/2gKe4NbpykiW/vOPQ+2BbZO7d0F0YMnd2di/KD2VL5Y3M6Iib1zZAQX1r41X9Zb1/ShEsKtFyObi2zG0atYrQ6g4+f11nBbwJa6BD6n3P+UAaHvIJoXEFnaccvq3OWowlHQppQUOqCkdg5kwf2fXJqkR9hGGSBpXM48gm61hgwR12n2rDQxks6wwtdtm5BMKZrJy25x/ZAqYaQejm+0dT9SVa0qpNNOa1IdDzrPnI0AL1aLNGOVQ9EwEt9OOYoS/DBTp7JmVwhShDC5w8Br3KOKsm5qlWz/uslhfWBR7l6+BFft2jjfeCmfjZORCuhV5tX5nnQXuc13HjQkrdzaJE+LXZYtal+U83i2SfdwZnWuplTQqxKk+C0ikfGGJd7PDNb+8VEoR3rEIXk4YKJyI/HyPAVwNJN48tm/364SOm/iPV+wW5HvwPDmRJBan5vs66pTT2GtkZsZD1L+BxN4s8ycM4BWO1xyjgTI7mKjSatSnBqeJ0Cm0bIHq8hsbM9lH8yc0VsJ"}';
22
+ exports.KEYCARD_BOX_B = '{"iv":"QZw8ZmHqaBqQh6X6PSCcMg==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"yM+BoSyVwaY=","ct":"oPtcvWYf287IRi9To/UobTLrm5m+YCs6Tp1CuYvPJ5oazTcbmzZkS+gn2hxAGCvojGGV61qieEgrKEKDdKLE4/jSWUhY/VXyFE6BRb2uB5pFny8NwSsVb5Gw5R38bgs0XZ0aL4RCEQgByIkWGKJn3ZbpfmzFcD+x226WZkL0gS1DN5RK8bwAfgrabVp6MupLa/NN7M/YiH9aO9PELdvu/mbyC0zdAwwY8MHpMdf5IPOJi3ieMorUtEsuzfP4SBI2EAHdFi3/VmzIKG69sZS1uIULHB5Xya5ury7+qp6nihlxJOB4S8zpri/rXow+0EQL2bKUSkQz6r6GTL5MclyfkxVcCptVMPrCcsDdVc9P0sR36iP/AsdCTJGuHbzv0AERs776+cUyqivlQj1CQ3GkIHNQKyYjktKLx1PmEMTo29hEEbKVavM8ZoxTbjL/uIaxpz9Di1zh3RB8f1HXmq2JD2XEAPAky+Ukh8FSavROG64GRkPJY4AtUxXvvzUc2M9QCy6wbDIC8prJEio5jWyKZSZ4KVpMSEK98/htMjgB8hH07CdfiJnvMVy7xe9hHOtl3zThMP6r+9g8WpGdT02Y2kWWOVZlhBaPohuiCiJLHOigiN86Tt7i5kgSTB6w8zT4tcZWzSeOBh68eAupDt0qOdfadNESQICJ3fAgfQfeR7pPzjt54npB7c9KpLnJgDhrl4LpwicwZwuYKv0gJ7t9KKKTLFHRp5RD5Nr+8tk10aIxDQxLWCVSwalie5HhTzPsF8OUqNrJJ9mSBGtsTh/Saf5osvE/ETYdU7PTJpVHDYCS5/DaCrV7acZn1ZBzCD9P9FzttzF8RlwPOideEsYDWLORvwdmNHYgTavNnOY4UnISgA07UtFsgzgJ4gC4ubCE32C5MNkX4hGIi/15O4Y0ZaiAeOu2Qnm9r6zfdYZP4TCeQAZEGKy5DsO+VYOLImvhRZD8aOoFvxmQJWM5MEMozEImms8cwJuDRP60WhZqUCgemmmyHHDRPG3+EmUGU2W4QWDQt7G6uADcDCFsYojyshg0+6QRMdc5pLR3wUa4MRug7t49kit0Q/yFMn8kHn6/jhokRdIHt8Yvo1/wnGmw7aGvKX3rtUKOpqZ4AkOakhKuqRJyJvh3nsfz6BXtjx0UnW80Dt8WgAol+x0IFLcbcnwjICotU9uupfn+ONGK0C4NUSiJVg=="}';
23
+ /** Prefix of the decrypted plaintext for structural sanity checking. Both boxes are MPC uShare JSON. */
24
+ exports.KEYCARD_PLAINTEXT_PREFIX = '{"uShare":{"i":';
25
+ /** Expected plaintext lengths, verified against sjcl.decrypt during test authoring. */
26
+ exports.KEYCARD_BOX_A_LENGTH = 895;
27
+ exports.KEYCARD_BOX_B_LENGTH = 893;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9maXh0dXJlcy9rZXljYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7OztBQUVVLFFBQUEsZ0JBQWdCLEdBQUcsa0NBQWtDLENBQUM7QUFFdEQsUUFBQSxhQUFhLEdBQ3hCLGcwQ0FBZzBDLENBQUM7QUFFdHpDLFFBQUEsYUFBYSxHQUN4QixnMENBQWcwQyxDQUFDO0FBRW4wQyx3R0FBd0c7QUFDM0YsUUFBQSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztBQUUxRCx1RkFBdUY7QUFDMUUsUUFBQSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsUUFBQSxvQkFBb0IsR0FBRyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpeHR1cmVzIGZvciByZWFsLXdvcmxkIHYxIGRlY3J5cHQgcGFyaXR5IHRlc3RzLlxuICpcbiAqIFRoZXNlIGNvbWUgZnJvbSBhIHB1cnBvc2UtYnVpbHQgQml0R28gdGVzdCBrZXljYXJkICh3YWxsZXQgbmFtZTogXCJzb2xcIilcbiAqIGNyZWF0ZWQgMjAyNi0wOC0xNCBzb2xlbHkgZm9yIHRoaXMgdGVzdCBzdWl0ZS4gVGhlIHdhbGxldCBpcyBhIHRocm93YXdheVxuICogdGVzdG5ldCBTb2xhbmEgd2FsbGV0IHdpdGggbm8gcmVhbCBmdW5kczsgdGhlIGNpcGhlcnRleHRzLCB3YWxsZXQsIGFuZFxuICogcGFzc3dvcmQgYmVsb3cgYXJlIHNhZmUgdG8gY2hlY2sgaW4uXG4gKlxuICogQm94ZXMgQSArIEIgYXJlIHRoZSB1c2VyIGFuZCBiYWNrdXAgTVBDIGtleSBzaGFyZXMgKHVTaGFyZSksIGVuY3J5cHRlZFxuICogY2xpZW50LXNpZGUgd2l0aCB0aGUgd2FsbGV0IHBhc3N3b3JkIHVzaW5nIHRoZSBleGFjdCBlbnZlbG9wZSBzaGFwZSBCaXRHb1xuICogcHJvZHVjZXMgaW4gcHJvZHVjdGlvbiAoYGl0ZXI9MTAwMDAsIGtzPTI1NiwgdHM9NjQsIG1vZGU9Y2NtLCBjaXBoZXI9YWVzLFxuICogYWRhdGE9XCJcImApLlxuICpcbiAqIFB1cnBvc2U6IGNhdGNoIGFueSByZWdyZXNzaW9uIHdoZXJlIHRoZSBuYXRpdmUvc2hpbSBkZWNyeXB0IHBhdGhzIGRpdmVyZ2VcbiAqIGZyb20gU0pDTCBvbiByZWFsIHByb2R1Y3Rpb24tc2hhcGVkIGVudmVsb3Blcy5cbiAqL1xuXG5leHBvcnQgY29uc3QgS0VZQ0FSRF9QQVNTV09SRCA9ICc5N0lvVjlRczNmdWhCS1lDZzZqdTB5NkxQQkhUeXdCWSc7XG5cbmV4cG9ydCBjb25zdCBLRVlDQVJEX0JPWF9BID1cbiAgJ3tcIml2XCI6XCJpdXJ5K25aaFZmb1dqcHpienJOMVl3PT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiV2lVTXFIbHB4aVE9XCIsXCJjdFwiOlwiUXg2bnIvUStvRWFIbW1zSXE3NWNIY1I0aFI0WHpvd3BKdmRnTnV6Y0dENnYxMTNkaW1UOHRnMkZBV0FHaitzeVJmSDE5WDVjREJoRlg2azNpZldNYnlRSG5lSHMwT0doODZram0vdjRkZE5IYUdnR0V6aHNRQ1dYMnRBT3loeFQrb0c1UGV3blNyK3hGR1plUHZvMEdGYWttUEZMekY5Z2Z2RzhLM28zMGkwaVU1VXl6UGRwNWlBWkdiWlRzZXFwNmQzS1hjbGVBNzEyR252NWVUMG1sRFlKd29pOUlvN1R3Q2pkYWEyTTVyMVBGa044WmFDMWFJemJhM0ErZjdiN1BEcmZGY2tHR0RJbDZvMnl0ak5FcENLdnZiZmlUYms5L1dPSVh0TWliVzFlM3lzbXVQbDV0aXcybFNBdFlYSFFPbDlycXdFdnRvSU10TTJ1WnFBRStFTGY4VWlhYmRCcGRDWUZpU1ZCZ0QrampFZmdVb2NkN3hDUmgyYlcvVXFodTh5ZTdTRGRab3dNYVRJM2Qvc0dXOFF1YnF1UGFIV1FaVGtodkRYdHRUMGwxWVhzSWxkM0wybVFmRHcrRnBGRCtTaWhORGlDZjRmVllIRkkvSTliWU14MDNRblVWK3dYeW8wZGwxUVhua3lWeFRWT2Vhb0o3ZE03VHA3aDVjWTJtNURscDJZdkFZMnR3UnpPU1BLall1OE0rclV1WTBHc2JvZFpXOG1LWENMVmZUeU5tb25TZ3FtTFo3VjhNbFo0b1IyZ0dmUG4zOVhyR0c5ZlJQajNsS2I0Z2FGQ1N3ZUhXZlhBQVhMTitNUDlCcXVFNTdjcGhLbjhSY3V3d0dQbkgwai90S09kY3FLdG4xWGNBS3RmOCtzM0w3dXRJWFMrZGlqQURxVExyamZHLzJnS2U0TmJweWtpVy92T1BRKzJCYlpPN2QwRjBZTW5kMmRpL0tEMlZMNVkzTTZJaWIxelpBUVgxcjQxWDlaYjEvU2hFc0t0RnlPYmkyekcwYXRZclE2ZzQrZjExbkJid0phNkJENm4zUCtVQWFIdklKb1hFRm5hY2N2cTNPV293bEhRcHBRVU9xQ2tkZzVrd2YyZlhKcWtSOWhHR1NCcFhNNDhnbTYxaGd3UjEybjJyRFF4a3M2d3d0ZHRtNUJNS1pySnkyNXgvWkFxWWFRZWptKzBkVDlTVmEwcXBOTk9hMUlkRHpyUG5JMEFMMWFMTkdPVlE5RXdFdDlPT1lvUy9EQlRwN0ptVndoU2hEQzV3OEJyM0tPS3NtNXFsV3ovdXNsaGZXQlI3bDYrQkZmdDJqamZlQ21malpPUkN1aFY1dFg1bm5RWHVjMTNIalFrcmR6YUpFK0xYWll0YWwrVTgzaTJTZmR3Wm5XdXBsVFFxeEtrK0MwaWtmR0dKZDdQRE5iKzhWRW9SM3JFSVhrNFlLSnlJL0h5UEFWd05KTjQ4dG0vMzY0U09tL2lQVit3VzVIdndQRG1SSkJhbjV2czY2cFRUMkd0a1pzWkQxTCtCeE40czh5Y000QldPMXh5amdUSTdtS2pTYXRTbkJxZUowQ20wYklIcThoc2JNOWxIOHljMFZzSlwifSc7XG5cbmV4cG9ydCBjb25zdCBLRVlDQVJEX0JPWF9CID1cbiAgJ3tcIml2XCI6XCJRWnc4Wm1IcWFCcVFoNlg2UFNDY01nPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwieU0rQm9TeVZ3YVk9XCIsXCJjdFwiOlwib1B0Y3ZXWWYyODdJUmk5VG8vVW9iVExybTVtK1lDczZUcDFDdVl2UEo1b2F6VGNibXpaa1MrZ24yaHhBR0N2b2pHR1Y2MXFpZUVncktFS0RkS0xFNC9qU1dVaFkvVlh5RkU2QlJiMnVCNXBGbnk4TndTc1ZiNUd3NVIzOGJnczBYWjBhTDRSQ0VRZ0J5SWtXR0tKbjNaYnBmbXpGY0QreDIyNldaa0wwZ1MxRE41Uks4YndBZmdyYWJWcDZNdXBMYS9OTjdNL1lpSDlhTzlQRUxkdnUvbWJ5QzB6ZEF3d1k4TUhwTWRmNUlQT0ppM2llTW9yVXRFc3V6ZlA0U0JJMkVBSGRGaTMvVm16SUtHNjlzWlMxdUlVTEhCNVh5YTV1cnk3K3FwNm5paGx4Sk9CNFM4enByaS9yWG93KzBFUUwyYktVU2tRejZyNkdUTDVNY2x5Zmt4VmNDcHRWTVByQ2NzRGRWYzlQMHNSMzZpUC9Bc2RDVEpHdUhienYwQUVSczc3NitjVXlxaXZsUWoxQ1EzR2tJSE5RS3lZamt0S0x4MVBtRU1UbzI5aEVFYktWYXZNOFpveFRiakwvdUlheHB6OURpMXpoM1JCOGYxSFhtcTJKRDJYRUFQQWt5K1VraDhGU2F2Uk9HNjRHUmtQSlk0QXRVeFh2dnpVYzJNOVFDeTZ3YkRJQzhwckpFaW81ald5S1pTWjRLVnBNU0VLOTgvaHRNamdCOGhIMDdDZGZpSm52TVZ5N3hlOWhIT3RsM3pUaE1QNnIrOWc4V3BHZFQwMlkya1dXT1ZabGhCYVBvaHVpQ2lKTEhPaWdpTjg2VHQ3aTVrZ1NUQjZ3OHpUNHRjWld6U2VPQmg2OGVBdXBEdDBxT2RmYWRORVNRSUNKM2ZBZ2ZRZmVSN3BQemp0NTRucEI3YzlLcExuSmdEaHJsNExwd2ljd1p3dVlLdjBnSjd0OUtLS1RMRkhScDVSRDVOcis4dGsxMGFJeERReExXQ1ZTd2FsaWU1SGhUelBzRjhPVXFOckpKOW1TQkd0c1RoL1NhZjVvc3ZFL0VUWWRVN1BUSnBWSERZQ1M1L0RhQ3JWN2FjWm4xWkJ6Q0Q5UDlGenR0ekY4Umx3UE9pZGVFc1lEV0xPUnZ3ZG1OSFlnVGF2Tm5PWTRVbklTZ0EwN1V0RnNnemdKNGdDNHViQ0UzMkM1TU5rWDRoR0lpLzE1TzRZMFphaUFlT3UyUW5tOXI2emZkWVpQNFRDZVFBWkVHS3k1RHNPK1ZZT0xJbXZoUlpEOGFPb0Z2eG1RSldNNU1FTW96RUltbXM4Y3dKdURSUDYwV2hacVVDZ2VtbW15SEhEUlBHMytFbVVHVTJXNFFXRFF0N0c2dUFEY0RDRnNZb2p5c2hnMCs2UVJNZGM1cExSM3dVYTRNUnVnN3Q0OWtpdDBRL3lGTW44a0huNi9qaG9rUmRJSHQ4WXZvMS93bkdtdzdhR3ZLWDNydFVLT3BxWjRBa09ha2hLdXFSSnlKdmgzbnNmejZCWHRqeDBVblc4MER0OFdnQW9sK3gwSUZMY2JjbndqSUNvdFU5dXVwZm4rT05HSzBDNE5VU2lKVmc9PVwifSc7XG5cbi8qKiBQcmVmaXggb2YgdGhlIGRlY3J5cHRlZCBwbGFpbnRleHQgZm9yIHN0cnVjdHVyYWwgc2FuaXR5IGNoZWNraW5nLiBCb3RoIGJveGVzIGFyZSBNUEMgdVNoYXJlIEpTT04uICovXG5leHBvcnQgY29uc3QgS0VZQ0FSRF9QTEFJTlRFWFRfUFJFRklYID0gJ3tcInVTaGFyZVwiOntcImlcIjonO1xuXG4vKiogRXhwZWN0ZWQgcGxhaW50ZXh0IGxlbmd0aHMsIHZlcmlmaWVkIGFnYWluc3Qgc2pjbC5kZWNyeXB0IGR1cmluZyB0ZXN0IGF1dGhvcmluZy4gKi9cbmV4cG9ydCBjb25zdCBLRVlDQVJEX0JPWF9BX0xFTkdUSCA9IDg5NTtcbmV4cG9ydCBjb25zdCBLRVlDQVJEX0JPWF9CX0xFTkdUSCA9IDg5MztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=hmacStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmacStrategy.d.ts","sourceRoot":"","sources":["../../../test/unit/hmacStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}