@sisi/ed25519-blake2b-hd-key
Version:
Fork of alepop/ed25519-hd-key. Convert to ed25519-blake2b.
62 lines (61 loc) • 2.01 kB
JavaScript
;
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 });
};