OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/p2p/quic/quicsession.h" | 11 #include "webrtc/p2p/quic/quicsession.h" |
12 | 12 |
| 13 #include <memory> |
13 #include <string> | 14 #include <string> |
14 #include <vector> | 15 #include <vector> |
15 | 16 |
16 #include "net/base/ip_endpoint.h" | 17 #include "net/base/ip_endpoint.h" |
17 #include "net/quic/crypto/crypto_server_config_protobuf.h" | 18 #include "net/quic/crypto/crypto_server_config_protobuf.h" |
18 #include "net/quic/crypto/quic_random.h" | 19 #include "net/quic/crypto/quic_random.h" |
19 #include "net/quic/crypto/proof_source.h" | 20 #include "net/quic/crypto/proof_source.h" |
20 #include "net/quic/crypto/proof_verifier.h" | 21 #include "net/quic/crypto/proof_verifier.h" |
21 #include "net/quic/crypto/quic_crypto_client_config.h" | 22 #include "net/quic/crypto/quic_crypto_client_config.h" |
22 #include "net/quic/crypto/quic_crypto_server_config.h" | 23 #include "net/quic/crypto/quic_crypto_server_config.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 | 111 |
111 // ProofVerifier override | 112 // ProofVerifier override |
112 net::QuicAsyncStatus VerifyProof( | 113 net::QuicAsyncStatus VerifyProof( |
113 const std::string& hostname, | 114 const std::string& hostname, |
114 const std::string& server_config, | 115 const std::string& server_config, |
115 const std::vector<std::string>& certs, | 116 const std::vector<std::string>& certs, |
116 const std::string& cert_sct, | 117 const std::string& cert_sct, |
117 const std::string& signature, | 118 const std::string& signature, |
118 const net::ProofVerifyContext* verify_context, | 119 const net::ProofVerifyContext* verify_context, |
119 std::string* error_details, | 120 std::string* error_details, |
120 scoped_ptr<net::ProofVerifyDetails>* verify_details, | 121 std::unique_ptr<net::ProofVerifyDetails>* verify_details, |
121 net::ProofVerifierCallback* callback) override { | 122 net::ProofVerifierCallback* callback) override { |
122 return success_ ? net::QUIC_SUCCESS : net::QUIC_FAILURE; | 123 return success_ ? net::QUIC_SUCCESS : net::QUIC_FAILURE; |
123 } | 124 } |
124 | 125 |
125 private: | 126 private: |
126 // Whether or not proof verification succeeds. | 127 // Whether or not proof verification succeeds. |
127 bool success_; | 128 bool success_; |
128 }; | 129 }; |
129 | 130 |
130 // Writes QUIC packets to a fake transport channel that simulates a network. | 131 // Writes QUIC packets to a fake transport channel that simulates a network. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 return net::kMaxPacketSize; | 173 return net::kMaxPacketSize; |
173 } | 174 } |
174 | 175 |
175 private: | 176 private: |
176 FakeTransportChannel* fake_channel_; | 177 FakeTransportChannel* fake_channel_; |
177 }; | 178 }; |
178 | 179 |
179 // Wrapper for QuicSession and transport channel that stores incoming data. | 180 // Wrapper for QuicSession and transport channel that stores incoming data. |
180 class QuicSessionForTest : public QuicSession { | 181 class QuicSessionForTest : public QuicSession { |
181 public: | 182 public: |
182 QuicSessionForTest(rtc::scoped_ptr<net::QuicConnection> connection, | 183 QuicSessionForTest(std::unique_ptr<net::QuicConnection> connection, |
183 const net::QuicConfig& config, | 184 const net::QuicConfig& config, |
184 rtc::scoped_ptr<FakeTransportChannel> channel) | 185 std::unique_ptr<FakeTransportChannel> channel) |
185 : QuicSession(std::move(connection), config), | 186 : QuicSession(std::move(connection), config), |
186 channel_(std::move(channel)) { | 187 channel_(std::move(channel)) { |
187 channel_->SignalReadPacket.connect( | 188 channel_->SignalReadPacket.connect( |
188 this, &QuicSessionForTest::OnChannelReadPacket); | 189 this, &QuicSessionForTest::OnChannelReadPacket); |
189 } | 190 } |
190 | 191 |
191 // Called when channel has packets to read. | 192 // Called when channel has packets to read. |
192 void OnChannelReadPacket(TransportChannel* channel, | 193 void OnChannelReadPacket(TransportChannel* channel, |
193 const char* data, | 194 const char* data, |
194 size_t size, | 195 size_t size, |
(...skipping 17 matching lines...) Expand all Loading... |
212 std::string data() { return last_received_data_; } | 213 std::string data() { return last_received_data_; } |
213 | 214 |
214 bool has_data() { return data().size() > 0; } | 215 bool has_data() { return data().size() > 0; } |
215 | 216 |
216 FakeTransportChannel* channel() { return channel_.get(); } | 217 FakeTransportChannel* channel() { return channel_.get(); } |
217 | 218 |
218 ReliableQuicStream* incoming_stream() { return last_incoming_stream_; } | 219 ReliableQuicStream* incoming_stream() { return last_incoming_stream_; } |
219 | 220 |
220 private: | 221 private: |
221 // Transports QUIC packets to/from peer. | 222 // Transports QUIC packets to/from peer. |
222 rtc::scoped_ptr<FakeTransportChannel> channel_; | 223 std::unique_ptr<FakeTransportChannel> channel_; |
223 // Stores data received by peer once it is sent from the other peer. | 224 // Stores data received by peer once it is sent from the other peer. |
224 std::string last_received_data_; | 225 std::string last_received_data_; |
225 // Handles incoming streams from sender. | 226 // Handles incoming streams from sender. |
226 ReliableQuicStream* last_incoming_stream_ = nullptr; | 227 ReliableQuicStream* last_incoming_stream_ = nullptr; |
227 }; | 228 }; |
228 | 229 |
229 // Simulates data transfer between two peers using QUIC. | 230 // Simulates data transfer between two peers using QUIC. |
230 class QuicSessionTest : public ::testing::Test, | 231 class QuicSessionTest : public ::testing::Test, |
231 public QuicCryptoClientStream::ProofHandler { | 232 public QuicCryptoClientStream::ProofHandler { |
232 public: | 233 public: |
233 QuicSessionTest() : quic_helper_(rtc::Thread::Current()) {} | 234 QuicSessionTest() : quic_helper_(rtc::Thread::Current()) {} |
234 | 235 |
235 // Instantiates |client_peer_| and |server_peer_|. | 236 // Instantiates |client_peer_| and |server_peer_|. |
236 void CreateClientAndServerSessions(); | 237 void CreateClientAndServerSessions(); |
237 | 238 |
238 rtc::scoped_ptr<QuicSessionForTest> CreateSession( | 239 std::unique_ptr<QuicSessionForTest> CreateSession( |
239 rtc::scoped_ptr<FakeTransportChannel> channel, | 240 std::unique_ptr<FakeTransportChannel> channel, |
240 Perspective perspective); | 241 Perspective perspective); |
241 | 242 |
242 QuicCryptoClientStream* CreateCryptoClientStream(QuicSessionForTest* session, | 243 QuicCryptoClientStream* CreateCryptoClientStream(QuicSessionForTest* session, |
243 bool handshake_success); | 244 bool handshake_success); |
244 QuicCryptoServerStream* CreateCryptoServerStream(QuicSessionForTest* session, | 245 QuicCryptoServerStream* CreateCryptoServerStream(QuicSessionForTest* session, |
245 bool handshake_success); | 246 bool handshake_success); |
246 | 247 |
247 rtc::scoped_ptr<QuicConnection> CreateConnection( | 248 std::unique_ptr<QuicConnection> CreateConnection( |
248 FakeTransportChannel* channel, | 249 FakeTransportChannel* channel, |
249 Perspective perspective); | 250 Perspective perspective); |
250 | 251 |
251 void StartHandshake(bool client_handshake_success, | 252 void StartHandshake(bool client_handshake_success, |
252 bool server_handshake_success); | 253 bool server_handshake_success); |
253 | 254 |
254 // Test handshake establishment and sending/receiving of data. | 255 // Test handshake establishment and sending/receiving of data. |
255 void TestStreamConnection(QuicSessionForTest* from_session, | 256 void TestStreamConnection(QuicSessionForTest* from_session, |
256 QuicSessionForTest* to_session); | 257 QuicSessionForTest* to_session); |
257 // Test that client and server are not connected after handshake failure. | 258 // Test that client and server are not connected after handshake failure. |
258 void TestDisconnectAfterFailedHandshake(); | 259 void TestDisconnectAfterFailedHandshake(); |
259 | 260 |
260 // QuicCryptoClientStream::ProofHelper overrides. | 261 // QuicCryptoClientStream::ProofHelper overrides. |
261 void OnProofValid( | 262 void OnProofValid( |
262 const QuicCryptoClientConfig::CachedState& cached) override {} | 263 const QuicCryptoClientConfig::CachedState& cached) override {} |
263 void OnProofVerifyDetailsAvailable( | 264 void OnProofVerifyDetailsAvailable( |
264 const ProofVerifyDetails& verify_details) override {} | 265 const ProofVerifyDetails& verify_details) override {} |
265 | 266 |
266 protected: | 267 protected: |
267 QuicConnectionHelper quic_helper_; | 268 QuicConnectionHelper quic_helper_; |
268 QuicConfig config_; | 269 QuicConfig config_; |
269 QuicClock clock_; | 270 QuicClock clock_; |
270 | 271 |
271 rtc::scoped_ptr<QuicSessionForTest> client_peer_; | 272 std::unique_ptr<QuicSessionForTest> client_peer_; |
272 rtc::scoped_ptr<QuicSessionForTest> server_peer_; | 273 std::unique_ptr<QuicSessionForTest> server_peer_; |
273 }; | 274 }; |
274 | 275 |
275 // Initializes "client peer" who begins crypto handshake and "server peer" who | 276 // Initializes "client peer" who begins crypto handshake and "server peer" who |
276 // establishes encryption with client. | 277 // establishes encryption with client. |
277 void QuicSessionTest::CreateClientAndServerSessions() { | 278 void QuicSessionTest::CreateClientAndServerSessions() { |
278 rtc::scoped_ptr<FakeTransportChannel> channel1( | 279 std::unique_ptr<FakeTransportChannel> channel1( |
279 new FakeTransportChannel("channel1", 0)); | 280 new FakeTransportChannel("channel1", 0)); |
280 rtc::scoped_ptr<FakeTransportChannel> channel2( | 281 std::unique_ptr<FakeTransportChannel> channel2( |
281 new FakeTransportChannel("channel2", 0)); | 282 new FakeTransportChannel("channel2", 0)); |
282 | 283 |
283 // Prevent channel1->OnReadPacket and channel2->OnReadPacket from calling | 284 // Prevent channel1->OnReadPacket and channel2->OnReadPacket from calling |
284 // themselves in a loop, which causes to future packets to be recursively | 285 // themselves in a loop, which causes to future packets to be recursively |
285 // consumed while the current thread blocks consumption of current ones. | 286 // consumed while the current thread blocks consumption of current ones. |
286 channel2->SetAsync(true); | 287 channel2->SetAsync(true); |
287 | 288 |
288 // Configure peers to send packets to each other. | 289 // Configure peers to send packets to each other. |
289 channel1->Connect(); | 290 channel1->Connect(); |
290 channel2->Connect(); | 291 channel2->Connect(); |
291 channel1->SetDestination(channel2.get()); | 292 channel1->SetDestination(channel2.get()); |
292 | 293 |
293 client_peer_ = CreateSession(std::move(channel1), Perspective::IS_CLIENT); | 294 client_peer_ = CreateSession(std::move(channel1), Perspective::IS_CLIENT); |
294 server_peer_ = CreateSession(std::move(channel2), Perspective::IS_SERVER); | 295 server_peer_ = CreateSession(std::move(channel2), Perspective::IS_SERVER); |
295 } | 296 } |
296 | 297 |
297 rtc::scoped_ptr<QuicSessionForTest> QuicSessionTest::CreateSession( | 298 std::unique_ptr<QuicSessionForTest> QuicSessionTest::CreateSession( |
298 rtc::scoped_ptr<FakeTransportChannel> channel, | 299 std::unique_ptr<FakeTransportChannel> channel, |
299 Perspective perspective) { | 300 Perspective perspective) { |
300 rtc::scoped_ptr<QuicConnection> quic_connection = | 301 std::unique_ptr<QuicConnection> quic_connection = |
301 CreateConnection(channel.get(), perspective); | 302 CreateConnection(channel.get(), perspective); |
302 return rtc::scoped_ptr<QuicSessionForTest>(new QuicSessionForTest( | 303 return std::unique_ptr<QuicSessionForTest>(new QuicSessionForTest( |
303 std::move(quic_connection), config_, std::move(channel))); | 304 std::move(quic_connection), config_, std::move(channel))); |
304 } | 305 } |
305 | 306 |
306 QuicCryptoClientStream* QuicSessionTest::CreateCryptoClientStream( | 307 QuicCryptoClientStream* QuicSessionTest::CreateCryptoClientStream( |
307 QuicSessionForTest* session, | 308 QuicSessionForTest* session, |
308 bool handshake_success) { | 309 bool handshake_success) { |
309 QuicCryptoClientConfig* client_config = | 310 QuicCryptoClientConfig* client_config = |
310 new QuicCryptoClientConfig(new FakeProofVerifier(handshake_success)); | 311 new QuicCryptoClientConfig(new FakeProofVerifier(handshake_success)); |
311 return new QuicCryptoClientStream( | 312 return new QuicCryptoClientStream( |
312 kServerId, session, new ProofVerifyContext(), client_config, this); | 313 kServerId, session, new ProofVerifyContext(), client_config, this); |
313 } | 314 } |
314 | 315 |
315 QuicCryptoServerStream* QuicSessionTest::CreateCryptoServerStream( | 316 QuicCryptoServerStream* QuicSessionTest::CreateCryptoServerStream( |
316 QuicSessionForTest* session, | 317 QuicSessionForTest* session, |
317 bool handshake_success) { | 318 bool handshake_success) { |
318 QuicCryptoServerConfig* server_config = | 319 QuicCryptoServerConfig* server_config = |
319 new QuicCryptoServerConfig("TESTING", QuicRandom::GetInstance(), | 320 new QuicCryptoServerConfig("TESTING", QuicRandom::GetInstance(), |
320 new FakeProofSource(handshake_success)); | 321 new FakeProofSource(handshake_success)); |
321 // Provide server with serialized config string to prove ownership. | 322 // Provide server with serialized config string to prove ownership. |
322 QuicCryptoServerConfig::ConfigOptions options; | 323 QuicCryptoServerConfig::ConfigOptions options; |
323 QuicServerConfigProtobuf* primary_config = server_config->GenerateConfig( | 324 QuicServerConfigProtobuf* primary_config = server_config->GenerateConfig( |
324 QuicRandom::GetInstance(), &clock_, options); | 325 QuicRandom::GetInstance(), &clock_, options); |
325 server_config->AddConfig(primary_config, clock_.WallNow()); | 326 server_config->AddConfig(primary_config, clock_.WallNow()); |
326 return new QuicCryptoServerStream(server_config, session); | 327 return new QuicCryptoServerStream(server_config, session); |
327 } | 328 } |
328 | 329 |
329 rtc::scoped_ptr<QuicConnection> QuicSessionTest::CreateConnection( | 330 std::unique_ptr<QuicConnection> QuicSessionTest::CreateConnection( |
330 FakeTransportChannel* channel, | 331 FakeTransportChannel* channel, |
331 Perspective perspective) { | 332 Perspective perspective) { |
332 FakeQuicPacketWriter* writer = new FakeQuicPacketWriter(channel); | 333 FakeQuicPacketWriter* writer = new FakeQuicPacketWriter(channel); |
333 | 334 |
334 IPAddress ip(0, 0, 0, 0); | 335 IPAddress ip(0, 0, 0, 0); |
335 bool owns_writer = true; | 336 bool owns_writer = true; |
336 | 337 |
337 return rtc::scoped_ptr<QuicConnection>(new QuicConnection( | 338 return std::unique_ptr<QuicConnection>(new QuicConnection( |
338 0, net::IPEndPoint(ip, 0), &quic_helper_, writer, owns_writer, | 339 0, net::IPEndPoint(ip, 0), &quic_helper_, writer, owns_writer, |
339 perspective, net::QuicSupportedVersions())); | 340 perspective, net::QuicSupportedVersions())); |
340 } | 341 } |
341 | 342 |
342 void QuicSessionTest::StartHandshake(bool client_handshake_success, | 343 void QuicSessionTest::StartHandshake(bool client_handshake_success, |
343 bool server_handshake_success) { | 344 bool server_handshake_success) { |
344 server_peer_->StartServerHandshake( | 345 server_peer_->StartServerHandshake( |
345 CreateCryptoServerStream(server_peer_.get(), server_handshake_success)); | 346 CreateCryptoServerStream(server_peer_.get(), server_handshake_success)); |
346 client_peer_->StartClientHandshake( | 347 client_peer_->StartClientHandshake( |
347 CreateCryptoClientStream(client_peer_.get(), client_handshake_success)); | 348 CreateCryptoClientStream(client_peer_.get(), client_handshake_success)); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 StartHandshake(true, true); | 458 StartHandshake(true, true); |
458 ASSERT_TRUE_WAIT(client_peer_->IsCryptoHandshakeConfirmed() && | 459 ASSERT_TRUE_WAIT(client_peer_->IsCryptoHandshakeConfirmed() && |
459 server_peer_->IsCryptoHandshakeConfirmed(), | 460 server_peer_->IsCryptoHandshakeConfirmed(), |
460 kTimeoutMs); | 461 kTimeoutMs); |
461 ReliableQuicStream* stream = client_peer_->CreateOutgoingDynamicStream(5); | 462 ReliableQuicStream* stream = client_peer_->CreateOutgoingDynamicStream(5); |
462 ASSERT_NE(nullptr, stream); | 463 ASSERT_NE(nullptr, stream); |
463 EXPECT_FALSE(client_peer_->IsClosedStream(stream->id())); | 464 EXPECT_FALSE(client_peer_->IsClosedStream(stream->id())); |
464 stream->Close(); | 465 stream->Close(); |
465 EXPECT_TRUE(client_peer_->IsClosedStream(stream->id())); | 466 EXPECT_TRUE(client_peer_->IsClosedStream(stream->id())); |
466 } | 467 } |
OLD | NEW |