@btc-vision/bitcoin 6.4.9 → 6.4.11
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/.babelrc +4 -4
- package/.mocharc.json +13 -13
- package/.prettierrc.json +12 -12
- package/CHANGELOG.md +403 -403
- package/CONTRIBUTING.md +83 -83
- package/LICENSE +21 -21
- package/README.md +201 -201
- package/browser/index.d.ts +1 -1
- package/browser/index.js +1 -1
- package/browser/{ops.d.ts → opcodes.d.ts} +2 -3
- package/browser/script.d.ts +2 -2
- package/build/address.js +2 -1
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/build/{ops.d.ts → opcodes.d.ts} +2 -3
- package/build/{ops.js → opcodes.js} +4 -5
- package/build/payments/embed.js +1 -1
- package/build/payments/p2ms.js +1 -1
- package/build/payments/p2op.js +1 -1
- package/build/payments/p2pk.js +1 -1
- package/build/payments/p2pkh.js +1 -1
- package/build/payments/p2sh.js +3 -3
- package/build/payments/p2tr.js +1 -1
- package/build/payments/p2wpkh.js +2 -2
- package/build/payments/p2wsh.js +2 -2
- package/build/push_data.js +9 -9
- package/build/script.d.ts +2 -2
- package/build/script.js +12 -12
- package/build/transaction.js +1 -1
- package/cjs/package.json +3 -3
- package/gulpfile.js +42 -42
- package/package.json +150 -150
- package/src/address.ts +304 -303
- package/src/bip66.ts +107 -107
- package/src/block.ts +233 -233
- package/src/bufferutils.ts +188 -188
- package/src/crypto.ts +108 -108
- package/src/ecc_lib.ts +94 -94
- package/src/hooks/AdvancedSignatureManager.ts +104 -104
- package/src/hooks/SignatureManager.ts +84 -84
- package/src/index.ts +105 -105
- package/src/merkle.ts +31 -31
- package/src/{ops.ts → opcodes.ts} +280 -282
- package/src/payments/bip341.ts +140 -140
- package/src/payments/embed.ts +61 -61
- package/src/payments/index.ts +172 -172
- package/src/payments/lazy.ts +28 -28
- package/src/payments/p2ms.ts +156 -156
- package/src/payments/p2op.ts +195 -195
- package/src/payments/p2pk.ts +93 -93
- package/src/payments/p2pkh.ts +214 -214
- package/src/payments/p2sh.ts +210 -210
- package/src/payments/p2tr.ts +309 -309
- package/src/payments/p2wpkh.ts +144 -144
- package/src/payments/p2wsh.ts +217 -217
- package/src/psbt/bip371.ts +441 -441
- package/src/push_data.ts +97 -97
- package/src/script.ts +247 -247
- package/src/script_number.ts +72 -72
- package/src/script_signature.ts +91 -91
- package/src/transaction.ts +656 -656
- package/test/address.spec.ts +155 -155
- package/test/bitcoin.core.spec.ts +212 -212
- package/test/block.spec.ts +171 -171
- package/test/bufferutils.spec.ts +450 -450
- package/test/crypto.spec.ts +49 -49
- package/test/fixtures/address.json +329 -329
- package/test/fixtures/block.json +148 -148
- package/test/fixtures/bufferutils.json +102 -102
- package/test/fixtures/core/README.md +26 -26
- package/test/fixtures/core/base58_encode_decode.json +50 -50
- package/test/fixtures/core/base58_keys_invalid.json +152 -152
- package/test/fixtures/core/base58_keys_valid.json +452 -452
- package/test/fixtures/core/blocks.json +27 -27
- package/test/fixtures/core/sig_canonical.json +7 -7
- package/test/fixtures/core/sig_noncanonical.json +33 -33
- package/test/fixtures/core/sighash.json +3505 -3505
- package/test/fixtures/core/tx_valid.json +2023 -2023
- package/test/fixtures/crypto.json +43 -43
- package/test/fixtures/ecdsa.json +217 -217
- package/test/fixtures/ecpair.json +141 -141
- package/test/fixtures/embed.json +108 -108
- package/test/fixtures/p2ms.json +434 -434
- package/test/fixtures/p2pk.json +179 -179
- package/test/fixtures/p2pkh.json +276 -276
- package/test/fixtures/p2sh.json +508 -508
- package/test/fixtures/p2tr.json +1198 -1198
- package/test/fixtures/p2wpkh.json +290 -290
- package/test/fixtures/p2wsh.json +489 -489
- package/test/fixtures/psbt.json +924 -924
- package/test/fixtures/script.json +465 -465
- package/test/fixtures/script_number.json +225 -225
- package/test/fixtures/signature.json +140 -140
- package/test/fixtures/transaction.json +916 -916
- package/test/integration/_regtest.ts +6 -6
- package/test/integration/addresses.spec.ts +142 -142
- package/test/integration/bip32.spec.ts +130 -130
- package/test/integration/blocks.spec.ts +28 -28
- package/test/integration/cltv.spec.ts +241 -241
- package/test/integration/csv.spec.ts +452 -452
- package/test/integration/payments.spec.ts +110 -110
- package/test/integration/taproot.spec.ts +663 -663
- package/test/integration/transactions.spec.ts +668 -668
- package/test/payments.spec.ts +114 -114
- package/test/payments.utils.ts +165 -165
- package/test/psbt.spec.ts +1285 -1285
- package/test/script.spec.ts +186 -186
- package/test/script_number.spec.ts +26 -26
- package/test/script_signature.spec.ts +66 -66
- package/test/transaction.spec.ts +337 -337
- package/test/ts-node-register.js +7 -7
- package/test/tsconfig.json +48 -48
- package/test/types.spec.ts +53 -53
- package/tsconfig.base.json +27 -27
- package/tsconfig.json +19 -19
- package/tsconfig.webpack.json +18 -18
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.ready +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.release-please-manifest.json +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CHANGELOG.md +0 -962
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CONTRIBUTING.md +0 -34
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/LICENSE +0 -24
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/README.md +0 -273
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/SECURITY.md +0 -2
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/addon.gypi +0 -204
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/bin/node-gyp.js +0 -138
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/.release-please-manifest.json +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/LICENSE +0 -28
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/ninja/build.ninja +0 -4
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc +0 -12
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/GypVsCMake.md +0 -116
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Hacking.md +0 -46
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/InputFormatReference.md +0 -1080
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/LanguageSpecification.md +0 -430
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/README.md +0 -27
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Testing.md +0 -450
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/UserDocumentation.md +0 -965
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp +0 -8
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp.bat +0 -5
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp_main.py +0 -45
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +0 -365
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +0 -206
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +0 -1272
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +0 -1547
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +0 -59
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +0 -153
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +0 -271
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +0 -574
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +0 -692
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common.py +0 -711
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +0 -171
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +0 -169
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +0 -113
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +0 -55
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +0 -804
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +0 -1173
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +0 -1318
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +0 -127
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +0 -103
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +0 -461
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +0 -89
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +0 -57
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +0 -2745
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +0 -3976
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +0 -44
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +0 -2964
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +0 -67
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +0 -1391
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +0 -25
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input.py +0 -3115
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +0 -98
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +0 -771
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +0 -1260
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +0 -174
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +0 -61
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +0 -373
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +0 -1938
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +0 -53
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +0 -302
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +0 -3198
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +0 -65
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE +0 -177
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD +0 -23
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +0 -15
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +0 -108
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +0 -252
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +0 -83
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +0 -359
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +0 -61
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +0 -192
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/markers.py +0 -252
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +0 -825
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +0 -90
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +0 -1030
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/tags.py +0 -553
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/utils.py +0 -172
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/version.py +0 -563
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pyproject.toml +0 -120
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/release-please-config.json +0 -11
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/test_gyp.py +0 -261
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/Find-VisualStudio.cs +0 -250
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/build.js +0 -227
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/clean.js +0 -15
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/configure.js +0 -328
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/create-config-gypi.js +0 -150
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/download.js +0 -39
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-node-directory.js +0 -63
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-python.js +0 -310
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-visualstudio.js +0 -590
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/install.js +0 -415
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/list.js +0 -26
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/log.js +0 -168
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/node-gyp.js +0 -188
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/process-release.js +0 -146
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/rebuild.js +0 -12
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/remove.js +0 -43
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/util.js +0 -81
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/macOS_Catalina_acid_test.sh +0 -21
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/package.json +0 -51
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/release-please-config.json +0 -40
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/src/win_delay_load_hook.cc +0 -39
- package/coverage/tmp/coverage-31752-1735543485354-0.json +0 -1
- package/coverage/tmp/coverage-59920-1735543484555-0.json +0 -1
- package/coverage/tmp/coverage-66252-1735543483919-0.json +0 -1
- package/coverage/tmp/coverage-68440-1735543485236-0.json +0 -1
- package/coverage/tmp/coverage-70588-1735543484426-0.json +0 -1
- package/coverage/tmp/coverage-79292-1735543485296-0.json +0 -1
- package/coverage/tmp/coverage-80212-1735543483980-0.json +0 -1
package/src/bip66.ts
CHANGED
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
// Reference https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki
|
|
2
|
-
// Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S]
|
|
3
|
-
// NOTE: SIGHASH byte ignored AND restricted, truncate before use
|
|
4
|
-
|
|
5
|
-
export function check(buffer: Buffer): boolean {
|
|
6
|
-
if (buffer.length < 8) return false;
|
|
7
|
-
if (buffer.length > 72) return false;
|
|
8
|
-
if (buffer[0] !== 0x30) return false;
|
|
9
|
-
if (buffer[1] !== buffer.length - 2) return false;
|
|
10
|
-
if (buffer[2] !== 0x02) return false;
|
|
11
|
-
|
|
12
|
-
const lenR = buffer[3];
|
|
13
|
-
if (lenR === 0) return false;
|
|
14
|
-
if (5 + lenR >= buffer.length) return false;
|
|
15
|
-
if (buffer[4 + lenR] !== 0x02) return false;
|
|
16
|
-
|
|
17
|
-
const lenS = buffer[5 + lenR];
|
|
18
|
-
if (lenS === 0) return false;
|
|
19
|
-
if (6 + lenR + lenS !== buffer.length) return false;
|
|
20
|
-
|
|
21
|
-
if (buffer[4] & 0x80) return false;
|
|
22
|
-
if (lenR > 1 && buffer[4] === 0x00 && !(buffer[5] & 0x80)) return false;
|
|
23
|
-
|
|
24
|
-
if (buffer[lenR + 6] & 0x80) return false;
|
|
25
|
-
if (lenS > 1 && buffer[lenR + 6] === 0x00 && !(buffer[lenR + 7] & 0x80)) return false;
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function decode(buffer: Buffer): { r: Buffer; s: Buffer } {
|
|
30
|
-
if (buffer.length < 8) throw new Error('DER sequence length is too short');
|
|
31
|
-
if (buffer.length > 72) throw new Error('DER sequence length is too long');
|
|
32
|
-
if (buffer[0] !== 0x30) throw new Error('Expected DER sequence');
|
|
33
|
-
if (buffer[1] !== buffer.length - 2) throw new Error('DER sequence length is invalid');
|
|
34
|
-
if (buffer[2] !== 0x02) throw new Error('Expected DER integer');
|
|
35
|
-
|
|
36
|
-
const lenR = buffer[3];
|
|
37
|
-
if (lenR === 0) throw new Error('R length is zero');
|
|
38
|
-
if (5 + lenR >= buffer.length) throw new Error('R length is too long');
|
|
39
|
-
if (buffer[4 + lenR] !== 0x02) throw new Error('Expected DER integer (2)');
|
|
40
|
-
|
|
41
|
-
const lenS = buffer[5 + lenR];
|
|
42
|
-
if (lenS === 0) throw new Error('S length is zero');
|
|
43
|
-
if (6 + lenR + lenS !== buffer.length) throw new Error('S length is invalid');
|
|
44
|
-
|
|
45
|
-
if (buffer[4] & 0x80) throw new Error('R value is negative');
|
|
46
|
-
if (lenR > 1 && buffer[4] === 0x00 && !(buffer[5] & 0x80))
|
|
47
|
-
throw new Error('R value excessively padded');
|
|
48
|
-
|
|
49
|
-
if (buffer[lenR + 6] & 0x80) throw new Error('S value is negative');
|
|
50
|
-
if (lenS > 1 && buffer[lenR + 6] === 0x00 && !(buffer[lenR + 7] & 0x80))
|
|
51
|
-
throw new Error('S value excessively padded');
|
|
52
|
-
|
|
53
|
-
// non-BIP66 - extract R, S values
|
|
54
|
-
return {
|
|
55
|
-
r: buffer.slice(4, 4 + lenR),
|
|
56
|
-
s: buffer.slice(6 + lenR),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/*
|
|
61
|
-
* Expects r and s to be positive DER integers.
|
|
62
|
-
*
|
|
63
|
-
* The DER format uses the most significant bit as a sign bit (& 0x80).
|
|
64
|
-
* If the significant bit is set AND the integer is positive, a 0x00 is prepended.
|
|
65
|
-
*
|
|
66
|
-
* Examples:
|
|
67
|
-
*
|
|
68
|
-
* 0 => 0x00
|
|
69
|
-
* 1 => 0x01
|
|
70
|
-
* -1 => 0xff
|
|
71
|
-
* 127 => 0x7f
|
|
72
|
-
* -127 => 0x81
|
|
73
|
-
* 128 => 0x0080
|
|
74
|
-
* -128 => 0x80
|
|
75
|
-
* 255 => 0x00ff
|
|
76
|
-
* -255 => 0xff01
|
|
77
|
-
* 16300 => 0x3fac
|
|
78
|
-
* -16300 => 0xc054
|
|
79
|
-
* 62300 => 0x00f35c
|
|
80
|
-
* -62300 => 0xff0ca4
|
|
81
|
-
*/
|
|
82
|
-
export function encode(r: Buffer, s: Buffer): Buffer {
|
|
83
|
-
const lenR = r.length;
|
|
84
|
-
const lenS = s.length;
|
|
85
|
-
if (lenR === 0) throw new Error('R length is zero');
|
|
86
|
-
if (lenS === 0) throw new Error('S length is zero');
|
|
87
|
-
if (lenR > 33) throw new Error('R length is too long');
|
|
88
|
-
if (lenS > 33) throw new Error('S length is too long');
|
|
89
|
-
if (r[0] & 0x80) throw new Error('R value is negative');
|
|
90
|
-
if (s[0] & 0x80) throw new Error('S value is negative');
|
|
91
|
-
if (lenR > 1 && r[0] === 0x00 && !(r[1] & 0x80)) throw new Error('R value excessively padded');
|
|
92
|
-
if (lenS > 1 && s[0] === 0x00 && !(s[1] & 0x80)) throw new Error('S value excessively padded');
|
|
93
|
-
|
|
94
|
-
const signature = Buffer.allocUnsafe(6 + lenR + lenS);
|
|
95
|
-
|
|
96
|
-
// 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S]
|
|
97
|
-
signature[0] = 0x30;
|
|
98
|
-
signature[1] = signature.length - 2;
|
|
99
|
-
signature[2] = 0x02;
|
|
100
|
-
signature[3] = r.length;
|
|
101
|
-
r.copy(signature, 4);
|
|
102
|
-
signature[4 + lenR] = 0x02;
|
|
103
|
-
signature[5 + lenR] = s.length;
|
|
104
|
-
s.copy(signature, 6 + lenR);
|
|
105
|
-
|
|
106
|
-
return signature;
|
|
107
|
-
}
|
|
1
|
+
// Reference https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki
|
|
2
|
+
// Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S]
|
|
3
|
+
// NOTE: SIGHASH byte ignored AND restricted, truncate before use
|
|
4
|
+
|
|
5
|
+
export function check(buffer: Buffer): boolean {
|
|
6
|
+
if (buffer.length < 8) return false;
|
|
7
|
+
if (buffer.length > 72) return false;
|
|
8
|
+
if (buffer[0] !== 0x30) return false;
|
|
9
|
+
if (buffer[1] !== buffer.length - 2) return false;
|
|
10
|
+
if (buffer[2] !== 0x02) return false;
|
|
11
|
+
|
|
12
|
+
const lenR = buffer[3];
|
|
13
|
+
if (lenR === 0) return false;
|
|
14
|
+
if (5 + lenR >= buffer.length) return false;
|
|
15
|
+
if (buffer[4 + lenR] !== 0x02) return false;
|
|
16
|
+
|
|
17
|
+
const lenS = buffer[5 + lenR];
|
|
18
|
+
if (lenS === 0) return false;
|
|
19
|
+
if (6 + lenR + lenS !== buffer.length) return false;
|
|
20
|
+
|
|
21
|
+
if (buffer[4] & 0x80) return false;
|
|
22
|
+
if (lenR > 1 && buffer[4] === 0x00 && !(buffer[5] & 0x80)) return false;
|
|
23
|
+
|
|
24
|
+
if (buffer[lenR + 6] & 0x80) return false;
|
|
25
|
+
if (lenS > 1 && buffer[lenR + 6] === 0x00 && !(buffer[lenR + 7] & 0x80)) return false;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function decode(buffer: Buffer): { r: Buffer; s: Buffer } {
|
|
30
|
+
if (buffer.length < 8) throw new Error('DER sequence length is too short');
|
|
31
|
+
if (buffer.length > 72) throw new Error('DER sequence length is too long');
|
|
32
|
+
if (buffer[0] !== 0x30) throw new Error('Expected DER sequence');
|
|
33
|
+
if (buffer[1] !== buffer.length - 2) throw new Error('DER sequence length is invalid');
|
|
34
|
+
if (buffer[2] !== 0x02) throw new Error('Expected DER integer');
|
|
35
|
+
|
|
36
|
+
const lenR = buffer[3];
|
|
37
|
+
if (lenR === 0) throw new Error('R length is zero');
|
|
38
|
+
if (5 + lenR >= buffer.length) throw new Error('R length is too long');
|
|
39
|
+
if (buffer[4 + lenR] !== 0x02) throw new Error('Expected DER integer (2)');
|
|
40
|
+
|
|
41
|
+
const lenS = buffer[5 + lenR];
|
|
42
|
+
if (lenS === 0) throw new Error('S length is zero');
|
|
43
|
+
if (6 + lenR + lenS !== buffer.length) throw new Error('S length is invalid');
|
|
44
|
+
|
|
45
|
+
if (buffer[4] & 0x80) throw new Error('R value is negative');
|
|
46
|
+
if (lenR > 1 && buffer[4] === 0x00 && !(buffer[5] & 0x80))
|
|
47
|
+
throw new Error('R value excessively padded');
|
|
48
|
+
|
|
49
|
+
if (buffer[lenR + 6] & 0x80) throw new Error('S value is negative');
|
|
50
|
+
if (lenS > 1 && buffer[lenR + 6] === 0x00 && !(buffer[lenR + 7] & 0x80))
|
|
51
|
+
throw new Error('S value excessively padded');
|
|
52
|
+
|
|
53
|
+
// non-BIP66 - extract R, S values
|
|
54
|
+
return {
|
|
55
|
+
r: buffer.slice(4, 4 + lenR),
|
|
56
|
+
s: buffer.slice(6 + lenR),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* Expects r and s to be positive DER integers.
|
|
62
|
+
*
|
|
63
|
+
* The DER format uses the most significant bit as a sign bit (& 0x80).
|
|
64
|
+
* If the significant bit is set AND the integer is positive, a 0x00 is prepended.
|
|
65
|
+
*
|
|
66
|
+
* Examples:
|
|
67
|
+
*
|
|
68
|
+
* 0 => 0x00
|
|
69
|
+
* 1 => 0x01
|
|
70
|
+
* -1 => 0xff
|
|
71
|
+
* 127 => 0x7f
|
|
72
|
+
* -127 => 0x81
|
|
73
|
+
* 128 => 0x0080
|
|
74
|
+
* -128 => 0x80
|
|
75
|
+
* 255 => 0x00ff
|
|
76
|
+
* -255 => 0xff01
|
|
77
|
+
* 16300 => 0x3fac
|
|
78
|
+
* -16300 => 0xc054
|
|
79
|
+
* 62300 => 0x00f35c
|
|
80
|
+
* -62300 => 0xff0ca4
|
|
81
|
+
*/
|
|
82
|
+
export function encode(r: Buffer, s: Buffer): Buffer {
|
|
83
|
+
const lenR = r.length;
|
|
84
|
+
const lenS = s.length;
|
|
85
|
+
if (lenR === 0) throw new Error('R length is zero');
|
|
86
|
+
if (lenS === 0) throw new Error('S length is zero');
|
|
87
|
+
if (lenR > 33) throw new Error('R length is too long');
|
|
88
|
+
if (lenS > 33) throw new Error('S length is too long');
|
|
89
|
+
if (r[0] & 0x80) throw new Error('R value is negative');
|
|
90
|
+
if (s[0] & 0x80) throw new Error('S value is negative');
|
|
91
|
+
if (lenR > 1 && r[0] === 0x00 && !(r[1] & 0x80)) throw new Error('R value excessively padded');
|
|
92
|
+
if (lenS > 1 && s[0] === 0x00 && !(s[1] & 0x80)) throw new Error('S value excessively padded');
|
|
93
|
+
|
|
94
|
+
const signature = Buffer.allocUnsafe(6 + lenR + lenS);
|
|
95
|
+
|
|
96
|
+
// 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S]
|
|
97
|
+
signature[0] = 0x30;
|
|
98
|
+
signature[1] = signature.length - 2;
|
|
99
|
+
signature[2] = 0x02;
|
|
100
|
+
signature[3] = r.length;
|
|
101
|
+
r.copy(signature, 4);
|
|
102
|
+
signature[4 + lenR] = 0x02;
|
|
103
|
+
signature[5 + lenR] = s.length;
|
|
104
|
+
s.copy(signature, 6 + lenR);
|
|
105
|
+
|
|
106
|
+
return signature;
|
|
107
|
+
}
|