Skip to content

Commit af9437e

Browse files
authored
[~] 修复与chrome >= 124兼容性问题,处理server接收到client发送的多个initial包时、下行状态的正确更新 (#447)
1 parent e7ddb84 commit af9437e

File tree

7 files changed

+49
-4
lines changed

7 files changed

+49
-4
lines changed

src/tls/babassl/xqc_ssl_if_impl.c

+15-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <openssl/err.h>
77
#include "src/tls/xqc_ssl_if.h"
88
#include "src/tls/xqc_tls_common.h"
9+
#include "src/transport/xqc_conn.h"
910

1011

1112
void
@@ -114,9 +115,22 @@ xqc_ssl_session_is_early_data_enabled(SSL_SESSION *session)
114115

115116

116117
xqc_ssl_handshake_res_t
117-
xqc_ssl_do_handshake(SSL *ssl)
118+
xqc_ssl_do_handshake(SSL *ssl, xqc_connection_t *conn, xqc_log_t *log)
118119
{
119120
int rv = SSL_do_handshake(ssl);
121+
122+
xqc_log(log, XQC_LOG_DEBUG, "|ssl_do_handshake|SSL_quic_read_level:%d|SSL_quic_write_level:%d|rv:%d|",
123+
(int) SSL_quic_read_level(ssl),
124+
(int) SSL_quic_write_level(ssl),
125+
rv);
126+
/* check if client hello is received completely */
127+
if (SSL_quic_read_level(ssl) > 0
128+
&& conn != NULL
129+
&& !(conn->conn_flag & XQC_CONN_FLAG_TLS_CH_RECVD))
130+
{
131+
conn->conn_flag |= XQC_CONN_FLAG_TLS_CH_RECVD;
132+
}
133+
120134
if (rv <= 0) {
121135
int err = SSL_get_error(ssl, rv);
122136
switch (err) {

src/tls/boringssl/xqc_ssl_if_impl.c

+15-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <openssl/ssl.h>
77
#include "src/tls/xqc_ssl_if.h"
88
#include "src/tls/xqc_tls_common.h"
9+
#include "src/transport/xqc_conn.h"
910

1011

1112
void
@@ -83,13 +84,26 @@ xqc_ssl_is_early_data_accepted(SSL *ssl)
8384

8485

8586
xqc_ssl_handshake_res_t
86-
xqc_ssl_do_handshake(SSL *ssl)
87+
xqc_ssl_do_handshake(SSL *ssl, xqc_connection_t *conn, xqc_log_t *log)
8788
{
8889
int ret;
8990

9091
again:
9192
ERR_clear_error();
9293
ret = SSL_do_handshake(ssl);
94+
95+
/* check if client hello is received completely */
96+
if (SSL_quic_read_level(ssl) > 0
97+
&& conn != NULL
98+
&& !(conn->conn_flag & XQC_CONN_FLAG_TLS_CH_RECVD))
99+
{
100+
conn->conn_flag |= XQC_CONN_FLAG_TLS_CH_RECVD;
101+
}
102+
xqc_log(log, XQC_LOG_DEBUG, "|ssl_do_handshake|SSL_quic_read_level:%d|SSL_quic_write_level:%d|rv:%d|",
103+
(int) SSL_quic_read_level(ssl),
104+
(int) SSL_quic_write_level(ssl),
105+
ret);
106+
93107
if (ret <= 0) {
94108
switch (SSL_get_error(ssl, ret)) {
95109
case SSL_ERROR_WANT_READ:

src/tls/xqc_ssl_if.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ xqc_int_t xqc_ssl_get_certs_array(SSL *ssl, X509_STORE_CTX *store_ctx, unsigned
3737
size_t array_cap, size_t *certs_array_len, size_t *certs_len);
3838
void xqc_ssl_free_certs_array(unsigned char **certs_array, size_t certs_array_len);
3939

40-
xqc_ssl_handshake_res_t xqc_ssl_do_handshake(SSL *ssl);
40+
xqc_ssl_handshake_res_t xqc_ssl_do_handshake(SSL *ssl, xqc_connection_t *conn, xqc_log_t *log);
4141

4242
#endif

src/tls/xqc_tls.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,9 @@ xqc_tls_process_trans_param(xqc_tls_t *tls)
391391
xqc_int_t
392392
xqc_tls_do_handshake(xqc_tls_t *tls)
393393
{
394-
xqc_ssl_handshake_res_t res = xqc_ssl_do_handshake(tls->ssl);
394+
xqc_ssl_handshake_res_t res = xqc_ssl_do_handshake(tls->ssl, tls->user_data, tls->log);
395+
xqc_log(tls->log, XQC_LOG_DEBUG, "|TLS handshake|ret:%d|", res);
396+
395397
if (res == XQC_SSL_HSK_RES_FAIL) {
396398
xqc_log(tls->log, XQC_LOG_ERROR, "|TLS handshake error:%s|",
397399
ERR_error_string(ERR_get_error(), NULL));
@@ -555,6 +557,8 @@ xqc_tls_process_crypto_data(xqc_tls_t *tls, xqc_encrypt_level_t level,
555557
int ret;
556558
int err;
557559

560+
xqc_log(tls->log, XQC_LOG_DEBUG, "|xqc_tls_process_crypto_data|level:%d|%zu|", level, data_len);
561+
558562
if (SSL_provide_quic_data(ssl, (enum ssl_encryption_level_t)level, crypto_data, data_len)
559563
!= XQC_SSL_SUCCESS)
560564
{

src/transport/xqc_conn.h

+2
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ typedef enum {
123123
XQC_CONN_FLAG_NEW_CID_ACKED_SHIFT,
124124
XQC_CONN_FLAG_LINGER_CLOSING_SHIFT,
125125
XQC_CONN_FLAG_RETRY_RECVD_SHIFT,
126+
XQC_CONN_FLAG_TLS_CH_SHIFT,
126127
XQC_CONN_FLAG_TLS_HSK_COMPLETED_SHIFT,
127128
XQC_CONN_FLAG_RECV_NEW_PATH_SHIFT,
128129
XQC_CONN_FLAG_VALIDATE_REBINDING_SHIFT,
@@ -169,6 +170,7 @@ typedef enum {
169170
XQC_CONN_FLAG_NEW_CID_ACKED = 1ULL << XQC_CONN_FLAG_NEW_CID_ACKED_SHIFT,
170171
XQC_CONN_FLAG_LINGER_CLOSING = 1ULL << XQC_CONN_FLAG_LINGER_CLOSING_SHIFT,
171172
XQC_CONN_FLAG_RETRY_RECVD = 1ULL << XQC_CONN_FLAG_RETRY_RECVD_SHIFT,
173+
XQC_CONN_FLAG_TLS_CH_RECVD = 1ULL << XQC_CONN_FLAG_TLS_CH_SHIFT,
172174
XQC_CONN_FLAG_TLS_HSK_COMPLETED = 1ULL << XQC_CONN_FLAG_TLS_HSK_COMPLETED_SHIFT,
173175
XQC_CONN_FLAG_RECV_NEW_PATH = 1ULL << XQC_CONN_FLAG_RECV_NEW_PATH_SHIFT,
174176
XQC_CONN_FLAG_VALIDATE_REBINDING = 1ULL << XQC_CONN_FLAG_VALIDATE_REBINDING_SHIFT,

src/transport/xqc_frame.c

+2
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,8 @@ xqc_process_crypto_frame(xqc_connection_t *conn, xqc_packet_in_t *packet_in)
682682
}
683683
}
684684

685+
xqc_log(conn->log, XQC_LOG_DEBUG, "|level:%d|", encrypt_level);
686+
685687
xqc_stream_t *stream = conn->crypto_stream[encrypt_level];
686688

687689
ret = xqc_insert_crypto_frame(conn, stream, stream_frame);

src/transport/xqc_stream.c

+9
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,8 @@ xqc_crypto_stream_on_write(xqc_stream_t *stream, void *user_data)
11181118
xqc_connection_t *conn = stream->stream_conn;
11191119
xqc_list_head_t *crypto_data_list = NULL;
11201120

1121+
xqc_log(conn->log, XQC_LOG_DEBUG, "|enc_level|%d|", encrypt_level);
1122+
11211123
if (encrypt_level == XQC_ENC_LEV_INIT) {
11221124
pns = XQC_PNS_INIT;
11231125
pkt_type = XQC_PTYPE_INIT;
@@ -1130,6 +1132,13 @@ xqc_crypto_stream_on_write(xqc_stream_t *stream, void *user_data)
11301132

11311133
case XQC_CONN_STATE_SERVER_INIT:
11321134
case XQC_CONN_STATE_SERVER_INITIAL_RECVD:
1135+
1136+
xqc_log(stream->stream_conn->log, XQC_LOG_DEBUG, "|cur_state:%d|switch|", cur_state);
1137+
/* haven't recved enough data for client hello */
1138+
if (conn->conn_type == XQC_CONN_TYPE_SERVER && !(conn->conn_flag & XQC_CONN_FLAG_TLS_CH_RECVD)) {
1139+
return XQC_OK;
1140+
}
1141+
11331142
crypto_data_list = &conn->initial_crypto_data_list;
11341143
if (conn->crypto_stream[XQC_ENC_LEV_HSK] != NULL) {
11351144
xqc_stream_ready_to_write(conn->crypto_stream[XQC_ENC_LEV_HSK]);

0 commit comments

Comments
 (0)