boolean ber_read_integer(STREAM* s, uint32* value) { int length; ber_read_universal_tag(s, BER_TAG_INTEGER, false); ber_read_length(s, &length); if (value == NULL) { stream_seek(s, length); return true; } if (length == 1) stream_read_uint8(s, *value); else if (length == 2) stream_read_uint16_be(s, *value); else if (length == 3) { uint8 byte; stream_read_uint8(s, byte); stream_read_uint16_be(s, *value); *value += (byte << 16); } else if (length == 4) stream_read_uint32_be(s, *value); else return false; return true; }
void ber_read_length(STREAM* s, int* length) { uint8 byte; stream_read_uint8(s, byte); if (byte & 0x80) { byte &= ~(0x80); if (byte == 1) stream_read_uint8(s, *length); if (byte == 2) stream_read_uint16_be(s, *length); } else { *length = byte; } }
uint16 tpkt_read_header(STREAM* s) { uint8 version; uint16 length; stream_peek_uint8(s, version); if (version == 3) { stream_seek(s, 2); stream_read_uint16_be(s, length); } else { /* not a TPKT header */ length = 0; } return length; }