1/*
2 * TLSv1 client - read handshake message
3 * Copyright (c) 2006-2015, 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_client.h"
20#include "tlsv1_client_i.h"
21
22static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
23					   const u8 *in_data, size_t *in_len);
24static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
25					   const u8 *in_data, size_t *in_len);
26static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
27					 const u8 *in_data, size_t *in_len);
28
29
30static int tls_version_disabled(struct tlsv1_client *conn, u16 ver)
31{
32	return (((conn->flags & TLS_CONN_DISABLE_TLSv1_0) &&
33		 ver == TLS_VERSION_1) ||
34		((conn->flags & TLS_CONN_DISABLE_TLSv1_1) &&
35		 ver == TLS_VERSION_1_1) ||
36		((conn->flags & TLS_CONN_DISABLE_TLSv1_2) &&
37		 ver == TLS_VERSION_1_2));
38}
39
40
41static int tls_process_server_hello_extensions(struct tlsv1_client *conn,
42					       const u8 *pos, size_t len)
43{
44	const u8 *end = pos + len;
45
46	wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello extensions",
47		    pos, len);
48	while (pos < end) {
49		u16 ext, elen;
50
51		if (end - pos < 4) {
52			wpa_printf(MSG_INFO, "TLSv1: Truncated ServerHello extension header");
53			return -1;
54		}
55
56		ext = WPA_GET_BE16(pos);
57		pos += 2;
58		elen = WPA_GET_BE16(pos);
59		pos += 2;
60
61		if (elen > end - pos) {
62			wpa_printf(MSG_INFO, "TLSv1: Truncated ServerHello extension");
63			return -1;
64		}
65
66		wpa_printf(MSG_DEBUG, "TLSv1: ServerHello ExtensionType %u",
67			   ext);
68		wpa_hexdump(MSG_DEBUG, "TLSv1: ServerHello extension data",
69			    pos, elen);
70
71		pos += elen;
72	}
73
74	return 0;
75}
76
77
78static int tls_process_server_hello(struct tlsv1_client *conn, u8 ct,
79				    const u8 *in_data, size_t *in_len)
80{
81	const u8 *pos, *end;
82	size_t left, len, i;
83	u16 cipher_suite;
84	u16 tls_version;
85
86	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
87		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
88			   "received content type 0x%x", ct);
89		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
90			  TLS_ALERT_UNEXPECTED_MESSAGE);
91		return -1;
92	}
93
94	pos = in_data;
95	left = *in_len;
96
97	if (left < 4)
98		goto decode_error;
99
100	/* HandshakeType msg_type */
101	if (*pos != TLS_HANDSHAKE_TYPE_SERVER_HELLO) {
102		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
103			   "message %d (expected ServerHello)", *pos);
104		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
105			  TLS_ALERT_UNEXPECTED_MESSAGE);
106		return -1;
107	}
108	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHello");
109	pos++;
110	/* uint24 length */
111	len = WPA_GET_BE24(pos);
112	pos += 3;
113	left -= 4;
114
115	if (len > left)
116		goto decode_error;
117
118	/* body - ServerHello */
119
120	wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello", pos, len);
121	end = pos + len;
122
123	/* ProtocolVersion server_version */
124	if (end - pos < 2)
125		goto decode_error;
126	tls_version = WPA_GET_BE16(pos);
127	if (!tls_version_ok(tls_version) ||
128	    tls_version_disabled(conn, tls_version)) {
129		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in "
130			   "ServerHello %u.%u", pos[0], pos[1]);
131		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
132			  TLS_ALERT_PROTOCOL_VERSION);
133		return -1;
134	}
135	pos += 2;
136
137	wpa_printf(MSG_DEBUG, "TLSv1: Using TLS v%s",
138		   tls_version_str(tls_version));
139	conn->rl.tls_version = tls_version;
140
141	/* Random random */
142	if (end - pos < TLS_RANDOM_LEN)
143		goto decode_error;
144
145	os_memcpy(conn->server_random, pos, TLS_RANDOM_LEN);
146	pos += TLS_RANDOM_LEN;
147	wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random",
148		    conn->server_random, TLS_RANDOM_LEN);
149
150	/* SessionID session_id */
151	if (end - pos < 1)
152		goto decode_error;
153	if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN)
154		goto decode_error;
155	if (conn->session_id_len && conn->session_id_len == *pos &&
156	    os_memcmp(conn->session_id, pos + 1, conn->session_id_len) == 0) {
157		pos += 1 + conn->session_id_len;
158		wpa_printf(MSG_DEBUG, "TLSv1: Resuming old session");
159		conn->session_resumed = 1;
160	} else {
161		conn->session_id_len = *pos;
162		pos++;
163		os_memcpy(conn->session_id, pos, conn->session_id_len);
164		pos += conn->session_id_len;
165	}
166	wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id",
167		    conn->session_id, conn->session_id_len);
168
169	/* CipherSuite cipher_suite */
170	if (end - pos < 2)
171		goto decode_error;
172	cipher_suite = WPA_GET_BE16(pos);
173	pos += 2;
174	for (i = 0; i < conn->num_cipher_suites; i++) {
175		if (cipher_suite == conn->cipher_suites[i])
176			break;
177	}
178	if (i == conn->num_cipher_suites) {
179		wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
180			   "cipher suite 0x%04x", cipher_suite);
181		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
182			  TLS_ALERT_ILLEGAL_PARAMETER);
183		return -1;
184	}
185
186	if (conn->session_resumed && cipher_suite != conn->prev_cipher_suite) {
187		wpa_printf(MSG_DEBUG, "TLSv1: Server selected a different "
188			   "cipher suite for a resumed connection (0x%04x != "
189			   "0x%04x)", cipher_suite, conn->prev_cipher_suite);
190		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
191			  TLS_ALERT_ILLEGAL_PARAMETER);
192		return -1;
193	}
194
195	if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) {
196		wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for "
197			   "record layer");
198		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
199			  TLS_ALERT_INTERNAL_ERROR);
200		return -1;
201	}
202
203	conn->prev_cipher_suite = cipher_suite;
204
205	/* CompressionMethod compression_method */
206	if (end - pos < 1)
207		goto decode_error;
208	if (*pos != TLS_COMPRESSION_NULL) {
209		wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
210			   "compression 0x%02x", *pos);
211		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
212			  TLS_ALERT_ILLEGAL_PARAMETER);
213		return -1;
214	}
215	pos++;
216
217	if (end - pos >= 2) {
218		u16 ext_len;
219
220		ext_len = WPA_GET_BE16(pos);
221		pos += 2;
222		if (end - pos < ext_len) {
223			wpa_printf(MSG_INFO,
224				   "TLSv1: Invalid ServerHello extension length: %u (left: %u)",
225				   ext_len, (unsigned int) (end - pos));
226			goto decode_error;
227		}
228
229		if (tls_process_server_hello_extensions(conn, pos, ext_len))
230			goto decode_error;
231		pos += ext_len;
232	}
233
234	if (end != pos) {
235		wpa_hexdump(MSG_DEBUG, "TLSv1: Unexpected extra data in the "
236			    "end of ServerHello", pos, end - pos);
237		goto decode_error;
238	}
239
240	if (conn->session_ticket_included && conn->session_ticket_cb) {
241		/* TODO: include SessionTicket extension if one was included in
242		 * ServerHello */
243		int res = conn->session_ticket_cb(
244			conn->session_ticket_cb_ctx, NULL, 0,
245			conn->client_random, conn->server_random,
246			conn->master_secret);
247		if (res < 0) {
248			wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket callback "
249				   "indicated failure");
250			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
251				  TLS_ALERT_HANDSHAKE_FAILURE);
252			return -1;
253		}
254		conn->use_session_ticket = !!res;
255	}
256
257	if ((conn->session_resumed || conn->use_session_ticket) &&
258	    tls_derive_keys(conn, NULL, 0)) {
259		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
260		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
261			  TLS_ALERT_INTERNAL_ERROR);
262		return -1;
263	}
264
265	*in_len = end - in_data;
266
267	conn->state = (conn->session_resumed || conn->use_session_ticket) ?
268		SERVER_CHANGE_CIPHER_SPEC : SERVER_CERTIFICATE;
269
270	return 0;
271
272decode_error:
273	wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ServerHello");
274	tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
275	return -1;
276}
277
278
279static void tls_peer_cert_event(struct tlsv1_client *conn, int depth,
280				struct x509_certificate *cert)
281{
282	union tls_event_data ev;
283	struct wpabuf *cert_buf = NULL;
284#ifdef CONFIG_SHA256
285	u8 hash[32];
286#endif /* CONFIG_SHA256 */
287	char subject[128];
288
289	if (!conn->event_cb)
290		return;
291
292	os_memset(&ev, 0, sizeof(ev));
293	if ((conn->cred && conn->cred->cert_probe) || conn->cert_in_cb) {
294		cert_buf = wpabuf_alloc_copy(cert->cert_start,
295					     cert->cert_len);
296		ev.peer_cert.cert = cert_buf;
297	}
298#ifdef CONFIG_SHA256
299	if (cert_buf) {
300		const u8 *addr[1];
301		size_t len[1];
302		addr[0] = wpabuf_head(cert_buf);
303		len[0] = wpabuf_len(cert_buf);
304		if (sha256_vector(1, addr, len, hash) == 0) {
305			ev.peer_cert.hash = hash;
306			ev.peer_cert.hash_len = sizeof(hash);
307		}
308	}
309#endif /* CONFIG_SHA256 */
310
311	ev.peer_cert.depth = depth;
312	x509_name_string(&cert->subject, subject, sizeof(subject));
313	ev.peer_cert.subject = subject;
314
315	conn->event_cb(conn->cb_ctx, TLS_PEER_CERTIFICATE, &ev);
316	wpabuf_free(cert_buf);
317}
318
319
320static void tls_cert_chain_failure_event(struct tlsv1_client *conn, int depth,
321					 struct x509_certificate *cert,
322					 enum tls_fail_reason reason,
323					 const char *reason_txt)
324{
325	struct wpabuf *cert_buf = NULL;
326	union tls_event_data ev;
327	char subject[128];
328
329	if (!conn->event_cb || !cert)
330		return;
331
332	os_memset(&ev, 0, sizeof(ev));
333	ev.cert_fail.depth = depth;
334	x509_name_string(&cert->subject, subject, sizeof(subject));
335	ev.peer_cert.subject = subject;
336	ev.cert_fail.reason = reason;
337	ev.cert_fail.reason_txt = reason_txt;
338	cert_buf = wpabuf_alloc_copy(cert->cert_start,
339				     cert->cert_len);
340	ev.cert_fail.cert = cert_buf;
341	conn->event_cb(conn->cb_ctx, TLS_CERT_CHAIN_FAILURE, &ev);
342	wpabuf_free(cert_buf);
343}
344
345
346static int tls_process_certificate(struct tlsv1_client *conn, u8 ct,
347				   const u8 *in_data, size_t *in_len)
348{
349	const u8 *pos, *end;
350	size_t left, len, list_len, cert_len, idx;
351	u8 type;
352	struct x509_certificate *chain = NULL, *last = NULL, *cert;
353	int reason;
354
355	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
356		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
357			   "received content type 0x%x", ct);
358		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
359			  TLS_ALERT_UNEXPECTED_MESSAGE);
360		return -1;
361	}
362
363	pos = in_data;
364	left = *in_len;
365
366	if (left < 4) {
367		wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message "
368			   "(len=%lu)", (unsigned long) left);
369		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
370		return -1;
371	}
372
373	type = *pos++;
374	len = WPA_GET_BE24(pos);
375	pos += 3;
376	left -= 4;
377
378	if (len > left) {
379		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message "
380			   "length (len=%lu != left=%lu)",
381			   (unsigned long) len, (unsigned long) left);
382		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
383		return -1;
384	}
385
386	if (type == TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE)
387		return tls_process_server_key_exchange(conn, ct, in_data,
388						       in_len);
389	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
390		return tls_process_certificate_request(conn, ct, in_data,
391						       in_len);
392	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
393		return tls_process_server_hello_done(conn, ct, in_data,
394						     in_len);
395	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) {
396		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
397			   "message %d (expected Certificate/"
398			   "ServerKeyExchange/CertificateRequest/"
399			   "ServerHelloDone)", type);
400		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
401			  TLS_ALERT_UNEXPECTED_MESSAGE);
402		return -1;
403	}
404
405	wpa_printf(MSG_DEBUG,
406		   "TLSv1: Received Certificate (certificate_list len %lu)",
407		   (unsigned long) len);
408
409	/*
410	 * opaque ASN.1Cert<2^24-1>;
411	 *
412	 * struct {
413	 *     ASN.1Cert certificate_list<1..2^24-1>;
414	 * } Certificate;
415	 */
416
417	end = pos + len;
418
419	if (end - pos < 3) {
420		wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate "
421			   "(left=%lu)", (unsigned long) left);
422		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
423		return -1;
424	}
425
426	list_len = WPA_GET_BE24(pos);
427	pos += 3;
428
429	if ((size_t) (end - pos) != list_len) {
430		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list "
431			   "length (len=%lu left=%lu)",
432			   (unsigned long) list_len,
433			   (unsigned long) (end - pos));
434		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
435		return -1;
436	}
437
438	idx = 0;
439	while (pos < end) {
440		if (end - pos < 3) {
441			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
442				   "certificate_list");
443			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
444				  TLS_ALERT_DECODE_ERROR);
445			x509_certificate_chain_free(chain);
446			return -1;
447		}
448
449		cert_len = WPA_GET_BE24(pos);
450		pos += 3;
451
452		if ((size_t) (end - pos) < cert_len) {
453			wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate "
454				   "length (len=%lu left=%lu)",
455				   (unsigned long) cert_len,
456				   (unsigned long) (end - pos));
457			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
458				  TLS_ALERT_DECODE_ERROR);
459			x509_certificate_chain_free(chain);
460			return -1;
461		}
462
463		wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)",
464			   (unsigned long) idx, (unsigned long) cert_len);
465
466		if (idx == 0) {
467			crypto_public_key_free(conn->server_rsa_key);
468			if (tls_parse_cert(pos, cert_len,
469					   &conn->server_rsa_key)) {
470				wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
471					   "the certificate");
472				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
473					  TLS_ALERT_BAD_CERTIFICATE);
474				x509_certificate_chain_free(chain);
475				return -1;
476			}
477		}
478
479		cert = x509_certificate_parse(pos, cert_len);
480		if (cert == NULL) {
481			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
482				   "the certificate");
483			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
484				  TLS_ALERT_BAD_CERTIFICATE);
485			x509_certificate_chain_free(chain);
486			return -1;
487		}
488
489		tls_peer_cert_event(conn, idx, cert);
490
491		if (last == NULL)
492			chain = cert;
493		else
494			last->next = cert;
495		last = cert;
496
497		idx++;
498		pos += cert_len;
499	}
500
501	if (conn->cred && conn->cred->server_cert_only && chain) {
502		u8 hash[SHA256_MAC_LEN];
503		char buf[128];
504
505		wpa_printf(MSG_DEBUG,
506			   "TLSv1: Validate server certificate hash");
507		x509_name_string(&chain->subject, buf, sizeof(buf));
508		wpa_printf(MSG_DEBUG, "TLSv1: 0: %s", buf);
509		if (sha256_vector(1, &chain->cert_start, &chain->cert_len,
510				  hash) < 0 ||
511		    os_memcmp(conn->cred->srv_cert_hash, hash,
512			      SHA256_MAC_LEN) != 0) {
513			wpa_printf(MSG_DEBUG,
514				   "TLSv1: Server certificate hash mismatch");
515			wpa_hexdump(MSG_MSGDUMP, "TLSv1: SHA256 hash",
516				    hash, SHA256_MAC_LEN);
517			if (conn->event_cb) {
518				union tls_event_data ev;
519
520				os_memset(&ev, 0, sizeof(ev));
521				ev.cert_fail.reason = TLS_FAIL_UNSPECIFIED;
522				ev.cert_fail.reason_txt =
523					"Server certificate mismatch";
524				ev.cert_fail.subject = buf;
525				conn->event_cb(conn->cb_ctx,
526					       TLS_CERT_CHAIN_FAILURE, &ev);
527			}
528			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
529				  TLS_ALERT_BAD_CERTIFICATE);
530			x509_certificate_chain_free(chain);
531			return -1;
532		}
533	} else if (conn->cred && conn->cred->cert_probe) {
534		wpa_printf(MSG_DEBUG,
535			   "TLSv1: Reject server certificate on probe-only rune");
536		if (conn->event_cb) {
537			union tls_event_data ev;
538			char buf[128];
539
540			os_memset(&ev, 0, sizeof(ev));
541			ev.cert_fail.reason = TLS_FAIL_SERVER_CHAIN_PROBE;
542			ev.cert_fail.reason_txt =
543				"Server certificate chain probe";
544			if (chain) {
545				x509_name_string(&chain->subject, buf,
546						 sizeof(buf));
547				ev.cert_fail.subject = buf;
548			}
549			conn->event_cb(conn->cb_ctx, TLS_CERT_CHAIN_FAILURE,
550				       &ev);
551		}
552		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
553			  TLS_ALERT_BAD_CERTIFICATE);
554		x509_certificate_chain_free(chain);
555		return -1;
556	} else if (conn->cred && conn->cred->ca_cert_verify &&
557		   x509_certificate_chain_validate(
558			   conn->cred->trusted_certs, chain, &reason,
559			   !!(conn->flags & TLS_CONN_DISABLE_TIME_CHECKS))
560		   < 0) {
561		int tls_reason;
562		wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain "
563			   "validation failed (reason=%d)", reason);
564		switch (reason) {
565		case X509_VALIDATE_BAD_CERTIFICATE:
566			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
567			tls_cert_chain_failure_event(
568				conn, 0, chain, TLS_FAIL_BAD_CERTIFICATE,
569				"bad certificate");
570			break;
571		case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:
572			tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;
573			break;
574		case X509_VALIDATE_CERTIFICATE_REVOKED:
575			tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;
576			tls_cert_chain_failure_event(
577				conn, 0, chain, TLS_FAIL_REVOKED,
578				"certificate revoked");
579			break;
580		case X509_VALIDATE_CERTIFICATE_EXPIRED:
581			tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;
582			tls_cert_chain_failure_event(
583				conn, 0, chain, TLS_FAIL_EXPIRED,
584				"certificate has expired or is not yet valid");
585			break;
586		case X509_VALIDATE_CERTIFICATE_UNKNOWN:
587			tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;
588			break;
589		case X509_VALIDATE_UNKNOWN_CA:
590			tls_reason = TLS_ALERT_UNKNOWN_CA;
591			tls_cert_chain_failure_event(
592				conn, 0, chain, TLS_FAIL_UNTRUSTED,
593				"unknown CA");
594			break;
595		default:
596			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
597			break;
598		}
599		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);
600		x509_certificate_chain_free(chain);
601		return -1;
602	}
603
604	if (conn->cred && !conn->cred->server_cert_only && chain &&
605	    (chain->extensions_present & X509_EXT_EXT_KEY_USAGE) &&
606	    !(chain->ext_key_usage &
607	      (X509_EXT_KEY_USAGE_ANY | X509_EXT_KEY_USAGE_SERVER_AUTH))) {
608		tls_cert_chain_failure_event(
609			conn, 0, chain, TLS_FAIL_BAD_CERTIFICATE,
610			"certificate not allowed for server authentication");
611		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
612			  TLS_ALERT_BAD_CERTIFICATE);
613		x509_certificate_chain_free(chain);
614		return -1;
615	}
616
617	if (conn->flags & TLS_CONN_REQUEST_OCSP) {
618		x509_certificate_chain_free(conn->server_cert);
619		conn->server_cert = chain;
620	} else {
621		x509_certificate_chain_free(chain);
622	}
623
624	*in_len = end - in_data;
625
626	conn->state = SERVER_KEY_EXCHANGE;
627
628	return 0;
629}
630
631
632static unsigned int count_bits(const u8 *val, size_t len)
633{
634	size_t i;
635	unsigned int bits;
636	u8 tmp;
637
638	for (i = 0; i < len; i++) {
639		if (val[i])
640			break;
641	}
642	if (i == len)
643		return 0;
644
645	bits = (len - i - 1) * 8;
646	tmp = val[i];
647	while (tmp) {
648		bits++;
649		tmp >>= 1;
650	}
651
652	return bits;
653}
654
655
656static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn,
657					const u8 *buf, size_t len,
658					tls_key_exchange key_exchange)
659{
660	const u8 *pos, *end, *server_params, *server_params_end;
661	u8 alert;
662	unsigned int bits;
663	u16 val;
664
665	tlsv1_client_free_dh(conn);
666
667	pos = buf;
668	end = buf + len;
669
670	if (end - pos < 3)
671		goto fail;
672	server_params = pos;
673	val = WPA_GET_BE16(pos);
674	pos += 2;
675	if (val == 0 || val > (size_t) (end - pos)) {
676		wpa_printf(MSG_DEBUG, "TLSv1: Invalid dh_p length %u", val);
677		goto fail;
678	}
679	conn->dh_p_len = val;
680	bits = count_bits(pos, conn->dh_p_len);
681	if (bits < 768) {
682		wpa_printf(MSG_INFO, "TLSv1: Reject under 768-bit DH prime (insecure; only %u bits)",
683			   bits);
684		wpa_hexdump(MSG_DEBUG, "TLSv1: Rejected DH prime",
685			    pos, conn->dh_p_len);
686		goto fail;
687	}
688	conn->dh_p = os_memdup(pos, conn->dh_p_len);
689	if (conn->dh_p == NULL)
690		goto fail;
691	pos += conn->dh_p_len;
692	wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",
693		    conn->dh_p, conn->dh_p_len);
694
695	if (end - pos < 3)
696		goto fail;
697	val = WPA_GET_BE16(pos);
698	pos += 2;
699	if (val == 0 || val > (size_t) (end - pos))
700		goto fail;
701	conn->dh_g_len = val;
702	conn->dh_g = os_memdup(pos, conn->dh_g_len);
703	if (conn->dh_g == NULL)
704		goto fail;
705	pos += conn->dh_g_len;
706	wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",
707		    conn->dh_g, conn->dh_g_len);
708	if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)
709		goto fail;
710
711	if (end - pos < 3)
712		goto fail;
713	val = WPA_GET_BE16(pos);
714	pos += 2;
715	if (val == 0 || val > (size_t) (end - pos))
716		goto fail;
717	conn->dh_ys_len = val;
718	conn->dh_ys = os_memdup(pos, conn->dh_ys_len);
719	if (conn->dh_ys == NULL)
720		goto fail;
721	pos += conn->dh_ys_len;
722	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
723		    conn->dh_ys, conn->dh_ys_len);
724	server_params_end = pos;
725
726	if (key_exchange == TLS_KEY_X_DHE_RSA) {
727		u8 hash[64];
728		int hlen;
729
730		if (conn->rl.tls_version == TLS_VERSION_1_2) {
731#ifdef CONFIG_TLSV12
732			/*
733			 * RFC 5246, 4.7:
734			 * TLS v1.2 adds explicit indication of the used
735			 * signature and hash algorithms.
736			 *
737			 * struct {
738			 *   HashAlgorithm hash;
739			 *   SignatureAlgorithm signature;
740			 * } SignatureAndHashAlgorithm;
741			 */
742			if (end - pos < 2)
743				goto fail;
744			if ((pos[0] != TLS_HASH_ALG_SHA256 &&
745			     pos[0] != TLS_HASH_ALG_SHA384 &&
746			     pos[0] != TLS_HASH_ALG_SHA512) ||
747			    pos[1] != TLS_SIGN_ALG_RSA) {
748				wpa_printf(MSG_DEBUG, "TLSv1.2: Unsupported hash(%u)/signature(%u) algorithm",
749					   pos[0], pos[1]);
750				goto fail;
751			}
752
753			hlen = tlsv12_key_x_server_params_hash(
754				conn->rl.tls_version, pos[0],
755				conn->client_random,
756				conn->server_random, server_params,
757				server_params_end - server_params, hash);
758			pos += 2;
759#else /* CONFIG_TLSV12 */
760			goto fail;
761#endif /* CONFIG_TLSV12 */
762		} else {
763			hlen = tls_key_x_server_params_hash(
764				conn->rl.tls_version, conn->client_random,
765				conn->server_random, server_params,
766				server_params_end - server_params, hash);
767		}
768
769		if (hlen < 0)
770			goto fail;
771		wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerKeyExchange hash",
772			    hash, hlen);
773
774		if (tls_verify_signature(conn->rl.tls_version,
775					 conn->server_rsa_key,
776					 hash, hlen, pos, end - pos,
777					 &alert) < 0)
778			goto fail;
779	}
780
781	return 0;
782
783fail:
784	wpa_printf(MSG_DEBUG, "TLSv1: Processing DH params failed");
785	tlsv1_client_free_dh(conn);
786	return -1;
787}
788
789
790static enum tls_ocsp_result
791tls_process_certificate_status_ocsp_response(struct tlsv1_client *conn,
792					     const u8 *pos, size_t len)
793{
794	const u8 *end = pos + len;
795	u32 ocsp_resp_len;
796
797	/* opaque OCSPResponse<1..2^24-1>; */
798	if (end - pos < 3) {
799		wpa_printf(MSG_INFO, "TLSv1: Too short OCSPResponse");
800		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
801		return TLS_OCSP_INVALID;
802	}
803	ocsp_resp_len = WPA_GET_BE24(pos);
804	pos += 3;
805	if (end - pos < ocsp_resp_len) {
806		wpa_printf(MSG_INFO, "TLSv1: Truncated OCSPResponse");
807		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
808		return TLS_OCSP_INVALID;
809	}
810
811	return tls_process_ocsp_response(conn, pos, ocsp_resp_len);
812}
813
814
815static int tls_process_certificate_status(struct tlsv1_client *conn, u8 ct,
816					   const u8 *in_data, size_t *in_len)
817{
818	const u8 *pos, *end;
819	size_t left, len;
820	u8 type, status_type;
821	enum tls_ocsp_result res;
822	struct x509_certificate *cert;
823	int depth;
824
825	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
826		wpa_printf(MSG_DEBUG,
827			   "TLSv1: Expected Handshake; received content type 0x%x",
828			   ct);
829		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
830			  TLS_ALERT_UNEXPECTED_MESSAGE);
831		return -1;
832	}
833
834	pos = in_data;
835	left = *in_len;
836
837	if (left < 4) {
838		wpa_printf(MSG_DEBUG,
839			   "TLSv1: Too short CertificateStatus (left=%lu)",
840			   (unsigned long) left);
841		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
842		return -1;
843	}
844
845	type = *pos++;
846	len = WPA_GET_BE24(pos);
847	pos += 3;
848	left -= 4;
849
850	if (len > left) {
851		wpa_printf(MSG_DEBUG,
852			   "TLSv1: Mismatch in CertificateStatus length (len=%lu != left=%lu)",
853			   (unsigned long) len, (unsigned long) left);
854		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
855		return -1;
856	}
857
858	end = pos + len;
859
860	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS) {
861		wpa_printf(MSG_DEBUG,
862			   "TLSv1: Received unexpected handshake message %d (expected CertificateStatus)",
863			   type);
864		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
865			  TLS_ALERT_UNEXPECTED_MESSAGE);
866		return -1;
867	}
868
869	wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateStatus");
870
871	/*
872	 * struct {
873	 *     CertificateStatusType status_type;
874	 *     select (status_type) {
875	 *         case ocsp: OCSPResponse;
876	 *         case ocsp_multi: OCSPResponseList;
877	 *     } response;
878	 * } CertificateStatus;
879	 */
880	if (end - pos < 1) {
881		wpa_printf(MSG_INFO, "TLSv1: Too short CertificateStatus");
882		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
883		return -1;
884	}
885	status_type = *pos++;
886	wpa_printf(MSG_DEBUG, "TLSv1: CertificateStatus status_type %u",
887		   status_type);
888
889	if (status_type == 1 /* ocsp */) {
890		res = tls_process_certificate_status_ocsp_response(
891			conn, pos, end - pos);
892	} else if (status_type == 2 /* ocsp_multi */) {
893		int good = 0, revoked = 0;
894		u32 resp_len;
895
896		res = TLS_OCSP_NO_RESPONSE;
897
898		/*
899		 * opaque OCSPResponse<0..2^24-1>;
900		 *
901		 * struct {
902		 *   OCSPResponse ocsp_response_list<1..2^24-1>;
903		 * } OCSPResponseList;
904		 */
905		if (end - pos < 3) {
906			wpa_printf(MSG_DEBUG,
907				   "TLSv1: Truncated OCSPResponseList");
908			res = TLS_OCSP_INVALID;
909			goto done;
910		}
911		resp_len = WPA_GET_BE24(pos);
912		pos += 3;
913		if (end - pos < resp_len) {
914			wpa_printf(MSG_DEBUG,
915				   "TLSv1: Truncated OCSPResponseList(len=%u)",
916				   resp_len);
917			res = TLS_OCSP_INVALID;
918			goto done;
919		}
920		end = pos + resp_len;
921
922		while (end - pos >= 3) {
923			resp_len = WPA_GET_BE24(pos);
924			pos += 3;
925			if (resp_len > end - pos) {
926				wpa_printf(MSG_DEBUG,
927					   "TLSv1: Truncated OCSPResponse(len=%u; left=%d) in ocsp_multi",
928					   resp_len, (int) (end - pos));
929				res = TLS_OCSP_INVALID;
930				break;
931			}
932			if (!resp_len)
933				continue; /* Skip an empty response */
934			res = tls_process_certificate_status_ocsp_response(
935				conn, pos - 3, resp_len + 3);
936			if (res == TLS_OCSP_REVOKED)
937				revoked++;
938			else if (res == TLS_OCSP_GOOD)
939				good++;
940			pos += resp_len;
941		}
942
943		if (revoked)
944			res = TLS_OCSP_REVOKED;
945		else if (good)
946			res = TLS_OCSP_GOOD;
947	} else {
948		wpa_printf(MSG_DEBUG,
949			   "TLSv1: Ignore unsupported CertificateStatus");
950		goto skip;
951	}
952
953done:
954	if (res == TLS_OCSP_REVOKED) {
955		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
956			  TLS_ALERT_CERTIFICATE_REVOKED);
957		for (cert = conn->server_cert, depth = 0; cert;
958		     cert = cert->next, depth++) {
959			if (cert->ocsp_revoked) {
960				tls_cert_chain_failure_event(
961					conn, depth, cert, TLS_FAIL_REVOKED,
962					"certificate revoked");
963			}
964		}
965		return -1;
966	}
967
968	if (conn->flags & TLS_CONN_REQUIRE_OCSP_ALL) {
969		/*
970		 * Verify that each certificate on the chain that is not part
971		 * of the trusted certificates has a good status. If not,
972		 * terminate handshake.
973		 */
974		for (cert = conn->server_cert, depth = 0; cert;
975		     cert = cert->next, depth++) {
976			if (!cert->ocsp_good) {
977				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
978					  TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
979				tls_cert_chain_failure_event(
980					conn, depth, cert,
981					TLS_FAIL_UNSPECIFIED,
982					"bad certificate status response");
983				return -1;
984			}
985			if (cert->issuer_trusted)
986				break;
987		}
988	}
989
990	if ((conn->flags & TLS_CONN_REQUIRE_OCSP) && res != TLS_OCSP_GOOD) {
991		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
992			  res == TLS_OCSP_INVALID ? TLS_ALERT_DECODE_ERROR :
993			  TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
994		if (conn->server_cert)
995			tls_cert_chain_failure_event(
996				conn, 0, conn->server_cert,
997				TLS_FAIL_UNSPECIFIED,
998				"bad certificate status response");
999		return -1;
1000	}
1001
1002	conn->ocsp_resp_received = 1;
1003
1004skip:
1005	*in_len = end - in_data;
1006
1007	conn->state = SERVER_KEY_EXCHANGE;
1008
1009	return 0;
1010}
1011
1012
1013static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
1014					   const u8 *in_data, size_t *in_len)
1015{
1016	const u8 *pos, *end;
1017	size_t left, len;
1018	u8 type;
1019	const struct tls_cipher_suite *suite;
1020
1021	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1022		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1023			   "received content type 0x%x", ct);
1024		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1025			  TLS_ALERT_UNEXPECTED_MESSAGE);
1026		return -1;
1027	}
1028
1029	pos = in_data;
1030	left = *in_len;
1031
1032	if (left < 4) {
1033		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "
1034			   "(Left=%lu)", (unsigned long) left);
1035		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1036		return -1;
1037	}
1038
1039	type = *pos++;
1040	len = WPA_GET_BE24(pos);
1041	pos += 3;
1042	left -= 4;
1043
1044	if (len > left) {
1045		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "
1046			   "length (len=%lu != left=%lu)",
1047			   (unsigned long) len, (unsigned long) left);
1048		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1049		return -1;
1050	}
1051
1052	end = pos + len;
1053
1054	if ((conn->flags & TLS_CONN_REQUEST_OCSP) &&
1055	    type == TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS)
1056		return tls_process_certificate_status(conn, ct, in_data,
1057						      in_len);
1058	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
1059		return tls_process_certificate_request(conn, ct, in_data,
1060						       in_len);
1061	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
1062		return tls_process_server_hello_done(conn, ct, in_data,
1063						     in_len);
1064	if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {
1065		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1066			   "message %d (expected ServerKeyExchange/"
1067			   "CertificateRequest/ServerHelloDone%s)", type,
1068			   (conn->flags & TLS_CONN_REQUEST_OCSP) ?
1069			   "/CertificateStatus" : "");
1070		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1071			  TLS_ALERT_UNEXPECTED_MESSAGE);
1072		return -1;
1073	}
1074
1075	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");
1076
1077	if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
1078		wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "
1079			   "with the selected cipher suite");
1080		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1081			  TLS_ALERT_UNEXPECTED_MESSAGE);
1082		return -1;
1083	}
1084
1085	wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);
1086	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
1087	if (suite && (suite->key_exchange == TLS_KEY_X_DH_anon ||
1088		      suite->key_exchange == TLS_KEY_X_DHE_RSA)) {
1089		if (tlsv1_process_diffie_hellman(conn, pos, len,
1090						 suite->key_exchange) < 0) {
1091			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1092				  TLS_ALERT_DECODE_ERROR);
1093			return -1;
1094		}
1095	} else {
1096		wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");
1097		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1098			  TLS_ALERT_UNEXPECTED_MESSAGE);
1099		return -1;
1100	}
1101
1102	*in_len = end - in_data;
1103
1104	conn->state = SERVER_CERTIFICATE_REQUEST;
1105
1106	return 0;
1107}
1108
1109
1110static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
1111					   const u8 *in_data, size_t *in_len)
1112{
1113	const u8 *pos, *end;
1114	size_t left, len;
1115	u8 type;
1116
1117	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1118		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1119			   "received content type 0x%x", ct);
1120		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1121			  TLS_ALERT_UNEXPECTED_MESSAGE);
1122		return -1;
1123	}
1124
1125	pos = in_data;
1126	left = *in_len;
1127
1128	if (left < 4) {
1129		wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "
1130			   "(left=%lu)", (unsigned long) left);
1131		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1132		return -1;
1133	}
1134
1135	type = *pos++;
1136	len = WPA_GET_BE24(pos);
1137	pos += 3;
1138	left -= 4;
1139
1140	if (len > left) {
1141		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "
1142			   "length (len=%lu != left=%lu)",
1143			   (unsigned long) len, (unsigned long) left);
1144		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1145		return -1;
1146	}
1147
1148	end = pos + len;
1149
1150	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
1151		return tls_process_server_hello_done(conn, ct, in_data,
1152						     in_len);
1153	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {
1154		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1155			   "message %d (expected CertificateRequest/"
1156			   "ServerHelloDone)", type);
1157		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1158			  TLS_ALERT_UNEXPECTED_MESSAGE);
1159		return -1;
1160	}
1161
1162	wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");
1163
1164	conn->certificate_requested = 1;
1165
1166	*in_len = end - in_data;
1167
1168	conn->state = SERVER_HELLO_DONE;
1169
1170	return 0;
1171}
1172
1173
1174static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
1175					 const u8 *in_data, size_t *in_len)
1176{
1177	const u8 *pos, *end;
1178	size_t left, len;
1179	u8 type;
1180
1181	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1182		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1183			   "received content type 0x%x", ct);
1184		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1185			  TLS_ALERT_UNEXPECTED_MESSAGE);
1186		return -1;
1187	}
1188
1189	pos = in_data;
1190	left = *in_len;
1191
1192	if (left < 4) {
1193		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "
1194			   "(left=%lu)", (unsigned long) left);
1195		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1196		return -1;
1197	}
1198
1199	type = *pos++;
1200	len = WPA_GET_BE24(pos);
1201	pos += 3;
1202	left -= 4;
1203
1204	if (len > left) {
1205		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "
1206			   "length (len=%lu != left=%lu)",
1207			   (unsigned long) len, (unsigned long) left);
1208		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1209		return -1;
1210	}
1211	end = pos + len;
1212
1213	if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {
1214		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1215			   "message %d (expected ServerHelloDone)", type);
1216		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1217			  TLS_ALERT_UNEXPECTED_MESSAGE);
1218		return -1;
1219	}
1220
1221	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");
1222
1223	if ((conn->flags & TLS_CONN_REQUIRE_OCSP) &&
1224	    !conn->ocsp_resp_received) {
1225		wpa_printf(MSG_INFO,
1226			   "TLSv1: No OCSP response received - reject handshake");
1227		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1228			  TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
1229		return -1;
1230	}
1231
1232	*in_len = end - in_data;
1233
1234	conn->state = CLIENT_KEY_EXCHANGE;
1235
1236	return 0;
1237}
1238
1239
1240static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn,
1241						 u8 ct, const u8 *in_data,
1242						 size_t *in_len)
1243{
1244	const u8 *pos;
1245	size_t left;
1246
1247	if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
1248		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
1249			   "received content type 0x%x", ct);
1250		if (conn->use_session_ticket) {
1251			int res;
1252			wpa_printf(MSG_DEBUG, "TLSv1: Server may have "
1253				   "rejected SessionTicket");
1254			conn->use_session_ticket = 0;
1255
1256			/* Notify upper layers that SessionTicket failed */
1257			res = conn->session_ticket_cb(
1258				conn->session_ticket_cb_ctx, NULL, 0, NULL,
1259				NULL, NULL);
1260			if (res < 0) {
1261				wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket "
1262					   "callback indicated failure");
1263				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1264					  TLS_ALERT_HANDSHAKE_FAILURE);
1265				return -1;
1266			}
1267
1268			conn->state = SERVER_CERTIFICATE;
1269			return tls_process_certificate(conn, ct, in_data,
1270						       in_len);
1271		}
1272		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1273			  TLS_ALERT_UNEXPECTED_MESSAGE);
1274		return -1;
1275	}
1276
1277	pos = in_data;
1278	left = *in_len;
1279
1280	if (left < 1) {
1281		wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");
1282		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1283		return -1;
1284	}
1285
1286	if (*pos != TLS_CHANGE_CIPHER_SPEC) {
1287		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
1288			   "received data 0x%x", *pos);
1289		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1290			  TLS_ALERT_UNEXPECTED_MESSAGE);
1291		return -1;
1292	}
1293
1294	wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");
1295	if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
1296		wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
1297			   "for record layer");
1298		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1299			  TLS_ALERT_INTERNAL_ERROR);
1300		return -1;
1301	}
1302
1303	*in_len = pos + 1 - in_data;
1304
1305	conn->state = SERVER_FINISHED;
1306
1307	return 0;
1308}
1309
1310
1311static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct,
1312				       const u8 *in_data, size_t *in_len)
1313{
1314	const u8 *pos, *end;
1315	size_t left, len, hlen;
1316	u8 verify_data[TLS_VERIFY_DATA_LEN];
1317	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
1318
1319	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1320		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "
1321			   "received content type 0x%x", ct);
1322		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1323			  TLS_ALERT_UNEXPECTED_MESSAGE);
1324		return -1;
1325	}
1326
1327	pos = in_data;
1328	left = *in_len;
1329
1330	if (left < 4) {
1331		wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "
1332			   "Finished",
1333			   (unsigned long) left);
1334		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1335			  TLS_ALERT_DECODE_ERROR);
1336		return -1;
1337	}
1338
1339	if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
1340		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
1341			   "type 0x%x", pos[0]);
1342		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1343			  TLS_ALERT_UNEXPECTED_MESSAGE);
1344		return -1;
1345	}
1346
1347	len = WPA_GET_BE24(pos + 1);
1348
1349	pos += 4;
1350	left -= 4;
1351
1352	if (len > left) {
1353		wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "
1354			   "(len=%lu > left=%lu)",
1355			   (unsigned long) len, (unsigned long) left);
1356		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1357			  TLS_ALERT_DECODE_ERROR);
1358		return -1;
1359	}
1360	end = pos + len;
1361	if (len != TLS_VERIFY_DATA_LEN) {
1362		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "
1363			   "in Finished: %lu (expected %d)",
1364			   (unsigned long) len, TLS_VERIFY_DATA_LEN);
1365		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1366			  TLS_ALERT_DECODE_ERROR);
1367		return -1;
1368	}
1369	wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
1370		    pos, TLS_VERIFY_DATA_LEN);
1371
1372#ifdef CONFIG_TLSV12
1373	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
1374		hlen = SHA256_MAC_LEN;
1375		if (conn->verify.sha256_server == NULL ||
1376		    crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
1377		    < 0) {
1378			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1379				  TLS_ALERT_INTERNAL_ERROR);
1380			conn->verify.sha256_server = NULL;
1381			return -1;
1382		}
1383		conn->verify.sha256_server = NULL;
1384	} else {
1385#endif /* CONFIG_TLSV12 */
1386
1387	hlen = MD5_MAC_LEN;
1388	if (conn->verify.md5_server == NULL ||
1389	    crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
1390		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1391			  TLS_ALERT_INTERNAL_ERROR);
1392		conn->verify.md5_server = NULL;
1393		crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
1394		conn->verify.sha1_server = NULL;
1395		return -1;
1396	}
1397	conn->verify.md5_server = NULL;
1398	hlen = SHA1_MAC_LEN;
1399	if (conn->verify.sha1_server == NULL ||
1400	    crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
1401			       &hlen) < 0) {
1402		conn->verify.sha1_server = NULL;
1403		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1404			  TLS_ALERT_INTERNAL_ERROR);
1405		return -1;
1406	}
1407	conn->verify.sha1_server = NULL;
1408	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
1409
1410#ifdef CONFIG_TLSV12
1411	}
1412#endif /* CONFIG_TLSV12 */
1413
1414	if (tls_prf(conn->rl.tls_version,
1415		    conn->master_secret, TLS_MASTER_SECRET_LEN,
1416		    "server finished", hash, hlen,
1417		    verify_data, TLS_VERIFY_DATA_LEN)) {
1418		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
1419		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1420			  TLS_ALERT_DECRYPT_ERROR);
1421		return -1;
1422	}
1423	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
1424			verify_data, TLS_VERIFY_DATA_LEN);
1425
1426	if (os_memcmp_const(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
1427		wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");
1428		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1429			  TLS_ALERT_DECRYPT_ERROR);
1430		return -1;
1431	}
1432
1433	wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");
1434
1435	*in_len = end - in_data;
1436
1437	conn->state = (conn->session_resumed || conn->use_session_ticket) ?
1438		CHANGE_CIPHER_SPEC : ACK_FINISHED;
1439
1440	return 0;
1441}
1442
1443
1444static int tls_process_application_data(struct tlsv1_client *conn, u8 ct,
1445					const u8 *in_data, size_t *in_len,
1446					u8 **out_data, size_t *out_len)
1447{
1448	const u8 *pos;
1449	size_t left;
1450
1451	if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {
1452		wpa_printf(MSG_DEBUG, "TLSv1: Expected Application Data; "
1453			   "received content type 0x%x", ct);
1454		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1455			  TLS_ALERT_UNEXPECTED_MESSAGE);
1456		return -1;
1457	}
1458
1459	pos = in_data;
1460	left = *in_len;
1461
1462	wpa_hexdump(MSG_DEBUG, "TLSv1: Application Data included in Handshake",
1463		    pos, left);
1464
1465	*out_data = os_malloc(left);
1466	if (*out_data) {
1467		os_memcpy(*out_data, pos, left);
1468		*out_len = left;
1469	}
1470
1471	return 0;
1472}
1473
1474
1475int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct,
1476				   const u8 *buf, size_t *len,
1477				   u8 **out_data, size_t *out_len)
1478{
1479	if (ct == TLS_CONTENT_TYPE_ALERT) {
1480		if (*len < 2) {
1481			wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow");
1482			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1483				  TLS_ALERT_DECODE_ERROR);
1484			return -1;
1485		}
1486		wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",
1487			   buf[0], buf[1]);
1488		*len = 2;
1489		conn->state = FAILED;
1490		return -1;
1491	}
1492
1493	if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&
1494	    buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {
1495		size_t hr_len = WPA_GET_BE24(buf + 1);
1496		if (hr_len > *len - 4) {
1497			wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");
1498			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1499				  TLS_ALERT_DECODE_ERROR);
1500			return -1;
1501		}
1502		wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");
1503		*len = 4 + hr_len;
1504		return 0;
1505	}
1506
1507	switch (conn->state) {
1508	case SERVER_HELLO:
1509		if (tls_process_server_hello(conn, ct, buf, len))
1510			return -1;
1511		break;
1512	case SERVER_CERTIFICATE:
1513		if (tls_process_certificate(conn, ct, buf, len))
1514			return -1;
1515		break;
1516	case SERVER_KEY_EXCHANGE:
1517		if (tls_process_server_key_exchange(conn, ct, buf, len))
1518			return -1;
1519		break;
1520	case SERVER_CERTIFICATE_REQUEST:
1521		if (tls_process_certificate_request(conn, ct, buf, len))
1522			return -1;
1523		break;
1524	case SERVER_HELLO_DONE:
1525		if (tls_process_server_hello_done(conn, ct, buf, len))
1526			return -1;
1527		break;
1528	case SERVER_CHANGE_CIPHER_SPEC:
1529		if (tls_process_server_change_cipher_spec(conn, ct, buf, len))
1530			return -1;
1531		break;
1532	case SERVER_FINISHED:
1533		if (tls_process_server_finished(conn, ct, buf, len))
1534			return -1;
1535		break;
1536	case ACK_FINISHED:
1537		if (out_data &&
1538		    tls_process_application_data(conn, ct, buf, len, out_data,
1539						 out_len))
1540			return -1;
1541		break;
1542	default:
1543		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "
1544			   "while processing received message",
1545			   conn->state);
1546		return -1;
1547	}
1548
1549	if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
1550		tls_verify_hash_add(&conn->verify, buf, *len);
1551
1552	return 0;
1553}
1554