Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

deps: update ngtcp2 to 1.11.0 #57179

Merged
merged 1 commit into from
Feb 25, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h
Original file line number Diff line number Diff line change
@@ -331,7 +331,7 @@ ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp,
* :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
* set negotiated AEAD and message digest algorithm. After the
* successful call of this function, application can use
* `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_early_crypto_ctx`
* `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx`
* if |level| ==
* :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
* get :type:`ngtcp2_crypto_ctx`.
@@ -378,7 +378,7 @@ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key(
* :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
* set negotiated AEAD and message digest algorithm. After the
* successful call of this function, application can use
* `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_early_crypto_ctx`
* `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx`
* if |level| ==
* :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
* get :type:`ngtcp2_crypto_ctx`.
47 changes: 25 additions & 22 deletions deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c
Original file line number Diff line number Diff line change
@@ -125,7 +125,7 @@ static int supported_cipher_suite(ptls_cipher_suite_t *cs) {
#ifdef PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
|| cs->aead == &ptls_openssl_chacha20poly1305
#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */
;
;
}

ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx,
@@ -146,7 +146,7 @@ ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx,
ctx->hp.native_handle = (void *)crypto_cipher_suite_get_hp(cs);
ctx->max_encryption = crypto_cipher_suite_get_aead_max_encryption(cs);
ctx->max_decryption_failure =
crypto_cipher_suite_get_aead_max_decryption_failure(cs);
crypto_cipher_suite_get_aead_max_decryption_failure(cs);
return ctx;
}

@@ -329,19 +329,22 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead,
const uint8_t *nonce, size_t noncelen,
const uint8_t *aad, size_t aadlen) {
ptls_aead_context_t *actx = aead_ctx->native_handle;
size_t nwrite;

(void)aead;

ptls_aead_xor_iv(actx, nonce, noncelen);

if (ptls_aead_decrypt(actx, dest, ciphertext, ciphertextlen, 0, aad,
aadlen) == SIZE_MAX) {
return -1;
}
nwrite =
ptls_aead_decrypt(actx, dest, ciphertext, ciphertextlen, 0, aad, aadlen);

/* zero-out static iv once again */
ptls_aead_xor_iv(actx, nonce, noncelen);

if (nwrite == SIZE_MAX) {
return -1;
}

return 0;
}

@@ -360,13 +363,13 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp,
}

