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