@bitgo/account-lib 2.18.0-rc.2 → 2.18.0-rc.3

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.
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
39
+ for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
40
+ to[j] = from[i];
41
+ return to;
42
+ };
43
+ var __importDefault = (this && this.__importDefault) || function (mod) {
44
+ return (mod && mod.__esModule) ? mod : { "default": mod };
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ /**
48
+ * Module provides functions for MPC using threshold signature scheme (TSS). It contains
49
+ * functions for key generation and message signing with EdDSA.
50
+ *
51
+ *
52
+ * ======================
53
+ * EdDSA Key Generation
54
+ * ======================
55
+ * 1. Each signer generates their own key share, which involves a private u-share and a public y-share.
56
+ * 2. Signers distribute their y-share to other signers.
57
+ * 3. After exchanging y-shares the next phase is to combine key shares. Each signer combines their u-share
58
+ * with the y-shares received from other signers in order to generate a p-share for themselves. We
59
+ * also save j-shares for other signers.
60
+ * 4. At this point the players do not distribute any shares and the first phase of the
61
+ * signing protocol is complete.
62
+ *
63
+ * ======================
64
+ * EdDSA Signing
65
+ * ======================
66
+ * 1. The parties from key generation decide they want to sign something. They begin the signing protocol
67
+ * by generating shares of an ephemeral key.
68
+ *
69
+ * a) Each signer uses his p-share and the j-shares stored for other players to generate his signing share.
70
+ * b) This results in each signer having a private x-share and public r-shares.
71
+ *
72
+ * 2. Signers distribute their r-shares to other signers.
73
+ * 3. After exchanging r-shares, each signer signs their share of the ephemeral key using their private
74
+ * x-share with the r-shares from other signers.
75
+ * 4. This results in each signer having a public g-share which they send to the other signers.
76
+ * 5. After the signers broadcast their g-shares, the final signature can be re-constructed independently.
77
+ */
78
+ var assert = require('assert');
79
+ var curves_1 = __importDefault(require("./curves"));
80
+ var js_sha512_1 = require("js-sha512");
81
+ var shamir_1 = __importDefault(require("./shamir"));
82
+ var crypto_1 = require("crypto");
83
+ var convertObjectHexToBuffer = function (object, keys) {
84
+ var result = object;
85
+ keys.forEach(function (key) {
86
+ result[key] = Buffer.from(object[key], 'hex');
87
+ });
88
+ return result;
89
+ };
90
+ var Eddsa = function () { return __awaiter(void 0, void 0, void 0, function () {
91
+ var ed25519, shamir, keyShare, keyCombine, signShare, sign, signCombine, verify;
92
+ return __generator(this, function (_a) {
93
+ switch (_a.label) {
94
+ case 0: return [4 /*yield*/, curves_1.default()];
95
+ case 1:
96
+ ed25519 = _a.sent();
97
+ shamir = shamir_1.default(ed25519);
98
+ keyShare = function (index, threshold, numShares) {
99
+ assert(index > 0 && index <= numShares);
100
+ var sk = crypto_1.randomBytes(32);
101
+ var h = Buffer.from(js_sha512_1.sha512.digest(sk));
102
+ var zeroBuffer = Buffer.alloc(64 - h.length);
103
+ var combinedBuffer = Buffer.concat([zeroBuffer, h]);
104
+ var uBuffer = combinedBuffer.slice(0, 32);
105
+ uBuffer[0] &= 248;
106
+ uBuffer[31] &= 63;
107
+ uBuffer[31] |= 64;
108
+ var zeroBuffer32 = Buffer.alloc(32);
109
+ uBuffer = Buffer.concat([uBuffer, zeroBuffer32]);
110
+ var u = Buffer.from(ed25519.scalarReduce(uBuffer));
111
+ var y = Buffer.from(ed25519.basePointMult(u));
112
+ var split_u = shamir.split(u, threshold, numShares);
113
+ var prefixBuffer = combinedBuffer.subarray(32, combinedBuffer.length);
114
+ prefixBuffer = Buffer.concat([zeroBuffer32, prefixBuffer]);
115
+ var prefix = Buffer.from(ed25519.scalarReduce(prefixBuffer));
116
+ var P_i = {
117
+ i: index.toString(),
118
+ y: y.toString('hex'),
119
+ u: split_u[index.toString()].toString('hex'),
120
+ prefix: prefix.toString('hex'),
121
+ };
122
+ var shares = {
123
+ uShare: P_i,
124
+ yShares: {},
125
+ };
126
+ for (var ind in split_u) {
127
+ if (ind === index.toString()) {
128
+ continue;
129
+ }
130
+ shares.yShares[ind] = {
131
+ i: ind,
132
+ j: P_i['i'],
133
+ y: y.toString('hex'),
134
+ u: split_u[ind].toString('hex'),
135
+ };
136
+ }
137
+ return shares;
138
+ };
139
+ keyCombine = function (uShare, distributedShares) {
140
+ // u-shares and y-shares required buffer format for curve functions
141
+ var shares = __spreadArray([uShare], distributedShares).map(function (share) { return convertObjectHexToBuffer(share, ['y', 'u']); });
142
+ var yShares = shares.map(function (share) { return share['y']; });
143
+ var uShares = shares.map(function (share) { return share['u']; });
144
+ var y = Buffer.from(yShares.reduce(function (partial, share) { return ed25519.pointAdd(partial, share); }));
145
+ var x = Buffer.from(uShares.reduce(function (partial, share) { return ed25519.scalarAdd(partial, share); }));
146
+ var P_i = {
147
+ i: uShare['i'],
148
+ y: y.toString('hex'),
149
+ x: x.toString('hex'),
150
+ prefix: uShare['prefix'],
151
+ };
152
+ var players = {
153
+ pShare: P_i,
154
+ jShares: {},
155
+ };
156
+ for (var ind = 0; ind < distributedShares.length; ind++) {
157
+ var P_j = distributedShares[ind];
158
+ players.jShares[P_j['j']] = {
159
+ i: P_j['j'],
160
+ j: P_i['i'],
161
+ };
162
+ }
163
+ return players;
164
+ };
165
+ signShare = function (message, pShare, jShares) {
166
+ // x-shares and y-shares required buffer format for curve functions
167
+ var shares = __spreadArray([convertObjectHexToBuffer(pShare, ['x', 'y'])], jShares);
168
+ var indices = shares.map(function (share) { return share['i']; });
169
+ // use big endian for prefix
170
+ var randomBuffer = crypto_1.randomBytes(32);
171
+ var prefix_reference = Buffer.from(pShare['prefix'], 'hex');
172
+ prefix_reference.reverse();
173
+ var combinedBuffer = Buffer.concat([prefix_reference, message, randomBuffer]);
174
+ // using big endian
175
+ var digest = Buffer.from(js_sha512_1.sha512.digest(combinedBuffer));
176
+ digest.reverse();
177
+ var r = Buffer.from(ed25519.scalarReduce(digest));
178
+ var R = Buffer.from(ed25519.basePointMult(r));
179
+ var split_r = shamir.split(r, shares.length, shares.length, indices);
180
+ var P_i = {
181
+ i: pShare['i'],
182
+ y: pShare['y'],
183
+ x: pShare['x'],
184
+ r: split_r[pShare['i']].toString('hex'),
185
+ R: R.toString('hex'),
186
+ };
187
+ var resultShares = {
188
+ xShare: P_i,
189
+ rShares: {},
190
+ };
191
+ for (var ind = 0; ind < jShares.length; ind++) {
192
+ var S_j = jShares[ind];
193
+ resultShares.rShares[S_j['i']] = {
194
+ i: S_j['i'],
195
+ j: pShare['i'],
196
+ r: split_r[S_j['i']].toString('hex'),
197
+ R: R.toString('hex'),
198
+ };
199
+ }
200
+ return resultShares;
201
+ };
202
+ sign = function (message, playerShare, distributedShares) {
203
+ // x, y, r, R required buffer format for curve functions
204
+ var shares = __spreadArray([playerShare], distributedShares).map(function (share) { return convertObjectHexToBuffer(share, ['R', 'r']); });
205
+ var S_i = playerShare;
206
+ var rShares = shares.map(function (share) { return share['R']; });
207
+ var littleRShares = shares.map(function (share) { return share['r']; });
208
+ var R = Buffer.from(rShares.reduce(function (partial, share) { return ed25519.pointAdd(partial, share); }));
209
+ var r = Buffer.from(littleRShares.reduce(function (partial, share) { return ed25519.scalarAdd(partial, share); }));
210
+ var combinedBuffer = Buffer.concat([R, Buffer.from(S_i['y'], 'hex'), message]);
211
+ var digest = Buffer.from(js_sha512_1.sha512.digest(combinedBuffer));
212
+ var k = Buffer.from(ed25519.scalarReduce(digest));
213
+ var gamma = Buffer.from(ed25519.scalarAdd(r, ed25519.scalarMult(k, Buffer.from(S_i['x'], 'hex'))));
214
+ var result = {
215
+ i: playerShare['i'],
216
+ y: playerShare['y'],
217
+ gamma: gamma.toString('hex'),
218
+ R: R.toString('hex'),
219
+ };
220
+ return result;
221
+ };
222
+ signCombine = function (shares) {
223
+ shares = shares.map(function (share) { return convertObjectHexToBuffer(share, ['y', 'gamma', 'R']); });
224
+ var keys = Object.keys(shares);
225
+ var y = shares[keys[0]]['y'];
226
+ var R = shares[keys[0]]['R'];
227
+ var resultShares = {};
228
+ for (var ind in shares) {
229
+ var S_i = shares[ind];
230
+ resultShares[S_i['i']] = S_i['gamma'];
231
+ }
232
+ var sigma = shamir.combine(resultShares);
233
+ sigma = Buffer.from(sigma);
234
+ var result = {
235
+ y: y.toString('hex'),
236
+ R: R.toString('hex'),
237
+ sigma: sigma.toString('hex'),
238
+ };
239
+ return result;
240
+ };
241
+ verify = function (message, signature) {
242
+ var publicKey = Buffer.from(signature['y'], 'hex');
243
+ var signedMessage = Buffer.concat([
244
+ Buffer.from(signature['R'], 'hex'),
245
+ Buffer.from(signature['sigma'], 'hex'),
246
+ message,
247
+ ]);
248
+ return Buffer.from(ed25519.verify(publicKey, signedMessage));
249
+ };
250
+ return [2 /*return*/, { keyShare: keyShare, keyCombine: keyCombine, signShare: signShare, sign: sign, signCombine: signCombine, verify: verify }];
251
+ }
252
+ });
253
+ }); };
254
+ exports.default = Eddsa;
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21wYy90c3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDakMsb0RBQW9DO0FBQ3BDLHVDQUFtQztBQUNuQyxvREFBOEI7QUFDOUIsaUNBQTBEO0FBRTFELElBQU0sd0JBQXdCLEdBQUcsVUFBQyxNQUEyQixFQUFFLElBQWM7SUFDM0UsSUFBTSxNQUFNLEdBQVEsTUFBTSxDQUFDO0lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHO1FBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBdUVGLElBQU0sS0FBSyxHQUFHOzs7O29CQUNJLHFCQUFNLGdCQUFZLEVBQUUsRUFBQTs7Z0JBQTlCLE9BQU8sR0FBRyxTQUFvQjtnQkFDOUIsTUFBTSxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXpCLFFBQVEsR0FBRyxVQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFNBQWlCO29CQUNuRSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxDQUFDLENBQUM7b0JBQ3hDLElBQU0sRUFBRSxHQUFHLG9CQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNqQyxJQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxD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TSxDQUFDO3dCQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUM7d0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQzt3QkFDdEMsT0FBTztxQkFDUixDQUFDLENBQUM7b0JBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELENBQUMsQ0FBQztnQkFFRixzQkFBTyxFQUFFLFFBQVEsVUFBQSxFQUFFLFVBQVUsWUFBQSxFQUFFLFNBQVMsV0FBQSxFQUFFLElBQUksTUFBQSxFQUFFLFdBQVcsYUFBQSxFQUFFLE1BQU0sUUFBQSxFQUFFLEVBQUM7OztLQUN2RSxDQUFDO0FBRUYsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBNUEMgdXNpbmcgdGhyZXNob2xkIHNpZ25hdHVyZSBzY2hlbWUgKFRTUykuIEl0IGNvbnRhaW5zXG4gKiBmdW5jdGlvbnMgZm9yIGtleSBnZW5lcmF0aW9uIGFuZCBtZXNzYWdlIHNpZ25pbmcgd2l0aCBFZERTQS5cbiAqXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PVxuICogRWREU0EgS2V5IEdlbmVyYXRpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT1cbiAqIDEuIEVhY2ggc2lnbmVyIGdlbmVyYXRlcyB0aGVpciBvd24ga2V5IHNoYXJlLCB3aGljaCBpbnZvbHZlcyBhIHByaXZhdGUgdS1zaGFyZSBhbmQgYSBwdWJsaWMgeS1zaGFyZS5cbiAqIDIuIFNpZ25lcnMgZGlzdHJpYnV0ZSB0aGVpciB5LXNoYXJlIHRvIG90aGVyIHNpZ25lcnMuXG4gKiAzLiBBZnRlciBleGNoYW5naW5nIHktc2hhcmVzIHRoZSBuZXh0IHBoYXNlIGlzIHRvIGNvbWJpbmUga2V5IHNoYXJlcy4gRWFjaCBzaWduZXIgY29tYmluZXMgdGhlaXIgdS1zaGFyZVxuICogICAgd2l0aCB0aGUgeS1zaGFyZXMgcmVjZWl2ZWQgZnJvbSBvdGhlciBzaWduZXJzIGluIG9yZGVyIHRvIGdlbmVyYXRlIGEgcC1zaGFyZSBmb3IgdGhlbXNlbHZlcy4gV2VcbiAqICAgIGFsc28gc2F2ZSBqLXNoYXJlcyBmb3Igb3RoZXIgc2lnbmVycy5cbiAqIDQuIEF0IHRoaXMgcG9pbnQgdGhlIHBsYXllcnMgZG8gbm90IGRpc3RyaWJ1dGUgYW55IHNoYXJlcyBhbmQgdGhlIGZpcnN0IHBoYXNlIG9mIHRoZVxuICogICAgc2lnbmluZyBwcm90b2NvbCBpcyBjb21wbGV0ZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09XG4gKiBFZERTQSBTaWduaW5nXG4gKiA9PT09PT09PT09PT09PT09PT09PT09XG4gKiAxLiBUaGUgcGFydGllcyBmcm9tIGtleSBnZW5lcmF0aW9uIGRlY2lkZSB0aGV5IHdhbnQgdG8gc2lnbiBzb21ldGhpbmcuIFRoZXkgYmVnaW4gdGhlIHNpZ25pbmcgcHJvdG9jb2xcbiAqICAgIGJ5IGdlbmVyYXRpbmcgc2hhcmVzIG9mIGFuIGVwaGVtZXJhbCBrZXkuXG4gKlxuICogICAgYSkgRWFjaCBzaWduZXIgdXNlcyBoaXMgcC1zaGFyZSBhbmQgdGhlIGotc2hhcmVzIHN0b3JlZCBmb3Igb3RoZXIgcGxheWVycyB0byBnZW5lcmF0ZSBoaXMgc2lnbmluZyBzaGFyZS5cbiAqICAgIGIpIFRoaXMgcmVzdWx0cyBpbiBlYWNoIHNpZ25lciBoYXZpbmcgYSBwcml2YXRlIHgtc2hhcmUgYW5kIHB1YmxpYyByLXNoYXJlcy5cbiAqXG4gKiAyLiBTaWduZXJzIGRpc3RyaWJ1dGUgdGhlaXIgci1zaGFyZXMgdG8gb3RoZXIgc2lnbmVycy5cbiAqIDMuIEFmdGVyIGV4Y2hhbmdpbmcgci1zaGFyZXMsIGVhY2ggc2lnbmVyIHNpZ25zIHRoZWlyIHNoYXJlIG9mIHRoZSBlcGhlbWVyYWwga2V5IHVzaW5nIHRoZWlyIHByaXZhdGVcbiAqICAgIHgtc2hhcmUgd2l0aCB0aGUgci1zaGFyZXMgZnJvbSBvdGhlciBzaWduZXJzLlxuICogNC4gVGhpcyByZXN1bHRzIGluIGVhY2ggc2lnbmVyIGhhdmluZyBhIHB1YmxpYyBnLXNoYXJlIHdoaWNoIHRoZXkgc2VuZCB0byB0aGUgb3RoZXIgc2lnbmVycy5cbiAqIDUuIEFmdGVyIHRoZSBzaWduZXJzIGJyb2FkY2FzdCB0aGVpciBnLXNoYXJlcywgdGhlIGZpbmFsIHNpZ25hdHVyZSBjYW4gYmUgcmUtY29uc3RydWN0ZWQgaW5kZXBlbmRlbnRseS5cbiAqL1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5pbXBvcnQgRWQyNTUxOUN1cnZlIGZyb20gJy4vY3VydmVzJztcbmltcG9ydCB7IHNoYTUxMiB9IGZyb20gJ2pzLXNoYTUxMic7XG5pbXBvcnQgU2hhbWlyIGZyb20gJy4vc2hhbWlyJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIGFzIGNyeXB0b1JhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuY29uc3QgY29udmVydE9iamVjdEhleFRvQnVmZmVyID0gKG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Piwga2V5czogc3RyaW5nW10pID0+IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSBvYmplY3Q7XG4gIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzdWx0W2tleV0gPSBCdWZmZXIuZnJvbShvYmplY3Rba2V5XSwgJ2hleCcpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmludGVyZmFjZSBVU2hhcmUge1xuICBpOiBzdHJpbmc7XG4gIHk6IHN0cmluZztcbiAgdTogc3RyaW5nO1xuICBwcmVmaXg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFlTaGFyZSB7XG4gIGk6IHN0cmluZztcbiAgajogc3RyaW5nO1xuICB5OiBzdHJpbmc7XG4gIHU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEtleVNoYXJlIHtcbiAgdVNoYXJlOiBVU2hhcmU7XG4gIHlTaGFyZXM6IFJlY29yZDxzdHJpbmcsIFlTaGFyZT47XG59XG5cbmludGVyZmFjZSBQU2hhcmUge1xuICBpOiBzdHJpbmc7XG4gIHg6IHN0cmluZztcbiAgeTogc3RyaW5nO1xuICBwcmVmaXg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEpTaGFyZSB7XG4gIGk6IHN0cmluZztcbiAgajogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgS2V5Q29tYmluZSB7XG4gIHBTaGFyZTogUFNoYXJlO1xuICBqU2hhcmVzOiBSZWNvcmQ8c3RyaW5nLCBKU2hhcmU+O1xufVxuXG5pbnRlcmZhY2UgWFNoYXJlIHtcbiAgaTogc3RyaW5nO1xuICB5OiBzdHJpbmc7XG4gIHg6IHN0cmluZztcbiAgcjogc3RyaW5nO1xuICBSOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSU2hhcmUge1xuICBpOiBzdHJpbmc7XG4gIGo6IHN0cmluZztcbiAgcjogc3RyaW5nO1xuICBSOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTaWduU2hhcmUge1xuICB4U2hhcmU6IFhTaGFyZTtcbiAgclNoYXJlczogUmVjb3JkPHN0cmluZywgUlNoYXJlPjtcbn1cblxuaW50ZXJmYWNlIEdTaGFyZSB7XG4gIGk6IHN0cmluZztcbiAgeTogc3RyaW5nO1xuICBnYW1tYTogc3RyaW5nO1xuICBSOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTaWduYXR1cmUge1xuICB5OiBzdHJpbmc7XG4gIFI6IHN0cmluZztcbiAgc2lnbWE6IHN0cmluZztcbn1cblxuY29uc3QgRWRkc2EgPSBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGVkMjU1MTkgPSBhd2FpdCBFZDI1NTE5Q3VydmUoKTtcbiAgY29uc3Qgc2hhbWlyID0gU2hhbWlyKGVkMjU1MTkpO1xuXG4gIGNvbnN0IGtleVNoYXJlID0gKGluZGV4OiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyLCBudW1TaGFyZXM6IG51bWJlcik6IEtleVNoYXJlID0+IHtcbiAgICBhc3NlcnQoaW5kZXggPiAwICYmIGluZGV4IDw9IG51bVNoYXJlcyk7XG4gICAgY29uc3Qgc2sgPSBjcnlwdG9SYW5kb21CeXRlcygzMik7XG4gICAgY29uc3QgaCA9IEJ1ZmZlci5mcm9tKHNoYTUxMi5kaWdlc3Qoc2spKTtcbiAgICBjb25zdCB6ZXJvQnVmZmVyID0gQnVmZmVyLmFsbG9jKDY0IC0gaC5sZW5ndGgpO1xuICAgIGNvbnN0IGNvbWJpbmVkQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbemVyb0J1ZmZlciwgaF0pO1xuXG4gICAgbGV0IHVCdWZmZXIgPSBjb21iaW5lZEJ1ZmZlci5zbGljZSgwLCAzMik7XG4gICAgdUJ1ZmZlclswXSAmPSAyNDg7XG4gICAgdUJ1ZmZlclszMV0gJj0gNjM7XG4gICAgdUJ1ZmZlclszMV0gfD0gNjQ7XG5cbiAgICBjb25zdCB6ZXJvQnVmZmVyMzIgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgIHVCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFt1QnVmZmVyLCB6ZXJvQnVmZmVyMzJdKTtcbiAgICBjb25zdCB1ID0gQnVmZmVyLmZyb20oZWQyNTUxOS5zY2FsYXJSZWR1Y2UodUJ1ZmZlcikpO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbShlZDI1NTE5LmJhc2VQb2ludE11bHQodSkpO1xuICAgIGNvbnN0IHNwbGl0X3UgPSBzaGFtaXIuc3BsaXQodSwgdGhyZXNob2xkLCBudW1TaGFyZXMpO1xuXG4gICAgbGV0IHByZWZpeEJ1ZmZlciA9IGNvbWJpbmVkQnVmZmVyLnN1YmFycmF5KDMyLCBjb21iaW5lZEJ1ZmZlci5sZW5ndGgpO1xuICAgIHByZWZpeEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3plcm9CdWZmZXIzMiwgcHJlZml4QnVmZmVyXSk7XG4gICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oZWQyNTUxOS5zY2FsYXJSZWR1Y2UocHJlZml4QnVmZmVyKSk7XG5cbiAgICBjb25zdCBQX2k6IFVTaGFyZSA9IHtcbiAgICAgIGk6IGluZGV4LnRvU3RyaW5nKCksXG4gICAgICB5OiB5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IHNwbGl0X3VbaW5kZXgudG9TdHJpbmcoKV0udG9TdHJpbmcoJ2hleCcpLFxuICAgICAgcHJlZml4OiBwcmVmaXgudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgY29uc3Qgc2hhcmVzOiBLZXlTaGFyZSA9IHtcbiAgICAgIHVTaGFyZTogUF9pLFxuICAgICAgeVNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgaW5kIGluIHNwbGl0X3UpIHtcbiAgICAgIGlmIChpbmQgPT09IGluZGV4LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzaGFyZXMueVNoYXJlc1tpbmRdID0ge1xuICAgICAgICBpOiBpbmQsXG4gICAgICAgIGo6IFBfaVsnaSddLFxuICAgICAgICB5OiB5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdTogc3BsaXRfdVtpbmRdLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzaGFyZXM7XG4gIH07XG4gIGNvbnN0IGtleUNvbWJpbmUgPSAodVNoYXJlOiBVU2hhcmUsIGRpc3RyaWJ1dGVkU2hhcmVzOiBZU2hhcmVbXSk6IEtleUNvbWJpbmUgPT4ge1xuICAgIC8vIHUtc2hhcmVzIGFuZCB5LXNoYXJlcyByZXF1aXJlZCBidWZmZXIgZm9ybWF0IGZvciBjdXJ2ZSBmdW5jdGlvbnNcbiAgICBjb25zdCBzaGFyZXMgPSBbdVNoYXJlLCAuLi5kaXN0cmlidXRlZFNoYXJlc10ubWFwKChzaGFyZSkgPT4gY29udmVydE9iamVjdEhleFRvQnVmZmVyKHNoYXJlLCBbJ3knLCAndSddKSk7XG4gICAgY29uc3QgeVNoYXJlcyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZVsneSddKTtcbiAgICBjb25zdCB1U2hhcmVzID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IHNoYXJlWyd1J10pO1xuICAgIGNvbnN0IHkgPSBCdWZmZXIuZnJvbSh5U2hhcmVzLnJlZHVjZSgocGFydGlhbCwgc2hhcmUpID0+IGVkMjU1MTkucG9pbnRBZGQocGFydGlhbCwgc2hhcmUpKSk7XG4gICAgY29uc3QgeCA9IEJ1ZmZlci5mcm9tKHVTaGFyZXMucmVkdWNlKChwYXJ0aWFsLCBzaGFyZSkgPT4gZWQyNTUxOS5zY2FsYXJBZGQocGFydGlhbCwgc2hhcmUpKSk7XG5cbiAgICBjb25zdCBQX2k6IFBTaGFyZSA9IHtcbiAgICAgIGk6IHVTaGFyZVsnaSddLFxuICAgICAgeTogeS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiB4LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHByZWZpeDogdVNoYXJlWydwcmVmaXgnXSxcbiAgICB9O1xuICAgIGNvbnN0IHBsYXllcnM6IEtleUNvbWJpbmUgPSB7XG4gICAgICBwU2hhcmU6IFBfaSxcbiAgICAgIGpTaGFyZXM6IHt9LFxuICAgIH07XG5cbiAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCBkaXN0cmlidXRlZFNoYXJlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBjb25zdCBQX2ogPSBkaXN0cmlidXRlZFNoYXJlc1tpbmRdO1xuICAgICAgcGxheWVycy5qU2hhcmVzW1BfalsnaiddXSA9IHtcbiAgICAgICAgaTogUF9qWydqJ10sXG4gICAgICAgIGo6IFBfaVsnaSddLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBsYXllcnM7XG4gIH07XG5cbiAgY29uc3Qgc2lnblNoYXJlID0gKG1lc3NhZ2U6IEJ1ZmZlciwgcFNoYXJlOiBQU2hhcmUsIGpTaGFyZXM6IEpTaGFyZVtdKTogU2lnblNoYXJlID0+IHtcbiAgICAvLyB4LXNoYXJlcyBhbmQgeS1zaGFyZXMgcmVxdWlyZWQgYnVmZmVyIGZvcm1hdCBmb3IgY3VydmUgZnVuY3Rpb25zXG4gICAgY29uc3Qgc2hhcmVzID0gW2NvbnZlcnRPYmplY3RIZXhUb0J1ZmZlcihwU2hhcmUsIFsneCcsICd5J10pLCAuLi5qU2hhcmVzXTtcbiAgICBjb25zdCBpbmRpY2VzID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IHNoYXJlWydpJ10pO1xuXG4gICAgLy8gdXNlIGJpZyBlbmRpYW4gZm9yIHByZWZpeFxuICAgIGNvbnN0IHJhbmRvbUJ1ZmZlciA9IGNyeXB0b1JhbmRvbUJ5dGVzKDMyKTtcbiAgICBjb25zdCBwcmVmaXhfcmVmZXJlbmNlID0gQnVmZmVyLmZyb20ocFNoYXJlWydwcmVmaXgnXSwgJ2hleCcpO1xuICAgIHByZWZpeF9yZWZlcmVuY2UucmV2ZXJzZSgpO1xuICAgIGNvbnN0IGNvbWJpbmVkQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbcHJlZml4X3JlZmVyZW5jZSwgbWVzc2FnZSwgcmFuZG9tQnVmZmVyXSk7XG5cbiAgICAvLyB1c2luZyBiaWcgZW5kaWFuXG4gICAgY29uc3QgZGlnZXN0ID0gQnVmZmVyLmZyb20oc2hhNTEyLmRpZ2VzdChjb21iaW5lZEJ1ZmZlcikpO1xuICAgIGRpZ2VzdC5yZXZlcnNlKCk7XG5cbiAgICBjb25zdCByID0gQnVmZmVyLmZyb20oZWQyNTUxOS5zY2FsYXJSZWR1Y2UoZGlnZXN0KSk7XG4gICAgY29uc3QgUiA9IEJ1ZmZlci5mcm9tKGVkMjU1MTkuYmFzZVBvaW50TXVsdChyKSk7XG4gICAgY29uc3Qgc3BsaXRfciA9IHNoYW1pci5zcGxpdChyLCBzaGFyZXMubGVuZ3RoLCBzaGFyZXMubGVuZ3RoLCBpbmRpY2VzKTtcblxuICAgIGNvbnN0IFBfaTogWFNoYXJlID0ge1xuICAgICAgaTogcFNoYXJlWydpJ10sXG4gICAgICB5OiBwU2hhcmVbJ3knXSxcbiAgICAgIHg6IHBTaGFyZVsneCddLFxuICAgICAgcjogc3BsaXRfcltwU2hhcmVbJ2knXV0udG9TdHJpbmcoJ2hleCcpLFxuICAgICAgUjogUi50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdFNoYXJlczogU2lnblNoYXJlID0ge1xuICAgICAgeFNoYXJlOiBQX2ksXG4gICAgICByU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgalNoYXJlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBjb25zdCBTX2ogPSBqU2hhcmVzW2luZF07XG4gICAgICByZXN1bHRTaGFyZXMuclNoYXJlc1tTX2pbJ2knXV0gPSB7XG4gICAgICAgIGk6IFNfalsnaSddLFxuICAgICAgICBqOiBwU2hhcmVbJ2knXSxcbiAgICAgICAgcjogc3BsaXRfcltTX2pbJ2knXV0udG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBSOiBSLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRTaGFyZXM7XG4gIH07XG5cbiAgY29uc3Qgc2lnbiA9IChtZXNzYWdlOiBCdWZmZXIsIHBsYXllclNoYXJlOiBYU2hhcmUsIGRpc3RyaWJ1dGVkU2hhcmVzOiBSU2hhcmVbXSk6IEdTaGFyZSA9PiB7XG4gICAgLy8geCwgeSwgciwgUiByZXF1aXJlZCBidWZmZXIgZm9ybWF0IGZvciBjdXJ2ZSBmdW5jdGlvbnNcbiAgICBjb25zdCBzaGFyZXMgPSBbcGxheWVyU2hhcmUsIC4uLmRpc3RyaWJ1dGVkU2hhcmVzXS5tYXAoKHNoYXJlKSA9PiBjb252ZXJ0T2JqZWN0SGV4VG9CdWZmZXIoc2hhcmUsIFsnUicsICdyJ10pKTtcbiAgICBjb25zdCBTX2kgPSBwbGF5ZXJTaGFyZTtcblxuICAgIGNvbnN0IHJTaGFyZXMgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gc2hhcmVbJ1InXSk7XG4gICAgY29uc3QgbGl0dGxlUlNoYXJlcyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZVsnciddKTtcblxuICAgIGNvbnN0IFIgPSBCdWZmZXIuZnJvbShyU2hhcmVzLnJlZHVjZSgocGFydGlhbCwgc2hhcmUpID0+IGVkMjU1MTkucG9pbnRBZGQocGFydGlhbCwgc2hhcmUpKSk7XG4gICAgY29uc3QgciA9IEJ1ZmZlci5mcm9tKGxpdHRsZVJTaGFyZXMucmVkdWNlKChwYXJ0aWFsLCBzaGFyZSkgPT4gZWQyNTUxOS5zY2FsYXJBZGQocGFydGlhbCwgc2hhcmUpKSk7XG5cbiAgICBjb25zdCBjb21iaW5lZEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW1IsIEJ1ZmZlci5mcm9tKFNfaVsneSddLCAnaGV4JyksIG1lc3NhZ2VdKTtcbiAgICBjb25zdCBkaWdlc3QgPSBCdWZmZXIuZnJvbShzaGE1MTIuZGlnZXN0KGNvbWJpbmVkQnVmZmVyKSk7XG4gICAgY29uc3QgayA9IEJ1ZmZlci5mcm9tKGVkMjU1MTkuc2NhbGFyUmVkdWNlKGRpZ2VzdCkpO1xuXG4gICAgY29uc3QgZ2FtbWEgPSBCdWZmZXIuZnJvbShlZDI1NTE5LnNjYWxhckFkZChyLCBlZDI1NTE5LnNjYWxhck11bHQoaywgQnVmZmVyLmZyb20oU19pWyd4J10sICdoZXgnKSkpKTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBpOiBwbGF5ZXJTaGFyZVsnaSddLFxuICAgICAgeTogcGxheWVyU2hhcmVbJ3knXSxcbiAgICAgIGdhbW1hOiBnYW1tYS50b1N0cmluZygnaGV4JyksXG4gICAgICBSOiBSLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgY29uc3Qgc2lnbkNvbWJpbmUgPSAoc2hhcmVzOiBHU2hhcmVbXSk6IFNpZ25hdHVyZSA9PiB7XG4gICAgc2hhcmVzID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IGNvbnZlcnRPYmplY3RIZXhUb0J1ZmZlcihzaGFyZSwgWyd5JywgJ2dhbW1hJywgJ1InXSkpO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzaGFyZXMpO1xuICAgIGNvbnN0IHkgPSBzaGFyZXNba2V5c1swXV1bJ3knXTtcbiAgICBjb25zdCBSID0gc2hhcmVzW2tleXNbMF1dWydSJ107XG5cbiAgICBjb25zdCByZXN1bHRTaGFyZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGluZCBpbiBzaGFyZXMpIHtcbiAgICAgIGNvbnN0IFNfaSA9IHNoYXJlc1tpbmRdO1xuICAgICAgcmVzdWx0U2hhcmVzW1NfaVsnaSddXSA9IFNfaVsnZ2FtbWEnXTtcbiAgICB9XG4gICAgbGV0IHNpZ21hOiBCdWZmZXIgPSBzaGFtaXIuY29tYmluZShyZXN1bHRTaGFyZXMpO1xuICAgIHNpZ21hID0gQnVmZmVyLmZyb20oc2lnbWEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHk6IHkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgUjogUi50b1N0cmluZygnaGV4JyksXG4gICAgICBzaWdtYTogc2lnbWEudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBjb25zdCB2ZXJpZnkgPSAobWVzc2FnZTogQnVmZmVyLCBzaWduYXR1cmU6IFNpZ25hdHVyZSk6IEJ1ZmZlciA9PiB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gQnVmZmVyLmZyb20oc2lnbmF0dXJlWyd5J10sICdoZXgnKTtcbiAgICBjb25zdCBzaWduZWRNZXNzYWdlID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICBCdWZmZXIuZnJvbShzaWduYXR1cmVbJ1InXSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20oc2lnbmF0dXJlWydzaWdtYSddLCAnaGV4JyksXG4gICAgICBtZXNzYWdlLFxuICAgIF0pO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShlZDI1NTE5LnZlcmlmeShwdWJsaWNLZXksIHNpZ25lZE1lc3NhZ2UpKTtcbiAgfTtcblxuICByZXR1cm4geyBrZXlTaGFyZSwga2V5Q29tYmluZSwgc2lnblNoYXJlLCBzaWduLCBzaWduQ29tYmluZSwgdmVyaWZ5IH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFZGRzYTtcbiJdfQ==
@@ -0,0 +1,49 @@
1
+ /// <reference types="node" />
2
+ export interface HdKeypair {
3
+ key: Buffer;
4
+ chainCode: Buffer;
5
+ }
6
+ /**
7
+ * Heirarchical determinisitic key derivation for the ed25519 elliptic curve,
8
+ * as defined in SLIP-0010.
9
+ *
10
+ * https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0005.md
11
+ * https://github.com/satoshilabs/slips/blob/master/slip-0010.md
12
+ */
13
+ export declare class Ed25519KeyDeriver {
14
+ /**
15
+ * This key derivation code was copied and adapted from:
16
+ * https://github.com/chatch/stellar-hd-wallet/blob/612c12325ca9047dce460016fb7d148f55f575ca/src/hd-key.js
17
+ *
18
+ * There have been some slight modifications to improve typescript support.
19
+ *
20
+ * The original ed25519-hd-key module is licensed under "GPL-3".
21
+ */
22
+ private static readonly ED25519_CURVE;
23
+ private static readonly HARDENED_OFFSET;
24
+ private static readonly PATH_REGEX;
25
+ /**
26
+ * Derive a SLIP-0010 key given a path and master key seed.
27
+ *
28
+ * @param path derivation path
29
+ * @param seed key seed
30
+ */
31
+ static derivePath(path: string, seed: string): HdKeypair;
32
+ /**
33
+ * Generate a SLIP-0010 master key from the entropy seed
34
+ *
35
+ * @param seed master key seed used to recreate master key
36
+ */
37
+ private static getMasterKeyFromSeed;
38
+ /**
39
+ * Calculate a child private key given the parent key, the chain code, and the child index.
40
+ *
41
+ * @param key parent key
42
+ * @param chainCode chain code for parent key
43
+ * @param index index of child to derive
44
+ */
45
+ private static CKDPriv;
46
+ private static replaceDerive;
47
+ private static isValidPath;
48
+ }
49
+ //# sourceMappingURL=ed25519KeyDeriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ed25519KeyDeriver.d.ts","sourceRoot":"","sources":["../../../src/utils/ed25519KeyDeriver.ts"],"names":[],"mappings":";AAKA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;OAOG;IAEH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAkB;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAc;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAEpE;;;;;OAKG;WACW,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS;IAY/D;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAWnC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,OAAO;IAatB,OAAO,CAAC,MAAM,CAAC,aAAa,CAA+D;IAC3F,OAAO,CAAC,MAAM,CAAC,WAAW;CAM3B"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Ed25519KeyDeriver = void 0;
7
+ /**
8
+ * @prettier
9
+ */
10
+ var create_hmac_1 = __importDefault(require("create-hmac"));
11
+ /**
12
+ * Heirarchical determinisitic key derivation for the ed25519 elliptic curve,
13
+ * as defined in SLIP-0010.
14
+ *
15
+ * https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0005.md
16
+ * https://github.com/satoshilabs/slips/blob/master/slip-0010.md
17
+ */
18
+ var Ed25519KeyDeriver = /** @class */ (function () {
19
+ function Ed25519KeyDeriver() {
20
+ }
21
+ /**
22
+ * Derive a SLIP-0010 key given a path and master key seed.
23
+ *
24
+ * @param path derivation path
25
+ * @param seed key seed
26
+ */
27
+ Ed25519KeyDeriver.derivePath = function (path, seed) {
28
+ var _this = this;
29
+ if (!this.isValidPath(path)) {
30
+ throw new Error('Invalid derivation path');
31
+ }
32
+ var _a = this.getMasterKeyFromSeed(seed), key = _a.key, chainCode = _a.chainCode;
33
+ var segments = path.split('/').slice(1).map(this.replaceDerive);
34
+ return segments.reduce(function (parentKeys, segment) { return _this.CKDPriv(parentKeys, segment + Ed25519KeyDeriver.HARDENED_OFFSET); }, { key: key, chainCode: chainCode });
35
+ };
36
+ /**
37
+ * Generate a SLIP-0010 master key from the entropy seed
38
+ *
39
+ * @param seed master key seed used to recreate master key
40
+ */
41
+ Ed25519KeyDeriver.getMasterKeyFromSeed = function (seed) {
42
+ var hmac = create_hmac_1.default('sha512', Ed25519KeyDeriver.ED25519_CURVE);
43
+ var I = hmac.update(Buffer.from(seed, 'hex')).digest();
44
+ var IL = I.slice(0, 32);
45
+ var IR = I.slice(32);
46
+ return {
47
+ key: IL,
48
+ chainCode: IR,
49
+ };
50
+ };
51
+ /**
52
+ * Calculate a child private key given the parent key, the chain code, and the child index.
53
+ *
54
+ * @param key parent key
55
+ * @param chainCode chain code for parent key
56
+ * @param index index of child to derive
57
+ */
58
+ Ed25519KeyDeriver.CKDPriv = function (_a, index) {
59
+ var key = _a.key, chainCode = _a.chainCode;
60
+ var indexBuffer = Buffer.allocUnsafe(4);
61
+ indexBuffer.writeUInt32BE(index, 0);
62
+ var data = Buffer.concat([Buffer.alloc(1, 0), key, indexBuffer]);
63
+ var I = create_hmac_1.default('sha512', chainCode).update(data).digest();
64
+ var IL = I.slice(0, 32);
65
+ var IR = I.slice(32);
66
+ return {
67
+ key: IL,
68
+ chainCode: IR,
69
+ };
70
+ };
71
+ Ed25519KeyDeriver.isValidPath = function (path) {
72
+ if (!Ed25519KeyDeriver.PATH_REGEX.test(path)) {
73
+ return false;
74
+ }
75
+ return !path.split('/').slice(1).map(this.replaceDerive).some(isNaN);
76
+ };
77
+ /**
78
+ * This key derivation code was copied and adapted from:
79
+ * https://github.com/chatch/stellar-hd-wallet/blob/612c12325ca9047dce460016fb7d148f55f575ca/src/hd-key.js
80
+ *
81
+ * There have been some slight modifications to improve typescript support.
82
+ *
83
+ * The original ed25519-hd-key module is licensed under "GPL-3".
84
+ */
85
+ Ed25519KeyDeriver.ED25519_CURVE = 'ed25519 seed';
86
+ Ed25519KeyDeriver.HARDENED_OFFSET = 0x80000000;
87
+ Ed25519KeyDeriver.PATH_REGEX = new RegExp("^m(\\/[0-9]+')+$");
88
+ Ed25519KeyDeriver.replaceDerive = function (val) { return parseInt(val.replace("'", ''), 10); };
89
+ return Ed25519KeyDeriver;
90
+ }());
91
+ exports.Ed25519KeyDeriver = Ed25519KeyDeriver;
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWQyNTUxOUtleURlcml2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvZWQyNTUxOUtleURlcml2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0dBRUc7QUFDSCw0REFBcUM7QUFPckM7Ozs7OztHQU1HO0FBQ0g7SUFBQTtJQTJFQSxDQUFDO0lBN0RDOzs7OztPQUtHO0lBQ1csNEJBQVUsR0FBeEIsVUFBeUIsSUFBWSxFQUFFLElBQVk7UUFBbkQsaUJBVUM7UUFUQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDNUM7UUFDSyxJQUFBLEtBQXFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBbEQsR0FBRyxTQUFBLEVBQUUsU0FBUyxlQUFvQyxDQUFDO1FBQzNELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUNwQixVQUFDLFVBQVUsRUFBRSxPQUFPLElBQUssT0FBQSxLQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEVBQXJFLENBQXFFLEVBQzlGLEVBQUUsR0FBRyxLQUFBLEVBQUUsU0FBUyxXQUFBLEVBQUUsQ0FDbkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ1ksc0NBQW9CLEdBQW5DLFVBQW9DLElBQVk7UUFDOUMsSUFBTSxJQUFJLEdBQUcscUJBQVUsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkUsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pELElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsT0FBTztZQUNMLEdBQUcsRUFBRSxFQUFFO1lBQ1AsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNZLHlCQUFPLEdBQXRCLFVBQXVCLEVBQTZCLEVBQUUsS0FBYTtZQUExQyxHQUFHLFNBQUEsRUFBRSxTQUFTLGVBQUE7UUFDckMsSUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBTSxDQUFDLEdBQUcscUJBQVUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hFLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsT0FBTztZQUNMLEdBQUcsRUFBRSxFQUFFO1lBQ1AsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUdjLDZCQUFXLEdBQTFCLFVBQTJCLElBQVk7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBekVEOzs7Ozs7O09BT0c7SUFFcUIsK0JBQWEsR0FBRyxjQUFjLENBQUM7SUFDL0IsaUNBQWUsR0FBRyxVQUFVLENBQUM7SUFDN0IsNEJBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBd0RyRCwrQkFBYSxHQUFHLFVBQUMsR0FBVyxJQUFhLE9BQUEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFsQyxDQUFrQyxDQUFDO0lBTzdGLHdCQUFDO0NBQUEsQUEzRUQsSUEyRUM7QUEzRVksOENBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IGNyZWF0ZUhtYWMgZnJvbSAnY3JlYXRlLWhtYWMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhkS2V5cGFpciB7XG4gIGtleTogQnVmZmVyO1xuICBjaGFpbkNvZGU6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBIZWlyYXJjaGljYWwgZGV0ZXJtaW5pc2l0aWMga2V5IGRlcml2YXRpb24gZm9yIHRoZSBlZDI1NTE5IGVsbGlwdGljIGN1cnZlLFxuICogYXMgZGVmaW5lZCBpbiBTTElQLTAwMTAuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N0ZWxsYXIvc3RlbGxhci1wcm90b2NvbC9ibG9iL21hc3Rlci9lY29zeXN0ZW0vc2VwLTAwMDUubWRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXRvc2hpbGFicy9zbGlwcy9ibG9iL21hc3Rlci9zbGlwLTAwMTAubWRcbiAqL1xuZXhwb3J0IGNsYXNzIEVkMjU1MTlLZXlEZXJpdmVyIHtcbiAgLyoqXG4gICAqIFRoaXMga2V5IGRlcml2YXRpb24gY29kZSB3YXMgY29waWVkIGFuZCBhZGFwdGVkIGZyb206XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGF0Y2gvc3RlbGxhci1oZC13YWxsZXQvYmxvYi82MTJjMTIzMjVjYTkwNDdkY2U0NjAwMTZmYjdkMTQ4ZjU1ZjU3NWNhL3NyYy9oZC1rZXkuanNcbiAgICpcbiAgICogVGhlcmUgaGF2ZSBiZWVuIHNvbWUgc2xpZ2h0IG1vZGlmaWNhdGlvbnMgdG8gaW1wcm92ZSB0eXBlc2NyaXB0IHN1cHBvcnQuXG4gICAqXG4gICAqIFRoZSBvcmlnaW5hbCBlZDI1NTE5LWhkLWtleSBtb2R1bGUgaXMgbGljZW5zZWQgdW5kZXIgXCJHUEwtM1wiLlxuICAgKi9cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFRDI1NTE5X0NVUlZFID0gJ2VkMjU1MTkgc2VlZCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhBUkRFTkVEX09GRlNFVCA9IDB4ODAwMDAwMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBBVEhfUkVHRVggPSBuZXcgUmVnRXhwKFwiXm0oXFxcXC9bMC05XSsnKSskXCIpO1xuXG4gIC8qKlxuICAgKiBEZXJpdmUgYSBTTElQLTAwMTAga2V5IGdpdmVuIGEgcGF0aCBhbmQgbWFzdGVyIGtleSBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICogQHBhcmFtIHNlZWQga2V5IHNlZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVyaXZlUGF0aChwYXRoOiBzdHJpbmcsIHNlZWQ6IHN0cmluZyk6IEhkS2V5cGFpciB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRQYXRoKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZhdGlvbiBwYXRoJyk7XG4gICAgfVxuICAgIGNvbnN0IHsga2V5LCBjaGFpbkNvZGUgfSA9IHRoaXMuZ2V0TWFzdGVyS2V5RnJvbVNlZWQoc2VlZCk7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykuc2xpY2UoMSkubWFwKHRoaXMucmVwbGFjZURlcml2ZSk7XG4gICAgcmV0dXJuIHNlZ21lbnRzLnJlZHVjZShcbiAgICAgIChwYXJlbnRLZXlzLCBzZWdtZW50KSA9PiB0aGlzLkNLRFByaXYocGFyZW50S2V5cywgc2VnbWVudCArIEVkMjU1MTlLZXlEZXJpdmVyLkhBUkRFTkVEX09GRlNFVCksXG4gICAgICB7IGtleSwgY2hhaW5Db2RlIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIFNMSVAtMDAxMCBtYXN0ZXIga2V5IGZyb20gdGhlIGVudHJvcHkgc2VlZFxuICAgKlxuICAgKiBAcGFyYW0gc2VlZCBtYXN0ZXIga2V5IHNlZWQgdXNlZCB0byByZWNyZWF0ZSBtYXN0ZXIga2V5XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRNYXN0ZXJLZXlGcm9tU2VlZChzZWVkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBobWFjID0gY3JlYXRlSG1hYygnc2hhNTEyJywgRWQyNTUxOUtleURlcml2ZXIuRUQyNTUxOV9DVVJWRSk7XG4gICAgY29uc3QgSSA9IGhtYWMudXBkYXRlKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSkuZGlnZXN0KCk7XG4gICAgY29uc3QgSUwgPSBJLnNsaWNlKDAsIDMyKTtcbiAgICBjb25zdCBJUiA9IEkuc2xpY2UoMzIpO1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IElMLFxuICAgICAgY2hhaW5Db2RlOiBJUixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhIGNoaWxkIHByaXZhdGUga2V5IGdpdmVuIHRoZSBwYXJlbnQga2V5LCB0aGUgY2hhaW4gY29kZSwgYW5kIHRoZSBjaGlsZCBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIGtleSBwYXJlbnQga2V5XG4gICAqIEBwYXJhbSBjaGFpbkNvZGUgY2hhaW4gY29kZSBmb3IgcGFyZW50IGtleVxuICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgY2hpbGQgdG8gZGVyaXZlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBDS0RQcml2KHsga2V5LCBjaGFpbkNvZGUgfTogSGRLZXlwYWlyLCBpbmRleDogbnVtYmVyKTogSGRLZXlwYWlyIHtcbiAgICBjb25zdCBpbmRleEJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICBpbmRleEJ1ZmZlci53cml0ZVVJbnQzMkJFKGluZGV4LCAwKTtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmFsbG9jKDEsIDApLCBrZXksIGluZGV4QnVmZmVyXSk7XG4gICAgY29uc3QgSSA9IGNyZWF0ZUhtYWMoJ3NoYTUxMicsIGNoYWluQ29kZSkudXBkYXRlKGRhdGEpLmRpZ2VzdCgpO1xuICAgIGNvbnN0IElMID0gSS5zbGljZSgwLCAzMik7XG4gICAgY29uc3QgSVIgPSBJLnNsaWNlKDMyKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBJTCxcbiAgICAgIGNoYWluQ29kZTogSVIsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlcGxhY2VEZXJpdmUgPSAodmFsOiBzdHJpbmcpOiBudW1iZXIgPT4gcGFyc2VJbnQodmFsLnJlcGxhY2UoXCInXCIsICcnKSwgMTApO1xuICBwcml2YXRlIHN0YXRpYyBpc1ZhbGlkUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoIUVkMjU1MTlLZXlEZXJpdmVyLlBBVEhfUkVHRVgudGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIXBhdGguc3BsaXQoJy8nKS5zbGljZSgxKS5tYXAodGhpcy5yZXBsYWNlRGVyaXZlKS5zb21lKGlzTmFOKTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo/account-lib",
3
- "version": "2.18.0-rc.2",
3
+ "version": "2.18.0-rc.3",
4
4
  "description": "BitGo's account library functions",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
@@ -37,9 +37,9 @@
37
37
  "node": ">=14 <17"
38
38
  },
