| 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/core/quic_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstdint> | 8 #include <cstdint> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <memory> | 10 #include <memory> |
| 11 #include <string> | 11 #include <string> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "base/logging.h" | |
| 15 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 16 #include "net/quic/core/crypto/null_decrypter.h" | 15 #include "net/quic/core/crypto/null_decrypter.h" |
| 17 #include "net/quic/core/crypto/null_encrypter.h" | 16 #include "net/quic/core/crypto/null_encrypter.h" |
| 18 #include "net/quic/core/crypto/quic_decrypter.h" | 17 #include "net/quic/core/crypto/quic_decrypter.h" |
| 19 #include "net/quic/core/crypto/quic_encrypter.h" | 18 #include "net/quic/core/crypto/quic_encrypter.h" |
| 20 #include "net/quic/core/quic_flags.h" | 19 #include "net/quic/core/quic_flags.h" |
| 21 #include "net/quic/core/quic_packets.h" | 20 #include "net/quic/core/quic_packets.h" |
| 22 #include "net/quic/core/quic_utils.h" | 21 #include "net/quic/core/quic_utils.h" |
| 22 #include "net/quic/platform/api/quic_logging.h" |
| 23 #include "net/quic/test_tools/quic_framer_peer.h" | 23 #include "net/quic/test_tools/quic_framer_peer.h" |
| 24 #include "net/quic/test_tools/quic_test_utils.h" | 24 #include "net/quic/test_tools/quic_test_utils.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 26 | 26 |
| 27 using base::StringPiece; | 27 using base::StringPiece; |
| 28 using std::string; | 28 using std::string; |
| 29 using testing::Return; | 29 using testing::Return; |
| 30 using testing::Truly; | 30 using testing::Truly; |
| 31 using testing::_; | 31 using testing::_; |
| 32 | 32 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 version_mismatch_(0), | 197 version_mismatch_(0), |
| 198 packet_count_(0), | 198 packet_count_(0), |
| 199 frame_count_(0), | 199 frame_count_(0), |
| 200 complete_packets_(0), | 200 complete_packets_(0), |
| 201 accept_packet_(true), | 201 accept_packet_(true), |
| 202 accept_public_header_(true) {} | 202 accept_public_header_(true) {} |
| 203 | 203 |
| 204 ~TestQuicVisitor() override {} | 204 ~TestQuicVisitor() override {} |
| 205 | 205 |
| 206 void OnError(QuicFramer* f) override { | 206 void OnError(QuicFramer* f) override { |
| 207 DVLOG(1) << "QuicFramer Error: " << QuicErrorCodeToString(f->error()) | 207 QUIC_DLOG(INFO) << "QuicFramer Error: " << QuicErrorCodeToString(f->error()) |
| 208 << " (" << f->error() << ")"; | 208 << " (" << f->error() << ")"; |
| 209 ++error_count_; | 209 ++error_count_; |
| 210 } | 210 } |
| 211 | 211 |
| 212 void OnPacket() override {} | 212 void OnPacket() override {} |
| 213 | 213 |
| 214 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override { | 214 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override { |
| 215 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); | 215 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); |
| 216 } | 216 } |
| 217 | 217 |
| 218 void OnVersionNegotiationPacket( | 218 void OnVersionNegotiationPacket( |
| 219 const QuicVersionNegotiationPacket& packet) override { | 219 const QuicVersionNegotiationPacket& packet) override { |
| 220 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); | 220 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); |
| 221 } | 221 } |
| 222 | 222 |
| 223 bool OnProtocolVersionMismatch(QuicVersion version) override { | 223 bool OnProtocolVersionMismatch(QuicVersion version) override { |
| 224 DVLOG(1) << "QuicFramer Version Mismatch, version: " << version; | 224 QUIC_DLOG(INFO) << "QuicFramer Version Mismatch, version: " << version; |
| 225 ++version_mismatch_; | 225 ++version_mismatch_; |
| 226 return true; | 226 return true; |
| 227 } | 227 } |
| 228 | 228 |
| 229 bool OnUnauthenticatedPublicHeader( | 229 bool OnUnauthenticatedPublicHeader( |
| 230 const QuicPacketPublicHeader& header) override { | 230 const QuicPacketPublicHeader& header) override { |
| 231 public_header_.reset(new QuicPacketPublicHeader(header)); | 231 public_header_.reset(new QuicPacketPublicHeader(header)); |
| 232 return accept_public_header_; | 232 return accept_public_header_; |
| 233 } | 233 } |
| 234 | 234 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 // tens place of the current QUIC version number. | 363 // tens place of the current QUIC version number. |
| 364 unsigned char GetQuicVersionDigitTens() { | 364 unsigned char GetQuicVersionDigitTens() { |
| 365 return static_cast<unsigned char>('0' + (version_ / 10) % 10); | 365 return static_cast<unsigned char>('0' + (version_ / 10) % 10); |
| 366 } | 366 } |
| 367 | 367 |
| 368 bool CheckEncryption(QuicPathId path_id, | 368 bool CheckEncryption(QuicPathId path_id, |
| 369 QuicPacketNumber packet_number, | 369 QuicPacketNumber packet_number, |
| 370 QuicPacket* packet) { | 370 QuicPacket* packet) { |
| 371 EXPECT_EQ(version_, encrypter_->version_); | 371 EXPECT_EQ(version_, encrypter_->version_); |
| 372 if (packet_number != encrypter_->packet_number_) { | 372 if (packet_number != encrypter_->packet_number_) { |
| 373 LOG(ERROR) << "Encrypted incorrect packet number. expected " | 373 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected " |
| 374 << packet_number << " actual: " << encrypter_->packet_number_; | 374 << packet_number |
| 375 << " actual: " << encrypter_->packet_number_; |
| 375 return false; | 376 return false; |
| 376 } | 377 } |
| 377 if (packet->AssociatedData(framer_.version()) != | 378 if (packet->AssociatedData(framer_.version()) != |
| 378 encrypter_->associated_data_) { | 379 encrypter_->associated_data_) { |
| 379 LOG(ERROR) << "Encrypted incorrect associated data. expected " | 380 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected " |
| 380 << packet->AssociatedData(framer_.version()) | 381 << packet->AssociatedData(framer_.version()) |
| 381 << " actual: " << encrypter_->associated_data_; | 382 << " actual: " << encrypter_->associated_data_; |
| 382 return false; | 383 return false; |
| 383 } | 384 } |
| 384 if (packet->Plaintext(framer_.version()) != encrypter_->plaintext_) { | 385 if (packet->Plaintext(framer_.version()) != encrypter_->plaintext_) { |
| 385 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " | 386 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected " |
| 386 << packet->Plaintext(framer_.version()) | 387 << packet->Plaintext(framer_.version()) |
| 387 << " actual: " << encrypter_->plaintext_; | 388 << " actual: " << encrypter_->plaintext_; |
| 388 return false; | 389 return false; |
| 389 } | 390 } |
| 390 return true; | 391 return true; |
| 391 } | 392 } |
| 392 | 393 |
| 393 bool CheckDecryption(const QuicEncryptedPacket& encrypted, | 394 bool CheckDecryption(const QuicEncryptedPacket& encrypted, |
| 394 bool includes_version, | 395 bool includes_version, |
| 395 bool includes_path_id, | 396 bool includes_path_id, |
| 396 bool includes_diversification_nonce) { | 397 bool includes_diversification_nonce) { |
| 397 EXPECT_EQ(version_, decrypter_->version_); | 398 EXPECT_EQ(version_, decrypter_->version_); |
| 398 if (visitor_.header_->packet_number != decrypter_->packet_number_) { | 399 if (visitor_.header_->packet_number != decrypter_->packet_number_) { |
| 399 LOG(ERROR) << "Decrypted incorrect packet number. expected " | 400 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected " |
| 400 << visitor_.header_->packet_number | 401 << visitor_.header_->packet_number |
| 401 << " actual: " << decrypter_->packet_number_; | 402 << " actual: " << decrypter_->packet_number_; |
| 402 return false; | 403 return false; |
| 403 } | 404 } |
| 404 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( | 405 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 405 framer_.version(), encrypted, PACKET_8BYTE_CONNECTION_ID, | 406 framer_.version(), encrypted, PACKET_8BYTE_CONNECTION_ID, |
| 406 includes_version, includes_path_id, includes_diversification_nonce, | 407 includes_version, includes_path_id, includes_diversification_nonce, |
| 407 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) { | 408 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) { |
| 408 LOG(ERROR) << "Decrypted incorrect associated data. expected " | 409 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected " |
| 409 << QuicFramer::GetAssociatedDataFromEncryptedPacket( | 410 << QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 410 framer_.version(), encrypted, | 411 framer_.version(), encrypted, |
| 411 PACKET_8BYTE_CONNECTION_ID, includes_version, | 412 PACKET_8BYTE_CONNECTION_ID, includes_version, |
| 412 includes_path_id, includes_diversification_nonce, | 413 includes_path_id, includes_diversification_nonce, |
| 413 PACKET_6BYTE_PACKET_NUMBER) | 414 PACKET_6BYTE_PACKET_NUMBER) |
| 414 << " actual: " << decrypter_->associated_data_; | 415 << " actual: " << decrypter_->associated_data_; |
| 415 return false; | 416 return false; |
| 416 } | 417 } |
| 417 StringPiece ciphertext( | 418 StringPiece ciphertext( |
| 418 encrypted.AsStringPiece().substr(GetStartOfEncryptedData( | 419 encrypted.AsStringPiece().substr(GetStartOfEncryptedData( |
| 419 framer_.version(), PACKET_8BYTE_CONNECTION_ID, includes_version, | 420 framer_.version(), PACKET_8BYTE_CONNECTION_ID, includes_version, |
| 420 includes_path_id, includes_diversification_nonce, | 421 includes_path_id, includes_diversification_nonce, |
| 421 PACKET_6BYTE_PACKET_NUMBER))); | 422 PACKET_6BYTE_PACKET_NUMBER))); |
| 422 if (ciphertext != decrypter_->ciphertext_) { | 423 if (ciphertext != decrypter_->ciphertext_) { |
| 423 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " | 424 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " |
| 424 << ciphertext << " actual: " << decrypter_->ciphertext_; | 425 << ciphertext << " actual: " << decrypter_->ciphertext_; |
| 425 return false; | 426 return false; |
| 426 } | 427 } |
| 427 return true; | 428 return true; |
| 428 } | 429 } |
| 429 | 430 |
| 430 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } | 431 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } |
| 431 | 432 |
| 432 void CheckProcessingFails(unsigned char* packet, | 433 void CheckProcessingFails(unsigned char* packet, |
| 433 size_t len, | 434 size_t len, |
| 434 string expected_error, | 435 string expected_error, |
| (...skipping 1843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2278 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2279 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
| 2279 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); | 2280 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); |
| 2280 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); | 2281 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); |
| 2281 EXPECT_EQ( | 2282 EXPECT_EQ( |
| 2282 IpAddressFamily::IP_UNSPEC, | 2283 IpAddressFamily::IP_UNSPEC, |
| 2283 visitor_.public_reset_packet_->client_address.host().address_family()); | 2284 visitor_.public_reset_packet_->client_address.host().address_family()); |
| 2284 | 2285 |
| 2285 // Now test framing boundaries. | 2286 // Now test framing boundaries. |
| 2286 for (size_t i = 0; i < arraysize(packet); ++i) { | 2287 for (size_t i = 0; i < arraysize(packet); ++i) { |
| 2287 string expected_error; | 2288 string expected_error; |
| 2288 DVLOG(1) << "iteration: " << i; | 2289 QUIC_DLOG(INFO) << "iteration: " << i; |
| 2289 if (i < kConnectionIdOffset) { | 2290 if (i < kConnectionIdOffset) { |
| 2290 expected_error = "Unable to read public flags."; | 2291 expected_error = "Unable to read public flags."; |
| 2291 CheckProcessingFails(packet, i, expected_error, | 2292 CheckProcessingFails(packet, i, expected_error, |
| 2292 QUIC_INVALID_PACKET_HEADER); | 2293 QUIC_INVALID_PACKET_HEADER); |
| 2293 } else if (i < kPublicResetPacketMessageTagOffset) { | 2294 } else if (i < kPublicResetPacketMessageTagOffset) { |
| 2294 expected_error = "Unable to read ConnectionId."; | 2295 expected_error = "Unable to read ConnectionId."; |
| 2295 CheckProcessingFails(packet, i, expected_error, | 2296 CheckProcessingFails(packet, i, expected_error, |
| 2296 QUIC_INVALID_PACKET_HEADER); | 2297 QUIC_INVALID_PACKET_HEADER); |
| 2297 } else { | 2298 } else { |
| 2298 expected_error = "Unable to read reset message."; | 2299 expected_error = "Unable to read reset message."; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2343 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2344 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
| 2344 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); | 2345 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); |
| 2345 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); | 2346 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); |
| 2346 EXPECT_EQ( | 2347 EXPECT_EQ( |
| 2347 IpAddressFamily::IP_UNSPEC, | 2348 IpAddressFamily::IP_UNSPEC, |
| 2348 visitor_.public_reset_packet_->client_address.host().address_family()); | 2349 visitor_.public_reset_packet_->client_address.host().address_family()); |
| 2349 | 2350 |
| 2350 // Now test framing boundaries. | 2351 // Now test framing boundaries. |
| 2351 for (size_t i = 0; i < arraysize(packet); ++i) { | 2352 for (size_t i = 0; i < arraysize(packet); ++i) { |
| 2352 string expected_error; | 2353 string expected_error; |
| 2353 DVLOG(1) << "iteration: " << i; | 2354 QUIC_DLOG(INFO) << "iteration: " << i; |
| 2354 if (i < kConnectionIdOffset) { | 2355 if (i < kConnectionIdOffset) { |
| 2355 expected_error = "Unable to read public flags."; | 2356 expected_error = "Unable to read public flags."; |
| 2356 CheckProcessingFails(packet, i, expected_error, | 2357 CheckProcessingFails(packet, i, expected_error, |
| 2357 QUIC_INVALID_PACKET_HEADER); | 2358 QUIC_INVALID_PACKET_HEADER); |
| 2358 } else if (i < kPublicResetPacketMessageTagOffset) { | 2359 } else if (i < kPublicResetPacketMessageTagOffset) { |
| 2359 expected_error = "Unable to read ConnectionId."; | 2360 expected_error = "Unable to read ConnectionId."; |
| 2360 CheckProcessingFails(packet, i, expected_error, | 2361 CheckProcessingFails(packet, i, expected_error, |
| 2361 QUIC_INVALID_PACKET_HEADER); | 2362 QUIC_INVALID_PACKET_HEADER); |
| 2362 } else { | 2363 } else { |
| 2363 expected_error = "Unable to read reset message."; | 2364 expected_error = "Unable to read reset message."; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2450 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2451 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
| 2451 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); | 2452 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); |
| 2452 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); | 2453 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); |
| 2453 EXPECT_EQ("4.31.198.44", | 2454 EXPECT_EQ("4.31.198.44", |
| 2454 visitor_.public_reset_packet_->client_address.host().ToString()); | 2455 visitor_.public_reset_packet_->client_address.host().ToString()); |
| 2455 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); | 2456 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); |
| 2456 | 2457 |
| 2457 // Now test framing boundaries. | 2458 // Now test framing boundaries. |
| 2458 for (size_t i = 0; i < arraysize(packet); ++i) { | 2459 for (size_t i = 0; i < arraysize(packet); ++i) { |
| 2459 string expected_error; | 2460 string expected_error; |
| 2460 DVLOG(1) << "iteration: " << i; | 2461 QUIC_DLOG(INFO) << "iteration: " << i; |
| 2461 if (i < kConnectionIdOffset) { | 2462 if (i < kConnectionIdOffset) { |
| 2462 expected_error = "Unable to read public flags."; | 2463 expected_error = "Unable to read public flags."; |
| 2463 CheckProcessingFails(packet, i, expected_error, | 2464 CheckProcessingFails(packet, i, expected_error, |
| 2464 QUIC_INVALID_PACKET_HEADER); | 2465 QUIC_INVALID_PACKET_HEADER); |
| 2465 } else if (i < kPublicResetPacketMessageTagOffset) { | 2466 } else if (i < kPublicResetPacketMessageTagOffset) { |
| 2466 expected_error = "Unable to read ConnectionId."; | 2467 expected_error = "Unable to read ConnectionId."; |
| 2467 CheckProcessingFails(packet, i, expected_error, | 2468 CheckProcessingFails(packet, i, expected_error, |
| 2468 QUIC_INVALID_PACKET_HEADER); | 2469 QUIC_INVALID_PACKET_HEADER); |
| 2469 } else { | 2470 } else { |
| 2470 expected_error = "Unable to read reset message."; | 2471 expected_error = "Unable to read reset message."; |
| (...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4188 'o', ' ', 'w', 'o', | 4189 'o', ' ', 'w', 'o', |
| 4189 'r', 'l', 'd', '!', | 4190 'r', 'l', 'd', '!', |
| 4190 }; | 4191 }; |
| 4191 // clang-format on | 4192 // clang-format on |
| 4192 | 4193 |
| 4193 QuicFramerFuzzFunc(packet, arraysize(packet)); | 4194 QuicFramerFuzzFunc(packet, arraysize(packet)); |
| 4194 } | 4195 } |
| 4195 | 4196 |
| 4196 } // namespace test | 4197 } // namespace test |
| 4197 } // namespace net | 4198 } // namespace net |
| OLD | NEW |