PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-core/dist/src/account-lib/baseCoin
Просмотр файла: ed25519KeyPair.js
"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.Ed25519KeyPair = void 0;
const nacl = __importStar(require("tweetnacl"));
const crypto_1 = require("../util/crypto");
const ed25519KeyDeriver_1 = require("../util/ed25519KeyDeriver");
const iface_1 = require("./iface");
const DEFAULT_SEED_SIZE_BYTES = 32;
class Ed25519KeyPair {
/**
* Public constructor. By default, creates a key pair with a random master seed.
*
* @param {KeyPairOptions} source Either a master seed, a private key, or a public key
*/
constructor(source) {
let naclKeyPair;
if (!source) {
const seed = nacl.randomBytes(DEFAULT_SEED_SIZE_BYTES);
naclKeyPair = nacl.sign.keyPair.fromSeed(seed);
this.setKeyPair(naclKeyPair);
}
else if ((0, iface_1.isSeed)(source)) {
naclKeyPair = nacl.sign.keyPair.fromSeed(source.seed);
this.setKeyPair(naclKeyPair);
}
else if ((0, iface_1.isPrivateKey)(source)) {
this.recordKeysFromPrivateKey(source.prv);
}
else if ((0, iface_1.isPublicKey)(source)) {
this.recordKeysFromPublicKey(source.pub);
}
else {
throw new Error('Invalid key pair options');
}
}
getKeyPair(naclKeyPair) {
return {
prv: (0, crypto_1.toHex)(naclKeyPair.secretKey.slice(0, 32)),
pub: (0, crypto_1.toHex)(naclKeyPair.publicKey),
};
}
setKeyPair(naclKeyPair) {
this.keyPair = this.getKeyPair(naclKeyPair);
}
/** @inheritdoc */
recordKeysFromPrivateKey(prv) {
if ((0, crypto_1.isValidEd25519Seed)(prv)) {
const decodedPrv = (0, crypto_1.toUint8Array)(prv);
const naclKeyPair = nacl.sign.keyPair.fromSeed(decodedPrv);
this.setKeyPair(naclKeyPair);
}
else if ((0, crypto_1.isValidEd25519SecretKey)(prv)) {
const decodedPrv = (0, crypto_1.toUint8Array)(prv);
const naclKeyPair = nacl.sign.keyPair.fromSecretKey(decodedPrv);
this.setKeyPair(naclKeyPair);
}
else {
this.keyPair = this.recordKeysFromPrivateKeyInProtocolFormat(prv);
}
}
/** @inheritdoc */
recordKeysFromPublicKey(pub) {
if ((0, crypto_1.isValidEd25519PublicKey)(pub)) {
this.keyPair = { pub };
}
else {
this.keyPair = this.recordKeysFromPublicKeyInProtocolFormat(pub);
}
}
/**
* Generates a signature for an arbitrary string with the current private key using the ed25519 public-key signature
* system.
*
* @param {string} message to produce a signature for
* @returns {Uint8Array} The signature produced for the message
* @throws if there is no private key
*/
signMessage(message) {
const messageToSign = (0, crypto_1.toUint8Array)(Buffer.from(message).toString('hex'));
const prv = this.keyPair?.prv;
if (!prv) {
throw new Error('Missing private key');
}
return nacl.sign.detached(messageToSign, nacl.sign.keyPair.fromSeed((0, crypto_1.toUint8Array)(prv)).secretKey);
}
/**
* Verifies a message signature using the current public key.
*
* @param {string} message signed
* @param {Uint8Array} signature to verify
* @returns {boolean} True if the message was signed with the current key pair
*/
verifySignature(message, signature) {
let messageToVerify;
if (typeof message === 'string') {
messageToVerify = (0, crypto_1.toUint8Array)(Buffer.from(message).toString('hex'));
}
else {
messageToVerify = message;
}
if (!this.keyPair?.pub) {
return false;
}
const publicKey = (0, crypto_1.toUint8Array)(this.keyPair.pub);
return nacl.sign.detached.verify(messageToVerify, signature, publicKey);
}
/**
* Derives a hardened child key pair using this key pair's secret key
* as the seed.
*
* @param path derivation path
* @deprecated
*/
deriveHardened(path) {
if (!this.keyPair?.prv) {
throw new Error('need private key to derive hardened keypair');
}
const seed = ed25519KeyDeriver_1.Ed25519KeyDeriver.derivePath(path, this.keyPair.prv).key;
const derivedKeyPair = nacl.sign.keyPair.fromSeed(seed);
return this.getKeyPair(derivedKeyPair);
}
}
exports.Ed25519KeyPair = Ed25519KeyPair;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWQyNTUxOUtleVBhaXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvYmFzZUNvaW4vZWQyNTUxOUtleVBhaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLDJDQU13QjtBQUN4QixpRUFBOEQ7QUFHOUQsbUNBQXlGO0FBRXpGLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQXNCLGNBQWM7SUFJbEM7Ozs7T0FJRztJQUNILFlBQXNCLE1BQXVCO1FBQzNDLElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN2RCxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksSUFBQSxjQUFNLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLElBQUEsb0JBQVksRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksSUFBQSxtQkFBVyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHVC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QUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDTixlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFBLHFCQUFZLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxjQUFjLENBQUMsSUFBWTtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLHFDQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUEvSEQsd0NBK0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHtcbiAgaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXksXG4gIGlzVmFsaWRFZDI1NTE5U2VjcmV0S2V5LFxuICBpc1ZhbGlkRWQyNTUxOVNlZWQsXG4gIHRvSGV4LFxuICB0b1VpbnQ4QXJyYXksXG59IGZyb20gJy4uL3V0aWwvY3J5cHRvJztcbmltcG9ydCB7IEVkMjU1MTlLZXlEZXJpdmVyIH0gZnJvbSAnLi4vdXRpbC9lZDI1NTE5S2V5RGVyaXZlcic7XG5pbXBvcnQgeyBCYXNlS2V5UGFpciB9IGZyb20gJy4vYmFzZUtleVBhaXInO1xuaW1wb3J0IHsgQWRkcmVzc0Zvcm1hdCwgRG90QWRkcmVzc0Zvcm1hdCB9IGZyb20gJy4vZW51bSc7XG5pbXBvcnQgeyBpc1ByaXZhdGVLZXksIGlzUHVibGljS2V5LCBpc1NlZWQsIERlZmF1bHRLZXlzLCBLZXlQYWlyT3B0aW9ucyB9IGZyb20gJy4vaWZhY2UnO1xuXG5jb25zdCBERUZBVUxUX1NFRURfU0laRV9CWVRFUyA9IDMyO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRWQyNTUxOUtleVBhaXIgaW1wbGVtZW50cyBCYXNlS2V5UGFpciB7XG4gIHByb3RlY3RlZCBrZXlQYWlyOiBEZWZhdWx0S2V5cztcbiAgcHJvdGVjdGVkIHNvdXJjZT86IEtleVBhaXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuIEJ5IGRlZmF1bHQsIGNyZWF0ZXMgYSBrZXkgcGFpciB3aXRoIGEgcmFuZG9tIG1hc3RlciBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJPcHRpb25zfSBzb3VyY2UgRWl0aGVyIGEgbWFzdGVyIHNlZWQsIGEgcHJpdmF0ZSBrZXksIG9yIGEgcHVibGljIGtleVxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNvdXJjZT86IEtleVBhaXJPcHRpb25zKSB7XG4gICAgbGV0IG5hY2xLZXlQYWlyO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zdCBzZWVkID0gbmFjbC5yYW5kb21CeXRlcyhERUZBVUxUX1NFRURfU0laRV9CWVRFUyk7XG4gICAgICBuYWNsS2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKHNlZWQpO1xuICAgICAgdGhpcy5zZXRLZXlQYWlyKG5hY2xLZXlQYWlyKTtcbiAgICB9IGVsc2UgaWYgKGlzU2VlZChzb3VyY2UpKSB7XG4gICAgICBuYWNsS2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKHNvdXJjZS5zZWVkKTtcbiAgICAgIHRoaXMuc2V0S2V5UGFpcihuYWNsS2V5UGFpcik7XG4gICAgfSBlbHNlIGlmIChpc1ByaXZhdGVLZXkoc291cmNlKSkge1xuICAgICAgdGhpcy5yZWNvcmRLZXlzRnJvbVByaXZhdGVLZXkoc291cmNlLnBydik7XG4gICAgfSBlbHNlIGlmIChpc1B1YmxpY0tleShzb3VyY2UpKSB7XG4gICAgICB0aGlzLnJlY29yZEtleXNGcm9tUHVibGljS2V5KHNvdXJjZS5wdWIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5IHBhaXIgb3B0aW9ucycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0S2V5UGFpcihuYWNsS2V5UGFpcjogbmFjbC5TaWduS2V5UGFpcik6IERlZmF1bHRLZXlzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJ2OiB0b0hleChuYWNsS2V5UGFpci5zZWNyZXRLZXkuc2xpY2UoMCwgMzIpKSxcbiAgICAgIHB1YjogdG9IZXgobmFjbEtleVBhaXIucHVibGljS2V5KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRLZXlQYWlyKG5hY2xLZXlQYWlyOiBuYWNsLlNpZ25LZXlQYWlyKTogdm9pZCB7XG4gICAgdGhpcy5rZXlQYWlyID0gdGhpcy5nZXRLZXlQYWlyKG5hY2xLZXlQYWlyKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICByZWNvcmRLZXlzRnJvbVByaXZhdGVLZXkocHJ2OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNWYWxpZEVkMjU1MTlTZWVkKHBydikpIHtcbiAgICAgIGNvbnN0IGRlY29kZWRQcnYgPSB0b1VpbnQ4QXJyYXkocHJ2KTtcbiAgICAgIGNvbnN0IG5hY2xLZXlQYWlyID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQoZGVjb2RlZFBydik7XG4gICAgICB0aGlzLnNldEtleVBhaXIobmFjbEtleVBhaXIpO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZEVkMjU1MTlTZWNyZXRLZXkocHJ2KSkge1xuICAgICAgY29uc3QgZGVjb2RlZFBydiA9IHRvVWludDhBcnJheShwcnYpO1xuICAgICAgY29uc3QgbmFjbEtleVBhaXIgPSBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VjcmV0S2V5KGRlY29kZWRQcnYpO1xuICAgICAgdGhpcy5zZXRLZXlQYWlyKG5hY2xLZXlQYWlyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rZXlQYWlyID0gdGhpcy5yZWNvcmRLZXlzRnJvbVByaXZhdGVLZXlJblByb3RvY29sRm9ybWF0KHBydik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHJlY29yZEtleXNGcm9tUHVibGljS2V5KHB1Yjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzVmFsaWRFZDI1NTE5UHVibGljS2V5KHB1YikpIHtcbiAgICAgIHRoaXMua2V5UGFpciA9IHsgcHViIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua2V5UGFpciA9IHRoaXMucmVjb3JkS2V5c0Zyb21QdWJsaWNLZXlJblByb3RvY29sRm9ybWF0KHB1Yik7XG4gICAgfVxuICB9XG5cbiAgYWJzdHJhY3QgcmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5SW5Qcm90b2NvbEZvcm1hdChwcnY6IHN0cmluZyk6IERlZmF1bHRLZXlzO1xuXG4gIGFic3RyYWN0IHJlY29yZEtleXNGcm9tUHVibGljS2V5SW5Qcm90b2NvbEZvcm1hdChwdWI6IHN0cmluZyk6IERlZmF1bHRLZXlzO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhYnN0cmFjdCBnZXRBZGRyZXNzKGZvcm1hdD86IEFkZHJlc3NGb3JtYXQgfCBEb3RBZGRyZXNzRm9ybWF0KTogc3RyaW5nO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhYnN0cmFjdCBnZXRLZXlzKCk6IGFueTtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc2lnbmF0dXJlIGZvciBhbiBhcmJpdHJhcnkgc3RyaW5nIHdpdGggdGhlIGN1cnJlbnQgcHJpdmF0ZSBrZXkgdXNpbmcgdGhlIGVkMjU1MTkgcHVibGljLWtleSBzaWduYXR1cmVcbiAgICogc3lzdGVtLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSB0byBwcm9kdWNlIGEgc2lnbmF0dXJlIGZvclxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gVGhlIHNpZ25hdHVyZSBwcm9kdWNlZCBmb3IgdGhlIG1lc3NhZ2VcbiAgICogQHRocm93cyBpZiB0aGVyZSBpcyBubyBwcml2YXRlIGtleVxuICAgKi9cbiAgc2lnbk1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgbWVzc2FnZVRvU2lnbiA9IHRvVWludDhBcnJheShCdWZmZXIuZnJvbShtZXNzYWdlKS50b1N0cmluZygnaGV4JykpO1xuICAgIGNvbnN0IHBydiA9IHRoaXMua2V5UGFpcj8ucHJ2O1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZChtZXNzYWdlVG9TaWduLCBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZCh0b1VpbnQ4QXJyYXkocHJ2KSkuc2VjcmV0S2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIG1lc3NhZ2Ugc2lnbmF0dXJlIHVzaW5nIHRoZSBjdXJyZW50IHB1YmxpYyBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIHNpZ25lZFxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHNpZ25hdHVyZSB0byB2ZXJpZnlcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIHNpZ25lZCB3aXRoIHRoZSBjdXJyZW50IGtleSBwYWlyXG4gICAqL1xuICB2ZXJpZnlTaWduYXR1cmUobWVzc2FnZTogVWludDhBcnJheSB8IHN0cmluZywgc2lnbmF0dXJlOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gICAgbGV0IG1lc3NhZ2VUb1ZlcmlmeTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlVG9WZXJpZnkgPSB0b1VpbnQ4QXJyYXkoQnVmZmVyLmZyb20obWVzc2FnZSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZVRvVmVyaWZ5ID0gbWVzc2FnZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleVBhaXI/LnB1Yikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwdWJsaWNLZXkgPSB0b1VpbnQ4QXJyYXkodGhpcy5rZXlQYWlyLnB1Yik7XG4gICAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobWVzc2FnZVRvVmVyaWZ5LCBzaWduYXR1cmUsIHB1YmxpY0tleSk7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyBhIGhhcmRlbmVkIGNoaWxkIGtleSBwYWlyIHVzaW5nIHRoaXMga2V5IHBhaXIncyBzZWNyZXQga2V5XG4gICAqIGFzIHRoZSBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGRlcml2ZUhhcmRlbmVkKHBhdGg6IHN0cmluZyk6IERlZmF1bHRLZXlzIHtcbiAgICBpZiAoIXRoaXMua2V5UGFpcj8ucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25lZWQgcHJpdmF0ZSBrZXkgdG8gZGVyaXZlIGhhcmRlbmVkIGtleXBhaXInKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWVkID0gRWQyNTUxOUtleURlcml2ZXIuZGVyaXZlUGF0aChwYXRoLCB0aGlzLmtleVBhaXIucHJ2KS5rZXk7XG4gICAgY29uc3QgZGVyaXZlZEtleVBhaXIgPSBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZChzZWVkKTtcblxuICAgIHJldHVybiB0aGlzLmdldEtleVBhaXIoZGVyaXZlZEtleVBhaXIpO1xuICB9XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!