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
3 // found in the LICENSE file.
4
5 #include "quiche/quic/test_tools/simple_quic_framer.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "absl/memory/memory.h"
11 #include "absl/strings/string_view.h"
12 #include "quiche/quic/core/crypto/quic_decrypter.h"
13 #include "quiche/quic/core/crypto/quic_encrypter.h"
14 #include "quiche/quic/core/frames/quic_reset_stream_at_frame.h"
15 #include "quiche/quic/core/quic_types.h"
16
17 namespace quic {
18 namespace test {
19
20 class SimpleFramerVisitor : public QuicFramerVisitorInterface {
21 public:
SimpleFramerVisitor()22 SimpleFramerVisitor() : error_(QUIC_NO_ERROR) {}
23 SimpleFramerVisitor(const SimpleFramerVisitor&) = delete;
24 SimpleFramerVisitor& operator=(const SimpleFramerVisitor&) = delete;
25
~SimpleFramerVisitor()26 ~SimpleFramerVisitor() override {}
27
OnError(QuicFramer * framer)28 void OnError(QuicFramer* framer) override { error_ = framer->error(); }
29
OnProtocolVersionMismatch(ParsedQuicVersion)30 bool OnProtocolVersionMismatch(ParsedQuicVersion /*version*/) override {
31 return false;
32 }
33
OnPacket()34 void OnPacket() override {}
OnVersionNegotiationPacket(const QuicVersionNegotiationPacket & packet)35 void OnVersionNegotiationPacket(
36 const QuicVersionNegotiationPacket& packet) override {
37 version_negotiation_packet_ =
38 std::make_unique<QuicVersionNegotiationPacket>((packet));
39 }
40
OnRetryPacket(QuicConnectionId,QuicConnectionId,absl::string_view,absl::string_view,absl::string_view)41 void OnRetryPacket(QuicConnectionId /*original_connection_id*/,
42 QuicConnectionId /*new_connection_id*/,
43 absl::string_view /*retry_token*/,
44 absl::string_view /*retry_integrity_tag*/,
45 absl::string_view /*retry_without_tag*/) override {}
46
OnUnauthenticatedPublicHeader(const QuicPacketHeader &)47 bool OnUnauthenticatedPublicHeader(
48 const QuicPacketHeader& /*header*/) override {
49 return true;
50 }
OnUnauthenticatedHeader(const QuicPacketHeader &)51 bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
52 return true;
53 }
OnDecryptedPacket(size_t,EncryptionLevel level)54 void OnDecryptedPacket(size_t /*length*/, EncryptionLevel level) override {
55 last_decrypted_level_ = level;
56 }
OnPacketHeader(const QuicPacketHeader & header)57 bool OnPacketHeader(const QuicPacketHeader& header) override {
58 has_header_ = true;
59 header_ = header;
60 return true;
61 }
62
OnCoalescedPacket(const QuicEncryptedPacket & packet)63 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
64 coalesced_packet_ = packet.Clone();
65 }
66
OnUndecryptablePacket(const QuicEncryptedPacket &,EncryptionLevel,bool)67 void OnUndecryptablePacket(const QuicEncryptedPacket& /*packet*/,
68 EncryptionLevel /*decryption_level*/,
69 bool /*has_decryption_key*/) override {}
70
OnStreamFrame(const QuicStreamFrame & frame)71 bool OnStreamFrame(const QuicStreamFrame& frame) override {
72 // Save a copy of the data so it is valid after the packet is processed.
73 std::string* string_data =
74 new std::string(frame.data_buffer, frame.data_length);
75 stream_data_.push_back(absl::WrapUnique(string_data));
76 // TODO(ianswett): A pointer isn't necessary with emplace_back.
77 stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
78 frame.stream_id, frame.fin, frame.offset,
79 absl::string_view(*string_data)));
80 return true;
81 }
82
OnCryptoFrame(const QuicCryptoFrame & frame)83 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
84 // Save a copy of the data so it is valid after the packet is processed.
85 std::string* string_data =
86 new std::string(frame.data_buffer, frame.data_length);
87 crypto_data_.push_back(absl::WrapUnique(string_data));
88 crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
89 frame.level, frame.offset, absl::string_view(*string_data)));
90 return true;
91 }
92
OnAckFrameStart(QuicPacketNumber largest_acked,QuicTime::Delta ack_delay_time)93 bool OnAckFrameStart(QuicPacketNumber largest_acked,
94 QuicTime::Delta ack_delay_time) override {
95 QuicAckFrame ack_frame;
96 ack_frame.largest_acked = largest_acked;
97 ack_frame.ack_delay_time = ack_delay_time;
98 ack_frames_.push_back(ack_frame);
99 return true;
100 }
101
OnAckRange(QuicPacketNumber start,QuicPacketNumber end)102 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
103 QUICHE_DCHECK(!ack_frames_.empty());
104 ack_frames_[ack_frames_.size() - 1].packets.AddRange(start, end);
105 return true;
106 }
107
OnAckTimestamp(QuicPacketNumber,QuicTime)108 bool OnAckTimestamp(QuicPacketNumber /*packet_number*/,
109 QuicTime /*timestamp*/) override {
110 return true;
111 }
112
OnAckFrameEnd(QuicPacketNumber,const std::optional<QuicEcnCounts> &)113 bool OnAckFrameEnd(
114 QuicPacketNumber /*start*/,
115 const std::optional<QuicEcnCounts>& /*ecn_counts*/) override {
116 return true;
117 }
118
OnStopWaitingFrame(const QuicStopWaitingFrame & frame)119 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
120 stop_waiting_frames_.push_back(frame);
121 return true;
122 }
123
OnPaddingFrame(const QuicPaddingFrame & frame)124 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
125 padding_frames_.push_back(frame);
126 return true;
127 }
128
OnPingFrame(const QuicPingFrame & frame)129 bool OnPingFrame(const QuicPingFrame& frame) override {
130 ping_frames_.push_back(frame);
131 return true;
132 }
133
OnRstStreamFrame(const QuicRstStreamFrame & frame)134 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
135 rst_stream_frames_.push_back(frame);
136 return true;
137 }
138
OnConnectionCloseFrame(const QuicConnectionCloseFrame & frame)139 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
140 connection_close_frames_.push_back(frame);
141 return true;
142 }
143
OnNewConnectionIdFrame(const QuicNewConnectionIdFrame & frame)144 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
145 new_connection_id_frames_.push_back(frame);
146 return true;
147 }
148
OnRetireConnectionIdFrame(const QuicRetireConnectionIdFrame & frame)149 bool OnRetireConnectionIdFrame(
150 const QuicRetireConnectionIdFrame& frame) override {
151 retire_connection_id_frames_.push_back(frame);
152 return true;
153 }
154
OnNewTokenFrame(const QuicNewTokenFrame & frame)155 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
156 new_token_frames_.push_back(frame);
157 return true;
158 }
159
OnStopSendingFrame(const QuicStopSendingFrame & frame)160 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
161 stop_sending_frames_.push_back(frame);
162 return true;
163 }
164
OnPathChallengeFrame(const QuicPathChallengeFrame & frame)165 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
166 path_challenge_frames_.push_back(frame);
167 return true;
168 }
169
OnPathResponseFrame(const QuicPathResponseFrame & frame)170 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
171 path_response_frames_.push_back(frame);
172 return true;
173 }
174
OnGoAwayFrame(const QuicGoAwayFrame & frame)175 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
176 goaway_frames_.push_back(frame);
177 return true;
178 }
OnMaxStreamsFrame(const QuicMaxStreamsFrame & frame)179 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
180 max_streams_frames_.push_back(frame);
181 return true;
182 }
183
OnStreamsBlockedFrame(const QuicStreamsBlockedFrame & frame)184 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
185 streams_blocked_frames_.push_back(frame);
186 return true;
187 }
188
OnWindowUpdateFrame(const QuicWindowUpdateFrame & frame)189 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
190 window_update_frames_.push_back(frame);
191 return true;
192 }
193
OnBlockedFrame(const QuicBlockedFrame & frame)194 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
195 blocked_frames_.push_back(frame);
196 return true;
197 }
198
OnMessageFrame(const QuicMessageFrame & frame)199 bool OnMessageFrame(const QuicMessageFrame& frame) override {
200 message_frames_.emplace_back(frame.data, frame.message_length);
201 return true;
202 }
203
OnHandshakeDoneFrame(const QuicHandshakeDoneFrame & frame)204 bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override {
205 handshake_done_frames_.push_back(frame);
206 return true;
207 }
208
OnAckFrequencyFrame(const QuicAckFrequencyFrame & frame)209 bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override {
210 ack_frequency_frames_.push_back(frame);
211 return true;
212 }
213
OnResetStreamAtFrame(const QuicResetStreamAtFrame & frame)214 bool OnResetStreamAtFrame(const QuicResetStreamAtFrame& frame) override {
215 reset_stream_at_frames_.push_back(frame);
216 return true;
217 }
218
OnPacketComplete()219 void OnPacketComplete() override {}
220
IsValidStatelessResetToken(const StatelessResetToken &) const221 bool IsValidStatelessResetToken(
222 const StatelessResetToken& /*token*/) const override {
223 return false;
224 }
225
OnAuthenticatedIetfStatelessResetPacket(const QuicIetfStatelessResetPacket & packet)226 void OnAuthenticatedIetfStatelessResetPacket(
227 const QuicIetfStatelessResetPacket& packet) override {
228 stateless_reset_packet_ =
229 std::make_unique<QuicIetfStatelessResetPacket>(packet);
230 }
231
OnKeyUpdate(KeyUpdateReason)232 void OnKeyUpdate(KeyUpdateReason /*reason*/) override {}
OnDecryptedFirstPacketInKeyPhase()233 void OnDecryptedFirstPacketInKeyPhase() override {}
AdvanceKeysAndCreateCurrentOneRttDecrypter()234 std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
235 override {
236 return nullptr;
237 }
CreateCurrentOneRttEncrypter()238 std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
239 return nullptr;
240 }
241
header() const242 const QuicPacketHeader& header() const { return header_; }
ack_frames() const243 const std::vector<QuicAckFrame>& ack_frames() const { return ack_frames_; }
connection_close_frames() const244 const std::vector<QuicConnectionCloseFrame>& connection_close_frames() const {
245 return connection_close_frames_;
246 }
247
goaway_frames() const248 const std::vector<QuicGoAwayFrame>& goaway_frames() const {
249 return goaway_frames_;
250 }
max_streams_frames() const251 const std::vector<QuicMaxStreamsFrame>& max_streams_frames() const {
252 return max_streams_frames_;
253 }
streams_blocked_frames() const254 const std::vector<QuicStreamsBlockedFrame>& streams_blocked_frames() const {
255 return streams_blocked_frames_;
256 }
rst_stream_frames() const257 const std::vector<QuicRstStreamFrame>& rst_stream_frames() const {
258 return rst_stream_frames_;
259 }
stream_frames() const260 const std::vector<std::unique_ptr<QuicStreamFrame>>& stream_frames() const {
261 return stream_frames_;
262 }
crypto_frames() const263 const std::vector<std::unique_ptr<QuicCryptoFrame>>& crypto_frames() const {
264 return crypto_frames_;
265 }
stop_waiting_frames() const266 const std::vector<QuicStopWaitingFrame>& stop_waiting_frames() const {
267 return stop_waiting_frames_;
268 }
ping_frames() const269 const std::vector<QuicPingFrame>& ping_frames() const { return ping_frames_; }
message_frames() const270 const std::vector<QuicMessageFrame>& message_frames() const {
271 return message_frames_;
272 }
window_update_frames() const273 const std::vector<QuicWindowUpdateFrame>& window_update_frames() const {
274 return window_update_frames_;
275 }
padding_frames() const276 const std::vector<QuicPaddingFrame>& padding_frames() const {
277 return padding_frames_;
278 }
path_challenge_frames() const279 const std::vector<QuicPathChallengeFrame>& path_challenge_frames() const {
280 return path_challenge_frames_;
281 }
path_response_frames() const282 const std::vector<QuicPathResponseFrame>& path_response_frames() const {
283 return path_response_frames_;
284 }
version_negotiation_packet() const285 const QuicVersionNegotiationPacket* version_negotiation_packet() const {
286 return version_negotiation_packet_.get();
287 }
last_decrypted_level() const288 EncryptionLevel last_decrypted_level() const { return last_decrypted_level_; }
coalesced_packet() const289 const QuicEncryptedPacket* coalesced_packet() const {
290 return coalesced_packet_.get();
291 }
292
293 private:
294 QuicErrorCode error_;
295 bool has_header_;
296 QuicPacketHeader header_;
297 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
298 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
299 std::vector<QuicAckFrame> ack_frames_;
300 std::vector<QuicStopWaitingFrame> stop_waiting_frames_;
301 std::vector<QuicPaddingFrame> padding_frames_;
302 std::vector<QuicPingFrame> ping_frames_;
303 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
304 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
305 std::vector<QuicRstStreamFrame> rst_stream_frames_;
306 std::vector<QuicGoAwayFrame> goaway_frames_;
307 std::vector<QuicStreamsBlockedFrame> streams_blocked_frames_;
308 std::vector<QuicMaxStreamsFrame> max_streams_frames_;
309 std::vector<QuicConnectionCloseFrame> connection_close_frames_;
310 std::vector<QuicStopSendingFrame> stop_sending_frames_;
311 std::vector<QuicPathChallengeFrame> path_challenge_frames_;
312 std::vector<QuicPathResponseFrame> path_response_frames_;
313 std::vector<QuicWindowUpdateFrame> window_update_frames_;
314 std::vector<QuicBlockedFrame> blocked_frames_;
315 std::vector<QuicNewConnectionIdFrame> new_connection_id_frames_;
316 std::vector<QuicRetireConnectionIdFrame> retire_connection_id_frames_;
317 std::vector<QuicNewTokenFrame> new_token_frames_;
318 std::vector<QuicMessageFrame> message_frames_;
319 std::vector<QuicHandshakeDoneFrame> handshake_done_frames_;
320 std::vector<QuicAckFrequencyFrame> ack_frequency_frames_;
321 std::vector<QuicResetStreamAtFrame> reset_stream_at_frames_;
322 std::vector<std::unique_ptr<std::string>> stream_data_;
323 std::vector<std::unique_ptr<std::string>> crypto_data_;
324 EncryptionLevel last_decrypted_level_;
325 std::unique_ptr<QuicEncryptedPacket> coalesced_packet_;
326 };
327
SimpleQuicFramer()328 SimpleQuicFramer::SimpleQuicFramer()
329 : framer_(AllSupportedVersions(), QuicTime::Zero(), Perspective::IS_SERVER,
330 kQuicDefaultConnectionIdLength) {}
331
SimpleQuicFramer(const ParsedQuicVersionVector & supported_versions)332 SimpleQuicFramer::SimpleQuicFramer(
333 const ParsedQuicVersionVector& supported_versions)
334 : framer_(supported_versions, QuicTime::Zero(), Perspective::IS_SERVER,
335 kQuicDefaultConnectionIdLength) {}
336
SimpleQuicFramer(const ParsedQuicVersionVector & supported_versions,Perspective perspective)337 SimpleQuicFramer::SimpleQuicFramer(
338 const ParsedQuicVersionVector& supported_versions, Perspective perspective)
339 : framer_(supported_versions, QuicTime::Zero(), perspective,
340 kQuicDefaultConnectionIdLength) {}
341
~SimpleQuicFramer()342 SimpleQuicFramer::~SimpleQuicFramer() {}
343
ProcessPacket(const QuicEncryptedPacket & packet)344 bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
345 visitor_ = std::make_unique<SimpleFramerVisitor>();
346 framer_.set_visitor(visitor_.get());
347 return framer_.ProcessPacket(packet);
348 }
349
Reset()350 void SimpleQuicFramer::Reset() {
351 visitor_ = std::make_unique<SimpleFramerVisitor>();
352 }
353
header() const354 const QuicPacketHeader& SimpleQuicFramer::header() const {
355 return visitor_->header();
356 }
357
358 const QuicVersionNegotiationPacket*
version_negotiation_packet() const359 SimpleQuicFramer::version_negotiation_packet() const {
360 return visitor_->version_negotiation_packet();
361 }
362
last_decrypted_level() const363 EncryptionLevel SimpleQuicFramer::last_decrypted_level() const {
364 return visitor_->last_decrypted_level();
365 }
366
framer()367 QuicFramer* SimpleQuicFramer::framer() { return &framer_; }
368
num_frames() const369 size_t SimpleQuicFramer::num_frames() const {
370 return ack_frames().size() + goaway_frames().size() +
371 rst_stream_frames().size() + stop_waiting_frames().size() +
372 path_challenge_frames().size() + path_response_frames().size() +
373 stream_frames().size() + ping_frames().size() +
374 connection_close_frames().size() + padding_frames().size() +
375 crypto_frames().size();
376 }
377
ack_frames() const378 const std::vector<QuicAckFrame>& SimpleQuicFramer::ack_frames() const {
379 return visitor_->ack_frames();
380 }
381
stop_waiting_frames() const382 const std::vector<QuicStopWaitingFrame>& SimpleQuicFramer::stop_waiting_frames()
383 const {
384 return visitor_->stop_waiting_frames();
385 }
386
387 const std::vector<QuicPathChallengeFrame>&
path_challenge_frames() const388 SimpleQuicFramer::path_challenge_frames() const {
389 return visitor_->path_challenge_frames();
390 }
391 const std::vector<QuicPathResponseFrame>&
path_response_frames() const392 SimpleQuicFramer::path_response_frames() const {
393 return visitor_->path_response_frames();
394 }
395
ping_frames() const396 const std::vector<QuicPingFrame>& SimpleQuicFramer::ping_frames() const {
397 return visitor_->ping_frames();
398 }
399
message_frames() const400 const std::vector<QuicMessageFrame>& SimpleQuicFramer::message_frames() const {
401 return visitor_->message_frames();
402 }
403
404 const std::vector<QuicWindowUpdateFrame>&
window_update_frames() const405 SimpleQuicFramer::window_update_frames() const {
406 return visitor_->window_update_frames();
407 }
408
409 const std::vector<std::unique_ptr<QuicStreamFrame>>&
stream_frames() const410 SimpleQuicFramer::stream_frames() const {
411 return visitor_->stream_frames();
412 }
413
414 const std::vector<std::unique_ptr<QuicCryptoFrame>>&
crypto_frames() const415 SimpleQuicFramer::crypto_frames() const {
416 return visitor_->crypto_frames();
417 }
418
rst_stream_frames() const419 const std::vector<QuicRstStreamFrame>& SimpleQuicFramer::rst_stream_frames()
420 const {
421 return visitor_->rst_stream_frames();
422 }
423
goaway_frames() const424 const std::vector<QuicGoAwayFrame>& SimpleQuicFramer::goaway_frames() const {
425 return visitor_->goaway_frames();
426 }
427
428 const std::vector<QuicConnectionCloseFrame>&
connection_close_frames() const429 SimpleQuicFramer::connection_close_frames() const {
430 return visitor_->connection_close_frames();
431 }
432
padding_frames() const433 const std::vector<QuicPaddingFrame>& SimpleQuicFramer::padding_frames() const {
434 return visitor_->padding_frames();
435 }
436
coalesced_packet() const437 const QuicEncryptedPacket* SimpleQuicFramer::coalesced_packet() const {
438 return visitor_->coalesced_packet();
439 }
440
441 } // namespace test
442 } // namespace quic
443