Skip to content

Commit

Permalink
Early return in stateless reset parsing
Browse files Browse the repository at this point in the history
Summary:
As in title. If we parse something as a stateless reset matching our token, return early. The code before would check if the header parsed as a short header, but that's not correct. If the token bytes match, we should treat it as a stateless reset as this is a more certain check.

See: https://www.rfc-editor.org/rfc/rfc9000.html#section-10.3.1

Reviewed By: sharmafb

Differential Revision: D56376777

fbshipit-source-id: 2a7ce041c872f296db6c4d608895c3b81e479628
  • Loading branch information
Matt Joras authored and facebook-github-bot committed Apr 21, 2024
1 parent e30a104 commit fc21b6c
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 84 deletions.
8 changes: 2 additions & 6 deletions quic/codec/QuicReadCodec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,16 +429,12 @@ CodecResult QuicReadCodec::parsePacket(
statelessResetToken_->data(), sizeof(StatelessResetToken)))) {
token = StatelessResetToken();
memcpy(token->data(), tokenSource, token->size());
return StatelessReset(*token);
}
}
}

auto maybeShortHeaderPacket = tryParseShortHeaderPacket(
return tryParseShortHeaderPacket(
std::move(data), ackStates, dstConnIdSize, cursor);
if (token && maybeShortHeaderPacket.nothing()) {
return StatelessReset(*token);
}
return maybeShortHeaderPacket;
}

bool QuicReadCodec::canInitiateKeyUpdate() const {
Expand Down
78 changes: 0 additions & 78 deletions quic/codec/test/QuicReadCodecTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -573,84 +573,6 @@ TEST_F(QuicReadCodecTest, NoOneRttCipherNoReset) {
EXPECT_FALSE(isReset(std::move(packet)));
}

TEST_F(QuicReadCodecTest, FailToDecryptLeadsToReset) {
auto connId = getTestConnectionId();
auto aead = std::make_unique<MockAead>();
auto rawAead = aead.get();

StatelessResetToken tok = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
auto fakeToken = std::make_unique<StatelessResetToken>(tok);
auto codec = makeEncryptedCodec(
connId,
std::move(aead),
nullptr /* 0-rtt aead */,
std::move(fakeToken),
QuicNodeType::Client);
EXPECT_CALL(*rawAead, _tryDecrypt(_, _, _))
.Times(1)
.WillOnce(Invoke([](auto&, const auto&, auto) { return folly::none; }));
PacketNum packetNum = 1;
StreamId streamId = 2;
auto data = folly::IOBuf::create(30);
data->append(30);
auto streamPacket = createStreamPacket(
connId,
connId,
packetNum,
streamId,
*data,
0 /* cipherOverhead */,
0 /* largestAcked */,
folly::none,
true,
ProtectionType::KeyPhaseZero);
overridePacketWithToken(streamPacket, tok);
AckStates ackStates;
auto packetQueue = bufToQueue(packetToBuf(streamPacket));
auto packet = codec->parsePacket(packetQueue, ackStates);
EXPECT_TRUE(isReset(std::move(packet)));
}

TEST_F(QuicReadCodecTest, ShortPacketAutoPaddedIsReset) {
auto connId = getTestConnectionId();
auto aead = std::make_unique<MockAead>();
auto rawAead = aead.get();
StatelessResetToken tok = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
auto fakeToken = std::make_unique<StatelessResetToken>(tok);
auto codec = makeEncryptedCodec(
connId,
std::move(aead),
nullptr /* 0-rtt aead */,
std::move(fakeToken),
QuicNodeType::Client);

EXPECT_CALL(*rawAead, _tryDecrypt(_, _, _))
.Times(1)
.WillOnce(Invoke([](auto&, const auto&, auto) { return folly::none; }));
PacketNum packetNum = 1;
StreamId streamId = 2;
auto data = folly::IOBuf::create(3);
data->append(3);
auto streamPacket = createStreamPacket(
connId,
connId,
packetNum,
streamId,
*data,
0 /* cipherOverhead */,
0 /* largestAcked */,
folly::none,
true,
ProtectionType::KeyPhaseZero);
overridePacketWithToken(streamPacket, tok);
AckStates ackStates;
auto packetQueue = bufToQueue(packetToBuf(streamPacket));
auto packet = codec->parsePacket(packetQueue, ackStates);
EXPECT_TRUE(isReset(std::move(packet)));
}

TEST_F(QuicReadCodecTest, FailToDecryptLongHeaderNoReset) {
auto connId = getTestConnectionId();
auto aead = std::make_unique<MockAead>();
Expand Down

0 comments on commit fc21b6c

Please sign in to comment.