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 <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + | 87 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + |
88 kPrivateFlagsSize; | 88 kPrivateFlagsSize; |
89 } | 89 } |
90 | 90 |
91 size_t GetFecGroupOffset(bool include_version, | 91 size_t GetFecGroupOffset(bool include_version, |
92 QuicSequenceNumberLength sequence_number_length) { | 92 QuicSequenceNumberLength sequence_number_length) { |
93 return GetPrivateFlagsOffset(include_version, sequence_number_length) + | 93 return GetPrivateFlagsOffset(include_version, sequence_number_length) + |
94 kPrivateFlagsSize; | 94 kPrivateFlagsSize; |
95 } | 95 } |
96 | 96 |
| 97 // Index into the message tag of the public reset packet. |
| 98 // Public resets always have full guids. |
| 99 const size_t kPublicResetPacketMessageTagOffset = |
| 100 kGuidOffset + PACKET_8BYTE_GUID; |
| 101 |
| 102 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. |
97 // Index into the nonce proof of the public reset packet. | 103 // Index into the nonce proof of the public reset packet. |
98 // Public resets always have full guids. | 104 // Public resets always have full guids. |
99 const size_t kPublicResetPacketNonceProofOffset = | 105 const size_t kPublicResetPacketNonceProofOffset = |
100 kGuidOffset + PACKET_8BYTE_GUID; | 106 kGuidOffset + PACKET_8BYTE_GUID; |
101 | 107 |
| 108 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. |
102 // Index into the rejected sequence number of the public reset packet. | 109 // Index into the rejected sequence number of the public reset packet. |
103 const size_t kPublicResetPacketRejectedSequenceNumberOffset = | 110 const size_t kPublicResetPacketRejectedSequenceNumberOffset = |
104 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; | 111 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; |
105 | 112 |
106 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. | |
107 // Size of the old-style public reset packet. | |
108 const size_t kPublicResetPacketOldSize = | |
109 kPublicResetPacketRejectedSequenceNumberOffset + | |
110 PACKET_6BYTE_SEQUENCE_NUMBER; | |
111 | |
112 class TestEncrypter : public QuicEncrypter { | 113 class TestEncrypter : public QuicEncrypter { |
113 public: | 114 public: |
114 virtual ~TestEncrypter() {} | 115 virtual ~TestEncrypter() {} |
115 virtual bool SetKey(StringPiece key) OVERRIDE { | 116 virtual bool SetKey(StringPiece key) OVERRIDE { |
116 return true; | 117 return true; |
117 } | 118 } |
118 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { | 119 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { |
119 return true; | 120 return true; |
120 } | 121 } |
121 virtual bool Encrypt(StringPiece nonce, | 122 virtual bool Encrypt(StringPiece nonce, |
(...skipping 2404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2526 visitor_.public_reset_packet_->client_address.address().empty()); | 2527 visitor_.public_reset_packet_->client_address.address().empty()); |
2527 | 2528 |
2528 // Now test framing boundaries | 2529 // Now test framing boundaries |
2529 for (size_t i = 0; i < arraysize(packet); ++i) { | 2530 for (size_t i = 0; i < arraysize(packet); ++i) { |
2530 string expected_error; | 2531 string expected_error; |
2531 DLOG(INFO) << "iteration: " << i; | 2532 DLOG(INFO) << "iteration: " << i; |
2532 if (i < kGuidOffset) { | 2533 if (i < kGuidOffset) { |
2533 expected_error = "Unable to read public flags."; | 2534 expected_error = "Unable to read public flags."; |
2534 CheckProcessingFails(packet, i, expected_error, | 2535 CheckProcessingFails(packet, i, expected_error, |
2535 QUIC_INVALID_PACKET_HEADER); | 2536 QUIC_INVALID_PACKET_HEADER); |
2536 } else if (i < kPublicResetPacketNonceProofOffset) { | 2537 } else if (i < kPublicResetPacketMessageTagOffset) { |
2537 expected_error = "Unable to read GUID."; | 2538 expected_error = "Unable to read GUID."; |
2538 CheckProcessingFails(packet, i, expected_error, | 2539 CheckProcessingFails(packet, i, expected_error, |
2539 QUIC_INVALID_PACKET_HEADER); | 2540 QUIC_INVALID_PACKET_HEADER); |
2540 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) { | |
2541 expected_error = "Unable to read nonce proof."; | |
2542 CheckProcessingFails(packet, i, expected_error, | |
2543 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2544 } else if (i < kPublicResetPacketOldSize) { | |
2545 expected_error = "Unable to read rejected sequence number."; | |
2546 CheckProcessingFails(packet, i, expected_error, | |
2547 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2548 } else if (i == kPublicResetPacketOldSize) { | |
2549 // This looks like an old public reset packet, so there won't be an | |
2550 // error. | |
2551 } else { | 2541 } else { |
2552 expected_error = "Unable to read reset message."; | 2542 expected_error = "Unable to read reset message."; |
2553 CheckProcessingFails(packet, i, expected_error, | 2543 CheckProcessingFails(packet, i, expected_error, |
2554 QUIC_INVALID_PUBLIC_RST_PACKET); | 2544 QUIC_INVALID_PUBLIC_RST_PACKET); |
2555 } | 2545 } |
2556 } | 2546 } |
2557 } | 2547 } |
2558 | 2548 |
| 2549 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) { |
| 2550 unsigned char packet[] = { |
| 2551 // public flags (public reset, 8 byte guid) |
| 2552 0x0E, |
| 2553 // guid |
| 2554 0x10, 0x32, 0x54, 0x76, |
| 2555 0x98, 0xBA, 0xDC, 0xFE, |
| 2556 // message tag (kPRST) |
| 2557 'P', 'R', 'S', 'T', |
| 2558 // num_entries (2) + padding |
| 2559 0x02, 0x00, 0x00, 0x00, |
| 2560 // tag kRNON |
| 2561 'R', 'N', 'O', 'N', |
| 2562 // end offset 8 |
| 2563 0x08, 0x00, 0x00, 0x00, |
| 2564 // tag kRSEQ |
| 2565 'R', 'S', 'E', 'Q', |
| 2566 // end offset 16 |
| 2567 0x10, 0x00, 0x00, 0x00, |
| 2568 // nonce proof |
| 2569 0x89, 0x67, 0x45, 0x23, |
| 2570 0x01, 0xEF, 0xCD, 0xAB, |
| 2571 // rejected sequence number |
| 2572 0xBC, 0x9A, 0x78, 0x56, |
| 2573 0x34, 0x12, 0x00, 0x00, |
| 2574 // trailing junk |
| 2575 'j', 'u', 'n', 'k', |
| 2576 }; |
| 2577 |
| 2578 string expected_error = "Unable to read reset message."; |
| 2579 CheckProcessingFails(packet, arraysize(packet), expected_error, |
| 2580 QUIC_INVALID_PUBLIC_RST_PACKET); |
| 2581 } |
| 2582 |
2559 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { | 2583 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { |
2560 unsigned char packet[] = { | 2584 unsigned char packet[] = { |
2561 // public flags (public reset, 8 byte guid) | 2585 // public flags (public reset, 8 byte guid) |
2562 0x0E, | 2586 0x0E, |
2563 // guid | 2587 // guid |
2564 0x10, 0x32, 0x54, 0x76, | 2588 0x10, 0x32, 0x54, 0x76, |
2565 0x98, 0xBA, 0xDC, 0xFE, | 2589 0x98, 0xBA, 0xDC, 0xFE, |
2566 // message tag (kPRST) | 2590 // message tag (kPRST) |
2567 'P', 'R', 'S', 'T', | 2591 'P', 'R', 'S', 'T', |
2568 // num_entries (3) + padding | 2592 // num_entries (3) + padding |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2609 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); | 2633 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); |
2610 | 2634 |
2611 // Now test framing boundaries | 2635 // Now test framing boundaries |
2612 for (size_t i = 0; i < arraysize(packet); ++i) { | 2636 for (size_t i = 0; i < arraysize(packet); ++i) { |
2613 string expected_error; | 2637 string expected_error; |
2614 DLOG(INFO) << "iteration: " << i; | 2638 DLOG(INFO) << "iteration: " << i; |
2615 if (i < kGuidOffset) { | 2639 if (i < kGuidOffset) { |
2616 expected_error = "Unable to read public flags."; | 2640 expected_error = "Unable to read public flags."; |
2617 CheckProcessingFails(packet, i, expected_error, | 2641 CheckProcessingFails(packet, i, expected_error, |
2618 QUIC_INVALID_PACKET_HEADER); | 2642 QUIC_INVALID_PACKET_HEADER); |
2619 } else if (i < kPublicResetPacketNonceProofOffset) { | 2643 } else if (i < kPublicResetPacketMessageTagOffset) { |
2620 expected_error = "Unable to read GUID."; | 2644 expected_error = "Unable to read GUID."; |
2621 CheckProcessingFails(packet, i, expected_error, | 2645 CheckProcessingFails(packet, i, expected_error, |
2622 QUIC_INVALID_PACKET_HEADER); | 2646 QUIC_INVALID_PACKET_HEADER); |
2623 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) { | |
2624 expected_error = "Unable to read nonce proof."; | |
2625 CheckProcessingFails(packet, i, expected_error, | |
2626 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2627 } else if (i < kPublicResetPacketOldSize) { | |
2628 expected_error = "Unable to read rejected sequence number."; | |
2629 CheckProcessingFails(packet, i, expected_error, | |
2630 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2631 } else if (i == kPublicResetPacketOldSize) { | |
2632 // This looks like an old public reset packet, so there won't be an | |
2633 // error. | |
2634 } else { | 2647 } else { |
2635 expected_error = "Unable to read reset message."; | 2648 expected_error = "Unable to read reset message."; |
2636 CheckProcessingFails(packet, i, expected_error, | 2649 CheckProcessingFails(packet, i, expected_error, |
2637 QUIC_INVALID_PUBLIC_RST_PACKET); | 2650 QUIC_INVALID_PUBLIC_RST_PACKET); |
2638 } | 2651 } |
2639 } | 2652 } |
2640 } | 2653 } |
2641 | 2654 |
2642 // TODO(wtc): remove this test when we drop support for QUIC_VERSION_13. | 2655 // TODO(wtc): remove this test when we drop support for QUIC_VERSION_13. |
2643 TEST_P(QuicFramerTest, PublicResetPacketOld) { | 2656 TEST_P(QuicFramerTest, PublicResetPacketOld) { |
(...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4113 EXPECT_CALL(visitor, OnPacketComplete()); | 4126 EXPECT_CALL(visitor, OnPacketComplete()); |
4114 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4127 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
4115 | 4128 |
4116 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4129 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4117 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4130 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4118 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4131 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4119 } | 4132 } |
4120 | 4133 |
4121 } // namespace test | 4134 } // namespace test |
4122 } // namespace net | 4135 } // namespace net |
OLD | NEW |