TSG-7634: 支持解析gquic 23/34/37/41/44的SNI

This commit is contained in:
liuxueli
2021-09-04 19:55:07 +08:00
parent a2eb69b2ad
commit 132a495756
2 changed files with 38 additions and 17 deletions

View File

@@ -548,18 +548,21 @@ enum _QUIC_VERSION is_quic_protocol(struct streaminfo *pstream, struct _quic_con
switch(quic_version) // +1 meaning: skip public flags
{
case GQUIC_VERSION_Q044:
case GQUIC_VERSION_Q045:
case GQUIC_VERSION_Q046:
case GQUIC_VERSION_Q047:
case GQUIC_VERSION_Q048:
quic_version=parse_quic_header(pstream, _context, payload, payload_len, used_len);
return quic_version;
break;
default:
if( (quic_version==GQUIC_VERSION_Q044) ||
(quic_version==GQUIC_VERSION_Q045) ||
if(
(quic_version==GQUIC_VERSION_Q099) ||
(quic_version==PICOQUIC_VERSION_30) ||
(quic_version==PQUIC_VERSION_PROX) ||
(quic_version==GQUIC_VERSION_T099) ||
(quic_version>=GQUIC_VERSION_Q047 && quic_version<=GQUIC_VERSION_Q050) ||
(quic_version>=GQUIC_VERSION_Q049 && quic_version<=GQUIC_VERSION_Q050) ||
(quic_version>=GQUIC_VERSION_Q051 && quic_version<=GQUIC_VERSION_Q059) ||
(quic_version>=GQUIC_VERSION_T048 && quic_version<=GQUIC_VERSION_T049) ||
(quic_version>=GQUIC_VERSION_T050 && quic_version<=GQUIC_VERSION_T059) ||
@@ -692,7 +695,7 @@ int gquic_frame_type_stream(struct streaminfo *pstream, struct _quic_context* _c
{
int ret=0;
char state=APP_STATE_GIVEME;
unsigned short tag_num = 0;
int tag_num = 0;
unsigned int message_tag;
if(!check_length(payload_len-*used_len, 8))
@@ -700,12 +703,26 @@ int gquic_frame_type_stream(struct streaminfo *pstream, struct _quic_context* _c
return state;
}
message_tag=(unsigned int)ntohl(*(unsigned int *)(payload+*used_len));
*used_len+=4;
switch(_context->quic_info.quic_hdr.quic_version)
{
case GQUIC_VERSION_Q041:
*used_len+=1; // unknown
case GQUIC_VERSION_Q044:
message_tag=(unsigned int)ntohl(*(unsigned int *)(payload+*used_len));
*used_len+=4;
tag_num=*(unsigned short *)(payload+*used_len);
*used_len+=2; //tag_num
*used_len+=2; //padding
tag_num=*(int *)(payload+*used_len);
*used_len+=4; //tag_num
break;
default:
message_tag=(unsigned int)ntohl(*(unsigned int *)(payload+*used_len));
*used_len+=4;
tag_num=*(unsigned int *)(payload+*used_len);
*used_len+=2; //tag_num
*used_len+=2; //padding
break;
}
switch(message_tag)
{
@@ -936,7 +953,7 @@ int parse_gquic_Q046(struct streaminfo *pstream, struct _quic_context* _context,
frame_type=payload[*used_len];
*used_len+=1; //skip frame_type
if(frame_type&IQUIC_FRAME_STREAM_HEX08)
if(frame_type&IQUIC_FRAME_STREAM_HEX08) //0x08=Q048
{
stream_id=get_stream_id(pstream, _context, payload, payload_len, frame_type, used_len);
if(stream_id<0)
@@ -1158,15 +1175,19 @@ int quic_process(struct streaminfo *pstream, struct _quic_context* _context, int
switch(is_gquic)
{
case GQUIC_VERSION_Q035:
case GQUIC_VERSION_Q039:
case GQUIC_VERSION_Q043:
ret=gquic_proc_unencrypt(pstream, _context, a_packet, (char *)udp_detail->pdata, udp_detail->datalen, &used_len);
break;
case GQUIC_VERSION_Q044:
case GQUIC_VERSION_Q045:
case GQUIC_VERSION_Q046:
case GQUIC_VERSION_Q047:
case GQUIC_VERSION_Q048:
ret=parse_gquic_Q046(pstream, _context, a_packet, (char *)udp_detail->pdata, udp_detail->datalen, &used_len);
break;
default:
if(is_gquic>=GQUIC_VERSION_Q001 && GQUIC_VERSION_Q022<=GQUIC_VERSION_Q043)
{
ret=gquic_proc_unencrypt(pstream, _context, a_packet, (char *)udp_detail->pdata, udp_detail->datalen, &used_len);
}
if( ((is_gquic>=MVFST_VERSION_00 && is_gquic<=MVFST_VERSION_0F) ||
(is_gquic>=GQUIC_VERSION_Q049 && is_gquic<=GQUIC_VERSION_Q059) ||
(is_gquic>=GQUIC_VERSION_T050 && is_gquic<=GQUIC_VERSION_T059) ||