@bitgo-beta/sdk-lib-safes 1.0.0-beta.26 → 1.0.0-beta.28
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/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @prettier
|
|
3
3
|
*
|
|
4
|
-
* @experimental Pure Safe derivation leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
|
|
4
|
+
* @experimental Pure Safe derivation and keycard box codec leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
|
|
5
5
|
*/
|
|
6
6
|
export * from './ed25519KeyDeriver';
|
|
7
7
|
export * from './ed25519Pub';
|
|
8
|
+
export * from './keycardCodec';
|
|
8
9
|
export * from './safeDerivation';
|
|
9
10
|
export * from './safeRecovery';
|
|
10
11
|
export * from './safeSlot';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -17,11 +17,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
/**
|
|
18
18
|
* @prettier
|
|
19
19
|
*
|
|
20
|
-
* @experimental Pure Safe derivation leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
|
|
20
|
+
* @experimental Pure Safe derivation and keycard box codec leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
|
|
21
21
|
*/
|
|
22
22
|
__exportStar(require("./ed25519KeyDeriver"), exports);
|
|
23
23
|
__exportStar(require("./ed25519Pub"), exports);
|
|
24
|
+
__exportStar(require("./keycardCodec"), exports);
|
|
24
25
|
__exportStar(require("./safeDerivation"), exports);
|
|
25
26
|
__exportStar(require("./safeRecovery"), exports);
|
|
26
27
|
__exportStar(require("./safeSlot"), exports);
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCxzREFBb0M7QUFDcEMsK0NBQTZCO0FBQzdCLGlEQUErQjtBQUMvQixtREFBaUM7QUFDakMsaURBQStCO0FBQy9CLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBQdXJlIFNhZmUgZGVyaXZhdGlvbiBhbmQga2V5Y2FyZCBib3ggY29kZWMgbGVhZi4gTmV2ZXIgaW1wb3J0cyBzZGstY29yZS9CYXNlQ29pbi9XYWxsZXQvU2FmZS9rZXktY2FyZC5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9lZDI1NTE5S2V5RGVyaXZlcic7XG5leHBvcnQgKiBmcm9tICcuL2VkMjU1MTlQdWInO1xuZXhwb3J0ICogZnJvbSAnLi9rZXljYXJkQ29kZWMnO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlRGVyaXZhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVSZWNvdmVyeSc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVTbG90JztcbiJdfQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RootKeyType } from '@bitgo/public-types';
|
|
2
|
+
/**
|
|
3
|
+
* Identifier for one of a safe's four roots (one per signing scheme). Each value is the
|
|
4
|
+
* root's `rootKeyType`, which is also the key used in the keycard's per-box JSON.
|
|
5
|
+
*/
|
|
6
|
+
export type SafeRootKeyType = RootKeyType;
|
|
7
|
+
/**
|
|
8
|
+
* The JSON object encoded in a safe keycard box (A/B/C): the four roots keyed by
|
|
9
|
+
* {@link SafeRootKeyType}. Values are per-root ciphertext for A/B (encryptedPrv or
|
|
10
|
+
* reducedEncryptedPrv; safe MPC ciphertext decrypts to a versioned signing+VRF envelope) or
|
|
11
|
+
* public keys for C. The root-key-type keys are self-identifying, so a
|
|
12
|
+
* consumer parses by key rather than by size/offset.
|
|
13
|
+
*/
|
|
14
|
+
export type SafeKeycardRoots = Record<SafeRootKeyType, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Parses a safe keycard box value — the JSON packed by key-card's `generateSafeQrData`, e.g.
|
|
17
|
+
* `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
|
|
18
|
+
* not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
|
|
19
|
+
* box value, then decrypts each root value with the safe password. An MPC root value is an
|
|
20
|
+
* opaque versioned envelope; recovery must unwrap its `prvKeyShare` and `vrf` fields instead
|
|
21
|
+
* of treating the decrypted bytes as a bare share.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseSafeKeycardBox(data: string): SafeKeycardRoots;
|
|
24
|
+
//# sourceMappingURL=keycardCodec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycardCodec.d.ts","sourceRoot":"","sources":["../../src/keycardCodec.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAa/D;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAOlE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
/**
|
|
38
|
+
* @prettier
|
|
39
|
+
*
|
|
40
|
+
* @experimental Safe keycard box codec.
|
|
41
|
+
*
|
|
42
|
+
* Each of Boxes A/B/C on a Safe keycard is a JSON object mapping a root slot name to that slot's key
|
|
43
|
+
* string. It lives in this leaf so sdk-core and WRW can parse a box without depending on key-card,
|
|
44
|
+
* which pulls in PDF/QR libraries and itself depends on sdk-core.
|
|
45
|
+
*/
|
|
46
|
+
const t = __importStar(require("io-ts"));
|
|
47
|
+
const E = __importStar(require("fp-ts/Either"));
|
|
48
|
+
const PathReporter_1 = require("io-ts/lib/PathReporter");
|
|
49
|
+
const io_ts_types_1 = require("io-ts-types");
|
|
50
|
+
// Annotating with SafeKeycardRoots makes the compiler reject a key added to or removed from one side only.
|
|
51
|
+
const SafeKeycardRootsCodec = t.type({
|
|
52
|
+
secp256k1Multisig: t.string,
|
|
53
|
+
ecdsaMpc: t.string,
|
|
54
|
+
eddsaMpc: t.string,
|
|
55
|
+
ed25519Multisig: t.string,
|
|
56
|
+
});
|
|
57
|
+
// Decodes a box's JSON string straight into the validated roots record.
|
|
58
|
+
const SafeKeycardBoxFromString = io_ts_types_1.JsonFromString.pipe(SafeKeycardRootsCodec);
|
|
59
|
+
/**
|
|
60
|
+
* Parses a safe keycard box value — the JSON packed by key-card's `generateSafeQrData`, e.g.
|
|
61
|
+
* `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
|
|
62
|
+
* not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
|
|
63
|
+
* box value, then decrypts each root value with the safe password. An MPC root value is an
|
|
64
|
+
* opaque versioned envelope; recovery must unwrap its `prvKeyShare` and `vrf` fields instead
|
|
65
|
+
* of treating the decrypted bytes as a bare share.
|
|
66
|
+
*/
|
|
67
|
+
function parseSafeKeycardBox(data) {
|
|
68
|
+
const decoded = SafeKeycardBoxFromString.decode(data);
|
|
69
|
+
if (E.isLeft(decoded)) {
|
|
70
|
+
// PathReporter, not decodeWithCodec: io-ts errors carry no message, so decodeWithCodec would report only "unknown".
|
|
71
|
+
throw new Error(`parseSafeKeycardBox: ${PathReporter_1.PathReporter.report(decoded).join('; ')}`);
|
|
72
|
+
}
|
|
73
|
+
return decoded.right;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2FyZENvZGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2tleWNhcmRDb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlEQSxrREFPQztBQXhERDs7Ozs7Ozs7R0FRRztBQUNILHlDQUEyQjtBQUMzQixnREFBa0M7QUFDbEMseURBQXNEO0FBQ3RELDZDQUE2QztBQWtCN0MsMkdBQTJHO0FBQzNHLE1BQU0scUJBQXFCLEdBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDM0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ2xCLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNsQixlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU07Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsd0VBQXdFO0FBQ3hFLE1BQU0sd0JBQXdCLEdBQUcsNEJBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUU1RTs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsSUFBWTtJQUM5QyxNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEIsb0hBQW9IO1FBQ3BILE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLDJCQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFNhZmUga2V5Y2FyZCBib3ggY29kZWMuXG4gKlxuICogRWFjaCBvZiBCb3hlcyBBL0IvQyBvbiBhIFNhZmUga2V5Y2FyZCBpcyBhIEpTT04gb2JqZWN0IG1hcHBpbmcgYSByb290IHNsb3QgbmFtZSB0byB0aGF0IHNsb3QncyBrZXlcbiAqIHN0cmluZy4gSXQgbGl2ZXMgaW4gdGhpcyBsZWFmIHNvIHNkay1jb3JlIGFuZCBXUlcgY2FuIHBhcnNlIGEgYm94IHdpdGhvdXQgZGVwZW5kaW5nIG9uIGtleS1jYXJkLFxuICogd2hpY2ggcHVsbHMgaW4gUERGL1FSIGxpYnJhcmllcyBhbmQgaXRzZWxmIGRlcGVuZHMgb24gc2RrLWNvcmUuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgRSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0IHsgUGF0aFJlcG9ydGVyIH0gZnJvbSAnaW8tdHMvbGliL1BhdGhSZXBvcnRlcic7XG5pbXBvcnQgeyBKc29uRnJvbVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUm9vdEtleVR5cGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuLyoqXG4gKiBJZGVudGlmaWVyIGZvciBvbmUgb2YgYSBzYWZlJ3MgZm91ciByb290cyAob25lIHBlciBzaWduaW5nIHNjaGVtZSkuIEVhY2ggdmFsdWUgaXMgdGhlXG4gKiByb290J3MgYHJvb3RLZXlUeXBlYCwgd2hpY2ggaXMgYWxzbyB0aGUga2V5IHVzZWQgaW4gdGhlIGtleWNhcmQncyBwZXItYm94IEpTT04uXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVSb290S2V5VHlwZSA9IFJvb3RLZXlUeXBlO1xuXG4vKipcbiAqIFRoZSBKU09OIG9iamVjdCBlbmNvZGVkIGluIGEgc2FmZSBrZXljYXJkIGJveCAoQS9CL0MpOiB0aGUgZm91ciByb290cyBrZXllZCBieVxuICoge0BsaW5rIFNhZmVSb290S2V5VHlwZX0uIFZhbHVlcyBhcmUgcGVyLXJvb3QgY2lwaGVydGV4dCBmb3IgQS9CIChlbmNyeXB0ZWRQcnYgb3JcbiAqIHJlZHVjZWRFbmNyeXB0ZWRQcnY7IHNhZmUgTVBDIGNpcGhlcnRleHQgZGVjcnlwdHMgdG8gYSB2ZXJzaW9uZWQgc2lnbmluZytWUkYgZW52ZWxvcGUpIG9yXG4gKiBwdWJsaWMga2V5cyBmb3IgQy4gVGhlIHJvb3Qta2V5LXR5cGUga2V5cyBhcmUgc2VsZi1pZGVudGlmeWluZywgc28gYVxuICogY29uc3VtZXIgcGFyc2VzIGJ5IGtleSByYXRoZXIgdGhhbiBieSBzaXplL29mZnNldC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUtleWNhcmRSb290cyA9IFJlY29yZDxTYWZlUm9vdEtleVR5cGUsIHN0cmluZz47XG5cbi8vIEFubm90YXRpbmcgd2l0aCBTYWZlS2V5Y2FyZFJvb3RzIG1ha2VzIHRoZSBjb21waWxlciByZWplY3QgYSBrZXkgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIG9uZSBzaWRlIG9ubHkuXG5jb25zdCBTYWZlS2V5Y2FyZFJvb3RzQ29kZWM6IHQuVHlwZTxTYWZlS2V5Y2FyZFJvb3RzPiA9IHQudHlwZSh7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiB0LnN0cmluZyxcbiAgZWNkc2FNcGM6IHQuc3RyaW5nLFxuICBlZGRzYU1wYzogdC5zdHJpbmcsXG4gIGVkMjU1MTlNdWx0aXNpZzogdC5zdHJpbmcsXG59KTtcblxuLy8gRGVjb2RlcyBhIGJveCdzIEpTT04gc3RyaW5nIHN0cmFpZ2h0IGludG8gdGhlIHZhbGlkYXRlZCByb290cyByZWNvcmQuXG5jb25zdCBTYWZlS2V5Y2FyZEJveEZyb21TdHJpbmcgPSBKc29uRnJvbVN0cmluZy5waXBlKFNhZmVLZXljYXJkUm9vdHNDb2RlYyk7XG5cbi8qKlxuICogUGFyc2VzIGEgc2FmZSBrZXljYXJkIGJveCB2YWx1ZSDigJQgdGhlIEpTT04gcGFja2VkIGJ5IGtleS1jYXJkJ3MgYGdlbmVyYXRlU2FmZVFyRGF0YWAsIGUuZy5cbiAqIGB7XCJzZWNwMjU2azFNdWx0aXNpZ1wiOlwi4oCmXCIsXCJlY2RzYU1wY1wiOlwi4oCmXCIs4oCmfWAg4oCUIGludG8gaXRzIGZvdXIgcm9vdHMuIFRocm93cyBpZiB0aGUgdmFsdWUgaXNcbiAqIG5vdCB2YWxpZCBKU09OIG9yIGFueSByb290IGlzIG1pc3Npbmcvbm9uLXN0cmluZy4gUmVjb3ZlcnkgdG9vbGluZyBjYWxscyB0aGlzIG9uIHRoZSBBL0IvQ1xuICogYm94IHZhbHVlLCB0aGVuIGRlY3J5cHRzIGVhY2ggcm9vdCB2YWx1ZSB3aXRoIHRoZSBzYWZlIHBhc3N3b3JkLiBBbiBNUEMgcm9vdCB2YWx1ZSBpcyBhblxuICogb3BhcXVlIHZlcnNpb25lZCBlbnZlbG9wZTsgcmVjb3ZlcnkgbXVzdCB1bndyYXAgaXRzIGBwcnZLZXlTaGFyZWAgYW5kIGB2cmZgIGZpZWxkcyBpbnN0ZWFkXG4gKiBvZiB0cmVhdGluZyB0aGUgZGVjcnlwdGVkIGJ5dGVzIGFzIGEgYmFyZSBzaGFyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZUtleWNhcmRCb3goZGF0YTogc3RyaW5nKTogU2FmZUtleWNhcmRSb290cyB7XG4gIGNvbnN0IGRlY29kZWQgPSBTYWZlS2V5Y2FyZEJveEZyb21TdHJpbmcuZGVjb2RlKGRhdGEpO1xuICBpZiAoRS5pc0xlZnQoZGVjb2RlZCkpIHtcbiAgICAvLyBQYXRoUmVwb3J0ZXIsIG5vdCBkZWNvZGVXaXRoQ29kZWM6IGlvLXRzIGVycm9ycyBjYXJyeSBubyBtZXNzYWdlLCBzbyBkZWNvZGVXaXRoQ29kZWMgd291bGQgcmVwb3J0IG9ubHkgXCJ1bmtub3duXCIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYXJzZVNhZmVLZXljYXJkQm94OiAke1BhdGhSZXBvcnRlci5yZXBvcnQoZGVjb2RlZCkuam9pbignOyAnKX1gKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlZC5yaWdodDtcbn1cbiJdfQ==
|