8 #include <botan/internal/tls_messages.h>
9 #include <botan/internal/tls_reader.h>
10 #include <botan/pubkey.h>
12 #include <botan/rsa.h>
13 #include <botan/rng.h>
14 #include <botan/loadstor.h>
29 include_length =
true;
31 if(
const DH_PublicKey* dh_pub = dynamic_cast<const DH_PublicKey*>(pub_key))
37 pre_master = ka.derive_key(0, dh_pub->public_value()).bits_of();
39 key_material = priv_key.public_value();
41 else if(
const RSA_PublicKey* rsa_pub = dynamic_cast<const RSA_PublicKey*>(pub_key))
44 pre_master[0] = (pref_version >> 8) & 0xFF;
45 pre_master[1] = (pref_version ) & 0xFF;
49 key_material = encryptor.
encrypt(pre_master, rng);
51 if(using_version ==
SSL_V3)
52 include_length =
false;
67 include_length =
true;
70 include_length =
false;
72 deserialize(contents);
93 void Client_Key_Exchange::deserialize(
const MemoryRegion<byte>& buf)
97 TLS_Data_Reader reader(buf);
98 key_material = reader.get_range<
byte>(2, 0, 65535);
113 if(
const DH_PrivateKey* dh_priv = dynamic_cast<const DH_PrivateKey*>(priv_key))
128 pre_master = rng.
random_vec(dh_priv->public_value().size());
133 else if(
const RSA_PrivateKey* rsa_priv = dynamic_cast<const RSA_PrivateKey*>(priv_key))
138 pre_master = decryptor.
decrypt(key_material);
140 if(pre_master.
size() != 48 ||
141 make_u16bit(pre_master[0], pre_master[1]) != version)
147 pre_master[0] = (version >> 8) & 0xFF;
148 pre_master[1] = (version ) & 0xFF;
void append_tls_length_value(MemoryRegion< byte > &buf, const T *vals, size_t vals_size, size_t tag_size)
SecureVector< byte > decrypt(const byte in[], size_t length) const
void send(Record_Writer &, HandshakeHash &) const
SecureVector< byte > random_vec(size_t bytes)
SymmetricKey derive_key(size_t key_len, const byte in[], size_t in_len, const byte params[], size_t params_len) const
SecureVector< byte > pre_master_secret() const
std::invalid_argument Invalid_Argument
TLS_Ciphersuite_Algos kex_type() const
SecureVector< byte > bits_of() const
RandomNumberGenerator * rng
SecureVector< byte > encrypt(const byte in[], size_t length, RandomNumberGenerator &rng) const
u16bit make_u16bit(byte i0, byte i1)
Client_Key_Exchange(RandomNumberGenerator &rng, Record_Writer &output, HandshakeHash &hash, const Public_Key *my_key, Version_Code using_version, Version_Code pref_version)