txscript: Add new verification flags.
This commit adds two new verification flags to txscript named ScriptVerifyStrictEncoding and ScriptVerifyDerSignatures. The ScriptVerifyStrictEncoding flag enforces signature scripts and public keys to follow the strict encoding requirements. The ScriptVerifyDerSignatures flag enforces signature scripts to follow the strict encoding requirements. These flags mimic Bitcoin Core's SCRIPT_VERIFY_STRICTENC and SCRIPT_VERIFY_DERSIG flags and brings the Bitcoin Core test scripts up to date.
This commit is contained in:
parent
f6a437d4c9
commit
761381066d
8 changed files with 1210 additions and 92 deletions
|
@ -199,6 +199,20 @@ var pubKeyTests = []pubKeyTest{
|
|||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "hybrid",
|
||||
key: []byte{0x06, 0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb,
|
||||
0xac, 0x55, 0xa0, 0x62, 0x95, 0xce, 0x87, 0x0b, 0x07,
|
||||
0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xce, 0x28, 0xd9, 0x59,
|
||||
0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98, 0x48, 0x3a,
|
||||
0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb,
|
||||
0xfc, 0x0e, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48,
|
||||
0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb,
|
||||
0x10, 0xd4, 0xb8,
|
||||
},
|
||||
format: btcec.TstPubkeyHybrid,
|
||||
isValid: true,
|
||||
},
|
||||
}
|
||||
|
||||
func TestPubKeys(t *testing.T) {
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
[
|
||||
["Format is: [scriptSig, scriptPubKey, flags, ... comments]"],
|
||||
["It is evaluated as if there was a crediting coinbase transaction with two 0"],
|
||||
["pushes as scriptSig, and one output of 0 satoshi and given scriptPubKey,"],
|
||||
["followed by a spending transaction which spends this output as only input (and"],
|
||||
["correct prevout hash), using the given scriptSig. All nLockTimes are 0, all"],
|
||||
["nSequences are max."],
|
||||
|
||||
["", "DEPTH", "P2SH,STRICTENC", "Test the test: we should have an empty stack after scriptSig evaluation"],
|
||||
[" ", "DEPTH", "P2SH,STRICTENC", "and multiple spaces should not change that."],
|
||||
[" ", "DEPTH", "P2SH,STRICTENC"],
|
||||
|
@ -168,7 +175,8 @@
|
|||
|
||||
["NOP10", "1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in scriptSig"],
|
||||
|
||||
["1 0x01 0xb9", "HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"],
|
||||
["1 0x01 0xb9", "HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL",
|
||||
"P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"],
|
||||
|
||||
["0x50","1", "P2SH,STRICTENC", "opcode 0x50 is reserved"],
|
||||
["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
|
||||
|
@ -395,24 +403,285 @@
|
|||
["0 0x01 VER", "HASH160 0x14 0x0f4d7845db968f2a81b530b6f3c1d6246d4c7e01 EQUAL", "P2SH,STRICTENC", "OP_VER in P2SH should fail"],
|
||||
|
||||
["0x00", "'00' EQUAL", "P2SH,STRICTENC", "Basic OP_0 execution"],
|
||||
|
||||
["Order of CHECKMULTISIG evaluation tests, inverted by swapping the order of"],
|
||||
["pubkeys/signatures so they fail due to the STRICTENC rules on validly encoded"],
|
||||
["signatures and pubkeys."],
|
||||
[
|
||||
"0 0x47 0x3044022035341cc377b19138f944f90c45772cb06338c6d56a4c0c31a65bf1a8a105fadc022046dd232850b6bacb25879c9da82a7a628982aa19d055f1753468f68047662e0301 DUP",
|
||||
"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
|
||||
"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0 2 CHECKMULTISIG NOT",
|
||||
"STRICTENC",
|
||||
"2-of-2 CHECKMULTISIG NOT with the first pubkey invalid, and both signatures validly encoded."
|
||||
],
|
||||
[
|
||||
"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 1",
|
||||
"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
|
||||
"STRICTENC",
|
||||
"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but first signature invalid."
|
||||
],
|
||||
|
||||
["Increase DERSIG test coverage"],
|
||||
["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Overly long signature is incorrectly encoded for DERSIG"],
|
||||
["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Missing S is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "S with invalid S length is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer R is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer S is incorrectly encoded for DERSIG"],
|
||||
["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Zero-length R is incorrectly encoded for DERSIG"],
|
||||
["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "DERSIG", "Zero-length S is incorrectly encoded for DERSIG"],
|
||||
["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Negative S is incorrectly encoded for DERSIG"],
|
||||
|
||||
["Automatically generated test cases"],
|
||||
[
|
||||
"0x47 0x3044022053205076a7bb12d2db3162a2d97d8197631f829b065948b7019b15482af819a902204328dcc02c994ca086b1226d0d5f1674d23cfae0d846143df812b81cab3391e801",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"P2PK, bad sig"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220151ea78fa148b59f399b23731b634645ebc142f299ee9838d46fb78cf7e0bc0102200d62327dcd54ac6bcfb1516b035b1bf8eaea438c52c62d3450d1f3a8f030e0de01 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
|
||||
"DUP HASH160 0x14 0xc0834c0c158f53be706d234c38fd52de7eece656 EQUALVERIFY CHECKSIG",
|
||||
"",
|
||||
"P2PKH, bad pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790201",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"P2PK anyonecanpay marked with normal hashtype"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402202166fcd5e607de452d3c6f15e059505cf21654346592f9650ba906b9e8be88fa022005d976d28eb8de477102feba28807b3ad361e7fa24796d259c9d61452f7c318c01 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(P2PK), bad redeemscript"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022064cc90ca89ad721384b231653b945579359a24b928ef8539b331172628c9cc6102203e238869ab5dac3fc293db53c12e7dd3079e86cfde9024b689efc7227e4d671001 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(P2PKH), bad sig"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402206d32e6d6b131ef2fe77b6a9b90b120d74e3e238e79dcffb10523a6ec94f93d65022067ae8772632ddf4c389258c6b70ed0ff94f20ee8f60207aa192a52a2469cddd901 0",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"3-of-3, 2 sigs"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(2-of-3), 1 sig"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220001d6702bfa4f49c3a2542af9b1c2844a2eaac55f86f310f42d26a5dd17d6a8002202cdadbe608c00b50dd951c6ba0877d5b07a970f3e265c18697bc413a0a86f69901",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"P2PK with too much R padding"
|
||||
],
|
||||
[
|
||||
"0x48 0x304502207d2b258e959605e2ea50b46fea1325b7391ffb0c14a5b58ef8ad3851da3644380221007e75136df5f2e38216c4338b31c97e8307102edb97d611e06914e1f8fba68ead01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"P2PK with too much S padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"P2PK with too little R padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220003040725f724b0e2142fc44ac71f6e13161f6410aeb6dee477952ede3b6a6ca022041ff4940ee3d88116ad281d7cc556e1f2c9427d82290bd7974a25addbcd5bede01",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"P2PK NOT with bad sig with too much R padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220003040725f724a0e2142fc44ac71f6e13161f6410aeb6dee477952ede3b6a6ca022041ff4940ee3d88116ad281d7cc556e1f2c9427d82290bd7974a25addbcd5bede01",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"",
|
||||
"P2PK NOT with too much R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220003040725f724a0e2142fc44ac71f6e13161f6410aeb6dee477952ede3b6a6ca022041ff4940ee3d88116ad281d7cc556e1f2c9427d82290bd7974a25addbcd5bede01",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"P2PK NOT with too much R padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 1, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"BIP66 example 2, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 2, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"BIP66 example 3, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 3, with DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"BIP66 example 5, without DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 5, with DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 6, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x304402200b3d0b0375bb15c14620afa4aa10ae90a0d6a046ce217bc20fe0bc1ced68c1b802204b550acab90ae6d3478057c9ad24f9df743815b799b6449dd7e7f6d3bc6e274c01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 7, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"BIP66 example 8, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 8, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"BIP66 example 9, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 9, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x30440220afa76a8f60622f813b05711f051c6c3407e32d1b1b70b0576c1f01b54e4c05c702200d58e9df044fd1845cabfbeef6e624ba0401daf7d7e084736f9ff601c3783bf501",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 10, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"BIP66 example 11, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"BIP66 example 11, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220745d63eb70d45652128b450aa5ca7d9b513439963f261cb1c40a60f0785e7ee402204877785b38945ca9dbec78e1c1d4dd12148cc25c868bd27480023b49ae0f310501",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"STRICTENC",
|
||||
"P2PK with hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220606f6f9f6cebc94ebfb6a4bff0b682bd99f05511295545ce9b275e98be3c946102206871d6a76f4e1b43d9763cfc5647844e4811682b1cab0325f060f44ddf44002201",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"",
|
||||
"P2PK NOT with hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220606f6f9f6cebc94ebfb6a4bff0b682bd99f05511295545ce9b275e98be3c946102206871d6a76f4e1b43d9763cfc5647844e4811682b1cab0325f060f44ddf44002201",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"P2PK NOT with hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220606f6f9f6cebc84ebfb6a4bff0b682bd99f05511295545ce9b275e98be3c946102206871d6a76f4e1b43d9763cfc5647844e4811682b1cab0325f060f44ddf44002201",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"P2PK NOT with invalid hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402203cdcf66792fe97e3955655ede5dad004950e58b369831ffa7743132c507b272c022031fbcfb4a72b3e00217abf2f5557585f1f9891f12827d2f0a2ae2978e7f9f11001",
|
||||
"1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG",
|
||||
"STRICTENC",
|
||||
"1-of-2 with the first 1 hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402201c215cb13e4954e60ce4f6de74941904c771f998de7b1d9627e82a1949fde517022031c2197455f3dbecbb78321201308d7b039424e38d480772d7cd4eb465a083f405",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"STRICTENC",
|
||||
"P2PK with undefined hashtype"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"P2PK NOT with invalid sig and undefined hashtype"
|
||||
],
|
||||
[
|
||||
"1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402206d32e6d6b131ef2fe77b6a9b90b120d74e3e238e79dcffb10523a6ec94f93d65022067ae8772632ddf4c389258c6b70ed0ff94f20ee8f60207aa192a52a2469cddd901 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"NULLDUMMY",
|
||||
"3-of-3 with nonzero dummy"
|
||||
],
|
||||
[
|
||||
"1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT",
|
||||
"NULLDUMMY",
|
||||
"3-of-3 NOT with invalid sig with nonzero dummy"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402206cb053202e1501e6faa24e6e309bf46a2f9255aa9484ff4a26efb7434f78a58a0220132b10419c3b99601f154bf86cf12259aacd8c6f363a73dacb1d0b941680bb4c01 DUP",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"SIGPUSHONLY",
|
||||
"2-of-2 with two identical keys and sigs pushed using OP_DUP"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402204d8b99eea2f53382fd67e0dbc8ed0596bd614aa0dad6bc6843c7860c79b901c3022062f022a71993013e3d9b22302a8e4b40109d7bb057aeb250b9aab2197b3e96b801 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x47 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb125101 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"",
|
||||
"P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220078c887c33abc67fbbd827ceb3f661c1c459e78218161b652f23e3ca76cfabbd022047df245eacb8a88d8c5ca7b5228e3b4d070c102d2f542433362d3f443cd24eda01 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x47 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb125101 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"SIGPUSHONLY",
|
||||
"P2SH(P2PK) with non-push scriptSig"
|
||||
]
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f01 0x46 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f",
|
||||
"2 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 3 CHECKMULTISIG",
|
||||
"P2SH,STRICTENC",
|
||||
"2-of-3 with one valid and one invalid signature due to parse error, nSigs > validSigs"
|
||||
],
|
||||
|
||||
["The End"]
|
||||
]
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
[
|
||||
["Format is: [scriptSig, scriptPubKey, flags, ... comments]"],
|
||||
["It is evaluated as if there was a crediting coinbase transaction with two 0"],
|
||||
["pushes as scriptSig, and one output of 0 satoshi and given scriptPubKey,"],
|
||||
["followed by a spending transaction which spends this output as only input (and"],
|
||||
["correct prevout hash), using the given scriptSig. All nLockTimes are 0, all"],
|
||||
["nSequences are max."],
|
||||
|
||||
["", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "Test the test: we should have an empty stack after scriptSig evaluation"],
|
||||
[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC", "and multiple spaces should not change that."],
|
||||
[" ", "DEPTH 0 EQUAL", "P2SH,STRICTENC"],
|
||||
|
@ -228,7 +235,8 @@
|
|||
|
||||
["1", "NOP", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "Discourage NOPx flag allows OP_NOP"],
|
||||
|
||||
["0", "IF NOP10 ENDIF 1", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOPs are allowed if not executed"],
|
||||
["0", "IF NOP10 ENDIF 1", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS",
|
||||
"Discouraged NOPs are allowed if not executed"],
|
||||
|
||||
["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
|
||||
["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
|
||||
|
@ -522,19 +530,322 @@
|
|||
"P2SH,STRICTENC",
|
||||
"Basic PUSHDATA1 signedness check"],
|
||||
|
||||
["all PUSHDATA forms are equivalent"],
|
||||
|
||||
["0x4c 0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "0x4b 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL", "", "PUSHDATA1 of 75 bytes equals direct push of it"],
|
||||
["0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "0x4c 0xFF 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 EQUAL", "", "PUSHDATA2 of 255 bytes equals PUSHDATA1 of it"],
|
||||
|
||||
["0x00", "SIZE 0 EQUAL", "P2SH,STRICTENC", "Basic OP_0 execution"],
|
||||
|
||||
["Numeric pushes"],
|
||||
|
||||
["0x01 0x81", "0x4f EQUAL", "", "OP1_NEGATE pushes 0x81"],
|
||||
["0x01 0x01", "0x51 EQUAL", "", "OP_1 pushes 0x01"],
|
||||
["0x01 0x02", "0x52 EQUAL", "", "OP_2 pushes 0x02"],
|
||||
["0x01 0x03", "0x53 EQUAL", "", "OP_3 pushes 0x03"],
|
||||
["0x01 0x04", "0x54 EQUAL", "", "OP_4 pushes 0x04"],
|
||||
["0x01 0x05", "0x55 EQUAL", "", "OP_5 pushes 0x05"],
|
||||
["0x01 0x06", "0x56 EQUAL", "", "OP_6 pushes 0x06"],
|
||||
["0x01 0x07", "0x57 EQUAL", "", "OP_7 pushes 0x07"],
|
||||
["0x01 0x08", "0x58 EQUAL", "", "OP_8 pushes 0x08"],
|
||||
["0x01 0x09", "0x59 EQUAL", "", "OP_9 pushes 0x09"],
|
||||
["0x01 0x0a", "0x5a EQUAL", "", "OP_10 pushes 0x0a"],
|
||||
["0x01 0x0b", "0x5b EQUAL", "", "OP_11 pushes 0x0b"],
|
||||
["0x01 0x0c", "0x5c EQUAL", "", "OP_12 pushes 0x0c"],
|
||||
["0x01 0x0d", "0x5d EQUAL", "", "OP_13 pushes 0x0d"],
|
||||
["0x01 0x0e", "0x5e EQUAL", "", "OP_14 pushes 0x0e"],
|
||||
["0x01 0x0f", "0x5f EQUAL", "", "OP_15 pushes 0x0f"],
|
||||
["0x01 0x10", "0x60 EQUAL", "", "OP_16 pushes 0x10"],
|
||||
|
||||
["Equivalency of different numeric encodings"],
|
||||
|
||||
["0x02 0x8000", "128 NUMEQUAL", "", "0x8000 equals 128"],
|
||||
["0x01 0x00", "0 NUMEQUAL", "", "0x00 numequals 0"],
|
||||
["0x01 0x80", "0 NUMEQUAL", "", "0x80 (negative zero) numequals 0"],
|
||||
["0x02 0x0080", "0 NUMEQUAL", "", "0x0080 numequals 0"],
|
||||
["0x02 0x0500", "5 NUMEQUAL", "", "0x0500 numequals 5"],
|
||||
["0x03 0xff7f80", "0x02 0xffff NUMEQUAL", "", ""],
|
||||
["0x03 0xff7f00", "0x02 0xff7f NUMEQUAL", "", ""],
|
||||
["0x04 0xffff7f80", "0x03 0xffffff NUMEQUAL", "", ""],
|
||||
["0x04 0xffff7f00", "0x03 0xffff7f NUMEQUAL", "", ""],
|
||||
|
||||
["Valid version of the 'Test every numeric-accepting opcode for correct handling of the numeric minimal encoding rule' script_invalid test"],
|
||||
|
||||
["1 0x02 0x0000", "PICK DROP", ""],
|
||||
["1 0x02 0x0000", "ROLL DROP 1", ""],
|
||||
["0x02 0x0000", "1ADD DROP 1", ""],
|
||||
["0x02 0x0000", "1SUB DROP 1", ""],
|
||||
["0x02 0x0000", "NEGATE DROP 1", ""],
|
||||
["0x02 0x0000", "ABS DROP 1", ""],
|
||||
["0x02 0x0000", "NOT DROP 1", ""],
|
||||
["0x02 0x0000", "0NOTEQUAL DROP 1", ""],
|
||||
|
||||
["0 0x02 0x0000", "ADD DROP 1", ""],
|
||||
["0x02 0x0000 0", "ADD DROP 1", ""],
|
||||
["0 0x02 0x0000", "SUB DROP 1", ""],
|
||||
["0x02 0x0000 0", "SUB DROP 1", ""],
|
||||
["0 0x02 0x0000", "BOOLAND DROP 1", ""],
|
||||
["0x02 0x0000 0", "BOOLAND DROP 1", ""],
|
||||
["0 0x02 0x0000", "BOOLOR DROP 1", ""],
|
||||
["0x02 0x0000 0", "BOOLOR DROP 1", ""],
|
||||
["0 0x02 0x0000", "NUMEQUAL DROP 1", ""],
|
||||
["0x02 0x0000 1", "NUMEQUAL DROP 1", ""],
|
||||
["0 0x02 0x0000", "NUMEQUALVERIFY 1", ""],
|
||||
["0x02 0x0000 0", "NUMEQUALVERIFY 1", ""],
|
||||
["0 0x02 0x0000", "NUMNOTEQUAL DROP 1", ""],
|
||||
["0x02 0x0000 0", "NUMNOTEQUAL DROP 1", ""],
|
||||
["0 0x02 0x0000", "LESSTHAN DROP 1", ""],
|
||||
["0x02 0x0000 0", "LESSTHAN DROP 1", ""],
|
||||
["0 0x02 0x0000", "GREATERTHAN DROP 1", ""],
|
||||
["0x02 0x0000 0", "GREATERTHAN DROP 1", ""],
|
||||
["0 0x02 0x0000", "LESSTHANOREQUAL DROP 1", ""],
|
||||
["0x02 0x0000 0", "LESSTHANOREQUAL DROP 1", ""],
|
||||
["0 0x02 0x0000", "GREATERTHANOREQUAL DROP 1", ""],
|
||||
["0x02 0x0000 0", "GREATERTHANOREQUAL DROP 1", ""],
|
||||
["0 0x02 0x0000", "MIN DROP 1", ""],
|
||||
["0x02 0x0000 0", "MIN DROP 1", ""],
|
||||
["0 0x02 0x0000", "MAX DROP 1", ""],
|
||||
["0x02 0x0000 0", "MAX DROP 1", ""],
|
||||
|
||||
["0x02 0x0000 0 0", "WITHIN DROP 1", ""],
|
||||
["0 0x02 0x0000 0", "WITHIN DROP 1", ""],
|
||||
["0 0 0x02 0x0000", "WITHIN DROP 1", ""],
|
||||
|
||||
["0 0 0x02 0x0000", "CHECKMULTISIG DROP 1", ""],
|
||||
["0 0x02 0x0000 0", "CHECKMULTISIG DROP 1", ""],
|
||||
["0 0x02 0x0000 0 1", "CHECKMULTISIG DROP 1", ""],
|
||||
["0 0 0x02 0x0000", "CHECKMULTISIGVERIFY 1", ""],
|
||||
["0 0x02 0x0000 0", "CHECKMULTISIGVERIFY 1", ""],
|
||||
|
||||
["While not really correctly DER encoded, the empty signature is allowed by"],
|
||||
["STRICTENC to provide a compact way to provide a delibrately invalid signature."],
|
||||
["0", "0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 CHECKSIG NOT", "STRICTENC"],
|
||||
["0 0", "1 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 1 CHECKMULTISIG NOT", "STRICTENC"],
|
||||
|
||||
["CHECKMULTISIG evaluation order tests. CHECKMULTISIG evaluates signatures and"],
|
||||
["pubkeys in a specific order, and will exit early if the number of signatures"],
|
||||
["left to check is greater than the number of keys left. As STRICTENC fails the"],
|
||||
["script when it reaches an invalidly encoded signature or pubkey, we can use it"],
|
||||
["to test the exact order in which signatures and pubkeys are evaluated by"],
|
||||
["distinguishing CHECKMULTISIG returning false on the stack and the script as a"],
|
||||
["whole failing."],
|
||||
["See also the corresponding inverted versions of these tests in script_invalid.json"],
|
||||
[
|
||||
"0 0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01 DUP",
|
||||
"0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
|
||||
"2 0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
|
||||
"STRICTENC",
|
||||
"2-of-2 CHECKMULTISIG NOT with the second pubkey invalid, and both signatures validly encoded. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid pubkey."
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x3044022044dc17b0887c161bb67ba9635bf758735bdde503e4b0a0987f587f14a4e1143d022009a215772d49a85dae40d8ca03955af26ad3978a0ff965faa12915e9586249a501",
|
||||
"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
|
||||
"STRICTENC",
|
||||
"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature."
|
||||
],
|
||||
|
||||
["Increase test coverage for DERSIG"],
|
||||
["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Overly long signature is correctly encoded"],
|
||||
["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Missing S is correctly encoded"],
|
||||
["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "S with invalid S length is correctly encoded"],
|
||||
["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer R is correctly encoded"],
|
||||
["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer S is correctly encoded"],
|
||||
["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Zero-length R is correctly encoded"],
|
||||
["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "Zero-length S is correctly encoded for DERSIG"],
|
||||
["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Negative S is correctly encoded"],
|
||||
|
||||
["Automatically generated test cases"],
|
||||
[
|
||||
"0x47 0x3044022053205076a7bb13d2db3162a2d97d8197631f829b065948b7019b15482af819a902204328dcc02c994ca086b1226d0d5f1674d23cfae0d846143df812b81cab3391e801",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"P2PK"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402206e05a6fe23c59196ffe176c9ddc31e73a9885638f9d1328d47c0c703863b8876022076feb53811aa5b04e0e79f938eb19906cc5e67548bc555a8e8b8b0fc603d840c01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
|
||||
"DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG",
|
||||
"",
|
||||
"P2PKH"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790281",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"P2PK anyonecanpay"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402202166fcd5e607de452d3c6f15e059505cf21654346592f9650ba906b9e8be88fa022005d976d28eb8de477102feba28807b3ad361e7fa24796d259c9d61452f7c318c01 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(P2PK)"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022064cc90ca89ad721384b231653b945579359a24b928ef8539b331172628c9cc6102203e238869ab5dac3fc293db53c12e7dd3079e86cfde9024b689efc7227e4d671001 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
|
||||
"",
|
||||
"P2SH(P2PKH), bad sig but no VERIFY_P2SH"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402206d32e6d6b131ef2fe77b6a9b90b120d74e3e238e79dcffb10523a6ec94f93d65022067ae8772632ddf4c389258c6b70ed0ff94f20ee8f60207aa192a52a2469cddd901 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"3-of-3"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0x47 0x304402204511cf05e85c2be07c6c176c5338a08ed3cb34212667f39613340881169986c002207cc48b27aa3691a20706a5773ec9923cadd20fedffd00c24457d85f83f0b51fe01 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
|
||||
"P2SH",
|
||||
"P2SH(2-of-3)"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220001d6702bfa4f49c3a2542af9b1c2844a2eaac55f86f310f42d26a5dd17d6a8002202cdadbe608c00b50dd951c6ba0877d5b07a970f3e265c18697bc413a0a86f69901",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"P2PK with too much R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x48 0x304502207d2b258e959605e2ea50b46fea1325b7391ffb0c14a5b58ef8ad3851da3644380221007e75136df5f2e38216c4338b31c97e8307102edb97d611e06914e1f8fba68ead01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"P2PK with too much S padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"P2PK with too little R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220003040725f724b0e2142fc44ac71f6e13161f6410aeb6dee477952ede3b6a6ca022041ff4940ee3d88116ad281d7cc556e1f2c9427d82290bd7974a25addbcd5bede01",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"",
|
||||
"P2PK NOT with bad sig with too much R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"BIP66 example 1, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"BIP66 example 4, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 4, with DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"BIP66 example 6, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x304402200b3d0b0375bb15c14620afa4aa10ae90a0d6a046ce217bc20fe0bc1ced68c1b802204b550acab90ae6d3478057c9ad24f9df743815b799b6449dd7e7f6d3bc6e274c01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"BIP66 example 7, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0 0x47 0x30440220afa76a8f60622f813b05711f051c6c3407e32d1b1b70b0576c1f01b54e4c05c702200d58e9df044fd1845cabfbeef6e624ba0401daf7d7e084736f9ff601c3783bf501",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"BIP66 example 10, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"BIP66 example 12, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220f00a77260d34ec2f0c59621dc710f58169d0ca06df1a88cd4b1f1b97bd46991b02201ee220c7e04f26aed03f94aa97fb09ca5627163bf4ba07e6979972ec737db22601 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"BIP66 example 12, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x49 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef05101",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"",
|
||||
"P2PK with high S but no LOW_S"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220745d63eb70d45652128b450aa5ca7d9b513439963f261cb1c40a60f0785e7ee402204877785b38945ca9dbec78e1c1d4dd12148cc25c868bd27480023b49ae0f310501",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"P2PK with hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220606f6f9f6cebc84ebfb6a4bff0b682bd99f05511295545ce9b275e98be3c946102206871d6a76f4e1b43d9763cfc5647844e4811682b1cab0325f060f44ddf44002201",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"",
|
||||
"P2PK NOT with invalid hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402203a5ee39032637c431af0a3ac42e32e0627390bd44f6f98c9c04e6d714635ad0202207b42fcd889c3ae8a1b515608f38535f1f9be815176ee8d1b65a27c767cf37aed01",
|
||||
"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"",
|
||||
"1-of-2 with the second 1 hybrid pubkey and no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402203a5ee39032637c431af0a3ac42e32e0627390bd44f6f98c9c04e6d714635ad0202207b42fcd889c3ae8a1b515608f38535f1f9be815176ee8d1b65a27c767cf37aed01",
|
||||
"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"STRICTENC",
|
||||
"1-of-2 with the second 1 hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402201c215cb13e4954e60ce4f6de74941904c771f998de7b1d9627e82a1949fde517022031c2197455f3dbecbb78321201308d7b039424e38d480772d7cd4eb465a083f405",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"P2PK with undefined hashtype but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
|
||||
"",
|
||||
"P2PK NOT with invalid sig and undefined hashtype but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"1 0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402206d32e6d6b131ef2fe77b6a9b90b120d74e3e238e79dcffb10523a6ec94f93d65022067ae8772632ddf4c389258c6b70ed0ff94f20ee8f60207aa192a52a2469cddd901 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"3-of-3 with nonzero dummy but no NULLDUMMY"
|
||||
],
|
||||
[
|
||||
"1 0x47 0x304402201bb2edab700a5d020236df174fefed78087697143731f659bea59642c759c16d022061f42cdbae5bcd3e8790f20bf76687443436e94a634321c16a72aa54cbc7c2ea01 0x47 0x304402204bb4a64f2a6e5c7fb2f07fef85ee56fde5e6da234c6a984262307a20e99842d702206f8303aaba5e625d223897e2ffd3f88ef1bcffef55f38dc3768e5f2e94c923f901 0x47 0x3044022040c2809b71fffb155ec8b82fe7a27f666bd97f941207be4e14ade85a1249dd4d02204d56c85ec525dd18e29a0533d5ddf61b6b1bb32980c2f63edf951aebf7a27bfe01",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"3-of-3 NOT with invalid sig and nonzero dummy but no NULLDUMMY"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402206cb053202e1501e6faa24e6e309bf46a2f9255aa9484ff4a26efb7434f78a58a0220132b10419c3b99601f154bf86cf12259aacd8c6f363a73dacb1d0b941680bb4c01 DUP",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"",
|
||||
"2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402203acf75dd59bbef171aeeedae4f1020b824195820db82575c2b323b8899f95de9022067df297d3a5fad049ba0bb81255d0e495643cbcf9abae9e396988618bc0c6dfe01 0x47 0x304402205f8b859230c1cab7d4e8de38ff244d2ebe046b64e8d3f4219b01e483c203490a022071bdc488e31b557f7d9e5c8a8bec90dc92289ca70fa317685f4f140e38b30c4601",
|
||||
"0 0x47 0x304402206cb053202e1501e6faa24e6e309bf46a2f9255aa9484ff4a26efb7434f78a58a0220132b10419c3b99601f154bf86cf12259aacd8c6f363a73dacb1d0b941680bb4c01 0x47 0x304402206cb053202e1501e6faa24e6e309bf46a2f9255aa9484ff4a26efb7434f78a58a0220132b10419c3b99601f154bf86cf12259aacd8c6f363a73dacb1d0b941680bb4c01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"SIGPUSHONLY",
|
||||
"2-of-2 with two identical keys and sigs pushed"
|
||||
]
|
||||
],
|
||||
[
|
||||
"11 0x47 0x3044022053205076a7bb13d2db3162a2d97d8197631f829b065948b7019b15482af819a902204328dcc02c994ca086b1226d0d5f1674d23cfae0d846143df812b81cab3391e801",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"P2SH",
|
||||
"P2PK with unnecessary input but no CLEANSTACK"
|
||||
],
|
||||
[
|
||||
"11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
|
||||
"HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
|
||||
"P2SH",
|
||||
"P2SH with unnecessary input but no CLEANSTACK"
|
||||
],
|
||||
|
||||
["The End"]
|
||||
]
|
||||
|
|
|
@ -97,6 +97,7 @@
|
|||
[[["ad503f72c18df5801ee64d76090afe4c607fb2b822e9b7b63c5826c50e22fc3b", 0, "0x21 0x027c3a97665bf283a102a587a62a30a0c102d4d3b141015e2cae6f64e2543113e5 CHECKSIG NOT"]],
|
||||
"01000000013bfc220ec526583cb6b7e922b8b27f604cfe0a09764de61e80f58dc1723f50ad0000000000ffffffff0101000000000000002321027c3a97665bf283a102a587a62a30a0c102d4d3b141015e2cae6f64e2543113e5ac00000000", "P2SH"],
|
||||
|
||||
|
||||
["Inverted versions of tx_valid CODESEPARATOR IF block tests"],
|
||||
|
||||
["CODESEPARATOR in an unexecuted IF block does not change what is hashed"],
|
||||
|
@ -107,5 +108,6 @@
|
|||
[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1"]],
|
||||
"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510100ffffffff010000000000000000016a00000000", "P2SH"],
|
||||
|
||||
|
||||
["Make diffs cleaner by leaving a comment here without comma at the end"]
|
||||
]
|
||||
|
|
|
@ -157,6 +157,7 @@
|
|||
[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1"]],
|
||||
"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510151ffffffff010000000000000000016a00000000", "P2SH"],
|
||||
|
||||
|
||||
["CHECKSIG is legal in scriptSigs"],
|
||||
[[["ccf7f4053a02e653c36ac75c891b7496d0dc5ce5214f6c913d9cf8f1329ebee0", 0, "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG"]],
|
||||
"0100000001e0be9e32f1f89c3d916c4f21e55cdcd096741b895cc76ac353e6023a05f4f7cc00000000d86149304602210086e5f736a2c3622ebb62bd9d93d8e5d76508b98be922b97160edc3dcca6d8c47022100b23c312ac232a4473f19d2aeb95ab7bdf2b65518911a0d72d50e38b5dd31dc820121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac4730440220508fa761865c8abd81244a168392876ee1d94e8ed83897066b5e2df2400dad24022043f5ee7538e87e9c6aef7ef55133d3e51da7cc522830a9c4d736977a76ef755c0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", "P2SH"],
|
||||
|
|
|
@ -25,6 +25,340 @@ const TstMaxScriptSize = maxScriptSize
|
|||
// this file is present to export some internal interfaces so that we can
|
||||
// test them reliably.
|
||||
|
||||
func TestCheckPubKeyEncoding(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
key []byte
|
||||
isValid bool
|
||||
}{
|
||||
{
|
||||
name: "uncompressed ok",
|
||||
key: []byte{0x04, 0x11, 0xdb, 0x93, 0xe1, 0xdc, 0xdb, 0x8a,
|
||||
0x01, 0x6b, 0x49, 0x84, 0x0f, 0x8c, 0x53, 0xbc, 0x1e,
|
||||
0xb6, 0x8a, 0x38, 0x2e, 0x97, 0xb1, 0x48, 0x2e, 0xca,
|
||||
0xd7, 0xb1, 0x48, 0xa6, 0x90, 0x9a, 0x5c, 0xb2, 0xe0,
|
||||
0xea, 0xdd, 0xfb, 0x84, 0xcc, 0xf9, 0x74, 0x44, 0x64,
|
||||
0xf8, 0x2e, 0x16, 0x0b, 0xfa, 0x9b, 0x8b, 0x64, 0xf9,
|
||||
0xd4, 0xc0, 0x3f, 0x99, 0x9b, 0x86, 0x43, 0xf6, 0x56,
|
||||
0xb4, 0x12, 0xa3,
|
||||
},
|
||||
isValid: true,
|
||||
},
|
||||
{
|
||||
name: "compressed ok",
|
||||
key: []byte{0x02, 0xce, 0x0b, 0x14, 0xfb, 0x84, 0x2b, 0x1b,
|
||||
0xa5, 0x49, 0xfd, 0xd6, 0x75, 0xc9, 0x80, 0x75, 0xf1,
|
||||
0x2e, 0x9c, 0x51, 0x0f, 0x8e, 0xf5, 0x2b, 0xd0, 0x21,
|
||||
0xa9, 0xa1, 0xf4, 0x80, 0x9d, 0x3b, 0x4d,
|
||||
},
|
||||
isValid: true,
|
||||
},
|
||||
{
|
||||
name: "compressed ok",
|
||||
key: []byte{0x03, 0x26, 0x89, 0xc7, 0xc2, 0xda, 0xb1, 0x33,
|
||||
0x09, 0xfb, 0x14, 0x3e, 0x0e, 0x8f, 0xe3, 0x96, 0x34,
|
||||
0x25, 0x21, 0x88, 0x7e, 0x97, 0x66, 0x90, 0xb6, 0xb4,
|
||||
0x7f, 0x5b, 0x2a, 0x4b, 0x7d, 0x44, 0x8e,
|
||||
},
|
||||
isValid: true,
|
||||
},
|
||||
{
|
||||
name: "hybrid",
|
||||
key: []byte{0x06, 0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb,
|
||||
0xac, 0x55, 0xa0, 0x62, 0x95, 0xce, 0x87, 0x0b, 0x07,
|
||||
0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xce, 0x28, 0xd9, 0x59,
|
||||
0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 0x98, 0x48, 0x3a,
|
||||
0xda, 0x77, 0x26, 0xa3, 0xc4, 0x65, 0x5d, 0xa4, 0xfb,
|
||||
0xfc, 0x0e, 0x11, 0x08, 0xa8, 0xfd, 0x17, 0xb4, 0x48,
|
||||
0xa6, 0x85, 0x54, 0x19, 0x9c, 0x47, 0xd0, 0x8f, 0xfb,
|
||||
0x10, 0xd4, 0xb8,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "empty.",
|
||||
key: []byte{},
|
||||
isValid: false,
|
||||
},
|
||||
}
|
||||
s := Script{
|
||||
verifyStrictEncoding: true,
|
||||
}
|
||||
for _, test := range tests {
|
||||
err := s.checkPubKeyEncoding(test.key)
|
||||
if err != nil && test.isValid {
|
||||
t.Errorf("checkSignatureEncoding test '%s' failed "+
|
||||
"when it should have succeeded: %v", test.name,
|
||||
err)
|
||||
} else if err == nil && !test.isValid {
|
||||
t.Errorf("checkSignatureEncooding test '%s' succeeded "+
|
||||
"when it should have failed", test.name)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestCheckSignatureEncoding(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
sig []byte
|
||||
isValid bool
|
||||
}{
|
||||
{
|
||||
name: "valid signature.",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: true,
|
||||
},
|
||||
{
|
||||
name: "empty.",
|
||||
sig: []byte{},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "bad magic.",
|
||||
sig: []byte{0x31, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "bad 1st int marker magic.",
|
||||
sig: []byte{0x30, 0x44, 0x03, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "bad 2nd int marker.",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x03, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "short len",
|
||||
sig: []byte{0x30, 0x43, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "long len",
|
||||
sig: []byte{0x30, 0x45, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "long X",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x42, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "long Y",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x21, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "short Y",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x19, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "trailing crap.",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x01,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "X == N ",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48,
|
||||
0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "X == N ",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48,
|
||||
0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41,
|
||||
0x42, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "Y == N",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B,
|
||||
0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "Y > N",
|
||||
sig: []byte{0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B,
|
||||
0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x42,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "0 len X.",
|
||||
sig: []byte{0x30, 0x24, 0x02, 0x00, 0x02, 0x20, 0x18, 0x15,
|
||||
0x22, 0xec, 0x8e, 0xca, 0x07, 0xde, 0x48, 0x60, 0xa4,
|
||||
0xac, 0xdd, 0x12, 0x90, 0x9d, 0x83, 0x1c, 0xc5, 0x6c,
|
||||
0xbb, 0xac, 0x46, 0x22, 0x08, 0x22, 0x21, 0xa8, 0x76,
|
||||
0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "0 len Y.",
|
||||
sig: []byte{0x30, 0x24, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x00,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "extra R padding.",
|
||||
sig: []byte{0x30, 0x45, 0x02, 0x21, 0x00, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
{
|
||||
name: "extra S padding.",
|
||||
sig: []byte{0x30, 0x45, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69,
|
||||
0x32, 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1,
|
||||
0xa2, 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6,
|
||||
0x24, 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd,
|
||||
0x41, 0x02, 0x21, 0x00, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca,
|
||||
0x07, 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90,
|
||||
0x9d, 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22,
|
||||
0x08, 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09,
|
||||
},
|
||||
isValid: false,
|
||||
},
|
||||
}
|
||||
|
||||
s := Script{
|
||||
verifyStrictEncoding: true,
|
||||
}
|
||||
for _, test := range tests {
|
||||
err := s.checkSignatureEncoding(test.sig)
|
||||
if err != nil && test.isValid {
|
||||
t.Errorf("checkSignatureEncoding test '%s' failed "+
|
||||
"when it should have succeeded: %v", test.name,
|
||||
err)
|
||||
} else if err == nil && !test.isValid {
|
||||
t.Errorf("checkSignatureEncooding test '%s' succeeded "+
|
||||
"when it should have failed", test.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TstRemoveOpcode(pkscript []byte, opcode byte) ([]byte, error) {
|
||||
pops, err := parseScript(pkscript)
|
||||
if err != nil {
|
||||
|
@ -4229,6 +4563,8 @@ func parseScriptFlags(flagStr string) (ScriptFlags, error) {
|
|||
sFlags := strings.Split(flagStr, ",")
|
||||
for _, flag := range sFlags {
|
||||
switch flag {
|
||||
case "DERSIG":
|
||||
flags |= ScriptVerifyDERSignatures
|
||||
case "DISCOURAGE_UPGRADABLE_NOPS":
|
||||
flags |= ScriptDiscourageUpgradableNops
|
||||
case "", "NONE":
|
||||
|
@ -4240,7 +4576,7 @@ func parseScriptFlags(flagStr string) (ScriptFlags, error) {
|
|||
case "SIGPUSHONLY":
|
||||
flags |= ScriptVerifySigPushOnly
|
||||
case "STRICTENC":
|
||||
// This is always set.
|
||||
flags |= ScriptVerifyStrictEncoding
|
||||
default:
|
||||
return flags, fmt.Errorf("invalid flag: %s", flag)
|
||||
}
|
||||
|
|
|
@ -1780,6 +1780,16 @@ func opcodeCheckSig(op *parsedOpcode, s *Script) error {
|
|||
hashType := SigHashType(sigStr[len(sigStr)-1])
|
||||
sigStr = sigStr[:len(sigStr)-1]
|
||||
|
||||
if err := s.checkHashTypeEncoding(hashType); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.checkSignatureEncoding(sigStr); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.checkPubKeyEncoding(pkStr); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Get script from the last OP_CODESEPARATOR and without any subsequent
|
||||
// OP_CODESEPARATORs
|
||||
subScript := s.subScript()
|
||||
|
@ -1797,7 +1807,7 @@ func opcodeCheckSig(op *parsedOpcode, s *Script) error {
|
|||
}
|
||||
|
||||
var signature *btcec.Signature
|
||||
if s.der {
|
||||
if s.der || s.verifyStrictEncoding || s.verifyDERSignatures {
|
||||
signature, err = btcec.ParseDERSignature(sigStr, btcec.S256())
|
||||
} else {
|
||||
signature, err = btcec.ParseSignature(sigStr, btcec.S256())
|
||||
|
@ -1831,79 +1841,68 @@ func opcodeCheckSigVerify(op *parsedOpcode, s *Script) error {
|
|||
return err
|
||||
}
|
||||
|
||||
type sig struct {
|
||||
s *btcec.Signature
|
||||
ht byte
|
||||
// parsedSigInfo houses a raw signature along with its parsed form and a flag
|
||||
// for whether or not it has already been parsed. It is used to prevent parsing
|
||||
// the same signature multiple times when verify an multisig.
|
||||
type parsedSigInfo struct {
|
||||
signature []byte
|
||||
parsedSignature *btcec.Signature
|
||||
parsed bool
|
||||
}
|
||||
|
||||
// stack; sigs <numsigs> pubkeys <numpubkeys>
|
||||
func opcodeCheckMultiSig(op *parsedOpcode, s *Script) error {
|
||||
numPubkeys, err := s.dstack.PopInt()
|
||||
numKeys, err := s.dstack.PopInt()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// PopInt promises that the int returned is 32 bit.
|
||||
npk := int(numPubkeys.Int64())
|
||||
if npk < 0 || npk > MaxPubKeysPerMultiSig {
|
||||
numPubKeys := int(numKeys.Int64())
|
||||
if numPubKeys < 0 || numPubKeys > MaxPubKeysPerMultiSig {
|
||||
return ErrStackTooManyPubkeys
|
||||
}
|
||||
s.numOps += npk
|
||||
s.numOps += numPubKeys
|
||||
if s.numOps > MaxOpsPerScript {
|
||||
return ErrStackTooManyOperations
|
||||
}
|
||||
pubKeyStrings := make([][]byte, npk)
|
||||
pubKeys := make([]*btcec.PublicKey, npk)
|
||||
for i := range pubKeys {
|
||||
pubKeyStrings[i], err = s.dstack.PopByteArray()
|
||||
|
||||
pubKeys := make([][]byte, 0, numPubKeys)
|
||||
for i := 0; i < numPubKeys; i++ {
|
||||
pubKey, err := s.dstack.PopByteArray()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pubKeys = append(pubKeys, pubKey)
|
||||
}
|
||||
|
||||
numSignatures, err := s.dstack.PopInt()
|
||||
numSigs, err := s.dstack.PopInt()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// PopInt promises that the int returned is 32 bit.
|
||||
nsig := int(numSignatures.Int64())
|
||||
if nsig < 0 {
|
||||
return fmt.Errorf("number of signatures %d is less than 0", nsig)
|
||||
numSignatures := int(numSigs.Int64())
|
||||
if numSignatures < 0 {
|
||||
return fmt.Errorf("number of signatures '%d' is less than 0",
|
||||
numSignatures)
|
||||
}
|
||||
if nsig > npk {
|
||||
return fmt.Errorf("more signatures than pubkeys: %d > %d", nsig, npk)
|
||||
if numSignatures > numPubKeys {
|
||||
return fmt.Errorf("more signatures than pubkeys: %d > %d",
|
||||
numSignatures, numPubKeys)
|
||||
}
|
||||
|
||||
sigStrings := make([][]byte, nsig)
|
||||
signatures := make([]sig, 0, nsig)
|
||||
for i := range sigStrings {
|
||||
sigStrings[i], err = s.dstack.PopByteArray()
|
||||
signatures := make([]*parsedSigInfo, 0, numSignatures)
|
||||
for i := 0; i < numSignatures; i++ {
|
||||
signature, err := s.dstack.PopByteArray()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(sigStrings[i]) == 0 {
|
||||
continue
|
||||
}
|
||||
sig := sig{}
|
||||
sig.ht = sigStrings[i][len(sigStrings[i])-1]
|
||||
// skip off the last byte for hashtype
|
||||
if s.der {
|
||||
sig.s, err =
|
||||
btcec.ParseDERSignature(
|
||||
sigStrings[i][:len(sigStrings[i])-1],
|
||||
btcec.S256())
|
||||
} else {
|
||||
sig.s, err =
|
||||
btcec.ParseSignature(
|
||||
sigStrings[i][:len(sigStrings[i])-1],
|
||||
btcec.S256())
|
||||
}
|
||||
if err == nil {
|
||||
signatures = append(signatures, sig)
|
||||
}
|
||||
sigInfo := &parsedSigInfo{signature: signature}
|
||||
signatures = append(signatures, sigInfo)
|
||||
}
|
||||
|
||||
// bug in bitcoind mean we pop one more stack value than should be used.
|
||||
// bug in bitcoind means we pop one more stack value than should be
|
||||
// used.
|
||||
dummy, err := s.dstack.PopByteArray()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -1914,56 +1913,102 @@ func opcodeCheckMultiSig(op *parsedOpcode, s *Script) error {
|
|||
len(dummy))
|
||||
}
|
||||
|
||||
if len(signatures) == 0 {
|
||||
s.dstack.PushBool(nsig == 0)
|
||||
return nil
|
||||
} else if len(signatures) < nsig {
|
||||
s.dstack.PushBool(false)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Trim OP_CODESEPARATORs
|
||||
script := s.subScript()
|
||||
|
||||
// Remove any of the signatures that happen to be in the script.
|
||||
// can't sign somthing containing the signature you're making, after
|
||||
// all
|
||||
for i := range sigStrings {
|
||||
script = removeOpcodeByData(script, sigStrings[i])
|
||||
for _, sigInfo := range signatures {
|
||||
script = removeOpcodeByData(script, sigInfo.signature)
|
||||
}
|
||||
|
||||
curPk := 0
|
||||
for i := range signatures {
|
||||
// check signatures.
|
||||
success := false
|
||||
|
||||
hash := calcScriptHash(script, SigHashType(signatures[i].ht),
|
||||
&s.tx, s.txidx)
|
||||
inner:
|
||||
// Find first pubkey that successfully validates signature.
|
||||
// we start off the search from the key that was successful
|
||||
// last time.
|
||||
for ; curPk < len(pubKeys); curPk++ {
|
||||
if pubKeys[curPk] == nil {
|
||||
pubKeys[curPk], err =
|
||||
btcec.ParsePubKey(pubKeyStrings[curPk],
|
||||
btcec.S256())
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
}
|
||||
success = signatures[i].s.Verify(hash, pubKeys[curPk])
|
||||
if success {
|
||||
break inner
|
||||
}
|
||||
success := true
|
||||
numPubKeys++
|
||||
pubKeyIdx := -1
|
||||
signatureIdx := 0
|
||||
for numSignatures > 0 {
|
||||
// When there are more signatures than public keys remaining,
|
||||
// there is no way to succeed since too many signatures are
|
||||
// invalid, so exit early.
|
||||
pubKeyIdx++
|
||||
numPubKeys--
|
||||
if numSignatures > numPubKeys {
|
||||
success = false
|
||||
break
|
||||
}
|
||||
if success == false {
|
||||
s.dstack.PushBool(false)
|
||||
return nil
|
||||
|
||||
sigInfo := signatures[signatureIdx]
|
||||
pubKey := pubKeys[pubKeyIdx]
|
||||
|
||||
// The order of the signature and public key evaluation is
|
||||
// important here since it can be distinguished by an
|
||||
// OP_CHECKMULTISIG NOT when the strict encoding flag is set.
|
||||
|
||||
rawSig := sigInfo.signature
|
||||
if len(rawSig) == 0 {
|
||||
// Skip to the next pubkey if signature is empty.
|
||||
continue
|
||||
}
|
||||
|
||||
// Split the signature into hash type and signature components.
|
||||
hashType := SigHashType(rawSig[len(rawSig)-1])
|
||||
signature := rawSig[:len(rawSig)-1]
|
||||
|
||||
// Only parse and check the signature encoding once.
|
||||
var parsedSig *btcec.Signature
|
||||
if !sigInfo.parsed {
|
||||
if err := s.checkHashTypeEncoding(hashType); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.checkSignatureEncoding(signature); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Parse the signature.
|
||||
var err error
|
||||
if s.der || s.verifyStrictEncoding || s.verifyDERSignatures {
|
||||
parsedSig, err = btcec.ParseDERSignature(signature,
|
||||
btcec.S256())
|
||||
} else {
|
||||
parsedSig, err = btcec.ParseSignature(signature,
|
||||
btcec.S256())
|
||||
}
|
||||
sigInfo.parsed = true
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
sigInfo.parsedSignature = parsedSig
|
||||
} else {
|
||||
// Skip to the next pubkey if the signature is invalid.
|
||||
if sigInfo.parsedSignature == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// Use the already parsed signature.
|
||||
parsedSig = sigInfo.parsedSignature
|
||||
}
|
||||
|
||||
if err := s.checkPubKeyEncoding(pubKey); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Parse the pubkey.
|
||||
parsedPubKey, err := btcec.ParsePubKey(pubKey, btcec.S256())
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
hash := calcScriptHash(script, hashType, &s.tx, s.txidx)
|
||||
|
||||
if parsedSig.Verify(hash, parsedPubKey) {
|
||||
// PubKey verified, move on to the next signature.
|
||||
signatureIdx++
|
||||
numSignatures--
|
||||
}
|
||||
}
|
||||
s.dstack.PushBool(true)
|
||||
|
||||
s.dstack.PushBool(success)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -122,6 +122,10 @@ var (
|
|||
// ErrStackOverflow is returned when stack and altstack combined depth
|
||||
// is over the limit.
|
||||
ErrStackOverflow = errors.New("Stacks overflowed")
|
||||
|
||||
// ErrStackInvalidPubKey is returned when the ScriptVerifyScriptEncoding
|
||||
// flag is set and the script contains invalid pubkeys.
|
||||
ErrStackInvalidPubKey = errors.New("invalid strict pubkey")
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -209,6 +213,8 @@ type Script struct {
|
|||
der bool // enforce DER encoding
|
||||
strictMultiSig bool // verify multisig stack item is zero length
|
||||
discourageUpgradableNops bool // NOP1 to NOP10 are reserved for future soft-fork upgrades
|
||||
verifyStrictEncoding bool // verify strict encoding of signatures
|
||||
verifyDERSignatures bool // verify signatures compily with the DER
|
||||
savedFirstStack [][]byte // stack from first script for bip16 scripts
|
||||
}
|
||||
|
||||
|
@ -328,6 +334,126 @@ func IsPushOnlyScript(script []byte) bool {
|
|||
return isPushOnly(pops)
|
||||
}
|
||||
|
||||
// checkHashTypeEncoding returns whether or not the passed hashtype adheres to
|
||||
// the strict encoding requirements if enabled.
|
||||
func (s *Script) checkHashTypeEncoding(hashType SigHashType) error {
|
||||
if !s.verifyStrictEncoding {
|
||||
return nil
|
||||
}
|
||||
|
||||
sigHashType := hashType & ^SigHashAnyOneCanPay
|
||||
if sigHashType < SigHashAll || sigHashType > SigHashSingle {
|
||||
return fmt.Errorf("invalid hashtype: 0x%x\n", hashType)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// checkPubKeyEncoding returns whether or not the passed public key adheres to
|
||||
// the strict encoding requirements if enabled.
|
||||
func (s *Script) checkPubKeyEncoding(pubKey []byte) error {
|
||||
if !s.verifyStrictEncoding {
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(pubKey) == 33 && (pubKey[0] == 0x02 || pubKey[0] == 0x03) {
|
||||
// Compressed
|
||||
return nil
|
||||
}
|
||||
if len(pubKey) == 65 && pubKey[0] == 0x04 {
|
||||
// Uncompressed
|
||||
return nil
|
||||
}
|
||||
return ErrStackInvalidPubKey
|
||||
}
|
||||
|
||||
// checkSignatureEncoding returns whether or not the passed signature adheres to
|
||||
// the strict encoding requirements if enabled.
|
||||
func (s *Script) checkSignatureEncoding(sig []byte) error {
|
||||
if !s.verifyStrictEncoding && !s.verifyDERSignatures {
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(sig) < 8 {
|
||||
// Too short
|
||||
return fmt.Errorf("malformed signature: too short: %d < 8",
|
||||
len(sig))
|
||||
}
|
||||
if len(sig) > 72 {
|
||||
// Too long
|
||||
return fmt.Errorf("malformed signature: too long: %d > 72",
|
||||
len(sig))
|
||||
}
|
||||
if sig[0] != 0x30 {
|
||||
// Wrong type
|
||||
return fmt.Errorf("malformed signature: format has wrong type: 0x%x",
|
||||
sig[0])
|
||||
}
|
||||
if int(sig[1]) != len(sig)-2 {
|
||||
// Invalid length
|
||||
return fmt.Errorf("malformed signature: bad length: %d != %d",
|
||||
sig[1], len(sig)-2)
|
||||
}
|
||||
|
||||
rLen := int(sig[3])
|
||||
|
||||
// Make sure S is inside the signature
|
||||
if rLen+5 > len(sig) {
|
||||
return fmt.Errorf("malformed signature: S out of bounds")
|
||||
}
|
||||
|
||||
sLen := int(sig[rLen+5])
|
||||
|
||||
// The length of the elements does not match
|
||||
// the length of the signature
|
||||
if rLen+sLen+6 != len(sig) {
|
||||
return fmt.Errorf("malformed signature: invalid R length")
|
||||
}
|
||||
|
||||
// R elements must be integers
|
||||
if sig[2] != 0x02 {
|
||||
return fmt.Errorf("malformed signature: missing first integer marker")
|
||||
}
|
||||
|
||||
// Zero-length integers are not allowed for R
|
||||
if rLen == 0 {
|
||||
return fmt.Errorf("malformed signature: R length is zero")
|
||||
}
|
||||
|
||||
// R must not be negative
|
||||
if sig[4]&0x80 != 0 {
|
||||
return fmt.Errorf("malformed signature: R value is negative")
|
||||
}
|
||||
|
||||
// Null bytes at the start of R are not allowed, unless R would
|
||||
// otherwise be interpreted as a negative number.
|
||||
if rLen > 1 && sig[4] == 0x00 && sig[5]&0x80 == 0 {
|
||||
return fmt.Errorf("malformed signature: invalid R value")
|
||||
}
|
||||
|
||||
// S elements must be integers
|
||||
if sig[rLen+4] != 0x02 {
|
||||
return fmt.Errorf("malformed signature: missing second integer marker")
|
||||
}
|
||||
|
||||
// Zero-length integers are not allowed for S
|
||||
if sLen == 0 {
|
||||
return fmt.Errorf("malformed signature: S length is zero")
|
||||
}
|
||||
|
||||
// S must not be negative
|
||||
if sig[rLen+6]&0x80 != 0 {
|
||||
return fmt.Errorf("malformed signature: S value is negative")
|
||||
}
|
||||
|
||||
// Null bytes at the start of S are not allowed, unless S would
|
||||
// otherwise be interpreted as a negative number.
|
||||
if sLen > 1 && sig[rLen+6] == 0x00 && sig[rLen+7]&0x80 == 0 {
|
||||
return fmt.Errorf("malformed signature: invalid S value")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// canonicalPush returns true if the object is either not a push instruction
|
||||
// or the push instruction contained wherein is matches the canonical form
|
||||
// or using the smallest instruction to do the job. False otherwise.
|
||||
|
@ -523,9 +649,17 @@ const (
|
|||
// executed.
|
||||
ScriptDiscourageUpgradableNops
|
||||
|
||||
// ScriptVerifyDERSignatures defines that signatures are required
|
||||
// to compily with the DER format.
|
||||
ScriptVerifyDERSignatures
|
||||
|
||||
// ScriptVerifySigPushOnly defines that signature scripts must contain
|
||||
// only pushed data. This is rule 2 of BIP0062.
|
||||
ScriptVerifySigPushOnly
|
||||
|
||||
// ScriptVerifyStrictEncoding defines that signature scripts and
|
||||
// public keys must follow the strict encoding requirements.
|
||||
ScriptVerifyStrictEncoding
|
||||
)
|
||||
|
||||
// NewScript returns a new script engine for the provided tx and input idx with
|
||||
|
@ -578,6 +712,12 @@ func NewScript(scriptSig []byte, scriptPubKey []byte, txidx int, tx *wire.MsgTx,
|
|||
if flags&ScriptDiscourageUpgradableNops == ScriptDiscourageUpgradableNops {
|
||||
m.discourageUpgradableNops = true
|
||||
}
|
||||
if flags&ScriptVerifyStrictEncoding == ScriptVerifyStrictEncoding {
|
||||
m.verifyStrictEncoding = true
|
||||
}
|
||||
if flags&ScriptVerifyDERSignatures == ScriptVerifyDERSignatures {
|
||||
m.verifyDERSignatures = true
|
||||
}
|
||||
|
||||
m.tx = *tx
|
||||
m.txidx = txidx
|
||||
|
|
Loading…
Add table
Reference in a new issue