From 8d37d2941ea48e20dd27a6add21d25b1f6b3d050 Mon Sep 17 00:00:00 2001 From: mikescarlett Date: Fri, 29 Apr 2016 15:35:00 -0700 Subject: [PATCH] Update QuicTransportChannel to latest version of libquic (Chromium: f03d2c62) These changes are necessary to incorporate the latest changes to QUIC sessions and the QUIC crypto handshake. BUG= Review-Url: https://codereview.webrtc.org/1910633003 Cr-Commit-Position: refs/heads/master@{#12571} --- .../p2p/quic/quicconnectionhelper_unittest.cc | 5 +--- webrtc/p2p/quic/quicsession.cc | 23 ++++++++++--------- webrtc/p2p/quic/quicsession.h | 4 +++- webrtc/p2p/quic/quicsession_unittest.cc | 21 +++++++++++++---- webrtc/p2p/quic/quictransportchannel.cc | 11 ++++++++- webrtc/p2p/quic/quictransportchannel.h | 2 ++ .../p2p/quic/reliablequicstream_unittest.cc | 12 ++++------ 7 files changed, 49 insertions(+), 29 deletions(-) diff --git a/webrtc/p2p/quic/quicconnectionhelper_unittest.cc b/webrtc/p2p/quic/quicconnectionhelper_unittest.cc index b56ae8c4b7..5f16b52c62 100644 --- a/webrtc/p2p/quic/quicconnectionhelper_unittest.cc +++ b/webrtc/p2p/quic/quicconnectionhelper_unittest.cc @@ -53,10 +53,7 @@ class MockAlarmDelegate : public QuicAlarm::Delegate { public: MockAlarmDelegate() : fired_(false) {} - QuicTime OnAlarm() override { - fired_ = true; - return QuicTime::Zero(); - } + void OnAlarm() override { fired_ = true; } bool fired() const { return fired_; } void Clear() { fired_ = false; } diff --git a/webrtc/p2p/quic/quicsession.cc b/webrtc/p2p/quic/quicsession.cc index 7464c68f89..d451f891ba 100644 --- a/webrtc/p2p/quic/quicsession.cc +++ b/webrtc/p2p/quic/quicsession.cc @@ -46,7 +46,7 @@ void QuicSession::SetCryptoStream(net::QuicCryptoStream* crypto_stream) { bool QuicSession::ExportKeyingMaterial(base::StringPiece label, base::StringPiece context, size_t result_len, - string* result) { + std::string* result) { return crypto_stream_->ExportKeyingMaterial(label, context, result_len, result); } @@ -73,11 +73,7 @@ ReliableQuicStream* QuicSession::CreateIncomingDynamicStream( ReliableQuicStream* QuicSession::CreateOutgoingDynamicStream( net::SpdyPriority priority) { - ReliableQuicStream* stream = CreateDataStream(GetNextOutgoingStreamId()); - if (stream) { - ActivateStream(stream); // QuicSession owns the stream. - } - return stream; + return CreateDataStream(GetNextOutgoingStreamId()); } ReliableQuicStream* QuicSession::CreateDataStream(net::QuicStreamId id) { @@ -85,20 +81,25 @@ ReliableQuicStream* QuicSession::CreateDataStream(net::QuicStreamId id) { // Encryption not active so no stream created return nullptr; } - return new ReliableQuicStream(id, this); + ReliableQuicStream* stream = new ReliableQuicStream(id, this); + if (stream) { + ActivateStream(stream); // QuicSession owns the stream. + } + return stream; } void QuicSession::OnConnectionClosed(net::QuicErrorCode error, + const std::string& error_details, net::ConnectionCloseSource source) { - net::QuicSession::OnConnectionClosed(error, source); + net::QuicSession::OnConnectionClosed(error, error_details, source); SignalConnectionClosed(error, source == net::ConnectionCloseSource::FROM_PEER); } bool QuicSession::OnReadPacket(const char* data, size_t data_len) { - net::QuicEncryptedPacket packet(data, data_len); - connection()->ProcessUdpPacket(connection()->self_address(), - connection()->peer_address(), packet); + net::QuicReceivedPacket packet(data, data_len, clock_.Now()); + ProcessUdpPacket(connection()->self_address(), connection()->peer_address(), + packet); return true; } diff --git a/webrtc/p2p/quic/quicsession.h b/webrtc/p2p/quic/quicsession.h index a6da38a13d..a50eb6bb2c 100644 --- a/webrtc/p2p/quic/quicsession.h +++ b/webrtc/p2p/quic/quicsession.h @@ -52,13 +52,14 @@ class QuicSession : public net::QuicSession, public sigslot::has_slots<> { // QuicConnectionVisitorInterface overrides. void OnConnectionClosed(net::QuicErrorCode error, + const std::string& error_details, net::ConnectionCloseSource source) override; // Exports keying material for SRTP. bool ExportKeyingMaterial(base::StringPiece label, base::StringPiece context, size_t result_len, - string* result); + std::string* result); // Decrypts an incoming QUIC packet to a data stream. bool OnReadPacket(const char* data, size_t data_len); @@ -84,6 +85,7 @@ class QuicSession : public net::QuicSession, public sigslot::has_slots<> { private: std::unique_ptr crypto_stream_; + net::QuicClock clock_; // For recording packet receipt time RTC_DISALLOW_COPY_AND_ASSIGN(QuicSession); }; diff --git a/webrtc/p2p/quic/quicsession_unittest.cc b/webrtc/p2p/quic/quicsession_unittest.cc index eae0a2b451..2f3aaae332 100644 --- a/webrtc/p2p/quic/quicsession_unittest.cc +++ b/webrtc/p2p/quic/quicsession_unittest.cc @@ -37,6 +37,7 @@ using net::ProofVerifyContext; using net::ProofVerifyDetails; using net::QuicByteCount; using net::QuicClock; +using net::QuicCompressedCertsCache; using net::QuicConfig; using net::QuicConnection; using net::QuicCryptoClientConfig; @@ -112,11 +113,14 @@ class FakeProofVerifier : public net::ProofVerifier { // ProofVerifier override net::QuicAsyncStatus VerifyProof( const std::string& hostname, + const uint16_t port, const std::string& server_config, + net::QuicVersion quic_version, + base::StringPiece chlo_hash, const std::vector& certs, const std::string& cert_sct, const std::string& signature, - const net::ProofVerifyContext* verify_context, + const ProofVerifyContext* context, std::string* error_details, std::unique_ptr* verify_details, net::ProofVerifierCallback* callback) override { @@ -231,7 +235,10 @@ class QuicSessionForTest : public QuicSession { class QuicSessionTest : public ::testing::Test, public QuicCryptoClientStream::ProofHandler { public: - QuicSessionTest() : quic_helper_(rtc::Thread::Current()) {} + QuicSessionTest() + : quic_helper_(rtc::Thread::Current()), + quic_compressed_certs_cache_( + QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) {} // Instantiates |client_peer_| and |server_peer_|. void CreateClientAndServerSessions(); @@ -268,6 +275,7 @@ class QuicSessionTest : public ::testing::Test, QuicConnectionHelper quic_helper_; QuicConfig config_; QuicClock clock_; + QuicCompressedCertsCache quic_compressed_certs_cache_; std::unique_ptr client_peer_; std::unique_ptr server_peer_; @@ -324,7 +332,10 @@ QuicCryptoServerStream* QuicSessionTest::CreateCryptoServerStream( QuicServerConfigProtobuf* primary_config = server_config->GenerateConfig( QuicRandom::GetInstance(), &clock_, options); server_config->AddConfig(primary_config, clock_.WallNow()); - return new QuicCryptoServerStream(server_config, session); + bool use_stateless_rejects_if_peer_supported = false; + return new QuicCryptoServerStream( + server_config, &quic_compressed_certs_cache_, + use_stateless_rejects_if_peer_supported, session); } std::unique_ptr QuicSessionTest::CreateConnection( @@ -358,8 +369,8 @@ void QuicSessionTest::TestStreamConnection(QuicSessionForTest* from_session, ASSERT_TRUE(from_session->IsEncryptionEstablished()); ASSERT_TRUE(to_session->IsEncryptionEstablished()); - string from_key; - string to_key; + std::string from_key; + std::string to_key; bool from_success = from_session->ExportKeyingMaterial( kExporterLabel, kExporterContext, kExporterContextLen, &from_key); diff --git a/webrtc/p2p/quic/quictransportchannel.cc b/webrtc/p2p/quic/quictransportchannel.cc index 5196ac06f4..aa6d037f75 100644 --- a/webrtc/p2p/quic/quictransportchannel.cc +++ b/webrtc/p2p/quic/quictransportchannel.cc @@ -104,11 +104,14 @@ class InsecureProofVerifier : public net::ProofVerifier { // ProofVerifier override. net::QuicAsyncStatus VerifyProof( const std::string& hostname, + const uint16_t port, const std::string& server_config, + net::QuicVersion quic_version, + base::StringPiece chlo_hash, const std::vector& certs, const std::string& cert_sct, const std::string& signature, - const net::ProofVerifyContext* verify_context, + const net::ProofVerifyContext* context, std::string* error_details, std::unique_ptr* verify_details, net::ProofVerifierCallback* callback) override { @@ -485,8 +488,14 @@ bool QuicTransportChannel::StartQuicHandshake() { net::QuicCryptoServerConfig::ConfigOptions options; quic_crypto_server_config_->AddDefaultConfig(helper_.GetRandomGenerator(), helper_.GetClock(), options); + quic_compressed_certs_cache_.reset(new net::QuicCompressedCertsCache( + net::QuicCompressedCertsCache::kQuicCompressedCertsCacheSize)); + // TODO(mikescarlett): Add support for stateless rejects. + bool use_stateless_rejects_if_peer_supported = false; net::QuicCryptoServerStream* crypto_stream = new net::QuicCryptoServerStream(quic_crypto_server_config_.get(), + quic_compressed_certs_cache_.get(), + use_stateless_rejects_if_peer_supported, quic_.get()); quic_->StartServerHandshake(crypto_stream); LOG_J(LS_INFO, this) << "QuicTransportChannel: Started server handshake."; diff --git a/webrtc/p2p/quic/quictransportchannel.h b/webrtc/p2p/quic/quictransportchannel.h index c9c253d92d..847af7f02f 100644 --- a/webrtc/p2p/quic/quictransportchannel.h +++ b/webrtc/p2p/quic/quictransportchannel.h @@ -292,6 +292,8 @@ class QuicTransportChannel : public TransportChannelImpl, std::unique_ptr quic_crypto_client_config_; // Config for QUIC crypto server stream, used when |ssl_role_| is SSL_SERVER. std::unique_ptr quic_crypto_server_config_; + // Used by QUIC crypto server stream to track most recently compressed certs. + std::unique_ptr quic_compressed_certs_cache_; // This peer's certificate. rtc::scoped_refptr local_certificate_; // Fingerprint of the remote peer. This must be set before we start QUIC. diff --git a/webrtc/p2p/quic/reliablequicstream_unittest.cc b/webrtc/p2p/quic/reliablequicstream_unittest.cc index 9f55c911cc..cf9f5e92dd 100644 --- a/webrtc/p2p/quic/reliablequicstream_unittest.cc +++ b/webrtc/p2p/quic/reliablequicstream_unittest.cc @@ -26,7 +26,6 @@ using cricket::QuicConnectionHelper; using cricket::ReliableQuicStream; -using net::FecProtection; using net::IPAddress; using net::IPEndPoint; using net::PerPacketOptions; @@ -66,7 +65,6 @@ class MockQuicSession : public QuicSession { QuicIOVector iovector, QuicStreamOffset offset, bool fin, - FecProtection fec_protection, QuicAckListenerInterface* ack_notifier_delegate) override { if (!writable_) { return QuicConsumedData(0, false); @@ -118,11 +116,11 @@ class DummyPacketWriter : public QuicPacketWriter { DummyPacketWriter() {} // QuicPacketWriter overrides. - virtual net::WriteResult WritePacket(const char* buffer, - size_t buf_len, - const IPAddress& self_address, - const IPEndPoint& peer_address, - PerPacketOptions* options) { + net::WriteResult WritePacket(const char* buffer, + size_t buf_len, + const IPAddress& self_address, + const IPEndPoint& peer_address, + PerPacketOptions* options) override { return net::WriteResult(net::WRITE_STATUS_ERROR, 0); }