| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/test_tools/crypto_test_utils.h" | 5 #include "net/quic/test_tools/crypto_test_utils.h" |
| 6 | 6 |
| 7 #include "net/quic/core/crypto/crypto_server_config_protobuf.h" | 7 #include "net/quic/core/crypto/crypto_server_config_protobuf.h" |
| 8 #include "net/quic/core/quic_utils.h" | 8 #include "net/quic/core/quic_utils.h" |
| 9 #include "net/quic/test_tools/mock_clock.h" | 9 #include "net/quic/test_tools/mock_clock.h" |
| 10 #include "net/test/gtest_util.h" | 10 #include "net/test/gtest_util.h" |
| 11 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 using std::string; | 14 using std::string; |
| 15 | 15 |
| 16 namespace net { | 16 namespace net { |
| 17 namespace test { | 17 namespace test { |
| 18 | 18 |
| 19 class ShloVerifier { | 19 class ShloVerifier { |
| 20 public: | 20 public: |
| 21 ShloVerifier(QuicCryptoServerConfig* crypto_config, | 21 ShloVerifier(QuicCryptoServerConfig* crypto_config, |
| 22 IPAddress server_ip, | 22 IPAddress server_ip, |
| 23 IPEndPoint client_addr, | 23 IPEndPoint client_addr, |
| 24 const QuicClock* clock, | 24 const QuicClock* clock, |
| 25 QuicCryptoProof* proof, | 25 scoped_refptr<QuicCryptoProof> proof, |
| 26 QuicCompressedCertsCache* compressed_certs_cache) | 26 QuicCompressedCertsCache* compressed_certs_cache) |
| 27 : crypto_config_(crypto_config), | 27 : crypto_config_(crypto_config), |
| 28 server_ip_(server_ip), | 28 server_ip_(server_ip), |
| 29 client_addr_(client_addr), | 29 client_addr_(client_addr), |
| 30 clock_(clock), | 30 clock_(clock), |
| 31 proof_(proof), | 31 proof_(proof), |
| 32 compressed_certs_cache_(compressed_certs_cache) {} | 32 compressed_certs_cache_(compressed_certs_cache), |
| 33 params_(new QuicCryptoNegotiatedParameters) {} |
| 33 | 34 |
| 34 class ValidateClientHelloCallback : public ValidateClientHelloResultCallback { | 35 class ValidateClientHelloCallback : public ValidateClientHelloResultCallback { |
| 35 public: | 36 public: |
| 36 explicit ValidateClientHelloCallback(ShloVerifier* shlo_verifier) | 37 explicit ValidateClientHelloCallback(ShloVerifier* shlo_verifier) |
| 37 : shlo_verifier_(shlo_verifier) {} | 38 : shlo_verifier_(shlo_verifier) {} |
| 38 void Run(scoped_refptr<ValidateClientHelloResultCallback::Result> result, | 39 void Run(scoped_refptr<ValidateClientHelloResultCallback::Result> result, |
| 39 std::unique_ptr<ProofSource::Details> /* details */) override { | 40 std::unique_ptr<ProofSource::Details> /* details */) override { |
| 40 shlo_verifier_->ValidateClientHelloDone(result); | 41 shlo_verifier_->ValidateClientHelloDone(result); |
| 41 } | 42 } |
| 42 | 43 |
| 43 private: | 44 private: |
| 44 ShloVerifier* shlo_verifier_; | 45 ShloVerifier* shlo_verifier_; |
| 45 }; | 46 }; |
| 46 | 47 |
| 47 std::unique_ptr<ValidateClientHelloCallback> | 48 std::unique_ptr<ValidateClientHelloCallback> |
| 48 GetValidateClientHelloCallback() { | 49 GetValidateClientHelloCallback() { |
| 49 return std::unique_ptr<ValidateClientHelloCallback>( | 50 return std::unique_ptr<ValidateClientHelloCallback>( |
| 50 new ValidateClientHelloCallback(this)); | 51 new ValidateClientHelloCallback(this)); |
| 51 } | 52 } |
| 52 | 53 |
| 53 private: | 54 private: |
| 54 void ValidateClientHelloDone( | 55 void ValidateClientHelloDone( |
| 55 const scoped_refptr<ValidateClientHelloResultCallback::Result>& result) { | 56 const scoped_refptr<ValidateClientHelloResultCallback::Result>& result) { |
| 56 result_ = result; | 57 result_ = result; |
| 57 crypto_config_->ProcessClientHello( | 58 crypto_config_->ProcessClientHello( |
| 58 result_, /*reject_only=*/false, /*connection_id=*/1, server_ip_, | 59 result_, /*reject_only=*/false, /*connection_id=*/1, server_ip_, |
| 59 client_addr_, AllSupportedVersions().front(), AllSupportedVersions(), | 60 client_addr_, AllSupportedVersions().front(), AllSupportedVersions(), |
| 60 /*use_stateless_rejects=*/true, /*server_designated_connection_id=*/0, | 61 /*use_stateless_rejects=*/true, /*server_designated_connection_id=*/0, |
| 61 clock_, QuicRandom::GetInstance(), compressed_certs_cache_, ¶ms_, | 62 clock_, QuicRandom::GetInstance(), compressed_certs_cache_, params_, |
| 62 proof_, /*total_framing_overhead=*/50, kDefaultMaxPacketSize, | 63 proof_, /*total_framing_overhead=*/50, kDefaultMaxPacketSize, |
| 63 GetProcessClientHelloCallback()); | 64 GetProcessClientHelloCallback()); |
| 64 } | 65 } |
| 65 | 66 |
| 66 class ProcessClientHelloCallback : public ProcessClientHelloResultCallback { | 67 class ProcessClientHelloCallback : public ProcessClientHelloResultCallback { |
| 67 public: | 68 public: |
| 68 explicit ProcessClientHelloCallback(ShloVerifier* shlo_verifier) | 69 explicit ProcessClientHelloCallback(ShloVerifier* shlo_verifier) |
| 69 : shlo_verifier_(shlo_verifier) {} | 70 : shlo_verifier_(shlo_verifier) {} |
| 70 void Run( | 71 void Run( |
| 71 QuicErrorCode error, | 72 QuicErrorCode error, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 87 void ProcessClientHelloDone(std::unique_ptr<CryptoHandshakeMessage> message) { | 88 void ProcessClientHelloDone(std::unique_ptr<CryptoHandshakeMessage> message) { |
| 88 // Verify output is a SHLO. | 89 // Verify output is a SHLO. |
| 89 EXPECT_EQ(message->tag(), kSHLO) << "Fail to pass validation. Get " | 90 EXPECT_EQ(message->tag(), kSHLO) << "Fail to pass validation. Get " |
| 90 << message->DebugString(); | 91 << message->DebugString(); |
| 91 } | 92 } |
| 92 | 93 |
| 93 QuicCryptoServerConfig* crypto_config_; | 94 QuicCryptoServerConfig* crypto_config_; |
| 94 IPAddress server_ip_; | 95 IPAddress server_ip_; |
| 95 IPEndPoint client_addr_; | 96 IPEndPoint client_addr_; |
| 96 const QuicClock* clock_; | 97 const QuicClock* clock_; |
| 97 QuicCryptoProof* proof_; | 98 scoped_refptr<QuicCryptoProof> proof_; |
| 98 QuicCompressedCertsCache* compressed_certs_cache_; | 99 QuicCompressedCertsCache* compressed_certs_cache_; |
| 99 | 100 |
| 100 QuicCryptoNegotiatedParameters params_; | 101 scoped_refptr<QuicCryptoNegotiatedParameters> params_; |
| 101 scoped_refptr<ValidateClientHelloResultCallback::Result> result_; | 102 scoped_refptr<ValidateClientHelloResultCallback::Result> result_; |
| 102 }; | 103 }; |
| 103 | 104 |
| 104 TEST(CryptoTestUtilsTest, TestGenerateFullCHLO) { | 105 TEST(CryptoTestUtilsTest, TestGenerateFullCHLO) { |
| 105 MockClock clock; | 106 MockClock clock; |
| 106 QuicCryptoServerConfig crypto_config( | 107 QuicCryptoServerConfig crypto_config( |
| 107 QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(), | 108 QuicCryptoServerConfig::TESTING, QuicRandom::GetInstance(), |
| 108 CryptoTestUtils::ProofSourceForTesting()); | 109 CryptoTestUtils::ProofSourceForTesting()); |
| 109 IPAddress server_ip; | 110 IPAddress server_ip; |
| 110 IPEndPoint client_addr(IPAddress::IPv4Localhost(), 1); | 111 IPEndPoint client_addr(IPAddress::IPv4Localhost(), 1); |
| 111 QuicCryptoProof proof; | 112 scoped_refptr<QuicCryptoProof> proof(new QuicCryptoProof); |
| 112 QuicCompressedCertsCache compressed_certs_cache( | 113 QuicCompressedCertsCache compressed_certs_cache( |
| 113 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize); | 114 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize); |
| 114 CryptoHandshakeMessage full_chlo; | 115 CryptoHandshakeMessage full_chlo; |
| 115 | 116 |
| 116 QuicCryptoServerConfig::ConfigOptions old_config_options; | 117 QuicCryptoServerConfig::ConfigOptions old_config_options; |
| 117 old_config_options.id = "old-config-id"; | 118 old_config_options.id = "old-config-id"; |
| 118 delete crypto_config.AddDefaultConfig(QuicRandom::GetInstance(), &clock, | 119 delete crypto_config.AddDefaultConfig(QuicRandom::GetInstance(), &clock, |
| 119 old_config_options); | 120 old_config_options); |
| 120 QuicCryptoServerConfig::ConfigOptions new_config_options; | 121 QuicCryptoServerConfig::ConfigOptions new_config_options; |
| 121 std::unique_ptr<QuicServerConfigProtobuf> primary_config( | 122 std::unique_ptr<QuicServerConfigProtobuf> primary_config( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 148 "KEXS", "C255", | 149 "KEXS", "C255", |
| 149 "COPT", "SREJ", | 150 "COPT", "SREJ", |
| 150 "PUBS", pub_hex.c_str(), | 151 "PUBS", pub_hex.c_str(), |
| 151 "NONC", nonce_hex.c_str(), | 152 "NONC", nonce_hex.c_str(), |
| 152 "VER\0", QuicUtils::TagToString(QuicVersionToQuicTag(version)).c_str(), | 153 "VER\0", QuicUtils::TagToString(QuicVersionToQuicTag(version)).c_str(), |
| 153 "$padding", static_cast<int>(kClientHelloMinimumSize), | 154 "$padding", static_cast<int>(kClientHelloMinimumSize), |
| 154 nullptr); | 155 nullptr); |
| 155 // clang-format on | 156 // clang-format on |
| 156 | 157 |
| 157 CryptoTestUtils::GenerateFullCHLO(inchoate_chlo, &crypto_config, server_ip, | 158 CryptoTestUtils::GenerateFullCHLO(inchoate_chlo, &crypto_config, server_ip, |
| 158 client_addr, version, &clock, &proof, | 159 client_addr, version, &clock, proof, |
| 159 &compressed_certs_cache, &full_chlo); | 160 &compressed_certs_cache, &full_chlo); |
| 160 // Verify that full_chlo can pass crypto_config's verification. | 161 // Verify that full_chlo can pass crypto_config's verification. |
| 161 ShloVerifier shlo_verifier(&crypto_config, server_ip, client_addr, &clock, | 162 ShloVerifier shlo_verifier(&crypto_config, server_ip, client_addr, &clock, |
| 162 &proof, &compressed_certs_cache); | 163 proof, &compressed_certs_cache); |
| 163 crypto_config.ValidateClientHello( | 164 crypto_config.ValidateClientHello( |
| 164 full_chlo, client_addr.address(), server_ip, version, &clock, &proof, | 165 full_chlo, client_addr.address(), server_ip, version, &clock, proof, |
| 165 shlo_verifier.GetValidateClientHelloCallback()); | 166 shlo_verifier.GetValidateClientHelloCallback()); |
| 166 } | 167 } |
| 167 | 168 |
| 168 } // namespace test | 169 } // namespace test |
| 169 } // namespace net | 170 } // namespace net |
| OLD | NEW |