Botan
1.11.15
|
#include <tls_handshake_io.h>
Public Types | |
typedef std::function< void(byte, const std::vector< byte > &)> | writer_fn |
Public Member Functions | |
void | add_record (const std::vector< byte > &record, Record_Type type, u64bit sequence_number) override |
std::vector< byte > | format (const std::vector< byte > &handshake_msg, Handshake_Type handshake_type) const override |
std::pair< Handshake_Type, std::vector< byte > > | get_next_record (bool expecting_ccs) override |
Protocol_Version | initial_record_version () const override |
std::vector< byte > | send (const Handshake_Message &msg) override |
Stream_Handshake_IO (writer_fn writer) | |
bool | timeout_check () override |
Handshake IO for stream-based handshakes
Definition at line 65 of file tls_handshake_io.h.
typedef std::function<void (byte, const std::vector<byte>&)> Botan::TLS::Stream_Handshake_IO::writer_fn |
Definition at line 68 of file tls_handshake_io.h.
Botan::TLS::Stream_Handshake_IO::Stream_Handshake_IO | ( | writer_fn | writer | ) | [inline] |
Definition at line 70 of file tls_handshake_io.h.
: m_send_hs(writer) {}
void Botan::TLS::Stream_Handshake_IO::add_record | ( | const std::vector< byte > & | record, |
Record_Type | type, | ||
u64bit | sequence_number | ||
) | [override, virtual] |
Implements Botan::TLS::Handshake_IO.
Definition at line 43 of file tls_handshake_io.cpp.
References Botan::TLS::CHANGE_CIPHER_SPEC, Botan::TLS::HANDSHAKE, Botan::TLS::HANDSHAKE_CCS, and Botan::ASN1::to_string().
{ if(record_type == HANDSHAKE) { m_queue.insert(m_queue.end(), record.begin(), record.end()); } else if(record_type == CHANGE_CIPHER_SPEC) { if(record.size() != 1 || record[0] != 1) throw Decoding_Error("Invalid ChangeCipherSpec"); // Pretend it's a regular handshake message of zero length const byte ccs_hs[] = { HANDSHAKE_CCS, 0, 0, 0 }; m_queue.insert(m_queue.end(), ccs_hs, ccs_hs + sizeof(ccs_hs)); } else throw Decoding_Error("Unknown message type " + std::to_string(record_type) + " in handshake processing"); }
std::vector< byte > Botan::TLS::Stream_Handshake_IO::format | ( | const std::vector< byte > & | handshake_msg, |
Handshake_Type | handshake_type | ||
) | const [override, virtual] |
Implements Botan::TLS::Handshake_IO.
Definition at line 87 of file tls_handshake_io.cpp.
References Botan::copy_mem().
Referenced by send().
{ std::vector<byte> send_buf(4 + msg.size()); const size_t buf_size = msg.size(); send_buf[0] = type; store_be24(&send_buf[1], buf_size); copy_mem(&send_buf[4], &msg[0], msg.size()); return send_buf; }
std::pair< Handshake_Type, std::vector< byte > > Botan::TLS::Stream_Handshake_IO::get_next_record | ( | bool | expecting_ccs | ) | [override, virtual] |
Returns (HANDSHAKE_NONE, std::vector<>()) if no message currently available
Implements Botan::TLS::Handshake_IO.
Definition at line 64 of file tls_handshake_io.cpp.
References Botan::TLS::HANDSHAKE_NONE, and Botan::make_u32bit().
{ if(m_queue.size() >= 4) { const size_t length = make_u32bit(0, m_queue[1], m_queue[2], m_queue[3]); if(m_queue.size() >= length + 4) { Handshake_Type type = static_cast<Handshake_Type>(m_queue[0]); std::vector<byte> contents(m_queue.begin() + 4, m_queue.begin() + 4 + length); m_queue.erase(m_queue.begin(), m_queue.begin() + 4 + length); return std::make_pair(type, contents); } } return std::make_pair(HANDSHAKE_NONE, std::vector<byte>()); }
Protocol_Version Botan::TLS::Stream_Handshake_IO::initial_record_version | ( | ) | const [override, virtual] |
Implements Botan::TLS::Handshake_IO.
Definition at line 38 of file tls_handshake_io.cpp.
References Botan::TLS::Protocol_Version::TLS_V10.
{ return Protocol_Version::TLS_V10; }
std::vector< byte > Botan::TLS::Stream_Handshake_IO::send | ( | const Handshake_Message & | msg | ) | [override, virtual] |
Implements Botan::TLS::Handshake_IO.
Definition at line 103 of file tls_handshake_io.cpp.
References Botan::TLS::CHANGE_CIPHER_SPEC, format(), Botan::TLS::HANDSHAKE, Botan::TLS::HANDSHAKE_CCS, Botan::TLS::Handshake_Message::serialize(), and Botan::TLS::Handshake_Message::type().
{ const std::vector<byte> msg_bits = msg.serialize(); if(msg.type() == HANDSHAKE_CCS) { m_send_hs(CHANGE_CIPHER_SPEC, msg_bits); return std::vector<byte>(); // not included in handshake hashes } const std::vector<byte> buf = format(msg_bits, msg.type()); m_send_hs(HANDSHAKE, buf); return buf; }
bool Botan::TLS::Stream_Handshake_IO::timeout_check | ( | ) | [inline, override, virtual] |
Implements Botan::TLS::Handshake_IO.
Definition at line 74 of file tls_handshake_io.h.
{ return false; }