PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/utxo-core/dist/src/bip322

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MAX_NUM_BIP322_INPUTS = void 0;
exports.createBaseToSignPsbt = createBaseToSignPsbt;
exports.addBip322Input = addBip322Input;
exports.addBip322InputWithChainAndIndex = addBip322InputWithChainAndIndex;
const utxo_lib_1 = require("@bitgo/utxo-lib");
const outputScripts_1 = require("@bitgo/utxo-lib/dist/src/bitgo/outputScripts");
const utils_1 = require("./utils");
const toSpend_1 = require("./toSpend");
exports.MAX_NUM_BIP322_INPUTS = 200;
/**
 * Create the base PSBT for the to_sign transaction for BIP322 signing.
 * There will be ever 1 output.
 */
function createBaseToSignPsbt(rootWalletKeys, network = utxo_lib_1.networks.bitcoin) {
    // Create PSBT object for constructing the transaction
    const psbt = utxo_lib_1.bitgo.createPsbtForNetwork({ network });
    // Set default value for nVersion and nLockTime
    psbt.setVersion(0); // nVersion = 0
    psbt.setLocktime(0); // nLockTime = 0
    // Set the output
    psbt.addOutput({
        value: BigInt(0), // vout[0].nValue = 0
        script: Buffer.from([0x6a]), // vout[0].scriptPubKey = OP_RETURN
    });
    // If rootWalletKeys are provided, add them to the PSBT as global xpubs
    if (rootWalletKeys) {
        utxo_lib_1.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
    }
    return psbt;
}
/**
 * Add a BIP322 input to the PSBT.
 * Source implementation:
 * https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
 *
 * @param {string} message - The message that is hashed into the `to_spend` transaction.
 * @param {AddressDetails} addressDetails - The details of the address, including redeemScript and/or witnessScript.
 * @param {string} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
 * @returns {Psbt} - The hex representation of the constructed PSBT.
 */
