| 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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 // tens place of the current QUIC version number. | 361 // tens place of the current QUIC version number. |
| 362 unsigned char GetQuicVersionDigitTens() { | 362 unsigned char GetQuicVersionDigitTens() { |
| 363 return static_cast<unsigned char>('0' + (version_ / 10) % 10); | 363 return static_cast<unsigned char>('0' + (version_ / 10) % 10); |
| 364 } | 364 } |
| 365 | 365 |
| 366 bool CheckEncryption(QuicPathId path_id, | 366 bool CheckEncryption(QuicPathId path_id, |
| 367 QuicPacketNumber packet_number, | 367 QuicPacketNumber packet_number, |
| 368 QuicPacket* packet) { | 368 QuicPacket* packet) { |
| 369 EXPECT_EQ(version_, encrypter_->version_); | 369 EXPECT_EQ(version_, encrypter_->version_); |
| 370 if (packet_number != encrypter_->packet_number_) { | 370 if (packet_number != encrypter_->packet_number_) { |
| 371 LOG(ERROR) << "Encrypted incorrect packet number. expected " | 371 QUIC_LOG(ERROR) << "Encrypted incorrect packet number. expected " |
| 372 << packet_number << " actual: " << encrypter_->packet_number_; | 372 << packet_number |
| 373 << " actual: " << encrypter_->packet_number_; |
| 373 return false; | 374 return false; |
| 374 } | 375 } |
| 375 if (packet->AssociatedData(framer_.version()) != | 376 if (packet->AssociatedData(framer_.version()) != |
| 376 encrypter_->associated_data_) { | 377 encrypter_->associated_data_) { |
| 377 LOG(ERROR) << "Encrypted incorrect associated data. expected " | 378 QUIC_LOG(ERROR) << "Encrypted incorrect associated data. expected " |
| 378 << packet->AssociatedData(framer_.version()) | 379 << packet->AssociatedData(framer_.version()) |
| 379 << " actual: " << encrypter_->associated_data_; | 380 << " actual: " << encrypter_->associated_data_; |
| 380 return false; | 381 return false; |
| 381 } | 382 } |
| 382 if (packet->Plaintext(framer_.version()) != encrypter_->plaintext_) { | 383 if (packet->Plaintext(framer_.version()) != encrypter_->plaintext_) { |
| 383 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " | 384 QUIC_LOG(ERROR) << "Encrypted incorrect plaintext data. expected " |
| 384 << packet->Plaintext(framer_.version()) | 385 << packet->Plaintext(framer_.version()) |
| 385 << " actual: " << encrypter_->plaintext_; | 386 << " actual: " << encrypter_->plaintext_; |
| 386 return false; | 387 return false; |
| 387 } | 388 } |
| 388 return true; | 389 return true; |
| 389 } | 390 } |
| 390 | 391 |
| 391 bool CheckDecryption(const QuicEncryptedPacket& encrypted, | 392 bool CheckDecryption(const QuicEncryptedPacket& encrypted, |
| 392 bool includes_version, | 393 bool includes_version, |
| 393 bool includes_path_id, | 394 bool includes_path_id, |
| 394 bool includes_diversification_nonce) { | 395 bool includes_diversification_nonce) { |
| 395 EXPECT_EQ(version_, decrypter_->version_); | 396 EXPECT_EQ(version_, decrypter_->version_); |
| 396 if (visitor_.header_->packet_number != decrypter_->packet_number_) { | 397 if (visitor_.header_->packet_number != decrypter_->packet_number_) { |
| 397 LOG(ERROR) << "Decrypted incorrect packet number. expected " | 398 QUIC_LOG(ERROR) << "Decrypted incorrect packet number. expected " |
| 398 << visitor_.header_->packet_number | 399 << visitor_.header_->packet_number |
| 399 << " actual: " << decrypter_->packet_number_; | 400 << " actual: " << decrypter_->packet_number_; |
| 400 return false; | 401 return false; |
| 401 } | 402 } |
| 402 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( | 403 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 403 framer_.version(), encrypted, PACKET_8BYTE_CONNECTION_ID, | 404 framer_.version(), encrypted, PACKET_8BYTE_CONNECTION_ID, |
| 404 includes_version, includes_path_id, includes_diversification_nonce, | 405 includes_version, includes_path_id, includes_diversification_nonce, |
| 405 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) { | 406 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) { |
| 406 LOG(ERROR) << "Decrypted incorrect associated data. expected " | 407 QUIC_LOG(ERROR) << "Decrypted incorrect associated data. expected " |
| 407 << QuicFramer::GetAssociatedDataFromEncryptedPacket( | 408 << QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 408 framer_.version(), encrypted, | 409 framer_.version(), encrypted, |
| 409 PACKET_8BYTE_CONNECTION_ID, includes_version, | 410 PACKET_8BYTE_CONNECTION_ID, includes_version, |
| 410 includes_path_id, includes_diversification_nonce, | 411 includes_path_id, includes_diversification_nonce, |
| 411 PACKET_6BYTE_PACKET_NUMBER) | 412 PACKET_6BYTE_PACKET_NUMBER) |
| 412 << " actual: " << decrypter_->associated_data_; | 413 << " actual: " << decrypter_->associated_data_; |
| 413 return false; | 414 return false; |
| 414 } | 415 } |
| 415 StringPiece ciphertext( | 416 StringPiece ciphertext( |
| 416 encrypted.AsStringPiece().substr(GetStartOfEncryptedData( | 417 encrypted.AsStringPiece().substr(GetStartOfEncryptedData( |
| 417 framer_.version(), PACKET_8BYTE_CONNECTION_ID, includes_version, | 418 framer_.version(), PACKET_8BYTE_CONNECTION_ID, includes_version, |
| 418 includes_path_id, includes_diversification_nonce, | 419 includes_path_id, includes_diversification_nonce, |
| 419 PACKET_6BYTE_PACKET_NUMBER))); | 420 PACKET_6BYTE_PACKET_NUMBER))); |
| 420 if (ciphertext != decrypter_->ciphertext_) { | 421 if (ciphertext != decrypter_->ciphertext_) { |
| 421 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " | 422 QUIC_LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " |
| 422 << ciphertext << " actual: " << decrypter_->ciphertext_; | 423 << ciphertext << " actual: " << decrypter_->ciphertext_; |
| 423 return false; | 424 return false; |
| 424 } | 425 } |
| 425 return true; | 426 return true; |
| 426 } | 427 } |
| 427 | 428 |
| 428 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } | 429 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } |
| 429 | 430 |
| 430 void CheckProcessingFails(unsigned char* packet, | 431 void CheckProcessingFails(unsigned char* packet, |
| 431 size_t len, | 432 size_t len, |
| 432 string expected_error, | 433 string expected_error, |
| (...skipping 1843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2276 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2277 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
| 2277 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); | 2278 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); |
| 2278 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); | 2279 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); |
| 2279 EXPECT_EQ( | 2280 EXPECT_EQ( |
| 2280 IpAddressFamily::IP_UNSPEC, | 2281 IpAddressFamily::IP_UNSPEC, |
| 2281 visitor_.public_reset_packet_->client_address.host().address_family()); | 2282 visitor_.public_reset_packet_->client_address.host().address_family()); |
| 2282 | 2283 |
| 2283 // Now test framing boundaries. | 2284 // Now test framing boundaries. |
| 2284 for (size_t i = 0; i < arraysize(packet); ++i) { | 2285 for (size_t i = 0; i < arraysize(packet); ++i) { |
| 2285 string expected_error; | 2286 string expected_error; |
| 2286 DVLOG(1) << "iteration: " << i; | 2287 QUIC_DLOG(INFO) << "iteration: " << i; |
| 2287 if (i < kConnectionIdOffset) { | 2288 if (i < kConnectionIdOffset) { |
| 2288 expected_error = "Unable to read public flags."; | 2289 expected_error = "Unable to read public flags."; |
| 2289 CheckProcessingFails(packet, i, expected_error, | 2290 CheckProcessingFails(packet, i, expected_error, |
| 2290 QUIC_INVALID_PACKET_HEADER); | 2291 QUIC_INVALID_PACKET_HEADER); |
| 2291 } else if (i < kPublicResetPacketMessageTagOffset) { | 2292 } else if (i < kPublicResetPacketMessageTagOffset) { |
| 2292 expected_error = "Unable to read ConnectionId."; | 2293 expected_error = "Unable to read ConnectionId."; |
| 2293 CheckProcessingFails(packet, i, expected_error, | 2294 CheckProcessingFails(packet, i, expected_error, |
| 2294 QUIC_INVALID_PACKET_HEADER); | 2295 QUIC_INVALID_PACKET_HEADER); |
| 2295 } else { | 2296 } else { |
| 2296 expected_error = "Unable to read reset message."; | 2297 expected_error = "Unable to read reset message."; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2341 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2342 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
| 2342 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); | 2343 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); |
| 2343 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); | 2344 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); |
| 2344 EXPECT_EQ( | 2345 EXPECT_EQ( |
| 2345 IpAddressFamily::IP_UNSPEC, | 2346 IpAddressFamily::IP_UNSPEC, |
| 2346 visitor_.public_reset_packet_->client_address.host().address_family()); | 2347 visitor_.public_reset_packet_->client_address.host().address_family()); |
| 2347 | 2348 |
| 2348 // Now test framing boundaries. | 2349 // Now test framing boundaries. |
| 2349 for (size_t i = 0; i < arraysize(packet); ++i) { | 2350 for (size_t i = 0; i < arraysize(packet); ++i) { |
| 2350 string expected_error; | 2351 string expected_error; |
| 2351 DVLOG(1) << "iteration: " << i; | 2352 QUIC_DLOG(INFO) << "iteration: " << i; |
| 2352 if (i < kConnectionIdOffset) { | 2353 if (i < kConnectionIdOffset) { |
| 2353 expected_error = "Unable to read public flags."; | 2354 expected_error = "Unable to read public flags."; |
| 2354 CheckProcessingFails(packet, i, expected_error, | 2355 CheckProcessingFails(packet, i, expected_error, |
| 2355 QUIC_INVALID_PACKET_HEADER); | 2356 QUIC_INVALID_PACKET_HEADER); |
| 2356 } else if (i < kPublicResetPacketMessageTagOffset) { | 2357 } else if (i < kPublicResetPacketMessageTagOffset) { |
| 2357 expected_error = "Unable to read ConnectionId."; | 2358 expected_error = "Unable to read ConnectionId."; |
| 2358 CheckProcessingFails(packet, i, expected_error, | 2359 CheckProcessingFails(packet, i, expected_error, |
| 2359 QUIC_INVALID_PACKET_HEADER); | 2360 QUIC_INVALID_PACKET_HEADER); |
| 2360 } else { | 2361 } else { |
| 2361 expected_error = "Unable to read reset message."; | 2362 expected_error = "Unable to read reset message."; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2448 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2449 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
| 2449 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); | 2450 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); |
| 2450 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); | 2451 EXPECT_EQ(0u, visitor_.public_reset_packet_->rejected_packet_number); |
| 2451 EXPECT_EQ("4.31.198.44", | 2452 EXPECT_EQ("4.31.198.44", |
| 2452 visitor_.public_reset_packet_->client_address.host().ToString()); | 2453 visitor_.public_reset_packet_->client_address.host().ToString()); |
| 2453 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); | 2454 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); |
| 2454 | 2455 |
| 2455 // Now test framing boundaries. | 2456 // Now test framing boundaries. |
| 2456 for (size_t i = 0; i < arraysize(packet); ++i) { | 2457 for (size_t i = 0; i < arraysize(packet); ++i) { |
| 2457 string expected_error; | 2458 string expected_error; |
| 2458 DVLOG(1) << "iteration: " << i; | 2459 QUIC_DLOG(INFO) << "iteration: " << i; |
| 2459 if (i < kConnectionIdOffset) { | 2460 if (i < kConnectionIdOffset) { |
| 2460 expected_error = "Unable to read public flags."; | 2461 expected_error = "Unable to read public flags."; |
| 2461 CheckProcessingFails(packet, i, expected_error, | 2462 CheckProcessingFails(packet, i, expected_error, |
| 2462 QUIC_INVALID_PACKET_HEADER); | 2463 QUIC_INVALID_PACKET_HEADER); |
| 2463 } else if (i < kPublicResetPacketMessageTagOffset) { | 2464 } else if (i < kPublicResetPacketMessageTagOffset) { |
| 2464 expected_error = "Unable to read ConnectionId."; | 2465 expected_error = "Unable to read ConnectionId."; |
| 2465 CheckProcessingFails(packet, i, expected_error, | 2466 CheckProcessingFails(packet, i, expected_error, |
| 2466 QUIC_INVALID_PACKET_HEADER); | 2467 QUIC_INVALID_PACKET_HEADER); |
| 2467 } else { | 2468 } else { |
| 2468 expected_error = "Unable to read reset message."; | 2469 expected_error = "Unable to read reset message."; |
| (...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4186 'o', ' ', 'w', 'o', | 4187 'o', ' ', 'w', 'o', |
| 4187 'r', 'l', 'd', '!', | 4188 'r', 'l', 'd', '!', |
| 4188 }; | 4189 }; |
| 4189 // clang-format on | 4190 // clang-format on |
| 4190 | 4191 |
| 4191 QuicFramerFuzzFunc(packet, arraysize(packet)); | 4192 QuicFramerFuzzFunc(packet, arraysize(packet)); |
| 4192 } | 4193 } |
| 4193 | 4194 |
| 4194 } // namespace test | 4195 } // namespace test |
| 4195 } // namespace net | 4196 } // namespace net |
| OLD | NEW |