@bitgo-beta/sdk-api 1.10.1-beta.2083 → 1.10.1-beta.2085

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,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=keychains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychains.d.ts","sourceRoot":"","sources":["../../../../test/unit/v1/keychains.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,114 @@
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
+ require("should");
40
+ const sinon = __importStar(require("sinon"));
41
+ const nock_1 = __importDefault(require("nock"));
42
+ const Keychains = require('../../../src/v1/keychains');
43
+ const ROOT = 'https://app.example.local';
44
+ /**
45
+ * The deprecated v1 keychains updatePassword (src/v1/keychains.ts) fetches the user's
46
+ * server-stored encryptedXprvs, re-encrypts each with the new password, and preserves
47
+ * each envelope's version (isV2Envelope ? 2 : 1). It deliberately ignores both
48
+ * `encryptionVersion` and `encryptionSession` -- v1 stays v1 during a v2 rotation and
49
+ * no session is ever consumed. These tests pin that wire behavior so the rollback
50
+ * contract documented in WCN-2640 cannot regress.
51
+ */
52
+ describe('v1 Keychains.updatePassword', function () {
53
+ const v1Envelope = JSON.stringify({ v: 1, iter: 10000, salt: 'c2FsdA==', iv: 'aXY=', ct: 'Y3Q=' });
54
+ const v2Envelope = JSON.stringify({ v: 2, m: 65536, t: 3, p: 4, salt: 'c2FsdA==', iv: 'aXY=', ct: 'Y3Q=' });
55
+ const undecryptableEnvelope = JSON.stringify({ v: 1, iter: 10000, salt: 'YmFk', iv: 'aXY=', ct: 'Y3Q=' });
56
+ function makeBitgo(stored, decryptResults, encryptStub) {
57
+ return {
58
+ url: (path) => `${ROOT}/api/v1${path}`,
59
+ post: () => ({ result: async () => ({ version: 25, keychains: stored }) }),
60
+ decrypt: async ({ input }) => {
61
+ const result = decryptResults[input];
62
+ if (result === undefined) {
63
+ throw new Error('decryption failed');
64
+ }
65
+ return result;
66
+ },
67
+ encrypt: encryptStub,
68
+ };
69
+ }
70
+ afterEach(function () {
71
+ nock_1.default.cleanAll();
72
+ sinon.restore();
73
+ });
74
+ it('ignores encryptionSession and preserves per-envelope versions under a v2 rotation', async function () {
75
+ const stored = { xpubV1: v1Envelope, xpubV2: v2Envelope };
76
+ (0, nock_1.default)(ROOT).post('/api/v1/user/encrypted').reply(200, { version: 25, keychains: stored });
77
+ const encryptStub = sinon.stub().resolves('re-encrypted');
78
+ const keychains = new Keychains(makeBitgo(stored, { [v1Envelope]: 'plain-v1', [v2Envelope]: 'plain-v2' }, encryptStub));
79
+ const session = {
80
+ encrypt: sinon.stub().resolves('session-encrypted'),
81
+ decrypt: sinon.stub().resolves('session-decrypted'),
82
+ destroy: sinon.stub(),
83
+ };
84
+ const result = await keychains.updatePassword({
85
+ oldPassword: 'oldpw',
86
+ newPassword: 'newpw',
87
+ encryptionVersion: 2,
88
+ encryptionSession: session,
89
+ });
90
+ // the v1-leg never touches the session: no encrypt, no destroy (destroy is the caller's job)
91
+ session.encrypt.called.should.equal(false);
92
+ session.destroy.called.should.equal(false);
93
+ // re-encryption preserves each envelope's own version: v1 -> encryptionVersion 1,
94
+ // v2 -> encryptionVersion 2, NOT the caller's encryptionVersion: 2 opt-in
95
+ encryptStub.calledTwice.should.equal(true);
96
+ encryptStub.getCall(0).args[0].encryptionVersion.should.equal(1);
97
+ encryptStub.getCall(1).args[0].encryptionVersion.should.equal(2);
98
+ encryptStub.alwaysCalledWithMatch({ password: 'newpw' }).should.equal(true);
99
+ result.keychains.should.deepEqual({ xpubV1: 're-encrypted', xpubV2: 're-encrypted' });
100
+ result.version.should.equal(25);
101
+ });
102
+ it('keeps keychains that cannot be decrypted with the old password unchanged', async function () {
103
+ const stored = { xpubV1: v1Envelope, xpubV2: v2Envelope, xpubUndecryptable: undecryptableEnvelope };
104
+ (0, nock_1.default)(ROOT).post('/api/v1/user/encrypted').reply(200, { version: 25, keychains: stored });
105
+ const encryptStub = sinon.stub().resolves('re-encrypted');
106
+ const keychains = new Keychains(makeBitgo(stored, { [v1Envelope]: 'plain-v1', [v2Envelope]: 'plain-v2' }, encryptStub));
107
+ const result = await keychains.updatePassword({ oldPassword: 'oldpw', newPassword: 'newpw' });
108
+ encryptStub.calledTwice.should.equal(true);
109
+ result.keychains.xpubUndecryptable.should.equal(undecryptableEnvelope);
110
+ result.keychains.xpubV1.should.equal('re-encrypted');
111
+ result.keychains.xpubV2.should.equal('re-encrypted');
112
+ });
113
+ });
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3YxL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQiw2Q0FBK0I7QUFDL0IsZ0RBQXdCO0FBeUJ4QixNQUFNLFNBQVMsR0FBb0IsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFFeEUsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUM7QUFFekM7Ozs7Ozs7R0FPRztBQUNILFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtJQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUcsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUUxRyxTQUFTLFNBQVMsQ0FDaEIsTUFBOEIsRUFDOUIsY0FBc0MsRUFDdEMsV0FBNEI7UUFFNUIsT0FB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QztRQUU5RixXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCB0eXBlIHsgSUVuY3J5cHRpb25TZXNzaW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuLy8gQ0pTIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQ7IHJlcXVpcmUgaWRpb20gbWF0Y2hlcyBzcmMvYml0Z29BUEkudHMuIFRoZVxuLy8gc3RydWN0dXJhbCBjb250cmFjdCBiZWxvdyBwaW5zIHRoZSBzdXJmYWNlIHRoaXMgdGVzdCBleGVyY2lzZXMuXG5pbnRlcmZhY2UgVjFVcGRhdGVQYXNzd29yZFJlc3VsdCB7XG4gIGtleWNoYWluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgdmVyc2lvbjogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVjFCaXRnbyB7XG4gIHVybChwYXRoOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHBvc3QodXJsOiBzdHJpbmcpOiB7IHJlc3VsdCgpOiBQcm9taXNlPHVua25vd24+IH07XG4gIGRlY3J5cHQocGFyYW1zOiB7IGlucHV0OiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPjtcbiAgZW5jcnlwdChwYXJhbXM6IHsgaW5wdXQ6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZzsgZW5jcnlwdGlvblZlcnNpb24/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPjtcbn1cblxudHlwZSBWMUtleWNoYWluc0N0b3IgPSBuZXcgKGJpdGdvOiBWMUJpdGdvKSA9PiB7XG4gIHVwZGF0ZVBhc3N3b3JkKHBhcmFtczoge1xuICAgIG9sZFBhc3N3b3JkOiBzdHJpbmc7XG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZztcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IG51bWJlcjtcbiAgICBlbmNyeXB0aW9uU2Vzc2lvbj86IElFbmNyeXB0aW9uU2Vzc2lvbjtcbiAgfSk6IFByb21pc2U8VjFVcGRhdGVQYXNzd29yZFJlc3VsdD47XG59O1xuXG5jb25zdCBLZXljaGFpbnM6IFYxS2V5Y2hhaW5zQ3RvciA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy92MS9rZXljaGFpbnMnKTtcblxuY29uc3QgUk9PVCA9ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJztcblxuLyoqXG4gKiBUaGUgZGVwcmVjYXRlZCB2MSBrZXljaGFpbnMgdXBkYXRlUGFzc3dvcmQgKHNyYy92MS9rZXljaGFpbnMudHMpIGZldGNoZXMgdGhlIHVzZXInc1xuICogc2VydmVyLXN0b3JlZCBlbmNyeXB0ZWRYcHJ2cywgcmUtZW5jcnlwdHMgZWFjaCB3aXRoIHRoZSBuZXcgcGFzc3dvcmQsIGFuZCBwcmVzZXJ2ZXNcbiAqIGVhY2ggZW52ZWxvcGUncyB2ZXJzaW9uIChpc1YyRW52ZWxvcGUgPyAyIDogMSkuIEl0IGRlbGliZXJhdGVseSBpZ25vcmVzIGJvdGhcbiAqIGBlbmNyeXB0aW9uVmVyc2lvbmAgYW5kIGBlbmNyeXB0aW9uU2Vzc2lvbmAgLS0gdjEgc3RheXMgdjEgZHVyaW5nIGEgdjIgcm90YXRpb24gYW5kXG4gKiBubyBzZXNzaW9uIGlzIGV2ZXIgY29uc3VtZWQuIFRoZXNlIHRlc3RzIHBpbiB0aGF0IHdpcmUgYmVoYXZpb3Igc28gdGhlIHJvbGxiYWNrXG4gKiBjb250cmFjdCBkb2N1bWVudGVkIGluIFdDTi0yNjQwIGNhbm5vdCByZWdyZXNzLlxuICovXG5kZXNjcmliZSgndjEgS2V5Y2hhaW5zLnVwZGF0ZVBhc3N3b3JkJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCB2MUVudmVsb3BlID0gSlNPTi5zdHJpbmdpZnkoeyB2OiAxLCBpdGVyOiAxMDAwMCwgc2FsdDogJ2MyRnNkQT09JywgaXY6ICdhWFk9JywgY3Q6ICdZM1E9JyB9KTtcbiAgY29uc3QgdjJFbnZlbG9wZSA9IEpTT04uc3RyaW5naWZ5KHsgdjogMiwgbTogNjU1MzYsIHQ6IDMsIHA6IDQsIHNhbHQ6ICdjMkZzZEE9PScsIGl2OiAnYVhZPScsIGN0OiAnWTNRPScgfSk7XG4gIGNvbnN0IHVuZGVjcnlwdGFibGVFbnZlbG9wZSA9IEpTT04uc3RyaW5naWZ5KHsgdjogMSwgaXRlcjogMTAwMDAsIHNhbHQ6ICdZbUZrJywgaXY6ICdhWFk9JywgY3Q6ICdZM1E9JyB9KTtcblxuICBmdW5jdGlvbiBtYWtlQml0Z28oXG4gICAgc3RvcmVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGRlY3J5cHRSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGVuY3J5cHRTdHViOiBzaW5vbi5TaW5vblN0dWJcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybDogKHBhdGg6IHN0cmluZykgPT4gYCR7Uk9PVH0vYXBpL3YxJHtwYXRofWAsXG4gICAgICBwb3N0OiAoKSA9PiAoeyByZXN1bHQ6IGFzeW5jICgpID0+ICh7IHZlcnNpb246IDI1LCBrZXljaGFpbnM6IHN0b3JlZCB9KSB9KSxcbiAgICAgIGRlY3J5cHQ6IGFzeW5jICh7IGlucHV0IH06IHsgaW5wdXQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY3J5cHRSZXN1bHRzW2lucHV0XTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0aW9uIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgZW5jcnlwdDogZW5jcnlwdFN0dWIsXG4gICAgfTtcbiAgfVxuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgZW5jcnlwdGlvblNlc3Npb24gYW5kIHByZXNlcnZlcyBwZXItZW52ZWxvcGUgdmVyc2lvbnMgdW5kZXIgYSB2MiByb3RhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzdG9yZWQgPSB7IHhwdWJWMTogdjFFbnZlbG9wZSwgeHB1YlYyOiB2MkVudmVsb3BlIH07XG4gICAgbm9jayhST09UKS5wb3N0KCcvYXBpL3YxL3VzZXIvZW5jcnlwdGVkJykucmVwbHkoMjAwLCB7IHZlcnNpb246IDI1LCBrZXljaGFpbnM6IHN0b3JlZCB9KTtcblxuICAgIGNvbnN0IGVuY3J5cHRTdHViID0gc2lub24uc3R1YigpLnJlc29sdmVzKCdyZS1lbmNyeXB0ZWQnKTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBuZXcgS2V5Y2hhaW5zKFxuICAgICAgbWFrZUJpdGdvKHN0b3JlZCwgeyBbdjFFbnZlbG9wZV06ICdwbGFpbi12MScsIFt2MkVudmVsb3BlXTogJ3BsYWluLXYyJyB9LCBlbmNyeXB0U3R1YilcbiAgICApO1xuXG4gICAgY29uc3Qgc2Vzc2lvbjogSUVuY3J5cHRpb25TZXNzaW9uID0ge1xuICAgICAgZW5jcnlwdDogc2lub24uc3R1YigpLnJlc29sdmVzKCdzZXNzaW9uLWVuY3J5cHRlZCcpLFxuICAgICAgZGVjcnlwdDogc2lub24uc3R1YigpLnJlc29sdmVzKCdzZXNzaW9uLWRlY3J5cHRlZCcpLFxuICAgICAgZGVzdHJveTogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZXljaGFpbnMudXBkYXRlUGFzc3dvcmQoe1xuICAgICAgb2xkUGFzc3dvcmQ6ICdvbGRwdycsXG4gICAgICBuZXdQYXNzd29yZDogJ25ld3B3JyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgZW5jcnlwdGlvblNlc3Npb246IHNlc3Npb24sXG4gICAgfSk7XG5cbiAgICAvLyB0aGUgdjEtbGVnIG5ldmVyIHRvdWNoZXMgdGhlIHNlc3Npb246IG5vIGVuY3J5cHQsIG5vIGRlc3Ryb3kgKGRlc3Ryb3kgaXMgdGhlIGNhbGxlcidzIGpvYilcbiAgICAoc2Vzc2lvbi5lbmNyeXB0IGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbGVkLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgKHNlc3Npb24uZGVzdHJveSBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxlZC5zaG91bGQuZXF1YWwoZmFsc2UpO1xuXG4gICAgLy8gcmUtZW5jcnlwdGlvbiBwcmVzZXJ2ZXMgZWFjaCBlbnZlbG9wZSdzIG93biB2ZXJzaW9uOiB2MSAtPiBlbmNyeXB0aW9uVmVyc2lvbiAxLFxuICAgIC8vIHYyIC0+IGVuY3J5cHRpb25WZXJzaW9uIDIsIE5PVCB0aGUgY2FsbGVyJ3MgZW5jcnlwdGlvblZlcnNpb246IDIgb3B0LWluXG4gICAgZW5jcnlwdFN0dWIuY2FsbGVkVHdpY2Uuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIGVuY3J5cHRTdHViLmdldENhbGwoMCkuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbi5zaG91bGQuZXF1YWwoMSk7XG4gICAgZW5jcnlwdFN0dWIuZ2V0Q2FsbCgxKS5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLnNob3VsZC5lcXVhbCgyKTtcbiAgICBlbmNyeXB0U3R1Yi5hbHdheXNDYWxsZWRXaXRoTWF0Y2goeyBwYXNzd29yZDogJ25ld3B3JyB9KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG5cbiAgICByZXN1bHQua2V5Y2hhaW5zLnNob3VsZC5kZWVwRXF1YWwoeyB4cHViVjE6ICdyZS1lbmNyeXB0ZWQnLCB4cHViVjI6ICdyZS1lbmNyeXB0ZWQnIH0pO1xuICAgIHJlc3VsdC52ZXJzaW9uLnNob3VsZC5lcXVhbCgyNSk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBrZXljaGFpbnMgdGhhdCBjYW5ub3QgYmUgZGVjcnlwdGVkIHdpdGggdGhlIG9sZCBwYXNzd29yZCB1bmNoYW5nZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc3RvcmVkID0geyB4cHViVjE6IHYxRW52ZWxvcGUsIHhwdWJWMjogdjJFbnZlbG9wZSwgeHB1YlVuZGVjcnlwdGFibGU6IHVuZGVjcnlwdGFibGVFbnZlbG9wZSB9O1xuICAgIG5vY2soUk9PVCkucG9zdCgnL2FwaS92MS91c2VyL2VuY3J5cHRlZCcpLnJlcGx5KDIwMCwgeyB2ZXJzaW9uOiAyNSwga2V5Y2hhaW5zOiBzdG9yZWQgfSk7XG5cbiAgICBjb25zdCBlbmNyeXB0U3R1YiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygncmUtZW5jcnlwdGVkJyk7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gbmV3IEtleWNoYWlucyhcbiAgICAgIG1ha2VCaXRnbyhzdG9yZWQsIHsgW3YxRW52ZWxvcGVdOiAncGxhaW4tdjEnLCBbdjJFbnZlbG9wZV06ICdwbGFpbi12MicgfSwgZW5jcnlwdFN0dWIpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtleWNoYWlucy51cGRhdGVQYXNzd29yZCh7IG9sZFBhc3N3b3JkOiAnb2xkcHcnLCBuZXdQYXNzd29yZDogJ25ld3B3JyB9KTtcblxuICAgIGVuY3J5cHRTdHViLmNhbGxlZFR3aWNlLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICByZXN1bHQua2V5Y2hhaW5zLnhwdWJVbmRlY3J5cHRhYmxlLnNob3VsZC5lcXVhbCh1bmRlY3J5cHRhYmxlRW52ZWxvcGUpO1xuICAgIHJlc3VsdC5rZXljaGFpbnMueHB1YlYxLnNob3VsZC5lcXVhbCgncmUtZW5jcnlwdGVkJyk7XG4gICAgcmVzdWx0LmtleWNoYWlucy54cHViVjIuc2hvdWxkLmVxdWFsKCdyZS1lbmNyeXB0ZWQnKTtcbiAgfSk7XG59KTtcbiJdfQ==