diff --git a/src/crypto/dh.cpp b/src/crypto/dh.cpp index cbd7dcc..ada78fa 100644 --- a/src/crypto/dh.cpp +++ b/src/crypto/dh.cpp @@ -69,8 +69,12 @@ namespace fc { ssl_bignum pk; BN_bin2bn( (unsigned char*)buf, s, pk ); - shared_key.resize( DH_size(dh) ); - DH_compute_key( (unsigned char*)&shared_key.front(), pk, dh ); + int est_size = DH_size(dh); + shared_key.resize( est_size ); + int actual_size = DH_compute_key( (unsigned char*)&shared_key.front(), pk, dh ); + if ( actual_size < 0 ) return false; + if ( actual_size != est_size ) + shared_key.resize( actual_size ); return true; } diff --git a/tests/crypto/dh_test.cpp b/tests/crypto/dh_test.cpp index e972b78..e2c0941 100644 --- a/tests/crypto/dh_test.cpp +++ b/tests/crypto/dh_test.cpp @@ -41,14 +41,11 @@ BOOST_AUTO_TEST_CASE(dh_test) BOOST_CHECK( !memcmp( charlie.shared_key.data(), bob.shared_key.data(), bob.shared_key.size() ) ); std::vector bob_charlie = charlie.shared_key; - BOOST_CHECK_EQUAL( alice_bob.size(), alice_charlie.size() ); - BOOST_CHECK( memcmp( alice_bob.data(), alice_charlie.data(), alice_bob.size() ) ); + BOOST_CHECK( alice_bob.size() != alice_charlie.size() || memcmp( alice_bob.data(), alice_charlie.data(), alice_bob.size() ) ); - BOOST_CHECK_EQUAL( alice_bob.size(), bob_charlie.size() ); - BOOST_CHECK( memcmp( alice_bob.data(), bob_charlie.data(), alice_bob.size() ) ); + BOOST_CHECK( alice_bob.size() != bob_charlie.size() || memcmp( alice_bob.data(), bob_charlie.data(), alice_bob.size() ) ); - BOOST_CHECK_EQUAL( alice_charlie.size(), bob_charlie.size() ); - BOOST_CHECK( memcmp( alice_charlie.data(), bob_charlie.data(), alice_charlie.size() ) ); + BOOST_CHECK( alice_charlie.size() != bob_charlie.size() || memcmp( alice_charlie.data(), bob_charlie.data(), alice_charlie.size() ) ); alice.p.clear(); alice.p.push_back(100); alice.p.push_back(2); BOOST_CHECK( !alice.validate() );