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 |