@bsv/sdk 1.0.0
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/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +23 -0
- package/CHANGELOG.md +72 -0
- package/CONTRIBUTING.md +85 -0
- package/LICENSE.txt +28 -0
- package/README.md +87 -0
- package/ROADMAP.md +3 -0
- package/dist/cjs/mod.js +25 -0
- package/dist/cjs/mod.js.map +1 -0
- package/dist/cjs/package.json +42 -0
- package/dist/cjs/src/compat/BIP39.js +272 -0
- package/dist/cjs/src/compat/BIP39.js.map +1 -0
- package/dist/cjs/src/compat/BSM.js +77 -0
- package/dist/cjs/src/compat/BSM.js.map +1 -0
- package/dist/cjs/src/compat/ECIES.js +483 -0
- package/dist/cjs/src/compat/ECIES.js.map +1 -0
- package/dist/cjs/src/compat/HD.js +326 -0
- package/dist/cjs/src/compat/HD.js.map +1 -0
- package/dist/cjs/src/compat/Mnemonic.js +298 -0
- package/dist/cjs/src/compat/Mnemonic.js.map +1 -0
- package/dist/cjs/src/compat/bip-39-wordlist-en.js +2057 -0
- package/dist/cjs/src/compat/bip-39-wordlist-en.js.map +1 -0
- package/dist/cjs/src/compat/index.js +37 -0
- package/dist/cjs/src/compat/index.js.map +1 -0
- package/dist/cjs/src/messages/EncryptedMessage.js +69 -0
- package/dist/cjs/src/messages/EncryptedMessage.js.map +1 -0
- package/dist/cjs/src/messages/SignedMessage.js +85 -0
- package/dist/cjs/src/messages/SignedMessage.js.map +1 -0
- package/dist/cjs/src/messages/index.js +29 -0
- package/dist/cjs/src/messages/index.js.map +1 -0
- package/dist/cjs/src/primitives/AESGCM.js +384 -0
- package/dist/cjs/src/primitives/AESGCM.js.map +1 -0
- package/dist/cjs/src/primitives/BasePoint.js +19 -0
- package/dist/cjs/src/primitives/BasePoint.js.map +1 -0
- package/dist/cjs/src/primitives/BigNumber.js +4269 -0
- package/dist/cjs/src/primitives/BigNumber.js.map +1 -0
- package/dist/cjs/src/primitives/Curve.js +1126 -0
- package/dist/cjs/src/primitives/Curve.js.map +1 -0
- package/dist/cjs/src/primitives/DRBG.js +99 -0
- package/dist/cjs/src/primitives/DRBG.js.map +1 -0
- package/dist/cjs/src/primitives/ECDSA.js +169 -0
- package/dist/cjs/src/primitives/ECDSA.js.map +1 -0
- package/dist/cjs/src/primitives/Hash.js +1332 -0
- package/dist/cjs/src/primitives/Hash.js.map +1 -0
- package/dist/cjs/src/primitives/JacobianPoint.js +400 -0
- package/dist/cjs/src/primitives/JacobianPoint.js.map +1 -0
- package/dist/cjs/src/primitives/K256.js +111 -0
- package/dist/cjs/src/primitives/K256.js.map +1 -0
- package/dist/cjs/src/primitives/Mersenne.js +118 -0
- package/dist/cjs/src/primitives/Mersenne.js.map +1 -0
- package/dist/cjs/src/primitives/MontgomoryMethod.js +150 -0
- package/dist/cjs/src/primitives/MontgomoryMethod.js.map +1 -0
- package/dist/cjs/src/primitives/Point.js +819 -0
- package/dist/cjs/src/primitives/Point.js.map +1 -0
- package/dist/cjs/src/primitives/PrivateKey.js +190 -0
- package/dist/cjs/src/primitives/PrivateKey.js.map +1 -0
- package/dist/cjs/src/primitives/PublicKey.js +151 -0
- package/dist/cjs/src/primitives/PublicKey.js.map +1 -0
- package/dist/cjs/src/primitives/Random.js +57 -0
- package/dist/cjs/src/primitives/Random.js.map +1 -0
- package/dist/cjs/src/primitives/ReductionContext.js +490 -0
- package/dist/cjs/src/primitives/ReductionContext.js.map +1 -0
- package/dist/cjs/src/primitives/Signature.js +220 -0
- package/dist/cjs/src/primitives/Signature.js.map +1 -0
- package/dist/cjs/src/primitives/SymmetricKey.js +69 -0
- package/dist/cjs/src/primitives/SymmetricKey.js.map +1 -0
- package/dist/cjs/src/primitives/TransactionSignature.js +172 -0
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -0
- package/dist/cjs/src/primitives/index.js +45 -0
- package/dist/cjs/src/primitives/index.js.map +1 -0
- package/dist/cjs/src/primitives/utils.js +615 -0
- package/dist/cjs/src/primitives/utils.js.map +1 -0
- package/dist/cjs/src/script/LockingScript.js +35 -0
- package/dist/cjs/src/script/LockingScript.js.map +1 -0
- package/dist/cjs/src/script/OP.js +208 -0
- package/dist/cjs/src/script/OP.js.map +1 -0
- package/dist/cjs/src/script/Script.js +429 -0
- package/dist/cjs/src/script/Script.js.map +1 -0
- package/dist/cjs/src/script/ScriptChunk.js +3 -0
- package/dist/cjs/src/script/ScriptChunk.js.map +1 -0
- package/dist/cjs/src/script/ScriptTemplate.js +3 -0
- package/dist/cjs/src/script/ScriptTemplate.js.map +1 -0
- package/dist/cjs/src/script/Spend.js +1252 -0
- package/dist/cjs/src/script/Spend.js.map +1 -0
- package/dist/cjs/src/script/UnlockingScript.js +35 -0
- package/dist/cjs/src/script/UnlockingScript.js.map +1 -0
- package/dist/cjs/src/script/index.js +32 -0
- package/dist/cjs/src/script/index.js.map +1 -0
- package/dist/cjs/src/script/templates/P2PKH.js +98 -0
- package/dist/cjs/src/script/templates/P2PKH.js.map +1 -0
- package/dist/cjs/src/script/templates/RPuzzle.js +125 -0
- package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -0
- package/dist/cjs/src/script/templates/index.js +11 -0
- package/dist/cjs/src/script/templates/index.js.map +1 -0
- package/dist/cjs/src/transaction/Broadcaster.js +3 -0
- package/dist/cjs/src/transaction/Broadcaster.js.map +1 -0
- package/dist/cjs/src/transaction/ChainTracker.js +3 -0
- package/dist/cjs/src/transaction/ChainTracker.js.map +1 -0
- package/dist/cjs/src/transaction/FeeModel.js +3 -0
- package/dist/cjs/src/transaction/FeeModel.js.map +1 -0
- package/dist/cjs/src/transaction/MerklePath.js +239 -0
- package/dist/cjs/src/transaction/MerklePath.js.map +1 -0
- package/dist/cjs/src/transaction/Transaction.js +557 -0
- package/dist/cjs/src/transaction/Transaction.js.map +1 -0
- package/dist/cjs/src/transaction/TransactionInput.js +3 -0
- package/dist/cjs/src/transaction/TransactionInput.js.map +1 -0
- package/dist/cjs/src/transaction/TransactionOutput.js +3 -0
- package/dist/cjs/src/transaction/TransactionOutput.js.map +1 -0
- package/dist/cjs/src/transaction/broadcasters/ARC.js +101 -0
- package/dist/cjs/src/transaction/broadcasters/ARC.js.map +1 -0
- package/dist/cjs/src/transaction/broadcasters/index.js +9 -0
- package/dist/cjs/src/transaction/broadcasters/index.js.map +1 -0
- package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js +69 -0
- package/dist/cjs/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -0
- package/dist/cjs/src/transaction/fee-models/index.js +9 -0
- package/dist/cjs/src/transaction/fee-models/index.js.map +1 -0
- package/dist/cjs/src/transaction/index.js +11 -0
- package/dist/cjs/src/transaction/index.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/esm/mod.js +9 -0
- package/dist/esm/mod.js.map +1 -0
- package/dist/esm/src/compat/BIP39.js +272 -0
- package/dist/esm/src/compat/BIP39.js.map +1 -0
- package/dist/esm/src/compat/BSM.js +45 -0
- package/dist/esm/src/compat/BSM.js.map +1 -0
- package/dist/esm/src/compat/ECIES.js +454 -0
- package/dist/esm/src/compat/ECIES.js.map +1 -0
- package/dist/esm/src/compat/HD.js +304 -0
- package/dist/esm/src/compat/HD.js.map +1 -0
- package/dist/esm/src/compat/Mnemonic.js +272 -0
- package/dist/esm/src/compat/Mnemonic.js.map +1 -0
- package/dist/esm/src/compat/bip-39-wordlist-en.js +2054 -0
- package/dist/esm/src/compat/bip-39-wordlist-en.js.map +1 -0
- package/dist/esm/src/compat/index.js +5 -0
- package/dist/esm/src/compat/index.js.map +1 -0
- package/dist/esm/src/messages/EncryptedMessage.js +61 -0
- package/dist/esm/src/messages/EncryptedMessage.js.map +1 -0
- package/dist/esm/src/messages/SignedMessage.js +77 -0
- package/dist/esm/src/messages/SignedMessage.js.map +1 -0
- package/dist/esm/src/messages/index.js +3 -0
- package/dist/esm/src/messages/index.js.map +1 -0
- package/dist/esm/src/primitives/AESGCM.js +371 -0
- package/dist/esm/src/primitives/AESGCM.js.map +1 -0
- package/dist/esm/src/primitives/BasePoint.js +16 -0
- package/dist/esm/src/primitives/BasePoint.js.map +1 -0
- package/dist/esm/src/primitives/BigNumber.js +4304 -0
- package/dist/esm/src/primitives/BigNumber.js.map +1 -0
- package/dist/esm/src/primitives/Curve.js +1141 -0
- package/dist/esm/src/primitives/Curve.js.map +1 -0
- package/dist/esm/src/primitives/DRBG.js +98 -0
- package/dist/esm/src/primitives/DRBG.js.map +1 -0
- package/dist/esm/src/primitives/ECDSA.js +161 -0
- package/dist/esm/src/primitives/ECDSA.js.map +1 -0
- package/dist/esm/src/primitives/Hash.js +1336 -0
- package/dist/esm/src/primitives/Hash.js.map +1 -0
- package/dist/esm/src/primitives/JacobianPoint.js +398 -0
- package/dist/esm/src/primitives/JacobianPoint.js.map +1 -0
- package/dist/esm/src/primitives/K256.js +105 -0
- package/dist/esm/src/primitives/K256.js.map +1 -0
- package/dist/esm/src/primitives/Mersenne.js +117 -0
- package/dist/esm/src/primitives/Mersenne.js.map +1 -0
- package/dist/esm/src/primitives/MontgomoryMethod.js +149 -0
- package/dist/esm/src/primitives/MontgomoryMethod.js.map +1 -0
- package/dist/esm/src/primitives/Point.js +816 -0
- package/dist/esm/src/primitives/Point.js.map +1 -0
- package/dist/esm/src/primitives/PrivateKey.js +184 -0
- package/dist/esm/src/primitives/PrivateKey.js.map +1 -0
- package/dist/esm/src/primitives/PublicKey.js +145 -0
- package/dist/esm/src/primitives/PublicKey.js.map +1 -0
- package/dist/esm/src/primitives/Random.js +56 -0
- package/dist/esm/src/primitives/Random.js.map +1 -0
- package/dist/esm/src/primitives/ReductionContext.js +486 -0
- package/dist/esm/src/primitives/ReductionContext.js.map +1 -0
- package/dist/esm/src/primitives/Signature.js +223 -0
- package/dist/esm/src/primitives/Signature.js.map +1 -0
- package/dist/esm/src/primitives/SymmetricKey.js +63 -0
- package/dist/esm/src/primitives/SymmetricKey.js.map +1 -0
- package/dist/esm/src/primitives/TransactionSignature.js +144 -0
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -0
- package/dist/esm/src/primitives/index.js +9 -0
- package/dist/esm/src/primitives/index.js.map +1 -0
- package/dist/esm/src/primitives/utils.js +601 -0
- package/dist/esm/src/primitives/utils.js.map +1 -0
- package/dist/esm/src/script/LockingScript.js +29 -0
- package/dist/esm/src/script/LockingScript.js.map +1 -0
- package/dist/esm/src/script/OP.js +206 -0
- package/dist/esm/src/script/OP.js.map +1 -0
- package/dist/esm/src/script/Script.js +424 -0
- package/dist/esm/src/script/Script.js.map +1 -0
- package/dist/esm/src/script/ScriptChunk.js +2 -0
- package/dist/esm/src/script/ScriptChunk.js.map +1 -0
- package/dist/esm/src/script/ScriptTemplate.js +2 -0
- package/dist/esm/src/script/ScriptTemplate.js.map +1 -0
- package/dist/esm/src/script/Spend.js +1240 -0
- package/dist/esm/src/script/Spend.js.map +1 -0
- package/dist/esm/src/script/UnlockingScript.js +29 -0
- package/dist/esm/src/script/UnlockingScript.js.map +1 -0
- package/dist/esm/src/script/index.js +7 -0
- package/dist/esm/src/script/index.js.map +1 -0
- package/dist/esm/src/script/templates/P2PKH.js +92 -0
- package/dist/esm/src/script/templates/P2PKH.js.map +1 -0
- package/dist/esm/src/script/templates/RPuzzle.js +119 -0
- package/dist/esm/src/script/templates/RPuzzle.js.map +1 -0
- package/dist/esm/src/script/templates/index.js +3 -0
- package/dist/esm/src/script/templates/index.js.map +1 -0
- package/dist/esm/src/transaction/Broadcaster.js +2 -0
- package/dist/esm/src/transaction/Broadcaster.js.map +1 -0
- package/dist/esm/src/transaction/ChainTracker.js +2 -0
- package/dist/esm/src/transaction/ChainTracker.js.map +1 -0
- package/dist/esm/src/transaction/FeeModel.js +2 -0
- package/dist/esm/src/transaction/FeeModel.js.map +1 -0
- package/dist/esm/src/transaction/MerklePath.js +237 -0
- package/dist/esm/src/transaction/MerklePath.js.map +1 -0
- package/dist/esm/src/transaction/Transaction.js +557 -0
- package/dist/esm/src/transaction/Transaction.js.map +1 -0
- package/dist/esm/src/transaction/TransactionInput.js +2 -0
- package/dist/esm/src/transaction/TransactionInput.js.map +1 -0
- package/dist/esm/src/transaction/TransactionOutput.js +2 -0
- package/dist/esm/src/transaction/TransactionOutput.js.map +1 -0
- package/dist/esm/src/transaction/broadcasters/ARC.js +100 -0
- package/dist/esm/src/transaction/broadcasters/ARC.js.map +1 -0
- package/dist/esm/src/transaction/broadcasters/index.js +2 -0
- package/dist/esm/src/transaction/broadcasters/index.js.map +1 -0
- package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js +71 -0
- package/dist/esm/src/transaction/fee-models/SatoshisPerKilobyte.js.map +1 -0
- package/dist/esm/src/transaction/fee-models/index.js +2 -0
- package/dist/esm/src/transaction/fee-models/index.js.map +1 -0
- package/dist/esm/src/transaction/index.js +3 -0
- package/dist/esm/src/transaction/index.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/types/mod.d.ts +9 -0
- package/dist/types/mod.d.ts.map +1 -0
- package/dist/types/src/compat/BIP39.d.ts +132 -0
- package/dist/types/src/compat/BIP39.d.ts.map +1 -0
- package/dist/types/src/compat/BSM.d.ts +28 -0
- package/dist/types/src/compat/BSM.d.ts.map +1 -0
- package/dist/types/src/compat/ECIES.d.ts +62 -0
- package/dist/types/src/compat/ECIES.d.ts.map +1 -0
- package/dist/types/src/compat/HD.d.ts +117 -0
- package/dist/types/src/compat/HD.d.ts.map +1 -0
- package/dist/types/src/compat/Mnemonic.d.ts +132 -0
- package/dist/types/src/compat/Mnemonic.d.ts.map +1 -0
- package/dist/types/src/compat/bip-39-wordlist-en.d.ts +5 -0
- package/dist/types/src/compat/bip-39-wordlist-en.d.ts.map +1 -0
- package/dist/types/src/compat/index.d.ts +5 -0
- package/dist/types/src/compat/index.d.ts.map +1 -0
- package/dist/types/src/messages/EncryptedMessage.d.ts +20 -0
- package/dist/types/src/messages/EncryptedMessage.d.ts.map +1 -0
- package/dist/types/src/messages/SignedMessage.d.ts +21 -0
- package/dist/types/src/messages/SignedMessage.d.ts.map +1 -0
- package/dist/types/src/messages/index.d.ts +3 -0
- package/dist/types/src/messages/index.d.ts.map +1 -0
- package/dist/types/src/primitives/AESGCM.d.ts +14 -0
- package/dist/types/src/primitives/AESGCM.d.ts.map +1 -0
- package/dist/types/src/primitives/BasePoint.d.ts +22 -0
- package/dist/types/src/primitives/BasePoint.d.ts.map +1 -0
- package/dist/types/src/primitives/BigNumber.d.ts +1895 -0
- package/dist/types/src/primitives/BigNumber.d.ts.map +1 -0
- package/dist/types/src/primitives/Curve.d.ts +55 -0
- package/dist/types/src/primitives/Curve.d.ts.map +1 -0
- package/dist/types/src/primitives/DRBG.d.ts +54 -0
- package/dist/types/src/primitives/DRBG.d.ts.map +1 -0
- package/dist/types/src/primitives/ECDSA.d.ts +39 -0
- package/dist/types/src/primitives/ECDSA.d.ts.map +1 -0
- package/dist/types/src/primitives/Hash.d.ts +411 -0
- package/dist/types/src/primitives/Hash.d.ts.map +1 -0
- package/dist/types/src/primitives/JacobianPoint.d.ts +164 -0
- package/dist/types/src/primitives/JacobianPoint.d.ts.map +1 -0
- package/dist/types/src/primitives/K256.d.ts +53 -0
- package/dist/types/src/primitives/K256.d.ts.map +1 -0
- package/dist/types/src/primitives/Mersenne.d.ts +72 -0
- package/dist/types/src/primitives/Mersenne.d.ts.map +1 -0
- package/dist/types/src/primitives/MontgomoryMethod.d.ts +96 -0
- package/dist/types/src/primitives/MontgomoryMethod.d.ts.map +1 -0
- package/dist/types/src/primitives/Point.d.ts +303 -0
- package/dist/types/src/primitives/Point.d.ts.map +1 -0
- package/dist/types/src/primitives/PrivateKey.d.ts +143 -0
- package/dist/types/src/primitives/PrivateKey.d.ts.map +1 -0
- package/dist/types/src/primitives/PublicKey.d.ts +108 -0
- package/dist/types/src/primitives/PublicKey.d.ts.map +1 -0
- package/dist/types/src/primitives/Random.d.ts +14 -0
- package/dist/types/src/primitives/Random.d.ts.map +1 -0
- package/dist/types/src/primitives/ReductionContext.d.ts +308 -0
- package/dist/types/src/primitives/ReductionContext.d.ts.map +1 -0
- package/dist/types/src/primitives/Signature.d.ts +100 -0
- package/dist/types/src/primitives/Signature.d.ts.map +1 -0
- package/dist/types/src/primitives/SymmetricKey.d.ts +44 -0
- package/dist/types/src/primitives/SymmetricKey.d.ts.map +1 -0
- package/dist/types/src/primitives/TransactionSignature.d.ts +36 -0
- package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -0
- package/dist/types/src/primitives/index.d.ts +9 -0
- package/dist/types/src/primitives/index.d.ts.map +1 -0
- package/dist/types/src/primitives/utils.d.ts +118 -0
- package/dist/types/src/primitives/utils.d.ts.map +1 -0
- package/dist/types/src/script/LockingScript.d.ts +25 -0
- package/dist/types/src/script/LockingScript.d.ts.map +1 -0
- package/dist/types/src/script/OP.d.ts +193 -0
- package/dist/types/src/script/OP.d.ts.map +1 -0
- package/dist/types/src/script/Script.d.ts +148 -0
- package/dist/types/src/script/Script.d.ts.map +1 -0
- package/dist/types/src/script/ScriptChunk.d.ts +8 -0
- package/dist/types/src/script/ScriptChunk.d.ts.map +1 -0
- package/dist/types/src/script/ScriptTemplate.d.ts +33 -0
- package/dist/types/src/script/ScriptTemplate.d.ts.map +1 -0
- package/dist/types/src/script/Spend.d.ts +103 -0
- package/dist/types/src/script/Spend.d.ts.map +1 -0
- package/dist/types/src/script/UnlockingScript.d.ts +25 -0
- package/dist/types/src/script/UnlockingScript.d.ts.map +1 -0
- package/dist/types/src/script/index.d.ts +8 -0
- package/dist/types/src/script/index.d.ts.map +1 -0
- package/dist/types/src/script/templates/P2PKH.d.ts +37 -0
- package/dist/types/src/script/templates/P2PKH.d.ts.map +1 -0
- package/dist/types/src/script/templates/RPuzzle.d.ts +47 -0
- package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -0
- package/dist/types/src/script/templates/index.d.ts +3 -0
- package/dist/types/src/script/templates/index.d.ts.map +1 -0
- package/dist/types/src/transaction/Broadcaster.d.ts +39 -0
- package/dist/types/src/transaction/Broadcaster.d.ts.map +1 -0
- package/dist/types/src/transaction/ChainTracker.d.ts +23 -0
- package/dist/types/src/transaction/ChainTracker.d.ts.map +1 -0
- package/dist/types/src/transaction/FeeModel.d.ts +12 -0
- package/dist/types/src/transaction/FeeModel.d.ts.map +1 -0
- package/dist/types/src/transaction/MerklePath.d.ts +91 -0
- package/dist/types/src/transaction/MerklePath.d.ts.map +1 -0
- package/dist/types/src/transaction/Transaction.d.ts +181 -0
- package/dist/types/src/transaction/Transaction.d.ts.map +1 -0
- package/dist/types/src/transaction/TransactionInput.d.ts +63 -0
- package/dist/types/src/transaction/TransactionInput.d.ts.map +1 -0
- package/dist/types/src/transaction/TransactionOutput.d.ts +36 -0
- package/dist/types/src/transaction/TransactionOutput.d.ts.map +1 -0
- package/dist/types/src/transaction/broadcasters/ARC.d.ts +28 -0
- package/dist/types/src/transaction/broadcasters/ARC.d.ts.map +1 -0
- package/dist/types/src/transaction/broadcasters/index.d.ts +2 -0
- package/dist/types/src/transaction/broadcasters/index.d.ts.map +1 -0
- package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts +26 -0
- package/dist/types/src/transaction/fee-models/SatoshisPerKilobyte.d.ts.map +1 -0
- package/dist/types/src/transaction/fee-models/index.d.ts +2 -0
- package/dist/types/src/transaction/fee-models/index.d.ts.map +1 -0
- package/dist/types/src/transaction/index.d.ts +7 -0
- package/dist/types/src/transaction/index.d.ts.map +1 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -0
- package/docs/README.md +9 -0
- package/docs/compat.md +2856 -0
- package/docs/getting-started/COMMONJS.md +94 -0
- package/docs/getting-started/REACT-TS.md +131 -0
- package/docs/getting-started/TS-NODE.md +106 -0
- package/docs/getting-started/VUE.md +103 -0
- package/docs/messages.md +146 -0
- package/docs/primitives.md +7440 -0
- package/docs/script.md +766 -0
- package/docs/transaction.md +741 -0
- package/jest.config.js +6 -0
- package/mod.ts +8 -0
- package/package.json +137 -0
- package/src/compat/BSM.ts +51 -0
- package/src/compat/ECIES.ts +557 -0
- package/src/compat/HD.ts +348 -0
- package/src/compat/Mnemonic.ts +295 -0
- package/src/compat/__tests/BSM.test.ts +38 -0
- package/src/compat/__tests/ECIES.test.ts +90 -0
- package/src/compat/__tests/HD.test.ts +405 -0
- package/src/compat/__tests/Mnemonic.test.ts +177 -0
- package/src/compat/__tests/Mnemonic.vectors.ts +172 -0
- package/src/compat/bip-39-wordlist-en.ts +2053 -0
- package/src/compat/index.ts +4 -0
- package/src/messages/EncryptedMessage.ts +70 -0
- package/src/messages/SignedMessage.ts +87 -0
- package/src/messages/__tests/EncryptedMessage.test.ts +36 -0
- package/src/messages/__tests/SignedMessage.test.ts +53 -0
- package/src/messages/index.ts +2 -0
- package/src/primitives/AESGCM.ts +479 -0
- package/src/primitives/BasePoint.ts +21 -0
- package/src/primitives/BigNumber.ts +4619 -0
- package/src/primitives/Curve.ts +1163 -0
- package/src/primitives/DRBG.ts +102 -0
- package/src/primitives/ECDSA.ts +164 -0
- package/src/primitives/Hash.ts +1420 -0
- package/src/primitives/JacobianPoint.ts +410 -0
- package/src/primitives/K256.ts +116 -0
- package/src/primitives/Mersenne.ts +123 -0
- package/src/primitives/MontgomoryMethod.ts +160 -0
- package/src/primitives/Point.ts +852 -0
- package/src/primitives/PrivateKey.ts +195 -0
- package/src/primitives/PublicKey.ts +154 -0
- package/src/primitives/Random.ts +55 -0
- package/src/primitives/ReductionContext.ts +528 -0
- package/src/primitives/Signature.ts +235 -0
- package/src/primitives/SymmetricKey.ts +75 -0
- package/src/primitives/TransactionSignature.ts +189 -0
- package/src/primitives/__tests/AESGCM.test.ts +338 -0
- package/src/primitives/__tests/BRC42.private.vectors.ts +33 -0
- package/src/primitives/__tests/BRC42.public.vectors.ts +33 -0
- package/src/primitives/__tests/BigNumber.arithmatic.test.ts +572 -0
- package/src/primitives/__tests/BigNumber.binary.test.ts +203 -0
- package/src/primitives/__tests/BigNumber.constructor.test.ts +176 -0
- package/src/primitives/__tests/BigNumber.dhGroup.test.ts +18 -0
- package/src/primitives/__tests/BigNumber.fixtures.ts +264 -0
- package/src/primitives/__tests/BigNumber.serializers.test.ts +157 -0
- package/src/primitives/__tests/BigNumber.utils.test.ts +347 -0
- package/src/primitives/__tests/Curve.unit.test.ts +192 -0
- package/src/primitives/__tests/DRBG.test.ts +18 -0
- package/src/primitives/__tests/DRBG.vectors.ts +167 -0
- package/src/primitives/__tests/ECDH.test.ts +31 -0
- package/src/primitives/__tests/ECDSA.test.ts +58 -0
- package/src/primitives/__tests/HMAC.test.ts +59 -0
- package/src/primitives/__tests/Hash.test.ts +121 -0
- package/src/primitives/__tests/PBKDF2.vectors.ts +119 -0
- package/src/primitives/__tests/PrivateKey.test.ts +17 -0
- package/src/primitives/__tests/PublicKey.test.ts +66 -0
- package/src/primitives/__tests/Random.test.ts +14 -0
- package/src/primitives/__tests/Reader.test.ts +296 -0
- package/src/primitives/__tests/ReductionContext.test.ts +279 -0
- package/src/primitives/__tests/SymmetricKey.test.ts +58 -0
- package/src/primitives/__tests/SymmetricKey.vectors.ts +40 -0
- package/src/primitives/__tests/Writer.test.ts +198 -0
- package/src/primitives/__tests/sighash.vectors.ts +3503 -0
- package/src/primitives/__tests/utils.test.ts +108 -0
- package/src/primitives/index.ts +8 -0
- package/src/primitives/utils.ts +665 -0
- package/src/script/LockingScript.ts +30 -0
- package/src/script/OP.ts +219 -0
- package/src/script/Script.ts +426 -0
- package/src/script/ScriptChunk.ts +7 -0
- package/src/script/ScriptTemplate.ts +36 -0
- package/src/script/Spend.ts +1379 -0
- package/src/script/UnlockingScript.ts +30 -0
- package/src/script/__tests/Script.test.ts +369 -0
- package/src/script/__tests/Spend.test.ts +248 -0
- package/src/script/__tests/script.invalid.vectors.ts +925 -0
- package/src/script/__tests/script.valid.vectors.ts +1120 -0
- package/src/script/__tests/scriptFromVector.ts +42 -0
- package/src/script/__tests/spend.valid.vectors.ts +2288 -0
- package/src/script/index.ts +7 -0
- package/src/script/templates/P2PKH.ts +109 -0
- package/src/script/templates/RPuzzle.ts +140 -0
- package/src/script/templates/index.ts +2 -0
- package/src/transaction/Broadcaster.ts +42 -0
- package/src/transaction/ChainTracker.ts +22 -0
- package/src/transaction/FeeModel.ts +13 -0
- package/src/transaction/MerklePath.ts +259 -0
- package/src/transaction/Transaction.ts +602 -0
- package/src/transaction/TransactionInput.ts +63 -0
- package/src/transaction/TransactionOutput.ts +37 -0
- package/src/transaction/__tests/MerklePath.test.ts +181 -0
- package/src/transaction/__tests/Transaction.test.ts +413 -0
- package/src/transaction/__tests/bigtx.vectors.ts +4 -0
- package/src/transaction/__tests/bump.invalid.vectors.ts +8 -0
- package/src/transaction/__tests/bump.valid.vectors.ts +4 -0
- package/src/transaction/__tests/tx.invalid.vectors.ts +281 -0
- package/src/transaction/__tests/tx.valid.vectors.ts +364 -0
- package/src/transaction/broadcasters/ARC.ts +106 -0
- package/src/transaction/broadcasters/__tests/ARC.test.ts +115 -0
- package/src/transaction/broadcasters/index.ts +1 -0
- package/src/transaction/fee-models/SatoshisPerKilobyte.ts +71 -0
- package/src/transaction/fee-models/index.ts +1 -0
- package/src/transaction/index.ts +6 -0
- package/ts2md.json +5 -0
- package/tsconfig.base.json +26 -0
- package/tsconfig.cjs.json +11 -0
- package/tsconfig.eslint.json +12 -0
- package/tsconfig.esm.json +9 -0
- package/tsconfig.json +17 -0
- package/tsconfig.types.json +11 -0
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
// import { AESWrappercbc } from './aescbc'
|
|
2
|
+
import Random from '../primitives/Random.js'
|
|
3
|
+
import PrivateKey from '../primitives/PrivateKey.js'
|
|
4
|
+
import PublicKey from '../primitives/PublicKey.js'
|
|
5
|
+
import Point from '../primitives/Point.js'
|
|
6
|
+
import * as Hash from '../primitives/Hash.js'
|
|
7
|
+
import { toArray, toHex, encode } from '../primitives/utils.js'
|
|
8
|
+
|
|
9
|
+
function AES(key) {
|
|
10
|
+
if (!this._tables[0][0][0]) this._precompute();
|
|
11
|
+
|
|
12
|
+
var tmp, encKey, decKey;
|
|
13
|
+
var sbox = this._tables[0][4];
|
|
14
|
+
var decTable = this._tables[1];
|
|
15
|
+
var keyLen = key.length;
|
|
16
|
+
var rcon = 1;
|
|
17
|
+
|
|
18
|
+
if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
|
|
19
|
+
throw new Error("invalid aes key size");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
this._key = [encKey = key.slice(0), decKey = []];
|
|
23
|
+
|
|
24
|
+
// schedule encryption keys
|
|
25
|
+
for (var i = keyLen; i < 4 * keyLen + 28; i++) {
|
|
26
|
+
tmp = encKey[i - 1];
|
|
27
|
+
|
|
28
|
+
// apply sbox
|
|
29
|
+
if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
|
|
30
|
+
tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
|
|
31
|
+
|
|
32
|
+
// shift rows and add rcon
|
|
33
|
+
if (i % keyLen === 0) {
|
|
34
|
+
tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
|
|
35
|
+
rcon = rcon << 1 ^ (rcon >> 7) * 283;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
encKey[i] = encKey[i - keyLen] ^ tmp;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// schedule decryption keys
|
|
43
|
+
for (var j = 0; i; j++, i--) {
|
|
44
|
+
tmp = encKey[j & 3 ? i : i - 4];
|
|
45
|
+
if (i <= 4 || j < 4) {
|
|
46
|
+
decKey[j] = tmp;
|
|
47
|
+
} else {
|
|
48
|
+
decKey[j] = decTable[0][sbox[tmp >>> 24]] ^
|
|
49
|
+
decTable[1][sbox[tmp >> 16 & 255]] ^
|
|
50
|
+
decTable[2][sbox[tmp >> 8 & 255]] ^
|
|
51
|
+
decTable[3][sbox[tmp & 255]];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
AES.prototype = {
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Encrypt an array of 4 big-endian words.
|
|
60
|
+
* @param {Array} data The plaintext.
|
|
61
|
+
* @return {Array} The ciphertext.
|
|
62
|
+
*/
|
|
63
|
+
encrypt: function (data) { return this._crypt(data, 0); },
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Decrypt an array of 4 big-endian words.
|
|
67
|
+
* @param {Array} data The ciphertext.
|
|
68
|
+
* @return {Array} The plaintext.
|
|
69
|
+
*/
|
|
70
|
+
decrypt: function (data) { return this._crypt(data, 1); },
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The expanded S-box and inverse S-box tables. These will be computed
|
|
74
|
+
* on the client so that we don't have to send them down the wire.
|
|
75
|
+
*
|
|
76
|
+
* There are two tables, _tables[0] is for encryption and
|
|
77
|
+
* _tables[1] is for decryption.
|
|
78
|
+
*
|
|
79
|
+
* The first 4 sub-tables are the expanded S-box with MixColumns. The
|
|
80
|
+
* last (_tables[01][4]) is the S-box itself.
|
|
81
|
+
*
|
|
82
|
+
* @private
|
|
83
|
+
*/
|
|
84
|
+
_tables: [
|
|
85
|
+
[new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)],
|
|
86
|
+
[new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)]
|
|
87
|
+
],
|
|
88
|
+
|
|
89
|
+
//Expand the S-box tables.
|
|
90
|
+
_precompute: function () {
|
|
91
|
+
var encTable = this._tables[0], decTable = this._tables[1],
|
|
92
|
+
sbox = encTable[4], sboxInv = decTable[4],
|
|
93
|
+
i, x, xInv, d = new Uint8Array(256), th = new Uint8Array(256), x2, x4, x8, s, tEnc, tDec;
|
|
94
|
+
|
|
95
|
+
// Compute double and third tables
|
|
96
|
+
for (i = 0; i < 256; i++) {
|
|
97
|
+
th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
for (x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
|
|
101
|
+
// Compute sbox
|
|
102
|
+
s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
|
|
103
|
+
s = s >> 8 ^ s & 255 ^ 99;
|
|
104
|
+
sbox[x] = s;
|
|
105
|
+
sboxInv[s] = x;
|
|
106
|
+
|
|
107
|
+
// Compute MixColumns
|
|
108
|
+
x8 = d[x4 = d[x2 = d[x]]];
|
|
109
|
+
tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
|
|
110
|
+
tEnc = d[s] * 0x101 ^ s * 0x1010100;
|
|
111
|
+
|
|
112
|
+
for (i = 0; i < 4; i++) {
|
|
113
|
+
encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
|
|
114
|
+
decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Encryption and decryption core.
|
|
121
|
+
* @param {Array} input Four words to be encrypted or decrypted.
|
|
122
|
+
* @param dir The direction, 0 for encrypt and 1 for decrypt.
|
|
123
|
+
* @return {Array} The four encrypted or decrypted words.
|
|
124
|
+
* @private
|
|
125
|
+
*/
|
|
126
|
+
_crypt: function (input, dir) {
|
|
127
|
+
if (input.length !== 4) {
|
|
128
|
+
throw new Error("invalid aes block size");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
var key = this._key[dir],
|
|
132
|
+
// state variables a,b,c,d are loaded with pre-whitened data
|
|
133
|
+
a = input[0] ^ key[0],
|
|
134
|
+
b = input[dir ? 3 : 1] ^ key[1],
|
|
135
|
+
c = input[2] ^ key[2],
|
|
136
|
+
d = input[dir ? 1 : 3] ^ key[3],
|
|
137
|
+
a2, b2, c2,
|
|
138
|
+
|
|
139
|
+
nInnerRounds = key.length / 4 - 2,
|
|
140
|
+
i,
|
|
141
|
+
kIndex = 4,
|
|
142
|
+
out = new Uint32Array(4),// <--- this is slower in Node.js, about the same in Chrome */
|
|
143
|
+
table = this._tables[dir],
|
|
144
|
+
|
|
145
|
+
// load up the tables
|
|
146
|
+
t0 = table[0],
|
|
147
|
+
t1 = table[1],
|
|
148
|
+
t2 = table[2],
|
|
149
|
+
t3 = table[3],
|
|
150
|
+
sbox = table[4];
|
|
151
|
+
|
|
152
|
+
// Inner rounds. Cribbed from OpenSSL.
|
|
153
|
+
for (i = 0; i < nInnerRounds; i++) {
|
|
154
|
+
a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
|
|
155
|
+
b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
|
|
156
|
+
c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
|
|
157
|
+
d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
|
|
158
|
+
kIndex += 4;
|
|
159
|
+
a = a2; b = b2; c = c2;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Last round.
|
|
163
|
+
for (i = 0; i < 4; i++) {
|
|
164
|
+
out[dir ? 3 & -i : i] =
|
|
165
|
+
sbox[a >>> 24] << 24 ^
|
|
166
|
+
sbox[b >> 16 & 255] << 16 ^
|
|
167
|
+
sbox[c >> 8 & 255] << 8 ^
|
|
168
|
+
sbox[d & 255] ^
|
|
169
|
+
key[kIndex++];
|
|
170
|
+
a2 = a; a = b; b = c; c = d; d = a2;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
class AESWrapper {
|
|
178
|
+
public static encrypt(messageBuf: number[], keyBuf: number[]): number[] {
|
|
179
|
+
const key = AESWrapper.buf2Words((keyBuf))
|
|
180
|
+
const message = AESWrapper.buf2Words((messageBuf))
|
|
181
|
+
const a = new AES(key)
|
|
182
|
+
const enc = a.encrypt(message)
|
|
183
|
+
const encBuf = AESWrapper.words2Buf(enc)
|
|
184
|
+
return encBuf
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public static decrypt(encBuf: number[], keyBuf: number[]): number[] {
|
|
188
|
+
const enc = AESWrapper.buf2Words((encBuf))
|
|
189
|
+
const key = AESWrapper.buf2Words((keyBuf))
|
|
190
|
+
const a = new AES(key)
|
|
191
|
+
const message = a.decrypt(enc)
|
|
192
|
+
const messageBuf = AESWrapper.words2Buf(message)
|
|
193
|
+
return messageBuf
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public static buf2Words(buf: number[]): number[] {
|
|
197
|
+
if (buf.length % 4) {
|
|
198
|
+
throw new Error('buf length must be a multiple of 4')
|
|
199
|
+
}
|
|
200
|
+
const words = []
|
|
201
|
+
for (let i = 0; i < buf.length / 4; i++) {
|
|
202
|
+
const val =
|
|
203
|
+
(buf[i * 4] * 0x1000000) + // Shift the first byte by 24 bits
|
|
204
|
+
((buf[i * 4 + 1] << 16) | // Shift the second byte by 16 bits
|
|
205
|
+
(buf[i * 4 + 2] << 8) | // Shift the third byte by 8 bits
|
|
206
|
+
buf[i * 4 + 3]) // The fourth byte
|
|
207
|
+
words.push(val)
|
|
208
|
+
}
|
|
209
|
+
return words
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public static words2Buf(words: number[]): number[] {
|
|
213
|
+
const buf = new Array(words.length * 4)
|
|
214
|
+
|
|
215
|
+
for (let i = 0; i < words.length; i++) {
|
|
216
|
+
const word = words[i];
|
|
217
|
+
buf[i * 4] = (word >>> 24) & 0xFF;
|
|
218
|
+
buf[i * 4 + 1] = (word >>> 16) & 0xFF;
|
|
219
|
+
buf[i * 4 + 2] = (word >>> 8) & 0xFF;
|
|
220
|
+
buf[i * 4 + 3] = word & 0xFF;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return buf
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
class CBC {
|
|
228
|
+
public static buf2BlocksBuf(buf: number[], blockSize: number): number[][] {
|
|
229
|
+
const bytesize = blockSize / 8
|
|
230
|
+
const blockBufs = []
|
|
231
|
+
|
|
232
|
+
for (let i = 0; i <= buf.length / bytesize; i++) {
|
|
233
|
+
let blockBuf = buf.slice(i * bytesize, i * bytesize + bytesize)
|
|
234
|
+
|
|
235
|
+
if (blockBuf.length < blockSize) {
|
|
236
|
+
blockBuf = CBC.pkcs7Pad(blockBuf, blockSize)
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
blockBufs.push(blockBuf)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return blockBufs
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
public static blockBufs2Buf(blockBufs: number[][]): number[] {
|
|
246
|
+
let last = blockBufs[blockBufs.length - 1]
|
|
247
|
+
last = CBC.pkcs7Unpad(last)
|
|
248
|
+
blockBufs[blockBufs.length - 1] = last
|
|
249
|
+
|
|
250
|
+
const buf = blockBufs.flat()
|
|
251
|
+
|
|
252
|
+
return buf
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public static encrypt(
|
|
256
|
+
messageBuf: number[],
|
|
257
|
+
ivBuf: number[],
|
|
258
|
+
blockCipher: any /* TODO: type */,
|
|
259
|
+
cipherKeyBuf: number[]
|
|
260
|
+
): number[] {
|
|
261
|
+
const blockSize = ivBuf.length * 8
|
|
262
|
+
const blockBufs = CBC.buf2BlocksBuf(messageBuf, blockSize)
|
|
263
|
+
const encBufs = CBC.encryptBlocks(blockBufs, ivBuf, blockCipher, cipherKeyBuf)
|
|
264
|
+
const encBuf = encBufs.flat()
|
|
265
|
+
return encBuf
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
public static decrypt(
|
|
269
|
+
encBuf: number[],
|
|
270
|
+
ivBuf: number[],
|
|
271
|
+
blockCipher: any /* TODO: type */,
|
|
272
|
+
cipherKeyBuf: number[]
|
|
273
|
+
): number[] {
|
|
274
|
+
const bytesize = ivBuf.length
|
|
275
|
+
const encBufs = []
|
|
276
|
+
for (let i = 0; i < encBuf.length / bytesize; i++) {
|
|
277
|
+
encBufs.push(encBuf.slice(i * bytesize, i * bytesize + bytesize))
|
|
278
|
+
}
|
|
279
|
+
const blockBufs = CBC.decryptBlocks(encBufs, ivBuf, blockCipher, cipherKeyBuf)
|
|
280
|
+
const buf = CBC.blockBufs2Buf(blockBufs)
|
|
281
|
+
return buf
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
public static encryptBlock(
|
|
285
|
+
blockBuf: number[],
|
|
286
|
+
ivBuf: number[],
|
|
287
|
+
blockCipher: any /* TODO: type */,
|
|
288
|
+
cipherKeyBuf: number[]
|
|
289
|
+
): number[] {
|
|
290
|
+
const xorbuf = CBC.xorBufs(blockBuf, ivBuf)
|
|
291
|
+
const encBuf = blockCipher.encrypt(xorbuf, cipherKeyBuf)
|
|
292
|
+
return encBuf
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
public static decryptBlock(
|
|
296
|
+
encBuf: number[],
|
|
297
|
+
ivBuf: number[],
|
|
298
|
+
blockCipher: any /* TODO: type */,
|
|
299
|
+
cipherKeyBuf: number[]
|
|
300
|
+
): number[] {
|
|
301
|
+
const xorbuf = blockCipher.decrypt(encBuf, cipherKeyBuf)
|
|
302
|
+
const blockBuf = CBC.xorBufs(xorbuf, ivBuf)
|
|
303
|
+
return blockBuf
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
public static encryptBlocks(
|
|
307
|
+
blockBufs: number[][],
|
|
308
|
+
ivBuf: number[],
|
|
309
|
+
blockCipher: any /* TODO: type */,
|
|
310
|
+
cipherKeyBuf: number[]
|
|
311
|
+
): number[][] {
|
|
312
|
+
const encBufs = []
|
|
313
|
+
|
|
314
|
+
for (let i = 0; i < blockBufs.length; i++) {
|
|
315
|
+
const blockBuf = blockBufs[i]
|
|
316
|
+
const encBuf = CBC.encryptBlock(blockBuf, ivBuf, blockCipher, cipherKeyBuf)
|
|
317
|
+
|
|
318
|
+
encBufs.push(encBuf)
|
|
319
|
+
|
|
320
|
+
ivBuf = encBuf
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return encBufs
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
public static decryptBlocks(
|
|
327
|
+
encBufs: number[][],
|
|
328
|
+
ivBuf: number[],
|
|
329
|
+
blockCipher: any /* TODO: type */,
|
|
330
|
+
cipherKeyBuf: number[]
|
|
331
|
+
): number[][] {
|
|
332
|
+
const blockBufs = []
|
|
333
|
+
|
|
334
|
+
for (let i = 0; i < encBufs.length; i++) {
|
|
335
|
+
const encBuf = encBufs[i]
|
|
336
|
+
const blockBuf = CBC.decryptBlock(encBuf, ivBuf, blockCipher, cipherKeyBuf)
|
|
337
|
+
|
|
338
|
+
blockBufs.push(blockBuf)
|
|
339
|
+
|
|
340
|
+
ivBuf = encBuf
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return blockBufs
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
public static pkcs7Pad(buf: number[], blockSize: number): number[] {
|
|
347
|
+
const bytesize = blockSize / 8
|
|
348
|
+
const padbytesize = bytesize - buf.length
|
|
349
|
+
const pad = new Array(padbytesize)
|
|
350
|
+
pad.fill(padbytesize)
|
|
351
|
+
const paddedbuf = [...buf, ...pad]
|
|
352
|
+
return paddedbuf
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
public static pkcs7Unpad(paddedbuf: number[]): number[] {
|
|
356
|
+
const padlength = paddedbuf[paddedbuf.length - 1]
|
|
357
|
+
const padbuf = paddedbuf.slice(paddedbuf.length - padlength, paddedbuf.length)
|
|
358
|
+
const padbuf2 = new Array(padlength)
|
|
359
|
+
padbuf2.fill(padlength)
|
|
360
|
+
if (toHex(padbuf) !== toHex(padbuf2)) {
|
|
361
|
+
throw new Error('invalid padding')
|
|
362
|
+
}
|
|
363
|
+
return paddedbuf.slice(0, paddedbuf.length - padlength)
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
public static xorBufs(buf1: number[], buf2: number[]): number[] {
|
|
367
|
+
if (buf1.length !== buf2.length) {
|
|
368
|
+
throw new Error('bufs must have the same length')
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const buf = new Array(buf1.length)
|
|
372
|
+
|
|
373
|
+
for (let i = 0; i < buf1.length; i++) {
|
|
374
|
+
buf[i] = buf1[i] ^ buf2[i]
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return buf
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
class AESCBC {
|
|
382
|
+
public static encrypt(messageBuf: number[], cipherKeyBuf: number[], ivBuf: number[], concatIvBuf = true): number[] {
|
|
383
|
+
ivBuf = ivBuf || new Array(128 / 8).fill(0) || Random(128 / 8)
|
|
384
|
+
const ctBuf = CBC.encrypt(messageBuf, ivBuf, AESWrapper, cipherKeyBuf)
|
|
385
|
+
if (concatIvBuf) {
|
|
386
|
+
return [...ivBuf, ...ctBuf]
|
|
387
|
+
} else {
|
|
388
|
+
return [...ctBuf]
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
public static decrypt(encBuf: number[], cipherKeyBuf: number[], ivBuf?: number[]): number[] {
|
|
393
|
+
if (!ivBuf) {
|
|
394
|
+
ivBuf = encBuf.slice(0, 128 / 8)
|
|
395
|
+
const ctBuf = encBuf.slice(128 / 8)
|
|
396
|
+
return CBC.decrypt(ctBuf, ivBuf, AESWrapper, cipherKeyBuf)
|
|
397
|
+
} else {
|
|
398
|
+
const ctBuf = encBuf
|
|
399
|
+
return CBC.decrypt(ctBuf, ivBuf, AESWrapper, cipherKeyBuf)
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* @class ECIES
|
|
406
|
+
* Implements the Electrum ECIES protocol for encrypted communication.
|
|
407
|
+
*
|
|
408
|
+
* @prprecated This class is deprecated in favor of the BRC-78 standard for portable encrypted messages,
|
|
409
|
+
* which provides a more comprehensive and secure solution by integrating with BRC-42 and BRC-43 standards.
|
|
410
|
+
*/
|
|
411
|
+
export default class ECIES {
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Generates the initialization vector (iv), encryption key (kE), and MAC key (kM)
|
|
415
|
+
* using the sender's private key and receiver's public key.
|
|
416
|
+
*
|
|
417
|
+
* @param {PrivateKey} privKey - The sender's private key.
|
|
418
|
+
* @param {PublicKey} pubKey - The receiver's public key.
|
|
419
|
+
* @returns {Object} An object containing the iv, kE, and kM as number arrays.
|
|
420
|
+
*/
|
|
421
|
+
public static ivkEkM(privKey: PrivateKey, pubKey: PublicKey): { iv: number[]; kE: number[]; kM: number[] } {
|
|
422
|
+
const r = privKey
|
|
423
|
+
const KB = pubKey
|
|
424
|
+
const P = KB.mul(r)
|
|
425
|
+
const S = new PublicKey(P.x, P.y)
|
|
426
|
+
const Sbuf = S.encode(true) as number[]
|
|
427
|
+
const hash = Hash.sha512(Sbuf) as number[]
|
|
428
|
+
return {
|
|
429
|
+
iv: hash.slice(0, 16),
|
|
430
|
+
kE: hash.slice(16, 32),
|
|
431
|
+
kM: hash.slice(32, 64),
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Encrypts a given message using the Electrum ECIES method.
|
|
437
|
+
*
|
|
438
|
+
* @param {number[]} messageBuf - The message to be encrypted, in number array format.
|
|
439
|
+
* @param {PublicKey} toPublicKey - The public key of the recipient.
|
|
440
|
+
* @param {PrivateKey} [fromPrivateKey] - The private key of the sender. If not provided, a random private key is used.
|
|
441
|
+
* @param {boolean} [noKey=false] - If true, does not include the sender's public key in the encrypted message.
|
|
442
|
+
* @returns {number[]} The encrypted message as a number array.
|
|
443
|
+
*/
|
|
444
|
+
public static electrumEncrypt(messageBuf: number[], toPublicKey: PublicKey, fromPrivateKey?: PrivateKey, noKey = false): number[] {
|
|
445
|
+
let Rbuf
|
|
446
|
+
if (fromPrivateKey === null) {
|
|
447
|
+
fromPrivateKey = PrivateKey.fromRandom()
|
|
448
|
+
}
|
|
449
|
+
if (!noKey) {
|
|
450
|
+
Rbuf = fromPrivateKey.toPublicKey().encode(true)
|
|
451
|
+
}
|
|
452
|
+
const { iv, kE, kM } = ECIES.ivkEkM(fromPrivateKey, toPublicKey)
|
|
453
|
+
const ciphertext = AESCBC.encrypt(messageBuf, kE, iv, false)
|
|
454
|
+
const BIE1 = toArray('BIE1', 'utf8')
|
|
455
|
+
let encBuf: number[]
|
|
456
|
+
if (Rbuf) {
|
|
457
|
+
encBuf = [...BIE1, ...Rbuf, ...ciphertext]
|
|
458
|
+
} else {
|
|
459
|
+
encBuf = [...BIE1, ...ciphertext]
|
|
460
|
+
}
|
|
461
|
+
const hmac = Hash.sha256hmac(kM, encBuf) as number[]
|
|
462
|
+
return [...encBuf, ...hmac]
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Decrypts a message encrypted using the Electrum ECIES method.
|
|
467
|
+
*
|
|
468
|
+
* @param {number[]} encBuf - The encrypted message buffer.
|
|
469
|
+
* @param {PrivateKey} toPrivateKey - The private key of the recipient.
|
|
470
|
+
* @param {PublicKey} [fromPublicKey=null] - The public key of the sender. If not provided, it is extracted from the message.
|
|
471
|
+
* @returns {number[]} The decrypted message as a number array.
|
|
472
|
+
*/
|
|
473
|
+
public static electrumDecrypt(encBuf: number[], toPrivateKey: PrivateKey, fromPublicKey: PublicKey = null): number[] {
|
|
474
|
+
const tagLength = 32
|
|
475
|
+
|
|
476
|
+
const magic = encBuf.slice(0, 4)
|
|
477
|
+
if (encode(magic, 'utf8') !== 'BIE1') {
|
|
478
|
+
throw new Error('Invalid Magic')
|
|
479
|
+
}
|
|
480
|
+
let offset = 4
|
|
481
|
+
if (fromPublicKey === null) {
|
|
482
|
+
// BIE1 use compressed public key, length is always 33.
|
|
483
|
+
const pub = encBuf.slice(4, 37)
|
|
484
|
+
fromPublicKey = PublicKey.fromString(toHex(pub))
|
|
485
|
+
offset = 37
|
|
486
|
+
}
|
|
487
|
+
const { iv, kE, kM } = ECIES.ivkEkM(toPrivateKey, fromPublicKey)
|
|
488
|
+
const ciphertext = encBuf.slice(offset, encBuf.length - tagLength)
|
|
489
|
+
const hmac = encBuf.slice(encBuf.length - tagLength, encBuf.length)
|
|
490
|
+
|
|
491
|
+
const hmac2 = Hash.sha256hmac(kM, encBuf.slice(0, encBuf.length - tagLength)) as number[]
|
|
492
|
+
|
|
493
|
+
if (toHex(hmac) !== toHex(hmac2)) {
|
|
494
|
+
throw new Error('Invalid checksum')
|
|
495
|
+
}
|
|
496
|
+
return AESCBC.decrypt(ciphertext, kE, iv)
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Encrypts a given message using the Bitcore variant of ECIES.
|
|
501
|
+
*
|
|
502
|
+
* @param {number[]} messageBuf - The message to be encrypted, in number array format.
|
|
503
|
+
* @param {PublicKey} toPublicKey - The public key of the recipient.
|
|
504
|
+
* @param {PrivateKey} [fromPrivateKey] - The private key of the sender. If not provided, a random private key is used.
|
|
505
|
+
* @param {number[]} [ivBuf] - The initialization vector for encryption. If not provided, a random IV is used.
|
|
506
|
+
* @returns {number[]} The encrypted message as a number array.
|
|
507
|
+
*/
|
|
508
|
+
public static bitcoreEncrypt(messageBuf: number[], toPublicKey: PublicKey, fromPrivateKey?: PrivateKey, ivBuf?: number[]): number[] {
|
|
509
|
+
if (!fromPrivateKey) {
|
|
510
|
+
fromPrivateKey = PrivateKey.fromRandom()
|
|
511
|
+
}
|
|
512
|
+
const r = fromPrivateKey
|
|
513
|
+
const RPublicKey = fromPrivateKey.toPublicKey()
|
|
514
|
+
const RBuf = RPublicKey.encode(true) as number[]
|
|
515
|
+
const KB = toPublicKey
|
|
516
|
+
const P = KB.mul(r)
|
|
517
|
+
const S = P.getX()
|
|
518
|
+
const Sbuf = S.toArray('be', 32)
|
|
519
|
+
const kEkM = Hash.sha512(Sbuf) as number[]
|
|
520
|
+
const kE = kEkM.slice(0, 32)
|
|
521
|
+
const kM = kEkM.slice(32, 64)
|
|
522
|
+
const c = AESCBC.encrypt(messageBuf, kE, ivBuf)
|
|
523
|
+
const d = Hash.sha256hmac(kM, [...c]) as number[]
|
|
524
|
+
const encBuf = [...RBuf, ...c, ...d]
|
|
525
|
+
return encBuf
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Decrypts a message encrypted using the Bitcore variant of ECIES.
|
|
530
|
+
*
|
|
531
|
+
* @param {number[]} encBuf - The encrypted message buffer.
|
|
532
|
+
* @param {PrivateKey} toPrivateKey - The private key of the recipient.
|
|
533
|
+
* @returns {number[]} The decrypted message as a number array.
|
|
534
|
+
*/
|
|
535
|
+
public static bitcoreDecrypt(encBuf: number[], toPrivateKey: PrivateKey): number[] {
|
|
536
|
+
const kB = toPrivateKey
|
|
537
|
+
const fromPublicKey = PublicKey.fromString(toHex(encBuf.slice(0, 33)))
|
|
538
|
+
const R = fromPublicKey
|
|
539
|
+
const P = R.mul(kB)
|
|
540
|
+
if (P.eq(new Point(0, 0))) {
|
|
541
|
+
throw new Error('P equals 0')
|
|
542
|
+
}
|
|
543
|
+
const S = P.getX()
|
|
544
|
+
const Sbuf = S.toArray('be', 32)
|
|
545
|
+
const kEkM = Hash.sha512(Sbuf) as number[]
|
|
546
|
+
const kE = kEkM.slice(0, 32)
|
|
547
|
+
const kM = kEkM.slice(32, 64)
|
|
548
|
+
const c = encBuf.slice(33, encBuf.length - 32)
|
|
549
|
+
const d = encBuf.slice(encBuf.length - 32, encBuf.length)
|
|
550
|
+
const d2 = Hash.sha256hmac(kM, c) as number[]
|
|
551
|
+
if (toHex(d) !== toHex(d2)) {
|
|
552
|
+
throw new Error('Invalid checksum')
|
|
553
|
+
}
|
|
554
|
+
const messageBuf = AESCBC.decrypt(c, kE)
|
|
555
|
+
return [...messageBuf]
|
|
556
|
+
}
|
|
557
|
+
}
|