@btc-vision/bitcoin 6.4.10 → 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/cjs/package.json +3 -3
- package/gulpfile.js +42 -42
- package/package.json +150 -150
- 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/opcodes.ts +280 -280
- 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/p2tr.ts +309 -309
- 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/browser/ops.d.ts +0 -126
- package/build/ops.d.ts +0 -126
- package/build/ops.js +0 -127
- 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/package.json
CHANGED
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@btc-vision/bitcoin",
|
|
3
|
-
"type": "module",
|
|
4
|
-
"version": "6.4.
|
|
5
|
-
"description": "Client-side Bitcoin JavaScript library",
|
|
6
|
-
"engines": {
|
|
7
|
-
"node": ">=16.0.0"
|
|
8
|
-
},
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"browser": "./browser/index.js",
|
|
12
|
-
"import": "./build/index.js",
|
|
13
|
-
"require": "./build/index.js",
|
|
14
|
-
"types": "./build/index.d.ts"
|
|
15
|
-
},
|
|
16
|
-
"./browser": {
|
|
17
|
-
"import": "./browser/index.js",
|
|
18
|
-
"require": "./browser/index.js",
|
|
19
|
-
"types": "./browser/index.d.ts"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"browser": {
|
|
23
|
-
"./build/index.js": "./browser/index.js",
|
|
24
|
-
"./build/index.d.ts": "./browser/index.d.ts",
|
|
25
|
-
"Buffer": "buffer",
|
|
26
|
-
"crypto": "./src/crypto/crypto-browser.js",
|
|
27
|
-
"stream": "stream-browserify",
|
|
28
|
-
"zlib": "browserify-zlib"
|
|
29
|
-
},
|
|
30
|
-
"keywords": [
|
|
31
|
-
"bitcoinjs",
|
|
32
|
-
"bitcoin",
|
|
33
|
-
"browserify",
|
|
34
|
-
"javascript",
|
|
35
|
-
"bitcoinjs"
|
|
36
|
-
],
|
|
37
|
-
"license": "MIT",
|
|
38
|
-
"main": "build/index.js",
|
|
39
|
-
"types": "build/index.d.ts",
|
|
40
|
-
"typings": "build/index.d.ts",
|
|
41
|
-
"module": "build/index.js",
|
|
42
|
-
"publishConfig": {
|
|
43
|
-
"access": "public",
|
|
44
|
-
"tag": "latest"
|
|
45
|
-
},
|
|
46
|
-
"repository": {
|
|
47
|
-
"type": "git",
|
|
48
|
-
"url": "https://github.com/btc-vision/bitcoin.git"
|
|
49
|
-
},
|
|
50
|
-
"scripts": {
|
|
51
|
-
"watch": "gulp watch",
|
|
52
|
-
"build": "gulp build",
|
|
53
|
-
"setup": "npm i && npm run build",
|
|
54
|
-
"browserBuild": "webpack --mode production",
|
|
55
|
-
"audit": "better-npm-audit audit -l high",
|
|
56
|
-
"build:tests": "npm run clean:jstests && tsc -p ./test/tsconfig.json",
|
|
57
|
-
"clean": "rimraf build",
|
|
58
|
-
"clean:jstests": "rimraf --glob \"test/**/!(ts-node-register).js\"",
|
|
59
|
-
"coverage-report": "npm run build && npm run nobuild:coverage-report",
|
|
60
|
-
"coverage-html": "npm run build && npm run nobuild:coverage-html",
|
|
61
|
-
"coverage": "npm run build && npm run nobuild:coverage",
|
|
62
|
-
"doc": "typedoc",
|
|
63
|
-
"format": "npm run prettier -- --write",
|
|
64
|
-
"formatjs": "npm run prettierjs -- --write",
|
|
65
|
-
"format:ci": "npm run prettier -- --check && npm run prettierjs -- --check",
|
|
66
|
-
"gitdiff:ci": "npm run build && git diff --exit-code",
|
|
67
|
-
"integration": "npm run build && npm run nobuild:integration",
|
|
68
|
-
"lint": "eslint src/**",
|
|
69
|
-
"lint:tests": "eslint test/**/*.spec.ts",
|
|
70
|
-
"mocha:ts": "cross-env TS_NODE_PROJECT=test/tsconfig.json mocha -n loader=ts-node/esm -n experimental-specifier-resolution=node --extension ts --timeout 10000 --recursive \"test/**/*.spec.ts\"",
|
|
71
|
-
"nobuild:coverage-report": "nyc report --reporter=lcov",
|
|
72
|
-
"nobuild:coverage-html": "nyc report --reporter=html",
|
|
73
|
-
"nobuild:coverage": "npm run build:tests && nyc --check-coverage --branches 85 --functions 90 --lines 90 mocha && npm run clean:jstests",
|
|
74
|
-
"nobuild:integration": "npm run mocha:ts -- --timeout 50000 'test/integration/*.ts'",
|
|
75
|
-
"nobuild:unit": "npm run mocha:ts -- 'test/*.ts'",
|
|
76
|
-
"prettier": "prettier \"src/**/*.ts\" \"test/**/*.ts\" --ignore-path ./.prettierignore",
|
|
77
|
-
"test": "npm run build && npm run format:ci && npm run lint && npm run nobuild:coverage",
|
|
78
|
-
"unit": "npm run build && npm run nobuild:unit"
|
|
79
|
-
},
|
|
80
|
-
"devDependencies": {
|
|
81
|
-
"@babel/core": "^7.27.1",
|
|
82
|
-
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
|
83
|
-
"@babel/plugin-transform-runtime": "^7.27.1",
|
|
84
|
-
"@babel/preset-env": "^7.27.2",
|
|
85
|
-
"@babel/preset-flow": "^7.27.1",
|
|
86
|
-
"@babel/preset-react": "^7.27.1",
|
|
87
|
-
"@babel/preset-typescript": "^7.27.1",
|
|
88
|
-
"@types/bs58check": "^2.1.2",
|
|
89
|
-
"@types/mocha": "^10.0.10",
|
|
90
|
-
"@types/node": "^22.15.21",
|
|
91
|
-
"@types/proxyquire": "^1.3.31",
|
|
92
|
-
"@types/randombytes": "^2.0.3",
|
|
93
|
-
"better-npm-audit": "^3.11.0",
|
|
94
|
-
"bip39": "^3.1.0",
|
|
95
|
-
"bip65": "^1.0.3",
|
|
96
|
-
"bip68": "^1.0.4",
|
|
97
|
-
"bs58": "^6.0.0",
|
|
98
|
-
"dhttp": "^3.0.3",
|
|
99
|
-
"ecpair": "^2.0.1",
|
|
100
|
-
"eslint": "
|
|
101
|
-
"gulp": "^5.0.0",
|
|
102
|
-
"gulp-cached": "^1.1.1",
|
|
103
|
-
"gulp-typescript": "^6.0.0-alpha.1",
|
|
104
|
-
"hoodwink": "^2.0.0",
|
|
105
|
-
"https-browserify": "^1.0.0",
|
|
106
|
-
"minimaldata": "^1.0.2",
|
|
107
|
-
"mocha": "^11.5.0",
|
|
108
|
-
"nyc": "^17.1.0",
|
|
109
|
-
"os-browserify": "^0.3.0",
|
|
110
|
-
"prettier": "^3.5.3",
|
|
111
|
-
"proxyquire": "^2.1.3",
|
|
112
|
-
"randombytes": "^2.1.0",
|
|
113
|
-
"regtest-client": "0.2.1",
|
|
114
|
-
"rimraf": "^6.0.1",
|
|
115
|
-
"stream-browserify": "^3.0.0",
|
|
116
|
-
"stream-http": "^3.2.0",
|
|
117
|
-
"tiny-secp256k1": "^2.2.3",
|
|
118
|
-
"ts-loader": "^9.5.2",
|
|
119
|
-
"ts-node": "^10.9.2",
|
|
120
|
-
"typedoc": "^0.28.5",
|
|
121
|
-
"typescript": "^5.8.3",
|
|
122
|
-
"typescript-eslint": "^8.32.1",
|
|
123
|
-
"webpack": "^5.99.9",
|
|
124
|
-
"webpack-cli": "^6.0.1"
|
|
125
|
-
},
|
|
126
|
-
"dependencies": {
|
|
127
|
-
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
|
|
128
|
-
"@btc-vision/logger": "^1.0.
|
|
129
|
-
"@eslint/js": "
|
|
130
|
-
"@noble/hashes": "^1.8.0",
|
|
131
|
-
"@noble/secp256k1": "^2.2.3",
|
|
132
|
-
"assert": "^2.1.0",
|
|
133
|
-
"babel-loader": "^10.0.0",
|
|
134
|
-
"babel-plugin-transform-import-meta": "^2.3.2",
|
|
135
|
-
"babel-preset-react": "^6.24.1",
|
|
136
|
-
"babelify": "^10.0.0",
|
|
137
|
-
"bip32": "^4.0.0",
|
|
138
|
-
"bech32": "^2.0.0",
|
|
139
|
-
"bip174": "^2.1.1",
|
|
140
|
-
"browserify-zlib": "^0.2.0",
|
|
141
|
-
"bs58check": "^4.0.0",
|
|
142
|
-
"buffer": "^6.0.3",
|
|
143
|
-
"gulp-clean": "^0.4.0",
|
|
144
|
-
"gulp-eslint-new": "^2.4.0",
|
|
145
|
-
"gulp-logger-new": "^1.0.1",
|
|
146
|
-
"process": "^0.11.10",
|
|
147
|
-
"typeforce": "^1.18.0",
|
|
148
|
-
"varuint-bitcoin": "^2.0.0"
|
|
149
|
-
}
|
|
150
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@btc-vision/bitcoin",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "6.4.11",
|
|
5
|
+
"description": "Client-side Bitcoin JavaScript library",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=16.0.0"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"browser": "./browser/index.js",
|
|
12
|
+
"import": "./build/index.js",
|
|
13
|
+
"require": "./build/index.js",
|
|
14
|
+
"types": "./build/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./browser": {
|
|
17
|
+
"import": "./browser/index.js",
|
|
18
|
+
"require": "./browser/index.js",
|
|
19
|
+
"types": "./browser/index.d.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"browser": {
|
|
23
|
+
"./build/index.js": "./browser/index.js",
|
|
24
|
+
"./build/index.d.ts": "./browser/index.d.ts",
|
|
25
|
+
"Buffer": "buffer",
|
|
26
|
+
"crypto": "./src/crypto/crypto-browser.js",
|
|
27
|
+
"stream": "stream-browserify",
|
|
28
|
+
"zlib": "browserify-zlib"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"bitcoinjs",
|
|
32
|
+
"bitcoin",
|
|
33
|
+
"browserify",
|
|
34
|
+
"javascript",
|
|
35
|
+
"bitcoinjs"
|
|
36
|
+
],
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"main": "build/index.js",
|
|
39
|
+
"types": "build/index.d.ts",
|
|
40
|
+
"typings": "build/index.d.ts",
|
|
41
|
+
"module": "build/index.js",
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public",
|
|
44
|
+
"tag": "latest"
|
|
45
|
+
},
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "https://github.com/btc-vision/bitcoin.git"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"watch": "gulp watch",
|
|
52
|
+
"build": "gulp build",
|
|
53
|
+
"setup": "npm i && npm run build",
|
|
54
|
+
"browserBuild": "webpack --mode production",
|
|
55
|
+
"audit": "better-npm-audit audit -l high",
|
|
56
|
+
"build:tests": "npm run clean:jstests && tsc -p ./test/tsconfig.json",
|
|
57
|
+
"clean": "rimraf build",
|
|
58
|
+
"clean:jstests": "rimraf --glob \"test/**/!(ts-node-register).js\"",
|
|
59
|
+
"coverage-report": "npm run build && npm run nobuild:coverage-report",
|
|
60
|
+
"coverage-html": "npm run build && npm run nobuild:coverage-html",
|
|
61
|
+
"coverage": "npm run build && npm run nobuild:coverage",
|
|
62
|
+
"doc": "typedoc",
|
|
63
|
+
"format": "npm run prettier -- --write",
|
|
64
|
+
"formatjs": "npm run prettierjs -- --write",
|
|
65
|
+
"format:ci": "npm run prettier -- --check && npm run prettierjs -- --check",
|
|
66
|
+
"gitdiff:ci": "npm run build && git diff --exit-code",
|
|
67
|
+
"integration": "npm run build && npm run nobuild:integration",
|
|
68
|
+
"lint": "eslint src/**",
|
|
69
|
+
"lint:tests": "eslint test/**/*.spec.ts",
|
|
70
|
+
"mocha:ts": "cross-env TS_NODE_PROJECT=test/tsconfig.json mocha -n loader=ts-node/esm -n experimental-specifier-resolution=node --extension ts --timeout 10000 --recursive \"test/**/*.spec.ts\"",
|
|
71
|
+
"nobuild:coverage-report": "nyc report --reporter=lcov",
|
|
72
|
+
"nobuild:coverage-html": "nyc report --reporter=html",
|
|
73
|
+
"nobuild:coverage": "npm run build:tests && nyc --check-coverage --branches 85 --functions 90 --lines 90 mocha && npm run clean:jstests",
|
|
74
|
+
"nobuild:integration": "npm run mocha:ts -- --timeout 50000 'test/integration/*.ts'",
|
|
75
|
+
"nobuild:unit": "npm run mocha:ts -- 'test/*.ts'",
|
|
76
|
+
"prettier": "prettier \"src/**/*.ts\" \"test/**/*.ts\" --ignore-path ./.prettierignore",
|
|
77
|
+
"test": "npm run build && npm run format:ci && npm run lint && npm run nobuild:coverage",
|
|
78
|
+
"unit": "npm run build && npm run nobuild:unit"
|
|
79
|
+
},
|
|
80
|
+
"devDependencies": {
|
|
81
|
+
"@babel/core": "^7.27.1",
|
|
82
|
+
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
|
83
|
+
"@babel/plugin-transform-runtime": "^7.27.1",
|
|
84
|
+
"@babel/preset-env": "^7.27.2",
|
|
85
|
+
"@babel/preset-flow": "^7.27.1",
|
|
86
|
+
"@babel/preset-react": "^7.27.1",
|
|
87
|
+
"@babel/preset-typescript": "^7.27.1",
|
|
88
|
+
"@types/bs58check": "^2.1.2",
|
|
89
|
+
"@types/mocha": "^10.0.10",
|
|
90
|
+
"@types/node": "^22.15.21",
|
|
91
|
+
"@types/proxyquire": "^1.3.31",
|
|
92
|
+
"@types/randombytes": "^2.0.3",
|
|
93
|
+
"better-npm-audit": "^3.11.0",
|
|
94
|
+
"bip39": "^3.1.0",
|
|
95
|
+
"bip65": "^1.0.3",
|
|
96
|
+
"bip68": "^1.0.4",
|
|
97
|
+
"bs58": "^6.0.0",
|
|
98
|
+
"dhttp": "^3.0.3",
|
|
99
|
+
"ecpair": "^2.0.1",
|
|
100
|
+
"eslint": "9.38.0",
|
|
101
|
+
"gulp": "^5.0.0",
|
|
102
|
+
"gulp-cached": "^1.1.1",
|
|
103
|
+
"gulp-typescript": "^6.0.0-alpha.1",
|
|
104
|
+
"hoodwink": "^2.0.0",
|
|
105
|
+
"https-browserify": "^1.0.0",
|
|
106
|
+
"minimaldata": "^1.0.2",
|
|
107
|
+
"mocha": "^11.5.0",
|
|
108
|
+
"nyc": "^17.1.0",
|
|
109
|
+
"os-browserify": "^0.3.0",
|
|
110
|
+
"prettier": "^3.5.3",
|
|
111
|
+
"proxyquire": "^2.1.3",
|
|
112
|
+
"randombytes": "^2.1.0",
|
|
113
|
+
"regtest-client": "0.2.1",
|
|
114
|
+
"rimraf": "^6.0.1",
|
|
115
|
+
"stream-browserify": "^3.0.0",
|
|
116
|
+
"stream-http": "^3.2.0",
|
|
117
|
+
"tiny-secp256k1": "^2.2.3",
|
|
118
|
+
"ts-loader": "^9.5.2",
|
|
119
|
+
"ts-node": "^10.9.2",
|
|
120
|
+
"typedoc": "^0.28.5",
|
|
121
|
+
"typescript": "^5.8.3",
|
|
122
|
+
"typescript-eslint": "^8.32.1",
|
|
123
|
+
"webpack": "^5.99.9",
|
|
124
|
+
"webpack-cli": "^6.0.1"
|
|
125
|
+
},
|
|
126
|
+
"dependencies": {
|
|
127
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
|
|
128
|
+
"@btc-vision/logger": "^1.0.7",
|
|
129
|
+
"@eslint/js": "9.38.0",
|
|
130
|
+
"@noble/hashes": "^1.8.0",
|
|
131
|
+
"@noble/secp256k1": "^2.2.3",
|
|
132
|
+
"assert": "^2.1.0",
|
|
133
|
+
"babel-loader": "^10.0.0",
|
|
134
|
+
"babel-plugin-transform-import-meta": "^2.3.2",
|
|
135
|
+
"babel-preset-react": "^6.24.1",
|
|
136
|
+
"babelify": "^10.0.0",
|
|
137
|
+
"bip32": "^4.0.0",
|
|
138
|
+
"bech32": "^2.0.0",
|
|
139
|
+
"bip174": "^2.1.1",
|
|
140
|
+
"browserify-zlib": "^0.2.0",
|
|
141
|
+
"bs58check": "^4.0.0",
|
|
142
|
+
"buffer": "^6.0.3",
|
|
143
|
+
"gulp-clean": "^0.4.0",
|
|
144
|
+
"gulp-eslint-new": "^2.4.0",
|
|
145
|
+
"gulp-logger-new": "^1.0.1",
|
|
146
|
+
"process": "^0.11.10",
|
|
147
|
+
"typeforce": "^1.18.0",
|
|
148
|
+
"varuint-bitcoin": "^2.0.0"
|
|
149
|
+
}
|
|
150
|
+
}
|
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
|
+
}
|