QUIC/Crypto - Enabled curve25519 key exchange code. R=wtc@chromium.org BUG= Review URL: https://chromiumcodereview.appspot.com/12740002 git-svn-id: http://src.chromium.org/svn/trunk/src/net@187161 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
diff --git a/quic/crypto/curve25519_key_exchange.cc b/quic/crypto/curve25519_key_exchange.cc index 9258dc1..a4c20fa 100644 --- a/quic/crypto/curve25519_key_exchange.cc +++ b/quic/crypto/curve25519_key_exchange.cc
@@ -4,15 +4,10 @@ #include "net/quic/crypto/curve25519_key_exchange.h" -#include <string.h> - #include "base/logging.h" +#include "crypto/curve25519.h" #include "net/quic/crypto/quic_random.h" -// TODO(rtenneti): Remove the following line after support for curve25519 is -// added. -#define crypto_scalarmult_curve25519_SCALARBYTES 32 - using base::StringPiece; using std::string; @@ -27,39 +22,31 @@ // static Curve25519KeyExchange* Curve25519KeyExchange::New( const StringPiece& private_key) { -// TODO(rtenneti): Add support for curve25519. -#if 0 - crypto_scalarmult_curve25519_base(ka->public_key_, ka->private_key_); Curve25519KeyExchange* ka; - // We don't want to #include the NaCl headers in the public header file, so // we use literals for the sizes of private_key_ and public_key_. Here we // assert that those values are equal to the values from the NaCl header. COMPILE_ASSERT( - sizeof(ka->private_key_) == crypto_scalarmult_curve25519_SCALARBYTES, + sizeof(ka->private_key_) == crypto::curve25519::kScalarBytes, header_out_of_sync); COMPILE_ASSERT( - sizeof(ka->public_key_) == crypto_scalarmult_curve25519_BYTES, + sizeof(ka->public_key_) == crypto::curve25519::kBytes, header_out_of_sync); - if (private_key.size() != crypto_scalarmult_curve25519_SCALARBYTES) { + if (private_key.size() != crypto::curve25519::kScalarBytes) { return NULL; } ka = new Curve25519KeyExchange(); memcpy(ka->private_key_, private_key.data(), - crypto_scalarmult_curve25519_SCALARBYTES); + crypto::curve25519::kScalarBytes); + crypto::curve25519::ScalarBaseMult(ka->private_key_, ka->public_key_); return ka; -#else - Curve25519KeyExchange* ka = new Curve25519KeyExchange(); - memset(ka->public_key_, 0, arraysize(ka->public_key_)); - return ka; -#endif } // static string Curve25519KeyExchange::NewPrivateKey(QuicRandom* rand) { - uint8 private_key[crypto_scalarmult_curve25519_SCALARBYTES]; + uint8 private_key[crypto::curve25519::kScalarBytes]; rand->RandBytes(private_key, sizeof(private_key)); // This makes |private_key| a valid scalar, as specified on @@ -73,23 +60,18 @@ bool Curve25519KeyExchange::CalculateSharedKey( const StringPiece& peer_public_value, string* out_result) const { -// TODO(rtenneti): Add support for curve25519. -#if 0 - if (peer_public_value.size() != crypto_scalarmult_curve25519_BYTES) { + if (peer_public_value.size() != crypto::curve25519::kBytes) { return false; } - uint8 result[crypto_scalarmult_curve25519_BYTES]; - crypto_scalarmult_curve25519( - result, private_key_, - reinterpret_cast<const uint8*>(peer_public_value.data())); + uint8 result[crypto::curve25519::kBytes]; + crypto::curve25519::ScalarMult( + private_key_, + reinterpret_cast<const uint8*>(peer_public_value.data()), + result); out_result->assign(reinterpret_cast<char*>(result), sizeof(result)); return true; -#else - out_result->assign("01234567", 8); - return true; -#endif } StringPiece Curve25519KeyExchange::public_value() const {
diff --git a/quic/crypto/curve25519_key_exchange.h b/quic/crypto/curve25519_key_exchange.h index f2285b4..77e78e8 100644 --- a/quic/crypto/curve25519_key_exchange.h +++ b/quic/crypto/curve25519_key_exchange.h
@@ -39,10 +39,7 @@ private: Curve25519KeyExchange(); -// TODO(rtenneti): Add support for curve25519. -#if 0 uint8 private_key_[32]; -#endif uint8 public_key_[32]; };
diff --git a/quic/crypto/curve25519_key_exchange_test.cc b/quic/crypto/curve25519_key_exchange_test.cc index f731a5d..b1443aa 100644 --- a/quic/crypto/curve25519_key_exchange_test.cc +++ b/quic/crypto/curve25519_key_exchange_test.cc
@@ -4,17 +4,20 @@ #include "net/quic/crypto/curve25519_key_exchange.h" +#include "base/memory/scoped_ptr.h" +#include "base/string_piece.h" #include "net/quic/crypto/quic_random.h" #include "testing/gtest/include/gtest/gtest.h" +using base::StringPiece; +using std::string; + namespace net { namespace test { // SharedKey just tests that the basic key exchange identity holds: that both // parties end up with the same key. TEST(Curve25519KeyExchange, SharedKey) { -// TODO(rtenneti): Add support for curve25519. -#if 0 QuicRandom* const rand = QuicRandom::GetInstance(); for (int i = 0; i < 5; i++) { @@ -34,7 +37,6 @@ ASSERT_TRUE(bob->CalculateSharedKey(alice_public, &bob_shared)); ASSERT_EQ(alice_shared, bob_shared); } -#endif } } // namespace test