Skip to content

Commit

Permalink
Use a single round of SHA256 ont he CHECKDATASIG message.
Browse files Browse the repository at this point in the history
Summary: As per suggestion in the spec review.

Test Plan: Updated test cases.

Reviewers: #bitcoin_abc, jasonbcox, Mengerian

Reviewed By: #bitcoin_abc, jasonbcox, Mengerian

Subscribers: Mengerian, awemany, jasonbcox, teamcity

Differential Revision: https://reviews.bitcoinabc.org/D1653
  • Loading branch information
deadalnix committed Aug 14, 2018
1 parent fa4f944 commit 497a1b4
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 33 deletions.
8 changes: 5 additions & 3 deletions src/script/interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -937,9 +937,11 @@ bool EvalScript(std::vector<valtype> &stack, const CScript &script,

bool fSuccess = false;
if (vchSig.size()) {
CHashWriter ss(SER_GETHASH, 0);
ss << vchMessage;
uint256 message = ss.GetHash();
valtype vchHash(32);
CSHA256()
.Write(vchMessage.data(), vchMessage.size())
.Finalize(vchHash.data());
uint256 message(vchHash);
CPubKey pubkey(vchPubKey);
fSuccess = pubkey.Verify(message, vchSig);
}
Expand Down
7 changes: 3 additions & 4 deletions src/test/checkdatasig_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,9 @@ BOOST_AUTO_TEST_CASE(checkdatasig_test) {

// Check various pubkey encoding.
const valtype message{};

CHashWriter ss(SER_GETHASH, 0);
ss << message;
uint256 messageHash = ss.GetHash();
valtype vchHash(32);
CSHA256().Write(message.data(), message.size()).Finalize(vchHash.data());
uint256 messageHash(vchHash);

KeyData kd;
valtype pubkey = ToByteVector(kd.pubkey);
Expand Down
44 changes: 22 additions & 22 deletions src/test/data/script_tests.json
Original file line number Diff line number Diff line change
Expand Up @@ -2201,21 +2201,21 @@
"P2PK REPLAY PROTECTED"
],
[
"0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 0",
"0x46 0x30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"OK",
"Standard CHECKDATASIG"
],
[
"0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1",
"0x46 0x30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07 1",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"NULLFAIL",
"CHECKDATASIG with NULLFAIL flags"
],
[
"0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1",
"0x46 0x30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07 1",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT",
"CHECKDATASIG,STRICTENC",
"OK",
Expand All @@ -2229,77 +2229,77 @@
"CHECKDATASIG empty signature"
],
[
"0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0",
"0x47 0x30450220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a4022100a31d6133ec962903e4ae68812c70550aa994f92891c9c08be802af816fd4843a 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"OK",
"CHECKDATASIG with High S but no Low S"
],
[
"0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0",
"0x47 0x30450220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a4022100a31d6133ec962903e4ae68812c70550aa994f92891c9c08be802af816fd4843a 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG",
"CHECKDATASIG,LOW_S,NULLFAIL,STRICTENC",
"SIG_HIGH_S",
"CHECKDATASIG with High S"
],
[
"0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0",
"0x46 0x3044022090c2b41ac64aea5808a991dac049bf6a98816f8610b4028cd371e68a23b0cd47022073310757507b168533cc141e3243416cf2c55e3b4525655abf5c97c8724a68aa 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG",
"CHECKDATASIG,NULLFAIL",
"OK",
"CHECKDATASIG with too little R padding but no DERSIG"
],
[
"0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0",
"0x46 0x3044022090c2b41ac64aea5808a991dac049bf6a98816f8610b4028cd371e68a23b0cd47022073310757507b168533cc141e3243416cf2c55e3b4525655abf5c97c8724a68aa 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"SIG_DER",
"CHECKDATASIG with too little R padding"
],
[
"0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6f466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG",
"CHECKDATASIG,NULLFAIL",
"OK",
"CHECKDATASIG with hybrid pubkey but no STRICTENC"
],
[
"0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6f466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"PUBKEYTYPE",
"CHECKDATASIG with hybrid pubkey"
],
[
"0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6e466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG NOT",
"CHECKDATASIG",
"OK",
"CHECKDATASIG with invalid hybrid pubkey but no STRICTENC"
],
[
"0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6e466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"PUBKEYTYPE",
"CHECKDATASIG with invalid hybrid pubkey"
],
[
"0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 0",
"0x46 0x30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"OK",
"Standard CHECKDATASIGVERIFY"
],
[
"0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1",
"0x46 0x30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07 1",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"NULLFAIL",
"CHECKDATASIGVERIFY with NULLFAIL flags"
],
[
"0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1",
"0x46 0x30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07 1",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,STRICTENC",
"CHECKDATASIGVERIFY",
Expand All @@ -2313,56 +2313,56 @@
"CHECKDATASIGVERIFY empty signature"
],
[
"0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0",
"0x47 0x30450220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a4022100a31d6133ec962903e4ae68812c70550aa994f92891c9c08be802af816fd4843a 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"OK",
"CHECKDATASIG with High S but no Low S"
],
[
"0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0",
"0x47 0x30450220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a4022100a31d6133ec962903e4ae68812c70550aa994f92891c9c08be802af816fd4843a 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,LOW_S,NULLFAIL,STRICTENC",
"SIG_HIGH_S",
"CHECKDATASIG with High S"
],
[
"0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0",
"0x46 0x3044022090c2b41ac64aea5808a991dac049bf6a98816f8610b4028cd371e68a23b0cd47022073310757507b168533cc141e3243416cf2c55e3b4525655abf5c97c8724a68aa 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL",
"OK",
"CHECKDATASIGVERIFY with too little R padding but no DERSIG"
],
[
"0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0",
"0x46 0x3044022090c2b41ac64aea5808a991dac049bf6a98816f8610b4028cd371e68a23b0cd47022073310757507b168533cc141e3243416cf2c55e3b4525655abf5c97c8724a68aa 0",
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"SIG_DER",
"CHECKDATASIGVERIFY with too little R padding"
],
[
"0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6f466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL",
"OK",
"CHECKDATASIGVERIFY with hybrid pubkey but no STRICTENC"
],
[
"0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6f466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"PUBKEYTYPE",
"CHECKDATASIGVERIFY with hybrid pubkey"
],
[
"0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6e466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1",
"CHECKDATASIG",
"CHECKDATASIGVERIFY",
"CHECKDATASIGVERIFY with invalid hybrid pubkey but no STRICTENC"
],
[
"0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0",
"0x46 0x3044022077c8d336572f6e466055b5f70f433851f8f535f6c4fc71133a6cfd71079d03b702200ed9f5eb8aa5b266abac35d416c3207e7a538bf5f37649727d7a9823b1069577 0",
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1",
"CHECKDATASIG,NULLFAIL,STRICTENC",
"PUBKEYTYPE",
Expand Down
7 changes: 4 additions & 3 deletions src/test/script_tests.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// Copyright (c) 2011-2016 The Bitcoin Core developers
// Copyright (c) 2017-2018 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

Expand Down Expand Up @@ -344,10 +345,10 @@ class TestBuilder {

TestBuilder &PushDataSig(const CKey &key, const std::vector<uint8_t> &data,
unsigned int lenR = 32, unsigned int lenS = 32) {
CHashWriter ss(SER_GETHASH, 0);
ss << data;
std::vector<uint8_t> vchHash(32);
CSHA256().Write(data.data(), data.size()).Finalize(vchHash.data());

DoPush(DoSign(key, ss.GetHash(), lenR, lenS));
DoPush(DoSign(key, uint256(vchHash), lenR, lenS));
return *this;
}

Expand Down
2 changes: 1 addition & 1 deletion test/functional/abc-checkdatasig-activation.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def create_checkdatasig_tx(self, count):
tx.vin = [CTxIn(COutPoint(int(utxo["txid"], 16), utxo["vout"]))]
tx.vout = []
signature = bytearray.fromhex(
'304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312')
'30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07')
message = bytearray.fromhex('')
pubkey = bytearray.fromhex(
'038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508')
Expand Down

0 comments on commit 497a1b4

Please sign in to comment.