39
39
  "dependencies": {
40
- "@bitgo/blake2b": "^3.0.1",
40
+ "@bitgo/blake2b": "^3.0.2-rc.0",
41
41
  "@bitgo/bls": "^0.1.0",
42
- "@bitgo/statics": "^6.16.0-rc.1",
42
+ "@bitgo/statics": "^6.16.0-rc.2",
43
43
  "@celo/contractkit": "^1.2.4",
44
44
  "@ethereumjs/common": "^2.4.0",
45
45
  "@ethereumjs/tx": "^3.3.0",
@@ -62,6 +62,7 @@
62
62
  "bs58": "^4.0.1",
63
63
  "bs58check": "^2.1.2",
64
64
  "casper-client-sdk": "1.0.39",
65
+ "create-hmac": "^1.1.7",
65
66
  "elliptic": "^6.5.2",
66
67
  "ethereumjs-abi": "^0.6.5",
67
68
  "ethereumjs-util": "6.2.1",
@@ -70,6 +71,7 @@
70
71
  "hi-base32": "^0.5.1",
71
72
  "joi": "^17.4.0",
72
73
  "libsodium-wrappers": "^0.7.6",
74
+ "libsodium-wrappers-sumo": "^0.7.9",
73
75
  "lodash": "^4.17.15",
74
76
  "long": "^4.0.0",
75
77
  "protobufjs": "^6.8.9",
@@ -119,5 +121,5 @@
119
121
  "git add"
120
122
  ]
121
123
  },
122
- "gitHead": "159b53f7623c95de55fb6b61b06e7e6daec6deae"
124
+ "gitHead": "a6654a58f3d9cb49ebb4c35d6b200308f63e0fd6"
123
125
  }