Пример #1
0
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;
}
Пример #2
0
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;
	}
}
Пример #3
0
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;
}