| 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/quic_framer.h" | 5 #include "net/quic/quic_framer.h" |
| 6 | 6 |
| 7 #include "base/containers/hash_tables.h" | 7 #include "base/containers/hash_tables.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "net/quic/crypto/crypto_framer.h" | 9 #include "net/quic/crypto/crypto_framer.h" |
| 10 #include "net/quic/crypto/crypto_handshake_message.h" | 10 #include "net/quic/crypto/crypto_handshake_message.h" |
| 11 #include "net/quic/crypto/crypto_protocol.h" | 11 #include "net/quic/crypto/crypto_protocol.h" |
| 12 #include "net/quic/crypto/quic_decrypter.h" | 12 #include "net/quic/crypto/quic_decrypter.h" |
| 13 #include "net/quic/crypto/quic_encrypter.h" | 13 #include "net/quic/crypto/quic_encrypter.h" |
| 14 #include "net/quic/quic_data_reader.h" | 14 #include "net/quic/quic_data_reader.h" |
| 15 #include "net/quic/quic_data_writer.h" | 15 #include "net/quic/quic_data_writer.h" |
| 16 #include "net/quic/quic_flags.h" | 16 #include "net/quic/quic_flags.h" |
| 17 #include "net/quic/quic_socket_address_coder.h" | 17 #include "net/quic/quic_socket_address_coder.h" |
| 18 | 18 |
| 19 using base::StringPiece; | 19 using base::StringPiece; |
| 20 using std::make_pair; | |
| 21 using std::map; | 20 using std::map; |
| 22 using std::max; | 21 using std::max; |
| 23 using std::min; | 22 using std::min; |
| 24 using std::numeric_limits; | 23 using std::numeric_limits; |
| 25 using std::string; | 24 using std::string; |
| 26 | 25 |
| 27 namespace net { | 26 namespace net { |
| 28 | 27 |
| 29 namespace { | 28 namespace { |
| 30 | 29 |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 return 0; | 302 return 0; |
| 304 } | 303 } |
| 305 LOG(DFATAL) << "Packet size too small to fit frame."; | 304 LOG(DFATAL) << "Packet size too small to fit frame."; |
| 306 return frame_len; | 305 return frame_len; |
| 307 } | 306 } |
| 308 | 307 |
| 309 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} | 308 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} |
| 310 | 309 |
| 311 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | 310 QuicFramer::AckFrameInfo::~AckFrameInfo() {} |
| 312 | 311 |
| 312 // static |
| 313 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | 313 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( |
| 314 const QuicPacketHeader& header) const { | 314 const QuicPacketHeader& header) { |
| 315 return header.entropy_flag << (header.packet_sequence_number % 8); | 315 return header.entropy_flag << (header.packet_sequence_number % 8); |
| 316 } | 316 } |
| 317 | 317 |
| 318 SerializedPacket QuicFramer::BuildDataPacket( | 318 QuicPacket* QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
| 319 const QuicPacketHeader& header, | 319 const QuicFrames& frames, |
| 320 const QuicFrames& frames, | 320 char* buffer, |
| 321 size_t packet_size) { | 321 size_t packet_length) { |
| 322 QuicDataWriter writer(packet_size); | 322 QuicDataWriter writer(packet_length, buffer); |
| 323 const SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, | |
| 324 nullptr); | |
| 325 if (!AppendPacketHeader(header, &writer)) { | 323 if (!AppendPacketHeader(header, &writer)) { |
| 326 LOG(DFATAL) << "AppendPacketHeader failed"; | 324 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 327 return kNoPacket; | 325 return nullptr; |
| 328 } | 326 } |
| 329 | 327 |
| 330 for (size_t i = 0; i < frames.size(); ++i) { | 328 size_t i = 0; |
| 331 const QuicFrame& frame = frames[i]; | 329 for (const QuicFrame& frame : frames) { |
| 332 | |
| 333 // Determine if we should write stream frame length in header. | 330 // Determine if we should write stream frame length in header. |
| 334 const bool no_stream_frame_length = | 331 const bool no_stream_frame_length = |
| 335 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && | 332 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && |
| 336 (i == frames.size() - 1); | 333 (i == frames.size() - 1); |
| 337 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { | 334 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { |
| 338 LOG(DFATAL) << "AppendTypeByte failed"; | 335 LOG(DFATAL) << "AppendTypeByte failed"; |
| 339 return kNoPacket; | 336 return nullptr; |
| 340 } | 337 } |
| 341 | 338 |
| 342 switch (frame.type) { | 339 switch (frame.type) { |
| 343 case PADDING_FRAME: | 340 case PADDING_FRAME: |
| 344 writer.WritePadding(); | 341 writer.WritePadding(); |
| 345 break; | 342 break; |
| 346 case STREAM_FRAME: | 343 case STREAM_FRAME: |
| 347 if (!AppendStreamFrame( | 344 if (!AppendStreamFrame( |
| 348 *frame.stream_frame, no_stream_frame_length, &writer)) { | 345 *frame.stream_frame, no_stream_frame_length, &writer)) { |
| 349 LOG(DFATAL) << "AppendStreamFrame failed"; | 346 LOG(DFATAL) << "AppendStreamFrame failed"; |
| 350 return kNoPacket; | 347 return nullptr; |
| 351 } | 348 } |
| 352 break; | 349 break; |
| 353 case ACK_FRAME: | 350 case ACK_FRAME: |
| 354 if (!AppendAckFrameAndTypeByte( | 351 if (!AppendAckFrameAndTypeByte( |
| 355 header, *frame.ack_frame, &writer)) { | 352 header, *frame.ack_frame, &writer)) { |
| 356 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; | 353 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; |
| 357 return kNoPacket; | 354 return nullptr; |
| 358 } | 355 } |
| 359 break; | 356 break; |
| 360 case STOP_WAITING_FRAME: | 357 case STOP_WAITING_FRAME: |
| 361 if (!AppendStopWaitingFrame( | 358 if (!AppendStopWaitingFrame( |
| 362 header, *frame.stop_waiting_frame, &writer)) { | 359 header, *frame.stop_waiting_frame, &writer)) { |
| 363 LOG(DFATAL) << "AppendStopWaitingFrame failed"; | 360 LOG(DFATAL) << "AppendStopWaitingFrame failed"; |
| 364 return kNoPacket; | 361 return nullptr; |
| 365 } | 362 } |
| 366 break; | 363 break; |
| 367 case PING_FRAME: | 364 case PING_FRAME: |
| 368 // Ping has no payload. | 365 // Ping has no payload. |
| 369 break; | 366 break; |
| 370 case RST_STREAM_FRAME: | 367 case RST_STREAM_FRAME: |
| 371 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { | 368 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { |
| 372 LOG(DFATAL) << "AppendRstStreamFrame failed"; | 369 LOG(DFATAL) << "AppendRstStreamFrame failed"; |
| 373 return kNoPacket; | 370 return nullptr; |
| 374 } | 371 } |
| 375 break; | 372 break; |
| 376 case CONNECTION_CLOSE_FRAME: | 373 case CONNECTION_CLOSE_FRAME: |
| 377 if (!AppendConnectionCloseFrame( | 374 if (!AppendConnectionCloseFrame( |
| 378 *frame.connection_close_frame, &writer)) { | 375 *frame.connection_close_frame, &writer)) { |
| 379 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; | 376 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; |
| 380 return kNoPacket; | 377 return nullptr; |
| 381 } | 378 } |
| 382 break; | 379 break; |
| 383 case GOAWAY_FRAME: | 380 case GOAWAY_FRAME: |
| 384 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { | 381 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { |
| 385 LOG(DFATAL) << "AppendGoAwayFrame failed"; | 382 LOG(DFATAL) << "AppendGoAwayFrame failed"; |
| 386 return kNoPacket; | 383 return nullptr; |
| 387 } | 384 } |
| 388 break; | 385 break; |
| 389 case WINDOW_UPDATE_FRAME: | 386 case WINDOW_UPDATE_FRAME: |
| 390 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) { | 387 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) { |
| 391 LOG(DFATAL) << "AppendWindowUpdateFrame failed"; | 388 LOG(DFATAL) << "AppendWindowUpdateFrame failed"; |
| 392 return kNoPacket; | 389 return nullptr; |
| 393 } | 390 } |
| 394 break; | 391 break; |
| 395 case BLOCKED_FRAME: | 392 case BLOCKED_FRAME: |
| 396 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { | 393 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { |
| 397 LOG(DFATAL) << "AppendBlockedFrame failed"; | 394 LOG(DFATAL) << "AppendBlockedFrame failed"; |
| 398 return kNoPacket; | 395 return nullptr; |
| 399 } | 396 } |
| 400 break; | 397 break; |
| 401 default: | 398 default: |
| 402 RaiseError(QUIC_INVALID_FRAME_DATA); | 399 RaiseError(QUIC_INVALID_FRAME_DATA); |
| 403 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; | 400 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; |
| 404 return kNoPacket; | 401 return nullptr; |
| 405 } | 402 } |
| 403 ++i; |
| 406 } | 404 } |
| 407 | 405 |
| 408 // Save the length before writing, because take clears it. | 406 QuicPacket* packet = |
| 409 const size_t len = writer.length(); | 407 new QuicPacket(writer.data(), writer.length(), false, |
| 410 // Less than or equal because truncated acks end up with max_plaintex_size | 408 header.public_header.connection_id_length, |
| 411 // length, even though they're typically slightly shorter. | 409 header.public_header.version_flag, |
| 412 DCHECK_LE(len, packet_size); | 410 header.public_header.sequence_number_length); |
| 413 QuicPacket* packet = QuicPacket::NewDataPacket( | |
| 414 writer.take(), len, true, header.public_header.connection_id_length, | |
| 415 header.public_header.version_flag, | |
| 416 header.public_header.sequence_number_length); | |
| 417 | 411 |
| 418 if (fec_builder_) { | 412 if (fec_builder_) { |
| 419 fec_builder_->OnBuiltFecProtectedPayload(header, | 413 fec_builder_->OnBuiltFecProtectedPayload(header, |
| 420 packet->FecProtectedData()); | 414 packet->FecProtectedData()); |
| 421 } | 415 } |
| 422 | 416 |
| 423 return SerializedPacket(header.packet_sequence_number, | 417 return packet; |
| 424 header.public_header.sequence_number_length, packet, | |
| 425 GetPacketEntropyHash(header), nullptr); | |
| 426 } | 418 } |
| 427 | 419 |
| 428 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, | 420 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header, |
| 429 const QuicFecData& fec) { | 421 const QuicFecData& fec) { |
| 430 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); | 422 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); |
| 431 DCHECK_NE(0u, header.fec_group); | 423 DCHECK_NE(0u, header.fec_group); |
| 432 size_t len = GetPacketHeaderSize(header); | 424 size_t len = GetPacketHeaderSize(header); |
| 433 len += fec.redundancy.length(); | 425 len += fec.redundancy.length(); |
| 434 | 426 |
| 435 QuicDataWriter writer(len); | 427 scoped_ptr<char[]> buffer(new char[len]); |
| 436 const SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, | 428 QuicDataWriter writer(len, buffer.get()); |
| 437 nullptr); | |
| 438 if (!AppendPacketHeader(header, &writer)) { | 429 if (!AppendPacketHeader(header, &writer)) { |
| 439 LOG(DFATAL) << "AppendPacketHeader failed"; | 430 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 440 return kNoPacket; | 431 return nullptr; |
| 441 } | 432 } |
| 442 | 433 |
| 443 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 434 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 444 LOG(DFATAL) << "Failed to add FEC"; | 435 LOG(DFATAL) << "Failed to add FEC"; |
| 445 return kNoPacket; | 436 return nullptr; |
| 446 } | 437 } |
| 447 | 438 |
| 448 return SerializedPacket( | 439 return new QuicPacket(buffer.release(), len, true, |
| 449 header.packet_sequence_number, | 440 header.public_header.connection_id_length, |
| 450 header.public_header.sequence_number_length, | 441 header.public_header.version_flag, |
| 451 QuicPacket::NewFecPacket(writer.take(), len, true, | 442 header.public_header.sequence_number_length); |
| 452 header.public_header.connection_id_length, | |
| 453 header.public_header.version_flag, | |
| 454 header.public_header.sequence_number_length), | |
| 455 GetPacketEntropyHash(header), nullptr); | |
| 456 } | 443 } |
| 457 | 444 |
| 458 // static | 445 // static |
| 459 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( | 446 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( |
| 460 const QuicPublicResetPacket& packet) { | 447 const QuicPublicResetPacket& packet) { |
| 461 DCHECK(packet.public_header.reset_flag); | 448 DCHECK(packet.public_header.reset_flag); |
| 462 | 449 |
| 463 CryptoHandshakeMessage reset; | 450 CryptoHandshakeMessage reset; |
| 464 reset.set_tag(kPRST); | 451 reset.set_tag(kPRST); |
| 465 reset.SetValue(kRNON, packet.nonce_proof); | 452 reset.SetValue(kRNON, packet.nonce_proof); |
| 466 reset.SetValue(kRSEQ, packet.rejected_sequence_number); | 453 reset.SetValue(kRSEQ, packet.rejected_sequence_number); |
| 467 if (!packet.client_address.address().empty()) { | 454 if (!packet.client_address.address().empty()) { |
| 468 // packet.client_address is non-empty. | 455 // packet.client_address is non-empty. |
| 469 QuicSocketAddressCoder address_coder(packet.client_address); | 456 QuicSocketAddressCoder address_coder(packet.client_address); |
| 470 string serialized_address = address_coder.Encode(); | 457 string serialized_address = address_coder.Encode(); |
| 471 if (serialized_address.empty()) { | 458 if (serialized_address.empty()) { |
| 472 return nullptr; | 459 return nullptr; |
| 473 } | 460 } |
| 474 reset.SetStringPiece(kCADR, serialized_address); | 461 reset.SetStringPiece(kCADR, serialized_address); |
| 475 } | 462 } |
| 476 const QuicData& reset_serialized = reset.GetSerialized(); | 463 const QuicData& reset_serialized = reset.GetSerialized(); |
| 477 | 464 |
| 478 size_t len = | 465 size_t len = |
| 479 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); | 466 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
| 480 QuicDataWriter writer(len); | 467 scoped_ptr<char[]> buffer(new char[len]); |
| 468 QuicDataWriter writer(len, buffer.get()); |
| 481 | 469 |
| 482 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | | 470 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | |
| 483 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 471 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 484 if (!writer.WriteUInt8(flags)) { | 472 if (!writer.WriteUInt8(flags)) { |
| 485 return nullptr; | 473 return nullptr; |
| 486 } | 474 } |
| 487 | 475 |
| 488 if (!writer.WriteUInt64(packet.public_header.connection_id)) { | 476 if (!writer.WriteUInt64(packet.public_header.connection_id)) { |
| 489 return nullptr; | 477 return nullptr; |
| 490 } | 478 } |
| 491 | 479 |
| 492 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 480 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
| 493 return nullptr; | 481 return nullptr; |
| 494 } | 482 } |
| 495 | 483 |
| 496 return new QuicEncryptedPacket(writer.take(), len, true); | 484 return new QuicEncryptedPacket(buffer.release(), len, true); |
| 497 } | 485 } |
| 498 | 486 |
| 499 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( | 487 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( |
| 500 const QuicPacketPublicHeader& header, | 488 const QuicPacketPublicHeader& header, |
| 501 const QuicVersionVector& supported_versions) { | 489 const QuicVersionVector& supported_versions) { |
| 502 DCHECK(header.version_flag); | 490 DCHECK(header.version_flag); |
| 503 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); | 491 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); |
| 504 QuicDataWriter writer(len); | 492 scoped_ptr<char[]> buffer(new char[len]); |
| 493 QuicDataWriter writer(len, buffer.get()); |
| 505 | 494 |
| 506 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | | 495 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | |
| 507 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 496 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 508 if (!writer.WriteUInt8(flags)) { | 497 if (!writer.WriteUInt8(flags)) { |
| 509 return nullptr; | 498 return nullptr; |
| 510 } | 499 } |
| 511 | 500 |
| 512 if (!writer.WriteUInt64(header.connection_id)) { | 501 if (!writer.WriteUInt64(header.connection_id)) { |
| 513 return nullptr; | 502 return nullptr; |
| 514 } | 503 } |
| 515 | 504 |
| 516 for (size_t i = 0; i < supported_versions.size(); ++i) { | 505 for (size_t i = 0; i < supported_versions.size(); ++i) { |
| 517 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { | 506 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { |
| 518 return nullptr; | 507 return nullptr; |
| 519 } | 508 } |
| 520 } | 509 } |
| 521 | 510 |
| 522 return new QuicEncryptedPacket(writer.take(), len, true); | 511 return new QuicEncryptedPacket(buffer.release(), len, true); |
| 523 } | 512 } |
| 524 | 513 |
| 525 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 514 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 526 DCHECK(!reader_.get()); | 515 DCHECK(!reader_.get()); |
| 527 reader_.reset(new QuicDataReader(packet.data(), packet.length())); | 516 reader_.reset(new QuicDataReader(packet.data(), packet.length())); |
| 528 | 517 |
| 529 visitor_->OnPacket(); | 518 visitor_->OnPacket(); |
| 530 | 519 |
| 531 // First parse the public header. | 520 // First parse the public header. |
| 532 QuicPacketPublicHeader public_header; | 521 QuicPacketPublicHeader public_header; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 548 reader_.reset(nullptr); | 537 reader_.reset(nullptr); |
| 549 return true; | 538 return true; |
| 550 } | 539 } |
| 551 } | 540 } |
| 552 | 541 |
| 553 bool rv; | 542 bool rv; |
| 554 if (!is_server_ && public_header.version_flag) { | 543 if (!is_server_ && public_header.version_flag) { |
| 555 rv = ProcessVersionNegotiationPacket(&public_header); | 544 rv = ProcessVersionNegotiationPacket(&public_header); |
| 556 } else if (public_header.reset_flag) { | 545 } else if (public_header.reset_flag) { |
| 557 rv = ProcessPublicResetPacket(public_header); | 546 rv = ProcessPublicResetPacket(public_header); |
| 547 } else if (packet.length() <= kMaxPacketSize) { |
| 548 char buffer[kMaxPacketSize]; |
| 549 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize); |
| 558 } else { | 550 } else { |
| 559 rv = ProcessDataPacket(public_header, packet); | 551 scoped_ptr<char[]> large_buffer(new char[packet.length()]); |
| 552 rv = ProcessDataPacket(public_header, packet, large_buffer.get(), |
| 553 packet.length()); |
| 554 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets " |
| 555 << "larger than kMaxPacketSize. packet size:" |
| 556 << packet.length(); |
| 560 } | 557 } |
| 561 | 558 |
| 562 reader_.reset(nullptr); | 559 reader_.reset(nullptr); |
| 563 return rv; | 560 return rv; |
| 564 } | 561 } |
| 565 | 562 |
| 566 bool QuicFramer::ProcessVersionNegotiationPacket( | 563 bool QuicFramer::ProcessVersionNegotiationPacket( |
| 567 QuicPacketPublicHeader* public_header) { | 564 QuicPacketPublicHeader* public_header) { |
| 568 DCHECK(!is_server_); | 565 DCHECK(!is_server_); |
| 569 // Try reading at least once to raise error if the packet is invalid. | 566 // Try reading at least once to raise error if the packet is invalid. |
| 570 do { | 567 do { |
| 571 QuicTag version; | 568 QuicTag version; |
| 572 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { | 569 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { |
| 573 set_detailed_error("Unable to read supported version in negotiation."); | 570 set_detailed_error("Unable to read supported version in negotiation."); |
| 574 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); | 571 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); |
| 575 } | 572 } |
| 576 public_header->versions.push_back(QuicTagToQuicVersion(version)); | 573 public_header->versions.push_back(QuicTagToQuicVersion(version)); |
| 577 } while (!reader_->IsDoneReading()); | 574 } while (!reader_->IsDoneReading()); |
| 578 | 575 |
| 579 visitor_->OnVersionNegotiationPacket(*public_header); | 576 visitor_->OnVersionNegotiationPacket(*public_header); |
| 580 return true; | 577 return true; |
| 581 } | 578 } |
| 582 | 579 |
| 583 bool QuicFramer::ProcessDataPacket( | 580 bool QuicFramer::ProcessDataPacket(const QuicPacketPublicHeader& public_header, |
| 584 const QuicPacketPublicHeader& public_header, | 581 const QuicEncryptedPacket& packet, |
| 585 const QuicEncryptedPacket& packet) { | 582 char* decrypted_buffer, |
| 583 size_t buffer_length) { |
| 586 QuicPacketHeader header(public_header); | 584 QuicPacketHeader header(public_header); |
| 587 if (!ProcessPacketHeader(&header, packet)) { | 585 if (!ProcessPacketHeader(&header, packet, decrypted_buffer, buffer_length)) { |
| 588 DLOG(WARNING) << "Unable to process data packet header."; | 586 DLOG(WARNING) << "Unable to process data packet header."; |
| 589 return false; | 587 return false; |
| 590 } | 588 } |
| 591 | 589 |
| 592 if (!visitor_->OnPacketHeader(header)) { | 590 if (!visitor_->OnPacketHeader(header)) { |
| 593 // The visitor suppresses further processing of the packet. | 591 // The visitor suppresses further processing of the packet. |
| 594 return true; | 592 return true; |
| 595 } | 593 } |
| 596 | 594 |
| 597 if (packet.length() > kMaxPacketSize) { | 595 if (packet.length() > kMaxPacketSize) { |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 } | 989 } |
| 992 // Include the last nack range. | 990 // Include the last nack range. |
| 993 ack_info.nack_ranges[last_missing - cur_range_length] = | 991 ack_info.nack_ranges[last_missing - cur_range_length] = |
| 994 static_cast<uint8>(cur_range_length); | 992 static_cast<uint8>(cur_range_length); |
| 995 // Include the range to the largest observed. | 993 // Include the range to the largest observed. |
| 996 ack_info.max_delta = | 994 ack_info.max_delta = |
| 997 max(ack_info.max_delta, frame.largest_observed - last_missing); | 995 max(ack_info.max_delta, frame.largest_observed - last_missing); |
| 998 return ack_info; | 996 return ack_info; |
| 999 } | 997 } |
| 1000 | 998 |
| 1001 bool QuicFramer::ProcessPacketHeader( | 999 bool QuicFramer::ProcessPacketHeader(QuicPacketHeader* header, |
| 1002 QuicPacketHeader* header, | 1000 const QuicEncryptedPacket& packet, |
| 1003 const QuicEncryptedPacket& packet) { | 1001 char* decrypted_buffer, |
| 1002 size_t buffer_length) { |
| 1004 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, | 1003 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, |
| 1005 &header->packet_sequence_number)) { | 1004 &header->packet_sequence_number)) { |
| 1006 set_detailed_error("Unable to read sequence number."); | 1005 set_detailed_error("Unable to read sequence number."); |
| 1007 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1006 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1008 } | 1007 } |
| 1009 | 1008 |
| 1010 if (header->packet_sequence_number == 0u) { | 1009 if (header->packet_sequence_number == 0u) { |
| 1011 set_detailed_error("Packet sequence numbers cannot be 0."); | 1010 set_detailed_error("Packet sequence numbers cannot be 0."); |
| 1012 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1011 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1013 } | 1012 } |
| 1014 | 1013 |
| 1015 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 1014 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
| 1016 return false; | 1015 return false; |
| 1017 } | 1016 } |
| 1018 | 1017 |
| 1019 if (!DecryptPayload(*header, packet)) { | 1018 if (!DecryptPayload(*header, packet, decrypted_buffer, buffer_length)) { |
| 1020 set_detailed_error("Unable to decrypt payload."); | 1019 set_detailed_error("Unable to decrypt payload."); |
| 1021 return RaiseError(QUIC_DECRYPTION_FAILURE); | 1020 return RaiseError(QUIC_DECRYPTION_FAILURE); |
| 1022 } | 1021 } |
| 1023 | 1022 |
| 1024 uint8 private_flags; | 1023 uint8 private_flags; |
| 1025 if (!reader_->ReadBytes(&private_flags, 1)) { | 1024 if (!reader_->ReadBytes(&private_flags, 1)) { |
| 1026 set_detailed_error("Unable to read private flags."); | 1025 set_detailed_error("Unable to read private flags."); |
| 1027 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1026 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1028 } | 1027 } |
| 1029 | 1028 |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1400 // Time delta from the framer creation. | 1399 // Time delta from the framer creation. |
| 1401 uint32 time_delta_us; | 1400 uint32 time_delta_us; |
| 1402 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | 1401 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { |
| 1403 set_detailed_error("Unable to read time delta in received packets."); | 1402 set_detailed_error("Unable to read time delta in received packets."); |
| 1404 return false; | 1403 return false; |
| 1405 } | 1404 } |
| 1406 | 1405 |
| 1407 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); | 1406 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); |
| 1408 | 1407 |
| 1409 ack_frame->received_packet_times.push_back( | 1408 ack_frame->received_packet_times.push_back( |
| 1410 make_pair(seq_num, creation_time_.Add(last_timestamp_))); | 1409 std::make_pair(seq_num, creation_time_.Add(last_timestamp_))); |
| 1411 | 1410 |
| 1412 for (uint8 i = 1; i < num_received_packets; ++i) { | 1411 for (uint8 i = 1; i < num_received_packets; ++i) { |
| 1413 if (!reader_->ReadBytes(&delta_from_largest_observed, | 1412 if (!reader_->ReadBytes(&delta_from_largest_observed, |
| 1414 PACKET_1BYTE_SEQUENCE_NUMBER)) { | 1413 PACKET_1BYTE_SEQUENCE_NUMBER)) { |
| 1415 set_detailed_error( | 1414 set_detailed_error( |
| 1416 "Unable to read sequence delta in received packets."); | 1415 "Unable to read sequence delta in received packets."); |
| 1417 return false; | 1416 return false; |
| 1418 } | 1417 } |
| 1419 seq_num = ack_frame->largest_observed - delta_from_largest_observed; | 1418 seq_num = ack_frame->largest_observed - delta_from_largest_observed; |
| 1420 | 1419 |
| 1421 // Time delta from the previous timestamp. | 1420 // Time delta from the previous timestamp. |
| 1422 uint64 incremental_time_delta_us; | 1421 uint64 incremental_time_delta_us; |
| 1423 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) { | 1422 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) { |
| 1424 set_detailed_error( | 1423 set_detailed_error( |
| 1425 "Unable to read incremental time delta in received packets."); | 1424 "Unable to read incremental time delta in received packets."); |
| 1426 return false; | 1425 return false; |
| 1427 } | 1426 } |
| 1428 | 1427 |
| 1429 last_timestamp_ = last_timestamp_.Add( | 1428 last_timestamp_ = last_timestamp_.Add( |
| 1430 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us)); | 1429 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us)); |
| 1431 ack_frame->received_packet_times.push_back( | 1430 ack_frame->received_packet_times.push_back( |
| 1432 make_pair(seq_num, creation_time_.Add(last_timestamp_))); | 1431 std::make_pair(seq_num, creation_time_.Add(last_timestamp_))); |
| 1433 } | 1432 } |
| 1434 } | 1433 } |
| 1435 } | 1434 } |
| 1436 return true; | 1435 return true; |
| 1437 } | 1436 } |
| 1438 | 1437 |
| 1439 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, | 1438 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, |
| 1440 QuicStopWaitingFrame* stop_waiting) { | 1439 QuicStopWaitingFrame* stop_waiting) { |
| 1441 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { | 1440 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { |
| 1442 set_detailed_error("Unable to read entropy hash for sent packets."); | 1441 set_detailed_error("Unable to read entropy hash for sent packets."); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 DCHECK(encrypter_[level].get() != nullptr); | 1615 DCHECK(encrypter_[level].get() != nullptr); |
| 1617 return encrypter_[level].get(); | 1616 return encrypter_[level].get(); |
| 1618 } | 1617 } |
| 1619 | 1618 |
| 1620 QuicEncryptedPacket* QuicFramer::EncryptPacket( | 1619 QuicEncryptedPacket* QuicFramer::EncryptPacket( |
| 1621 EncryptionLevel level, | 1620 EncryptionLevel level, |
| 1622 QuicPacketSequenceNumber packet_sequence_number, | 1621 QuicPacketSequenceNumber packet_sequence_number, |
| 1623 const QuicPacket& packet) { | 1622 const QuicPacket& packet) { |
| 1624 DCHECK(encrypter_[level].get() != nullptr); | 1623 DCHECK(encrypter_[level].get() != nullptr); |
| 1625 | 1624 |
| 1626 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( | 1625 // Allocate a large enough buffer for the header and the encrypted data. |
| 1627 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); | 1626 const size_t encrypted_len = |
| 1628 if (out.get() == nullptr) { | 1627 encrypter_[level]->GetCiphertextSize(packet.Plaintext().length()); |
| 1628 StringPiece header_data = packet.BeforePlaintext(); |
| 1629 const size_t len = header_data.length() + encrypted_len; |
| 1630 // TODO(ianswett): Consider allocating this on the stack in the typical case. |
| 1631 char* buffer = new char[len]; |
| 1632 // Copy in the header, because the encrypter only populates the encrypted |
| 1633 // plaintext content. |
| 1634 memcpy(buffer, header_data.data(), header_data.length()); |
| 1635 // Encrypt the plaintext into the buffer. |
| 1636 size_t output_length = 0; |
| 1637 if (!encrypter_[level]->EncryptPacket( |
| 1638 packet_sequence_number, packet.AssociatedData(), packet.Plaintext(), |
| 1639 buffer + header_data.length(), &output_length, encrypted_len)) { |
| 1629 RaiseError(QUIC_ENCRYPTION_FAILURE); | 1640 RaiseError(QUIC_ENCRYPTION_FAILURE); |
| 1630 return nullptr; | 1641 return nullptr; |
| 1631 } | 1642 } |
| 1632 StringPiece header_data = packet.BeforePlaintext(); | 1643 |
| 1633 size_t len = header_data.length() + out->length(); | 1644 return new QuicEncryptedPacket(buffer, header_data.length() + output_length, |
| 1634 char* buffer = new char[len]; | 1645 true); |
| 1635 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). | |
| 1636 memcpy(buffer, header_data.data(), header_data.length()); | |
| 1637 memcpy(buffer + header_data.length(), out->data(), out->length()); | |
| 1638 return new QuicEncryptedPacket(buffer, len, true); | |
| 1639 } | 1646 } |
| 1640 | 1647 |
| 1641 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { | 1648 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { |
| 1642 // In order to keep the code simple, we don't have the current encryption | 1649 // In order to keep the code simple, we don't have the current encryption |
| 1643 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. | 1650 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. |
| 1644 size_t min_plaintext_size = ciphertext_size; | 1651 size_t min_plaintext_size = ciphertext_size; |
| 1645 | 1652 |
| 1646 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { | 1653 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { |
| 1647 if (encrypter_[i].get() != nullptr) { | 1654 if (encrypter_[i].get() != nullptr) { |
| 1648 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); | 1655 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); |
| 1649 if (size < min_plaintext_size) { | 1656 if (size < min_plaintext_size) { |
| 1650 min_plaintext_size = size; | 1657 min_plaintext_size = size; |
| 1651 } | 1658 } |
| 1652 } | 1659 } |
| 1653 } | 1660 } |
| 1654 | 1661 |
| 1655 return min_plaintext_size; | 1662 return min_plaintext_size; |
| 1656 } | 1663 } |
| 1657 | 1664 |
| 1658 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header, | 1665 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header, |
| 1659 const QuicEncryptedPacket& packet) { | 1666 const QuicEncryptedPacket& packet, |
| 1660 StringPiece encrypted; | 1667 char* decrypted_buffer, |
| 1661 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { | 1668 size_t buffer_length) { |
| 1662 return false; | 1669 StringPiece encrypted = reader_->ReadRemainingPayload(); |
| 1663 } | |
| 1664 DCHECK(decrypter_.get() != nullptr); | 1670 DCHECK(decrypter_.get() != nullptr); |
| 1665 decrypted_.reset(decrypter_->DecryptPacket( | 1671 const StringPiece& associated_data = GetAssociatedDataFromEncryptedPacket( |
| 1666 header.packet_sequence_number, | 1672 packet, header.public_header.connection_id_length, |
| 1667 GetAssociatedDataFromEncryptedPacket( | 1673 header.public_header.version_flag, |
| 1668 packet, | 1674 header.public_header.sequence_number_length); |
| 1669 header.public_header.connection_id_length, | 1675 size_t decrypted_length = 0; |
| 1670 header.public_header.version_flag, | 1676 bool success = decrypter_->DecryptPacket( |
| 1671 header.public_header.sequence_number_length), | 1677 header.packet_sequence_number, associated_data, encrypted, |
| 1672 encrypted)); | 1678 decrypted_buffer, &decrypted_length, buffer_length); |
| 1673 if (decrypted_.get() != nullptr) { | 1679 if (success) { |
| 1674 visitor_->OnDecryptedPacket(decrypter_level_); | 1680 visitor_->OnDecryptedPacket(decrypter_level_); |
| 1675 } else if (alternative_decrypter_.get() != nullptr) { | 1681 } else if (alternative_decrypter_.get() != nullptr) { |
| 1676 decrypted_.reset(alternative_decrypter_->DecryptPacket( | 1682 success = alternative_decrypter_->DecryptPacket( |
| 1677 header.packet_sequence_number, | 1683 header.packet_sequence_number, associated_data, encrypted, |
| 1678 GetAssociatedDataFromEncryptedPacket( | 1684 decrypted_buffer, &decrypted_length, buffer_length); |
| 1679 packet, | 1685 if (success) { |
| 1680 header.public_header.connection_id_length, | |
| 1681 header.public_header.version_flag, | |
| 1682 header.public_header.sequence_number_length), | |
| 1683 encrypted)); | |
| 1684 if (decrypted_.get() != nullptr) { | |
| 1685 visitor_->OnDecryptedPacket(alternative_decrypter_level_); | 1686 visitor_->OnDecryptedPacket(alternative_decrypter_level_); |
| 1686 if (alternative_decrypter_latch_) { | 1687 if (alternative_decrypter_latch_) { |
| 1687 // Switch to the alternative decrypter and latch so that we cannot | 1688 // Switch to the alternative decrypter and latch so that we cannot |
| 1688 // switch back. | 1689 // switch back. |
| 1689 decrypter_.reset(alternative_decrypter_.release()); | 1690 decrypter_.reset(alternative_decrypter_.release()); |
| 1690 decrypter_level_ = alternative_decrypter_level_; | 1691 decrypter_level_ = alternative_decrypter_level_; |
| 1691 alternative_decrypter_level_ = ENCRYPTION_NONE; | 1692 alternative_decrypter_level_ = ENCRYPTION_NONE; |
| 1692 } else { | 1693 } else { |
| 1693 // Switch the alternative decrypter so that we use it first next time. | 1694 // Switch the alternative decrypter so that we use it first next time. |
| 1694 decrypter_.swap(alternative_decrypter_); | 1695 decrypter_.swap(alternative_decrypter_); |
| 1695 EncryptionLevel level = alternative_decrypter_level_; | 1696 EncryptionLevel level = alternative_decrypter_level_; |
| 1696 alternative_decrypter_level_ = decrypter_level_; | 1697 alternative_decrypter_level_ = decrypter_level_; |
| 1697 decrypter_level_ = level; | 1698 decrypter_level_ = level; |
| 1698 } | 1699 } |
| 1699 } | 1700 } |
| 1700 } | 1701 } |
| 1701 | 1702 |
| 1702 if (decrypted_.get() == nullptr) { | 1703 if (!success) { |
| 1703 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" | 1704 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" |
| 1704 << header.packet_sequence_number; | 1705 << header.packet_sequence_number; |
| 1705 return false; | 1706 return false; |
| 1706 } | 1707 } |
| 1707 | 1708 |
| 1708 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); | 1709 reader_.reset(new QuicDataReader(decrypted_buffer, decrypted_length)); |
| 1709 return true; | 1710 return true; |
| 1710 } | 1711 } |
| 1711 | 1712 |
| 1712 size_t QuicFramer::GetAckFrameSize( | 1713 size_t QuicFramer::GetAckFrameSize( |
| 1713 const QuicAckFrame& ack, | 1714 const QuicAckFrame& ack, |
| 1714 QuicSequenceNumberLength sequence_number_length) { | 1715 QuicSequenceNumberLength sequence_number_length) { |
| 1715 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1716 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1716 QuicSequenceNumberLength largest_observed_length = | 1717 QuicSequenceNumberLength largest_observed_length = |
| 1717 GetMinSequenceNumberLength(ack.largest_observed); | 1718 GetMinSequenceNumberLength(ack.largest_observed); |
| 1718 QuicSequenceNumberLength missing_sequence_number_length = | 1719 QuicSequenceNumberLength missing_sequence_number_length = |
| (...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2212 | 2213 |
| 2213 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2214 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2214 DVLOG(1) << "Error detail: " << detailed_error_; | 2215 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2215 set_error(error); | 2216 set_error(error); |
| 2216 visitor_->OnError(this); | 2217 visitor_->OnError(this); |
| 2217 reader_.reset(nullptr); | 2218 reader_.reset(nullptr); |
| 2218 return false; | 2219 return false; |
| 2219 } | 2220 } |
| 2220 | 2221 |
| 2221 } // namespace net | 2222 } // namespace net |
| OLD | NEW |