12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_crypto_client_stream.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "net/quic/crypto/quic_decrypter.h" 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "net/quic/quic_client_session_base.h" 9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/quic/quic_server_id.h" 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MockCryptoClientStream::MockCryptoClientStream( 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const QuicServerId& server_id, 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicClientSessionBase* session, 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProofVerifyContext* verify_context, 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicCryptoClientConfig* crypto_config, 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HandshakeMode handshake_mode, 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ProofVerifyDetails* proof_verify_details) 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : QuicCryptoClientStream(server_id, session, verify_context, 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crypto_config), 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handshake_mode_(handshake_mode), 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) proof_verify_details_(proof_verify_details) { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockCryptoClientStream::~MockCryptoClientStream() { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MockCryptoClientStream::OnHandshakeMessage( 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CryptoHandshakeMessage& message) { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CloseConnection(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MockCryptoClientStream::CryptoConnect() { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (handshake_mode_) { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ZERO_RTT: { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) encryption_established_ = true; 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) handshake_confirmed_ = false; 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu session()->connection()->SetDecrypter(QuicDecrypter::Create(kNULL), 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ENCRYPTION_INITIAL); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session()->OnCryptoHandshakeEvent( 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicSession::ENCRYPTION_FIRST_ESTABLISHED); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case CONFIRM_HANDSHAKE: { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) encryption_established_ = true; 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) handshake_confirmed_ = true; 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch crypto_negotiated_params_.key_exchange = kC255; 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch crypto_negotiated_params_.aead = kAESG; 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (proof_verify_details_) { 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch client_session()->OnProofVerifyDetailsAvailable(*proof_verify_details_); 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetConfigNegotiated(); 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu session()->connection()->SetDecrypter(QuicDecrypter::Create(kNULL), 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ENCRYPTION_FORWARD_SECURE); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case COLD_START: { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) handshake_confirmed_ = false; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) encryption_established_ = false; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void MockCryptoClientStream::SendOnCryptoHandshakeEvent( 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) QuicSession::CryptoHandshakeEvent event) { 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) encryption_established_ = true; 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (event == QuicSession::HANDSHAKE_CONFIRMED) { 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) handshake_confirmed_ = true; 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetConfigNegotiated(); 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) session()->OnCryptoHandshakeEvent(event); 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid MockCryptoClientStream::SetConfigNegotiated() { 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_FALSE(session()->config()->negotiated()); 83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch QuicTagVector cgst; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(rtenneti): Enable the following code after BBR code is checked in. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if 0 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cgst.push_back(kTBBR); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cgst.push_back(kQBIC); 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) session()->config()->set_congestion_feedback(cgst, kQBIC); 90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session()->config()->set_idle_connection_state_lifetime( 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicTime::Delta::FromSeconds(2 * kMaximumIdleTimeoutSecs), 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs)); 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session()->config()->set_max_streams_per_connection( 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2 * kDefaultMaxStreamsPerConnection, kDefaultMaxStreamsPerConnection); 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CryptoHandshakeMessage msg; 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch session()->config()->ToHandshakeMessage(&msg); 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch string error_details; 99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const QuicErrorCode error = 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch session()->config()->ProcessPeerHello(msg, CLIENT, &error_details); 101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_EQ(QUIC_NO_ERROR, error); 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ASSERT_TRUE(session()->config()->negotiated()); 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 105effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochQuicClientSessionBase* MockCryptoClientStream::client_session() { 106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return reinterpret_cast<QuicClientSessionBase*>(session()); 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 110