function addBip322Input(psbt, message, addressDetails, tag = toSpend_1.BIP322_TAG) {
    const toSpendTx = (0, toSpend_1.buildToSpendTransaction)(addressDetails.scriptPubKey, message, tag);
    if (psbt.data.inputs.length >= exports.MAX_NUM_BIP322_INPUTS) {
        throw new Error(`Exceeded maximum number of BIP322 inputs (${exports.MAX_NUM_BIP322_INPUTS})`);
    }
    psbt.addInput({
        hash: toSpendTx.getId(), // vin[0].prevout.hash = to_spend.txid
        index: 0, // vin[0].prevout.n = 0
        sequence: 0, // vin[0].nSequence = 0
        nonWitnessUtxo: toSpendTx.toBuffer(), // previous transaction for us to rebuild later to verify
        sighashType: utxo_lib_1.Transaction.SIGHASH_ALL,
    });
    const inputIndex = psbt.data.inputs.length - 1;
    psbt.updateInput(inputIndex, {
        witnessUtxo: { value: BigInt(0), script: addressDetails.scriptPubKey },
    });
    if (addressDetails.redeemScript) {
        psbt.updateInput(inputIndex, { redeemScript: addressDetails.redeemScript });
    }
    if (addressDetails.witnessScript) {
        psbt.updateInput(inputIndex, {
            witnessScript: addressDetails.witnessScript,
        });
    }
    // Add the message as a proprietary key value to the PSBT so we can verify it later
    (0, utils_1.addBip322ProofMessage)(psbt, inputIndex, Buffer.from(message));
}
function addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, scriptId) {
    const scriptType = utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain);
    const walletKeys = rootWalletKeys.deriveForChainAndIndex(scriptId.chain, scriptId.index);
    const output = utxo_lib_1.bitgo.outputScripts.createOutputScript2of3(walletKeys.publicKeys, utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain));
    addBip322Input(psbt, message, {
        scriptPubKey: output.scriptPubKey,
        redeemScript: output.redeemScript,
        witnessScript: output.witnessScript,
    });
    const inputIndex = psbt.data.inputs.length - 1;
    // When adding the taproot metadata, we assume that we are NOT using the backup path
    // For script type p2tr, it means that we are using signer and bitgo keys when creating the tap tree
    // spending paths. For p2trMusig2, it means that we are using the taproot key path spending
    const keyNames = ['user', 'bitgo'];
    if (scriptType === 'p2tr') {
        const { controlBlock, witnessScript, leafVersion, leafHash } = utxo_lib_1.bitgo.outputScripts.createSpendScriptP2tr(walletKeys.publicKeys, [walletKeys.user.publicKey, walletKeys.bitgo.publicKey]);
        psbt.updateInput(inputIndex, {
            tapLeafScript: [{ controlBlock, script: witnessScript, leafVersion }],
        });
        psbt.updateInput(inputIndex, {
            tapBip32Derivation: keyNames.map((key) => ({
                leafHashes: [leafHash],
                pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletKeys[key].publicKey),
                path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
                masterFingerprint: rootWalletKeys[key].fingerprint,
            })),
        });
    }
    else if (scriptType === 'p2trMusig2') {
        const { internalPubkey: tapInternalKey, outputPubkey: tapOutputKey, taptreeRoot, } = utxo_lib_1.bitgo.outputScripts.createKeyPathP2trMusig2(walletKeys.publicKeys);
        const participantsKeyValData = utxo_lib_1.bitgo.musig2.encodePsbtMusig2Participants({
            tapOutputKey,
            tapInternalKey,
            participantPubKeys: [walletKeys.user.publicKey, walletKeys.bitgo.publicKey],
        });
        utxo_lib_1.bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'input', inputIndex, participantsKeyValData);
        psbt.updateInput(inputIndex, {
            tapInternalKey: tapInternalKey,
        });
        psbt.updateInput(inputIndex, {
            tapMerkleRoot: taptreeRoot,
        });
        psbt.updateInput(inputIndex, {
            tapBip32Derivation: keyNames.map((key) => ({
                leafHashes: [],
                pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletKeys[key].publicKey),
                path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
                masterFingerprint: rootWalletKeys[key].fingerprint,
            })),
        });
    }
    else {
        // Add bip32 derivation information for the input
        psbt.updateInput(inputIndex, utxo_lib_1.bitgo.getPsbtBip32DerivationOutputUpdate(rootWalletKeys, walletKeys, utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain)));
    }
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TaWduLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpcDMyMi90b1NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUJBLG9EQXNCQztBQVlELHdDQTZCQztBQUVELDBFQStFQztBQWpLRCw4Q0FBcUU7QUFDckUsZ0ZBQWdGO0FBRWhGLG1DQUFnRDtBQUNoRCx1Q0FBZ0U7QUFPbkQsUUFBQSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFFekM7OztHQUdHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQ2xDLGNBQXFDLEVBQ3JDLE9BQU8sR0FBRyxtQkFBUSxDQUFDLE9BQU87SUFFMUIsc0RBQXNEO0lBQ3RELE1BQU0sSUFBSSxHQUFHLGdCQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELCtDQUErQztJQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTtJQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO0lBRXJDLGlCQUFpQjtJQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUI7UUFDdkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLG1DQUFtQztLQUNqRSxDQUFDLENBQUM7SUFFSCx1RUFBdUU7SUFDdkUsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQixnQkFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxJQUFVLEVBQUUsT0FBZSxFQUFFLGNBQThCLEVBQUUsR0FBRyxHQUFHLG9CQUFV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cmtzLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyB0b1hPbmx5UHVibGljS2V5IH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliL2Rpc3Qvc3JjL2JpdGdvL291dHB1dFNjcmlwdHMnO1xuXG5pbXBvcnQgeyBhZGRCaXAzMjJQcm9vZk1lc3NhZ2UgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJJUDMyMl9UQUcsIGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90b1NwZW5kJztcblxuZXhwb3J0IHR5cGUgQWRkcmVzc0RldGFpbHMgPSB7XG4gIHJlZGVlbVNjcmlwdD86IEJ1ZmZlcjtcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcjtcbiAgc2NyaXB0UHViS2V5OiBCdWZmZXI7XG59O1xuZXhwb3J0IGNvbnN0IE1BWF9OVU1fQklQMzIyX0lOUFVUUyA9IDIwMDtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGJhc2UgUFNCVCBmb3IgdGhlIHRvX3NpZ24gdHJhbnNhY3Rpb24gZm9yIEJJUDMyMiBzaWduaW5nLlxuICogVGhlcmUgd2lsbCBiZSBldmVyIDEgb3V0cHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFzZVRvU2lnblBzYnQoXG4gIHJvb3RXYWxsZXRLZXlzPzogYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIG5ldHdvcmsgPSBuZXR3b3Jrcy5iaXRjb2luXG4pOiBiaXRnby5VdHhvUHNidCB7XG4gIC8vIENyZWF0ZSBQU0JUIG9iamVjdCBmb3IgY29uc3RydWN0aW5nIHRoZSB0cmFuc2FjdGlvblxuICBjb25zdCBwc2J0ID0gYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0pO1xuICAvLyBTZXQgZGVmYXVsdCB2YWx1ZSBmb3IgblZlcnNpb24gYW5kIG5Mb2NrVGltZVxuICBwc2J0LnNldFZlcnNpb24oMCk7IC8vIG5WZXJzaW9uID0gMFxuICBwc2J0LnNldExvY2t0aW1lKDApOyAvLyBuTG9ja1RpbWUgPSAwXG5cbiAgLy8gU2V0IHRoZSBvdXRwdXRcbiAgcHNidC5hZGRPdXRwdXQoe1xuICAgIHZhbHVlOiBCaWdJbnQoMCksIC8vIHZvdXRbMF0ublZhbHVlID0gMFxuICAgIHNjcmlwdDogQnVmZmVyLmZyb20oWzB4NmFdKSwgLy8gdm91dFswXS5zY3JpcHRQdWJLZXkgPSBPUF9SRVRVUk5cbiAgfSk7XG5cbiAgLy8gSWYgcm9vdFdhbGxldEtleXMgYXJlIHByb3ZpZGVkLCBhZGQgdGhlbSB0byB0aGUgUFNCVCBhcyBnbG9iYWwgeHB1YnNcbiAgaWYgKHJvb3RXYWxsZXRLZXlzKSB7XG4gICAgYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgcm9vdFdhbGxldEtleXMpO1xuICB9XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG5cbi8qKlxuICogQWRkIGEgQklQMzIyIGlucHV0IHRvIHRoZSBQU0JULlxuICogU291cmNlIGltcGxlbWVudGF0aW9uOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDMyMi5tZWRpYXdpa2kjZnVsbFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdGhhdCBpcyBoYXNoZWQgaW50byB0aGUgYHRvX3NwZW5kYCB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbSB7QWRkcmVzc0RldGFpbHN9IGFkZHJlc3NEZXRhaWxzIC0gVGhlIGRldGFpbHMgb2YgdGhlIGFkZHJlc3MsIGluY2x1ZGluZyByZWRlZW1TY3JpcHQgYW5kL29yIHdpdG5lc3NTY3JpcHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz1CSVAzMjJfVEFHXSAtIFRoZSB0YWcgdG8gdXNlIGZvciBoYXNoaW5nLCBkZWZhdWx0cyB0byBCSVAzMjJfVEFHLlxuICogQHJldHVybnMge1BzYnR9IC0gVGhlIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RydWN0ZWQgUFNCVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEJpcDMyMklucHV0KHBzYnQ6IFBzYnQsIG1lc3NhZ2U6IHN0cmluZywgYWRkcmVzc0RldGFpbHM6IEFkZHJlc3NEZXRhaWxzLCB0YWcgPSBCSVAzMjJfVEFHKTogdm9pZCB7XG4gIGNvbnN0IHRvU3BlbmRUeCA9IGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uKGFkZHJlc3NEZXRhaWxzLnNjcmlwdFB1YktleSwgbWVzc2FnZSwgdGFnKTtcbiAgaWYgKHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoID49IE1BWF9OVU1fQklQMzIyX0lOUFVUUykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhjZWVkZWQgbWF4aW11bSBudW1iZXIgb2YgQklQMzIyIGlucHV0cyAoJHtNQVhfTlVNX0JJUDMyMl9JTlBVVFN9KWApO1xuICB9XG5cbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaDogdG9TcGVuZFR4LmdldElkKCksIC8vIHZpblswXS5wcmV2b3V0Lmhhc2ggPSB0b19zcGVuZC50eGlkXG4gICAgaW5kZXg6IDAsIC8vIHZpblswXS5wcmV2b3V0Lm4gPSAwXG4gICAgc2VxdWVuY2U6IDAsIC8vIHZpblswXS5uU2VxdWVuY2UgPSAwXG4gICAgbm9uV2l0bmVzc1V0eG86IHRvU3BlbmRUeC50b0J1ZmZlcigpLCAvLyBwcmV2aW91cyB0cmFuc2FjdGlvbiBmb3IgdXMgdG8gcmVidWlsZCBsYXRlciB0byB2ZXJpZnlcbiAgICBzaWdoYXNoVHlwZTogVHJhbnNhY3Rpb24uU0lHSEFTSF9BTEwsXG4gIH0pO1xuICBjb25zdCBpbnB1dEluZGV4ID0gcHNidC5kYXRhLmlucHV0cy5sZW5ndGggLSAxO1xuICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICB3aXRuZXNzVXR4bzogeyB2YWx1ZTogQmlnSW50KDApLCBzY3JpcHQ6IGFkZHJlc3NEZXRhaWxzLnNjcmlwdFB1YktleSB9LFxuICB9KTtcblxuICBpZiAoYWRkcmVzc0RldGFpbHMucmVkZWVtU2NyaXB0KSB7XG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHJlZGVlbVNjcmlwdDogYWRkcmVzc0RldGFpbHMucmVkZWVtU2NyaXB0IH0pO1xuICB9XG4gIGlmIChhZGRyZXNzRGV0YWlscy53aXRuZXNzU2NyaXB0KSB7XG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB3aXRuZXNzU2NyaXB0OiBhZGRyZXNzRGV0YWlscy53aXRuZXNzU2NyaXB0LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWRkIHRoZSBtZXNzYWdlIGFzIGEgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHRvIHRoZSBQU0JUIHNvIHdlIGNhbiB2ZXJpZnkgaXQgbGF0ZXJcbiAgYWRkQmlwMzIyUHJvb2ZNZXNzYWdlKHBzYnQsIGlucHV0SW5kZXgsIEJ1ZmZlci5mcm9tKG1lc3NhZ2UpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEJpcDMyMklucHV0V2l0aENoYWluQW5kSW5kZXgoXG4gIHBzYnQ6IGJpdGdvLlV0eG9Qc2J0LFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIHJvb3RXYWxsZXRLZXlzOiBiaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgc2NyaXB0SWQ6IGJpdGdvLlNjcmlwdElkXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IGJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihzY3JpcHRJZC5jaGFpbik7XG4gIGNvbnN0IHdhbGxldEtleXMgPSByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KHNjcmlwdElkLmNoYWluLCBzY3JpcHRJZC5pbmRleCk7XG4gIGNvbnN0IG91dHB1dCA9IGJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhcbiAgICB3YWxsZXRLZXlzLnB1YmxpY0tleXMsXG4gICAgYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKHNjcmlwdElkLmNoYWluKVxuICApO1xuXG4gIGFkZEJpcDMyMklucHV0KHBzYnQgYXMgUHNidCwgbWVzc2FnZSwge1xuICAgIHNjcmlwdFB1YktleTogb3V0cHV0LnNjcmlwdFB1YktleSxcbiAgICByZWRlZW1TY3JpcHQ6IG91dHB1dC5yZWRlZW1TY3JpcHQsXG4gICAgd2l0bmVzc1NjcmlwdDogb3V0cHV0LndpdG5lc3NTY3JpcHQsXG4gIH0pO1xuXG4gIGNvbnN0IGlucHV0SW5kZXggPSBwc2J0LmRhdGEuaW5wdXRzLmxlbmd0aCAtIDE7XG5cbiAgLy8gV2hlbiBhZGRpbmcgdGhlIHRhcHJvb3QgbWV0YWRhdGEsIHdlIGFzc3VtZSB0aGF0IHdlIGFyZSBOT1QgdXNpbmcgdGhlIGJhY2t1cCBwYXRoXG4gIC8vIEZvciBzY3JpcHQgdHlwZSBwMnRyLCBpdCBtZWFucyB0aGF0IHdlIGFyZSB1c2luZyBzaWduZXIgYW5kIGJpdGdvIGtleXMgd2hlbiBjcmVhdGluZyB0aGUgdGFwIHRyZWVcbiAgLy8gc3BlbmRpbmcgcGF0aHMuIEZvciBwMnRyTXVzaWcyLCBpdCBtZWFucyB0aGF0IHdlIGFyZSB1c2luZyB0aGUgdGFwcm9vdCBrZXkgcGF0aCBzcGVuZGluZ1xuICBjb25zdCBrZXlOYW1lcyA9IFsndXNlcicsICdiaXRnbyddIGFzIGJpdGdvLktleU5hbWVbXTtcbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyJykge1xuICAgIGNvbnN0IHsgY29udHJvbEJsb2NrLCB3aXRuZXNzU2NyaXB0LCBsZWFmVmVyc2lvbiwgbGVhZkhhc2ggfSA9IGJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlU3BlbmRTY3JpcHRQMnRyKFxuICAgICAgd2FsbGV0S2V5cy5wdWJsaWNLZXlzLFxuICAgICAgW3dhbGxldEtleXMudXNlci5wdWJsaWNLZXksIHdhbGxldEtleXMuYml0Z28ucHVibGljS2V5XVxuICAgICk7XG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBMZWFmU2NyaXB0OiBbeyBjb250cm9sQmxvY2ssIHNjcmlwdDogd2l0bmVzc1NjcmlwdCwgbGVhZlZlcnNpb24gfV0sXG4gICAgfSk7XG5cbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcEJpcDMyRGVyaXZhdGlvbjoga2V5TmFtZXMubWFwKChrZXkpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtsZWFmSGFzaF0sXG4gICAgICAgIHB1YmtleTogdG9YT25seVB1YmxpY0tleSh3YWxsZXRLZXlzW2tleV0ucHVibGljS2V5KSxcbiAgICAgICAgcGF0aDogcm9vdFdhbGxldEtleXMuZ2V0RGVyaXZhdGlvblBhdGgocm9vdFdhbGxldEtleXNba2V5XSwgc2NyaXB0SWQuY2hhaW4sIHNjcmlwdElkLmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzW2tleV0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJuYWxQdWJrZXk6IHRhcEludGVybmFsS2V5LFxuICAgICAgb3V0cHV0UHVia2V5OiB0YXBPdXRwdXRLZXksXG4gICAgICB0YXB0cmVlUm9vdCxcbiAgICB9ID0gYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVLZXlQYXRoUDJ0ck11c2lnMih3YWxsZXRLZXlzLnB1YmxpY0tleXMpO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRzS2V5VmFsRGF0YSA9IGJpdGdvLm11c2lnMi5lbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHtcbiAgICAgIHRhcE91dHB1dEtleSxcbiAgICAgIHRhcEludGVybmFsS2V5LFxuICAgICAgcGFydGljaXBhbnRQdWJLZXlzOiBbd2FsbGV0S2V5cy51c2VyLnB1YmxpY0tleSwgd2FsbGV0S2V5cy5iaXRnby5wdWJsaWNLZXldLFxuICAgIH0pO1xuICAgIGJpdGdvLmFkZFByb3ByaWV0YXJ5S2V5VmFsdWVzRnJvbVVua25vd25LZXlWYWx1ZXMocHNidCwgJ2lucHV0JywgaW5wdXRJbmRleCwgcGFydGljaXBhbnRzS2V5VmFsRGF0YSk7XG5cbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcEludGVybmFsS2V5OiB0YXBJbnRlcm5hbEtleSxcbiAgICB9KTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwTWVya2xlUm9vdDogdGFwdHJlZVJvb3QsXG4gICAgfSk7XG5cbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcEJpcDMyRGVyaXZhdGlvbjoga2V5TmFtZXMubWFwKChrZXkpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtdLFxuICAgICAgICBwdWJrZXk6IHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0S2V5c1trZXldLnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHJvb3RXYWxsZXRLZXlzW2tleV0sIHNjcmlwdElkLmNoYWluLCBzY3JpcHRJZC5pbmRleCksXG4gICAgICAgIG1hc3RlckZpbmdlcnByaW50OiByb290V2FsbGV0S2V5c1trZXldLmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIEFkZCBiaXAzMiBkZXJpdmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXRcbiAgICBwc2J0LnVwZGF0ZUlucHV0KFxuICAgICAgaW5wdXRJbmRleCxcbiAgICAgIGJpdGdvLmdldFBzYnRCaXAzMkRlcml2YXRpb25PdXRwdXRVcGRhdGUocm9vdFdhbGxldEtleXMsIHdhbGxldEtleXMsIGJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihzY3JpcHRJZC5jaGFpbikpXG4gICAgKTtcbiAgfVxufVxuIl19

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


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