| 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_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | |
| 10 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/macros.h" |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
| 14 #include "net/quic/congestion_control/loss_detection_interface.h" | 14 #include "net/quic/congestion_control/loss_detection_interface.h" |
| 15 #include "net/quic/congestion_control/send_algorithm_interface.h" | 15 #include "net/quic/congestion_control/send_algorithm_interface.h" |
| 16 #include "net/quic/crypto/null_encrypter.h" | 16 #include "net/quic/crypto/null_encrypter.h" |
| 17 #include "net/quic/crypto/quic_decrypter.h" | 17 #include "net/quic/crypto/quic_decrypter.h" |
| 18 #include "net/quic/crypto/quic_encrypter.h" | 18 #include "net/quic/crypto/quic_encrypter.h" |
| 19 #include "net/quic/quic_flags.h" | 19 #include "net/quic/quic_flags.h" |
| 20 #include "net/quic/quic_protocol.h" | 20 #include "net/quic/quic_protocol.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 const QuicPacketEntropyHash kTestEntropyHash = 76; | 65 const QuicPacketEntropyHash kTestEntropyHash = 76; |
| 66 | 66 |
| 67 const int kDefaultRetransmissionTimeMs = 500; | 67 const int kDefaultRetransmissionTimeMs = 500; |
| 68 | 68 |
| 69 const IPEndPoint kPeerAddress = IPEndPoint(Loopback6(), /*port=*/12345); | 69 const IPEndPoint kPeerAddress = IPEndPoint(Loopback6(), /*port=*/12345); |
| 70 const IPEndPoint kSelfAddress = IPEndPoint(Loopback6(), /*port=*/443); | 70 const IPEndPoint kSelfAddress = IPEndPoint(Loopback6(), /*port=*/443); |
| 71 | 71 |
| 72 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message. | 72 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message. |
| 73 class TaggingEncrypter : public QuicEncrypter { | 73 class TaggingEncrypter : public QuicEncrypter { |
| 74 public: | 74 public: |
| 75 explicit TaggingEncrypter(uint8 tag) : tag_(tag) {} | 75 explicit TaggingEncrypter(uint8_t tag) : tag_(tag) {} |
| 76 | 76 |
| 77 ~TaggingEncrypter() override {} | 77 ~TaggingEncrypter() override {} |
| 78 | 78 |
| 79 // QuicEncrypter interface. | 79 // QuicEncrypter interface. |
| 80 bool SetKey(StringPiece key) override { return true; } | 80 bool SetKey(StringPiece key) override { return true; } |
| 81 | 81 |
| 82 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 82 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 83 | 83 |
| 84 bool EncryptPacket(QuicPacketNumber packet_number, | 84 bool EncryptPacket(QuicPacketNumber packet_number, |
| 85 StringPiece associated_data, | 85 StringPiece associated_data, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 111 | 111 |
| 112 StringPiece GetKey() const override { return StringPiece(); } | 112 StringPiece GetKey() const override { return StringPiece(); } |
| 113 | 113 |
| 114 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 114 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
| 115 | 115 |
| 116 private: | 116 private: |
| 117 enum { | 117 enum { |
| 118 kTagSize = 12, | 118 kTagSize = 12, |
| 119 }; | 119 }; |
| 120 | 120 |
| 121 const uint8 tag_; | 121 const uint8_t tag_; |
| 122 | 122 |
| 123 DISALLOW_COPY_AND_ASSIGN(TaggingEncrypter); | 123 DISALLOW_COPY_AND_ASSIGN(TaggingEncrypter); |
| 124 }; | 124 }; |
| 125 | 125 |
| 126 // TaggingDecrypter ensures that the final kTagSize bytes of the message all | 126 // TaggingDecrypter ensures that the final kTagSize bytes of the message all |
| 127 // have the same value and then removes them. | 127 // have the same value and then removes them. |
| 128 class TaggingDecrypter : public QuicDecrypter { | 128 class TaggingDecrypter : public QuicDecrypter { |
| 129 public: | 129 public: |
| 130 ~TaggingDecrypter() override {} | 130 ~TaggingDecrypter() override {} |
| 131 | 131 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 148 } | 148 } |
| 149 *output_length = ciphertext.size() - kTagSize; | 149 *output_length = ciphertext.size() - kTagSize; |
| 150 memcpy(output, ciphertext.data(), *output_length); | 150 memcpy(output, ciphertext.data(), *output_length); |
| 151 return true; | 151 return true; |
| 152 } | 152 } |
| 153 | 153 |
| 154 StringPiece GetKey() const override { return StringPiece(); } | 154 StringPiece GetKey() const override { return StringPiece(); } |
| 155 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 155 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
| 156 const char* cipher_name() const override { return "Tagging"; } | 156 const char* cipher_name() const override { return "Tagging"; } |
| 157 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS. | 157 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS. |
| 158 uint32 cipher_id() const override { return 0xFFFFFFF0; } | 158 uint32_t cipher_id() const override { return 0xFFFFFFF0; } |
| 159 | 159 |
| 160 protected: | 160 protected: |
| 161 virtual uint8 GetTag(StringPiece ciphertext) { | 161 virtual uint8_t GetTag(StringPiece ciphertext) { |
| 162 return ciphertext.data()[ciphertext.size() - 1]; | 162 return ciphertext.data()[ciphertext.size() - 1]; |
| 163 } | 163 } |
| 164 | 164 |
| 165 private: | 165 private: |
| 166 enum { | 166 enum { |
| 167 kTagSize = 12, | 167 kTagSize = 12, |
| 168 }; | 168 }; |
| 169 | 169 |
| 170 bool CheckTag(StringPiece ciphertext, uint8 tag) { | 170 bool CheckTag(StringPiece ciphertext, uint8_t tag) { |
| 171 for (size_t i = ciphertext.size() - kTagSize; i < ciphertext.size(); i++) { | 171 for (size_t i = ciphertext.size() - kTagSize; i < ciphertext.size(); i++) { |
| 172 if (ciphertext.data()[i] != tag) { | 172 if (ciphertext.data()[i] != tag) { |
| 173 return false; | 173 return false; |
| 174 } | 174 } |
| 175 } | 175 } |
| 176 | 176 |
| 177 return true; | 177 return true; |
| 178 } | 178 } |
| 179 }; | 179 }; |
| 180 | 180 |
| 181 // StringTaggingDecrypter ensures that the final kTagSize bytes of the message | 181 // StringTaggingDecrypter ensures that the final kTagSize bytes of the message |
| 182 // match the expected value. | 182 // match the expected value. |
| 183 class StrictTaggingDecrypter : public TaggingDecrypter { | 183 class StrictTaggingDecrypter : public TaggingDecrypter { |
| 184 public: | 184 public: |
| 185 explicit StrictTaggingDecrypter(uint8 tag) : tag_(tag) {} | 185 explicit StrictTaggingDecrypter(uint8_t tag) : tag_(tag) {} |
| 186 ~StrictTaggingDecrypter() override {} | 186 ~StrictTaggingDecrypter() override {} |
| 187 | 187 |
| 188 // TaggingQuicDecrypter | 188 // TaggingQuicDecrypter |
| 189 uint8 GetTag(StringPiece ciphertext) override { return tag_; } | 189 uint8_t GetTag(StringPiece ciphertext) override { return tag_; } |
| 190 | 190 |
| 191 const char* cipher_name() const override { return "StrictTagging"; } | 191 const char* cipher_name() const override { return "StrictTagging"; } |
| 192 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS. | 192 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS. |
| 193 uint32 cipher_id() const override { return 0xFFFFFFF1; } | 193 uint32_t cipher_id() const override { return 0xFFFFFFF1; } |
| 194 | 194 |
| 195 private: | 195 private: |
| 196 const uint8 tag_; | 196 const uint8_t tag_; |
| 197 }; | 197 }; |
| 198 | 198 |
| 199 class TestConnectionHelper : public QuicConnectionHelperInterface { | 199 class TestConnectionHelper : public QuicConnectionHelperInterface { |
| 200 public: | 200 public: |
| 201 class TestAlarm : public QuicAlarm { | 201 class TestAlarm : public QuicAlarm { |
| 202 public: | 202 public: |
| 203 explicit TestAlarm(QuicAlarm::Delegate* delegate) : QuicAlarm(delegate) {} | 203 explicit TestAlarm(QuicAlarm::Delegate* delegate) : QuicAlarm(delegate) {} |
| 204 | 204 |
| 205 void SetImpl() override {} | 205 void SetImpl() override {} |
| 206 void CancelImpl() override {} | 206 void CancelImpl() override {} |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 void set_perspective(Perspective perspective) { | 349 void set_perspective(Perspective perspective) { |
| 350 // We invert perspective here, because the framer needs to parse packets | 350 // We invert perspective here, because the framer needs to parse packets |
| 351 // we send. | 351 // we send. |
| 352 perspective = perspective == Perspective::IS_CLIENT | 352 perspective = perspective == Perspective::IS_CLIENT |
| 353 ? Perspective::IS_SERVER | 353 ? Perspective::IS_SERVER |
| 354 : Perspective::IS_CLIENT; | 354 : Perspective::IS_CLIENT; |
| 355 QuicFramerPeer::SetPerspective(framer_.framer(), perspective); | 355 QuicFramerPeer::SetPerspective(framer_.framer(), perspective); |
| 356 } | 356 } |
| 357 | 357 |
| 358 // final_bytes_of_last_packet_ returns the last four bytes of the previous | 358 // final_bytes_of_last_packet_ returns the last four bytes of the previous |
| 359 // packet as a little-endian, uint32. This is intended to be used with a | 359 // packet as a little-endian, uint32_t. This is intended to be used with a |
| 360 // TaggingEncrypter so that tests can determine which encrypter was used for | 360 // TaggingEncrypter so that tests can determine which encrypter was used for |
| 361 // a given packet. | 361 // a given packet. |
| 362 uint32 final_bytes_of_last_packet() { return final_bytes_of_last_packet_; } | 362 uint32_t final_bytes_of_last_packet() { return final_bytes_of_last_packet_; } |
| 363 | 363 |
| 364 // Returns the final bytes of the second to last packet. | 364 // Returns the final bytes of the second to last packet. |
| 365 uint32 final_bytes_of_previous_packet() { | 365 uint32_t final_bytes_of_previous_packet() { |
| 366 return final_bytes_of_previous_packet_; | 366 return final_bytes_of_previous_packet_; |
| 367 } | 367 } |
| 368 | 368 |
| 369 void use_tagging_decrypter() { use_tagging_decrypter_ = true; } | 369 void use_tagging_decrypter() { use_tagging_decrypter_ = true; } |
| 370 | 370 |
| 371 uint32 packets_write_attempts() { return packets_write_attempts_; } | 371 uint32_t packets_write_attempts() { return packets_write_attempts_; } |
| 372 | 372 |
| 373 void Reset() { framer_.Reset(); } | 373 void Reset() { framer_.Reset(); } |
| 374 | 374 |
| 375 void SetSupportedVersions(const QuicVersionVector& versions) { | 375 void SetSupportedVersions(const QuicVersionVector& versions) { |
| 376 framer_.SetSupportedVersions(versions); | 376 framer_.SetSupportedVersions(versions); |
| 377 } | 377 } |
| 378 | 378 |
| 379 void set_max_packet_size(QuicByteCount max_packet_size) { | 379 void set_max_packet_size(QuicByteCount max_packet_size) { |
| 380 max_packet_size_ = max_packet_size; | 380 max_packet_size_ = max_packet_size; |
| 381 } | 381 } |
| 382 | 382 |
| 383 private: | 383 private: |
| 384 QuicVersion version_; | 384 QuicVersion version_; |
| 385 SimpleQuicFramer framer_; | 385 SimpleQuicFramer framer_; |
| 386 size_t last_packet_size_; | 386 size_t last_packet_size_; |
| 387 bool write_blocked_; | 387 bool write_blocked_; |
| 388 bool write_should_fail_; | 388 bool write_should_fail_; |
| 389 bool block_on_next_write_; | 389 bool block_on_next_write_; |
| 390 bool is_write_blocked_data_buffered_; | 390 bool is_write_blocked_data_buffered_; |
| 391 uint32 final_bytes_of_last_packet_; | 391 uint32_t final_bytes_of_last_packet_; |
| 392 uint32 final_bytes_of_previous_packet_; | 392 uint32_t final_bytes_of_previous_packet_; |
| 393 bool use_tagging_decrypter_; | 393 bool use_tagging_decrypter_; |
| 394 uint32 packets_write_attempts_; | 394 uint32_t packets_write_attempts_; |
| 395 MockClock* clock_; | 395 MockClock* clock_; |
| 396 // If non-zero, the clock will pause during WritePacket for this amount of | 396 // If non-zero, the clock will pause during WritePacket for this amount of |
| 397 // time. | 397 // time. |
| 398 QuicTime::Delta write_pause_time_delta_; | 398 QuicTime::Delta write_pause_time_delta_; |
| 399 QuicByteCount max_packet_size_; | 399 QuicByteCount max_packet_size_; |
| 400 | 400 |
| 401 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); | 401 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); |
| 402 }; | 402 }; |
| 403 | 403 |
| 404 class TestConnection : public QuicConnection { | 404 class TestConnection : public QuicConnection { |
| (...skipping 2880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3285 | 3285 |
| 3286 // Set a forward-secure encrypter but do not make it the default, and | 3286 // Set a forward-secure encrypter but do not make it the default, and |
| 3287 // verify that it is not yet used. | 3287 // verify that it is not yet used. |
| 3288 connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, | 3288 connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, |
| 3289 new TaggingEncrypter(0x03)); | 3289 new TaggingEncrypter(0x03)); |
| 3290 SendAckPacketToPeer(); | 3290 SendAckPacketToPeer(); |
| 3291 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); | 3291 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); |
| 3292 | 3292 |
| 3293 // Now send a packet "Far enough" after the encrypter was set and verify that | 3293 // Now send a packet "Far enough" after the encrypter was set and verify that |
| 3294 // the forward-secure encrypter is now used. | 3294 // the forward-secure encrypter is now used. |
| 3295 for (uint64 i = 0; i < 3 * congestion_window - 1; ++i) { | 3295 for (uint64_t i = 0; i < 3 * congestion_window - 1; ++i) { |
| 3296 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); | 3296 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); |
| 3297 SendAckPacketToPeer(); | 3297 SendAckPacketToPeer(); |
| 3298 } | 3298 } |
| 3299 EXPECT_EQ(0x03030303u, writer_->final_bytes_of_last_packet()); | 3299 EXPECT_EQ(0x03030303u, writer_->final_bytes_of_last_packet()); |
| 3300 } | 3300 } |
| 3301 | 3301 |
| 3302 TEST_P(QuicConnectionTest, BufferNonDecryptablePackets) { | 3302 TEST_P(QuicConnectionTest, BufferNonDecryptablePackets) { |
| 3303 // SetFromConfig is always called after construction from InitializeSession. | 3303 // SetFromConfig is always called after construction from InitializeSession. |
| 3304 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 3304 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 3305 QuicConfig config; | 3305 QuicConfig config; |
| 3306 connection_.SetFromConfig(config); | 3306 connection_.SetFromConfig(config); |
| 3307 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3307 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3308 use_tagging_decrypter(); | 3308 use_tagging_decrypter(); |
| 3309 | 3309 |
| 3310 const uint8 tag = 0x07; | 3310 const uint8_t tag = 0x07; |
| 3311 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3311 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
| 3312 | 3312 |
| 3313 // Process an encrypted packet which can not yet be decrypted which should | 3313 // Process an encrypted packet which can not yet be decrypted which should |
| 3314 // result in the packet being buffered. | 3314 // result in the packet being buffered. |
| 3315 ProcessDataPacketAtLevel(1, 0, kEntropyFlag, ENCRYPTION_INITIAL); | 3315 ProcessDataPacketAtLevel(1, 0, kEntropyFlag, ENCRYPTION_INITIAL); |
| 3316 | 3316 |
| 3317 // Transition to the new encryption state and process another encrypted packet | 3317 // Transition to the new encryption state and process another encrypted packet |
| 3318 // which should result in the original packet being processed. | 3318 // which should result in the original packet being processed. |
| 3319 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 3319 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
| 3320 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | 3320 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
| 3321 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3321 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
| 3322 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(2); | 3322 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(2); |
| 3323 ProcessDataPacketAtLevel(2, 0, kEntropyFlag, ENCRYPTION_INITIAL); | 3323 ProcessDataPacketAtLevel(2, 0, kEntropyFlag, ENCRYPTION_INITIAL); |
| 3324 | 3324 |
| 3325 // Finally, process a third packet and note that we do not reprocess the | 3325 // Finally, process a third packet and note that we do not reprocess the |
| 3326 // buffered packet. | 3326 // buffered packet. |
| 3327 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3327 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
| 3328 ProcessDataPacketAtLevel(3, 0, kEntropyFlag, ENCRYPTION_INITIAL); | 3328 ProcessDataPacketAtLevel(3, 0, kEntropyFlag, ENCRYPTION_INITIAL); |
| 3329 } | 3329 } |
| 3330 | 3330 |
| 3331 TEST_P(QuicConnectionTest, ProcessBufferedFECGroup) { | 3331 TEST_P(QuicConnectionTest, ProcessBufferedFECGroup) { |
| 3332 // SetFromConfig is always called after construction from InitializeSession. | 3332 // SetFromConfig is always called after construction from InitializeSession. |
| 3333 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 3333 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 3334 QuicConfig config; | 3334 QuicConfig config; |
| 3335 config.set_max_undecryptable_packets(100); | 3335 config.set_max_undecryptable_packets(100); |
| 3336 connection_.SetFromConfig(config); | 3336 connection_.SetFromConfig(config); |
| 3337 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3337 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3338 use_tagging_decrypter(); | 3338 use_tagging_decrypter(); |
| 3339 | 3339 |
| 3340 const uint8 tag = 0x07; | 3340 const uint8_t tag = 0x07; |
| 3341 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3341 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
| 3342 | 3342 |
| 3343 // Don't send packet 1 and buffer initially encrypted packets. | 3343 // Don't send packet 1 and buffer initially encrypted packets. |
| 3344 ProcessFecProtectedPacketAtLevel(2, 1, false, !kEntropyFlag, | 3344 ProcessFecProtectedPacketAtLevel(2, 1, false, !kEntropyFlag, |
| 3345 ENCRYPTION_INITIAL); | 3345 ENCRYPTION_INITIAL); |
| 3346 ProcessFecPacketAtLevel(3, 1, false, kEntropyFlag, nullptr, | 3346 ProcessFecPacketAtLevel(3, 1, false, kEntropyFlag, nullptr, |
| 3347 ENCRYPTION_INITIAL); | 3347 ENCRYPTION_INITIAL); |
| 3348 // Since the packets were buffered, no FEC group should be open. | 3348 // Since the packets were buffered, no FEC group should be open. |
| 3349 ASSERT_EQ(0u, connection_.NumFecGroups()); | 3349 ASSERT_EQ(0u, connection_.NumFecGroups()); |
| 3350 | 3350 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3367 | 3367 |
| 3368 TEST_P(QuicConnectionTest, Buffer100NonDecryptablePackets) { | 3368 TEST_P(QuicConnectionTest, Buffer100NonDecryptablePackets) { |
| 3369 // SetFromConfig is always called after construction from InitializeSession. | 3369 // SetFromConfig is always called after construction from InitializeSession. |
| 3370 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 3370 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 3371 QuicConfig config; | 3371 QuicConfig config; |
| 3372 config.set_max_undecryptable_packets(100); | 3372 config.set_max_undecryptable_packets(100); |
| 3373 connection_.SetFromConfig(config); | 3373 connection_.SetFromConfig(config); |
| 3374 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3374 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3375 use_tagging_decrypter(); | 3375 use_tagging_decrypter(); |
| 3376 | 3376 |
| 3377 const uint8 tag = 0x07; | 3377 const uint8_t tag = 0x07; |
| 3378 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3378 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
| 3379 | 3379 |
| 3380 // Process an encrypted packet which can not yet be decrypted which should | 3380 // Process an encrypted packet which can not yet be decrypted which should |
| 3381 // result in the packet being buffered. | 3381 // result in the packet being buffered. |
| 3382 for (QuicPacketNumber i = 1; i <= 100; ++i) { | 3382 for (QuicPacketNumber i = 1; i <= 100; ++i) { |
| 3383 ProcessDataPacketAtLevel(i, 0, kEntropyFlag, ENCRYPTION_INITIAL); | 3383 ProcessDataPacketAtLevel(i, 0, kEntropyFlag, ENCRYPTION_INITIAL); |
| 3384 } | 3384 } |
| 3385 | 3385 |
| 3386 // Transition to the new encryption state and process another encrypted packet | 3386 // Transition to the new encryption state and process another encrypted packet |
| 3387 // which should result in the original packets being processed. | 3387 // which should result in the original packets being processed. |
| (...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4281 connection_.SendStreamDataWithString(3, payload, 0, !kFin, nullptr) | 4281 connection_.SendStreamDataWithString(3, payload, 0, !kFin, nullptr) |
| 4282 .bytes_consumed); | 4282 .bytes_consumed); |
| 4283 // Just like above, we save 8 bytes on payload, and 8 on truncation. | 4283 // Just like above, we save 8 bytes on payload, and 8 on truncation. |
| 4284 EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8 * 2); | 4284 EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8 * 2); |
| 4285 } | 4285 } |
| 4286 | 4286 |
| 4287 TEST_P(QuicConnectionTest, SendDelayedAck) { | 4287 TEST_P(QuicConnectionTest, SendDelayedAck) { |
| 4288 QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime()); | 4288 QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime()); |
| 4289 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4289 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4290 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4290 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4291 const uint8 tag = 0x07; | 4291 const uint8_t tag = 0x07; |
| 4292 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 4292 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
| 4293 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 4293 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
| 4294 // Process a packet from the non-crypto stream. | 4294 // Process a packet from the non-crypto stream. |
| 4295 frame1_.stream_id = 3; | 4295 frame1_.stream_id = 3; |
| 4296 | 4296 |
| 4297 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used | 4297 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used |
| 4298 // instead of ENCRYPTION_NONE. | 4298 // instead of ENCRYPTION_NONE. |
| 4299 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 4299 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
| 4300 ProcessDataPacketAtLevel(1, 0, !kEntropyFlag, ENCRYPTION_INITIAL); | 4300 ProcessDataPacketAtLevel(1, 0, !kEntropyFlag, ENCRYPTION_INITIAL); |
| 4301 | 4301 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 4317 const size_t kMinRttMs = 40; | 4317 const size_t kMinRttMs = 40; |
| 4318 RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(manager_); | 4318 RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(manager_); |
| 4319 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kMinRttMs), | 4319 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kMinRttMs), |
| 4320 QuicTime::Delta::Zero(), QuicTime::Zero()); | 4320 QuicTime::Delta::Zero(), QuicTime::Zero()); |
| 4321 // The ack time should be based on min_rtt/4, since it's less than the | 4321 // The ack time should be based on min_rtt/4, since it's less than the |
| 4322 // default delayed ack time. | 4322 // default delayed ack time. |
| 4323 QuicTime ack_time = clock_.ApproximateNow().Add( | 4323 QuicTime ack_time = clock_.ApproximateNow().Add( |
| 4324 QuicTime::Delta::FromMilliseconds(kMinRttMs / 4)); | 4324 QuicTime::Delta::FromMilliseconds(kMinRttMs / 4)); |
| 4325 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4325 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4326 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4326 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4327 const uint8 tag = 0x07; | 4327 const uint8_t tag = 0x07; |
| 4328 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 4328 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
| 4329 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 4329 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
| 4330 // Process a packet from the non-crypto stream. | 4330 // Process a packet from the non-crypto stream. |
| 4331 frame1_.stream_id = 3; | 4331 frame1_.stream_id = 3; |
| 4332 | 4332 |
| 4333 // Process all the initial packets in order so there aren't missing packets. | 4333 // Process all the initial packets in order so there aren't missing packets. |
| 4334 QuicPacketNumber kFirstDecimatedPacket = 101; | 4334 QuicPacketNumber kFirstDecimatedPacket = 101; |
| 4335 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { | 4335 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { |
| 4336 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 4336 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
| 4337 ProcessDataPacketAtLevel(1 + i, 0, !kEntropyFlag, ENCRYPTION_INITIAL); | 4337 ProcessDataPacketAtLevel(1 + i, 0, !kEntropyFlag, ENCRYPTION_INITIAL); |
| (...skipping 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5490 EXPECT_CALL(visitor_, | 5490 EXPECT_CALL(visitor_, |
| 5491 OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA, false)); | 5491 OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA, false)); |
| 5492 EXPECT_DFATAL(connection_.SendStreamDataWithString(3, "", 0, kFin, nullptr), | 5492 EXPECT_DFATAL(connection_.SendStreamDataWithString(3, "", 0, kFin, nullptr), |
| 5493 "Cannot send stream data without encryption."); | 5493 "Cannot send stream data without encryption."); |
| 5494 EXPECT_FALSE(connection_.connected()); | 5494 EXPECT_FALSE(connection_.connected()); |
| 5495 } | 5495 } |
| 5496 | 5496 |
| 5497 } // namespace | 5497 } // namespace |
| 5498 } // namespace test | 5498 } // namespace test |
| 5499 } // namespace net | 5499 } // namespace net |
| OLD | NEW |