@bitgo-beta/key-card 0.1.2-alpha.49 → 0.1.2-alpha.490
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/drawKeycard.d.ts +3 -10
- package/dist/src/drawKeycard.d.ts.map +1 -1
- package/dist/src/drawKeycard.js +189 -43
- package/dist/src/extractKeycardFromPDF.d.ts +16 -0
- package/dist/src/extractKeycardFromPDF.d.ts.map +1 -0
- package/dist/src/extractKeycardFromPDF.js +77 -0
- package/dist/src/faq.d.ts +2 -4
- package/dist/src/faq.d.ts.map +1 -1
- package/dist/src/faq.js +16 -3
- package/dist/src/generateParamsForKeyCreation.d.ts +3 -0
- package/dist/src/generateParamsForKeyCreation.d.ts.map +1 -0
- package/dist/src/generateParamsForKeyCreation.js +72 -0
- package/dist/src/generateQrData.d.ts +9 -27
- package/dist/src/generateQrData.d.ts.map +1 -1
- package/dist/src/generateQrData.js +167 -21
- package/dist/src/index.d.ts +13 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +63 -9
- package/dist/src/parseKeycard.d.ts +32 -0
- package/dist/src/parseKeycard.d.ts.map +1 -0
- package/dist/src/parseKeycard.js +223 -0
- package/dist/src/types.d.ts +90 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +9 -0
- package/dist/src/upgradeWalletEncryption.d.ts +27 -0
- package/dist/src/upgradeWalletEncryption.d.ts.map +1 -0
- package/dist/src/upgradeWalletEncryption.js +107 -0
- package/dist/src/utils.js +2 -3
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -6
package/dist/src/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
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);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -10,20 +14,70 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
10
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
15
|
};
|
|
12
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.generateKeycard =
|
|
17
|
+
exports.generateKeycard = generateKeycard;
|
|
18
|
+
exports.generateLightningKeycard = generateLightningKeycard;
|
|
19
|
+
exports.generateSafeKeycard = generateSafeKeycard;
|
|
14
20
|
const generateQrData_1 = require("./generateQrData");
|
|
15
21
|
const faq_1 = require("./faq");
|
|
16
22
|
const drawKeycard_1 = require("./drawKeycard");
|
|
23
|
+
const generateParamsForKeyCreation_1 = require("./generateParamsForKeyCreation");
|
|
17
24
|
__exportStar(require("./drawKeycard"), exports);
|
|
25
|
+
__exportStar(require("./extractKeycardFromPDF"), exports);
|
|
18
26
|
__exportStar(require("./faq"), exports);
|
|
19
27
|
__exportStar(require("./generateQrData"), exports);
|
|
28
|
+
__exportStar(require("./parseKeycard"), exports);
|
|
29
|
+
__exportStar(require("./upgradeWalletEncryption"), exports);
|
|
20
30
|
__exportStar(require("./utils"), exports);
|
|
31
|
+
__exportStar(require("./types"), exports);
|
|
21
32
|
async function generateKeycard(params) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
33
|
+
if ('userAuthKeychain' in params) {
|
|
34
|
+
const questions = (0, faq_1.generateLightningFaq)(params.coin.fullName);
|
|
35
|
+
const qrData = await (0, generateQrData_1.generateLightningQrData)(params);
|
|
36
|
+
const keycard = await (0, drawKeycard_1.drawKeycard)({ ...params, questions, qrData });
|
|
37
|
+
const label = params.walletLabel || params.coin.fullName;
|
|
38
|
+
keycard.save(`BitGo Keycard for ${label}.pdf`);
|
|
39
|
+
}
|
|
40
|
+
else if ('coin' in params) {
|
|
41
|
+
const questions = (0, faq_1.generateFaq)(params.coin.fullName);
|
|
42
|
+
const qrData = await (0, generateQrData_1.generateQrData)(params);
|
|
43
|
+
const keycard = await (0, drawKeycard_1.drawKeycard)({ ...params, questions, qrData });
|
|
44
|
+
const label = params.walletLabel || params.coin.fullName;
|
|
45
|
+
keycard.save(`BitGo Keycard for ${label}.pdf`);
|
|
46
|
+
}
|
|
47
|
+
else if ('curve' in params) {
|
|
48
|
+
const data = (0, generateParamsForKeyCreation_1.generateParamsForKeyCreation)(params);
|
|
49
|
+
const keycard = await (0, drawKeycard_1.drawKeycard)(data);
|
|
50
|
+
const label = params.walletLabel || params.curve;
|
|
51
|
+
keycard.save(`BitGo Keycard for ${label}.pdf`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw new Error('Either curve or coin must be provided');
|
|
55
|
+
}
|
|
27
56
|
}
|
|
28
|
-
|
|
29
|
-
|
|
57
|
+
async function generateLightningKeycard(params) {
|
|
58
|
+
const questions = (0, faq_1.generateLightningFaq)(params.coin.fullName);
|
|
59
|
+
const qrData = await (0, generateQrData_1.generateLightningQrData)(params);
|
|
60
|
+
const keycard = await (0, drawKeycard_1.drawKeycard)({ ...params, questions, qrData });
|
|
61
|
+
const label = params.walletLabel || params.coin.fullName;
|
|
62
|
+
keycard.save(`BitGo Keycard for ${label}.pdf`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generates a safe keycard using the existing 4-box layout: boxes A/B/C each carry a JSON
|
|
66
|
+
* object of the four roots (see {@link generateSafeQrData}), rendered through the same
|
|
67
|
+
* {@link drawKeycard} path as a wallet. Generated as part of safe creation, once all four
|
|
68
|
+
* root triplets exist.
|
|
69
|
+
*/
|
|
70
|
+
async function generateSafeKeycard(params) {
|
|
71
|
+
const questions = (0, faq_1.generateFaq)(params.coin.fullName);
|
|
72
|
+
const qrData = await (0, generateQrData_1.generateSafeQrData)(params);
|
|
73
|
+
const keycard = await (0, drawKeycard_1.drawKeycard)({
|
|
74
|
+
...params,
|
|
75
|
+
questions,
|
|
76
|
+
qrData,
|
|
77
|
+
pageBreakBeforeIndices: [1, 2],
|
|
78
|
+
useQrPartHeaders: true,
|
|
79
|
+
});
|
|
80
|
+
const label = params.walletLabel || params.coin.fullName;
|
|
81
|
+
keycard.save(`BitGo Keycard for ${label}.pdf`);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSwwQ0FxQkM7QUFFRCw0REFRQztBQVFELGtEQVlDO0FBdkVELHFEQUErRjtBQUMvRiwrQkFBMEQ7QUFDMUQsK0NBQTRDO0FBQzVDLGlGQUE4RTtBQVE5RSxnREFBOEI7QUFDOUIsMERBQXdDO0FBQ3hDLHdDQUFzQjtBQUN0QixtREFBaUM7QUFDakMsaURBQStCO0FBQy9CLDREQUEwQztBQUMxQywwQ0FBd0I7QUFDeEIsMENBQXdCO0FBRWpCLEtBQUssVUFBVSxlQUFlLENBQUMsTUFBNkI7SUFDakUsSUFBSSxrQkFBa0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFNBQVMsR0FBRyxJQUFBLDBCQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLHdDQUF1QixFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSx5QkFBVyxFQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDcEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7U0FBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFBLGlCQUFXLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsK0JBQWMsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEseUJBQVcsRUFBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO1NBQU0sSUFBSSxPQUFPLElBQUksTUFBTSxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBQSwyREFBNEIsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEseUJBQVcsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsTUFBZ0U7SUFFaEUsTUFBTSxTQUFTLEdBQUcsSUFBQSwwQkFBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSx3Q0FBdUIsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEseUJBQVcsRUFBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxNQUFNLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsbUJBQW1CLENBQUMsTUFBMkQ7SUFDbkcsTUFBTSxTQUFTLEdBQUcsSUFBQSxpQkFBVyxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1DQUFrQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSx5QkFBVyxFQUFDO1FBQ2hDLEdBQUcsTUFBTTtRQUNULFNBQVM7UUFDVCxNQUFNO1FBQ04sc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLGdCQUFnQixFQUFFLElBQUk7S0FDdkIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZW5lcmF0ZUxpZ2h0bmluZ1FyRGF0YSwgZ2VuZXJhdGVRckRhdGEsIGdlbmVyYXRlU2FmZVFyRGF0YSB9IGZyb20gJy4vZ2VuZXJhdGVRckRhdGEnO1xuaW1wb3J0IHsgZ2VuZXJhdGVGYXEsIGdlbmVyYXRlTGlnaHRuaW5nRmFxIH0gZnJvbSAnLi9mYXEnO1xuaW1wb3J0IHsgZHJhd0tleWNhcmQgfSBmcm9tICcuL2RyYXdLZXljYXJkJztcbmltcG9ydCB7IGdlbmVyYXRlUGFyYW1zRm9yS2V5Q3JlYXRpb24gfSBmcm9tICcuL2dlbmVyYXRlUGFyYW1zRm9yS2V5Q3JlYXRpb24nO1xuaW1wb3J0IHtcbiAgR2VuZXJhdGVLZXljYXJkUGFyYW1zLFxuICBHZW5lcmF0ZUxpZ2h0bmluZ1FyRGF0YVBhcmFtcyxcbiAgR2VuZXJhdGVRckRhdGFCYXNlUGFyYW1zLFxuICBHZW5lcmF0ZVNhZmVRckRhdGFQYXJhbXMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2RyYXdLZXljYXJkJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdEtleWNhcmRGcm9tUERGJztcbmV4cG9ydCAqIGZyb20gJy4vZmFxJztcbmV4cG9ydCAqIGZyb20gJy4vZ2VuZXJhdGVRckRhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXJzZUtleWNhcmQnO1xuZXhwb3J0ICogZnJvbSAnLi91cGdyYWRlV2FsbGV0RW5jcnlwdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVLZXljYXJkKHBhcmFtczogR2VuZXJhdGVLZXljYXJkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICgndXNlckF1dGhLZXljaGFpbicgaW4gcGFyYW1zKSB7XG4gICAgY29uc3QgcXVlc3Rpb25zID0gZ2VuZXJhdGVMaWdodG5pbmdGYXEocGFyYW1zLmNvaW4uZnVsbE5hbWUpO1xuICAgIGNvbnN0IHFyRGF0YSA9IGF3YWl0IGdlbmVyYXRlTGlnaHRuaW5nUXJEYXRhKHBhcmFtcyk7XG4gICAgY29uc3Qga2V5Y2FyZCA9IGF3YWl0IGRyYXdLZXljYXJkKHsgLi4ucGFyYW1zLCBxdWVzdGlvbnMsIHFyRGF0YSB9KTtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmFtcy53YWxsZXRMYWJlbCB8fCBwYXJhbXMuY29pbi5mdWxsTmFtZTtcbiAgICBrZXljYXJkLnNhdmUoYEJpdEdvIEtleWNhcmQgZm9yICR7bGFiZWx9LnBkZmApO1xuICB9IGVsc2UgaWYgKCdjb2luJyBpbiBwYXJhbXMpIHtcbiAgICBjb25zdCBxdWVzdGlvbnMgPSBnZW5lcmF0ZUZhcShwYXJhbXMuY29pbi5mdWxsTmFtZSk7XG4gICAgY29uc3QgcXJEYXRhID0gYXdhaXQgZ2VuZXJhdGVRckRhdGEocGFyYW1zKTtcbiAgICBjb25zdCBrZXljYXJkID0gYXdhaXQgZHJhd0tleWNhcmQoeyAuLi5wYXJhbXMsIHF1ZXN0aW9ucywgcXJEYXRhIH0pO1xuICAgIGNvbnN0IGxhYmVsID0gcGFyYW1zLndhbGxldExhYmVsIHx8IHBhcmFtcy5jb2luLmZ1bGxOYW1lO1xuICAgIGtleWNhcmQuc2F2ZShgQml0R28gS2V5Y2FyZCBmb3IgJHtsYWJlbH0ucGRmYCk7XG4gIH0gZWxzZSBpZiAoJ2N1cnZlJyBpbiBwYXJhbXMpIHtcbiAgICBjb25zdCBkYXRhID0gZ2VuZXJhdGVQYXJhbXNGb3JLZXlDcmVhdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IGtleWNhcmQgPSBhd2FpdCBkcmF3S2V5Y2FyZChkYXRhKTtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmFtcy53YWxsZXRMYWJlbCB8fCBwYXJhbXMuY3VydmU7XG4gICAga2V5Y2FyZC5zYXZlKGBCaXRHbyBLZXljYXJkIGZvciAke2xhYmVsfS5wZGZgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciBjdXJ2ZSBvciBjb2luIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWdodG5pbmdLZXljYXJkKFxuICBwYXJhbXM6IEdlbmVyYXRlUXJEYXRhQmFzZVBhcmFtcyAmIEdlbmVyYXRlTGlnaHRuaW5nUXJEYXRhUGFyYW1zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcXVlc3Rpb25zID0gZ2VuZXJhdGVMaWdodG5pbmdGYXEocGFyYW1zLmNvaW4uZnVsbE5hbWUpO1xuICBjb25zdCBxckRhdGEgPSBhd2FpdCBnZW5lcmF0ZUxpZ2h0bmluZ1FyRGF0YShwYXJhbXMpO1xuICBjb25zdCBrZXljYXJkID0gYXdhaXQgZHJhd0tleWNhcmQoeyAuLi5wYXJhbXMsIHF1ZXN0aW9ucywgcXJEYXRhIH0pO1xuICBjb25zdCBsYWJlbCA9IHBhcmFtcy53YWxsZXRMYWJlbCB8fCBwYXJhbXMuY29pbi5mdWxsTmFtZTtcbiAga2V5Y2FyZC5zYXZlKGBCaXRHbyBLZXljYXJkIGZvciAke2xhYmVsfS5wZGZgKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzYWZlIGtleWNhcmQgdXNpbmcgdGhlIGV4aXN0aW5nIDQtYm94IGxheW91dDogYm94ZXMgQS9CL0MgZWFjaCBjYXJyeSBhIEpTT05cbiAqIG9iamVjdCBvZiB0aGUgZm91ciByb290cyAoc2VlIHtAbGluayBnZW5lcmF0ZVNhZmVRckRhdGF9KSwgcmVuZGVyZWQgdGhyb3VnaCB0aGUgc2FtZVxuICoge0BsaW5rIGRyYXdLZXljYXJkfSBwYXRoIGFzIGEgd2FsbGV0LiBHZW5lcmF0ZWQgYXMgcGFydCBvZiBzYWZlIGNyZWF0aW9uLCBvbmNlIGFsbCBmb3VyXG4gKiByb290IHRyaXBsZXRzIGV4aXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTYWZlS2V5Y2FyZChwYXJhbXM6IEdlbmVyYXRlUXJEYXRhQmFzZVBhcmFtcyAmIEdlbmVyYXRlU2FmZVFyRGF0YVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBxdWVzdGlvbnMgPSBnZW5lcmF0ZUZhcShwYXJhbXMuY29pbi5mdWxsTmFtZSk7XG4gIGNvbnN0IHFyRGF0YSA9IGF3YWl0IGdlbmVyYXRlU2FmZVFyRGF0YShwYXJhbXMpO1xuICBjb25zdCBrZXljYXJkID0gYXdhaXQgZHJhd0tleWNhcmQoe1xuICAgIC4uLnBhcmFtcyxcbiAgICBxdWVzdGlvbnMsXG4gICAgcXJEYXRhLFxuICAgIHBhZ2VCcmVha0JlZm9yZUluZGljZXM6IFsxLCAyXSxcbiAgICB1c2VRclBhcnRIZWFkZXJzOiB0cnVlLFxuICB9KTtcbiAgY29uc3QgbGFiZWwgPSBwYXJhbXMud2FsbGV0TGFiZWwgfHwgcGFyYW1zLmNvaW4uZnVsbE5hbWU7XG4gIGtleWNhcmQuc2F2ZShgQml0R28gS2V5Y2FyZCBmb3IgJHtsYWJlbH0ucGRmYCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SafeKeycardRoots } from './types';
|
|
2
|
+
export type PDFTextNode = {
|
|
3
|
+
text: string;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
page: number;
|
|
7
|
+
width: number;
|
|
8
|
+
};
|
|
9
|
+
export type KeycardEntry = {
|
|
10
|
+
label: string;
|
|
11
|
+
value: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Parses a safe keycard box value — the JSON packed by `generateSafeQrData`, e.g.
|
|
15
|
+
* `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
|
|
16
|
+
* not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
|
|
17
|
+
* box value returned by {@link parseKeycardFromLines}, then decrypts each root value with the
|
|
18
|
+
* safe password.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseSafeKeycardBox(data: string): SafeKeycardRoots;
|
|
21
|
+
/**
|
|
22
|
+
* Reconstructs logical text lines from an unordered set of PDF text nodes.
|
|
23
|
+
*
|
|
24
|
+
* PDF text extraction returns individual positioned fragments. This function
|
|
25
|
+
* sorts them by page then Y-coordinate (top-to-bottom), groups fragments
|
|
26
|
+
* within PDF_LINE_Y_TOLERANCE points of each other onto the same line, and
|
|
27
|
+
* inserts a space between fragments that are separated by more than
|
|
28
|
+
* PDF_NODE_GAP_THRESHOLD points horizontally.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildLinesFromPDFNodes(nodes: PDFTextNode[]): string[];
|
|
31
|
+
export declare function parseKeycardFromLines(lines: string[]): KeycardEntry[];
|
|
32
|
+
//# sourceMappingURL=parseKeycard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseKeycard.d.ts","sourceRoot":"","sources":["../../src/parseKeycard.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAcF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAMlE;AA0CD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CA4DrE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAyErE"}
|
|
@@ -0,0 +1,223 @@
|
|
|
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.parseSafeKeycardBox = parseSafeKeycardBox;
|
|
37
|
+
exports.buildLinesFromPDFNodes = buildLinesFromPDFNodes;
|
|
38
|
+
exports.parseKeycardFromLines = parseKeycardFromLines;
|
|
39
|
+
const t = __importStar(require("io-ts"));
|
|
40
|
+
const Either_1 = require("fp-ts/Either");
|
|
41
|
+
const PathReporter_1 = require("io-ts/lib/PathReporter");
|
|
42
|
+
const io_ts_types_1 = require("io-ts-types");
|
|
43
|
+
// A safe keycard box is a JSON object mapping each rootKeyType to a string (per-root
|
|
44
|
+
// ciphertext for A/B, public key for C).
|
|
45
|
+
const SafeKeycardRootsCodec = t.type({
|
|
46
|
+
secp256k1Multisig: t.string,
|
|
47
|
+
ecdsaMpc: t.string,
|
|
48
|
+
eddsaMpc: t.string,
|
|
49
|
+
ed25519Multisig: t.string,
|
|
50
|
+
});
|
|
51
|
+
// Decodes a box's JSON string straight into the validated roots record.
|
|
52
|
+
const SafeKeycardBoxFromString = io_ts_types_1.JsonFromString.pipe(SafeKeycardRootsCodec);
|
|
53
|
+
/**
|
|
54
|
+
* Parses a safe keycard box value — the JSON packed by `generateSafeQrData`, e.g.
|
|
55
|
+
* `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
|
|
56
|
+
* not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
|
|
57
|
+
* box value returned by {@link parseKeycardFromLines}, then decrypts each root value with the
|
|
58
|
+
* safe password.
|
|
59
|
+
*/
|
|
60
|
+
function parseSafeKeycardBox(data) {
|
|
61
|
+
const decoded = SafeKeycardBoxFromString.decode(data);
|
|
62
|
+
if ((0, Either_1.isLeft)(decoded)) {
|
|
63
|
+
throw new Error(`parseSafeKeycardBox: ${PathReporter_1.PathReporter.report(decoded).join('; ')}`);
|
|
64
|
+
}
|
|
65
|
+
return decoded.right;
|
|
66
|
+
}
|
|
67
|
+
const sectionHeaderRegex = /^([A-D])\s*[:.)-]\s*(.+?)\s*$/i;
|
|
68
|
+
const dataLineRegex = /^data\s*:\s*(.*)$/i;
|
|
69
|
+
const faqHeaderRegex = /^BitGo\s+KeyCard\s+FAQ$/i;
|
|
70
|
+
// PDF coordinate tolerance in points. Nodes within this distance on the Y-axis
|
|
71
|
+
// are treated as belonging to the same line; nodes further apart are separate lines.
|
|
72
|
+
const PDF_LINE_Y_TOLERANCE = 2;
|
|
73
|
+
// Horizontal gap in points above which a space is inserted between adjacent nodes.
|
|
74
|
+
const PDF_NODE_GAP_THRESHOLD = 2;
|
|
75
|
+
function sanitizeText(input) {
|
|
76
|
+
return input.replace(/\s+/g, ' ').trim();
|
|
77
|
+
}
|
|
78
|
+
function normalizeSectionValue(rawValue) {
|
|
79
|
+
// Two-pass removal of "Part N" page-continuation labels:
|
|
80
|
+
// 1. Line filter: removes labels that appear as standalone lines.
|
|
81
|
+
// 2. Regex replace: removes labels embedded mid-line when
|
|
82
|
+
// buildLinesFromPDFNodes merges them with adjacent content at the same
|
|
83
|
+
// y-coordinate (e.g. "...X88bPart 2 lFPMd...").
|
|
84
|
+
// join('') intentionally uses no separator — section values are continuous
|
|
85
|
+
// strings (base64 / xpub) that wrap across PDF lines without spaces.
|
|
86
|
+
return rawValue
|
|
87
|
+
.split('\n')
|
|
88
|
+
.filter((line) => !/^Part\s+\d+$/i.test(line.trim()))
|
|
89
|
+
.join('')
|
|
90
|
+
.replace(/\s*Part\s+\d+\s*/gi, '')
|
|
91
|
+
.trim();
|
|
92
|
+
}
|
|
93
|
+
function countChar(input, char) {
|
|
94
|
+
return input.split(char).length - 1;
|
|
95
|
+
}
|
|
96
|
+
function isEncryptedWalletPasswordSectionTitle(title) {
|
|
97
|
+
const normalized = title.toLowerCase();
|
|
98
|
+
// Box D is titled "Encrypted Wallet Password" (wallet) or "Encrypted Safe Password" (safe).
|
|
99
|
+
return normalized.includes('encrypted wallet password') || normalized.includes('encrypted safe password');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Reconstructs logical text lines from an unordered set of PDF text nodes.
|
|
103
|
+
*
|
|
104
|
+
* PDF text extraction returns individual positioned fragments. This function
|
|
105
|
+
* sorts them by page then Y-coordinate (top-to-bottom), groups fragments
|
|
106
|
+
* within PDF_LINE_Y_TOLERANCE points of each other onto the same line, and
|
|
107
|
+
* inserts a space between fragments that are separated by more than
|
|
108
|
+
* PDF_NODE_GAP_THRESHOLD points horizontally.
|
|
109
|
+
*/
|
|
110
|
+
function buildLinesFromPDFNodes(nodes) {
|
|
111
|
+
const sortedNodes = [...nodes].sort((a, b) => {
|
|
112
|
+
if (a.page !== b.page) {
|
|
113
|
+
return a.page - b.page;
|
|
114
|
+
}
|
|
115
|
+
const yDiff = Math.abs(a.y - b.y);
|
|
116
|
+
if (yDiff > PDF_LINE_Y_TOLERANCE) {
|
|
117
|
+
return b.y - a.y;
|
|
118
|
+
}
|
|
119
|
+
return a.x - b.x;
|
|
120
|
+
});
|
|
121
|
+
const lines = [];
|
|
122
|
+
let currentLineNodes = [];
|
|
123
|
+
let currentPage = -1;
|
|
124
|
+
let currentY = Number.NaN;
|
|
125
|
+
function flushLine() {
|
|
126
|
+
if (currentLineNodes.length === 0) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const sortedLineNodes = [...currentLineNodes].sort((a, b) => a.x - b.x);
|
|
130
|
+
let line = '';
|
|
131
|
+
let previousRightEdge = null;
|
|
132
|
+
for (const node of sortedLineNodes) {
|
|
133
|
+
const piece = sanitizeText(node.text);
|
|
134
|
+
if (!piece) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (previousRightEdge !== null && node.x - previousRightEdge > PDF_NODE_GAP_THRESHOLD) {
|
|
138
|
+
line += ' ';
|
|
139
|
+
}
|
|
140
|
+
line += piece;
|
|
141
|
+
previousRightEdge = node.x + node.width;
|
|
142
|
+
}
|
|
143
|
+
const normalizedLine = line.trim();
|
|
144
|
+
if (normalizedLine) {
|
|
145
|
+
lines.push(normalizedLine);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const node of sortedNodes) {
|
|
149
|
+
const pageChanged = node.page !== currentPage;
|
|
150
|
+
const lineChanged = Number.isNaN(currentY) || Math.abs(node.y - currentY) > PDF_LINE_Y_TOLERANCE;
|
|
151
|
+
if (pageChanged || lineChanged) {
|
|
152
|
+
flushLine();
|
|
153
|
+
currentLineNodes = [node];
|
|
154
|
+
currentPage = node.page;
|
|
155
|
+
currentY = node.y;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
currentLineNodes.push(node);
|
|
159
|
+
}
|
|
160
|
+
flushLine();
|
|
161
|
+
return lines;
|
|
162
|
+
}
|
|
163
|
+
function parseKeycardFromLines(lines) {
|
|
164
|
+
const sections = [];
|
|
165
|
+
let currentSectionIndex = -1;
|
|
166
|
+
for (const line of lines) {
|
|
167
|
+
const labelMatch = line.match(sectionHeaderRegex);
|
|
168
|
+
if (labelMatch) {
|
|
169
|
+
const section = labelMatch[1]?.toUpperCase();
|
|
170
|
+
const title = sanitizeText(labelMatch[2] ?? '');
|
|
171
|
+
if (section && title) {
|
|
172
|
+
sections.push({
|
|
173
|
+
section,
|
|
174
|
+
title,
|
|
175
|
+
values: [],
|
|
176
|
+
isCapturingData: false,
|
|
177
|
+
openCurlyCount: 0,
|
|
178
|
+
});
|
|
179
|
+
currentSectionIndex = sections.length - 1;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (currentSectionIndex < 0) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const currentSection = sections[currentSectionIndex];
|
|
187
|
+
if (!currentSection) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const dataLineMatch = line.match(dataLineRegex);
|
|
191
|
+
if (dataLineMatch) {
|
|
192
|
+
currentSection.isCapturingData = true;
|
|
193
|
+
const inlineValue = sanitizeText(dataLineMatch[1] ?? '');
|
|
194
|
+
if (inlineValue) {
|
|
195
|
+
currentSection.values.push(inlineValue);
|
|
196
|
+
currentSection.openCurlyCount += countChar(inlineValue, '{') - countChar(inlineValue, '}');
|
|
197
|
+
}
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (currentSection.isCapturingData) {
|
|
201
|
+
if (faqHeaderRegex.test(line)) {
|
|
202
|
+
currentSection.isCapturingData = false;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
currentSection.values.push(line);
|
|
206
|
+
// For encrypted wallet password, data is a single JSON object. Stop as
|
|
207
|
+
// soon as the object closes so footer/FAQ content is not appended.
|
|
208
|
+
if (isEncryptedWalletPasswordSectionTitle(currentSection.title)) {
|
|
209
|
+
currentSection.openCurlyCount += countChar(line, '{') - countChar(line, '}');
|
|
210
|
+
if (currentSection.values.length > 0 && currentSection.openCurlyCount <= 0) {
|
|
211
|
+
currentSection.isCapturingData = false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return sections
|
|
217
|
+
.filter(({ section, values }) => ['A', 'B', 'C', 'D'].includes(section) && values.length > 0)
|
|
218
|
+
.map(({ section, title, values }) => ({
|
|
219
|
+
label: `${section}: ${title}`,
|
|
220
|
+
value: normalizeSectionValue(values.join('\n')),
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VLZXljYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlS2V5Y2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNDQSxrREFNQztBQW1ERCx3REE0REM7QUFFRCxzREF5RUM7QUF0T0QseUNBQTJCO0FBQzNCLHlDQUFzQztBQUN0Qyx5REFBc0Q7QUFDdEQsNkNBQTZDO0FBZ0I3QyxxRkFBcUY7QUFDckYseUNBQXlDO0FBQ3pDLE1BQU0scUJBQXFCLEdBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDM0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ2xCLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNsQixlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU07Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsd0VBQXdFO0FBQ3hFLE1BQU0sd0JBQXdCLEdBQUcsNEJBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUU1RTs7Ozs7O0dBTUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUFZO0lBQzlDLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxJQUFJLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsMkJBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLGtCQUFrQixHQUFHLGdDQUFnQyxDQUFDO0FBQzVELE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDO0FB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QUM7SUFFRCxPQUFPLFFBQVE7U0FDWixNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDNUYsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssRUFBRSxHQUFHLE9BQU8sS0FBSyxLQUFLLEVBQUU7UUFDN0IsS0FBSyxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDaEQsQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgeyBpc0xlZnQgfSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0IHsgUGF0aFJlcG9ydGVyIH0gZnJvbSAnaW8tdHMvbGliL1BhdGhSZXBvcnRlcic7XG5pbXBvcnQgeyBKc29uRnJvbVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB7IFNhZmVLZXljYXJkUm9vdHMgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgUERGVGV4dE5vZGUgPSB7XG4gIHRleHQ6IHN0cmluZztcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHBhZ2U6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEtleWNhcmRFbnRyeSA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn07XG5cbi8vIEEgc2FmZSBrZXljYXJkIGJveCBpcyBhIEpTT04gb2JqZWN0IG1hcHBpbmcgZWFjaCByb290S2V5VHlwZSB0byBhIHN0cmluZyAocGVyLXJvb3Rcbi8vIGNpcGhlcnRleHQgZm9yIEEvQiwgcHVibGljIGtleSBmb3IgQykuXG5jb25zdCBTYWZlS2V5Y2FyZFJvb3RzQ29kZWM6IHQuVHlwZTxTYWZlS2V5Y2FyZFJvb3RzPiA9IHQudHlwZSh7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiB0LnN0cmluZyxcbiAgZWNkc2FNcGM6IHQuc3RyaW5nLFxuICBlZGRzYU1wYzogdC5zdHJpbmcsXG4gIGVkMjU1MTlNdWx0aXNpZzogdC5zdHJpbmcsXG59KTtcblxuLy8gRGVjb2RlcyBhIGJveCdzIEpTT04gc3RyaW5nIHN0cmFpZ2h0IGludG8gdGhlIHZhbGlkYXRlZCByb290cyByZWNvcmQuXG5jb25zdCBTYWZlS2V5Y2FyZEJveEZyb21TdHJpbmcgPSBKc29uRnJvbVN0cmluZy5waXBlKFNhZmVLZXljYXJkUm9vdHNDb2RlYyk7XG5cbi8qKlxuICogUGFyc2VzIGEgc2FmZSBrZXljYXJkIGJveCB2YWx1ZSDigJQgdGhlIEpTT04gcGFja2VkIGJ5IGBnZW5lcmF0ZVNhZmVRckRhdGFgLCBlLmcuXG4gKiBge1wic2VjcDI1NmsxTXVsdGlzaWdcIjpcIuKAplwiLFwiZWNkc2FNcGNcIjpcIuKAplwiLOKApn1gIOKAlCBpbnRvIGl0cyBmb3VyIHJvb3RzLiBUaHJvd3MgaWYgdGhlIHZhbHVlIGlzXG4gKiBub3QgdmFsaWQgSlNPTiBvciBhbnkgcm9vdCBpcyBtaXNzaW5nL25vbi1zdHJpbmcuIFJlY292ZXJ5IHRvb2xpbmcgY2FsbHMgdGhpcyBvbiB0aGUgQS9CL0NcbiAqIGJveCB2YWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgcGFyc2VLZXljYXJkRnJvbUxpbmVzfSwgdGhlbiBkZWNyeXB0cyBlYWNoIHJvb3QgdmFsdWUgd2l0aCB0aGVcbiAqIHNhZmUgcGFzc3dvcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhZmVLZXljYXJkQm94KGRhdGE6IHN0cmluZyk6IFNhZmVLZXljYXJkUm9vdHMge1xuICBjb25zdCBkZWNvZGVkID0gU2FmZUtleWNhcmRCb3hGcm9tU3RyaW5nLmRlY29kZShkYXRhKTtcbiAgaWYgKGlzTGVmdChkZWNvZGVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcGFyc2VTYWZlS2V5Y2FyZEJveDogJHtQYXRoUmVwb3J0ZXIucmVwb3J0KGRlY29kZWQpLmpvaW4oJzsgJyl9YCk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZWQucmlnaHQ7XG59XG5cbmNvbnN0IHNlY3Rpb25IZWFkZXJSZWdleCA9IC9eKFtBLURdKVxccypbOi4pLV1cXHMqKC4rPylcXHMqJC9pO1xuY29uc3QgZGF0YUxpbmVSZWdleCA9IC9eZGF0YVxccyo6XFxzKiguKikkL2k7XG5jb25zdCBmYXFIZWFkZXJSZWdleCA9IC9eQml0R29cXHMrS2V5Q2FyZFxccytGQVEkL2k7XG5cbi8vIFBERiBjb29yZGluYXRlIHRvbGVyYW5jZSBpbiBwb2ludHMuIE5vZGVzIHdpdGhpbiB0aGlzIGRpc3RhbmNlIG9uIHRoZSBZLWF4aXNcbi8vIGFyZSB0cmVhdGVkIGFzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBsaW5lOyBub2RlcyBmdXJ0aGVyIGFwYXJ0IGFyZSBzZXBhcmF0ZSBsaW5lcy5cbmNvbnN0IFBERl9MSU5FX1lfVE9MRVJBTkNFID0gMjtcbi8vIEhvcml6b250YWwgZ2FwIGluIHBvaW50cyBhYm92ZSB3aGljaCBhIHNwYWNlIGlzIGluc2VydGVkIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMuXG5jb25zdCBQREZfTk9ERV9HQVBfVEhSRVNIT0xEID0gMjtcblxuZnVuY3Rpb24gc2FuaXRpemVUZXh0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VjdGlvblZhbHVlKHJhd1ZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBUd28tcGFzcyByZW1vdmFsIG9mIFwiUGFydCBOXCIgcGFnZS1jb250aW51YXRpb24gbGFiZWxzOlxuICAvLyAxLiBMaW5lIGZpbHRlcjogcmVtb3ZlcyBsYWJlbHMgdGhhdCBhcHBlYXIgYXMgc3RhbmRhbG9uZSBsaW5lcy5cbiAgLy8gMi4gUmVnZXggcmVwbGFjZTogcmVtb3ZlcyBsYWJlbHMgZW1iZWRkZWQgbWlkLWxpbmUgd2hlblxuICAvLyAgICBidWlsZExpbmVzRnJvbVBERk5vZGVzIG1lcmdlcyB0aGVtIHdpdGggYWRqYWNlbnQgY29udGVudCBhdCB0aGUgc2FtZVxuICAvLyAgICB5LWNvb3JkaW5hdGUgKGUuZy4gXCIuLi5YODhiUGFydCAyIGxGUE1kLi4uXCIpLlxuICAvLyBqb2luKCcnKSBpbnRlbnRpb25hbGx5IHVzZXMgbm8gc2VwYXJhdG9yIOKAlCBzZWN0aW9uIHZhbHVlcyBhcmUgY29udGludW91c1xuICAvLyBzdHJpbmdzIChiYXNlNjQgLyB4cHViKSB0aGF0IHdyYXAgYWNyb3NzIFBERiBsaW5lcyB3aXRob3V0IHNwYWNlcy5cbiAgcmV0dXJuIHJhd1ZhbHVlXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvXlBhcnRcXHMrXFxkKyQvaS50ZXN0KGxpbmUudHJpbSgpKSlcbiAgICAuam9pbignJylcbiAgICAucmVwbGFjZSgvXFxzKlBhcnRcXHMrXFxkK1xccyovZ2ksICcnKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50Q2hhcihpbnB1dDogc3RyaW5nLCBjaGFyOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gaW5wdXQuc3BsaXQoY2hhcikubGVuZ3RoIC0gMTtcbn1cblxuZnVuY3Rpb24gaXNFbmNyeXB0ZWRXYWxsZXRQYXNzd29yZFNlY3Rpb25UaXRsZSh0aXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aXRsZS50b0xvd2VyQ2FzZSgpO1xuICAvLyBCb3ggRCBpcyB0aXRsZWQgXCJFbmNyeXB0ZWQgV2FsbGV0IFBhc3N3b3JkXCIgKHdhbGxldCkgb3IgXCJFbmNyeXB0ZWQgU2FmZSBQYXNzd29yZFwiIChzYWZlKS5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQuaW5jbHVkZXMoJ2VuY3J5cHRlZCB3YWxsZXQgcGFzc3dvcmQnKSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKCdlbmNyeXB0ZWQgc2FmZSBwYXNzd29yZCcpO1xufVxuXG4vKipcbiAqIFJlY29uc3RydWN0cyBsb2dpY2FsIHRleHQgbGluZXMgZnJvbSBhbiB1bm9yZGVyZWQgc2V0IG9mIFBERiB0ZXh0IG5vZGVzLlxuICpcbiAqIFBERiB0ZXh0IGV4dHJhY3Rpb24gcmV0dXJucyBpbmRpdmlkdWFsIHBvc2l0aW9uZWQgZnJhZ21lbnRzLiBUaGlzIGZ1bmN0aW9uXG4gKiBzb3J0cyB0aGVtIGJ5IHBhZ2UgdGhlbiBZLWNvb3JkaW5hdGUgKHRvcC10by1ib3R0b20pLCBncm91cHMgZnJhZ21lbnRzXG4gKiB3aXRoaW4gUERGX0xJTkVfWV9UT0xFUkFOQ0UgcG9pbnRzIG9mIGVhY2ggb3RoZXIgb250byB0aGUgc2FtZSBsaW5lLCBhbmRcbiAqIGluc2VydHMgYSBzcGFjZSBiZXR3ZWVuIGZyYWdtZW50cyB0aGF0IGFyZSBzZXBhcmF0ZWQgYnkgbW9yZSB0aGFuXG4gKiBQREZfTk9ERV9HQVBfVEhSRVNIT0xEIHBvaW50cyBob3Jpem9udGFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbmVzRnJvbVBERk5vZGVzKG5vZGVzOiBQREZUZXh0Tm9kZVtdKTogc3RyaW5nW10ge1xuICBjb25zdCBzb3J0ZWROb2RlcyA9IFsuLi5ub2Rlc10uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnBhZ2UgIT09IGIucGFnZSkge1xuICAgICAgcmV0dXJuIGEucGFnZSAtIGIucGFnZTtcbiAgICB9XG4gICAgY29uc3QgeURpZmYgPSBNYXRoLmFicyhhLnkgLSBiLnkpO1xuICAgIGlmICh5RGlmZiA+IFBERl9MSU5FX1lfVE9MRVJBTkNFKSB7XG4gICAgICByZXR1cm4gYi55IC0gYS55O1xuICAgIH1cbiAgICByZXR1cm4gYS54IC0gYi54O1xuICB9KTtcblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRMaW5lTm9kZXM6IFBERlRleHROb2RlW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRQYWdlID0gLTE7XG4gIGxldCBjdXJyZW50WSA9IE51bWJlci5OYU47XG5cbiAgZnVuY3Rpb24gZmx1c2hMaW5lKCkge1xuICAgIGlmIChjdXJyZW50TGluZU5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZExpbmVOb2RlcyA9IFsuLi5jdXJyZW50TGluZU5vZGVzXS5zb3J0KChhLCBiKSA9PiBhLnggLSBiLngpO1xuICAgIGxldCBsaW5lID0gJyc7XG4gICAgbGV0IHByZXZpb3VzUmlnaHRFZGdlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygc29ydGVkTGluZU5vZGVzKSB7XG4gICAgICBjb25zdCBwaWVjZSA9IHNhbml0aXplVGV4dChub2RlLnRleHQpO1xuICAgICAgaWYgKCFwaWVjZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXZpb3VzUmlnaHRFZGdlICE9PSBudWxsICYmIG5vZGUueCAtIHByZXZpb3VzUmlnaHRFZGdlID4gUERGX05PREVfR0FQX1RIUkVTSE9MRCkge1xuICAgICAgICBsaW5lICs9ICcgJztcbiAgICAgIH1cbiAgICAgIGxpbmUgKz0gcGllY2U7XG4gICAgICBwcmV2aW91c1JpZ2h0RWRnZSA9IG5vZGUueCArIG5vZGUud2lkdGg7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZExpbmUpIHtcbiAgICAgIGxpbmVzLnB1c2gobm9ybWFsaXplZExpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBzb3J0ZWROb2Rlcykge1xuICAgIGNvbnN0IHBhZ2VDaGFuZ2VkID0gbm9kZS5wYWdlICE9PSBjdXJyZW50UGFnZTtcbiAgICBjb25zdCBsaW5lQ2hhbmdlZCA9IE51bWJlci5pc05hTihjdXJyZW50WSkgfHwgTWF0aC5hYnMobm9kZS55IC0gY3VycmVudFkpID4gUERGX0xJTkVfWV9UT0xFUkFOQ0U7XG4gICAgaWYgKHBhZ2VDaGFuZ2VkIHx8IGxpbmVDaGFuZ2VkKSB7XG4gICAgICBmbHVzaExpbmUoKTtcbiAgICAgIGN1cnJlbnRMaW5lTm9kZXMgPSBbbm9kZV07XG4gICAgICBjdXJyZW50UGFnZSA9IG5vZGUucGFnZTtcbiAgICAgIGN1cnJlbnRZID0gbm9kZS55O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY3VycmVudExpbmVOb2Rlcy5wdXNoKG5vZGUpO1xuICB9XG5cbiAgZmx1c2hMaW5lKCk7XG4gIHJldHVybiBsaW5lcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlS2V5Y2FyZEZyb21MaW5lcyhsaW5lczogc3RyaW5nW10pOiBLZXljYXJkRW50cnlbXSB7XG4gIGNvbnN0IHNlY3Rpb25zOiBBcnJheTx7XG4gICAgc2VjdGlvbjogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgdmFsdWVzOiBzdHJpbmdbXTtcbiAgICBpc0NhcHR1cmluZ0RhdGE6IGJvb2xlYW47XG4gICAgb3BlbkN1cmx5Q291bnQ6IG51bWJlcjtcbiAgfT4gPSBbXTtcbiAgbGV0IGN1cnJlbnRTZWN0aW9uSW5kZXggPSAtMTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBsYWJlbE1hdGNoID0gbGluZS5tYXRjaChzZWN0aW9uSGVhZGVyUmVnZXgpO1xuICAgIGlmIChsYWJlbE1hdGNoKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbGFiZWxNYXRjaFsxXT8udG9VcHBlckNhc2UoKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gc2FuaXRpemVUZXh0KGxhYmVsTWF0Y2hbMl0gPz8gJycpO1xuICAgICAgaWYgKHNlY3Rpb24gJiYgdGl0bGUpIHtcbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICAgIGlzQ2FwdHVyaW5nRGF0YTogZmFsc2UsXG4gICAgICAgICAgb3BlbkN1cmx5Q291bnQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICBjdXJyZW50U2VjdGlvbkluZGV4ID0gc2VjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRTZWN0aW9uSW5kZXggPCAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50U2VjdGlvbiA9IHNlY3Rpb25zW2N1cnJlbnRTZWN0aW9uSW5kZXhdO1xuICAgIGlmICghY3VycmVudFNlY3Rpb24pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFMaW5lTWF0Y2ggPSBsaW5lLm1hdGNoKGRhdGFMaW5lUmVnZXgpO1xuICAgIGlmIChkYXRhTGluZU1hdGNoKSB7XG4gICAgICBjdXJyZW50U2VjdGlvbi5pc0NhcHR1cmluZ0RhdGEgPSB0cnVlO1xuICAgICAgY29uc3QgaW5saW5lVmFsdWUgPSBzYW5pdGl6ZVRleHQoZGF0YUxpbmVNYXRjaFsxXSA/PyAnJyk7XG4gICAgICBpZiAoaW5saW5lVmFsdWUpIHtcbiAgICAgICAgY3VycmVudFNlY3Rpb24udmFsdWVzLnB1c2goaW5saW5lVmFsdWUpO1xuICAgICAgICBjdXJyZW50U2VjdGlvbi5vcGVuQ3VybHlDb3VudCArPSBjb3VudENoYXIoaW5saW5lVmFsdWUsICd7JykgLSBjb3VudENoYXIoaW5saW5lVmFsdWUsICd9Jyk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFNlY3Rpb24uaXNDYXB0dXJpbmdEYXRhKSB7XG4gICAgICBpZiAoZmFxSGVhZGVyUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICBjdXJyZW50U2VjdGlvbi5pc0NhcHR1cmluZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRTZWN0aW9uLnZhbHVlcy5wdXNoKGxpbmUpO1xuXG4gICAgICAvLyBGb3IgZW5jcnlwdGVkIHdhbGxldCBwYXNzd29yZCwgZGF0YSBpcyBhIHNpbmdsZSBKU09OIG9iamVjdC4gU3RvcCBhc1xuICAgICAgLy8gc29vbiBhcyB0aGUgb2JqZWN0IGNsb3NlcyBzbyBmb290ZXIvRkFRIGNvbnRlbnQgaXMgbm90IGFwcGVuZGVkLlxuICAgICAgaWYgKGlzRW5jcnlwdGVkV2FsbGV0UGFzc3dvcmRTZWN0aW9uVGl0bGUoY3VycmVudFNlY3Rpb24udGl0bGUpKSB7XG4gICAgICAgIGN1cnJlbnRTZWN0aW9uLm9wZW5DdXJseUNvdW50ICs9IGNvdW50Q2hhcihsaW5lLCAneycpIC0gY291bnRDaGFyKGxpbmUsICd9Jyk7XG4gICAgICAgIGlmIChjdXJyZW50U2VjdGlvbi52YWx1ZXMubGVuZ3RoID4gMCAmJiBjdXJyZW50U2VjdGlvbi5vcGVuQ3VybHlDb3VudCA8PSAwKSB7XG4gICAgICAgICAgY3VycmVudFNlY3Rpb24uaXNDYXB0dXJpbmdEYXRhID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VjdGlvbnNcbiAgICAuZmlsdGVyKCh7IHNlY3Rpb24sIHZhbHVlcyB9KSA9PiBbJ0EnLCAnQicsICdDJywgJ0QnXS5pbmNsdWRlcyhzZWN0aW9uKSAmJiB2YWx1ZXMubGVuZ3RoID4gMClcbiAgICAubWFwKCh7IHNlY3Rpb24sIHRpdGxlLCB2YWx1ZXMgfSkgPT4gKHtcbiAgICAgIGxhYmVsOiBgJHtzZWN0aW9ufTogJHt0aXRsZX1gLFxuICAgICAgdmFsdWU6IG5vcm1hbGl6ZVNlY3Rpb25WYWx1ZSh2YWx1ZXMuam9pbignXFxuJykpLFxuICAgIH0pKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { EncryptionVersion, Keychain, KeychainsTriplet } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin, KeyCurve } from '@bitgo-beta/statics';
|
|
3
|
+
export interface GenerateQrDataBaseParams {
|
|
4
|
+
activationCode?: string;
|
|
5
|
+
keyCardImage?: HTMLImageElement;
|
|
6
|
+
walletLabel: string;
|
|
7
|
+
}
|
|
8
|
+
export interface GenerateQrDataForKeychainParams {
|
|
9
|
+
bitgoKeychain: Keychain;
|
|
10
|
+
curve: KeyCurve;
|
|
11
|
+
}
|
|
12
|
+
export interface GenerateQrDataCoinParams {
|
|
13
|
+
coin: Readonly<BaseCoin>;
|
|
14
|
+
passcodeEncryptionCode?: string;
|
|
15
|
+
passphrase?: string;
|
|
16
|
+
encryptionVersion?: EncryptionVersion;
|
|
17
|
+
}
|
|
18
|
+
export interface GenerateQrDataParams extends GenerateQrDataCoinParams {
|
|
19
|
+
backupKeychain: Keychain;
|
|
20
|
+
backupKeyProvider?: string;
|
|
21
|
+
backupMasterKey?: string;
|
|
22
|
+
/**
|
|
23
|
+
* @description The key used to derive the backup key using {@link backupMasterKey} as the seed.
|
|
24
|
+
*/
|
|
25
|
+
backupMasterPublicKey?: string;
|
|
26
|
+
bitgoKeychain: Keychain;
|
|
27
|
+
userKeychain: Keychain;
|
|
28
|
+
userMasterKey?: string;
|
|
29
|
+
/**
|
|
30
|
+
* @description The key used to derive the user key using {@link userMasterKey} as the seed.
|
|
31
|
+
*/
|
|
32
|
+
userMasterPublicKey?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface GenerateLightningQrDataParams extends GenerateQrDataCoinParams {
|
|
35
|
+
userAuthKeychain: Keychain;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Identifier for one of a safe's four roots (one per signing scheme). Each value is the
|
|
39
|
+
* root's `rootKeyType`, which is also the key used in the keycard's per-box JSON.
|
|
40
|
+
*/
|
|
41
|
+
export type SafeRootKeyType = 'secp256k1Multisig' | 'ecdsaMpc' | 'eddsaMpc' | 'ed25519Multisig';
|
|
42
|
+
/**
|
|
43
|
+
* Fixed render/scan order of the four roots on the safe keycard. Kept stable so a
|
|
44
|
+
* generated keycard and a re-scanned one line up slot-for-slot.
|
|
45
|
+
*/
|
|
46
|
+
export declare const SAFE_ROOT_ORDER: SafeRootKeyType[];
|
|
47
|
+
/**
|
|
48
|
+
* The JSON object encoded in a safe keycard box (A/B/C): the four roots keyed by
|
|
49
|
+
* {@link SafeRootKeyType}. Values are per-root ciphertext for A/B (encryptedPrv or
|
|
50
|
+
* reducedEncryptedPrv) or public keys for C. The root-key-type keys are self-identifying, so a
|
|
51
|
+
* consumer parses by key rather than by size/offset.
|
|
52
|
+
*/
|
|
53
|
+
export type SafeKeycardRoots = Record<SafeRootKeyType, string>;
|
|
54
|
+
/** The product a keycard belongs to, used for user-facing wording (e.g. Box D copy). */
|
|
55
|
+
export type KeycardEntity = 'wallet' | 'safe';
|
|
56
|
+
export interface GenerateSafeQrDataParams extends GenerateQrDataCoinParams {
|
|
57
|
+
roots: Record<SafeRootKeyType, KeychainsTriplet>;
|
|
58
|
+
}
|
|
59
|
+
export type GenerateKeycardParams = GenerateQrDataBaseParams & (GenerateQrDataForKeychainParams | GenerateQrDataParams | GenerateLightningQrDataParams);
|
|
60
|
+
export interface IDrawKeyCard {
|
|
61
|
+
activationCode?: string;
|
|
62
|
+
keyCardImage?: HTMLImageElement;
|
|
63
|
+
qrData: QrData;
|
|
64
|
+
questions: FAQ[];
|
|
65
|
+
walletLabel?: string;
|
|
66
|
+
curve?: KeyCurve;
|
|
67
|
+
pageBreakBeforeIndices?: number[];
|
|
68
|
+
useQrPartHeaders?: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface FAQ {
|
|
71
|
+
question: string;
|
|
72
|
+
answer: string[];
|
|
73
|
+
}
|
|
74
|
+
export interface QrDataEntry {
|
|
75
|
+
data: string;
|
|
76
|
+
description: string;
|
|
77
|
+
title: string;
|
|
78
|
+
publicMasterKey?: string;
|
|
79
|
+
}
|
|
80
|
+
export type MasterPublicKeyQrDataEntry = Omit<QrDataEntry, 'publicMasterKey'>;
|
|
81
|
+
export interface QrData {
|
|
82
|
+
backup?: QrDataEntry;
|
|
83
|
+
backupMasterPublicKey?: MasterPublicKeyQrDataEntry;
|
|
84
|
+
bitgo?: QrDataEntry;
|
|
85
|
+
passcode?: QrDataEntry;
|
|
86
|
+
curve?: KeyCurve;
|
|
87
|
+
user: QrDataEntry;
|
|
88
|
+
userMasterPublicKey?: MasterPublicKeyQrDataEntry;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SAFE_ROOT_ORDER = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Fixed render/scan order of the four roots on the safe keycard. Kept stable so a
|
|
6
|
+
* generated keycard and a re-scanned one line up slot-for-slot.
|
|
7
|
+
*/
|
|
8
|
+
exports.SAFE_ROOT_ORDER = ['secp256k1Multisig', 'ecdsaMpc', 'eddsaMpc', 'ed25519Multisig'];
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBZ0VBOzs7R0FHRztBQUNVLFFBQUEsZUFBZSxHQUFzQixDQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBLZXljaGFpbiwgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luLCBLZXlDdXJ2ZSB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlUXJEYXRhQmFzZVBhcmFtcyB7XG4gIGFjdGl2YXRpb25Db2RlPzogc3RyaW5nO1xuICBrZXlDYXJkSW1hZ2U/OiBIVE1MSW1hZ2VFbGVtZW50O1xuICB3YWxsZXRMYWJlbDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlUXJEYXRhRm9yS2V5Y2hhaW5QYXJhbXMge1xuICAvLyBUaGUgQml0R28ga2V5Y2hhaW4gYXMgaXQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgQml0R28gQVBJIHVwb24gY3JlYXRpb25cbiAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW47XG4gIC8vIFRoZSBjdXJ2ZSB1c2VkIGZvciB0aGUga2V5XG4gIGN1cnZlOiBLZXlDdXJ2ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVFyRGF0YUNvaW5QYXJhbXMge1xuICAvLyBUaGUgY29pbiBvZiB0aGUgd2FsbGV0IHRoYXQgd2FzLyBpcyBhYm91dCB0byBiZSBjcmVhdGVkXG4gIGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPjtcbiAgLy8gQSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgd2FsbGV0IHBhc3N3b3JkIHRvLlxuICAvLyBJZiBib3RoIHRoZSBwYXNzcGhyYXNlIGFuZCBwYXNzY29kZUVuY3J5cHRpb25Db2RlIGFyZSBwYXNzZWQsIHRoZW4gdGhpcyBjb2RlIGVuY3J5cHRzIHRoZSBwYXNzcGhyYXNlIHdpdGggdGhlXG4gIC8vIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvIEJveCBELiBBbGxvd3MgcmVjb3ZlcmllcyBvZiB0aGUgd2FsbGV0IHBhc3N3b3JkLlxuICBwYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICAvLyBUaGUgd2FsbGV0IHBhc3N3b3JkXG4gIC8vIElmIGJvdGggdGhlIHBhc3NwaHJhc2UgYW5kIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgYXJlIHBhc3NlZCwgdGhlbiB0aGlzIGNvZGUgZW5jcnlwdHMgdGhlIHBhc3NwaHJhc2Ugd2l0aCB0aGVcbiAgLy8gcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gQm94IEQuIEFsbG93cyByZWNvdmVyaWVzIG9mIHRoZSB3YWxsZXQgcGFzc3dvcmQuXG4gIHBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVRckRhdGFQYXJhbXMgZXh0ZW5kcyBHZW5lcmF0ZVFyRGF0YUNvaW5QYXJhbXMge1xuICAvLyBUaGUgYmFja3VwIGtleWNoYWluIGFzIGl0IGlzIHJldHVybmVkIGZyb20gdGhlIEJpdEdvIEFQSSB1cG9uIGNyZWF0aW9uXG4gIGJhY2t1cEtleWNoYWluOiBLZXljaGFpbjtcbiAgLy8gVGhlIG5hbWUgb2YgdGhlIDNyZCBwYXJ0eSBwcm92aWRlciBvZiB0aGUgYmFja3VwIGtleSBpZiBuZWl0aGVyIHRoZSB1c2VyIG5vciBCaXRHbyBzdG9yZXMgaXRcbiAgYmFja3VwS2V5UHJvdmlkZXI/OiBzdHJpbmc7XG4gIC8vIFRoZSBrZXkgaWQgb2YgdGhlIGJhY2t1cCBrZXksIG9ubHkgdXNlZCBmb3IgY29sZCBrZXlzXG4gIGJhY2t1cE1hc3RlcktleT86IHN0cmluZztcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUga2V5IHVzZWQgdG8gZGVyaXZlIHRoZSBiYWNrdXAga2V5IHVzaW5nIHtAbGluayBiYWNrdXBNYXN0ZXJLZXl9IGFzIHRoZSBzZWVkLlxuICAgKi9cbiAgYmFja3VwTWFzdGVyUHVibGljS2V5Pzogc3RyaW5nO1xuICAvLyBUaGUgQml0R28ga2V5Y2hhaW4gYXMgaXQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgQml0R28gQVBJIHVwb24gY3JlYXRpb25cbiAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW47XG4gIC8vIFRoZSB1c2VyIGtleWNoYWluIGFzIGl0IGlzIHJldHVybmVkIGZyb20gdGhlIEJpdEdvIEFQSSB1cG9uIGNyZWF0aW9uXG4gIHVzZXJLZXljaGFpbjogS2V5Y2hhaW47XG4gIC8vIFRoZSBrZXkgaWQgb2YgdGhlIHVzZXIga2V5LCBvbmx5IHVzZWQgZm9yIGNvbGQga2V5c1xuICB1c2VyTWFzdGVyS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBrZXkgdXNlZCB0byBkZXJpdmUgdGhlIHVzZXIga2V5IHVzaW5nIHtAbGluayB1c2VyTWFzdGVyS2V5fSBhcyB0aGUgc2VlZC5cbiAgICovXG4gIHVzZXJNYXN0ZXJQdWJsaWNLZXk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVMaWdodG5pbmdRckRhdGFQYXJhbXMgZXh0ZW5kcyBHZW5lcmF0ZVFyRGF0YUNvaW5QYXJhbXMge1xuICAvLyBUaGUgdXNlciBhdXRoZW50aWNhdGlvbiBrZXljaGFpbiwgdXNlZCB0byBzaWduIHBheW1lbnQgcmVxdWVzdHMgYW5kIHdhbGxldCBjb25maWd1cmF0aW9uIHVwZGF0ZXNcbiAgdXNlckF1dGhLZXljaGFpbjogS2V5Y2hhaW47XG59XG5cbi8qKlxuICogSWRlbnRpZmllciBmb3Igb25lIG9mIGEgc2FmZSdzIGZvdXIgcm9vdHMgKG9uZSBwZXIgc2lnbmluZyBzY2hlbWUpLiBFYWNoIHZhbHVlIGlzIHRoZVxuICogcm9vdCdzIGByb290S2V5VHlwZWAsIHdoaWNoIGlzIGFsc28gdGhlIGtleSB1c2VkIGluIHRoZSBrZXljYXJkJ3MgcGVyLWJveCBKU09OLlxuICovXG5leHBvcnQgdHlwZSBTYWZlUm9vdEtleVR5cGUgPSAnc2VjcDI1NmsxTXVsdGlzaWcnIHwgJ2VjZHNhTXBjJyB8ICdlZGRzYU1wYycgfCAnZWQyNTUxOU11bHRpc2lnJztcblxuLyoqXG4gKiBGaXhlZCByZW5kZXIvc2NhbiBvcmRlciBvZiB0aGUgZm91ciByb290cyBvbiB0aGUgc2FmZSBrZXljYXJkLiBLZXB0IHN0YWJsZSBzbyBhXG4gKiBnZW5lcmF0ZWQga2V5Y2FyZCBhbmQgYSByZS1zY2FubmVkIG9uZSBsaW5lIHVwIHNsb3QtZm9yLXNsb3QuXG4gKi9cbmV4cG9ydCBjb25zdCBTQUZFX1JPT1RfT1JERVI6IFNhZmVSb290S2V5VHlwZVtdID0gWydzZWNwMjU2azFNdWx0aXNpZycsICdlY2RzYU1wYycsICdlZGRzYU1wYycsICdlZDI1NTE5TXVsdGlzaWcnXTtcblxuLyoqXG4gKiBUaGUgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHNhZmUga2V5Y2FyZCBib3ggKEEvQi9DKTogdGhlIGZvdXIgcm9vdHMga2V5ZWQgYnlcbiAqIHtAbGluayBTYWZlUm9vdEtleVR5cGV9LiBWYWx1ZXMgYXJlIHBlci1yb290IGNpcGhlcnRleHQgZm9yIEEvQiAoZW5jcnlwdGVkUHJ2IG9yXG4gKiByZWR1Y2VkRW5jcnlwdGVkUHJ2KSBvciBwdWJsaWMga2V5cyBmb3IgQy4gVGhlIHJvb3Qta2V5LXR5cGUga2V5cyBhcmUgc2VsZi1pZGVudGlmeWluZywgc28gYVxuICogY29uc3VtZXIgcGFyc2VzIGJ5IGtleSByYXRoZXIgdGhhbiBieSBzaXplL29mZnNldC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUtleWNhcmRSb290cyA9IFJlY29yZDxTYWZlUm9vdEtleVR5cGUsIHN0cmluZz47XG5cbi8qKiBUaGUgcHJvZHVjdCBhIGtleWNhcmQgYmVsb25ncyB0bywgdXNlZCBmb3IgdXNlci1mYWNpbmcgd29yZGluZyAoZS5nLiBCb3ggRCBjb3B5KS4gKi9cbmV4cG9ydCB0eXBlIEtleWNhcmRFbnRpdHkgPSAnd2FsbGV0JyB8ICdzYWZlJztcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVNhZmVRckRhdGFQYXJhbXMgZXh0ZW5kcyBHZW5lcmF0ZVFyRGF0YUNvaW5QYXJhbXMge1xuICAvLyBUaGUgZm91ciByb290IHRyaXBsZXRzICh1c2VyL2JhY2t1cC9iaXRnbyBrZXljaGFpbnMpLCBrZXllZCBieSByb290S2V5VHlwZS5cbiAgcm9vdHM6IFJlY29yZDxTYWZlUm9vdEtleVR5cGUsIEtleWNoYWluc1RyaXBsZXQ+O1xufVxuXG5leHBvcnQgdHlwZSBHZW5lcmF0ZUtleWNhcmRQYXJhbXMgPSBHZW5lcmF0ZVFyRGF0YUJhc2VQYXJhbXMgJlxuICAoR2VuZXJhdGVRckRhdGFGb3JLZXljaGFpblBhcmFtcyB8IEdlbmVyYXRlUXJEYXRhUGFyYW1zIHwgR2VuZXJhdGVMaWdodG5pbmdRckRhdGFQYXJhbXMpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3S2V5Q2FyZCB7XG4gIGFjdGl2YXRpb25Db2RlPzogc3RyaW5nO1xuICBrZXlDYXJkSW1hZ2U/OiBIVE1MSW1hZ2VFbGVtZW50O1xuICBxckRhdGE6IFFyRGF0YTtcbiAgcXVlc3Rpb25zOiBGQVFbXTtcbiAgd2FsbGV0TGFiZWw/OiBzdHJpbmc7XG4gIGN1cnZlPzogS2V5Q3VydmU7XG4gIC8vIEJveCBpbmRpY2VzIHRvIHN0YXJ0IGEgbmV3IHBhZ2UgYmVmb3JlLiBPbWl0IGZvciB0aGUgZGVmYXVsdCB3YWxsZXQgbGF5b3V0LlxuICBwYWdlQnJlYWtCZWZvcmVJbmRpY2VzPzogbnVtYmVyW107XG4gIC8vIFdoZW4gdHJ1ZSwgYSBzcGxpdCBrZXkncyBRUiBmcmFnbWVudHMgYXJlIHByZWZpeGVkIHdpdGggYSBcIjxpbmRleD4vPHRvdGFsPnxcIiBwYXJ0IGhlYWRlclxuICAvLyBzbyBhIHNjYW5uZXIgY2FuIHJlYXNzZW1ibGUgdGhlbS4gT3B0LWluICh1c2VkIGJ5IHRoZSBzYWZlIGtleWNhcmQpOyBvbWl0IHRvIGxlYXZlIFFSXG4gIC8vIHBheWxvYWRzIGFzIHJhdyBmcmFnbWVudHMsIGtlZXBpbmcgdGhlIHdhbGxldCBrZXljYXJkIG91dHB1dCB1bmNoYW5nZWQuXG4gIHVzZVFyUGFydEhlYWRlcnM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZBUSB7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIC8vIHRoZSBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uLCBhbHJlYWR5IHNwbGl0IGludG8gaW5kaXZpZHVhbCBsaW5lcyBvZiB0ZXh0XG4gIGFuc3dlcjogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXJEYXRhRW50cnkge1xuICBkYXRhOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpY01hc3RlcktleT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWFzdGVyUHVibGljS2V5UXJEYXRhRW50cnkgPSBPbWl0PFFyRGF0YUVudHJ5LCAncHVibGljTWFzdGVyS2V5Jz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXJEYXRhIHtcbiAgYmFja3VwPzogUXJEYXRhRW50cnk7XG4gIGJhY2t1cE1hc3RlclB1YmxpY0tleT86IE1hc3RlclB1YmxpY0tleVFyRGF0YUVudHJ5O1xuICBiaXRnbz86IFFyRGF0YUVudHJ5O1xuICBwYXNzY29kZT86IFFyRGF0YUVudHJ5O1xuICBjdXJ2ZT86IEtleUN1cnZlO1xuICB1c2VyOiBRckRhdGFFbnRyeTtcbiAgdXNlck1hc3RlclB1YmxpY0tleT86IE1hc3RlclB1YmxpY0tleVFyRGF0YUVudHJ5O1xufVxuIl19
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF-generation helpers for the wallet encryption upgrade flow.
|
|
3
|
+
*
|
|
4
|
+
* Orchestration (unlocking the session, re-encrypting keychains, PUT-ing to the server) lives on
|
|
5
|
+
* `Wallet.upgradeEncryption` in `@bitgo-beta/sdk-core`. This module contains only the pieces that
|
|
6
|
+
* depend on `jspdf`/`qrcode` — a factory that returns a `UpgradeEncryptionPdfGenerator` the
|
|
7
|
+
* caller can pass into that method, plus a Node-side coin-logo loader.
|
|
8
|
+
*/
|
|
9
|
+
import * as https from 'https';
|
|
10
|
+
import { UpgradeEncryptionPdfGenerator } from '@bitgo-beta/sdk-core';
|
|
11
|
+
/**
|
|
12
|
+
* Fetch a coin logo image and return an HTMLImageElement-compatible object.
|
|
13
|
+
* jsPDF reads `.src` in Node.js; computeKeyCardImageDimensions reads `.width`/`.height`.
|
|
14
|
+
* Returns undefined on any failure — the keycard is generated without the logo in that case.
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadKeycardImage(url: string, httpGet?: typeof https.get): Promise<HTMLImageElement | undefined>;
|
|
17
|
+
export interface KeycardPdfGeneratorOptions {
|
|
18
|
+
/** Base URL for loading the coin logo (e.g. Environments[env].uri). Omit to skip the logo. */
|
|
19
|
+
imageBaseUrl?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build a {@link UpgradeEncryptionPdfGenerator} that regenerates the keycard PDF with the
|
|
23
|
+
* canonical `generateQrData` + `drawKeycard` flow. Pass the returned function into
|
|
24
|
+
* `Wallet.upgradeEncryption({ generatePdf })`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createKeycardPdfGenerator(options?: KeycardPdfGeneratorOptions): UpgradeEncryptionPdfGenerator;
|
|
27
|
+
//# sourceMappingURL=upgradeWalletEncryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgradeWalletEncryption.d.ts","sourceRoot":"","sources":["../../src/upgradeWalletEncryption.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAKrE;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,OAAO,KAAK,CAAC,GAAe,GACpC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAyBvC;AAED,MAAM,WAAW,0BAA0B;IACzC,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,6BAA6B,CA2BjH"}
|