@bitgo/sdk-api 2.3.1 → 2.4.0

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.
@@ -0,0 +1,60 @@
1
+ import { createDecipheriv, pbkdf2 } from 'crypto';
2
+ import * as t from 'io-ts';
3
+ /**
4
+ * Minimal shape the decrypt path needs from a crypto module. Both `node:crypto`
5
+ * and `crypto-browserify` satisfy this. Passing this in from tests lets the
6
+ * browser-shim test suite exercise the real decrypt code instead of a copy.
7
+ */
8
+ export interface CryptoModule {
9
+ pbkdf2: typeof pbkdf2;
10
+ createDecipheriv: typeof createDecipheriv;
11
+ }
12
+ /**
13
+ * Upper bound on PBKDF2 iterations accepted from a v1 envelope. BitGo-produced
14
+ * v1 envelopes use 10,000; this cap is 10x that. Envelope validation enforces
15
+ * it up front before any KDF work runs.
16
+ */
17
+ export declare const V1_MAX_ITER = 100000;
18
+ /**
19
+ * io-ts codec for a v1 (SJCL) envelope.
20
+ *
21
+ * Enforces the shape and the `iter` cap up front, before any KDF work runs.
22
+ */
23
+ declare const V1EnvelopeCodec: t.IntersectionC<[t.TypeC<{
24
+ v: t.LiteralC<1>;
25
+ iter: t.Type<number, number, unknown>;
26
+ ks: t.UnionC<[t.LiteralC<128>, t.LiteralC<256>]>;
27
+ ts: t.UnionC<[t.LiteralC<64>, t.LiteralC<96>, t.LiteralC<128>]>;
28
+ mode: t.LiteralC<"ccm">;
29
+ cipher: t.LiteralC<"aes">;
30
+ salt: t.Type<string, string, unknown>;
31
+ iv: t.Type<string, string, unknown>;
32
+ ct: t.Type<string, string, unknown>;
33
+ }>, t.PartialC<{
34
+ adata: t.StringC;
35
+ }>]>;
36
+ export type V1Envelope = t.TypeOf<typeof V1EnvelopeCodec>;
37
+ export declare function parseV1Envelope(ciphertext: string): V1Envelope;
38
+ /**
39
+ * Decrypt a parsed v1 envelope given a crypto module.
40
+ *
41
+ * v1 = PBKDF2-SHA256(password, salt, iter, keyLen) then AES-CCM(key, nonce, ct||tag).
42
+ * Byte-for-byte compatible with `sjcl.decrypt` output for the same envelope.
43
+ *
44
+ * Exported so tests can inject `crypto-browserify` and exercise the exact
45
+ * runtime path the webpack browser bundle produces, without duplicating the
46
+ * decrypt logic.
47
+ */
48
+ export declare function decryptV1WithCrypto(password: string, ciphertext: string, crypto: CryptoModule): Promise<string>;
49
+ /**
50
+ * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope.
51
+ *
52
+ * Runs the same `node:crypto` code on server and browser. The BitGoJS webpack
53
+ * config already maps `crypto` -> `crypto-browserify`, whose `aes-256-ccm` and
54
+ * `pbkdf2` implementations are byte-compatible with Node's native ones and
55
+ * with SJCL's envelope format. Parity is guarded by tests in
56
+ * `test/unit/decryptV1.browser.ts`.
57
+ */
58
+ export declare function decryptV1(password: string, ciphertext: string): Promise<string>;
59
+ export {};
60
+ //# sourceMappingURL=decryptV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decryptV1.d.ts","sourceRoot":"","sources":["../../src/decryptV1.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAG3B;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;CAC3C;AAID;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAU,CAAC;AAEnC;;;;GAIG;AACH,QAAA,MAAM,eAAe;;;;;;;;;;;;IAenB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAQ9D;AAeD;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBrH;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErF"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.V1_MAX_ITER = void 0;
37
+ exports.parseV1Envelope = parseV1Envelope;
38
+ exports.decryptV1WithCrypto = decryptV1WithCrypto;
39
+ exports.decryptV1 = decryptV1;
40
+ const sdk_core_1 = require("@bitgo/sdk-core");
41
+ const crypto_1 = require("crypto");
42
+ const t = __importStar(require("io-ts"));
43
+ const util_1 = require("util");
44
+ const defaultCrypto = { pbkdf2: crypto_1.pbkdf2, createDecipheriv: crypto_1.createDecipheriv };
45
+ /**
46
+ * Upper bound on PBKDF2 iterations accepted from a v1 envelope. BitGo-produced
47
+ * v1 envelopes use 10,000; this cap is 10x that. Envelope validation enforces
48
+ * it up front before any KDF work runs.
49
+ */
50
+ exports.V1_MAX_ITER = 100000;
51
+ /**
52
+ * io-ts codec for a v1 (SJCL) envelope.
53
+ *
54
+ * Enforces the shape and the `iter` cap up front, before any KDF work runs.
55
+ */
56
+ const V1EnvelopeCodec = t.intersection([
57
+ t.type({
58
+ v: t.literal(1),
59
+ iter: (0, sdk_core_1.boundedInt)(1, exports.V1_MAX_ITER, 'iter'),
60
+ ks: t.union([t.literal(128), t.literal(256)]),
61
+ ts: t.union([t.literal(64), t.literal(96), t.literal(128)]),
62
+ mode: t.literal('ccm'),
63
+ cipher: t.literal('aes'),
64
+ salt: sdk_core_1.base64String,
65
+ iv: sdk_core_1.base64String,
66
+ ct: sdk_core_1.base64String,
67
+ }),
68
+ t.partial({
69
+ adata: t.string,
70
+ }),
71
+ ]);
72
+ function parseV1Envelope(ciphertext) {
73
+ let parsed;
74
+ try {
75
+ parsed = JSON.parse(ciphertext);
76
+ }
77
+ catch {
78
+ throw new Error('v1 decrypt: invalid JSON envelope');
79
+ }
80
+ return (0, sdk_core_1.decodeWithCodec)(V1EnvelopeCodec, parsed, 'v1 decrypt: invalid envelope');
81
+ }
82
+ /**
83
+ * CCM length field size L, in bytes, chosen to encode the plaintext length.
84
+ *
85
+ * SJCL picks the smallest L in [2, 4) that can represent the plaintext length,
86
+ * then derives the nonce length as (15 - L). We mirror that so Node's CCM
87
+ * uses the same nonce framing as the SJCL encoder produced.
88
+ */
89
+ function ccmNonceLength(plaintextLen) {
90
+ let L = 2;
91
+ while (L < 4 && plaintextLen >= Math.pow(2, 8 * L))
92
+ L++;
93
+ return 15 - L;
94
+ }
95
+ /**
96
+ * Decrypt a parsed v1 envelope given a crypto module.
97
+ *
98
+ * v1 = PBKDF2-SHA256(password, salt, iter, keyLen) then AES-CCM(key, nonce, ct||tag).
99
+ * Byte-for-byte compatible with `sjcl.decrypt` output for the same envelope.
100
+ *
101
+ * Exported so tests can inject `crypto-browserify` and exercise the exact
102
+ * runtime path the webpack browser bundle produces, without duplicating the
103
+ * decrypt logic.
104
+ */
105
+ async function decryptV1WithCrypto(password, ciphertext, crypto) {
106
+ const env = parseV1Envelope(ciphertext);
107
+ const salt = Buffer.from(env.salt, 'base64');
108
+ const ivFull = Buffer.from(env.iv, 'base64');
109
+ const full = Buffer.from(env.ct, 'base64');
110
+ const tagBytes = env.ts / 8;
111
+ if (full.length < tagBytes)
112
+ throw new Error('v1 decrypt: ciphertext shorter than tag');
113
+ const cipher = full.subarray(0, full.length - tagBytes);
114
+ const authTag = full.subarray(full.length - tagBytes);
115
+ const nonceLen = ccmNonceLength(cipher.length);
116
+ if (ivFull.length < nonceLen)
117
+ throw new Error('v1 decrypt: iv shorter than nonce');
118
+ const iv = ivFull.subarray(0, nonceLen);
119
+ const keyBytes = env.ks / 8;
120
+ const key = await (0, util_1.promisify)(crypto.pbkdf2)(password, salt, env.iter, keyBytes, 'sha256');
121
+ const decipher = crypto.createDecipheriv(`aes-${env.ks}-ccm`, key, iv, { authTagLength: tagBytes });
122
+ decipher.setAuthTag(authTag);
123
+ const aad = env.adata ? Buffer.from(env.adata, 'utf8') : Buffer.alloc(0);
124
+ decipher.setAAD(aad, { plaintextLength: cipher.length });
125
+ const pt = Buffer.concat([decipher.update(cipher), decipher.final()]);
126
+ return pt.toString('utf8');
127
+ }
128
+ /**
129
+ * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope.
130
+ *
131
+ * Runs the same `node:crypto` code on server and browser. The BitGoJS webpack
132
+ * config already maps `crypto` -> `crypto-browserify`, whose `aes-256-ccm` and
133
+ * `pbkdf2` implementations are byte-compatible with Node's native ones and
134
+ * with SJCL's envelope format. Parity is guarded by tests in
135
+ * `test/unit/decryptV1.browser.ts`.
136
+ */
137
+ async function decryptV1(password, ciphertext) {
138
+ return decryptV1WithCrypto(password, ciphertext, defaultCrypto);
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjcnlwdFYxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY3J5cHRWMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnREEsMENBUUM7QUF5QkQsa0RBd0JDO0FBV0QsOEJBRUM7QUF0SEQsOENBQTRFO0FBQzVFLG1DQUFrRDtBQUNsRCx5Q0FBMkI7QUFDM0IsK0JBQWlDO0FBWWpDLE1BQU0sYUFBYSxHQUFpQixFQUFFLE1BQU0sRUFBTixlQUFNLEVBQUUsZ0JBQWdCLEVBQWhCLHlCQUFnQixFQUFFLENBQUM7QUFFakU7Ozs7R0FJRztBQUNVLFFBQUEsV0FBVyxHQUFHLE1BQU8sQ0FBQztBQUVuQzs7OztHQUlHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxFQUFFLElBQUEscUJBQVUsRUFBQyxDQUFDLEVBQUUsbUJBQVcsRUFBRSxNQUFNLENBQUM7UUFDeEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FB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SUFDcEcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFekQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBQ2xFLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZTY0U3RyaW5nLCBib3VuZGVkSW50LCBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlRGVjaXBoZXJpdiwgcGJrZGYyIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5cbi8qKlxuICogTWluaW1hbCBzaGFwZSB0aGUgZGVjcnlwdCBwYXRoIG5lZWRzIGZyb20gYSBjcnlwdG8gbW9kdWxlLiBCb3RoIGBub2RlOmNyeXB0b2BcbiAqIGFuZCBgY3J5cHRvLWJyb3dzZXJpZnlgIHNhdGlzZnkgdGhpcy4gUGFzc2luZyB0aGlzIGluIGZyb20gdGVzdHMgbGV0cyB0aGVcbiAqIGJyb3dzZXItc2hpbSB0ZXN0IHN1aXRlIGV4ZXJjaXNlIHRoZSByZWFsIGRlY3J5cHQgY29kZSBpbnN0ZWFkIG9mIGEgY29weS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcnlwdG9Nb2R1bGUge1xuICBwYmtkZjI6IHR5cGVvZiBwYmtkZjI7XG4gIGNyZWF0ZURlY2lwaGVyaXY6IHR5cGVvZiBjcmVhdGVEZWNpcGhlcml2O1xufVxuXG5jb25zdCBkZWZhdWx0Q3J5cHRvOiBDcnlwdG9Nb2R1bGUgPSB7IHBia2RmMiwgY3JlYXRlRGVjaXBoZXJpdiB9O1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIFBCS0RGMiBpdGVyYXRpb25zIGFjY2VwdGVkIGZyb20gYSB2MSBlbnZlbG9wZS4gQml0R28tcHJvZHVjZWRcbiAqIHYxIGVudmVsb3BlcyB1c2UgMTAsMDAwOyB0aGlzIGNhcCBpcyAxMHggdGhhdC4gRW52ZWxvcGUgdmFsaWRhdGlvbiBlbmZvcmNlc1xuICogaXQgdXAgZnJvbnQgYmVmb3JlIGFueSBLREYgd29yayBydW5zLlxuICovXG5leHBvcnQgY29uc3QgVjFfTUFYX0lURVIgPSAxMDBfMDAwO1xuXG4vKipcbiAqIGlvLXRzIGNvZGVjIGZvciBhIHYxIChTSkNMKSBlbnZlbG9wZS5cbiAqXG4gKiBFbmZvcmNlcyB0aGUgc2hhcGUgYW5kIHRoZSBgaXRlcmAgY2FwIHVwIGZyb250LCBiZWZvcmUgYW55IEtERiB3b3JrIHJ1bnMuXG4gKi9cbmNvbnN0IFYxRW52ZWxvcGVDb2RlYyA9IHQuaW50ZXJzZWN0aW9uKFtcbiAgdC50eXBlKHtcbiAgICB2OiB0LmxpdGVyYWwoMSksXG4gICAgaXRlcjogYm91bmRlZEludCgxLCBWMV9NQVhfSVRFUiwgJ2l0ZXInKSxcbiAgICBrczogdC51bmlvbihbdC5saXRlcmFsKDEyOCksIHQubGl0ZXJhbCgyNTYpXSksXG4gICAgdHM6IHQudW5pb24oW3QubGl0ZXJhbCg2NCksIHQubGl0ZXJhbCg5NiksIHQubGl0ZXJhbCgxMjgpXSksXG4gICAgbW9kZTogdC5saXRlcmFsKCdjY20nKSxcbiAgICBjaXBoZXI6IHQubGl0ZXJhbCgnYWVzJyksXG4gICAgc2FsdDogYmFzZTY0U3RyaW5nLFxuICAgIGl2OiBiYXNlNjRTdHJpbmcsXG4gICAgY3Q6IGJhc2U2NFN0cmluZyxcbiAgfSksXG4gIHQucGFydGlhbCh7XG4gICAgYWRhdGE6IHQuc3RyaW5nLFxuICB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBWMUVudmVsb3BlID0gdC5UeXBlT2Y8dHlwZW9mIFYxRW52ZWxvcGVDb2RlYz47XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVYxRW52ZWxvcGUoY2lwaGVydGV4dDogc3RyaW5nKTogVjFFbnZlbG9wZSB7XG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2MSBkZWNyeXB0OiBpbnZhbGlkIEpTT04gZW52ZWxvcGUnKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFYxRW52ZWxvcGVDb2RlYywgcGFyc2VkLCAndjEgZGVjcnlwdDogaW52YWxpZCBlbnZlbG9wZScpO1xufVxuXG4vKipcbiAqIENDTSBsZW5ndGggZmllbGQgc2l6ZSBMLCBpbiBieXRlcywgY2hvc2VuIHRvIGVuY29kZSB0aGUgcGxhaW50ZXh0IGxlbmd0aC5cbiAqXG4gKiBTSkNMIHBpY2tzIHRoZSBzbWFsbGVzdCBMIGluIFsyLCA0KSB0aGF0IGNhbiByZXByZXNlbnQgdGhlIHBsYWludGV4dCBsZW5ndGgsXG4gKiB0aGVuIGRlcml2ZXMgdGhlIG5vbmNlIGxlbmd0aCBhcyAoMTUgLSBMKS4gV2UgbWlycm9yIHRoYXQgc28gTm9kZSdzIENDTVxuICogdXNlcyB0aGUgc2FtZSBub25jZSBmcmFtaW5nIGFzIHRoZSBTSkNMIGVuY29kZXIgcHJvZHVjZWQuXG4gKi9cbmZ1bmN0aW9uIGNjbU5vbmNlTGVuZ3RoKHBsYWludGV4dExlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IEwgPSAyO1xuICB3aGlsZSAoTCA8IDQgJiYgcGxhaW50ZXh0TGVuID49IE1hdGgucG93KDIsIDggKiBMKSkgTCsrO1xuICByZXR1cm4gMTUgLSBMO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSBwYXJzZWQgdjEgZW52ZWxvcGUgZ2l2ZW4gYSBjcnlwdG8gbW9kdWxlLlxuICpcbiAqIHYxID0gUEJLREYyLVNIQTI1NihwYXNzd29yZCwgc2FsdCwgaXRlciwga2V5TGVuKSB0aGVuIEFFUy1DQ00oa2V5LCBub25jZSwgY3R8fHRhZykuXG4gKiBCeXRlLWZvci1ieXRlIGNvbXBhdGlibGUgd2l0aCBgc2pjbC5kZWNyeXB0YCBvdXRwdXQgZm9yIHRoZSBzYW1lIGVudmVsb3BlLlxuICpcbiAqIEV4cG9ydGVkIHNvIHRlc3RzIGNhbiBpbmplY3QgYGNyeXB0by1icm93c2VyaWZ5YCBhbmQgZXhlcmNpc2UgdGhlIGV4YWN0XG4gKiBydW50aW1lIHBhdGggdGhlIHdlYnBhY2sgYnJvd3NlciBidW5kbGUgcHJvZHVjZXMsIHdpdGhvdXQgZHVwbGljYXRpbmcgdGhlXG4gKiBkZWNyeXB0IGxvZ2ljLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdFYxV2l0aENyeXB0byhwYXNzd29yZDogc3RyaW5nLCBjaXBoZXJ0ZXh0OiBzdHJpbmcsIGNyeXB0bzogQ3J5cHRvTW9kdWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZW52ID0gcGFyc2VWMUVudmVsb3BlKGNpcGhlcnRleHQpO1xuICBjb25zdCBzYWx0ID0gQnVmZmVyLmZyb20oZW52LnNhbHQsICdiYXNlNjQnKTtcbiAgY29uc3QgaXZGdWxsID0gQnVmZmVyLmZyb20oZW52Lml2LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IGZ1bGwgPSBCdWZmZXIuZnJvbShlbnYuY3QsICdiYXNlNjQnKTtcbiAgY29uc3QgdGFnQnl0ZXMgPSBlbnYudHMgLyA4O1xuICBpZiAoZnVsbC5sZW5ndGggPCB0YWdCeXRlcykgdGhyb3cgbmV3IEVycm9yKCd2MSBkZWNyeXB0OiBjaXBoZXJ0ZXh0IHNob3J0ZXIgdGhhbiB0YWcnKTtcblxuICBjb25zdCBjaXBoZXIgPSBmdWxsLnN1YmFycmF5KDAsIGZ1bGwubGVuZ3RoIC0gdGFnQnl0ZXMpO1xuICBjb25zdCBhdXRoVGFnID0gZnVsbC5zdWJhcnJheShmdWxsLmxlbmd0aCAtIHRhZ0J5dGVzKTtcbiAgY29uc3Qgbm9uY2VMZW4gPSBjY21Ob25jZUxlbmd0aChjaXBoZXIubGVuZ3RoKTtcbiAgaWYgKGl2RnVsbC5sZW5ndGggPCBub25jZUxlbikgdGhyb3cgbmV3IEVycm9yKCd2MSBkZWNyeXB0OiBpdiBzaG9ydGVyIHRoYW4gbm9uY2UnKTtcbiAgY29uc3QgaXYgPSBpdkZ1bGwuc3ViYXJyYXkoMCwgbm9uY2VMZW4pO1xuXG4gIGNvbnN0IGtleUJ5dGVzID0gZW52LmtzIC8gODtcbiAgY29uc3Qga2V5OiBCdWZmZXIgPSBhd2FpdCBwcm9taXNpZnkoY3J5cHRvLnBia2RmMikocGFzc3dvcmQsIHNhbHQsIGVudi5pdGVyLCBrZXlCeXRlcywgJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoYGFlcy0ke2Vudi5rc30tY2NtYCwga2V5LCBpdiwgeyBhdXRoVGFnTGVuZ3RoOiB0YWdCeXRlcyB9KTtcbiAgZGVjaXBoZXIuc2V0QXV0aFRhZyhhdXRoVGFnKTtcbiAgY29uc3QgYWFkID0gZW52LmFkYXRhID8gQnVmZmVyLmZyb20oZW52LmFkYXRhLCAndXRmOCcpIDogQnVmZmVyLmFsbG9jKDApO1xuICBkZWNpcGhlci5zZXRBQUQoYWFkLCB7IHBsYWludGV4dExlbmd0aDogY2lwaGVyLmxlbmd0aCB9KTtcblxuICBjb25zdCBwdCA9IEJ1ZmZlci5jb25jYXQoW2RlY2lwaGVyLnVwZGF0ZShjaXBoZXIpLCBkZWNpcGhlci5maW5hbCgpXSk7XG4gIHJldHVybiBwdC50b1N0cmluZygndXRmOCcpO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSB2MSAoU0pDTCBQQktERjItU0hBMjU2ICsgQUVTLUNDTSkgZW52ZWxvcGUuXG4gKlxuICogUnVucyB0aGUgc2FtZSBgbm9kZTpjcnlwdG9gIGNvZGUgb24gc2VydmVyIGFuZCBicm93c2VyLiBUaGUgQml0R29KUyB3ZWJwYWNrXG4gKiBjb25maWcgYWxyZWFkeSBtYXBzIGBjcnlwdG9gIC0+IGBjcnlwdG8tYnJvd3NlcmlmeWAsIHdob3NlIGBhZXMtMjU2LWNjbWAgYW5kXG4gKiBgcGJrZGYyYCBpbXBsZW1lbnRhdGlvbnMgYXJlIGJ5dGUtY29tcGF0aWJsZSB3aXRoIE5vZGUncyBuYXRpdmUgb25lcyBhbmRcbiAqIHdpdGggU0pDTCdzIGVudmVsb3BlIGZvcm1hdC4gUGFyaXR5IGlzIGd1YXJkZWQgYnkgdGVzdHMgaW5cbiAqIGB0ZXN0L3VuaXQvZGVjcnlwdFYxLmJyb3dzZXIudHNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdFYxKHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBkZWNyeXB0VjFXaXRoQ3J5cHRvKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0LCBkZWZhdWx0Q3J5cHRvKTtcbn1cbiJdfQ==
@@ -18,7 +18,26 @@ export declare function encrypt(password: string, plaintext: string, options?: {
18
18
  encryptionVersion?: 1 | 2;
19
19
  }): Promise<string>;
20
20
  /**
21
- * Auto-detect v1 (SJCL) or v2 (Argon2id + AES-256-GCM) from the envelope `v` field and decrypt.
21
+ * v1 decrypt with an SJCL safety net.
22
+ *
23
+ * Design intent during rollout: zero false negatives. Any native failure
24
+ * (envelope shape our stricter codec rejects, framing bug, unsupported
25
+ * algorithm, auth-tag mismatch, etc.) falls through to `sjcl.decrypt` so the
26
+ * caller is never blocked. The only exception is an iter-cap violation,
27
+ * which is rethrown to preserve DoS protection.
28
+ *
29
+ * The console.warn only fires when native fails AND SJCL succeeds -- i.e.
30
+ * when the two engines disagree, which is the only signal worth
31
+ * investigating. Wrong password fails both engines silently and surfaces
32
+ * SJCL's auth error (mapped upstream to "incorrect password").
33
+ *
34
+ * `native` defaults to the module's `decryptV1` but is exposed as a parameter
35
+ * so tests can inject a throwing version to exercise the fallback path.
36
+ */
37
+ export declare function decryptV1WithFallback(password: string, ciphertext: string, native?: (pw: string, ct: string) => Promise<string>): Promise<string>;
38
+ /**
39
+ * Auto-detect v1 (PBKDF2-SHA256 + AES-CCM) or v2 (Argon2id + AES-256-GCM)
40
+ * from the envelope `v` field and decrypt.
22
41
  */
23
42
  export declare function decrypt(password: string, ciphertext: string): Promise<string>;
24
43
  //# sourceMappingURL=encrypt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAKjE;AAiCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAKjB;AAUD;;GAEG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF"}
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAKjE;AAiCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAKjB;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAa,GAC9D,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF"}
@@ -35,9 +35,11 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.bytesToWord = bytesToWord;
37
37
  exports.encrypt = encrypt;
38
+ exports.decryptV1WithFallback = decryptV1WithFallback;
38
39
  exports.decrypt = decrypt;
39
40
  const sjcl = __importStar(require("@bitgo/sjcl"));
40
41
  const crypto_1 = require("crypto");
42
+ const decryptV1_1 = require("./decryptV1");
41
43
  const encryptV2_1 = require("./encryptV2");
42
44
  /**
43
45
  * convert a 4 element Uint8Array to a 4 byte Number
@@ -92,14 +94,58 @@ async function encrypt(password, plaintext, options) {
92
94
  return (0, encryptV2_1.encryptV2)(password, plaintext, { adata: options?.adata });
93
95
  }
94
96
  /**
95
- * Internal v1 (SJCL) decrypt helper. Not part of the public surface: callers use
96
- * the auto-detecting `decrypt` instead.
97
+ * Iter-cap violations are the only error we refuse to fall back on: SJCL has
98
+ * no upper bound on `iter`, so falling through to it would let a hostile
99
+ * envelope burn CPU running an inflated PBKDF2. Everything else -- codec
100
+ * rejection of a shape SJCL would accept, native crypto bug, auth-tag
101
+ * mismatch -- is safe to fall through to SJCL.
97
102
  */
98
- function decryptV1(password, ciphertext) {
99
- return sjcl.decrypt(password, ciphertext);
103
+ function isIterCapViolation(err) {
104
+ return err instanceof Error && /iter:\s*expected integer|iter out of range/i.test(err.message);
100
105
  }
101
106
  /**
102
- * Auto-detect v1 (SJCL) or v2 (Argon2id + AES-256-GCM) from the envelope `v` field and decrypt.
107
+ * v1 decrypt with an SJCL safety net.
108
+ *
109
+ * Design intent during rollout: zero false negatives. Any native failure
110
+ * (envelope shape our stricter codec rejects, framing bug, unsupported
111
+ * algorithm, auth-tag mismatch, etc.) falls through to `sjcl.decrypt` so the
112
+ * caller is never blocked. The only exception is an iter-cap violation,
113
+ * which is rethrown to preserve DoS protection.
114
+ *
115
+ * The console.warn only fires when native fails AND SJCL succeeds -- i.e.
116
+ * when the two engines disagree, which is the only signal worth
117
+ * investigating. Wrong password fails both engines silently and surfaces
118
+ * SJCL's auth error (mapped upstream to "incorrect password").
119
+ *
120
+ * `native` defaults to the module's `decryptV1` but is exposed as a parameter
121
+ * so tests can inject a throwing version to exercise the fallback path.
122
+ */
123
+ async function decryptV1WithFallback(password, ciphertext, native = decryptV1_1.decryptV1) {
124
+ try {
125
+ return await native(password, ciphertext);
126
+ }
127
+ catch (nativeErr) {
128
+ if (isIterCapViolation(nativeErr))
129
+ throw nativeErr;
130
+ let result;
131
+ try {
132
+ result = sjcl.decrypt(password, ciphertext);
133
+ }
134
+ catch (sjclErr) {
135
+ // Both engines rejected -- almost certainly a real auth failure.
136
+ // Rethrow SJCL's error so BitGoAPI.decrypt maps it to "incorrect password".
137
+ throw sjclErr;
138
+ }
139
+ // Native failed but SJCL succeeded -- real signal, log for the operator.
140
+ const message = nativeErr instanceof Error ? nativeErr.message : String(nativeErr);
141
+ // eslint-disable-next-line no-console
142
+ console.warn('[bitgo-sdk] v1 native decrypt failed; SJCL fallback succeeded:', message);
143
+ return result;
144
+ }
145
+ }
146
+ /**
147
+ * Auto-detect v1 (PBKDF2-SHA256 + AES-CCM) or v2 (Argon2id + AES-256-GCM)
148
+ * from the envelope `v` field and decrypt.
103
149
  */
104
150
  async function decrypt(password, ciphertext) {
105
151
  let envelopeVersion;
@@ -117,6 +163,6 @@ async function decrypt(password, ciphertext) {
117
163
  if (envelopeVersion !== undefined && envelopeVersion !== 1) {
118
164
  throw new Error(`decrypt: unknown envelope version ${envelopeVersion}`);
119
165
  }
120
- return decryptV1(password, ciphertext);
166
+ return decryptV1WithFallback(password, ciphertext);
121
167
  }
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0Esa0NBS0M7QUF1Q0QsMEJBU0M7QUFhRCwwQkFnQkM7QUE3RkQsa0RBQW9DO0FBQ3BDLG1DQUFxQztBQUVyQywyQ0FBbUQ7QUFFbkQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixXQUFXLENBQUMsS0FBNkI7SUFDdkQsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FDaEIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsT0FBd0Q7SUFFeEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFBLG9CQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDL0QsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFBLG9CQUFXLEVBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFN0QsTUFBTSxjQUFjLEdBQStFO1FBQ2pHLElBQUksRUFBRSxLQUFLO1FBQ1gsRUFBRSxFQUFFLEdBQUc7UUFDUCxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEVBQUUsRUFBRTtZQUNGLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM5QjtLQUNGLENBQUM7SUFDRixJQUFJLE9BQU8sRUFBRSxLQUFLO1FBQUUsY0FBYyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3pELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQzNCLFFBQWdCLEVBQ2hCLFNBQWlCLEVBQ2pCLE9BQW1GO0lBRW5GLElBQUksT0FBTyxFQUFFLGlCQUFpQixLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE9BQU8sSUFBQSxxQkFBUyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsU0FBUyxDQUFDLFFBQWdCLEVBQUUsVUFBa0I7SUFDckQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsT0FBTyxDQUFDLFFBQWdCLEVBQUUsVUFBa0I7SUFDaEUsSUFBSSxlQUFtQyxDQUFDO0lBQ3hDLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsSUFBSSxlQUFlLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsMkVBQTJFO1FBQzNFLE9BQU8sSUFBQSxxQkFBUyxFQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxlQUFlLEtBQUssU0FBUyxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvL3NqY2wnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0VjIsIGVuY3J5cHRWMiB9IGZyb20gJy4vZW5jcnlwdFYyJztcblxuLyoqXG4gKiBjb252ZXJ0IGEgNCBlbGVtZW50IFVpbnQ4QXJyYXkgdG8gYSA0IGJ5dGUgTnVtYmVyXG4gKlxuICogQHBhcmFtIGJ5dGVzXG4gKiBAcmV0dXJuIDQgYnl0ZSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9Xb3JkKGJ5dGVzPzogVWludDhBcnJheSB8IG51bWJlcltdKTogbnVtYmVyIHtcbiAgaWYgKCEoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBieXRlcy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J5dGVzIG11c3QgYmUgYSBVaW50OEFycmF5IHdpdGggbGVuZ3RoIDQnKTtcbiAgfVxuICByZXR1cm4gYnl0ZXMucmVkdWNlKChudW0sIGJ5dGUpID0+IG51bSAqIDB4MTAwICsgYnl0ZSwgMCk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgdjEgKFNKQ0wgUEJLREYyLVNIQTI1NiArIEFFUy0yNTYtQ0NNKSBlbmNyeXB0IGhlbHBlci5cbiAqXG4gKiBOb3QgZXhwb3J0ZWQgYXMgcGFydCBvZiB0aGUgcHVibGljIGVuY3J5cHQvZGVjcnlwdCBzdXJmYWNlOiBjYWxsZXJzIG11c3Qgbm90IHVzZVxuICogdGhpcyBkaXJlY3RseS4gdjEgb3V0cHV0IGlzIHJlcXVlc3RlZCB2aWEgYGVuY3J5cHQoLi4uLCB7IGVuY3J5cHRpb25WZXJzaW9uOiAxIH0pYC5cbiAqL1xuZnVuY3Rpb24gZW5jcnlwdFYxKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nIH1cbik6IHN0cmluZyB7XG4gIGNvbnN0IHNhbHQgPSBvcHRpb25zPy5zYWx0IHx8IHJhbmRvbUJ5dGVzKDgpO1xuICBpZiAoc2FsdC5sZW5ndGggIT09IDgpIHRocm93IG5ldyBFcnJvcignc2FsdCBtdXN0IGJlIDggYnl0ZXMnKTtcbiAgY29uc3QgaXYgPSBvcHRpb25zPy5pdiB8fCByYW5kb21CeXRlcygxNik7XG4gIGlmIChpdi5sZW5ndGggIT09IDE2KSB0aHJvdyBuZXcgRXJyb3IoJ2l2IG11c3QgYmUgMTYgYnl0ZXMnKTtcblxuICBjb25zdCBlbmNyeXB0T3B0aW9uczogeyBpdGVyOiBudW1iZXI7IGtzOiBudW1iZXI7IHNhbHQ6IG51bWJlcltdOyBpdjogbnVtYmVyW107IGFkYXRhPzogc3RyaW5nIH0gPSB7XG4gICAgaXRlcjogMTAwMDAsXG4gICAga3M6IDI1NixcbiAgICBzYWx0OiBbYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSgwLCA0KSksIGJ5dGVzVG9Xb3JkKHNhbHQuc2xpY2UoNCkpXSxcbiAgICBpdjogW1xuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMCwgNCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoNCwgOCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoOCwgMTIpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDEyLCAxNikpLFxuICAgIF0sXG4gIH07XG4gIGlmIChvcHRpb25zPy5hZGF0YSkgZW5jcnlwdE9wdGlvbnMuYWRhdGEgPSBvcHRpb25zLmFkYXRhO1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIGVuY3J5cHRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGBwbGFpbnRleHRgIHdpdGggYHBhc3N3b3JkYC4gRGVmYXVsdHMgdG8gdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pLlxuICpcbiAqIFBhc3MgYGVuY3J5cHRpb25WZXJzaW9uOiAxYCB0byBwcm9kdWNlIGEgbGVnYWN5IHYxIChTSkNMKSBlbnZlbG9wZTsgdGhpcyBpcyB0aGVcbiAqIG9ubHkgc3VwcG9ydGVkIHdheSB0byByZXF1ZXN0IHYxIGVuY3J5cHRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nOyBlbmNyeXB0aW9uVmVyc2lvbj86IDEgfCAyIH1cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMSkge1xuICAgIHJldHVybiBlbmNyeXB0VjEocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhOiBvcHRpb25zPy5hZGF0YSB9KTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCB2MSAoU0pDTCkgZGVjcnlwdCBoZWxwZXIuIE5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgc3VyZmFjZTogY2FsbGVycyB1c2VcbiAqIHRoZSBhdXRvLWRldGVjdGluZyBgZGVjcnlwdGAgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gZGVjcnlwdFYxKHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzamNsLmRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xufVxuXG4vKipcbiAqIEF1dG8tZGV0ZWN0IHYxIChTSkNMKSBvciB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSkgZnJvbSB0aGUgZW52ZWxvcGUgYHZgIGZpZWxkIGFuZCBkZWNyeXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChwYXNzd29yZDogc3RyaW5nLCBjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgZW52ZWxvcGVWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZW52ZWxvcGUgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICAgIGVudmVsb3BlVmVyc2lvbiA9IGVudmVsb3BlLnY7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignZGVjcnlwdDogY2lwaGVydGV4dCBpcyBub3QgdmFsaWQgSlNPTicpO1xuICB9XG4gIGlmIChlbnZlbG9wZVZlcnNpb24gPT09IDIpIHtcbiAgICAvLyBEbyBub3QgY2F0Y2g6IHdyb25nIHBhc3N3b3JkIG9uIHYyIG11c3Qgbm90IHNpbGVudGx5IGZhbGwgdGhyb3VnaCB0byB2MS5cbiAgICByZXR1cm4gZGVjcnlwdFYyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuICBpZiAoZW52ZWxvcGVWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgZW52ZWxvcGVWZXJzaW9uICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZWNyeXB0OiB1bmtub3duIGVudmVsb3BlIHZlcnNpb24gJHtlbnZlbG9wZVZlcnNpb259YCk7XG4gIH1cbiAgcmV0dXJuIGRlY3J5cHRWMShwYXNzd29yZCwgY2lwaGVydGV4dCk7XG59XG4iXX0=
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsa0NBS0M7QUF1Q0QsMEJBU0M7QUE4QkQsc0RBdUJDO0FBTUQsMEJBZ0JDO0FBNUlELGtEQUFvQztBQUNwQyxtQ0FBcUM7QUFFckMsMkNBQXdDO0FBQ3hDLDJDQUFtRDtBQUVuRDs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUE2QjtJQUN2RCxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsU0FBUyxDQUNoQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixPQUF3RDtJQUV4RCxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvRCxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUEsb0JBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUMxQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMs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TSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQiwyRUFBMkU7UUFDM0UsT0FBTyxJQUFBLHFCQUFTLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby9zamNsJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgZGVjcnlwdFYxIH0gZnJvbSAnLi9kZWNyeXB0VjEnO1xuaW1wb3J0IHsgZGVjcnlwdFYyLCBlbmNyeXB0VjIgfSBmcm9tICcuL2VuY3J5cHRWMic7XG5cbi8qKlxuICogY29udmVydCBhIDQgZWxlbWVudCBVaW50OEFycmF5IHRvIGEgNCBieXRlIE51bWJlclxuICpcbiAqIEBwYXJhbSBieXRlc1xuICogQHJldHVybiA0IGJ5dGUgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvV29yZChieXRlcz86IFVpbnQ4QXJyYXkgfCBudW1iZXJbXSk6IG51bWJlciB7XG4gIGlmICghKGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgYnl0ZXMubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdieXRlcyBtdXN0IGJlIGEgVWludDhBcnJheSB3aXRoIGxlbmd0aCA0Jyk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzLnJlZHVjZSgobnVtLCBieXRlKSA9PiBudW0gKiAweDEwMCArIGJ5dGUsIDApO1xufVxuXG4vKipcbiAqIEludGVybmFsIHYxIChTSkNMIFBCS0RGMi1TSEEyNTYgKyBBRVMtMjU2LUNDTSkgZW5jcnlwdCBoZWxwZXIuXG4gKlxuICogTm90IGV4cG9ydGVkIGFzIHBhcnQgb2YgdGhlIHB1YmxpYyBlbmNyeXB0L2RlY3J5cHQgc3VyZmFjZTogY2FsbGVycyBtdXN0IG5vdCB1c2VcbiAqIHRoaXMgZGlyZWN0bHkuIHYxIG91dHB1dCBpcyByZXF1ZXN0ZWQgdmlhIGBlbmNyeXB0KC4uLiwgeyBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KWAuXG4gKi9cbmZ1bmN0aW9uIGVuY3J5cHRWMShcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcGxhaW50ZXh0OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHNhbHQ/OiBCdWZmZXI7IGl2PzogQnVmZmVyOyBhZGF0YT86IHN0cmluZyB9XG4pOiBzdHJpbmcge1xuICBjb25zdCBzYWx0ID0gb3B0aW9ucz8uc2FsdCB8fCByYW5kb21CeXRlcyg4KTtcbiAgaWYgKHNhbHQubGVuZ3RoICE9PSA4KSB0aHJvdyBuZXcgRXJyb3IoJ3NhbHQgbXVzdCBiZSA4IGJ5dGVzJyk7XG4gIGNvbnN0IGl2ID0gb3B0aW9ucz8uaXYgfHwgcmFuZG9tQnl0ZXMoMTYpO1xuICBpZiAoaXYubGVuZ3RoICE9PSAxNikgdGhyb3cgbmV3IEVycm9yKCdpdiBtdXN0IGJlIDE2IGJ5dGVzJyk7XG5cbiAgY29uc3QgZW5jcnlwdE9wdGlvbnM6IHsgaXRlcjogbnVtYmVyOyBrczogbnVtYmVyOyBzYWx0OiBudW1iZXJbXTsgaXY6IG51bWJlcltdOyBhZGF0YT86IHN0cmluZyB9ID0ge1xuICAgIGl0ZXI6IDEwMDAwLFxuICAgIGtzOiAyNTYsXG4gICAgc2FsdDogW2J5dGVzVG9Xb3JkKHNhbHQuc2xpY2UoMCwgNCkpLCBieXRlc1RvV29yZChzYWx0LnNsaWNlKDQpKV0sXG4gICAgaXY6IFtcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDAsIDQpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDQsIDgpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDgsIDEyKSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSgxMiwgMTYpKSxcbiAgICBdLFxuICB9O1xuICBpZiAob3B0aW9ucz8uYWRhdGEpIGVuY3J5cHRPcHRpb25zLmFkYXRhID0gb3B0aW9ucy5hZGF0YTtcbiAgcmV0dXJuIHNqY2wuZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCBlbmNyeXB0T3B0aW9ucyk7XG59XG5cbi8qKlxuICogRW5jcnlwdCBgcGxhaW50ZXh0YCB3aXRoIGBwYXNzd29yZGAuIERlZmF1bHRzIHRvIHYyIChBcmdvbjJpZCArIEFFUy0yNTYtR0NNKS5cbiAqXG4gKiBQYXNzIGBlbmNyeXB0aW9uVmVyc2lvbjogMWAgdG8gcHJvZHVjZSBhIGxlZ2FjeSB2MSAoU0pDTCkgZW52ZWxvcGU7IHRoaXMgaXMgdGhlXG4gKiBvbmx5IHN1cHBvcnRlZCB3YXkgdG8gcmVxdWVzdCB2MSBlbmNyeXB0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcGxhaW50ZXh0OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHNhbHQ/OiBCdWZmZXI7IGl2PzogQnVmZmVyOyBhZGF0YT86IHN0cmluZzsgZW5jcnlwdGlvblZlcnNpb24/OiAxIHwgMiB9XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvblZlcnNpb24gPT09IDEpIHtcbiAgICByZXR1cm4gZW5jcnlwdFYxKHBhc3N3b3JkLCBwbGFpbnRleHQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBhZGF0YTogb3B0aW9ucz8uYWRhdGEgfSk7XG59XG5cbi8qKlxuICogSXRlci1jYXAgdmlvbGF0aW9ucyBhcmUgdGhlIG9ubHkgZXJyb3Igd2UgcmVmdXNlIHRvIGZhbGwgYmFjayBvbjogU0pDTCBoYXNcbiAqIG5vIHVwcGVyIGJvdW5kIG9uIGBpdGVyYCwgc28gZmFsbGluZyB0aHJvdWdoIHRvIGl0IHdvdWxkIGxldCBhIGhvc3RpbGVcbiAqIGVudmVsb3BlIGJ1cm4gQ1BVIHJ1bm5pbmcgYW4gaW5mbGF0ZWQgUEJLREYyLiBFdmVyeXRoaW5nIGVsc2UgLS0gY29kZWNcbiAqIHJlamVjdGlvbiBvZiBhIHNoYXBlIFNKQ0wgd291bGQgYWNjZXB0LCBuYXRpdmUgY3J5cHRvIGJ1ZywgYXV0aC10YWdcbiAqIG1pc21hdGNoIC0tIGlzIHNhZmUgdG8gZmFsbCB0aHJvdWdoIHRvIFNKQ0wuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlckNhcFZpb2xhdGlvbihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIEVycm9yICYmIC9pdGVyOlxccypleHBlY3RlZCBpbnRlZ2VyfGl0ZXIgb3V0IG9mIHJhbmdlL2kudGVzdChlcnIubWVzc2FnZSk7XG59XG5cbi8qKlxuICogdjEgZGVjcnlwdCB3aXRoIGFuIFNKQ0wgc2FmZXR5IG5ldC5cbiAqXG4gKiBEZXNpZ24gaW50ZW50IGR1cmluZyByb2xsb3V0OiB6ZXJvIGZhbHNlIG5lZ2F0aXZlcy4gQW55IG5hdGl2ZSBmYWlsdXJlXG4gKiAoZW52ZWxvcGUgc2hhcGUgb3VyIHN0cmljdGVyIGNvZGVjIHJlamVjdHMsIGZyYW1pbmcgYnVnLCB1bnN1cHBvcnRlZFxuICogYWxnb3JpdGhtLCBhdXRoLXRhZyBtaXNtYXRjaCwgZXRjLikgZmFsbHMgdGhyb3VnaCB0byBgc2pjbC5kZWNyeXB0YCBzbyB0aGVcbiAqIGNhbGxlciBpcyBuZXZlciBibG9ja2VkLiBUaGUgb25seSBleGNlcHRpb24gaXMgYW4gaXRlci1jYXAgdmlvbGF0aW9uLFxuICogd2hpY2ggaXMgcmV0aHJvd24gdG8gcHJlc2VydmUgRG9TIHByb3RlY3Rpb24uXG4gKlxuICogVGhlIGNvbnNvbGUud2FybiBvbmx5IGZpcmVzIHdoZW4gbmF0aXZlIGZhaWxzIEFORCBTSkNMIHN1Y2NlZWRzIC0tIGkuZS5cbiAqIHdoZW4gdGhlIHR3byBlbmdpbmVzIGRpc2FncmVlLCB3aGljaCBpcyB0aGUgb25seSBzaWduYWwgd29ydGhcbiAqIGludmVzdGlnYXRpbmcuIFdyb25nIHBhc3N3b3JkIGZhaWxzIGJvdGggZW5naW5lcyBzaWxlbnRseSBhbmQgc3VyZmFjZXNcbiAqIFNKQ0wncyBhdXRoIGVycm9yIChtYXBwZWQgdXBzdHJlYW0gdG8gXCJpbmNvcnJlY3QgcGFzc3dvcmRcIikuXG4gKlxuICogYG5hdGl2ZWAgZGVmYXVsdHMgdG8gdGhlIG1vZHVsZSdzIGBkZWNyeXB0VjFgIGJ1dCBpcyBleHBvc2VkIGFzIGEgcGFyYW1ldGVyXG4gKiBzbyB0ZXN0cyBjYW4gaW5qZWN0IGEgdGhyb3dpbmcgdmVyc2lvbiB0byBleGVyY2lzZSB0aGUgZmFsbGJhY2sgcGF0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRWMVdpdGhGYWxsYmFjayhcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgY2lwaGVydGV4dDogc3RyaW5nLFxuICBuYXRpdmU6IChwdzogc3RyaW5nLCBjdDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4gPSBkZWNyeXB0VjFcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG5hdGl2ZShwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gIH0gY2F0Y2ggKG5hdGl2ZUVycikge1xuICAgIGlmIChpc0l0ZXJDYXBWaW9sYXRpb24obmF0aXZlRXJyKSkgdGhyb3cgbmF0aXZlRXJyO1xuICAgIGxldCByZXN1bHQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgICB9IGNhdGNoIChzamNsRXJyKSB7XG4gICAgICAvLyBCb3RoIGVuZ2luZXMgcmVqZWN0ZWQgLS0gYWxtb3N0IGNlcnRhaW5seSBhIHJlYWwgYXV0aCBmYWlsdXJlLlxuICAgICAgLy8gUmV0aHJvdyBTSkNMJ3MgZXJyb3Igc28gQml0R29BUEkuZGVjcnlwdCBtYXBzIGl0IHRvIFwiaW5jb3JyZWN0IHBhc3N3b3JkXCIuXG4gICAgICB0aHJvdyBzamNsRXJyO1xuICAgIH1cbiAgICAvLyBOYXRpdmUgZmFpbGVkIGJ1dCBTSkNMIHN1Y2NlZWRlZCAtLSByZWFsIHNpZ25hbCwgbG9nIGZvciB0aGUgb3BlcmF0b3IuXG4gICAgY29uc3QgbWVzc2FnZSA9IG5hdGl2ZUVyciBpbnN0YW5jZW9mIEVycm9yID8gbmF0aXZlRXJyLm1lc3NhZ2UgOiBTdHJpbmcobmF0aXZlRXJyKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybignW2JpdGdvLXNka10gdjEgbmF0aXZlIGRlY3J5cHQgZmFpbGVkOyBTSkNMIGZhbGxiYWNrIHN1Y2NlZWRlZDonLCBtZXNzYWdlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQXV0by1kZXRlY3QgdjEgKFBCS0RGMi1TSEEyNTYgKyBBRVMtQ0NNKSBvciB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSlcbiAqIGZyb20gdGhlIGVudmVsb3BlIGB2YCBmaWVsZCBhbmQgZGVjcnlwdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHQocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IGVudmVsb3BlVmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICBlbnZlbG9wZVZlcnNpb24gPSBlbnZlbG9wZS52O1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHQ6IGNpcGhlcnRleHQgaXMgbm90IHZhbGlkIEpTT04nKTtcbiAgfVxuICBpZiAoZW52ZWxvcGVWZXJzaW9uID09PSAyKSB7XG4gICAgLy8gRG8gbm90IGNhdGNoOiB3cm9uZyBwYXNzd29yZCBvbiB2MiBtdXN0IG5vdCBzaWxlbnRseSBmYWxsIHRocm91Z2ggdG8gdjEuXG4gICAgcmV0dXJuIGRlY3J5cHRWMihwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gIH1cbiAgaWYgKGVudmVsb3BlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGVudmVsb3BlVmVyc2lvbiAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjcnlwdDogdW5rbm93biBlbnZlbG9wZSB2ZXJzaW9uICR7ZW52ZWxvcGVWZXJzaW9ufWApO1xuICB9XG4gIHJldHVybiBkZWNyeXB0VjFXaXRoRmFsbGJhY2socGFzc3dvcmQsIGNpcGhlcnRleHQpO1xufVxuIl19
@@ -1,5 +1,6 @@
1
1
  export * from './api';
2
2
  export * from './bitgoAPI';
3
+ export * from './decryptV1';
3
4
  export * from './encrypt';
4
5
  export * from './encryptionSession';
5
6
  export * from './encryptV2';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
package/dist/src/index.js CHANGED
@@ -16,9 +16,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./api"), exports);
18
18
  __exportStar(require("./bitgoAPI"), exports);
19
+ __exportStar(require("./decryptV1"), exports);
19
20
  __exportStar(require("./encrypt"), exports);
20
21
  __exportStar(require("./encryptionSession"), exports);
21
22
  __exportStar(require("./encryptV2"), exports);
22
23
  __exportStar(require("./util"), exports);
23
24
  __exportStar(require("./types"), exports);
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0Qiw2Q0FBMkI7QUFDM0IsNENBQTBCO0FBQzFCLHNEQUFvQztBQUNwQyw4Q0FBNEI7QUFDNUIseUNBQXVCO0FBQ3ZCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vYml0Z29BUEknO1xuZXhwb3J0ICogZnJvbSAnLi9lbmNyeXB0JztcbmV4cG9ydCAqIGZyb20gJy4vZW5jcnlwdGlvblNlc3Npb24nO1xuZXhwb3J0ICogZnJvbSAnLi9lbmNyeXB0VjInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIl19
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0Qiw2Q0FBMkI7QUFDM0IsOENBQTRCO0FBQzVCLDRDQUEwQjtBQUMxQixzREFBb0M7QUFDcEMsOENBQTRCO0FBQzVCLHlDQUF1QjtBQUN2QiwwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FwaSc7XG5leHBvcnQgKiBmcm9tICcuL2JpdGdvQVBJJztcbmV4cG9ydCAqIGZyb20gJy4vZGVjcnlwdFYxJztcbmV4cG9ydCAqIGZyb20gJy4vZW5jcnlwdCc7XG5leHBvcnQgKiBmcm9tICcuL2VuY3J5cHRpb25TZXNzaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vZW5jcnlwdFYyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=decryptV1.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decryptV1.browser.d.ts","sourceRoot":"","sources":["../../../test/unit/decryptV1.browser.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const sjcl = __importStar(require("@bitgo/sjcl"));
40
+ const assert_1 = __importDefault(require("assert"));
41
+ const src_1 = require("../../src");
42
+ const keycard_1 = require("./fixtures/keycard");
43
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
44
+ const browserCrypto = require('crypto-browserify');
45
+ /**
46
+ * sjcl.encrypt's typings require salt/iv, but the runtime picks them from
47
+ * sjcl.random when omitted. Feed real random words so the call type-checks
48
+ * without an `as` cast.
49
+ */
50
+ function sjclEncrypt(password, plaintext, params) {
51
+ const salt = sjcl.random.randomWords(2);
52
+ const iv = sjcl.random.randomWords(4);
53
+ return sjcl.encrypt(password, plaintext, { ...params, salt, iv });
54
+ }
55
+ /**
56
+ * Exercises the real `decryptV1WithCrypto` code path with `crypto-browserify`
57
+ * injected as the crypto module. This is exactly what webpack bundles for the
58
+ * browser (its `crypto` shim), so a green test here proves the browser build
59
+ * stays byte-compatible with SJCL-produced envelopes and the Node path.
60
+ */
61
+ function decryptV1Browser(password, ciphertext) {
62
+ return (0, src_1.decryptV1WithCrypto)(password, ciphertext, browserCrypto);
63
+ }
64
+ describe('decryptV1 browser path (crypto-browserify shim)', () => {
65
+ const password = 'myPassword';
66
+ const plaintext = 'Hello, Browser!';
67
+ it('produces the same plaintext as sjcl.decrypt', async () => {
68
+ const ciphertext = sjclEncrypt(password, plaintext, { iter: 10000, ks: 256, ts: 64, mode: 'ccm' });
69
+ assert_1.default.strictEqual(await decryptV1Browser(password, ciphertext), sjcl.decrypt(password, ciphertext));
70
+ });
71
+ it('handles adata (AAD)', async () => {
72
+ const ciphertext = sjclEncrypt(password, plaintext, {
73
+ iter: 10000,
74
+ ks: 256,
75
+ ts: 64,
76
+ mode: 'ccm',
77
+ adata: 'ctx-A',
78
+ });
79
+ assert_1.default.strictEqual(await decryptV1Browser(password, ciphertext), plaintext);
80
+ });
81
+ it('handles UTF-8 password + plaintext', async () => {
82
+ const utf8Password = 'pässwörd中文🔐';
83
+ const utf8Plaintext = 'passphrase: 秘密キー ☃🔑';
84
+ const ciphertext = sjclEncrypt(utf8Password, utf8Plaintext, { iter: 10000, ks: 256, ts: 64, mode: 'ccm' });
85
+ assert_1.default.strictEqual(await decryptV1Browser(utf8Password, ciphertext), utf8Plaintext);
86
+ });
87
+ it('handles large plaintext (>64 KiB, forces L=3 nonce framing)', async () => {
88
+ const large = 'x'.repeat(70000);
89
+ const ciphertext = sjclEncrypt(password, large, { iter: 1000, ks: 256, ts: 64, mode: 'ccm' });
90
+ assert_1.default.strictEqual(await decryptV1Browser(password, ciphertext), large);
91
+ });
92
+ it('handles aes-128 envelopes', async () => {
93
+ const ciphertext = sjclEncrypt(password, plaintext, { iter: 10000, ks: 128, ts: 64, mode: 'ccm' });
94
+ assert_1.default.strictEqual(await decryptV1Browser(password, ciphertext), plaintext);
95
+ });
96
+ it('handles 128-bit tag envelopes', async () => {
97
+ const ciphertext = sjclEncrypt(password, plaintext, { iter: 10000, ks: 256, ts: 128, mode: 'ccm' });
98
+ assert_1.default.strictEqual(await decryptV1Browser(password, ciphertext), plaintext);
99
+ });
100
+ it('rejects wrong password', async () => {
101
+ const ciphertext = sjclEncrypt(password, plaintext, { iter: 10000, ks: 256, ts: 64, mode: 'ccm' });
102
+ await assert_1.default.rejects(() => decryptV1Browser('wrongPassword', ciphertext));
103
+ });
104
+ it('rejects envelope with iter above cap before running PBKDF2', async () => {
105
+ const ciphertext = sjclEncrypt(password, plaintext, { iter: 10000, ks: 256, ts: 64, mode: 'ccm' });
106
+ const envelope = JSON.parse(ciphertext);
107
+ envelope.iter = src_1.V1_MAX_ITER + 1;
108
+ const start = Date.now();
109
+ await assert_1.default.rejects(() => decryptV1Browser(password, JSON.stringify(envelope)), /iter/);
110
+ assert_1.default.ok(Date.now() - start < 100, 'must reject before any KDF work');
111
+ });
112
+ it('parity across 50 randomised inputs', async () => {
113
+ const { randomBytes } = await Promise.resolve().then(() => __importStar(require('crypto')));
114
+ for (let i = 0; i < 50; i++) {
115
+ const pw = randomBytes(16).toString('hex');
116
+ const pt = randomBytes(1 + Math.floor(Math.random() * 500)).toString('base64');
117
+ const ciphertext = sjclEncrypt(pw, pt, { iter: 1000, ks: 256, ts: 64, mode: 'ccm' });
118
+ assert_1.default.strictEqual(await decryptV1Browser(pw, ciphertext), pt, `iteration ${i}`);
119
+ }
120
+ });
121
+ it('Box A + Box B: shim decrypt matches SJCL byte-for-byte', async () => {
122
+ for (const [label, ct] of [
123
+ ['A', keycard_1.KEYCARD_BOX_A],
124
+ ['B', keycard_1.KEYCARD_BOX_B],
125
+ ]) {
126
+ const sjclResult = sjcl.decrypt(keycard_1.KEYCARD_PASSWORD, ct);
127
+ const shimResult = await decryptV1Browser(keycard_1.KEYCARD_PASSWORD, ct);
128
+ assert_1.default.strictEqual(shimResult, sjclResult, `Box ${label} mismatch`);
129
+ assert_1.default.ok(shimResult.startsWith(keycard_1.KEYCARD_PLAINTEXT_PREFIX));
130
+ }
131
+ });
132
+ });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjcnlwdFYxLmJyb3dzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvZGVjcnlwdFYxLmJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBb0M7QUFDcEMsb0RBQTRCO0FBRTVCLG1DQUE2RDtBQUM3RCxnREFBOEc7QUFDOUcsOERBQThEO0FBQzlELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRW5EOzs7O0dBSUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxRQUFnQixFQUFFLFNBQWlCLEVBQUUsTUFBNkI7SUFDckYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsVUFBa0I7SUFDNUQsT0FBTyxJQUFBLHlCQUFtQixFQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELFFBQVEsQ0FBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7SUFDL0QsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDO0lBQzlCLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBRXBDLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsUUFBUSxF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Q0FBQyxDQUFDO1lBQ3RELE1BQU0sVUFBVSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsMEJBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEUsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxrQ0FBd0IsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby9zamNsJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgZGVjcnlwdFYxV2l0aENyeXB0bywgVjFfTUFYX0lURVIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgS0VZQ0FSRF9CT1hfQSwgS0VZQ0FSRF9CT1hfQiwgS0VZQ0FSRF9QQVNTV09SRCwgS0VZQ0FSRF9QTEFJTlRFWFRfUFJFRklYIH0gZnJvbSAnLi9maXh0dXJlcy9rZXljYXJkJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCBicm93c2VyQ3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvLWJyb3dzZXJpZnknKTtcblxuLyoqXG4gKiBzamNsLmVuY3J5cHQncyB0eXBpbmdzIHJlcXVpcmUgc2FsdC9pdiwgYnV0IHRoZSBydW50aW1lIHBpY2tzIHRoZW0gZnJvbVxuICogc2pjbC5yYW5kb20gd2hlbiBvbWl0dGVkLiBGZWVkIHJlYWwgcmFuZG9tIHdvcmRzIHNvIHRoZSBjYWxsIHR5cGUtY2hlY2tzXG4gKiB3aXRob3V0IGFuIGBhc2AgY2FzdC5cbiAqL1xuZnVuY3Rpb24gc2pjbEVuY3J5cHQocGFzc3dvcmQ6IHN0cmluZywgcGxhaW50ZXh0OiBzdHJpbmcsIHBhcmFtczogc2pjbC5TamNsQ2lwaGVyUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdCA9IHNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKDIpO1xuICBjb25zdCBpdiA9IHNqY2wucmFuZG9tLnJhbmRvbVdvcmRzKDQpO1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgLi4ucGFyYW1zLCBzYWx0LCBpdiB9KTtcbn1cblxuLyoqXG4gKiBFeGVyY2lzZXMgdGhlIHJlYWwgYGRlY3J5cHRWMVdpdGhDcnlwdG9gIGNvZGUgcGF0aCB3aXRoIGBjcnlwdG8tYnJvd3NlcmlmeWBcbiAqIGluamVjdGVkIGFzIHRoZSBjcnlwdG8gbW9kdWxlLiBUaGlzIGlzIGV4YWN0bHkgd2hhdCB3ZWJwYWNrIGJ1bmRsZXMgZm9yIHRoZVxuICogYnJvd3NlciAoaXRzIGBjcnlwdG9gIHNoaW0pLCBzbyBhIGdyZWVuIHRlc3QgaGVyZSBwcm92ZXMgdGhlIGJyb3dzZXIgYnVpbGRcbiAqIHN0YXlzIGJ5dGUtY29tcGF0aWJsZSB3aXRoIFNKQ0wtcHJvZHVjZWQgZW52ZWxvcGVzIGFuZCB0aGUgTm9kZSBwYXRoLlxuICovXG5mdW5jdGlvbiBkZWNyeXB0VjFCcm93c2VyKHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBkZWNyeXB0VjFXaXRoQ3J5cHRvKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0LCBicm93c2VyQ3J5cHRvKTtcbn1cblxuZGVzY3JpYmUoJ2RlY3J5cHRWMSBicm93c2VyIHBhdGggKGNyeXB0by1icm93c2VyaWZ5IHNoaW0pJywgKCkgPT4ge1xuICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBCcm93c2VyISc7XG5cbiAgaXQoJ3Byb2R1Y2VzIHRoZSBzYW1lIHBsYWludGV4dCBhcyBzamNsLmRlY3J5cHQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2lwaGVydGV4dCA9IHNqY2xFbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgaXRlcjogMTAwMDAsIGtzOiAyNTYsIHRzOiA2NCwgbW9kZTogJ2NjbScgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGF3YWl0IGRlY3J5cHRWMUJyb3dzZXIocGFzc3dvcmQsIGNpcGhlcnRleHQpLCBzamNsLmRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgYWRhdGEgKEFBRCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2lwaGVydGV4dCA9IHNqY2xFbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIHtcbiAgICAgIGl0ZXI6IDEwMDAwLFxuICAgICAga3M6IDI1NixcbiAgICAgIHRzOiA2NCxcbiAgICAgIG1vZGU6ICdjY20nLFxuICAgICAgYWRhdGE6ICdjdHgtQScsXG4gICAgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGF3YWl0IGRlY3J5cHRWMUJyb3dzZXIocGFzc3dvcmQsIGNpcGhlcnRleHQpLCBwbGFpbnRleHQpO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyBVVEYtOCBwYXNzd29yZCArIHBsYWludGV4dCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1dGY4UGFzc3dvcmQgPSAncMOkc3N3w7ZyZOS4reaWh/CflJAnO1xuICAgIGNvbnN0IHV0ZjhQbGFpbnRleHQgPSAncGFzc3BocmFzZTog56eY5a+G44Kt44O8IOKYg/CflJEnO1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBzamNsRW5jcnlwdCh1dGY4UGFzc3dvcmQsIHV0ZjhQbGFpbnRleHQsIHsgaXRlcjogMTAwMDAsIGtzOiAyNTYsIHRzOiA2NCwgbW9kZTogJ2NjbScgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGF3YWl0IGRlY3J5cHRWMUJyb3dzZXIodXRmOFBhc3N3b3JkLCBjaXBoZXJ0ZXh0KSwgdXRmOFBsYWludGV4dCk7XG4gIH0pO1xuXG4gIGl0KCdoYW5kbGVzIGxhcmdlIHBsYWludGV4dCAoPjY0IEtpQiwgZm9yY2VzIEw9MyBub25jZSBmcmFtaW5nKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsYXJnZSA9ICd4Jy5yZXBlYXQoNzBfMDAwKTtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gc2pjbEVuY3J5cHQocGFzc3dvcmQsIGxhcmdlLCB7IGl0ZXI6IDEwMDAsIGtzOiAyNTYsIHRzOiA2NCwgbW9kZTogJ2NjbScgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGF3YWl0IGRlY3J5cHRWMUJyb3dzZXIocGFzc3dvcmQsIGNpcGhlcnRleHQpLCBsYXJnZSk7XG4gIH0pO1xuXG4gIGl0KCdoYW5kbGVzIGFlcy0xMjggZW52ZWxvcGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBzamNsRW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGl0ZXI6IDEwMDAwLCBrczogMTI4LCB0czogNjQsIG1vZGU6ICdjY20nIH0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhd2FpdCBkZWNyeXB0VjFCcm93c2VyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KSwgcGxhaW50ZXh0KTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgMTI4LWJpdCB0YWcgZW52ZWxvcGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBzamNsRW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGl0ZXI6IDEwMDAwLCBrczogMjU2LCB0czogMTI4LCBtb2RlOiAnY2NtJyB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYXdhaXQgZGVjcnlwdFYxQnJvd3NlcihwYXNzd29yZCwgY2lwaGVydGV4dCksIHBsYWludGV4dCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHdyb25nIHBhc3N3b3JkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBzamNsRW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGl0ZXI6IDEwMDAwLCBrczogMjU2LCB0czogNjQsIG1vZGU6ICdjY20nIH0pO1xuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMUJyb3dzZXIoJ3dyb25nUGFzc3dvcmQnLCBjaXBoZXJ0ZXh0KSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggaXRlciBhYm92ZSBjYXAgYmVmb3JlIHJ1bm5pbmcgUEJLREYyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBzamNsRW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGl0ZXI6IDEwMDAwLCBrczogMjU2LCB0czogNjQsIG1vZGU6ICdjY20nIH0pO1xuICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICBlbnZlbG9wZS5pdGVyID0gVjFfTUFYX0lURVIgKyAxO1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjFCcm93c2VyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaXRlci8pO1xuICAgIGFzc2VydC5vayhEYXRlLm5vdygpIC0gc3RhcnQgPCAxMDAsICdtdXN0IHJlamVjdCBiZWZvcmUgYW55IEtERiB3b3JrJyk7XG4gIH0pO1xuXG4gIGl0KCdwYXJpdHkgYWNyb3NzIDUwIHJhbmRvbWlzZWQgaW5wdXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmFuZG9tQnl0ZXMgfSA9IGF3YWl0IGltcG9ydCgnY3J5cHRvJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7XG4gICAgICBjb25zdCBwdyA9IHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBwdCA9IHJhbmRvbUJ5dGVzKDEgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1MDApKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gc2pjbEVuY3J5cHQocHcsIHB0LCB7IGl0ZXI6IDEwMDAsIGtzOiAyNTYsIHRzOiA2NCwgbW9kZTogJ2NjbScgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYXdhaXQgZGVjcnlwdFYxQnJvd3NlcihwdywgY2lwaGVydGV4dCksIHB0LCBgaXRlcmF0aW9uICR7aX1gKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdCb3ggQSArIEJveCBCOiBzaGltIGRlY3J5cHQgbWF0Y2hlcyBTSkNMIGJ5dGUtZm9yLWJ5dGUnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbbGFiZWwsIGN0XSBvZiBbXG4gICAgICBbJ0EnLCBLRVlDQVJEX0JPWF9BXSxcbiAgICAgIFsnQicsIEtFWUNBUkRfQk9YX0JdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IHNqY2xSZXN1bHQgPSBzamNsLmRlY3J5cHQoS0VZQ0FSRF9QQVNTV09SRCwgY3QpO1xuICAgICAgY29uc3Qgc2hpbVJlc3VsdCA9IGF3YWl0IGRlY3J5cHRWMUJyb3dzZXIoS0VZQ0FSRF9QQVNTV09SRCwgY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNoaW1SZXN1bHQsIHNqY2xSZXN1bHQsIGBCb3ggJHtsYWJlbH0gbWlzbWF0Y2hgKTtcbiAgICAgIGFzc2VydC5vayhzaGltUmVzdWx0LnN0YXJ0c1dpdGgoS0VZQ0FSRF9QTEFJTlRFWFRfUFJFRklYKSk7XG4gICAgfVxuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=decryptV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decryptV1.d.ts","sourceRoot":"","sources":["../../../test/unit/decryptV1.ts"],"names":[],"mappings":""}