1 /*
2 * Client Key Exchange Message
3 * (C) 2004-2010,2016 Jack Lloyd
4 * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity
5 *
6 * Botan is released under the Simplified BSD License (see license.txt)
7 */
8
9 #include <botan/tls_messages.h>
10 #include <botan/tls_extensions.h>
11 #include <botan/rng.h>
12
13 #include <botan/internal/tls_reader.h>
14 #include <botan/internal/tls_handshake_io.h>
15 #include <botan/internal/tls_handshake_state.h>
16 #include <botan/internal/tls_handshake_hash.h>
17 #include <botan/credentials_manager.h>
18 #include <botan/internal/ct_utils.h>
19
20 #include <botan/rsa.h>
21
22 #if defined(BOTAN_HAS_CECPQ1)
23 #include <botan/cecpq1.h>
24 #endif
25
26 #if defined(BOTAN_HAS_SRP6)
27 #include <botan/srp6.h>
28 #endif
29
30 namespace Botan {
31
32 namespace TLS {
33
34 /*
35 * Create a new Client Key Exchange message
36 */
Client_Key_Exchange(Handshake_IO & io,Handshake_State & state,const Policy & policy,Credentials_Manager & creds,const Public_Key * server_public_key,const std::string & hostname,RandomNumberGenerator & rng)37 Client_Key_Exchange::Client_Key_Exchange(Handshake_IO& io,
38 Handshake_State& state,
39 const Policy& policy,
40 Credentials_Manager& creds,
41 const Public_Key* server_public_key,
42 const std::string& hostname,
43 RandomNumberGenerator& rng)
44 {
45 const Kex_Algo kex_algo = state.ciphersuite().kex_method();
46
47 if(kex_algo == Kex_Algo::PSK)
48 {
49 std::string identity_hint = "";
50
51 if(state.server_kex())
52 {
53 TLS_Data_Reader reader("ClientKeyExchange", state.server_kex()->params());
54 identity_hint = reader.get_string(2, 0, 65535);
55 }
56
57 const std::string psk_identity =
58 creds.psk_identity("tls-client", hostname, identity_hint);
59
60 append_tls_length_value(m_key_material, psk_identity, 2);
61
62 SymmetricKey psk = creds.psk("tls-client", hostname, psk_identity);
63
64 std::vector<uint8_t> zeros(psk.length());
65
66 append_tls_length_value(m_pre_master, zeros, 2);
67 append_tls_length_value(m_pre_master, psk.bits_of(), 2);
68 }
69 else if(state.server_kex())
70 {
71 TLS_Data_Reader reader("ClientKeyExchange", state.server_kex()->params());
72
73 SymmetricKey psk;
74
75 if(kex_algo == Kex_Algo::DHE_PSK ||
76 kex_algo == Kex_Algo::ECDHE_PSK)
77 {
78 std::string identity_hint = reader.get_string(2, 0, 65535);
79
80 const std::string psk_identity =
81 creds.psk_identity("tls-client", hostname, identity_hint);
82
83 append_tls_length_value(m_key_material, psk_identity, 2);
84
85 psk = creds.psk("tls-client", hostname, psk_identity);
86 }
87
88 if(kex_algo == Kex_Algo::DH ||
89 kex_algo == Kex_Algo::DHE_PSK)
90 {
91 const std::vector<uint8_t> modulus = reader.get_range<uint8_t>(2, 1, 65535);
92 const std::vector<uint8_t> generator = reader.get_range<uint8_t>(2, 1, 65535);
93 const std::vector<uint8_t> peer_public_value = reader.get_range<uint8_t>(2, 1, 65535);
94
95 if(reader.remaining_bytes())
96 throw Decoding_Error("Bad params size for DH key exchange");
97
98 const std::pair<secure_vector<uint8_t>, std::vector<uint8_t>> dh_result =
99 state.callbacks().tls_dh_agree(modulus, generator, peer_public_value, policy, rng);
100
101 if(kex_algo == Kex_Algo::DH)
102 m_pre_master = dh_result.first;
103 else
104 {
105 append_tls_length_value(m_pre_master, dh_result.first, 2);
106 append_tls_length_value(m_pre_master, psk.bits_of(), 2);
107 }
108
109 append_tls_length_value(m_key_material, dh_result.second, 2);
110 }
111 else if(kex_algo == Kex_Algo::ECDH ||
112 kex_algo == Kex_Algo::ECDHE_PSK)
113 {
114 const uint8_t curve_type = reader.get_byte();
115 if(curve_type != 3)
116 throw Decoding_Error("Server sent non-named ECC curve");
117
118 const Group_Params curve_id = static_cast<Group_Params>(reader.get_uint16_t());
119 const std::vector<uint8_t> peer_public_value = reader.get_range<uint8_t>(1, 1, 255);
120
121 if(policy.choose_key_exchange_group({curve_id}) != curve_id)
122 {
123 throw TLS_Exception(Alert::HANDSHAKE_FAILURE,
124 "Server sent ECC curve prohibited by policy");
125 }
126
127 const std::string curve_name = state.callbacks().tls_decode_group_param(curve_id);
128
129 if(curve_name == "")
130 throw Decoding_Error("Server sent unknown named curve " +
131 std::to_string(static_cast<uint16_t>(curve_id)));
132
133 const std::pair<secure_vector<uint8_t>, std::vector<uint8_t>> ecdh_result =
134 state.callbacks().tls_ecdh_agree(curve_name, peer_public_value, policy, rng,
135 state.server_hello()->prefers_compressed_ec_points());
136
137 if(kex_algo == Kex_Algo::ECDH)
138 {
139 m_pre_master = ecdh_result.first;
140 }
141 else
142 {
143 append_tls_length_value(m_pre_master, ecdh_result.first, 2);
144 append_tls_length_value(m_pre_master, psk.bits_of(), 2);
145 }
146
147 append_tls_length_value(m_key_material, ecdh_result.second, 1);
148 }
149 #if defined(BOTAN_HAS_SRP6)
150 else if(kex_algo == Kex_Algo::SRP_SHA)
151 {
152 const BigInt N = BigInt::decode(reader.get_range<uint8_t>(2, 1, 65535));
153 const BigInt g = BigInt::decode(reader.get_range<uint8_t>(2, 1, 65535));
154 std::vector<uint8_t> salt = reader.get_range<uint8_t>(1, 1, 255);
155 const BigInt B = BigInt::decode(reader.get_range<uint8_t>(2, 1, 65535));
156
157 const std::string srp_group = srp6_group_identifier(N, g);
158
159 const std::string srp_identifier =
160 creds.srp_identifier("tls-client", hostname);
161
162 const std::string srp_password =
163 creds.srp_password("tls-client", hostname, srp_identifier);
164
165 std::pair<BigInt, SymmetricKey> srp_vals =
166 srp6_client_agree(srp_identifier,
167 srp_password,
168 srp_group,
169 "SHA-1",
170 salt,
171 B,
172 rng);
173
174 append_tls_length_value(m_key_material, BigInt::encode(srp_vals.first), 2);
175 m_pre_master = srp_vals.second.bits_of();
176 }
177 #endif
178
179 #if defined(BOTAN_HAS_CECPQ1)
180 else if(kex_algo == Kex_Algo::CECPQ1)
181 {
182 const std::vector<uint8_t> cecpq1_offer = reader.get_range<uint8_t>(2, 1, 65535);
183
184 if(cecpq1_offer.size() != CECPQ1_OFFER_BYTES)
185 throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Invalid CECPQ1 key size");
186
187 std::vector<uint8_t> newhope_accept(CECPQ1_ACCEPT_BYTES);
188 secure_vector<uint8_t> shared_secret(CECPQ1_SHARED_KEY_BYTES);
189 CECPQ1_accept(shared_secret.data(), newhope_accept.data(), cecpq1_offer.data(), rng);
190 append_tls_length_value(m_key_material, newhope_accept, 2);
191 m_pre_master = shared_secret;
192 }
193 #endif
194 else
195 {
196 throw Internal_Error("Client_Key_Exchange: Unknown key exchange method was negotiated");
197 }
198
199 reader.assert_done();
200 }
201 else
202 {
203 // No server key exchange msg better mean RSA kex + RSA key in cert
204
205 if(kex_algo != Kex_Algo::STATIC_RSA)
206 throw Unexpected_Message("No server kex message, but negotiated a key exchange that required it");
207
208 if(!server_public_key)
209 throw Internal_Error("No server public key for RSA exchange");
210
211 if(auto rsa_pub = dynamic_cast<const RSA_PublicKey*>(server_public_key))
212 {
213 const Protocol_Version offered_version = state.client_hello()->version();
214
215 rng.random_vec(m_pre_master, 48);
216 m_pre_master[0] = offered_version.major_version();
217 m_pre_master[1] = offered_version.minor_version();
218
219 PK_Encryptor_EME encryptor(*rsa_pub, rng, "PKCS1v15");
220
221 const std::vector<uint8_t> encrypted_key = encryptor.encrypt(m_pre_master, rng);
222
223 append_tls_length_value(m_key_material, encrypted_key, 2);
224 }
225 else
226 throw TLS_Exception(Alert::HANDSHAKE_FAILURE,
227 "Expected a RSA key in server cert but got " +
228 server_public_key->algo_name());
229 }
230
231 state.hash().update(io.send(*this));
232 }
233
234 /*
235 * Read a Client Key Exchange message
236 */
Client_Key_Exchange(const std::vector<uint8_t> & contents,const Handshake_State & state,const Private_Key * server_rsa_kex_key,Credentials_Manager & creds,const Policy & policy,RandomNumberGenerator & rng)237 Client_Key_Exchange::Client_Key_Exchange(const std::vector<uint8_t>& contents,
238 const Handshake_State& state,
239 const Private_Key* server_rsa_kex_key,
240 Credentials_Manager& creds,
241 const Policy& policy,
242 RandomNumberGenerator& rng)
243 {
244 const Kex_Algo kex_algo = state.ciphersuite().kex_method();
245
246 if(kex_algo == Kex_Algo::STATIC_RSA)
247 {
248 BOTAN_ASSERT(state.server_certs() && !state.server_certs()->cert_chain().empty(),
249 "RSA key exchange negotiated so server sent a certificate");
250
251 if(!server_rsa_kex_key)
252 throw Internal_Error("Expected RSA kex but no server kex key set");
253
254 if(!dynamic_cast<const RSA_PrivateKey*>(server_rsa_kex_key))
255 throw Internal_Error("Expected RSA key but got " + server_rsa_kex_key->algo_name());
256
257 TLS_Data_Reader reader("ClientKeyExchange", contents);
258 const std::vector<uint8_t> encrypted_pre_master = reader.get_range<uint8_t>(2, 0, 65535);
259 reader.assert_done();
260
261 PK_Decryptor_EME decryptor(*server_rsa_kex_key, rng, "PKCS1v15");
262
263 const uint8_t client_major = state.client_hello()->version().major_version();
264 const uint8_t client_minor = state.client_hello()->version().minor_version();
265
266 /*
267 * PK_Decryptor::decrypt_or_random will return a random value if
268 * either the length does not match the expected value or if the
269 * version number embedded in the PMS does not match the one sent
270 * in the client hello.
271 */
272 const size_t expected_plaintext_size = 48;
273 const size_t expected_content_size = 2;
274 const uint8_t expected_content_bytes[expected_content_size] = { client_major, client_minor };
275 const uint8_t expected_content_pos[expected_content_size] = { 0, 1 };
276
277 m_pre_master =
278 decryptor.decrypt_or_random(encrypted_pre_master.data(),
279 encrypted_pre_master.size(),
280 expected_plaintext_size,
281 rng,
282 expected_content_bytes,
283 expected_content_pos,
284 expected_content_size);
285 }
286 else
287 {
288 TLS_Data_Reader reader("ClientKeyExchange", contents);
289
290 SymmetricKey psk;
291
292 if(key_exchange_is_psk(kex_algo))
293 {
294 const std::string psk_identity = reader.get_string(2, 0, 65535);
295
296 psk = creds.psk("tls-server",
297 state.client_hello()->sni_hostname(),
298 psk_identity);
299
300 if(psk.length() == 0)
301 {
302 if(policy.hide_unknown_users())
303 psk = SymmetricKey(rng, 16);
304 else
305 throw TLS_Exception(Alert::UNKNOWN_PSK_IDENTITY,
306 "No PSK for identifier " + psk_identity);
307 }
308 }
309
310 if(kex_algo == Kex_Algo::PSK)
311 {
312 std::vector<uint8_t> zeros(psk.length());
313 append_tls_length_value(m_pre_master, zeros, 2);
314 append_tls_length_value(m_pre_master, psk.bits_of(), 2);
315 }
316 #if defined(BOTAN_HAS_SRP6)
317 else if(kex_algo == Kex_Algo::SRP_SHA)
318 {
319 SRP6_Server_Session& srp = state.server_kex()->server_srp_params();
320
321 m_pre_master = srp.step2(BigInt::decode(reader.get_range<uint8_t>(2, 0, 65535))).bits_of();
322 }
323 #endif
324 #if defined(BOTAN_HAS_CECPQ1)
325 else if(kex_algo == Kex_Algo::CECPQ1)
326 {
327 const CECPQ1_key& cecpq1_offer = state.server_kex()->cecpq1_key();
328
329 const std::vector<uint8_t> cecpq1_accept = reader.get_range<uint8_t>(2, 0, 65535);
330 if(cecpq1_accept.size() != CECPQ1_ACCEPT_BYTES)
331 throw Decoding_Error("Invalid size for CECPQ1 accept message");
332
333 m_pre_master.resize(CECPQ1_SHARED_KEY_BYTES);
334 CECPQ1_finish(m_pre_master.data(), cecpq1_offer, cecpq1_accept.data());
335 }
336 #endif
337 else if(kex_algo == Kex_Algo::DH ||
338 kex_algo == Kex_Algo::DHE_PSK ||
339 kex_algo == Kex_Algo::ECDH ||
340 kex_algo == Kex_Algo::ECDHE_PSK)
341 {
342 const Private_Key& private_key = state.server_kex()->server_kex_key();
343
344 const PK_Key_Agreement_Key* ka_key =
345 dynamic_cast<const PK_Key_Agreement_Key*>(&private_key);
346
347 if(!ka_key)
348 throw Internal_Error("Expected key agreement key type but got " +
349 private_key.algo_name());
350
351 std::vector<uint8_t> client_pubkey;
352
353 if(ka_key->algo_name() == "DH")
354 {
355 client_pubkey = reader.get_range<uint8_t>(2, 0, 65535);
356 }
357 else
358 {
359 client_pubkey = reader.get_range<uint8_t>(1, 1, 255);
360 }
361
362 try
363 {
364 PK_Key_Agreement ka(*ka_key, rng, "Raw");
365
366 secure_vector<uint8_t> shared_secret = ka.derive_key(0, client_pubkey).bits_of();
367
368 if(ka_key->algo_name() == "DH")
369 shared_secret = CT::strip_leading_zeros(shared_secret);
370
371 if(kex_algo == Kex_Algo::DHE_PSK ||
372 kex_algo == Kex_Algo::ECDHE_PSK)
373 {
374 append_tls_length_value(m_pre_master, shared_secret, 2);
375 append_tls_length_value(m_pre_master, psk.bits_of(), 2);
376 }
377 else
378 m_pre_master = shared_secret;
379 }
380 catch(Invalid_Argument& e)
381 {
382 throw TLS_Exception(Alert::ILLEGAL_PARAMETER, e.what());
383 }
384 catch(std::exception&)
385 {
386 /*
387 * Something failed in the DH/ECDH computation. To avoid possible
388 * attacks which are based on triggering and detecting some edge
389 * failure condition, randomize the pre-master output and carry on,
390 * allowing the protocol to fail later in the finished checks.
391 */
392 rng.random_vec(m_pre_master, ka_key->public_value().size());
393 }
394
395 reader.assert_done();
396 }
397 else
398 throw Internal_Error("Client_Key_Exchange: Unknown key exchange negotiated");
399 }
400 }
401
402 }
403
404 }
405