Home | History | Annotate | Download | only in tls
      1 /*
      2  * TLSv1 client - 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_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 unsigned int count_bits(const u8 *val, size_t len)
    413 {
    414 	size_t i;
    415 	unsigned int bits;
    416 	u8 tmp;
    417 
    418 	for (i = 0; i < len; i++) {
    419 		if (val[i])
    420 			break;
    421 	}
    422 	if (i == len)
    423 		return 0;
    424 
    425 	bits = (len - i - 1) * 8;
    426 	tmp = val[i];
    427 	while (tmp) {
    428 		bits++;
    429 		tmp >>= 1;
    430 	}
    431 
    432 	return bits;
    433 }
    434 
    435 
    436 static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn,
    437 					const u8 *buf, size_t len,
    438 					tls_key_exchange key_exchange)
    439 {
    440 	const u8 *pos, *end, *server_params, *server_params_end;
    441 	u8 alert;
    442 	unsigned int bits;
    443 
    444 	tlsv1_client_free_dh(conn);
    445 
    446 	pos = buf;
    447 	end = buf + len;
    448 
    449 	if (end - pos < 3)
    450 		goto fail;
    451 	server_params = pos;
    452 	conn->dh_p_len = WPA_GET_BE16(pos);
    453 	pos += 2;
    454 	if (conn->dh_p_len == 0 || end - pos < (int) conn->dh_p_len) {
    455 		wpa_printf(MSG_DEBUG, "TLSv1: Invalid dh_p length %lu",
    456 			   (unsigned long) conn->dh_p_len);
    457 		goto fail;
    458 	}
    459 	bits = count_bits(pos, conn->dh_p_len);
    460 	if (bits < 768) {
    461 		wpa_printf(MSG_INFO, "TLSv1: Reject under 768-bit DH prime (insecure; only %u bits)",
    462 			   bits);
    463 		wpa_hexdump(MSG_DEBUG, "TLSv1: Rejected DH prime",
    464 			    pos, conn->dh_p_len);
    465 		goto fail;
    466 	}
    467 	conn->dh_p = os_malloc(conn->dh_p_len);
    468 	if (conn->dh_p == NULL)
    469 		goto fail;
    470 	os_memcpy(conn->dh_p, pos, conn->dh_p_len);
    471 	pos += conn->dh_p_len;
    472 	wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",
    473 		    conn->dh_p, conn->dh_p_len);
    474 
    475 	if (end - pos < 3)
    476 		goto fail;
    477 	conn->dh_g_len = WPA_GET_BE16(pos);
    478 	pos += 2;
    479 	if (conn->dh_g_len == 0 || end - pos < (int) conn->dh_g_len)
    480 		goto fail;
    481 	conn->dh_g = os_malloc(conn->dh_g_len);
    482 	if (conn->dh_g == NULL)
    483 		goto fail;
    484 	os_memcpy(conn->dh_g, pos, conn->dh_g_len);
    485 	pos += conn->dh_g_len;
    486 	wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",
    487 		    conn->dh_g, conn->dh_g_len);
    488 	if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)
    489 		goto fail;
    490 
    491 	if (end - pos < 3)
    492 		goto fail;
    493 	conn->dh_ys_len = WPA_GET_BE16(pos);
    494 	pos += 2;
    495 	if (conn->dh_ys_len == 0 || end - pos < (int) conn->dh_ys_len)
    496 		goto fail;
    497 	conn->dh_ys = os_malloc(conn->dh_ys_len);
    498 	if (conn->dh_ys == NULL)
    499 		goto fail;
    500 	os_memcpy(conn->dh_ys, pos, conn->dh_ys_len);
    501 	pos += conn->dh_ys_len;
    502 	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
    503 		    conn->dh_ys, conn->dh_ys_len);
    504 	server_params_end = pos;
    505 
    506 	if (key_exchange == TLS_KEY_X_DHE_RSA) {
    507 		u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
    508 		int hlen;
    509 
    510 		if (conn->rl.tls_version == TLS_VERSION_1_2) {
    511 #ifdef CONFIG_TLSV12
    512 			/*
    513 			 * RFC 5246, 4.7:
    514 			 * TLS v1.2 adds explicit indication of the used
    515 			 * signature and hash algorithms.
    516 			 *
    517 			 * struct {
    518 			 *   HashAlgorithm hash;
    519 			 *   SignatureAlgorithm signature;
    520 			 * } SignatureAndHashAlgorithm;
    521 			 */
    522 			if (end - pos < 2)
    523 				goto fail;
    524 			if (pos[0] != TLS_HASH_ALG_SHA256 ||
    525 			    pos[1] != TLS_SIGN_ALG_RSA) {
    526 				wpa_printf(MSG_DEBUG, "TLSv1.2: Unsupported hash(%u)/signature(%u) algorithm",
    527 					   pos[0], pos[1]);
    528 				goto fail;
    529 			}
    530 			pos += 2;
    531 
    532 			hlen = tlsv12_key_x_server_params_hash(
    533 				conn->rl.tls_version, conn->client_random,
    534 				conn->server_random, server_params,
    535 				server_params_end - server_params, hash);
    536 #else /* CONFIG_TLSV12 */
    537 			goto fail;
    538 #endif /* CONFIG_TLSV12 */
    539 		} else {
    540 			hlen = tls_key_x_server_params_hash(
    541 				conn->rl.tls_version, conn->client_random,
    542 				conn->server_random, server_params,
    543 				server_params_end - server_params, hash);
    544 		}
    545 
    546 		if (hlen < 0)
    547 			goto fail;
    548 		wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerKeyExchange hash",
    549 			    hash, hlen);
    550 
    551 		if (tls_verify_signature(conn->rl.tls_version,
    552 					 conn->server_rsa_key,
    553 					 hash, hlen, pos, end - pos,
    554 					 &alert) < 0)
    555 			goto fail;
    556 	}
    557 
    558 	return 0;
    559 
    560 fail:
    561 	wpa_printf(MSG_DEBUG, "TLSv1: Processing DH params failed");
    562 	tlsv1_client_free_dh(conn);
    563 	return -1;
    564 }
    565 
    566 
    567 static int tls_process_server_key_exchange(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 	const struct tls_cipher_suite *suite;
    574 
    575 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    576 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
    577 			   "received content type 0x%x", ct);
    578 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    579 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    580 		return -1;
    581 	}
    582 
    583 	pos = in_data;
    584 	left = *in_len;
    585 
    586 	if (left < 4) {
    587 		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "
    588 			   "(Left=%lu)", (unsigned long) left);
    589 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    590 		return -1;
    591 	}
    592 
    593 	type = *pos++;
    594 	len = WPA_GET_BE24(pos);
    595 	pos += 3;
    596 	left -= 4;
    597 
    598 	if (len > left) {
    599 		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "
    600 			   "length (len=%lu != left=%lu)",
    601 			   (unsigned long) len, (unsigned long) left);
    602 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    603 		return -1;
    604 	}
    605 
    606 	end = pos + len;
    607 
    608 	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
    609 		return tls_process_certificate_request(conn, ct, in_data,
    610 						       in_len);
    611 	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
    612 		return tls_process_server_hello_done(conn, ct, in_data,
    613 						     in_len);
    614 	if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {
    615 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
    616 			   "message %d (expected ServerKeyExchange/"
    617 			   "CertificateRequest/ServerHelloDone)", type);
    618 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    619 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    620 		return -1;
    621 	}
    622 
    623 	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");
    624 
    625 	if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
    626 		wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "
    627 			   "with the selected cipher suite");
    628 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    629 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    630 		return -1;
    631 	}
    632 
    633 	wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);
    634 	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
    635 	if (suite && (suite->key_exchange == TLS_KEY_X_DH_anon ||
    636 		      suite->key_exchange == TLS_KEY_X_DHE_RSA)) {
    637 		if (tlsv1_process_diffie_hellman(conn, pos, len,
    638 						 suite->key_exchange) < 0) {
    639 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    640 				  TLS_ALERT_DECODE_ERROR);
    641 			return -1;
    642 		}
    643 	} else {
    644 		wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");
    645 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    646 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    647 		return -1;
    648 	}
    649 
    650 	*in_len = end - in_data;
    651 
    652 	conn->state = SERVER_CERTIFICATE_REQUEST;
    653 
    654 	return 0;
    655 }
    656 
    657 
    658 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
    659 					   const u8 *in_data, size_t *in_len)
    660 {
    661 	const u8 *pos, *end;
    662 	size_t left, len;
    663 	u8 type;
    664 
    665 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    666 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
    667 			   "received content type 0x%x", ct);
    668 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    669 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    670 		return -1;
    671 	}
    672 
    673 	pos = in_data;
    674 	left = *in_len;
    675 
    676 	if (left < 4) {
    677 		wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "
    678 			   "(left=%lu)", (unsigned long) left);
    679 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    680 		return -1;
    681 	}
    682 
    683 	type = *pos++;
    684 	len = WPA_GET_BE24(pos);
    685 	pos += 3;
    686 	left -= 4;
    687 
    688 	if (len > left) {
    689 		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "
    690 			   "length (len=%lu != left=%lu)",
    691 			   (unsigned long) len, (unsigned long) left);
    692 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    693 		return -1;
    694 	}
    695 
    696 	end = pos + len;
    697 
    698 	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
    699 		return tls_process_server_hello_done(conn, ct, in_data,
    700 						     in_len);
    701 	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {
    702 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
    703 			   "message %d (expected CertificateRequest/"
    704 			   "ServerHelloDone)", type);
    705 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    706 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    707 		return -1;
    708 	}
    709 
    710 	wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");
    711 
    712 	conn->certificate_requested = 1;
    713 
    714 	*in_len = end - in_data;
    715 
    716 	conn->state = SERVER_HELLO_DONE;
    717 
    718 	return 0;
    719 }
    720 
    721 
    722 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
    723 					 const u8 *in_data, size_t *in_len)
    724 {
    725 	const u8 *pos, *end;
    726 	size_t left, len;
    727 	u8 type;
    728 
    729 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    730 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
    731 			   "received content type 0x%x", ct);
    732 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    733 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    734 		return -1;
    735 	}
    736 
    737 	pos = in_data;
    738 	left = *in_len;
    739 
    740 	if (left < 4) {
    741 		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "
    742 			   "(left=%lu)", (unsigned long) left);
    743 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    744 		return -1;
    745 	}
    746 
    747 	type = *pos++;
    748 	len = WPA_GET_BE24(pos);
    749 	pos += 3;
    750 	left -= 4;
    751 
    752 	if (len > left) {
    753 		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "
    754 			   "length (len=%lu != left=%lu)",
    755 			   (unsigned long) len, (unsigned long) left);
    756 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    757 		return -1;
    758 	}
    759 	end = pos + len;
    760 
    761 	if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {
    762 		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
    763 			   "message %d (expected ServerHelloDone)", type);
    764 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    765 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    766 		return -1;
    767 	}
    768 
    769 	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");
    770 
    771 	*in_len = end - in_data;
    772 
    773 	conn->state = CLIENT_KEY_EXCHANGE;
    774 
    775 	return 0;
    776 }
    777 
    778 
    779 static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn,
    780 						 u8 ct, const u8 *in_data,
    781 						 size_t *in_len)
    782 {
    783 	const u8 *pos;
    784 	size_t left;
    785 
    786 	if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
    787 		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
    788 			   "received content type 0x%x", ct);
    789 		if (conn->use_session_ticket) {
    790 			int res;
    791 			wpa_printf(MSG_DEBUG, "TLSv1: Server may have "
    792 				   "rejected SessionTicket");
    793 			conn->use_session_ticket = 0;
    794 
    795 			/* Notify upper layers that SessionTicket failed */
    796 			res = conn->session_ticket_cb(
    797 				conn->session_ticket_cb_ctx, NULL, 0, NULL,
    798 				NULL, NULL);
    799 			if (res < 0) {
    800 				wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket "
    801 					   "callback indicated failure");
    802 				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    803 					  TLS_ALERT_HANDSHAKE_FAILURE);
    804 				return -1;
    805 			}
    806 
    807 			conn->state = SERVER_CERTIFICATE;
    808 			return tls_process_certificate(conn, ct, in_data,
    809 						       in_len);
    810 		}
    811 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    812 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    813 		return -1;
    814 	}
    815 
    816 	pos = in_data;
    817 	left = *in_len;
    818 
    819 	if (left < 1) {
    820 		wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");
    821 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
    822 		return -1;
    823 	}
    824 
    825 	if (*pos != TLS_CHANGE_CIPHER_SPEC) {
    826 		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
    827 			   "received data 0x%x", *pos);
    828 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    829 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    830 		return -1;
    831 	}
    832 
    833 	wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");
    834 	if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
    835 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
    836 			   "for record layer");
    837 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    838 			  TLS_ALERT_INTERNAL_ERROR);
    839 		return -1;
    840 	}
    841 
    842 	*in_len = pos + 1 - in_data;
    843 
    844 	conn->state = SERVER_FINISHED;
    845 
    846 	return 0;
    847 }
    848 
    849 
    850 static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct,
    851 				       const u8 *in_data, size_t *in_len)
    852 {
    853 	const u8 *pos, *end;
    854 	size_t left, len, hlen;
    855 	u8 verify_data[TLS_VERIFY_DATA_LEN];
    856 	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
    857 
    858 	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
    859 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "
    860 			   "received content type 0x%x", ct);
    861 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    862 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    863 		return -1;
    864 	}
    865 
    866 	pos = in_data;
    867 	left = *in_len;
    868 
    869 	if (left < 4) {
    870 		wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "
    871 			   "Finished",
    872 			   (unsigned long) left);
    873 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    874 			  TLS_ALERT_DECODE_ERROR);
    875 		return -1;
    876 	}
    877 
    878 	if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
    879 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
    880 			   "type 0x%x", pos[0]);
    881 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    882 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    883 		return -1;
    884 	}
    885 
    886 	len = WPA_GET_BE24(pos + 1);
    887 
    888 	pos += 4;
    889 	left -= 4;
    890 
    891 	if (len > left) {
    892 		wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "
    893 			   "(len=%lu > left=%lu)",
    894 			   (unsigned long) len, (unsigned long) left);
    895 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    896 			  TLS_ALERT_DECODE_ERROR);
    897 		return -1;
    898 	}
    899 	end = pos + len;
    900 	if (len != TLS_VERIFY_DATA_LEN) {
    901 		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "
    902 			   "in Finished: %lu (expected %d)",
    903 			   (unsigned long) len, TLS_VERIFY_DATA_LEN);
    904 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    905 			  TLS_ALERT_DECODE_ERROR);
    906 		return -1;
    907 	}
    908 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
    909 		    pos, TLS_VERIFY_DATA_LEN);
    910 
    911 #ifdef CONFIG_TLSV12
    912 	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
    913 		hlen = SHA256_MAC_LEN;
    914 		if (conn->verify.sha256_server == NULL ||
    915 		    crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
    916 		    < 0) {
    917 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    918 				  TLS_ALERT_INTERNAL_ERROR);
    919 			conn->verify.sha256_server = NULL;
    920 			return -1;
    921 		}
    922 		conn->verify.sha256_server = NULL;
    923 	} else {
    924 #endif /* CONFIG_TLSV12 */
    925 
    926 	hlen = MD5_MAC_LEN;
    927 	if (conn->verify.md5_server == NULL ||
    928 	    crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
    929 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    930 			  TLS_ALERT_INTERNAL_ERROR);
    931 		conn->verify.md5_server = NULL;
    932 		crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
    933 		conn->verify.sha1_server = NULL;
    934 		return -1;
    935 	}
    936 	conn->verify.md5_server = NULL;
    937 	hlen = SHA1_MAC_LEN;
    938 	if (conn->verify.sha1_server == NULL ||
    939 	    crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
    940 			       &hlen) < 0) {
    941 		conn->verify.sha1_server = NULL;
    942 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    943 			  TLS_ALERT_INTERNAL_ERROR);
    944 		return -1;
    945 	}
    946 	conn->verify.sha1_server = NULL;
    947 	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
    948 
    949 #ifdef CONFIG_TLSV12
    950 	}
    951 #endif /* CONFIG_TLSV12 */
    952 
    953 	if (tls_prf(conn->rl.tls_version,
    954 		    conn->master_secret, TLS_MASTER_SECRET_LEN,
    955 		    "server finished", hash, hlen,
    956 		    verify_data, TLS_VERIFY_DATA_LEN)) {
    957 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
    958 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    959 			  TLS_ALERT_DECRYPT_ERROR);
    960 		return -1;
    961 	}
    962 	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
    963 			verify_data, TLS_VERIFY_DATA_LEN);
    964 
    965 	if (os_memcmp_const(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
    966 		wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");
    967 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    968 			  TLS_ALERT_DECRYPT_ERROR);
    969 		return -1;
    970 	}
    971 
    972 	wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");
    973 
    974 	*in_len = end - in_data;
    975 
    976 	conn->state = (conn->session_resumed || conn->use_session_ticket) ?
    977 		CHANGE_CIPHER_SPEC : ACK_FINISHED;
    978 
    979 	return 0;
    980 }
    981 
    982 
    983 static int tls_process_application_data(struct tlsv1_client *conn, u8 ct,
    984 					const u8 *in_data, size_t *in_len,
    985 					u8 **out_data, size_t *out_len)
    986 {
    987 	const u8 *pos;
    988 	size_t left;
    989 
    990 	if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {
    991 		wpa_printf(MSG_DEBUG, "TLSv1: Expected Application Data; "
    992 			   "received content type 0x%x", ct);
    993 		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
    994 			  TLS_ALERT_UNEXPECTED_MESSAGE);
    995 		return -1;
    996 	}
    997 
    998 	pos = in_data;
    999 	left = *in_len;
   1000 
   1001 	wpa_hexdump(MSG_DEBUG, "TLSv1: Application Data included in Handshake",
   1002 		    pos, left);
   1003 
   1004 	*out_data = os_malloc(left);
   1005 	if (*out_data) {
   1006 		os_memcpy(*out_data, pos, left);
   1007 		*out_len = left;
   1008 	}
   1009 
   1010 	return 0;
   1011 }
   1012 
   1013 
   1014 int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct,
   1015 				   const u8 *buf, size_t *len,
   1016 				   u8 **out_data, size_t *out_len)
   1017 {
   1018 	if (ct == TLS_CONTENT_TYPE_ALERT) {
   1019 		if (*len < 2) {
   1020 			wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow");
   1021 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
   1022 				  TLS_ALERT_DECODE_ERROR);
   1023 			return -1;
   1024 		}
   1025 		wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",
   1026 			   buf[0], buf[1]);
   1027 		*len = 2;
   1028 		conn->state = FAILED;
   1029 		return -1;
   1030 	}
   1031 
   1032 	if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&
   1033 	    buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {
   1034 		size_t hr_len = WPA_GET_BE24(buf + 1);
   1035 		if (hr_len > *len - 4) {
   1036 			wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");
   1037 			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
   1038 				  TLS_ALERT_DECODE_ERROR);
   1039 			return -1;
   1040 		}
   1041 		wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");
   1042 		*len = 4 + hr_len;
   1043 		return 0;
   1044 	}
   1045 
   1046 	switch (conn->state) {
   1047 	case SERVER_HELLO:
   1048 		if (tls_process_server_hello(conn, ct, buf, len))
   1049 			return -1;
   1050 		break;
   1051 	case SERVER_CERTIFICATE:
   1052 		if (tls_process_certificate(conn, ct, buf, len))
   1053 			return -1;
   1054 		break;
   1055 	case SERVER_KEY_EXCHANGE:
   1056 		if (tls_process_server_key_exchange(conn, ct, buf, len))
   1057 			return -1;
   1058 		break;
   1059 	case SERVER_CERTIFICATE_REQUEST:
   1060 		if (tls_process_certificate_request(conn, ct, buf, len))
   1061 			return -1;
   1062 		break;
   1063 	case SERVER_HELLO_DONE:
   1064 		if (tls_process_server_hello_done(conn, ct, buf, len))
   1065 			return -1;
   1066 		break;
   1067 	case SERVER_CHANGE_CIPHER_SPEC:
   1068 		if (tls_process_server_change_cipher_spec(conn, ct, buf, len))
   1069 			return -1;
   1070 		break;
   1071 	case SERVER_FINISHED:
   1072 		if (tls_process_server_finished(conn, ct, buf, len))
   1073 			return -1;
   1074 		break;
   1075 	case ACK_FINISHED:
   1076 		if (out_data &&
   1077 		    tls_process_application_data(conn, ct, buf, len, out_data,
   1078 						 out_len))
   1079 			return -1;
   1080 		break;
   1081 	default:
   1082 		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "
   1083 			   "while processing received message",
   1084 			   conn->state);
   1085 		return -1;
   1086 	}
   1087 
   1088 	if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
   1089 		tls_verify_hash_add(&conn->verify, buf, *len);
   1090 
   1091 	return 0;
   1092 }
   1093