UNPKG

@bitgo/secp256k1

Version:

Low-level cryptographic methods used in BitGo packages for the secp256k1 curve

90 lines 8.81 kB
"use strict"; 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.signMessage = signMessage; exports.verifyMessage = verifyMessage; const bitcoinMessage = __importStar(require("bitcoinjs-message")); const createHash = require('create-hash'); const bs58check = require('bs58check'); /** * Computes hash160 (RIPEMD160(SHA256(data))) */ function hash160(data) { const sha256Hash = createHash('sha256').update(data).digest(); return createHash('ripemd160').update(sha256Hash).digest(); } /** * Encodes a hash with version byte in Base58Check format */ function toBase58Check(hash, version) { const payload = Buffer.allocUnsafe(21); payload.writeUInt8(version, 0); hash.copy(payload, 1); return bs58check.encode(payload); } // Bitcoin mainnet pubKeyHash version byte const BITCOIN_PUBKEY_HASH_VERSION = 0x00; /** * bip32-aware wrapper around bitcoin-message package * @see {bitcoinMessage.sign} */ function signMessage(message, privateKey, network) { if (!Buffer.isBuffer(privateKey)) { privateKey = privateKey.privateKey; if (!privateKey) { throw new Error(`must provide privateKey`); } } if (network === null || typeof network !== 'object' || typeof network.messagePrefix !== 'string') { throw new Error(`invalid argument 'network'`); } const compressed = true; return bitcoinMessage.sign(message, privateKey, compressed, network.messagePrefix); } /** * bip32-aware wrapper around bitcoin-message package * @see {bitcoinMessage.verify} */ function verifyMessage(message, publicKey, signature, network) { if (!Buffer.isBuffer(publicKey)) { publicKey = publicKey.publicKey; } if (network === null || typeof network !== 'object' || typeof network.messagePrefix !== 'string') { throw new Error(`invalid argument 'network'`); } const address = toBase58Check(hash160(publicKey), BITCOIN_PUBKEY_HASH_VERSION); return bitcoinMessage.verify(message, address, signature, network.messagePrefix); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlwMzJ1dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaXAzMnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JBLGtDQWdCQztBQU1ELHNDQWVDO0FBbkVELGtFQUFvRDtBQUVwRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDMUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXZDOztHQUVHO0FBQ0gsU0FBUyxPQUFPLENBQUMsSUFBWTtJQUMzQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFZLEVBQUUsT0FBZTtJQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsMENBQTBDO0FBQzFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDO0FBRXpDOzs7R0FHRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsT0FBd0IsRUFDeEIsVUFBbUMsRUFDbkMsT0FBa0M7SUFFbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQW9CLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxPQUFPLENBQUMsYUFBYSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pHLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsT0FBd0IsRUFDeEIsU0FBa0MsRUFDbEMsU0FBaUIsRUFDakIsT0FBa0M7SUFFbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakcsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDL0UsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNuRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgKiBhcyBiaXRjb2luTWVzc2FnZSBmcm9tICdiaXRjb2luanMtbWVzc2FnZSc7XG5cbmNvbnN0IGNyZWF0ZUhhc2ggPSByZXF1aXJlKCdjcmVhdGUtaGFzaCcpO1xuY29uc3QgYnM1OGNoZWNrID0gcmVxdWlyZSgnYnM1OGNoZWNrJyk7XG5cbi8qKlxuICogQ29tcHV0ZXMgaGFzaDE2MCAoUklQRU1EMTYwKFNIQTI1NihkYXRhKSkpXG4gKi9cbmZ1bmN0aW9uIGhhc2gxNjAoZGF0YTogQnVmZmVyKTogQnVmZmVyIHtcbiAgY29uc3Qgc2hhMjU2SGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShkYXRhKS5kaWdlc3QoKTtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3JpcGVtZDE2MCcpLnVwZGF0ZShzaGEyNTZIYXNoKS5kaWdlc3QoKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgaGFzaCB3aXRoIHZlcnNpb24gYnl0ZSBpbiBCYXNlNThDaGVjayBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gdG9CYXNlNThDaGVjayhoYXNoOiBCdWZmZXIsIHZlcnNpb246IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjEpO1xuICBwYXlsb2FkLndyaXRlVUludDgodmVyc2lvbiwgMCk7XG4gIGhhc2guY29weShwYXlsb2FkLCAxKTtcbiAgcmV0dXJuIGJzNThjaGVjay5lbmNvZGUocGF5bG9hZCk7XG59XG5cbi8vIEJpdGNvaW4gbWFpbm5ldCBwdWJLZXlIYXNoIHZlcnNpb24gYnl0ZVxuY29uc3QgQklUQ09JTl9QVUJLRVlfSEFTSF9WRVJTSU9OID0gMHgwMDtcblxuLyoqXG4gKiBiaXAzMi1hd2FyZSB3cmFwcGVyIGFyb3VuZCBiaXRjb2luLW1lc3NhZ2UgcGFja2FnZVxuICogQHNlZSB7Yml0Y29pbk1lc3NhZ2Uuc2lnbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25NZXNzYWdlKFxuICBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIsXG4gIHByaXZhdGVLZXk6IEJJUDMySW50ZXJmYWNlIHwgQnVmZmVyLFxuICBuZXR3b3JrOiB7IG1lc3NhZ2VQcmVmaXg6IHN0cmluZyB9XG4pOiBCdWZmZXIge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwcml2YXRlS2V5KSkge1xuICAgIHByaXZhdGVLZXkgPSBwcml2YXRlS2V5LnByaXZhdGVLZXkgYXMgQnVmZmVyO1xuICAgIGlmICghcHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgcHJpdmF0ZUtleWApO1xuICAgIH1cbiAgfVxuICBpZiAobmV0d29yayA9PT0gbnVsbCB8fCB0eXBlb2YgbmV0d29yayAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ldHdvcmsubWVzc2FnZVByZWZpeCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYXJndW1lbnQgJ25ldHdvcmsnYCk7XG4gIH1cbiAgY29uc3QgY29tcHJlc3NlZCA9IHRydWU7XG4gIHJldHVybiBiaXRjb2luTWVzc2FnZS5zaWduKG1lc3NhZ2UsIHByaXZhdGVLZXksIGNvbXByZXNzZWQsIG5ldHdvcmsubWVzc2FnZVByZWZpeCk7XG59XG5cbi8qKlxuICogYmlwMzItYXdhcmUgd3JhcHBlciBhcm91bmQgYml0Y29pbi1tZXNzYWdlIHBhY2thZ2VcbiAqIEBzZWUge2JpdGNvaW5NZXNzYWdlLnZlcmlmeX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeU1lc3NhZ2UoXG4gIG1lc3NhZ2U6IHN0cmluZyB8IEJ1ZmZlcixcbiAgcHVibGljS2V5OiBCSVAzMkludGVyZmFjZSB8IEJ1ZmZlcixcbiAgc2lnbmF0dXJlOiBCdWZmZXIsXG4gIG5ldHdvcms6IHsgbWVzc2FnZVByZWZpeDogc3RyaW5nIH1cbik6IGJvb2xlYW4ge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwdWJsaWNLZXkpKSB7XG4gICAgcHVibGljS2V5ID0gcHVibGljS2V5LnB1YmxpY0tleTtcbiAgfVxuICBpZiAobmV0d29yayA9PT0gbnVsbCB8fCB0eXBlb2YgbmV0d29yayAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ldHdvcmsubWVzc2FnZVByZWZpeCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYXJndW1lbnQgJ25ldHdvcmsnYCk7XG4gIH1cblxuICBjb25zdCBhZGRyZXNzID0gdG9CYXNlNThDaGVjayhoYXNoMTYwKHB1YmxpY0tleSksIEJJVENPSU5fUFVCS0VZX0hBU0hfVkVSU0lPTik7XG4gIHJldHVybiBiaXRjb2luTWVzc2FnZS52ZXJpZnkobWVzc2FnZSwgYWRkcmVzcywgc2lnbmF0dXJlLCBuZXR3b3JrLm1lc3NhZ2VQcmVmaXgpO1xufVxuIl19