Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #include "net/quic/test_tools/crypto_test_utils.h" | |
|
Zhongyi Shi
2016/07/25 22:33:48
Add the license header?
Ryan Hamilton
2016/07/25 23:06:45
Done in final.
| |
| 2 | |
| 3 #include "net/quic/crypto/crypto_server_config_protobuf.h" | |
| 4 #include "net/quic/quic_utils.h" | |
| 5 #include "net/quic/test_tools/mock_clock.h" | |
| 6 #include "net/test/gtest_util.h" | |
| 7 #include "testing/gmock/include/gmock/gmock.h" | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | |
| 9 | |
| 10 using std::string; | |
| 11 | |
| 12 namespace net { | |
| 13 namespace test { | |
| 14 | |
| 15 class ShloVerifier : public ValidateClientHelloResultCallback { | |
| 16 public: | |
| 17 ShloVerifier(QuicCryptoServerConfig* crypto_config, | |
| 18 IPAddress server_ip, | |
| 19 IPEndPoint client_addr, | |
| 20 const QuicClock* clock, | |
| 21 QuicCryptoProof* proof, | |
| 22 QuicCompressedCertsCache* compressed_certs_cache) | |
| 23 : crypto_config_(crypto_config), | |
| 24 server_ip_(server_ip), | |
| 25 client_addr_(client_addr), | |
| 26 clock_(clock), | |
| 27 proof_(proof), | |
| 28 compressed_certs_cache_(compressed_certs_cache) {} | |
| 29 | |
| 30 // Verify that the output message is a SHLO. | |
| 31 void RunImpl( | |
| 32 const CryptoHandshakeMessage& chlo, | |
| 33 const ValidateClientHelloResultCallback::Result& result) override { | |
| 34 QuicCryptoNegotiatedParameters params; | |
| 35 string error_details; | |
| 36 DiversificationNonce diversification_nonce; | |
| 37 CryptoHandshakeMessage out; | |
| 38 crypto_config_->ProcessClientHello( | |
| 39 result, /*reject_only=*/false, /*connection_id=*/1, server_ip_, | |
| 40 client_addr_, QuicSupportedVersions().front(), QuicSupportedVersions(), | |
| 41 /*use_stateless_rejects=*/true, /*server_designated_connection_id=*/0, | |
| 42 clock_, QuicRandom::GetInstance(), compressed_certs_cache_, ¶ms, | |
| 43 proof_, &out, &diversification_nonce, &error_details); | |
| 44 // Verify output is a SHLO. | |
| 45 EXPECT_EQ(out.tag(), kSHLO) << "Fail to pass validation. Get " | |
| 46 << out.DebugString(); | |
| 47 } | |
| 48 | |
| 49 protected: | |
| 50 QuicCryptoServerConfig* crypto_config_; | |
| 51 IPAddress server_ip_; | |
| 52 IPEndPoint client_addr_; | |
| 53 const QuicClock* clock_; | |
| 54 QuicCryptoProof* proof_; | |
| 55 QuicCompressedCertsCache* compressed_certs_cache_; | |
| 56 }; | |
| 57 | |
| 58 TEST(CryptoTestUtilsTest, TestGenerateFullCHLO) { | |
| 59 MockClock clock; | |
| 60 QuicCryptoServerConfig crypto_config( | |
| 61 QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(), | |
| 62 CryptoTestUtils::ProofSourceForTesting()); | |
| 63 IPAddress server_ip; | |
| 64 IPEndPoint client_addr(IPAddress::IPv4Localhost(), 1); | |
| 65 QuicCryptoProof proof; | |
| 66 QuicCompressedCertsCache compressed_certs_cache( | |
| 67 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize); | |
| 68 CryptoHandshakeMessage full_chlo; | |
| 69 | |
| 70 QuicCryptoServerConfig::ConfigOptions old_config_options; | |
| 71 old_config_options.id = "old-config-id"; | |
| 72 delete crypto_config.AddDefaultConfig(QuicRandom::GetInstance(), | |
| 73 &clock, old_config_options); | |
| 74 QuicCryptoServerConfig::ConfigOptions new_config_options; | |
| 75 std::unique_ptr<QuicServerConfigProtobuf> primary_config( | |
| 76 crypto_config.GenerateConfig(QuicRandom::GetInstance(), &clock, | |
| 77 new_config_options)); | |
| 78 primary_config->set_primary_time(clock.WallNow().ToUNIXSeconds()); | |
| 79 std::unique_ptr<CryptoHandshakeMessage> msg( | |
| 80 crypto_config.AddConfig(primary_config.get(), clock.WallNow())); | |
| 81 StringPiece orbit; | |
| 82 ASSERT_TRUE(msg->GetStringPiece(kORBT, &orbit)); | |
| 83 string nonce; | |
| 84 CryptoUtils::GenerateNonce( | |
| 85 clock.WallNow(), QuicRandom::GetInstance(), | |
| 86 StringPiece(reinterpret_cast<const char*>(orbit.data()), | |
| 87 sizeof(orbit.size())), | |
| 88 &nonce); | |
| 89 string nonce_hex = "#" + QuicUtils::HexEncode(nonce); | |
| 90 | |
| 91 char public_value[32]; | |
| 92 memset(public_value, 42, sizeof(public_value)); | |
| 93 string pub_hex = | |
| 94 "#" + QuicUtils::HexEncode(public_value, sizeof(public_value)); | |
| 95 | |
| 96 QuicVersion version(QuicSupportedVersions().front()); | |
| 97 // clang-format off | |
| 98 CryptoHandshakeMessage inchoate_chlo = CryptoTestUtils::Message( | |
| 99 "CHLO", | |
| 100 "PDMD", "X509", | |
| 101 "AEAD", "AESG", | |
| 102 "KEXS", "C255", | |
| 103 "COPT", "SREJ", | |
| 104 "PUBS", pub_hex.c_str(), | |
| 105 "NONC", nonce_hex.c_str(), | |
| 106 "VER\0", QuicUtils::TagToString(QuicVersionToQuicTag(version)).c_str(), | |
| 107 "$padding", static_cast<int>(kClientHelloMinimumSize), | |
| 108 nullptr); | |
| 109 // clang-format on | |
| 110 | |
| 111 CryptoTestUtils::GenerateFullCHLO(inchoate_chlo, &crypto_config, server_ip, | |
| 112 client_addr, version, &clock, &proof, | |
| 113 &compressed_certs_cache, &full_chlo); | |
| 114 // Verify that full_chlo can pass crypto_config's verification. | |
| 115 crypto_config.ValidateClientHello( | |
| 116 full_chlo, client_addr.address(), server_ip, version, &clock, &proof, | |
| 117 new ShloVerifier(&crypto_config, server_ip, client_addr, &clock, &proof, | |
| 118 &compressed_certs_cache)); | |
| 119 } | |
| 120 | |
| 121 } // namespace test | |
| 122 } // namespace net | |
| OLD | NEW |