@bitgo/sdk-core 38.21.0 → 38.23.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/errors.d.ts +2 -1
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +3 -2
- package/dist/src/bitgo/safe/index.d.ts +1 -0
- package/dist/src/bitgo/safe/index.d.ts.map +1 -1
- package/dist/src/bitgo/safe/index.js +2 -1
- package/dist/src/bitgo/safe/recovery.d.ts +92 -0
- package/dist/src/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/src/bitgo/safe/recovery.js +148 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +33 -4
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +71 -4
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +2 -1
- package/dist/src/bitgo/utils/siws.d.ts +5 -2
- package/dist/src/bitgo/utils/siws.d.ts.map +1 -1
- package/dist/src/bitgo/utils/siws.js +8 -18
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +7 -2
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +13 -2
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +8 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +7 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +9 -18
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +3 -2
- package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +2 -1
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts +45 -0
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/keyVerification.js +192 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +1 -14
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +1 -62
- package/dist/src/bitgo/wallet/iWallet.d.ts +16 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +21 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +52 -38
- package/dist/test/unit/bitgo/recovery/initiate.js +1 -30
- package/dist/test/unit/bitgo/safe/recovery.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/recovery.js +313 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/rootCoin.js +13 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +69 -1
- package/dist/test/unit/bitgo/utils/siws.js +57 -7
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.js +229 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +1 -21
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.js +160 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,160 @@
|
|
|
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 assert = __importStar(require("assert"));
|
|
40
|
+
const sinon = __importStar(require("sinon"));
|
|
41
|
+
require("should");
|
|
42
|
+
const wallet_1 = require("../../../../src/bitgo/wallet/wallet");
|
|
43
|
+
const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
|
|
44
|
+
const tss_1 = __importDefault(require("../../../../src/account-lib/mpc/tss"));
|
|
45
|
+
const bitgoPubKeys_1 = require("../../../../src/bitgo/tss/bitgoPubKeys");
|
|
46
|
+
const util_1 = require("../../../../src/bitgo/utils/util");
|
|
47
|
+
const UNSUPPORTED_WALLET_MESSAGE = 'Key verification is not supported for this wallet type';
|
|
48
|
+
describe('Wallet.verifyKey', function () {
|
|
49
|
+
let commonKeychain;
|
|
50
|
+
let matchingPrv;
|
|
51
|
+
let otherPrv;
|
|
52
|
+
before(async function () {
|
|
53
|
+
const hdTree = await sdk_lib_mpc_1.Ed25519Bip32HdTree.initialize();
|
|
54
|
+
const MPC = await tss_1.default.initialize(hdTree);
|
|
55
|
+
const userKeyShare = MPC.keyShare(1, 2, 3);
|
|
56
|
+
const backupKeyShare = MPC.keyShare(2, 2, 3);
|
|
57
|
+
const bitgoKeyShare = MPC.keyShare(3, 2, 3);
|
|
58
|
+
const combined = MPC.keyCombine(userKeyShare.uShare, [backupKeyShare.yShares[1], bitgoKeyShare.yShares[1]]);
|
|
59
|
+
commonKeychain = combined.pShare.y + combined.pShare.chaincode;
|
|
60
|
+
matchingPrv = JSON.stringify({
|
|
61
|
+
uShare: userKeyShare.uShare,
|
|
62
|
+
bitgoYShare: bitgoKeyShare.yShares[1],
|
|
63
|
+
backupYShare: backupKeyShare.yShares[1],
|
|
64
|
+
});
|
|
65
|
+
// an independent key generation for the negative case
|
|
66
|
+
const otherUserKeyShare = MPC.keyShare(1, 2, 3);
|
|
67
|
+
const otherBackupKeyShare = MPC.keyShare(2, 2, 3);
|
|
68
|
+
const otherBitgoKeyShare = MPC.keyShare(3, 2, 3);
|
|
69
|
+
otherPrv = JSON.stringify({
|
|
70
|
+
uShare: otherUserKeyShare.uShare,
|
|
71
|
+
bitgoYShare: otherBitgoKeyShare.yShares[1],
|
|
72
|
+
backupYShare: otherBackupKeyShare.yShares[1],
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
let mockBitGo;
|
|
76
|
+
let mockBaseCoin;
|
|
77
|
+
let walletData;
|
|
78
|
+
let getKeychainStub;
|
|
79
|
+
beforeEach(function () {
|
|
80
|
+
mockBitGo = {
|
|
81
|
+
post: sinon.stub(),
|
|
82
|
+
setRequestTracer: sinon.stub(),
|
|
83
|
+
// the MPCv2/ECDSA utils constructors call setBitgoGpgPubKey, which fetches constants;
|
|
84
|
+
// stubbing it avoids a swallowed unhandled rejection in those tests
|
|
85
|
+
fetchConstants: sinon.stub().resolves({
|
|
86
|
+
mpc: { bitgoPublicKey: (0, bitgoPubKeys_1.getBitgoMpcGpgPubKey)('test', 'nitro', 'mpcv1') },
|
|
87
|
+
}),
|
|
88
|
+
};
|
|
89
|
+
getKeychainStub = sinon.stub().resolves({ id: 'user-key-id', type: 'tss', commonKeychain });
|
|
90
|
+
mockBaseCoin = {
|
|
91
|
+
supportsTss: sinon.stub().returns(true),
|
|
92
|
+
getFamily: sinon.stub().returns('sol'),
|
|
93
|
+
getMPCAlgorithm: sinon.stub().returns('eddsa'),
|
|
94
|
+
keychains: sinon.stub().returns({ get: getKeychainStub }),
|
|
95
|
+
url: sinon.stub().returns('/api/v2/sol/wallet/test-wallet-id'),
|
|
96
|
+
};
|
|
97
|
+
walletData = {
|
|
98
|
+
id: 'test-wallet-id',
|
|
99
|
+
keys: ['user-key-id', 'backup-key-id', 'bitgo-key-id'],
|
|
100
|
+
multisigType: 'tss',
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
afterEach(function () {
|
|
104
|
+
sinon.restore();
|
|
105
|
+
});
|
|
106
|
+
/**
|
|
107
|
+
* Builds the wallet under test from the sinon stand-ins. The casts are safe because the
|
|
108
|
+
* Wallet constructor and verifyKey only touch the members stubbed above.
|
|
109
|
+
*/
|
|
110
|
+
function buildWallet() {
|
|
111
|
+
return new wallet_1.Wallet(mockBitGo, mockBaseCoin, walletData);
|
|
112
|
+
}
|
|
113
|
+
it('returns match true for user signing material that belongs to the wallet', async function () {
|
|
114
|
+
const wallet = buildWallet();
|
|
115
|
+
const result = await wallet.verifyKey({ prv: matchingPrv });
|
|
116
|
+
assert.deepStrictEqual(result, { match: true });
|
|
117
|
+
sinon.assert.calledOnce(getKeychainStub);
|
|
118
|
+
assert.strictEqual(getKeychainStub.firstCall.args[0].id, walletData.keys[0]);
|
|
119
|
+
});
|
|
120
|
+
it('forwards the request tracer to the keychain fetch', async function () {
|
|
121
|
+
const wallet = buildWallet();
|
|
122
|
+
const reqId = new util_1.RequestTracer();
|
|
123
|
+
const result = await wallet.verifyKey({ prv: matchingPrv, reqId });
|
|
124
|
+
assert.deepStrictEqual(result, { match: true });
|
|
125
|
+
sinon.assert.calledOnce(getKeychainStub);
|
|
126
|
+
assert.strictEqual(getKeychainStub.firstCall.args[0].reqId, reqId);
|
|
127
|
+
});
|
|
128
|
+
it('returns match false for user signing material from a different key generation', async function () {
|
|
129
|
+
const wallet = buildWallet();
|
|
130
|
+
const result = await wallet.verifyKey({ prv: otherPrv });
|
|
131
|
+
assert.deepStrictEqual(result, { match: false });
|
|
132
|
+
sinon.assert.calledOnce(getKeychainStub);
|
|
133
|
+
});
|
|
134
|
+
it('rejects on-chain multisig wallets without fetching the keychain', async function () {
|
|
135
|
+
walletData.multisigType = 'onchain';
|
|
136
|
+
const wallet = buildWallet();
|
|
137
|
+
await assert.rejects(wallet.verifyKey({ prv: matchingPrv }), { message: UNSUPPORTED_WALLET_MESSAGE });
|
|
138
|
+
sinon.assert.notCalled(getKeychainStub);
|
|
139
|
+
});
|
|
140
|
+
it('rejects TSS EdDSA MPCv2 wallets without fetching the keychain', async function () {
|
|
141
|
+
walletData.multisigTypeVersion = 'MPCv2';
|
|
142
|
+
const wallet = buildWallet();
|
|
143
|
+
await assert.rejects(wallet.verifyKey({ prv: matchingPrv }), { message: UNSUPPORTED_WALLET_MESSAGE });
|
|
144
|
+
sinon.assert.notCalled(getKeychainStub);
|
|
145
|
+
});
|
|
146
|
+
it('rejects TSS ECDSA wallets without fetching the keychain', async function () {
|
|
147
|
+
mockBaseCoin.getMPCAlgorithm.returns('ecdsa');
|
|
148
|
+
const wallet = buildWallet();
|
|
149
|
+
await assert.rejects(wallet.verifyKey({ prv: matchingPrv }), { message: UNSUPPORTED_WALLET_MESSAGE });
|
|
150
|
+
sinon.assert.notCalled(getKeychainStub);
|
|
151
|
+
});
|
|
152
|
+
it('rejects when the user keychain has no commonKeychain', async function () {
|
|
153
|
+
getKeychainStub.resolves({ id: 'user-key-id', type: 'tss' });
|
|
154
|
+
const wallet = buildWallet();
|
|
155
|
+
await assert.rejects(wallet.verifyKey({ prv: matchingPrv }), {
|
|
156
|
+
message: 'wallet keychain is missing commonKeychain',
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0VmVyaWZ5S2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRWZXJpZnlLZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixnRUFBNkQ7QUFDN0Qsb0RBQXdEO0FBQ3hELDhFQUF3RDtBQUd4RCx5RUFBOEU7QUFDOUUsMkRBQWlFO0FBRWpFLE1BQU0sMEJBQTBCLEdBQUcsd0RBQXdELENBQUM7QUFFNUYsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLElBQUksY0FBc0IsQ0FBQztJQUMzQixJQUFJLFdBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFnQixDQUFDO0lBRXJCLE1BQU0sQ0FBQyxLQUFLO1FBQ1YsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQ0FBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyRCxNQUFNLEdBQUcsR0FBRyxNQUFNLGFBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0MsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsT0FBTyxD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MUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSztRQUNqRSxZQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUU3QixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUN0RyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLO1FBQzlELGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBRTdCLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7WUFDM0QsT0FBTyxFQUFFLDJDQUEyQztTQUNyRCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L3dhbGxldCc7XG5pbXBvcnQgeyBFZDI1NTE5QmlwMzJIZFRyZWUgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEVkZHNhIGZyb20gJy4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9tcGMvdHNzJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2Jhc2VDb2luJztcbmltcG9ydCB7IGdldEJpdGdvTXBjR3BnUHViS2V5IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3Rzcy9iaXRnb1B1YktleXMnO1xuaW1wb3J0IHsgUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy91dGlsJztcblxuY29uc3QgVU5TVVBQT1JURURfV0FMTEVUX01FU1NBR0UgPSAnS2V5IHZlcmlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCB0eXBlJztcblxuZGVzY3JpYmUoJ1dhbGxldC52ZXJpZnlLZXknLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBjb21tb25LZXljaGFpbjogc3RyaW5nO1xuICBsZXQgbWF0Y2hpbmdQcnY6IHN0cmluZztcbiAgbGV0IG90aGVyUHJ2OiBzdHJpbmc7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBoZFRyZWUgPSBhd2FpdCBFZDI1NTE5QmlwMzJIZFRyZWUuaW5pdGlhbGl6ZSgpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoaGRUcmVlKTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBiYWNrdXBLZXlTaGFyZSA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzKTtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuICAgIGNvbnN0IGNvbWJpbmVkID0gTVBDLmtleUNvbWJpbmUodXNlcktleVNoYXJlLnVTaGFyZSwgW2JhY2t1cEtleVNoYXJlLnlTaGFyZXNbMV0sIGJpdGdvS2V5U2hhcmUueVNoYXJlc1sxXV0pO1xuICAgIGNvbW1vbktleWNoYWluID0gY29tYmluZWQucFNoYXJlLnkgKyBjb21iaW5lZC5wU2hhcmUuY2hhaW5jb2RlO1xuICAgIG1hdGNoaW5nUHJ2ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdVNoYXJlOiB1c2VyS2V5U2hhcmUudVNoYXJlLFxuICAgICAgYml0Z29ZU2hhcmU6IGJpdGdvS2V5U2hhcmUueVNoYXJlc1sxXSxcbiAgICAgIGJhY2t1cFlTaGFyZTogYmFja3VwS2V5U2hhcmUueVNoYXJlc1sxXSxcbiAgICB9KTtcblxuICAgIC8vIGFuIGluZGVwZW5kZW50IGtleSBnZW5lcmF0aW9uIGZvciB0aGUgbmVnYXRpdmUgY2FzZVxuICAgIGNvbnN0IG90aGVyVXNlcktleVNoYXJlID0gTVBDLmtleVNoYXJlKDEsIDIsIDMpO1xuICAgIGNvbnN0IG90aGVyQmFja3VwS2V5U2hhcmUgPSBNUEMua2V5U2hhcmUoMiwgMiwgMyk7XG4gICAgY29uc3Qgb3RoZXJCaXRnb0tleVNoYXJlID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuICAgIG90aGVyUHJ2ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdVNoYXJlOiBvdGhlclVzZXJLZXlTaGFyZS51U2hhcmUsXG4gICAgICBiaXRnb1lTaGFyZTogb3RoZXJCaXRnb0tleVNoYXJlLnlTaGFyZXNbMV0sXG4gICAgICBiYWNrdXBZU2hhcmU6IG90aGVyQmFja3VwS2V5U2hhcmUueVNoYXJlc1sxXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgbGV0IG1vY2tCaXRHbzogeyBwb3N0OiBzaW5vbi5TaW5vblN0dWI7IHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLlNpbm9uU3R1YjsgZmV0Y2hDb25zdGFudHM6IHNpbm9uLlNpbm9uU3R1YiB9O1xuICBsZXQgbW9ja0Jhc2VDb2luOiB7XG4gICAgc3VwcG9ydHNUc3M6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBnZXRGYW1pbHk6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBrZXljaGFpbnM6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICB1cmw6IHNpbm9uLlNpbm9uU3R1YjtcbiAgfTtcbiAgbGV0IHdhbGxldERhdGE6IHsgaWQ6IHN0cmluZzsga2V5czogc3RyaW5nW107IG11bHRpc2lnVHlwZTogc3RyaW5nOyBtdWx0aXNpZ1R5cGVWZXJzaW9uPzogc3RyaW5nIH07XG4gIGxldCBnZXRLZXljaGFpblN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgICAvLyB0aGUgTVBDdjIvRUNEU0EgdXRpbHMgY29uc3RydWN0b3JzIGNhbGwgc2V0Qml0Z29HcGdQdWJLZXksIHdoaWNoIGZldGNoZXMgY29uc3RhbnRzO1xuICAgICAgLy8gc3R1YmJpbmcgaXQgYXZvaWRzIGEgc3dhbGxvd2VkIHVuaGFuZGxlZCByZWplY3Rpb24gaW4gdGhvc2UgdGVzdHNcbiAgICAgIGZldGNoQ29uc3RhbnRzOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBtcGM6IHsgYml0Z29QdWJsaWNLZXk6IGdldEJpdGdvTXBjR3BnUHViS2V5KCd0ZXN0JywgJ25pdHJvJywgJ21wY3YxJykgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBnZXRLZXljaGFpblN0dWIgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ3VzZXIta2V5LWlkJywgdHlwZTogJ3RzcycsIGNvbW1vbktleWNoYWluIH0pO1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHRydWUpLFxuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnc29sJyksXG4gICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlZGRzYScpLFxuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IGdldDogZ2V0S2V5Y2hhaW5TdHViIH0pLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL2FwaS92Mi9zb2wvd2FsbGV0L3Rlc3Qtd2FsbGV0LWlkJyksXG4gICAgfTtcblxuICAgIHdhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgIGtleXM6IFsndXNlci1rZXktaWQnLCAnYmFja3VwLWtleS1pZCcsICdiaXRnby1rZXktaWQnXSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgfTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHdhbGxldCB1bmRlciB0ZXN0IGZyb20gdGhlIHNpbm9uIHN0YW5kLWlucy4gVGhlIGNhc3RzIGFyZSBzYWZlIGJlY2F1c2UgdGhlXG4gICAqIFdhbGxldCBjb25zdHJ1Y3RvciBhbmQgdmVyaWZ5S2V5IG9ubHkgdG91Y2ggdGhlIG1lbWJlcnMgc3R1YmJlZCBhYm92ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJ1aWxkV2FsbGV0KCk6IFdhbGxldCB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQobW9ja0JpdEdvIGFzIHVua25vd24gYXMgQml0R29CYXNlLCBtb2NrQmFzZUNvaW4gYXMgdW5rbm93biBhcyBJQmFzZUNvaW4sIHdhbGxldERhdGEpO1xuICB9XG5cbiAgaXQoJ3JldHVybnMgbWF0Y2ggdHJ1ZSBmb3IgdXNlciBzaWduaW5nIG1hdGVyaWFsIHRoYXQgYmVsb25ncyB0byB0aGUgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHdhbGxldCA9IGJ1aWxkV2FsbGV0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQudmVyaWZ5S2V5KHsgcHJ2OiBtYXRjaGluZ1BydiB9KTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0LCB7IG1hdGNoOiB0cnVlIH0pO1xuICAgIHNpbm9uLmFzc2VydC5jYWxsZWRPbmNlKGdldEtleWNoYWluU3R1Yik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldEtleWNoYWluU3R1Yi5maXJzdENhbGwuYXJnc1swXS5pZCwgd2FsbGV0RGF0YS5rZXlzWzBdKTtcbiAgfSk7XG5cbiAgaXQoJ2ZvcndhcmRzIHRoZSByZXF1ZXN0IHRyYWNlciB0byB0aGUga2V5Y2hhaW4gZmV0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2FsbGV0ID0gYnVpbGRXYWxsZXQoKTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQudmVyaWZ5S2V5KHsgcHJ2OiBtYXRjaGluZ1BydiwgcmVxSWQgfSk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdCwgeyBtYXRjaDogdHJ1ZSB9KTtcbiAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShnZXRLZXljaGFpblN0dWIpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRLZXljaGFpblN0dWIuZmlyc3RDYWxsLmFyZ3NbMF0ucmVxSWQsIHJlcUlkKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgbWF0Y2ggZmFsc2UgZm9yIHVzZXIgc2lnbmluZyBtYXRlcmlhbCBmcm9tIGEgZGlmZmVyZW50IGtleSBnZW5lcmF0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHdhbGxldCA9IGJ1aWxkV2FsbGV0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQudmVyaWZ5S2V5KHsgcHJ2OiBvdGhlclBydiB9KTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0LCB7IG1hdGNoOiBmYWxzZSB9KTtcbiAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShnZXRLZXljaGFpblN0dWIpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBvbi1jaGFpbiBtdWx0aXNpZyB3YWxsZXRzIHdpdGhvdXQgZmV0Y2hpbmcgdGhlIGtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHdhbGxldERhdGEubXVsdGlzaWdUeXBlID0gJ29uY2hhaW4nO1xuICAgIGNvbnN0IHdhbGxldCA9IGJ1aWxkV2FsbGV0KCk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh3YWxsZXQudmVyaWZ5S2V5KHsgcHJ2OiBtYXRjaGluZ1BydiB9KSwgeyBtZXNzYWdlOiBVTlNVUFBPUlRFRF9XQUxMRVRfTUVTU0FHRSB9KTtcbiAgICBzaW5vbi5hc3NlcnQubm90Q2FsbGVkKGdldEtleWNoYWluU3R1Yik7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIFRTUyBFZERTQSBNUEN2MiB3YWxsZXRzIHdpdGhvdXQgZmV0Y2hpbmcgdGhlIGtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHdhbGxldERhdGEubXVsdGlzaWdUeXBlVmVyc2lvbiA9ICdNUEN2Mic7XG4gICAgY29uc3Qgd2FsbGV0ID0gYnVpbGRXYWxsZXQoKTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKHdhbGxldC52ZXJpZnlLZXkoeyBwcnY6IG1hdGNoaW5nUHJ2IH0pLCB7IG1lc3NhZ2U6IFVOU1VQUE9SVEVEX1dBTExFVF9NRVNTQUdFIH0pO1xuICAgIHNpbm9uLmFzc2VydC5ub3RDYWxsZWQoZ2V0S2V5Y2hhaW5TdHViKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgVFNTIEVDRFNBIHdhbGxldHMgd2l0aG91dCBmZXRjaGluZyB0aGUga2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0Jhc2VDb2luLmdldE1QQ0FsZ29yaXRobS5yZXR1cm5zKCdlY2RzYScpO1xuICAgIGNvbnN0IHdhbGxldCA9IGJ1aWxkV2FsbGV0KCk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh3YWxsZXQudmVyaWZ5S2V5KHsgcHJ2OiBtYXRjaGluZ1BydiB9KSwgeyBtZXNzYWdlOiBVTlNVUFBPUlRFRF9XQUxMRVRfTUVTU0FHRSB9KTtcbiAgICBzaW5vbi5hc3NlcnQubm90Q2FsbGVkKGdldEtleWNoYWluU3R1Yik7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHdoZW4gdGhlIHVzZXIga2V5Y2hhaW4gaGFzIG5vIGNvbW1vbktleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGdldEtleWNoYWluU3R1Yi5yZXNvbHZlcyh7IGlkOiAndXNlci1rZXktaWQnLCB0eXBlOiAndHNzJyB9KTtcbiAgICBjb25zdCB3YWxsZXQgPSBidWlsZFdhbGxldCgpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMod2FsbGV0LnZlcmlmeUtleSh7IHBydjogbWF0Y2hpbmdQcnYgfSksIHtcbiAgICAgIG1lc3NhZ2U6ICd3YWxsZXQga2V5Y2hhaW4gaXMgbWlzc2luZyBjb21tb25LZXljaGFpbicsXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|