@bitgo-beta/sdk-core 8.2.1-beta.212 → 8.2.1-beta.2121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +43 -31
- package/dist/src/account-lib/baseCoin/enum.d.ts +59 -5
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +112 -10
- package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/errors.js +8 -2
- package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/iface.js +26 -18
- package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/index.js +8 -5
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
- package/dist/src/account-lib/index.d.ts +0 -1
- package/dist/src/account-lib/index.d.ts.map +1 -1
- package/dist/src/account-lib/index.js +23 -10
- package/dist/src/account-lib/mpc/index.d.ts +1 -1
- package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/index.js +6 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
- package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
- package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/index.js +23 -9
- package/dist/src/account-lib/mpc/util.d.ts +7 -1
- package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/util.js +24 -1
- package/dist/src/account-lib/staking/index.js +6 -2
- package/dist/src/account-lib/staking/utils.js +3 -3
- package/dist/src/account-lib/util/crypto.d.ts +8 -2
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
- package/dist/src/account-lib/util/crypto.js +69 -38
- package/dist/src/api/bip32path.js +2 -3
- package/dist/src/api/index.js +6 -2
- package/dist/src/api/types.d.ts +37 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +8 -1
- package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -1
- package/dist/src/bitgo/address-book/address-book.js +20 -12
- package/dist/src/bitgo/address-book/index.js +6 -2
- package/dist/src/bitgo/address-book/types.d.ts +36 -36
- package/dist/src/bitgo/address-book/types.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +123 -13
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +200 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +337 -33
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
- package/dist/src/bitgo/baseCoin/index.js +6 -2
- package/dist/src/bitgo/bip32util.d.ts +3 -16
- package/dist/src/bitgo/bip32util.d.ts.map +1 -1
- package/dist/src/bitgo/bip32util.js +4 -56
- package/dist/src/bitgo/bitcoin.d.ts +0 -1
- package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoin.js +26 -13
- package/dist/src/bitgo/bitgoBase.d.ts +17 -4
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/coinFactory.d.ts +24 -3
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +35 -3
- package/dist/src/bitgo/config.d.ts +3 -101
- package/dist/src/bitgo/config.d.ts.map +1 -1
- package/dist/src/bitgo/config.js +26 -15
- package/dist/src/bitgo/defi/defiVault.d.ts +171 -0
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/defiVault.js +445 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts +101 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/iDefiVault.js +6 -0
- package/dist/src/bitgo/defi/index.d.ts +3 -0
- package/dist/src/bitgo/defi/index.d.ts.map +1 -0
- package/dist/src/bitgo/defi/index.js +22 -0
- package/dist/src/bitgo/ecdh.d.ts +0 -1
- package/dist/src/bitgo/ecdh.d.ts.map +1 -1
- package/dist/src/bitgo/ecdh.js +26 -13
- package/dist/src/bitgo/enterprise/enterprise.d.ts +9 -4
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +47 -21
- package/dist/src/bitgo/enterprise/enterprises.js +27 -13
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +5 -3
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/enterprise/index.js +6 -2
- package/dist/src/bitgo/environments.d.ts +73 -3
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +415 -34
- package/dist/src/bitgo/errors.d.ts +189 -1
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +187 -3
- package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
- package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
- package/dist/src/bitgo/evm/evmUtils.js +50 -0
- package/dist/src/bitgo/index.d.ts +6 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +32 -11
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
- package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
- package/dist/src/bitgo/internal/index.js +6 -2
- package/dist/src/bitgo/internal/internal.js +5 -6
- package/dist/src/bitgo/internal/keycard.d.ts +13 -8
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +63 -48
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts +180 -11
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +2 -2
- package/dist/src/bitgo/keychain/index.d.ts +1 -0
- package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/index.js +7 -2
- package/dist/src/bitgo/keychain/keychains.d.ts +106 -13
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +423 -72
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
- package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
- package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/legacyBitcoin.js +27 -13
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
- package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
- package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
- package/dist/src/bitgo/market/index.js +6 -2
- package/dist/src/bitgo/market/markets.js +23 -9
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +5 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
- package/dist/src/bitgo/pendingApproval/index.js +6 -2
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +246 -111
- package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
- package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
- package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
- package/dist/src/bitgo/proofs/index.d.ts +2 -0
- package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/index.js +6 -0
- package/dist/src/bitgo/proofs/types.d.ts +80 -0
- package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/types.js +80 -0
- package/dist/src/bitgo/recovery/index.js +6 -2
- package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
- package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
- package/dist/src/bitgo/recovery/initiate.js +49 -41
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +51 -0
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +115 -0
- package/dist/src/bitgo/safe/iSafe.d.ts +124 -0
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
- package/dist/src/bitgo/safe/iSafe.js +3 -0
- package/dist/src/bitgo/safe/iSafes.d.ts +94 -0
- package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
- package/dist/src/bitgo/safe/iSafes.js +3 -0
- package/dist/src/bitgo/safe/index.d.ts +8 -0
- package/dist/src/bitgo/safe/index.d.ts.map +1 -0
- package/dist/src/bitgo/safe/index.js +24 -0
- package/dist/src/bitgo/safe/recovery.d.ts +133 -0
- package/dist/src/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/src/bitgo/safe/recovery.js +176 -0
- package/dist/src/bitgo/safe/rootCoin.d.ts +15 -0
- package/dist/src/bitgo/safe/rootCoin.d.ts.map +1 -0
- package/dist/src/bitgo/safe/rootCoin.js +47 -0
- package/dist/src/bitgo/safe/safe.d.ts +88 -0
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safe.js +417 -0
- package/dist/src/bitgo/safe/safes.d.ts +102 -0
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safes.js +281 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +161 -8
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
- package/dist/src/bitgo/staking/index.d.ts +3 -0
- package/dist/src/bitgo/staking/index.d.ts.map +1 -1
- package/dist/src/bitgo/staking/index.js +9 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +153 -7
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
- package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
- package/dist/src/bitgo/trading/index.d.ts +1 -0
- package/dist/src/bitgo/trading/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/index.js +7 -2
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt.js +58 -0
- package/dist/src/bitgo/trading/network/index.d.ts +2 -0
- package/dist/src/bitgo/trading/network/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/index.js +8 -2
- package/dist/src/bitgo/trading/network/network.d.ts +4 -3
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/network.js +24 -27
- package/dist/src/bitgo/trading/network/types.d.ts +79 -46
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/types.js +1 -1
- package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
- package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/utils.js +54 -0
- package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +55 -7
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +49 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.js +92 -0
- package/dist/src/bitgo/tss/common.d.ts +50 -6
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +139 -17
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
- package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
- package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
- package/dist/src/bitgo/tss/eddsa/index.js +23 -9
- package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
- package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.d.ts +3 -2
- package/dist/src/bitgo/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.js +26 -10
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +84 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +184 -0
- package/dist/src/bitgo/tss/types.d.ts +3 -3
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +2 -2
- package/dist/src/bitgo/types.d.ts +3 -3
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +10 -0
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +76 -14
- package/dist/src/bitgo/utils/codecProps.js +24 -11
- package/dist/src/bitgo/utils/codecs.d.ts +11 -0
- package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
- package/dist/src/bitgo/utils/codecs.js +59 -0
- package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
- package/dist/src/bitgo/utils/decode.js +30 -16
- package/dist/src/bitgo/utils/index.d.ts +5 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +28 -11
- package/dist/src/bitgo/utils/messageTypes.d.ts +46 -0
- package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/src/bitgo/utils/messageTypes.js +23 -0
- package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +208 -14
- package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/src/bitgo/utils/notEmpty.js +7 -0
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +11 -7
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +79 -62
- package/dist/src/bitgo/utils/postWithCodec.js +2 -3
- package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
- package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/promise-utils.js +2 -3
- package/dist/src/bitgo/utils/siws.d.ts +17 -0
- package/dist/src/bitgo/utils/siws.d.ts.map +1 -0
- package/dist/src/bitgo/utils/siws.js +171 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/transactionUtils.js +29 -0
- package/dist/src/bitgo/utils/triple.d.ts +1 -1
- package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
- package/dist/src/bitgo/utils/triple.js +2 -3
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +99 -17
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +322 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +462 -55
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +173 -246
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +241 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1072 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +17 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +39 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +65 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +439 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +5 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +11 -2
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +151 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +119 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +43 -11
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +261 -96
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +261 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +994 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +14 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +29 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +44 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +268 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +5 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +30 -8
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +15 -7
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +75 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
- package/dist/src/bitgo/utils/tss/index.d.ts +7 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +31 -10
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts +40 -0
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.js +103 -0
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts +45 -0
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/keyVerification.js +192 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +42 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.js +179 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +126 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +27 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +43 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +45 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
- package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
- package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
- package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
- package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/src/bitgo/utils/txRequest.js +49 -0
- package/dist/src/bitgo/utils/util.js +24 -10
- package/dist/src/bitgo/utils/wallet.d.ts +7 -0
- package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
- package/dist/src/bitgo/utils/wallet.js +48 -0
- package/dist/src/bitgo/v1Wallets.d.ts +170 -0
- package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
- package/dist/src/bitgo/v1Wallets.js +3 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts +91 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +96 -11
- package/dist/src/bitgo/wallet/iWallet.d.ts +636 -33
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +311 -16
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +84 -3
- package/dist/src/bitgo/wallet/index.d.ts +1 -0
- package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/index.js +7 -2
- package/dist/src/bitgo/wallet/safeKeychain.d.ts +75 -0
- package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/safeKeychain.js +152 -0
- package/dist/src/bitgo/wallet/wallet.d.ts +410 -27
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +2518 -510
- package/dist/src/bitgo/wallet/wallets.d.ts +99 -4
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +1256 -156
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/index.js +19 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
- package/dist/src/bitgo/webauthn/base64url.d.ts +16 -0
- package/dist/src/bitgo/webauthn/base64url.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/base64url.js +27 -0
- package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts +18 -0
- package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.js +26 -0
- package/dist/src/bitgo/webauthn/derivePassword.d.ts +11 -0
- package/dist/src/bitgo/webauthn/derivePassword.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/derivePassword.js +16 -0
- package/dist/src/bitgo/webauthn/index.d.ts +5 -0
- package/dist/src/bitgo/webauthn/index.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/index.js +21 -0
- package/dist/src/bitgo/webauthn/types.d.ts +18 -0
- package/dist/src/bitgo/webauthn/types.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/types.js +3 -0
- package/dist/src/bitgo/webhook/index.js +6 -2
- package/dist/src/bitgo/webhook/webhooks.js +23 -9
- package/dist/src/coins/fiat.d.ts +45 -0
- package/dist/src/coins/fiat.d.ts.map +1 -0
- package/dist/src/coins/fiat.js +94 -0
- package/dist/src/coins/index.d.ts +1 -6
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +7 -8
- package/dist/src/coins/ofc.d.ts +21 -2
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +29 -3
- package/dist/src/coins/ofcToken.d.ts +15 -4
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +43 -5
- package/dist/src/coins/susd.d.ts +3 -2
- package/dist/src/coins/susd.d.ts.map +1 -1
- package/dist/src/coins/susd.js +5 -1
- package/dist/src/common.js +27 -13
- package/dist/src/index.d.ts +9 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +40 -11
- package/dist/src/lightning.d.ts +20 -0
- package/dist/src/lightning.d.ts.map +1 -0
- package/dist/src/lightning.js +13 -0
- package/dist/src/units.js +5 -6
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
- package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
- package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
- package/dist/test/unit/account-lib/mpc/util.js +53 -0
- package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
- package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
- package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
- package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
- package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/test/unit/bitgo/defi/defiVault.js +863 -0
- package/dist/test/unit/bitgo/environment.d.ts +2 -0
- package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
- package/dist/test/unit/bitgo/environment.js +38 -0
- package/dist/test/unit/bitgo/errors.d.ts +2 -0
- package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
- package/dist/test/unit/bitgo/errors.js +262 -0
- package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
- package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
- package/dist/test/unit/bitgo/keychain/keychains.js +426 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
- package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +193 -0
- package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +72 -0
- package/dist/test/unit/bitgo/safe/fixtures/safeBip44Vectors.json +319 -0
- package/dist/test/unit/bitgo/safe/recovery.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/recovery.js +478 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/rootCoin.js +13 -0
- package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safe.js +607 -0
- package/dist/test/unit/bitgo/safe/safeBip44Vectors.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safeBip44Vectors.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safeBip44Vectors.js +189 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.js +37 -0
- package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safes.js +376 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
- package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
- package/dist/test/unit/bitgo/tss/common.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/common.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/common.js +84 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +249 -0
- package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -4
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.js +109 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.js +106 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
- package/dist/test/unit/bitgo/utils/postWithCodec.js +24 -10
- package/dist/test/unit/bitgo/utils/siws.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/siws.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/siws.js +206 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1068 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +2410 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +553 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +376 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.js +83 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.js +229 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +498 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +80 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +279 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
- package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/wallet.js +55 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.js +167 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +79 -9
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
- package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts +5 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +651 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts +9 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.js +304 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.js +210 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +69 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.js +160 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +304 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +853 -0
- package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
- package/dist/test/unit/coins/ofc.d.ts +2 -0
- package/dist/test/unit/coins/ofc.d.ts.map +1 -0
- package/dist/test/unit/coins/ofc.js +124 -0
- package/dist/test/unit/lightning.d.ts +2 -0
- package/dist/test/unit/lightning.d.ts.map +1 -0
- package/dist/test/unit/lightning.js +23 -0
- package/dist/test/unit/units.d.ts.map +1 -1
- package/dist/test/unit/units.js +64 -64
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -22
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -1866
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
- package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +0 -49
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +0 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +0 -87
- package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
- package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/iLightning.js +0 -106
- package/dist/src/bitgo/lightning/index.d.ts +0 -5
- package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/index.js +0 -17
- package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
- package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightning.js +0 -111
- package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
- package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
- package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
- package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/blsUtils.js +0 -237
- package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
- package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
- package/dist/src/coins/fiateur.d.ts +0 -31
- package/dist/src/coins/fiateur.d.ts.map +0 -1
- package/dist/src/coins/fiateur.js +0 -57
- package/dist/src/coins/fiatgbp.d.ts +0 -31
- package/dist/src/coins/fiatgbp.d.ts.map +0 -1
- package/dist/src/coins/fiatgbp.js +0 -57
- package/dist/src/coins/fiatusd.d.ts +0 -31
- package/dist/src/coins/fiatusd.d.ts.map +0 -1
- package/dist/src/coins/fiatusd.js +0 -57
- package/dist/src/coins/tfiateur.d.ts +0 -11
- package/dist/src/coins/tfiateur.d.ts.map +0 -1
- package/dist/src/coins/tfiateur.js +0 -17
- package/dist/src/coins/tfiatgbp.d.ts +0 -11
- package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
- package/dist/src/coins/tfiatgbp.js +0 -17
- package/dist/src/coins/tfiatusd.d.ts +0 -11
- package/dist/src/coins/tfiatusd.d.ts.map +0 -1
- package/dist/src/coins/tfiatusd.js +0 -17
- package/dist/src/openssl/index.d.ts +0 -5
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/index.js +0 -9
- package/dist/test/unit/openssl.d.ts +0 -2
- package/dist/test/unit/openssl.d.ts.map +0 -1
- package/dist/test/unit/openssl.js +0 -39
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const pgp = __importStar(require("openpgp"));
|
|
41
|
+
const sinon = __importStar(require("sinon"));
|
|
42
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
43
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
44
|
+
const cbor_x_1 = require("cbor-x");
|
|
45
|
+
const t = __importStar(require("io-ts"));
|
|
46
|
+
const src_1 = require("../../../../../../src");
|
|
47
|
+
const codecs_1 = require("../../../../../../src/bitgo/utils/codecs");
|
|
48
|
+
const keyShareEnvelope_1 = require("../../../../../../src/bitgo/utils/tss/keyShareEnvelope");
|
|
49
|
+
const eddsaVrfMPCv2_1 = require("../../../../../../src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2");
|
|
50
|
+
const typesMPCv2_1 = require("../../../../../../src/bitgo/utils/tss/ecdsa/typesMPCv2");
|
|
51
|
+
const opengpgUtils_1 = require("../../../../../../src/bitgo/utils/opengpgUtils");
|
|
52
|
+
const Uint8ArrayCodec = new t.Type('Uint8Array', (value) => value instanceof Uint8Array, (value, context) => (value instanceof Uint8Array ? t.success(value) : t.failure(value, context)), t.identity);
|
|
53
|
+
const VrfEnvelope = t.type({
|
|
54
|
+
version: t.literal(1),
|
|
55
|
+
prvKeyShare: Uint8ArrayCodec,
|
|
56
|
+
vrf: Uint8ArrayCodec,
|
|
57
|
+
});
|
|
58
|
+
function decodeVrfEnvelope(encoded) {
|
|
59
|
+
return (0, codecs_1.decodeWithCodec)(VrfEnvelope, (0, cbor_x_1.decode)(encoded), 'VRF key envelope');
|
|
60
|
+
}
|
|
61
|
+
function createKeychainFixture() {
|
|
62
|
+
const encryptedInputs = [];
|
|
63
|
+
const addedKeychains = [];
|
|
64
|
+
const post = sinon.stub();
|
|
65
|
+
const bitgo = {
|
|
66
|
+
getEnv: () => 'dev',
|
|
67
|
+
url: (path) => path,
|
|
68
|
+
post,
|
|
69
|
+
encrypt: async (params) => {
|
|
70
|
+
encryptedInputs.push(params.input);
|
|
71
|
+
return `encrypted:${params.input}`;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
const keychains = {
|
|
75
|
+
add: async (params) => {
|
|
76
|
+
addedKeychains.push(params);
|
|
77
|
+
return { id: `${params.source}-child`, type: 'tss', encryptedPrv: params.encryptedPrv };
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const baseCoin = {
|
|
81
|
+
keychains: () => keychains,
|
|
82
|
+
getChain: () => 'tsol',
|
|
83
|
+
};
|
|
84
|
+
return { bitgo, baseCoin, post, encryptedInputs, addedKeychains };
|
|
85
|
+
}
|
|
86
|
+
describe('EdDSA MPCv2 VRF root material', function () {
|
|
87
|
+
it('encodes signing and VRF shares in both full and reduced envelopes', function () {
|
|
88
|
+
const privateMaterial = Buffer.from('signing-share');
|
|
89
|
+
const reducedPrivateMaterial = Buffer.from('reduced-signing-share');
|
|
90
|
+
const vrfKeyShare = Buffer.from('vrf-share');
|
|
91
|
+
const { envelope, reducedEnvelope } = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(privateMaterial, reducedPrivateMaterial, vrfKeyShare);
|
|
92
|
+
const decodedEnvelope = decodeVrfEnvelope(envelope);
|
|
93
|
+
const decodedReducedEnvelope = decodeVrfEnvelope(reducedEnvelope);
|
|
94
|
+
assert_1.default.deepStrictEqual(Buffer.from(decodedEnvelope.prvKeyShare), privateMaterial);
|
|
95
|
+
assert_1.default.deepStrictEqual(Buffer.from(decodedEnvelope.vrf), vrfKeyShare);
|
|
96
|
+
assert_1.default.deepStrictEqual(Buffer.from(decodedReducedEnvelope.prvKeyShare), reducedPrivateMaterial);
|
|
97
|
+
assert_1.default.deepStrictEqual(Buffer.from(decodedReducedEnvelope.vrf), vrfKeyShare);
|
|
98
|
+
});
|
|
99
|
+
it('keeps ordinary MPCv2 participant material as bare base64', async function () {
|
|
100
|
+
const { bitgo, baseCoin, encryptedInputs, addedKeychains } = createKeychainFixture();
|
|
101
|
+
const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
|
|
102
|
+
const privateMaterial = Buffer.from('signing-share');
|
|
103
|
+
const reducedPrivateMaterial = Buffer.from('reduced-signing-share');
|
|
104
|
+
await utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, 'common-keychain', privateMaterial, reducedPrivateMaterial, 'passphrase');
|
|
105
|
+
assert_1.default.deepStrictEqual(encryptedInputs, [
|
|
106
|
+
privateMaterial.toString('base64'),
|
|
107
|
+
reducedPrivateMaterial.toString('base64'),
|
|
108
|
+
]);
|
|
109
|
+
assert_1.default.strictEqual(addedKeychains[0].encryptedPrv, `encrypted:${privateMaterial.toString('base64')}`);
|
|
110
|
+
assert_1.default.strictEqual(addedKeychains[0].safeId, undefined);
|
|
111
|
+
});
|
|
112
|
+
it('rejects a public-only backup outside a safe child derivation', async function () {
|
|
113
|
+
const { bitgo, baseCoin, encryptedInputs, addedKeychains } = createKeychainFixture();
|
|
114
|
+
const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
|
|
115
|
+
await assert_1.default.rejects(utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, 'common-keychain', undefined, undefined, 'passphrase'), /Private material is required for backup keychain/);
|
|
116
|
+
assert_1.default.deepStrictEqual(encryptedInputs, []);
|
|
117
|
+
assert_1.default.deepStrictEqual(addedKeychains, []);
|
|
118
|
+
});
|
|
119
|
+
it('encrypts the VRF envelope and tags the keychain with safeId', async function () {
|
|
120
|
+
const encryptedInputs = [];
|
|
121
|
+
const addedKeychains = [];
|
|
122
|
+
const bitgo = {
|
|
123
|
+
encrypt: async (params) => {
|
|
124
|
+
encryptedInputs.push(params.input);
|
|
125
|
+
return `encrypted:${params.input}`;
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
const keychains = {
|
|
129
|
+
add: async (params) => {
|
|
130
|
+
addedKeychains.push(params);
|
|
131
|
+
return { id: 'user-key' };
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
const baseCoin = {
|
|
135
|
+
keychains: () => keychains,
|
|
136
|
+
};
|
|
137
|
+
const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
|
|
138
|
+
const { envelope, reducedEnvelope } = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(Buffer.from('signing-share'), Buffer.from('reduced-signing-share'), Buffer.from('vrf-share'));
|
|
139
|
+
await utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, 'common-keychain', envelope, reducedEnvelope, 'passphrase', undefined, undefined, undefined, undefined, 'safe-id');
|
|
140
|
+
assert_1.default.deepStrictEqual(encryptedInputs[0], envelope.toString('base64'));
|
|
141
|
+
assert_1.default.strictEqual(addedKeychains[0].safeId, 'safe-id');
|
|
142
|
+
const decoded = decodeVrfEnvelope(Buffer.from(encryptedInputs[0], 'base64'));
|
|
143
|
+
assert_1.default.deepStrictEqual(Buffer.from(decoded.vrf), Buffer.from('vrf-share'));
|
|
144
|
+
});
|
|
145
|
+
it('tags the BitGo keychain with safeId and does not encrypt', async function () {
|
|
146
|
+
const encryptedInputs = [];
|
|
147
|
+
const addedKeychains = [];
|
|
148
|
+
const bitgo = {
|
|
149
|
+
encrypt: async (params) => {
|
|
150
|
+
encryptedInputs.push(params.input);
|
|
151
|
+
return `encrypted:${params.input}`;
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
const keychains = {
|
|
155
|
+
add: async (params) => {
|
|
156
|
+
addedKeychains.push(params);
|
|
157
|
+
return { id: 'bitgo-key' };
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
const baseCoin = {
|
|
161
|
+
keychains: () => keychains,
|
|
162
|
+
};
|
|
163
|
+
const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
|
|
164
|
+
await utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, 'common-keychain', undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'safe-id');
|
|
165
|
+
assert_1.default.deepStrictEqual(encryptedInputs, []);
|
|
166
|
+
assert_1.default.strictEqual(addedKeychains[0].source, 'bitgo');
|
|
167
|
+
assert_1.default.strictEqual(addedKeychains[0].safeId, 'safe-id');
|
|
168
|
+
assert_1.default.strictEqual(addedKeychains[0].encryptedPrv, undefined);
|
|
169
|
+
});
|
|
170
|
+
describe('safe root keygen against the HSM contract', function () {
|
|
171
|
+
const KeyGenRequest = t.intersection([
|
|
172
|
+
t.type({ enterprise: t.string, type: t.string, curveType: t.string, round: t.string }),
|
|
173
|
+
t.partial({ safeId: t.string, payload: t.UnknownRecord }),
|
|
174
|
+
]);
|
|
175
|
+
const R1Payload = t.intersection([
|
|
176
|
+
t.type({
|
|
177
|
+
userGpgPublicKey: t.string,
|
|
178
|
+
backupGpgPublicKey: t.string,
|
|
179
|
+
userMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
180
|
+
backupMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
181
|
+
}),
|
|
182
|
+
t.type({
|
|
183
|
+
userVrfMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
184
|
+
backupVrfMsg1: public_types_1.EddsaMPCv2SignedMessage,
|
|
185
|
+
}),
|
|
186
|
+
]);
|
|
187
|
+
const R2Payload = t.intersection([
|
|
188
|
+
t.type({ sessionId: t.string, userMsg2: public_types_1.EddsaMPCv2SignedMessage, backupMsg2: public_types_1.EddsaMPCv2SignedMessage }),
|
|
189
|
+
t.type({
|
|
190
|
+
userVrfMsg2: public_types_1.EddsaMPCv2SignedMessage,
|
|
191
|
+
backupVrfMsg2: public_types_1.EddsaMPCv2SignedMessage,
|
|
192
|
+
}),
|
|
193
|
+
]);
|
|
194
|
+
let bitgoPrivateKey;
|
|
195
|
+
let bitgoPublicKey;
|
|
196
|
+
before(async function () {
|
|
197
|
+
const bitgoGpg = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
|
|
198
|
+
bitgoPrivateKey = await pgp.readPrivateKey({ armoredKey: bitgoGpg.privateKey });
|
|
199
|
+
bitgoPublicKey = await pgp.readKey({ armoredKey: bitgoGpg.publicKey });
|
|
200
|
+
});
|
|
201
|
+
afterEach(function () {
|
|
202
|
+
sinon.restore();
|
|
203
|
+
});
|
|
204
|
+
/** BitGo's side of the ceremony: signing DKG + VRF DKG, verifying every client signature like the HSM does. */
|
|
205
|
+
async function keygenWithHsmPeer(fault) {
|
|
206
|
+
const { bitgo, baseCoin, post, encryptedInputs, addedKeychains } = createKeychainFixture();
|
|
207
|
+
const utils = new eddsaVrfMPCv2_1.EddsaVrfMPCv2Utils(bitgo, baseCoin);
|
|
208
|
+
sinon.stub(utils, 'getBitgoGpgPubkeyBasedOnFeatureFlags').resolves({
|
|
209
|
+
mpcv2PublicKey: bitgoPublicKey,
|
|
210
|
+
eddsaMpcv2PublicKey: bitgoPublicKey,
|
|
211
|
+
redpallasMpcv2PublicKey: undefined,
|
|
212
|
+
});
|
|
213
|
+
const bitgoDkg = new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
214
|
+
const bitgoVrf = new sdk_lib_mpc_1.MpsVrf.VrfDkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
215
|
+
const requests = [];
|
|
216
|
+
let bitgoMsg2;
|
|
217
|
+
let userGpgKey;
|
|
218
|
+
let backupGpgKey;
|
|
219
|
+
let userCommitment;
|
|
220
|
+
let backupCommitment;
|
|
221
|
+
const signAsBitgo = (payload) => sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(payload, bitgoPrivateKey);
|
|
222
|
+
const encryptTo = async (recipient, plaintext) => {
|
|
223
|
+
const { signature } = await signAsBitgo(plaintext);
|
|
224
|
+
const message = await pgp.encrypt({
|
|
225
|
+
message: await pgp.createMessage({ binary: plaintext }),
|
|
226
|
+
encryptionKeys: recipient,
|
|
227
|
+
format: 'armored',
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
message,
|
|
231
|
+
signature: fault === 'bitgo-vrf-opening-signature' ? (await signAsBitgo(new Uint8Array([9]))).signature : signature,
|
|
232
|
+
};
|
|
233
|
+
};
|
|
234
|
+
post.callsFake(() => ({
|
|
235
|
+
send: (rawBody) => ({
|
|
236
|
+
result: async () => {
|
|
237
|
+
const body = (0, codecs_1.decodeWithCodec)(KeyGenRequest, rawBody, 'EdDSA keygen request');
|
|
238
|
+
assert_1.default.strictEqual(body.type, public_types_1.KeyGenTypeEnum.MPCv2);
|
|
239
|
+
assert_1.default.strictEqual(body.curveType, public_types_1.KeyCurveEnum.EdDSA);
|
|
240
|
+
// WP only reads safeId in round 1; round 2 is routed by the stored session.
|
|
241
|
+
assert_1.default.strictEqual(body.safeId, body.round === public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'] ? 'safe-id' : undefined);
|
|
242
|
+
requests.push({ round: body.round, ...body.payload });
|
|
243
|
+
if (body.round === public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1']) {
|
|
244
|
+
const payload = (0, codecs_1.decodeWithCodec)(R1Payload, body.payload, 'EdDSA keygen round 1');
|
|
245
|
+
userGpgKey = await pgp.readKey({ armoredKey: payload.userGpgPublicKey });
|
|
246
|
+
backupGpgKey = await pgp.readKey({ armoredKey: payload.backupGpgPublicKey });
|
|
247
|
+
const [userPk, backupPk] = await Promise.all([
|
|
248
|
+
sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(userGpgKey),
|
|
249
|
+
sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(backupGpgKey),
|
|
250
|
+
]);
|
|
251
|
+
const [, bitgoSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(bitgoPrivateKey);
|
|
252
|
+
const userMsg1 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userMsg1, userGpgKey);
|
|
253
|
+
const backupMsg1 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupMsg1, backupGpgKey);
|
|
254
|
+
// The VRF messages must be signed by the same party key as userMsg1/backupMsg1.
|
|
255
|
+
userCommitment = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userVrfMsg1, userGpgKey));
|
|
256
|
+
backupCommitment = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupVrfMsg1, backupGpgKey));
|
|
257
|
+
await assert_1.default.rejects(sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userVrfMsg1, backupGpgKey));
|
|
258
|
+
await bitgoDkg.initDkg(bitgoSk, [userPk, backupPk]);
|
|
259
|
+
const bitgoRawMsg1 = bitgoDkg.getFirstMessage();
|
|
260
|
+
[bitgoMsg2] = bitgoDkg.handleIncomingMessages([
|
|
261
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userMsg1) },
|
|
262
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, payload: new Uint8Array(backupMsg1) },
|
|
263
|
+
bitgoRawMsg1,
|
|
264
|
+
]);
|
|
265
|
+
const [bitgoVrfCommitment] = (await bitgoVrf.initDkg()).broadcastMessages;
|
|
266
|
+
const signedVrfMsg1 = await signAsBitgo(bitgoVrfCommitment.payload);
|
|
267
|
+
return {
|
|
268
|
+
sessionId: 'session-id',
|
|
269
|
+
bitgoMsg1: await signAsBitgo(bitgoRawMsg1.payload),
|
|
270
|
+
bitgoVrfMsg1: fault === 'bitgo-vrf-msg1-signature'
|
|
271
|
+
? { ...signedVrfMsg1, message: Buffer.from('tampered').toString('base64') }
|
|
272
|
+
: signedVrfMsg1,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
assert_1.default.strictEqual(body.round, public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2']);
|
|
276
|
+
const payload = (0, codecs_1.decodeWithCodec)(R2Payload, body.payload, 'EdDSA keygen round 2');
|
|
277
|
+
assert_1.default.ok(userGpgKey && backupGpgKey && userCommitment && backupCommitment && bitgoMsg2);
|
|
278
|
+
assert_1.default.deepStrictEqual(Object.keys(payload).sort(), [
|
|
279
|
+
'backupMsg2',
|
|
280
|
+
'backupVrfMsg2',
|
|
281
|
+
'sessionId',
|
|
282
|
+
'userMsg2',
|
|
283
|
+
'userVrfMsg2',
|
|
284
|
+
]);
|
|
285
|
+
const userMsg2 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userMsg2, userGpgKey);
|
|
286
|
+
const backupMsg2 = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupMsg2, backupGpgKey);
|
|
287
|
+
const userOpening = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.userVrfMsg2, userGpgKey));
|
|
288
|
+
const backupOpening = new Uint8Array(await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(payload.backupVrfMsg2, backupGpgKey));
|
|
289
|
+
bitgoDkg.handleIncomingMessages([
|
|
290
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userMsg2) },
|
|
291
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, payload: new Uint8Array(backupMsg2) },
|
|
292
|
+
bitgoMsg2,
|
|
293
|
+
]);
|
|
294
|
+
const openings = await bitgoVrf.handleIncomingMessages({
|
|
295
|
+
broadcastMessages: [
|
|
296
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: userCommitment },
|
|
297
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, payload: backupCommitment },
|
|
298
|
+
],
|
|
299
|
+
p2pMessages: [],
|
|
300
|
+
});
|
|
301
|
+
const toUser = openings.p2pMessages.find(({ to }) => to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
302
|
+
const toBackup = openings.p2pMessages.find(({ to }) => to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
303
|
+
assert_1.default.ok(toUser && toBackup);
|
|
304
|
+
await bitgoVrf.handleIncomingMessages({
|
|
305
|
+
broadcastMessages: [],
|
|
306
|
+
p2pMessages: [
|
|
307
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, to: typesMPCv2_1.MPCv2PartiesEnum.BITGO, payload: userOpening },
|
|
308
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, to: typesMPCv2_1.MPCv2PartiesEnum.BITGO, payload: backupOpening },
|
|
309
|
+
],
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
sessionId: payload.sessionId,
|
|
313
|
+
commonPublicKeychain: bitgoDkg.getCommonKeychain(),
|
|
314
|
+
bitgoMsg2: await signAsBitgo(bitgoMsg2.payload),
|
|
315
|
+
...(fault === 'missing-opening'
|
|
316
|
+
? {}
|
|
317
|
+
: { bitgoVrfMsgToUser: await encryptTo(userGpgKey, toUser.payload) }),
|
|
318
|
+
bitgoVrfMsgToBackup: await encryptTo(backupGpgKey, toBackup.payload),
|
|
319
|
+
};
|
|
320
|
+
},
|
|
321
|
+
}),
|
|
322
|
+
}));
|
|
323
|
+
await utils.createKeychains({
|
|
324
|
+
passphrase: 'passphrase',
|
|
325
|
+
enterprise: 'enterprise-id',
|
|
326
|
+
safeId: 'safe-id',
|
|
327
|
+
});
|
|
328
|
+
return { requests, encryptedInputs, addedKeychains };
|
|
329
|
+
}
|
|
330
|
+
it('signs VRF messages with the party keys and decrypts BitGo openings without handling the HSM VRF state', async function () {
|
|
331
|
+
const { requests, encryptedInputs, addedKeychains } = await keygenWithHsmPeer();
|
|
332
|
+
assert_1.default.deepStrictEqual(requests.map(({ round }) => round), [public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2']]);
|
|
333
|
+
// WP keeps the HSM VRF state between rounds, so neither client round carries it.
|
|
334
|
+
for (const request of requests) {
|
|
335
|
+
assert_1.default.strictEqual('bitgoEncryptedVrfDkgState' in request, false);
|
|
336
|
+
}
|
|
337
|
+
// Both client roots end up with a signing share and a VRF share, tagged with the safe.
|
|
338
|
+
assert_1.default.deepStrictEqual(addedKeychains.map(({ source }) => source).sort(), ['backup', 'bitgo', 'user']);
|
|
339
|
+
for (const keychain of addedKeychains) {
|
|
340
|
+
assert_1.default.strictEqual(keychain.safeId, 'safe-id');
|
|
341
|
+
}
|
|
342
|
+
// User and backup each encrypt a full and a reduced envelope; every one carries a VRF share, and
|
|
343
|
+
// the two parties' shares differ. Order-independent: the roots are registered concurrently.
|
|
344
|
+
const vrfShares = new Set(encryptedInputs.map((input) => {
|
|
345
|
+
const { vrf, prvKeyShare } = decodeVrfEnvelope(Buffer.from(input, 'base64'));
|
|
346
|
+
assert_1.default.ok(vrf.length > 0);
|
|
347
|
+
assert_1.default.ok(prvKeyShare.length > 0);
|
|
348
|
+
return Buffer.from(vrf).toString('hex');
|
|
349
|
+
}));
|
|
350
|
+
assert_1.default.strictEqual(encryptedInputs.length, 4);
|
|
351
|
+
assert_1.default.strictEqual(vrfShares.size, 2);
|
|
352
|
+
});
|
|
353
|
+
it('rejects a BitGo VRF round 1 message whose signature does not verify', async function () {
|
|
354
|
+
await assert_1.default.rejects(keygenWithHsmPeer('bitgo-vrf-msg1-signature'), /signature|verification|signed/i);
|
|
355
|
+
});
|
|
356
|
+
it('rejects a BitGo VRF opening whose signature does not verify', async function () {
|
|
357
|
+
await assert_1.default.rejects(keygenWithHsmPeer('bitgo-vrf-opening-signature'), /signature|verification|signed/i);
|
|
358
|
+
});
|
|
359
|
+
it('fails when the HSM omits a BitGo VRF opening in round 2', async function () {
|
|
360
|
+
await assert_1.default.rejects(keygenWithHsmPeer('missing-opening'), /VRF message to user/);
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
describe('EdDSA safe-child MPS derivation', function () {
|
|
365
|
+
let userSigningShare;
|
|
366
|
+
let userVrfShare;
|
|
367
|
+
let bitgoSigningShare;
|
|
368
|
+
let bitgoVrfShare;
|
|
369
|
+
let bitgoPrivateKey;
|
|
370
|
+
let bitgoPublicKey;
|
|
371
|
+
const sessionId = 'derive-session';
|
|
372
|
+
const account = 7;
|
|
373
|
+
const path = (0, src_1.buildSafeBip44Path)(501, 'eddsaMpc', account);
|
|
374
|
+
const Request = t.intersection([
|
|
375
|
+
t.type({ enterprise: t.string, type: t.string, curveType: t.string, round: t.string, payload: t.unknown }),
|
|
376
|
+
t.partial({ safeId: t.string, coin: t.string }),
|
|
377
|
+
]);
|
|
378
|
+
before(async function () {
|
|
379
|
+
const signing = await sdk_lib_mpc_1.MPSUtil.generateEdDsaDKGKeyShares();
|
|
380
|
+
const vrf = await sdk_lib_mpc_1.MpsVrfUtils.generateVrfDKGKeyShares();
|
|
381
|
+
userSigningShare = signing[typesMPCv2_1.MPCv2PartiesEnum.USER].getKeyShare();
|
|
382
|
+
bitgoSigningShare = signing[typesMPCv2_1.MPCv2PartiesEnum.BITGO].getKeyShare();
|
|
383
|
+
userVrfShare = vrf[typesMPCv2_1.MPCv2PartiesEnum.USER].getKeyShare();
|
|
384
|
+
bitgoVrfShare = vrf[typesMPCv2_1.MPCv2PartiesEnum.BITGO].getKeyShare();
|
|
385
|
+
const bitgoGpg = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
|
|
386
|
+
bitgoPrivateKey = await pgp.readPrivateKey({ armoredKey: bitgoGpg.privateKey });
|
|
387
|
+
bitgoPublicKey = await pgp.readKey({ armoredKey: bitgoGpg.publicKey });
|
|
388
|
+
});
|
|
389
|
+
async function deriveWithPeer(fault, recordedKeychains) {
|
|
390
|
+
const { bitgo, baseCoin, post, encryptedInputs, addedKeychains } = createKeychainFixture();
|
|
391
|
+
const utils = new eddsaVrfMPCv2_1.EddsaVrfMPCv2Utils(bitgo, baseCoin);
|
|
392
|
+
sinon.stub(utils, 'getBitgoGpgPubkeyBasedOnFeatureFlags').resolves({
|
|
393
|
+
mpcv2PublicKey: bitgoPublicKey,
|
|
394
|
+
eddsaMpcv2PublicKey: bitgoPublicKey,
|
|
395
|
+
redpallasMpcv2PublicKey: undefined,
|
|
396
|
+
});
|
|
397
|
+
const bitgoPeer = new sdk_lib_mpc_1.MpsDerive.Derive(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BITGO, bitgoSigningShare, bitgoVrfShare, path);
|
|
398
|
+
let bitgoMsg2;
|
|
399
|
+
let userGpgPublicKey = '';
|
|
400
|
+
let rounds = 0;
|
|
401
|
+
post.callsFake((_url) => ({
|
|
402
|
+
send: (rawBody) => ({
|
|
403
|
+
result: async () => {
|
|
404
|
+
const body = (0, codecs_1.decodeWithCodec)(Request, rawBody, 'EdDSA derive request');
|
|
405
|
+
assert_1.default.strictEqual(_url, '/mpc/generatekey');
|
|
406
|
+
assert_1.default.strictEqual(body.enterprise, 'enterprise-id');
|
|
407
|
+
assert_1.default.strictEqual(body.coin, 'tsol');
|
|
408
|
+
assert_1.default.strictEqual(body.type, public_types_1.KeyGenTypeEnum.MPCv2);
|
|
409
|
+
assert_1.default.strictEqual(body.curveType, public_types_1.KeyCurveEnum.EdDSA);
|
|
410
|
+
if (rounds++ === 0) {
|
|
411
|
+
assert_1.default.strictEqual(body.round, public_types_1.MPCv2KeyGenStateEnum['MPCv2Derive-R1']);
|
|
412
|
+
assert_1.default.strictEqual(body.safeId, 'safe-id');
|
|
413
|
+
const request = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2DeriveRound1Request, body.payload, 'EdDSA derive round 1');
|
|
414
|
+
assert_1.default.deepStrictEqual(Object.keys(request).sort(), [
|
|
415
|
+
'parentKeyId',
|
|
416
|
+
'path',
|
|
417
|
+
'userGpgPublicKey',
|
|
418
|
+
'userMsg1',
|
|
419
|
+
]);
|
|
420
|
+
assert_1.default.strictEqual(request.parentKeyId, 'bitgo-root-id');
|
|
421
|
+
assert_1.default.strictEqual(request.path, path);
|
|
422
|
+
userGpgPublicKey = request.userGpgPublicKey;
|
|
423
|
+
const userGpgKey = await pgp.readKey({ armoredKey: request.userGpgPublicKey });
|
|
424
|
+
const userPayload = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(request.userMsg1, userGpgKey);
|
|
425
|
+
const bitgoFirst = await bitgoPeer.initDerive();
|
|
426
|
+
const [outgoing] = bitgoPeer.handleIncomingMessages([
|
|
427
|
+
{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userPayload) },
|
|
428
|
+
]);
|
|
429
|
+
assert_1.default.ok(outgoing);
|
|
430
|
+
bitgoMsg2 = outgoing.payload;
|
|
431
|
+
const signed = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(bitgoFirst.payload), bitgoPrivateKey);
|
|
432
|
+
return {
|
|
433
|
+
sessionId,
|
|
434
|
+
bitgoMsg1: fault === 'r1-signature' ? { ...signed, message: Buffer.from('tampered').toString('base64') } : signed,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
assert_1.default.strictEqual(rounds, 2);
|
|
438
|
+
assert_1.default.strictEqual(body.round, public_types_1.MPCv2KeyGenStateEnum['MPCv2Derive-R2']);
|
|
439
|
+
assert_1.default.strictEqual(body.safeId, 'safe-id');
|
|
440
|
+
const request = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2DeriveRound2Request, body.payload, 'EdDSA derive round 2');
|
|
441
|
+
assert_1.default.deepStrictEqual(Object.keys(request).sort(), ['sessionId', 'userMsg2']);
|
|
442
|
+
assert_1.default.strictEqual(request.sessionId, sessionId);
|
|
443
|
+
const userPayload = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(request.userMsg2, await pgp.readKey({ armoredKey: userGpgPublicKey }));
|
|
444
|
+
assert_1.default.deepStrictEqual(bitgoPeer.handleIncomingMessages([{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userPayload) }]), []);
|
|
445
|
+
assert_1.default.ok(bitgoMsg2);
|
|
446
|
+
const signed = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(bitgoMsg2), bitgoPrivateKey);
|
|
447
|
+
const commonPublicKeychain = bitgoPeer.getCommonKeychain();
|
|
448
|
+
return {
|
|
449
|
+
sessionId: fault === 'session' ? 'different-session' : sessionId,
|
|
450
|
+
commonPublicKeychain: fault === 'commonKeychain'
|
|
451
|
+
? `${commonPublicKeychain.slice(0, -1)}${commonPublicKeychain.endsWith('0') ? '1' : '0'}`
|
|
452
|
+
: commonPublicKeychain,
|
|
453
|
+
bitgoMsg2: fault === 'r2-signature' ? { ...signed, message: Buffer.from('tampered').toString('base64') } : signed,
|
|
454
|
+
};
|
|
455
|
+
},
|
|
456
|
+
}),
|
|
457
|
+
}));
|
|
458
|
+
try {
|
|
459
|
+
const result = await utils.createSafeChildKeychains({
|
|
460
|
+
passphrase: 'passphrase',
|
|
461
|
+
enterprise: 'enterprise-id',
|
|
462
|
+
safeId: 'safe-id',
|
|
463
|
+
parentKeyId: 'bitgo-root-id',
|
|
464
|
+
path,
|
|
465
|
+
userRootKeyId: 'user-root-id',
|
|
466
|
+
backupRootKeyId: 'backup-root-id',
|
|
467
|
+
userRootKeyShare: userSigningShare,
|
|
468
|
+
userRootVrfKeyShare: userVrfShare,
|
|
469
|
+
});
|
|
470
|
+
return { result, encryptedInputs, addedKeychains, bitgoPeer, rounds };
|
|
471
|
+
}
|
|
472
|
+
finally {
|
|
473
|
+
recordedKeychains?.push(...addedKeychains);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
afterEach(function () {
|
|
477
|
+
sinon.restore();
|
|
478
|
+
});
|
|
479
|
+
it('registers the child signing share and two public-only placeholders after the signed ceremony', async function () {
|
|
480
|
+
const { result, encryptedInputs, addedKeychains, bitgoPeer, rounds } = await deriveWithPeer();
|
|
481
|
+
assert_1.default.strictEqual(rounds, 2);
|
|
482
|
+
assert_1.default.deepStrictEqual(addedKeychains.map(({ source }) => source).sort(), ['backup', 'bitgo', 'user']);
|
|
483
|
+
assert_1.default.deepStrictEqual([result.userKeychain.id, result.backupKeychain.id, result.bitgoKeychain.id], ['user-child', 'backup-child', 'bitgo-child']);
|
|
484
|
+
for (const keychain of addedKeychains) {
|
|
485
|
+
assert_1.default.strictEqual(keychain.safeId, 'safe-id');
|
|
486
|
+
assert_1.default.strictEqual(keychain.derivedFromParentWithPath, path);
|
|
487
|
+
assert_1.default.strictEqual(keychain.commonKeychain, bitgoPeer.getCommonKeychain());
|
|
488
|
+
assert_1.default.strictEqual(keychain.keyType, 'tss');
|
|
489
|
+
assert_1.default.strictEqual(keychain.isMPCv2, true);
|
|
490
|
+
}
|
|
491
|
+
const userChild = addedKeychains.find(({ source }) => source === 'user');
|
|
492
|
+
const backupChild = addedKeychains.find(({ source }) => source === 'backup');
|
|
493
|
+
const bitgoChild = addedKeychains.find(({ source }) => source === 'bitgo');
|
|
494
|
+
assert_1.default.ok(userChild);
|
|
495
|
+
assert_1.default.ok(backupChild);
|
|
496
|
+
assert_1.default.ok(bitgoChild);
|
|
497
|
+
assert_1.default.strictEqual(userChild.parent, 'user-root-id');
|
|
498
|
+
assert_1.default.strictEqual(backupChild.parent, 'backup-root-id');
|
|
499
|
+
assert_1.default.strictEqual(bitgoChild.parent, 'bitgo-root-id');
|
|
500
|
+
assert_1.default.strictEqual(encryptedInputs.length, 2);
|
|
501
|
+
assert_1.default.strictEqual(userChild.encryptedPrv, `encrypted:${encryptedInputs[0]}`);
|
|
502
|
+
const signingShare = Buffer.from(result.userKeychain.encryptedPrv?.slice('encrypted:'.length) ?? '', 'base64');
|
|
503
|
+
assert_1.default.deepStrictEqual(signingShare, Buffer.from(encryptedInputs[0], 'base64'));
|
|
504
|
+
assert_1.default.notDeepStrictEqual(signingShare, userSigningShare);
|
|
505
|
+
assert_1.default.notDeepStrictEqual(signingShare, bitgoPeer.getKeyShare());
|
|
506
|
+
assert_1.default.strictEqual(userChild.reducedEncryptedPrv, undefined);
|
|
507
|
+
const reduced = result.userKeychain.reducedEncryptedPrv;
|
|
508
|
+
assert_1.default.ok(reduced);
|
|
509
|
+
const reducedShare = sdk_lib_mpc_1.MPSTypes.getDecodedReducedKeyShare(Buffer.from(reduced.slice('encrypted:'.length), 'base64'));
|
|
510
|
+
assert_1.default.deepStrictEqual(Buffer.from(reducedShare.keyShare), signingShare);
|
|
511
|
+
assert_1.default.strictEqual(Buffer.from(reducedShare.pub).toString('hex'), bitgoPeer.getCommonKeychain().slice(0, 64));
|
|
512
|
+
assert_1.default.throws(() => decodeVrfEnvelope(signingShare));
|
|
513
|
+
assert_1.default.strictEqual(backupChild.encryptedPrv, undefined);
|
|
514
|
+
assert_1.default.strictEqual(bitgoChild.encryptedPrv, undefined);
|
|
515
|
+
});
|
|
516
|
+
for (const badPath of ["m/7'", 'm/44/501/4/7', "m/44'/501'/0'/7'"]) {
|
|
517
|
+
it(`rejects the non-BIP44 path ${JSON.stringify(badPath)} before contacting WP`, async function () {
|
|
518
|
+
const { bitgo, baseCoin, post, addedKeychains } = createKeychainFixture();
|
|
519
|
+
const utils = new eddsaVrfMPCv2_1.EddsaVrfMPCv2Utils(bitgo, baseCoin);
|
|
520
|
+
await assert_1.default.rejects(utils.createSafeChildKeychains({
|
|
521
|
+
passphrase: 'passphrase',
|
|
522
|
+
enterprise: 'enterprise-id',
|
|
523
|
+
safeId: 'safe-id',
|
|
524
|
+
parentKeyId: 'bitgo-root-id',
|
|
525
|
+
path: badPath,
|
|
526
|
+
userRootKeyId: 'user-root-id',
|
|
527
|
+
backupRootKeyId: 'backup-root-id',
|
|
528
|
+
userRootKeyShare: userSigningShare,
|
|
529
|
+
userRootVrfKeyShare: userVrfShare,
|
|
530
|
+
}), /Invalid safe BIP44 path/);
|
|
531
|
+
assert_1.default.strictEqual(post.called, false);
|
|
532
|
+
assert_1.default.deepStrictEqual(addedKeychains, []);
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
const faults = [
|
|
536
|
+
'r1-signature',
|
|
537
|
+
'r2-signature',
|
|
538
|
+
'session',
|
|
539
|
+
'commonKeychain',
|
|
540
|
+
];
|
|
541
|
+
for (const fault of faults) {
|
|
542
|
+
it(`rejects ${fault} before registering any child`, async function () {
|
|
543
|
+
const recordedKeychains = [];
|
|
544
|
+
await assert_1.default.rejects(() => deriveWithPeer(fault, recordedKeychains), fault === 'session'
|
|
545
|
+
? /session id/i
|
|
546
|
+
: fault === 'commonKeychain'
|
|
547
|
+
? /common keychain/i
|
|
548
|
+
: /signature|verification|signed/i);
|
|
549
|
+
assert_1.default.deepStrictEqual(recordedKeychains, []);
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw2Q0FBK0I7QUFDL0IsNkNBQStCO0FBQy9CLHlEQUFtSDtBQUNuSCxzREFPNkI7QUFDN0IsbUNBQWdDO0FBQ2hDLHlDQUEyQjtBQUUzQiwrQ0FPK0I7QUFDL0IscUVBQTJFO0FBQzNFLDZGQUFrRztBQUNsRyw2RkFBK0Y7QUFDL0YsdUZBQTBGO0FBQzFGLGlGQUFvRjtBQUVwRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ2hDLFlBQVksRUFDWixDQUFDLEtBQUssRUFBdUIsRUFBRSxDQUFDLEtBQUssWUFBWSxVQUFVLEVBQzNELENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUNoRyxDQUFDLENBQUMsUUFBUSxDQUNYLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNyQixXQUFXLEVBQUUsZUFBZTtJQUM1QixHQUFHLEVBQUUsZUFBZTtDQUNyQixDQUFDLENBQUM7QUFjSCxTQUFTLGlCQUFpQixDQUFDLE9BQWU7SUFDeEMsT0FBTyxJQUFBLHdCQUFlLEVBQUMsV0FBVyxFQUFFLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFF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QUFNLEdBQTBFO1FBQ3BGLGNBQWM7UUFDZCxjQUFjO1FBQ2QsU0FBUztRQUNULGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixFQUFFLENBQUMsV0FBVyxLQUFLLCtCQUErQixFQUFFLEtBQUs7WUFDdkQsTUFBTSxpQkFBaUIsR0FBMEIsRUFBRSxDQUFDO1lBQ3BELE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQ2xCLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsRUFDOUMsS0FBSyxLQUFLLFNBQVM7Z0JBQ2pCLENBQUMsQ0FBQyxhQUFhO2dCQUNmLENBQUMsQ0FBQyxLQUFLLEtBQUssZ0JBQWdCO29CQUM1QixDQUFDLENBQUMsa0JBQWtCO29CQUNwQixDQUFDLENBQUMsZ0NBQWdDLENBQ3JDLENBQUM7WUFDRixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IEVkZHNhTVBTRGtnLCBNUFNDb21tcywgTVBTVXRpbCwgTVBTVHlwZXMsIE1wc0Rlcml2ZSwgTXBzVnJmLCBNcHNWcmZVdGlscyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEVkZHNhTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0LFxuICBFZGRzYU1QQ3YyRGVyaXZlUm91bmQyUmVxdWVzdCxcbiAgRWRkc2FNUEN2MlNpZ25lZE1lc3NhZ2UsXG4gIEtleUN1cnZlRW51bSxcbiAgS2V5R2VuVHlwZUVudW0sXG4gIE1QQ3YyS2V5R2VuU3RhdGVFbnVtLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Nib3IteCc7XG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcblxuaW1wb3J0IHtcbiAgYnVpbGRTYWZlQmlwNDRQYXRoLFxuICBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gIEVkZHNhTVBDdjJVdGlscyxcbiAgQml0R29CYXNlLFxuICBJQmFzZUNvaW4sXG4gIEtleWNoYWluLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL2NvZGVjcyc7XG5pbXBvcnQgeyBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2tleVNoYXJlRW52ZWxvcGUnO1xuaW1wb3J0IHsgRWRkc2FWcmZNUEN2MlV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9lZGRzYS9lZGRzYVZyZk1QQ3YyJztcbmltcG9ydCB7IE1QQ3YyUGFydGllc0VudW0gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL3R5cGVzTVBDdjInO1xuaW1wb3J0IHsgZ2VuZXJhdGVHUEdLZXlQYWlyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL29wZW5ncGdVdGlscyc7XG5cbmNvbnN0IFVpbnQ4QXJyYXlDb2RlYyA9IG5ldyB0LlR5cGU8VWludDhBcnJheSwgVWludDhBcnJheSwgdW5rbm93bj4oXG4gICdVaW50OEFycmF5JyxcbiAgKHZhbHVlKTogdmFsdWUgaXMgVWludDhBcnJheSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXG4gICh2YWx1ZSwgY29udGV4dCkgPT4gKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IHQuc3VjY2Vzcyh2YWx1ZSkgOiB0LmZhaWx1cmUodmFsdWUsIGNvbnRleHQpKSxcbiAgdC5pZGVudGl0eVxuKTtcblxuY29uc3QgVnJmRW52ZWxvcGUgPSB0LnR5cGUoe1xuICB2ZXJzaW9uOiB0LmxpdGVyYWwoMSksXG4gIHBydktleVNoYXJlOiBVaW50OEFycmF5Q29kZWMsXG4gIHZyZjogVWludDhBcnJheUNvZGVjLFxufSk7XG5cbnR5cGUgQWRkZWRLZXljaGFpblBhcmFtcyA9IHtcbiAgc291cmNlPzogc3RyaW5nO1xuICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIHJlZHVjZWRFbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIHNhZmVJZD86IHN0cmluZztcbiAgcGFyZW50Pzogc3RyaW5nO1xuICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoPzogc3RyaW5nO1xuICBjb21tb25LZXljaGFpbj86IHN0cmluZztcbiAgaXNNUEN2Mj86IGJvb2xlYW47XG4gIGtleVR5cGU/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVWcmZFbnZlbG9wZShlbmNvZGVkOiBCdWZmZXIpOiB0LlR5cGVPZjx0eXBlb2YgVnJmRW52ZWxvcGU+IHtcbiAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhWcmZFbnZlbG9wZSwgZGVjb2RlKGVuY29kZWQpLCAnVlJGIGtleSBlbnZlbG9wZScpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXljaGFpbkZpeHR1cmUoKSB7XG4gIGNvbnN0IGVuY3J5cHRlZElucHV0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYWRkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICBjb25zdCBwb3N0ID0gc2lub24uc3R1YigpO1xuICBjb25zdCBiaXRnbyA9IHtcbiAgICBnZXRFbnY6ICgpID0+ICdkZXYnLFxuICAgIHVybDogKHBhdGg6IHN0cmluZykgPT4gcGF0aCxcbiAgICBwb3N0LFxuICAgIGVuY3J5cHQ6IGFzeW5jIChwYXJhbXM6IHsgaW5wdXQ6IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgIGVuY3J5cHRlZElucHV0cy5wdXNoKHBhcmFtcy5pbnB1dCk7XG4gICAgICByZXR1cm4gYGVuY3J5cHRlZDoke3BhcmFtcy5pbnB1dH1gO1xuICAgIH0sXG4gIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICBhZGQ6IGFzeW5jIChwYXJhbXM6IEFkZGVkS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICBhZGRlZEtleWNoYWlucy5wdXNoKHBhcmFtcyk7XG4gICAgICByZXR1cm4geyBpZDogYCR7cGFyYW1zLnNvdXJjZX0tY2hpbGRgLCB0eXBlOiAndHNzJywgZW5jcnlwdGVkUHJ2OiBwYXJhbXMuZW5jcnlwdGVkUHJ2IH07XG4gICAgfSxcbiAgfTtcbiAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAga2V5Y2hhaW5zOiAoKSA9PiBrZXljaGFpbnMsXG4gICAgZ2V0Q2hhaW46ICgpID0+ICd0c29sJyxcbiAgfSBhcyB1bmtub3duIGFzIElCYXNlQ29pbjtcbiAgcmV0dXJuIHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH07XG59XG5cbmRlc2NyaWJlKCdFZERTQSBNUEN2MiBWUkYgcm9vdCBtYXRlcmlhbCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2VuY29kZXMgc2lnbmluZyBhbmQgVlJGIHNoYXJlcyBpbiBib3RoIGZ1bGwgYW5kIHJlZHVjZWQgZW52ZWxvcGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdzaWduaW5nLXNoYXJlJyk7XG4gICAgY29uc3QgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdyZWR1Y2VkLXNpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCB2cmZLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKCd2cmYtc2hhcmUnKTtcblxuICAgIGNvbnN0IHsgZW52ZWxvcGUsIHJlZHVjZWRFbnZlbG9wZSB9ID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHZyZktleVNoYXJlXG4gICAgKTtcbiAgICBjb25zdCBkZWNvZGVkRW52ZWxvcGUgPSBkZWNvZGVWcmZFbnZlbG9wZShlbnZlbG9wZSk7XG4gICAgY29uc3QgZGVjb2RlZFJlZHVjZWRFbnZlbG9wZSA9IGRlY29kZVZyZkVudmVsb3BlKHJlZHVjZWRFbnZlbG9wZSk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWRFbnZlbG9wZS5wcnZLZXlTaGFyZSksIHByaXZhdGVNYXRlcmlhbCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkRW52ZWxvcGUudnJmKSwgdnJmS2V5U2hhcmUpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZFJlZHVjZWRFbnZlbG9wZS5wcnZLZXlTaGFyZSksIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZFJlZHVjZWRFbnZlbG9wZS52cmYpLCB2cmZLZXlTaGFyZSk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBvcmRpbmFyeSBNUEN2MiBwYXJ0aWNpcGFudCBtYXRlcmlhbCBhcyBiYXJlIGJhc2U2NCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IGJpdGdvLCBiYXNlQ29pbiwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG4gICAgY29uc3QgcHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3NpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICdjb21tb24ta2V5Y2hhaW4nLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgICdwYXNzcGhyYXNlJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW1xuICAgICAgcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIF0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYsIGBlbmNyeXB0ZWQ6JHtwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpfWApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgcHVibGljLW9ubHkgYmFja3VwIG91dHNpZGUgYSBzYWZlIGNoaWxkIGRlcml2YXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgeyBiaXRnbywgYmFzZUNvaW4sIGVuY3J5cHRlZElucHV0cywgYWRkZWRLZXljaGFpbnMgfSA9IGNyZWF0ZUtleWNoYWluRml4dHVyZSgpO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICB1dGlscy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCAnY29tbW9uLWtleWNoYWluJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdwYXNzcGhyYXNlJyksXG4gICAgICAvUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgYmFja3VwIGtleWNoYWluL1xuICAgICk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMsIFtdKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zLCBbXSk7XG4gIH0pO1xuXG4gIGl0KCdlbmNyeXB0cyB0aGUgVlJGIGVudmVsb3BlIGFuZCB0YWdzIHRoZSBrZXljaGFpbiB3aXRoIHNhZmVJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWRkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgIGNvbnN0IGJpdGdvID0ge1xuICAgICAgZW5jcnlwdDogYXN5bmMgKHBhcmFtczogeyBpbnB1dDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgICByZXR1cm4gYGVuY3J5cHRlZDoke3BhcmFtcy5pbnB1dH1gO1xuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIGFkZDogYXN5bmMgKHBhcmFtczogQWRkZWRLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgICByZXR1cm4geyBpZDogJ3VzZXIta2V5JyB9IGFzIHVua25vd24gYXMgS2V5Y2hhaW47XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuICAgIGNvbnN0IHsgZW52ZWxvcGUsIHJlZHVjZWRFbnZlbG9wZSB9ID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgQnVmZmVyLmZyb20oJ3NpZ25pbmctc2hhcmUnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCdyZWR1Y2VkLXNpZ25pbmctc2hhcmUnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCd2cmYtc2hhcmUnKVxuICAgICk7XG5cbiAgICBhd2FpdCB1dGlscy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgJ2NvbW1vbi1rZXljaGFpbicsXG4gICAgICBlbnZlbG9wZSxcbiAgICAgIHJlZHVjZWRFbnZlbG9wZSxcbiAgICAgICdwYXNzcGhyYXNlJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgICdzYWZlLWlkJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0c1swXSwgZW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWcmZFbnZlbG9wZShCdWZmZXIuZnJvbShlbmNyeXB0ZWRJbnB1dHNbMF0sICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkLnZyZiksIEJ1ZmZlci5mcm9tKCd2cmYtc2hhcmUnKSk7XG4gIH0pO1xuXG4gIGl0KCd0YWdzIHRoZSBCaXRHbyBrZXljaGFpbiB3aXRoIHNhZmVJZCBhbmQgZG9lcyBub3QgZW5jcnlwdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWRkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgIGNvbnN0IGJpdGdvID0ge1xuICAgICAgZW5jcnlwdDogYXN5bmMgKHBhcmFtczogeyBpbnB1dDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgICByZXR1cm4gYGVuY3J5cHRlZDoke3BhcmFtcy5pbnB1dH1gO1xuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIGFkZDogYXN5bmMgKHBhcmFtczogQWRkZWRLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgICByZXR1cm4geyBpZDogJ2JpdGdvLWtleScgfSBhcyB1bmtub3duIGFzIEtleWNoYWluO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb2luID0ge1xuICAgICAga2V5Y2hhaW5zOiAoKSA9PiBrZXljaGFpbnMsXG4gICAgfSBhcyB1bmtub3duIGFzIElCYXNlQ29pbjtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcblxuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgJ2NvbW1vbi1rZXljaGFpbicsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAnc2FmZS1pZCdcbiAgICApO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMsIFtdKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uc291cmNlLCAnYml0Z28nKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYsIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlIHJvb3Qga2V5Z2VuIGFnYWluc3QgdGhlIEhTTSBjb250cmFjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBLZXlHZW5SZXF1ZXN0ID0gdC5pbnRlcnNlY3Rpb24oW1xuICAgICAgdC50eXBlKHsgZW50ZXJwcmlzZTogdC5zdHJpbmcsIHR5cGU6IHQuc3RyaW5nLCBjdXJ2ZVR5cGU6IHQuc3RyaW5nLCByb3VuZDogdC5zdHJpbmcgfSksXG4gICAgICB0LnBhcnRpYWwoeyBzYWZlSWQ6IHQuc3RyaW5nLCBwYXlsb2FkOiB0LlVua25vd25SZWNvcmQgfSksXG4gICAgXSk7XG4gICAgY29uc3QgUjFQYXlsb2FkID0gdC5pbnRlcnNlY3Rpb24oW1xuICAgICAgdC50eXBlKHtcbiAgICAgICAgdXNlckdwZ1B1YmxpY0tleTogdC5zdHJpbmcsXG4gICAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleTogdC5zdHJpbmcsXG4gICAgICAgIHVzZXJNc2cxOiBFZGRzYU1QQ3YyU2lnbmVkTWVzc2FnZSxcbiAgICAgICAgYmFja3VwTXNnMTogRWRkc2FNUEN2MlNpZ25lZE1lc3NhZ2UsXG4gICAgICB9KSxcbiAgICAgIHQudHlwZSh7XG4gICAgICAgIHVzZXJWcmZNc2cxOiBFZGRzYU1QQ3YyU2lnbmVkTWVzc2FnZSxcbiAgICAgICAgYmFja3VwVnJmTXNnMTogRWRkc2FNUEN2MlNpZ25lZE1lc3NhZ2UsXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBSMlBheWxvYWQgPSB0LmludGVyc2VjdGlvbihbXG4gICAgICB0LnR5cGUoeyBzZXNzaW9uSWQ6IHQuc3RyaW5nLCB1c2VyTXNnMjogRWRkc2FNUEN2MlNpZ25lZE1lc3NhZ2UsIGJhY2t1cE1zZzI6IEVkZHNhTVBDdjJTaWduZWRNZXNzYWdlIH0pLFxuICAgICAgdC50eXBlKHtcbiAgICAgICAgdXNlclZyZk1zZzI6IEVkZHNhTVBDdjJTaWduZWRNZXNzYWdlLFxuICAgICAgICBiYWNrdXBWcmZNc2cyOiBFZGRzYU1QQ3YyU2lnbmVkTWVzc2FnZSxcbiAgICAgIH0pLFxuICAgIF0pO1xuXG4gICAgbGV0IGJpdGdvUHJpdmF0ZUtleTogcGdwLlByaXZhdGVLZXk7XG4gICAgbGV0IGJpdGdvUHVibGljS2V5OiBwZ3AuS2V5O1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvR3BnID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgICBiaXRnb1ByaXZhdGVLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb0dwZy5wcml2YXRlS2V5IH0pO1xuICAgICAgYml0Z29QdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvR3BnLnB1YmxpY0tleSB9KTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICAvKiogQml0R28ncyBzaWRlIG9mIHRoZSBjZXJlbW9ueTogc2lnbmluZyBES0cgKyBWUkYgREtHLCB2ZXJpZnlpbmcgZXZlcnkgY2xpZW50IHNpZ25hdHVyZSBsaWtlIHRoZSBIU00gZG9lcy4gKi9cbiAgICBhc3luYyBmdW5jdGlvbiBrZXlnZW5XaXRoSHNtUGVlcihcbiAgICAgIGZhdWx0PzogJ2JpdGdvLXZyZi1tc2cxLXNpZ25hdHVyZScgfCAnYml0Z28tdnJmLW9wZW5pbmctc2lnbmF0dXJlJyB8ICdtaXNzaW5nLW9wZW5pbmcnXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGJpdGdvLCBiYXNlQ29pbiwgcG9zdCwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICAgIHNpbm9uLnN0dWIodXRpbHMsICdnZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MnKS5yZXNvbHZlcyh7XG4gICAgICAgIG1wY3YyUHVibGljS2V5OiBiaXRnb1B1YmxpY0tleSxcbiAgICAgICAgZWRkc2FNcGN2MlB1YmxpY0tleTogYml0Z29QdWJsaWNLZXksXG4gICAgICAgIHJlZHBhbGxhc01wY3YyUHVibGljS2V5OiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYml0Z29Ea2cgPSBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgICAgY29uc3QgYml0Z29WcmYgPSBuZXcgTXBzVnJmLlZyZkRrZygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG4gICAgICBsZXQgYml0Z29Nc2cyOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHVzZXJHcGdLZXk6IHBncC5LZXkgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgYmFja3VwR3BnS2V5OiBwZ3AuS2V5IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHVzZXJDb21taXRtZW50OiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGJhY2t1cENvbW1pdG1lbnQ6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNpZ25Bc0JpdGdvID0gKHBheWxvYWQ6IFVpbnQ4QXJyYXkpID0+IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKHBheWxvYWQsIGJpdGdvUHJpdmF0ZUtleSk7XG4gICAgICBjb25zdCBlbmNyeXB0VG8gPSBhc3luYyAocmVjaXBpZW50OiBwZ3AuS2V5LCBwbGFpbnRleHQ6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPEVkZHNhTVBDdjJTaWduZWRNZXNzYWdlPiA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2lnbmF0dXJlIH0gPSBhd2FpdCBzaWduQXNCaXRnbyhwbGFpbnRleHQpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcGdwLmVuY3J5cHQoe1xuICAgICAgICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5jcmVhdGVNZXNzYWdlKHsgYmluYXJ5OiBwbGFpbnRleHQgfSksXG4gICAgICAgICAgZW5jcnlwdGlvbktleXM6IHJlY2lwaWVudCxcbiAgICAgICAgICBmb3JtYXQ6ICdhcm1vcmVkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBzaWduYXR1cmU6XG4gICAgICAgICAgICBmYXVsdCA9PT0gJ2JpdGdvLXZyZi1vcGVuaW5nLXNpZ25hdHVyZScgPyAoYXdhaXQgc2lnbkFzQml0Z28obmV3IFVpbnQ4QXJyYXkoWzldKSkpLnNpZ25hdHVyZSA6IHNpZ25hdHVyZSxcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIHBvc3QuY2FsbHNGYWtlKCgpID0+ICh7XG4gICAgICAgIHNlbmQ6IChyYXdCb2R5OiB1bmtub3duKSA9PiAoe1xuICAgICAgICAgIHJlc3VsdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGRlY29kZVdpdGhDb2RlYyhLZXlHZW5SZXF1ZXN0LCByYXdCb2R5LCAnRWREU0Ega2V5Z2VuIHJlcXVlc3QnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnR5cGUsIEtleUdlblR5cGVFbnVtLk1QQ3YyKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmN1cnZlVHlwZSwgS2V5Q3VydmVFbnVtLkVkRFNBKTtcbiAgICAgICAgICAgIC8vIFdQIG9ubHkgcmVhZHMgc2FmZUlkIGluIHJvdW5kIDE7IHJvdW5kIDIgaXMgcm91dGVkIGJ5IHRoZSBzdG9yZWQgc2Vzc2lvbi5cbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnNhZmVJZCwgYm9keS5yb3VuZCA9PT0gTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10gPyAnc2FmZS1pZCcgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmVxdWVzdHMucHVzaCh7IHJvdW5kOiBib2R5LnJvdW5kLCAuLi5ib2R5LnBheWxvYWQgfSk7XG5cbiAgICAgICAgICAgIGlmIChib2R5LnJvdW5kID09PSBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjEnXSkge1xuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlV2l0aENvZGVjKFIxUGF5bG9hZCwgYm9keS5wYXlsb2FkLCAnRWREU0Ega2V5Z2VuIHJvdW5kIDEnKTtcbiAgICAgICAgICAgICAgdXNlckdwZ0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcGF5bG9hZC51c2VyR3BnUHVibGljS2V5IH0pO1xuICAgICAgICAgICAgICBiYWNrdXBHcGdLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHBheWxvYWQuYmFja3VwR3BnUHVibGljS2V5IH0pO1xuICAgICAgICAgICAgICBjb25zdCBbdXNlclBrLCBiYWNrdXBQa10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkodXNlckdwZ0tleSksXG4gICAgICAgICAgICAgICAgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoYmFja3VwR3BnS2V5KSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIGNvbnN0IFssIGJpdGdvU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKGJpdGdvUHJpdmF0ZUtleSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgdXNlck1zZzEgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQudXNlck1zZzEsIHVzZXJHcGdLZXkpO1xuICAgICAgICAgICAgICBjb25zdCBiYWNrdXBNc2cxID0gYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShwYXlsb2FkLmJhY2t1cE1zZzEsIGJhY2t1cEdwZ0tleSk7XG4gICAgICAgICAgICAgIC8vIFRoZSBWUkYgbWVzc2FnZXMgbXVzdCBiZSBzaWduZWQgYnkgdGhlIHNhbWUgcGFydHkga2V5IGFzIHVzZXJNc2cxL2JhY2t1cE1zZzEuXG4gICAgICAgICAgICAgIHVzZXJDb21taXRtZW50ID0gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShwYXlsb2FkLnVzZXJWcmZNc2cxLCB1c2VyR3BnS2V5KSk7XG4gICAgICAgICAgICAgIGJhY2t1cENvbW1pdG1lbnQgPSBuZXcgVWludDhBcnJheShhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQuYmFja3VwVnJmTXNnMSwgYmFja3VwR3BnS2V5KSk7XG4gICAgICAgICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UocGF5bG9hZC51c2VyVnJmTXNnMSwgYmFja3VwR3BnS2V5KSk7XG5cbiAgICAgICAgICAgICAgYXdhaXQgYml0Z29Ea2cuaW5pdERrZyhiaXRnb1NrLCBbdXNlclBrLCBiYWNrdXBQa10pO1xuICAgICAgICAgICAgICBjb25zdCBiaXRnb1Jhd01zZzEgPSBiaXRnb0RrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgW2JpdGdvTXNnMl0gPSBiaXRnb0RrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtcbiAgICAgICAgICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlck1zZzEpIH0sXG4gICAgICAgICAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYmFja3VwTXNnMSkgfSxcbiAgICAgICAgICAgICAgICBiaXRnb1Jhd01zZzEsXG4gICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IFtiaXRnb1ZyZkNvbW1pdG1lbnRdID0gKGF3YWl0IGJpdGdvVnJmLmluaXREa2coKSkuYnJvYWRjYXN0TWVzc2FnZXM7XG4gICAgICAgICAgICAgIGNvbnN0IHNpZ25lZFZyZk1zZzEgPSBhd2FpdCBzaWduQXNCaXRnbyhiaXRnb1ZyZkNvbW1pdG1lbnQucGF5bG9hZCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiAnc2Vzc2lvbi1pZCcsXG4gICAgICAgICAgICAgICAgYml0Z29Nc2cxOiBhd2FpdCBzaWduQXNCaXRnbyhiaXRnb1Jhd01zZzEucGF5bG9hZCksXG4gICAgICAgICAgICAgICAgYml0Z29WcmZNc2cxOlxuICAgICAgICAgICAgICAgICAgZmF1bHQgPT09ICdiaXRnby12cmYtbXNnMS1zaWduYXR1cmUnXG4gICAgICAgICAgICAgICAgICAgID8geyAuLi5zaWduZWRWcmZNc2cxLCBtZXNzYWdlOiBCdWZmZXIuZnJvbSgndGFtcGVyZWQnKS50b1N0cmluZygnYmFzZTY0JykgfVxuICAgICAgICAgICAgICAgICAgICA6IHNpZ25lZFZyZk1zZzEsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXSk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlV2l0aENvZGVjKFIyUGF5bG9hZCwgYm9keS5wYXlsb2FkLCAnRWREU0Ega2V5Z2VuIHJvdW5kIDInKTtcbiAgICAgICAgICAgIGFzc2VydC5vayh1c2VyR3BnS2V5ICYmIGJhY2t1cEdwZ0tleSAmJiB1c2VyQ29tbWl0bWVudCAmJiBiYWNrdXBDb21taXRtZW50ICYmIGJpdGdvTXNnMik7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKE9iamVjdC5rZXlzKHBheWxvYWQpLnNvcnQoKSwgW1xuICAgICAgICAgICAgICAnYmFja3VwTXNnMicsXG4gICAgICAgICAgICAgICdiYWNrdXBWcmZNc2cyJyxcbiAgICAgICAgICAgICAgJ3Nlc3Npb25JZCcsXG4gICAgICAgICAgICAgICd1c2VyTXNnMicsXG4gICAgICAgICAgICAgICd1c2VyVnJmTXNnMicsXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgY29uc3QgdXNlck1zZzIgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQudXNlck1zZzIsIHVzZXJHcGdLZXkpO1xuICAgICAgICAgICAgY29uc3QgYmFja3VwTXNnMiA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UocGF5bG9hZC5iYWNrdXBNc2cyLCBiYWNrdXBHcGdLZXkpO1xuICAgICAgICAgICAgY29uc3QgdXNlck9wZW5pbmcgPSBuZXcgVWludDhBcnJheShhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQudXNlclZyZk1zZzIsIHVzZXJHcGdLZXkpKTtcbiAgICAgICAgICAgIGNvbnN0IGJhY2t1cE9wZW5pbmcgPSBuZXcgVWludDhBcnJheShhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBheWxvYWQuYmFja3VwVnJmTXNnMiwgYmFja3VwR3BnS2V5KSk7XG5cbiAgICAgICAgICAgIGJpdGdvRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW1xuICAgICAgICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlck1zZzIpIH0sXG4gICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KGJhY2t1cE1zZzIpIH0sXG4gICAgICAgICAgICAgIGJpdGdvTXNnMixcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCBvcGVuaW5ncyA9IGF3YWl0IGJpdGdvVnJmLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiB1c2VyQ29tbWl0bWVudCB9LFxuICAgICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHBheWxvYWQ6IGJhY2t1cENvbW1pdG1lbnQgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB0b1VzZXIgPSBvcGVuaW5ncy5wMnBNZXNzYWdlcy5maW5kKCh7IHRvIH0pID0+IHRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgICAgICAgICAgY29uc3QgdG9CYWNrdXAgPSBvcGVuaW5ncy5wMnBNZXNzYWdlcy5maW5kKCh7IHRvIH0pID0+IHRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG4gICAgICAgICAgICBhc3NlcnQub2sodG9Vc2VyICYmIHRvQmFja3VwKTtcbiAgICAgICAgICAgIGF3YWl0IGJpdGdvVnJmLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICAgICAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHRvOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBwYXlsb2FkOiB1c2VyT3BlbmluZyB9LFxuICAgICAgICAgICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHRvOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBwYXlsb2FkOiBiYWNrdXBPcGVuaW5nIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW46IGJpdGdvRGtnLmdldENvbW1vbktleWNoYWluKCksXG4gICAgICAgICAgICAgIGJpdGdvTXNnMjogYXdhaXQgc2lnbkFzQml0Z28oYml0Z29Nc2cyLnBheWxvYWQpLFxuICAgICAgICAgICAgICAuLi4oZmF1bHQgPT09ICdtaXNzaW5nLW9wZW5pbmcnXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDogeyBiaXRnb1ZyZk1zZ1RvVXNlcjogYXdhaXQgZW5jcnlwdFRvKHVzZXJHcGdLZXksIHRvVXNlci5wYXlsb2FkKSB9KSxcbiAgICAgICAgICAgICAgYml0Z29WcmZNc2dUb0JhY2t1cDogYXdhaXQgZW5jcnlwdFRvKGJhY2t1cEdwZ0tleSwgdG9CYWNrdXAucGF5bG9hZCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSkpO1xuXG4gICAgICBhd2FpdCB1dGlscy5jcmVhdGVLZXljaGFpbnMoe1xuICAgICAgICBwYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICAgIGVudGVycHJpc2U6ICdlbnRlcnByaXNlLWlkJyxcbiAgICAgICAgc2FmZUlkOiAnc2FmZS1pZCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHJlcXVlc3RzLCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH07XG4gICAgfVxuXG4gICAgaXQoJ3NpZ25zIFZSRiBtZXNzYWdlcyB3aXRoIHRoZSBwYXJ0eSBrZXlzIGFuZCBkZWNyeXB0cyBCaXRHbyBvcGVuaW5ncyB3aXRob3V0IGhhbmRsaW5nIHRoZSBIU00gVlJGIHN0YXRlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyByZXF1ZXN0cywgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gYXdhaXQga2V5Z2VuV2l0aEhzbVBlZXIoKTtcblxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgcmVxdWVzdHMubWFwKCh7IHJvdW5kIH0pID0+IHJvdW5kKSxcbiAgICAgICAgW01QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMSddLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXV1cbiAgICAgICk7XG4gICAgICAvLyBXUCBrZWVwcyB0aGUgSFNNIFZSRiBzdGF0ZSBiZXR3ZWVuIHJvdW5kcywgc28gbmVpdGhlciBjbGllbnQgcm91bmQgY2FycmllcyBpdC5cbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoJ2JpdGdvRW5jcnlwdGVkVnJmRGtnU3RhdGUnIGluIHJlcXVlc3QsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90aCBjbGllbnQgcm9vdHMgZW5kIHVwIHdpdGggYSBzaWduaW5nIHNoYXJlIGFuZCBhIFZSRiBzaGFyZSwgdGFnZ2VkIHdpdGggdGhlIHNhZmUuXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zLm1hcCgoeyBzb3VyY2UgfSkgPT4gc291cmNlKS5zb3J0KCksIFsnYmFja3VwJywgJ2JpdGdvJywgJ3VzZXInXSk7XG4gICAgICBmb3IgKGNvbnN0IGtleWNoYWluIG9mIGFkZGVkS2V5Y2hhaW5zKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICB9XG4gICAgICAvLyBVc2VyIGFuZCBiYWNrdXAgZWFjaCBlbmNyeXB0IGEgZnVsbCBhbmQgYSByZWR1Y2VkIGVudmVsb3BlOyBldmVyeSBvbmUgY2FycmllcyBhIFZSRiBzaGFyZSwgYW5kXG4gICAgICAvLyB0aGUgdHdvIHBhcnRpZXMnIHNoYXJlcyBkaWZmZXIuIE9yZGVyLWluZGVwZW5kZW50OiB0aGUgcm9vdHMgYXJlIHJlZ2lzdGVyZWQgY29uY3VycmVudGx5LlxuICAgICAgY29uc3QgdnJmU2hhcmVzID0gbmV3IFNldChcbiAgICAgICAgZW5jcnlwdGVkSW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHZyZiwgcHJ2S2V5U2hhcmUgfSA9IGRlY29kZVZyZkVudmVsb3BlKEJ1ZmZlci5mcm9tKGlucHV0LCAnYmFzZTY0JykpO1xuICAgICAgICAgIGFzc2VydC5vayh2cmYubGVuZ3RoID4gMCk7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHBydktleVNoYXJlLmxlbmd0aCA+IDApO1xuICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2cmYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzLmxlbmd0aCwgNCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodnJmU2hhcmVzLnNpemUsIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBCaXRHbyBWUkYgcm91bmQgMSBtZXNzYWdlIHdob3NlIHNpZ25hdHVyZSBkb2VzIG5vdCB2ZXJpZnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhrZXlnZW5XaXRoSHNtUGVlcignYml0Z28tdnJmLW1zZzEtc2lnbmF0dXJlJyksIC9zaWduYXR1cmV8dmVyaWZpY2F0aW9ufHNpZ25lZC9pKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgQml0R28gVlJGIG9wZW5pbmcgd2hvc2Ugc2lnbmF0dXJlIGRvZXMgbm90IHZlcmlmeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGtleWdlbldpdGhIc21QZWVyKCdiaXRnby12cmYtb3BlbmluZy1zaWduYXR1cmUnKSwgL3NpZ25hdHVyZXx2ZXJpZmljYXRpb258c2lnbmVkL2kpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhaWxzIHdoZW4gdGhlIEhTTSBvbWl0cyBhIEJpdEdvIFZSRiBvcGVuaW5nIGluIHJvdW5kIDInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhrZXlnZW5XaXRoSHNtUGVlcignbWlzc2luZy1vcGVuaW5nJyksIC9WUkYgbWVzc2FnZSB0byB1c2VyLyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdFZERTQSBzYWZlLWNoaWxkIE1QUyBkZXJpdmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgdXNlclNpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgdXNlclZyZlNoYXJlOiBCdWZmZXI7XG4gIGxldCBiaXRnb1NpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29WcmZTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29Qcml2YXRlS2V5OiBwZ3AuUHJpdmF0ZUtleTtcbiAgbGV0IGJpdGdvUHVibGljS2V5OiBwZ3AuS2V5O1xuXG4gIGNvbnN0IHNlc3Npb25JZCA9ICdkZXJpdmUtc2Vzc2lvbic7XG4gIGNvbnN0IGFjY291bnQgPSA3O1xuICBjb25zdCBwYXRoID0gYnVpbGRTYWZlQmlwNDRQYXRoKDUwMSwgJ2VkZHNhTXBjJywgYWNjb3VudCk7XG4gIGNvbnN0IFJlcXVlc3QgPSB0LmludGVyc2VjdGlvbihbXG4gICAgdC50eXBlKHsgZW50ZXJwcmlzZTogdC5zdHJpbmcsIHR5cGU6IHQuc3RyaW5nLCBjdXJ2ZVR5cGU6IHQuc3RyaW5nLCByb3VuZDogdC5zdHJpbmcsIHBheWxvYWQ6IHQudW5rbm93biB9KSxcbiAgICB0LnBhcnRpYWwoeyBzYWZlSWQ6IHQuc3RyaW5nLCBjb2luOiB0LnN0cmluZyB9KSxcbiAgXSk7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWduaW5nID0gYXdhaXQgTVBTVXRpbC5nZW5lcmF0ZUVkRHNhREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgdnJmID0gYXdhaXQgTXBzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcbiAgICB1c2VyU2lnbmluZ1NoYXJlID0gc2lnbmluZ1tNUEN2MlBhcnRpZXNFbnVtLlVTRVJdLmdldEtleVNoYXJlKCk7XG4gICAgYml0Z29TaWduaW5nU2hhcmUgPSBzaWduaW5nW01QQ3YyUGFydGllc0VudW0uQklUR09dLmdldEtleVNoYXJlKCk7XG4gICAgdXNlclZyZlNoYXJlID0gdnJmW01QQ3YyUGFydGllc0VudW0uVVNFUl0uZ2V0S2V5U2hhcmUoKTtcbiAgICBiaXRnb1ZyZlNoYXJlID0gdnJmW01QQ3YyUGFydGllc0VudW0uQklUR09dLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgYml0Z29HcGcgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBiaXRnb1ByaXZhdGVLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb0dwZy5wcml2YXRlS2V5IH0pO1xuICAgIGJpdGdvUHVibGljS2V5ID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb0dwZy5wdWJsaWNLZXkgfSk7XG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVdpdGhQZWVyKFxuICAgIGZhdWx0PzogJ3IxLXNpZ25hdHVyZScgfCAncjItc2lnbmF0dXJlJyB8ICdzZXNzaW9uJyB8ICdjb21tb25LZXljaGFpbicsXG4gICAgcmVjb3JkZWRLZXljaGFpbnM/OiBBZGRlZEtleWNoYWluUGFyYW1zW11cbiAgKSB7XG4gICAgY29uc3QgeyBiaXRnbywgYmFzZUNvaW4sIHBvc3QsIGVuY3J5cHRlZElucHV0cywgYWRkZWRLZXljaGFpbnMgfSA9IGNyZWF0ZUtleWNoYWluRml4dHVyZSgpO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhVnJmTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuICAgIHNpbm9uLnN0dWIodXRpbHMsICdnZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MnKS5yZXNvbHZlcyh7XG4gICAgICBtcGN2MlB1YmxpY0tleTogYml0Z29QdWJsaWNLZXksXG4gICAgICBlZGRzYU1wY3YyUHVibGljS2V5OiBiaXRnb1B1YmxpY0tleSxcbiAgICAgIHJlZHBhbGxhc01wY3YyUHVibGljS2V5OiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgY29uc3QgYml0Z29QZWVyID0gbmV3IE1wc0Rlcml2ZS5EZXJpdmUoMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTywgYml0Z29TaWduaW5nU2hhcmUsIGJpdGdvVnJmU2hhcmUsIHBhdGgpO1xuICAgIGxldCBiaXRnb01zZzI6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHVzZXJHcGdQdWJsaWNLZXkgPSAnJztcbiAgICBsZXQgcm91bmRzID0gMDtcbiAgICBwb3N0LmNhbGxzRmFrZSgoX3VybDogc3RyaW5nKSA9PiAoe1xuICAgICAgc2VuZDogKHJhd0JvZHk6IHVua25vd24pID0+ICh7XG4gICAgICAgIHJlc3VsdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBkZWNvZGVXaXRoQ29kZWMoUmVxdWVzdCwgcmF3Qm9keSwgJ0VkRFNBIGRlcml2ZSByZXF1ZXN0Jyk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKF91cmwsICcvbXBjL2dlbmVyYXRla2V5Jyk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkuZW50ZXJwcmlzZSwgJ2VudGVycHJpc2UtaWQnKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keS5jb2luLCAndHNvbCcpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnR5cGUsIEtleUdlblR5cGVFbnVtLk1QQ3YyKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keS5jdXJ2ZVR5cGUsIEtleUN1cnZlRW51bS5FZERTQSk7XG4gICAgICAgICAgaWYgKHJvdW5kcysrID09PSAwKSB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keS5yb3VuZCwgTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyRGVyaXZlLVIxJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkuc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGRlY29kZVdpdGhDb2RlYyhFZGRzYU1QQ3YyRGVyaXZlUm91bmQxUmVxdWVzdCwgYm9keS5wYXlsb2FkLCAnRWREU0EgZGVyaXZlIHJvdW5kIDEnKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoT2JqZWN0LmtleXMocmVxdWVzdCkuc29ydCgpLCBbXG4gICAgICAgICAgICAgICdwYXJlbnRLZXlJZCcsXG4gICAgICAgICAgICAgICdwYXRoJyxcbiAgICAgICAgICAgICAgJ3VzZXJHcGdQdWJsaWNLZXknLFxuICAgICAgICAgICAgICAndXNlck1zZzEnLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVxdWVzdC5wYXJlbnRLZXlJZCwgJ2JpdGdvLXJvb3QtaWQnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXF1ZXN0LnBhdGgsIHBhdGgpO1xuICAgICAgICAgICAgdXNlckdwZ1B1YmxpY0tleSA9IHJlcXVlc3QudXNlckdwZ1B1YmxpY0tleTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHJlcXVlc3QudXNlckdwZ1B1YmxpY0tleSB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJQYXlsb2FkID0gYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShyZXF1ZXN0LnVzZXJNc2cxLCB1c2VyR3BnS2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGJpdGdvRmlyc3QgPSBhd2FpdCBiaXRnb1BlZXIuaW5pdERlcml2ZSgpO1xuICAgICAgICAgICAgY29uc3QgW291dGdvaW5nXSA9IGJpdGdvUGVlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtcbiAgICAgICAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHVzZXJQYXlsb2FkKSB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBhc3NlcnQub2sob3V0Z29pbmcpO1xuICAgICAgICAgICAgYml0Z29Nc2cyID0gb3V0Z29pbmcucGF5bG9hZDtcbiAgICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJpdGdvRmlyc3QucGF5bG9hZCksIGJpdGdvUHJpdmF0ZUtleSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGJpdGdvTXNnMTpcbiAgICAgICAgICAgICAgICBmYXVsdCA9PT0gJ3IxLXNpZ25hdHVyZScgPyB7IC4uLnNpZ25lZCwgbWVzc2FnZTogQnVmZmVyLmZyb20oJ3RhbXBlcmVkJykudG9TdHJpbmcoJ2Jhc2U2NCcpIH0gOiBzaWduZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocm91bmRzLCAyKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keS5yb3VuZCwgTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyRGVyaXZlLVIyJ10pO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnNhZmVJZCwgJ3NhZmUtaWQnKTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gZGVjb2RlV2l0aENvZGVjKEVkZHNhTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0LCBib2R5LnBheWxvYWQsICdFZERTQSBkZXJpdmUgcm91bmQgMicpO1xuICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoT2JqZWN0LmtleXMocmVxdWVzdCkuc29ydCgpLCBbJ3Nlc3Npb25JZCcsICd1c2VyTXNnMiddKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVxdWVzdC5zZXNzaW9uSWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKFxuICAgICAgICAgICAgcmVxdWVzdC51c2VyTXNnMixcbiAgICAgICAgICAgIGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogdXNlckdwZ1B1YmxpY0tleSB9KVxuICAgICAgICAgICk7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICAgIGJpdGdvUGVlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlclBheWxvYWQpIH1dKSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhc3NlcnQub2soYml0Z29Nc2cyKTtcbiAgICAgICAgICBjb25zdCBzaWduZWQgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbShiaXRnb01zZzIpLCBiaXRnb1ByaXZhdGVLZXkpO1xuICAgICAgICAgIGNvbnN0IGNvbW1vblB1YmxpY0tleWNoYWluID0gYml0Z29QZWVyLmdldENvbW1vbktleWNoYWluKCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogZmF1bHQgPT09ICdzZXNzaW9uJyA/ICdkaWZmZXJlbnQtc2Vzc2lvbicgOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjb21tb25QdWJsaWNLZXljaGFpbjpcbiAgICAgICAgICAgICAgZmF1bHQgPT09ICdjb21tb25LZXljaGFpbidcbiAgICAgICAgICAgICAgICA/IGAke2NvbW1vblB1YmxpY0tleWNoYWluLnNsaWNlKDAsIC0xKX0ke2NvbW1vblB1YmxpY0tleWNoYWluLmVuZHNXaXRoKCcwJykgPyAnMScgOiAnMCd9YFxuICAgICAgICAgICAgICAgIDogY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICAgICAgICBiaXRnb01zZzI6XG4gICAgICAgICAgICAgIGZhdWx0ID09PSAncjItc2lnbmF0dXJlJyA/IHsgLi4uc2lnbmVkLCBtZXNzYWdlOiBCdWZmZXIuZnJvbSgndGFtcGVyZWQnKS50b1N0cmluZygnYmFzZTY0JykgfSA6IHNpZ25lZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfSkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHV0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICAgIHBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICBzYWZlSWQ6ICdzYWZlLWlkJyxcbiAgICAgICAgcGFyZW50S2V5SWQ6ICdiaXRnby1yb290LWlkJyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgdXNlclJvb3RLZXlJZDogJ3VzZXItcm9vdC1pZCcsXG4gICAgICAgIGJhY2t1cFJvb3RLZXlJZDogJ2JhY2t1cC1yb290LWlkJyxcbiAgICAgICAgdXNlclJvb3RLZXlTaGFyZTogdXNlclNpZ25pbmdTaGFyZSxcbiAgICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdXNlclZyZlNoYXJlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyByZXN1bHQsIGVuY3J5cHRlZElucHV0cywgYWRkZWRLZXljaGFpbnMsIGJpdGdvUGVlciwgcm91bmRzIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlY29yZGVkS2V5Y2hhaW5zPy5wdXNoKC4uLmFkZGVkS2V5Y2hhaW5zKTtcbiAgICB9XG4gIH1cblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlZ2lzdGVycyB0aGUgY2hpbGQgc2lnbmluZyBzaGFyZSBhbmQgdHdvIHB1YmxpYy1vbmx5IHBsYWNlaG9sZGVycyBhZnRlciB0aGUgc2lnbmVkIGNlcmVtb255JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgcmVzdWx0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zLCBiaXRnb1BlZXIsIHJvdW5kcyB9ID0gYXdhaXQgZGVyaXZlV2l0aFBlZXIoKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocm91bmRzLCAyKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zLm1hcCgoeyBzb3VyY2UgfSkgPT4gc291cmNlKS5zb3J0KCksIFsnYmFja3VwJywgJ2JpdGdvJywgJ3VzZXInXSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgIFtyZXN1bHQudXNlcktleWNoYWluLmlkLCByZXN1bHQuYmFja3VwS2V5Y2hhaW4uaWQsIHJlc3VsdC5iaXRnb0tleWNoYWluLmlkXSxcbiAgICAgIFsndXNlci1jaGlsZCcsICdiYWNrdXAtY2hpbGQnLCAnYml0Z28tY2hpbGQnXVxuICAgICk7XG4gICAgZm9yIChjb25zdCBrZXljaGFpbiBvZiBhZGRlZEtleWNoYWlucykge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGtleWNoYWluLnNhZmVJZCwgJ3NhZmUtaWQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoLCBwYXRoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5jb21tb25LZXljaGFpbiwgYml0Z29QZWVyLmdldENvbW1vbktleWNoYWluKCkpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGtleWNoYWluLmtleVR5cGUsICd0c3MnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5pc01QQ3YyLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckNoaWxkID0gYWRkZWRLZXljaGFpbnMuZmluZCgoeyBzb3VyY2UgfSkgPT4gc291cmNlID09PSAndXNlcicpO1xuICAgIGNvbnN0IGJhY2t1cENoaWxkID0gYWRkZWRLZXljaGFpbnMuZmluZCgoeyBzb3VyY2UgfSkgPT4gc291cmNlID09PSAnYmFja3VwJyk7XG4gICAgY29uc3QgYml0Z29DaGlsZCA9IGFkZGVkS2V5Y2hhaW5zLmZpbmQoKHsgc291cmNlIH0pID0+IHNvdXJjZSA9PT0gJ2JpdGdvJyk7XG4gICAgYXNzZXJ0Lm9rKHVzZXJDaGlsZCk7XG4gICAgYXNzZXJ0Lm9rKGJhY2t1cENoaWxkKTtcbiAgICBhc3NlcnQub2soYml0Z29DaGlsZCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHVzZXJDaGlsZC5wYXJlbnQsICd1c2VyLXJvb3QtaWQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2hpbGQucGFyZW50LCAnYmFja3VwLXJvb3QtaWQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYml0Z29DaGlsZC5wYXJlbnQsICdiaXRnby1yb290LWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cy5sZW5ndGgsIDIpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2hpbGQuZW5jcnlwdGVkUHJ2LCBgZW5jcnlwdGVkOiR7ZW5jcnlwdGVkSW5wdXRzWzBdfWApO1xuICAgIGNvbnN0IHNpZ25pbmdTaGFyZSA9IEJ1ZmZlci5mcm9tKHJlc3VsdC51c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2Py5zbGljZSgnZW5jcnlwdGVkOicubGVuZ3RoKSA/PyAnJywgJ2Jhc2U2NCcpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2lnbmluZ1NoYXJlLCBCdWZmZXIuZnJvbShlbmNyeXB0ZWRJbnB1dHNbMF0sICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbChzaWduaW5nU2hhcmUsIHVzZXJTaWduaW5nU2hhcmUpO1xuICAgIGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwoc2lnbmluZ1NoYXJlLCBiaXRnb1BlZXIuZ2V0S2V5U2hhcmUoKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHVzZXJDaGlsZC5yZWR1Y2VkRW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlZHVjZWQgPSByZXN1bHQudXNlcktleWNoYWluLnJlZHVjZWRFbmNyeXB0ZWRQcnY7XG4gICAgYXNzZXJ0Lm9rKHJlZHVjZWQpO1xuICAgIGNvbnN0IHJlZHVjZWRTaGFyZSA9IE1QU1R5cGVzLmdldERlY29kZWRSZWR1Y2VkS2V5U2hhcmUoQnVmZmVyLmZyb20ocmVkdWNlZC5zbGljZSgnZW5jcnlwdGVkOicubGVuZ3RoKSwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKHJlZHVjZWRTaGFyZS5rZXlTaGFyZSksIHNpZ25pbmdTaGFyZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKHJlZHVjZWRTaGFyZS5wdWIpLnRvU3RyaW5nKCdoZXgnKSwgYml0Z29QZWVyLmdldENvbW1vbktleWNoYWluKCkuc2xpY2UoMCwgNjQpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGRlY29kZVZyZkVudmVsb3BlKHNpZ25pbmdTaGFyZSkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiYWNrdXBDaGlsZC5lbmNyeXB0ZWRQcnYsIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJpdGdvQ2hpbGQuZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGJhZFBhdGggb2YgW1wibS83J1wiLCAnbS80NC81MDEvNC83JywgXCJtLzQ0Jy81MDEnLzAnLzcnXCJdKSB7XG4gICAgaXQoYHJlamVjdHMgdGhlIG5vbi1CSVA0NCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoYmFkUGF0aCl9IGJlZm9yZSBjb250YWN0aW5nIFdQYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBiaXRnbywgYmFzZUNvaW4sIHBvc3QsIGFkZGVkS2V5Y2hhaW5zIH0gPSBjcmVhdGVLZXljaGFpbkZpeHR1cmUoKTtcbiAgICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhVnJmTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdXRpbHMuY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zKHtcbiAgICAgICAgICBwYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICAgIHNhZmVJZDogJ3NhZmUtaWQnLFxuICAgICAgICAgIHBhcmVudEtleUlkOiAnYml0Z28tcm9vdC1pZCcsXG4gICAgICAgICAgcGF0aDogYmFkUGF0aCBhcyBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgICAgICAgdXNlclJvb3RLZXlJZDogJ3VzZXItcm9vdC1pZCcsXG4gICAgICAgICAgYmFja3VwUm9vdEtleUlkOiAnYmFja3VwLXJvb3QtaWQnLFxuICAgICAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJTaWduaW5nU2hhcmUsXG4gICAgICAgICAgdXNlclJvb3RWcmZLZXlTaGFyZTogdXNlclZyZlNoYXJlLFxuICAgICAgICB9KSxcbiAgICAgICAgL0ludmFsaWQgc2FmZSBCSVA0NCBwYXRoL1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwb3N0LmNhbGxlZCwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRlZEtleWNoYWlucywgW10pO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZmF1bHRzOiBBcnJheTwncjEtc2lnbmF0dXJlJyB8ICdyMi1zaWduYXR1cmUnIHwgJ3Nlc3Npb24nIHwgJ2NvbW1vbktleWNoYWluJz4gPSBbXG4gICAgJ3IxLXNpZ25hdHVyZScsXG4gICAgJ3IyLXNpZ25hdHVyZScsXG4gICAgJ3Nlc3Npb24nLFxuICAgICdjb21tb25LZXljaGFpbicsXG4gIF07XG4gIGZvciAoY29uc3QgZmF1bHQgb2YgZmF1bHRzKSB7XG4gICAgaXQoYHJlamVjdHMgJHtmYXVsdH0gYmVmb3JlIHJlZ2lzdGVyaW5nIGFueSBjaGlsZGAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY29yZGVkS2V5Y2hhaW5zOiBBZGRlZEtleWNoYWluUGFyYW1zW10gPSBbXTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAoKSA9PiBkZXJpdmVXaXRoUGVlcihmYXVsdCwgcmVjb3JkZWRLZXljaGFpbnMpLFxuICAgICAgICBmYXVsdCA9PT0gJ3Nlc3Npb24nXG4gICAgICAgICAgPyAvc2Vzc2lvbiBpZC9pXG4gICAgICAgICAgOiBmYXVsdCA9PT0gJ2NvbW1vbktleWNoYWluJ1xuICAgICAgICAgID8gL2NvbW1vbiBrZXljaGFpbi9pXG4gICAgICAgICAgOiAvc2lnbmF0dXJlfHZlcmlmaWNhdGlvbnxzaWduZWQvaVxuICAgICAgKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjb3JkZWRLZXljaGFpbnMsIFtdKTtcbiAgICB9KTtcbiAgfVxufSk7XG4iXX0=
|