11#include < nano/lib/stats.hpp>
22#include < nano/node/node.hpp>
3+ #include < nano/node/transport/message_deserializer.hpp>
34#include < nano/node/transport/tcp.hpp>
45
56#include < boost/format.hpp>
@@ -544,14 +545,7 @@ void nano::transport::tcp_channels::start_tcp (nano::endpoint const & endpoint_a
544545 if (!ec && channel)
545546 {
546547 // TCP node ID handshake
547-
548- std::optional<nano::node_id_handshake::query_payload> query;
549- if (auto cookie = node_l->network .syn_cookies .assign (endpoint_a); cookie)
550- {
551- nano::node_id_handshake::query_payload pld{ *cookie };
552- query = pld;
553- }
554-
548+ auto query = node_l->network .prepare_handshake_query (endpoint_a);
555549 nano::node_id_handshake message{ node_l->network_params .network , query };
556550
557551 if (node_l->config .logging .network_node_id_handshake_logging ())
@@ -619,7 +613,12 @@ void nano::transport::tcp_channels::start_tcp_receive_node_id (std::shared_ptr<n
619613 }
620614 };
621615
622- socket_l->async_read (receive_buffer_a, 8 + sizeof (nano::account) + sizeof (nano::account) + sizeof (nano::signature), [node_w, channel_a, endpoint_a, receive_buffer_a, cleanup_node_id_handshake_socket] (boost::system::error_code const & ec, std::size_t size_a) {
616+ auto message_deserializer = std::make_shared<nano::transport::message_deserializer> (node.network_params .network , node.network .publish_filter , node.block_uniquer , node.vote_uniquer ,
617+ [socket_l] (std::shared_ptr<std::vector<uint8_t >> const & data_a, size_t size_a, std::function<void (boost::system::error_code const &, std::size_t )> callback_a) {
618+ debug_assert (socket_l != nullptr );
619+ socket_l->read_impl (data_a, size_a, callback_a);
620+ });
621+ message_deserializer->read ([node_w, socket_l, channel_a, endpoint_a, cleanup_node_id_handshake_socket] (boost::system::error_code ec, std::unique_ptr<nano::message> message) {
623622 auto node_l = node_w.lock ();
624623 if (!node_l)
625624 {
@@ -636,10 +635,9 @@ void nano::transport::tcp_channels::start_tcp_receive_node_id (std::shared_ptr<n
636635 }
637636 node_l->stats .inc (nano::stat::type::message, nano::stat::detail::node_id_handshake, nano::stat::dir::in);
638637 auto error (false );
639- nano::bufferstream stream (receive_buffer_a->data (), size_a);
640- nano::message_header header (error, stream);
638+
641639 // the header type should in principle be checked after checking the network bytes and the version numbers, I will not change it here since the benefits do not outweight the difficulties
642- if (error || header. type != nano::message_type::node_id_handshake)
640+ if (error || message-> type () != nano::message_type::node_id_handshake)
643641 {
644642 if (node_l->config .logging .network_node_id_handshake_logging ())
645643 {
@@ -648,10 +646,12 @@ void nano::transport::tcp_channels::start_tcp_receive_node_id (std::shared_ptr<n
648646 cleanup_node_id_handshake_socket (endpoint_a);
649647 return ;
650648 }
651- if (header.network != node_l->network_params .network .current_network || header.version_using < node_l->network_params .network .protocol_version_min )
649+ auto & handshake = static_cast <nano::node_id_handshake &> (*message);
650+
651+ if (message->header .network != node_l->network_params .network .current_network || message->header .version_using < node_l->network_params .network .protocol_version_min )
652652 {
653653 // error handling, either the networks bytes or the version is wrong
654- if (header.network == node_l->network_params .network .current_network )
654+ if (message-> header .network == node_l->network_params .network .current_network )
655655 {
656656 node_l->stats .inc (nano::stat::type::message, nano::stat::detail::invalid_network);
657657 }
@@ -668,8 +668,8 @@ void nano::transport::tcp_channels::start_tcp_receive_node_id (std::shared_ptr<n
668668 }
669669 return ;
670670 }
671- nano::node_id_handshake message (error, stream, header);
672- if (error || !message .response || !message .query )
671+
672+ if (error || !handshake .response || !handshake .query )
673673 {
674674 if (node_l->config .logging .network_node_id_handshake_logging ())
675675 {
@@ -678,15 +678,16 @@ void nano::transport::tcp_channels::start_tcp_receive_node_id (std::shared_ptr<n
678678 cleanup_node_id_handshake_socket (endpoint_a);
679679 return ;
680680 }
681- channel_a->set_network_version (header.version_using );
681+ channel_a->set_network_version (handshake.header .version_using );
682+
683+ debug_assert (handshake.query );
684+ debug_assert (handshake.response );
682685
683- debug_assert (message.query );
684- debug_assert (message.response );
686+ auto const node_id = handshake.response ->node_id ;
685687
686- auto node_id = message.response ->node_id ;
687- bool process = (!node_l->network .syn_cookies .validate (endpoint_a, node_id, message.response ->signature ) && node_id != node_l->node_id .pub );
688- if (!process)
688+ if (!node_l->network .verify_handshake_response (*handshake.response , endpoint_a))
689689 {
690+ cleanup_node_id_handshake_socket (endpoint_a);
690691 return ;
691692 }
692693
@@ -695,18 +696,20 @@ void nano::transport::tcp_channels::start_tcp_receive_node_id (std::shared_ptr<n
695696 auto existing_channel (node_l->network .tcp_channels .find_node_id (node_id));
696697 if (existing_channel && !existing_channel->temporary )
697698 {
699+ cleanup_node_id_handshake_socket (endpoint_a);
698700 return ;
699701 }
700702
701703 channel_a->set_node_id (node_id);
702704 channel_a->set_last_packet_received (std::chrono::steady_clock::now ());
703705
704- nano::node_id_handshake::response_payload response{ node_l->node_id .pub , nano::sign_message (node_l->node_id .prv , node_l->node_id .pub , message.query ->cookie ) };
706+ debug_assert (handshake.query );
707+ auto response = node_l->network .prepare_handshake_response (*handshake.query , handshake.is_v2 ());
705708 nano::node_id_handshake handshake_response (node_l->network_params .network , std::nullopt , response);
706709
707710 if (node_l->config .logging .network_node_id_handshake_logging ())
708711 {
709- node_l->logger .try_log (boost::str (boost::format (" Node ID handshake response sent with node ID %1% to %2%: query %3%" ) % node_l->node_id .pub .to_node_id () % endpoint_a % message .query ->cookie .to_string ()));
712+ node_l->logger .try_log (boost::str (boost::format (" Node ID handshake response sent with node ID %1% to %2%: query %3%" ) % node_l->node_id .pub .to_node_id () % endpoint_a % handshake .query ->cookie .to_string ()));
710713 }
711714
712715 channel_a->send (handshake_response, [node_w, channel_a, endpoint_a, cleanup_node_id_handshake_socket] (boost::system::error_code const & ec, std::size_t size_a) {
0 commit comments