int ngtcp2_crypto_read_write_crypto_data(
ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level,
const uint8_t *data, size_t datalen) {
ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level,
const uint8_t *data, size_t datalen) {
ngtcp2_crypto_picotls_ctx *cptls = ngtcp2_conn_get_tls_native_handle(conn);
ptls_buffer_t sendbuf;
size_t epoch_offsets[5] = {0};
size_t epoch =
ngtcp2_crypto_picotls_from_ngtcp2_encryption_level(encryption_level);
ngtcp2_crypto_picotls_from_ngtcp2_encryption_level(encryption_level);
size_t epoch_datalen;
size_t i;
int rv;
@@ -388,7 +391,7 @@ int ngtcp2_crypto_read_write_crypto_data(

if (!ngtcp2_conn_is_server(conn) &&
cptls->handshake_properties.client.early_data_acceptance ==
PTLS_EARLY_DATA_REJECTED) {
PTLS_EARLY_DATA_REJECTED) {
rv = ngtcp2_conn_tls_early_data_rejected(conn);
if (rv != 0) {
rv = -1;
@@ -405,8 +408,8 @@ int ngtcp2_crypto_read_write_crypto_data(
assert(i != 1);

if (ngtcp2_conn_submit_crypto_data(
conn, ngtcp2_crypto_picotls_from_epoch(i),
sendbuf.base + epoch_offsets[i], epoch_datalen) != 0) {
conn, ngtcp2_crypto_picotls_from_epoch(i),
sendbuf.base + epoch_offsets[i], epoch_datalen) != 0) {
rv = -1;
goto fin;
}
@@ -463,7 +466,7 @@ ngtcp2_encryption_level ngtcp2_crypto_picotls_from_epoch(size_t epoch) {
}

size_t ngtcp2_crypto_picotls_from_ngtcp2_encryption_level(
ngtcp2_encryption_level encryption_level) {
ngtcp2_encryption_level encryption_level) {
switch (encryption_level) {
case NGTCP2_ENCRYPTION_LEVEL_INITIAL:
return 0;
@@ -532,17 +535,17 @@ static int set_additional_extensions(ptls_handshake_properties_t *hsprops,
}

int ngtcp2_crypto_picotls_collect_extension(
ptls_t *ptls, struct st_ptls_handshake_properties_t *properties,
uint16_t type) {
ptls_t *ptls, struct st_ptls_handshake_properties_t *properties,
uint16_t type) {
(void)ptls;
(void)properties;

return type == NGTCP2_TLSEXT_QUIC_TRANSPORT_PARAMETERS_V1;
}

int ngtcp2_crypto_picotls_collected_extensions(
ptls_t *ptls, struct st_ptls_handshake_properties_t *properties,
ptls_raw_extension_t *extensions) {
ptls_t *ptls, struct st_ptls_handshake_properties_t *properties,
ptls_raw_extension_t *extensions) {
ngtcp2_crypto_conn_ref *conn_ref;
ngtcp2_conn *conn;
int rv;
@@ -558,7 +561,7 @@ int ngtcp2_crypto_picotls_collected_extensions(
conn = conn_ref->get_conn(conn_ref);

rv = ngtcp2_conn_decode_and_set_remote_transport_params(
conn, extensions->data.base, extensions->data.len);
conn, extensions->data.base, extensions->data.len);
if (rv != 0) {
ngtcp2_conn_set_tls_error(conn, rv);
return -1;
@@ -613,7 +616,7 @@ static int update_traffic_key_server_cb(ptls_update_traffic_key_t *self,
}

static ptls_update_traffic_key_t update_traffic_key_server = {
update_traffic_key_server_cb,
update_traffic_key_server_cb,
};

static int update_traffic_key_cb(ptls_update_traffic_key_t *self, ptls_t *ptls,
@@ -661,7 +664,7 @@ int ngtcp2_crypto_picotls_configure_client_context(ptls_context_t *ctx) {
}

int ngtcp2_crypto_picotls_configure_server_session(
ngtcp2_crypto_picotls_ctx *cptls) {
ngtcp2_crypto_picotls_ctx *cptls) {
ptls_handshake_properties_t *hsprops = &cptls->handshake_properties;

hsprops->collect_extension = ngtcp2_crypto_picotls_collect_extension;
@@ -671,7 +674,7 @@ int ngtcp2_crypto_picotls_configure_server_session(
}

int ngtcp2_crypto_picotls_configure_client_session(
ngtcp2_crypto_picotls_ctx *cptls, ngtcp2_conn *conn) {
ngtcp2_crypto_picotls_ctx *cptls, ngtcp2_conn *conn) {
ptls_handshake_properties_t *hsprops = &cptls->handshake_properties;

hsprops->client.max_early_data_size = calloc(1, sizeof(size_t));
@@ -692,7 +695,7 @@ int ngtcp2_crypto_picotls_configure_client_session(
}

void ngtcp2_crypto_picotls_deconfigure_session(
ngtcp2_crypto_picotls_ctx *cptls) {
ngtcp2_crypto_picotls_ctx *cptls) {
ptls_handshake_properties_t *hsprops;
ptls_raw_extension_t *exts;

8 changes: 6 additions & 2 deletions deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h
Original file line number Diff line number Diff line change
@@ -167,8 +167,12 @@ typedef void *(*ngtcp2_realloc)(void *ptr, size_t size, void *user_data);
* }
*
* void conn_new() {
* ngtcp2_mem mem = {NULL, my_malloc_cb, my_free_cb, my_calloc_cb,
* my_realloc_cb};
* ngtcp2_mem mem = {
* .malloc = my_malloc_cb,
* .free = my_free_cb,
* .calloc = my_calloc_cb,
* .realloc = my_realloc_cb,
* };
*
* ...
* }
4 changes: 2 additions & 2 deletions deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h
Original file line number Diff line number Diff line change
@@ -36,7 +36,7 @@
*
* Version number of the ngtcp2 library release.
*/
#define NGTCP2_VERSION "1.10.0"
#define NGTCP2_VERSION "1.11.0"

/**
* @macro
@@ -46,6 +46,6 @@
* number, 8 bits for minor and 8 bits for patch. Version 1.2.3
* becomes 0x010203.
*/
#define NGTCP2_VERSION_NUM 0x010a00
#define NGTCP2_VERSION_NUM 0x010b00

#endif /* !defined(NGTCP2_VERSION_H) */
114 changes: 114 additions & 0 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c
Original file line number Diff line number Diff line change
@@ -25,6 +25,7 @@
#include "ngtcp2_acktr.h"

#include <assert.h>
#include <string.h>

#include "ngtcp2_macro.h"
#include "ngtcp2_tstamp.h"
@@ -70,6 +71,9 @@ void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log,
acktr->flags = NGTCP2_ACKTR_FLAG_NONE;
acktr->first_unacked_ts = UINT64_MAX;
acktr->rx_npkt = 0;
acktr->max_pkt_num = -1;
acktr->max_pkt_ts = UINT64_MAX;
memset(&acktr->ecn, 0, sizeof(acktr->ecn));
}

void ngtcp2_acktr_free(ngtcp2_acktr *acktr) {
@@ -180,6 +184,11 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack,
ngtcp2_acktr_entry_objalloc_del(delent, &acktr->objalloc);
}

if (acktr->max_pkt_num < pkt_num) {
acktr->max_pkt_num = pkt_num;
acktr->max_pkt_ts = ts;
}

return 0;
}

@@ -323,3 +332,108 @@ int ngtcp2_acktr_require_active_ack(const ngtcp2_acktr *acktr,
void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr) {
acktr->flags |= NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK;
}

ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr,
ngtcp2_frame *fr, uint8_t type,
ngtcp2_tstamp ts,
ngtcp2_duration ack_delay,
uint64_t ack_delay_exponent) {
int64_t last_pkt_num;
ngtcp2_ack_range *range;
ngtcp2_ksl_it it;
ngtcp2_acktr_entry *rpkt;
ngtcp2_ack *ack = &fr->ack;
ngtcp2_tstamp largest_ack_ts;
size_t num_acks;

if (acktr->flags & NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK) {
ack_delay = 0;
}

if (!ngtcp2_acktr_require_active_ack(acktr, ack_delay, ts)) {
return NULL;
}

it = ngtcp2_acktr_get(acktr);
if (ngtcp2_ksl_it_end(&it)) {
ngtcp2_acktr_commit_ack(acktr);
return NULL;
}

num_acks = ngtcp2_ksl_len(&acktr->ents);

if (acktr->ecn.ect0 || acktr->ecn.ect1 || acktr->ecn.ce) {
ack->type = NGTCP2_FRAME_ACK_ECN;
ack->ecn.ect0 = acktr->ecn.ect0;
ack->ecn.ect1 = acktr->ecn.ect1;
ack->ecn.ce = acktr->ecn.ce;
} else {
ack->type = NGTCP2_FRAME_ACK;
}
ack->rangecnt = 0;

rpkt = ngtcp2_ksl_it_get(&it);

if (rpkt->pkt_num == acktr->max_pkt_num) {
last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1);
largest_ack_ts = rpkt->tstamp;
ack->largest_ack = rpkt->pkt_num;
ack->first_ack_range = rpkt->len - 1;

ngtcp2_ksl_it_next(&it);
--num_acks;
} else if (rpkt->pkt_num + 1 == acktr->max_pkt_num) {
last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1);
largest_ack_ts = acktr->max_pkt_ts;
ack->largest_ack = acktr->max_pkt_num;
ack->first_ack_range = rpkt->len;

ngtcp2_ksl_it_next(&it);
--num_acks;
} else {
assert(rpkt->pkt_num < acktr->max_pkt_num);

last_pkt_num = acktr->max_pkt_num;
largest_ack_ts = acktr->max_pkt_ts;
ack->largest_ack = acktr->max_pkt_num;
ack->first_ack_range = 0;
}

if (type == NGTCP2_PKT_1RTT) {
ack->ack_delay_unscaled = ts - largest_ack_ts;
ack->ack_delay = ack->ack_delay_unscaled / NGTCP2_MICROSECONDS /
(1ULL << ack_delay_exponent);
} else {
ack->ack_delay_unscaled = 0;
ack->ack_delay = 0;
}

num_acks = ngtcp2_min_size(num_acks, NGTCP2_MAX_ACK_RANGES);

for (; ack->rangecnt < num_acks; ngtcp2_ksl_it_next(&it)) {
rpkt = ngtcp2_ksl_it_get(&it);

range = &ack->ranges[ack->rangecnt++];
range->gap = (uint64_t)(last_pkt_num - rpkt->pkt_num - 2);
range->len = rpkt->len - 1;

last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1);
}

return fr;
}

void ngtcp2_acktr_increase_ecn_counts(ngtcp2_acktr *acktr,
const ngtcp2_pkt_info *pi) {
switch (pi->ecn & NGTCP2_ECN_MASK) {
case NGTCP2_ECN_ECT_0:
++acktr->ecn.ect0;
break;
case NGTCP2_ECN_ECT_1:
++acktr->ecn.ect1;
break;
case NGTCP2_ECN_CE:
++acktr->ecn.ce;
break;
}
}
Loading
Loading