@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,410 @@
|
|
|
1
|
+
import BasePoint from './BasePoint.js'
|
|
2
|
+
import BigNumber from './BigNumber.js'
|
|
3
|
+
import Point from './Point.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The `JacobianPoint` class extends the `BasePoint` class for handling Jacobian coordinates on an Elliptic Curve.
|
|
7
|
+
* This class defines the properties and the methods needed to work with points in Jacobian coordinates.
|
|
8
|
+
*
|
|
9
|
+
* The Jacobian coordinates represent a point (x, y, z) on an Elliptic Curve such that the usual (x, y) coordinates are given by (x/z^2, y/z^3).
|
|
10
|
+
*
|
|
11
|
+
* @property x - The `x` coordinate of the point in the Jacobian form.
|
|
12
|
+
* @property y - The `y` coordinate of the point in the Jacobian form.
|
|
13
|
+
* @property z - The `z` coordinate of the point in the Jacobian form.
|
|
14
|
+
* @property zOne - Flag that indicates if the `z` coordinate is one.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const pointJ = new JacobianPoint('3', '4', '1');
|
|
18
|
+
*/
|
|
19
|
+
export default class JacobianPoint extends BasePoint {
|
|
20
|
+
x: BigNumber
|
|
21
|
+
y: BigNumber
|
|
22
|
+
z: BigNumber
|
|
23
|
+
zOne: boolean
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Constructs a new `JacobianPoint` instance.
|
|
27
|
+
*
|
|
28
|
+
* @param x - If `null`, the x-coordinate will default to the curve's defined 'one' constant.
|
|
29
|
+
* If `x` is not a BigNumber, `x` will be converted to a `BigNumber` assuming it is a hex string.
|
|
30
|
+
*
|
|
31
|
+
* @param y - If `null`, the y-coordinate will default to the curve's defined 'one' constant.
|
|
32
|
+
* If `y` is not a BigNumber, `y` will be converted to a `BigNumber` assuming it is a hex string.
|
|
33
|
+
*
|
|
34
|
+
* @param z - If `null`, the z-coordinate will default to 0.
|
|
35
|
+
* If `z` is not a BigNumber, `z` will be converted to a `BigNumber` assuming it is a hex string.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* const pointJ1 = new JacobianPoint(null, null, null); // creates point at infinity
|
|
39
|
+
* const pointJ2 = new JacobianPoint('3', '4', '1'); // creates point (3, 4, 1)
|
|
40
|
+
*/
|
|
41
|
+
constructor (
|
|
42
|
+
x: string | BigNumber | null,
|
|
43
|
+
y: string | BigNumber | null,
|
|
44
|
+
z: string | BigNumber | null
|
|
45
|
+
) {
|
|
46
|
+
super('jacobian')
|
|
47
|
+
if (x === null && y === null && z === null) {
|
|
48
|
+
this.x = this.curve.one
|
|
49
|
+
this.y = this.curve.one
|
|
50
|
+
this.z = new BigNumber(0)
|
|
51
|
+
} else {
|
|
52
|
+
if (!BigNumber.isBN(x)) {
|
|
53
|
+
x = new BigNumber(x as string, 16)
|
|
54
|
+
}
|
|
55
|
+
this.x = x as BigNumber
|
|
56
|
+
if (!BigNumber.isBN(y)) {
|
|
57
|
+
y = new BigNumber(y as string, 16)
|
|
58
|
+
}
|
|
59
|
+
this.y = y as BigNumber
|
|
60
|
+
if (!BigNumber.isBN(z)) {
|
|
61
|
+
z = new BigNumber(z as string, 16)
|
|
62
|
+
}
|
|
63
|
+
this.z = z as BigNumber
|
|
64
|
+
}
|
|
65
|
+
if (this.x.red == null) { this.x = this.x.toRed(this.curve.red) }
|
|
66
|
+
if (this.y.red == null) { this.y = this.y.toRed(this.curve.red) }
|
|
67
|
+
if (this.z.red == null) { this.z = this.z.toRed(this.curve.red) }
|
|
68
|
+
|
|
69
|
+
this.zOne = this.z === this.curve.one
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Converts the `JacobianPoint` object instance to standard affine `Point` format and returns `Point` type.
|
|
74
|
+
*
|
|
75
|
+
* @returns The `Point`(affine) object representing the same point as the original `JacobianPoint`.
|
|
76
|
+
*
|
|
77
|
+
* If the initial `JacobianPoint` represents point at infinity, an instance of `Point` at infinity is returned.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* const pointJ = new JacobianPoint('3', '4', '1');
|
|
81
|
+
* const pointP = pointJ.toP(); // The point in affine coordinates.
|
|
82
|
+
*/
|
|
83
|
+
toP (): Point {
|
|
84
|
+
if (this.isInfinity()) {
|
|
85
|
+
return new Point(null, null)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const zinv = this.z.redInvm()
|
|
89
|
+
const zinv2 = zinv.redSqr()
|
|
90
|
+
const ax = this.x.redMul(zinv2)
|
|
91
|
+
const ay = this.y.redMul(zinv2).redMul(zinv)
|
|
92
|
+
|
|
93
|
+
return new Point(ax, ay)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Negation operation. It returns the additive inverse of the Jacobian point.
|
|
98
|
+
*
|
|
99
|
+
* @method neg
|
|
100
|
+
* @returns Returns a new Jacobian point as the result of the negation.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* const jp = new JacobianPoint(x, y, z)
|
|
104
|
+
* const result = jp.neg()
|
|
105
|
+
*/
|
|
106
|
+
neg (): JacobianPoint {
|
|
107
|
+
return new JacobianPoint(this.x, this.y.redNeg(), this.z)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Addition operation in the Jacobian coordinates. It takes a Jacobian point as an argument
|
|
112
|
+
* and returns a new Jacobian point as a result of the addition. In the special cases,
|
|
113
|
+
* when either one of the points is the point at infinity, it will return the other point.
|
|
114
|
+
*
|
|
115
|
+
* @method add
|
|
116
|
+
* @param p - The Jacobian point to be added.
|
|
117
|
+
* @returns Returns a new Jacobian point as the result of the addition.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* const p1 = new JacobianPoint(x1, y1, z1)
|
|
121
|
+
* const p2 = new JacobianPoint(x2, y2, z2)
|
|
122
|
+
* const result = p1.add(p2)
|
|
123
|
+
*/
|
|
124
|
+
add (p: JacobianPoint): JacobianPoint {
|
|
125
|
+
// O + P = P
|
|
126
|
+
if (this.isInfinity()) { return p }
|
|
127
|
+
|
|
128
|
+
// P + O = P
|
|
129
|
+
if (p.isInfinity()) { return this }
|
|
130
|
+
|
|
131
|
+
// 12M + 4S + 7A
|
|
132
|
+
const pz2 = p.z.redSqr()
|
|
133
|
+
const z2 = this.z.redSqr()
|
|
134
|
+
const u1 = this.x.redMul(pz2)
|
|
135
|
+
const u2 = p.x.redMul(z2)
|
|
136
|
+
const s1 = this.y.redMul(pz2.redMul(p.z))
|
|
137
|
+
const s2 = p.y.redMul(z2.redMul(this.z))
|
|
138
|
+
|
|
139
|
+
const h = u1.redSub(u2)
|
|
140
|
+
const r = s1.redSub(s2)
|
|
141
|
+
if (h.cmpn(0) === 0) {
|
|
142
|
+
if (r.cmpn(0) !== 0) {
|
|
143
|
+
return new JacobianPoint(null, null, null)
|
|
144
|
+
} else {
|
|
145
|
+
return this.dbl()
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const h2 = h.redSqr()
|
|
150
|
+
const h3 = h2.redMul(h)
|
|
151
|
+
const v = u1.redMul(h2)
|
|
152
|
+
|
|
153
|
+
const nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v)
|
|
154
|
+
const ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3))
|
|
155
|
+
const nz = this.z.redMul(p.z).redMul(h)
|
|
156
|
+
|
|
157
|
+
return new JacobianPoint(nx, ny, nz)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Mixed addition operation. This function combines the standard point addition with
|
|
162
|
+
* the transformation from the affine to Jacobian coordinates. It first converts
|
|
163
|
+
* the affine point to Jacobian, and then preforms the addition.
|
|
164
|
+
*
|
|
165
|
+
* @method mixedAdd
|
|
166
|
+
* @param p - The affine point to be added.
|
|
167
|
+
* @returns Returns the result of the mixed addition as a new Jacobian point.
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* const jp = new JacobianPoint(x1, y1, z1)
|
|
171
|
+
* const ap = new Point(x2, y2)
|
|
172
|
+
* const result = jp.mixedAdd(ap)
|
|
173
|
+
*/
|
|
174
|
+
mixedAdd (p: Point): JacobianPoint {
|
|
175
|
+
// O + P = P
|
|
176
|
+
if (this.isInfinity()) { return p.toJ() }
|
|
177
|
+
|
|
178
|
+
// P + O = P
|
|
179
|
+
if (p.isInfinity()) { return this }
|
|
180
|
+
|
|
181
|
+
// 8M + 3S + 7A
|
|
182
|
+
const z2 = this.z.redSqr()
|
|
183
|
+
const u1 = this.x
|
|
184
|
+
const u2 = p.x.redMul(z2)
|
|
185
|
+
const s1 = this.y
|
|
186
|
+
const s2 = p.y.redMul(z2).redMul(this.z)
|
|
187
|
+
|
|
188
|
+
const h = u1.redSub(u2)
|
|
189
|
+
const r = s1.redSub(s2)
|
|
190
|
+
if (h.cmpn(0) === 0) {
|
|
191
|
+
if (r.cmpn(0) !== 0) {
|
|
192
|
+
return new JacobianPoint(null, null, null)
|
|
193
|
+
} else {
|
|
194
|
+
return this.dbl()
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const h2 = h.redSqr()
|
|
199
|
+
const h3 = h2.redMul(h)
|
|
200
|
+
const v = u1.redMul(h2)
|
|
201
|
+
|
|
202
|
+
const nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v)
|
|
203
|
+
const ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3))
|
|
204
|
+
const nz = this.z.redMul(h)
|
|
205
|
+
|
|
206
|
+
return new JacobianPoint(nx, ny, nz)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Multiple doubling operation. It doubles the Jacobian point as many times as the pow parameter specifies. If pow is 0 or the point is the point at infinity, it will return the point itself.
|
|
211
|
+
*
|
|
212
|
+
* @method dblp
|
|
213
|
+
* @param pow - The number of times the point should be doubled.
|
|
214
|
+
* @returns Returns a new Jacobian point as the result of multiple doublings.
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* const jp = new JacobianPoint(x, y, z)
|
|
218
|
+
* const result = jp.dblp(3)
|
|
219
|
+
*/
|
|
220
|
+
dblp (pow: number): JacobianPoint {
|
|
221
|
+
if (pow === 0) {
|
|
222
|
+
return this
|
|
223
|
+
}
|
|
224
|
+
if (this.isInfinity()) {
|
|
225
|
+
return this
|
|
226
|
+
}
|
|
227
|
+
if (typeof pow === 'undefined') {
|
|
228
|
+
return this.dbl()
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* eslint-disable @typescript-eslint/no-this-alias */
|
|
232
|
+
let r = this as JacobianPoint
|
|
233
|
+
for (let i = 0; i < pow; i++) { r = r.dbl() }
|
|
234
|
+
return r
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Point doubling operation in the Jacobian coordinates. A special case is when the point is the point at infinity, in this case, this function will return the point itself.
|
|
239
|
+
*
|
|
240
|
+
* @method dbl
|
|
241
|
+
* @returns Returns a new Jacobian point as the result of the doubling.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* const jp = new JacobianPoint(x, y, z)
|
|
245
|
+
* const result = jp.dbl()
|
|
246
|
+
*/
|
|
247
|
+
dbl (): JacobianPoint {
|
|
248
|
+
if (this.isInfinity()) {
|
|
249
|
+
return this
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
let nx
|
|
253
|
+
let ny
|
|
254
|
+
let nz
|
|
255
|
+
// Z = 1
|
|
256
|
+
if (this.zOne) {
|
|
257
|
+
// hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html
|
|
258
|
+
// #doubling-mdbl-2007-bl
|
|
259
|
+
// 1M + 5S + 14A
|
|
260
|
+
|
|
261
|
+
// XX = X1^2
|
|
262
|
+
const xx = this.x.redSqr()
|
|
263
|
+
// YY = Y1^2
|
|
264
|
+
const yy = this.y.redSqr()
|
|
265
|
+
// YYYY = YY^2
|
|
266
|
+
const yyyy = yy.redSqr()
|
|
267
|
+
// S = 2 * ((X1 + YY)^2 - XX - YYYY)
|
|
268
|
+
let s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy)
|
|
269
|
+
s = s.redIAdd(s)
|
|
270
|
+
// M = 3 * XX + a; a = 0
|
|
271
|
+
const m = xx.redAdd(xx).redIAdd(xx)
|
|
272
|
+
// T = M ^ 2 - 2*S
|
|
273
|
+
const t = m.redSqr().redISub(s).redISub(s)
|
|
274
|
+
|
|
275
|
+
// 8 * YYYY
|
|
276
|
+
let yyyy8 = yyyy.redIAdd(yyyy)
|
|
277
|
+
yyyy8 = yyyy8.redIAdd(yyyy8)
|
|
278
|
+
yyyy8 = yyyy8.redIAdd(yyyy8)
|
|
279
|
+
|
|
280
|
+
// X3 = T
|
|
281
|
+
nx = t
|
|
282
|
+
// Y3 = M * (S - T) - 8 * YYYY
|
|
283
|
+
ny = m.redMul(s.redISub(t)).redISub(yyyy8)
|
|
284
|
+
// Z3 = 2*Y1
|
|
285
|
+
nz = this.y.redAdd(this.y)
|
|
286
|
+
} else {
|
|
287
|
+
// hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html
|
|
288
|
+
// #doubling-dbl-2009-l
|
|
289
|
+
// 2M + 5S + 13A
|
|
290
|
+
|
|
291
|
+
// A = X1^2
|
|
292
|
+
const a = this.x.redSqr()
|
|
293
|
+
// B = Y1^2
|
|
294
|
+
const b = this.y.redSqr()
|
|
295
|
+
// C = B^2
|
|
296
|
+
const c = b.redSqr()
|
|
297
|
+
// D = 2 * ((X1 + B)^2 - A - C)
|
|
298
|
+
let d = this.x.redAdd(b).redSqr().redISub(a).redISub(c)
|
|
299
|
+
d = d.redIAdd(d)
|
|
300
|
+
// E = 3 * A
|
|
301
|
+
const e = a.redAdd(a).redIAdd(a)
|
|
302
|
+
// F = E^2
|
|
303
|
+
const f = e.redSqr()
|
|
304
|
+
|
|
305
|
+
// 8 * C
|
|
306
|
+
let c8 = c.redIAdd(c)
|
|
307
|
+
c8 = c8.redIAdd(c8)
|
|
308
|
+
c8 = c8.redIAdd(c8)
|
|
309
|
+
|
|
310
|
+
// X3 = F - 2 * D
|
|
311
|
+
nx = f.redISub(d).redISub(d)
|
|
312
|
+
// Y3 = E * (D - X3) - 8 * C
|
|
313
|
+
ny = e.redMul(d.redISub(nx)).redISub(c8)
|
|
314
|
+
// Z3 = 2 * Y1 * Z1
|
|
315
|
+
nz = this.y.redMul(this.z)
|
|
316
|
+
nz = nz.redIAdd(nz)
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return new JacobianPoint(nx, ny, nz)
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Equality check operation. It checks whether the affine or Jacobian point is equal to this Jacobian point.
|
|
324
|
+
*
|
|
325
|
+
* @method eq
|
|
326
|
+
* @param p - The affine or Jacobian point to compare with.
|
|
327
|
+
* @returns Returns true if the points are equal, otherwise returns false.
|
|
328
|
+
*
|
|
329
|
+
* @example
|
|
330
|
+
* const jp1 = new JacobianPoint(x1, y1, z1)
|
|
331
|
+
* const jp2 = new JacobianPoint(x2, y2, z2)
|
|
332
|
+
* const areEqual = jp1.eq(jp2)
|
|
333
|
+
*/
|
|
334
|
+
eq (p: Point | JacobianPoint): boolean {
|
|
335
|
+
if (p.type === 'affine') { return this.eq((p as Point).toJ()) }
|
|
336
|
+
|
|
337
|
+
if (this === p) { return true }
|
|
338
|
+
|
|
339
|
+
// x1 * z2^2 == x2 * z1^2
|
|
340
|
+
const z2 = this.z.redSqr()
|
|
341
|
+
p = p as JacobianPoint
|
|
342
|
+
const pz2 = p.z.redSqr()
|
|
343
|
+
if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) {
|
|
344
|
+
return false
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// y1 * z2^3 == y2 * z1^3
|
|
348
|
+
const z3 = z2.redMul(this.z)
|
|
349
|
+
const pz3 = pz2.redMul(p.z)
|
|
350
|
+
return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Equality check operation in relation to an x coordinate of a point in projective coordinates.
|
|
355
|
+
* It checks whether the x coordinate of the Jacobian point is equal to the provided x coordinate
|
|
356
|
+
* of a point in projective coordinates.
|
|
357
|
+
*
|
|
358
|
+
* @method eqXToP
|
|
359
|
+
* @param x - The x coordinate of a point in projective coordinates.
|
|
360
|
+
* @returns Returns true if the x coordinates are equal, otherwise returns false.
|
|
361
|
+
*
|
|
362
|
+
* @example
|
|
363
|
+
* const jp = new JacobianPoint(x1, y1, z1)
|
|
364
|
+
* const isXEqual = jp.eqXToP(x2)
|
|
365
|
+
*/
|
|
366
|
+
eqXToP (x: BigNumber): boolean {
|
|
367
|
+
const zs = this.z.redSqr()
|
|
368
|
+
const rx = x.toRed(this.curve.red).redMul(zs)
|
|
369
|
+
if (this.x.cmp(rx) === 0) { return true }
|
|
370
|
+
|
|
371
|
+
const xc = x.clone()
|
|
372
|
+
const t = this.curve.redN.redMul(zs)
|
|
373
|
+
for (; ;) {
|
|
374
|
+
xc.iadd(this.curve.n)
|
|
375
|
+
if (xc.cmp(this.curve.p) >= 0) { return false }
|
|
376
|
+
|
|
377
|
+
rx.redIAdd(t)
|
|
378
|
+
if (this.x.cmp(rx) === 0) { return true }
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Returns the string representation of the JacobianPoint instance.
|
|
384
|
+
* @method inspect
|
|
385
|
+
* @returns Returns the string description of the JacobianPoint. If the JacobianPoint represents a point at infinity, the return value of this function is '<EC JPoint Infinity>'. For a normal point, it returns the string description format as '<EC JPoint x: x-coordinate y: y-coordinate z: z-coordinate>'.
|
|
386
|
+
*
|
|
387
|
+
* @example
|
|
388
|
+
* const point = new JacobianPoint('5', '6', '1');
|
|
389
|
+
* console.log(point.inspect()); // Output: '<EC JPoint x: 5 y: 6 z: 1>'
|
|
390
|
+
*/
|
|
391
|
+
inspect (): string {
|
|
392
|
+
if (this.isInfinity()) { return '<EC JPoint Infinity>' }
|
|
393
|
+
return '<EC JPoint x: ' + this.x.toString(16, 2) +
|
|
394
|
+
' y: ' + this.y.toString(16, 2) +
|
|
395
|
+
' z: ' + this.z.toString(16, 2) + '>'
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Checks whether the JacobianPoint instance represents a point at infinity.
|
|
400
|
+
* @method isInfinity
|
|
401
|
+
* @returns Returns true if the JacobianPoint's z-coordinate equals to zero (which represents the point at infinity in Jacobian coordinates). Returns false otherwise.
|
|
402
|
+
*
|
|
403
|
+
* @example
|
|
404
|
+
* const point = new JacobianPoint('5', '6', '0');
|
|
405
|
+
* console.log(point.isInfinity()); // Output: true
|
|
406
|
+
*/
|
|
407
|
+
isInfinity (): boolean {
|
|
408
|
+
return this.z.cmpn(0) === 0
|
|
409
|
+
}
|
|
410
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import Mersenne from './Mersenne.js'
|
|
2
|
+
import BigNumber from './BigNumber.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A class representing K-256, a prime number with optimizations, specifically used in the secp256k1 curve.
|
|
6
|
+
* It extends the functionalities of the Mersenne class.
|
|
7
|
+
* K-256 prime is represented as 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'
|
|
8
|
+
*
|
|
9
|
+
* @class K256
|
|
10
|
+
* @extends {Mersenne}
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const k256 = new K256();
|
|
14
|
+
*/
|
|
15
|
+
export default class K256 extends Mersenne {
|
|
16
|
+
/**
|
|
17
|
+
* Constructor for the K256 class.
|
|
18
|
+
* Creates an instance of K256 using the super constructor from Mersenne.
|
|
19
|
+
*
|
|
20
|
+
* @constructor
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const k256 = new K256();
|
|
24
|
+
*/
|
|
25
|
+
constructor () {
|
|
26
|
+
super(
|
|
27
|
+
'k256',
|
|
28
|
+
'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Splits a BigNumber into a new BigNumber based on specific computation
|
|
34
|
+
* rules. This method modifies the input and output big numbers.
|
|
35
|
+
*
|
|
36
|
+
* @method split
|
|
37
|
+
* @param input - The BigNumber to be split.
|
|
38
|
+
* @param output - The BigNumber that results from the split.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const input = new BigNumber(3456);
|
|
42
|
+
* const output = new BigNumber(0);
|
|
43
|
+
* k256.split(input, output);
|
|
44
|
+
*/
|
|
45
|
+
split (input: BigNumber, output: BigNumber): void {
|
|
46
|
+
// 256 = 9 * 26 + 22
|
|
47
|
+
const mask = 0x3fffff
|
|
48
|
+
|
|
49
|
+
const outLen = Math.min(input.length, 9)
|
|
50
|
+
let i = 0
|
|
51
|
+
for (; i < outLen; i++) {
|
|
52
|
+
output.words[i] = input.words[i]
|
|
53
|
+
}
|
|
54
|
+
output.length = outLen
|
|
55
|
+
|
|
56
|
+
if (input.length <= 9) {
|
|
57
|
+
input.words[0] = 0
|
|
58
|
+
input.length = 1
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Shift by 9 limbs
|
|
63
|
+
let prev = input.words[9]
|
|
64
|
+
output.words[output.length++] = prev & mask
|
|
65
|
+
|
|
66
|
+
for (i = 10; i < input.length; i++) {
|
|
67
|
+
const next = input.words[i] | 0
|
|
68
|
+
input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22)
|
|
69
|
+
prev = next
|
|
70
|
+
}
|
|
71
|
+
prev >>>= 22
|
|
72
|
+
input.words[i - 10] = prev
|
|
73
|
+
if (prev === 0 && input.length > 10) {
|
|
74
|
+
input.length -= 10
|
|
75
|
+
} else {
|
|
76
|
+
input.length -= 9
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Multiplies a BigNumber ('num') with the constant 'K' in-place and returns the result.
|
|
82
|
+
* 'K' is equal to 0x1000003d1 or in decimal representation: [ 64, 977 ].
|
|
83
|
+
*
|
|
84
|
+
* @method imulK
|
|
85
|
+
* @param num - The BigNumber to multiply with K.
|
|
86
|
+
* @returns Returns the mutated BigNumber after multiplication.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* const number = new BigNumber(12345);
|
|
90
|
+
* const result = k256.imulK(number);
|
|
91
|
+
*/
|
|
92
|
+
imulK (num: BigNumber): BigNumber {
|
|
93
|
+
// K = 0x1000003d1 = [ 0x40, 0x3d1 ]
|
|
94
|
+
num.words[num.length] = 0
|
|
95
|
+
num.words[num.length + 1] = 0
|
|
96
|
+
num.length += 2
|
|
97
|
+
|
|
98
|
+
// bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
|
|
99
|
+
let lo = 0
|
|
100
|
+
for (let i = 0; i < num.length; i++) {
|
|
101
|
+
const w = num.words[i] | 0
|
|
102
|
+
lo += w * 0x3d1
|
|
103
|
+
num.words[i] = lo & 0x3ffffff
|
|
104
|
+
lo = w * 0x40 + ((lo / 0x4000000) | 0)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Fast length reduction
|
|
108
|
+
if (num.words[num.length - 1] === 0) {
|
|
109
|
+
num.length--
|
|
110
|
+
if (num.words[num.length - 1] === 0) {
|
|
111
|
+
num.length--
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return num
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import BigNumber from './BigNumber.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A representation of a pseudo-Mersenne prime.
|
|
5
|
+
* A pseudo-Mersenne prime has the general form 2^n - k, where n and k are integers.
|
|
6
|
+
*
|
|
7
|
+
* @class Mersenne
|
|
8
|
+
*
|
|
9
|
+
* @property name - The identifier for the Mersenne instance.
|
|
10
|
+
* @property p - BigNumber equivalent to 2^n - k.
|
|
11
|
+
* @property k - The constant subtracted from 2^n to derive a pseudo-Mersenne prime.
|
|
12
|
+
* @property n - The exponent which determines the magnitude of the prime.
|
|
13
|
+
*/
|
|
14
|
+
export default class Mersenne {
|
|
15
|
+
name: string
|
|
16
|
+
p: BigNumber
|
|
17
|
+
k: BigNumber
|
|
18
|
+
n: number
|
|
19
|
+
private readonly tmp: BigNumber
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @constructor
|
|
23
|
+
* @param name - An identifier for the Mersenne instance.
|
|
24
|
+
* @param p - A string representation of the pseudo-Mersenne prime, expressed in hexadecimal.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const mersenne = new Mersenne('M31', '7FFFFFFF');
|
|
28
|
+
*/
|
|
29
|
+
constructor (name: string, p: string) {
|
|
30
|
+
// P = 2 ^ N - K
|
|
31
|
+
this.name = name
|
|
32
|
+
this.p = new BigNumber(p, 16)
|
|
33
|
+
this.n = this.p.bitLength()
|
|
34
|
+
this.k = new BigNumber(1).iushln(this.n).isub(this.p)
|
|
35
|
+
|
|
36
|
+
this.tmp = this._tmp()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Creates a temporary BigNumber structure for computations,
|
|
41
|
+
* ensuring the appropriate number of words are initially allocated.
|
|
42
|
+
*
|
|
43
|
+
* @method _tmp
|
|
44
|
+
* @returns A BigNumber with scaled size depending on prime magnitude.
|
|
45
|
+
*/
|
|
46
|
+
private _tmp (): BigNumber {
|
|
47
|
+
const tmp = new BigNumber()
|
|
48
|
+
tmp.words = new Array(Math.ceil(this.n / 13))
|
|
49
|
+
return tmp
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Reduces an input BigNumber in place, under the assumption that
|
|
54
|
+
* it is less than the square of the pseudo-Mersenne prime.
|
|
55
|
+
*
|
|
56
|
+
* @method ireduce
|
|
57
|
+
* @param num - The BigNumber to be reduced.
|
|
58
|
+
* @returns The reduced BigNumber.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* const reduced = mersenne.ireduce(new BigNumber('2345', 16));
|
|
62
|
+
*/
|
|
63
|
+
ireduce (num: BigNumber): BigNumber {
|
|
64
|
+
// Assumes that `num` is less than `P^2`
|
|
65
|
+
// num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
|
|
66
|
+
let r = num
|
|
67
|
+
let rlen
|
|
68
|
+
|
|
69
|
+
do {
|
|
70
|
+
this.split(r, this.tmp)
|
|
71
|
+
r = this.imulK(r)
|
|
72
|
+
r = r.iadd(this.tmp)
|
|
73
|
+
rlen = r.bitLength()
|
|
74
|
+
} while (rlen > this.n)
|
|
75
|
+
|
|
76
|
+
const cmp = rlen < this.n ? -1 : r.ucmp(this.p)
|
|
77
|
+
if (cmp === 0) {
|
|
78
|
+
r.words[0] = 0
|
|
79
|
+
r.length = 1
|
|
80
|
+
} else if (cmp > 0) {
|
|
81
|
+
r.isub(this.p)
|
|
82
|
+
} else {
|
|
83
|
+
if (r.strip !== undefined) {
|
|
84
|
+
// r is a BN v4 instance
|
|
85
|
+
r.strip()
|
|
86
|
+
} else {
|
|
87
|
+
// r is a BN v5 instance
|
|
88
|
+
r.strip()
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return r
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Shifts bits of the input BigNumber to the right, in place,
|
|
97
|
+
* to meet the magnitude of the pseudo-Mersenne prime.
|
|
98
|
+
*
|
|
99
|
+
* @method split
|
|
100
|
+
* @param input - The BigNumber to be shifted.
|
|
101
|
+
* @param out - The BigNumber to hold the shifted result.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* mersenne.split(new BigNumber('2345', 16), new BigNumber());
|
|
105
|
+
*/
|
|
106
|
+
split (input: BigNumber, out: BigNumber): void {
|
|
107
|
+
input.iushrn(this.n, 0, out)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Performs an in-place multiplication of the parameter by constant k.
|
|
112
|
+
*
|
|
113
|
+
* @method imulK
|
|
114
|
+
* @param num - The BigNumber to multiply with k.
|
|
115
|
+
* @returns The result of the multiplication, in BigNumber format.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* const multiplied = mersenne.imulK(new BigNumber('2345', 16));
|
|
119
|
+
*/
|
|
120
|
+
imulK (num: BigNumber): BigNumber {
|
|
121
|
+
return num.imul(this.k)
|
|
122
|
+
}
|
|
123
|
+
}
|