Skip to content

Commit 1b070d9

Browse files
Add parsing support for PP2_TYPE_SSL
1 parent 37b50c9 commit 1b070d9

2 files changed

Lines changed: 55 additions & 15 deletions

File tree

src/proxy_protocol.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ static const char *errors[] = {
135135
"v2 PROXY protocol header: invalid IPv6 dst IP",
136136
"v2 PROXY protocol header: invalid TLV vector's length",
137137
"v2 PROXY protocol header: invalid PP2_TYPE_CRC32C",
138+
"v2 PROXY protocol header: invalid PP2_TYPE_SSL",
138139
"v2 PROXY protocol header: invalid PP2_TYPE_UNIQUE_ID",
139140
"v2 PROXY protocol header: invalid PP2_TYPE_AWS",
140141
"v2 PROXY protocol header: invalid PP2_TYPE_AZURE",
@@ -717,7 +718,45 @@ static int32_t ppv2_parse(uint8_t *pkt, uint32_t pktlen, pp_info_t *pp_info)
717718
break;
718719
}
719720
case PP2_TYPE_SSL:
721+
{
722+
pp2_tlv_ssl_t *pp2_tlv_ssl = (pp2_tlv_ssl_t*)pp2_tlv->value;
723+
uint16_t pp2_tlvs_ssl_len = pp2_tlv_len - sizeof(pp2_tlv_ssl->client) - sizeof(pp2_tlv_ssl->verify);
724+
uint16_t pp2_sub_tlv_offset = 0;
725+
while (pp2_tlvs_ssl_len)
726+
{
727+
if (!(pp2_tlv_ssl->client & PP2_CLIENT_SSL || pp2_tlv_ssl->client & PP2_CLIENT_CERT_CONN || pp2_tlv_ssl->client & PP2_CLIENT_CERT_SESS))
728+
{
729+
break;
730+
}
731+
pp2_tlv_t *pp2_sub_tlv_ssl = (pp2_tlv_t * )((uint8_t*) pp2_tlv_ssl->sub_tlv + pp2_sub_tlv_offset);
732+
uint16_t pp2_sub_tlv_ssl_len;
733+
switch (pp2_sub_tlv_ssl->type)
734+
{
735+
case PP2_SUBTYPE_SSL_VERSION:
736+
case PP2_SUBTYPE_SSL_CN:
737+
case PP2_SUBTYPE_SSL_CIPHER:
738+
case PP2_SUBTYPE_SSL_SIG_ALG:
739+
case PP2_SUBTYPE_SSL_KEY_ALG:
740+
{
741+
pp2_sub_tlv_ssl_len = pp2_sub_tlv_ssl->length_hi << 8 | pp2_sub_tlv_ssl->length_lo;
742+
/* +1 to save it as a string */
743+
tlv_t *tlv = tlv_new(pp2_sub_tlv_ssl->type, pp2_sub_tlv_ssl_len + 1, pp2_sub_tlv_ssl->value);
744+
if (!tlv || !tlv_array_append_tlv(&pp_info->tlv_array, tlv))
745+
{
746+
return ERR_HEAP_ALLOC;
747+
}
748+
tlv->value[pp2_sub_tlv_ssl_len] = '\0';
749+
break;
750+
}
751+
default:
752+
return ERR_PP2_TYPE_SSL;
753+
}
754+
755+
pp2_tlvs_ssl_len = pp2_tlvs_ssl_len - 3 - pp2_sub_tlv_ssl_len;
756+
pp2_sub_tlv_offset += 3 + pp2_sub_tlv_ssl_len;
757+
}
720758
break;
759+
}
721760
case PP2_TYPE_AWS:
722761
{
723762
if (pp2_tlv_len < sizeof(pp2_tlv_aws_t))

src/proxy_protocol.h

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,21 @@ enum
3636
ERR_PP2_IPV6_DST_IP = -10,
3737
ERR_PP2_TLV_LENGTH = -11,
3838
ERR_PP2_TYPE_CRC32C = -12,
39-
ERR_PP2_TYPE_UNIQUE_ID = -13,
40-
ERR_PP2_TYPE_AWS = -14,
41-
ERR_PP2_TYPE_AZURE = -15,
42-
ERR_PP1_CRLF = -16,
43-
ERR_PP1_PROXY = -17,
44-
ERR_PP1_SPACE = -18,
45-
ERR_PP1_TRANSPORT_FAMILY = -19,
46-
ERR_PP1_IPV4_SRC_IP = -20,
47-
ERR_PP1_IPV4_DST_IP = -21,
48-
ERR_PP1_IPV6_SRC_IP = -22,
49-
ERR_PP1_IPV6_DST_IP = -23,
50-
ERR_PP1_SRC_PORT = -24,
51-
ERR_PP1_DST_PORT = -25,
52-
ERR_HEAP_ALLOC = -26,
39+
ERR_PP2_TYPE_SSL = -13,
40+
ERR_PP2_TYPE_UNIQUE_ID = -14,
41+
ERR_PP2_TYPE_AWS = -15,
42+
ERR_PP2_TYPE_AZURE = -16,
43+
ERR_PP1_CRLF = -17,
44+
ERR_PP1_PROXY = -18,
45+
ERR_PP1_SPACE = -19,
46+
ERR_PP1_TRANSPORT_FAMILY = -20,
47+
ERR_PP1_IPV4_SRC_IP = -21,
48+
ERR_PP1_IPV4_DST_IP = -22,
49+
ERR_PP1_IPV6_SRC_IP = -23,
50+
ERR_PP1_IPV6_DST_IP = -24,
51+
ERR_PP1_SRC_PORT = -25,
52+
ERR_PP1_DST_PORT = -26,
53+
ERR_HEAP_ALLOC = -27,
5354
};
5455

5556
/* Type-Length-Value (TLV vectors) */
@@ -69,7 +70,7 @@ enum
6970
#define PP2_TYPE_AWS 0xEA
7071
#define PP2_TYPE_AZURE 0xEE
7172

72-
/* PP2_TYPE_SSL subtypes */
73+
/* PP2_TYPE_SSL <client> bit field */
7374
#define PP2_CLIENT_SSL 0x01
7475
#define PP2_CLIENT_CERT_CONN 0x02
7576
#define PP2_CLIENT_CERT_SESS 0x04

0 commit comments

Comments
 (0)