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