UNPKG

@taquito/signer

Version:

Provide signing functionality to be with taquito

168 lines (167 loc) 7.43 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 __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.InMemorySigner = exports.InvalidPassphraseError = exports.VERSION = void 0; /** * @packageDocumentation * @module @taquito/signer */ const nacl_1 = require("@stablelib/nacl"); const blake2b_1 = require("@stablelib/blake2b"); const utils_1 = require("@taquito/utils"); const typedarray_to_buffer_1 = require("typedarray-to-buffer"); const ed_key_1 = require("./ed-key"); const ec_key_1 = require("./ec-key"); const pbkdf2_1 = require("pbkdf2"); const Bip39 = require("bip39"); const helpers_1 = require("./helpers"); const errors_1 = require("./errors"); const core_1 = require("@taquito/core"); __exportStar(require("./import-key"), exports); var version_1 = require("./version"); Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } }); __exportStar(require("./derivation-tools"), exports); __exportStar(require("./helpers"), exports); var errors_2 = require("./errors"); Object.defineProperty(exports, "InvalidPassphraseError", { enumerable: true, get: function () { return errors_2.InvalidPassphraseError; } }); /** * @description A local implementation of the signer. Will represent a Tezos account and be able to produce signature in its behalf * * @warn If running in production and dealing with tokens that have real value, it is strongly recommended to use a HSM backed signer so that private key material is not stored in memory or on disk * @throws {@link InvalidMnemonicError} */ class InMemorySigner { static fromFundraiser(email, password, mnemonic) { if (!Bip39.validateMnemonic(mnemonic)) { throw new errors_1.InvalidMnemonicError(mnemonic); } const seed = Bip39.mnemonicToSeedSync(mnemonic, `${email}${password}`); const key = (0, utils_1.b58cencode)(seed.slice(0, 32), utils_1.prefix.edsk2); return new InMemorySigner(key); } static fromSecretKey(key, passphrase) { return __awaiter(this, void 0, void 0, function* () { return new InMemorySigner(key, passphrase); }); } /** * * @description Instantiation of an InMemorySigner instance from a mnemonic * @param mnemonic 12-24 word mnemonic * @param password password used to encrypt the mnemonic to seed value * @param derivationPath default 44'/1729'/0'/0' (44'/1729' mandatory) * @param curve currently only supported for tz1, tz2, tz3 addresses. soon bip25519 * @returns InMemorySigner * @throws {@link InvalidMnemonicError} */ static fromMnemonic({ mnemonic, password = '', derivationPath = "44'/1729'/0'/0'", curve = 'ed25519', }) { // check if curve is defined if not default tz1 if (!Bip39.validateMnemonic(mnemonic)) { // avoiding exposing mnemonic again in case of mistake making invalid throw new errors_1.InvalidMnemonicError(mnemonic); } const seed = Bip39.mnemonicToSeedSync(mnemonic, password); const sk = (0, helpers_1.generateSecretKey)(seed, derivationPath, curve); return new InMemorySigner(sk); } /** * * @param key Encoded private key * @param passphrase Passphrase to decrypt the private key if it is encrypted * @throws {@link InvalidKeyError} * */ constructor(key, passphrase) { const encrypted = key.substring(2, 3) === 'e'; let decrypt = (k) => k; if (encrypted) { if (!passphrase) { throw new errors_1.InvalidPassphraseError('No passphrase provided to decrypt encrypted key'); } decrypt = (constructedKey) => { const salt = (0, typedarray_to_buffer_1.default)(constructedKey.slice(0, 8)); const encryptedSk = constructedKey.slice(8); const encryptionKey = pbkdf2_1.default.pbkdf2Sync(passphrase, salt, 32768, 32, 'sha512'); return (0, nacl_1.openSecretBox)(new Uint8Array(encryptionKey), new Uint8Array(24), new Uint8Array(encryptedSk)); }; } switch (key.substring(0, 4)) { case 'edes': case 'edsk': this._key = new ed_key_1.Tz1(key, encrypted, decrypt); break; case 'spsk': case 'spes': this._key = new ec_key_1.Tz2(key, encrypted, decrypt); break; case 'p2sk': case 'p2es': this._key = new ec_key_1.Tz3(key, encrypted, decrypt); break; default: throw new core_1.InvalidKeyError(`${(0, utils_1.invalidDetail)(utils_1.ValidationResult.NO_PREFIX_MATCHED)} expecting one of the following '${utils_1.Prefix.EDESK}', '${utils_1.Prefix.EDSK}', '${utils_1.Prefix.SPSK}', '${utils_1.Prefix.SPESK}', '${utils_1.Prefix.P2SK}' or '${utils_1.Prefix.P2ESK}'.`); } } /** * * @param bytes Bytes to sign * @param watermark Watermark to append to the bytes */ sign(bytes, watermark) { return __awaiter(this, void 0, void 0, function* () { let bb = (0, utils_1.hex2buf)(bytes); if (typeof watermark !== 'undefined') { bb = (0, utils_1.mergebuf)(watermark, bb); } const bytesHash = (0, blake2b_1.hash)(bb, 32); return this._key.sign(bytes, bytesHash); }); } /** * @returns Encoded public key */ publicKey() { return __awaiter(this, void 0, void 0, function* () { return this._key.publicKey(); }); } /** * @returns Encoded public key hash */ publicKeyHash() { return __awaiter(this, void 0, void 0, function* () { return this._key.publicKeyHash(); }); } /** * @returns Encoded private key */ secretKey() { return __awaiter(this, void 0, void 0, function* () { return this._key.secretKey(); }); } } exports.InMemorySigner = InMemorySigner;