aboutsummaryrefslogtreecommitdiffstats
path: root/src/tls/tls_handshake_reader.cpp
blob: 8278a22969d825513f62d77ed2e9f63ced4dfe6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
* TLS Handshake Reader
* (C) 2012 Jack Lloyd
*
* Released under the terms of the Botan license
*/

#include <botan/internal/tls_handshake_reader.h>
#include <botan/exceptn.h>

namespace Botan {

namespace TLS {

void Stream_Handshake_Reader::add_input(const byte record[],
                                        size_t record_size)
   {
   m_queue.write(record, record_size);
   }

bool Stream_Handshake_Reader::empty() const
   {
   return m_queue.empty();
   }

bool Stream_Handshake_Reader::have_full_record() const
   {
   if(m_queue.size() >= 4)
      {
      byte head[4] = { 0 };
      m_queue.peek(head, 4);

      const size_t length = make_u32bit(0, head[1], head[2], head[3]);

      return (m_queue.size() >= length + 4);
      }

   return false;
   }

std::pair<Handshake_Type, MemoryVector<byte> > Stream_Handshake_Reader::get_next_record()
   {
   if(m_queue.size() >= 4)
      {
      byte head[4] = { 0 };
      m_queue.peek(head, 4);

      const size_t length = make_u32bit(0, head[1], head[2], head[3]);

      if(m_queue.size() >= length + 4)
         {
         Handshake_Type type = static_cast<Handshake_Type>(head[0]);
         MemoryVector<byte> contents(length);
         m_queue.read(head, 4); // discard
         m_queue.read(&contents[0], contents.size());

         return std::make_pair(type, contents);
         }
      }

   throw Internal_Error("Stream_Handshake_Reader::get_next_record called without a full record");
   }

}

}