OPENSSL_free((char *)ch->terminate_cause.reason);
OSSL_ERR_STATE_free(ch->err_state);
OPENSSL_free(ch->ack_range_scratch);
+ OPENSSL_free(ch->pending_new_token);
if (ch->on_port_list) {
ossl_list_ch_remove(&ch->port->channel_list, ch);
ch->handshake_complete = 1;
+ if (ch->pending_new_token != NULL) {
+ ossl_quic_channel_schedule_new_token(ch,
+ ch->pending_new_token,
+ ch->pending_new_token_len);
+ OPENSSL_free(ch->pending_new_token);
+ ch->pending_new_token = NULL;
+ ch->pending_new_token_len = 0;
+ }
+
if (ch->is_server) {
/*
* On the server, the handshake is confirmed as soon as it is complete.
*/
unsigned char *local_transport_params;
+ /*
+ * Pending new token to send once handshake is complete
+ */
+ uint8_t *pending_new_token;
+ size_t pending_new_token_len;
+
/* Our current L4 peer address, if any. */
BIO_ADDR cur_peer_addr;
BIO_ADDR_rawaddress(peer, addrptr, NULL);
if (token != NULL)
memcpy(new_token->token, token, token_len);
-
return new_token;
}
ossl_crypto_mutex_lock(c->mutex);
old = lh_QUIC_TOKEN_retrieve(c->cache, tok);
- if (old != NULL)
- lh_QUIC_TOKEN_delete(c->cache, tok);
+ if (old != NULL) {
+ lh_QUIC_TOKEN_delete(c->cache, old);
+ free_quic_token(old);
+ }
lh_QUIC_TOKEN_insert(c->cache, tok);
ossl_crypto_mutex_unlock(c->mutex);
- free_quic_token(old);
return 1;
}
ossl_crypto_mutex_lock(c->mutex);
tok = lh_QUIC_TOKEN_retrieve(c->cache, key);
if (tok != NULL) {
- if (tok->token_len > *token_len) {
- /* allow reuse here */
- tok = NULL;
- goto out;
- }
*token = tok->token;
*token_len = tok->token_len;
*token_free_ptr = tok;
rc = 1;
}
-out:
ossl_crypto_mutex_unlock(c->mutex);
free_quic_token(key);
return rc;
QUIC_CONN_ID rscid = { 0 };
QUIC_VALIDATION_TOKEN token;
unsigned char buffer[ENCRYPTED_TOKEN_MAX_LEN];
- unsigned char ct_buf[ENCRYPTED_TOKEN_MAX_LEN];
+ unsigned char *ct_buf;
size_t ct_len;
size_t token_buf_len = 0;
if (!ch->is_server)
return;
+ ct_buf = OPENSSL_zalloc(ENCRYPTED_TOKEN_MAX_LEN);
+ if (ct_buf == NULL)
+ return;
+
if (!ossl_quic_lcidm_get_unused_cid(ch->port->lcidm, &rscid))
return;
|| ct_len > ENCRYPTED_TOKEN_MAX_LEN
|| !encrypt_validation_token(ch->port, buffer, token_buf_len, ct_buf,
&ct_len)
- || !ossl_assert(ct_len >= QUIC_RETRY_INTEGRITY_TAG_LEN))
+ || !ossl_assert(ct_len >= QUIC_RETRY_INTEGRITY_TAG_LEN)) {
+ OPENSSL_free(ct_buf);
return;
+ }
+
+ ch->pending_new_token = ct_buf;
+ ch->pending_new_token_len = ct_len;
- ossl_quic_channel_schedule_new_token(ch, ct_buf, ct_len);
cleanup_validation_token(&token);
}