@bitgo-beta/sdk-api 1.10.1-beta.173 → 1.10.1-beta.1730
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/package.json +19 -26
- package/dist/src/api.d.ts +8 -5
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +130 -71
- package/dist/src/bitgoAPI.d.ts +85 -13
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +527 -180
- package/dist/src/encrypt.d.ts +13 -4
- package/dist/src/encrypt.d.ts.map +1 -1
- package/dist/src/encrypt.js +72 -13
- package/dist/src/encryptV2.d.ts +65 -0
- package/dist/src/encryptV2.d.ts.map +1 -0
- package/dist/src/encryptV2.js +187 -0
- package/dist/src/encryptionSession.d.ts +34 -0
- package/dist/src/encryptionSession.d.ts.map +1 -0
- package/dist/src/encryptionSession.js +90 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -2
- package/dist/src/types.d.ts +56 -43
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +4 -2
- package/dist/src/util.d.ts +12 -0
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +57 -4
- package/dist/src/v1/blockchain.js +25 -12
- package/dist/src/v1/keychains.js +27 -22
- package/dist/src/v1/markets.js +10 -5
- package/dist/src/v1/pendingapproval.d.ts.map +1 -1
- package/dist/src/v1/pendingapproval.js +57 -18
- package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
- package/dist/src/v1/pendingapprovals.js +41 -7
- package/dist/src/v1/signPsbt.d.ts +14 -0
- package/dist/src/v1/signPsbt.d.ts.map +1 -0
- package/dist/src/v1/signPsbt.js +69 -0
- package/dist/src/v1/transactionBuilder.js +214 -90
- package/dist/src/v1/travelRule.js +60 -23
- package/dist/src/v1/verifyAddress.d.ts +6 -0
- package/dist/src/v1/verifyAddress.d.ts.map +1 -0
- package/dist/src/v1/verifyAddress.js +50 -0
- package/dist/src/v1/wallet.d.ts.map +1 -1
- package/dist/src/v1/wallet.js +479 -224
- package/dist/src/v1/wallets.js +93 -37
- package/dist/test/unit/api.d.ts +2 -0
- package/dist/test/unit/api.d.ts.map +1 -0
- package/dist/test/unit/api.js +307 -0
- package/dist/test/unit/bitgoAPI.d.ts +2 -0
- package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
- package/dist/test/unit/bitgoAPI.js +915 -0
- package/dist/test/unit/encrypt.d.ts +2 -0
- package/dist/test/unit/encrypt.d.ts.map +1 -0
- package/dist/test/unit/encrypt.js +276 -0
- package/dist/test/unit/hmacStrategy.d.ts +2 -0
- package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
- package/dist/test/unit/hmacStrategy.js +136 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +65 -0
- package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
- package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
- package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
- package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
- package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
- package/dist/test/unit/v1/fixtures/index.js +24 -0
- package/dist/test/unit/v1/signPsbt.d.ts +2 -0
- package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
- package/dist/test/unit/v1/signPsbt.js +53 -0
- package/dist/test/unit/v1/wallet.d.ts +2 -0
- package/dist/test/unit/v1/wallet.d.ts.map +1 -0
- package/dist/test/unit/v1/wallet.js +1603 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +19 -26
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -523
- package/dist/web/main.js +0 -2
- package/dist/web/main.js.LICENSE.txt +0 -110
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../test/unit/encrypt.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,276 @@
|
|
|
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
|
+
describe('encryption methods tests', () => {
|
|
10
|
+
describe('encrypt', () => {
|
|
11
|
+
it('encrypts the plaintext with the given password', () => {
|
|
12
|
+
const password = 'myPassword';
|
|
13
|
+
const plaintext = 'Hello, World!';
|
|
14
|
+
const ciphertext = (0, src_1.encrypt)(password, plaintext);
|
|
15
|
+
(0, assert_1.default)(ciphertext !== plaintext, 'ciphertext should not be equal to plaintext');
|
|
16
|
+
});
|
|
17
|
+
it('returns a different ciphertext for the same plaintext and password', () => {
|
|
18
|
+
const password = 'myPassword';
|
|
19
|
+
const plaintext = 'Hello, World!';
|
|
20
|
+
const ciphertext1 = (0, src_1.encrypt)(password, plaintext);
|
|
21
|
+
const ciphertext2 = (0, src_1.encrypt)(password, plaintext);
|
|
22
|
+
(0, assert_1.default)(ciphertext1 !== ciphertext2, 'ciphertexts should not be equal');
|
|
23
|
+
});
|
|
24
|
+
it('throws an error if the salt length is not 8 bytes', () => {
|
|
25
|
+
const password = 'myPassword';
|
|
26
|
+
const plaintext = 'Hello, World!';
|
|
27
|
+
const options = { salt: (0, crypto_1.randomBytes)(4) };
|
|
28
|
+
assert_1.default.throws(() => (0, src_1.encrypt)(password, plaintext, options), new Error(`salt must be 8 bytes`));
|
|
29
|
+
});
|
|
30
|
+
it('throws an error if the iv length is not 16 bytes', () => {
|
|
31
|
+
const password = 'myPassword';
|
|
32
|
+
const plaintext = 'Hello, World!';
|
|
33
|
+
const options = { iv: (0, crypto_1.randomBytes)(4) };
|
|
34
|
+
assert_1.default.throws(() => (0, src_1.encrypt)(password, plaintext, options), new Error(`iv must be 16 bytes`));
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('decrypt', () => {
|
|
38
|
+
it('decrypts the ciphertext with the given password', () => {
|
|
39
|
+
const password = 'myPassword';
|
|
40
|
+
const plaintext = 'Hello, World!';
|
|
41
|
+
const ciphertext = (0, src_1.encrypt)(password, plaintext);
|
|
42
|
+
const decrypted = (0, src_1.decrypt)(password, ciphertext);
|
|
43
|
+
(0, assert_1.default)(decrypted === plaintext, 'decrypted should be equal to plaintext');
|
|
44
|
+
});
|
|
45
|
+
it('throws an error if the password is wrong', () => {
|
|
46
|
+
const password = 'myPassword';
|
|
47
|
+
const plaintext = 'Hello, World!';
|
|
48
|
+
const ciphertext = (0, src_1.encrypt)(password, plaintext);
|
|
49
|
+
const wrongPassword = 'wrongPassword';
|
|
50
|
+
assert_1.default.throws(() => (0, src_1.decrypt)(wrongPassword, ciphertext), 'sjcl exception: cc: invalid aes key');
|
|
51
|
+
});
|
|
52
|
+
it('decrypts the ciphertext with the given password and adata', () => {
|
|
53
|
+
const password = 'myPassword';
|
|
54
|
+
const plaintext = 'Hello, World!';
|
|
55
|
+
const adata = 'additional data';
|
|
56
|
+
const ciphertext = (0, src_1.encrypt)(password, plaintext, { adata });
|
|
57
|
+
const decrypted = (0, src_1.decrypt)(password, ciphertext);
|
|
58
|
+
(0, assert_1.default)(decrypted === plaintext, 'decrypted should be equal to plaintext');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('v2 encrypt/decrypt (Argon2id + AES-256-GCM)', () => {
|
|
62
|
+
const password = 'myPassword';
|
|
63
|
+
const plaintext = 'Hello, World!';
|
|
64
|
+
it('encrypts and decrypts round-trip', async () => {
|
|
65
|
+
const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
|
|
66
|
+
const decrypted = await (0, src_1.decryptV2)(password, ciphertext);
|
|
67
|
+
assert_1.default.strictEqual(decrypted, plaintext);
|
|
68
|
+
});
|
|
69
|
+
it('produces a valid v2 envelope', async () => {
|
|
70
|
+
const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
|
|
71
|
+
const envelope = JSON.parse(ciphertext);
|
|
72
|
+
assert_1.default.strictEqual(envelope.v, 2);
|
|
73
|
+
assert_1.default.strictEqual(envelope.m, 65536);
|
|
74
|
+
assert_1.default.strictEqual(envelope.t, 3);
|
|
75
|
+
assert_1.default.strictEqual(envelope.p, 4);
|
|
76
|
+
assert_1.default.ok(envelope.salt, 'envelope must have salt');
|
|
77
|
+
assert_1.default.ok(envelope.iv, 'envelope must have iv');
|
|
78
|
+
assert_1.default.ok(envelope.ct, 'envelope must have ct');
|
|
79
|
+
});
|
|
80
|
+
it('returns different ciphertext for the same plaintext and password', async () => {
|
|
81
|
+
const ct1 = await (0, src_1.encryptV2)(password, plaintext);
|
|
82
|
+
const ct2 = await (0, src_1.encryptV2)(password, plaintext);
|
|
83
|
+
assert_1.default.notStrictEqual(ct1, ct2);
|
|
84
|
+
});
|
|
85
|
+
it('decrypts with custom Argon2id parameters', async () => {
|
|
86
|
+
const ciphertext = await (0, src_1.encryptV2)(password, plaintext, {
|
|
87
|
+
memorySize: 1024,
|
|
88
|
+
iterations: 1,
|
|
89
|
+
parallelism: 1,
|
|
90
|
+
});
|
|
91
|
+
const envelope = JSON.parse(ciphertext);
|
|
92
|
+
assert_1.default.strictEqual(envelope.m, 1024);
|
|
93
|
+
assert_1.default.strictEqual(envelope.t, 1);
|
|
94
|
+
assert_1.default.strictEqual(envelope.p, 1);
|
|
95
|
+
const decrypted = await (0, src_1.decryptV2)(password, ciphertext);
|
|
96
|
+
assert_1.default.strictEqual(decrypted, plaintext);
|
|
97
|
+
});
|
|
98
|
+
it('throws on wrong password', async () => {
|
|
99
|
+
const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
|
|
100
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)('wrongPassword', ciphertext));
|
|
101
|
+
});
|
|
102
|
+
it('throws on invalid JSON', async () => {
|
|
103
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, 'not-json'), /invalid JSON envelope/);
|
|
104
|
+
});
|
|
105
|
+
it('throws on wrong envelope version', async () => {
|
|
106
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify({ v: 99 })), /invalid envelope/);
|
|
107
|
+
});
|
|
108
|
+
it('throws on invalid salt length', async () => {
|
|
109
|
+
await assert_1.default.rejects(() => (0, src_1.encryptV2)(password, plaintext, { salt: new Uint8Array(8) }), /salt must be 16 bytes/);
|
|
110
|
+
});
|
|
111
|
+
it('throws on invalid iv length', async () => {
|
|
112
|
+
await assert_1.default.rejects(() => (0, src_1.encryptV2)(password, plaintext, { iv: new Uint8Array(8) }), /iv must be 12 bytes/);
|
|
113
|
+
});
|
|
114
|
+
it('v1 and v2 are independent (v1 data does not decrypt with v2)', async () => {
|
|
115
|
+
const v1ct = (0, src_1.encrypt)(password, plaintext);
|
|
116
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, v1ct), /invalid envelope/);
|
|
117
|
+
});
|
|
118
|
+
it('rejects envelope with memorySize exceeding max', async () => {
|
|
119
|
+
const envelope = { v: 2, m: 999999999, t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
|
|
120
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
|
|
121
|
+
});
|
|
122
|
+
it('rejects envelope with iterations exceeding max', async () => {
|
|
123
|
+
const envelope = { v: 2, m: 65536, t: 100, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
|
|
124
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
|
|
125
|
+
});
|
|
126
|
+
it('rejects envelope with parallelism exceeding max', async () => {
|
|
127
|
+
const envelope = { v: 2, m: 65536, t: 3, p: 100, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
|
|
128
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
|
|
129
|
+
});
|
|
130
|
+
it('rejects envelope with zero-valued parameters', async () => {
|
|
131
|
+
const envelope = { v: 2, m: 0, t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
|
|
132
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
|
|
133
|
+
});
|
|
134
|
+
it('rejects envelope with non-numeric parameter types', async () => {
|
|
135
|
+
const envelope = { v: 2, m: '65536', t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
|
|
136
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
|
|
137
|
+
});
|
|
138
|
+
it('rejects envelope with empty salt', async () => {
|
|
139
|
+
const envelope = { v: 2, m: 65536, t: 3, p: 4, salt: '', iv: 'AAAA', ct: 'AAAA' };
|
|
140
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('decryptAsync (auto-detect v1/v2)', () => {
|
|
144
|
+
const password = 'myPassword';
|
|
145
|
+
const plaintext = 'Hello, World!';
|
|
146
|
+
it('decrypts v1 data', async () => {
|
|
147
|
+
const v1ct = (0, src_1.encrypt)(password, plaintext);
|
|
148
|
+
const result = await (0, src_1.decryptAsync)(password, v1ct);
|
|
149
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
150
|
+
});
|
|
151
|
+
it('decrypts v2 data', async () => {
|
|
152
|
+
const v2ct = await (0, src_1.encryptV2)(password, plaintext);
|
|
153
|
+
const result = await (0, src_1.decryptAsync)(password, v2ct);
|
|
154
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
155
|
+
});
|
|
156
|
+
it('throws on wrong password for v1', async () => {
|
|
157
|
+
const v1ct = (0, src_1.encrypt)(password, plaintext);
|
|
158
|
+
await assert_1.default.rejects(() => (0, src_1.decryptAsync)('wrong', v1ct));
|
|
159
|
+
});
|
|
160
|
+
it('throws on wrong password for v2', async () => {
|
|
161
|
+
const v2ct = await (0, src_1.encryptV2)(password, plaintext);
|
|
162
|
+
await assert_1.default.rejects(() => (0, src_1.decryptAsync)('wrong', v2ct));
|
|
163
|
+
});
|
|
164
|
+
it('throws on invalid JSON input', async () => {
|
|
165
|
+
await assert_1.default.rejects(() => (0, src_1.decryptAsync)(password, 'not-json'), /ciphertext is not valid JSON/);
|
|
166
|
+
});
|
|
167
|
+
it('wrong password on v2 data does not fall through to v1 decrypt', async () => {
|
|
168
|
+
const v2ct = await (0, src_1.encryptV2)(password, plaintext, { memorySize: 1024, iterations: 1, parallelism: 1 });
|
|
169
|
+
let caughtError;
|
|
170
|
+
try {
|
|
171
|
+
await (0, src_1.decryptAsync)('wrong', v2ct);
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
caughtError = e;
|
|
175
|
+
}
|
|
176
|
+
assert_1.default.ok(caughtError, 'should have thrown');
|
|
177
|
+
assert_1.default.ok(!caughtError.message?.includes('sjcl'), 'error must not be from SJCL');
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe('EncryptionSession (HKDF caching)', () => {
|
|
181
|
+
const opts = { memorySize: 1024, iterations: 1, parallelism: 1 };
|
|
182
|
+
const password = 'test-password';
|
|
183
|
+
const plaintext = 'hello session';
|
|
184
|
+
it('session-produced envelope contains salt and hkdfSalt', async () => {
|
|
185
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
186
|
+
const ct = await session.encrypt(plaintext);
|
|
187
|
+
session.destroy();
|
|
188
|
+
const envelope = JSON.parse(ct);
|
|
189
|
+
assert_1.default.strictEqual(envelope.v, 2);
|
|
190
|
+
assert_1.default.ok(envelope.salt, 'must have argon2 salt');
|
|
191
|
+
assert_1.default.ok(envelope.hkdfSalt, 'must have hkdf salt');
|
|
192
|
+
assert_1.default.ok(envelope.iv, 'must have iv');
|
|
193
|
+
assert_1.default.ok(envelope.ct, 'must have ciphertext');
|
|
194
|
+
});
|
|
195
|
+
it('session round-trip via session.decrypt', async () => {
|
|
196
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
197
|
+
const ct = await session.encrypt(plaintext);
|
|
198
|
+
const result = await session.decrypt(ct);
|
|
199
|
+
session.destroy();
|
|
200
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
201
|
+
});
|
|
202
|
+
it('session envelope can be decrypted standalone via decryptV2', async () => {
|
|
203
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
204
|
+
const ct = await session.encrypt(plaintext);
|
|
205
|
+
session.destroy();
|
|
206
|
+
const result = await (0, src_1.decryptV2)(password, ct);
|
|
207
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
208
|
+
});
|
|
209
|
+
it('session envelope can be decrypted via decryptAsync', async () => {
|
|
210
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
211
|
+
const ct = await session.encrypt(plaintext);
|
|
212
|
+
session.destroy();
|
|
213
|
+
const result = await (0, src_1.decryptAsync)(password, ct);
|
|
214
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
215
|
+
});
|
|
216
|
+
it('multiple encrypts produce different hkdfSalt values', async () => {
|
|
217
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
218
|
+
const ct1 = await session.encrypt(plaintext);
|
|
219
|
+
const ct2 = await session.encrypt(plaintext);
|
|
220
|
+
session.destroy();
|
|
221
|
+
const e1 = JSON.parse(ct1);
|
|
222
|
+
const e2 = JSON.parse(ct2);
|
|
223
|
+
assert_1.default.notStrictEqual(e1.hkdfSalt, e2.hkdfSalt);
|
|
224
|
+
});
|
|
225
|
+
it('all session encrypts share the same argon2 salt', async () => {
|
|
226
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
227
|
+
const ct1 = await session.encrypt(plaintext);
|
|
228
|
+
const ct2 = await session.encrypt(plaintext);
|
|
229
|
+
session.destroy();
|
|
230
|
+
const e1 = JSON.parse(ct1);
|
|
231
|
+
const e2 = JSON.parse(ct2);
|
|
232
|
+
assert_1.default.strictEqual(e1.salt, e2.salt);
|
|
233
|
+
});
|
|
234
|
+
it('wrong password rejected by decryptV2', async () => {
|
|
235
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
236
|
+
const ct = await session.encrypt(plaintext);
|
|
237
|
+
session.destroy();
|
|
238
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)('wrong-password', ct));
|
|
239
|
+
});
|
|
240
|
+
it('destroy prevents further encrypt calls', async () => {
|
|
241
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
242
|
+
session.destroy();
|
|
243
|
+
await assert_1.default.rejects(() => session.encrypt(plaintext), /destroyed/);
|
|
244
|
+
});
|
|
245
|
+
it('destroy prevents further decrypt calls', async () => {
|
|
246
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
247
|
+
const ct = await session.encrypt(plaintext);
|
|
248
|
+
session.destroy();
|
|
249
|
+
await assert_1.default.rejects(() => session.decrypt(ct), /destroyed/);
|
|
250
|
+
});
|
|
251
|
+
it('session rejects envelopes from a different session', async () => {
|
|
252
|
+
const session1 = await (0, src_1.createEncryptionSession)(password, opts);
|
|
253
|
+
const session2 = await (0, src_1.createEncryptionSession)(password, opts);
|
|
254
|
+
const ct = await session1.encrypt(plaintext);
|
|
255
|
+
await assert_1.default.rejects(() => session2.decrypt(ct), /not encrypted with this session/);
|
|
256
|
+
session1.destroy();
|
|
257
|
+
session2.destroy();
|
|
258
|
+
});
|
|
259
|
+
it('session rejects standard v2 envelopes (no hkdfSalt)', async () => {
|
|
260
|
+
const v2ct = await (0, src_1.encryptV2)(password, plaintext, opts);
|
|
261
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
262
|
+
await assert_1.default.rejects(() => session.decrypt(v2ct), /use decryptV2/);
|
|
263
|
+
session.destroy();
|
|
264
|
+
});
|
|
265
|
+
it('Argon2id params are stored in envelope', async () => {
|
|
266
|
+
const session = await (0, src_1.createEncryptionSession)(password, { memorySize: 2048, iterations: 2, parallelism: 2 });
|
|
267
|
+
const ct = await session.encrypt(plaintext);
|
|
268
|
+
session.destroy();
|
|
269
|
+
const envelope = JSON.parse(ct);
|
|
270
|
+
assert_1.default.strictEqual(envelope.m, 2048);
|
|
271
|
+
assert_1.default.strictEqual(envelope.t, 2);
|
|
272
|
+
assert_1.default.strictEqual(envelope.p, 2);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFxQztBQUVyQyxtQ0FBc0g7QUFFdEgsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxVQUFVLEtBQUssU0FBUyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1lBQzVFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUs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bnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0LCBkZWNyeXB0QXN5bmMsIGRlY3J5cHRWMiwgZW5jcnlwdCwgZW5jcnlwdFYyLCBWMkVudmVsb3BlLCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdlbmNyeXB0aW9uIG1ldGhvZHMgdGVzdHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdlbmNyeXB0JywgKCkgPT4ge1xuICAgIGl0KCdlbmNyeXB0cyB0aGUgcGxhaW50ZXh0IHdpdGggdGhlIGdpdmVuIHBhc3N3b3JkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcblxuICAgICAgYXNzZXJ0KGNpcGhlcnRleHQgIT09IHBsYWludGV4dCwgJ2NpcGhlcnRleHQgc2hvdWxkIG5vdCBiZSBlcXVhbCB0byBwbGFpbnRleHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGEgZGlmZmVyZW50IGNpcGhlcnRleHQgZm9yIHRoZSBzYW1lIHBsYWludGV4dCBhbmQgcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQxID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQyID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcblxuICAgICAgYXNzZXJ0KGNpcGhlcnRleHQxICE9PSBjaXBoZXJ0ZXh0MiwgJ2NpcGhlcnRleHRzIHNob3VsZCBub3QgYmUgZXF1YWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNhbHQgbGVuZ3RoIGlzIG5vdCA4IGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBvcHRpb25zID0geyBzYWx0OiByYW5kb21CeXRlcyg0KSB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyksIG5ldyBFcnJvcihgc2FsdCBtdXN0IGJlIDggYnl0ZXNgKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIGFuIGVycm9yIGlmIHRoZSBpdiBsZW5ndGggaXMgbm90IDE2IGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBvcHRpb25zID0geyBpdjogcmFuZG9tQnl0ZXMoNCkgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIG9wdGlvbnMpLCBuZXcgRXJyb3IoYGl2IG11c3QgYmUgMTYgYnl0ZXNgKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWNyeXB0JywgKCkgPT4ge1xuICAgIGl0KCdkZWNyeXB0cyB0aGUgY2lwaGVydGV4dCB3aXRoIHRoZSBnaXZlbiBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBkZWNyeXB0ZWQgPSBkZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcblxuICAgICAgYXNzZXJ0KGRlY3J5cHRlZCA9PT0gcGxhaW50ZXh0LCAnZGVjcnlwdGVkIHNob3VsZCBiZSBlcXVhbCB0byBwbGFpbnRleHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHBhc3N3b3JkIGlzIHdyb25nJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IHdyb25nUGFzc3dvcmQgPSAnd3JvbmdQYXNzd29yZCc7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZGVjcnlwdCh3cm9uZ1Bhc3N3b3JkLCBjaXBoZXJ0ZXh0KSwgJ3NqY2wgZXhjZXB0aW9uOiBjYzogaW52YWxpZCBhZXMga2V5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVjcnlwdHMgdGhlIGNpcGhlcnRleHQgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQgYW5kIGFkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBhZGF0YSA9ICdhZGRpdGlvbmFsIGRhdGEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgeyBhZGF0YSB9KTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuXG4gICAgICBhc3NlcnQoZGVjcnlwdGVkID09PSBwbGFpbnRleHQsICdkZWNyeXB0ZWQgc2hvdWxkIGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndjIgZW5jcnlwdC9kZWNyeXB0IChBcmdvbjJpZCArIEFFUy0yNTYtR0NNKScsICgpID0+IHtcbiAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG5cbiAgICBpdCgnZW5jcnlwdHMgYW5kIGRlY3J5cHRzIHJvdW5kLXRyaXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdFYyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNyeXB0ZWQsIHBsYWludGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvZHVjZXMgYSB2YWxpZCB2MiBlbnZlbG9wZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUubSwgNjU1MzYpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnQsIDMpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnAsIDQpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLnNhbHQsICdlbnZlbG9wZSBtdXN0IGhhdmUgc2FsdCcpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLml2LCAnZW52ZWxvcGUgbXVzdCBoYXZlIGl2Jyk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuY3QsICdlbnZlbG9wZSBtdXN0IGhhdmUgY3QnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGRpZmZlcmVudCBjaXBoZXJ0ZXh0IGZvciB0aGUgc2FtZSBwbGFpbnRleHQgYW5kIHBhc3N3b3JkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3QxID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY3QyID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGN0MSwgY3QyKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB3aXRoIGN1c3RvbSBBcmdvbjJpZCBwYXJhbWV0ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7XG4gICAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICAgIGl0ZXJhdGlvbnM6IDEsXG4gICAgICAgIHBhcmFsbGVsaXNtOiAxLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUubSwgMTAyNCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUucCwgMSk7XG5cbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHRWMihwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkLCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiB3cm9uZyBwYXNzd29yZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIoJ3dyb25nUGFzc3dvcmQnLCBjaXBoZXJ0ZXh0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIGludmFsaWQgSlNPTicsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgJ25vdC1qc29uJyksIC9pbnZhbGlkIEpTT04gZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gd3JvbmcgZW52ZWxvcGUgdmVyc2lvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoeyB2OiA5OSB9KSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIGludmFsaWQgc2FsdCBsZW5ndGgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBzYWx0OiBuZXcgVWludDhBcnJheSg4KSB9KSwgL3NhbHQgbXVzdCBiZSAxNiBieXRlcy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIGl2IGxlbmd0aCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGl2OiBuZXcgVWludDhBcnJheSg4KSB9KSwgL2l2IG11c3QgYmUgMTIgYnl0ZXMvKTtcbiAgICB9KTtcblxuICAgIGl0KCd2MSBhbmQgdjIgYXJlIGluZGVwZW5kZW50ICh2MSBkYXRhIGRvZXMgbm90IGRlY3J5cHQgd2l0aCB2MiknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MWN0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgdjFjdCksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIG1lbW9yeVNpemUgZXhjZWVkaW5nIG1heCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA5OTk5OTk5OTksIHQ6IDMsIHA6IDQsIHNhbHQ6ICdBQUFBJywgaXY6ICdBQUFBJywgY3Q6ICdBQUFBJyB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgZW52ZWxvcGUgd2l0aCBpdGVyYXRpb25zIGV4Y2VlZGluZyBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogNjU1MzYsIHQ6IDEwMCwgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIHBhcmFsbGVsaXNtIGV4Y2VlZGluZyBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogNjU1MzYsIHQ6IDMsIHA6IDEwMCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIHplcm8tdmFsdWVkIHBhcmFtZXRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogMCwgdDogMywgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIG5vbi1udW1lcmljIHBhcmFtZXRlciB0eXBlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiAnNjU1MzYnLCB0OiAzLCBwOiA0LCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggZW1wdHkgc2FsdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA2NTUzNiwgdDogMywgcDogNCwgc2FsdDogJycsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY3J5cHRBc3luYyAoYXV0by1kZXRlY3QgdjEvdjIpJywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcblxuICAgIGl0KCdkZWNyeXB0cyB2MSBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjFjdCA9IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWNyeXB0QXN5bmMocGFzc3dvcmQsIHYxY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB2MiBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjJjdCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRBc3luYyhwYXNzd29yZCwgdjJjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiB3cm9uZyBwYXNzd29yZCBmb3IgdjEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MWN0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRBc3luYygnd3JvbmcnLCB2MWN0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIHBhc3N3b3JkIGZvciB2MicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYyY3QgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0QXN5bmMoJ3dyb25nJywgdjJjdCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIEpTT04gaW5wdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0QXN5bmMocGFzc3dvcmQsICdub3QtanNvbicpLCAvY2lwaGVydGV4dCBpcyBub3QgdmFsaWQgSlNPTi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dyb25nIHBhc3N3b3JkIG9uIHYyIGRhdGEgZG9lcyBub3QgZmFsbCB0aHJvdWdoIHRvIHYxIGRlY3J5cHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MmN0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgbWVtb3J5U2l6ZTogMTAyNCwgaXRlcmF0aW9uczogMSwgcGFyYWxsZWxpc206IDEgfSk7XG4gICAgICBsZXQgY2F1Z2h0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGVjcnlwdEFzeW5jKCd3cm9uZycsIHYyY3QpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYXVnaHRFcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgICB9XG4gICAgICBhc3NlcnQub2soY2F1Z2h0RXJyb3IsICdzaG91bGQgaGF2ZSB0aHJvd24nKTtcbiAgICAgIGFzc2VydC5vayghY2F1Z2h0RXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ3NqY2wnKSwgJ2Vycm9yIG11c3Qgbm90IGJlIGZyb20gU0pDTCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRW5jcnlwdGlvblNlc3Npb24gKEhLREYgY2FjaGluZyknLCAoKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgbWVtb3J5U2l6ZTogMTAyNCwgaXRlcmF0aW9uczogMSwgcGFyYWxsZWxpc206IDEgfTtcbiAgICBjb25zdCBwYXNzd29yZCA9ICd0ZXN0LXBhc3N3b3JkJztcbiAgICBjb25zdCBwbGFpbnRleHQgPSAnaGVsbG8gc2Vzc2lvbic7XG5cbiAgICBpdCgnc2Vzc2lvbi1wcm9kdWNlZCBlbnZlbG9wZSBjb250YWlucyBzYWx0IGFuZCBoa2RmU2FsdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG5cbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMik7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuc2FsdCwgJ211c3QgaGF2ZSBhcmdvbjIgc2FsdCcpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLmhrZGZTYWx0LCAnbXVzdCBoYXZlIGhrZGYgc2FsdCcpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLml2LCAnbXVzdCBoYXZlIGl2Jyk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuY3QsICdtdXN0IGhhdmUgY2lwaGVydGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nlc3Npb24gcm91bmQtdHJpcCB2aWEgc2Vzc2lvbi5kZWNyeXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmRlY3J5cHQoY3QpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nlc3Npb24gZW52ZWxvcGUgY2FuIGJlIGRlY3J5cHRlZCBzdGFuZGFsb25lIHZpYSBkZWNyeXB0VjInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjcnlwdFYyKHBhc3N3b3JkLCBjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nlc3Npb24gZW52ZWxvcGUgY2FuIGJlIGRlY3J5cHRlZCB2aWEgZGVjcnlwdEFzeW5jJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRBc3luYyhwYXNzd29yZCwgY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdtdWx0aXBsZSBlbmNyeXB0cyBwcm9kdWNlIGRpZmZlcmVudCBoa2RmU2FsdCB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QxID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBjb25zdCBjdDIgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgZTE6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0MSk7XG4gICAgICBjb25zdCBlMjogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY3QyKTtcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChlMS5oa2RmU2FsdCwgZTIuaGtkZlNhbHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FsbCBzZXNzaW9uIGVuY3J5cHRzIHNoYXJlIHRoZSBzYW1lIGFyZ29uMiBzYWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0MSA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY3QyID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IGUxOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdDEpO1xuICAgICAgY29uc3QgZTI6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0Mik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZTEuc2FsdCwgZTIuc2FsdCk7XG4gICAgfSk7XG5cbiAgICBpdCgnd3JvbmcgcGFzc3dvcmQgcmVqZWN0ZWQgYnkgZGVjcnlwdFYyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMignd3JvbmctcGFzc3dvcmQnLCBjdCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rlc3Ryb3kgcHJldmVudHMgZnVydGhlciBlbmNyeXB0IGNhbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCksIC9kZXN0cm95ZWQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZXN0cm95IHByZXZlbnRzIGZ1cnRoZXIgZGVjcnlwdCBjYWxscycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uLmRlY3J5cHQoY3QpLCAvZGVzdHJveWVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2Vzc2lvbiByZWplY3RzIGVudmVsb3BlcyBmcm9tIGEgZGlmZmVyZW50IHNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uMSA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IHNlc3Npb24yID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uMS5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uMi5kZWNyeXB0KGN0KSwgL25vdCBlbmNyeXB0ZWQgd2l0aCB0aGlzIHNlc3Npb24vKTtcbiAgICAgIHNlc3Npb24xLmRlc3Ryb3koKTtcbiAgICAgIHNlc3Npb24yLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXNzaW9uIHJlamVjdHMgc3RhbmRhcmQgdjIgZW52ZWxvcGVzIChubyBoa2RmU2FsdCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MmN0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIG9wdHMpO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IHNlc3Npb24uZGVjcnlwdCh2MmN0KSwgL3VzZSBkZWNyeXB0VjIvKTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0FyZ29uMmlkIHBhcmFtcyBhcmUgc3RvcmVkIGluIGVudmVsb3BlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCB7IG1lbW9yeVNpemU6IDIwNDgsIGl0ZXJhdGlvbnM6IDIsIHBhcmFsbGVsaXNtOiAyIH0pO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgZW52ZWxvcGU6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5tLCAyMDQ4KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS50LCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5wLCAyKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmacStrategy.d.ts","sourceRoot":"","sources":["../../../test/unit/hmacStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
+
require("should");
|
|
7
|
+
const nock_1 = __importDefault(require("nock"));
|
|
8
|
+
const bitgoAPI_1 = require("../../src/bitgoAPI");
|
|
9
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
10
|
+
const TEST_TOKEN = 'v2x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdefab';
|
|
11
|
+
const TEST_URI = 'https://app.example.local';
|
|
12
|
+
/**
|
|
13
|
+
* Mock strategy that records calls and returns predictable values.
|
|
14
|
+
*/
|
|
15
|
+
class MockHmacAuthStrategy {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.calculateRequestHeadersCalls = [];
|
|
18
|
+
this.verifyResponseCalls = [];
|
|
19
|
+
this.calculateHMACCalls = [];
|
|
20
|
+
}
|
|
21
|
+
async calculateRequestHeaders(params) {
|
|
22
|
+
this.calculateRequestHeadersCalls.push(params);
|
|
23
|
+
return {
|
|
24
|
+
hmac: 'mock-hmac-value',
|
|
25
|
+
timestamp: 1672531200000,
|
|
26
|
+
tokenHash: 'mock-token-hash',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async verifyResponse(params) {
|
|
30
|
+
this.verifyResponseCalls.push(params);
|
|
31
|
+
return {
|
|
32
|
+
isValid: true,
|
|
33
|
+
expectedHmac: 'mock-hmac-value',
|
|
34
|
+
signatureSubject: 'mock-subject',
|
|
35
|
+
isInResponseValidityWindow: true,
|
|
36
|
+
verificationTime: Date.now(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async calculateHMAC(key, message) {
|
|
40
|
+
this.calculateHMACCalls.push({ key, message });
|
|
41
|
+
return 'mock-hmac-password';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
describe('BitGoAPI HMAC Strategy Injection', function () {
|
|
45
|
+
afterEach(function () {
|
|
46
|
+
nock_1.default.cleanAll();
|
|
47
|
+
});
|
|
48
|
+
describe('constructor', function () {
|
|
49
|
+
it('should accept a custom hmacAuthStrategy', function () {
|
|
50
|
+
const strategy = new MockHmacAuthStrategy();
|
|
51
|
+
const bitgo = new bitgoAPI_1.BitGoAPI({
|
|
52
|
+
env: 'custom',
|
|
53
|
+
customRootURI: TEST_URI,
|
|
54
|
+
hmacAuthStrategy: strategy,
|
|
55
|
+
});
|
|
56
|
+
bitgo.should.be.ok();
|
|
57
|
+
});
|
|
58
|
+
it('should default to DefaultHmacAuthStrategy when none is provided', function () {
|
|
59
|
+
const bitgo = new bitgoAPI_1.BitGoAPI({
|
|
60
|
+
env: 'custom',
|
|
61
|
+
customRootURI: TEST_URI,
|
|
62
|
+
});
|
|
63
|
+
bitgo.should.be.ok();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('request signing via strategy', function () {
|
|
67
|
+
it('should use the custom strategy for HMAC header calculation', async function () {
|
|
68
|
+
const strategy = new MockHmacAuthStrategy();
|
|
69
|
+
const bitgo = new bitgoAPI_1.BitGoAPI({
|
|
70
|
+
env: 'custom',
|
|
71
|
+
customRootURI: TEST_URI,
|
|
72
|
+
accessToken: TEST_TOKEN,
|
|
73
|
+
hmacAuthStrategy: strategy,
|
|
74
|
+
});
|
|
75
|
+
const scope = (0, nock_1.default)(TEST_URI)
|
|
76
|
+
.get('/api/v2/wallet')
|
|
77
|
+
.matchHeader('HMAC', 'mock-hmac-value')
|
|
78
|
+
.matchHeader('Authorization', 'Bearer mock-token-hash')
|
|
79
|
+
.matchHeader('Auth-Timestamp', '1672531200000')
|
|
80
|
+
.reply(200, { wallets: [] }, {
|
|
81
|
+
hmac: 'response-hmac',
|
|
82
|
+
timestamp: Date.now().toString(),
|
|
83
|
+
});
|
|
84
|
+
await bitgo.get(bitgo.url('/wallet', 2)).result();
|
|
85
|
+
strategy.calculateRequestHeadersCalls.length.should.equal(1);
|
|
86
|
+
const call = strategy.calculateRequestHeadersCalls[0];
|
|
87
|
+
call.token.should.equal(TEST_TOKEN);
|
|
88
|
+
call.method.should.equal('get');
|
|
89
|
+
scope.isDone().should.be.true();
|
|
90
|
+
});
|
|
91
|
+
it('should use the custom strategy for response verification', async function () {
|
|
92
|
+
const strategy = new MockHmacAuthStrategy();
|
|
93
|
+
const bitgo = new bitgoAPI_1.BitGoAPI({
|
|
94
|
+
env: 'custom',
|
|
95
|
+
customRootURI: TEST_URI,
|
|
96
|
+
accessToken: TEST_TOKEN,
|
|
97
|
+
hmacAuthStrategy: strategy,
|
|
98
|
+
});
|
|
99
|
+
(0, nock_1.default)(TEST_URI).get('/api/v2/wallet').reply(200, { wallets: [] }, {
|
|
100
|
+
hmac: 'server-response-hmac',
|
|
101
|
+
timestamp: Date.now().toString(),
|
|
102
|
+
});
|
|
103
|
+
await bitgo.get(bitgo.url('/wallet', 2)).result();
|
|
104
|
+
strategy.verifyResponseCalls.length.should.equal(1);
|
|
105
|
+
const call = strategy.verifyResponseCalls[0];
|
|
106
|
+
call.hmac.should.equal('server-response-hmac');
|
|
107
|
+
(0, node_assert_1.default)(call.statusCode, 'statusCode is required');
|
|
108
|
+
call.statusCode.should.equal(200);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('password HMAC via strategy', function () {
|
|
112
|
+
it('should use the custom strategy for password hashing in preprocessAuthenticationParams', async function () {
|
|
113
|
+
const strategy = new MockHmacAuthStrategy();
|
|
114
|
+
const bitgo = new bitgoAPI_1.BitGoAPI({
|
|
115
|
+
env: 'custom',
|
|
116
|
+
customRootURI: TEST_URI,
|
|
117
|
+
hmacAuthStrategy: strategy,
|
|
118
|
+
});
|
|
119
|
+
(0, nock_1.default)(TEST_URI)
|
|
120
|
+
.post('/api/auth/v1/session')
|
|
121
|
+
.reply(200, { access_token: TEST_TOKEN, user: { username: 'test@test.com' } }, {
|
|
122
|
+
hmac: 'resp-hmac',
|
|
123
|
+
timestamp: Date.now().toString(),
|
|
124
|
+
});
|
|
125
|
+
await bitgo.authenticate({
|
|
126
|
+
username: 'test@test.com',
|
|
127
|
+
password: 'mypassword',
|
|
128
|
+
});
|
|
129
|
+
strategy.calculateHMACCalls.length.should.be.greaterThan(0);
|
|
130
|
+
const hmacCall = strategy.calculateHMACCalls[0];
|
|
131
|
+
hmacCall.key.should.equal('test@test.com');
|
|
132
|
+
hmacCall.message.should.equal('mypassword');
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1hY1N0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2htYWNTdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtCQUFnQjtBQUNoQixnREFBd0I7QUFDeEIsaURBQThDO0FBUTlDLDhEQUFpQztBQUVqQyxNQUFNLFVBQVUsR0FBRyx1RUFBdUUsQ0FBQztBQUMzRixNQUFNLFFBQVEsR0FBRywyQkFBMkIsQ0FBQztBQUU3Qzs7R0FFRztBQUNILE1BQU0sb0JBQW9CO0lBQTFCO1FBQ1MsaUNBQTRCLEdBQXFDLEVBQUUsQ0FBQztRQUNwRSx3QkFBbUIsR0FBNEIsRUFBRSxDQUFDO1FBQ2xELHVCQUFrQixHQUE0QyxFQUFFLENBQUM7SUEwQjFFLENBQUM7SUF4QkMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE1BQXNDO1FBQ2xFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsT0FBTztZQUNMLElBQUksRUFBRSxpQkFBaUI7WUFDdkIsU0FBUyxFQUFFLGFBQWE7WUFDeEIsU0FBUyxFQUFFLGlCQUFpQjtTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBNkI7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixZQUFZLEVBQUUsaUJBQWlCO1lBQy9CLGdCQUFnQixFQUFFLGNBQWM7WUFDaEMsMEJBQTBCLEVBQUUsSUFBSTtZQUNoQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFF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UUFBUTtnQkFDYixhQUFhLEVBQUUsUUFBUTtnQkFDdkIsZ0JBQWdCLEVBQUUsUUFBUTthQUMzQixDQUFDLENBQUM7WUFFSCxJQUFBLGNBQUksRUFBQyxRQUFRLENBQUM7aUJBQ1gsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2lCQUM1QixLQUFLLENBQ0osR0FBRyxFQUNILEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFDakU7Z0JBQ0UsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO2FBQ2pDLENBQ0YsQ0FBQztZQUVKLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDdkIsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLFFBQVEsRUFBRSxZQUFZO2FBQ3ZCLENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJy4uLy4uL3NyYy9iaXRnb0FQSSc7XG5pbXBvcnQgdHlwZSB7XG4gIElIbWFjQXV0aFN0cmF0ZWd5LFxuICBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnMsXG4gIFJlcXVlc3RIZWFkZXJzLFxuICBWZXJpZnlSZXNwb25zZU9wdGlvbnMsXG4gIFZlcmlmeVJlc3BvbnNlSW5mbyxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWhtYWMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5cbmNvbnN0IFRFU1RfVE9LRU4gPSAndjJ4MTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZmFiJztcbmNvbnN0IFRFU1RfVVJJID0gJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnO1xuXG4vKipcbiAqIE1vY2sgc3RyYXRlZ3kgdGhhdCByZWNvcmRzIGNhbGxzIGFuZCByZXR1cm5zIHByZWRpY3RhYmxlIHZhbHVlcy5cbiAqL1xuY2xhc3MgTW9ja0htYWNBdXRoU3RyYXRlZ3kgaW1wbGVtZW50cyBJSG1hY0F1dGhTdHJhdGVneSB7XG4gIHB1YmxpYyBjYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc0NhbGxzOiBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnNbXSA9IFtdO1xuICBwdWJsaWMgdmVyaWZ5UmVzcG9uc2VDYWxsczogVmVyaWZ5UmVzcG9uc2VPcHRpb25zW10gPSBbXTtcbiAgcHVibGljIGNhbGN1bGF0ZUhNQUNDYWxsczogQXJyYXk8eyBrZXk6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0+ID0gW107XG5cbiAgYXN5bmMgY2FsY3VsYXRlUmVxdWVzdEhlYWRlcnMocGFyYW1zOiBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnMpOiBQcm9taXNlPFJlcXVlc3RIZWFkZXJzPiB7XG4gICAgdGhpcy5jYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc0NhbGxzLnB1c2gocGFyYW1zKTtcbiAgICByZXR1cm4ge1xuICAgICAgaG1hYzogJ21vY2staG1hYy12YWx1ZScsXG4gICAgICB0aW1lc3RhbXA6IDE2NzI1MzEyMDAwMDAsXG4gICAgICB0b2tlbkhhc2g6ICdtb2NrLXRva2VuLWhhc2gnLFxuICAgIH07XG4gIH1cblxuICBhc3luYyB2ZXJpZnlSZXNwb25zZShwYXJhbXM6IFZlcmlmeVJlc3BvbnNlT3B0aW9ucyk6IFByb21pc2U8VmVyaWZ5UmVzcG9uc2VJbmZvPiB7XG4gICAgdGhpcy52ZXJpZnlSZXNwb25zZUNhbGxzLnB1c2gocGFyYW1zKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIGV4cGVjdGVkSG1hYzogJ21vY2staG1hYy12YWx1ZScsXG4gICAgICBzaWduYXR1cmVTdWJqZWN0OiAnbW9jay1zdWJqZWN0JyxcbiAgICAgIGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93OiB0cnVlLFxuICAgICAgdmVyaWZpY2F0aW9uVGltZTogRGF0ZS5ub3coKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY2FsY3VsYXRlSE1BQyhrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmNhbGN1bGF0ZUhNQUNDYWxscy5wdXNoKHsga2V5LCBtZXNzYWdlIH0pO1xuICAgIHJldHVybiAnbW9jay1obWFjLXBhc3N3b3JkJztcbiAgfVxufVxuXG5kZXNjcmliZSgnQml0R29BUEkgSE1BQyBTdHJhdGVneSBJbmplY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSBjdXN0b20gaG1hY0F1dGhTdHJhdGVneScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gbmV3IE1vY2tIbWFjQXV0aFN0cmF0ZWd5KCk7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6IFRFU1RfVVJJLFxuICAgICAgICBobWFjQXV0aFN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIH0pO1xuXG4gICAgICBiaXRnby5zaG91bGQuYmUub2soKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVmYXVsdCB0byBEZWZhdWx0SG1hY0F1dGhTdHJhdGVneSB3aGVuIG5vbmUgaXMgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6IFRFU1RfVVJJLFxuICAgICAgfSk7XG5cbiAgICAgIGJpdGdvLnNob3VsZC5iZS5vaygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVxdWVzdCBzaWduaW5nIHZpYSBzdHJhdGVneScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgY3VzdG9tIHN0cmF0ZWd5IGZvciBITUFDIGhlYWRlciBjYWxjdWxhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gbmV3IE1vY2tIbWFjQXV0aFN0cmF0ZWd5KCk7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6IFRFU1RfVVJJLFxuICAgICAgICBhY2Nlc3NUb2tlbjogVEVTVF9UT0tFTixcbiAgICAgICAgaG1hY0F1dGhTdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2NvcGUgPSBub2NrKFRFU1RfVVJJKVxuICAgICAgICAuZ2V0KCcvYXBpL3YyL3dhbGxldCcpXG4gICAgICAgIC5tYXRjaEhlYWRlcignSE1BQycsICdtb2NrLWhtYWMtdmFsdWUnKVxuICAgICAgICAubWF0Y2hIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyIG1vY2stdG9rZW4taGFzaCcpXG4gICAgICAgIC5tYXRjaEhlYWRlcignQXV0aC1UaW1lc3RhbXAnLCAnMTY3MjUzMTIwMDAwMCcpXG4gICAgICAgIC5yZXBseShcbiAgICAgICAgICAyMDAsXG4gICAgICAgICAgeyB3YWxsZXRzOiBbXSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhtYWM6ICdyZXNwb25zZS1obWFjJyxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgYXdhaXQgYml0Z28uZ2V0KGJpdGdvLnVybCgnL3dhbGxldCcsIDIpKS5yZXN1bHQoKTtcblxuICAgICAgc3RyYXRlZ3kuY2FsY3VsYXRlUmVxdWVzdEhlYWRlcnNDYWxscy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgY29uc3QgY2FsbCA9IHN0cmF0ZWd5LmNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzQ2FsbHNbMF07XG4gICAgICBjYWxsLnRva2VuLnNob3VsZC5lcXVhbChURVNUX1RPS0VOKTtcbiAgICAgIGNhbGwubWV0aG9kLnNob3VsZC5lcXVhbCgnZ2V0Jyk7XG5cbiAgICAgIHNjb3BlLmlzRG9uZSgpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgY3VzdG9tIHN0cmF0ZWd5IGZvciByZXNwb25zZSB2ZXJpZmljYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHJhdGVneSA9IG5ldyBNb2NrSG1hY0F1dGhTdHJhdGVneSgpO1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiBURVNUX1VSSSxcbiAgICAgICAgYWNjZXNzVG9rZW46IFRFU1RfVE9LRU4sXG4gICAgICAgIGhtYWNBdXRoU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgICAgfSk7XG5cbiAgICAgIG5vY2soVEVTVF9VUkkpLmdldCgnL2FwaS92Mi93YWxsZXQnKS5yZXBseShcbiAgICAgICAgMjAwLFxuICAgICAgICB7IHdhbGxldHM6IFtdIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBobWFjOiAnc2VydmVyLXJlc3BvbnNlLWhtYWMnLFxuICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBhd2FpdCBiaXRnby5nZXQoYml0Z28udXJsKCcvd2FsbGV0JywgMikpLnJlc3VsdCgpO1xuXG4gICAgICBzdHJhdGVneS52ZXJpZnlSZXNwb25zZUNhbGxzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBjb25zdCBjYWxsID0gc3RyYXRlZ3kudmVyaWZ5UmVzcG9uc2VDYWxsc1swXTtcbiAgICAgIGNhbGwuaG1hYy5zaG91bGQuZXF1YWwoJ3NlcnZlci1yZXNwb25zZS1obWFjJyk7XG4gICAgICBhc3NlcnQoY2FsbC5zdGF0dXNDb2RlLCAnc3RhdHVzQ29kZSBpcyByZXF1aXJlZCcpO1xuICAgICAgY2FsbC5zdGF0dXNDb2RlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFzc3dvcmQgSE1BQyB2aWEgc3RyYXRlZ3knLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB1c2UgdGhlIGN1c3RvbSBzdHJhdGVneSBmb3IgcGFzc3dvcmQgaGFzaGluZyBpbiBwcmVwcm9jZXNzQXV0aGVudGljYXRpb25QYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHJhdGVneSA9IG5ldyBNb2NrSG1hY0F1dGhTdHJhdGVneSgpO1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiBURVNUX1VSSSxcbiAgICAgICAgaG1hY0F1dGhTdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgICB9KTtcblxuICAgICAgbm9jayhURVNUX1VSSSlcbiAgICAgICAgLnBvc3QoJy9hcGkvYXV0aC92MS9zZXNzaW9uJylcbiAgICAgICAgLnJlcGx5KFxuICAgICAgICAgIDIwMCxcbiAgICAgICAgICB7IGFjY2Vzc190b2tlbjogVEVTVF9UT0tFTiwgdXNlcjogeyB1c2VybmFtZTogJ3Rlc3RAdGVzdC5jb20nIH0gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBobWFjOiAncmVzcC1obWFjJyxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgYXdhaXQgYml0Z28uYXV0aGVudGljYXRlKHtcbiAgICAgICAgdXNlcm5hbWU6ICd0ZXN0QHRlc3QuY29tJyxcbiAgICAgICAgcGFzc3dvcmQ6ICdteXBhc3N3b3JkJyxcbiAgICAgIH0pO1xuXG4gICAgICBzdHJhdGVneS5jYWxjdWxhdGVITUFDQ2FsbHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICAgIGNvbnN0IGhtYWNDYWxsID0gc3RyYXRlZ3kuY2FsY3VsYXRlSE1BQ0NhbGxzWzBdO1xuICAgICAgaG1hY0NhbGwua2V5LnNob3VsZC5lcXVhbCgndGVzdEB0ZXN0LmNvbScpO1xuICAgICAgaG1hY0NhbGwubWVzc2FnZS5zaG91bGQuZXF1YWwoJ215cGFzc3dvcmQnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
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 src_1 = require("../../src");
|
|
8
|
+
/**
|
|
9
|
+
* These tests are based on the Bluebird try.js tests:
|
|
10
|
+
* https://github.com/petkaantonov/bluebird/blob/master/test/mocha/try.js
|
|
11
|
+
*
|
|
12
|
+
* They have been adapted to TypeScript and modified to assert tryPromise
|
|
13
|
+
* perserves the same behavior as Bluebird.try.
|
|
14
|
+
*/
|
|
15
|
+
const error = new Error();
|
|
16
|
+
const thrower = function () {
|
|
17
|
+
throw error;
|
|
18
|
+
};
|
|
19
|
+
describe('tryPromise', function () {
|
|
20
|
+
it('should reject when the function throws', function () {
|
|
21
|
+
let async = false;
|
|
22
|
+
const ret = (0, src_1.tryPromise)(thrower).then(() => assert_1.default.fail('Should not fulfill'), (e) => {
|
|
23
|
+
(0, assert_1.default)(async);
|
|
24
|
+
(0, assert_1.default)(e === error);
|
|
25
|
+
});
|
|
26
|
+
async = true;
|
|
27
|
+
return ret;
|
|
28
|
+
});
|
|
29
|
+
it('should reject when the function is not a function', function () {
|
|
30
|
+
let async = false;
|
|
31
|
+
const ret = (0, src_1.tryPromise)(null).then(() => assert_1.default.fail('Should not fulfill'), (e) => {
|
|
32
|
+
(0, assert_1.default)(async);
|
|
33
|
+
(0, assert_1.default)(e instanceof TypeError);
|
|
34
|
+
});
|
|
35
|
+
async = true;
|
|
36
|
+
return ret;
|
|
37
|
+
});
|
|
38
|
+
it('should unwrap returned promise', function () {
|
|
39
|
+
let resolve;
|
|
40
|
+
const promise = new Promise((r) => {
|
|
41
|
+
resolve = r;
|
|
42
|
+
});
|
|
43
|
+
const ret = (0, src_1.tryPromise)(() => {
|
|
44
|
+
return promise;
|
|
45
|
+
}).then((v) => {
|
|
46
|
+
assert_1.default.strictEqual(v, 3);
|
|
47
|
+
});
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
resolve(3);
|
|
50
|
+
}, 1);
|
|
51
|
+
return ret;
|
|
52
|
+
});
|
|
53
|
+
it('should unwrap returned thenable', function () {
|
|
54
|
+
return (0, src_1.tryPromise)(() => {
|
|
55
|
+
return {
|
|
56
|
+
then: function (f) {
|
|
57
|
+
f(3);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}).then((v) => {
|
|
61
|
+
assert_1.default.strictEqual(v, 3);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQXVDO0FBRXZDOzs7Ozs7R0FNRztBQUVILE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDMUIsTUFBTSxPQUFPLEdBQUc7SUFDZCxNQUFNLEtBQUssQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLFFBQVEsQ0FBQyxZQUFZLEVBQUU7SUFDckIsRUFBRSxDQUFDLHdDQUF3QyxFQUFFO1FBQzNDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFBLGdCQUFVLEVBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUNsQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUN2QyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2QsSUFBQSxnQkFBTSxFQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQ0YsQ0FBQztRQUNGLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDYixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1FBQ3RELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFBLGdCQUFVLEVBQUMsSUFBVyxDQUFDLENBQUMsSUFBSSxDQUN0QyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUN2QyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2QsSUFBQSxnQkFBTSxFQUFDLENBQUMsWUFBWSxTQUFTLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQ0YsQ0FBQztRQUNGLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDYixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdDQUFnQyxFQUFFO1FBQ25DLElBQUksT0FBZ0MsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sR0FBRyxHQUFHLElBQUEsZ0JBQVUsRUFBQyxHQUFHLEVBQUU7WUFDMUIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDWixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsT0FBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU4sT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtRQUNwQyxPQUFPLElBQUEsZ0JBQVUsRUFBQyxHQUFHLEVBQUU7WUFDckIsT0FBTztnQkFDTCxJQUFJLEVBQUUsVUFBVSxDQUEwQjtvQkFDeEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7YUFDaUIsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNaLGdCQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyB0cnlQcm9taXNlIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuLyoqXG4gKiBUaGVzZSB0ZXN0cyBhcmUgYmFzZWQgb24gdGhlIEJsdWViaXJkIHRyeS5qcyB0ZXN0czpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRrYWFudG9ub3YvYmx1ZWJpcmQvYmxvYi9tYXN0ZXIvdGVzdC9tb2NoYS90cnkuanNcbiAqXG4gKiBUaGV5IGhhdmUgYmVlbiBhZGFwdGVkIHRvIFR5cGVTY3JpcHQgYW5kIG1vZGlmaWVkIHRvIGFzc2VydCB0cnlQcm9taXNlXG4gKiBwZXJzZXJ2ZXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgQmx1ZWJpcmQudHJ5LlxuICovXG5cbmNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG5jb25zdCB0aHJvd2VyID0gZnVuY3Rpb24gKCk6IG5ldmVyIHtcbiAgdGhyb3cgZXJyb3I7XG59O1xuXG5kZXNjcmliZSgndHJ5UHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiB0aGUgZnVuY3Rpb24gdGhyb3dzJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBhc3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHJldCA9IHRyeVByb21pc2UodGhyb3dlcikudGhlbihcbiAgICAgICgpID0+IGFzc2VydC5mYWlsKCdTaG91bGQgbm90IGZ1bGZpbGwnKSxcbiAgICAgIChlOiBFcnJvcikgPT4ge1xuICAgICAgICBhc3NlcnQoYXN5bmMpO1xuICAgICAgICBhc3NlcnQoZSA9PT0gZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gICAgYXN5bmMgPSB0cnVlO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIG5vdCBhIGZ1bmN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBhc3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHJldCA9IHRyeVByb21pc2UobnVsbCBhcyBhbnkpLnRoZW4oXG4gICAgICAoKSA9PiBhc3NlcnQuZmFpbCgnU2hvdWxkIG5vdCBmdWxmaWxsJyksXG4gICAgICAoZTogRXJyb3IpID0+IHtcbiAgICAgICAgYXNzZXJ0KGFzeW5jKTtcbiAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gICAgYXN5bmMgPSB0cnVlO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdW53cmFwIHJldHVybmVkIHByb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc29sdmU6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxudW1iZXI+KChyKSA9PiB7XG4gICAgICByZXNvbHZlID0gcjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldCA9IHRyeVByb21pc2UoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfSkudGhlbigodikgPT4ge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHYsIDMpO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZXNvbHZlISgzKTtcbiAgICB9LCAxKTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdW53cmFwIHJldHVybmVkIHRoZW5hYmxlJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cnlQcm9taXNlKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChmOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCkge1xuICAgICAgICAgIGYoMyk7XG4gICAgICAgIH0sXG4gICAgICB9IGFzIFByb21pc2U8bnVtYmVyPjtcbiAgICB9KS50aGVuKCh2KSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodiwgMyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accelerate-tx.d.ts","sourceRoot":"","sources":["../../../../../test/unit/v1/fixtures/accelerate-tx.ts"],"names":[],"mappings":"AAeA,wBAAgB,WAAW,IAAI;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAQxD"}
|