PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-api/dist/src/v1

Просмотр файла: keychains.js

"use strict";
/**
 * @hidden
 */
Object.defineProperty(exports, "__esModule", { value: true });
/**
 */
//
// Keychains Object
// BitGo accessor to a user's keychain.
//
// Copyright 2014, BitGo, Inc.  All Rights Reserved.
//
const utxo_lib_1 = require("@bitgo/utxo-lib");
const crypto_1 = require("crypto");
const sdk_core_1 = require("@bitgo/sdk-core");
const _ = require('lodash');
//
// Constructor
//
const Keychains = function (bitgo) {
    // @ts-expect-error - no implicit this
    this.bitgo = bitgo;
};
//
// isValid
// Tests a xpub or xprv string to see if it is a valid keychain.
//
Keychains.prototype.isValid = function (params) {
    params = params || {};
    sdk_core_1.common.validateParams(params, [], []);
    if (!_.isString(params.key) && !_.isObject(params.key)) {
        throw new Error('key must be a string or object');
    }
    try {
        if (!params.key.path) {
            utxo_lib_1.bip32.fromBase58(params.key);
        }
        else {
            utxo_lib_1.bip32.fromBase58(params.key.xpub).derivePath((0, sdk_core_1.sanitizeLegacyPath)(params.key.path));
        }
        return true;
    }
    catch (e) {
        return false;
    }
};
//
// create
// Create a new keychain locally.
// Does not send the keychain to bitgo, only creates locally.
// If |seed| is provided, used to seed the keychain.  Otherwise,
// a random keychain is created.
//
Keychains.prototype.create = function (params) {
    params = params || {};
    sdk_core_1.common.validateParams(params, [], []);
    let seed;
    if (!params.seed) {
        // An extended private key has both a normal 256 bit private key and a 256
        // bit chain code, both of which must be random. 512 bits is therefore the
        // maximum entropy and gives us maximum security against cracking.
        seed = (0, crypto_1.randomBytes)(512 / 8);
    }
    else {
        seed = params.seed;
    }
    const extendedKey = utxo_lib_1.bip32.fromSeed(seed);
    const xpub = extendedKey.neutered().toBase58();
    let ethAddress;
    try {
        ethAddress = sdk_core_1.Util.xpubToEthAddress(xpub);
    }
    catch (e) {
        // ethereum is unavailable
    }
    return {
        xpub: xpub,
        xprv: extendedKey.toBase58(),
        ethAddress: ethAddress,
    };
};
// used by deriveLocal
const apiResponse = function (status, result, message) {
    const err = new Error(message);
    err.status = status;
    err.result = result;
    return err;
};
//
// deriveLocal
// Locally derives a keychain from a top level BIP32 string, given a path.
//
Keychains.prototype.deriveLocal = function (params) {
    params = params || {};
    sdk_core_1.common.validateParams(params, ['path'], ['xprv', 'xpub']);
    if (!params.xprv && !params.xpub) {
        throw new Error('must provide an xpub or xprv for derivation.');
    }
    if (params.xprv && params.xpub) {
        throw new Error('cannot provide both xpub and xprv');
    }
    let hdNode;
    try {
        hdNode = utxo_lib_1.bip32.fromBase58(params.xprv || params.xpub);
    }
    catch (e) {
        throw apiResponse(400, {}, 'Unable to parse the xprv or xpub');
    }
    let derivedNode;
    try {
        derivedNode = hdNode.derivePath((0, sdk_core_1.sanitizeLegacyPath)(params.path));
    }
    catch (e) {
        throw apiResponse(400, {}, 'Unable to derive HD key from path');
    }
    const xpub = derivedNode.neutered().toBase58();
    let ethAddress;
    try {
        ethAddress = sdk_core_1.Util.xpubToEthAddress(xpub);
    }
    catch (e) {
        // ethereum is unavailable
    }
    return {
        path: params.path,
        xpub: xpub,
        xprv: params.xprv && derivedNode.toBase58(),
        ethAddress: ethAddress,
    };
};
//
// list
// List the user's keychains
//
Keychains.prototype.list = function (params, callback) {
    params = params || {};
    sdk_core_1.common.validateParams(params, [], [], callback);
    return Promise.resolve(this.bitgo.get(this.bitgo.url('/keychain')).result('keychains'))
        .then(function (keychains) {
        keychains.map(function (keychain) {
            if (keychain.xpub &&
                keychain.ethAddress &&
                sdk_core_1.Util.xpubToEthAddress &&
                keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
                throw new Error('ethAddress and xpub do not match');
            }
        });
        return keychains;
    })
        .then(callback)
        .catch(callback);
};
/**
 * iterates through all keys associated with the user, decrypts them with the old password and encrypts them with the
 * new password
 * @param params.oldPassword {String} - The old password used for encrypting the key
 * @param params.newPassword {String} - The new password to be used for encrypting the key
 * @param callback
 * @returns result.keychains {Object} - e.g.:
 *  {
 *    xpub1: encryptedPrv1,
 *    xpub2: encryptedPrv2,
 *    ...
 *  }
 *  @returns result.version {Number}
 */
