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