8 #ifndef BOTAN_TLS_READER_H__
9 #define BOTAN_TLS_READER_H__
11 #include <botan/secmem.h>
12 #include <botan/loadstor.h>
23 buf(buf_in), offset(0) {}
27 return buf.
size() - offset;
37 assert_at_least(bytes);
52 byte result = buf[offset];
57 template<
typename T,
typename Container>
60 assert_at_least(num_elems *
sizeof(T));
62 Container result(num_elems);
64 for(
size_t i = 0; i != num_elems; ++i)
65 result[i] = load_be<T>(&buf[offset], i);
67 offset += num_elems *
sizeof(T);
77 const size_t num_elems =
78 get_num_elems(len_bytes,
sizeof(T), min_elems, max_elems);
80 return get_elem<T, SecureVector<T> >(num_elems);
88 const size_t num_elems =
89 get_num_elems(len_bytes,
sizeof(T), min_elems, max_elems);
91 return get_elem<T, std::vector<T> >(num_elems);
97 return get_elem<T, SecureVector<T> >(size);
101 size_t get_length_field(
size_t len_bytes)
103 assert_at_least(len_bytes);
107 else if(len_bytes == 2)
113 size_t get_num_elems(
size_t len_bytes,
118 const size_t byte_length = get_length_field(len_bytes);
120 if(byte_length % T_size != 0)
121 throw Decoding_Error(
"TLS_Data_Reader: Size isn't multiple of T");
123 const size_t num_elems = byte_length / T_size;
125 if(num_elems < min_elems || num_elems > max_elems)
126 throw Decoding_Error(
"TLS_Data_Reader: Range outside paramaters");
131 void assert_at_least(
size_t n)
const
133 if(buf.
size() - offset <
n)
134 throw Decoding_Error(
"TLS_Data_Reader: Corrupt packet");
137 const MemoryRegion<byte>& buf;
150 const size_t T_size =
sizeof(T);
151 const size_t val_bytes = T_size * vals_size;
153 if(tag_size != 1 && tag_size != 2)
154 throw std::invalid_argument(
"append_tls_length_value: invalid tag size");
156 if((tag_size == 1 && val_bytes > 255) ||
157 (tag_size == 2 && val_bytes > 65535))
158 throw std::invalid_argument(
"append_tls_length_value: value too large");
160 for(
size_t i = 0; i != tag_size; ++i)
163 for(
size_t i = 0; i != vals_size; ++i)
164 for(
size_t j = 0; j != T_size; ++j)
178 const std::vector<T>& vals,
void append_tls_length_value(MemoryRegion< byte > &buf, const T *vals, size_t vals_size, size_t tag_size)
bool has_remaining() const
size_t remaining_bytes() const
void discard_next(size_t bytes)
byte get_byte(size_t byte_num, T input)
std::vector< T > get_range_vector(size_t len_bytes, size_t min_elems, size_t max_elems)
TLS_Data_Reader(const MemoryRegion< byte > &buf_in)
SecureVector< T > get_fixed(size_t size)
u16bit make_u16bit(byte i0, byte i1)
Container get_elem(size_t num_elems)
SecureVector< T > get_range(size_t len_bytes, size_t min_elems, size_t max_elems)