tlsv1_server_read.c revision 281806
1/*
2 * TLSv1 server - read handshake message
3 * Copyright (c) 2006-2014, Jouni Malinen <j@w1.fi>
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9#include "includes.h"
10
11#include "common.h"
12#include "crypto/md5.h"
13#include "crypto/sha1.h"
14#include "crypto/sha256.h"
15#include "crypto/tls.h"
16#include "x509v3.h"
17#include "tlsv1_common.h"
18#include "tlsv1_record.h"
19#include "tlsv1_server.h"
20#include "tlsv1_server_i.h"
21
22
23static int tls_process_client_key_exchange(struct tlsv1_server *conn, u8 ct,
24					   const u8 *in_data, size_t *in_len);
25static int tls_process_change_cipher_spec(struct tlsv1_server *conn,
26					  u8 ct, const u8 *in_data,
27					  size_t *in_len);
28
29
30static int testing_cipher_suite_filter(struct tlsv1_server *conn, u16 suite)
31{
32#ifdef CONFIG_TESTING_OPTIONS
33	if ((conn->test_flags &
34	     (TLS_BREAK_SRV_KEY_X_HASH | TLS_BREAK_SRV_KEY_X_SIGNATURE |
35	      TLS_DHE_PRIME_511B | TLS_DHE_PRIME_767B | TLS_DHE_PRIME_15 |
36	      TLS_DHE_PRIME_58B | TLS_DHE_NON_PRIME)) &&
37	    suite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 &&
38	    suite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA &&
39	    suite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 &&
40	    suite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA &&
41	    suite != TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA)
42		return 1;
43#endif /* CONFIG_TESTING_OPTIONS */
44
45	return 0;
46}
47
48
49static int tls_process_client_hello(struct tlsv1_server *conn, u8 ct,
50				    const u8 *in_data, size_t *in_len)
51{
52	const u8 *pos, *end, *c;
53	size_t left, len, i, j;
54	u16 cipher_suite;
55	u16 num_suites;
56	int compr_null_found;
57	u16 ext_type, ext_len;
58
59	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
60		tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
61				 ct);
62		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
63				   TLS_ALERT_UNEXPECTED_MESSAGE);
64		return -1;
65	}
66
67	pos = in_data;
68	left = *in_len;
69
70	if (left < 4)
71		goto decode_error;
72
73	/* HandshakeType msg_type */
74	if (*pos != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) {
75		tlsv1_server_log(conn, "Received unexpected handshake message %d (expected ClientHello)",
76				 *pos);
77		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
78				   TLS_ALERT_UNEXPECTED_MESSAGE);
79		return -1;
80	}
81	tlsv1_server_log(conn, "Received ClientHello");
82	pos++;
83	/* uint24 length */
84	len = WPA_GET_BE24(pos);
85	pos += 3;
86	left -= 4;
87
88	if (len > left)
89		goto decode_error;
90
91	/* body - ClientHello */
92
93	wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientHello", pos, len);
94	end = pos + len;
95
96	/* ProtocolVersion client_version */
97	if (end - pos < 2)
98		goto decode_error;
99	conn->client_version = WPA_GET_BE16(pos);
100	tlsv1_server_log(conn, "Client version %d.%d",
101			 conn->client_version >> 8,
102			 conn->client_version & 0xff);
103	if (conn->client_version < TLS_VERSION_1) {
104		tlsv1_server_log(conn, "Unexpected protocol version in ClientHello %u.%u",
105				 conn->client_version >> 8,
106				 conn->client_version & 0xff);
107		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
108				   TLS_ALERT_PROTOCOL_VERSION);
109		return -1;
110	}
111	pos += 2;
112
113	if (TLS_VERSION == TLS_VERSION_1)
114		conn->rl.tls_version = TLS_VERSION_1;
115#ifdef CONFIG_TLSV12
116	else if (conn->client_version >= TLS_VERSION_1_2)
117		conn->rl.tls_version = TLS_VERSION_1_2;
118#endif /* CONFIG_TLSV12 */
119	else if (conn->client_version > TLS_VERSION_1_1)
120		conn->rl.tls_version = TLS_VERSION_1_1;
121	else
122		conn->rl.tls_version = conn->client_version;
123	tlsv1_server_log(conn, "Using TLS v%s",
124			 tls_version_str(conn->rl.tls_version));
125
126	/* Random random */
127	if (end - pos < TLS_RANDOM_LEN)
128		goto decode_error;
129
130	os_memcpy(conn->client_random, pos, TLS_RANDOM_LEN);
131	pos += TLS_RANDOM_LEN;
132	wpa_hexdump(MSG_MSGDUMP, "TLSv1: client_random",
133		    conn->client_random, TLS_RANDOM_LEN);
134
135	/* SessionID session_id */
136	if (end - pos < 1)
137		goto decode_error;
138	if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN)
139		goto decode_error;
140	wpa_hexdump(MSG_MSGDUMP, "TLSv1: client session_id", pos + 1, *pos);
141	pos += 1 + *pos;
142	/* TODO: add support for session resumption */
143
144	/* CipherSuite cipher_suites<2..2^16-1> */
145	if (end - pos < 2)
146		goto decode_error;
147	num_suites = WPA_GET_BE16(pos);
148	pos += 2;
149	if (end - pos < num_suites)
150		goto decode_error;
151	wpa_hexdump(MSG_MSGDUMP, "TLSv1: client cipher suites",
152		    pos, num_suites);
153	if (num_suites & 1)
154		goto decode_error;
155	num_suites /= 2;
156
157	cipher_suite = 0;
158	for (i = 0; !cipher_suite && i < conn->num_cipher_suites; i++) {
159		if (testing_cipher_suite_filter(conn, conn->cipher_suites[i]))
160			continue;
161		c = pos;
162		for (j = 0; j < num_suites; j++) {
163			u16 tmp = WPA_GET_BE16(c);
164			c += 2;
165			if (!cipher_suite && tmp == conn->cipher_suites[i]) {
166				cipher_suite = tmp;
167				break;
168			}
169		}
170	}
171	pos += num_suites * 2;
172	if (!cipher_suite) {
173		tlsv1_server_log(conn, "No supported cipher suite available");
174		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
175				   TLS_ALERT_ILLEGAL_PARAMETER);
176		return -1;
177	}
178
179	if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) {
180		wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for "
181			   "record layer");
182		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
183				   TLS_ALERT_INTERNAL_ERROR);
184		return -1;
185	}
186
187	conn->cipher_suite = cipher_suite;
188
189	/* CompressionMethod compression_methods<1..2^8-1> */
190	if (end - pos < 1)
191		goto decode_error;
192	num_suites = *pos++;
193	if (end - pos < num_suites)
194		goto decode_error;
195	wpa_hexdump(MSG_MSGDUMP, "TLSv1: client compression_methods",
196		    pos, num_suites);
197	compr_null_found = 0;
198	for (i = 0; i < num_suites; i++) {
199		if (*pos++ == TLS_COMPRESSION_NULL)
200			compr_null_found = 1;
201	}
202	if (!compr_null_found) {
203		tlsv1_server_log(conn, "Client does not accept NULL compression");
204		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
205				   TLS_ALERT_ILLEGAL_PARAMETER);
206		return -1;
207	}
208
209	if (end - pos == 1) {
210		tlsv1_server_log(conn, "Unexpected extra octet in the end of ClientHello: 0x%02x",
211				 *pos);
212		goto decode_error;
213	}
214
215	if (end - pos >= 2) {
216		/* Extension client_hello_extension_list<0..2^16-1> */
217		ext_len = WPA_GET_BE16(pos);
218		pos += 2;
219
220		tlsv1_server_log(conn, "%u bytes of ClientHello extensions",
221				 ext_len);
222		if (end - pos != ext_len) {
223			tlsv1_server_log(conn, "Invalid ClientHello extension list length %u (expected %u)",
224					 ext_len, (unsigned int) (end - pos));
225			goto decode_error;
226		}
227
228		/*
229		 * struct {
230		 *   ExtensionType extension_type (0..65535)
231		 *   opaque extension_data<0..2^16-1>
232		 * } Extension;
233		 */
234
235		while (pos < end) {
236			if (end - pos < 2) {
237				tlsv1_server_log(conn, "Invalid extension_type field");
238				goto decode_error;
239			}
240
241			ext_type = WPA_GET_BE16(pos);
242			pos += 2;
243
244			if (end - pos < 2) {
245				tlsv1_server_log(conn, "Invalid extension_data length field");
246				goto decode_error;
247			}
248
249			ext_len = WPA_GET_BE16(pos);
250			pos += 2;
251
252			if (end - pos < ext_len) {
253				tlsv1_server_log(conn, "Invalid extension_data field");
254				goto decode_error;
255			}
256
257			tlsv1_server_log(conn, "ClientHello Extension type %u",
258					 ext_type);
259			wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientHello "
260				    "Extension data", pos, ext_len);
261
262			if (ext_type == TLS_EXT_SESSION_TICKET) {
263				os_free(conn->session_ticket);
264				conn->session_ticket = os_malloc(ext_len);
265				if (conn->session_ticket) {
266					os_memcpy(conn->session_ticket, pos,
267						  ext_len);
268					conn->session_ticket_len = ext_len;
269				}
270			}
271
272			pos += ext_len;
273		}
274	}
275
276	*in_len = end - in_data;
277
278	tlsv1_server_log(conn, "ClientHello OK - proceed to ServerHello");
279	conn->state = SERVER_HELLO;
280
281	return 0;
282
283decode_error:
284	tlsv1_server_log(conn, "Failed to decode ClientHello");
285	tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
286			   TLS_ALERT_DECODE_ERROR);
287	return -1;
288}
289
290
291static int tls_process_certificate(struct tlsv1_server *conn, u8 ct,
292				   const u8 *in_data, size_t *in_len)
293{
294	const u8 *pos, *end;
295	size_t left, len, list_len, cert_len, idx;
296	u8 type;
297	struct x509_certificate *chain = NULL, *last = NULL, *cert;
298	int reason;
299
300	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
301		tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
302				 ct);
303		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
304				   TLS_ALERT_UNEXPECTED_MESSAGE);
305		return -1;
306	}
307
308	pos = in_data;
309	left = *in_len;
310
311	if (left < 4) {
312		tlsv1_server_log(conn, "Too short Certificate message (len=%lu)",
313				 (unsigned long) left);
314		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
315				   TLS_ALERT_DECODE_ERROR);
316		return -1;
317	}
318
319	type = *pos++;
320	len = WPA_GET_BE24(pos);
321	pos += 3;
322	left -= 4;
323
324	if (len > left) {
325		tlsv1_server_log(conn, "Unexpected Certificate message length (len=%lu != left=%lu)",
326				 (unsigned long) len, (unsigned long) left);
327		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
328				   TLS_ALERT_DECODE_ERROR);
329		return -1;
330	}
331
332	if (type == TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE) {
333		if (conn->verify_peer) {
334			tlsv1_server_log(conn, "Client did not include Certificate");
335			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
336					   TLS_ALERT_UNEXPECTED_MESSAGE);
337			return -1;
338		}
339
340		return tls_process_client_key_exchange(conn, ct, in_data,
341						       in_len);
342	}
343	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) {
344		tlsv1_server_log(conn, "Received unexpected handshake message %d (expected Certificate/ClientKeyExchange)",
345				 type);
346		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
347				   TLS_ALERT_UNEXPECTED_MESSAGE);
348		return -1;
349	}
350
351	tlsv1_server_log(conn, "Received Certificate (certificate_list len %lu)",
352			 (unsigned long) len);
353
354	/*
355	 * opaque ASN.1Cert<2^24-1>;
356	 *
357	 * struct {
358	 *     ASN.1Cert certificate_list<1..2^24-1>;
359	 * } Certificate;
360	 */
361
362	end = pos + len;
363
364	if (end - pos < 3) {
365		tlsv1_server_log(conn, "Too short Certificate (left=%lu)",
366				 (unsigned long) left);
367		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
368				   TLS_ALERT_DECODE_ERROR);
369		return -1;
370	}
371
372	list_len = WPA_GET_BE24(pos);
373	pos += 3;
374
375	if ((size_t) (end - pos) != list_len) {
376		tlsv1_server_log(conn, "Unexpected certificate_list length (len=%lu left=%lu)",
377				 (unsigned long) list_len,
378				 (unsigned long) (end - pos));
379		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
380				   TLS_ALERT_DECODE_ERROR);
381		return -1;
382	}
383
384	idx = 0;
385	while (pos < end) {
386		if (end - pos < 3) {
387			tlsv1_server_log(conn, "Failed to parse certificate_list");
388			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
389					   TLS_ALERT_DECODE_ERROR);
390			x509_certificate_chain_free(chain);
391			return -1;
392		}
393
394		cert_len = WPA_GET_BE24(pos);
395		pos += 3;
396
397		if ((size_t) (end - pos) < cert_len) {
398			tlsv1_server_log(conn, "Unexpected certificate length (len=%lu left=%lu)",
399					 (unsigned long) cert_len,
400					 (unsigned long) (end - pos));
401			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
402					   TLS_ALERT_DECODE_ERROR);
403			x509_certificate_chain_free(chain);
404			return -1;
405		}
406
407		tlsv1_server_log(conn, "Certificate %lu (len %lu)",
408				 (unsigned long) idx, (unsigned long) cert_len);
409
410		if (idx == 0) {
411			crypto_public_key_free(conn->client_rsa_key);
412			if (tls_parse_cert(pos, cert_len,
413					   &conn->client_rsa_key)) {
414				tlsv1_server_log(conn, "Failed to parse the certificate");
415				tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
416						   TLS_ALERT_BAD_CERTIFICATE);
417				x509_certificate_chain_free(chain);
418				return -1;
419			}
420		}
421
422		cert = x509_certificate_parse(pos, cert_len);
423		if (cert == NULL) {
424			tlsv1_server_log(conn, "Failed to parse the certificate");
425			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
426					   TLS_ALERT_BAD_CERTIFICATE);
427			x509_certificate_chain_free(chain);
428			return -1;
429		}
430
431		if (last == NULL)
432			chain = cert;
433		else
434			last->next = cert;
435		last = cert;
436
437		idx++;
438		pos += cert_len;
439	}
440
441	if (x509_certificate_chain_validate(conn->cred->trusted_certs, chain,
442					    &reason, 0) < 0) {
443		int tls_reason;
444		tlsv1_server_log(conn, "Server certificate chain validation failed (reason=%d)",
445				 reason);
446		switch (reason) {
447		case X509_VALIDATE_BAD_CERTIFICATE:
448			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
449			break;
450		case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:
451			tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;
452			break;
453		case X509_VALIDATE_CERTIFICATE_REVOKED:
454			tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;
455			break;
456		case X509_VALIDATE_CERTIFICATE_EXPIRED:
457			tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;
458			break;
459		case X509_VALIDATE_CERTIFICATE_UNKNOWN:
460			tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;
461			break;
462		case X509_VALIDATE_UNKNOWN_CA:
463			tls_reason = TLS_ALERT_UNKNOWN_CA;
464			break;
465		default:
466			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
467			break;
468		}
469		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);
470		x509_certificate_chain_free(chain);
471		return -1;
472	}
473
474	x509_certificate_chain_free(chain);
475
476	*in_len = end - in_data;
477
478	conn->state = CLIENT_KEY_EXCHANGE;
479
480	return 0;
481}
482
483
484static int tls_process_client_key_exchange_rsa(
485	struct tlsv1_server *conn, const u8 *pos, const u8 *end)
486{
487	u8 *out;
488	size_t outlen, outbuflen;
489	u16 encr_len;
490	int res;
491	int use_random = 0;
492
493	if (end - pos < 2) {
494		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
495				   TLS_ALERT_DECODE_ERROR);
496		return -1;
497	}
498
499	encr_len = WPA_GET_BE16(pos);
500	pos += 2;
501	if (pos + encr_len > end) {
502		tlsv1_server_log(conn, "Invalid ClientKeyExchange format: encr_len=%u left=%u",
503				 encr_len, (unsigned int) (end - pos));
504		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
505				   TLS_ALERT_DECODE_ERROR);
506		return -1;
507	}
508
509	outbuflen = outlen = end - pos;
510	out = os_malloc(outlen >= TLS_PRE_MASTER_SECRET_LEN ?
511			outlen : TLS_PRE_MASTER_SECRET_LEN);
512	if (out == NULL) {
513		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
514				   TLS_ALERT_INTERNAL_ERROR);
515		return -1;
516	}
517
518	/*
519	 * struct {
520	 *   ProtocolVersion client_version;
521	 *   opaque random[46];
522	 * } PreMasterSecret;
523	 *
524	 * struct {
525	 *   public-key-encrypted PreMasterSecret pre_master_secret;
526	 * } EncryptedPreMasterSecret;
527	 */
528
529	/*
530	 * Note: To avoid Bleichenbacher attack, we do not report decryption or
531	 * parsing errors from EncryptedPreMasterSecret processing to the
532	 * client. Instead, a random pre-master secret is used to force the
533	 * handshake to fail.
534	 */
535
536	if (crypto_private_key_decrypt_pkcs1_v15(conn->cred->key,
537						 pos, encr_len,
538						 out, &outlen) < 0) {
539		wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt "
540			   "PreMasterSecret (encr_len=%u outlen=%lu)",
541			   encr_len, (unsigned long) outlen);
542		use_random = 1;
543	}
544
545	if (!use_random && outlen != TLS_PRE_MASTER_SECRET_LEN) {
546		tlsv1_server_log(conn, "Unexpected PreMasterSecret length %lu",
547				 (unsigned long) outlen);
548		use_random = 1;
549	}
550
551	if (!use_random && WPA_GET_BE16(out) != conn->client_version) {
552		tlsv1_server_log(conn, "Client version in ClientKeyExchange does not match with version in ClientHello");
553		use_random = 1;
554	}
555
556	if (use_random) {
557		wpa_printf(MSG_DEBUG, "TLSv1: Using random premaster secret "
558			   "to avoid revealing information about private key");
559		outlen = TLS_PRE_MASTER_SECRET_LEN;
560		if (os_get_random(out, outlen)) {
561			wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random "
562				   "data");
563			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
564					   TLS_ALERT_INTERNAL_ERROR);
565			os_free(out);
566			return -1;
567		}
568	}
569
570	res = tlsv1_server_derive_keys(conn, out, outlen);
571
572	/* Clear the pre-master secret since it is not needed anymore */
573	os_memset(out, 0, outbuflen);
574	os_free(out);
575
576	if (res) {
577		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
578		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
579				   TLS_ALERT_INTERNAL_ERROR);
580		return -1;
581	}
582
583	return 0;
584}
585
586
587static int tls_process_client_key_exchange_dh(
588	struct tlsv1_server *conn, const u8 *pos, const u8 *end)
589{
590	const u8 *dh_yc;
591	u16 dh_yc_len;
592	u8 *shared;
593	size_t shared_len;
594	int res;
595	const u8 *dh_p;
596	size_t dh_p_len;
597
598	/*
599	 * struct {
600	 *   select (PublicValueEncoding) {
601	 *     case implicit: struct { };
602	 *     case explicit: opaque dh_Yc<1..2^16-1>;
603	 *   } dh_public;
604	 * } ClientDiffieHellmanPublic;
605	 */
606
607	tlsv1_server_log(conn, "ClientDiffieHellmanPublic received");
608	wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientDiffieHellmanPublic",
609		    pos, end - pos);
610
611	if (end == pos) {
612		wpa_printf(MSG_DEBUG, "TLSv1: Implicit public value encoding "
613			   "not supported");
614		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
615				   TLS_ALERT_INTERNAL_ERROR);
616		return -1;
617	}
618
619	if (end - pos < 3) {
620		tlsv1_server_log(conn, "Invalid client public value length");
621		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
622				   TLS_ALERT_DECODE_ERROR);
623		return -1;
624	}
625
626	dh_yc_len = WPA_GET_BE16(pos);
627	dh_yc = pos + 2;
628
629	if (dh_yc_len > end - dh_yc) {
630		tlsv1_server_log(conn, "Client public value overflow (length %d)",
631				 dh_yc_len);
632		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
633				   TLS_ALERT_DECODE_ERROR);
634		return -1;
635	}
636
637	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Yc (client's public value)",
638		    dh_yc, dh_yc_len);
639
640	if (conn->cred == NULL || conn->cred->dh_p == NULL ||
641	    conn->dh_secret == NULL) {
642		wpa_printf(MSG_DEBUG, "TLSv1: No DH parameters available");
643		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
644				   TLS_ALERT_INTERNAL_ERROR);
645		return -1;
646	}
647
648	tlsv1_server_get_dh_p(conn, &dh_p, &dh_p_len);
649
650	shared_len = dh_p_len;
651	shared = os_malloc(shared_len);
652	if (shared == NULL) {
653		wpa_printf(MSG_DEBUG, "TLSv1: Could not allocate memory for "
654			   "DH");
655		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
656				   TLS_ALERT_INTERNAL_ERROR);
657		return -1;
658	}
659
660	/* shared = Yc^secret mod p */
661	if (crypto_mod_exp(dh_yc, dh_yc_len, conn->dh_secret,
662			   conn->dh_secret_len, dh_p, dh_p_len,
663			   shared, &shared_len)) {
664		os_free(shared);
665		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
666				   TLS_ALERT_INTERNAL_ERROR);
667		return -1;
668	}
669	wpa_hexdump_key(MSG_DEBUG, "TLSv1: Shared secret from DH key exchange",
670			shared, shared_len);
671
672	os_memset(conn->dh_secret, 0, conn->dh_secret_len);
673	os_free(conn->dh_secret);
674	conn->dh_secret = NULL;
675
676	res = tlsv1_server_derive_keys(conn, shared, shared_len);
677
678	/* Clear the pre-master secret since it is not needed anymore */
679	os_memset(shared, 0, shared_len);
680	os_free(shared);
681
682	if (res) {
683		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
684		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
685				   TLS_ALERT_INTERNAL_ERROR);
686		return -1;
687	}
688
689	return 0;
690}
691
692
693static int tls_process_client_key_exchange(struct tlsv1_server *conn, u8 ct,
694					   const u8 *in_data, size_t *in_len)
695{
696	const u8 *pos, *end;
697	size_t left, len;
698	u8 type;
699	tls_key_exchange keyx;
700	const struct tls_cipher_suite *suite;
701
702	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
703		tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
704				 ct);
705		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
706				   TLS_ALERT_UNEXPECTED_MESSAGE);
707		return -1;
708	}
709
710	pos = in_data;
711	left = *in_len;
712
713	if (left < 4) {
714		tlsv1_server_log(conn, "Too short ClientKeyExchange (Left=%lu)",
715				 (unsigned long) left);
716		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
717				   TLS_ALERT_DECODE_ERROR);
718		return -1;
719	}
720
721	type = *pos++;
722	len = WPA_GET_BE24(pos);
723	pos += 3;
724	left -= 4;
725
726	if (len > left) {
727		tlsv1_server_log(conn, "Mismatch in ClientKeyExchange length (len=%lu != left=%lu)",
728				 (unsigned long) len, (unsigned long) left);
729		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
730				   TLS_ALERT_DECODE_ERROR);
731		return -1;
732	}
733
734	end = pos + len;
735
736	if (type != TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE) {
737		tlsv1_server_log(conn, "Received unexpected handshake message %d (expected ClientKeyExchange)",
738				 type);
739		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
740				   TLS_ALERT_UNEXPECTED_MESSAGE);
741		return -1;
742	}
743
744	tlsv1_server_log(conn, "Received ClientKeyExchange");
745
746	wpa_hexdump(MSG_DEBUG, "TLSv1: ClientKeyExchange", pos, len);
747
748	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
749	if (suite == NULL)
750		keyx = TLS_KEY_X_NULL;
751	else
752		keyx = suite->key_exchange;
753
754	if ((keyx == TLS_KEY_X_DH_anon || keyx == TLS_KEY_X_DHE_RSA) &&
755	    tls_process_client_key_exchange_dh(conn, pos, end) < 0)
756		return -1;
757
758	if (keyx != TLS_KEY_X_DH_anon && keyx != TLS_KEY_X_DHE_RSA &&
759	    tls_process_client_key_exchange_rsa(conn, pos, end) < 0)
760		return -1;
761
762	*in_len = end - in_data;
763
764	conn->state = CERTIFICATE_VERIFY;
765
766	return 0;
767}
768
769
770static int tls_process_certificate_verify(struct tlsv1_server *conn, u8 ct,
771					  const u8 *in_data, size_t *in_len)
772{
773	const u8 *pos, *end;
774	size_t left, len;
775	u8 type;
776	size_t hlen;
777	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN], *hpos;
778	u8 alert;
779
780	if (ct == TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
781		if (conn->verify_peer) {
782			tlsv1_server_log(conn, "Client did not include CertificateVerify");
783			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
784					   TLS_ALERT_UNEXPECTED_MESSAGE);
785			return -1;
786		}
787
788		return tls_process_change_cipher_spec(conn, ct, in_data,
789						      in_len);
790	}
791
792	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
793		tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
794				 ct);
795		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
796				   TLS_ALERT_UNEXPECTED_MESSAGE);
797		return -1;
798	}
799
800	pos = in_data;
801	left = *in_len;
802
803	if (left < 4) {
804		tlsv1_server_log(conn, "Too short CertificateVerify message (len=%lu)",
805				 (unsigned long) left);
806		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
807				   TLS_ALERT_DECODE_ERROR);
808		return -1;
809	}
810
811	type = *pos++;
812	len = WPA_GET_BE24(pos);
813	pos += 3;
814	left -= 4;
815
816	if (len > left) {
817		tlsv1_server_log(conn, "Unexpected CertificateVerify message length (len=%lu != left=%lu)",
818				 (unsigned long) len, (unsigned long) left);
819		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
820				   TLS_ALERT_DECODE_ERROR);
821		return -1;
822	}
823
824	end = pos + len;
825
826	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY) {
827		tlsv1_server_log(conn, "Received unexpected handshake message %d (expected CertificateVerify)",
828				 type);
829		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
830				   TLS_ALERT_UNEXPECTED_MESSAGE);
831		return -1;
832	}
833
834	tlsv1_server_log(conn, "Received CertificateVerify");
835
836	/*
837	 * struct {
838	 *   Signature signature;
839	 * } CertificateVerify;
840	 */
841
842	hpos = hash;
843
844#ifdef CONFIG_TLSV12
845	if (conn->rl.tls_version == TLS_VERSION_1_2) {
846		/*
847		 * RFC 5246, 4.7:
848		 * TLS v1.2 adds explicit indication of the used signature and
849		 * hash algorithms.
850		 *
851		 * struct {
852		 *   HashAlgorithm hash;
853		 *   SignatureAlgorithm signature;
854		 * } SignatureAndHashAlgorithm;
855		 */
856		if (end - pos < 2) {
857			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
858					   TLS_ALERT_DECODE_ERROR);
859			return -1;
860		}
861		if (pos[0] != TLS_HASH_ALG_SHA256 ||
862		    pos[1] != TLS_SIGN_ALG_RSA) {
863			wpa_printf(MSG_DEBUG, "TLSv1.2: Unsupported hash(%u)/"
864				   "signature(%u) algorithm",
865				   pos[0], pos[1]);
866			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
867					   TLS_ALERT_INTERNAL_ERROR);
868			return -1;
869		}
870		pos += 2;
871
872		hlen = SHA256_MAC_LEN;
873		if (conn->verify.sha256_cert == NULL ||
874		    crypto_hash_finish(conn->verify.sha256_cert, hpos, &hlen) <
875		    0) {
876			conn->verify.sha256_cert = NULL;
877			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
878					   TLS_ALERT_INTERNAL_ERROR);
879			return -1;
880		}
881		conn->verify.sha256_cert = NULL;
882	} else {
883#endif /* CONFIG_TLSV12 */
884
885	hlen = MD5_MAC_LEN;
886	if (conn->verify.md5_cert == NULL ||
887	    crypto_hash_finish(conn->verify.md5_cert, hpos, &hlen) < 0) {
888		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
889				   TLS_ALERT_INTERNAL_ERROR);
890		conn->verify.md5_cert = NULL;
891		crypto_hash_finish(conn->verify.sha1_cert, NULL, NULL);
892		conn->verify.sha1_cert = NULL;
893		return -1;
894	}
895	hpos += MD5_MAC_LEN;
896
897	conn->verify.md5_cert = NULL;
898	hlen = SHA1_MAC_LEN;
899	if (conn->verify.sha1_cert == NULL ||
900	    crypto_hash_finish(conn->verify.sha1_cert, hpos, &hlen) < 0) {
901		conn->verify.sha1_cert = NULL;
902		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
903				   TLS_ALERT_INTERNAL_ERROR);
904		return -1;
905	}
906	conn->verify.sha1_cert = NULL;
907
908	hlen += MD5_MAC_LEN;
909
910#ifdef CONFIG_TLSV12
911	}
912#endif /* CONFIG_TLSV12 */
913
914	wpa_hexdump(MSG_MSGDUMP, "TLSv1: CertificateVerify hash", hash, hlen);
915
916	if (tls_verify_signature(conn->rl.tls_version, conn->client_rsa_key,
917				 hash, hlen, pos, end - pos, &alert) < 0) {
918		tlsv1_server_log(conn, "Invalid Signature in CertificateVerify");
919		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, alert);
920		return -1;
921	}
922
923	*in_len = end - in_data;
924
925	conn->state = CHANGE_CIPHER_SPEC;
926
927	return 0;
928}
929
930
931static int tls_process_change_cipher_spec(struct tlsv1_server *conn,
932					  u8 ct, const u8 *in_data,
933					  size_t *in_len)
934{
935	const u8 *pos;
936	size_t left;
937
938	if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
939		tlsv1_server_log(conn, "Expected ChangeCipherSpec; received content type 0x%x",
940				 ct);
941		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
942				   TLS_ALERT_UNEXPECTED_MESSAGE);
943		return -1;
944	}
945
946	pos = in_data;
947	left = *in_len;
948
949	if (left < 1) {
950		tlsv1_server_log(conn, "Too short ChangeCipherSpec");
951		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
952				   TLS_ALERT_DECODE_ERROR);
953		return -1;
954	}
955
956	if (*pos != TLS_CHANGE_CIPHER_SPEC) {
957		tlsv1_server_log(conn, "Expected ChangeCipherSpec; received data 0x%x",
958				 *pos);
959		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
960				   TLS_ALERT_UNEXPECTED_MESSAGE);
961		return -1;
962	}
963
964	tlsv1_server_log(conn, "Received ChangeCipherSpec");
965	if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
966		wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
967			   "for record layer");
968		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
969				   TLS_ALERT_INTERNAL_ERROR);
970		return -1;
971	}
972
973	*in_len = pos + 1 - in_data;
974
975	conn->state = CLIENT_FINISHED;
976
977	return 0;
978}
979
980
981static int tls_process_client_finished(struct tlsv1_server *conn, u8 ct,
982				       const u8 *in_data, size_t *in_len)
983{
984	const u8 *pos, *end;
985	size_t left, len, hlen;
986	u8 verify_data[TLS_VERIFY_DATA_LEN];
987	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
988
989#ifdef CONFIG_TESTING_OPTIONS
990	if ((conn->test_flags &
991	     (TLS_BREAK_SRV_KEY_X_HASH | TLS_BREAK_SRV_KEY_X_SIGNATURE)) &&
992	    !conn->test_failure_reported) {
993		tlsv1_server_log(conn, "TEST-FAILURE: Client Finished received after invalid ServerKeyExchange");
994		conn->test_failure_reported = 1;
995	}
996
997	if ((conn->test_flags & TLS_DHE_PRIME_15) &&
998	    !conn->test_failure_reported) {
999		tlsv1_server_log(conn, "TEST-FAILURE: Client Finished received after bogus DHE \"prime\" 15");
1000		conn->test_failure_reported = 1;
1001	}
1002
1003	if ((conn->test_flags & TLS_DHE_PRIME_58B) &&
1004	    !conn->test_failure_reported) {
1005		tlsv1_server_log(conn, "TEST-FAILURE: Client Finished received after short 58-bit DHE prime in long container");
1006		conn->test_failure_reported = 1;
1007	}
1008
1009	if ((conn->test_flags & TLS_DHE_PRIME_511B) &&
1010	    !conn->test_failure_reported) {
1011		tlsv1_server_log(conn, "TEST-WARNING: Client Finished received after short 511-bit DHE prime (insecure)");
1012		conn->test_failure_reported = 1;
1013	}
1014
1015	if ((conn->test_flags & TLS_DHE_PRIME_767B) &&
1016	    !conn->test_failure_reported) {
1017		tlsv1_server_log(conn, "TEST-NOTE: Client Finished received after 767-bit DHE prime (relatively insecure)");
1018		conn->test_failure_reported = 1;
1019	}
1020
1021	if ((conn->test_flags & TLS_DHE_NON_PRIME) &&
1022	    !conn->test_failure_reported) {
1023		tlsv1_server_log(conn, "TEST-NOTE: Client Finished received after non-prime claimed as DHE prime");
1024		conn->test_failure_reported = 1;
1025	}
1026#endif /* CONFIG_TESTING_OPTIONS */
1027
1028	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1029		tlsv1_server_log(conn, "Expected Finished; received content type 0x%x",
1030				 ct);
1031		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1032				   TLS_ALERT_UNEXPECTED_MESSAGE);
1033		return -1;
1034	}
1035
1036	pos = in_data;
1037	left = *in_len;
1038
1039	if (left < 4) {
1040		tlsv1_server_log(conn, "Too short record (left=%lu) forFinished",
1041				 (unsigned long) left);
1042		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1043				   TLS_ALERT_DECODE_ERROR);
1044		return -1;
1045	}
1046
1047	if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
1048		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
1049			   "type 0x%x", pos[0]);
1050		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1051				   TLS_ALERT_UNEXPECTED_MESSAGE);
1052		return -1;
1053	}
1054
1055	len = WPA_GET_BE24(pos + 1);
1056
1057	pos += 4;
1058	left -= 4;
1059
1060	if (len > left) {
1061		tlsv1_server_log(conn, "Too short buffer for Finished (len=%lu > left=%lu)",
1062				 (unsigned long) len, (unsigned long) left);
1063		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1064				   TLS_ALERT_DECODE_ERROR);
1065		return -1;
1066	}
1067	end = pos + len;
1068	if (len != TLS_VERIFY_DATA_LEN) {
1069		tlsv1_server_log(conn, "Unexpected verify_data length in Finished: %lu (expected %d)",
1070				 (unsigned long) len, TLS_VERIFY_DATA_LEN);
1071		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1072				   TLS_ALERT_DECODE_ERROR);
1073		return -1;
1074	}
1075	wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
1076		    pos, TLS_VERIFY_DATA_LEN);
1077
1078#ifdef CONFIG_TLSV12
1079	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
1080		hlen = SHA256_MAC_LEN;
1081		if (conn->verify.sha256_client == NULL ||
1082		    crypto_hash_finish(conn->verify.sha256_client, hash, &hlen)
1083		    < 0) {
1084			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1085					   TLS_ALERT_INTERNAL_ERROR);
1086			conn->verify.sha256_client = NULL;
1087			return -1;
1088		}
1089		conn->verify.sha256_client = NULL;
1090	} else {
1091#endif /* CONFIG_TLSV12 */
1092
1093	hlen = MD5_MAC_LEN;
1094	if (conn->verify.md5_client == NULL ||
1095	    crypto_hash_finish(conn->verify.md5_client, hash, &hlen) < 0) {
1096		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1097				   TLS_ALERT_INTERNAL_ERROR);
1098		conn->verify.md5_client = NULL;
1099		crypto_hash_finish(conn->verify.sha1_client, NULL, NULL);
1100		conn->verify.sha1_client = NULL;
1101		return -1;
1102	}
1103	conn->verify.md5_client = NULL;
1104	hlen = SHA1_MAC_LEN;
1105	if (conn->verify.sha1_client == NULL ||
1106	    crypto_hash_finish(conn->verify.sha1_client, hash + MD5_MAC_LEN,
1107			       &hlen) < 0) {
1108		conn->verify.sha1_client = NULL;
1109		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1110				   TLS_ALERT_INTERNAL_ERROR);
1111		return -1;
1112	}
1113	conn->verify.sha1_client = NULL;
1114	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
1115
1116#ifdef CONFIG_TLSV12
1117	}
1118#endif /* CONFIG_TLSV12 */
1119
1120	if (tls_prf(conn->rl.tls_version,
1121		    conn->master_secret, TLS_MASTER_SECRET_LEN,
1122		    "client finished", hash, hlen,
1123		    verify_data, TLS_VERIFY_DATA_LEN)) {
1124		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
1125		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1126				   TLS_ALERT_DECRYPT_ERROR);
1127		return -1;
1128	}
1129	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (client)",
1130			verify_data, TLS_VERIFY_DATA_LEN);
1131
1132	if (os_memcmp_const(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
1133		tlsv1_server_log(conn, "Mismatch in verify_data");
1134		return -1;
1135	}
1136
1137	tlsv1_server_log(conn, "Received Finished");
1138
1139	*in_len = end - in_data;
1140
1141	if (conn->use_session_ticket) {
1142		/* Abbreviated handshake using session ticket; RFC 4507 */
1143		tlsv1_server_log(conn, "Abbreviated handshake completed successfully");
1144		conn->state = ESTABLISHED;
1145	} else {
1146		/* Full handshake */
1147		conn->state = SERVER_CHANGE_CIPHER_SPEC;
1148	}
1149
1150	return 0;
1151}
1152
1153
1154int tlsv1_server_process_handshake(struct tlsv1_server *conn, u8 ct,
1155				   const u8 *buf, size_t *len)
1156{
1157	if (ct == TLS_CONTENT_TYPE_ALERT) {
1158		if (*len < 2) {
1159			tlsv1_server_log(conn, "Alert underflow");
1160			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1161					   TLS_ALERT_DECODE_ERROR);
1162			return -1;
1163		}
1164		tlsv1_server_log(conn, "Received alert %d:%d", buf[0], buf[1]);
1165		*len = 2;
1166		conn->state = FAILED;
1167		return -1;
1168	}
1169
1170	switch (conn->state) {
1171	case CLIENT_HELLO:
1172		if (tls_process_client_hello(conn, ct, buf, len))
1173			return -1;
1174		break;
1175	case CLIENT_CERTIFICATE:
1176		if (tls_process_certificate(conn, ct, buf, len))
1177			return -1;
1178		break;
1179	case CLIENT_KEY_EXCHANGE:
1180		if (tls_process_client_key_exchange(conn, ct, buf, len))
1181			return -1;
1182		break;
1183	case CERTIFICATE_VERIFY:
1184		if (tls_process_certificate_verify(conn, ct, buf, len))
1185			return -1;
1186		break;
1187	case CHANGE_CIPHER_SPEC:
1188		if (tls_process_change_cipher_spec(conn, ct, buf, len))
1189			return -1;
1190		break;
1191	case CLIENT_FINISHED:
1192		if (tls_process_client_finished(conn, ct, buf, len))
1193			return -1;
1194		break;
1195	default:
1196		tlsv1_server_log(conn, "Unexpected state %d while processing received message",
1197				 conn->state);
1198		return -1;
1199	}
1200
1201	if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
1202		tls_verify_hash_add(&conn->verify, buf, *len);
1203
1204	return 0;
1205}
1206