Test the exact order of CHECKMULTISIG sig/pubkey evaluation
Possible with STRICTENC
This commit is contained in:
parent
98b135f97f
commit
ca8158719b
3 changed files with 49 additions and 1 deletions
|
@ -855,6 +855,9 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
|
||||||
valtype& vchSig = stacktop(-isig);
|
valtype& vchSig = stacktop(-isig);
|
||||||
valtype& vchPubKey = stacktop(-ikey);
|
valtype& vchPubKey = stacktop(-ikey);
|
||||||
|
|
||||||
|
// Note how this makes the exact order of pubkey/signature evaluation
|
||||||
|
// distinguishable by CHECKMULTISIG NOT if the STRICTENC flag is set.
|
||||||
|
// See the script_(in)valid tests for details.
|
||||||
if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, serror)) {
|
if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, serror)) {
|
||||||
// serror is set
|
// serror is set
|
||||||
return false;
|
return false;
|
||||||
|
@ -871,7 +874,8 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
|
||||||
nKeysCount--;
|
nKeysCount--;
|
||||||
|
|
||||||
// If there are more signatures left than keys left,
|
// If there are more signatures left than keys left,
|
||||||
// then too many signatures have failed
|
// then too many signatures have failed. Exit early,
|
||||||
|
// without checking any further signatures.
|
||||||
if (nSigsCount > nKeysCount)
|
if (nSigsCount > nKeysCount)
|
||||||
fSuccess = false;
|
fSuccess = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -616,6 +616,25 @@ nSequences are max.
|
||||||
"STRICTENC",
|
"STRICTENC",
|
||||||
"P2PK with undefined hashtype"
|
"P2PK with undefined hashtype"
|
||||||
],
|
],
|
||||||
|
|
||||||
|
["
|
||||||
|
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 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 0",
|
||||||
|
"2 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 0x21 0x02865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac0 2 CHECKMULTISIG NOT",
|
||||||
|
"STRICTENC",
|
||||||
|
"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but first signature invalid."
|
||||||
|
],
|
||||||
|
|
||||||
[
|
[
|
||||||
"0x47 0x30440220166848cd5b82a32b5944d90de3c35249354b43773c2ece1844ee8d1103e2f6c602203b6b046da4243c77adef80ada9201b27bbfdf7f9d5428f40434b060432afd62005",
|
"0x47 0x30440220166848cd5b82a32b5944d90de3c35249354b43773c2ece1844ee8d1103e2f6c602203b6b046da4243c77adef80ada9201b27bbfdf7f9d5428f40434b060432afd62005",
|
||||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
|
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
|
||||||
|
|
|
@ -761,6 +761,31 @@ nSequences are max.
|
||||||
"STRICTENC",
|
"STRICTENC",
|
||||||
"1-of-2 with the second 1 hybrid pubkey"
|
"1-of-2 with the second 1 hybrid pubkey"
|
||||||
],
|
],
|
||||||
|
|
||||||
|
["
|
||||||
|
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 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."
|
||||||
|
],
|
||||||
|
|
||||||
[
|
[
|
||||||
"0x47 0x304402204649e9517ef0377a8f8270bd423053fd98ddff62d74ea553e9579558abbb75e4022044a2b2344469c12e35ed898987711272b634733dd0f5e051288eceb04bd4669e05",
|
"0x47 0x304402204649e9517ef0377a8f8270bd423053fd98ddff62d74ea553e9579558abbb75e4022044a2b2344469c12e35ed898987711272b634733dd0f5e051288eceb04bd4669e05",
|
||||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||||
|
|
Loading…
Reference in a new issue