@@ -786,7 +786,7 @@ TEST (message, node_id_handshake_response_serialization)
786786 ASSERT_FALSE (error);
787787 ASSERT_FALSE (message.query );
788788 ASSERT_TRUE (message.response );
789- ASSERT_FALSE ( message.response ->v2 );
789+ ASSERT_TRUE (std::holds_alternative<std::monostate> ( message.response ->ext ) );
790790
791791 ASSERT_EQ (original.response ->node_id , message.response ->node_id );
792792 ASSERT_EQ (original.response ->signature , message.response ->signature );
@@ -802,7 +802,7 @@ TEST (message, node_id_handshake_response_v2_serialization)
802802 nano::messages::node_id_handshake::response_payload::v2_payload v2_pld{};
803803 v2_pld.salt = 17 ;
804804 v2_pld.genesis = nano::block_hash{ 13 };
805- response.v2 = v2_pld;
805+ response.ext = v2_pld;
806806
807807 nano::messages::node_id_handshake original{ nano::dev::network_params.network , std::nullopt , response };
808808
@@ -825,12 +825,63 @@ TEST (message, node_id_handshake_response_v2_serialization)
825825 ASSERT_FALSE (error);
826826 ASSERT_FALSE (message.query );
827827 ASSERT_TRUE (message.response );
828- ASSERT_TRUE (message.response ->v2 );
828+
829+ auto * v2_orig = std::get_if<nano::messages::node_id_handshake::response_payload::v2_payload> (&original.response ->ext );
830+ auto * v2_msg = std::get_if<nano::messages::node_id_handshake::response_payload::v2_payload> (&message.response ->ext );
831+ ASSERT_TRUE (v2_orig);
832+ ASSERT_TRUE (v2_msg);
829833
830834 ASSERT_EQ (original.response ->node_id , message.response ->node_id );
831835 ASSERT_EQ (original.response ->signature , message.response ->signature );
832- ASSERT_EQ (original.response ->v2 ->salt , message.response ->v2 ->salt );
833- ASSERT_EQ (original.response ->v2 ->genesis , message.response ->v2 ->genesis );
836+ ASSERT_EQ (v2_orig->salt , v2_msg->salt );
837+ ASSERT_EQ (v2_orig->genesis , v2_msg->genesis );
838+
839+ ASSERT_TRUE (nano::at_end (stream));
840+ }
841+
842+ TEST (message, node_id_handshake_response_v3_serialization)
843+ {
844+ nano::messages::node_id_handshake::response_payload response{};
845+ response.node_id = nano::account{ 7 };
846+ response.signature = nano::signature{ 11 };
847+ nano::messages::node_id_handshake::response_payload::v3_payload v3_pld{};
848+ v3_pld.salt = 17 ;
849+ v3_pld.genesis = nano::block_hash{ 13 };
850+ v3_pld.flags = nano::node_capabilities_flags{ nano::node_capabilities::topo_index } | nano::node_capabilities::vote_storage;
851+ response.ext = v3_pld;
852+
853+ nano::messages::node_id_handshake original{ nano::dev::network_params.network , std::nullopt , response };
854+
855+ // Serialize
856+ std::vector<uint8_t > bytes;
857+ {
858+ nano::vectorstream stream{ bytes };
859+ original.serialize (stream);
860+ }
861+ nano::bufferstream stream{ bytes.data (), bytes.size () };
862+
863+ // Header
864+ bool error = false ;
865+ nano::messages::message_header header (error, stream);
866+ ASSERT_FALSE (error);
867+ ASSERT_EQ (nano::messages::message_type::node_id_handshake, header.type );
868+
869+ // Message
870+ nano::messages::node_id_handshake message{ error, stream, header };
871+ ASSERT_FALSE (error);
872+ ASSERT_FALSE (message.query );
873+ ASSERT_TRUE (message.response );
874+
875+ auto * v3_orig = std::get_if<nano::messages::node_id_handshake::response_payload::v3_payload> (&original.response ->ext );
876+ auto * v3_msg = std::get_if<nano::messages::node_id_handshake::response_payload::v3_payload> (&message.response ->ext );
877+ ASSERT_TRUE (v3_orig);
878+ ASSERT_TRUE (v3_msg);
879+
880+ ASSERT_EQ (original.response ->node_id , message.response ->node_id );
881+ ASSERT_EQ (original.response ->signature , message.response ->signature );
882+ ASSERT_EQ (v3_orig->salt , v3_msg->salt );
883+ ASSERT_EQ (v3_orig->genesis , v3_msg->genesis );
884+ ASSERT_EQ (v3_orig->flags , v3_msg->flags );
834885
835886 ASSERT_TRUE (nano::at_end (stream));
836887}
@@ -864,9 +915,10 @@ TEST (handshake, signature_v2)
864915
865916 nano::messages::node_id_handshake::response_payload original{};
866917 original.node_id = node_id.pub ;
867- original.v2 = nano::messages::node_id_handshake::response_payload::v2_payload{};
868- original.v2 ->genesis = nano::test::random_hash ();
869- original.v2 ->salt = nano::random_pool::generate<nano::uint256_union> ();
918+ nano::messages::node_id_handshake::response_payload::v2_payload v2{};
919+ v2.genesis = nano::test::random_hash ();
920+ v2.salt = nano::random_pool::generate<nano::uint256_union> ();
921+ original.ext = v2;
870922 original.sign (cookie, node_id);
871923 ASSERT_TRUE (original.validate (cookie));
872924
@@ -885,15 +937,55 @@ TEST (handshake, signature_v2)
885937 {
886938 auto message = original;
887939 ASSERT_TRUE (message.validate (cookie));
888- message.v2 -> genesis = nano::test::random_hash ();
940+ std::get<nano::messages::node_id_handshake::response_payload::v2_payload> ( message.ext ). genesis = nano::test::random_hash ();
889941 ASSERT_FALSE (message.validate (cookie));
890942 }
891943
892944 // Invalid salt
893945 {
894946 auto message = original;
895947 ASSERT_TRUE (message.validate (cookie));
896- message.v2 ->salt = nano::random_pool::generate<nano::uint256_union> ();
948+ std::get<nano::messages::node_id_handshake::response_payload::v2_payload> (message.ext ).salt = nano::random_pool::generate<nano::uint256_union> ();
949+ ASSERT_FALSE (message.validate (cookie));
950+ }
951+ }
952+
953+ TEST (handshake, signature_v3)
954+ {
955+ nano::keypair node_id{};
956+ auto cookie = nano::random_pool::generate<nano::uint256_union> ();
957+
958+ nano::messages::node_id_handshake::response_payload original{};
959+ original.node_id = node_id.pub ;
960+ nano::messages::node_id_handshake::response_payload::v3_payload v3{};
961+ v3.genesis = nano::test::random_hash ();
962+ v3.salt = nano::random_pool::generate<nano::uint256_union> ();
963+ v3.flags = nano::node_capabilities::topo_index;
964+ original.ext = v3;
965+ original.sign (cookie, node_id);
966+ ASSERT_TRUE (original.validate (cookie));
967+
968+ // Mutate flags -> signature should fail
969+ {
970+ auto message = original;
971+ ASSERT_TRUE (message.validate (cookie));
972+ std::get<nano::messages::node_id_handshake::response_payload::v3_payload> (message.ext ).flags = {};
973+ ASSERT_FALSE (message.validate (cookie));
974+ }
975+
976+ // Mutate genesis -> signature should fail
977+ {
978+ auto message = original;
979+ ASSERT_TRUE (message.validate (cookie));
980+ std::get<nano::messages::node_id_handshake::response_payload::v3_payload> (message.ext ).genesis = nano::test::random_hash ();
981+ ASSERT_FALSE (message.validate (cookie));
982+ }
983+
984+ // Mutate reserved -> signature should fail
985+ {
986+ auto message = original;
987+ ASSERT_TRUE (message.validate (cookie));
988+ std::get<nano::messages::node_id_handshake::response_payload::v3_payload> (message.ext ).reserved = 42 ;
897989 ASSERT_FALSE (message.validate (cookie));
898990 }
899991}
0 commit comments