Home | History | Annotate | Download | only in tls
      1 /*
      2  * TLSv1 server - write 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 "crypto/random.h"
     17 #include "x509v3.h"
     18 #include "tlsv1_common.h"
     19 #include "tlsv1_record.h"
     20 #include "tlsv1_server.h"
     21 #include "tlsv1_server_i.h"
     22 
     23 
     24 static size_t tls_server_cert_chain_der_len(struct tlsv1_server *conn)
     25 {
     26 	size_t len = 0;
     27 	struct x509_certificate *cert;
     28 
     29 	cert = conn->cred->cert;
     30 	while (cert) {
     31 		len += 3 + cert->cert_len;
     32 		if (x509_certificate_self_signed(cert))
     33 			break;
     34 		cert = x509_certificate_get_subject(conn->cred->trusted_certs,
     35 						    &cert->issuer);
     36 	}
     37 
     38 	return len;
     39 }
     40 
     41 
     42 static int tls_write_server_hello(struct tlsv1_server *conn,
     43 				  u8 **msgpos, u8 *end)
     44 {
     45 	u8 *pos, *rhdr, *hs_start, *hs_length;
     46 	struct os_time now;
     47 	size_t rlen;
     48 
     49 	pos = *msgpos;
     50 
     51 	tlsv1_server_log(conn, "Send ServerHello");
     52 	rhdr = pos;
     53 	pos += TLS_RECORD_HEADER_LEN;
     54 
     55 	os_get_time(&now);
     56 	WPA_PUT_BE32(conn->server_random, now.sec);
     57 	if (random_get_bytes(conn->server_random + 4, TLS_RANDOM_LEN - 4)) {
     58 		wpa_printf(MSG_ERROR, "TLSv1: Could not generate "
     59 			   "server_random");
     60 		return -1;
     61 	}
     62 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random",
     63 		    conn->server_random, TLS_RANDOM_LEN);
     64 
     65 	conn->session_id_len = TLS_SESSION_ID_MAX_LEN;
     66 	if (random_get_bytes(conn->session_id, conn->session_id_len)) {
     67 		wpa_printf(MSG_ERROR, "TLSv1: Could not generate "
     68 			   "session_id");
     69 		return -1;
     70 	}
     71 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id",
     72 		    conn->session_id, conn->session_id_len);
     73 
     74 	/* opaque fragment[TLSPlaintext.length] */
     75 
     76 	/* Handshake */
     77 	hs_start = pos;
     78 	/* HandshakeType msg_type */
     79 	*pos++ = TLS_HANDSHAKE_TYPE_SERVER_HELLO;
     80 	/* uint24 length (to be filled) */
     81 	hs_length = pos;
     82 	pos += 3;
     83 	/* body - ServerHello */
     84 	/* ProtocolVersion server_version */
     85 	WPA_PUT_BE16(pos, conn->rl.tls_version);
     86 	pos += 2;
     87 	/* Random random: uint32 gmt_unix_time, opaque random_bytes */
     88 	os_memcpy(pos, conn->server_random, TLS_RANDOM_LEN);
     89 	pos += TLS_RANDOM_LEN;
     90 	/* SessionID session_id */
     91 	*pos++ = conn->session_id_len;
     92 	os_memcpy(pos, conn->session_id, conn->session_id_len);
     93 	pos += conn->session_id_len;
     94 	/* CipherSuite cipher_suite */
     95 	WPA_PUT_BE16(pos, conn->cipher_suite);
     96 	pos += 2;
     97 	/* CompressionMethod compression_method */
     98 	*pos++ = TLS_COMPRESSION_NULL;
     99 
    100 	if (conn->session_ticket && conn->session_ticket_cb) {
    101 		int res = conn->session_ticket_cb(
    102 			conn->session_ticket_cb_ctx,
    103 			conn->session_ticket, conn->session_ticket_len,
    104 			conn->client_random, conn->server_random,
    105 			conn->master_secret);
    106 		if (res < 0) {
    107 			tlsv1_server_log(conn, "SessionTicket callback indicated failure");
    108 			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    109 					   TLS_ALERT_HANDSHAKE_FAILURE);
    110 			return -1;
    111 		}
    112 		conn->use_session_ticket = res;
    113 
    114 		if (conn->use_session_ticket) {
    115 			if (tlsv1_server_derive_keys(conn, NULL, 0) < 0) {
    116 				wpa_printf(MSG_DEBUG, "TLSv1: Failed to "
    117 					   "derive keys");
    118 				tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    119 						   TLS_ALERT_INTERNAL_ERROR);
    120 				return -1;
    121 			}
    122 		}
    123 
    124 		/*
    125 		 * RFC 4507 specifies that server would include an empty
    126 		 * SessionTicket extension in ServerHello and a
    127 		 * NewSessionTicket message after the ServerHello. However,
    128 		 * EAP-FAST (RFC 4851), i.e., the only user of SessionTicket
    129 		 * extension at the moment, does not use such extensions.
    130 		 *
    131 		 * TODO: Add support for configuring RFC 4507 behavior and make
    132 		 * EAP-FAST disable it.
    133 		 */
    134 	}
    135 
    136 	WPA_PUT_BE24(hs_length, pos - hs_length - 3);
    137 	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
    138 
    139 	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
    140 			      rhdr, end - rhdr, hs_start, pos - hs_start,
    141 			      &rlen) < 0) {
    142 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create TLS record");
    143 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    144 				   TLS_ALERT_INTERNAL_ERROR);
    145 		return -1;
    146 	}
    147 	pos = rhdr + rlen;
    148 
    149 	*msgpos = pos;
    150 
    151 	return 0;
    152 }
    153 
    154 
    155 static int tls_write_server_certificate(struct tlsv1_server *conn,
    156 					u8 **msgpos, u8 *end)
    157 {
    158 	u8 *pos, *rhdr, *hs_start, *hs_length, *cert_start;
    159 	size_t rlen;
    160 	struct x509_certificate *cert;
    161 	const struct tls_cipher_suite *suite;
    162 
    163 	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
    164 	if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) {
    165 		wpa_printf(MSG_DEBUG, "TLSv1: Do not send Certificate when "
    166 			   "using anonymous DH");
    167 		return 0;
    168 	}
    169 
    170 	pos = *msgpos;
    171 
    172 	tlsv1_server_log(conn, "Send Certificate");
    173 	rhdr = pos;
    174 	pos += TLS_RECORD_HEADER_LEN;
    175 
    176 	/* opaque fragment[TLSPlaintext.length] */
    177 
    178 	/* Handshake */
    179 	hs_start = pos;
    180 	/* HandshakeType msg_type */
    181 	*pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE;
    182 	/* uint24 length (to be filled) */
    183 	hs_length = pos;
    184 	pos += 3;
    185 	/* body - Certificate */
    186 	/* uint24 length (to be filled) */
    187 	cert_start = pos;
    188 	pos += 3;
    189 	cert = conn->cred->cert;
    190 	while (cert) {
    191 		if (pos + 3 + cert->cert_len > end) {
    192 			wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space "
    193 				   "for Certificate (cert_len=%lu left=%lu)",
    194 				   (unsigned long) cert->cert_len,
    195 				   (unsigned long) (end - pos));
    196 			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    197 					   TLS_ALERT_INTERNAL_ERROR);
    198 			return -1;
    199 		}
    200 		WPA_PUT_BE24(pos, cert->cert_len);
    201 		pos += 3;
    202 		os_memcpy(pos, cert->cert_start, cert->cert_len);
    203 		pos += cert->cert_len;
    204 
    205 		if (x509_certificate_self_signed(cert))
    206 			break;
    207 		cert = x509_certificate_get_subject(conn->cred->trusted_certs,
    208 						    &cert->issuer);
    209 	}
    210 	if (cert == conn->cred->cert || cert == NULL) {
    211 		/*
    212 		 * Server was not configured with all the needed certificates
    213 		 * to form a full certificate chain. The client may fail to
    214 		 * validate the chain unless it is configured with all the
    215 		 * missing CA certificates.
    216 		 */
    217 		wpa_printf(MSG_DEBUG, "TLSv1: Full server certificate chain "
    218 			   "not configured - validation may fail");
    219 	}
    220 	WPA_PUT_BE24(cert_start, pos - cert_start - 3);
    221 
    222 	WPA_PUT_BE24(hs_length, pos - hs_length - 3);
    223 
    224 	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
    225 			      rhdr, end - rhdr, hs_start, pos - hs_start,
    226 			      &rlen) < 0) {
    227 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
    228 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    229 				   TLS_ALERT_INTERNAL_ERROR);
    230 		return -1;
    231 	}
    232 	pos = rhdr + rlen;
    233 
    234 	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
    235 
    236 	*msgpos = pos;
    237 
    238 	return 0;
    239 }
    240 
    241 
    242 static int tls_write_server_key_exchange(struct tlsv1_server *conn,
    243 					 u8 **msgpos, u8 *end)
    244 {
    245 	tls_key_exchange keyx;
    246 	const struct tls_cipher_suite *suite;
    247 	u8 *pos, *rhdr, *hs_start, *hs_length, *server_params;
    248 	size_t rlen;
    249 	u8 *dh_ys;
    250 	size_t dh_ys_len;
    251 	const u8 *dh_p;
    252 	size_t dh_p_len;
    253 
    254 	suite = tls_get_cipher_suite(conn->rl.cipher_suite);
    255 	if (suite == NULL)
    256 		keyx = TLS_KEY_X_NULL;
    257 	else
    258 		keyx = suite->key_exchange;
    259 
    260 	if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
    261 		wpa_printf(MSG_DEBUG, "TLSv1: No ServerKeyExchange needed");
    262 		return 0;
    263 	}
    264 
    265 	if (keyx != TLS_KEY_X_DH_anon && keyx != TLS_KEY_X_DHE_RSA) {
    266 		wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not yet "
    267 			   "supported with key exchange type %d", keyx);
    268 		return -1;
    269 	}
    270 
    271 	if (conn->cred == NULL || conn->cred->dh_p == NULL ||
    272 	    conn->cred->dh_g == NULL) {
    273 		wpa_printf(MSG_DEBUG, "TLSv1: No DH parameters available for "
    274 			   "ServerKeyExhcange");
    275 		return -1;
    276 	}
    277 
    278 	tlsv1_server_get_dh_p(conn, &dh_p, &dh_p_len);
    279 
    280 	os_free(conn->dh_secret);
    281 	conn->dh_secret_len = dh_p_len;
    282 	conn->dh_secret = os_malloc(conn->dh_secret_len);
    283 	if (conn->dh_secret == NULL) {
    284 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
    285 			   "memory for secret (Diffie-Hellman)");
    286 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    287 				   TLS_ALERT_INTERNAL_ERROR);
    288 		return -1;
    289 	}
    290 	if (random_get_bytes(conn->dh_secret, conn->dh_secret_len)) {
    291 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random "
    292 			   "data for Diffie-Hellman");
    293 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    294 				   TLS_ALERT_INTERNAL_ERROR);
    295 		os_free(conn->dh_secret);
    296 		conn->dh_secret = NULL;
    297 		return -1;
    298 	}
    299 
    300 	if (os_memcmp(conn->dh_secret, dh_p, conn->dh_secret_len) > 0)
    301 		conn->dh_secret[0] = 0; /* make sure secret < p */
    302 
    303 	pos = conn->dh_secret;
    304 	while (pos + 1 < conn->dh_secret + conn->dh_secret_len && *pos == 0)
    305 		pos++;
    306 	if (pos != conn->dh_secret) {
    307 		os_memmove(conn->dh_secret, pos,
    308 			   conn->dh_secret_len - (pos - conn->dh_secret));
    309 		conn->dh_secret_len -= pos - conn->dh_secret;
    310 	}
    311 	wpa_hexdump_key(MSG_DEBUG, "TLSv1: DH server's secret value",
    312 			conn->dh_secret, conn->dh_secret_len);
    313 
    314 	/* Ys = g^secret mod p */
    315 	dh_ys_len = dh_p_len;
    316 	dh_ys = os_malloc(dh_ys_len);
    317 	if (dh_ys == NULL) {
    318 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate memory for "
    319 			   "Diffie-Hellman");
    320 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    321 				   TLS_ALERT_INTERNAL_ERROR);
    322 		return -1;
    323 	}
    324 	if (crypto_mod_exp(conn->cred->dh_g, conn->cred->dh_g_len,
    325 			   conn->dh_secret, conn->dh_secret_len,
    326 			   dh_p, dh_p_len, dh_ys, &dh_ys_len)) {
    327 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    328 				   TLS_ALERT_INTERNAL_ERROR);
    329 		os_free(dh_ys);
    330 		return -1;
    331 	}
    332 
    333 	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
    334 		    dh_ys, dh_ys_len);
    335 
    336 	/*
    337 	 * struct {
    338 	 *    select (KeyExchangeAlgorithm) {
    339 	 *       case diffie_hellman:
    340 	 *          ServerDHParams params;
    341 	 *          Signature signed_params;
    342 	 *       case rsa:
    343 	 *          ServerRSAParams params;
    344 	 *          Signature signed_params;
    345 	 *    };
    346 	 * } ServerKeyExchange;
    347 	 *
    348 	 * struct {
    349 	 *    opaque dh_p<1..2^16-1>;
    350 	 *    opaque dh_g<1..2^16-1>;
    351 	 *    opaque dh_Ys<1..2^16-1>;
    352 	 * } ServerDHParams;
    353 	 */
    354 
    355 	pos = *msgpos;
    356 
    357 	tlsv1_server_log(conn, "Send ServerKeyExchange");
    358 	rhdr = pos;
    359 	pos += TLS_RECORD_HEADER_LEN;
    360 
    361 	/* opaque fragment[TLSPlaintext.length] */
    362 
    363 	/* Handshake */
    364 	hs_start = pos;
    365 	/* HandshakeType msg_type */
    366 	*pos++ = TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE;
    367 	/* uint24 length (to be filled) */
    368 	hs_length = pos;
    369 	pos += 3;
    370 
    371 	/* body - ServerDHParams */
    372 	server_params = pos;
    373 	/* dh_p */
    374 	if (pos + 2 + dh_p_len > end) {
    375 		wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for "
    376 			   "dh_p");
    377 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    378 				   TLS_ALERT_INTERNAL_ERROR);
    379 		os_free(dh_ys);
    380 		return -1;
    381 	}
    382 	WPA_PUT_BE16(pos, dh_p_len);
    383 	pos += 2;
    384 	os_memcpy(pos, dh_p, dh_p_len);
    385 	pos += dh_p_len;
    386 
    387 	/* dh_g */
    388 	if (pos + 2 + conn->cred->dh_g_len > end) {
    389 		wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for "
    390 			   "dh_g");
    391 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    392 				   TLS_ALERT_INTERNAL_ERROR);
    393 		os_free(dh_ys);
    394 		return -1;
    395 	}
    396 	WPA_PUT_BE16(pos, conn->cred->dh_g_len);
    397 	pos += 2;
    398 	os_memcpy(pos, conn->cred->dh_g, conn->cred->dh_g_len);
    399 	pos += conn->cred->dh_g_len;
    400 
    401 	/* dh_Ys */
    402 	if (pos + 2 + dh_ys_len > end) {
    403 		wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for "
    404 			   "dh_Ys");
    405 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    406 				   TLS_ALERT_INTERNAL_ERROR);
    407 		os_free(dh_ys);
    408 		return -1;
    409 	}
    410 	WPA_PUT_BE16(pos, dh_ys_len);
    411 	pos += 2;
    412 	os_memcpy(pos, dh_ys, dh_ys_len);
    413 	pos += dh_ys_len;
    414 	os_free(dh_ys);
    415 
    416 	/*
    417 	 * select (SignatureAlgorithm)
    418 	 * {   case anonymous: struct { };
    419 	 *     case rsa:
    420 	 *         digitally-signed struct {
    421 	 *             opaque md5_hash[16];
    422 	 *             opaque sha_hash[20];
    423 	 *         };
    424 	 *     case dsa:
    425 	 *         digitally-signed struct {
    426 	 *             opaque sha_hash[20];
    427 	 *         };
    428 	 * } Signature;
    429 	 *
    430 	 * md5_hash
    431 	 *     MD5(ClientHello.random + ServerHello.random + ServerParams);
    432 	 *
    433 	 * sha_hash
    434 	 *     SHA(ClientHello.random + ServerHello.random + ServerParams);
    435 	 */
    436 
    437 	if (keyx == TLS_KEY_X_DHE_RSA) {
    438 		u8 hash[100];
    439 		u8 *signed_start;
    440 		size_t clen;
    441 		int hlen;
    442 
    443 		if (conn->rl.tls_version >= TLS_VERSION_1_2) {
    444 #ifdef CONFIG_TLSV12
    445 			hlen = tlsv12_key_x_server_params_hash(
    446 				conn->rl.tls_version, conn->client_random,
    447 				conn->server_random, server_params,
    448 				pos - server_params, hash + 19);
    449 
    450 			/*
    451 			 * RFC 5246, 4.7:
    452 			 * TLS v1.2 adds explicit indication of the used
    453 			 * signature and hash algorithms.
    454 			 *
    455 			 * struct {
    456 			 *   HashAlgorithm hash;
    457 			 *   SignatureAlgorithm signature;
    458 			 * } SignatureAndHashAlgorithm;
    459 			 */
    460 			if (hlen < 0 || pos + 2 > end) {
    461 				tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    462 						   TLS_ALERT_INTERNAL_ERROR);
    463 				return -1;
    464 			}
    465 			*pos++ = TLS_HASH_ALG_SHA256;
    466 			*pos++ = TLS_SIGN_ALG_RSA;
    467 
    468 			/*
    469 			 * RFC 3447, A.2.4 RSASSA-PKCS1-v1_5
    470 			 *
    471 			 * DigestInfo ::= SEQUENCE {
    472 			 *   digestAlgorithm DigestAlgorithm,
    473 			 *   digest OCTET STRING
    474 			 * }
    475 			 *
    476 			 * SHA-256 OID: sha256WithRSAEncryption ::= {pkcs-1 11}
    477 			 *
    478 			 * DER encoded DigestInfo for SHA256 per RFC 3447:
    479 			 * 30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00
    480 			 * 04 20 || H
    481 			 */
    482 			hlen += 19;
    483 			os_memcpy(hash,
    484 				  "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65"
    485 				  "\x03\x04\x02\x01\x05\x00\x04\x20", 19);
    486 
    487 #else /* CONFIG_TLSV12 */
    488 			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    489 					   TLS_ALERT_INTERNAL_ERROR);
    490 			return -1;
    491 #endif /* CONFIG_TLSV12 */
    492 		} else {
    493 			hlen = tls_key_x_server_params_hash(
    494 				conn->rl.tls_version, conn->client_random,
    495 				conn->server_random, server_params,
    496 				pos - server_params, hash);
    497 		}
    498 
    499 		if (hlen < 0) {
    500 			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    501 					   TLS_ALERT_INTERNAL_ERROR);
    502 			return -1;
    503 		}
    504 
    505 		wpa_hexdump(MSG_MSGDUMP, "TLS: ServerKeyExchange signed_params hash",
    506 			    hash, hlen);
    507 #ifdef CONFIG_TESTING_OPTIONS
    508 		if (conn->test_flags & TLS_BREAK_SRV_KEY_X_HASH) {
    509 			tlsv1_server_log(conn, "TESTING: Break ServerKeyExchange signed params hash");
    510 			hash[hlen - 1] ^= 0x80;
    511 		}
    512 #endif /* CONFIG_TESTING_OPTIONS */
    513 
    514 		/*
    515 		 * RFC 2246, 4.7:
    516 		 * In digital signing, one-way hash functions are used as input
    517 		 * for a signing algorithm. A digitally-signed element is
    518 		 * encoded as an opaque vector <0..2^16-1>, where the length is
    519 		 * specified by the signing algorithm and key.
    520 		 *
    521 		 * In RSA signing, a 36-byte structure of two hashes (one SHA
    522 		 * and one MD5) is signed (encrypted with the private key). It
    523 		 * is encoded with PKCS #1 block type 0 or type 1 as described
    524 		 * in [PKCS1].
    525 		 */
    526 		signed_start = pos; /* length to be filled */
    527 		pos += 2;
    528 		clen = end - pos;
    529 		if (conn->cred == NULL ||
    530 		    crypto_private_key_sign_pkcs1(conn->cred->key, hash, hlen,
    531 						  pos, &clen) < 0) {
    532 			wpa_printf(MSG_DEBUG, "TLSv1: Failed to sign hash (PKCS #1)");
    533 			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    534 					   TLS_ALERT_INTERNAL_ERROR);
    535 			return -1;
    536 		}
    537 		WPA_PUT_BE16(signed_start, clen);
    538 #ifdef CONFIG_TESTING_OPTIONS
    539 		if (conn->test_flags & TLS_BREAK_SRV_KEY_X_SIGNATURE) {
    540 			tlsv1_server_log(conn, "TESTING: Break ServerKeyExchange signed params signature");
    541 			pos[clen - 1] ^= 0x80;
    542 		}
    543 #endif /* CONFIG_TESTING_OPTIONS */
    544 
    545 		pos += clen;
    546 	}
    547 
    548 	WPA_PUT_BE24(hs_length, pos - hs_length - 3);
    549 
    550 	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
    551 			      rhdr, end - rhdr, hs_start, pos - hs_start,
    552 			      &rlen) < 0) {
    553 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
    554 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    555 				   TLS_ALERT_INTERNAL_ERROR);
    556 		return -1;
    557 	}
    558 	pos = rhdr + rlen;
    559 
    560 	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
    561 
    562 	*msgpos = pos;
    563 
    564 	return 0;
    565 }
    566 
    567 
    568 static int tls_write_server_certificate_request(struct tlsv1_server *conn,
    569 						u8 **msgpos, u8 *end)
    570 {
    571 	u8 *pos, *rhdr, *hs_start, *hs_length;
    572 	size_t rlen;
    573 
    574 	if (!conn->verify_peer) {
    575 		wpa_printf(MSG_DEBUG, "TLSv1: No CertificateRequest needed");
    576 		return 0;
    577 	}
    578 
    579 	pos = *msgpos;
    580 
    581 	tlsv1_server_log(conn, "Send CertificateRequest");
    582 	rhdr = pos;
    583 	pos += TLS_RECORD_HEADER_LEN;
    584 
    585 	/* opaque fragment[TLSPlaintext.length] */
    586 
    587 	/* Handshake */
    588 	hs_start = pos;
    589 	/* HandshakeType msg_type */
    590 	*pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST;
    591 	/* uint24 length (to be filled) */
    592 	hs_length = pos;
    593 	pos += 3;
    594 	/* body - CertificateRequest */
    595 
    596 	/*
    597 	 * enum {
    598 	 *   rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),
    599 	 *   (255)
    600 	 * } ClientCertificateType;
    601 	 * ClientCertificateType certificate_types<1..2^8-1>
    602 	 */
    603 	*pos++ = 1;
    604 	*pos++ = 1; /* rsa_sign */
    605 
    606 	/*
    607 	 * opaque DistinguishedName<1..2^16-1>
    608 	 * DistinguishedName certificate_authorities<3..2^16-1>
    609 	 */
    610 	/* TODO: add support for listing DNs for trusted CAs */
    611 	WPA_PUT_BE16(pos, 0);
    612 	pos += 2;
    613 
    614 	WPA_PUT_BE24(hs_length, pos - hs_length - 3);
    615 
    616 	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
    617 			      rhdr, end - rhdr, hs_start, pos - hs_start,
    618 			      &rlen) < 0) {
    619 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
    620 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    621 				   TLS_ALERT_INTERNAL_ERROR);
    622 		return -1;
    623 	}
    624 	pos = rhdr + rlen;
    625 
    626 	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
    627 
    628 	*msgpos = pos;
    629 
    630 	return 0;
    631 }
    632 
    633 
    634 static int tls_write_server_hello_done(struct tlsv1_server *conn,
    635 				       u8 **msgpos, u8 *end)
    636 {
    637 	u8 *pos;
    638 	size_t rlen;
    639 	u8 payload[4];
    640 
    641 	tlsv1_server_log(conn, "Send ServerHelloDone");
    642 
    643 	/* opaque fragment[TLSPlaintext.length] */
    644 
    645 	/* Handshake */
    646 	pos = payload;
    647 	/* HandshakeType msg_type */
    648 	*pos++ = TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE;
    649 	/* uint24 length */
    650 	WPA_PUT_BE24(pos, 0);
    651 	pos += 3;
    652 	/* body - ServerHelloDone (empty) */
    653 
    654 	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
    655 			      *msgpos, end - *msgpos, payload, pos - payload,
    656 			      &rlen) < 0) {
    657 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
    658 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    659 				   TLS_ALERT_INTERNAL_ERROR);
    660 		return -1;
    661 	}
    662 
    663 	tls_verify_hash_add(&conn->verify, payload, pos - payload);
    664 
    665 	*msgpos += rlen;
    666 
    667 	return 0;
    668 }
    669 
    670 
    671 static int tls_write_server_change_cipher_spec(struct tlsv1_server *conn,
    672 					       u8 **msgpos, u8 *end)
    673 {
    674 	size_t rlen;
    675 	u8 payload[1];
    676 
    677 	tlsv1_server_log(conn, "Send ChangeCipherSpec");
    678 
    679 	payload[0] = TLS_CHANGE_CIPHER_SPEC;
    680 
    681 	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC,
    682 			      *msgpos, end - *msgpos, payload, sizeof(payload),
    683 			      &rlen) < 0) {
    684 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
    685 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    686 				   TLS_ALERT_INTERNAL_ERROR);
    687 		return -1;
    688 	}
    689 
    690 	if (tlsv1_record_change_write_cipher(&conn->rl) < 0) {
    691 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to set write cipher for "
    692 			   "record layer");
    693 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    694 				   TLS_ALERT_INTERNAL_ERROR);
    695 		return -1;
    696 	}
    697 
    698 	*msgpos += rlen;
    699 
    700 	return 0;
    701 }
    702 
    703 
    704 static int tls_write_server_finished(struct tlsv1_server *conn,
    705 				     u8 **msgpos, u8 *end)
    706 {
    707 	u8 *pos, *hs_start;
    708 	size_t rlen, hlen;
    709 	u8 verify_data[1 + 3 + TLS_VERIFY_DATA_LEN];
    710 	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
    711 
    712 	pos = *msgpos;
    713 
    714 	tlsv1_server_log(conn, "Send Finished");
    715 
    716 	/* Encrypted Handshake Message: Finished */
    717 
    718 #ifdef CONFIG_TLSV12
    719 	if (conn->rl.tls_version >= TLS_VERSION_1_2) {
    720 		hlen = SHA256_MAC_LEN;
    721 		if (conn->verify.sha256_server == NULL ||
    722 		    crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
    723 		    < 0) {
    724 			conn->verify.sha256_server = NULL;
    725 			tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    726 					   TLS_ALERT_INTERNAL_ERROR);
    727 			return -1;
    728 		}
    729 		conn->verify.sha256_server = NULL;
    730 	} else {
    731 #endif /* CONFIG_TLSV12 */
    732 
    733 	hlen = MD5_MAC_LEN;
    734 	if (conn->verify.md5_server == NULL ||
    735 	    crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
    736 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    737 				   TLS_ALERT_INTERNAL_ERROR);
    738 		conn->verify.md5_server = NULL;
    739 		crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
    740 		conn->verify.sha1_server = NULL;
    741 		return -1;
    742 	}
    743 	conn->verify.md5_server = NULL;
    744 	hlen = SHA1_MAC_LEN;
    745 	if (conn->verify.sha1_server == NULL ||
    746 	    crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
    747 			       &hlen) < 0) {
    748 		conn->verify.sha1_server = NULL;
    749 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    750 				   TLS_ALERT_INTERNAL_ERROR);
    751 		return -1;
    752 	}
    753 	conn->verify.sha1_server = NULL;
    754 	hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
    755 
    756 #ifdef CONFIG_TLSV12
    757 	}
    758 #endif /* CONFIG_TLSV12 */
    759 
    760 	if (tls_prf(conn->rl.tls_version,
    761 		    conn->master_secret, TLS_MASTER_SECRET_LEN,
    762 		    "server finished", hash, hlen,
    763 		    verify_data + 1 + 3, TLS_VERIFY_DATA_LEN)) {
    764 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate verify_data");
    765 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    766 				   TLS_ALERT_INTERNAL_ERROR);
    767 		return -1;
    768 	}
    769 	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
    770 			verify_data + 1 + 3, TLS_VERIFY_DATA_LEN);
    771 #ifdef CONFIG_TESTING_OPTIONS
    772 	if (conn->test_flags & TLS_BREAK_VERIFY_DATA) {
    773 		tlsv1_server_log(conn, "TESTING: Break verify_data (server)");
    774 		verify_data[1 + 3 + 1] ^= 0x80;
    775 	}
    776 #endif /* CONFIG_TESTING_OPTIONS */
    777 
    778 	/* Handshake */
    779 	pos = hs_start = verify_data;
    780 	/* HandshakeType msg_type */
    781 	*pos++ = TLS_HANDSHAKE_TYPE_FINISHED;
    782 	/* uint24 length */
    783 	WPA_PUT_BE24(pos, TLS_VERIFY_DATA_LEN);
    784 	pos += 3;
    785 	pos += TLS_VERIFY_DATA_LEN;
    786 	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
    787 
    788 	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
    789 			      *msgpos, end - *msgpos, hs_start, pos - hs_start,
    790 			      &rlen) < 0) {
    791 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
    792 		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
    793 				   TLS_ALERT_INTERNAL_ERROR);
    794 		return -1;
    795 	}
    796 
    797 	*msgpos += rlen;
    798 
    799 	return 0;
    800 }
    801 
    802 
    803 static u8 * tls_send_server_hello(struct tlsv1_server *conn, size_t *out_len)
    804 {
    805 	u8 *msg, *end, *pos;
    806 	size_t msglen;
    807 
    808 	*out_len = 0;
    809 
    810 	msglen = 1000 + tls_server_cert_chain_der_len(conn);
    811 
    812 	msg = os_malloc(msglen);
    813 	if (msg == NULL)
    814 		return NULL;
    815 
    816 	pos = msg;
    817 	end = msg + msglen;
    818 
    819 	if (tls_write_server_hello(conn, &pos, end) < 0) {
    820 		os_free(msg);
    821 		return NULL;
    822 	}
    823 
    824 	if (conn->use_session_ticket) {
    825 		/* Abbreviated handshake using session ticket; RFC 4507 */
    826 		if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 ||
    827 		    tls_write_server_finished(conn, &pos, end) < 0) {
    828 			os_free(msg);
    829 			return NULL;
    830 		}
    831 
    832 		*out_len = pos - msg;
    833 
    834 		conn->state = CHANGE_CIPHER_SPEC;
    835 
    836 		return msg;
    837 	}
    838 
    839 	/* Full handshake */
    840 	if (tls_write_server_certificate(conn, &pos, end) < 0 ||
    841 	    tls_write_server_key_exchange(conn, &pos, end) < 0 ||
    842 	    tls_write_server_certificate_request(conn, &pos, end) < 0 ||
    843 	    tls_write_server_hello_done(conn, &pos, end) < 0) {
    844 		os_free(msg);
    845 		return NULL;
    846 	}
    847 
    848 	*out_len = pos - msg;
    849 
    850 	conn->state = CLIENT_CERTIFICATE;
    851 
    852 	return msg;
    853 }
    854 
    855 
    856 static u8 * tls_send_change_cipher_spec(struct tlsv1_server *conn,
    857 					size_t *out_len)
    858 {
    859 	u8 *msg, *end, *pos;
    860 
    861 	*out_len = 0;
    862 
    863 	msg = os_malloc(1000);
    864 	if (msg == NULL)
    865 		return NULL;
    866 
    867 	pos = msg;
    868 	end = msg + 1000;
    869 
    870 	if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 ||
    871 	    tls_write_server_finished(conn, &pos, end) < 0) {
    872 		os_free(msg);
    873 		return NULL;
    874 	}
    875 
    876 	*out_len = pos - msg;
    877 
    878 	tlsv1_server_log(conn, "Handshake completed successfully");
    879 	conn->state = ESTABLISHED;
    880 
    881 	return msg;
    882 }
    883 
    884 
    885 u8 * tlsv1_server_handshake_write(struct tlsv1_server *conn, size_t *out_len)
    886 {
    887 	switch (conn->state) {
    888 	case SERVER_HELLO:
    889 		return tls_send_server_hello(conn, out_len);
    890 	case SERVER_CHANGE_CIPHER_SPEC:
    891 		return tls_send_change_cipher_spec(conn, out_len);
    892 	default:
    893 		if (conn->state == ESTABLISHED && conn->use_session_ticket) {
    894 			/* Abbreviated handshake was already completed. */
    895 			return NULL;
    896 		}
    897 		tlsv1_server_log(conn, "Unexpected state %d while generating reply",
    898 				 conn->state);
    899 		return NULL;
    900 	}
    901 }
    902 
    903 
    904 u8 * tlsv1_server_send_alert(struct tlsv1_server *conn, u8 level,
    905 			     u8 description, size_t *out_len)
    906 {
    907 	u8 *alert, *pos, *length;
    908 
    909 	tlsv1_server_log(conn, "Send Alert(%d:%d)", level, description);
    910 	*out_len = 0;
    911 
    912 	alert = os_malloc(10);
    913 	if (alert == NULL)
    914 		return NULL;
    915 
    916 	pos = alert;
    917 
    918 	/* TLSPlaintext */
    919 	/* ContentType type */
    920 	*pos++ = TLS_CONTENT_TYPE_ALERT;
    921 	/* ProtocolVersion version */
    922 	WPA_PUT_BE16(pos, conn->rl.tls_version ? conn->rl.tls_version :
    923 		     TLS_VERSION);
    924 	pos += 2;
    925 	/* uint16 length (to be filled) */
    926 	length = pos;
    927 	pos += 2;
    928 	/* opaque fragment[TLSPlaintext.length] */
    929 
    930 	/* Alert */
    931 	/* AlertLevel level */
    932 	*pos++ = level;
    933 	/* AlertDescription description */
    934 	*pos++ = description;
    935 
    936 	WPA_PUT_BE16(length, pos - length - 2);
    937 	*out_len = pos - alert;
    938 
    939 	return alert;
    940 }
    941