Keychains.prototype.updatePassword = function (params, callback) {
    return async function coUpdatePassword() {
        sdk_core_1.common.validateParams(params, ['oldPassword', 'newPassword'], [], callback);
        // @ts-expect-error - no implicit this
        const encrypted = await this.bitgo.post(this.bitgo.url('/user/encrypted')).result();
        const newKeychains = {};
        // @ts-expect-error - no implicit this
        const self = this;
        _.forOwn(encrypted.keychains, function keychainsForOwn(oldEncryptedXprv, xpub) {
            try {
                const decryptedPrv = self.bitgo.decrypt({ input: oldEncryptedXprv, password: params.oldPassword });
                const newEncryptedPrv = self.bitgo.encrypt({ input: decryptedPrv, password: params.newPassword });
                newKeychains[xpub] = newEncryptedPrv;
            }
            catch (e) {
                // decrypting the keychain with the old password didn't work so we just keep it the way it is
                newKeychains[xpub] = oldEncryptedXprv;
            }
        });
        return { keychains: newKeychains, version: encrypted.version };
    }
        .call(this)
        .then(callback)
        .catch(callback);
};
//
// add
// Add a new keychain
//
Keychains.prototype.add = function (params, callback) {
    params = params || {};
    sdk_core_1.common.validateParams(params, ['xpub'], ['encryptedXprv', 'type', 'isLedger'], callback);
    return Promise.resolve(this.bitgo
        .post(this.bitgo.url('/keychain'))
        .send({
        xpub: params.xpub,
        encryptedXprv: params.encryptedXprv,
        type: params.type,
        originalPasscodeEncryptionCode: params.originalPasscodeEncryptionCode,
        isLedger: params.isLedger,
    })
        .result())
        .then(function (keychain) {
        if (keychain.xpub &&
            keychain.ethAddress &&
            sdk_core_1.Util.xpubToEthAddress &&
            keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
            throw new Error('ethAddress and xpub do not match');
        }
        return keychain;
    })
        .then(callback)
        .catch(callback);
};
//
// createBitGo
// Add a new BitGo server keychain
//
Keychains.prototype.createBitGo = function (params, callback) {
    params = params || {};
    sdk_core_1.common.validateParams(params, [], [], callback);
    return Promise.resolve(this.bitgo.post(this.bitgo.url('/keychain/bitgo')).send(params).result())
        .then(function (keychain) {
        if (keychain.xpub &&
            keychain.ethAddress &&
            sdk_core_1.Util.xpubToEthAddress &&
            keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
            throw new Error('ethAddress and xpub do not match');
        }
        return keychain;
    })
        .then(callback)
        .catch(callback);
};
//
// createBackup
// Create a new backup keychain through bitgo - often used for creating a keychain on a KRS
//
Keychains.prototype.createBackup = function (params, callback) {
    params = params || {};
    sdk_core_1.common.validateParams(params, ['provider'], [], callback);
    return Promise.resolve(this.bitgo.post(this.bitgo.url('/keychain/backup')).send(params).result())
        .then(function (keychain) {
        // not all keychains have an xpub
        if (keychain.xpub &&
            keychain.ethAddress &&
            sdk_core_1.Util.xpubToEthAddress &&
            keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
            throw new Error('ethAddress and xpub do not match');
        }
        return keychain;
    })
        .then(callback)
        .catch(callback);
};
//
// get
// Fetch an existing keychain
// Parameters include:
//   xpub:  the xpub of the key to lookup (required)
//
Keychains.prototype.get = function (params, callback) {
    params = params || {};
    sdk_core_1.common.validateParams(params, [], ['xpub', 'ethAddress'], callback);
    if (!params.xpub && !params.ethAddress) {
        throw new Error('xpub or ethAddress must be defined');
    }
    const id = params.xpub || params.ethAddress;
    return Promise.resolve(this.bitgo
        .post(this.bitgo.url('/keychain/' + encodeURIComponent(id)))
        .send({})
        .result())
        .then(function (keychain) {
        if (keychain.xpub &&
            keychain.ethAddress &&
            sdk_core_1.Util.xpubToEthAddress &&
            keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
            throw new Error('ethAddress and xpub do not match');
        }
        return keychain;
    })
        .then(callback)
        .catch(callback);
};
//
// update
// Update an existing keychain
// Parameters include:
//   xpub:  the xpub of the key to lookup (required)
//
Keychains.prototype.update = function (params, callback) {
    params = params || {};
    sdk_core_1.common.validateParams(params, ['xpub'], ['encryptedXprv'], callback);
    return Promise.resolve(this.bitgo
        .put(this.bitgo.url('/keychain/' + params.xpub))
        .send({
        encryptedXprv: params.encryptedXprv,
    })
        .result())
        .then(function (keychain) {
        if (keychain.xpub &&
            keychain.ethAddress &&
            sdk_core_1.Util.xpubToEthAddress &&
            keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
            throw new Error('ethAddress and xpub do not match');
        }
        return keychain;
    })
        .then(callback)
        .catch(callback);
};
module.exports = Keychains;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixtQkFBbUI7QUFDbkIsdUNBQXVDO0FBQ3ZDLEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLDhDQUF3QztBQUN4QyxtQ0FBcUM7QUFDckMsOENBQW1FO0FBQ25FLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU1QixFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLFNBQVMsR0FBRyxVQUFVLEtBQUs7SUFDL0Isc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixVQUFVO0FBQ1YsZ0VBQWdFO0FBQ2hFLEVBQUU7QUFDRixTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLE1BQU07SUFDNUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsZ0JBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENB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UUFDdEIsSUFDRSxRQUFRLENBQUMsSUFBSTtZQUNiLFFBQVEsQ0FBQyxVQUFVO1lBQ25CLGVBQUksQ0FBQyxnQkFBZ0I7WUFDckIsUUFBUSxDQUFDLFVBQVUsS0FBSyxlQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM1RCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBLZXljaGFpbnMgT2JqZWN0XG4vLyBCaXRHbyBhY2Nlc3NvciB0byBhIHVzZXIncyBrZXljaGFpbi5cbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCwgQml0R28sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuXG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBjb21tb24sIFV0aWwsIHNhbml0aXplTGVnYWN5UGF0aCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5jb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IEtleWNoYWlucyA9IGZ1bmN0aW9uIChiaXRnbykge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICB0aGlzLmJpdGdvID0gYml0Z287XG59O1xuXG4vL1xuLy8gaXNWYWxpZFxuLy8gVGVzdHMgYSB4cHViIG9yIHhwcnYgc3RyaW5nIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIGtleWNoYWluLlxuLy9cbktleWNoYWlucy5wcm90b3R5cGUuaXNWYWxpZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gIGlmICghXy5pc1N0cmluZyhwYXJhbXMua2V5KSAmJiAhXy5pc09iamVjdChwYXJhbXMua2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigna2V5IG11c3QgYmUgYSBzdHJpbmcgb3Igb2JqZWN0Jyk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmICghcGFyYW1zLmtleS5wYXRoKSB7XG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy5rZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy5rZXkueHB1YikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgocGFyYW1zLmtleS5wYXRoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vL1xuLy8gY3JlYXRlXG4vLyBDcmVhdGUgYSBuZXcga2V5Y2hhaW4gbG9jYWxseS5cbi8vIERvZXMgbm90IHNlbmQgdGhlIGtleWNoYWluIHRvIGJpdGdvLCBvbmx5IGNyZWF0ZXMgbG9jYWxseS5cbi8vIElmIHxzZWVkfCBpcyBwcm92aWRlZCwgdXNlZCB0byBzZWVkIHRoZSBrZXljaGFpbi4gIE90aGVyd2lzZSxcbi8vIGEgcmFuZG9tIGtleWNoYWluIGlzIGNyZWF0ZWQuXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICBsZXQgc2VlZDtcbiAgaWYgKCFwYXJhbXMuc2VlZCkge1xuICAgIC8vIEFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGhhcyBib3RoIGEgbm9ybWFsIDI1NiBiaXQgcHJpdmF0ZSBrZXkgYW5kIGEgMjU2XG4gICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAvLyBtYXhpbXVtIGVudHJvcHkgYW5kIGdpdmVzIHVzIG1heGltdW0gc2VjdXJpdHkgYWdhaW5zdCBjcmFja2luZy5cbiAgICBzZWVkID0gcmFuZG9tQnl0ZXMoNTEyIC8gOCk7XG4gIH0gZWxzZSB7XG4gICAgc2VlZCA9IHBhcmFtcy5zZWVkO1xuICB9XG5cbiAgY29uc3QgZXh0ZW5kZWRLZXkgPSBiaXAzMi5mcm9tU2VlZChzZWVkKTtcbiAgY29uc3QgeHB1YiA9IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICBsZXQgZXRoQWRkcmVzcztcbiAgdHJ5IHtcbiAgICBldGhBZGRyZXNzID0gVXRpbC54cHViVG9FdGhBZGRyZXNzKHhwdWIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZXRoZXJldW0gaXMgdW5hdmFpbGFibGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeHB1YjogeHB1YixcbiAgICB4cHJ2OiBleHRlbmRlZEtleS50b0Jhc2U1OCgpLFxuICAgIGV0aEFkZHJlc3M6IGV0aEFkZHJlc3MsXG4gIH07XG59O1xuXG4vLyB1c2VkIGJ5IGRlcml2ZUxvY2FsXG5jb25zdCBhcGlSZXNwb25zZSA9IGZ1bmN0aW9uIChzdGF0dXMsIHJlc3VsdCwgbWVzc2FnZSkge1xuICBjb25zdCBlcnI6IGFueSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgZXJyLnJlc3VsdCA9IHJlc3VsdDtcbiAgcmV0dXJuIGVycjtcbn07XG5cbi8vXG4vLyBkZXJpdmVMb2NhbFxuLy8gTG9jYWxseSBkZXJpdmVzIGEga2V5Y2hhaW4gZnJvbSBhIHRvcCBsZXZlbCBCSVAzMiBzdHJpbmcsIGdpdmVuIGEgcGF0aC5cbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLmRlcml2ZUxvY2FsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsncGF0aCddLCBbJ3hwcnYnLCAneHB1YiddKTtcblxuICBpZiAoIXBhcmFtcy54cHJ2ICYmICFwYXJhbXMueHB1Yikge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGFuIHhwdWIgb3IgeHBydiBmb3IgZGVyaXZhdGlvbi4nKTtcbiAgfVxuICBpZiAocGFyYW1zLnhwcnYgJiYgcGFyYW1zLnhwdWIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBwcm92aWRlIGJvdGggeHB1YiBhbmQgeHBydicpO1xuICB9XG5cbiAgbGV0IGhkTm9kZTtcbiAgdHJ5IHtcbiAgICBoZE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy54cHJ2IHx8IHBhcmFtcy54cHViKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IGFwaVJlc3BvbnNlKDQwMCwge30sICdVbmFibGUgdG8gcGFyc2UgdGhlIHhwcnYgb3IgeHB1YicpO1xuICB9XG5cbiAgbGV0IGRlcml2ZWROb2RlO1xuICB0cnkge1xuICAgIGRlcml2ZWROb2RlID0gaGROb2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHBhcmFtcy5wYXRoKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBhcGlSZXNwb25zZSg0MDAsIHt9LCAnVW5hYmxlIHRvIGRlcml2ZSBIRCBrZXkgZnJvbSBwYXRoJyk7XG4gIH1cblxuICBjb25zdCB4cHViID0gZGVyaXZlZE5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG4gIGxldCBldGhBZGRyZXNzO1xuICB0cnkge1xuICAgIGV0aEFkZHJlc3MgPSBVdGlsLnhwdWJUb0V0aEFkZHJlc3MoeHB1Yik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBldGhlcmV1bSBpcyB1bmF2YWlsYWJsZVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICB4cHViOiB4cHViLFxuICAgIHhwcnY6IHBhcmFtcy54cHJ2ICYmIGRlcml2ZWROb2RlLnRvQmFzZTU4KCksXG4gICAgZXRoQWRkcmVzczogZXRoQWRkcmVzcyxcbiAgfTtcbn07XG5cbi8vXG4vLyBsaXN0XG4vLyBMaXN0IHRoZSB1c2VyJ3Mga2V5Y2hhaW5zXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4nKSkucmVzdWx0KCdrZXljaGFpbnMnKSlcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW5zKSB7XG4gICAgICBrZXljaGFpbnMubWFwKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5Y2hhaW4ueHB1YiAmJlxuICAgICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgJiZcbiAgICAgICAgICBVdGlsLnhwdWJUb0V0aEFkZHJlc3MgJiZcbiAgICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICE9PSBVdGlsLnhwdWJUb0V0aEFkZHJlc3Moa2V5Y2hhaW4ueHB1YilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldGhBZGRyZXNzIGFuZCB4cHViIGRvIG5vdCBtYXRjaCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBrZXljaGFpbnM7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBpdGVyYXRlcyB0aHJvdWdoIGFsbCBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgZGVjcnlwdHMgdGhlbSB3aXRoIHRoZSBvbGQgcGFzc3dvcmQgYW5kIGVuY3J5cHRzIHRoZW0gd2l0aCB0aGVcbiAqIG5ldyBwYXNzd29yZFxuICogQHBhcmFtIHBhcmFtcy5vbGRQYXNzd29yZCB7U3RyaW5nfSAtIFRoZSBvbGQgcGFzc3dvcmQgdXNlZCBmb3IgZW5jcnlwdGluZyB0aGUga2V5XG4gKiBAcGFyYW0gcGFyYW1zLm5ld1Bhc3N3b3JkIHtTdHJpbmd9IC0gVGhlIG5ldyBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgcmVzdWx0LmtleWNoYWlucyB7T2JqZWN0fSAtIGUuZy46XG4gKiAge1xuICogICAgeHB1YjE6IGVuY3J5cHRlZFBydjEsXG4gKiAgICB4cHViMjogZW5jcnlwdGVkUHJ2MixcbiAqICAgIC4uLlxuICogIH1cbiAqICBAcmV0dXJucyByZXN1bHQudmVyc2lvbiB7TnVtYmVyfVxuICovXG5LZXljaGFpbnMucHJvdG90eXBlLnVwZGF0ZVBhc3N3b3JkID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNvVXBkYXRlUGFzc3dvcmQoKSB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydvbGRQYXNzd29yZCcsICduZXdQYXNzd29yZCddLCBbXSwgY2FsbGJhY2spO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcvdXNlci9lbmNyeXB0ZWQnKSkucmVzdWx0KCk7XG4gICAgY29uc3QgbmV3S2V5Y2hhaW5zID0ge307XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBfLmZvck93bigoZW5jcnlwdGVkIGFzIGFueSkua2V5Y2hhaW5zLCBmdW5jdGlvbiBrZXljaGFpbnNGb3JPd24ob2xkRW5jcnlwdGVkWHBydiwgeHB1Yikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gc2VsZi5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IG9sZEVuY3J5cHRlZFhwcnYsIHBhc3N3b3JkOiBwYXJhbXMub2xkUGFzc3dvcmQgfSk7XG4gICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHNlbGYuYml0Z28uZW5jcnlwdCh7IGlucHV0OiBkZWNyeXB0ZWRQcnYsIHBhc3N3b3JkOiBwYXJhbXMubmV3UGFzc3dvcmQgfSk7XG4gICAgICAgIG5ld0tleWNoYWluc1t4cHViXSA9IG5ld0VuY3J5cHRlZFBydjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZGVjcnlwdGluZyB0aGUga2V5Y2hhaW4gd2l0aCB0aGUgb2xkIHBhc3N3b3JkIGRpZG4ndCB3b3JrIHNvIHdlIGp1c3Qga2VlcCBpdCB0aGUgd2F5IGl0IGlzXG4gICAgICAgIG5ld0tleWNoYWluc1t4cHViXSA9IG9sZEVuY3J5cHRlZFhwcnY7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsga2V5Y2hhaW5zOiBuZXdLZXljaGFpbnMsIHZlcnNpb246IChlbmNyeXB0ZWQgYXMgYW55KS52ZXJzaW9uIH07XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gYWRkXG4vLyBBZGQgYSBuZXcga2V5Y2hhaW5cbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd4cHViJ10sIFsnZW5jcnlwdGVkWHBydicsICd0eXBlJywgJ2lzTGVkZ2VyJ10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4nKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgeHB1YjogcGFyYW1zLnhwdWIsXG4gICAgICAgIGVuY3J5cHRlZFhwcnY6IHBhcmFtcy5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgICB0eXBlOiBwYXJhbXMudHlwZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBpc0xlZGdlcjogcGFyYW1zLmlzTGVkZ2VyLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtleWNoYWluLnhwdWIgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAmJlxuICAgICAgICBVdGlsLnhwdWJUb0V0aEFkZHJlc3MgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAhPT0gVXRpbC54cHViVG9FdGhBZGRyZXNzKGtleWNoYWluLnhwdWIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldGhBZGRyZXNzIGFuZCB4cHViIGRvIG5vdCBtYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVCaXRHb1xuLy8gQWRkIGEgbmV3IEJpdEdvIHNlcnZlciBrZXljaGFpblxuLy9cbktleWNoYWlucy5wcm90b3R5cGUuY3JlYXRlQml0R28gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4vYml0Z28nKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgaWYgKFxuICAgICAgICBrZXljaGFpbi54cHViICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgJiZcbiAgICAgICAgVXRpbC54cHViVG9FdGhBZGRyZXNzICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgIT09IFV0aWwueHB1YlRvRXRoQWRkcmVzcyhrZXljaGFpbi54cHViKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXRoQWRkcmVzcyBhbmQgeHB1YiBkbyBub3QgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlQmFja3VwXG4vLyBDcmVhdGUgYSBuZXcgYmFja3VwIGtleWNoYWluIHRocm91Z2ggYml0Z28gLSBvZnRlbiB1c2VkIGZvciBjcmVhdGluZyBhIGtleWNoYWluIG9uIGEgS1JTXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5jcmVhdGVCYWNrdXAgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsncHJvdmlkZXInXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL2tleWNoYWluL2JhY2t1cCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAvLyBub3QgYWxsIGtleWNoYWlucyBoYXZlIGFuIHhwdWJcbiAgICAgIGlmIChcbiAgICAgICAga2V5Y2hhaW4ueHB1YiAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICYmXG4gICAgICAgIFV0aWwueHB1YlRvRXRoQWRkcmVzcyAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICE9PSBVdGlsLnhwdWJUb0V0aEFkZHJlc3Moa2V5Y2hhaW4ueHB1YilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V0aEFkZHJlc3MgYW5kIHhwdWIgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldFxuLy8gRmV0Y2ggYW4gZXhpc3Rpbmcga2V5Y2hhaW5cbi8vIFBhcmFtZXRlcnMgaW5jbHVkZTpcbi8vICAgeHB1YjogIHRoZSB4cHViIG9mIHRoZSBrZXkgdG8gbG9va3VwIChyZXF1aXJlZClcbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsneHB1YicsICdldGhBZGRyZXNzJ10sIGNhbGxiYWNrKTtcblxuICBpZiAoIXBhcmFtcy54cHViICYmICFwYXJhbXMuZXRoQWRkcmVzcykge1xuICAgIHRocm93IG5ldyBFcnJvcigneHB1YiBvciBldGhBZGRyZXNzIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG5cbiAgY29uc3QgaWQgPSBwYXJhbXMueHB1YiB8fCBwYXJhbXMuZXRoQWRkcmVzcztcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJpdGdvLnVybCgnL2tleWNoYWluLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpKSlcbiAgICAgIC5zZW5kKHt9KVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5Y2hhaW4ueHB1YiAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICYmXG4gICAgICAgIFV0aWwueHB1YlRvRXRoQWRkcmVzcyAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICE9PSBVdGlsLnhwdWJUb0V0aEFkZHJlc3Moa2V5Y2hhaW4ueHB1YilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V0aEFkZHJlc3MgYW5kIHhwdWIgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVwZGF0ZVxuLy8gVXBkYXRlIGFuIGV4aXN0aW5nIGtleWNoYWluXG4vLyBQYXJhbWV0ZXJzIGluY2x1ZGU6XG4vLyAgIHhwdWI6ICB0aGUgeHB1YiBvZiB0aGUga2V5IHRvIGxvb2t1cCAocmVxdWlyZWQpXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsneHB1YiddLCBbJ2VuY3J5cHRlZFhwcnYnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJpdGdvLnVybCgnL2tleWNoYWluLycgKyBwYXJhbXMueHB1YikpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGVuY3J5cHRlZFhwcnY6IHBhcmFtcy5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtleWNoYWluLnhwdWIgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAmJlxuICAgICAgICBVdGlsLnhwdWJUb0V0aEFkZHJlc3MgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAhPT0gVXRpbC54cHViVG9FdGhBZGRyZXNzKGtleWNoYWluLnhwdWIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldGhBZGRyZXNzIGFuZCB4cHViIGRvIG5vdCBtYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gS2V5Y2hhaW5zO1xuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!