diff options
author | Ivan Nardi <12729895+IvanNardi@users.noreply.github.com> | 2022-07-08 12:50:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-08 12:50:46 +0200 |
commit | 510517126a63f828754826b5bcfc4b4d1d3791d4 (patch) | |
tree | dde2ceb664d81a87770c1b669ec36c89ee2c0e26 /src/lib/protocols/kerberos.c | |
parent | 9b958769738c2b63f195d1ee2d112206704cce7e (diff) |
LDAP: rewrite dissection (#1649)
Diffstat (limited to 'src/lib/protocols/kerberos.c')
-rw-r--r-- | src/lib/protocols/kerberos.c | 44 |
1 files changed, 7 insertions, 37 deletions
diff --git a/src/lib/protocols/kerberos.c b/src/lib/protocols/kerberos.c index 176bb2eab..ab2a58e14 100644 --- a/src/lib/protocols/kerberos.c +++ b/src/lib/protocols/kerberos.c @@ -41,50 +41,20 @@ static int krb_decode_asn1_length(struct ndpi_detection_module_struct *ndpi_stru size_t * const kasn1_offset) { struct ndpi_packet_struct * const packet = &ndpi_struct->packet; - unsigned char length_octet; int length; + u_int16_t value_len; - length_octet = packet->payload[*kasn1_offset]; + length = ndpi_asn1_ber_decode_length(&packet->payload[*kasn1_offset], + packet->payload_packet_len - *kasn1_offset, + &value_len); - if (length_octet == 0xFF) + if (length == -1 || + packet->payload_packet_len < *kasn1_offset + value_len + length) { - /* Malformed Packet */ return -1; } - if ((length_octet & 0x80) == 0) - { - /* Definite, short */ - length = length_octet & 0x7F; - (*kasn1_offset)++; - } else { - /* Definite, long or indefinite (not support by this implementation) */ - if ((length_octet & 0x7F) == 0) - { - /* indefinite, unsupported */ - return -1; - } - - length_octet &= 0x7F; - if (length_octet > 4 /* We support only 4 additional length octets. */ || - packet->payload_packet_len <= *kasn1_offset + length_octet + 1) - { - return -1; - } - - int i = 1; - length = 0; - for (; i <= length_octet; ++i) - { - length |= (unsigned int)packet->payload[*kasn1_offset + i] << (length_octet - i) * 8; - } - *kasn1_offset += i; - } - - if (packet->payload_packet_len < *kasn1_offset + length) - { - return -1; - } + *kasn1_offset += value_len; return length; } |