Home | History | Annotate | Download | only in tls
      1 /*
      2  * TLSv1 client - read handshake message
      3  * Copyright (c) 2006-2011, 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_client.h"
     20 #include "tlsv1_client_i.h"
     21 
     22 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
     23 					   const u8 *in_data, size_t *in_len);
     24 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
     25 					   const u8 *in_data, size_t *in_len);
     26 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
     27 					 const u8 *in_data, size_t *in_len);
     28 
     29 
     30 static int tls_process_server_hello(struct tlsv1_client *conn, u8 ct,
     31 				    const u8 *in_data, size_t *in_len)
     32 {
     33 	const u8 *pos, *end;
     34 	size_t left, len, i;
     35 	u16 cipher_suite;
     36 	u16 tls_version;
     37 
     38 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
     39 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
     40 			   "received content type 0x%x", ct);
     41 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
     42 			  TLS_ALERT_UNEXPECTED_MESSAGE);
     43 		return -1;
     44 	}
     45 
     46 	pos = in_data;
     47 	left = *in_len;
     48 
     49 	if (left < 4)
     50 		goto decode_error;
     51 
     52 	/* HandshakeType msg_type */
     53 	if (*pos != TLS_HANDSHAKE_TYPE_SERVER_HELLO) {
     54 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
     55 			   "message %d (expected ServerHello)", *pos);
     56 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
     57 			  TLS_ALERT_UNEXPECTED_MESSAGE);
     58 		return -1;
     59 	}
     60 	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHello");
     61 	pos++;
     62 	/* uint24 length */
     63 	len = WPA_GET_BE24(pos);
     64 	pos += 3;
     65 	left -= 4;
     66 
     67 	if (len > left)
     68 		goto decode_error;
     69 
     70 	/* body - ServerHello */
     71 
     72 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello", pos, len);
     73 	end = pos + len;
     74 
     75 	/* ProtocolVersion server_version */
     76 	if (end - pos < 2)
     77 		goto decode_error;
     78 	tls_version = WPA_GET_BE16(pos);
     79 	if (!tls_version_ok(tls_version)) {
     80 		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in "
     81 			   "ServerHello %u.%u", pos[0], pos[1]);
     82 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
     83 			  TLS_ALERT_PROTOCOL_VERSION);
     84 		return -1;
     85 	}
     86 	pos += 2;
     87 
     88 	wpa_printf(MSG_DEBUG, "TLSv1: Using TLS v%s",
     89 		   tls_version_str(tls_version));
     90 	conn->rl.tls_version = tls_version;
     91 
     92 	/* Random random */
     93 	if (end - pos < TLS_RANDOM_LEN)
     94 		goto decode_error;
     95 
     96 	os_memcpy(conn->server_random, pos, TLS_RANDOM_LEN);
     97 	pos += TLS_RANDOM_LEN;
     98 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random",
     99 		    conn->server_random, TLS_RANDOM_LEN);
    100 
    101 	/* SessionID session_id */
    102 	if (end - pos < 1)
    103 		goto decode_error;
    104 	if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN)
    105 		goto decode_error;
    106 	if (conn->session_id_len && conn->session_id_len == *pos &&
    107 	    os_memcmp(conn->session_id, pos + 1, conn->session_id_len) == 0) {
    108 		pos += 1 + conn->session_id_len;
    109 		wpa_printf(MSG_DEBUG, "TLSv1: Resuming old session");
    110 		conn->session_resumed = 1;
    111 	} else {
    112 		conn->session_id_len = *pos;
    113 		pos++;
    114 		os_memcpy(conn->session_id, pos, conn->session_id_len);
    115 		pos += conn->session_id_len;
    116 	}
    117 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id",
    118 		    conn->session_id, conn->session_id_len);
    119 
    120 	/* CipherSuite cipher_suite */
    121 	if (end - pos < 2)
    122 		goto decode_error;
    123 	cipher_suite = WPA_GET_BE16(pos);
    124 	pos += 2;
    125 	for (i = 0; i < conn->num_cipher_suites; i++) {
    126 		if (cipher_suite == conn->cipher_suites[i])
    127 			break;
    128 	}
    129 	if (i == conn->num_cipher_suites) {
    130 		wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
    131 			   "cipher suite 0x%04x", cipher_suite);
    132 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    133 			  TLS_ALERT_ILLEGAL_PARAMETER);
    134 		return -1;
    135 	}
    136 
    137 	if (conn->session_resumed && cipher_suite != conn->prev_cipher_suite) {
    138 		wpa_printf(MSG_DEBUG, "TLSv1: Server selected a different "
    139 			   "cipher suite for a resumed connection (0x%04x != "
    140 			   "0x%04x)", cipher_suite, conn->prev_cipher_suite);
    141 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    142 			  TLS_ALERT_ILLEGAL_PARAMETER);
    143 		return -1;
    144 	}
    145 
    146 	if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) {
    147 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for "
    148 			   "record layer");
    149 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    150 			  TLS_ALERT_INTERNAL_ERROR);
    151 		return -1;
    152 	}
    153 
    154 	conn->prev_cipher_suite = cipher_suite;
    155 
    156 	/* CompressionMethod compression_method */
    157 	if (end - pos < 1)
    158 		goto decode_error;
    159 	if (*pos != TLS_COMPRESSION_NULL) {
    160 		wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
    161 			   "compression 0x%02x", *pos);
    162 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    163 			  TLS_ALERT_ILLEGAL_PARAMETER);
    164 		return -1;
    165 	}
    166 	pos++;
    167 
    168 	if (end != pos) {
    169 		/* TODO: ServerHello extensions */
    170 		wpa_hexdump(MSG_DEBUG, "TLSv1: Unexpected extra data in the "
    171 			    "end of ServerHello", pos, end - pos);
    172 		goto decode_error;
    173 	}
    174 
    175 	if (conn->session_ticket_included && conn->session_ticket_cb) {
    176 		/* TODO: include SessionTicket extension if one was included in
    177 		 * ServerHello */
    178 		int res = conn->session_ticket_cb(
    179 			conn->session_ticket_cb_ctx, NULL, 0,
    180 			conn->client_random, conn->server_random,
    181 			conn->master_secret);
    182 		if (res < 0) {
    183 			wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket callback "
    184 				   "indicated failure");
    185 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    186 				  TLS_ALERT_HANDSHAKE_FAILURE);
    187 			return -1;
    188 		}
    189 		conn->use_session_ticket = !!res;
    190 	}
    191 
    192 	if ((conn->session_resumed || conn->use_session_ticket) &&
    193 	    tls_derive_keys(conn, NULL, 0)) {
    194 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
    195 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    196 			  TLS_ALERT_INTERNAL_ERROR);
    197 		return -1;
    198 	}
    199 
    200 	*in_len = end - in_data;
    201 
    202 	conn->state = (conn->session_resumed || conn->use_session_ticket) ?
    203 		SERVER_CHANGE_CIPHER_SPEC : SERVER_CERTIFICATE;
    204 
    205 	return 0;
    206 
    207 decode_error:
    208 	wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ServerHello");
    209 	tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    210 	return -1;
    211 }
    212 
    213 
    214 static int tls_process_certificate(struct tlsv1_client *conn, u8 ct,
    215 				   const u8 *in_data, size_t *in_len)
    216 {
    217 	const u8 *pos, *end;
    218 	size_t left, len, list_len, cert_len, idx;
    219 	u8 type;
    220 	struct x509_certificate *chain = NULL, *last = NULL, *cert;
    221 	int reason;
    222 
    223 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    224 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
    225 			   "received content type 0x%x", ct);
    226 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    227 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    228 		return -1;
    229 	}
    230 
    231 	pos = in_data;
    232 	left = *in_len;
    233 
    234 	if (left < 4) {
    235 		wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message "
    236 			   "(len=%lu)", (unsigned long) left);
    237 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    238 		return -1;
    239 	}
    240 
    241 	type = *pos++;
    242 	len = WPA_GET_BE24(pos);
    243 	pos += 3;
    244 	left -= 4;
    245 
    246 	if (len > left) {
    247 		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message "
    248 			   "length (len=%lu != left=%lu)",
    249 			   (unsigned long) len, (unsigned long) left);
    250 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    251 		return -1;
    252 	}
    253 
    254 	if (type == TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE)
    255 		return tls_process_server_key_exchange(conn, ct, in_data,
    256 						       in_len);
    257 	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
    258 		return tls_process_certificate_request(conn, ct, in_data,
    259 						       in_len);
    260 	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
    261 		return tls_process_server_hello_done(conn, ct, in_data,
    262 						     in_len);
    263 	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) {
    264 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
    265 			   "message %d (expected Certificate/"
    266 			   "ServerKeyExchange/CertificateRequest/"
    267 			   "ServerHelloDone)", type);
    268 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    269 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    270 		return -1;
    271 	}
    272 
    273 	wpa_printf(MSG_DEBUG,
    274 		   "TLSv1: Received Certificate (certificate_list len %lu)",
    275 		   (unsigned long) len);
    276 
    277 	/*
    278 	 * opaque ASN.1Cert<2^24-1>;
    279 	 *
    280 	 * struct {
    281 	 *     ASN.1Cert certificate_list<1..2^24-1>;
    282 	 * } Certificate;
    283 	 */
    284 
    285 	end = pos + len;
    286 
    287 	if (end - pos < 3) {
    288 		wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate "
    289 			   "(left=%lu)", (unsigned long) left);
    290 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    291 		return -1;
    292 	}
    293 
    294 	list_len = WPA_GET_BE24(pos);
    295 	pos += 3;
    296 
    297 	if ((size_t) (end - pos) != list_len) {
    298 		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list "
    299 			   "length (len=%lu left=%lu)",
    300 			   (unsigned long) list_len,
    301 			   (unsigned long) (end - pos));
    302 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    303 		return -1;
    304 	}
    305 
    306 	idx = 0;
    307 	while (pos < end) {
    308 		if (end - pos < 3) {
    309 			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
    310 				   "certificate_list");
    311 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    312 				  TLS_ALERT_DECODE_ERROR);
    313 			x509_certificate_chain_free(chain);
    314 			return -1;
    315 		}
    316 
    317 		cert_len = WPA_GET_BE24(pos);
    318 		pos += 3;
    319 
    320 		if ((size_t) (end - pos) < cert_len) {
    321 			wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate "
    322 				   "length (len=%lu left=%lu)",
    323 				   (unsigned long) cert_len,
    324 				   (unsigned long) (end - pos));
    325 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    326 				  TLS_ALERT_DECODE_ERROR);
    327 			x509_certificate_chain_free(chain);
    328 			return -1;
    329 		}
    330 
    331 		wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)",
    332 			   (unsigned long) idx, (unsigned long) cert_len);
    333 
    334 		if (idx == 0) {
    335 			crypto_public_key_free(conn->server_rsa_key);
    336 			if (tls_parse_cert(pos, cert_len,
    337 					   &conn->server_rsa_key)) {
    338 				wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
    339 					   "the certificate");
    340 				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    341 					  TLS_ALERT_BAD_CERTIFICATE);
    342 				x509_certificate_chain_free(chain);
    343 				return -1;
    344 			}
    345 		}
    346 
    347 		cert = x509_certificate_parse(pos, cert_len);
    348 		if (cert == NULL) {
    349 			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
    350 				   "the certificate");
    351 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    352 				  TLS_ALERT_BAD_CERTIFICATE);
    353 			x509_certificate_chain_free(chain);
    354 			return -1;
    355 		}
    356 
    357 		if (last == NULL)
    358 			chain = cert;
    359 		else
    360 			last->next = cert;
    361 		last = cert;
    362 
    363 		idx++;
    364 		pos += cert_len;
    365 	}
    366 
    367 	if (conn->cred &&
    368 	    x509_certificate_chain_validate(conn->cred->trusted_certs, chain,
    369 					    &reason, conn->disable_time_checks)
    370 	    < 0) {
    371 		int tls_reason;
    372 		wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain "
    373 			   "validation failed (reason=%d)", reason);
    374 		switch (reason) {
    375 		case X509_VALIDATE_BAD_CERTIFICATE:
    376 			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
    377 			break;
    378 		case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:
    379 			tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;
    380 			break;
    381 		case X509_VALIDATE_CERTIFICATE_REVOKED:
    382 			tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;
    383 			break;
    384 		case X509_VALIDATE_CERTIFICATE_EXPIRED:
    385 			tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;
    386 			break;
    387 		case X509_VALIDATE_CERTIFICATE_UNKNOWN:
    388 			tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;
    389 			break;
    390 		case X509_VALIDATE_UNKNOWN_CA:
    391 			tls_reason = TLS_ALERT_UNKNOWN_CA;
    392 			break;
    393 		default:
    394 			tls_reason = TLS_ALERT_BAD_CERTIFICATE;
    395 			break;
    396 		}
    397 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);
    398 		x509_certificate_chain_free(chain);
    399 		return -1;
    400 	}
    401 
    402 	x509_certificate_chain_free(chain);
    403 
    404 	*in_len = end - in_data;
    405 
    406 	conn->state = SERVER_KEY_EXCHANGE;
    407 
    408 	return 0;
    409 }
    410 
    411 
    412 static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn,
    413 					const u8 *buf, size_t len)
    414 {
    415 	const u8 *pos, *end;
    416 
    417 	tlsv1_client_free_dh(conn);
    418 
    419 	pos = buf;
    420 	end = buf + len;
    421 
    422 	if (end - pos < 3)
    423 		goto fail;
    424 	conn->dh_p_len = WPA_GET_BE16(pos);
    425 	pos += 2;
    426 	if (conn->dh_p_len == 0 || end - pos < (int) conn->dh_p_len) {
    427 		wpa_printf(MSG_DEBUG, "TLSv1: Invalid dh_p length %lu",
    428 			   (unsigned long) conn->dh_p_len);
    429 		goto fail;
    430 	}
    431 	conn->dh_p = os_malloc(conn->dh_p_len);
    432 	if (conn->dh_p == NULL)
    433 		goto fail;
    434 	os_memcpy(conn->dh_p, pos, conn->dh_p_len);
    435 	pos += conn->dh_p_len;
    436 	wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",
    437 		    conn->dh_p, conn->dh_p_len);
    438 
    439 	if (end - pos < 3)
    440 		goto fail;
    441 	conn->dh_g_len = WPA_GET_BE16(pos);
    442 	pos += 2;
    443 	if (conn->dh_g_len == 0 || end - pos < (int) conn->dh_g_len)
    444 		goto fail;
    445 	conn->dh_g = os_malloc(conn->dh_g_len);
    446 	if (conn->dh_g == NULL)
    447 		goto fail;
    448 	os_memcpy(conn->dh_g, pos, conn->dh_g_len);
    449 	pos += conn->dh_g_len;
    450 	wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",
    451 		    conn->dh_g, conn->dh_g_len);
    452 	if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)
    453 		goto fail;
    454 
    455 	if (end - pos < 3)
    456 		goto fail;
    457 	conn->dh_ys_len = WPA_GET_BE16(pos);
    458 	pos += 2;
    459 	if (conn->dh_ys_len == 0 || end - pos < (int) conn->dh_ys_len)
    460 		goto fail;
    461 	conn->dh_ys = os_malloc(conn->dh_ys_len);
    462 	if (conn->dh_ys == NULL)
    463 		goto fail;
    464 	os_memcpy(conn->dh_ys, pos, conn->dh_ys_len);
    465 	pos += conn->dh_ys_len;
    466 	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
    467 		    conn->dh_ys, conn->dh_ys_len);
    468 
    469 	return 0;
    470 
    471 fail:
    472 	wpa_printf(MSG_DEBUG, "TLSv1: Processing DH params failed");
    473 	tlsv1_client_free_dh(conn);
    474 	return -1;
    475 }
    476 
    477 
    478 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
    479 					   const u8 *in_data, size_t *in_len)
    480 {
    481 	const u8 *pos, *end;
    482 	size_t left, len;
    483 	u8 type;
    484 	const struct tls_cipher_suite *suite;
    485 
    486 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    487 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
    488 			   "received content type 0x%x", ct);
    489 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    490 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    491 		return -1;
    492 	}
    493 
    494 	pos = in_data;
    495 	left = *in_len;
    496 
    497 	if (left < 4) {
    498 		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "
    499 			   "(Left=%lu)", (unsigned long) left);
    500 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    501 		return -1;
    502 	}
    503 
    504 	type = *pos++;
    505 	len = WPA_GET_BE24(pos);
    506 	pos += 3;
    507 	left -= 4;
    508 
    509 	if (len > left) {
    510 		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "
    511 			   "length (len=%lu != left=%lu)",
    512 			   (unsigned long) len, (unsigned long) left);
    513 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    514 		return -1;
    515 	}
    516 
    517 	end = pos + len;
    518 
    519 	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
    520 		return tls_process_certificate_request(conn, ct, in_data,
    521 						       in_len);
    522 	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
    523 		return tls_process_server_hello_done(conn, ct, in_data,
    524 						     in_len);
    525 	if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {
    526 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
    527 			   "message %d (expected ServerKeyExchange/"
    528 			   "CertificateRequest/ServerHelloDone)", type);
    529 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    530 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    531 		return -1;
    532 	}
    533 
    534 	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");
    535 
    536 	if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
    537 		wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "
    538 			   "with the selected cipher suite");
    539 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    540 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    541 		return -1;
    542 	}
    543 
    544 	wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);
    545 	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
    546 	if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) {
    547 		if (tlsv1_process_diffie_hellman(conn, pos, len) < 0) {
    548 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    549 				  TLS_ALERT_DECODE_ERROR);
    550 			return -1;
    551 		}
    552 	} else {
    553 		wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");
    554 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    555 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    556 		return -1;
    557 	}
    558 
    559 	*in_len = end - in_data;
    560 
    561 	conn->state = SERVER_CERTIFICATE_REQUEST;
    562 
    563 	return 0;
    564 }
    565 
    566 
    567 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
    568 					   const u8 *in_data, size_t *in_len)
    569 {
    570 	const u8 *pos, *end;
    571 	size_t left, len;
    572 	u8 type;
    573 
    574 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    575 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
    576 			   "received content type 0x%x", ct);
    577 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    578 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    579 		return -1;
    580 	}
    581 
    582 	pos = in_data;
    583 	left = *in_len;
    584 
    585 	if (left < 4) {
    586 		wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "
    587 			   "(left=%lu)", (unsigned long) left);
    588 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    589 		return -1;
    590 	}
    591 
    592 	type = *pos++;
    593 	len = WPA_GET_BE24(pos);
    594 	pos += 3;
    595 	left -= 4;
    596 
    597 	if (len > left) {
    598 		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "
    599 			   "length (len=%lu != left=%lu)",
    600 			   (unsigned long) len, (unsigned long) left);
    601 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    602 		return -1;
    603 	}
    604 
    605 	end = pos + len;
    606 
    607 	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
    608 		return tls_process_server_hello_done(conn, ct, in_data,
    609 						     in_len);
    610 	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {
    611 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
    612 			   "message %d (expected CertificateRequest/"
    613 			   "ServerHelloDone)", type);
    614 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    615 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    616 		return -1;
    617 	}
    618 
    619 	wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");
    620 
    621 	conn->certificate_requested = 1;
    622 
    623 	*in_len = end - in_data;
    624 
    625 	conn->state = SERVER_HELLO_DONE;
    626 
    627 	return 0;
    628 }
    629 
    630 
    631 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
    632 					 const u8 *in_data, size_t *in_len)
    633 {
    634 	const u8 *pos, *end;
    635 	size_t left, len;
    636 	u8 type;
    637 
    638 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    639 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
    640 			   "received content type 0x%x", ct);
    641 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    642 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    643 		return -1;
    644 	}
    645 
    646 	pos = in_data;
    647 	left = *in_len;
    648 
    649 	if (left < 4) {
    650 		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "
    651 			   "(left=%lu)", (unsigned long) left);
    652 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    653 		return -1;
    654 	}
    655 
    656 	type = *pos++;
    657 	len = WPA_GET_BE24(pos);
    658 	pos += 3;
    659 	left -= 4;
    660 
    661 	if (len > left) {
    662 		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "
    663 			   "length (len=%lu != left=%lu)",
    664 			   (unsigned long) len, (unsigned long) left);
    665 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    666 		return -1;
    667 	}
    668 	end = pos + len;
    669 
    670 	if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {
    671 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
    672 			   "message %d (expected ServerHelloDone)", type);
    673 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    674 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    675 		return -1;
    676 	}
    677 
    678 	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");
    679 
    680 	*in_len = end - in_data;
    681 
    682 	conn->state = CLIENT_KEY_EXCHANGE;
    683 
    684 	return 0;
    685 }
    686 
    687 
    688 static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn,
    689 						 u8 ct, const u8 *in_data,
    690 						 size_t *in_len)
    691 {
    692 	const u8 *pos;
    693 	size_t left;
    694 
    695 	if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
    696 		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
    697 			   "received content type 0x%x", ct);
    698 		if (conn->use_session_ticket) {
    699 			int res;
    700 			wpa_printf(MSG_DEBUG, "TLSv1: Server may have "
    701 				   "rejected SessionTicket");
    702 			conn->use_session_ticket = 0;
    703 
    704 			/* Notify upper layers that SessionTicket failed */
    705 			res = conn->session_ticket_cb(
    706 				conn->session_ticket_cb_ctx, NULL, 0, NULL,
    707 				NULL, NULL);
    708 			if (res < 0) {
    709 				wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket "
    710 					   "callback indicated failure");
    711 				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    712 					  TLS_ALERT_HANDSHAKE_FAILURE);
    713 				return -1;
    714 			}
    715 
    716 			conn->state = SERVER_CERTIFICATE;
    717 			return tls_process_certificate(conn, ct, in_data,
    718 						       in_len);
    719 		}
    720 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    721 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    722 		return -1;
    723 	}
    724 
    725 	pos = in_data;
    726 	left = *in_len;
    727 
    728 	if (left < 1) {
    729 		wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");
    730 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    731 		return -1;
    732 	}
    733 
    734 	if (*pos != TLS_CHANGE_CIPHER_SPEC) {
    735 		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
    736 			   "received data 0x%x", *pos);
    737 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    738 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    739 		return -1;
    740 	}
    741 
    742 	wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");
    743 	if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
    744 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
    745 			   "for record layer");
    746 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    747 			  TLS_ALERT_INTERNAL_ERROR);
    748 		return -1;
    749 	}
    750 
    751 	*in_len = pos + 1 - in_data;
    752 
    753 	conn->state = SERVER_FINISHED;
    754 
    755 	return 0;
    756 }
    757 
    758 
    759 static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct,
    760 				       const u8 *in_data, size_t *in_len)
    761 {
    762 	const u8 *pos, *end;
    763 	size_t left, len, hlen;
    764 	u8 verify_data[TLS_VERIFY_DATA_LEN];
    765 	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
    766 
    767 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    768 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "
    769 			   "received content type 0x%x", ct);
    770 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    771 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    772 		return -1;
    773 	}
    774 
    775 	pos = in_data;
    776 	left = *in_len;
    777 
    778 	if (left < 4) {
    779 		wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "
    780 			   "Finished",
    781 			   (unsigned long) left);
    782 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    783 			  TLS_ALERT_DECODE_ERROR);
    784 		return -1;
    785 	}
    786 
    787 	if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
    788 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
    789 			   "type 0x%x", pos[0]);
    790 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    791 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    792 		return -1;
    793 	}
    794 
    795 	len = WPA_GET_BE24(pos + 1);
    796 
    797 	pos += 4;
    798 	left -= 4;
    799 
    800 	if (len > left) {
    801 		wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "
    802 			   "(len=%lu > left=%lu)",
    803 			   (unsigned long) len, (unsigned long) left);
    804 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    805 			  TLS_ALERT_DECODE_ERROR);
    806 		return -1;
    807 	}
    808 	end = pos + len;
    809 	if (len != TLS_VERIFY_DATA_LEN) {
    810 		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "
    811 			   "in Finished: %lu (expected %d)",
    812 			   (unsigned long) len, TLS_VERIFY_DATA_LEN);
    813 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    814 			  TLS_ALERT_DECODE_ERROR);
    815 		return -1;
    816 	}
    817 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
    818 		    pos, TLS_VERIFY_DATA_LEN);
    819 
    820 #ifdef CONFIG_TLSV12
    821 	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
    822 		hlen = SHA256_MAC_LEN;
    823 		if (conn->verify.sha256_server == NULL ||
    824 		    crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
    825 		    < 0) {
    826 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    827 				  TLS_ALERT_INTERNAL_ERROR);
    828 			conn->verify.sha256_server = NULL;
    829 			return -1;
    830 		}
    831 		conn->verify.sha256_server = NULL;
    832 	} else {
    833 #endif /* CONFIG_TLSV12 */
    834 
    835 	hlen = MD5_MAC_LEN;
    836 	if (conn->verify.md5_server == NULL ||
    837 	    crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
    838 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    839 			  TLS_ALERT_INTERNAL_ERROR);
    840 		conn->verify.md5_server = NULL;
    841 		crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
    842 		conn->verify.sha1_server = NULL;
    843 		return -1;
    844 	}
    845 	conn->verify.md5_server = NULL;
    846 	hlen = SHA1_MAC_LEN;
    847 	if (conn->verify.sha1_server == NULL ||
    848 	    crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
    849 			       &hlen) < 0) {
    850 		conn->verify.sha1_server = NULL;
    851 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    852 			  TLS_ALERT_INTERNAL_ERROR);
    853 		return -1;
    854 	}
    855 	conn->verify.sha1_server = NULL;
    856 	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
    857 
    858 #ifdef CONFIG_TLSV12
    859 	}
    860 #endif /* CONFIG_TLSV12 */
    861 
    862 	if (tls_prf(conn->rl.tls_version,
    863 		    conn->master_secret, TLS_MASTER_SECRET_LEN,
    864 		    "server finished", hash, hlen,
    865 		    verify_data, TLS_VERIFY_DATA_LEN)) {
    866 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
    867 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    868 			  TLS_ALERT_DECRYPT_ERROR);
    869 		return -1;
    870 	}
    871 	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
    872 			verify_data, TLS_VERIFY_DATA_LEN);
    873 
    874 	if (os_memcmp(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
    875 		wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");
    876 		return -1;
    877 	}
    878 
    879 	wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");
    880 
    881 	*in_len = end - in_data;
    882 
    883 	conn->state = (conn->session_resumed || conn->use_session_ticket) ?
    884 		CHANGE_CIPHER_SPEC : ACK_FINISHED;
    885 
    886 	return 0;
    887 }
    888 
    889 
    890 static int tls_process_application_data(struct tlsv1_client *conn, u8 ct,
    891 					const u8 *in_data, size_t *in_len,
    892 					u8 **out_data, size_t *out_len)
    893 {
    894 	const u8 *pos;
    895 	size_t left;
    896 
    897 	if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {
    898 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Application Data; "
    899 			   "received content type 0x%x", ct);
    900 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    901 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    902 		return -1;
    903 	}
    904 
    905 	pos = in_data;
    906 	left = *in_len;
    907 
    908 	wpa_hexdump(MSG_DEBUG, "TLSv1: Application Data included in Handshake",
    909 		    pos, left);
    910 
    911 	*out_data = os_malloc(left);
    912 	if (*out_data) {
    913 		os_memcpy(*out_data, pos, left);
    914 		*out_len = left;
    915 	}
    916 
    917 	return 0;
    918 }
    919 
    920 
    921 int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct,
    922 				   const u8 *buf, size_t *len,
    923 				   u8 **out_data, size_t *out_len)
    924 {
    925 	if (ct == TLS_CONTENT_TYPE_ALERT) {
    926 		if (*len < 2) {
    927 			wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow");
    928 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    929 				  TLS_ALERT_DECODE_ERROR);
    930 			return -1;
    931 		}
    932 		wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",
    933 			   buf[0], buf[1]);
    934 		*len = 2;
    935 		conn->state = FAILED;
    936 		return -1;
    937 	}
    938 
    939 	if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&
    940 	    buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {
    941 		size_t hr_len = WPA_GET_BE24(buf + 1);
    942 		if (hr_len > *len - 4) {
    943 			wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");
    944 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    945 				  TLS_ALERT_DECODE_ERROR);
    946 			return -1;
    947 		}
    948 		wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");
    949 		*len = 4 + hr_len;
    950 		return 0;
    951 	}
    952 
    953 	switch (conn->state) {
    954 	case SERVER_HELLO:
    955 		if (tls_process_server_hello(conn, ct, buf, len))
    956 			return -1;
    957 		break;
    958 	case SERVER_CERTIFICATE:
    959 		if (tls_process_certificate(conn, ct, buf, len))
    960 			return -1;
    961 		break;
    962 	case SERVER_KEY_EXCHANGE:
    963 		if (tls_process_server_key_exchange(conn, ct, buf, len))
    964 			return -1;
    965 		break;
    966 	case SERVER_CERTIFICATE_REQUEST:
    967 		if (tls_process_certificate_request(conn, ct, buf, len))
    968 			return -1;
    969 		break;
    970 	case SERVER_HELLO_DONE:
    971 		if (tls_process_server_hello_done(conn, ct, buf, len))
    972 			return -1;
    973 		break;
    974 	case SERVER_CHANGE_CIPHER_SPEC:
    975 		if (tls_process_server_change_cipher_spec(conn, ct, buf, len))
    976 			return -1;
    977 		break;
    978 	case SERVER_FINISHED:
    979 		if (tls_process_server_finished(conn, ct, buf, len))
    980 			return -1;
    981 		break;
    982 	case ACK_FINISHED:
    983 		if (out_data &&
    984 		    tls_process_application_data(conn, ct, buf, len, out_data,
    985 						 out_len))
    986 			return -1;
    987 		break;
    988 	default:
    989 		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "
    990 			   "while processing received message",
    991 			   conn->state);
    992 		return -1;
    993 	}
    994 
    995 	if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
    996 		tls_verify_hash_add(&conn->verify, buf, *len);
    997 
    998 	return 0;
    999 }
   1000