| 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/quic_crypto_client_stream.h" | 5 #include "net/quic/quic_crypto_client_stream.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" | 8 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" |
| 9 #include "net/quic/crypto/quic_decrypter.h" | 9 #include "net/quic/crypto/quic_decrypter.h" |
| 10 #include "net/quic/crypto/quic_encrypter.h" | 10 #include "net/quic/crypto/quic_encrypter.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 connection_ = new PacketSavingConnection(&helper_, Perspective::IS_CLIENT); | 39 connection_ = new PacketSavingConnection(&helper_, Perspective::IS_CLIENT); |
| 40 // Advance the time, because timers do not like uninitialized times. | 40 // Advance the time, because timers do not like uninitialized times. |
| 41 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 41 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 42 | 42 |
| 43 session_.reset(new TestQuicSpdyClientSession( | 43 session_.reset(new TestQuicSpdyClientSession( |
| 44 connection_, DefaultQuicConfig(), server_id_, &crypto_config_)); | 44 connection_, DefaultQuicConfig(), server_id_, &crypto_config_)); |
| 45 } | 45 } |
| 46 | 46 |
| 47 void CompleteCryptoHandshake() { | 47 void CompleteCryptoHandshake() { |
| 48 stream()->CryptoConnect(); | 48 stream()->CryptoConnect(); |
| 49 CryptoTestUtils::HandshakeWithFakeServer(&helper_, connection_, stream()); | 49 CryptoTestUtils::HandshakeWithFakeServer(&helper_, connection_, stream(), |
| 50 server_options_); |
| 50 } | 51 } |
| 51 | 52 |
| 52 void ConstructHandshakeMessage() { | 53 void ConstructHandshakeMessage() { |
| 53 CryptoFramer framer; | 54 CryptoFramer framer; |
| 54 message_data_.reset(framer.ConstructHandshakeMessage(message_)); | 55 message_data_.reset(framer.ConstructHandshakeMessage(message_)); |
| 55 } | 56 } |
| 56 | 57 |
| 57 QuicCryptoClientStream* stream() { return session_->GetCryptoStream(); } | 58 QuicCryptoClientStream* stream() { return session_->GetCryptoStream(); } |
| 58 | 59 |
| 59 MockConnectionHelper helper_; | 60 MockConnectionHelper helper_; |
| 60 PacketSavingConnection* connection_; | 61 PacketSavingConnection* connection_; |
| 61 scoped_ptr<TestQuicSpdyClientSession> session_; | 62 scoped_ptr<TestQuicSpdyClientSession> session_; |
| 62 QuicServerId server_id_; | 63 QuicServerId server_id_; |
| 63 CryptoHandshakeMessage message_; | 64 CryptoHandshakeMessage message_; |
| 64 scoped_ptr<QuicData> message_data_; | 65 scoped_ptr<QuicData> message_data_; |
| 65 QuicCryptoClientConfig crypto_config_; | 66 QuicCryptoClientConfig crypto_config_; |
| 67 CryptoTestUtils::FakeServerOptions server_options_; |
| 66 }; | 68 }; |
| 67 | 69 |
| 68 TEST_F(QuicCryptoClientStreamTest, NotInitiallyConected) { | 70 TEST_F(QuicCryptoClientStreamTest, NotInitiallyConected) { |
| 69 EXPECT_FALSE(stream()->encryption_established()); | 71 EXPECT_FALSE(stream()->encryption_established()); |
| 70 EXPECT_FALSE(stream()->handshake_confirmed()); | 72 EXPECT_FALSE(stream()->handshake_confirmed()); |
| 71 } | 73 } |
| 72 | 74 |
| 73 TEST_F(QuicCryptoClientStreamTest, ConnectedAfterSHLO) { | 75 TEST_F(QuicCryptoClientStreamTest, ConnectedAfterSHLO) { |
| 74 CompleteCryptoHandshake(); | 76 CompleteCryptoHandshake(); |
| 75 EXPECT_TRUE(stream()->encryption_established()); | 77 EXPECT_TRUE(stream()->encryption_established()); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 EXPECT_CALL(*connection_, SendConnectionClose( | 190 EXPECT_CALL(*connection_, SendConnectionClose( |
| 189 QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE)); | 191 QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE)); |
| 190 CryptoHandshakeMessage server_config_update; | 192 CryptoHandshakeMessage server_config_update; |
| 191 server_config_update.set_tag(kSCUP); | 193 server_config_update.set_tag(kSCUP); |
| 192 scoped_ptr<QuicData> data( | 194 scoped_ptr<QuicData> data( |
| 193 CryptoFramer::ConstructHandshakeMessage(server_config_update)); | 195 CryptoFramer::ConstructHandshakeMessage(server_config_update)); |
| 194 stream()->OnStreamFrame(QuicStreamFrame(kCryptoStreamId, /*fin=*/false, | 196 stream()->OnStreamFrame(QuicStreamFrame(kCryptoStreamId, /*fin=*/false, |
| 195 /*offset=*/0, data->AsStringPiece())); | 197 /*offset=*/0, data->AsStringPiece())); |
| 196 } | 198 } |
| 197 | 199 |
| 200 TEST_F(QuicCryptoClientStreamTest, TokenBindingNegotiation) { |
| 201 server_options_.token_binding_enabled = true; |
| 202 crypto_config_.tb_key_params.push_back(kP256); |
| 203 |
| 204 CompleteCryptoHandshake(); |
| 205 EXPECT_TRUE(stream()->encryption_established()); |
| 206 EXPECT_TRUE(stream()->handshake_confirmed()); |
| 207 EXPECT_EQ(kP256, |
| 208 stream()->crypto_negotiated_params().token_binding_key_param); |
| 209 } |
| 210 |
| 211 TEST_F(QuicCryptoClientStreamTest, NoTokenBindingWithoutServerSupport) { |
| 212 crypto_config_.tb_key_params.push_back(kP256); |
| 213 |
| 214 CompleteCryptoHandshake(); |
| 215 EXPECT_TRUE(stream()->encryption_established()); |
| 216 EXPECT_TRUE(stream()->handshake_confirmed()); |
| 217 EXPECT_EQ(0u, stream()->crypto_negotiated_params().token_binding_key_param); |
| 218 } |
| 219 |
| 220 TEST_F(QuicCryptoClientStreamTest, NoTokenBindingWithoutClientSupport) { |
| 221 server_options_.token_binding_enabled = true; |
| 222 |
| 223 CompleteCryptoHandshake(); |
| 224 EXPECT_TRUE(stream()->encryption_established()); |
| 225 EXPECT_TRUE(stream()->handshake_confirmed()); |
| 226 EXPECT_EQ(0u, stream()->crypto_negotiated_params().token_binding_key_param); |
| 227 } |
| 228 |
| 229 TEST_F(QuicCryptoClientStreamTest, TokenBindingNotNegotiated) { |
| 230 CompleteCryptoHandshake(); |
| 231 EXPECT_TRUE(stream()->encryption_established()); |
| 232 EXPECT_TRUE(stream()->handshake_confirmed()); |
| 233 EXPECT_EQ(0u, stream()->crypto_negotiated_params().token_binding_key_param); |
| 234 } |
| 235 |
| 198 class QuicCryptoClientStreamStatelessTest : public ::testing::Test { | 236 class QuicCryptoClientStreamStatelessTest : public ::testing::Test { |
| 199 public: | 237 public: |
| 200 QuicCryptoClientStreamStatelessTest() | 238 QuicCryptoClientStreamStatelessTest() |
| 201 : client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), | 239 : client_crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), |
| 202 server_crypto_config_(QuicCryptoServerConfig::TESTING, | 240 server_crypto_config_(QuicCryptoServerConfig::TESTING, |
| 203 QuicRandom::GetInstance(), | 241 QuicRandom::GetInstance(), |
| 204 CryptoTestUtils::ProofSourceForTesting()), | 242 CryptoTestUtils::ProofSourceForTesting()), |
| 205 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED) { | 243 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED) { |
| 206 TestQuicSpdyClientSession* client_session = nullptr; | 244 TestQuicSpdyClientSession* client_session = nullptr; |
| 207 CreateClientSessionForTest(server_id_, | 245 CreateClientSessionForTest(server_id_, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 225 } | 263 } |
| 226 | 264 |
| 227 // Initializes the server_stream_ for stateless rejects. | 265 // Initializes the server_stream_ for stateless rejects. |
| 228 void InitializeFakeStatelessRejectServer() { | 266 void InitializeFakeStatelessRejectServer() { |
| 229 TestQuicSpdyServerSession* server_session = nullptr; | 267 TestQuicSpdyServerSession* server_session = nullptr; |
| 230 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), | 268 CreateServerSessionForTest(server_id_, QuicTime::Delta::FromSeconds(100000), |
| 231 &helper_, &server_crypto_config_, | 269 &helper_, &server_crypto_config_, |
| 232 &server_connection_, &server_session); | 270 &server_connection_, &server_session); |
| 233 CHECK(server_session); | 271 CHECK(server_session); |
| 234 server_session_.reset(server_session); | 272 server_session_.reset(server_session); |
| 273 CryptoTestUtils::FakeServerOptions options; |
| 235 CryptoTestUtils::SetupCryptoServerConfigForTest( | 274 CryptoTestUtils::SetupCryptoServerConfigForTest( |
| 236 server_connection_->clock(), server_connection_->random_generator(), | 275 server_connection_->clock(), server_connection_->random_generator(), |
| 237 server_session_->config(), &server_crypto_config_); | 276 server_session_->config(), &server_crypto_config_, options); |
| 238 FLAGS_enable_quic_stateless_reject_support = true; | 277 FLAGS_enable_quic_stateless_reject_support = true; |
| 239 } | 278 } |
| 240 | 279 |
| 241 MockConnectionHelper helper_; | 280 MockConnectionHelper helper_; |
| 242 | 281 |
| 243 // Client crypto stream state | 282 // Client crypto stream state |
| 244 PacketSavingConnection* client_connection_; | 283 PacketSavingConnection* client_connection_; |
| 245 scoped_ptr<TestQuicSpdyClientSession> client_session_; | 284 scoped_ptr<TestQuicSpdyClientSession> client_session_; |
| 246 QuicCryptoClientConfig client_crypto_config_; | 285 QuicCryptoClientConfig client_crypto_config_; |
| 247 | 286 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 258 | 297 |
| 259 QuicCryptoClientConfig::CachedState* client_state = | 298 QuicCryptoClientConfig::CachedState* client_state = |
| 260 client_crypto_config_.LookupOrCreate(server_id_); | 299 client_crypto_config_.LookupOrCreate(server_id_); |
| 261 | 300 |
| 262 EXPECT_FALSE(client_state->has_server_designated_connection_id()); | 301 EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
| 263 EXPECT_CALL(*client_session_, OnProofValid(testing::_)); | 302 EXPECT_CALL(*client_session_, OnProofValid(testing::_)); |
| 264 | 303 |
| 265 InitializeFakeStatelessRejectServer(); | 304 InitializeFakeStatelessRejectServer(); |
| 266 AdvanceHandshakeWithFakeServer(); | 305 AdvanceHandshakeWithFakeServer(); |
| 267 | 306 |
| 268 EXPECT_EQ(1, server_stream()->num_handshake_messages()); | 307 EXPECT_EQ(1, server_stream()->NumHandshakeMessages()); |
| 269 EXPECT_EQ(0, server_stream()->num_handshake_messages_with_server_nonces()); | 308 EXPECT_EQ(0, server_stream()->NumHandshakeMessagesWithServerNonces()); |
| 270 | 309 |
| 271 EXPECT_FALSE(client_session_->GetCryptoStream()->encryption_established()); | 310 EXPECT_FALSE(client_session_->GetCryptoStream()->encryption_established()); |
| 272 EXPECT_FALSE(client_session_->GetCryptoStream()->handshake_confirmed()); | 311 EXPECT_FALSE(client_session_->GetCryptoStream()->handshake_confirmed()); |
| 273 // Even though the handshake was not complete, the cached client_state is | 312 // Even though the handshake was not complete, the cached client_state is |
| 274 // complete, and can be used for a subsequent successful handshake. | 313 // complete, and can be used for a subsequent successful handshake. |
| 275 EXPECT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); | 314 EXPECT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); |
| 276 | 315 |
| 277 ASSERT_TRUE(client_state->has_server_nonce()); | 316 ASSERT_TRUE(client_state->has_server_nonce()); |
| 278 ASSERT_FALSE(client_state->GetNextServerNonce().empty()); | 317 ASSERT_FALSE(client_state->GetNextServerNonce().empty()); |
| 279 ASSERT_TRUE(client_state->has_server_designated_connection_id()); | 318 ASSERT_TRUE(client_state->has_server_designated_connection_id()); |
| 280 QuicConnectionId server_designated_id = | 319 QuicConnectionId server_designated_id = |
| 281 client_state->GetNextServerDesignatedConnectionId(); | 320 client_state->GetNextServerDesignatedConnectionId(); |
| 282 QuicConnectionId expected_id = | 321 QuicConnectionId expected_id = |
| 283 server_session_->connection()->random_generator()->RandUint64(); | 322 server_session_->connection()->random_generator()->RandUint64(); |
| 284 EXPECT_EQ(expected_id, server_designated_id); | 323 EXPECT_EQ(expected_id, server_designated_id); |
| 285 EXPECT_FALSE(client_state->has_server_designated_connection_id()); | 324 EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
| 286 } | 325 } |
| 287 | 326 |
| 288 } // namespace | 327 } // namespace |
| 289 } // namespace test | 328 } // namespace test |
| 290 } // namespace net | 329 } // namespace net |
| OLD | NEW |