| 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" |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 return true; | 139 return true; |
| 140 } | 140 } |
| 141 | 141 |
| 142 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) { | 142 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) { |
| 143 return true; | 143 return true; |
| 144 } | 144 } |
| 145 | 145 |
| 146 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 146 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
| 147 QuicTime creation_time, | 147 QuicTime creation_time, |
| 148 bool is_server) | 148 bool is_server) |
| 149 : visitor_(NULL), | 149 : visitor_(nullptr), |
| 150 fec_builder_(NULL), | 150 fec_builder_(nullptr), |
| 151 entropy_calculator_(NULL), | 151 entropy_calculator_(nullptr), |
| 152 error_(QUIC_NO_ERROR), | 152 error_(QUIC_NO_ERROR), |
| 153 last_sequence_number_(0), | 153 last_sequence_number_(0), |
| 154 last_serialized_connection_id_(0), | 154 last_serialized_connection_id_(0), |
| 155 supported_versions_(supported_versions), | 155 supported_versions_(supported_versions), |
| 156 decrypter_level_(ENCRYPTION_NONE), | 156 decrypter_level_(ENCRYPTION_NONE), |
| 157 alternative_decrypter_level_(ENCRYPTION_NONE), | 157 alternative_decrypter_level_(ENCRYPTION_NONE), |
| 158 alternative_decrypter_latch_(false), | 158 alternative_decrypter_latch_(false), |
| 159 is_server_(is_server), | 159 is_server_(is_server), |
| 160 validate_flags_(true), | 160 validate_flags_(true), |
| 161 creation_time_(creation_time), | 161 creation_time_(creation_time), |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | 315 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( |
| 316 const QuicPacketHeader& header) const { | 316 const QuicPacketHeader& header) const { |
| 317 return header.entropy_flag << (header.packet_sequence_number % 8); | 317 return header.entropy_flag << (header.packet_sequence_number % 8); |
| 318 } | 318 } |
| 319 | 319 |
| 320 SerializedPacket QuicFramer::BuildDataPacket( | 320 SerializedPacket QuicFramer::BuildDataPacket( |
| 321 const QuicPacketHeader& header, | 321 const QuicPacketHeader& header, |
| 322 const QuicFrames& frames, | 322 const QuicFrames& frames, |
| 323 size_t packet_size) { | 323 size_t packet_size) { |
| 324 QuicDataWriter writer(packet_size); | 324 QuicDataWriter writer(packet_size); |
| 325 const SerializedPacket kNoPacket( | 325 const SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, |
| 326 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 326 nullptr); |
| 327 if (!AppendPacketHeader(header, &writer)) { | 327 if (!AppendPacketHeader(header, &writer)) { |
| 328 LOG(DFATAL) << "AppendPacketHeader failed"; | 328 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 329 return kNoPacket; | 329 return kNoPacket; |
| 330 } | 330 } |
| 331 | 331 |
| 332 for (size_t i = 0; i < frames.size(); ++i) { | 332 for (size_t i = 0; i < frames.size(); ++i) { |
| 333 const QuicFrame& frame = frames[i]; | 333 const QuicFrame& frame = frames[i]; |
| 334 | 334 |
| 335 // Determine if we should write stream frame length in header. | 335 // Determine if we should write stream frame length in header. |
| 336 const bool no_stream_frame_length = | 336 const bool no_stream_frame_length = |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 header.public_header.version_flag, | 424 header.public_header.version_flag, |
| 425 header.public_header.sequence_number_length); | 425 header.public_header.sequence_number_length); |
| 426 | 426 |
| 427 if (fec_builder_) { | 427 if (fec_builder_) { |
| 428 fec_builder_->OnBuiltFecProtectedPayload(header, | 428 fec_builder_->OnBuiltFecProtectedPayload(header, |
| 429 packet->FecProtectedData()); | 429 packet->FecProtectedData()); |
| 430 } | 430 } |
| 431 | 431 |
| 432 return SerializedPacket(header.packet_sequence_number, | 432 return SerializedPacket(header.packet_sequence_number, |
| 433 header.public_header.sequence_number_length, packet, | 433 header.public_header.sequence_number_length, packet, |
| 434 GetPacketEntropyHash(header), NULL); | 434 GetPacketEntropyHash(header), nullptr); |
| 435 } | 435 } |
| 436 | 436 |
| 437 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, | 437 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header, |
| 438 const QuicFecData& fec) { | 438 const QuicFecData& fec) { |
| 439 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); | 439 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); |
| 440 DCHECK_NE(0u, header.fec_group); | 440 DCHECK_NE(0u, header.fec_group); |
| 441 size_t len = GetPacketHeaderSize(header); | 441 size_t len = GetPacketHeaderSize(header); |
| 442 len += fec.redundancy.length(); | 442 len += fec.redundancy.length(); |
| 443 | 443 |
| 444 QuicDataWriter writer(len); | 444 QuicDataWriter writer(len); |
| 445 const SerializedPacket kNoPacket( | 445 const SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, |
| 446 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 446 nullptr); |
| 447 if (!AppendPacketHeader(header, &writer)) { | 447 if (!AppendPacketHeader(header, &writer)) { |
| 448 LOG(DFATAL) << "AppendPacketHeader failed"; | 448 LOG(DFATAL) << "AppendPacketHeader failed"; |
| 449 return kNoPacket; | 449 return kNoPacket; |
| 450 } | 450 } |
| 451 | 451 |
| 452 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 452 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 453 LOG(DFATAL) << "Failed to add FEC"; | 453 LOG(DFATAL) << "Failed to add FEC"; |
| 454 return kNoPacket; | 454 return kNoPacket; |
| 455 } | 455 } |
| 456 | 456 |
| 457 return SerializedPacket( | 457 return SerializedPacket( |
| 458 header.packet_sequence_number, | 458 header.packet_sequence_number, |
| 459 header.public_header.sequence_number_length, | 459 header.public_header.sequence_number_length, |
| 460 QuicPacket::NewFecPacket(writer.take(), len, true, | 460 QuicPacket::NewFecPacket(writer.take(), len, true, |
| 461 header.public_header.connection_id_length, | 461 header.public_header.connection_id_length, |
| 462 header.public_header.version_flag, | 462 header.public_header.version_flag, |
| 463 header.public_header.sequence_number_length), | 463 header.public_header.sequence_number_length), |
| 464 GetPacketEntropyHash(header), NULL); | 464 GetPacketEntropyHash(header), nullptr); |
| 465 } | 465 } |
| 466 | 466 |
| 467 // static | 467 // static |
| 468 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( | 468 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( |
| 469 const QuicPublicResetPacket& packet) { | 469 const QuicPublicResetPacket& packet) { |
| 470 DCHECK(packet.public_header.reset_flag); | 470 DCHECK(packet.public_header.reset_flag); |
| 471 | 471 |
| 472 CryptoHandshakeMessage reset; | 472 CryptoHandshakeMessage reset; |
| 473 reset.set_tag(kPRST); | 473 reset.set_tag(kPRST); |
| 474 reset.SetValue(kRNON, packet.nonce_proof); | 474 reset.SetValue(kRNON, packet.nonce_proof); |
| 475 reset.SetValue(kRSEQ, packet.rejected_sequence_number); | 475 reset.SetValue(kRSEQ, packet.rejected_sequence_number); |
| 476 if (!packet.client_address.address().empty()) { | 476 if (!packet.client_address.address().empty()) { |
| 477 // packet.client_address is non-empty. | 477 // packet.client_address is non-empty. |
| 478 QuicSocketAddressCoder address_coder(packet.client_address); | 478 QuicSocketAddressCoder address_coder(packet.client_address); |
| 479 string serialized_address = address_coder.Encode(); | 479 string serialized_address = address_coder.Encode(); |
| 480 if (serialized_address.empty()) { | 480 if (serialized_address.empty()) { |
| 481 return NULL; | 481 return nullptr; |
| 482 } | 482 } |
| 483 reset.SetStringPiece(kCADR, serialized_address); | 483 reset.SetStringPiece(kCADR, serialized_address); |
| 484 } | 484 } |
| 485 const QuicData& reset_serialized = reset.GetSerialized(); | 485 const QuicData& reset_serialized = reset.GetSerialized(); |
| 486 | 486 |
| 487 size_t len = | 487 size_t len = |
| 488 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); | 488 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
| 489 QuicDataWriter writer(len); | 489 QuicDataWriter writer(len); |
| 490 | 490 |
| 491 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | | 491 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | |
| 492 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 492 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 493 if (!writer.WriteUInt8(flags)) { | 493 if (!writer.WriteUInt8(flags)) { |
| 494 return NULL; | 494 return nullptr; |
| 495 } | 495 } |
| 496 | 496 |
| 497 if (!writer.WriteUInt64(packet.public_header.connection_id)) { | 497 if (!writer.WriteUInt64(packet.public_header.connection_id)) { |
| 498 return NULL; | 498 return nullptr; |
| 499 } | 499 } |
| 500 | 500 |
| 501 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 501 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
| 502 return NULL; | 502 return nullptr; |
| 503 } | 503 } |
| 504 | 504 |
| 505 return new QuicEncryptedPacket(writer.take(), len, true); | 505 return new QuicEncryptedPacket(writer.take(), len, true); |
| 506 } | 506 } |
| 507 | 507 |
| 508 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( | 508 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( |
| 509 const QuicPacketPublicHeader& header, | 509 const QuicPacketPublicHeader& header, |
| 510 const QuicVersionVector& supported_versions) { | 510 const QuicVersionVector& supported_versions) { |
| 511 DCHECK(header.version_flag); | 511 DCHECK(header.version_flag); |
| 512 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); | 512 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); |
| 513 QuicDataWriter writer(len); | 513 QuicDataWriter writer(len); |
| 514 | 514 |
| 515 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | | 515 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | |
| 516 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 516 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 517 if (!writer.WriteUInt8(flags)) { | 517 if (!writer.WriteUInt8(flags)) { |
| 518 return NULL; | 518 return nullptr; |
| 519 } | 519 } |
| 520 | 520 |
| 521 if (!writer.WriteUInt64(header.connection_id)) { | 521 if (!writer.WriteUInt64(header.connection_id)) { |
| 522 return NULL; | 522 return nullptr; |
| 523 } | 523 } |
| 524 | 524 |
| 525 for (size_t i = 0; i < supported_versions.size(); ++i) { | 525 for (size_t i = 0; i < supported_versions.size(); ++i) { |
| 526 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { | 526 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { |
| 527 return NULL; | 527 return nullptr; |
| 528 } | 528 } |
| 529 } | 529 } |
| 530 | 530 |
| 531 return new QuicEncryptedPacket(writer.take(), len, true); | 531 return new QuicEncryptedPacket(writer.take(), len, true); |
| 532 } | 532 } |
| 533 | 533 |
| 534 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 534 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 535 DCHECK(!reader_.get()); | 535 DCHECK(!reader_.get()); |
| 536 reader_.reset(new QuicDataReader(packet.data(), packet.length())); | 536 reader_.reset(new QuicDataReader(packet.data(), packet.length())); |
| 537 | 537 |
| 538 visitor_->OnPacket(); | 538 visitor_->OnPacket(); |
| 539 | 539 |
| 540 // First parse the public header. | 540 // First parse the public header. |
| 541 QuicPacketPublicHeader public_header; | 541 QuicPacketPublicHeader public_header; |
| 542 if (!ProcessPublicHeader(&public_header)) { | 542 if (!ProcessPublicHeader(&public_header)) { |
| 543 DLOG(WARNING) << "Unable to process public header."; | 543 DLOG(WARNING) << "Unable to process public header."; |
| 544 DCHECK_NE("", detailed_error_); | 544 DCHECK_NE("", detailed_error_); |
| 545 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 545 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 546 } | 546 } |
| 547 | 547 |
| 548 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { | 548 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { |
| 549 // The visitor suppresses further processing of the packet. | 549 // The visitor suppresses further processing of the packet. |
| 550 reader_.reset(NULL); | 550 reader_.reset(nullptr); |
| 551 return true; | 551 return true; |
| 552 } | 552 } |
| 553 | 553 |
| 554 if (is_server_ && public_header.version_flag && | 554 if (is_server_ && public_header.version_flag && |
| 555 public_header.versions[0] != quic_version_) { | 555 public_header.versions[0] != quic_version_) { |
| 556 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { | 556 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { |
| 557 reader_.reset(NULL); | 557 reader_.reset(nullptr); |
| 558 return true; | 558 return true; |
| 559 } | 559 } |
| 560 } | 560 } |
| 561 | 561 |
| 562 bool rv; | 562 bool rv; |
| 563 if (!is_server_ && public_header.version_flag) { | 563 if (!is_server_ && public_header.version_flag) { |
| 564 rv = ProcessVersionNegotiationPacket(&public_header); | 564 rv = ProcessVersionNegotiationPacket(&public_header); |
| 565 } else if (public_header.reset_flag) { | 565 } else if (public_header.reset_flag) { |
| 566 rv = ProcessPublicResetPacket(public_header); | 566 rv = ProcessPublicResetPacket(public_header); |
| 567 } else { | 567 } else { |
| 568 rv = ProcessDataPacket(public_header, packet); | 568 rv = ProcessDataPacket(public_header, packet); |
| 569 } | 569 } |
| 570 | 570 |
| 571 reader_.reset(NULL); | 571 reader_.reset(nullptr); |
| 572 return rv; | 572 return rv; |
| 573 } | 573 } |
| 574 | 574 |
| 575 bool QuicFramer::ProcessVersionNegotiationPacket( | 575 bool QuicFramer::ProcessVersionNegotiationPacket( |
| 576 QuicPacketPublicHeader* public_header) { | 576 QuicPacketPublicHeader* public_header) { |
| 577 DCHECK(!is_server_); | 577 DCHECK(!is_server_); |
| 578 // Try reading at least once to raise error if the packet is invalid. | 578 // Try reading at least once to raise error if the packet is invalid. |
| 579 do { | 579 do { |
| 580 QuicTag version; | 580 QuicTag version; |
| 581 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { | 581 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 } | 688 } |
| 689 | 689 |
| 690 reader_.reset(new QuicDataReader(payload.data(), payload.length())); | 690 reader_.reset(new QuicDataReader(payload.data(), payload.length())); |
| 691 if (!ProcessFrameData(*header)) { | 691 if (!ProcessFrameData(*header)) { |
| 692 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | 692 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. |
| 693 DLOG(WARNING) << "Unable to process frame data."; | 693 DLOG(WARNING) << "Unable to process frame data."; |
| 694 return false; | 694 return false; |
| 695 } | 695 } |
| 696 | 696 |
| 697 visitor_->OnPacketComplete(); | 697 visitor_->OnPacketComplete(); |
| 698 reader_.reset(NULL); | 698 reader_.reset(nullptr); |
| 699 return true; | 699 return true; |
| 700 } | 700 } |
| 701 | 701 |
| 702 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, | 702 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, |
| 703 QuicDataWriter* writer) { | 703 QuicDataWriter* writer) { |
| 704 DVLOG(1) << "Appending header: " << header; | 704 DVLOG(1) << "Appending header: " << header; |
| 705 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP); | 705 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP); |
| 706 uint8 public_flags = 0; | 706 uint8 public_flags = 0; |
| 707 if (header.public_header.reset_flag) { | 707 if (header.public_header.reset_flag) { |
| 708 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 708 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
| (...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1632 bool includes_version, | 1632 bool includes_version, |
| 1633 QuicSequenceNumberLength sequence_number_length) { | 1633 QuicSequenceNumberLength sequence_number_length) { |
| 1634 return StringPiece( | 1634 return StringPiece( |
| 1635 encrypted.data() + kStartOfHashData, GetStartOfEncryptedData( | 1635 encrypted.data() + kStartOfHashData, GetStartOfEncryptedData( |
| 1636 connection_id_length, includes_version, sequence_number_length) | 1636 connection_id_length, includes_version, sequence_number_length) |
| 1637 - kStartOfHashData); | 1637 - kStartOfHashData); |
| 1638 } | 1638 } |
| 1639 | 1639 |
| 1640 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter, | 1640 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter, |
| 1641 EncryptionLevel level) { | 1641 EncryptionLevel level) { |
| 1642 DCHECK(alternative_decrypter_.get() == NULL); | 1642 DCHECK(alternative_decrypter_.get() == nullptr); |
| 1643 DCHECK_GE(level, decrypter_level_); | 1643 DCHECK_GE(level, decrypter_level_); |
| 1644 decrypter_.reset(decrypter); | 1644 decrypter_.reset(decrypter); |
| 1645 decrypter_level_ = level; | 1645 decrypter_level_ = level; |
| 1646 } | 1646 } |
| 1647 | 1647 |
| 1648 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, | 1648 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, |
| 1649 EncryptionLevel level, | 1649 EncryptionLevel level, |
| 1650 bool latch_once_used) { | 1650 bool latch_once_used) { |
| 1651 alternative_decrypter_.reset(decrypter); | 1651 alternative_decrypter_.reset(decrypter); |
| 1652 alternative_decrypter_level_ = level; | 1652 alternative_decrypter_level_ = level; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1664 void QuicFramer::SetEncrypter(EncryptionLevel level, | 1664 void QuicFramer::SetEncrypter(EncryptionLevel level, |
| 1665 QuicEncrypter* encrypter) { | 1665 QuicEncrypter* encrypter) { |
| 1666 DCHECK_GE(level, 0); | 1666 DCHECK_GE(level, 0); |
| 1667 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); | 1667 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); |
| 1668 encrypter_[level].reset(encrypter); | 1668 encrypter_[level].reset(encrypter); |
| 1669 } | 1669 } |
| 1670 | 1670 |
| 1671 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { | 1671 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { |
| 1672 DCHECK_GE(level, 0); | 1672 DCHECK_GE(level, 0); |
| 1673 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); | 1673 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); |
| 1674 DCHECK(encrypter_[level].get() != NULL); | 1674 DCHECK(encrypter_[level].get() != nullptr); |
| 1675 return encrypter_[level].get(); | 1675 return encrypter_[level].get(); |
| 1676 } | 1676 } |
| 1677 | 1677 |
| 1678 QuicEncryptedPacket* QuicFramer::EncryptPacket( | 1678 QuicEncryptedPacket* QuicFramer::EncryptPacket( |
| 1679 EncryptionLevel level, | 1679 EncryptionLevel level, |
| 1680 QuicPacketSequenceNumber packet_sequence_number, | 1680 QuicPacketSequenceNumber packet_sequence_number, |
| 1681 const QuicPacket& packet) { | 1681 const QuicPacket& packet) { |
| 1682 DCHECK(encrypter_[level].get() != NULL); | 1682 DCHECK(encrypter_[level].get() != nullptr); |
| 1683 | 1683 |
| 1684 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( | 1684 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( |
| 1685 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); | 1685 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); |
| 1686 if (out.get() == NULL) { | 1686 if (out.get() == nullptr) { |
| 1687 RaiseError(QUIC_ENCRYPTION_FAILURE); | 1687 RaiseError(QUIC_ENCRYPTION_FAILURE); |
| 1688 return NULL; | 1688 return nullptr; |
| 1689 } | 1689 } |
| 1690 StringPiece header_data = packet.BeforePlaintext(); | 1690 StringPiece header_data = packet.BeforePlaintext(); |
| 1691 size_t len = header_data.length() + out->length(); | 1691 size_t len = header_data.length() + out->length(); |
| 1692 char* buffer = new char[len]; | 1692 char* buffer = new char[len]; |
| 1693 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). | 1693 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). |
| 1694 memcpy(buffer, header_data.data(), header_data.length()); | 1694 memcpy(buffer, header_data.data(), header_data.length()); |
| 1695 memcpy(buffer + header_data.length(), out->data(), out->length()); | 1695 memcpy(buffer + header_data.length(), out->data(), out->length()); |
| 1696 return new QuicEncryptedPacket(buffer, len, true); | 1696 return new QuicEncryptedPacket(buffer, len, true); |
| 1697 } | 1697 } |
| 1698 | 1698 |
| 1699 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { | 1699 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { |
| 1700 // In order to keep the code simple, we don't have the current encryption | 1700 // In order to keep the code simple, we don't have the current encryption |
| 1701 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. | 1701 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. |
| 1702 size_t min_plaintext_size = ciphertext_size; | 1702 size_t min_plaintext_size = ciphertext_size; |
| 1703 | 1703 |
| 1704 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { | 1704 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { |
| 1705 if (encrypter_[i].get() != NULL) { | 1705 if (encrypter_[i].get() != nullptr) { |
| 1706 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); | 1706 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); |
| 1707 if (size < min_plaintext_size) { | 1707 if (size < min_plaintext_size) { |
| 1708 min_plaintext_size = size; | 1708 min_plaintext_size = size; |
| 1709 } | 1709 } |
| 1710 } | 1710 } |
| 1711 } | 1711 } |
| 1712 | 1712 |
| 1713 return min_plaintext_size; | 1713 return min_plaintext_size; |
| 1714 } | 1714 } |
| 1715 | 1715 |
| 1716 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header, | 1716 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header, |
| 1717 const QuicEncryptedPacket& packet) { | 1717 const QuicEncryptedPacket& packet) { |
| 1718 StringPiece encrypted; | 1718 StringPiece encrypted; |
| 1719 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { | 1719 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { |
| 1720 return false; | 1720 return false; |
| 1721 } | 1721 } |
| 1722 DCHECK(decrypter_.get() != NULL); | 1722 DCHECK(decrypter_.get() != nullptr); |
| 1723 decrypted_.reset(decrypter_->DecryptPacket( | 1723 decrypted_.reset(decrypter_->DecryptPacket( |
| 1724 header.packet_sequence_number, | 1724 header.packet_sequence_number, |
| 1725 GetAssociatedDataFromEncryptedPacket( | 1725 GetAssociatedDataFromEncryptedPacket( |
| 1726 packet, | 1726 packet, |
| 1727 header.public_header.connection_id_length, | 1727 header.public_header.connection_id_length, |
| 1728 header.public_header.version_flag, | 1728 header.public_header.version_flag, |
| 1729 header.public_header.sequence_number_length), | 1729 header.public_header.sequence_number_length), |
| 1730 encrypted)); | 1730 encrypted)); |
| 1731 if (decrypted_.get() != NULL) { | 1731 if (decrypted_.get() != nullptr) { |
| 1732 visitor_->OnDecryptedPacket(decrypter_level_); | 1732 visitor_->OnDecryptedPacket(decrypter_level_); |
| 1733 } else if (alternative_decrypter_.get() != NULL) { | 1733 } else if (alternative_decrypter_.get() != nullptr) { |
| 1734 decrypted_.reset(alternative_decrypter_->DecryptPacket( | 1734 decrypted_.reset(alternative_decrypter_->DecryptPacket( |
| 1735 header.packet_sequence_number, | 1735 header.packet_sequence_number, |
| 1736 GetAssociatedDataFromEncryptedPacket( | 1736 GetAssociatedDataFromEncryptedPacket( |
| 1737 packet, | 1737 packet, |
| 1738 header.public_header.connection_id_length, | 1738 header.public_header.connection_id_length, |
| 1739 header.public_header.version_flag, | 1739 header.public_header.version_flag, |
| 1740 header.public_header.sequence_number_length), | 1740 header.public_header.sequence_number_length), |
| 1741 encrypted)); | 1741 encrypted)); |
| 1742 if (decrypted_.get() != NULL) { | 1742 if (decrypted_.get() != nullptr) { |
| 1743 visitor_->OnDecryptedPacket(alternative_decrypter_level_); | 1743 visitor_->OnDecryptedPacket(alternative_decrypter_level_); |
| 1744 if (alternative_decrypter_latch_) { | 1744 if (alternative_decrypter_latch_) { |
| 1745 // Switch to the alternative decrypter and latch so that we cannot | 1745 // Switch to the alternative decrypter and latch so that we cannot |
| 1746 // switch back. | 1746 // switch back. |
| 1747 decrypter_.reset(alternative_decrypter_.release()); | 1747 decrypter_.reset(alternative_decrypter_.release()); |
| 1748 decrypter_level_ = alternative_decrypter_level_; | 1748 decrypter_level_ = alternative_decrypter_level_; |
| 1749 alternative_decrypter_level_ = ENCRYPTION_NONE; | 1749 alternative_decrypter_level_ = ENCRYPTION_NONE; |
| 1750 } else { | 1750 } else { |
| 1751 // Switch the alternative decrypter so that we use it first next time. | 1751 // Switch the alternative decrypter so that we use it first next time. |
| 1752 decrypter_.swap(alternative_decrypter_); | 1752 decrypter_.swap(alternative_decrypter_); |
| 1753 EncryptionLevel level = alternative_decrypter_level_; | 1753 EncryptionLevel level = alternative_decrypter_level_; |
| 1754 alternative_decrypter_level_ = decrypter_level_; | 1754 alternative_decrypter_level_ = decrypter_level_; |
| 1755 decrypter_level_ = level; | 1755 decrypter_level_ = level; |
| 1756 } | 1756 } |
| 1757 } | 1757 } |
| 1758 } | 1758 } |
| 1759 | 1759 |
| 1760 if (decrypted_.get() == NULL) { | 1760 if (decrypted_.get() == nullptr) { |
| 1761 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" | 1761 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" |
| 1762 << header.packet_sequence_number; | 1762 << header.packet_sequence_number; |
| 1763 return false; | 1763 return false; |
| 1764 } | 1764 } |
| 1765 | 1765 |
| 1766 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); | 1766 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); |
| 1767 return true; | 1767 return true; |
| 1768 } | 1768 } |
| 1769 | 1769 |
| 1770 size_t QuicFramer::GetAckFrameSize( | 1770 size_t QuicFramer::GetAckFrameSize( |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1867 DCHECK(false); | 1867 DCHECK(false); |
| 1868 return 0; | 1868 return 0; |
| 1869 } | 1869 } |
| 1870 | 1870 |
| 1871 bool QuicFramer::AppendTypeByte(const QuicFrame& frame, | 1871 bool QuicFramer::AppendTypeByte(const QuicFrame& frame, |
| 1872 bool no_stream_frame_length, | 1872 bool no_stream_frame_length, |
| 1873 QuicDataWriter* writer) { | 1873 QuicDataWriter* writer) { |
| 1874 uint8 type_byte = 0; | 1874 uint8 type_byte = 0; |
| 1875 switch (frame.type) { | 1875 switch (frame.type) { |
| 1876 case STREAM_FRAME: { | 1876 case STREAM_FRAME: { |
| 1877 if (frame.stream_frame == NULL) { | 1877 if (frame.stream_frame == nullptr) { |
| 1878 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; | 1878 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; |
| 1879 } | 1879 } |
| 1880 // Fin bit. | 1880 // Fin bit. |
| 1881 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; | 1881 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; |
| 1882 | 1882 |
| 1883 // Data Length bit. | 1883 // Data Length bit. |
| 1884 type_byte <<= kQuicStreamDataLengthShift; | 1884 type_byte <<= kQuicStreamDataLengthShift; |
| 1885 type_byte |= no_stream_frame_length ? 0: kQuicStreamDataLengthMask; | 1885 type_byte |= no_stream_frame_length ? 0: kQuicStreamDataLengthMask; |
| 1886 | 1886 |
| 1887 // Offset 3 bits. | 1887 // Offset 3 bits. |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2311 if (!writer->WriteUInt32(stream_id)) { | 2311 if (!writer->WriteUInt32(stream_id)) { |
| 2312 return false; | 2312 return false; |
| 2313 } | 2313 } |
| 2314 return true; | 2314 return true; |
| 2315 } | 2315 } |
| 2316 | 2316 |
| 2317 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2317 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2318 DVLOG(1) << "Error detail: " << detailed_error_; | 2318 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2319 set_error(error); | 2319 set_error(error); |
| 2320 visitor_->OnError(this); | 2320 visitor_->OnError(this); |
| 2321 reader_.reset(NULL); | 2321 reader_.reset(nullptr); |
| 2322 return false; | 2322 return false; |
| 2323 } | 2323 } |
| 2324 | 2324 |
| 2325 } // namespace net | 2325 } // namespace net |
| OLD | NEW |