@airgap/crypto
Version:
The @airgap/crypto packages provides common crypto functionalities.
56 lines • 2.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.deriveEd25519 = void 0;
var ed25519_1 = require("@airgap/coinlib-core/dependencies/src/@stablelib/ed25519-1.0.3/packages/ed25519/ed25519");
var sha512_1 = require("@airgap/coinlib-core/dependencies/src/@stablelib/sha512-1.0.1/packages/sha512/sha512");
var hmac_1 = require("@stablelib/hmac");
var derivation_1 = require("../utils/derivation");
var hash_1 = require("../utils/hash");
var ED25519_KEY = 'ed25519 seed';
function deriveEd25519(seed, derivationPath, key) {
if (key === void 0) { key = ED25519_KEY; }
var masterNode = masterNodeFromSeed(seed, key);
return derivationPath !== undefined ? derive(masterNode, derivationPath) : masterNode;
}
exports.deriveEd25519 = deriveEd25519;
function masterNodeFromSeed(seed, key) {
var _a = getKey(seed, Buffer.from(key, 'utf-8')), secretKey = _a.key, chainCode = _a.chainCode;
return {
depth: 0,
parentFingerprint: 0x00000000,
index: 0,
chainCode: chainCode,
secretKey: secretKey,
publicKey: getPublicKey(secretKey)
};
}
function derive(masterNode, derivationPath) {
var derivationIndices = (0, derivation_1.splitDerivationPath)(derivationPath);
return derivationIndices.reduce(function (derivedNode, next) {
var parentFingerprint = (0, hash_1.hash160)(derivedNode.publicKey).readUInt32BE(0);
var index = next.masked;
var indexBuffer = Buffer.alloc(4);
indexBuffer.writeUInt32BE(index);
var data = Buffer.concat([Buffer.alloc(1, 0), derivedNode.secretKey, indexBuffer]);
var _a = getKey(data, derivedNode.chainCode), secretKey = _a.key, chainCode = _a.chainCode;
return {
depth: derivedNode.depth + 1,
parentFingerprint: parentFingerprint,
index: index,
chainCode: chainCode,
secretKey: secretKey,
publicKey: getPublicKey(secretKey)
};
}, masterNode);
}
function getKey(data, key) {
var I = Buffer.from((0, hmac_1.hmac)(sha512_1.SHA512, key, data));
var IL = I.slice(0, 32);
var IR = I.slice(32);
return { key: IL, chainCode: IR };
}
function getPublicKey(privateKey) {
var publicKey = (0, ed25519_1.generateKeyPairFromSeed)(privateKey).publicKey;
return Buffer.from(publicKey);
}
//# sourceMappingURL=derive.js.map