Skip to content

Commit 7c7acdc

Browse files
committed
quic: handle StatelessResetToken update following ngtcp2 1.22 update
1 parent 39d906c commit 7c7acdc

5 files changed

Lines changed: 74 additions & 48 deletions

File tree

src/quic/packet.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ Packet::Ptr Packet::CreateStatelessResetPacket(
160160
if (!packet) return packet;
161161
ngtcp2_vec vec = *packet;
162162

163-
ssize_t nwrite = ngtcp2_pkt_write_stateless_reset(
163+
auto nwrite = ngtcp2_pkt_write_stateless_reset2(
164164
vec.base, pktlen, token, random, kRandlen);
165165
if (nwrite <= static_cast<ssize_t>(kMinStatelessResetLen)) return Ptr();
166166

src/quic/session.cc

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ void ngtcp2_debug_log(void* user_data, const char* fmt, ...) {
216216
va_end(ap);
217217
}
218218

219-
template <typename Opt, PreferredAddress::Policy Opt::*member>
219+
template <typename Opt, PreferredAddress::Policy Opt::* member>
220220
bool SetOption(Environment* env,
221221
Opt* options,
222222
const Local<Object>& object,
@@ -231,7 +231,7 @@ bool SetOption(Environment* env,
231231
return true;
232232
}
233233

234-
template <typename Opt, TLSContext::Options Opt::*member>
234+
template <typename Opt, TLSContext::Options Opt::* member>
235235
bool SetOption(Environment* env,
236236
Opt* options,
237237
const Local<Object>& object,
@@ -246,7 +246,7 @@ bool SetOption(Environment* env,
246246
return true;
247247
}
248248

249-
template <typename Opt, TransportParams::Options Opt::*member>
249+
template <typename Opt, TransportParams::Options Opt::* member>
250250
bool SetOption(Environment* env,
251251
Opt* options,
252252
const Local<Object>& object,
@@ -261,7 +261,7 @@ bool SetOption(Environment* env,
261261
return true;
262262
}
263263

264-
template <typename Opt, ngtcp2_cc_algo Opt::*member>
264+
template <typename Opt, ngtcp2_cc_algo Opt::* member>
265265
bool SetOption(Environment* env,
266266
Opt* options,
267267
const Local<Object>& object,
@@ -626,9 +626,9 @@ struct Session::Impl final : public MemoryRetainer {
626626
ngtcp2_conn_get_scid(*session_, nullptr));
627627
ngtcp2_conn_get_scid(*session_, cids.out());
628628

629-
MaybeStackBuffer<ngtcp2_cid_token, 10> tokens(
630-
ngtcp2_conn_get_active_dcid(*session_, nullptr));
631-
ngtcp2_conn_get_active_dcid(*session_, tokens.out());
629+
MaybeStackBuffer<ngtcp2_cid_token2, 10> tokens(
630+
ngtcp2_conn_get_active_dcid2(*session_, nullptr));
631+
ngtcp2_conn_get_active_dcid2(*session_, tokens.out());
632632

633633
endpoint->DisassociateCID(config_.dcid);
634634
endpoint->DisassociateCID(config_.preferred_address_cid);
@@ -640,7 +640,7 @@ struct Session::Impl final : public MemoryRetainer {
640640
for (size_t n = 0; n < tokens.length(); n++) {
641641
if (tokens[n].token_present) {
642642
endpoint->DisassociateStatelessResetToken(
643-
StatelessResetToken(tokens[n].token));
643+
StatelessResetToken(&tokens[n].token));
644644
}
645645
}
646646

@@ -874,7 +874,7 @@ struct Session::Impl final : public MemoryRetainer {
874874
ngtcp2_connection_id_status_type type,
875875
uint64_t seq,
876876
const ngtcp2_cid* cid,
877-
const uint8_t* token,
877+
const ngtcp2_stateless_reset_token* token,
878878
void* user_data) {
879879
NGTCP2_CALLBACK_SCOPE(session)
880880
std::optional<StatelessResetToken> maybe_reset_token;
@@ -946,7 +946,7 @@ struct Session::Impl final : public MemoryRetainer {
946946

947947
static int on_get_new_cid(ngtcp2_conn* conn,
948948
ngtcp2_cid* cid,
949-
uint8_t* token,
949+
ngtcp2_stateless_reset_token* token,
950950
size_t cidlen,
951951
void* user_data) {
952952
NGTCP2_CALLBACK_SCOPE(session)
@@ -1043,7 +1043,7 @@ struct Session::Impl final : public MemoryRetainer {
10431043
}
10441044

10451045
static int on_receive_stateless_reset(ngtcp2_conn* conn,
1046-
const ngtcp2_pkt_stateless_reset* sr,
1046+
const ngtcp2_pkt_stateless_reset2* sr,
10471047
void* user_data) {
10481048
NGTCP2_CALLBACK_SCOPE(session)
10491049
session->impl_->state_->stateless_reset = 1;
@@ -1212,12 +1212,12 @@ struct Session::Impl final : public MemoryRetainer {
12121212
on_acknowledge_stream_data_offset,
12131213
nullptr,
12141214
on_stream_close,
1215-
on_receive_stateless_reset,
1215+
nullptr, // recv_stateless_reset (deprecated, use v2 below)
12161216
ngtcp2_crypto_recv_retry_cb,
12171217
on_extend_max_streams_bidi,
12181218
on_extend_max_streams_uni,
12191219
on_rand,
1220-
on_get_new_cid,
1220+
nullptr, // get_new_connection_id (deprecated, use v2 below)
12211221
on_remove_connection_id,
12221222
ngtcp2_crypto_update_key_cb,
12231223
on_path_validation,
@@ -1226,7 +1226,7 @@ struct Session::Impl final : public MemoryRetainer {
12261226
on_extend_max_remote_streams_bidi,
12271227
on_extend_max_remote_streams_uni,
12281228
on_extend_max_stream_data,
1229-
on_cid_status,
1229+
nullptr, // dcid_status (deprecated, use v2 below)
12301230
on_handshake_confirmed,
12311231
on_receive_new_token,
12321232
ngtcp2_crypto_delete_crypto_aead_ctx_cb,
@@ -1241,9 +1241,9 @@ struct Session::Impl final : public MemoryRetainer {
12411241
nullptr,
12421242
on_early_data_rejected,
12431243
on_begin_path_validation,
1244-
nullptr,
1245-
nullptr,
1246-
nullptr,
1244+
on_receive_stateless_reset,
1245+
on_get_new_cid,
1246+
on_cid_status,
12471247
nullptr};
12481248

12491249
static constexpr ngtcp2_callbacks SERVER = {
@@ -1259,12 +1259,12 @@ struct Session::Impl final : public MemoryRetainer {
12591259
on_acknowledge_stream_data_offset,
12601260
nullptr,
12611261
on_stream_close,
1262-
on_receive_stateless_reset,
1262+
nullptr, // recv_stateless_reset (deprecated, use v2 below)
12631263
nullptr,
12641264
on_extend_max_streams_bidi,
12651265
on_extend_max_streams_uni,
12661266
on_rand,
1267-
on_get_new_cid,
1267+
nullptr, // get_new_connection_id (deprecated, use v2 below)
12681268
on_remove_connection_id,
12691269
ngtcp2_crypto_update_key_cb,
12701270
on_path_validation,
@@ -1273,7 +1273,7 @@ struct Session::Impl final : public MemoryRetainer {
12731273
on_extend_max_remote_streams_bidi,
12741274
on_extend_max_remote_streams_uni,
12751275
on_extend_max_stream_data,
1276-
on_cid_status,
1276+
nullptr, // dcid_status (deprecated, use v2 below)
12771277
nullptr,
12781278
nullptr,
12791279
ngtcp2_crypto_delete_crypto_aead_ctx_cb,
@@ -1288,9 +1288,9 @@ struct Session::Impl final : public MemoryRetainer {
12881288
on_receive_tx_key,
12891289
on_early_data_rejected,
12901290
on_begin_path_validation,
1291-
nullptr,
1292-
nullptr,
1293-
nullptr,
1291+
on_receive_stateless_reset,
1292+
on_get_new_cid,
1293+
on_cid_status,
12941294
nullptr};
12951295
};
12961296

@@ -2497,7 +2497,7 @@ void Session::DatagramReceived(const uint8_t* data,
24972497

24982498
void Session::GenerateNewConnectionId(ngtcp2_cid* cid,
24992499
size_t len,
2500-
uint8_t* token) {
2500+
ngtcp2_stateless_reset_token* token) {
25012501
DCHECK(!is_destroyed());
25022502
CID cid_ = impl_->config_.options.cid_factory->GenerateInto(cid, len);
25032503
Debug(this, "Generated new connection id %s", cid_);

src/quic/session.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,9 @@ class Session final : public AsyncWrap, private SessionTicket::AppData::Source {
501501
void DatagramReceived(const uint8_t* data,
502502
size_t datalen,
503503
DatagramReceivedFlags flag);
504-
void GenerateNewConnectionId(ngtcp2_cid* cid, size_t len, uint8_t* token);
504+
void GenerateNewConnectionId(ngtcp2_cid* cid,
505+
size_t len,
506+
ngtcp2_stateless_reset_token* token);
505507
bool HandshakeCompleted();
506508
void HandshakeConfirmed();
507509
void SelectPreferredAddress(PreferredAddress* preferredAddress);

src/quic/tokens.cc

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,42 +61,61 @@ std::string TokenSecret::ToString() const {
6161
// ============================================================================
6262
// StatelessResetToken
6363

64-
StatelessResetToken::StatelessResetToken() : ptr_(nullptr), buf_() {}
64+
StatelessResetToken::StatelessResetToken()
65+
: ngtcp2_stateless_reset_token(), ptr_(nullptr) {}
6566

66-
StatelessResetToken::StatelessResetToken(const uint8_t* token) : ptr_(token) {}
67+
StatelessResetToken::StatelessResetToken(const uint8_t* token)
68+
: ptr_(reinterpret_cast<const ngtcp2_stateless_reset_token*>(token)) {}
69+
70+
StatelessResetToken::StatelessResetToken(
71+
const ngtcp2_stateless_reset_token* token)
72+
: ptr_(token) {}
6773

6874
StatelessResetToken::StatelessResetToken(const TokenSecret& secret,
6975
const CID& cid)
70-
: ptr_(buf_) {
76+
: ptr_(this) {
7177
CHECK_EQ(ngtcp2_crypto_generate_stateless_reset_token(
72-
buf_, secret, kStatelessTokenLen, cid),
78+
data, secret, kStatelessTokenLen, cid),
7379
0);
7480
}
7581

7682
StatelessResetToken::StatelessResetToken(uint8_t* token,
7783
const TokenSecret& secret,
7884
const CID& cid)
79-
: ptr_(token) {
85+
: ptr_(reinterpret_cast<const ngtcp2_stateless_reset_token*>(token)) {
8086
CHECK_EQ(ngtcp2_crypto_generate_stateless_reset_token(
8187
token, secret, kStatelessTokenLen, cid),
8288
0);
8389
}
8490

91+
StatelessResetToken::StatelessResetToken(ngtcp2_stateless_reset_token* token,
92+
const TokenSecret& secret,
93+
const CID& cid)
94+
: ptr_(token) {
95+
CHECK_EQ(ngtcp2_crypto_generate_stateless_reset_token(
96+
token->data, secret, kStatelessTokenLen, cid),
97+
0);
98+
}
99+
85100
StatelessResetToken::StatelessResetToken(const StatelessResetToken& other)
86-
: ptr_(buf_) {
101+
: ngtcp2_stateless_reset_token(), ptr_(this) {
87102
if (other) {
88-
memcpy(buf_, other.ptr_, kStatelessTokenLen);
103+
memcpy(data, other.ptr_->data, kStatelessTokenLen);
89104
} else {
90105
ptr_ = nullptr;
91106
}
92107
}
93108

94109
StatelessResetToken::operator const uint8_t*() const {
95-
return ptr_ != nullptr ? ptr_ : buf_;
110+
return ptr_ != nullptr ? ptr_->data : data;
111+
}
112+
113+
StatelessResetToken::operator const ngtcp2_stateless_reset_token*() const {
114+
return ptr_;
96115
}
97116

98117
StatelessResetToken::operator const char*() const {
99-
return reinterpret_cast<const char*>(ptr_ != nullptr ? ptr_ : buf_);
118+
return reinterpret_cast<const char*>(ptr_ != nullptr ? ptr_->data : data);
100119
}
101120

102121
StatelessResetToken::operator bool() const {
@@ -109,7 +128,7 @@ bool StatelessResetToken::operator==(const StatelessResetToken& other) const {
109128
(ptr_ != nullptr && other.ptr_ == nullptr)) {
110129
return false;
111130
}
112-
return CRYPTO_memcmp(ptr_, other.ptr_, kStatelessTokenLen) == 0;
131+
return CRYPTO_memcmp(ptr_->data, other.ptr_->data, kStatelessTokenLen) == 0;
113132
}
114133

115134
bool StatelessResetToken::operator!=(const StatelessResetToken& other) const {
@@ -128,7 +147,7 @@ std::string StatelessResetToken::ToString() const {
128147
size_t StatelessResetToken::Hash::operator()(
129148
const StatelessResetToken& token) const {
130149
if (token.ptr_ == nullptr) return 0;
131-
return HashBytes(token.ptr_, kStatelessTokenLen);
150+
return HashBytes(token.ptr_->data, kStatelessTokenLen);
132151
}
133152

134153
StatelessResetToken StatelessResetToken::kInvalid;

src/quic/tokens.h

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,38 +70,44 @@ class TokenSecret final : public MemoryRetainer {
7070
//
7171
// StatlessResetTokens are always kStatelessTokenLen bytes,
7272
// as are the secrets used to generate the token.
73-
class StatelessResetToken final : public MemoryRetainer {
73+
class StatelessResetToken final : public ngtcp2_stateless_reset_token,
74+
public MemoryRetainer {
7475
public:
7576
static constexpr int kStatelessTokenLen = NGTCP2_STATELESS_RESET_TOKENLEN;
7677

7778
StatelessResetToken();
7879

7980
// Generates a stateless reset token using HKDF with the cid and token secret
8081
// as input. The token secret is either provided by user code when an Endpoint
81-
// is created or is generated randomly.
82+
// is created or is generated randomly. The token is stored in the inherited
83+
// ngtcp2_stateless_reset_token::data and ptr_ is set to this.
8284
StatelessResetToken(const TokenSecret& secret, const CID& cid);
8385

84-
// Generates a stateless reset token using the given token storage.
86+
// Generates a stateless reset token into the given external storage.
8587
// The StatelessResetToken wraps the token and does not take ownership.
86-
// The token storage must be at least kStatelessTokenLen bytes in length.
87-
// The length is not verified so care must be taken when using this
88-
// constructor.
8988
StatelessResetToken(uint8_t* token,
9089
const TokenSecret& secret,
9190
const CID& cid);
9291

92+
// Generates a stateless reset token into the given external storage.
93+
// The StatelessResetToken wraps the token and does not take ownership.
94+
StatelessResetToken(ngtcp2_stateless_reset_token* token,
95+
const TokenSecret& secret,
96+
const CID& cid);
97+
9398
// Wraps the given token. Does not take over ownership of the token storage.
94-
// The token must be at least kStatelessTokenLen bytes in length.
95-
// The length is not verified so care must be taken when using this
96-
// constructor.
9799
explicit StatelessResetToken(const uint8_t* token);
98100

101+
// Wraps the given token. Does not take over ownership of the token storage.
102+
explicit StatelessResetToken(const ngtcp2_stateless_reset_token* token);
103+
99104
StatelessResetToken(const StatelessResetToken& other);
100105
DISALLOW_MOVE(StatelessResetToken)
101106

102107
std::string ToString() const;
103108

104109
operator const uint8_t*() const;
110+
operator const ngtcp2_stateless_reset_token*() const;
105111
operator bool() const;
106112

107113
bool operator==(const StatelessResetToken& other) const;
@@ -124,8 +130,7 @@ class StatelessResetToken final : public MemoryRetainer {
124130
private:
125131
operator const char*() const;
126132

127-
const uint8_t* ptr_;
128-
uint8_t buf_[NGTCP2_STATELESS_RESET_TOKENLEN];
133+
const ngtcp2_stateless_reset_token* ptr_;
129134
};
130135

131136
// A RETRY packet communicates a retry token to the client. Retry tokens are

0 commit comments

Comments
 (0)