shamir-mnemonic-ts 1.0.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/LICENSE +21 -0
- package/README.md +71 -0
- package/dist/cipher.d.ts +3 -0
- package/dist/cipher.d.ts.map +1 -0
- package/dist/cipher.js +91 -0
- package/dist/cipher.js.map +1 -0
- package/dist/constants.d.ts +41 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +45 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/recovery.d.ts +18 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +126 -0
- package/dist/recovery.js.map +1 -0
- package/dist/rs1024.d.ts +5 -0
- package/dist/rs1024.d.ts.map +1 -0
- package/dist/rs1024.js +50 -0
- package/dist/rs1024.js.map +1 -0
- package/dist/shamir.d.ts +36 -0
- package/dist/shamir.d.ts.map +1 -0
- package/dist/shamir.js +448 -0
- package/dist/shamir.js.map +1 -0
- package/dist/share.d.ts +39 -0
- package/dist/share.d.ts.map +1 -0
- package/dist/share.js +194 -0
- package/dist/share.js.map +1 -0
- package/dist/src/cipher.js +90 -0
- package/dist/src/constants.js +44 -0
- package/dist/src/index.js +22 -0
- package/dist/src/recovery.js +127 -0
- package/dist/src/rs1024.js +55 -0
- package/dist/src/shamir.js +486 -0
- package/dist/src/share.js +196 -0
- package/dist/src/utils.js +97 -0
- package/dist/src/wordlist.js +136 -0
- package/dist/test-manual.js +78 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +39 -0
- package/dist/utils.js.map +1 -0
- package/dist/wordlist.d.ts +4 -0
- package/dist/wordlist.d.ts.map +1 -0
- package/dist/wordlist.js +1069 -0
- package/dist/wordlist.js.map +1 -0
- package/package.json +44 -0
package/dist/shamir.js
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
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.RANDOM_BYTES = exports.EncryptedMasterSecret = exports.ShareGroup = void 0;
|
|
37
|
+
exports.decodeMnemonics = decodeMnemonics;
|
|
38
|
+
exports.splitEms = splitEms;
|
|
39
|
+
exports.generateMnemonics = generateMnemonics;
|
|
40
|
+
exports.recoverEms = recoverEms;
|
|
41
|
+
exports.combineMnemonics = combineMnemonics;
|
|
42
|
+
const crypto = __importStar(require("crypto"));
|
|
43
|
+
const cipher = __importStar(require("./cipher"));
|
|
44
|
+
const constants_1 = require("./constants");
|
|
45
|
+
const share_1 = require("./share");
|
|
46
|
+
const utils_1 = require("./utils");
|
|
47
|
+
class ShareGroup {
|
|
48
|
+
constructor() {
|
|
49
|
+
this._shares = new Set();
|
|
50
|
+
}
|
|
51
|
+
[Symbol.iterator]() {
|
|
52
|
+
return this._shares.values();
|
|
53
|
+
}
|
|
54
|
+
get length() {
|
|
55
|
+
return this._shares.size;
|
|
56
|
+
}
|
|
57
|
+
get isEmpty() {
|
|
58
|
+
return this._shares.size === 0;
|
|
59
|
+
}
|
|
60
|
+
has(obj) {
|
|
61
|
+
// Check by value equality, not reference
|
|
62
|
+
for (const share of this._shares) {
|
|
63
|
+
if (share.identifier === obj.identifier &&
|
|
64
|
+
share.extendable === obj.extendable &&
|
|
65
|
+
share.iterationExponent === obj.iterationExponent &&
|
|
66
|
+
share.groupIndex === obj.groupIndex &&
|
|
67
|
+
share.groupThreshold === obj.groupThreshold &&
|
|
68
|
+
share.groupCount === obj.groupCount &&
|
|
69
|
+
share.index === obj.index &&
|
|
70
|
+
share.memberThreshold === obj.memberThreshold &&
|
|
71
|
+
share.value.equals(obj.value)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
add(share) {
|
|
78
|
+
if (this._shares.size > 0 && !this._groupParametersMatch(share)) {
|
|
79
|
+
const existing = Array.from(this._shares)[0];
|
|
80
|
+
const existingParams = existing.groupParameters();
|
|
81
|
+
const newParams = share.groupParameters();
|
|
82
|
+
const fields = [
|
|
83
|
+
'identifier',
|
|
84
|
+
'extendable',
|
|
85
|
+
'iterationExponent',
|
|
86
|
+
'groupIndex',
|
|
87
|
+
'groupThreshold',
|
|
88
|
+
'groupCount',
|
|
89
|
+
'memberThreshold',
|
|
90
|
+
];
|
|
91
|
+
for (const field of fields) {
|
|
92
|
+
if (existingParams[field] !== newParams[field]) {
|
|
93
|
+
throw new utils_1.MnemonicError(`Invalid set of mnemonics. The ${field} parameters don't match.`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this._shares.add(share);
|
|
98
|
+
}
|
|
99
|
+
_groupParametersMatch(share) {
|
|
100
|
+
if (this._shares.size === 0) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
const existing = Array.from(this._shares)[0];
|
|
104
|
+
const existingParams = existing.groupParameters();
|
|
105
|
+
const newParams = share.groupParameters();
|
|
106
|
+
return (existingParams.identifier === newParams.identifier &&
|
|
107
|
+
existingParams.extendable === newParams.extendable &&
|
|
108
|
+
existingParams.iterationExponent === newParams.iterationExponent &&
|
|
109
|
+
existingParams.groupIndex === newParams.groupIndex &&
|
|
110
|
+
existingParams.groupThreshold === newParams.groupThreshold &&
|
|
111
|
+
existingParams.groupCount === newParams.groupCount &&
|
|
112
|
+
existingParams.memberThreshold === newParams.memberThreshold);
|
|
113
|
+
}
|
|
114
|
+
toRawShares() {
|
|
115
|
+
return Array.from(this._shares).map(s => ({ x: s.index, data: s.value }));
|
|
116
|
+
}
|
|
117
|
+
getMinimalGroup() {
|
|
118
|
+
const group = new ShareGroup();
|
|
119
|
+
const sharesArray = Array.from(this._shares);
|
|
120
|
+
const threshold = this.memberThreshold();
|
|
121
|
+
group._shares = new Set(sharesArray.slice(0, threshold));
|
|
122
|
+
return group;
|
|
123
|
+
}
|
|
124
|
+
commonParameters() {
|
|
125
|
+
return Array.from(this._shares)[0].commonParameters();
|
|
126
|
+
}
|
|
127
|
+
groupParameters() {
|
|
128
|
+
return Array.from(this._shares)[0].groupParameters();
|
|
129
|
+
}
|
|
130
|
+
memberThreshold() {
|
|
131
|
+
return Array.from(this._shares)[0].memberThreshold;
|
|
132
|
+
}
|
|
133
|
+
isComplete() {
|
|
134
|
+
if (this._shares.size === 0) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
return this._shares.size >= this.memberThreshold();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.ShareGroup = ShareGroup;
|
|
141
|
+
class EncryptedMasterSecret {
|
|
142
|
+
constructor(identifier, extendable, iterationExponent, ciphertext) {
|
|
143
|
+
this.identifier = identifier;
|
|
144
|
+
this.extendable = extendable;
|
|
145
|
+
this.iterationExponent = iterationExponent;
|
|
146
|
+
this.ciphertext = ciphertext;
|
|
147
|
+
}
|
|
148
|
+
static fromMasterSecret(masterSecret, passphrase, identifier, extendable, iterationExponent) {
|
|
149
|
+
const ciphertext = cipher.encrypt(masterSecret, passphrase, iterationExponent, identifier, extendable);
|
|
150
|
+
return new EncryptedMasterSecret(identifier, extendable, iterationExponent, ciphertext);
|
|
151
|
+
}
|
|
152
|
+
decrypt(passphrase) {
|
|
153
|
+
return cipher.decrypt(this.ciphertext, passphrase, this.iterationExponent, this.identifier, this.extendable);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
exports.EncryptedMasterSecret = EncryptedMasterSecret;
|
|
157
|
+
let RANDOM_BYTES = (length) => {
|
|
158
|
+
return crypto.randomBytes(length);
|
|
159
|
+
};
|
|
160
|
+
exports.RANDOM_BYTES = RANDOM_BYTES;
|
|
161
|
+
/** Source of random bytes. Can be overriden for deterministic testing. */
|
|
162
|
+
function _precomputeExpLog() {
|
|
163
|
+
const exp = new Array(255).fill(0);
|
|
164
|
+
const log = new Array(256).fill(0);
|
|
165
|
+
let poly = 1;
|
|
166
|
+
for (let i = 0; i < 255; i++) {
|
|
167
|
+
exp[i] = poly;
|
|
168
|
+
log[poly] = i;
|
|
169
|
+
// Multiply poly by the polynomial x + 1.
|
|
170
|
+
poly = (poly << 1) ^ poly;
|
|
171
|
+
// Reduce poly by x^8 + x^4 + x^3 + x + 1.
|
|
172
|
+
if (poly & 0x100) {
|
|
173
|
+
poly ^= 0x11B;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return [exp, log];
|
|
177
|
+
}
|
|
178
|
+
const [EXP_TABLE, LOG_TABLE] = _precomputeExpLog();
|
|
179
|
+
function _interpolate(shares, x) {
|
|
180
|
+
/**
|
|
181
|
+
* Returns f(x) given the Shamir shares (x_1, f(x_1)), ... , (x_k, f(x_k)).
|
|
182
|
+
* @param shares The Shamir shares.
|
|
183
|
+
* @param x The x coordinate of the result.
|
|
184
|
+
* @return Evaluations of the polynomials in x.
|
|
185
|
+
*/
|
|
186
|
+
const xCoordinates = new Set(shares.map(share => share.x));
|
|
187
|
+
if (xCoordinates.size !== shares.length) {
|
|
188
|
+
throw new utils_1.MnemonicError('Invalid set of shares. Share indices must be unique.');
|
|
189
|
+
}
|
|
190
|
+
const shareValueLengths = new Set(shares.map(share => share.data.length));
|
|
191
|
+
if (shareValueLengths.size !== 1) {
|
|
192
|
+
throw new utils_1.MnemonicError('Invalid set of shares. All share values must have the same length.');
|
|
193
|
+
}
|
|
194
|
+
if (xCoordinates.has(x)) {
|
|
195
|
+
for (const share of shares) {
|
|
196
|
+
if (share.x === x) {
|
|
197
|
+
return share.data;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Logarithm of the product of (x_i - x) for i = 1, ... , k.
|
|
202
|
+
let logProd = 0;
|
|
203
|
+
for (const share of shares) {
|
|
204
|
+
logProd = (logProd + LOG_TABLE[share.x ^ x]) % 255;
|
|
205
|
+
}
|
|
206
|
+
const resultLength = Array.from(shareValueLengths)[0];
|
|
207
|
+
const result = Buffer.alloc(resultLength);
|
|
208
|
+
for (const share of shares) {
|
|
209
|
+
// The logarithm of the Lagrange basis polynomial evaluated at x.
|
|
210
|
+
let logBasisEval = logProd;
|
|
211
|
+
logBasisEval = (logBasisEval - LOG_TABLE[share.x ^ x] + 255) % 255;
|
|
212
|
+
let sumOther = 0;
|
|
213
|
+
for (const other of shares) {
|
|
214
|
+
if (other.x !== share.x) {
|
|
215
|
+
sumOther = (sumOther + LOG_TABLE[share.x ^ other.x]) % 255;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
logBasisEval = (logBasisEval - sumOther + 255) % 255;
|
|
219
|
+
for (let i = 0; i < resultLength; i++) {
|
|
220
|
+
const shareVal = share.data[i];
|
|
221
|
+
if (shareVal !== 0) {
|
|
222
|
+
result[i] ^= EXP_TABLE[(LOG_TABLE[shareVal] + logBasisEval) % 255];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
function _createDigest(randomData, sharedSecret) {
|
|
229
|
+
const hmac = crypto.createHmac('sha256', randomData);
|
|
230
|
+
hmac.update(sharedSecret);
|
|
231
|
+
return hmac.digest().slice(0, constants_1.DIGEST_LENGTH_BYTES);
|
|
232
|
+
}
|
|
233
|
+
function _splitSecret(threshold, shareCount, sharedSecret) {
|
|
234
|
+
if (threshold < 1) {
|
|
235
|
+
throw new Error('The requested threshold must be a positive integer.');
|
|
236
|
+
}
|
|
237
|
+
if (threshold > shareCount) {
|
|
238
|
+
throw new Error('The requested threshold must not exceed the number of shares.');
|
|
239
|
+
}
|
|
240
|
+
if (shareCount > constants_1.MAX_SHARE_COUNT) {
|
|
241
|
+
throw new Error(`The requested number of shares must not exceed ${constants_1.MAX_SHARE_COUNT}.`);
|
|
242
|
+
}
|
|
243
|
+
// If the threshold is 1, then the digest of the shared secret is not used.
|
|
244
|
+
if (threshold === 1) {
|
|
245
|
+
return Array.from({ length: shareCount }, (_, i) => ({
|
|
246
|
+
x: i,
|
|
247
|
+
data: sharedSecret,
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
const randomShareCount = threshold - 2;
|
|
251
|
+
const shares = Array.from({ length: randomShareCount }, (_, i) => ({
|
|
252
|
+
x: i,
|
|
253
|
+
data: (0, exports.RANDOM_BYTES)(sharedSecret.length),
|
|
254
|
+
}));
|
|
255
|
+
const randomPart = (0, exports.RANDOM_BYTES)(sharedSecret.length - constants_1.DIGEST_LENGTH_BYTES);
|
|
256
|
+
const digest = _createDigest(randomPart, sharedSecret);
|
|
257
|
+
const baseShares = [
|
|
258
|
+
...shares,
|
|
259
|
+
{ x: constants_1.DIGEST_INDEX, data: Buffer.concat([digest, randomPart]) },
|
|
260
|
+
{ x: constants_1.SECRET_INDEX, data: sharedSecret },
|
|
261
|
+
];
|
|
262
|
+
for (let i = randomShareCount; i < shareCount; i++) {
|
|
263
|
+
shares.push({ x: i, data: _interpolate(baseShares, i) });
|
|
264
|
+
}
|
|
265
|
+
return shares;
|
|
266
|
+
}
|
|
267
|
+
function _recoverSecret(threshold, shares) {
|
|
268
|
+
// If the threshold is 1, then the digest of the shared secret is not used.
|
|
269
|
+
if (threshold === 1) {
|
|
270
|
+
return shares[0].data;
|
|
271
|
+
}
|
|
272
|
+
const sharedSecret = _interpolate(shares, constants_1.SECRET_INDEX);
|
|
273
|
+
const digestShare = _interpolate(shares, constants_1.DIGEST_INDEX);
|
|
274
|
+
const digest = digestShare.slice(0, constants_1.DIGEST_LENGTH_BYTES);
|
|
275
|
+
const randomPart = digestShare.slice(constants_1.DIGEST_LENGTH_BYTES);
|
|
276
|
+
if (!digest.equals(_createDigest(randomPart, sharedSecret))) {
|
|
277
|
+
throw new utils_1.MnemonicError('Invalid digest of the shared secret.');
|
|
278
|
+
}
|
|
279
|
+
return sharedSecret;
|
|
280
|
+
}
|
|
281
|
+
function decodeMnemonics(mnemonics) {
|
|
282
|
+
const commonParams = [];
|
|
283
|
+
const groups = new Map();
|
|
284
|
+
for (const mnemonic of mnemonics) {
|
|
285
|
+
const share = share_1.Share.fromMnemonic(mnemonic);
|
|
286
|
+
const params = share.commonParameters();
|
|
287
|
+
commonParams.push(params);
|
|
288
|
+
if (!groups.has(share.groupIndex)) {
|
|
289
|
+
groups.set(share.groupIndex, new ShareGroup());
|
|
290
|
+
}
|
|
291
|
+
const group = groups.get(share.groupIndex);
|
|
292
|
+
group.add(share);
|
|
293
|
+
}
|
|
294
|
+
if (commonParams.length === 0) {
|
|
295
|
+
throw new utils_1.MnemonicError('The list of mnemonics is empty.');
|
|
296
|
+
}
|
|
297
|
+
const firstParams = commonParams[0];
|
|
298
|
+
for (const params of commonParams) {
|
|
299
|
+
if (params.identifier !== firstParams.identifier ||
|
|
300
|
+
params.extendable !== firstParams.extendable ||
|
|
301
|
+
params.iterationExponent !== firstParams.iterationExponent ||
|
|
302
|
+
params.groupThreshold !== firstParams.groupThreshold ||
|
|
303
|
+
params.groupCount !== firstParams.groupCount) {
|
|
304
|
+
throw new utils_1.MnemonicError('Invalid set of mnemonics. ' +
|
|
305
|
+
`All mnemonics must begin with the same ${constants_1.ID_EXP_LENGTH_WORDS} words, ` +
|
|
306
|
+
'must have the same group threshold and the same group count.');
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return groups;
|
|
310
|
+
}
|
|
311
|
+
function splitEms(groupThreshold, groups, encryptedMasterSecret) {
|
|
312
|
+
/**
|
|
313
|
+
* Split an Encrypted Master Secret into mnemonic shares.
|
|
314
|
+
*
|
|
315
|
+
* This function is a counterpart to `recoverEms`, and it is used as a subroutine in
|
|
316
|
+
* `generateMnemonics`. The input is an *already encrypted* Master Secret (EMS), so it
|
|
317
|
+
* is possible to encrypt the Master Secret in advance and perform the splitting later.
|
|
318
|
+
*
|
|
319
|
+
* @param groupThreshold The number of groups required to reconstruct the master secret.
|
|
320
|
+
* @param groups A list of (member_threshold, member_count) pairs for each group, where member_count
|
|
321
|
+
* is the number of shares to generate for the group and member_threshold is the number of members required to
|
|
322
|
+
* reconstruct the group secret.
|
|
323
|
+
* @param encryptedMasterSecret The encrypted master secret to split.
|
|
324
|
+
* @return List of groups of mnemonics.
|
|
325
|
+
*/
|
|
326
|
+
if (encryptedMasterSecret.ciphertext.length * 8 < constants_1.MIN_STRENGTH_BITS) {
|
|
327
|
+
throw new Error('The length of the master secret must be ' +
|
|
328
|
+
`at least ${(0, utils_1.bitsToBytes)(constants_1.MIN_STRENGTH_BITS)} bytes.`);
|
|
329
|
+
}
|
|
330
|
+
if (groupThreshold > groups.length) {
|
|
331
|
+
throw new Error('The requested group threshold must not exceed the number of groups.');
|
|
332
|
+
}
|
|
333
|
+
if (groups.some(([memberThreshold, memberCount]) => memberThreshold === 1 && memberCount > 1)) {
|
|
334
|
+
throw new Error('Creating multiple member shares with member threshold 1 is not allowed. ' +
|
|
335
|
+
'Use 1-of-1 member sharing instead.');
|
|
336
|
+
}
|
|
337
|
+
const groupShares = _splitSecret(groupThreshold, groups.length, encryptedMasterSecret.ciphertext);
|
|
338
|
+
return groups.map(([memberThreshold, memberCount], groupIndex) => {
|
|
339
|
+
const groupSecret = groupShares[groupIndex].data;
|
|
340
|
+
const memberShares = _splitSecret(memberThreshold, memberCount, groupSecret);
|
|
341
|
+
return memberShares.map(({ x: memberIndex, data: value }) => {
|
|
342
|
+
return new share_1.Share(encryptedMasterSecret.identifier, encryptedMasterSecret.extendable, encryptedMasterSecret.iterationExponent, groupIndex, groupThreshold, groups.length, memberIndex, memberThreshold, value);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
function _randomIdentifier() {
|
|
347
|
+
/** Returns a random identifier with the given bit length. */
|
|
348
|
+
const identifierBytes = (0, exports.RANDOM_BYTES)((0, utils_1.bitsToBytes)(constants_1.ID_LENGTH_BITS));
|
|
349
|
+
let identifier = 0;
|
|
350
|
+
for (let i = 0; i < identifierBytes.length; i++) {
|
|
351
|
+
identifier = (identifier << 8) | identifierBytes[i];
|
|
352
|
+
}
|
|
353
|
+
// Mask to ID_LENGTH_BITS
|
|
354
|
+
return identifier & ((1 << constants_1.ID_LENGTH_BITS) - 1);
|
|
355
|
+
}
|
|
356
|
+
function generateMnemonics(groupThreshold, groups, masterSecret, passphrase = Buffer.alloc(0), extendable = true, iterationExponent = 1) {
|
|
357
|
+
/**
|
|
358
|
+
* Split a master secret into mnemonic shares using Shamir's secret sharing scheme.
|
|
359
|
+
*
|
|
360
|
+
* The supplied Master Secret is encrypted by the passphrase (empty passphrase is used
|
|
361
|
+
* if none is provided) and split into a set of mnemonic shares.
|
|
362
|
+
*
|
|
363
|
+
* This is the user-friendly method to back up a pre-existing secret with the Shamir
|
|
364
|
+
* scheme, optionally protected by a passphrase.
|
|
365
|
+
*
|
|
366
|
+
* @param groupThreshold The number of groups required to reconstruct the master secret.
|
|
367
|
+
* @param groups A list of (member_threshold, member_count) pairs for each group, where member_count
|
|
368
|
+
* is the number of shares to generate for the group and member_threshold is the number of members required to
|
|
369
|
+
* reconstruct the group secret.
|
|
370
|
+
* @param masterSecret The master secret to split.
|
|
371
|
+
* @param passphrase The passphrase used to encrypt the master secret.
|
|
372
|
+
* @param iterationExponent The encryption iteration exponent.
|
|
373
|
+
* @return List of groups mnemonics.
|
|
374
|
+
*/
|
|
375
|
+
// Validate passphrase contains only printable ASCII characters (code points 32-126)
|
|
376
|
+
for (let i = 0; i < passphrase.length; i++) {
|
|
377
|
+
const code = passphrase[i];
|
|
378
|
+
if (code < 32 || code > 126) {
|
|
379
|
+
throw new Error('The passphrase must contain only printable ASCII characters (code points 32-126).');
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
const identifier = _randomIdentifier();
|
|
383
|
+
const encryptedMasterSecret = EncryptedMasterSecret.fromMasterSecret(masterSecret, passphrase, identifier, extendable, iterationExponent);
|
|
384
|
+
const groupedShares = splitEms(groupThreshold, groups, encryptedMasterSecret);
|
|
385
|
+
return groupedShares.map(group => group.map(share => share.mnemonic()));
|
|
386
|
+
}
|
|
387
|
+
function recoverEms(groups) {
|
|
388
|
+
/**
|
|
389
|
+
* Combine shares, recover metadata and the Encrypted Master Secret.
|
|
390
|
+
*
|
|
391
|
+
* This function is a counterpart to `splitEms`, and it is used as a subroutine in
|
|
392
|
+
* `combineMnemonics`. It returns the EMS itself and data required for its decryption,
|
|
393
|
+
* except for the passphrase. It is thus possible to defer decryption of the Master
|
|
394
|
+
* Secret to a later time.
|
|
395
|
+
*
|
|
396
|
+
* @param groups Set of shares classified into groups.
|
|
397
|
+
* @return Encrypted Master Secret
|
|
398
|
+
*/
|
|
399
|
+
if (groups.size === 0) {
|
|
400
|
+
throw new utils_1.MnemonicError('The set of shares is empty.');
|
|
401
|
+
}
|
|
402
|
+
const firstGroup = Array.from(groups.values())[0];
|
|
403
|
+
const params = firstGroup.commonParameters();
|
|
404
|
+
if (groups.size < params.groupThreshold) {
|
|
405
|
+
throw new utils_1.MnemonicError('Insufficient number of mnemonic groups. ' +
|
|
406
|
+
`The required number of groups is ${params.groupThreshold}.`);
|
|
407
|
+
}
|
|
408
|
+
if (groups.size !== params.groupThreshold) {
|
|
409
|
+
throw new utils_1.MnemonicError('Wrong number of mnemonic groups. ' +
|
|
410
|
+
`Expected ${params.groupThreshold} groups, ` +
|
|
411
|
+
`but ${groups.size} were provided.`);
|
|
412
|
+
}
|
|
413
|
+
for (const group of groups.values()) {
|
|
414
|
+
if (group.length !== group.memberThreshold()) {
|
|
415
|
+
const shareWords = Array.from(group)[0].words();
|
|
416
|
+
const prefix = shareWords.slice(0, constants_1.GROUP_PREFIX_LENGTH_WORDS).join(' ');
|
|
417
|
+
throw new utils_1.MnemonicError('Wrong number of mnemonics. ' +
|
|
418
|
+
`Expected ${group.memberThreshold()} mnemonics starting with "${prefix} ...", ` +
|
|
419
|
+
`but ${group.length} were provided.`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const groupShares = Array.from(groups.entries()).map(([groupIndex, group]) => ({
|
|
423
|
+
x: groupIndex,
|
|
424
|
+
data: _recoverSecret(group.memberThreshold(), group.toRawShares()),
|
|
425
|
+
}));
|
|
426
|
+
const ciphertext = _recoverSecret(params.groupThreshold, groupShares);
|
|
427
|
+
return new EncryptedMasterSecret(params.identifier, params.extendable, params.iterationExponent, ciphertext);
|
|
428
|
+
}
|
|
429
|
+
function combineMnemonics(mnemonics, passphrase = Buffer.alloc(0)) {
|
|
430
|
+
/**
|
|
431
|
+
* Combine mnemonic shares to obtain the master secret which was previously split
|
|
432
|
+
* using Shamir's secret sharing scheme.
|
|
433
|
+
*
|
|
434
|
+
* This is the user-friendly method to recover a backed-up secret optionally protected
|
|
435
|
+
* by a passphrase.
|
|
436
|
+
*
|
|
437
|
+
* @param mnemonics List of mnemonics.
|
|
438
|
+
* @param passphrase The passphrase used to encrypt the master secret.
|
|
439
|
+
* @return The master secret.
|
|
440
|
+
*/
|
|
441
|
+
if (!mnemonics || Array.from(mnemonics).length === 0) {
|
|
442
|
+
throw new utils_1.MnemonicError('The list of mnemonics is empty.');
|
|
443
|
+
}
|
|
444
|
+
const groups = decodeMnemonics(mnemonics);
|
|
445
|
+
const encryptedMasterSecret = recoverEms(groups);
|
|
446
|
+
return encryptedMasterSecret.decrypt(passphrase);
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=shamir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shamir.js","sourceRoot":"","sources":["../src/shamir.ts"],"names":[],"mappings":"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"}
|
package/dist/share.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type WordIndex = number;
|
|
2
|
+
export interface ShareCommonParameters {
|
|
3
|
+
/** Parameters that are common to all shares of a master secret. */
|
|
4
|
+
identifier: number;
|
|
5
|
+
extendable: boolean;
|
|
6
|
+
iterationExponent: number;
|
|
7
|
+
groupThreshold: number;
|
|
8
|
+
groupCount: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ShareGroupParameters {
|
|
11
|
+
/** Parameters that are common to all shares of a master secret, which belong to the same group. */
|
|
12
|
+
identifier: number;
|
|
13
|
+
extendable: boolean;
|
|
14
|
+
iterationExponent: number;
|
|
15
|
+
groupIndex: number;
|
|
16
|
+
groupThreshold: number;
|
|
17
|
+
groupCount: number;
|
|
18
|
+
memberThreshold: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class Share {
|
|
21
|
+
readonly identifier: number;
|
|
22
|
+
readonly extendable: boolean;
|
|
23
|
+
readonly iterationExponent: number;
|
|
24
|
+
readonly groupIndex: number;
|
|
25
|
+
readonly groupThreshold: number;
|
|
26
|
+
readonly groupCount: number;
|
|
27
|
+
readonly index: number;
|
|
28
|
+
readonly memberThreshold: number;
|
|
29
|
+
readonly value: Buffer;
|
|
30
|
+
constructor(identifier: number, extendable: boolean, iterationExponent: number, groupIndex: number, groupThreshold: number, groupCount: number, index: number, memberThreshold: number, value: Buffer);
|
|
31
|
+
commonParameters(): ShareCommonParameters;
|
|
32
|
+
groupParameters(): ShareGroupParameters;
|
|
33
|
+
_encodeIdExp(): WordIndex[];
|
|
34
|
+
_encodeShareParams(): WordIndex[];
|
|
35
|
+
words(): string[];
|
|
36
|
+
mnemonic(): string;
|
|
37
|
+
static fromMnemonic(mnemonic: string): Share;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=share.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAoB/B,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,mGAAmG;IACnG,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,KAAK;IAChB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAGrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,OAAO,EACnB,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM;IAaf,gBAAgB,IAAI,qBAAqB;IAWzC,eAAe,IAAI,oBAAoB;IAavC,YAAY,IAAI,SAAS,EAAE;IAO3B,kBAAkB,IAAI,SAAS,EAAE;IAejC,KAAK,IAAI,MAAM,EAAE;IAuBjB,QAAQ,IAAI,MAAM;IAKlB,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK;CAkG7C"}
|