@bsv/sdk 1.6.7 → 1.6.9
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/cjs/package.json +4 -4
- package/dist/cjs/src/auth/__tests/Peer.test.js +446 -0
- package/dist/cjs/src/auth/__tests/Peer.test.js.map +1 -0
- package/dist/cjs/src/auth/__tests/SessionManager.test.js +69 -0
- package/dist/cjs/src/auth/__tests/SessionManager.test.js.map +1 -0
- package/dist/cjs/src/auth/certificates/__tests/Certificate.test.js +182 -0
- package/dist/cjs/src/auth/certificates/__tests/Certificate.test.js.map +1 -0
- package/dist/cjs/src/auth/certificates/__tests/MasterCertificate.test.js +184 -0
- package/dist/cjs/src/auth/certificates/__tests/MasterCertificate.test.js.map +1 -0
- package/dist/cjs/src/auth/certificates/__tests/VerifiableCertificate.test.js +75 -0
- package/dist/cjs/src/auth/certificates/__tests/VerifiableCertificate.test.js.map +1 -0
- package/dist/cjs/src/auth/utils/__tests/cryptononce.test.js +101 -0
- package/dist/cjs/src/auth/utils/__tests/cryptononce.test.js.map +1 -0
- package/dist/cjs/src/auth/utils/__tests/getVerifiableCertificates.test.js +106 -0
- package/dist/cjs/src/auth/utils/__tests/getVerifiableCertificates.test.js.map +1 -0
- package/dist/cjs/src/auth/utils/__tests/validateCertificates.test.js +111 -0
- package/dist/cjs/src/auth/utils/__tests/validateCertificates.test.js.map +1 -0
- package/dist/cjs/src/auth/utils/certificateHelpers.js +51 -0
- package/dist/cjs/src/auth/utils/certificateHelpers.js.map +1 -0
- package/dist/cjs/src/compat/__tests/BSM.test.js +69 -0
- package/dist/cjs/src/compat/__tests/BSM.test.js.map +1 -0
- package/dist/cjs/src/compat/__tests/ECIES.test.js +115 -0
- package/dist/cjs/src/compat/__tests/ECIES.test.js.map +1 -0
- package/dist/cjs/src/compat/__tests/HD.test.js +336 -0
- package/dist/cjs/src/compat/__tests/HD.test.js.map +1 -0
- package/dist/cjs/src/compat/__tests/Mnemonic.test.js +150 -0
- package/dist/cjs/src/compat/__tests/Mnemonic.test.js.map +1 -0
- package/dist/cjs/src/compat/__tests/Mnemonic.vectors.js +175 -0
- package/dist/cjs/src/compat/__tests/Mnemonic.vectors.js.map +1 -0
- package/dist/cjs/src/messages/__tests/EncryptedMessage.test.js +57 -0
- package/dist/cjs/src/messages/__tests/EncryptedMessage.test.js.map +1 -0
- package/dist/cjs/src/messages/__tests/SignedMessage.test.js +52 -0
- package/dist/cjs/src/messages/__tests/SignedMessage.test.js.map +1 -0
- package/dist/cjs/src/overlay-tools/__tests/LookupResolver.test.js +1471 -0
- package/dist/cjs/src/overlay-tools/__tests/LookupResolver.test.js.map +1 -0
- package/dist/cjs/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js +78 -0
- package/dist/cjs/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js.map +1 -0
- package/dist/cjs/src/overlay-tools/__tests/SHIPBroadcaster.test.js +933 -0
- package/dist/cjs/src/overlay-tools/__tests/SHIPBroadcaster.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/AESGCM.test.js +248 -0
- package/dist/cjs/src/primitives/__tests/AESGCM.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BRC42.private.vectors.js +36 -0
- package/dist/cjs/src/primitives/__tests/BRC42.private.vectors.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BRC42.public.vectors.js +36 -0
- package/dist/cjs/src/primitives/__tests/BRC42.public.vectors.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.arithmatic.test.js +501 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.arithmatic.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.binary.test.js +185 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.binary.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.constructor.test.js +149 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.constructor.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.dhGroup.test.js +23 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.dhGroup.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.fixtures.js +268 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.fixtures.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.serializers.test.js +147 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.serializers.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.utils.test.js +322 -0
- package/dist/cjs/src/primitives/__tests/BigNumber.utils.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/Curve.unit.test.js +145 -0
- package/dist/cjs/src/primitives/__tests/Curve.unit.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/DRBG.test.js +22 -0
- package/dist/cjs/src/primitives/__tests/DRBG.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/DRBG.vectors.js +170 -0
- package/dist/cjs/src/primitives/__tests/DRBG.vectors.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/ECDH.test.js +34 -0
- package/dist/cjs/src/primitives/__tests/ECDH.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/ECDSA.test.js +89 -0
- package/dist/cjs/src/primitives/__tests/ECDSA.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/HMAC.test.js +60 -0
- package/dist/cjs/src/primitives/__tests/HMAC.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/Hash.test.js +159 -0
- package/dist/cjs/src/primitives/__tests/Hash.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/PBKDF2.vectors.js +122 -0
- package/dist/cjs/src/primitives/__tests/PBKDF2.vectors.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/PrivateKey.split.test.js +105 -0
- package/dist/cjs/src/primitives/__tests/PrivateKey.split.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/PrivateKey.test.js +90 -0
- package/dist/cjs/src/primitives/__tests/PrivateKey.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/PublicKey.test.js +83 -0
- package/dist/cjs/src/primitives/__tests/PublicKey.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/Random.test.js +19 -0
- package/dist/cjs/src/primitives/__tests/Random.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/Reader.test.js +282 -0
- package/dist/cjs/src/primitives/__tests/Reader.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/ReductionContext.test.js +224 -0
- package/dist/cjs/src/primitives/__tests/ReductionContext.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/Schnorr.test.js +213 -0
- package/dist/cjs/src/primitives/__tests/Schnorr.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/SymmetricKey.test.js +51 -0
- package/dist/cjs/src/primitives/__tests/SymmetricKey.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/SymmetricKey.vectors.js +43 -0
- package/dist/cjs/src/primitives/__tests/SymmetricKey.vectors.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/Writer.test.js +176 -0
- package/dist/cjs/src/primitives/__tests/Writer.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/bug-31.test.js +32 -0
- package/dist/cjs/src/primitives/__tests/bug-31.test.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/sighash.vectors.js +3506 -0
- package/dist/cjs/src/primitives/__tests/sighash.vectors.js.map +1 -0
- package/dist/cjs/src/primitives/__tests/utils.test.js +110 -0
- package/dist/cjs/src/primitives/__tests/utils.test.js.map +1 -0
- package/dist/cjs/src/primitives/utils.js +18 -2
- package/dist/cjs/src/primitives/utils.js.map +1 -1
- package/dist/cjs/src/script/__tests/Script.test.js +347 -0
- package/dist/cjs/src/script/__tests/Script.test.js.map +1 -0
- package/dist/cjs/src/script/__tests/Spend.test.js +282 -0
- package/dist/cjs/src/script/__tests/Spend.test.js.map +1 -0
- package/dist/cjs/src/script/__tests/SpendComplex.test.js +52 -0
- package/dist/cjs/src/script/__tests/SpendComplex.test.js.map +1 -0
- package/dist/cjs/src/script/__tests/script.invalid.vectors.js +2370 -0
- package/dist/cjs/src/script/__tests/script.invalid.vectors.js.map +1 -0
- package/dist/cjs/src/script/__tests/script.valid.vectors.js +1181 -0
- package/dist/cjs/src/script/__tests/script.valid.vectors.js.map +1 -0
- package/dist/cjs/src/script/__tests/spend.valid.vectors.js +2298 -0
- package/dist/cjs/src/script/__tests/spend.valid.vectors.js.map +1 -0
- package/dist/cjs/src/script/templates/__tests/PushDrop.test.js +161 -0
- package/dist/cjs/src/script/templates/__tests/PushDrop.test.js.map +1 -0
- package/dist/cjs/src/totp/__tests/totp.test.js +67 -0
- package/dist/cjs/src/totp/__tests/totp.test.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/Beef.test.js +393 -0
- package/dist/cjs/src/transaction/__tests/Beef.test.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/MerklePath.test.js +209 -0
- package/dist/cjs/src/transaction/__tests/MerklePath.test.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/Transaction.benchmarks.test.js +219 -0
- package/dist/cjs/src/transaction/__tests/Transaction.benchmarks.test.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/Transaction.test.js +1073 -0
- package/dist/cjs/src/transaction/__tests/Transaction.test.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/bigtx.vectors.js +7 -0
- package/dist/cjs/src/transaction/__tests/bigtx.vectors.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/bump.invalid.vectors.js +11 -0
- package/dist/cjs/src/transaction/__tests/bump.invalid.vectors.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/bump.valid.vectors.js +7 -0
- package/dist/cjs/src/transaction/__tests/bump.valid.vectors.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/tx.invalid.vectors.js +230 -0
- package/dist/cjs/src/transaction/__tests/tx.invalid.vectors.js.map +1 -0
- package/dist/cjs/src/transaction/__tests/tx.valid.vectors.js +296 -0
- package/dist/cjs/src/transaction/__tests/tx.valid.vectors.js.map +1 -0
- package/dist/cjs/src/transaction/broadcasters/__tests/ARC.test.js +246 -0
- package/dist/cjs/src/transaction/broadcasters/__tests/ARC.test.js.map +1 -0
- package/dist/cjs/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js +148 -0
- package/dist/cjs/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js.map +1 -0
- package/dist/cjs/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js +155 -0
- package/dist/cjs/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js.map +1 -0
- package/dist/cjs/src/wallet/ScriptTemplateSABPPP.js +39 -0
- package/dist/cjs/src/wallet/ScriptTemplateSABPPP.js.map +1 -0
- package/dist/cjs/src/wallet/WalletSigner.js +260 -0
- package/dist/cjs/src/wallet/WalletSigner.js.map +1 -0
- package/dist/cjs/src/wallet/__tests/CachedKeyDeriver.test.js +269 -0
- package/dist/cjs/src/wallet/__tests/CachedKeyDeriver.test.js.map +1 -0
- package/dist/cjs/src/wallet/__tests/KeyDeriver.test.js +114 -0
- package/dist/cjs/src/wallet/__tests/KeyDeriver.test.js.map +1 -0
- package/dist/cjs/src/wallet/__tests/ProtoWallet.test.js +475 -0
- package/dist/cjs/src/wallet/__tests/ProtoWallet.test.js.map +1 -0
- package/dist/cjs/src/wallet/createActionSdk.js +230 -0
- package/dist/cjs/src/wallet/createActionSdk.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/CachedKeyDeriver.js +174 -0
- package/dist/cjs/src/wallet/sdk/CachedKeyDeriver.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/CertOps.js +181 -0
- package/dist/cjs/src/wallet/sdk/CertOps.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/Certificate.js +162 -0
- package/dist/cjs/src/wallet/sdk/Certificate.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/KeyDeriver.js +176 -0
- package/dist/cjs/src/wallet/sdk/KeyDeriver.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/ProtoWallet.js +75 -0
- package/dist/cjs/src/wallet/sdk/ProtoWallet.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/StorageSyncReader.js +3 -0
- package/dist/cjs/src/wallet/sdk/StorageSyncReader.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/WERR_errors.js +107 -0
- package/dist/cjs/src/wallet/sdk/WERR_errors.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/Wallet.interfaces.js +3 -0
- package/dist/cjs/src/wallet/sdk/Wallet.interfaces.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/WalletCrypto.js +171 -0
- package/dist/cjs/src/wallet/sdk/WalletCrypto.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/WalletError.js +103 -0
- package/dist/cjs/src/wallet/sdk/WalletError.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/WalletServices.interfaces.js +3 -0
- package/dist/cjs/src/wallet/sdk/WalletServices.interfaces.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/WalletSigner.interfaces.js +3 -0
- package/dist/cjs/src/wallet/sdk/WalletSigner.interfaces.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/WalletStorage.interfaces.js +3 -0
- package/dist/cjs/src/wallet/sdk/WalletStorage.interfaces.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/index.js +31 -0
- package/dist/cjs/src/wallet/sdk/index.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/types.js +11 -0
- package/dist/cjs/src/wallet/sdk/types.js.map +1 -0
- package/dist/cjs/src/wallet/sdk/validationHelpers.js +601 -0
- package/dist/cjs/src/wallet/sdk/validationHelpers.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js +11 -3
- package/dist/cjs/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/__tests/WalletWire.integration.test.js +1962 -0
- package/dist/cjs/src/wallet/substrates/__tests/WalletWire.integration.test.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/__tests/XDM.test.js +579 -0
- package/dist/cjs/src/wallet/substrates/__tests/XDM.test.js.map +1 -0
- package/dist/cjs/src/wallet/substrates/utils/toOriginHeader.js +21 -0
- package/dist/cjs/src/wallet/substrates/utils/toOriginHeader.js.map +1 -0
- package/dist/cjs/src/wallet/utilityHelpers.js +305 -0
- package/dist/cjs/src/wallet/utilityHelpers.js.map +1 -0
- package/dist/cjs/src/wallet/validationHelpers.js +601 -0
- package/dist/cjs/src/wallet/validationHelpers.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/auth/__tests/Peer.test.js +448 -0
- package/dist/esm/src/auth/__tests/Peer.test.js.map +1 -0
- package/dist/esm/src/auth/__tests/SessionManager.test.js +69 -0
- package/dist/esm/src/auth/__tests/SessionManager.test.js.map +1 -0
- package/dist/esm/src/auth/certificates/__tests/Certificate.test.js +182 -0
- package/dist/esm/src/auth/certificates/__tests/Certificate.test.js.map +1 -0
- package/dist/esm/src/auth/certificates/__tests/MasterCertificate.test.js +184 -0
- package/dist/esm/src/auth/certificates/__tests/MasterCertificate.test.js.map +1 -0
- package/dist/esm/src/auth/certificates/__tests/VerifiableCertificate.test.js +75 -0
- package/dist/esm/src/auth/certificates/__tests/VerifiableCertificate.test.js.map +1 -0
- package/dist/esm/src/auth/utils/__tests/cryptononce.test.js +101 -0
- package/dist/esm/src/auth/utils/__tests/cryptononce.test.js.map +1 -0
- package/dist/esm/src/auth/utils/__tests/getVerifiableCertificates.test.js +106 -0
- package/dist/esm/src/auth/utils/__tests/getVerifiableCertificates.test.js.map +1 -0
- package/dist/esm/src/auth/utils/__tests/validateCertificates.test.js +111 -0
- package/dist/esm/src/auth/utils/__tests/validateCertificates.test.js.map +1 -0
- package/dist/esm/src/auth/utils/certificateHelpers.js +47 -0
- package/dist/esm/src/auth/utils/certificateHelpers.js.map +1 -0
- package/dist/esm/src/compat/__tests/BSM.test.js +69 -0
- package/dist/esm/src/compat/__tests/BSM.test.js.map +1 -0
- package/dist/esm/src/compat/__tests/ECIES.test.js +115 -0
- package/dist/esm/src/compat/__tests/ECIES.test.js.map +1 -0
- package/dist/esm/src/compat/__tests/HD.test.js +336 -0
- package/dist/esm/src/compat/__tests/HD.test.js.map +1 -0
- package/dist/esm/src/compat/__tests/Mnemonic.test.js +150 -0
- package/dist/esm/src/compat/__tests/Mnemonic.test.js.map +1 -0
- package/dist/esm/src/compat/__tests/Mnemonic.vectors.js +175 -0
- package/dist/esm/src/compat/__tests/Mnemonic.vectors.js.map +1 -0
- package/dist/esm/src/messages/__tests/EncryptedMessage.test.js +57 -0
- package/dist/esm/src/messages/__tests/EncryptedMessage.test.js.map +1 -0
- package/dist/esm/src/messages/__tests/SignedMessage.test.js +52 -0
- package/dist/esm/src/messages/__tests/SignedMessage.test.js.map +1 -0
- package/dist/esm/src/overlay-tools/__tests/LookupResolver.test.js +1471 -0
- package/dist/esm/src/overlay-tools/__tests/LookupResolver.test.js.map +1 -0
- package/dist/esm/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js +78 -0
- package/dist/esm/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.js.map +1 -0
- package/dist/esm/src/overlay-tools/__tests/SHIPBroadcaster.test.js +933 -0
- package/dist/esm/src/overlay-tools/__tests/SHIPBroadcaster.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/AESGCM.test.js +248 -0
- package/dist/esm/src/primitives/__tests/AESGCM.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BRC42.private.vectors.js +36 -0
- package/dist/esm/src/primitives/__tests/BRC42.private.vectors.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BRC42.public.vectors.js +36 -0
- package/dist/esm/src/primitives/__tests/BRC42.public.vectors.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BigNumber.arithmatic.test.js +501 -0
- package/dist/esm/src/primitives/__tests/BigNumber.arithmatic.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BigNumber.binary.test.js +185 -0
- package/dist/esm/src/primitives/__tests/BigNumber.binary.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BigNumber.constructor.test.js +149 -0
- package/dist/esm/src/primitives/__tests/BigNumber.constructor.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BigNumber.dhGroup.test.js +23 -0
- package/dist/esm/src/primitives/__tests/BigNumber.dhGroup.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BigNumber.fixtures.js +268 -0
- package/dist/esm/src/primitives/__tests/BigNumber.fixtures.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BigNumber.serializers.test.js +147 -0
- package/dist/esm/src/primitives/__tests/BigNumber.serializers.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/BigNumber.utils.test.js +322 -0
- package/dist/esm/src/primitives/__tests/BigNumber.utils.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/Curve.unit.test.js +145 -0
- package/dist/esm/src/primitives/__tests/Curve.unit.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/DRBG.test.js +22 -0
- package/dist/esm/src/primitives/__tests/DRBG.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/DRBG.vectors.js +170 -0
- package/dist/esm/src/primitives/__tests/DRBG.vectors.js.map +1 -0
- package/dist/esm/src/primitives/__tests/ECDH.test.js +34 -0
- package/dist/esm/src/primitives/__tests/ECDH.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/ECDSA.test.js +89 -0
- package/dist/esm/src/primitives/__tests/ECDSA.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/HMAC.test.js +60 -0
- package/dist/esm/src/primitives/__tests/HMAC.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/Hash.test.js +159 -0
- package/dist/esm/src/primitives/__tests/Hash.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/PBKDF2.vectors.js +122 -0
- package/dist/esm/src/primitives/__tests/PBKDF2.vectors.js.map +1 -0
- package/dist/esm/src/primitives/__tests/PrivateKey.split.test.js +105 -0
- package/dist/esm/src/primitives/__tests/PrivateKey.split.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/PrivateKey.test.js +90 -0
- package/dist/esm/src/primitives/__tests/PrivateKey.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/PublicKey.test.js +83 -0
- package/dist/esm/src/primitives/__tests/PublicKey.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/Random.test.js +19 -0
- package/dist/esm/src/primitives/__tests/Random.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/Reader.test.js +282 -0
- package/dist/esm/src/primitives/__tests/Reader.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/ReductionContext.test.js +223 -0
- package/dist/esm/src/primitives/__tests/ReductionContext.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/Schnorr.test.js +213 -0
- package/dist/esm/src/primitives/__tests/Schnorr.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/SymmetricKey.test.js +51 -0
- package/dist/esm/src/primitives/__tests/SymmetricKey.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/SymmetricKey.vectors.js +43 -0
- package/dist/esm/src/primitives/__tests/SymmetricKey.vectors.js.map +1 -0
- package/dist/esm/src/primitives/__tests/Writer.test.js +176 -0
- package/dist/esm/src/primitives/__tests/Writer.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/bug-31.test.js +32 -0
- package/dist/esm/src/primitives/__tests/bug-31.test.js.map +1 -0
- package/dist/esm/src/primitives/__tests/sighash.vectors.js +3506 -0
- package/dist/esm/src/primitives/__tests/sighash.vectors.js.map +1 -0
- package/dist/esm/src/primitives/__tests/utils.test.js +110 -0
- package/dist/esm/src/primitives/__tests/utils.test.js.map +1 -0
- package/dist/esm/src/primitives/utils.js +18 -2
- package/dist/esm/src/primitives/utils.js.map +1 -1
- package/dist/esm/src/script/__tests/Script.test.js +347 -0
- package/dist/esm/src/script/__tests/Script.test.js.map +1 -0
- package/dist/esm/src/script/__tests/Spend.test.js +282 -0
- package/dist/esm/src/script/__tests/Spend.test.js.map +1 -0
- package/dist/esm/src/script/__tests/SpendComplex.test.js +51 -0
- package/dist/esm/src/script/__tests/SpendComplex.test.js.map +1 -0
- package/dist/esm/src/script/__tests/script.invalid.vectors.js +2370 -0
- package/dist/esm/src/script/__tests/script.invalid.vectors.js.map +1 -0
- package/dist/esm/src/script/__tests/script.valid.vectors.js +1181 -0
- package/dist/esm/src/script/__tests/script.valid.vectors.js.map +1 -0
- package/dist/esm/src/script/__tests/spend.valid.vectors.js +2298 -0
- package/dist/esm/src/script/__tests/spend.valid.vectors.js.map +1 -0
- package/dist/esm/src/script/templates/__tests/PushDrop.test.js +161 -0
- package/dist/esm/src/script/templates/__tests/PushDrop.test.js.map +1 -0
- package/dist/esm/src/totp/__tests/totp.test.js +67 -0
- package/dist/esm/src/totp/__tests/totp.test.js.map +1 -0
- package/dist/esm/src/transaction/__tests/Beef.test.js +393 -0
- package/dist/esm/src/transaction/__tests/Beef.test.js.map +1 -0
- package/dist/esm/src/transaction/__tests/MerklePath.test.js +209 -0
- package/dist/esm/src/transaction/__tests/MerklePath.test.js.map +1 -0
- package/dist/esm/src/transaction/__tests/Transaction.benchmarks.test.js +219 -0
- package/dist/esm/src/transaction/__tests/Transaction.benchmarks.test.js.map +1 -0
- package/dist/esm/src/transaction/__tests/Transaction.test.js +1072 -0
- package/dist/esm/src/transaction/__tests/Transaction.test.js.map +1 -0
- package/dist/esm/src/transaction/__tests/bigtx.vectors.js +7 -0
- package/dist/esm/src/transaction/__tests/bigtx.vectors.js.map +1 -0
- package/dist/esm/src/transaction/__tests/bump.invalid.vectors.js +11 -0
- package/dist/esm/src/transaction/__tests/bump.invalid.vectors.js.map +1 -0
- package/dist/esm/src/transaction/__tests/bump.valid.vectors.js +7 -0
- package/dist/esm/src/transaction/__tests/bump.valid.vectors.js.map +1 -0
- package/dist/esm/src/transaction/__tests/tx.invalid.vectors.js +230 -0
- package/dist/esm/src/transaction/__tests/tx.invalid.vectors.js.map +1 -0
- package/dist/esm/src/transaction/__tests/tx.valid.vectors.js +296 -0
- package/dist/esm/src/transaction/__tests/tx.valid.vectors.js.map +1 -0
- package/dist/esm/src/transaction/broadcasters/__tests/ARC.test.js +246 -0
- package/dist/esm/src/transaction/broadcasters/__tests/ARC.test.js.map +1 -0
- package/dist/esm/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js +148 -0
- package/dist/esm/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.js.map +1 -0
- package/dist/esm/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js +155 -0
- package/dist/esm/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.js.map +1 -0
- package/dist/esm/src/wallet/ScriptTemplateSABPPP.js +37 -0
- package/dist/esm/src/wallet/ScriptTemplateSABPPP.js.map +1 -0
- package/dist/esm/src/wallet/WalletSigner.js +263 -0
- package/dist/esm/src/wallet/WalletSigner.js.map +1 -0
- package/dist/esm/src/wallet/__tests/CachedKeyDeriver.test.js +269 -0
- package/dist/esm/src/wallet/__tests/CachedKeyDeriver.test.js.map +1 -0
- package/dist/esm/src/wallet/__tests/KeyDeriver.test.js +113 -0
- package/dist/esm/src/wallet/__tests/KeyDeriver.test.js.map +1 -0
- package/dist/esm/src/wallet/__tests/ProtoWallet.test.js +475 -0
- package/dist/esm/src/wallet/__tests/ProtoWallet.test.js.map +1 -0
- package/dist/esm/src/wallet/createActionSdk.js +223 -0
- package/dist/esm/src/wallet/createActionSdk.js.map +1 -0
- package/dist/esm/src/wallet/sdk/CachedKeyDeriver.js +174 -0
- package/dist/esm/src/wallet/sdk/CachedKeyDeriver.js.map +1 -0
- package/dist/esm/src/wallet/sdk/CertOps.js +181 -0
- package/dist/esm/src/wallet/sdk/CertOps.js.map +1 -0
- package/dist/esm/src/wallet/sdk/Certificate.js +186 -0
- package/dist/esm/src/wallet/sdk/Certificate.js.map +1 -0
- package/dist/esm/src/wallet/sdk/KeyDeriver.js +174 -0
- package/dist/esm/src/wallet/sdk/KeyDeriver.js.map +1 -0
- package/dist/esm/src/wallet/sdk/ProtoWallet.js +71 -0
- package/dist/esm/src/wallet/sdk/ProtoWallet.js.map +1 -0
- package/dist/esm/src/wallet/sdk/StorageSyncReader.js +2 -0
- package/dist/esm/src/wallet/sdk/StorageSyncReader.js.map +1 -0
- package/dist/esm/src/wallet/sdk/WERR_errors.js +99 -0
- package/dist/esm/src/wallet/sdk/WERR_errors.js.map +1 -0
- package/dist/esm/src/wallet/sdk/Wallet.interfaces.js +2 -0
- package/dist/esm/src/wallet/sdk/Wallet.interfaces.js.map +1 -0
- package/dist/esm/src/wallet/sdk/WalletCrypto.js +168 -0
- package/dist/esm/src/wallet/sdk/WalletCrypto.js.map +1 -0
- package/dist/esm/src/wallet/sdk/WalletError.js +100 -0
- package/dist/esm/src/wallet/sdk/WalletError.js.map +1 -0
- package/dist/esm/src/wallet/sdk/WalletServices.interfaces.js +2 -0
- package/dist/esm/src/wallet/sdk/WalletServices.interfaces.js.map +1 -0
- package/dist/esm/src/wallet/sdk/WalletSigner.interfaces.js +2 -0
- package/dist/esm/src/wallet/sdk/WalletSigner.interfaces.js.map +1 -0
- package/dist/esm/src/wallet/sdk/WalletStorage.interfaces.js +2 -0
- package/dist/esm/src/wallet/sdk/WalletStorage.interfaces.js.map +1 -0
- package/dist/esm/src/wallet/sdk/index.js +15 -0
- package/dist/esm/src/wallet/sdk/index.js.map +1 -0
- package/dist/esm/src/wallet/sdk/types.js +8 -0
- package/dist/esm/src/wallet/sdk/types.js.map +1 -0
- package/dist/esm/src/wallet/sdk/validationHelpers.js +566 -0
- package/dist/esm/src/wallet/sdk/validationHelpers.js.map +1 -0
- package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js +9 -1
- package/dist/esm/src/wallet/substrates/HTTPWalletJSON.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/esm/src/wallet/substrates/__tests/WalletWire.integration.test.js +1962 -0
- package/dist/esm/src/wallet/substrates/__tests/WalletWire.integration.test.js.map +1 -0
- package/dist/esm/src/wallet/substrates/__tests/XDM.test.js +579 -0
- package/dist/esm/src/wallet/substrates/__tests/XDM.test.js.map +1 -0
- package/dist/esm/src/wallet/substrates/utils/toOriginHeader.js +17 -0
- package/dist/esm/src/wallet/substrates/utils/toOriginHeader.js.map +1 -0
- package/dist/esm/src/wallet/utilityHelpers.js +275 -0
- package/dist/esm/src/wallet/utilityHelpers.js.map +1 -0
- package/dist/esm/src/wallet/validationHelpers.js +566 -0
- package/dist/esm/src/wallet/validationHelpers.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/src/auth/__tests/Peer.test.d.ts +2 -0
- package/dist/types/src/auth/__tests/Peer.test.d.ts.map +1 -0
- package/dist/types/src/auth/__tests/SessionManager.test.d.ts +2 -0
- package/dist/types/src/auth/__tests/SessionManager.test.d.ts.map +1 -0
- package/dist/types/src/auth/certificates/__tests/Certificate.test.d.ts +2 -0
- package/dist/types/src/auth/certificates/__tests/Certificate.test.d.ts.map +1 -0
- package/dist/types/src/auth/certificates/__tests/MasterCertificate.test.d.ts +2 -0
- package/dist/types/src/auth/certificates/__tests/MasterCertificate.test.d.ts.map +1 -0
- package/dist/types/src/auth/certificates/__tests/VerifiableCertificate.test.d.ts +2 -0
- package/dist/types/src/auth/certificates/__tests/VerifiableCertificate.test.d.ts.map +1 -0
- package/dist/types/src/auth/utils/__tests/cryptononce.test.d.ts +2 -0
- package/dist/types/src/auth/utils/__tests/cryptononce.test.d.ts.map +1 -0
- package/dist/types/src/auth/utils/__tests/getVerifiableCertificates.test.d.ts +2 -0
- package/dist/types/src/auth/utils/__tests/getVerifiableCertificates.test.d.ts.map +1 -0
- package/dist/types/src/auth/utils/__tests/validateCertificates.test.d.ts +2 -0
- package/dist/types/src/auth/utils/__tests/validateCertificates.test.d.ts.map +1 -0
- package/dist/types/src/auth/utils/certificateHelpers.d.ts +26 -0
- package/dist/types/src/auth/utils/certificateHelpers.d.ts.map +1 -0
- package/dist/types/src/compat/__tests/BSM.test.d.ts +2 -0
- package/dist/types/src/compat/__tests/BSM.test.d.ts.map +1 -0
- package/dist/types/src/compat/__tests/ECIES.test.d.ts +2 -0
- package/dist/types/src/compat/__tests/ECIES.test.d.ts.map +1 -0
- package/dist/types/src/compat/__tests/HD.test.d.ts +2 -0
- package/dist/types/src/compat/__tests/HD.test.d.ts.map +1 -0
- package/dist/types/src/compat/__tests/Mnemonic.test.d.ts +2 -0
- package/dist/types/src/compat/__tests/Mnemonic.test.d.ts.map +1 -0
- package/dist/types/src/compat/__tests/Mnemonic.vectors.d.ts +11 -0
- package/dist/types/src/compat/__tests/Mnemonic.vectors.d.ts.map +1 -0
- package/dist/types/src/messages/__tests/EncryptedMessage.test.d.ts +2 -0
- package/dist/types/src/messages/__tests/EncryptedMessage.test.d.ts.map +1 -0
- package/dist/types/src/messages/__tests/SignedMessage.test.d.ts +2 -0
- package/dist/types/src/messages/__tests/SignedMessage.test.d.ts.map +1 -0
- package/dist/types/src/overlay-tools/__tests/LookupResolver.test.d.ts +2 -0
- package/dist/types/src/overlay-tools/__tests/LookupResolver.test.d.ts.map +1 -0
- package/dist/types/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.d.ts +2 -0
- package/dist/types/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.d.ts.map +1 -0
- package/dist/types/src/overlay-tools/__tests/SHIPBroadcaster.test.d.ts +2 -0
- package/dist/types/src/overlay-tools/__tests/SHIPBroadcaster.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/AESGCM.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/AESGCM.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BRC42.private.vectors.d.ts +8 -0
- package/dist/types/src/primitives/__tests/BRC42.private.vectors.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BRC42.public.vectors.d.ts +8 -0
- package/dist/types/src/primitives/__tests/BRC42.public.vectors.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BigNumber.arithmatic.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/BigNumber.arithmatic.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BigNumber.binary.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/BigNumber.binary.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BigNumber.constructor.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/BigNumber.constructor.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BigNumber.dhGroup.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/BigNumber.dhGroup.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BigNumber.fixtures.d.ts +15 -0
- package/dist/types/src/primitives/__tests/BigNumber.fixtures.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BigNumber.serializers.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/BigNumber.serializers.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/BigNumber.utils.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/BigNumber.utils.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/Curve.unit.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/Curve.unit.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/DRBG.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/DRBG.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/DRBG.vectors.d.ts +10 -0
- package/dist/types/src/primitives/__tests/DRBG.vectors.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/ECDH.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/ECDH.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/ECDSA.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/ECDSA.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/HMAC.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/HMAC.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/Hash.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/Hash.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/PBKDF2.vectors.d.ts +68 -0
- package/dist/types/src/primitives/__tests/PBKDF2.vectors.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/PrivateKey.split.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/PrivateKey.split.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/PrivateKey.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/PrivateKey.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/PublicKey.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/PublicKey.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/Random.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/Random.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/Reader.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/Reader.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/ReductionContext.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/ReductionContext.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/Schnorr.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/Schnorr.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/SymmetricKey.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/SymmetricKey.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/SymmetricKey.vectors.d.ts +20 -0
- package/dist/types/src/primitives/__tests/SymmetricKey.vectors.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/Writer.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/Writer.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/bug-31.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/bug-31.test.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/sighash.vectors.d.ts +3 -0
- package/dist/types/src/primitives/__tests/sighash.vectors.d.ts.map +1 -0
- package/dist/types/src/primitives/__tests/utils.test.d.ts +2 -0
- package/dist/types/src/primitives/__tests/utils.test.d.ts.map +1 -0
- package/dist/types/src/primitives/utils.d.ts +2 -1
- package/dist/types/src/primitives/utils.d.ts.map +1 -1
- package/dist/types/src/script/__tests/Script.test.d.ts +2 -0
- package/dist/types/src/script/__tests/Script.test.d.ts.map +1 -0
- package/dist/types/src/script/__tests/Spend.test.d.ts +2 -0
- package/dist/types/src/script/__tests/Spend.test.d.ts.map +1 -0
- package/dist/types/src/script/__tests/SpendComplex.test.d.ts +2 -0
- package/dist/types/src/script/__tests/SpendComplex.test.d.ts.map +1 -0
- package/dist/types/src/script/__tests/script.invalid.vectors.d.ts +3 -0
- package/dist/types/src/script/__tests/script.invalid.vectors.d.ts.map +1 -0
- package/dist/types/src/script/__tests/script.valid.vectors.d.ts +3 -0
- package/dist/types/src/script/__tests/script.valid.vectors.d.ts.map +1 -0
- package/dist/types/src/script/__tests/spend.valid.vectors.d.ts +3 -0
- package/dist/types/src/script/__tests/spend.valid.vectors.d.ts.map +1 -0
- package/dist/types/src/script/templates/__tests/PushDrop.test.d.ts +2 -0
- package/dist/types/src/script/templates/__tests/PushDrop.test.d.ts.map +1 -0
- package/dist/types/src/totp/__tests/totp.test.d.ts +2 -0
- package/dist/types/src/totp/__tests/totp.test.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/Beef.test.d.ts +2 -0
- package/dist/types/src/transaction/__tests/Beef.test.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/MerklePath.test.d.ts +2 -0
- package/dist/types/src/transaction/__tests/MerklePath.test.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/Transaction.benchmarks.test.d.ts +2 -0
- package/dist/types/src/transaction/__tests/Transaction.benchmarks.test.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/Transaction.test.d.ts +2 -0
- package/dist/types/src/transaction/__tests/Transaction.test.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/bigtx.vectors.d.ts +6 -0
- package/dist/types/src/transaction/__tests/bigtx.vectors.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/bump.invalid.vectors.d.ts +6 -0
- package/dist/types/src/transaction/__tests/bump.invalid.vectors.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/bump.valid.vectors.d.ts +5 -0
- package/dist/types/src/transaction/__tests/bump.valid.vectors.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/tx.invalid.vectors.d.ts +3 -0
- package/dist/types/src/transaction/__tests/tx.invalid.vectors.d.ts.map +1 -0
- package/dist/types/src/transaction/__tests/tx.valid.vectors.d.ts +3 -0
- package/dist/types/src/transaction/__tests/tx.valid.vectors.d.ts.map +1 -0
- package/dist/types/src/transaction/broadcasters/__tests/ARC.test.d.ts +2 -0
- package/dist/types/src/transaction/broadcasters/__tests/ARC.test.d.ts.map +1 -0
- package/dist/types/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.d.ts +2 -0
- package/dist/types/src/transaction/broadcasters/__tests/WhatsOnChainBroadcaster.test.d.ts.map +1 -0
- package/dist/types/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.d.ts +2 -0
- package/dist/types/src/transaction/chaintrackers/__tests/WhatsOnChainChainTracker.test.d.ts.map +1 -0
- package/dist/types/src/wallet/ScriptTemplateSABPPP.d.ts +25 -0
- package/dist/types/src/wallet/ScriptTemplateSABPPP.d.ts.map +1 -0
- package/dist/types/src/wallet/WalletSigner.d.ts +110 -0
- package/dist/types/src/wallet/WalletSigner.d.ts.map +1 -0
- package/dist/types/src/wallet/__tests/CachedKeyDeriver.test.d.ts +2 -0
- package/dist/types/src/wallet/__tests/CachedKeyDeriver.test.d.ts.map +1 -0
- package/dist/types/src/wallet/__tests/KeyDeriver.test.d.ts +2 -0
- package/dist/types/src/wallet/__tests/KeyDeriver.test.d.ts.map +1 -0
- package/dist/types/src/wallet/__tests/ProtoWallet.test.d.ts +2 -0
- package/dist/types/src/wallet/__tests/ProtoWallet.test.d.ts.map +1 -0
- package/dist/types/src/wallet/createActionSdk.d.ts +8 -0
- package/dist/types/src/wallet/createActionSdk.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/CachedKeyDeriver.d.ts +94 -0
- package/dist/types/src/wallet/sdk/CachedKeyDeriver.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/CertOps.d.ts +63 -0
- package/dist/types/src/wallet/sdk/CertOps.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/Certificate.d.ts +77 -0
- package/dist/types/src/wallet/sdk/Certificate.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/KeyDeriver.d.ts +128 -0
- package/dist/types/src/wallet/sdk/KeyDeriver.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/ProtoWallet.d.ts +30 -0
- package/dist/types/src/wallet/sdk/ProtoWallet.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/StorageSyncReader.d.ts +102 -0
- package/dist/types/src/wallet/sdk/StorageSyncReader.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/WERR_errors.d.ts +84 -0
- package/dist/types/src/wallet/sdk/WERR_errors.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/Wallet.interfaces.d.ts +1036 -0
- package/dist/types/src/wallet/sdk/Wallet.interfaces.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/WalletCrypto.d.ts +31 -0
- package/dist/types/src/wallet/sdk/WalletCrypto.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/WalletError.d.ts +46 -0
- package/dist/types/src/wallet/sdk/WalletError.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/WalletServices.interfaces.d.ts +293 -0
- package/dist/types/src/wallet/sdk/WalletServices.interfaces.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/WalletSigner.interfaces.d.ts +48 -0
- package/dist/types/src/wallet/sdk/WalletSigner.interfaces.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/WalletStorage.interfaces.d.ts +296 -0
- package/dist/types/src/wallet/sdk/WalletStorage.interfaces.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/index.d.ts +15 -0
- package/dist/types/src/wallet/sdk/index.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/types.d.ts +56 -0
- package/dist/types/src/wallet/sdk/types.d.ts.map +1 -0
- package/dist/types/src/wallet/sdk/validationHelpers.d.ts +301 -0
- package/dist/types/src/wallet/sdk/validationHelpers.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/HTTPWalletJSON.d.ts.map +1 -1
- package/dist/types/src/wallet/substrates/__tests/WalletWire.integration.test.d.ts +2 -0
- package/dist/types/src/wallet/substrates/__tests/WalletWire.integration.test.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/__tests/XDM.test.d.ts +5 -0
- package/dist/types/src/wallet/substrates/__tests/XDM.test.d.ts.map +1 -0
- package/dist/types/src/wallet/substrates/utils/toOriginHeader.d.ts +2 -0
- package/dist/types/src/wallet/substrates/utils/toOriginHeader.d.ts.map +1 -0
- package/dist/types/src/wallet/utilityHelpers.d.ts +142 -0
- package/dist/types/src/wallet/utilityHelpers.d.ts.map +1 -0
- package/dist/types/src/wallet/validationHelpers.d.ts +301 -0
- package/dist/types/src/wallet/validationHelpers.d.ts.map +1 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +1 -1
- package/docs/primitives.md +2 -1
- package/docs/wallet.md +9 -0
- package/package.json +4 -4
- package/src/primitives/utils.ts +20 -2
- package/src/transaction/__tests/Transaction.test.ts +1 -1
- package/src/wallet/substrates/HTTPWalletJSON.ts +11 -1
- package/src/wallet/substrates/WalletWireProcessor.ts +1 -1
- package/src/wallet/substrates/__tests/toOriginHeader.test.ts +34 -0
- package/src/wallet/substrates/utils/toOriginHeader.ts +15 -0
|
@@ -0,0 +1,1962 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const CompletedProtoWallet_1 = require("../../../auth/certificates/__tests/CompletedProtoWallet");
|
|
7
|
+
const index_1 = require("../../../primitives/index");
|
|
8
|
+
const WalletWireTransceiver_1 = __importDefault(require("../../../wallet/substrates/WalletWireTransceiver"));
|
|
9
|
+
const WalletWireProcessor_1 = __importDefault(require("../../../wallet/substrates/WalletWireProcessor"));
|
|
10
|
+
const sampleData = [3, 1, 4, 1, 5, 9];
|
|
11
|
+
describe('WalletWire Integration Tests', () => {
|
|
12
|
+
/**
|
|
13
|
+
* This is a copy of the test suite for CompletedProtoWallet, but instead of using a CompletedProtoWallet directly, we're using it over the WalletWire.
|
|
14
|
+
* This serves as an imperfect but still useful way to ensure that the WalletWire doesn't contain serialization or deserialization issues.
|
|
15
|
+
*/
|
|
16
|
+
describe('ProtoWallet Over Wallet Wire', () => {
|
|
17
|
+
it('Throws when functions are not supported', async () => {
|
|
18
|
+
const wallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet('anyone')));
|
|
19
|
+
await expect(() => {
|
|
20
|
+
return wallet.createAction();
|
|
21
|
+
}).rejects.toThrow();
|
|
22
|
+
await expect(() => {
|
|
23
|
+
return wallet.abortAction();
|
|
24
|
+
}).rejects.toThrow();
|
|
25
|
+
await expect(() => {
|
|
26
|
+
return wallet.signAction();
|
|
27
|
+
}).rejects.toThrow();
|
|
28
|
+
await expect(() => {
|
|
29
|
+
return wallet.listOutputs();
|
|
30
|
+
}).rejects.toThrow();
|
|
31
|
+
await expect(() => {
|
|
32
|
+
return wallet.relinquishOutput();
|
|
33
|
+
}).rejects.toThrow();
|
|
34
|
+
await expect(() => {
|
|
35
|
+
return wallet.listActions();
|
|
36
|
+
}).rejects.toThrow();
|
|
37
|
+
await expect(() => {
|
|
38
|
+
return wallet.internalizeAction();
|
|
39
|
+
}).rejects.toThrow();
|
|
40
|
+
await expect(() => {
|
|
41
|
+
return wallet.acquireCertificate();
|
|
42
|
+
}).rejects.toThrow();
|
|
43
|
+
await expect(() => {
|
|
44
|
+
return wallet.proveCertificate();
|
|
45
|
+
}).rejects.toThrow();
|
|
46
|
+
await expect(() => {
|
|
47
|
+
return wallet.listCertificates();
|
|
48
|
+
}).rejects.toThrow();
|
|
49
|
+
await expect(() => {
|
|
50
|
+
return wallet.relinquishCertificate();
|
|
51
|
+
}).rejects.toThrow();
|
|
52
|
+
await expect(() => {
|
|
53
|
+
return wallet.getHeight();
|
|
54
|
+
}).rejects.toThrow();
|
|
55
|
+
await expect(() => {
|
|
56
|
+
return wallet.getHeaderForHeight();
|
|
57
|
+
}).rejects.toThrow();
|
|
58
|
+
// TODO: Remove these two from the throw list once they are implemented.
|
|
59
|
+
await expect(() => {
|
|
60
|
+
return wallet.discoverByIdentityKey();
|
|
61
|
+
}).rejects.toThrow();
|
|
62
|
+
await expect(() => {
|
|
63
|
+
return wallet.discoverByAttributes();
|
|
64
|
+
}).rejects.toThrow();
|
|
65
|
+
});
|
|
66
|
+
it('Validates the BRC-3 compliance vector', async () => {
|
|
67
|
+
const wallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet('anyone')));
|
|
68
|
+
const { valid } = await wallet.verifySignature({
|
|
69
|
+
data: index_1.Utils.toArray('BRC-3 Compliance Validated!', 'utf8'),
|
|
70
|
+
signature: [
|
|
71
|
+
48, 68, 2, 32, 43, 34, 58, 156, 219, 32, 50, 70, 29, 240, 155, 137,
|
|
72
|
+
88, 60, 200, 95, 243, 198, 201, 21, 56, 82, 141, 112, 69, 196, 170,
|
|
73
|
+
73, 156, 6, 44, 48, 2, 32, 118, 125, 254, 201, 44, 87, 177, 170, 93,
|
|
74
|
+
11, 193, 134, 18, 70, 9, 31, 234, 27, 170, 177, 54, 96, 181, 140, 166,
|
|
75
|
+
196, 144, 14, 230, 118, 106, 105
|
|
76
|
+
],
|
|
77
|
+
protocolID: [2, 'BRC3 Test'],
|
|
78
|
+
keyID: '42',
|
|
79
|
+
counterparty: '0294c479f762f6baa97fbcd4393564c1d7bd8336ebd15928135bbcf575cd1a71a1'
|
|
80
|
+
});
|
|
81
|
+
expect(valid).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it('Validates the BRC-2 HMAC compliance vector', async () => {
|
|
84
|
+
const wallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(new index_1.PrivateKey('6a2991c9de20e38b31d7ea147bf55f5039e4bbc073160f5e0d541d1f17e321b8', 'hex'))));
|
|
85
|
+
const { valid } = await wallet.verifyHmac({
|
|
86
|
+
data: index_1.Utils.toArray('BRC-2 HMAC Compliance Validated!', 'utf8'),
|
|
87
|
+
hmac: [
|
|
88
|
+
81, 240, 18, 153, 163, 45, 174, 85, 9, 246, 142, 125, 209, 133, 82,
|
|
89
|
+
76, 254, 103, 46, 182, 86, 59, 219, 61, 126, 30, 176, 232, 233, 100,
|
|
90
|
+
234, 14
|
|
91
|
+
],
|
|
92
|
+
protocolID: [2, 'BRC2 Test'],
|
|
93
|
+
keyID: '42',
|
|
94
|
+
counterparty: '0294c479f762f6baa97fbcd4393564c1d7bd8336ebd15928135bbcf575cd1a71a1'
|
|
95
|
+
});
|
|
96
|
+
expect(valid).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
it('Validates the BRC-2 Encryption compliance vector', async () => {
|
|
99
|
+
const wallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(new index_1.PrivateKey('6a2991c9de20e38b31d7ea147bf55f5039e4bbc073160f5e0d541d1f17e321b8', 'hex'))));
|
|
100
|
+
const { plaintext } = await wallet.decrypt({
|
|
101
|
+
ciphertext: [
|
|
102
|
+
252, 203, 216, 184, 29, 161, 223, 212, 16, 193, 94, 99, 31, 140, 99,
|
|
103
|
+
43, 61, 236, 184, 67, 54, 105, 199, 47, 11, 19, 184, 127, 2, 165, 125,
|
|
104
|
+
9, 188, 195, 196, 39, 120, 130, 213, 95, 186, 89, 64, 28, 1, 80, 20,
|
|
105
|
+
213, 159, 133, 98, 253, 128, 105, 113, 247, 197, 152, 236, 64, 166,
|
|
106
|
+
207, 113, 134, 65, 38, 58, 24, 127, 145, 140, 206, 47, 70, 146, 84,
|
|
107
|
+
186, 72, 95, 35, 154, 112, 178, 55, 72, 124
|
|
108
|
+
],
|
|
109
|
+
protocolID: [2, 'BRC2 Test'],
|
|
110
|
+
keyID: '42',
|
|
111
|
+
counterparty: '0294c479f762f6baa97fbcd4393564c1d7bd8336ebd15928135bbcf575cd1a71a1'
|
|
112
|
+
});
|
|
113
|
+
expect(index_1.Utils.toUTF8(plaintext)).toEqual('BRC-2 Encryption Compliance Validated!');
|
|
114
|
+
});
|
|
115
|
+
it('Encrypts messages decryptable by the counterparty', async () => {
|
|
116
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
117
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
118
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
119
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
120
|
+
const { ciphertext } = await user.encrypt({
|
|
121
|
+
plaintext: sampleData,
|
|
122
|
+
protocolID: [2, 'tests'],
|
|
123
|
+
keyID: '4',
|
|
124
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
125
|
+
});
|
|
126
|
+
const { plaintext } = await counterparty.decrypt({
|
|
127
|
+
ciphertext,
|
|
128
|
+
protocolID: [2, 'tests'],
|
|
129
|
+
keyID: '4',
|
|
130
|
+
counterparty: userKey.toPublicKey().toString()
|
|
131
|
+
});
|
|
132
|
+
expect(plaintext).toEqual(sampleData);
|
|
133
|
+
expect(ciphertext).not.toEqual(plaintext);
|
|
134
|
+
});
|
|
135
|
+
it('Fails to decryupt messages for the wrong protocol, key, and counterparty', async () => {
|
|
136
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
137
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
138
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
139
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
140
|
+
const { ciphertext } = await user.encrypt({
|
|
141
|
+
plaintext: sampleData,
|
|
142
|
+
protocolID: [2, 'tests'],
|
|
143
|
+
keyID: '4',
|
|
144
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
145
|
+
});
|
|
146
|
+
await expect(async () => await counterparty.decrypt({
|
|
147
|
+
ciphertext,
|
|
148
|
+
protocolID: [1, 'tests'],
|
|
149
|
+
keyID: '4',
|
|
150
|
+
counterparty: userKey.toPublicKey().toString()
|
|
151
|
+
})).rejects.toThrow();
|
|
152
|
+
await expect(async () => await counterparty.decrypt({
|
|
153
|
+
ciphertext,
|
|
154
|
+
protocolID: [2, 'tests'],
|
|
155
|
+
keyID: '5',
|
|
156
|
+
counterparty: userKey.toPublicKey().toString()
|
|
157
|
+
})).rejects.toThrow();
|
|
158
|
+
await expect(async () => await counterparty.decrypt({
|
|
159
|
+
ciphertext,
|
|
160
|
+
protocolID: [2, 'tests'],
|
|
161
|
+
keyID: '4',
|
|
162
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
163
|
+
})).rejects.toThrow();
|
|
164
|
+
});
|
|
165
|
+
it('Correctly derives keys for a counterparty', async () => {
|
|
166
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
167
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
168
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
169
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
170
|
+
const { publicKey: identityKey } = await user.getPublicKey({
|
|
171
|
+
identityKey: true
|
|
172
|
+
});
|
|
173
|
+
expect(identityKey).toEqual(userKey.toPublicKey().toString());
|
|
174
|
+
const { publicKey: derivedForCounterparty } = await user.getPublicKey({
|
|
175
|
+
protocolID: [2, 'tests'],
|
|
176
|
+
keyID: '4',
|
|
177
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
178
|
+
});
|
|
179
|
+
const { publicKey: derivedByCounterparty } = await counterparty.getPublicKey({
|
|
180
|
+
protocolID: [2, 'tests'],
|
|
181
|
+
keyID: '4',
|
|
182
|
+
counterparty: userKey.toPublicKey().toString(),
|
|
183
|
+
forSelf: true
|
|
184
|
+
});
|
|
185
|
+
expect(derivedForCounterparty).toEqual(derivedByCounterparty);
|
|
186
|
+
});
|
|
187
|
+
it('Signs messages verifiable by the counterparty', async () => {
|
|
188
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
189
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
190
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
191
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
192
|
+
const { signature } = await user.createSignature({
|
|
193
|
+
data: sampleData,
|
|
194
|
+
protocolID: [2, 'tests'],
|
|
195
|
+
keyID: '4',
|
|
196
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
197
|
+
});
|
|
198
|
+
const { valid } = await counterparty.verifySignature({
|
|
199
|
+
signature,
|
|
200
|
+
data: sampleData,
|
|
201
|
+
protocolID: [2, 'tests'],
|
|
202
|
+
keyID: '4',
|
|
203
|
+
counterparty: userKey.toPublicKey().toString()
|
|
204
|
+
});
|
|
205
|
+
expect(valid).toEqual(true);
|
|
206
|
+
expect(signature.length).not.toEqual(0);
|
|
207
|
+
});
|
|
208
|
+
it('Directly signs hash of message verifiable by the counterparty', async () => {
|
|
209
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
210
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
211
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
212
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
213
|
+
const { signature } = await user.createSignature({
|
|
214
|
+
hashToDirectlySign: index_1.Hash.sha256(sampleData),
|
|
215
|
+
protocolID: [2, 'tests'],
|
|
216
|
+
keyID: '4',
|
|
217
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
218
|
+
});
|
|
219
|
+
const { valid } = await counterparty.verifySignature({
|
|
220
|
+
signature,
|
|
221
|
+
data: sampleData,
|
|
222
|
+
protocolID: [2, 'tests'],
|
|
223
|
+
keyID: '4',
|
|
224
|
+
counterparty: userKey.toPublicKey().toString()
|
|
225
|
+
});
|
|
226
|
+
expect(valid).toEqual(true);
|
|
227
|
+
const { valid: hashValid } = await counterparty.verifySignature({
|
|
228
|
+
signature,
|
|
229
|
+
hashToDirectlyVerify: index_1.Hash.sha256(sampleData),
|
|
230
|
+
protocolID: [2, 'tests'],
|
|
231
|
+
keyID: '4',
|
|
232
|
+
counterparty: userKey.toPublicKey().toString()
|
|
233
|
+
});
|
|
234
|
+
expect(hashValid).toEqual(true);
|
|
235
|
+
expect(signature.length).not.toEqual(0);
|
|
236
|
+
});
|
|
237
|
+
it('Fails to verify signature for the wrong data, protocol, key, and counterparty', async () => {
|
|
238
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
239
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
240
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
241
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
242
|
+
const { signature } = await user.createSignature({
|
|
243
|
+
data: sampleData,
|
|
244
|
+
protocolID: [2, 'tests'],
|
|
245
|
+
keyID: '4',
|
|
246
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
247
|
+
});
|
|
248
|
+
await expect(async () => await counterparty.verifySignature({
|
|
249
|
+
signature,
|
|
250
|
+
data: [0, ...sampleData],
|
|
251
|
+
protocolID: [2, 'tests'],
|
|
252
|
+
keyID: '4',
|
|
253
|
+
counterparty: userKey.toPublicKey().toString()
|
|
254
|
+
})).rejects.toThrow();
|
|
255
|
+
await expect(async () => await counterparty.verifySignature({
|
|
256
|
+
signature,
|
|
257
|
+
data: sampleData,
|
|
258
|
+
protocolID: [2, 'wrong'],
|
|
259
|
+
keyID: '4',
|
|
260
|
+
counterparty: userKey.toPublicKey().toString()
|
|
261
|
+
})).rejects.toThrow();
|
|
262
|
+
await expect(async () => await counterparty.verifySignature({
|
|
263
|
+
signature,
|
|
264
|
+
data: sampleData,
|
|
265
|
+
protocolID: [2, 'tests'],
|
|
266
|
+
keyID: '2',
|
|
267
|
+
counterparty: userKey.toPublicKey().toString()
|
|
268
|
+
})).rejects.toThrow();
|
|
269
|
+
await expect(async () => await counterparty.verifySignature({
|
|
270
|
+
signature,
|
|
271
|
+
data: sampleData,
|
|
272
|
+
protocolID: [2, 'tests'],
|
|
273
|
+
keyID: '4',
|
|
274
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
275
|
+
})).rejects.toThrow();
|
|
276
|
+
});
|
|
277
|
+
it('Computes HMAC over messages verifiable by the counterparty', async () => {
|
|
278
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
279
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
280
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
281
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
282
|
+
const { hmac } = await user.createHmac({
|
|
283
|
+
data: sampleData,
|
|
284
|
+
protocolID: [2, 'tests'],
|
|
285
|
+
keyID: '4',
|
|
286
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
287
|
+
});
|
|
288
|
+
const { valid } = await counterparty.verifyHmac({
|
|
289
|
+
hmac,
|
|
290
|
+
data: sampleData,
|
|
291
|
+
protocolID: [2, 'tests'],
|
|
292
|
+
keyID: '4',
|
|
293
|
+
counterparty: userKey.toPublicKey().toString()
|
|
294
|
+
});
|
|
295
|
+
expect(valid).toEqual(true);
|
|
296
|
+
expect(hmac.length).toEqual(32);
|
|
297
|
+
});
|
|
298
|
+
it('Fails to verify HMAC for the wrong data, protocol, key, and counterparty', async () => {
|
|
299
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
300
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
301
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
302
|
+
const counterparty = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey)));
|
|
303
|
+
const { hmac } = await user.createHmac({
|
|
304
|
+
data: sampleData,
|
|
305
|
+
protocolID: [2, 'tests'],
|
|
306
|
+
keyID: '4',
|
|
307
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
308
|
+
});
|
|
309
|
+
await expect(async () => await counterparty.verifyHmac({
|
|
310
|
+
hmac,
|
|
311
|
+
data: [0, ...sampleData],
|
|
312
|
+
protocolID: [2, 'tests'],
|
|
313
|
+
keyID: '4',
|
|
314
|
+
counterparty: userKey.toPublicKey().toString()
|
|
315
|
+
})).rejects.toThrow();
|
|
316
|
+
await expect(async () => await counterparty.verifyHmac({
|
|
317
|
+
hmac,
|
|
318
|
+
data: sampleData,
|
|
319
|
+
protocolID: [2, 'wrong'],
|
|
320
|
+
keyID: '4',
|
|
321
|
+
counterparty: userKey.toPublicKey().toString()
|
|
322
|
+
})).rejects.toThrow();
|
|
323
|
+
await expect(async () => await counterparty.verifyHmac({
|
|
324
|
+
hmac,
|
|
325
|
+
data: sampleData,
|
|
326
|
+
protocolID: [2, 'tests'],
|
|
327
|
+
keyID: '2',
|
|
328
|
+
counterparty: userKey.toPublicKey().toString()
|
|
329
|
+
})).rejects.toThrow();
|
|
330
|
+
await expect(async () => await counterparty.verifyHmac({
|
|
331
|
+
hmac,
|
|
332
|
+
data: sampleData,
|
|
333
|
+
protocolID: [2, 'tests'],
|
|
334
|
+
keyID: '4',
|
|
335
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
336
|
+
})).rejects.toThrow();
|
|
337
|
+
});
|
|
338
|
+
it('Uses anyone for creating signatures and self for other operations if no counterparty is provided', async () => {
|
|
339
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
340
|
+
const user = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(userKey)));
|
|
341
|
+
const { hmac } = await user.createHmac({
|
|
342
|
+
data: sampleData,
|
|
343
|
+
protocolID: [2, 'tests'],
|
|
344
|
+
keyID: '4'
|
|
345
|
+
});
|
|
346
|
+
const { valid: hmacValid } = await user.verifyHmac({
|
|
347
|
+
hmac,
|
|
348
|
+
data: sampleData,
|
|
349
|
+
protocolID: [2, 'tests'],
|
|
350
|
+
keyID: '4'
|
|
351
|
+
});
|
|
352
|
+
expect(hmacValid).toEqual(true);
|
|
353
|
+
const { valid: explicitSelfHmacValid } = await user.verifyHmac({
|
|
354
|
+
hmac,
|
|
355
|
+
data: sampleData,
|
|
356
|
+
protocolID: [2, 'tests'],
|
|
357
|
+
keyID: '4',
|
|
358
|
+
counterparty: 'self'
|
|
359
|
+
});
|
|
360
|
+
expect(explicitSelfHmacValid).toEqual(true);
|
|
361
|
+
expect(hmac.length).toEqual(32);
|
|
362
|
+
const { signature: anyoneSig } = await user.createSignature({
|
|
363
|
+
data: sampleData,
|
|
364
|
+
protocolID: [2, 'tests'],
|
|
365
|
+
keyID: '4'
|
|
366
|
+
// counterparty=anyone is implicit for creating signatures
|
|
367
|
+
});
|
|
368
|
+
const anyone = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet('anyone')));
|
|
369
|
+
const { valid: anyoneSigValid } = await anyone.verifySignature({
|
|
370
|
+
signature: anyoneSig,
|
|
371
|
+
data: sampleData,
|
|
372
|
+
protocolID: [2, 'tests'],
|
|
373
|
+
keyID: '4',
|
|
374
|
+
counterparty: userKey.toPublicKey().toString()
|
|
375
|
+
});
|
|
376
|
+
expect(anyoneSigValid).toEqual(true);
|
|
377
|
+
const { signature: selfSig } = await user.createSignature({
|
|
378
|
+
data: sampleData,
|
|
379
|
+
protocolID: [2, 'tests'],
|
|
380
|
+
keyID: '4',
|
|
381
|
+
counterparty: 'self'
|
|
382
|
+
});
|
|
383
|
+
const { valid: selfSigValid } = await user.verifySignature({
|
|
384
|
+
signature: selfSig,
|
|
385
|
+
data: sampleData,
|
|
386
|
+
protocolID: [2, 'tests'],
|
|
387
|
+
keyID: '4'
|
|
388
|
+
// Self is implicit when verifying signatures
|
|
389
|
+
});
|
|
390
|
+
expect(selfSigValid).toEqual(true);
|
|
391
|
+
const { valid: explicitSelfSigValid } = await user.verifySignature({
|
|
392
|
+
signature: selfSig,
|
|
393
|
+
data: sampleData,
|
|
394
|
+
protocolID: [2, 'tests'],
|
|
395
|
+
keyID: '4',
|
|
396
|
+
counterparty: 'self'
|
|
397
|
+
});
|
|
398
|
+
expect(explicitSelfSigValid).toEqual(true);
|
|
399
|
+
const { publicKey } = await user.getPublicKey({
|
|
400
|
+
protocolID: [2, 'tests'],
|
|
401
|
+
keyID: '4'
|
|
402
|
+
});
|
|
403
|
+
const { publicKey: explicitSelfPublicKey } = await user.getPublicKey({
|
|
404
|
+
protocolID: [2, 'tests'],
|
|
405
|
+
keyID: '4',
|
|
406
|
+
counterparty: 'self'
|
|
407
|
+
});
|
|
408
|
+
expect(publicKey).toEqual(explicitSelfPublicKey);
|
|
409
|
+
const { ciphertext } = await user.encrypt({
|
|
410
|
+
plaintext: sampleData,
|
|
411
|
+
protocolID: [2, 'tests'],
|
|
412
|
+
keyID: '4'
|
|
413
|
+
});
|
|
414
|
+
const { plaintext } = await user.decrypt({
|
|
415
|
+
ciphertext,
|
|
416
|
+
protocolID: [2, 'tests'],
|
|
417
|
+
keyID: '4'
|
|
418
|
+
});
|
|
419
|
+
const { plaintext: explicitSelfPlaintext } = await user.decrypt({
|
|
420
|
+
ciphertext,
|
|
421
|
+
protocolID: [2, 'tests'],
|
|
422
|
+
keyID: '4',
|
|
423
|
+
counterparty: 'self'
|
|
424
|
+
});
|
|
425
|
+
expect(plaintext).toEqual(explicitSelfPlaintext);
|
|
426
|
+
expect(plaintext).toEqual(sampleData);
|
|
427
|
+
});
|
|
428
|
+
it('Validates the revealCounterpartyKeyLinkage function', async () => {
|
|
429
|
+
// Initialize keys
|
|
430
|
+
const proverKey = index_1.PrivateKey.fromRandom();
|
|
431
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
432
|
+
const verifierKey = index_1.PrivateKey.fromRandom();
|
|
433
|
+
// Initialize wallets
|
|
434
|
+
const proverWallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(proverKey)));
|
|
435
|
+
const verifierWallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(verifierKey)));
|
|
436
|
+
// Prover reveals counterparty key linkage
|
|
437
|
+
const revelation = await proverWallet.revealCounterpartyKeyLinkage({
|
|
438
|
+
counterparty: counterpartyKey.toPublicKey().toString(),
|
|
439
|
+
verifier: verifierKey.toPublicKey().toString()
|
|
440
|
+
});
|
|
441
|
+
// Verifier decrypts the encrypted linkage
|
|
442
|
+
const { plaintext: linkage } = await verifierWallet.decrypt({
|
|
443
|
+
ciphertext: revelation.encryptedLinkage,
|
|
444
|
+
protocolID: [2, 'counterparty linkage revelation'],
|
|
445
|
+
keyID: revelation.revelationTime,
|
|
446
|
+
counterparty: proverKey.toPublicKey().toString()
|
|
447
|
+
});
|
|
448
|
+
// Compute expected linkage
|
|
449
|
+
const expectedLinkage = proverKey
|
|
450
|
+
.deriveSharedSecret(counterpartyKey.toPublicKey())
|
|
451
|
+
.encode(true);
|
|
452
|
+
// Compare linkage and expectedLinkage
|
|
453
|
+
expect(linkage).toEqual(expectedLinkage);
|
|
454
|
+
});
|
|
455
|
+
it('Validates the revealSpecificKeyLinkage function', async () => {
|
|
456
|
+
// Initialize keys
|
|
457
|
+
const proverKey = index_1.PrivateKey.fromRandom();
|
|
458
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
459
|
+
const verifierKey = index_1.PrivateKey.fromRandom();
|
|
460
|
+
// Initialize wallets
|
|
461
|
+
const proverWallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(proverKey)));
|
|
462
|
+
const verifierWallet = new WalletWireTransceiver_1.default(new WalletWireProcessor_1.default(new CompletedProtoWallet_1.CompletedProtoWallet(verifierKey)));
|
|
463
|
+
const protocolID = [0, 'tests'];
|
|
464
|
+
const keyID = 'test key id';
|
|
465
|
+
// Prover reveals specific key linkage
|
|
466
|
+
const revelation = await proverWallet.revealSpecificKeyLinkage({
|
|
467
|
+
counterparty: counterpartyKey.toPublicKey().toString(),
|
|
468
|
+
verifier: verifierKey.toPublicKey().toString(),
|
|
469
|
+
protocolID,
|
|
470
|
+
keyID
|
|
471
|
+
});
|
|
472
|
+
expect(revelation.encryptedLinkageProof).toBeDefined();
|
|
473
|
+
expect(revelation.proofType).toBeDefined();
|
|
474
|
+
// Verifier decrypts the encrypted linkage
|
|
475
|
+
const { plaintext: linkage } = await verifierWallet.decrypt({
|
|
476
|
+
ciphertext: revelation.encryptedLinkage,
|
|
477
|
+
protocolID: [
|
|
478
|
+
2,
|
|
479
|
+
`specific linkage revelation ${protocolID[0]} ${protocolID[1]}`
|
|
480
|
+
],
|
|
481
|
+
keyID,
|
|
482
|
+
counterparty: proverKey.toPublicKey().toString()
|
|
483
|
+
});
|
|
484
|
+
// Compute expected linkage
|
|
485
|
+
const sharedSecret = proverKey
|
|
486
|
+
.deriveSharedSecret(counterpartyKey.toPublicKey())
|
|
487
|
+
.encode(true);
|
|
488
|
+
// Function to compute the invoice number
|
|
489
|
+
const computeInvoiceNumber = function (protocolID, keyID) {
|
|
490
|
+
const securityLevel = protocolID[0];
|
|
491
|
+
if (!Number.isInteger(securityLevel) ||
|
|
492
|
+
securityLevel < 0 ||
|
|
493
|
+
securityLevel > 2) {
|
|
494
|
+
throw new Error('Protocol security level must be 0, 1, or 2');
|
|
495
|
+
}
|
|
496
|
+
const protocolName = protocolID[1].toLowerCase().trim();
|
|
497
|
+
if (keyID.length > 800) {
|
|
498
|
+
throw new Error('Key IDs must be 800 characters or less');
|
|
499
|
+
}
|
|
500
|
+
if (keyID.length < 1) {
|
|
501
|
+
throw new Error('Key IDs must be 1 character or more');
|
|
502
|
+
}
|
|
503
|
+
if (protocolName.length > 400) {
|
|
504
|
+
throw new Error('Protocol names must be 400 characters or less');
|
|
505
|
+
}
|
|
506
|
+
if (protocolName.length < 5) {
|
|
507
|
+
throw new Error('Protocol names must be 5 characters or more');
|
|
508
|
+
}
|
|
509
|
+
if (protocolName.includes(' ')) {
|
|
510
|
+
throw new Error('Protocol names cannot contain multiple consecutive spaces (" ")');
|
|
511
|
+
}
|
|
512
|
+
if (!/^[a-z0-9 ]+$/g.test(protocolName)) {
|
|
513
|
+
throw new Error('Protocol names can only contain letters, numbers and spaces');
|
|
514
|
+
}
|
|
515
|
+
if (protocolName.endsWith(' protocol')) {
|
|
516
|
+
throw new Error('No need to end your protocol name with " protocol"');
|
|
517
|
+
}
|
|
518
|
+
return `${securityLevel}-${protocolName}-${keyID}`;
|
|
519
|
+
};
|
|
520
|
+
const invoiceNumber = computeInvoiceNumber(protocolID, keyID);
|
|
521
|
+
const invoiceNumberBin = index_1.Utils.toArray(invoiceNumber, 'utf8');
|
|
522
|
+
// Compute expected linkage
|
|
523
|
+
const expectedLinkage = index_1.Hash.sha256hmac(sharedSecret, invoiceNumberBin);
|
|
524
|
+
// Compare linkage and expectedLinkage
|
|
525
|
+
expect(linkage).toEqual(expectedLinkage);
|
|
526
|
+
});
|
|
527
|
+
});
|
|
528
|
+
// Helper function to create a test wallet wire setup
|
|
529
|
+
const createTestWalletWire = (wallet) => {
|
|
530
|
+
const processor = new WalletWireProcessor_1.default(wallet);
|
|
531
|
+
const transceiver = new WalletWireTransceiver_1.default(processor);
|
|
532
|
+
return transceiver;
|
|
533
|
+
};
|
|
534
|
+
// Mock implementation for methods not supported by CompletedProtoWallet
|
|
535
|
+
const mockUnsupportedMethods = (methods) => {
|
|
536
|
+
return {
|
|
537
|
+
...methods
|
|
538
|
+
};
|
|
539
|
+
};
|
|
540
|
+
describe('createAction', () => {
|
|
541
|
+
it('should create an action with valid inputs', async () => {
|
|
542
|
+
// Mock the createAction method
|
|
543
|
+
const createActionMock = jest.fn().mockResolvedValue({
|
|
544
|
+
txid: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806',
|
|
545
|
+
tx: [1, 2, 3, 4]
|
|
546
|
+
});
|
|
547
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
548
|
+
createAction: createActionMock
|
|
549
|
+
}));
|
|
550
|
+
const args = {
|
|
551
|
+
description: 'Test action description',
|
|
552
|
+
outputs: [
|
|
553
|
+
{
|
|
554
|
+
lockingScript: '00', // Sample locking script
|
|
555
|
+
satoshis: 1000,
|
|
556
|
+
outputDescription: 'Test output',
|
|
557
|
+
basket: 'test-basket',
|
|
558
|
+
customInstructions: 'Test instructions',
|
|
559
|
+
tags: ['test-tag']
|
|
560
|
+
}
|
|
561
|
+
],
|
|
562
|
+
labels: ['test-label']
|
|
563
|
+
};
|
|
564
|
+
const result = await wallet.createAction(args);
|
|
565
|
+
expect(result).toHaveProperty('txid');
|
|
566
|
+
expect(result).toHaveProperty('tx');
|
|
567
|
+
expect(result.tx).toBeInstanceOf(Array);
|
|
568
|
+
expect(createActionMock).toHaveBeenCalledWith(args, '');
|
|
569
|
+
});
|
|
570
|
+
it('should create an action with minimal inputs (only description)', async () => {
|
|
571
|
+
// Mock the createAction method
|
|
572
|
+
const createActionMock = jest.fn().mockResolvedValue({
|
|
573
|
+
txid: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806'
|
|
574
|
+
});
|
|
575
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
576
|
+
createAction: createActionMock
|
|
577
|
+
}));
|
|
578
|
+
const args = {
|
|
579
|
+
description: 'Minimal action description'
|
|
580
|
+
};
|
|
581
|
+
const result = await wallet.createAction(args);
|
|
582
|
+
expect(result).toHaveProperty('txid');
|
|
583
|
+
expect(result).not.toHaveProperty('tx');
|
|
584
|
+
expect(result).not.toHaveProperty('noSendChange');
|
|
585
|
+
expect(result).not.toHaveProperty('sendWithResults');
|
|
586
|
+
expect(result).not.toHaveProperty('signableTransaction');
|
|
587
|
+
expect(createActionMock).toHaveBeenCalledWith(args, '');
|
|
588
|
+
});
|
|
589
|
+
it('should create an action and return only txid when returnTXIDOnly is true', async () => {
|
|
590
|
+
// Mock the createAction method
|
|
591
|
+
const createActionMock = jest.fn().mockResolvedValue({
|
|
592
|
+
txid: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806'
|
|
593
|
+
});
|
|
594
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
595
|
+
createAction: createActionMock
|
|
596
|
+
}));
|
|
597
|
+
const args = {
|
|
598
|
+
description: 'Test action with returnTXIDOnly',
|
|
599
|
+
options: {
|
|
600
|
+
returnTXIDOnly: true
|
|
601
|
+
}
|
|
602
|
+
};
|
|
603
|
+
const result = await wallet.createAction(args);
|
|
604
|
+
expect(result).toHaveProperty('txid');
|
|
605
|
+
expect(result).not.toHaveProperty('tx');
|
|
606
|
+
expect(result).not.toHaveProperty('noSendChange');
|
|
607
|
+
expect(result).not.toHaveProperty('sendWithResults');
|
|
608
|
+
expect(result).not.toHaveProperty('signableTransaction');
|
|
609
|
+
expect(createActionMock).toHaveBeenCalledWith(args, '');
|
|
610
|
+
});
|
|
611
|
+
it('should create an action and return a signableTransaction when noSend is true', async () => {
|
|
612
|
+
// Mock the createAction method
|
|
613
|
+
const createActionMock = jest.fn().mockResolvedValue({
|
|
614
|
+
signableTransaction: {
|
|
615
|
+
tx: [0x01],
|
|
616
|
+
reference: index_1.Utils.toBase64([0x01])
|
|
617
|
+
}
|
|
618
|
+
});
|
|
619
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
620
|
+
createAction: createActionMock
|
|
621
|
+
}));
|
|
622
|
+
const args = {
|
|
623
|
+
description: 'Test action with noSend',
|
|
624
|
+
options: {
|
|
625
|
+
noSend: true
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
const result = await wallet.createAction(args);
|
|
629
|
+
expect(result).toHaveProperty('signableTransaction');
|
|
630
|
+
expect(result.signableTransaction).toHaveProperty('tx');
|
|
631
|
+
expect(result.signableTransaction).toHaveProperty('reference');
|
|
632
|
+
expect(result).not.toHaveProperty('txid');
|
|
633
|
+
expect(result).not.toHaveProperty('tx');
|
|
634
|
+
expect(createActionMock).toHaveBeenCalledWith(args, '');
|
|
635
|
+
});
|
|
636
|
+
it('should create an action with all options set and handle all return values', async () => {
|
|
637
|
+
// Mock the createAction method
|
|
638
|
+
const createActionMock = jest.fn().mockResolvedValue({
|
|
639
|
+
txid: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806',
|
|
640
|
+
tx: [1, 2, 3, 4],
|
|
641
|
+
noSendChange: [
|
|
642
|
+
'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0'
|
|
643
|
+
],
|
|
644
|
+
sendWithResults: [
|
|
645
|
+
{
|
|
646
|
+
txid: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806',
|
|
647
|
+
status: 'sending'
|
|
648
|
+
}
|
|
649
|
+
],
|
|
650
|
+
signableTransaction: {
|
|
651
|
+
tx: [0x01],
|
|
652
|
+
reference: index_1.Utils.toBase64([0x01])
|
|
653
|
+
}
|
|
654
|
+
});
|
|
655
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
656
|
+
createAction: createActionMock
|
|
657
|
+
}));
|
|
658
|
+
const args = {
|
|
659
|
+
description: 'Test action with all options',
|
|
660
|
+
inputs: [],
|
|
661
|
+
inputBEEF: [1, 2, 3, 4],
|
|
662
|
+
outputs: [
|
|
663
|
+
{
|
|
664
|
+
lockingScript: '016a',
|
|
665
|
+
satoshis: 1,
|
|
666
|
+
outputDescription: 'This is a test.'
|
|
667
|
+
}
|
|
668
|
+
],
|
|
669
|
+
lockTime: 0,
|
|
670
|
+
version: 1,
|
|
671
|
+
labels: ['label1', 'label2'],
|
|
672
|
+
options: {
|
|
673
|
+
signAndProcess: false,
|
|
674
|
+
acceptDelayedBroadcast: false,
|
|
675
|
+
trustSelf: 'known',
|
|
676
|
+
knownTxids: [
|
|
677
|
+
'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806'
|
|
678
|
+
],
|
|
679
|
+
returnTXIDOnly: false,
|
|
680
|
+
noSend: true,
|
|
681
|
+
noSendChange: [
|
|
682
|
+
'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0'
|
|
683
|
+
],
|
|
684
|
+
sendWith: [
|
|
685
|
+
'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806'
|
|
686
|
+
],
|
|
687
|
+
randomizeOutputs: false
|
|
688
|
+
}
|
|
689
|
+
};
|
|
690
|
+
const result = await wallet.createAction(args);
|
|
691
|
+
expect(result).toHaveProperty('txid');
|
|
692
|
+
expect(result).toHaveProperty('tx');
|
|
693
|
+
expect(result).toHaveProperty('noSendChange');
|
|
694
|
+
expect(result).toHaveProperty('sendWithResults');
|
|
695
|
+
expect(result).toHaveProperty('signableTransaction');
|
|
696
|
+
expect(createActionMock).toHaveBeenCalledWith(args, '');
|
|
697
|
+
});
|
|
698
|
+
it('should throw an error with invalid inputs', async () => {
|
|
699
|
+
// Mock the createAction method to throw an error
|
|
700
|
+
const createActionMock = jest
|
|
701
|
+
.fn()
|
|
702
|
+
.mockRejectedValue(new Error('Invalid inputs'));
|
|
703
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
704
|
+
createAction: createActionMock
|
|
705
|
+
}));
|
|
706
|
+
const args = {
|
|
707
|
+
description: '' // Invalid description (too short)
|
|
708
|
+
};
|
|
709
|
+
await expect(wallet.createAction(args)).rejects.toThrow('Invalid inputs');
|
|
710
|
+
expect(createActionMock).toHaveBeenCalledWith(args, '');
|
|
711
|
+
});
|
|
712
|
+
});
|
|
713
|
+
describe('signAction', () => {
|
|
714
|
+
it('should sign an action with valid inputs', async () => {
|
|
715
|
+
// Mock the signAction method
|
|
716
|
+
const signActionMock = jest.fn().mockResolvedValue({
|
|
717
|
+
txid: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806',
|
|
718
|
+
tx: [1, 2, 3, 4]
|
|
719
|
+
});
|
|
720
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
721
|
+
signAction: signActionMock
|
|
722
|
+
}));
|
|
723
|
+
const spends = {
|
|
724
|
+
0: {
|
|
725
|
+
unlockingScript: '00' // Sample unlocking script
|
|
726
|
+
}
|
|
727
|
+
};
|
|
728
|
+
const reference = index_1.Utils.toBase64([1, 2, 3]);
|
|
729
|
+
const args = { spends, reference };
|
|
730
|
+
const result = await wallet.signAction(args);
|
|
731
|
+
expect(result).toHaveProperty('txid');
|
|
732
|
+
expect(result).toHaveProperty('tx');
|
|
733
|
+
expect(result.tx).toBeInstanceOf(Array);
|
|
734
|
+
expect(signActionMock).toHaveBeenCalledWith(args, '');
|
|
735
|
+
});
|
|
736
|
+
it('should throw an error with invalid inputs', async () => {
|
|
737
|
+
// Mock the signAction method to throw an error
|
|
738
|
+
const signActionMock = jest
|
|
739
|
+
.fn()
|
|
740
|
+
.mockRejectedValue(new Error('Invalid inputs'));
|
|
741
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
742
|
+
signAction: signActionMock
|
|
743
|
+
}));
|
|
744
|
+
const spends = {};
|
|
745
|
+
const reference = '';
|
|
746
|
+
const args = { spends, reference };
|
|
747
|
+
await expect(wallet.signAction(args)).rejects.toThrow('Invalid inputs');
|
|
748
|
+
expect(signActionMock).toHaveBeenCalledWith(args, '');
|
|
749
|
+
});
|
|
750
|
+
});
|
|
751
|
+
describe('abortAction', () => {
|
|
752
|
+
it('should abort an action with valid reference', async () => {
|
|
753
|
+
// Mock the abortAction method
|
|
754
|
+
const abortActionMock = jest.fn().mockResolvedValue({ aborted: true });
|
|
755
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
756
|
+
abortAction: abortActionMock
|
|
757
|
+
}));
|
|
758
|
+
const reference = index_1.Utils.toBase64([1, 2, 3]);
|
|
759
|
+
const args = { reference };
|
|
760
|
+
const result = await wallet.abortAction(args);
|
|
761
|
+
expect(result).toEqual({ aborted: true });
|
|
762
|
+
expect(abortActionMock).toHaveBeenCalledWith(args, '');
|
|
763
|
+
});
|
|
764
|
+
it('should throw an error with invalid reference', async () => {
|
|
765
|
+
// Mock the abortAction method to throw an error
|
|
766
|
+
const abortActionMock = jest
|
|
767
|
+
.fn()
|
|
768
|
+
.mockRejectedValue(new Error('Invalid reference'));
|
|
769
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
770
|
+
abortAction: abortActionMock
|
|
771
|
+
}));
|
|
772
|
+
const reference = '';
|
|
773
|
+
const args = { reference };
|
|
774
|
+
await expect(wallet.abortAction(args)).rejects.toThrow('Invalid reference');
|
|
775
|
+
expect(abortActionMock).toHaveBeenCalledWith(args, '');
|
|
776
|
+
});
|
|
777
|
+
});
|
|
778
|
+
describe('listActions', () => {
|
|
779
|
+
it('should list actions with valid inputs', async () => {
|
|
780
|
+
// Mock the listActions method
|
|
781
|
+
const listActionsMock = jest.fn().mockResolvedValue({
|
|
782
|
+
totalActions: 1,
|
|
783
|
+
actions: [
|
|
784
|
+
{
|
|
785
|
+
txid: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806',
|
|
786
|
+
satoshis: 1000,
|
|
787
|
+
status: 'completed',
|
|
788
|
+
isOutgoing: true,
|
|
789
|
+
description: 'Test action',
|
|
790
|
+
labels: ['test-label'],
|
|
791
|
+
version: 1,
|
|
792
|
+
lockTime: 0
|
|
793
|
+
}
|
|
794
|
+
]
|
|
795
|
+
});
|
|
796
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
797
|
+
listActions: listActionsMock
|
|
798
|
+
}));
|
|
799
|
+
const args = {
|
|
800
|
+
labels: ['test-label'],
|
|
801
|
+
includeLabels: true,
|
|
802
|
+
limit: 10,
|
|
803
|
+
offset: 0
|
|
804
|
+
};
|
|
805
|
+
const result = await wallet.listActions(args);
|
|
806
|
+
expect(result).toHaveProperty('totalActions');
|
|
807
|
+
expect(result).toHaveProperty('actions');
|
|
808
|
+
expect(Array.isArray(result.actions)).toBe(true);
|
|
809
|
+
expect(listActionsMock).toHaveBeenCalledWith(args, '');
|
|
810
|
+
});
|
|
811
|
+
it('should list actions with empty labels array', async () => {
|
|
812
|
+
// Mock the listActions method
|
|
813
|
+
const listActionsMock = jest.fn().mockResolvedValue({
|
|
814
|
+
totalActions: 0,
|
|
815
|
+
actions: []
|
|
816
|
+
});
|
|
817
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
818
|
+
listActions: listActionsMock
|
|
819
|
+
}));
|
|
820
|
+
const args = {
|
|
821
|
+
labels: [],
|
|
822
|
+
includeLabels: true,
|
|
823
|
+
limit: 10,
|
|
824
|
+
offset: 0
|
|
825
|
+
};
|
|
826
|
+
const result = await wallet.listActions(args);
|
|
827
|
+
expect(result).toHaveProperty('totalActions');
|
|
828
|
+
expect(result.totalActions).toBe(0);
|
|
829
|
+
expect(result.actions).toEqual([]);
|
|
830
|
+
expect(listActionsMock).toHaveBeenCalledWith(args, '');
|
|
831
|
+
});
|
|
832
|
+
it('should throw an error with invalid inputs', async () => {
|
|
833
|
+
// Mock the listActions method to throw an error
|
|
834
|
+
const listActionsMock = jest
|
|
835
|
+
.fn()
|
|
836
|
+
.mockRejectedValue(new Error('Invalid inputs'));
|
|
837
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
838
|
+
listActions: listActionsMock
|
|
839
|
+
}));
|
|
840
|
+
const args = {
|
|
841
|
+
labels: []
|
|
842
|
+
};
|
|
843
|
+
await expect(wallet.listActions(args)).rejects.toThrow('Invalid inputs');
|
|
844
|
+
expect(listActionsMock).toHaveBeenCalledWith(args, '');
|
|
845
|
+
});
|
|
846
|
+
});
|
|
847
|
+
describe('internalizeAction', () => {
|
|
848
|
+
it('should internalize an action with valid inputs', async () => {
|
|
849
|
+
// Mock the internalizeAction method
|
|
850
|
+
const internalizeActionMock = jest
|
|
851
|
+
.fn()
|
|
852
|
+
.mockResolvedValue({ accepted: true });
|
|
853
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
854
|
+
internalizeAction: internalizeActionMock
|
|
855
|
+
}));
|
|
856
|
+
const args = {
|
|
857
|
+
tx: [0x00], // Sample transaction byte array
|
|
858
|
+
outputs: [
|
|
859
|
+
{
|
|
860
|
+
outputIndex: 0,
|
|
861
|
+
protocol: 'wallet payment',
|
|
862
|
+
paymentRemittance: {
|
|
863
|
+
derivationPrefix: index_1.Utils.toBase64([1, 2, 3]),
|
|
864
|
+
derivationSuffix: index_1.Utils.toBase64([4, 5, 6]),
|
|
865
|
+
senderIdentityKey: '02' + '1'.repeat(64)
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
],
|
|
869
|
+
description: 'Test internalize action',
|
|
870
|
+
labels: ['test-label']
|
|
871
|
+
};
|
|
872
|
+
const result = await wallet.internalizeAction(args);
|
|
873
|
+
expect(result).toEqual({ accepted: true });
|
|
874
|
+
expect(internalizeActionMock).toHaveBeenCalledWith(args, '');
|
|
875
|
+
});
|
|
876
|
+
it('should throw an error with invalid inputs', async () => {
|
|
877
|
+
// Mock the internalizeAction method to throw an error
|
|
878
|
+
const internalizeActionMock = jest
|
|
879
|
+
.fn()
|
|
880
|
+
.mockRejectedValue(new Error('Invalid inputs'));
|
|
881
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
882
|
+
internalizeAction: internalizeActionMock
|
|
883
|
+
}));
|
|
884
|
+
const args = {
|
|
885
|
+
tx: [], // Empty transaction array
|
|
886
|
+
outputs: [],
|
|
887
|
+
description: 'Test internalize action'
|
|
888
|
+
};
|
|
889
|
+
await expect(wallet.internalizeAction(args)).rejects.toThrow('Invalid inputs');
|
|
890
|
+
expect(internalizeActionMock).toHaveBeenCalledWith(args, '');
|
|
891
|
+
});
|
|
892
|
+
it('should internalize an action with "basket insertion" protocol', async () => {
|
|
893
|
+
// Mock the internalizeAction method
|
|
894
|
+
const internalizeActionMock = jest
|
|
895
|
+
.fn()
|
|
896
|
+
.mockResolvedValue({ accepted: true });
|
|
897
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
898
|
+
internalizeAction: internalizeActionMock
|
|
899
|
+
}));
|
|
900
|
+
const args = {
|
|
901
|
+
tx: [0x00], // Sample transaction byte array
|
|
902
|
+
outputs: [
|
|
903
|
+
{
|
|
904
|
+
outputIndex: 0,
|
|
905
|
+
protocol: 'basket insertion',
|
|
906
|
+
insertionRemittance: {
|
|
907
|
+
basket: 'test-basket',
|
|
908
|
+
customInstructions: 'Test instructions',
|
|
909
|
+
tags: ['test-tag1', 'test-tag2']
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
],
|
|
913
|
+
description: 'Test internalize action with basket insertion',
|
|
914
|
+
labels: ['test-label']
|
|
915
|
+
};
|
|
916
|
+
const result = await wallet.internalizeAction(args);
|
|
917
|
+
expect(result).toEqual({ accepted: true });
|
|
918
|
+
expect(internalizeActionMock).toHaveBeenCalledWith(args, '');
|
|
919
|
+
});
|
|
920
|
+
});
|
|
921
|
+
describe('listOutputs', () => {
|
|
922
|
+
it('should list outputs with valid inputs', async () => {
|
|
923
|
+
// Mock the listOutputs method
|
|
924
|
+
const listOutputsMock = jest.fn().mockResolvedValue({
|
|
925
|
+
totalOutputs: 1,
|
|
926
|
+
outputs: [
|
|
927
|
+
{
|
|
928
|
+
outpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
929
|
+
satoshis: 1000,
|
|
930
|
+
lockingScript: '00',
|
|
931
|
+
spendable: true,
|
|
932
|
+
customInstructions: 'Test instructions',
|
|
933
|
+
tags: ['test-tag'],
|
|
934
|
+
labels: ['test-label']
|
|
935
|
+
}
|
|
936
|
+
]
|
|
937
|
+
});
|
|
938
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
939
|
+
listOutputs: listOutputsMock
|
|
940
|
+
}));
|
|
941
|
+
const args = {
|
|
942
|
+
basket: 'test-basket',
|
|
943
|
+
includeLabels: true,
|
|
944
|
+
limit: 10,
|
|
945
|
+
offset: 0
|
|
946
|
+
};
|
|
947
|
+
const result = await wallet.listOutputs(args);
|
|
948
|
+
expect(result).toHaveProperty('totalOutputs');
|
|
949
|
+
expect(result).toHaveProperty('outputs');
|
|
950
|
+
expect(Array.isArray(result.outputs)).toBe(true);
|
|
951
|
+
expect(listOutputsMock).toHaveBeenCalledWith(args, '');
|
|
952
|
+
});
|
|
953
|
+
it('should throw an error with invalid inputs', async () => {
|
|
954
|
+
// Mock the listOutputs method to throw an error
|
|
955
|
+
const listOutputsMock = jest
|
|
956
|
+
.fn()
|
|
957
|
+
.mockRejectedValue(new Error('Invalid inputs'));
|
|
958
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
959
|
+
listOutputs: listOutputsMock
|
|
960
|
+
}));
|
|
961
|
+
const args = {
|
|
962
|
+
basket: ''
|
|
963
|
+
};
|
|
964
|
+
await expect(wallet.listOutputs(args)).rejects.toThrow('Invalid inputs');
|
|
965
|
+
expect(listOutputsMock).toHaveBeenCalledWith(args, '');
|
|
966
|
+
});
|
|
967
|
+
it('should list outputs without specifying optional parameters', async () => {
|
|
968
|
+
// Mock the listOutputs method
|
|
969
|
+
const listOutputsMock = jest.fn().mockResolvedValue({
|
|
970
|
+
totalOutputs: 1,
|
|
971
|
+
BEEF: [1, 2, 3, 4],
|
|
972
|
+
outputs: [
|
|
973
|
+
{
|
|
974
|
+
outpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
975
|
+
satoshis: 1000,
|
|
976
|
+
spendable: true
|
|
977
|
+
}
|
|
978
|
+
]
|
|
979
|
+
});
|
|
980
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
981
|
+
listOutputs: listOutputsMock
|
|
982
|
+
}));
|
|
983
|
+
const args = {
|
|
984
|
+
basket: 'test-basket'
|
|
985
|
+
// Optional parameters are not specified
|
|
986
|
+
};
|
|
987
|
+
const result = await wallet.listOutputs(args);
|
|
988
|
+
expect(result).toHaveProperty('totalOutputs');
|
|
989
|
+
expect(result).toHaveProperty('outputs');
|
|
990
|
+
expect(result).toHaveProperty('BEEF');
|
|
991
|
+
expect(result.outputs[0]).toHaveProperty('outpoint');
|
|
992
|
+
expect(result.outputs[0]).toHaveProperty('satoshis');
|
|
993
|
+
expect(result.outputs[0]).toHaveProperty('spendable');
|
|
994
|
+
expect(result.outputs[0]).not.toHaveProperty('lockingScript');
|
|
995
|
+
expect(result.outputs[0]).not.toHaveProperty('customInstructions');
|
|
996
|
+
expect(result.outputs[0]).not.toHaveProperty('tags');
|
|
997
|
+
expect(result.outputs[0]).not.toHaveProperty('labels');
|
|
998
|
+
expect(listOutputsMock).toHaveBeenCalledWith(args, '');
|
|
999
|
+
});
|
|
1000
|
+
});
|
|
1001
|
+
describe('getPublicKey', () => {
|
|
1002
|
+
it('should get the identity public key', async () => {
|
|
1003
|
+
const wallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(index_1.PrivateKey.fromRandom()));
|
|
1004
|
+
const result = await wallet.getPublicKey({ identityKey: true });
|
|
1005
|
+
expect(result).toHaveProperty('publicKey');
|
|
1006
|
+
expect(typeof result.publicKey).toBe('string');
|
|
1007
|
+
expect(result.publicKey.length).toBe(66); // Compressed public key hex length
|
|
1008
|
+
});
|
|
1009
|
+
it('should get a derived public key with valid inputs', async () => {
|
|
1010
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
1011
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
1012
|
+
const wallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(userKey));
|
|
1013
|
+
const args = {
|
|
1014
|
+
protocolID: [2, 'tests'],
|
|
1015
|
+
keyID: 'test-key-id',
|
|
1016
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
1017
|
+
};
|
|
1018
|
+
const result = await wallet.getPublicKey(args);
|
|
1019
|
+
expect(result).toHaveProperty('publicKey');
|
|
1020
|
+
expect(typeof result.publicKey).toBe('string');
|
|
1021
|
+
expect(result.publicKey.length).toBe(66);
|
|
1022
|
+
});
|
|
1023
|
+
it('should get the public key with counterparty "anyone"', async () => {
|
|
1024
|
+
const wallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(index_1.PrivateKey.fromRandom()));
|
|
1025
|
+
const args = {
|
|
1026
|
+
protocolID: [1, 'testprotocol'],
|
|
1027
|
+
keyID: 'testkeyid',
|
|
1028
|
+
counterparty: 'anyone'
|
|
1029
|
+
};
|
|
1030
|
+
const result = await wallet.getPublicKey(args);
|
|
1031
|
+
expect(result).toHaveProperty('publicKey');
|
|
1032
|
+
expect(typeof result.publicKey).toBe('string');
|
|
1033
|
+
expect(result.publicKey.length).toBe(66); // Compressed public key hex length
|
|
1034
|
+
});
|
|
1035
|
+
it('should get the public key with missing optional parameters', async () => {
|
|
1036
|
+
const wallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(index_1.PrivateKey.fromRandom()));
|
|
1037
|
+
const args = {
|
|
1038
|
+
protocolID: [0, 'minimalprotocol'],
|
|
1039
|
+
keyID: 'minimalkeyid'
|
|
1040
|
+
// Missing counterparty, should default to 'self' or 'anyone' based on context
|
|
1041
|
+
};
|
|
1042
|
+
const result = await wallet.getPublicKey(args);
|
|
1043
|
+
expect(result).toHaveProperty('publicKey');
|
|
1044
|
+
expect(typeof result.publicKey).toBe('string');
|
|
1045
|
+
expect(result.publicKey.length).toBe(66);
|
|
1046
|
+
});
|
|
1047
|
+
});
|
|
1048
|
+
describe('encrypt and decrypt', () => {
|
|
1049
|
+
it('should encrypt and decrypt data correctly', async () => {
|
|
1050
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
1051
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
1052
|
+
const userWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(userKey));
|
|
1053
|
+
const counterpartyWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey));
|
|
1054
|
+
const plaintext = sampleData;
|
|
1055
|
+
const encryptArgs = {
|
|
1056
|
+
plaintext,
|
|
1057
|
+
protocolID: [2, 'tests'],
|
|
1058
|
+
keyID: 'test-key-id',
|
|
1059
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
1060
|
+
};
|
|
1061
|
+
const encryptResult = await userWallet.encrypt(encryptArgs);
|
|
1062
|
+
expect(encryptResult).toHaveProperty('ciphertext');
|
|
1063
|
+
expect(encryptResult.ciphertext).not.toEqual(plaintext);
|
|
1064
|
+
const decryptArgs = {
|
|
1065
|
+
ciphertext: encryptResult.ciphertext,
|
|
1066
|
+
protocolID: [2, 'tests'],
|
|
1067
|
+
keyID: 'test-key-id',
|
|
1068
|
+
counterparty: userKey.toPublicKey().toString()
|
|
1069
|
+
};
|
|
1070
|
+
const decryptResult = await counterpartyWallet.decrypt(decryptArgs);
|
|
1071
|
+
expect(decryptResult).toHaveProperty('plaintext');
|
|
1072
|
+
expect(decryptResult.plaintext).toEqual(plaintext);
|
|
1073
|
+
});
|
|
1074
|
+
it('should throw an error for invalid decryption inputs', async () => {
|
|
1075
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
1076
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
1077
|
+
const counterpartyWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey));
|
|
1078
|
+
const decryptArgs = {
|
|
1079
|
+
ciphertext: [0x00],
|
|
1080
|
+
protocolID: [2, 'tests'],
|
|
1081
|
+
keyID: 'test-key-id',
|
|
1082
|
+
counterparty: userKey.toPublicKey().toString()
|
|
1083
|
+
};
|
|
1084
|
+
await expect(counterpartyWallet.decrypt(decryptArgs)).rejects.toThrow();
|
|
1085
|
+
});
|
|
1086
|
+
});
|
|
1087
|
+
describe('createHmac and verifyHmac', () => {
|
|
1088
|
+
it('should create and verify HMAC correctly', async () => {
|
|
1089
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
1090
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
1091
|
+
const userWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(userKey));
|
|
1092
|
+
const counterpartyWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey));
|
|
1093
|
+
const data = sampleData;
|
|
1094
|
+
const createHmacArgs = {
|
|
1095
|
+
data,
|
|
1096
|
+
protocolID: [2, 'tests'],
|
|
1097
|
+
keyID: 'test-key-id',
|
|
1098
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
1099
|
+
};
|
|
1100
|
+
const createHmacResult = await userWallet.createHmac(createHmacArgs);
|
|
1101
|
+
expect(createHmacResult).toHaveProperty('hmac');
|
|
1102
|
+
expect(createHmacResult.hmac.length).toBe(32);
|
|
1103
|
+
const verifyHmacArgs = {
|
|
1104
|
+
data,
|
|
1105
|
+
hmac: createHmacResult.hmac,
|
|
1106
|
+
protocolID: [2, 'tests'],
|
|
1107
|
+
keyID: 'test-key-id',
|
|
1108
|
+
counterparty: userKey.toPublicKey().toString()
|
|
1109
|
+
};
|
|
1110
|
+
const verifyHmacResult = await counterpartyWallet.verifyHmac(verifyHmacArgs);
|
|
1111
|
+
expect(verifyHmacResult).toEqual({ valid: true });
|
|
1112
|
+
});
|
|
1113
|
+
it('should throw an error for invalid HMAC verification', async () => {
|
|
1114
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
1115
|
+
const counterpartyWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(index_1.PrivateKey.fromRandom()));
|
|
1116
|
+
const verifyHmacArgs = {
|
|
1117
|
+
data: sampleData,
|
|
1118
|
+
hmac: [0x00],
|
|
1119
|
+
protocolID: [2, 'tests'],
|
|
1120
|
+
keyID: 'test-key-id',
|
|
1121
|
+
counterparty: userKey.toPublicKey().toString()
|
|
1122
|
+
};
|
|
1123
|
+
await expect(counterpartyWallet.verifyHmac(verifyHmacArgs)).rejects.toThrow();
|
|
1124
|
+
});
|
|
1125
|
+
});
|
|
1126
|
+
describe('createSignature and verifySignature', () => {
|
|
1127
|
+
it('should create and verify signature correctly', async () => {
|
|
1128
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
1129
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
1130
|
+
const userWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(userKey));
|
|
1131
|
+
const counterpartyWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(counterpartyKey));
|
|
1132
|
+
const data = sampleData;
|
|
1133
|
+
const createSignatureArgs = {
|
|
1134
|
+
data,
|
|
1135
|
+
protocolID: [2, 'tests'],
|
|
1136
|
+
keyID: 'test-key-id',
|
|
1137
|
+
counterparty: counterpartyKey.toPublicKey().toString()
|
|
1138
|
+
};
|
|
1139
|
+
const createSignatureResult = await userWallet.createSignature(createSignatureArgs);
|
|
1140
|
+
expect(createSignatureResult).toHaveProperty('signature');
|
|
1141
|
+
expect(createSignatureResult.signature.length).toBeGreaterThan(0);
|
|
1142
|
+
const verifySignatureArgs = {
|
|
1143
|
+
data,
|
|
1144
|
+
signature: createSignatureResult.signature,
|
|
1145
|
+
protocolID: [2, 'tests'],
|
|
1146
|
+
keyID: 'test-key-id',
|
|
1147
|
+
counterparty: userKey.toPublicKey().toString()
|
|
1148
|
+
};
|
|
1149
|
+
const verifySignatureResult = await counterpartyWallet.verifySignature(verifySignatureArgs);
|
|
1150
|
+
expect(verifySignatureResult).toEqual({ valid: true });
|
|
1151
|
+
});
|
|
1152
|
+
it('should throw an error for invalid signature verification', async () => {
|
|
1153
|
+
const userKey = index_1.PrivateKey.fromRandom();
|
|
1154
|
+
const counterpartyWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(index_1.PrivateKey.fromRandom()));
|
|
1155
|
+
const verifySignatureArgs = {
|
|
1156
|
+
data: sampleData,
|
|
1157
|
+
signature: [0x00],
|
|
1158
|
+
protocolID: [2, 'tests'],
|
|
1159
|
+
keyID: 'test-key-id',
|
|
1160
|
+
counterparty: userKey.toPublicKey().toString()
|
|
1161
|
+
};
|
|
1162
|
+
await expect(counterpartyWallet.verifySignature(verifySignatureArgs)).rejects.toThrow();
|
|
1163
|
+
});
|
|
1164
|
+
});
|
|
1165
|
+
describe('revealCounterpartyKeyLinkage', () => {
|
|
1166
|
+
it('should reveal counterparty key linkage correctly', async () => {
|
|
1167
|
+
const proverKey = index_1.PrivateKey.fromRandom();
|
|
1168
|
+
const counterpartyKey = index_1.PrivateKey.fromRandom();
|
|
1169
|
+
const verifierKey = index_1.PrivateKey.fromRandom();
|
|
1170
|
+
const proverWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(proverKey));
|
|
1171
|
+
const verifierWallet = createTestWalletWire(new CompletedProtoWallet_1.CompletedProtoWallet(verifierKey));
|
|
1172
|
+
const args = {
|
|
1173
|
+
counterparty: counterpartyKey.toPublicKey().toString(),
|
|
1174
|
+
verifier: verifierKey.toPublicKey().toString()
|
|
1175
|
+
};
|
|
1176
|
+
const revelation = await proverWallet.revealCounterpartyKeyLinkage(args);
|
|
1177
|
+
expect(revelation.encryptedLinkageProof).toBeDefined();
|
|
1178
|
+
const decryptArgs = {
|
|
1179
|
+
ciphertext: revelation.encryptedLinkage,
|
|
1180
|
+
protocolID: [2, 'counterparty linkage revelation'],
|
|
1181
|
+
keyID: revelation.revelationTime,
|
|
1182
|
+
counterparty: proverKey.toPublicKey().toString()
|
|
1183
|
+
};
|
|
1184
|
+
const decryptedResult = await verifierWallet.decrypt(decryptArgs);
|
|
1185
|
+
const expectedLinkage = proverKey
|
|
1186
|
+
.deriveSharedSecret(counterpartyKey.toPublicKey())
|
|
1187
|
+
.encode(true);
|
|
1188
|
+
expect(decryptedResult.plaintext).toEqual(expectedLinkage);
|
|
1189
|
+
});
|
|
1190
|
+
});
|
|
1191
|
+
describe('acquireCertificate', () => {
|
|
1192
|
+
it('should acquire a certificate with valid inputs', async () => {
|
|
1193
|
+
// Mock the acquireCertificate method
|
|
1194
|
+
const acquireCertificateMock = jest.fn().mockResolvedValue({
|
|
1195
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1196
|
+
subject: '02' + 'a'.repeat(64),
|
|
1197
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1198
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1199
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1200
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1201
|
+
fields: {
|
|
1202
|
+
field1: 'value1',
|
|
1203
|
+
field2: 'value2'
|
|
1204
|
+
}
|
|
1205
|
+
});
|
|
1206
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1207
|
+
acquireCertificate: acquireCertificateMock
|
|
1208
|
+
}));
|
|
1209
|
+
const args = {
|
|
1210
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1211
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1212
|
+
acquisitionProtocol: 'direct',
|
|
1213
|
+
fields: {
|
|
1214
|
+
field1: 'value1',
|
|
1215
|
+
field2: 'value2'
|
|
1216
|
+
},
|
|
1217
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1218
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1219
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1220
|
+
keyringRevealer: 'certifier',
|
|
1221
|
+
keyringForSubject: {}
|
|
1222
|
+
};
|
|
1223
|
+
const result = await wallet.acquireCertificate(args);
|
|
1224
|
+
expect(result).toHaveProperty('type');
|
|
1225
|
+
expect(result).toHaveProperty('subject');
|
|
1226
|
+
expect(result).toHaveProperty('serialNumber');
|
|
1227
|
+
expect(result).toHaveProperty('certifier');
|
|
1228
|
+
expect(result).toHaveProperty('revocationOutpoint');
|
|
1229
|
+
expect(result).toHaveProperty('signature');
|
|
1230
|
+
expect(result).toHaveProperty('fields');
|
|
1231
|
+
expect(acquireCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1232
|
+
});
|
|
1233
|
+
it('should acquire a certificate using acquisitionProtocol "direct" with keyringRevealer as "certifier"', async () => {
|
|
1234
|
+
// Mock the acquireCertificate method
|
|
1235
|
+
const acquireCertificateMock = jest.fn().mockResolvedValue({
|
|
1236
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1237
|
+
subject: '02' + 'a'.repeat(64),
|
|
1238
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1239
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1240
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1241
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1242
|
+
fields: {
|
|
1243
|
+
field1: 'value1',
|
|
1244
|
+
field2: 'value2'
|
|
1245
|
+
}
|
|
1246
|
+
});
|
|
1247
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1248
|
+
acquireCertificate: acquireCertificateMock
|
|
1249
|
+
}));
|
|
1250
|
+
const args = {
|
|
1251
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1252
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1253
|
+
acquisitionProtocol: 'direct',
|
|
1254
|
+
fields: {
|
|
1255
|
+
field1: 'value1',
|
|
1256
|
+
field2: 'value2'
|
|
1257
|
+
},
|
|
1258
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1259
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1260
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1261
|
+
keyringRevealer: 'certifier',
|
|
1262
|
+
keyringForSubject: {
|
|
1263
|
+
field1: index_1.Utils.toBase64([0x01, 0x02, 0x03]),
|
|
1264
|
+
field2: index_1.Utils.toBase64([0x04, 0x05, 0x06])
|
|
1265
|
+
}
|
|
1266
|
+
};
|
|
1267
|
+
const result = await wallet.acquireCertificate(args);
|
|
1268
|
+
expect(result).toHaveProperty('type');
|
|
1269
|
+
expect(result).toHaveProperty('subject');
|
|
1270
|
+
expect(result).toHaveProperty('serialNumber');
|
|
1271
|
+
expect(result).toHaveProperty('certifier');
|
|
1272
|
+
expect(result).toHaveProperty('revocationOutpoint');
|
|
1273
|
+
expect(result).toHaveProperty('signature');
|
|
1274
|
+
expect(result).toHaveProperty('fields');
|
|
1275
|
+
expect(acquireCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1276
|
+
});
|
|
1277
|
+
it('should acquire a certificate using acquisitionProtocol "direct" with keyringRevealer as PubKeyHex', async () => {
|
|
1278
|
+
// Mock the acquireCertificate method
|
|
1279
|
+
const acquireCertificateMock = jest.fn().mockResolvedValue({
|
|
1280
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1281
|
+
subject: '02' + 'a'.repeat(64),
|
|
1282
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1283
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1284
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1285
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1286
|
+
fields: {
|
|
1287
|
+
field1: 'value1',
|
|
1288
|
+
field2: 'value2'
|
|
1289
|
+
}
|
|
1290
|
+
});
|
|
1291
|
+
const keyringRevealerPubKey = '02' + 'c'.repeat(64);
|
|
1292
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1293
|
+
acquireCertificate: acquireCertificateMock
|
|
1294
|
+
}));
|
|
1295
|
+
const args = {
|
|
1296
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1297
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1298
|
+
acquisitionProtocol: 'direct',
|
|
1299
|
+
fields: {
|
|
1300
|
+
field1: 'value1',
|
|
1301
|
+
field2: 'value2'
|
|
1302
|
+
},
|
|
1303
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1304
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1305
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1306
|
+
keyringRevealer: keyringRevealerPubKey,
|
|
1307
|
+
keyringForSubject: {
|
|
1308
|
+
field1: index_1.Utils.toBase64([0x01, 0x02, 0x03]),
|
|
1309
|
+
field2: index_1.Utils.toBase64([0x04, 0x05, 0x06])
|
|
1310
|
+
}
|
|
1311
|
+
};
|
|
1312
|
+
const result = await wallet.acquireCertificate(args);
|
|
1313
|
+
expect(result).toHaveProperty('type');
|
|
1314
|
+
expect(result).toHaveProperty('subject');
|
|
1315
|
+
expect(result).toHaveProperty('serialNumber');
|
|
1316
|
+
expect(result).toHaveProperty('certifier');
|
|
1317
|
+
expect(result).toHaveProperty('revocationOutpoint');
|
|
1318
|
+
expect(result).toHaveProperty('signature');
|
|
1319
|
+
expect(result).toHaveProperty('fields');
|
|
1320
|
+
expect(acquireCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1321
|
+
});
|
|
1322
|
+
it('should acquire a certificate using acquisitionProtocol "issuance"', async () => {
|
|
1323
|
+
// Mock the acquireCertificate method
|
|
1324
|
+
const acquireCertificateMock = jest.fn().mockResolvedValue({
|
|
1325
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1326
|
+
subject: '02' + 'd'.repeat(64),
|
|
1327
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1328
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1329
|
+
revocationOutpoint: 'cafebabedeadbeefcafebabedeadbeefdeadbeefdeadbeefdeadbeefdeadbeef.1',
|
|
1330
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1331
|
+
fields: {
|
|
1332
|
+
field3: 'value3',
|
|
1333
|
+
field4: 'value4'
|
|
1334
|
+
}
|
|
1335
|
+
});
|
|
1336
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1337
|
+
acquireCertificate: acquireCertificateMock
|
|
1338
|
+
}));
|
|
1339
|
+
const args = {
|
|
1340
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1341
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1342
|
+
acquisitionProtocol: 'issuance',
|
|
1343
|
+
fields: {
|
|
1344
|
+
field3: 'value3',
|
|
1345
|
+
field4: 'value4'
|
|
1346
|
+
},
|
|
1347
|
+
certifierUrl: 'https://certifier.example.com/api/issue'
|
|
1348
|
+
};
|
|
1349
|
+
const result = await wallet.acquireCertificate(args);
|
|
1350
|
+
expect(result).toHaveProperty('type');
|
|
1351
|
+
expect(result).toHaveProperty('subject');
|
|
1352
|
+
expect(result).toHaveProperty('serialNumber');
|
|
1353
|
+
expect(result).toHaveProperty('certifier');
|
|
1354
|
+
expect(result).toHaveProperty('revocationOutpoint');
|
|
1355
|
+
expect(result).toHaveProperty('signature');
|
|
1356
|
+
expect(result).toHaveProperty('fields');
|
|
1357
|
+
expect(acquireCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1358
|
+
});
|
|
1359
|
+
it('should handle optional keyringForSubject being empty in "direct" protocol', async () => {
|
|
1360
|
+
// Mock the acquireCertificate method
|
|
1361
|
+
const acquireCertificateMock = jest.fn().mockResolvedValue({
|
|
1362
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1363
|
+
subject: '02' + 'e'.repeat(64),
|
|
1364
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1365
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1366
|
+
revocationOutpoint: 'beadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbead.2',
|
|
1367
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1368
|
+
fields: {
|
|
1369
|
+
field5: 'value5'
|
|
1370
|
+
}
|
|
1371
|
+
});
|
|
1372
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1373
|
+
acquireCertificate: acquireCertificateMock
|
|
1374
|
+
}));
|
|
1375
|
+
const args = {
|
|
1376
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1377
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1378
|
+
acquisitionProtocol: 'direct',
|
|
1379
|
+
fields: {
|
|
1380
|
+
field5: 'value5'
|
|
1381
|
+
},
|
|
1382
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1383
|
+
revocationOutpoint: 'beadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbead.2',
|
|
1384
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1385
|
+
keyringRevealer: 'certifier',
|
|
1386
|
+
keyringForSubject: {} // Empty keyring
|
|
1387
|
+
};
|
|
1388
|
+
const result = await wallet.acquireCertificate(args);
|
|
1389
|
+
expect(result).toHaveProperty('type');
|
|
1390
|
+
expect(result).toHaveProperty('subject');
|
|
1391
|
+
expect(result).toHaveProperty('serialNumber');
|
|
1392
|
+
expect(result).toHaveProperty('certifier');
|
|
1393
|
+
expect(result).toHaveProperty('revocationOutpoint');
|
|
1394
|
+
expect(result).toHaveProperty('signature');
|
|
1395
|
+
expect(result).toHaveProperty('fields');
|
|
1396
|
+
expect(result.fields).toEqual({ field5: 'value5' });
|
|
1397
|
+
expect(acquireCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1398
|
+
});
|
|
1399
|
+
});
|
|
1400
|
+
describe('listCertificates', () => {
|
|
1401
|
+
it('should list certificates with valid inputs', async () => {
|
|
1402
|
+
// Mock the listCertificates method
|
|
1403
|
+
const listCertificatesMock = jest.fn().mockResolvedValue({
|
|
1404
|
+
totalCertificates: 1,
|
|
1405
|
+
certificates: [
|
|
1406
|
+
{
|
|
1407
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1408
|
+
subject: '02' + 'a'.repeat(64),
|
|
1409
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1410
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1411
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1412
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1413
|
+
fields: {
|
|
1414
|
+
field1: 'value1',
|
|
1415
|
+
field2: 'value2'
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
]
|
|
1419
|
+
});
|
|
1420
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1421
|
+
listCertificates: listCertificatesMock
|
|
1422
|
+
}));
|
|
1423
|
+
const args = {
|
|
1424
|
+
certifiers: ['02' + 'b'.repeat(64)],
|
|
1425
|
+
types: [index_1.Utils.toBase64(new Array(32).fill(1))],
|
|
1426
|
+
limit: 10,
|
|
1427
|
+
offset: 0
|
|
1428
|
+
};
|
|
1429
|
+
const result = await wallet.listCertificates(args);
|
|
1430
|
+
expect(result).toHaveProperty('totalCertificates');
|
|
1431
|
+
expect(result).toHaveProperty('certificates');
|
|
1432
|
+
expect(Array.isArray(result.certificates)).toBe(true);
|
|
1433
|
+
expect(listCertificatesMock).toHaveBeenCalledWith(args, '');
|
|
1434
|
+
});
|
|
1435
|
+
it('should list certificates with multiple fields in each certificate', async () => {
|
|
1436
|
+
// Mock the listCertificates method
|
|
1437
|
+
const listCertificatesMock = jest.fn().mockResolvedValue({
|
|
1438
|
+
totalCertificates: 2,
|
|
1439
|
+
certificates: [
|
|
1440
|
+
{
|
|
1441
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1442
|
+
subject: '02' + 'a'.repeat(64),
|
|
1443
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1444
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1445
|
+
revocationOutpoint: 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef.0',
|
|
1446
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1447
|
+
fields: {
|
|
1448
|
+
field1: 'value1',
|
|
1449
|
+
field2: 'value2'
|
|
1450
|
+
}
|
|
1451
|
+
},
|
|
1452
|
+
{
|
|
1453
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1454
|
+
subject: '02' + 'c'.repeat(64),
|
|
1455
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1456
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1457
|
+
revocationOutpoint: 'cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe.1',
|
|
1458
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1459
|
+
fields: {
|
|
1460
|
+
field3: 'value3',
|
|
1461
|
+
field4: 'value4',
|
|
1462
|
+
field5: 'value5'
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
]
|
|
1466
|
+
});
|
|
1467
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1468
|
+
listCertificates: listCertificatesMock
|
|
1469
|
+
}));
|
|
1470
|
+
const args = {
|
|
1471
|
+
certifiers: ['02' + 'b'.repeat(64)],
|
|
1472
|
+
types: [
|
|
1473
|
+
index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1474
|
+
index_1.Utils.toBase64(new Array(32).fill(2))
|
|
1475
|
+
],
|
|
1476
|
+
limit: 10,
|
|
1477
|
+
offset: 0
|
|
1478
|
+
};
|
|
1479
|
+
const result = await wallet.listCertificates(args);
|
|
1480
|
+
expect(result).toHaveProperty('totalCertificates', 2);
|
|
1481
|
+
expect(result.certificates.length).toBe(2);
|
|
1482
|
+
expect(result.certificates[0].fields).toEqual({
|
|
1483
|
+
field1: 'value1',
|
|
1484
|
+
field2: 'value2'
|
|
1485
|
+
});
|
|
1486
|
+
expect(result.certificates[1].fields).toEqual({
|
|
1487
|
+
field3: 'value3',
|
|
1488
|
+
field4: 'value4',
|
|
1489
|
+
field5: 'value5'
|
|
1490
|
+
});
|
|
1491
|
+
expect(listCertificatesMock).toHaveBeenCalledWith(args, '');
|
|
1492
|
+
});
|
|
1493
|
+
it('should list certificates when privileged is true', async () => {
|
|
1494
|
+
// Mock the listCertificates method
|
|
1495
|
+
const listCertificatesMock = jest.fn().mockResolvedValue({
|
|
1496
|
+
totalCertificates: 1,
|
|
1497
|
+
certificates: [
|
|
1498
|
+
{
|
|
1499
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1500
|
+
subject: '02' + 'd'.repeat(64),
|
|
1501
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1502
|
+
certifier: '02' + 'e'.repeat(64),
|
|
1503
|
+
revocationOutpoint: 'cafecafecafecafecafecafecafecafecafecafecafecafecafecafecafecafe.2',
|
|
1504
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1505
|
+
fields: {
|
|
1506
|
+
field6: 'value6'
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
]
|
|
1510
|
+
});
|
|
1511
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1512
|
+
listCertificates: listCertificatesMock
|
|
1513
|
+
}));
|
|
1514
|
+
const args = {
|
|
1515
|
+
certifiers: ['02' + 'e'.repeat(64)],
|
|
1516
|
+
types: [index_1.Utils.toBase64(new Array(32).fill(1))],
|
|
1517
|
+
limit: 10,
|
|
1518
|
+
offset: 0,
|
|
1519
|
+
privileged: true,
|
|
1520
|
+
privilegedReason: 'Testing privileged access'
|
|
1521
|
+
};
|
|
1522
|
+
const result = await wallet.listCertificates(args);
|
|
1523
|
+
expect(result).toHaveProperty('totalCertificates', 1);
|
|
1524
|
+
expect(result.certificates[0].fields).toEqual({ field6: 'value6' });
|
|
1525
|
+
expect(listCertificatesMock).toHaveBeenCalledWith(args, '');
|
|
1526
|
+
});
|
|
1527
|
+
});
|
|
1528
|
+
describe('proveCertificate', () => {
|
|
1529
|
+
it('should prove a certificate with valid inputs', async () => {
|
|
1530
|
+
// Mock the proveCertificate method
|
|
1531
|
+
const proveCertificateMock = jest.fn().mockResolvedValue({
|
|
1532
|
+
keyringForVerifier: {
|
|
1533
|
+
field1: index_1.Utils.toBase64([0x01, 0x02, 0x03]),
|
|
1534
|
+
field2: index_1.Utils.toBase64([0x04, 0x05, 0x06])
|
|
1535
|
+
}
|
|
1536
|
+
});
|
|
1537
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1538
|
+
proveCertificate: proveCertificateMock
|
|
1539
|
+
}));
|
|
1540
|
+
const args = {
|
|
1541
|
+
certificate: {
|
|
1542
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1543
|
+
subject: '02' + 'a'.repeat(64),
|
|
1544
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1545
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1546
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1547
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1548
|
+
fields: {
|
|
1549
|
+
field1: 'value1',
|
|
1550
|
+
field2: 'value2'
|
|
1551
|
+
}
|
|
1552
|
+
},
|
|
1553
|
+
fieldsToReveal: ['field1'],
|
|
1554
|
+
verifier: '02' + 'c'.repeat(64)
|
|
1555
|
+
};
|
|
1556
|
+
const result = await wallet.proveCertificate(args);
|
|
1557
|
+
expect(result).toHaveProperty('keyringForVerifier');
|
|
1558
|
+
expect(proveCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1559
|
+
});
|
|
1560
|
+
it('should prove a certificate revealing multiple fields', async () => {
|
|
1561
|
+
// Mock the proveCertificate method
|
|
1562
|
+
const proveCertificateMock = jest.fn().mockResolvedValue({
|
|
1563
|
+
keyringForVerifier: {
|
|
1564
|
+
field1: index_1.Utils.toBase64([0x01, 0x02, 0x03]),
|
|
1565
|
+
field2: index_1.Utils.toBase64([0x04, 0x05, 0x06])
|
|
1566
|
+
}
|
|
1567
|
+
});
|
|
1568
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1569
|
+
proveCertificate: proveCertificateMock
|
|
1570
|
+
}));
|
|
1571
|
+
const args = {
|
|
1572
|
+
certificate: {
|
|
1573
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1574
|
+
subject: '02' + 'a'.repeat(64),
|
|
1575
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1576
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1577
|
+
revocationOutpoint: 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef.0',
|
|
1578
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1579
|
+
fields: {
|
|
1580
|
+
field1: 'value1',
|
|
1581
|
+
field2: 'value2',
|
|
1582
|
+
field3: 'value3'
|
|
1583
|
+
}
|
|
1584
|
+
},
|
|
1585
|
+
fieldsToReveal: ['field1', 'field2'],
|
|
1586
|
+
verifier: '02' + 'f'.repeat(64)
|
|
1587
|
+
};
|
|
1588
|
+
const result = await wallet.proveCertificate(args);
|
|
1589
|
+
expect(result).toHaveProperty('keyringForVerifier');
|
|
1590
|
+
expect(Object.keys(result.keyringForVerifier)).toEqual([
|
|
1591
|
+
'field1',
|
|
1592
|
+
'field2'
|
|
1593
|
+
]);
|
|
1594
|
+
expect(proveCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1595
|
+
});
|
|
1596
|
+
it('should handle empty fieldsToReveal array (no fields revealed)', async () => {
|
|
1597
|
+
// Mock the proveCertificate method
|
|
1598
|
+
const proveCertificateMock = jest.fn().mockResolvedValue({
|
|
1599
|
+
keyringForVerifier: {}
|
|
1600
|
+
});
|
|
1601
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1602
|
+
proveCertificate: proveCertificateMock
|
|
1603
|
+
}));
|
|
1604
|
+
const args = {
|
|
1605
|
+
certificate: {
|
|
1606
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1607
|
+
subject: '02' + 'a'.repeat(64),
|
|
1608
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1609
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1610
|
+
revocationOutpoint: 'cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe.1',
|
|
1611
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1612
|
+
fields: {
|
|
1613
|
+
field4: 'value4',
|
|
1614
|
+
field5: 'value5'
|
|
1615
|
+
}
|
|
1616
|
+
},
|
|
1617
|
+
fieldsToReveal: [],
|
|
1618
|
+
verifier: '02' + 'f'.repeat(64)
|
|
1619
|
+
};
|
|
1620
|
+
const result = await wallet.proveCertificate(args);
|
|
1621
|
+
expect(result).toHaveProperty('keyringForVerifier');
|
|
1622
|
+
expect(Object.keys(result.keyringForVerifier).length).toBe(0);
|
|
1623
|
+
expect(proveCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1624
|
+
});
|
|
1625
|
+
});
|
|
1626
|
+
describe('relinquishCertificate', () => {
|
|
1627
|
+
it('should relinquish a certificate with valid inputs', async () => {
|
|
1628
|
+
// Mock the relinquishCertificate method
|
|
1629
|
+
const relinquishCertificateMock = jest
|
|
1630
|
+
.fn()
|
|
1631
|
+
.mockResolvedValue({ relinquished: true });
|
|
1632
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1633
|
+
relinquishCertificate: relinquishCertificateMock
|
|
1634
|
+
}));
|
|
1635
|
+
const args = {
|
|
1636
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1637
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1638
|
+
certifier: '02' + 'b'.repeat(64)
|
|
1639
|
+
};
|
|
1640
|
+
const result = await wallet.relinquishCertificate(args);
|
|
1641
|
+
expect(result).toEqual({ relinquished: true });
|
|
1642
|
+
expect(relinquishCertificateMock).toHaveBeenCalledWith(args, '');
|
|
1643
|
+
});
|
|
1644
|
+
});
|
|
1645
|
+
describe('getHeight and getHeaderForHeight', () => {
|
|
1646
|
+
it('should get the current blockchain height', async () => {
|
|
1647
|
+
// Mock the getHeight method
|
|
1648
|
+
const getHeightMock = jest.fn().mockResolvedValue({ height: 680000 });
|
|
1649
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1650
|
+
getHeight: getHeightMock
|
|
1651
|
+
}));
|
|
1652
|
+
const result = await wallet.getHeight({});
|
|
1653
|
+
expect(result).toHaveProperty('height');
|
|
1654
|
+
expect(typeof result.height).toBe('number');
|
|
1655
|
+
expect(result.height).toBeGreaterThan(0);
|
|
1656
|
+
expect(getHeightMock).toHaveBeenCalledWith({}, '');
|
|
1657
|
+
});
|
|
1658
|
+
it('should throw an error when getHeight fails', async () => {
|
|
1659
|
+
// Mock the getHeight method to throw an error
|
|
1660
|
+
const getHeightMock = jest
|
|
1661
|
+
.fn()
|
|
1662
|
+
.mockRejectedValue(new Error('Failed to get height'));
|
|
1663
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1664
|
+
getHeight: getHeightMock
|
|
1665
|
+
}));
|
|
1666
|
+
await expect(wallet.getHeight({})).rejects.toThrow('Failed to get height');
|
|
1667
|
+
expect(getHeightMock).toHaveBeenCalledWith({}, '');
|
|
1668
|
+
});
|
|
1669
|
+
it('should get the header for a given height', async () => {
|
|
1670
|
+
// Mock the getHeaderForHeight method
|
|
1671
|
+
const getHeaderForHeightMock = jest.fn().mockResolvedValue({
|
|
1672
|
+
header: '00' + 'ff'.repeat(79)
|
|
1673
|
+
});
|
|
1674
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1675
|
+
getHeaderForHeight: getHeaderForHeightMock
|
|
1676
|
+
}));
|
|
1677
|
+
const args = { height: 680000 };
|
|
1678
|
+
const result = await wallet.getHeaderForHeight(args);
|
|
1679
|
+
expect(result).toHaveProperty('header');
|
|
1680
|
+
expect(typeof result.header).toBe('string');
|
|
1681
|
+
expect(result.header.length).toBe(80 * 2); // 80 bytes in hex
|
|
1682
|
+
expect(getHeaderForHeightMock).toHaveBeenCalledWith(args, '');
|
|
1683
|
+
});
|
|
1684
|
+
it('should throw an error when getHeaderForHeight fails', async () => {
|
|
1685
|
+
// Mock the getHeaderForHeight method to throw an error
|
|
1686
|
+
const getHeaderForHeightMock = jest
|
|
1687
|
+
.fn()
|
|
1688
|
+
.mockRejectedValue(new Error('Failed to get header'));
|
|
1689
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1690
|
+
getHeaderForHeight: getHeaderForHeightMock
|
|
1691
|
+
}));
|
|
1692
|
+
const args = { height: -1 }; // Invalid height
|
|
1693
|
+
await expect(wallet.getHeaderForHeight(args)).rejects.toThrow('Failed to get header');
|
|
1694
|
+
expect(getHeaderForHeightMock).toHaveBeenCalledWith(args, '');
|
|
1695
|
+
});
|
|
1696
|
+
});
|
|
1697
|
+
describe('discoverByIdentityKey', () => {
|
|
1698
|
+
it('should discover certificates by identity key with valid inputs', async () => {
|
|
1699
|
+
// Mock the discoverByIdentityKey method
|
|
1700
|
+
const discoverByIdentityKeyMock = jest.fn().mockResolvedValue({
|
|
1701
|
+
totalCertificates: 1,
|
|
1702
|
+
certificates: [
|
|
1703
|
+
{
|
|
1704
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1705
|
+
subject: '02' + 'a'.repeat(64),
|
|
1706
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1707
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1708
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1709
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1710
|
+
fields: {},
|
|
1711
|
+
certifierInfo: {
|
|
1712
|
+
name: 'Test Certifier',
|
|
1713
|
+
iconUrl: 'https://example.com/icon.png',
|
|
1714
|
+
description: 'Test description',
|
|
1715
|
+
trust: 5
|
|
1716
|
+
},
|
|
1717
|
+
publiclyRevealedKeyring: {},
|
|
1718
|
+
decryptedFields: {}
|
|
1719
|
+
}
|
|
1720
|
+
]
|
|
1721
|
+
});
|
|
1722
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1723
|
+
discoverByIdentityKey: discoverByIdentityKeyMock
|
|
1724
|
+
}));
|
|
1725
|
+
const args = {
|
|
1726
|
+
identityKey: '02' + 'a'.repeat(64),
|
|
1727
|
+
limit: 10,
|
|
1728
|
+
offset: 0
|
|
1729
|
+
};
|
|
1730
|
+
const result = await wallet.discoverByIdentityKey(args);
|
|
1731
|
+
expect(result).toHaveProperty('totalCertificates');
|
|
1732
|
+
expect(result).toHaveProperty('certificates');
|
|
1733
|
+
expect(Array.isArray(result.certificates)).toBe(true);
|
|
1734
|
+
expect(discoverByIdentityKeyMock).toHaveBeenCalledWith(args, '');
|
|
1735
|
+
});
|
|
1736
|
+
it('should discover certificates with empty decryptedFields and publiclyRevealedKeyring', async () => {
|
|
1737
|
+
// Mock the discoverByIdentityKey method
|
|
1738
|
+
const discoverByIdentityKeyMock = jest.fn().mockResolvedValue({
|
|
1739
|
+
totalCertificates: 1,
|
|
1740
|
+
certificates: [
|
|
1741
|
+
{
|
|
1742
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1743
|
+
subject: '02' + 'a'.repeat(64),
|
|
1744
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1745
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1746
|
+
revocationOutpoint: 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef.0',
|
|
1747
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1748
|
+
fields: {},
|
|
1749
|
+
certifierInfo: {
|
|
1750
|
+
name: 'Test Certifier',
|
|
1751
|
+
iconUrl: 'https://example.com/icon.png',
|
|
1752
|
+
description: 'Test description',
|
|
1753
|
+
trust: 5
|
|
1754
|
+
},
|
|
1755
|
+
publiclyRevealedKeyring: {},
|
|
1756
|
+
decryptedFields: {}
|
|
1757
|
+
}
|
|
1758
|
+
]
|
|
1759
|
+
});
|
|
1760
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1761
|
+
discoverByIdentityKey: discoverByIdentityKeyMock
|
|
1762
|
+
}));
|
|
1763
|
+
const args = {
|
|
1764
|
+
identityKey: '02' + 'a'.repeat(64),
|
|
1765
|
+
limit: 10,
|
|
1766
|
+
offset: 0
|
|
1767
|
+
};
|
|
1768
|
+
const result = await wallet.discoverByIdentityKey(args);
|
|
1769
|
+
expect(result).toHaveProperty('totalCertificates');
|
|
1770
|
+
expect(result.certificates.length).toBe(1);
|
|
1771
|
+
expect(result.certificates[0].publiclyRevealedKeyring).toEqual({});
|
|
1772
|
+
expect(result.certificates[0].decryptedFields).toEqual({});
|
|
1773
|
+
expect(discoverByIdentityKeyMock).toHaveBeenCalledWith(args, '');
|
|
1774
|
+
});
|
|
1775
|
+
it('should discover multiple certificates with varying fields', async () => {
|
|
1776
|
+
// Mock the discoverByIdentityKey method
|
|
1777
|
+
const discoverByIdentityKeyMock = jest.fn().mockResolvedValue({
|
|
1778
|
+
totalCertificates: 2,
|
|
1779
|
+
certificates: [
|
|
1780
|
+
{
|
|
1781
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1782
|
+
subject: '02' + 'a'.repeat(64),
|
|
1783
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1784
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1785
|
+
revocationOutpoint: 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef.0',
|
|
1786
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1787
|
+
fields: {},
|
|
1788
|
+
certifierInfo: {
|
|
1789
|
+
name: 'Certifier One',
|
|
1790
|
+
iconUrl: 'https://example.com/icon1.png',
|
|
1791
|
+
description: 'First certifier',
|
|
1792
|
+
trust: 5
|
|
1793
|
+
},
|
|
1794
|
+
publiclyRevealedKeyring: {
|
|
1795
|
+
field1: index_1.Utils.toBase64([0x01])
|
|
1796
|
+
},
|
|
1797
|
+
decryptedFields: {
|
|
1798
|
+
fieldA: 'decryptedValueA'
|
|
1799
|
+
}
|
|
1800
|
+
},
|
|
1801
|
+
{
|
|
1802
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1803
|
+
subject: '02' + 'a'.repeat(64),
|
|
1804
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1805
|
+
certifier: '02' + 'c'.repeat(64),
|
|
1806
|
+
revocationOutpoint: 'cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe.1',
|
|
1807
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1808
|
+
fields: {},
|
|
1809
|
+
certifierInfo: {
|
|
1810
|
+
name: 'Certifier Two',
|
|
1811
|
+
iconUrl: 'https://example.com/icon2.png',
|
|
1812
|
+
description: 'Second certifier',
|
|
1813
|
+
trust: 7
|
|
1814
|
+
},
|
|
1815
|
+
publiclyRevealedKeyring: {},
|
|
1816
|
+
decryptedFields: {
|
|
1817
|
+
fieldB: 'decryptedValueB',
|
|
1818
|
+
fieldC: 'decryptedValueC'
|
|
1819
|
+
}
|
|
1820
|
+
}
|
|
1821
|
+
]
|
|
1822
|
+
});
|
|
1823
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1824
|
+
discoverByIdentityKey: discoverByIdentityKeyMock
|
|
1825
|
+
}));
|
|
1826
|
+
const args = {
|
|
1827
|
+
identityKey: '02' + 'a'.repeat(64),
|
|
1828
|
+
limit: 10,
|
|
1829
|
+
offset: 0
|
|
1830
|
+
};
|
|
1831
|
+
const result = await wallet.discoverByIdentityKey(args);
|
|
1832
|
+
expect(result).toHaveProperty('totalCertificates', 2);
|
|
1833
|
+
expect(result.certificates.length).toBe(2);
|
|
1834
|
+
expect(result.certificates[0].certifierInfo.name).toBe('Certifier One');
|
|
1835
|
+
expect(result.certificates[1].certifierInfo.name).toBe('Certifier Two');
|
|
1836
|
+
expect(discoverByIdentityKeyMock).toHaveBeenCalledWith(args, '');
|
|
1837
|
+
});
|
|
1838
|
+
});
|
|
1839
|
+
describe('discoverByAttributes', () => {
|
|
1840
|
+
it('should discover certificates by attributes with valid inputs', async () => {
|
|
1841
|
+
// Mock the discoverByAttributes method
|
|
1842
|
+
const discoverByAttributesMock = jest.fn().mockResolvedValue({
|
|
1843
|
+
totalCertificates: 1,
|
|
1844
|
+
certificates: [
|
|
1845
|
+
{
|
|
1846
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1847
|
+
subject: '02' + 'a'.repeat(64),
|
|
1848
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1849
|
+
certifier: '02' + 'b'.repeat(64),
|
|
1850
|
+
revocationOutpoint: 'deadbeef20248806deadbeef20248806deadbeef20248806deadbeef20248806.0',
|
|
1851
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1852
|
+
fields: {},
|
|
1853
|
+
certifierInfo: {
|
|
1854
|
+
name: 'Test Certifier',
|
|
1855
|
+
iconUrl: 'https://example.com/icon.png',
|
|
1856
|
+
description: 'Test description',
|
|
1857
|
+
trust: 5
|
|
1858
|
+
},
|
|
1859
|
+
publiclyRevealedKeyring: {},
|
|
1860
|
+
decryptedFields: {}
|
|
1861
|
+
}
|
|
1862
|
+
]
|
|
1863
|
+
});
|
|
1864
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1865
|
+
discoverByAttributes: discoverByAttributesMock
|
|
1866
|
+
}));
|
|
1867
|
+
const args = {
|
|
1868
|
+
attributes: {
|
|
1869
|
+
field1: 'value1'
|
|
1870
|
+
},
|
|
1871
|
+
limit: 10,
|
|
1872
|
+
offset: 0
|
|
1873
|
+
};
|
|
1874
|
+
const result = await wallet.discoverByAttributes(args);
|
|
1875
|
+
expect(result).toHaveProperty('totalCertificates');
|
|
1876
|
+
expect(result).toHaveProperty('certificates');
|
|
1877
|
+
expect(Array.isArray(result.certificates)).toBe(true);
|
|
1878
|
+
expect(discoverByAttributesMock).toHaveBeenCalledWith(args, '');
|
|
1879
|
+
});
|
|
1880
|
+
it('should throw an error with invalid inputs', async () => {
|
|
1881
|
+
// Mock the discoverByAttributes method to throw an error
|
|
1882
|
+
const discoverByAttributesMock = jest
|
|
1883
|
+
.fn()
|
|
1884
|
+
.mockRejectedValue(new Error('Invalid inputs'));
|
|
1885
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1886
|
+
discoverByAttributes: discoverByAttributesMock
|
|
1887
|
+
}));
|
|
1888
|
+
const args = {
|
|
1889
|
+
attributes: {}
|
|
1890
|
+
};
|
|
1891
|
+
await expect(wallet.discoverByAttributes(args)).rejects.toThrow('Invalid inputs');
|
|
1892
|
+
expect(discoverByAttributesMock).toHaveBeenCalledWith(args, '');
|
|
1893
|
+
});
|
|
1894
|
+
it('should discover certificates matching provided attributes', async () => {
|
|
1895
|
+
// Mock the discoverByAttributes method
|
|
1896
|
+
const discoverByAttributesMock = jest.fn().mockResolvedValue({
|
|
1897
|
+
totalCertificates: 1,
|
|
1898
|
+
certificates: [
|
|
1899
|
+
{
|
|
1900
|
+
type: index_1.Utils.toBase64(new Array(32).fill(1)),
|
|
1901
|
+
subject: '02' + 'd'.repeat(64),
|
|
1902
|
+
serialNumber: index_1.Utils.toBase64(new Array(32).fill(2)),
|
|
1903
|
+
certifier: '02' + 'e'.repeat(64),
|
|
1904
|
+
revocationOutpoint: 'beadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbeadbead.2',
|
|
1905
|
+
signature: '3045022100e4d03d959697ed191f9ef7ae7deacd3118b8693d18da0fd76e4ad92664ce05cf02200d753951e766cbf2d2b306e08921c06341d2de67ab75389bf84caf954ee40e88',
|
|
1906
|
+
fields: {},
|
|
1907
|
+
certifierInfo: {
|
|
1908
|
+
name: 'Certifier Three',
|
|
1909
|
+
iconUrl: 'https://example.com/icon3.png',
|
|
1910
|
+
description: 'Third certifier',
|
|
1911
|
+
trust: 8
|
|
1912
|
+
},
|
|
1913
|
+
publiclyRevealedKeyring: {
|
|
1914
|
+
fieldX: index_1.Utils.toBase64([0x0a, 0x0b])
|
|
1915
|
+
},
|
|
1916
|
+
decryptedFields: {
|
|
1917
|
+
fieldY: 'decryptedValueY'
|
|
1918
|
+
}
|
|
1919
|
+
}
|
|
1920
|
+
]
|
|
1921
|
+
});
|
|
1922
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1923
|
+
discoverByAttributes: discoverByAttributesMock
|
|
1924
|
+
}));
|
|
1925
|
+
const args = {
|
|
1926
|
+
attributes: {
|
|
1927
|
+
fieldY: 'decryptedValueY'
|
|
1928
|
+
},
|
|
1929
|
+
limit: 5,
|
|
1930
|
+
offset: 0
|
|
1931
|
+
};
|
|
1932
|
+
const result = await wallet.discoverByAttributes(args);
|
|
1933
|
+
expect(result).toHaveProperty('totalCertificates', 1);
|
|
1934
|
+
expect(result.certificates.length).toBe(1);
|
|
1935
|
+
expect(result.certificates[0].certifierInfo.name).toBe('Certifier Three');
|
|
1936
|
+
expect(result.certificates[0].decryptedFields.fieldY).toBe('decryptedValueY');
|
|
1937
|
+
expect(discoverByAttributesMock).toHaveBeenCalledWith(args, '');
|
|
1938
|
+
});
|
|
1939
|
+
it('should return empty certificates array when no matches found', async () => {
|
|
1940
|
+
// Mock the discoverByAttributes method
|
|
1941
|
+
const discoverByAttributesMock = jest.fn().mockResolvedValue({
|
|
1942
|
+
totalCertificates: 0,
|
|
1943
|
+
certificates: []
|
|
1944
|
+
});
|
|
1945
|
+
const wallet = createTestWalletWire(mockUnsupportedMethods({
|
|
1946
|
+
discoverByAttributes: discoverByAttributesMock
|
|
1947
|
+
}));
|
|
1948
|
+
const args = {
|
|
1949
|
+
attributes: {
|
|
1950
|
+
nonExistentField: 'noValue'
|
|
1951
|
+
},
|
|
1952
|
+
limit: 5,
|
|
1953
|
+
offset: 0
|
|
1954
|
+
};
|
|
1955
|
+
const result = await wallet.discoverByAttributes(args);
|
|
1956
|
+
expect(result).toHaveProperty('totalCertificates', 0);
|
|
1957
|
+
expect(result.certificates.length).toBe(0);
|
|
1958
|
+
expect(discoverByAttributesMock).toHaveBeenCalledWith(args, '');
|
|
1959
|
+
});
|
|
1960
|
+
});
|
|
1961
|
+
});
|
|
1962
|
+
//# sourceMappingURL=WalletWire.integration.test.js.map
|