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