@bitgo/sdk-core 37.10.0 → 37.11.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.
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/environments.js +2 -2
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +4 -5
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +9 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +59 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +53 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +7 -7
- package/dist/src/bitgo/wallet/iWallets.d.ts +96 -2
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +4 -3
- package/dist/src/bitgo/wallet/wallets.d.ts +5 -0
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +100 -4
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +120 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +22 -22
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +364 -14
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eddsaExternalSigner.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,158 @@
|
|
|
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
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const sinon = __importStar(require("sinon"));
|
|
38
|
+
const src_1 = require("../../../../../../src");
|
|
39
|
+
const gpgKeys_1 = require("../ecdsa/gpgKeys");
|
|
40
|
+
describe('EddsaUtils.createKeychainsWithExternalSigner', function () {
|
|
41
|
+
let utils;
|
|
42
|
+
let callbacks;
|
|
43
|
+
let mockCoin;
|
|
44
|
+
const enterprise = 'enterprise-id';
|
|
45
|
+
const commonKeychain = 'eddsa-common-keychain';
|
|
46
|
+
const keyShare = (pub, prv, proof) => ({
|
|
47
|
+
publicShare: pub,
|
|
48
|
+
privateShare: prv,
|
|
49
|
+
privateShareProof: proof,
|
|
50
|
+
vssProof: `${proof}-vss`,
|
|
51
|
+
gpgKey: `${pub}-gpg`,
|
|
52
|
+
});
|
|
53
|
+
const userToBitgoKeyShare = keyShare('upub', 'uprv-enc', 'uproof');
|
|
54
|
+
const backupToBitgoKeyShare = keyShare('bpub', 'bprv-enc', 'bproof');
|
|
55
|
+
const backupToUserCounterPartyKeyShare = keyShare('ucp-pub', 'ucp-prv', 'ucp-proof');
|
|
56
|
+
const userState = { encryptedData: 'u-data', encryptedDataKey: 'u-data-key' };
|
|
57
|
+
const backupState = { encryptedData: 'b-data', encryptedDataKey: 'b-data-key' };
|
|
58
|
+
const bitgoKeychain = { id: 'bitgo-key-id', commonKeychain, source: 'bitgo', type: 'tss' };
|
|
59
|
+
const initResult = {
|
|
60
|
+
userGpgPublicKey: 'user-gpg-pub',
|
|
61
|
+
backupGpgPublicKey: 'backup-gpg-pub',
|
|
62
|
+
userToBitgoKeyShare,
|
|
63
|
+
backupToBitgoKeyShare,
|
|
64
|
+
userState,
|
|
65
|
+
backupState,
|
|
66
|
+
backupToUserCounterPartyKeyShare,
|
|
67
|
+
};
|
|
68
|
+
beforeEach(function () {
|
|
69
|
+
callbacks = {
|
|
70
|
+
initializeCallback: sinon.stub().resolves(initResult),
|
|
71
|
+
finalizeCallback: sinon.stub().callsFake(async ({ source }) => ({
|
|
72
|
+
commonKeychain,
|
|
73
|
+
counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
|
|
74
|
+
})),
|
|
75
|
+
};
|
|
76
|
+
const mockKeychains = {
|
|
77
|
+
add: sinon.stub().callsFake((params) => {
|
|
78
|
+
if (params.source === 'bitgo')
|
|
79
|
+
return Promise.resolve(bitgoKeychain);
|
|
80
|
+
return Promise.resolve({ id: `${params.source}-key-id`, commonKeychain, source: params.source, type: 'tss' });
|
|
81
|
+
}),
|
|
82
|
+
};
|
|
83
|
+
const mockBitGo = {
|
|
84
|
+
getEnv: sinon.stub().returns('dev'),
|
|
85
|
+
fetchConstants: sinon.stub().resolves({
|
|
86
|
+
mpc: { bitgoPublicKey: gpgKeys_1.bitgoGpgKey.public },
|
|
87
|
+
}),
|
|
88
|
+
};
|
|
89
|
+
mockCoin = {
|
|
90
|
+
getChain: sinon.stub().returns('tsol'),
|
|
91
|
+
keychains: sinon.stub().returns(mockKeychains),
|
|
92
|
+
};
|
|
93
|
+
utils = new src_1.EddsaUtils(mockBitGo, mockCoin);
|
|
94
|
+
});
|
|
95
|
+
afterEach(function () {
|
|
96
|
+
sinon.restore();
|
|
97
|
+
});
|
|
98
|
+
it('should call initialize before finalize, and finalize user before backup (sequential)', async function () {
|
|
99
|
+
const callOrder = [];
|
|
100
|
+
callbacks.initializeCallback.callsFake(async () => {
|
|
101
|
+
callOrder.push('initialize');
|
|
102
|
+
return initResult;
|
|
103
|
+
});
|
|
104
|
+
callbacks.finalizeCallback.callsFake(async ({ source }) => {
|
|
105
|
+
callOrder.push(`finalize-${source}`);
|
|
106
|
+
return {
|
|
107
|
+
commonKeychain,
|
|
108
|
+
counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
await utils.createKeychainsWithExternalSigner({ enterprise, callbacks });
|
|
112
|
+
assert.deepStrictEqual(callOrder, ['initialize', 'finalize-user', 'finalize-backup']);
|
|
113
|
+
});
|
|
114
|
+
it('should return user, backup, and bitgo keychains', async function () {
|
|
115
|
+
const result = await utils.createKeychainsWithExternalSigner({ enterprise, callbacks });
|
|
116
|
+
assert.ok(result.userKeychain);
|
|
117
|
+
assert.ok(result.backupKeychain);
|
|
118
|
+
assert.ok(result.bitgoKeychain);
|
|
119
|
+
assert.strictEqual(result.bitgoKeychain.commonKeychain, commonKeychain);
|
|
120
|
+
});
|
|
121
|
+
it('should pass bitgoKeychain and counterparty context to finalizeCallback for both sources', async function () {
|
|
122
|
+
await utils.createKeychainsWithExternalSigner({ enterprise, callbacks });
|
|
123
|
+
const userCall = callbacks.finalizeCallback.getCall(0).args[0];
|
|
124
|
+
const backupCall = callbacks.finalizeCallback.getCall(1).args[0];
|
|
125
|
+
assert.strictEqual(userCall.source, 'user');
|
|
126
|
+
assert.strictEqual(userCall.coin, 'tsol');
|
|
127
|
+
assert.deepStrictEqual(userCall.bitgoKeychain, bitgoKeychain);
|
|
128
|
+
assert.strictEqual(userCall.counterPartyGPGKey, 'backup-gpg-pub');
|
|
129
|
+
assert.deepStrictEqual(userCall.counterPartyKeyShare, backupToUserCounterPartyKeyShare);
|
|
130
|
+
assert.deepStrictEqual(userCall.state, userState);
|
|
131
|
+
assert.strictEqual(backupCall.source, 'backup');
|
|
132
|
+
assert.strictEqual(backupCall.coin, 'tsol');
|
|
133
|
+
assert.deepStrictEqual(backupCall.bitgoKeychain, bitgoKeychain);
|
|
134
|
+
assert.strictEqual(backupCall.counterPartyGPGKey, 'user-gpg-pub');
|
|
135
|
+
// backup receives the counterparty share produced by user finalize
|
|
136
|
+
assert.ok(backupCall.counterPartyKeyShare);
|
|
137
|
+
assert.deepStrictEqual(backupCall.state, backupState);
|
|
138
|
+
});
|
|
139
|
+
it('should reject when user finalize does not produce a counterparty key share', async function () {
|
|
140
|
+
callbacks.finalizeCallback.callsFake(async () => ({ commonKeychain }));
|
|
141
|
+
await assert.rejects(() => utils.createKeychainsWithExternalSigner({ enterprise, callbacks }), /User finalize did not produce a counterparty key share/);
|
|
142
|
+
});
|
|
143
|
+
it('should reject when user finalizeCallback returns mismatched commonKeychain', async function () {
|
|
144
|
+
callbacks.finalizeCallback.callsFake(async ({ source }) => ({
|
|
145
|
+
commonKeychain: source === 'user' ? 'wrong-keychain' : commonKeychain,
|
|
146
|
+
counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
|
|
147
|
+
}));
|
|
148
|
+
await assert.rejects(() => utils.createKeychainsWithExternalSigner({ enterprise, callbacks }), /User common keychain does not match BitGo/);
|
|
149
|
+
});
|
|
150
|
+
it('should reject when backup finalizeCallback returns mismatched commonKeychain', async function () {
|
|
151
|
+
callbacks.finalizeCallback.callsFake(async ({ source }) => ({
|
|
152
|
+
commonKeychain: source === 'backup' ? 'wrong-keychain' : commonKeychain,
|
|
153
|
+
counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
|
|
154
|
+
}));
|
|
155
|
+
await assert.rejects(() => utils.createKeychainsWithExternalSigner({ enterprise, callbacks }), /Backup common keychain does not match BitGo/);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FFeHRlcm5hbFNpZ25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FFeHRlcm5hbFNpZ25lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw2Q0FBK0I7QUFDL0IsK0NBQXlFO0FBQ3pFLDhDQUErQztBQUUvQyxRQUFRLENBQUMsOENBQThDLEVBQUU7SUFDdkQsSUFBSSxLQUFpQixDQUFDO0lBQ3RCLElBQUksU0FBK0IsQ0FBQztJQUNwQyxJQUFJLFFBQWEsQ0FBQztJQUNsQixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUM7SUFDbkMsTUFBTSxjQUFjLEdBQUcsdUJBQXVCLENBQUM7SUFFL0MsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxXQUFXLEVBQUUsR0FBRztRQUNoQixZQUFZLEVBQUUsR0FBRztRQUNqQixpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLEtBQUssTUFBTTtRQUN4QixNQUFNLEVBQUUsR0FBRyxHQUFHLE1BQU07S0FDckIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRSxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sZ0NBQWdDLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckYsTUFBTSxTQUFTLEdBQUcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFB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QUFFLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ2xHLENBQUMsQ0FBQyxDQUFDO1FBRUosTUFBTSxNQUFNLENBQUMsT0FBTyxDQUNsQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFDeEUsNkNBQTZDLENBQzlDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBFZGRzYVV0aWxzLCBFZGRzYUtleUdlbkNhbGxiYWNrcyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBiaXRnb0dwZ0tleSB9IGZyb20gJy4uL2VjZHNhL2dwZ0tleXMnO1xuXG5kZXNjcmliZSgnRWRkc2FVdGlscy5jcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXInLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB1dGlsczogRWRkc2FVdGlscztcbiAgbGV0IGNhbGxiYWNrczogRWRkc2FLZXlHZW5DYWxsYmFja3M7XG4gIGxldCBtb2NrQ29pbjogYW55O1xuICBjb25zdCBlbnRlcnByaXNlID0gJ2VudGVycHJpc2UtaWQnO1xuICBjb25zdCBjb21tb25LZXljaGFpbiA9ICdlZGRzYS1jb21tb24ta2V5Y2hhaW4nO1xuXG4gIGNvbnN0IGtleVNoYXJlID0gKHB1Yjogc3RyaW5nLCBwcnY6IHN0cmluZywgcHJvb2Y6IHN0cmluZykgPT4gKHtcbiAgICBwdWJsaWNTaGFyZTogcHViLFxuICAgIHByaXZhdGVTaGFyZTogcHJ2LFxuICAgIHByaXZhdGVTaGFyZVByb29mOiBwcm9vZixcbiAgICB2c3NQcm9vZjogYCR7cHJvb2Z9LXZzc2AsXG4gICAgZ3BnS2V5OiBgJHtwdWJ9LWdwZ2AsXG4gIH0pO1xuICBjb25zdCB1c2VyVG9CaXRnb0tleVNoYXJlID0ga2V5U2hhcmUoJ3VwdWInLCAndXBydi1lbmMnLCAndXByb29mJyk7XG4gIGNvbnN0IGJhY2t1cFRvQml0Z29LZXlTaGFyZSA9IGtleVNoYXJlKCdicHViJywgJ2JwcnYtZW5jJywgJ2Jwcm9vZicpO1xuICBjb25zdCBiYWNrdXBUb1VzZXJDb3VudGVyUGFydHlLZXlTaGFyZSA9IGtleVNoYXJlKCd1Y3AtcHViJywgJ3VjcC1wcnYnLCAndWNwLXByb29mJyk7XG4gIGNvbnN0IHVzZXJTdGF0ZSA9IHsgZW5jcnlwdGVkRGF0YTogJ3UtZGF0YScsIGVuY3J5cHRlZERhdGFLZXk6ICd1LWRhdGEta2V5JyB9O1xuICBjb25zdCBiYWNrdXBTdGF0ZSA9IHsgZW5jcnlwdGVkRGF0YTogJ2ItZGF0YScsIGVuY3J5cHRlZERhdGFLZXk6ICdiLWRhdGEta2V5JyB9O1xuICBjb25zdCBiaXRnb0tleWNoYWluID0geyBpZDogJ2JpdGdvLWtleS1pZCcsIGNvbW1vbktleWNoYWluLCBzb3VyY2U6ICdiaXRnbycsIHR5cGU6ICd0c3MnIH07XG5cbiAgY29uc3QgaW5pdFJlc3VsdCA9IHtcbiAgICB1c2VyR3BnUHVibGljS2V5OiAndXNlci1ncGctcHViJyxcbiAgICBiYWNrdXBHcGdQdWJsaWNLZXk6ICdiYWNrdXAtZ3BnLXB1YicsXG4gICAgdXNlclRvQml0Z29LZXlTaGFyZSxcbiAgICBiYWNrdXBUb0JpdGdvS2V5U2hhcmUsXG4gICAgdXNlclN0YXRlLFxuICAgIGJhY2t1cFN0YXRlLFxuICAgIGJhY2t1cFRvVXNlckNvdW50ZXJQYXJ0eUtleVNoYXJlLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrcyA9IHtcbiAgICAgIGluaXRpYWxpemVDYWxsYmFjazogc2lub24uc3R1YigpLnJlc29sdmVzKGluaXRSZXN1bHQpLFxuICAgICAgZmluYWxpemVDYWxsYmFjazogc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoeyBzb3VyY2UgfTogeyBzb3VyY2U6ICd1c2VyJyB8ICdiYWNrdXAnIH0pID0+ICh7XG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICBjb3VudGVycGFydHlLZXlTaGFyZTogc291cmNlID09PSAndXNlcicgPyBrZXlTaGFyZSgnYmNwLXB1YicsICdiY3AtcHJ2JywgJ2JjcC1wcm9vZicpIDogdW5kZWZpbmVkLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrS2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocGFyYW1zLnNvdXJjZSA9PT0gJ2JpdGdvJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiaXRnb0tleWNoYWluKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGlkOiBgJHtwYXJhbXMuc291cmNlfS1rZXktaWRgLCBjb21tb25LZXljaGFpbiwgc291cmNlOiBwYXJhbXMuc291cmNlLCB0eXBlOiAndHNzJyB9KTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrQml0R28gPSB7XG4gICAgICBnZXRFbnY6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdkZXYnKSxcbiAgICAgIGZldGNoQ29uc3RhbnRzOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBtcGM6IHsgYml0Z29QdWJsaWNLZXk6IGJpdGdvR3BnS2V5LnB1YmxpYyB9LFxuICAgICAgfSksXG4gICAgfSBhcyBhbnk7XG5cbiAgICBtb2NrQ29pbiA9IHtcbiAgICAgIGdldENoYWluOiBzaW5vbi5zdHViKCkucmV0dXJucygndHNvbCcpLFxuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyhtb2NrS2V5Y2hhaW5zKSxcbiAgICB9IGFzIGFueTtcblxuICAgIHV0aWxzID0gbmV3IEVkZHNhVXRpbHMobW9ja0JpdEdvLCBtb2NrQ29pbik7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGwgaW5pdGlhbGl6ZSBiZWZvcmUgZmluYWxpemUsIGFuZCBmaW5hbGl6ZSB1c2VyIGJlZm9yZSBiYWNrdXAgKHNlcXVlbnRpYWwpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNhbGxPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgICAoY2FsbGJhY2tzLmluaXRpYWxpemVDYWxsYmFjayBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxzRmFrZShhc3luYyAoKSA9PiB7XG4gICAgICBjYWxsT3JkZXIucHVzaCgnaW5pdGlhbGl6ZScpO1xuICAgICAgcmV0dXJuIGluaXRSZXN1bHQ7XG4gICAgfSk7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICh7IHNvdXJjZSB9OiB7IHNvdXJjZTogJ3VzZXInIHwgJ2JhY2t1cCcgfSkgPT4ge1xuICAgICAgY2FsbE9yZGVyLnB1c2goYGZpbmFsaXplLSR7c291cmNlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGNvdW50ZXJwYXJ0eUtleVNoYXJlOiBzb3VyY2UgPT09ICd1c2VyJyA/IGtleVNoYXJlKCdiY3AtcHViJywgJ2JjcC1wcnYnLCAnYmNwLXByb29mJykgOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHsgZW50ZXJwcmlzZSwgY2FsbGJhY2tzIH0pO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChjYWxsT3JkZXIsIFsnaW5pdGlhbGl6ZScsICdmaW5hbGl6ZS11c2VyJywgJ2ZpbmFsaXplLWJhY2t1cCddKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdXNlciwgYmFja3VwLCBhbmQgYml0Z28ga2V5Y2hhaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHV0aWxzLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9KTtcblxuICAgIGFzc2VydC5vayhyZXN1bHQudXNlcktleWNoYWluKTtcbiAgICBhc3NlcnQub2socmVzdWx0LmJhY2t1cEtleWNoYWluKTtcbiAgICBhc3NlcnQub2socmVzdWx0LmJpdGdvS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbiwgY29tbW9uS2V5Y2hhaW4pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhc3MgYml0Z29LZXljaGFpbiBhbmQgY291bnRlcnBhcnR5IGNvbnRleHQgdG8gZmluYWxpemVDYWxsYmFjayBmb3IgYm90aCBzb3VyY2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9KTtcblxuICAgIGNvbnN0IHVzZXJDYWxsID0gKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuZ2V0Q2FsbCgwKS5hcmdzWzBdO1xuICAgIGNvbnN0IGJhY2t1cENhbGwgPSAoY2FsbGJhY2tzLmZpbmFsaXplQ2FsbGJhY2sgYXMgc2lub24uU2lub25TdHViKS5nZXRDYWxsKDEpLmFyZ3NbMF07XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodXNlckNhbGwuc291cmNlLCAndXNlcicpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2FsbC5jb2luLCAndHNvbCcpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodXNlckNhbGwuYml0Z29LZXljaGFpbiwgYml0Z29LZXljaGFpbik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHVzZXJDYWxsLmNvdW50ZXJQYXJ0eUdQR0tleSwgJ2JhY2t1cC1ncGctcHViJyk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh1c2VyQ2FsbC5jb3VudGVyUGFydHlLZXlTaGFyZSwgYmFja3VwVG9Vc2VyQ291bnRlclBhcnR5S2V5U2hhcmUpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodXNlckNhbGwuc3RhdGUsIHVzZXJTdGF0ZSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5zb3VyY2UsICdiYWNrdXAnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5jb2luLCAndHNvbCcpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5iaXRnb0tleWNoYWluLCBiaXRnb0tleWNoYWluKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5jb3VudGVyUGFydHlHUEdLZXksICd1c2VyLWdwZy1wdWInKTtcbiAgICAvLyBiYWNrdXAgcmVjZWl2ZXMgdGhlIGNvdW50ZXJwYXJ0eSBzaGFyZSBwcm9kdWNlZCBieSB1c2VyIGZpbmFsaXplXG4gICAgYXNzZXJ0Lm9rKGJhY2t1cENhbGwuY291bnRlclBhcnR5S2V5U2hhcmUpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5zdGF0ZSwgYmFja3VwU3RhdGUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIHVzZXIgZmluYWxpemUgZG9lcyBub3QgcHJvZHVjZSBhIGNvdW50ZXJwYXJ0eSBrZXkgc2hhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICgpID0+ICh7IGNvbW1vbktleWNoYWluIH0pKTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgKCkgPT4gdXRpbHMuY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHsgZW50ZXJwcmlzZSwgY2FsbGJhY2tzIH0pLFxuICAgICAgL1VzZXIgZmluYWxpemUgZGlkIG5vdCBwcm9kdWNlIGEgY291bnRlcnBhcnR5IGtleSBzaGFyZS9cbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIHVzZXIgZmluYWxpemVDYWxsYmFjayByZXR1cm5zIG1pc21hdGNoZWQgY29tbW9uS2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICh7IHNvdXJjZSB9OiB7IHNvdXJjZTogJ3VzZXInIHwgJ2JhY2t1cCcgfSkgPT4gKHtcbiAgICAgIGNvbW1vbktleWNoYWluOiBzb3VyY2UgPT09ICd1c2VyJyA/ICd3cm9uZy1rZXljaGFpbicgOiBjb21tb25LZXljaGFpbixcbiAgICAgIGNvdW50ZXJwYXJ0eUtleVNoYXJlOiBzb3VyY2UgPT09ICd1c2VyJyA/IGtleVNoYXJlKCdiY3AtcHViJywgJ2JjcC1wcnYnLCAnYmNwLXByb29mJykgOiB1bmRlZmluZWQsXG4gICAgfSkpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PiB1dGlscy5jcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXIoeyBlbnRlcnByaXNlLCBjYWxsYmFja3MgfSksXG4gICAgICAvVXNlciBjb21tb24ga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28vXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBiYWNrdXAgZmluYWxpemVDYWxsYmFjayByZXR1cm5zIG1pc21hdGNoZWQgY29tbW9uS2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICh7IHNvdXJjZSB9OiB7IHNvdXJjZTogJ3VzZXInIHwgJ2JhY2t1cCcgfSkgPT4gKHtcbiAgICAgIGNvbW1vbktleWNoYWluOiBzb3VyY2UgPT09ICdiYWNrdXAnID8gJ3dyb25nLWtleWNoYWluJyA6IGNvbW1vbktleWNoYWluLFxuICAgICAgY291bnRlcnBhcnR5S2V5U2hhcmU6IHNvdXJjZSA9PT0gJ3VzZXInID8ga2V5U2hhcmUoJ2JjcC1wdWInLCAnYmNwLXBydicsICdiY3AtcHJvb2YnKSA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICgpID0+IHV0aWxzLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9KSxcbiAgICAgIC9CYWNrdXAgY29tbW9uIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvL1xuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=
|