From ebcf4e12f28965b764e582f18d7aef43df15559a Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Tue, 27 Mar 2018 17:53:41 -0400 Subject: [PATCH] Fix #1848 - signatures no include CFA data if it is present, otherwise are unchanged --- .../test_api_multi_index/test_api_multi_index.cpp | 5 ----- libraries/chain/chain_controller.cpp | 5 +++-- .../chain/include/eosio/chain/chain_controller.hpp | 1 + .../chain/include/eosio/chain/transaction.hpp | 4 ++-- libraries/chain/transaction.cpp | 14 ++++++++------ libraries/testing/tester.cpp | 2 +- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/contracts/test_api_multi_index/test_api_multi_index.cpp b/contracts/test_api_multi_index/test_api_multi_index.cpp index efd6cbff9..d789b6133 100644 --- a/contracts/test_api_multi_index/test_api_multi_index.cpp +++ b/contracts/test_api_multi_index/test_api_multi_index.cpp @@ -8,11 +8,6 @@ #include "test_multi_index.cpp" extern "C" { - - void init() { - - } - void apply( uint64_t receiver, uint64_t code, uint64_t action ) { WASM_TEST_HANDLER_EX(test_multi_index, idx64_general); diff --git a/libraries/chain/chain_controller.cpp b/libraries/chain/chain_controller.cpp index 272361231..1fdffa12d 100644 --- a/libraries/chain/chain_controller.cpp +++ b/libraries/chain/chain_controller.cpp @@ -260,7 +260,7 @@ transaction_trace chain_controller::_push_transaction(const packed_transaction& { try { transaction_metadata mtrx( trx, get_chain_id(), head_block_time()); - check_transaction_authorization(mtrx.trx(), trx.signatures); + check_transaction_authorization(mtrx.trx(), trx.signatures, trx.context_free_data); auto result = _push_transaction(std::move(mtrx)); // notify anyone listening to pending transactions @@ -833,9 +833,10 @@ void chain_controller::check_authorization( const vector& actions, void chain_controller::check_transaction_authorization(const transaction& trx, const vector& signatures, + const vector& cfd, bool allow_unused_signatures)const { - check_authorization( trx.actions, trx.get_signature_keys( signatures, chain_id_type{} ), allow_unused_signatures ); + check_authorization( trx.actions, trx.get_signature_keys( signatures, chain_id_type{}, cfd ), allow_unused_signatures ); } optional chain_controller::lookup_minimum_permission(account_name authorizer_account, diff --git a/libraries/chain/include/eosio/chain/chain_controller.hpp b/libraries/chain/include/eosio/chain/chain_controller.hpp index f2bd35af1..8866ad109 100644 --- a/libraries/chain/include/eosio/chain/chain_controller.hpp +++ b/libraries/chain/include/eosio/chain/chain_controller.hpp @@ -339,6 +339,7 @@ namespace eosio { namespace chain { void check_transaction_authorization(const transaction& trx, const vector& signatures, + const vector& cfd = vector(), bool allow_unused_signatures = false)const; diff --git a/libraries/chain/include/eosio/chain/transaction.hpp b/libraries/chain/include/eosio/chain/transaction.hpp index 412fcac42..cacdb765b 100644 --- a/libraries/chain/include/eosio/chain/transaction.hpp +++ b/libraries/chain/include/eosio/chain/transaction.hpp @@ -138,8 +138,8 @@ namespace eosio { namespace chain { vector actions; transaction_id_type id()const; - digest_type sig_digest( const chain_id_type& chain_id )const; - flat_set get_signature_keys( const vector& signatures, const chain_id_type& chain_id )const; + digest_type sig_digest( const chain_id_type& chain_id, const vector& cfd = vector() )const; + flat_set get_signature_keys( const vector& signatures, const chain_id_type& chain_id, const vector& cfd = vector() )const; }; diff --git a/libraries/chain/transaction.cpp b/libraries/chain/transaction.cpp index 36418f2e2..4c4529439 100644 --- a/libraries/chain/transaction.cpp +++ b/libraries/chain/transaction.cpp @@ -64,20 +64,22 @@ transaction_id_type transaction::id() const { } -digest_type transaction::sig_digest( const chain_id_type& chain_id )const { +digest_type transaction::sig_digest( const chain_id_type& chain_id, const vector& cfd )const { digest_type::encoder enc; fc::raw::pack( enc, chain_id ); fc::raw::pack( enc, *this ); + if( cfd.size() ) + fc::raw::pack( enc, cfd ); return enc.result(); } -flat_set transaction::get_signature_keys( const vector& signatures, const chain_id_type& chain_id )const +flat_set transaction::get_signature_keys( const vector& signatures, const chain_id_type& chain_id, const vector& cfd )const { try { using boost::adaptors::transformed; constexpr size_t recovery_cache_size = 100000; static recovery_cache_type recovery_cache; - const digest_type digest = sig_digest(chain_id); + const digest_type digest = sig_digest(chain_id, cfd); flat_set recovered_pub_keys; for(const signature_type& sig : signatures) { @@ -100,17 +102,17 @@ flat_set transaction::get_signature_keys( const vector signed_transaction::get_signature_keys( const chain_id_type& chain_id )const { - return transaction::get_signature_keys(signatures, chain_id); + return transaction::get_signature_keys(signatures, chain_id, context_free_data); } namespace bio = boost::iostreams; diff --git a/libraries/testing/tester.cpp b/libraries/testing/tester.cpp index e30c24b83..52cc663ce 100644 --- a/libraries/testing/tester.cpp +++ b/libraries/testing/tester.cpp @@ -397,7 +397,7 @@ namespace eosio { namespace testing { void base_tester::set_code( account_name account, const char* wast ) try { set_code(account, wast_to_wasm(wast)); - } FC_CAPTURE_AND_RETHROW( (account)(wast) ) + } FC_CAPTURE_AND_RETHROW( (account) ) void base_tester::set_code( account_name account, const vector wasm ) try { signed_transaction trx; -- GitLab