UNPKG

@sisi/ed25519-blake2b-hd-key

Version:

Fork of alepop/ed25519-hd-key. Convert to ed25519-blake2b.

62 lines (61 loc) 2.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var createHmac = require("create-hmac"); var naclFactory = require("@sisi/tweetnacl-blake2b"); var utils_1 = require("./utils"); var ED25519_CURVE = 'ed25519 blake2b seed'; var HARDENED_OFFSET = 0x80000000; exports.getMasterKeyFromSeed = function (seed) { var hmac = createHmac('sha512', ED25519_CURVE); var I = hmac.update(Buffer.from(seed, 'hex')).digest(); var IL = I.slice(0, 32); var IR = I.slice(32); return { key: IL, chainCode: IR, }; }; var CKDPriv = function (_a, index) { var key = _a.key, chainCode = _a.chainCode; var indexBuffer = Buffer.allocUnsafe(4); indexBuffer.writeUInt32BE(index, 0); var data = Buffer.concat([Buffer.alloc(1, 0), key, indexBuffer]); var I = createHmac('sha512', chainCode) .update(data) .digest(); var IL = I.slice(0, 32); var IR = I.slice(32); return { key: IL, chainCode: IR, }; }; exports.getPublicKey = function (seed) { var _a = naclFactory.sign.keyPair.fromSeed(seed), secretKey = _a.secretKey, publicKey = _a.publicKey; return { publicKey: publicKey, privateKey: secretKey }; }; exports.isValidPath = function (path) { if (!utils_1.pathRegex.test(path)) { return false; } return !path .split('/') .slice(1) .map(utils_1.replaceDerive) .some(isNaN); }; exports.derivePath = function (path, seed) { if (!exports.isValidPath(path)) { throw new Error('Invalid derivation path'); } var _a = exports.getMasterKeyFromSeed(seed), key = _a.key, chainCode = _a.chainCode; var segments = path .split('/') .slice(1) .map(utils_1.replaceDerive) .map(function (el) { return parseInt(el, 10); }); return segments.reduce(function (parentKeys, segment) { return CKDPriv(parentKeys, segment + HARDENED_OFFSET); }, { key: key, chainCode: chainCode }); };