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