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)
   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
void discard_next(size_t bytes)
std::vector< T > get_range_vector(size_t len_bytes, size_t min_elems, size_t max_elems)
size_t remaining_bytes() const
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)