@airgap/crypto
Version:
The @airgap/crypto packages provides common crypto functionalities.
80 lines • 3.56 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bip32DecodeNode = exports.bip32EncodeNode = void 0;
// @ts-ignore
var bs58check = __importStar(require("@airgap/coinlib-core/dependencies/src/bs58check-2.1.2/index"));
var factory_1 = require("./factory");
var XPRV_VERSION = '0488ade4';
var XPUB_VERSION = '0488b21e';
function bip32EncodeNode(node, version) {
var _a, _b;
if (version === void 0) { version = {}; }
return {
type: 'bip32',
secretKey: encodeKey(node, (_a = version.secretKey) !== null && _a !== void 0 ? _a : XPRV_VERSION, 'secretKey'),
publicKey: encodeKey(node, (_b = version.publicKey) !== null && _b !== void 0 ? _b : XPUB_VERSION, 'publicKey')
};
}
exports.bip32EncodeNode = bip32EncodeNode;
function encodeKey(node, version, keyType) {
var versionBuffer = Buffer.from(version, 'hex');
var depth = Buffer.alloc(1);
depth.writeUInt8(node.depth);
var parentFingerprint = Buffer.alloc(4);
parentFingerprint.writeUInt32BE(node.parentFingerprint);
var index = Buffer.alloc(4);
index.writeUInt32BE(node.index);
var chainCode = node.chainCode;
var key = keyType === 'secretKey' ? Buffer.concat([Buffer.alloc(1, 0), node[keyType]]) : node[keyType];
return bs58check.encode(Buffer.concat([versionBuffer, depth, parentFingerprint, index, chainCode, key]));
}
function bip32DecodeNode(node, version) {
var _a, _b;
if (version === void 0) { version = {}; }
var xprvDecoded = decodeKey(node.secretKey, (_a = version.secretKey) !== null && _a !== void 0 ? _a : XPRV_VERSION, 'secretKey');
var xpubDecoded = decodeKey(node.publicKey, (_b = version.publicKey) !== null && _b !== void 0 ? _b : XPUB_VERSION, 'publicKey');
return (0, factory_1.newDerivationNodeFromKeys)(xprvDecoded, xpubDecoded);
}
exports.bip32DecodeNode = bip32DecodeNode;
function decodeKey(key, version, keyType) {
var buffer = bs58check.decode(key);
var versionBuffer = buffer.slice(0, 4);
if (versionBuffer.toString('hex') !== version) {
throw new Error('Invalid Bip32 version');
}
var depth = buffer.readUInt8(4);
var parentFingerprint = buffer.readUInt32BE(5);
var index = buffer.readUInt32BE(9);
var chainCode = buffer.slice(13, 45);
return {
depth: depth,
parentFingerprint: parentFingerprint,
index: index,
chainCode: chainCode,
key: keyType === 'secretKey' ? buffer.slice(46) : buffer.slice(45)
};
}
//# sourceMappingURL=bip32.js.map