@airgap/crypto 0.13.11-beta.1
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.md +7 -0
- package/derive.d.ts +3 -0
- package/derive.js +80 -0
- package/derive.js.map +1 -0
- package/ed25519/derive.d.ts +3 -0
- package/ed25519/derive.js +56 -0
- package/ed25519/derive.js.map +1 -0
- package/encoding.d.ts +12 -0
- package/encoding.js +50 -0
- package/encoding.js.map +1 -0
- package/index.d.ts +8 -0
- package/index.js +15 -0
- package/index.js.map +1 -0
- package/package.json +60 -0
- package/readme.md +0 -0
- package/sapling/derive.d.ts +3 -0
- package/sapling/derive.js +63 -0
- package/sapling/derive.js.map +1 -0
- package/secp256k1/derive.d.ts +3 -0
- package/secp256k1/derive.js +69 -0
- package/secp256k1/derive.js.map +1 -0
- package/secret.d.ts +3 -0
- package/secret.js +106 -0
- package/secret.js.map +1 -0
- package/sr25519/derive.d.ts +4 -0
- package/sr25519/derive.js +129 -0
- package/sr25519/derive.js.map +1 -0
- package/types/derivation.d.ts +22 -0
- package/types/derivation.js +3 -0
- package/types/derivation.js.map +1 -0
- package/types/key.d.ts +5 -0
- package/types/key.js +3 -0
- package/types/key.js.map +1 -0
- package/utils/bip32.d.ts +12 -0
- package/utils/bip32.js +80 -0
- package/utils/bip32.js.map +1 -0
- package/utils/bytes.d.ts +9 -0
- package/utils/bytes.js +44 -0
- package/utils/bytes.js.map +1 -0
- package/utils/derivation.d.ts +5 -0
- package/utils/derivation.js +33 -0
- package/utils/derivation.js.map +1 -0
- package/utils/factory.d.ts +6 -0
- package/utils/factory.js +48 -0
- package/utils/factory.js.map +1 -0
- package/utils/hash.d.ts +2 -0
- package/utils/hash.js +19 -0
- package/utils/hash.js.map +1 -0
- package/utils/hex.d.ts +8 -0
- package/utils/hex.js +22 -0
- package/utils/hex.js.map +1 -0
- package/utils/zip32.d.ts +14 -0
- package/utils/zip32.js +25 -0
- package/utils/zip32.js.map +1 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright 2019 Papers GmbH
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/derive.d.ts
ADDED
package/derive.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.derive = void 0;
|
|
40
|
+
var coinlib_core_1 = require("@airgap/coinlib-core");
|
|
41
|
+
var derive_1 = require("./ed25519/derive");
|
|
42
|
+
var derive_2 = require("./sapling/derive");
|
|
43
|
+
var derive_3 = require("./secp256k1/derive");
|
|
44
|
+
var derive_4 = require("./sr25519/derive");
|
|
45
|
+
var factory_1 = require("./utils/factory");
|
|
46
|
+
function derive(crypto, seed, derivationPath) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
48
|
+
var node;
|
|
49
|
+
return __generator(this, function (_a) {
|
|
50
|
+
switch (_a.label) {
|
|
51
|
+
case 0: return [4 /*yield*/, deriveNode(crypto, seed, derivationPath)];
|
|
52
|
+
case 1:
|
|
53
|
+
node = _a.sent();
|
|
54
|
+
return [2 /*return*/, (0, factory_1.newCryptoDerivativeFromNode)(node)];
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
exports.derive = derive;
|
|
60
|
+
function deriveNode(crypto, seed, derivationPath) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
62
|
+
return __generator(this, function (_a) {
|
|
63
|
+
switch (crypto.algorithm) {
|
|
64
|
+
case 'ed25519':
|
|
65
|
+
return [2 /*return*/, (0, derive_1.deriveEd25519)(seed, derivationPath, crypto.key)];
|
|
66
|
+
case 'sr25519':
|
|
67
|
+
return [2 /*return*/, (0, derive_4.deriveSr25519)(crypto.compatibility, seed, derivationPath)];
|
|
68
|
+
case 'secp256k1':
|
|
69
|
+
return [2 /*return*/, (0, derive_3.deriveSecp256K1)(seed, derivationPath, crypto.key)];
|
|
70
|
+
case 'sapling':
|
|
71
|
+
return [2 /*return*/, (0, derive_2.deriveSapling)(seed, derivationPath)];
|
|
72
|
+
default:
|
|
73
|
+
(0, coinlib_core_1.assertNever)(crypto);
|
|
74
|
+
throw new Error('Crypto algorithm not supported');
|
|
75
|
+
}
|
|
76
|
+
return [2 /*return*/];
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=derive.js.map
|
package/derive.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAkD;AAGlD,2CAAgD;AAChD,2CAAgD;AAChD,6CAAoD;AACpD,2CAAgD;AAEhD,2CAA6D;AAE7D,SAAsB,MAAM,CAAC,MAA2B,EAAE,IAAY,EAAE,cAAuB;;;;;wBAChE,qBAAM,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,EAAA;;oBAArE,IAAI,GAAmB,SAA8C;oBAE3E,sBAAO,IAAA,qCAA2B,EAAC,IAAI,CAAC,EAAA;;;;CACzC;AAJD,wBAIC;AAED,SAAe,UAAU,CAAC,MAA2B,EAAE,IAAY,EAAE,cAAuB;;;YAC1F,QAAQ,MAAM,CAAC,SAAS,EAAE;gBACxB,KAAK,SAAS;oBACZ,sBAAO,IAAA,sBAAa,EAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,EAAA;gBACxD,KAAK,SAAS;oBACZ,sBAAO,IAAA,sBAAa,EAAC,MAAM,CAAC,aAAa,EAAE,IAAI,EAAE,cAAc,CAAC,EAAA;gBAClE,KAAK,WAAW;oBACd,sBAAO,IAAA,wBAAe,EAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,EAAA;gBAC1D,KAAK,SAAS;oBACZ,sBAAO,IAAA,sBAAa,EAAC,IAAI,EAAE,cAAc,CAAC,EAAA;gBAC5C;oBACE,IAAA,0BAAW,EAAC,MAAM,CAAC,CAAA;oBACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;aACpD;;;;CACF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveEd25519 = void 0;
|
|
4
|
+
var ed25519_1 = require("@airgap/coinlib-core/dependencies/src/@stablelib/ed25519-1.0.3/packages/ed25519/ed25519");
|
|
5
|
+
var sha512_1 = require("@airgap/coinlib-core/dependencies/src/@stablelib/sha512-1.0.1/packages/sha512/sha512");
|
|
6
|
+
var hmac_1 = require("@stablelib/hmac");
|
|
7
|
+
var derivation_1 = require("../utils/derivation");
|
|
8
|
+
var hash_1 = require("../utils/hash");
|
|
9
|
+
var ED25519_KEY = 'ed25519 seed';
|
|
10
|
+
function deriveEd25519(seed, derivationPath, key) {
|
|
11
|
+
if (key === void 0) { key = ED25519_KEY; }
|
|
12
|
+
var masterNode = masterNodeFromSeed(seed, key);
|
|
13
|
+
return derivationPath !== undefined ? derive(masterNode, derivationPath) : masterNode;
|
|
14
|
+
}
|
|
15
|
+
exports.deriveEd25519 = deriveEd25519;
|
|
16
|
+
function masterNodeFromSeed(seed, key) {
|
|
17
|
+
var _a = getKey(seed, Buffer.from(key, 'utf-8')), secretKey = _a.key, chainCode = _a.chainCode;
|
|
18
|
+
return {
|
|
19
|
+
depth: 0,
|
|
20
|
+
parentFingerprint: 0x00000000,
|
|
21
|
+
index: 0,
|
|
22
|
+
chainCode: chainCode,
|
|
23
|
+
secretKey: secretKey,
|
|
24
|
+
publicKey: getPublicKey(secretKey)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function derive(masterNode, derivationPath) {
|
|
28
|
+
var derivationIndices = (0, derivation_1.splitDerivationPath)(derivationPath);
|
|
29
|
+
return derivationIndices.reduce(function (derivedNode, next) {
|
|
30
|
+
var parentFingerprint = (0, hash_1.hash160)(derivedNode.publicKey).readUInt32BE();
|
|
31
|
+
var index = next.masked;
|
|
32
|
+
var indexBuffer = Buffer.alloc(4);
|
|
33
|
+
indexBuffer.writeUInt32BE(index);
|
|
34
|
+
var data = Buffer.concat([Buffer.alloc(1, 0), derivedNode.secretKey, indexBuffer]);
|
|
35
|
+
var _a = getKey(data, derivedNode.chainCode), secretKey = _a.key, chainCode = _a.chainCode;
|
|
36
|
+
return {
|
|
37
|
+
depth: derivedNode.depth + 1,
|
|
38
|
+
parentFingerprint: parentFingerprint,
|
|
39
|
+
index: index,
|
|
40
|
+
chainCode: chainCode,
|
|
41
|
+
secretKey: secretKey,
|
|
42
|
+
publicKey: getPublicKey(secretKey)
|
|
43
|
+
};
|
|
44
|
+
}, masterNode);
|
|
45
|
+
}
|
|
46
|
+
function getKey(data, key) {
|
|
47
|
+
var I = Buffer.from((0, hmac_1.hmac)(sha512_1.SHA512, key, data));
|
|
48
|
+
var IL = I.slice(0, 32);
|
|
49
|
+
var IR = I.slice(32);
|
|
50
|
+
return { key: IL, chainCode: IR };
|
|
51
|
+
}
|
|
52
|
+
function getPublicKey(privateKey) {
|
|
53
|
+
var publicKey = (0, ed25519_1.generateKeyPairFromSeed)(privateKey).publicKey;
|
|
54
|
+
return Buffer.from(publicKey);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/ed25519/derive.ts"],"names":[],"mappings":";;;AAAA,mHAAiI;AACjI,+GAA6G;AAC7G,wCAAsC;AAGtC,kDAAyD;AACzD,sCAAuC;AAEvC,IAAM,WAAW,GAAW,cAAc,CAAA;AAE1C,SAAgB,aAAa,CAAC,IAAY,EAAE,cAAuB,EAAE,GAAyB;IAAzB,oBAAA,EAAA,iBAAyB;IAC5F,IAAM,UAAU,GAAmB,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAEhE,OAAO,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;AACvF,CAAC;AAJD,sCAIC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,GAAW;IAC7C,IAAA,KAAgC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAhE,SAAS,SAAA,EAAE,SAAS,eAA4C,CAAA;IAE7E,OAAO;QACL,KAAK,EAAE,CAAC;QACR,iBAAiB,EAAE,UAAU;QAC7B,KAAK,EAAE,CAAC;QACR,SAAS,WAAA;QACT,SAAS,WAAA;QACT,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;KACnC,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAC,UAA0B,EAAE,cAAsB;IAChE,IAAM,iBAAiB,GAAsB,IAAA,gCAAmB,EAAC,cAAc,CAAC,CAAA;IAEhF,OAAO,iBAAiB,CAAC,MAAM,CAAC,UAAC,WAA2B,EAAE,IAAqB;QACjF,IAAM,iBAAiB,GAAW,IAAA,cAAO,EAAC,WAAW,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,CAAA;QAE/E,IAAM,KAAK,GAAW,IAAI,CAAC,MAAM,CAAA;QACjC,IAAM,WAAW,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC3C,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAEhC,IAAM,IAAI,GAAW,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAA;QAEtF,IAAA,KAAgC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,EAA5D,SAAS,SAAA,EAAE,SAAS,eAAwC,CAAA;QAEzE,OAAO;YACL,KAAK,EAAE,WAAW,CAAC,KAAK,GAAG,CAAC;YAC5B,iBAAiB,mBAAA;YACjB,KAAK,OAAA;YACL,SAAS,WAAA;YACT,SAAS,WAAA;YACT,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;SACnC,CAAA;IACH,CAAC,EAAE,UAAU,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,GAAW;IACvC,IAAM,CAAC,GAAW,MAAM,CAAC,IAAI,CAAC,IAAA,WAAI,EAAC,eAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;IACtD,IAAM,EAAE,GAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,IAAM,EAAE,GAAW,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAE9B,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;AACnC,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB;IAC9B,IAAA,SAAS,GAAK,IAAA,iCAAuB,EAAC,UAAU,CAAC,UAAxC,CAAwC;IAEzD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAC/B,CAAC"}
|
package/encoding.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CryptoDerivative } from '@airgap/module-kit';
|
|
2
|
+
import { Bip32Node, Version } from './utils/bip32';
|
|
3
|
+
import { BytesNode } from './utils/bytes';
|
|
4
|
+
import { HexNode } from './utils/hex';
|
|
5
|
+
import { Zip32Node } from './utils/zip32';
|
|
6
|
+
declare type EncodedNode = BytesNode | HexNode | Bip32Node | Zip32Node;
|
|
7
|
+
export declare function encodeDerivative(type: BytesNode['type'], derivative: CryptoDerivative): BytesNode;
|
|
8
|
+
export declare function encodeDerivative(type: HexNode['type'], derivative: CryptoDerivative): HexNode;
|
|
9
|
+
export declare function encodeDerivative(type: Bip32Node['type'], derivative: CryptoDerivative, version?: Version): Bip32Node;
|
|
10
|
+
export declare function encodeDerivative(type: Zip32Node['type'], derivative: CryptoDerivative): Zip32Node;
|
|
11
|
+
export declare function decodeDerivative(node: EncodedNode): CryptoDerivative;
|
|
12
|
+
export {};
|
package/encoding.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decodeDerivative = exports.encodeDerivative = void 0;
|
|
4
|
+
var coinlib_core_1 = require("@airgap/coinlib-core");
|
|
5
|
+
var bip32_1 = require("./utils/bip32");
|
|
6
|
+
var bytes_1 = require("./utils/bytes");
|
|
7
|
+
var factory_1 = require("./utils/factory");
|
|
8
|
+
var hex_1 = require("./utils/hex");
|
|
9
|
+
var zip32_1 = require("./utils/zip32");
|
|
10
|
+
function encodeDerivative(type, derivative, bip39VersionOrUndefined) {
|
|
11
|
+
var node = (0, factory_1.newDerivationNodeFromDerivative)(derivative);
|
|
12
|
+
return encodeNode(type, node, bip39VersionOrUndefined);
|
|
13
|
+
}
|
|
14
|
+
exports.encodeDerivative = encodeDerivative;
|
|
15
|
+
function encodeNode(type, node, bip39VersionOrUndefined) {
|
|
16
|
+
switch (type) {
|
|
17
|
+
case 'bytes':
|
|
18
|
+
return (0, bytes_1.bytesEncodeNode)(node);
|
|
19
|
+
case 'hex':
|
|
20
|
+
return (0, hex_1.hexEncodeNode)(node);
|
|
21
|
+
case 'bip32':
|
|
22
|
+
return (0, bip32_1.bip32EncodeNode)(node, bip39VersionOrUndefined);
|
|
23
|
+
case 'zip32':
|
|
24
|
+
return (0, zip32_1.zip32EncodeNode)(node);
|
|
25
|
+
default:
|
|
26
|
+
(0, coinlib_core_1.assertNever)(type);
|
|
27
|
+
throw new Error('Unsupported encoding type');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function decodeDerivative(node) {
|
|
31
|
+
var decodedNode = decodeNode(node);
|
|
32
|
+
return (0, factory_1.newCryptoDerivativeFromNode)(decodedNode);
|
|
33
|
+
}
|
|
34
|
+
exports.decodeDerivative = decodeDerivative;
|
|
35
|
+
function decodeNode(node) {
|
|
36
|
+
switch (node.type) {
|
|
37
|
+
case 'bytes':
|
|
38
|
+
return (0, bytes_1.bytesDecodeNode)(node);
|
|
39
|
+
case 'hex':
|
|
40
|
+
return (0, hex_1.hexDecodeNode)(node);
|
|
41
|
+
case 'bip32':
|
|
42
|
+
return (0, bip32_1.bip32DecodeNode)(node);
|
|
43
|
+
case 'zip32':
|
|
44
|
+
return (0, zip32_1.zip32DecodeNode)(node);
|
|
45
|
+
default:
|
|
46
|
+
(0, coinlib_core_1.assertNever)(node);
|
|
47
|
+
throw new Error('Unsupported encoded node type');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=encoding.js.map
|
package/encoding.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAIlD,uCAAoF;AACpF,uCAA2E;AAC3E,2CAA8F;AAC9F,mCAAmE;AACnE,uCAA2E;AAS3E,SAAgB,gBAAgB,CAAC,IAAkB,EAAE,UAA4B,EAAE,uBAAiC;IAClH,IAAM,IAAI,GAAmB,IAAA,yCAA+B,EAAC,UAAU,CAAC,CAAA;IAExE,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAA;AACxD,CAAC;AAJD,4CAIC;AAED,SAAS,UAAU,CAAC,IAAkB,EAAE,IAAoB,EAAE,uBAAiC;IAC7F,QAAQ,IAAI,EAAE;QACZ,KAAK,OAAO;YACV,OAAO,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,KAAK;YACR,OAAO,IAAA,mBAAa,EAAC,IAAI,CAAC,CAAA;QAC5B,KAAK,OAAO;YACV,OAAO,IAAA,uBAAe,EAAC,IAAI,EAAE,uBAAuB,CAAC,CAAA;QACvD,KAAK,OAAO;YACV,OAAO,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAA;QAC9B;YACE,IAAA,0BAAW,EAAC,IAAI,CAAC,CAAA;YACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;KAC/C;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAiB;IAChD,IAAM,WAAW,GAAmB,UAAU,CAAC,IAAI,CAAC,CAAA;IAEpD,OAAO,IAAA,qCAA2B,EAAC,WAAW,CAAC,CAAA;AACjD,CAAC;AAJD,4CAIC;AAED,SAAS,UAAU,CAAC,IAAiB;IACnC,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,OAAO;YACV,OAAO,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,KAAK;YACR,OAAO,IAAA,mBAAa,EAAC,IAAI,CAAC,CAAA;QAC5B,KAAK,OAAO;YACV,OAAO,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,OAAO;YACV,OAAO,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAA;QAC9B;YACE,IAAA,0BAAW,EAAC,IAAI,CAAC,CAAA;YACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;KACnD;AACH,CAAC"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { derive } from './derive';
|
|
2
|
+
import { deriveEd25519 } from './ed25519/derive';
|
|
3
|
+
import { decodeDerivative, encodeDerivative } from './encoding';
|
|
4
|
+
import { mnemonicToSeed } from './secret';
|
|
5
|
+
import { deriveSr25519 } from './sr25519/derive';
|
|
6
|
+
export { derive, deriveEd25519, deriveSr25519 };
|
|
7
|
+
export { mnemonicToSeed };
|
|
8
|
+
export { encodeDerivative, decodeDerivative };
|
package/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decodeDerivative = exports.encodeDerivative = exports.mnemonicToSeed = exports.deriveSr25519 = exports.deriveEd25519 = exports.derive = void 0;
|
|
4
|
+
var derive_1 = require("./derive");
|
|
5
|
+
Object.defineProperty(exports, "derive", { enumerable: true, get: function () { return derive_1.derive; } });
|
|
6
|
+
var derive_2 = require("./ed25519/derive");
|
|
7
|
+
Object.defineProperty(exports, "deriveEd25519", { enumerable: true, get: function () { return derive_2.deriveEd25519; } });
|
|
8
|
+
var encoding_1 = require("./encoding");
|
|
9
|
+
Object.defineProperty(exports, "decodeDerivative", { enumerable: true, get: function () { return encoding_1.decodeDerivative; } });
|
|
10
|
+
Object.defineProperty(exports, "encodeDerivative", { enumerable: true, get: function () { return encoding_1.encodeDerivative; } });
|
|
11
|
+
var secret_1 = require("./secret");
|
|
12
|
+
Object.defineProperty(exports, "mnemonicToSeed", { enumerable: true, get: function () { return secret_1.mnemonicToSeed; } });
|
|
13
|
+
var derive_3 = require("./sr25519/derive");
|
|
14
|
+
Object.defineProperty(exports, "deriveSr25519", { enumerable: true, get: function () { return derive_3.deriveSr25519; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAiC;AAQxB,uFARA,eAAM,OAQA;AAPf,2CAAgD;AAO/B,8FAPR,sBAAa,OAOQ;AAN9B,uCAA+D;AAcpC,iGAdlB,2BAAgB,OAckB;AAAlC,iGAdkB,2BAAgB,OAclB;AAbzB,mCAAyC;AAShC,+FATA,uBAAc,OASA;AARvB,2CAAgD;AAIhB,8FAJvB,sBAAa,OAIuB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@airgap/crypto",
|
|
3
|
+
"version": "0.13.11-beta.1",
|
|
4
|
+
"description": "TODO",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"airgap",
|
|
7
|
+
"blockchain",
|
|
8
|
+
"crypto"
|
|
9
|
+
],
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"homepage": "https://www.airgap.it",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/airgap-it/airgap-coin-lib"
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "rm -rf ./dist && tsc && node scripts/copy-files-after-build.js",
|
|
21
|
+
"build-scripts": "tsc scripts/*.ts",
|
|
22
|
+
"lint": "tslint -c ./tslint.json --project ./tsconfig.json --format stylish --fix",
|
|
23
|
+
"lint:prettier": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
24
|
+
"lint-ci": "tslint -t json -o ../../lint-reports/crypto.json --project . || true",
|
|
25
|
+
"lint-ci:prettier": "prettier \"src/**/*.ts\" \"test/**/*.ts\" --list-different",
|
|
26
|
+
"test": "",
|
|
27
|
+
"test-ci": "",
|
|
28
|
+
"test-legacy": "",
|
|
29
|
+
"browserify": "browserify ./dist/index.js -s airgapCrypto > ./dist/airgap-crypto.min.js"
|
|
30
|
+
},
|
|
31
|
+
"author": "Papers GmbH <contact@papers.ch> (https://papers.ch)",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@airgap/coinlib-core": "*",
|
|
34
|
+
"@airgap/module-kit": "*",
|
|
35
|
+
"@airgap/sapling-wasm": "^0.0.9",
|
|
36
|
+
"@polkadot/wasm-crypto": "0.20.1",
|
|
37
|
+
"@stablelib/hmac": "^1.0.1"
|
|
38
|
+
},
|
|
39
|
+
"nyc": {
|
|
40
|
+
"include": [
|
|
41
|
+
"src/**/*.ts"
|
|
42
|
+
],
|
|
43
|
+
"exclude": [
|
|
44
|
+
"test/**/*.spec.ts"
|
|
45
|
+
],
|
|
46
|
+
"extension": [
|
|
47
|
+
".ts"
|
|
48
|
+
],
|
|
49
|
+
"require": [
|
|
50
|
+
"ts-node/register"
|
|
51
|
+
],
|
|
52
|
+
"reporter": [
|
|
53
|
+
"text",
|
|
54
|
+
"text-summary"
|
|
55
|
+
],
|
|
56
|
+
"report-dir": "../../coverage/crypto",
|
|
57
|
+
"sourceMap": true,
|
|
58
|
+
"instrument": true
|
|
59
|
+
}
|
|
60
|
+
}
|
package/readme.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.deriveSapling = void 0;
|
|
40
|
+
var sapling_wasm_1 = require("@airgap/sapling-wasm");
|
|
41
|
+
var zip32_1 = require("../utils/zip32");
|
|
42
|
+
function deriveSapling(seed, derivationPath) {
|
|
43
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
44
|
+
var xsk, xfvk;
|
|
45
|
+
return __generator(this, function (_a) {
|
|
46
|
+
switch (_a.label) {
|
|
47
|
+
case 0: return [4 /*yield*/, (0, sapling_wasm_1.getExtendedSpendingKey)(seed, derivationPath !== null && derivationPath !== void 0 ? derivationPath : 'm/')];
|
|
48
|
+
case 1:
|
|
49
|
+
xsk = _a.sent();
|
|
50
|
+
return [4 /*yield*/, (0, sapling_wasm_1.getExtendedFullViewingKeyFromSpendingKey)(xsk)];
|
|
51
|
+
case 2:
|
|
52
|
+
xfvk = _a.sent();
|
|
53
|
+
return [2 /*return*/, (0, zip32_1.zip32DecodeNode)({
|
|
54
|
+
type: 'zip32bytes',
|
|
55
|
+
secretKey: xsk,
|
|
56
|
+
publicKey: xfvk
|
|
57
|
+
})];
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
exports.deriveSapling = deriveSapling;
|
|
63
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/sapling/derive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAuG;AAGvG,wCAAgD;AAEhD,SAAsB,aAAa,CAAC,IAAY,EAAE,cAAuB;;;;;wBACnD,qBAAM,IAAA,qCAAsB,EAAC,IAAI,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,IAAI,CAAC,EAAA;;oBAAxE,GAAG,GAAW,SAA0D;oBACzD,qBAAM,IAAA,uDAAwC,EAAC,GAAG,CAAC,EAAA;;oBAAlE,IAAI,GAAW,SAAmD;oBAExE,sBAAO,IAAA,uBAAe,EAAC;4BACrB,IAAI,EAAE,YAAY;4BAClB,SAAS,EAAE,GAAG;4BACd,SAAS,EAAE,IAAI;yBAChB,CAAC,EAAA;;;;CACH;AATD,sCASC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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.deriveSecp256K1 = void 0;
|
|
7
|
+
var sha512_1 = require("@airgap/coinlib-core/dependencies/src/@stablelib/sha512-1.0.1/packages/sha512/sha512");
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
var elliptic_1 = __importDefault(require("@airgap/coinlib-core/dependencies/src/secp256k1-4.0.2/elliptic"));
|
|
10
|
+
var hmac_1 = require("@stablelib/hmac");
|
|
11
|
+
var derivation_1 = require("../utils/derivation");
|
|
12
|
+
var hash_1 = require("../utils/hash");
|
|
13
|
+
var BITCOIN_KEY = 'Bitcoin seed';
|
|
14
|
+
function deriveSecp256K1(seed, derivationPath, key) {
|
|
15
|
+
if (key === void 0) { key = BITCOIN_KEY; }
|
|
16
|
+
var masterNode = masterNodeFromSeed(seed, key);
|
|
17
|
+
return derivationPath !== undefined ? derive(masterNode, derivationPath) : masterNode;
|
|
18
|
+
}
|
|
19
|
+
exports.deriveSecp256K1 = deriveSecp256K1;
|
|
20
|
+
function masterNodeFromSeed(seed, key) {
|
|
21
|
+
var _a = getKey(seed, Buffer.from(key, 'utf-8')), secretKey = _a.key, chainCode = _a.chainCode;
|
|
22
|
+
return {
|
|
23
|
+
depth: 0,
|
|
24
|
+
parentFingerprint: 0x00000000,
|
|
25
|
+
index: 0,
|
|
26
|
+
chainCode: chainCode,
|
|
27
|
+
secretKey: secretKey,
|
|
28
|
+
publicKey: getPublicKey(secretKey)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function derive(masterNode, derivationPath) {
|
|
32
|
+
var derivationIndices = (0, derivation_1.splitDerivationPath)(derivationPath);
|
|
33
|
+
return derivationIndices.reduce(deriveChild, masterNode);
|
|
34
|
+
}
|
|
35
|
+
function deriveChild(node, derivationIndex) {
|
|
36
|
+
var parentFingerprint = (0, hash_1.hash160)(node.publicKey).readUInt32BE();
|
|
37
|
+
var index = derivationIndex.masked;
|
|
38
|
+
var indexBuffer = Buffer.alloc(4);
|
|
39
|
+
indexBuffer.writeUInt32BE(index);
|
|
40
|
+
var data = derivationIndex.isHardened
|
|
41
|
+
? Buffer.concat([Buffer.alloc(1, 0), node.secretKey, indexBuffer])
|
|
42
|
+
: Buffer.concat([node.publicKey, indexBuffer]);
|
|
43
|
+
var _a = getKey(data, node.chainCode), key = _a.key, chainCode = _a.chainCode;
|
|
44
|
+
try {
|
|
45
|
+
var ki = Buffer.from(elliptic_1.default.privateKeyTweakAdd(Buffer.from(node.secretKey), key));
|
|
46
|
+
return {
|
|
47
|
+
depth: node.depth + 1,
|
|
48
|
+
parentFingerprint: parentFingerprint,
|
|
49
|
+
index: index,
|
|
50
|
+
chainCode: chainCode,
|
|
51
|
+
secretKey: ki,
|
|
52
|
+
publicKey: getPublicKey(ki)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (_b) {
|
|
56
|
+
return deriveChild(node, (0, derivation_1.incIndex)(derivationIndex));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function getKey(data, key) {
|
|
60
|
+
var I = Buffer.from((0, hmac_1.hmac)(sha512_1.SHA512, key, data));
|
|
61
|
+
var IL = I.slice(0, 32);
|
|
62
|
+
var IR = I.slice(32);
|
|
63
|
+
return { key: IL, chainCode: IR };
|
|
64
|
+
}
|
|
65
|
+
function getPublicKey(privateKey) {
|
|
66
|
+
var publicKey = elliptic_1.default.publicKeyCreate(privateKey, true);
|
|
67
|
+
return Buffer.from(publicKey);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/secp256k1/derive.ts"],"names":[],"mappings":"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"}
|
package/secret.d.ts
ADDED
package/secret.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.mnemonicToSeed = void 0;
|
|
40
|
+
var coinlib_core_1 = require("@airgap/coinlib-core");
|
|
41
|
+
// @ts-ignore
|
|
42
|
+
var bip39_2_5_0_1 = require("@airgap/coinlib-core/dependencies/src/bip39-2.5.0");
|
|
43
|
+
var wasm_crypto_1 = require("@polkadot/wasm-crypto");
|
|
44
|
+
function mnemonicToSeed(crypto, mnemonic, password) {
|
|
45
|
+
var _a;
|
|
46
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
47
|
+
var seed, _b, _c;
|
|
48
|
+
return __generator(this, function (_d) {
|
|
49
|
+
switch (_d.label) {
|
|
50
|
+
case 0:
|
|
51
|
+
if (!(crypto.algorithm !== 'sr25519')) return [3 /*break*/, 1];
|
|
52
|
+
_b = mnemonicToBip39Seed((_a = crypto.secretType) !== null && _a !== void 0 ? _a : 'secret', mnemonic, password);
|
|
53
|
+
return [3 /*break*/, 5];
|
|
54
|
+
case 1:
|
|
55
|
+
if (!(crypto.compatibility === 'substrate')) return [3 /*break*/, 3];
|
|
56
|
+
return [4 /*yield*/, mnemonicToSubstrateSeed(mnemonic, password)];
|
|
57
|
+
case 2:
|
|
58
|
+
_c = _d.sent();
|
|
59
|
+
return [3 /*break*/, 4];
|
|
60
|
+
case 3:
|
|
61
|
+
_c = undefined;
|
|
62
|
+
_d.label = 4;
|
|
63
|
+
case 4:
|
|
64
|
+
_b = _c;
|
|
65
|
+
_d.label = 5;
|
|
66
|
+
case 5:
|
|
67
|
+
seed = _b;
|
|
68
|
+
if (seed === undefined) {
|
|
69
|
+
throw new Error('Invalid crypto configuration');
|
|
70
|
+
}
|
|
71
|
+
return [2 /*return*/, seed];
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
exports.mnemonicToSeed = mnemonicToSeed;
|
|
77
|
+
function mnemonicToSubstrateSeed(mnemonic, password) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
79
|
+
var secret;
|
|
80
|
+
return __generator(this, function (_a) {
|
|
81
|
+
switch (_a.label) {
|
|
82
|
+
case 0: return [4 /*yield*/, (0, wasm_crypto_1.waitReady)()];
|
|
83
|
+
case 1:
|
|
84
|
+
_a.sent();
|
|
85
|
+
secret = (0, wasm_crypto_1.bip39ToMiniSecret)(mnemonic, password || '');
|
|
86
|
+
return [2 /*return*/, Buffer.from(secret)];
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function mnemonicToBip39Seed(secretType, mnemonic, password) {
|
|
92
|
+
var seed = (0, bip39_2_5_0_1.mnemonicToSeed)(mnemonic, password);
|
|
93
|
+
switch (secretType) {
|
|
94
|
+
case 'secret':
|
|
95
|
+
return seed;
|
|
96
|
+
case 'miniSecretXor':
|
|
97
|
+
var first32 = seed.slice(0, 32);
|
|
98
|
+
var second32_1 = seed.slice(32);
|
|
99
|
+
// tslint:disable-next-line: no-bitwise
|
|
100
|
+
return Buffer.from(first32.map(function (byte, index) { return byte ^ second32_1[index]; }));
|
|
101
|
+
default:
|
|
102
|
+
(0, coinlib_core_1.assertNever)(secretType);
|
|
103
|
+
throw new Error("Secret type ".concat(secretType, " is not supported"));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=secret.js.map
|
package/secret.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAkD;AAClD,aAAa;AACb,iFAAyG;AAEzG,qDAAoE;AAEpE,SAAsB,cAAc,CAAC,MAA2B,EAAE,QAAgB,EAAE,QAAiB;;;;;;;yBAEjG,CAAA,MAAM,CAAC,SAAS,KAAK,SAAS,CAAA,EAA9B,wBAA8B;oBAC1B,KAAA,mBAAmB,CAAC,MAAA,MAAM,CAAC,UAAU,mCAAI,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;;;yBACtE,CAAA,MAAM,CAAC,aAAa,KAAK,WAAW,CAAA,EAApC,wBAAoC;oBACpC,qBAAM,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAA;;oBAAjD,KAAA,SAAiD,CAAA;;;oBACjD,KAAA,SAAS,CAAA;;;oBAFT,QAES;;;oBALT,IAAI,KAKK;oBAEf,IAAI,IAAI,KAAK,SAAS,EAAE;wBACtB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;qBAChD;oBAED,sBAAO,IAAI,EAAA;;;;CACZ;AAbD,wCAaC;AAED,SAAe,uBAAuB,CAAC,QAAgB,EAAE,QAAiB;;;;;wBACxE,qBAAM,IAAA,uBAAS,GAAE,EAAA;;oBAAjB,SAAiB,CAAA;oBACX,MAAM,GAAe,IAAA,+BAAiB,EAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAA;oBAEtE,sBAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAA;;;;CAC3B;AAED,SAAS,mBAAmB,CAAC,UAA4B,EAAE,QAAgB,EAAE,QAAiB;IAC5F,IAAM,IAAI,GAAW,IAAA,4BAAmB,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAE5D,QAAQ,UAAU,EAAE;QAClB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAA;QACb,KAAK,eAAe;YAClB,IAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACzC,IAAM,UAAQ,GAAW,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAEvC,uCAAuC;YACvC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,IAAY,EAAE,KAAa,IAAK,OAAA,IAAI,GAAG,UAAQ,CAAC,KAAK,CAAC,EAAtB,CAAsB,CAAC,CAAC,CAAA;QAC1F;YACE,IAAA,0BAAW,EAAC,UAAU,CAAC,CAAA;YACvB,MAAM,IAAI,KAAK,CAAC,sBAAe,UAAU,sBAAmB,CAAC,CAAA;KAChE;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Sr25519CryptoConfiguration } from '@airgap/module-kit';
|
|
3
|
+
import { DerivationNode } from '../types/derivation';
|
|
4
|
+
export declare function deriveSr25519(compatibility: Sr25519CryptoConfiguration['compatibility'], seed: Buffer, derivationPath?: string): Promise<DerivationNode>;
|
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.deriveSr25519 = void 0;
|
|
40
|
+
var wasm_crypto_1 = require("@polkadot/wasm-crypto");
|
|
41
|
+
var derivation_1 = require("../utils/derivation");
|
|
42
|
+
var hash_1 = require("../utils/hash");
|
|
43
|
+
function deriveSr25519(compatibility, seed, derivationPath) {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
45
|
+
return __generator(this, function (_a) {
|
|
46
|
+
return [2 /*return*/, compatibility === 'substrate' ? deriveSr25519Substrate(seed, derivationPath) : deriveSr25519Standard(seed, derivationPath)];
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
exports.deriveSr25519 = deriveSr25519;
|
|
51
|
+
function deriveSr25519Standard(seed, derivationPath) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
53
|
+
return __generator(this, function (_a) {
|
|
54
|
+
throw new Error('Not implemented');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function deriveSr25519Substrate(seed, derivationPath) {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
60
|
+
var masterNode;
|
|
61
|
+
return __generator(this, function (_a) {
|
|
62
|
+
switch (_a.label) {
|
|
63
|
+
case 0: return [4 /*yield*/, substrateMasterKeyFromSeed(seed)];
|
|
64
|
+
case 1:
|
|
65
|
+
masterNode = _a.sent();
|
|
66
|
+
return [2 /*return*/, derivationPath !== undefined ? deriveSubstrate(masterNode, derivationPath) : masterNode];
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function substrateMasterKeyFromSeed(seed) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
73
|
+
var keyPair, _a, secretKey, publicKey;
|
|
74
|
+
return __generator(this, function (_b) {
|
|
75
|
+
switch (_b.label) {
|
|
76
|
+
case 0: return [4 /*yield*/, (0, wasm_crypto_1.waitReady)()];
|
|
77
|
+
case 1:
|
|
78
|
+
_b.sent();
|
|
79
|
+
keyPair = (0, wasm_crypto_1.sr25519KeypairFromSeed)(seed.slice(0, 32));
|
|
80
|
+
_a = splitKeyPair(keyPair), secretKey = _a.secretKey, publicKey = _a.publicKey;
|
|
81
|
+
return [2 /*return*/, {
|
|
82
|
+
depth: 0,
|
|
83
|
+
parentFingerprint: 0x00000000,
|
|
84
|
+
index: 0,
|
|
85
|
+
chainCode: Buffer.alloc(32, 0),
|
|
86
|
+
secretKey: secretKey,
|
|
87
|
+
publicKey: publicKey
|
|
88
|
+
}];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function deriveSubstrate(masterNode, derivationPath) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
95
|
+
var derivationIndices;
|
|
96
|
+
return __generator(this, function (_a) {
|
|
97
|
+
switch (_a.label) {
|
|
98
|
+
case 0: return [4 /*yield*/, (0, wasm_crypto_1.waitReady)()];
|
|
99
|
+
case 1:
|
|
100
|
+
_a.sent();
|
|
101
|
+
derivationIndices = (0, derivation_1.splitDerivationPath)(derivationPath);
|
|
102
|
+
return [2 /*return*/, derivationIndices.reduce(function (derivedKey, next) {
|
|
103
|
+
var parentFingerprint = (0, hash_1.hash160)(derivedKey.publicKey).readUInt32BE();
|
|
104
|
+
var deriveKeyPair = next.isHardened ? wasm_crypto_1.sr25519DeriveKeypairHard : wasm_crypto_1.sr25519DeriveKeypairSoft;
|
|
105
|
+
var keyPair = Buffer.concat([derivedKey.secretKey, derivedKey.publicKey]);
|
|
106
|
+
var index = Buffer.alloc(32, 0);
|
|
107
|
+
index.writeUInt32LE(next.value);
|
|
108
|
+
var derivedKeyPair = deriveKeyPair(keyPair, index);
|
|
109
|
+
var _a = splitKeyPair(derivedKeyPair), secretKey = _a.secretKey, publicKey = _a.publicKey;
|
|
110
|
+
return {
|
|
111
|
+
depth: derivedKey.depth + 1,
|
|
112
|
+
parentFingerprint: parentFingerprint,
|
|
113
|
+
index: next.masked,
|
|
114
|
+
chainCode: index,
|
|
115
|
+
secretKey: secretKey,
|
|
116
|
+
publicKey: publicKey
|
|
117
|
+
};
|
|
118
|
+
}, masterNode)];
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function splitKeyPair(keyPair) {
|
|
124
|
+
var keyPairBuffer = Buffer.from(keyPair);
|
|
125
|
+
var secretKey = keyPairBuffer.slice(0, 64);
|
|
126
|
+
var publicKey = keyPairBuffer.slice(64);
|
|
127
|
+
return { secretKey: secretKey, publicKey: publicKey };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/sr25519/derive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export interface DerivationIndex {
|
|
3
|
+
value: number;
|
|
4
|
+
masked: number;
|
|
5
|
+
isHardened: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface DerivationKey {
|
|
8
|
+
depth: number;
|
|
9
|
+
parentFingerprint: number;
|
|
10
|
+
index: number;
|
|
11
|
+
chainCode: Buffer;
|
|
12
|
+
key: Buffer;
|
|
13
|
+
}
|
|
14
|
+
export interface DerivationNode {
|
|
15
|
+
depth: number;
|
|
16
|
+
parentFingerprint: number;
|
|
17
|
+
index: number;
|
|
18
|
+
chainCode: Buffer;
|
|
19
|
+
secretKey: Buffer;
|
|
20
|
+
publicKey: Buffer;
|
|
21
|
+
}
|
|
22
|
+
export declare type DerivationKeyType = Extract<keyof DerivationNode, 'secretKey' | 'publicKey'>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../../src/types/derivation.ts"],"names":[],"mappings":""}
|
package/types/key.d.ts
ADDED
package/types/key.js
ADDED
package/types/key.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/types/key.ts"],"names":[],"mappings":""}
|
package/utils/bip32.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DerivationNode } from '../types/derivation';
|
|
2
|
+
export interface Version {
|
|
3
|
+
secretKey?: string;
|
|
4
|
+
publicKey?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Bip32Node {
|
|
7
|
+
type: 'bip32';
|
|
8
|
+
secretKey: string;
|
|
9
|
+
publicKey: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function bip32EncodeNode(node: DerivationNode, version?: Version): Bip32Node;
|
|
12
|
+
export declare function bip32DecodeNode(node: Bip32Node, version?: Version): DerivationNode;
|
package/utils/bip32.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.bip32DecodeNode = exports.bip32EncodeNode = void 0;
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
var bs58check = __importStar(require("@airgap/coinlib-core/dependencies/src/bs58check-2.1.2/index"));
|
|
29
|
+
var factory_1 = require("./factory");
|
|
30
|
+
var XPRV_VERSION = '0488ade4';
|
|
31
|
+
var XPUB_VERSION = '0488b21e';
|
|
32
|
+
function bip32EncodeNode(node, version) {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
if (version === void 0) { version = {}; }
|
|
35
|
+
return {
|
|
36
|
+
type: 'bip32',
|
|
37
|
+
secretKey: encodeKey(node, (_a = version.secretKey) !== null && _a !== void 0 ? _a : XPRV_VERSION, 'secretKey'),
|
|
38
|
+
publicKey: encodeKey(node, (_b = version.publicKey) !== null && _b !== void 0 ? _b : XPUB_VERSION, 'publicKey')
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
exports.bip32EncodeNode = bip32EncodeNode;
|
|
42
|
+
function encodeKey(node, version, keyType) {
|
|
43
|
+
var versionBuffer = Buffer.from(version, 'hex');
|
|
44
|
+
var depth = Buffer.alloc(1);
|
|
45
|
+
depth.writeUInt8(node.depth);
|
|
46
|
+
var parentFingerprint = Buffer.alloc(4);
|
|
47
|
+
parentFingerprint.writeUInt32BE(node.parentFingerprint);
|
|
48
|
+
var index = Buffer.alloc(4);
|
|
49
|
+
index.writeUInt32BE(node.index);
|
|
50
|
+
var chainCode = node.chainCode;
|
|
51
|
+
var key = keyType === 'secretKey' ? Buffer.concat([Buffer.alloc(1, 0), node[keyType]]) : node[keyType];
|
|
52
|
+
return bs58check.encode(Buffer.concat([versionBuffer, depth, parentFingerprint, index, chainCode, key]));
|
|
53
|
+
}
|
|
54
|
+
function bip32DecodeNode(node, version) {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
if (version === void 0) { version = {}; }
|
|
57
|
+
var xprvDecoded = decodeKey(node.secretKey, (_a = version.secretKey) !== null && _a !== void 0 ? _a : XPRV_VERSION, 'secretKey');
|
|
58
|
+
var xpubDecoded = decodeKey(node.publicKey, (_b = version.publicKey) !== null && _b !== void 0 ? _b : XPUB_VERSION, 'publicKey');
|
|
59
|
+
return (0, factory_1.newDerivationNodeFromKeys)(xprvDecoded, xpubDecoded);
|
|
60
|
+
}
|
|
61
|
+
exports.bip32DecodeNode = bip32DecodeNode;
|
|
62
|
+
function decodeKey(key, version, keyType) {
|
|
63
|
+
var buffer = bs58check.decode(key);
|
|
64
|
+
var versionBuffer = buffer.slice(0, 4);
|
|
65
|
+
if (versionBuffer.toString('hex') !== version) {
|
|
66
|
+
throw new Error('Invalid Bip32 version');
|
|
67
|
+
}
|
|
68
|
+
var depth = buffer.readUInt8(4);
|
|
69
|
+
var parentFingerprint = buffer.readUInt32BE(5);
|
|
70
|
+
var index = buffer.readUInt32BE(9);
|
|
71
|
+
var chainCode = buffer.slice(13, 45);
|
|
72
|
+
return {
|
|
73
|
+
depth: depth,
|
|
74
|
+
parentFingerprint: parentFingerprint,
|
|
75
|
+
index: index,
|
|
76
|
+
chainCode: chainCode,
|
|
77
|
+
key: keyType === 'secretKey' ? buffer.slice(46) : buffer.slice(45)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=bip32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bip32.js","sourceRoot":"","sources":["../../src/utils/bip32.ts"],"names":[],"mappings":"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"}
|
package/utils/bytes.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DerivationNode } from '../types/derivation';
|
|
3
|
+
export interface BytesNode {
|
|
4
|
+
type: 'bytes';
|
|
5
|
+
secretKey: Buffer;
|
|
6
|
+
publicKey: Buffer;
|
|
7
|
+
}
|
|
8
|
+
export declare function bytesEncodeNode(node: DerivationNode): BytesNode;
|
|
9
|
+
export declare function bytesDecodeNode(node: BytesNode): DerivationNode;
|
package/utils/bytes.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bytesDecodeNode = exports.bytesEncodeNode = void 0;
|
|
4
|
+
var factory_1 = require("./factory");
|
|
5
|
+
function bytesEncodeNode(node) {
|
|
6
|
+
return {
|
|
7
|
+
type: 'bytes',
|
|
8
|
+
secretKey: encodeKey(node, 'secretKey'),
|
|
9
|
+
publicKey: encodeKey(node, 'publicKey')
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
exports.bytesEncodeNode = bytesEncodeNode;
|
|
13
|
+
function encodeKey(node, keyType) {
|
|
14
|
+
var depth = Buffer.alloc(1);
|
|
15
|
+
depth.writeUInt8(node.depth);
|
|
16
|
+
var parentFingerprint = Buffer.alloc(4);
|
|
17
|
+
parentFingerprint.writeUInt32BE(node.parentFingerprint);
|
|
18
|
+
var index = Buffer.alloc(4);
|
|
19
|
+
index.writeUInt32BE(node.index);
|
|
20
|
+
var chainCode = node.chainCode;
|
|
21
|
+
var key = node[keyType];
|
|
22
|
+
return Buffer.concat([depth, parentFingerprint, index, chainCode, key]);
|
|
23
|
+
}
|
|
24
|
+
function bytesDecodeNode(node) {
|
|
25
|
+
var xprvDecoded = decodeKey(node.secretKey);
|
|
26
|
+
var xpubDecoded = decodeKey(node.publicKey);
|
|
27
|
+
return (0, factory_1.newDerivationNodeFromKeys)(xprvDecoded, xpubDecoded);
|
|
28
|
+
}
|
|
29
|
+
exports.bytesDecodeNode = bytesDecodeNode;
|
|
30
|
+
function decodeKey(buffer) {
|
|
31
|
+
var depth = buffer.readUInt8(0);
|
|
32
|
+
var parentFingerprint = buffer.readUInt32BE(1);
|
|
33
|
+
var index = buffer.readUInt32BE(5);
|
|
34
|
+
var chainCode = buffer.slice(9, 41);
|
|
35
|
+
var key = buffer.slice(41);
|
|
36
|
+
return {
|
|
37
|
+
depth: depth,
|
|
38
|
+
parentFingerprint: parentFingerprint,
|
|
39
|
+
index: index,
|
|
40
|
+
chainCode: chainCode,
|
|
41
|
+
key: key
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/utils/bytes.ts"],"names":[],"mappings":";;;AAEA,qCAAqD;AAQrD,SAAgB,eAAe,CAAC,IAAoB;IAClD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC;QACvC,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC;KACxC,CAAA;AACH,CAAC;AAND,0CAMC;AAED,SAAS,SAAS,CAAC,IAAoB,EAAE,OAA0B;IACjE,IAAM,KAAK,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACrC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAE5B,IAAM,iBAAiB,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjD,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAEvD,IAAM,KAAK,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACrC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAE/B,IAAM,SAAS,GAAW,IAAI,CAAC,SAAS,CAAA;IACxC,IAAM,GAAG,GAAW,IAAI,CAAC,OAAO,CAAC,CAAA;IAEjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAA;AACzE,CAAC;AAED,SAAgB,eAAe,CAAC,IAAe;IAC7C,IAAM,WAAW,GAAkB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5D,IAAM,WAAW,GAAkB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAE5D,OAAO,IAAA,mCAAyB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAA;AAC5D,CAAC;AALD,0CAKC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAM,KAAK,GAAW,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACzC,IAAM,iBAAiB,GAAW,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACxD,IAAM,KAAK,GAAW,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAC5C,IAAM,SAAS,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC7C,IAAM,GAAG,GAAW,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAEpC,OAAO;QACL,KAAK,OAAA;QACL,iBAAiB,mBAAA;QACjB,KAAK,OAAA;QACL,SAAS,WAAA;QACT,GAAG,KAAA;KACJ,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DerivationIndex } from '../types/derivation';
|
|
2
|
+
export declare function createDerivationIndexFromNumber(value: number, isHardened: boolean): DerivationIndex;
|
|
3
|
+
export declare function createDerivationIndexFromString(value: string): DerivationIndex;
|
|
4
|
+
export declare function splitDerivationPath(path: string): DerivationIndex[];
|
|
5
|
+
export declare function incIndex(current: DerivationIndex): DerivationIndex;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.incIndex = exports.splitDerivationPath = exports.createDerivationIndexFromString = exports.createDerivationIndexFromNumber = void 0;
|
|
4
|
+
var MASK_HARD_DERIVATION = 0x80000000;
|
|
5
|
+
var MASK_SOFT_DERIVATION = 0x00000000;
|
|
6
|
+
function createDerivationIndexFromNumber(value, isHardened) {
|
|
7
|
+
var mask = isHardened ? MASK_HARD_DERIVATION : MASK_SOFT_DERIVATION;
|
|
8
|
+
return {
|
|
9
|
+
value: value,
|
|
10
|
+
// tslint:disable-next-line: no-bitwise
|
|
11
|
+
masked: parseInt((BigInt(mask) | BigInt(value)).toString(), 10),
|
|
12
|
+
isHardened: isHardened
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
exports.createDerivationIndexFromNumber = createDerivationIndexFromNumber;
|
|
16
|
+
function createDerivationIndexFromString(value) {
|
|
17
|
+
var isHardened = ['h', "'"].includes(value.slice(-1));
|
|
18
|
+
var index = parseInt(isHardened ? value.slice(0, -1) : value, 10);
|
|
19
|
+
return createDerivationIndexFromNumber(index, isHardened);
|
|
20
|
+
}
|
|
21
|
+
exports.createDerivationIndexFromString = createDerivationIndexFromString;
|
|
22
|
+
function splitDerivationPath(path) {
|
|
23
|
+
if (path.length === 0 || !path.startsWith('m/') || path === 'm/') {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
return path.slice(2).split('/').map(createDerivationIndexFromString);
|
|
27
|
+
}
|
|
28
|
+
exports.splitDerivationPath = splitDerivationPath;
|
|
29
|
+
function incIndex(current) {
|
|
30
|
+
return createDerivationIndexFromNumber(current.value + 1, current.isHardened);
|
|
31
|
+
}
|
|
32
|
+
exports.incIndex = incIndex;
|
|
33
|
+
//# sourceMappingURL=derivation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../../src/utils/derivation.ts"],"names":[],"mappings":";;;AAEA,IAAM,oBAAoB,GAAW,UAAU,CAAA;AAC/C,IAAM,oBAAoB,GAAW,UAAU,CAAA;AAE/C,SAAgB,+BAA+B,CAAC,KAAa,EAAE,UAAmB;IAChF,IAAM,IAAI,GAAW,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAA;IAE7E,OAAO;QACL,KAAK,OAAA;QACL,uCAAuC;QACvC,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC/D,UAAU,YAAA;KACX,CAAA;AACH,CAAC;AATD,0EASC;AAED,SAAgB,+BAA+B,CAAC,KAAa;IAC3D,IAAM,UAAU,GAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,IAAM,KAAK,GAAW,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE3E,OAAO,+BAA+B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;AAC3D,CAAC;AALD,0EAKC;AAED,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE;QAChE,OAAO,EAAE,CAAA;KACV;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;AACtE,CAAC;AAND,kDAMC;AAED,SAAgB,QAAQ,CAAC,OAAwB;IAC/C,OAAO,+BAA+B,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;AAC/E,CAAC;AAFD,4BAEC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CryptoDerivative } from '@airgap/module-kit';
|
|
2
|
+
import { DerivationKey, DerivationNode } from '../types/derivation';
|
|
3
|
+
export declare function newDerivationNodeFromDerivative(derivative: CryptoDerivative): DerivationNode;
|
|
4
|
+
export declare function newDerivationNodeFromKeys(secretKey: DerivationKey, publicKey: DerivationKey): DerivationNode;
|
|
5
|
+
export declare function newCryptoDerivativeFromKeys(secretKey: DerivationKey, publicKey: DerivationKey): CryptoDerivative;
|
|
6
|
+
export declare function newCryptoDerivativeFromNode(node: DerivationNode): CryptoDerivative;
|
package/utils/factory.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.newCryptoDerivativeFromNode = exports.newCryptoDerivativeFromKeys = exports.newDerivationNodeFromKeys = exports.newDerivationNodeFromDerivative = void 0;
|
|
4
|
+
function newDerivationNodeFromDerivative(derivative) {
|
|
5
|
+
return {
|
|
6
|
+
depth: derivative.depth,
|
|
7
|
+
parentFingerprint: derivative.parentFingerprint,
|
|
8
|
+
index: derivative.index,
|
|
9
|
+
chainCode: Buffer.from(derivative.chainCode, 'hex'),
|
|
10
|
+
secretKey: Buffer.from(derivative.secretKey, 'hex'),
|
|
11
|
+
publicKey: Buffer.from(derivative.publicKey, 'hex')
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
exports.newDerivationNodeFromDerivative = newDerivationNodeFromDerivative;
|
|
15
|
+
function newDerivationNodeFromKeys(secretKey, publicKey) {
|
|
16
|
+
if (secretKey.depth !== publicKey.depth ||
|
|
17
|
+
secretKey.parentFingerprint !== publicKey.parentFingerprint ||
|
|
18
|
+
secretKey.index !== publicKey.index ||
|
|
19
|
+
!secretKey.chainCode.equals(publicKey.chainCode)) {
|
|
20
|
+
throw new Error('Derivation keys mismatch');
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
depth: secretKey.depth,
|
|
24
|
+
parentFingerprint: secretKey.parentFingerprint,
|
|
25
|
+
index: secretKey.index,
|
|
26
|
+
chainCode: secretKey.chainCode,
|
|
27
|
+
secretKey: secretKey.key,
|
|
28
|
+
publicKey: publicKey.key
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
exports.newDerivationNodeFromKeys = newDerivationNodeFromKeys;
|
|
32
|
+
function newCryptoDerivativeFromKeys(secretKey, publicKey) {
|
|
33
|
+
var node = newDerivationNodeFromKeys(secretKey, publicKey);
|
|
34
|
+
return newCryptoDerivativeFromNode(node);
|
|
35
|
+
}
|
|
36
|
+
exports.newCryptoDerivativeFromKeys = newCryptoDerivativeFromKeys;
|
|
37
|
+
function newCryptoDerivativeFromNode(node) {
|
|
38
|
+
return {
|
|
39
|
+
depth: node.depth,
|
|
40
|
+
parentFingerprint: node.parentFingerprint,
|
|
41
|
+
index: node.index,
|
|
42
|
+
chainCode: node.chainCode.toString('hex'),
|
|
43
|
+
secretKey: node.secretKey.toString('hex'),
|
|
44
|
+
publicKey: node.publicKey.toString('hex')
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
exports.newCryptoDerivativeFromNode = newCryptoDerivativeFromNode;
|
|
48
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/utils/factory.ts"],"names":[],"mappings":";;;AAIA,SAAgB,+BAA+B,CAAC,UAA4B;IAC1E,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC;QACnD,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC;QACnD,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC;KACpD,CAAA;AACH,CAAC;AATD,0EASC;AAED,SAAgB,yBAAyB,CAAC,SAAwB,EAAE,SAAwB;IAC1F,IACE,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;QACnC,SAAS,CAAC,iBAAiB,KAAK,SAAS,CAAC,iBAAiB;QAC3D,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;QACnC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAChD;QACA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;KAC5C;IAED,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,iBAAiB,EAAE,SAAS,CAAC,iBAAiB;QAC9C,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,SAAS,EAAE,SAAS,CAAC,GAAG;QACxB,SAAS,EAAE,SAAS,CAAC,GAAG;KACzB,CAAA;AACH,CAAC;AAlBD,8DAkBC;AAED,SAAgB,2BAA2B,CAAC,SAAwB,EAAE,SAAwB;IAC5F,IAAM,IAAI,GAAmB,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAE5E,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAA;AAC1C,CAAC;AAJD,kEAIC;AAED,SAAgB,2BAA2B,CAAC,IAAoB;IAC9D,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;KAC1C,CAAA;AACH,CAAC;AATD,kEASC"}
|
package/utils/hash.d.ts
ADDED
package/utils/hash.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
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.hash160 = void 0;
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
var create_hash_1_2_0_1 = __importDefault(require("@airgap/coinlib-core/dependencies/src/create-hash-1.2.0")); // TODO: check if it can be replaced with `crypto.createHash`
|
|
9
|
+
function hash160(data) {
|
|
10
|
+
var sha256Hash = (0, create_hash_1_2_0_1.default)('sha256').update(data).digest();
|
|
11
|
+
try {
|
|
12
|
+
return (0, create_hash_1_2_0_1.default)('rmd160').update(sha256Hash).digest();
|
|
13
|
+
}
|
|
14
|
+
catch (_a) {
|
|
15
|
+
return (0, create_hash_1_2_0_1.default)('ripemd160').update(sha256Hash).digest();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.hash160 = hash160;
|
|
19
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":";;;;;;AAAA,aAAa;AACb,8GAAgF,CAAC,6DAA6D;AAE9I,SAAgB,OAAO,CAAC,IAAkC;IACxD,IAAM,UAAU,GAAG,IAAA,2BAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IAC7D,IAAI;QACF,OAAO,IAAA,2BAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAA;KACxD;IAAC,WAAM;QACN,OAAO,IAAA,2BAAU,EAAC,WAAW,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAA;KAC3D;AACH,CAAC;AAPD,0BAOC"}
|
package/utils/hex.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DerivationNode } from '../types/derivation';
|
|
2
|
+
export interface HexNode {
|
|
3
|
+
type: 'hex';
|
|
4
|
+
secretKey: string;
|
|
5
|
+
publicKey: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function hexEncodeNode(node: DerivationNode): HexNode;
|
|
8
|
+
export declare function hexDecodeNode(node: HexNode): DerivationNode;
|
package/utils/hex.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hexDecodeNode = exports.hexEncodeNode = void 0;
|
|
4
|
+
var bytes_1 = require("./bytes");
|
|
5
|
+
function hexEncodeNode(node) {
|
|
6
|
+
var bytesNode = (0, bytes_1.bytesEncodeNode)(node);
|
|
7
|
+
return {
|
|
8
|
+
type: 'hex',
|
|
9
|
+
secretKey: bytesNode.secretKey.toString('hex'),
|
|
10
|
+
publicKey: bytesNode.publicKey.toString('hex')
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
exports.hexEncodeNode = hexEncodeNode;
|
|
14
|
+
function hexDecodeNode(node) {
|
|
15
|
+
return (0, bytes_1.bytesDecodeNode)({
|
|
16
|
+
type: 'bytes',
|
|
17
|
+
secretKey: Buffer.from(node.secretKey, 'hex'),
|
|
18
|
+
publicKey: Buffer.from(node.publicKey, 'hex')
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
exports.hexDecodeNode = hexDecodeNode;
|
|
22
|
+
//# sourceMappingURL=hex.js.map
|
package/utils/hex.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.js","sourceRoot":"","sources":["../../src/utils/hex.ts"],"names":[],"mappings":";;;AAEA,iCAA0D;AAQ1D,SAAgB,aAAa,CAAC,IAAoB;IAChD,IAAM,SAAS,GAAG,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAA;IAEvC,OAAO;QACL,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC9C,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;KAC/C,CAAA;AACH,CAAC;AARD,sCAQC;AAED,SAAgB,aAAa,CAAC,IAAa;IACzC,OAAO,IAAA,uBAAe,EAAC;QACrB,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;QAC7C,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;KAC9C,CAAC,CAAA;AACJ,CAAC;AAND,sCAMC"}
|
package/utils/zip32.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DerivationNode } from '../types/derivation';
|
|
3
|
+
export interface Zip32Node {
|
|
4
|
+
type: 'zip32';
|
|
5
|
+
secretKey: string;
|
|
6
|
+
publicKey: string;
|
|
7
|
+
}
|
|
8
|
+
export interface Zip32BytesNode {
|
|
9
|
+
type: 'zip32bytes';
|
|
10
|
+
secretKey: Buffer;
|
|
11
|
+
publicKey: Buffer;
|
|
12
|
+
}
|
|
13
|
+
export declare function zip32EncodeNode(node: DerivationNode): Zip32Node;
|
|
14
|
+
export declare function zip32DecodeNode(node: Zip32Node | Zip32BytesNode): DerivationNode;
|
package/utils/zip32.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.zip32DecodeNode = exports.zip32EncodeNode = void 0;
|
|
15
|
+
var bytes_1 = require("./bytes");
|
|
16
|
+
var hex_1 = require("./hex");
|
|
17
|
+
function zip32EncodeNode(node) {
|
|
18
|
+
return __assign(__assign({}, (0, hex_1.hexEncodeNode)(node)), { type: 'zip32' });
|
|
19
|
+
}
|
|
20
|
+
exports.zip32EncodeNode = zip32EncodeNode;
|
|
21
|
+
function zip32DecodeNode(node) {
|
|
22
|
+
return node.type === 'zip32' ? (0, hex_1.hexDecodeNode)(__assign(__assign({}, node), { type: 'hex' })) : (0, bytes_1.bytesDecodeNode)(__assign(__assign({}, node), { type: 'bytes' }));
|
|
23
|
+
}
|
|
24
|
+
exports.zip32DecodeNode = zip32DecodeNode;
|
|
25
|
+
//# sourceMappingURL=zip32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip32.js","sourceRoot":"","sources":["../../src/utils/zip32.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,iCAAyC;AACzC,6BAAoD;AAcpD,SAAgB,eAAe,CAAC,IAAoB;IAClD,6BACK,IAAA,mBAAa,EAAC,IAAI,CAAC,KACtB,IAAI,EAAE,OAAO,IACd;AACH,CAAC;AALD,0CAKC;AAED,SAAgB,eAAe,CAAC,IAAgC;IAC9D,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAA,mBAAa,wBAAM,IAAI,KAAE,IAAI,EAAE,KAAK,IAAG,CAAC,CAAC,CAAC,IAAA,uBAAe,wBAAM,IAAI,KAAE,IAAI,EAAE,OAAO,IAAG,CAAA;AACtH,CAAC;AAFD,0CAEC"}
|