8 #include <botan/internal/tls_messages.h>
9 #include <botan/internal/tls_reader.h>
21 const size_t buf_size = buf.
size();
25 for(
size_t i = 1; i != 4; ++i)
26 send_buf[i] = get_byte<u32bit>(i, buf_size);
56 void Hello_Request::deserialize(
const MemoryRegion<byte>& buf)
59 throw Decoding_Error(
"Hello_Request: Must be empty, and is not");
86 buf.
push_back(static_cast<byte>(c_version >> 8));
87 buf.
push_back(static_cast<byte>(c_version ));
97 void Client_Hello::deserialize_sslv2(
const MemoryRegion<byte>& buf)
99 if(buf.size() < 12 || buf[0] != 1)
100 throw Decoding_Error(
"Client_Hello: SSLv2 hello corrupted");
102 const size_t cipher_spec_len =
make_u16bit(buf[3], buf[4]);
103 const size_t sess_id_len =
make_u16bit(buf[5], buf[6]);
104 const size_t challenge_len =
make_u16bit(buf[7], buf[8]);
106 const size_t expected_size =
107 (9 + sess_id_len + cipher_spec_len + challenge_len);
109 if(buf.size() != expected_size)
110 throw Decoding_Error(
"Client_Hello: SSLv2 hello corrupted");
112 if(sess_id_len != 0 || cipher_spec_len % 3 != 0 ||
113 (challenge_len < 16 || challenge_len > 32))
115 throw Decoding_Error(
"Client_Hello: SSLv2 hello corrupted");
118 for(
size_t i = 9; i != 9 + cipher_spec_len; i += 3)
128 c_random.
resize(challenge_len);
129 copy_mem(&c_random[0], &buf[9+cipher_spec_len+sess_id_len], challenge_len);
135 void Client_Hello::deserialize(
const MemoryRegion<byte>& buf)
138 throw Decoding_Error(
"Client_Hello: Packet corrupted");
141 throw Decoding_Error(
"Client_Hello: Packet corrupted");
143 TLS_Data_Reader reader(buf);
145 c_version =
static_cast<Version_Code>(reader.get_u16bit());
146 c_random = reader.get_fixed<
byte>(32);
148 sess_id = reader.get_range<
byte>(1, 0, 32);
150 suites = reader.get_range_vector<
u16bit>(2, 1, 32767);
152 comp_algos = reader.get_range_vector<
byte>(1, 1, 255);
154 if(reader.has_remaining())
156 const u16bit all_extn_size = reader.get_u16bit();
158 if(reader.remaining_bytes() != all_extn_size)
159 throw Decoding_Error(
"Client_Hello: Bad extension size");
161 while(reader.has_remaining())
163 const u16bit extension_code = reader.get_u16bit();
164 const u16bit extension_size = reader.get_u16bit();
168 u16bit name_bytes = reader.get_u16bit();
172 byte name_type = reader.get_byte();
177 std::vector<byte> name =
178 reader.get_range_vector<
byte>(2, 1, 65535);
180 requested_hostname.assign(
181 reinterpret_cast<const char*>(&name[0]),
184 name_bytes -= (2 + name.size());
188 reader.discard_next(name_bytes);
195 std::vector<byte> name = reader.get_range_vector<
byte>(1, 1, 255);
197 requested_srp_id.assign(
198 reinterpret_cast<char*>(&name[0]),
203 reader.discard_next(extension_size);
214 for(
size_t i = 0; i != suites.size(); ++i)
215 if(suites[i] == ciphersuite)
226 const std::vector<X509_Certificate>& certs,
231 bool have_rsa =
false, have_dsa =
false;
233 for(
size_t i = 0; i != certs.size(); ++i)
235 Public_Key* key = certs[i].subject_public_key();
247 "Can't agree on a ciphersuite with client");
264 buf.
push_back(static_cast<byte>(s_version >> 8));
265 buf.
push_back(static_cast<byte>(s_version ));
281 void Server_Hello::deserialize(
const MemoryRegion<byte>& buf)
284 throw Decoding_Error(
"Server_Hello: Packet corrupted");
286 TLS_Data_Reader reader(buf);
288 s_version =
static_cast<Version_Code>(reader.get_u16bit());
293 "Server_Hello: Unsupported server version");
296 s_random = reader.get_fixed<
byte>(32);
298 sess_id = reader.get_range<
byte>(1, 0, 32);
300 suite = reader.get_u16bit();
302 comp_algo = reader.get_byte();
325 void Server_Hello_Done::deserialize(
const MemoryRegion<byte>& buf)
328 throw Decoding_Error(
"Server_Hello_Done: Must be empty, and is not");
void append_tls_length_value(MemoryRegion< byte > &buf, const T *vals, size_t vals_size, size_t tag_size)
virtual byte choose_compression(const std::vector< byte > &client) const
virtual Version_Code pref_version() const
virtual u16bit choose_suite(const std::vector< u16bit > &client_suites, bool rsa_ok, bool dsa_ok) const
void send(Record_Writer &, HandshakeHash &) const
SecureVector< byte > random_vec(size_t bytes)
virtual std::string algo_name() const =0
byte get_byte(size_t byte_num, T input)
virtual Handshake_Type type() const =0
std::vector< u16bit > ciphersuites() const
virtual std::vector< byte > compression() const
std::vector< u16bit > ciphersuites() const
RandomNumberGenerator * rng
std::vector< byte > compression_algos() const
Server_Hello(RandomNumberGenerator &rng, Record_Writer &, const TLS_Policy &, const std::vector< X509_Certificate > &, const Client_Hello &, Version_Code, HandshakeHash &)
Hello_Request(Record_Writer &)
void update(const byte in[], size_t length)
void copy_mem(T *out, const T *in, size_t n)
Server_Hello_Done(Record_Writer &, HandshakeHash &)
u16bit make_u16bit(byte i0, byte i1)
bool offered_suite(u16bit) const
Client_Hello(RandomNumberGenerator &rng, Record_Writer &, const TLS_Policy &, HandshakeHash &)
void send(byte type, const byte input[], size_t length)