|
6 | 6 | #include <clientversion.h>
|
7 | 7 | #include <compat/compat.h>
|
8 | 8 | #include <cstdint>
|
| 9 | +#include <key.h> |
| 10 | +#include <key_io.h> |
9 | 11 | #include <net.h>
|
10 | 12 | #include <net_processing.h>
|
11 | 13 | #include <netaddress.h>
|
@@ -905,4 +907,57 @@ BOOST_AUTO_TEST_CASE(initial_advertise_from_version_message)
|
905 | 907 | TestOnlyResetTimeData();
|
906 | 908 | }
|
907 | 909 |
|
| 910 | +BOOST_AUTO_TEST_CASE(bip324_derivation_test) |
| 911 | +{ |
| 912 | + // BIP324 key derivation uses network magic in the HKDF process. We use mainnet |
| 913 | + // params here to make it easier for other implementors to use this test as a test vector. |
| 914 | + SelectParams(CBaseChainParams::MAIN); |
| 915 | + static const std::string strSecret1 = "5HxWvvfubhXpYYpS3tJkw6fq9jE9j18THftkZjHHfmFiWtmAbrj"; |
| 916 | + static const std::string strSecret2C = "L3Hq7a8FEQwJkW1M2GNKDW28546Vp5miewcCzSqUD9kCAXrJdS3g"; |
| 917 | + static const std::string initiator_ellswift_str = "b654960dff0ba8808a34337f46cc68ba7619c9df76d0550639dea62de07d17f9cb61b85f2897834ce12c50b1aefa281944abf2223a5fcf0a2a7d8c022498db35"; |
| 918 | + static const std::string responder_ellswift_str = "ea57aae33e8dd38380c303fb561b741293ef97c780445184cabdb5ef207053db628f2765e5d770f666738112c94714991362f6643d9837e1c89cbd9710b80929"; |
| 919 | + |
| 920 | + auto initiator_ellswift = ParseHex(initiator_ellswift_str); |
| 921 | + auto responder_ellswift = ParseHex(responder_ellswift_str); |
| 922 | + |
| 923 | + CKey initiator_key = DecodeSecret(strSecret1); |
| 924 | + CKey responder_key = DecodeSecret(strSecret2C); |
| 925 | + |
| 926 | + auto initiator_secret = initiator_key.ComputeBIP324ECDHSecret(MakeByteSpan(responder_ellswift), MakeByteSpan(initiator_ellswift), true); |
| 927 | + BOOST_CHECK(initiator_secret.has_value()); |
| 928 | + auto responder_secret = responder_key.ComputeBIP324ECDHSecret(MakeByteSpan(initiator_ellswift), MakeByteSpan(responder_ellswift), false); |
| 929 | + BOOST_CHECK(responder_secret.has_value()); |
| 930 | + BOOST_CHECK(initiator_secret.value() == responder_secret.value()); |
| 931 | + BOOST_CHECK_EQUAL("85ac83c8b2cd328293d49b9ed999d9eff79847e767a6252dc17ae248b0040de0", HexStr(initiator_secret.value())); |
| 932 | + BOOST_CHECK_EQUAL("85ac83c8b2cd328293d49b9ed999d9eff79847e767a6252dc17ae248b0040de0", HexStr(responder_secret.value())); |
| 933 | + |
| 934 | + BIP324Session initiator_session, responder_session; |
| 935 | + |
| 936 | + DeriveBIP324Session(std::move(initiator_secret.value()), initiator_session); |
| 937 | + DeriveBIP324Session(std::move(responder_secret.value()), responder_session); |
| 938 | + |
| 939 | + BOOST_CHECK(initiator_session.initiator_L == responder_session.initiator_L); |
| 940 | + BOOST_CHECK_EQUAL("6bb300568ba8c0e19d78a0615854748ca675448e402480f3f260a8ccf808335a", HexStr(initiator_session.initiator_L)); |
| 941 | + |
| 942 | + BOOST_CHECK(initiator_session.initiator_P == responder_session.initiator_P); |
| 943 | + BOOST_CHECK_EQUAL("128962f7dc651d92a9f4f4925bbf4a58f77624d80b9234171a9b7d1ab15f5c05", HexStr(initiator_session.initiator_P)); |
| 944 | + |
| 945 | + BOOST_CHECK(initiator_session.responder_L == responder_session.responder_L); |
| 946 | + BOOST_CHECK_EQUAL("e3a471e934b306015cb33727ccdc3c458960792d48d2207e14b5b0b88fd464c2", HexStr(initiator_session.responder_L)); |
| 947 | + |
| 948 | + BOOST_CHECK(initiator_session.responder_P == responder_session.responder_P); |
| 949 | + BOOST_CHECK_EQUAL("1b251c795df35bda9351f3b027834517974fc2a092b450e5bf99152ebf159746", HexStr(initiator_session.responder_P)); |
| 950 | + |
| 951 | + BOOST_CHECK(initiator_session.session_id == responder_session.session_id); |
| 952 | + BOOST_CHECK_EQUAL("e7047d2a41c8f040ea7f278fbf03e40b40d70ed3d555b6edb163d91af518cf6b", HexStr(initiator_session.session_id)); |
| 953 | + |
| 954 | + BOOST_CHECK(initiator_session.initiator_garbage_terminator == responder_session.initiator_garbage_terminator); |
| 955 | + BOOST_CHECK_EQUAL("00fdde2e0174d8abcfba3ed0c3d31600", HexStr(initiator_session.initiator_garbage_terminator)); |
| 956 | + |
| 957 | + BOOST_CHECK(initiator_session.responder_garbage_terminator == responder_session.responder_garbage_terminator); |
| 958 | + BOOST_CHECK_EQUAL("6fad393127f7a80c23e5e08d203dfe3d", HexStr(initiator_session.responder_garbage_terminator)); |
| 959 | + |
| 960 | + SelectParams(CBaseChainParams::REGTEST); |
| 961 | +} |
| 962 | + |
908 | 963 | BOOST_AUTO_TEST_SUITE_END()
|
0 commit comments