• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * SSL/TLS interface functions for OpenSSL
3  * Copyright (c) 2004-2015, Jouni Malinen <j@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 #ifndef CONFIG_SMARTCARD
12 #ifndef OPENSSL_NO_ENGINE
13 #ifndef ANDROID
14 #define OPENSSL_NO_ENGINE
15 #endif
16 #endif
17 #endif
18 
19 #include <openssl/ssl.h>
20 #include <openssl/err.h>
21 #include <openssl/opensslv.h>
22 #include <openssl/pkcs12.h>
23 #include <openssl/x509v3.h>
24 #ifndef OPENSSL_NO_ENGINE
25 #include <openssl/engine.h>
26 #endif /* OPENSSL_NO_ENGINE */
27 #ifndef OPENSSL_NO_DSA
28 #include <openssl/dsa.h>
29 #endif
30 #ifndef OPENSSL_NO_DH
31 #include <openssl/dh.h>
32 #endif
33 
34 #include "common.h"
35 #include "crypto.h"
36 #include "sha1.h"
37 #include "sha256.h"
38 #include "tls.h"
39 #include "tls_openssl.h"
40 
41 #if !defined(CONFIG_FIPS) &&                             \
42     (defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) ||   \
43      defined(EAP_SERVER_FAST))
44 #define OPENSSL_NEED_EAP_FAST_PRF
45 #endif
46 
47 #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || \
48 	defined(EAP_SERVER_FAST) || defined(EAP_TEAP) || \
49 	defined(EAP_SERVER_TEAP)
50 #define EAP_FAST_OR_TEAP
51 #endif
52 
53 
54 #if defined(OPENSSL_IS_BORINGSSL)
55 /* stack_index_t is the return type of OpenSSL's sk_XXX_num() functions. */
56 typedef size_t stack_index_t;
57 #else
58 typedef int stack_index_t;
59 #endif
60 
61 #ifdef SSL_set_tlsext_status_type
62 #ifndef OPENSSL_NO_TLSEXT
63 #define HAVE_OCSP
64 #include <openssl/ocsp.h>
65 #endif /* OPENSSL_NO_TLSEXT */
66 #endif /* SSL_set_tlsext_status_type */
67 
68 #if (OPENSSL_VERSION_NUMBER < 0x10100000L || \
69      (defined(LIBRESSL_VERSION_NUMBER) && \
70       LIBRESSL_VERSION_NUMBER < 0x20700000L)) && \
71     !defined(BORINGSSL_API_VERSION)
72 /*
73  * SSL_get_client_random() and SSL_get_server_random() were added in OpenSSL
74  * 1.1.0 and newer BoringSSL revisions. Provide compatibility wrappers for
75  * older versions.
76  */
77 
SSL_get_client_random(const SSL * ssl,unsigned char * out,size_t outlen)78 static size_t SSL_get_client_random(const SSL *ssl, unsigned char *out,
79 				    size_t outlen)
80 {
81 	if (!ssl->s3 || outlen < SSL3_RANDOM_SIZE)
82 		return 0;
83 	os_memcpy(out, ssl->s3->client_random, SSL3_RANDOM_SIZE);
84 	return SSL3_RANDOM_SIZE;
85 }
86 
87 
SSL_get_server_random(const SSL * ssl,unsigned char * out,size_t outlen)88 static size_t SSL_get_server_random(const SSL *ssl, unsigned char *out,
89 				    size_t outlen)
90 {
91 	if (!ssl->s3 || outlen < SSL3_RANDOM_SIZE)
92 		return 0;
93 	os_memcpy(out, ssl->s3->server_random, SSL3_RANDOM_SIZE);
94 	return SSL3_RANDOM_SIZE;
95 }
96 
97 
98 #ifdef OPENSSL_NEED_EAP_FAST_PRF
SSL_SESSION_get_master_key(const SSL_SESSION * session,unsigned char * out,size_t outlen)99 static size_t SSL_SESSION_get_master_key(const SSL_SESSION *session,
100 					 unsigned char *out, size_t outlen)
101 {
102 	if (!session || session->master_key_length < 0 ||
103 	    (size_t) session->master_key_length > outlen)
104 		return 0;
105 	if ((size_t) session->master_key_length < outlen)
106 		outlen = session->master_key_length;
107 	os_memcpy(out, session->master_key, outlen);
108 	return outlen;
109 }
110 #endif /* OPENSSL_NEED_EAP_FAST_PRF */
111 
112 #endif
113 
114 #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
115 	(defined(LIBRESSL_VERSION_NUMBER) && \
116 	 LIBRESSL_VERSION_NUMBER < 0x20700000L)
117 #ifdef CONFIG_SUITEB
RSA_bits(const RSA * r)118 static int RSA_bits(const RSA *r)
119 {
120 	return BN_num_bits(r->n);
121 }
122 #endif /* CONFIG_SUITEB */
123 
124 
ASN1_STRING_get0_data(const ASN1_STRING * x)125 static const unsigned char * ASN1_STRING_get0_data(const ASN1_STRING *x)
126 {
127 	return ASN1_STRING_data((ASN1_STRING *) x);
128 }
129 #endif
130 
131 #ifdef ANDROID
132 #include <openssl/pem.h>
133 #include <keystore/keystore_get.h>
134 
135 #include <log/log.h>
136 #include <log/log_event_list.h>
137 
138 #define CERT_VALIDATION_FAILURE 210033
139 
log_cert_validation_failure(const char * reason)140 static void log_cert_validation_failure(const char *reason)
141 {
142 	android_log_context ctx = create_android_logger(CERT_VALIDATION_FAILURE);
143 	android_log_write_string8(ctx, reason);
144 	android_log_write_list(ctx, LOG_ID_SECURITY);
145 	android_log_destroy(&ctx);
146 }
147 
148 
BIO_from_keystore(const char * key)149 static BIO * BIO_from_keystore(const char *key)
150 {
151 	BIO *bio = NULL;
152 	uint8_t *value = NULL;
153 	int length = keystore_get(key, strlen(key), &value);
154 	if (length != -1 && (bio = BIO_new(BIO_s_mem())) != NULL)
155 		BIO_write(bio, value, length);
156 	free(value);
157 	return bio;
158 }
159 
160 
tls_add_ca_from_keystore(X509_STORE * ctx,const char * key_alias)161 static int tls_add_ca_from_keystore(X509_STORE *ctx, const char *key_alias)
162 {
163 	BIO *bio = BIO_from_keystore(key_alias);
164 	STACK_OF(X509_INFO) *stack = NULL;
165 	stack_index_t i;
166 
167 	if (bio) {
168 		stack = PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL);
169 		BIO_free(bio);
170 	}
171 
172 	if (!stack) {
173 		wpa_printf(MSG_WARNING, "TLS: Failed to parse certificate: %s",
174 			   key_alias);
175 		return -1;
176 	}
177 
178 	for (i = 0; i < sk_X509_INFO_num(stack); ++i) {
179 		X509_INFO *info = sk_X509_INFO_value(stack, i);
180 
181 		if (info->x509)
182 			X509_STORE_add_cert(ctx, info->x509);
183 		if (info->crl)
184 			X509_STORE_add_crl(ctx, info->crl);
185 	}
186 
187 	sk_X509_INFO_pop_free(stack, X509_INFO_free);
188 
189 	return 0;
190 }
191 
192 
tls_add_ca_from_keystore_encoded(X509_STORE * ctx,const char * encoded_key_alias)193 static int tls_add_ca_from_keystore_encoded(X509_STORE *ctx,
194 					    const char *encoded_key_alias)
195 {
196 	int rc = -1;
197 	int len = os_strlen(encoded_key_alias);
198 	unsigned char *decoded_alias;
199 
200 	if (len & 1) {
201 		wpa_printf(MSG_WARNING, "Invalid hex-encoded alias: %s",
202 			   encoded_key_alias);
203 		return rc;
204 	}
205 
206 	decoded_alias = os_malloc(len / 2 + 1);
207 	if (decoded_alias) {
208 		if (!hexstr2bin(encoded_key_alias, decoded_alias, len / 2)) {
209 			decoded_alias[len / 2] = '\0';
210 			rc = tls_add_ca_from_keystore(
211 				ctx, (const char *) decoded_alias);
212 		}
213 		os_free(decoded_alias);
214 	}
215 
216 	return rc;
217 }
218 
219 #endif /* ANDROID */
220 
221 static int tls_openssl_ref_count = 0;
222 static int tls_ex_idx_session = -1;
223 
224 struct tls_context {
225 	void (*event_cb)(void *ctx, enum tls_event ev,
226 			 union tls_event_data *data);
227 	void *cb_ctx;
228 	int cert_in_cb;
229 	char *ocsp_stapling_response;
230 };
231 
232 static struct tls_context *tls_global = NULL;
233 
234 
235 struct tls_data {
236 	SSL_CTX *ssl;
237 	unsigned int tls_session_lifetime;
238 	int check_crl;
239 	int check_crl_strict;
240 	char *ca_cert;
241 	unsigned int crl_reload_interval;
242 	struct os_reltime crl_last_reload;
243 	char *check_cert_subject;
244 };
245 
246 struct tls_connection {
247 	struct tls_context *context;
248 	struct tls_data *data;
249 	SSL_CTX *ssl_ctx;
250 	SSL *ssl;
251 	BIO *ssl_in, *ssl_out;
252 #if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE)
253 	ENGINE *engine;        /* functional reference to the engine */
254 	EVP_PKEY *private_key; /* the private key if using engine */
255 #endif /* OPENSSL_NO_ENGINE */
256 	char *subject_match, *altsubject_match, *suffix_match, *domain_match;
257 	char *check_cert_subject;
258 	int read_alerts, write_alerts, failed;
259 
260 	tls_session_ticket_cb session_ticket_cb;
261 	void *session_ticket_cb_ctx;
262 
263 	/* SessionTicket received from OpenSSL hello_extension_cb (server) */
264 	u8 *session_ticket;
265 	size_t session_ticket_len;
266 
267 	unsigned int ca_cert_verify:1;
268 	unsigned int cert_probe:1;
269 	unsigned int server_cert_only:1;
270 	unsigned int invalid_hb_used:1;
271 	unsigned int success_data:1;
272 	unsigned int client_hello_generated:1;
273 	unsigned int server:1;
274 
275 	u8 srv_cert_hash[32];
276 
277 	unsigned int flags;
278 
279 	X509 *peer_cert;
280 	X509 *peer_issuer;
281 	X509 *peer_issuer_issuer;
282 
283 	unsigned char client_random[SSL3_RANDOM_SIZE];
284 	unsigned char server_random[SSL3_RANDOM_SIZE];
285 
286 	u16 cipher_suite;
287 	int server_dh_prime_len;
288 };
289 
290 
tls_context_new(const struct tls_config * conf)291 static struct tls_context * tls_context_new(const struct tls_config *conf)
292 {
293 	struct tls_context *context = os_zalloc(sizeof(*context));
294 	if (context == NULL)
295 		return NULL;
296 	if (conf) {
297 		context->event_cb = conf->event_cb;
298 		context->cb_ctx = conf->cb_ctx;
299 		context->cert_in_cb = conf->cert_in_cb;
300 	}
301 	return context;
302 }
303 
304 
305 #ifdef CONFIG_NO_STDOUT_DEBUG
306 
_tls_show_errors(void)307 static void _tls_show_errors(void)
308 {
309 	unsigned long err;
310 
311 	while ((err = ERR_get_error())) {
312 		/* Just ignore the errors, since stdout is disabled */
313 	}
314 }
315 #define tls_show_errors(l, f, t) _tls_show_errors()
316 
317 #else /* CONFIG_NO_STDOUT_DEBUG */
318 
tls_show_errors(int level,const char * func,const char * txt)319 static void tls_show_errors(int level, const char *func, const char *txt)
320 {
321 	unsigned long err;
322 
323 	wpa_printf(level, "OpenSSL: %s - %s %s",
324 		   func, txt, ERR_error_string(ERR_get_error(), NULL));
325 
326 	while ((err = ERR_get_error())) {
327 		wpa_printf(MSG_INFO, "OpenSSL: pending error: %s",
328 			   ERR_error_string(err, NULL));
329 	}
330 }
331 
332 #endif /* CONFIG_NO_STDOUT_DEBUG */
333 
334 
tls_crl_cert_reload(const char * ca_cert,int check_crl)335 static X509_STORE * tls_crl_cert_reload(const char *ca_cert, int check_crl)
336 {
337 	int flags;
338 	X509_STORE *store;
339 
340 	store = X509_STORE_new();
341 	if (!store) {
342 		wpa_printf(MSG_DEBUG,
343 			   "OpenSSL: %s - failed to allocate new certificate store",
344 			   __func__);
345 		return NULL;
346 	}
347 
348 	if (ca_cert && X509_STORE_load_locations(store, ca_cert, NULL) != 1) {
349 		tls_show_errors(MSG_WARNING, __func__,
350 				"Failed to load root certificates");
351 		X509_STORE_free(store);
352 		return NULL;
353 	}
354 
355 	flags = check_crl ? X509_V_FLAG_CRL_CHECK : 0;
356 	if (check_crl == 2)
357 		flags |= X509_V_FLAG_CRL_CHECK_ALL;
358 
359 	X509_STORE_set_flags(store, flags);
360 
361 	return store;
362 }
363 
364 
365 #ifdef CONFIG_NATIVE_WINDOWS
366 
367 /* Windows CryptoAPI and access to certificate stores */
368 #include <wincrypt.h>
369 
370 #ifdef __MINGW32_VERSION
371 /*
372  * MinGW does not yet include all the needed definitions for CryptoAPI, so
373  * define here whatever extra is needed.
374  */
375 #define CERT_SYSTEM_STORE_CURRENT_USER (1 << 16)
376 #define CERT_STORE_READONLY_FLAG 0x00008000
377 #define CERT_STORE_OPEN_EXISTING_FLAG 0x00004000
378 
379 #endif /* __MINGW32_VERSION */
380 
381 
382 struct cryptoapi_rsa_data {
383 	const CERT_CONTEXT *cert;
384 	HCRYPTPROV crypt_prov;
385 	DWORD key_spec;
386 	BOOL free_crypt_prov;
387 };
388 
389 
cryptoapi_error(const char * msg)390 static void cryptoapi_error(const char *msg)
391 {
392 	wpa_printf(MSG_INFO, "CryptoAPI: %s; err=%u",
393 		   msg, (unsigned int) GetLastError());
394 }
395 
396 
cryptoapi_rsa_pub_enc(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)397 static int cryptoapi_rsa_pub_enc(int flen, const unsigned char *from,
398 				 unsigned char *to, RSA *rsa, int padding)
399 {
400 	wpa_printf(MSG_DEBUG, "%s - not implemented", __func__);
401 	return 0;
402 }
403 
404 
cryptoapi_rsa_pub_dec(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)405 static int cryptoapi_rsa_pub_dec(int flen, const unsigned char *from,
406 				 unsigned char *to, RSA *rsa, int padding)
407 {
408 	wpa_printf(MSG_DEBUG, "%s - not implemented", __func__);
409 	return 0;
410 }
411 
412 
cryptoapi_rsa_priv_enc(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)413 static int cryptoapi_rsa_priv_enc(int flen, const unsigned char *from,
414 				  unsigned char *to, RSA *rsa, int padding)
415 {
416 	struct cryptoapi_rsa_data *priv =
417 		(struct cryptoapi_rsa_data *) rsa->meth->app_data;
418 	HCRYPTHASH hash;
419 	DWORD hash_size, len, i;
420 	unsigned char *buf = NULL;
421 	int ret = 0;
422 
423 	if (priv == NULL) {
424 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,
425 		       ERR_R_PASSED_NULL_PARAMETER);
426 		return 0;
427 	}
428 
429 	if (padding != RSA_PKCS1_PADDING) {
430 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,
431 		       RSA_R_UNKNOWN_PADDING_TYPE);
432 		return 0;
433 	}
434 
435 	if (flen != 16 /* MD5 */ + 20 /* SHA-1 */) {
436 		wpa_printf(MSG_INFO, "%s - only MD5-SHA1 hash supported",
437 			   __func__);
438 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,
439 		       RSA_R_INVALID_MESSAGE_LENGTH);
440 		return 0;
441 	}
442 
443 	if (!CryptCreateHash(priv->crypt_prov, CALG_SSL3_SHAMD5, 0, 0, &hash))
444 	{
445 		cryptoapi_error("CryptCreateHash failed");
446 		return 0;
447 	}
448 
449 	len = sizeof(hash_size);
450 	if (!CryptGetHashParam(hash, HP_HASHSIZE, (BYTE *) &hash_size, &len,
451 			       0)) {
452 		cryptoapi_error("CryptGetHashParam failed");
453 		goto err;
454 	}
455 
456 	if ((int) hash_size != flen) {
457 		wpa_printf(MSG_INFO, "CryptoAPI: Invalid hash size (%u != %d)",
458 			   (unsigned) hash_size, flen);
459 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,
460 		       RSA_R_INVALID_MESSAGE_LENGTH);
461 		goto err;
462 	}
463 	if (!CryptSetHashParam(hash, HP_HASHVAL, (BYTE * ) from, 0)) {
464 		cryptoapi_error("CryptSetHashParam failed");
465 		goto err;
466 	}
467 
468 	len = RSA_size(rsa);
469 	buf = os_malloc(len);
470 	if (buf == NULL) {
471 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
472 		goto err;
473 	}
474 
475 	if (!CryptSignHash(hash, priv->key_spec, NULL, 0, buf, &len)) {
476 		cryptoapi_error("CryptSignHash failed");
477 		goto err;
478 	}
479 
480 	for (i = 0; i < len; i++)
481 		to[i] = buf[len - i - 1];
482 	ret = len;
483 
484 err:
485 	os_free(buf);
486 	CryptDestroyHash(hash);
487 
488 	return ret;
489 }
490 
491 
cryptoapi_rsa_priv_dec(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)492 static int cryptoapi_rsa_priv_dec(int flen, const unsigned char *from,
493 				  unsigned char *to, RSA *rsa, int padding)
494 {
495 	wpa_printf(MSG_DEBUG, "%s - not implemented", __func__);
496 	return 0;
497 }
498 
499 
cryptoapi_free_data(struct cryptoapi_rsa_data * priv)500 static void cryptoapi_free_data(struct cryptoapi_rsa_data *priv)
501 {
502 	if (priv == NULL)
503 		return;
504 	if (priv->crypt_prov && priv->free_crypt_prov)
505 		CryptReleaseContext(priv->crypt_prov, 0);
506 	if (priv->cert)
507 		CertFreeCertificateContext(priv->cert);
508 	os_free(priv);
509 }
510 
511 
cryptoapi_finish(RSA * rsa)512 static int cryptoapi_finish(RSA *rsa)
513 {
514 	cryptoapi_free_data((struct cryptoapi_rsa_data *) rsa->meth->app_data);
515 	os_free((void *) rsa->meth);
516 	rsa->meth = NULL;
517 	return 1;
518 }
519 
520 
cryptoapi_find_cert(const char * name,DWORD store)521 static const CERT_CONTEXT * cryptoapi_find_cert(const char *name, DWORD store)
522 {
523 	HCERTSTORE cs;
524 	const CERT_CONTEXT *ret = NULL;
525 
526 	cs = CertOpenStore((LPCSTR) CERT_STORE_PROV_SYSTEM, 0, 0,
527 			   store | CERT_STORE_OPEN_EXISTING_FLAG |
528 			   CERT_STORE_READONLY_FLAG, L"MY");
529 	if (cs == NULL) {
530 		cryptoapi_error("Failed to open 'My system store'");
531 		return NULL;
532 	}
533 
534 	if (strncmp(name, "cert://", 7) == 0) {
535 		unsigned short wbuf[255];
536 		MultiByteToWideChar(CP_ACP, 0, name + 7, -1, wbuf, 255);
537 		ret = CertFindCertificateInStore(cs, X509_ASN_ENCODING |
538 						 PKCS_7_ASN_ENCODING,
539 						 0, CERT_FIND_SUBJECT_STR,
540 						 wbuf, NULL);
541 	} else if (strncmp(name, "hash://", 7) == 0) {
542 		CRYPT_HASH_BLOB blob;
543 		int len;
544 		const char *hash = name + 7;
545 		unsigned char *buf;
546 
547 		len = os_strlen(hash) / 2;
548 		buf = os_malloc(len);
549 		if (buf && hexstr2bin(hash, buf, len) == 0) {
550 			blob.cbData = len;
551 			blob.pbData = buf;
552 			ret = CertFindCertificateInStore(cs,
553 							 X509_ASN_ENCODING |
554 							 PKCS_7_ASN_ENCODING,
555 							 0, CERT_FIND_HASH,
556 							 &blob, NULL);
557 		}
558 		os_free(buf);
559 	}
560 
561 	CertCloseStore(cs, 0);
562 
563 	return ret;
564 }
565 
566 
tls_cryptoapi_cert(SSL * ssl,const char * name)567 static int tls_cryptoapi_cert(SSL *ssl, const char *name)
568 {
569 	X509 *cert = NULL;
570 	RSA *rsa = NULL, *pub_rsa;
571 	struct cryptoapi_rsa_data *priv;
572 	RSA_METHOD *rsa_meth;
573 
574 	if (name == NULL ||
575 	    (strncmp(name, "cert://", 7) != 0 &&
576 	     strncmp(name, "hash://", 7) != 0))
577 		return -1;
578 
579 	priv = os_zalloc(sizeof(*priv));
580 	rsa_meth = os_zalloc(sizeof(*rsa_meth));
581 	if (priv == NULL || rsa_meth == NULL) {
582 		wpa_printf(MSG_WARNING, "CryptoAPI: Failed to allocate memory "
583 			   "for CryptoAPI RSA method");
584 		os_free(priv);
585 		os_free(rsa_meth);
586 		return -1;
587 	}
588 
589 	priv->cert = cryptoapi_find_cert(name, CERT_SYSTEM_STORE_CURRENT_USER);
590 	if (priv->cert == NULL) {
591 		priv->cert = cryptoapi_find_cert(
592 			name, CERT_SYSTEM_STORE_LOCAL_MACHINE);
593 	}
594 	if (priv->cert == NULL) {
595 		wpa_printf(MSG_INFO, "CryptoAPI: Could not find certificate "
596 			   "'%s'", name);
597 		goto err;
598 	}
599 
600 	cert = d2i_X509(NULL,
601 			(const unsigned char **) &priv->cert->pbCertEncoded,
602 			priv->cert->cbCertEncoded);
603 	if (cert == NULL) {
604 		wpa_printf(MSG_INFO, "CryptoAPI: Could not process X509 DER "
605 			   "encoding");
606 		goto err;
607 	}
608 
609 	if (!CryptAcquireCertificatePrivateKey(priv->cert,
610 					       CRYPT_ACQUIRE_COMPARE_KEY_FLAG,
611 					       NULL, &priv->crypt_prov,
612 					       &priv->key_spec,
613 					       &priv->free_crypt_prov)) {
614 		cryptoapi_error("Failed to acquire a private key for the "
615 				"certificate");
616 		goto err;
617 	}
618 
619 	rsa_meth->name = "Microsoft CryptoAPI RSA Method";
620 	rsa_meth->rsa_pub_enc = cryptoapi_rsa_pub_enc;
621 	rsa_meth->rsa_pub_dec = cryptoapi_rsa_pub_dec;
622 	rsa_meth->rsa_priv_enc = cryptoapi_rsa_priv_enc;
623 	rsa_meth->rsa_priv_dec = cryptoapi_rsa_priv_dec;
624 	rsa_meth->finish = cryptoapi_finish;
625 	rsa_meth->flags = RSA_METHOD_FLAG_NO_CHECK;
626 	rsa_meth->app_data = (char *) priv;
627 
628 	rsa = RSA_new();
629 	if (rsa == NULL) {
630 		SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE,
631 		       ERR_R_MALLOC_FAILURE);
632 		goto err;
633 	}
634 
635 	if (!SSL_use_certificate(ssl, cert)) {
636 		RSA_free(rsa);
637 		rsa = NULL;
638 		goto err;
639 	}
640 	pub_rsa = cert->cert_info->key->pkey->pkey.rsa;
641 	X509_free(cert);
642 	cert = NULL;
643 
644 	rsa->n = BN_dup(pub_rsa->n);
645 	rsa->e = BN_dup(pub_rsa->e);
646 	if (!RSA_set_method(rsa, rsa_meth))
647 		goto err;
648 
649 	if (!SSL_use_RSAPrivateKey(ssl, rsa))
650 		goto err;
651 	RSA_free(rsa);
652 
653 	return 0;
654 
655 err:
656 	if (cert)
657 		X509_free(cert);
658 	if (rsa)
659 		RSA_free(rsa);
660 	else {
661 		os_free(rsa_meth);
662 		cryptoapi_free_data(priv);
663 	}
664 	return -1;
665 }
666 
667 
tls_cryptoapi_ca_cert(SSL_CTX * ssl_ctx,SSL * ssl,const char * name)668 static int tls_cryptoapi_ca_cert(SSL_CTX *ssl_ctx, SSL *ssl, const char *name)
669 {
670 	HCERTSTORE cs;
671 	PCCERT_CONTEXT ctx = NULL;
672 	X509 *cert;
673 	char buf[128];
674 	const char *store;
675 #ifdef UNICODE
676 	WCHAR *wstore;
677 #endif /* UNICODE */
678 
679 	if (name == NULL || strncmp(name, "cert_store://", 13) != 0)
680 		return -1;
681 
682 	store = name + 13;
683 #ifdef UNICODE
684 	wstore = os_malloc((os_strlen(store) + 1) * sizeof(WCHAR));
685 	if (wstore == NULL)
686 		return -1;
687 	wsprintf(wstore, L"%S", store);
688 	cs = CertOpenSystemStore(0, wstore);
689 	os_free(wstore);
690 #else /* UNICODE */
691 	cs = CertOpenSystemStore(0, store);
692 #endif /* UNICODE */
693 	if (cs == NULL) {
694 		wpa_printf(MSG_DEBUG, "%s: failed to open system cert store "
695 			   "'%s': error=%d", __func__, store,
696 			   (int) GetLastError());
697 		return -1;
698 	}
699 
700 	while ((ctx = CertEnumCertificatesInStore(cs, ctx))) {
701 		cert = d2i_X509(NULL,
702 				(const unsigned char **) &ctx->pbCertEncoded,
703 				ctx->cbCertEncoded);
704 		if (cert == NULL) {
705 			wpa_printf(MSG_INFO, "CryptoAPI: Could not process "
706 				   "X509 DER encoding for CA cert");
707 			continue;
708 		}
709 
710 		X509_NAME_oneline(X509_get_subject_name(cert), buf,
711 				  sizeof(buf));
712 		wpa_printf(MSG_DEBUG, "OpenSSL: Loaded CA certificate for "
713 			   "system certificate store: subject='%s'", buf);
714 
715 		if (!X509_STORE_add_cert(SSL_CTX_get_cert_store(ssl_ctx),
716 					 cert)) {
717 			tls_show_errors(MSG_WARNING, __func__,
718 					"Failed to add ca_cert to OpenSSL "
719 					"certificate store");
720 		}
721 
722 		X509_free(cert);
723 	}
724 
725 	if (!CertCloseStore(cs, 0)) {
726 		wpa_printf(MSG_DEBUG, "%s: failed to close system cert store "
727 			   "'%s': error=%d", __func__, name + 13,
728 			   (int) GetLastError());
729 	}
730 
731 	return 0;
732 }
733 
734 
735 #else /* CONFIG_NATIVE_WINDOWS */
736 
tls_cryptoapi_cert(SSL * ssl,const char * name)737 static int tls_cryptoapi_cert(SSL *ssl, const char *name)
738 {
739 	return -1;
740 }
741 
742 #endif /* CONFIG_NATIVE_WINDOWS */
743 
744 
ssl_info_cb(const SSL * ssl,int where,int ret)745 static void ssl_info_cb(const SSL *ssl, int where, int ret)
746 {
747 	const char *str;
748 	int w;
749 
750 	wpa_printf(MSG_DEBUG, "SSL: (where=0x%x ret=0x%x)", where, ret);
751 	w = where & ~SSL_ST_MASK;
752 	if (w & SSL_ST_CONNECT)
753 		str = "SSL_connect";
754 	else if (w & SSL_ST_ACCEPT)
755 		str = "SSL_accept";
756 	else
757 		str = "undefined";
758 
759 	if (where & SSL_CB_LOOP) {
760 		wpa_printf(MSG_DEBUG, "SSL: %s:%s",
761 			   str, SSL_state_string_long(ssl));
762 	} else if (where & SSL_CB_ALERT) {
763 		struct tls_connection *conn = SSL_get_app_data((SSL *) ssl);
764 		wpa_printf(MSG_INFO, "SSL: SSL3 alert: %s:%s:%s",
765 			   where & SSL_CB_READ ?
766 			   "read (remote end reported an error)" :
767 			   "write (local SSL3 detected an error)",
768 			   SSL_alert_type_string_long(ret),
769 			   SSL_alert_desc_string_long(ret));
770 		if ((ret >> 8) == SSL3_AL_FATAL) {
771 			if (where & SSL_CB_READ)
772 				conn->read_alerts++;
773 			else
774 				conn->write_alerts++;
775 		}
776 		if (conn->context->event_cb != NULL) {
777 			union tls_event_data ev;
778 			struct tls_context *context = conn->context;
779 			os_memset(&ev, 0, sizeof(ev));
780 			ev.alert.is_local = !(where & SSL_CB_READ);
781 			ev.alert.type = SSL_alert_type_string_long(ret);
782 			ev.alert.description = SSL_alert_desc_string_long(ret);
783 			context->event_cb(context->cb_ctx, TLS_ALERT, &ev);
784 		}
785 	} else if (where & SSL_CB_EXIT && ret <= 0) {
786 		wpa_printf(MSG_DEBUG, "SSL: %s:%s in %s",
787 			   str, ret == 0 ? "failed" : "error",
788 			   SSL_state_string_long(ssl));
789 	}
790 }
791 
792 
793 #ifndef OPENSSL_NO_ENGINE
794 /**
795  * tls_engine_load_dynamic_generic - load any openssl engine
796  * @pre: an array of commands and values that load an engine initialized
797  *       in the engine specific function
798  * @post: an array of commands and values that initialize an already loaded
799  *        engine (or %NULL if not required)
800  * @id: the engine id of the engine to load (only required if post is not %NULL
801  *
802  * This function is a generic function that loads any openssl engine.
803  *
804  * Returns: 0 on success, -1 on failure
805  */
tls_engine_load_dynamic_generic(const char * pre[],const char * post[],const char * id)806 static int tls_engine_load_dynamic_generic(const char *pre[],
807 					   const char *post[], const char *id)
808 {
809 	ENGINE *engine;
810 	const char *dynamic_id = "dynamic";
811 
812 	engine = ENGINE_by_id(id);
813 	if (engine) {
814 		wpa_printf(MSG_DEBUG, "ENGINE: engine '%s' is already "
815 			   "available", id);
816 		/*
817 		 * If it was auto-loaded by ENGINE_by_id() we might still
818 		 * need to tell it which PKCS#11 module to use in legacy
819 		 * (non-p11-kit) environments. Do so now; even if it was
820 		 * properly initialised before, setting it again will be
821 		 * harmless.
822 		 */
823 		goto found;
824 	}
825 	ERR_clear_error();
826 
827 	engine = ENGINE_by_id(dynamic_id);
828 	if (engine == NULL) {
829 		wpa_printf(MSG_INFO, "ENGINE: Can't find engine %s [%s]",
830 			   dynamic_id,
831 			   ERR_error_string(ERR_get_error(), NULL));
832 		return -1;
833 	}
834 
835 	/* Perform the pre commands. This will load the engine. */
836 	while (pre && pre[0]) {
837 		wpa_printf(MSG_DEBUG, "ENGINE: '%s' '%s'", pre[0], pre[1]);
838 		if (ENGINE_ctrl_cmd_string(engine, pre[0], pre[1], 0) == 0) {
839 			wpa_printf(MSG_INFO, "ENGINE: ctrl cmd_string failed: "
840 				   "%s %s [%s]", pre[0], pre[1],
841 				   ERR_error_string(ERR_get_error(), NULL));
842 			ENGINE_free(engine);
843 			return -1;
844 		}
845 		pre += 2;
846 	}
847 
848 	/*
849 	 * Free the reference to the "dynamic" engine. The loaded engine can
850 	 * now be looked up using ENGINE_by_id().
851 	 */
852 	ENGINE_free(engine);
853 
854 	engine = ENGINE_by_id(id);
855 	if (engine == NULL) {
856 		wpa_printf(MSG_INFO, "ENGINE: Can't find engine %s [%s]",
857 			   id, ERR_error_string(ERR_get_error(), NULL));
858 		return -1;
859 	}
860  found:
861 	while (post && post[0]) {
862 		wpa_printf(MSG_DEBUG, "ENGINE: '%s' '%s'", post[0], post[1]);
863 		if (ENGINE_ctrl_cmd_string(engine, post[0], post[1], 0) == 0) {
864 			wpa_printf(MSG_DEBUG, "ENGINE: ctrl cmd_string failed:"
865 				" %s %s [%s]", post[0], post[1],
866 				   ERR_error_string(ERR_get_error(), NULL));
867 			ENGINE_remove(engine);
868 			ENGINE_free(engine);
869 			return -1;
870 		}
871 		post += 2;
872 	}
873 	ENGINE_free(engine);
874 
875 	return 0;
876 }
877 
878 
879 /**
880  * tls_engine_load_dynamic_pkcs11 - load the pkcs11 engine provided by opensc
881  * @pkcs11_so_path: pksc11_so_path from the configuration
882  * @pcks11_module_path: pkcs11_module_path from the configuration
883  */
tls_engine_load_dynamic_pkcs11(const char * pkcs11_so_path,const char * pkcs11_module_path)884 static int tls_engine_load_dynamic_pkcs11(const char *pkcs11_so_path,
885 					  const char *pkcs11_module_path)
886 {
887 	char *engine_id = "pkcs11";
888 	const char *pre_cmd[] = {
889 		"SO_PATH", NULL /* pkcs11_so_path */,
890 		"ID", NULL /* engine_id */,
891 		"LIST_ADD", "1",
892 		/* "NO_VCHECK", "1", */
893 		"LOAD", NULL,
894 		NULL, NULL
895 	};
896 	const char *post_cmd[] = {
897 		"MODULE_PATH", NULL /* pkcs11_module_path */,
898 		NULL, NULL
899 	};
900 
901 	if (!pkcs11_so_path)
902 		return 0;
903 
904 	pre_cmd[1] = pkcs11_so_path;
905 	pre_cmd[3] = engine_id;
906 	if (pkcs11_module_path)
907 		post_cmd[1] = pkcs11_module_path;
908 	else
909 		post_cmd[0] = NULL;
910 
911 	wpa_printf(MSG_DEBUG, "ENGINE: Loading pkcs11 Engine from %s",
912 		   pkcs11_so_path);
913 
914 	return tls_engine_load_dynamic_generic(pre_cmd, post_cmd, engine_id);
915 }
916 
917 
918 /**
919  * tls_engine_load_dynamic_opensc - load the opensc engine provided by opensc
920  * @opensc_so_path: opensc_so_path from the configuration
921  */
tls_engine_load_dynamic_opensc(const char * opensc_so_path)922 static int tls_engine_load_dynamic_opensc(const char *opensc_so_path)
923 {
924 	char *engine_id = "opensc";
925 	const char *pre_cmd[] = {
926 		"SO_PATH", NULL /* opensc_so_path */,
927 		"ID", NULL /* engine_id */,
928 		"LIST_ADD", "1",
929 		"LOAD", NULL,
930 		NULL, NULL
931 	};
932 
933 	if (!opensc_so_path)
934 		return 0;
935 
936 	pre_cmd[1] = opensc_so_path;
937 	pre_cmd[3] = engine_id;
938 
939 	wpa_printf(MSG_DEBUG, "ENGINE: Loading OpenSC Engine from %s",
940 		   opensc_so_path);
941 
942 	return tls_engine_load_dynamic_generic(pre_cmd, NULL, engine_id);
943 }
944 #endif /* OPENSSL_NO_ENGINE */
945 
946 
remove_session_cb(SSL_CTX * ctx,SSL_SESSION * sess)947 static void remove_session_cb(SSL_CTX *ctx, SSL_SESSION *sess)
948 {
949 	struct wpabuf *buf;
950 
951 	if (tls_ex_idx_session < 0)
952 		return;
953 	buf = SSL_SESSION_get_ex_data(sess, tls_ex_idx_session);
954 	if (!buf)
955 		return;
956 	wpa_printf(MSG_DEBUG,
957 		   "OpenSSL: Free application session data %p (sess %p)",
958 		   buf, sess);
959 	wpabuf_free(buf);
960 
961 	SSL_SESSION_set_ex_data(sess, tls_ex_idx_session, NULL);
962 }
963 
964 
tls_init(const struct tls_config * conf)965 void * tls_init(const struct tls_config *conf)
966 {
967 	struct tls_data *data;
968 	SSL_CTX *ssl;
969 	struct tls_context *context;
970 	const char *ciphers;
971 
972 	if (tls_openssl_ref_count == 0) {
973 		tls_global = context = tls_context_new(conf);
974 		if (context == NULL)
975 			return NULL;
976 #ifdef CONFIG_FIPS
977 #ifdef OPENSSL_FIPS
978 		if (conf && conf->fips_mode) {
979 			static int fips_enabled = 0;
980 
981 			if (!fips_enabled && !FIPS_mode_set(1)) {
982 				wpa_printf(MSG_ERROR, "Failed to enable FIPS "
983 					   "mode");
984 				ERR_load_crypto_strings();
985 				ERR_print_errors_fp(stderr);
986 				os_free(tls_global);
987 				tls_global = NULL;
988 				return NULL;
989 			} else {
990 				wpa_printf(MSG_INFO, "Running in FIPS mode");
991 				fips_enabled = 1;
992 			}
993 		}
994 #else /* OPENSSL_FIPS */
995 		if (conf && conf->fips_mode) {
996 			wpa_printf(MSG_ERROR, "FIPS mode requested, but not "
997 				   "supported");
998 			os_free(tls_global);
999 			tls_global = NULL;
1000 			return NULL;
1001 		}
1002 #endif /* OPENSSL_FIPS */
1003 #endif /* CONFIG_FIPS */
1004 #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
1005 	(defined(LIBRESSL_VERSION_NUMBER) && \
1006 	 LIBRESSL_VERSION_NUMBER < 0x20700000L)
1007 		SSL_load_error_strings();
1008 		SSL_library_init();
1009 #ifndef OPENSSL_NO_SHA256
1010 		EVP_add_digest(EVP_sha256());
1011 #endif /* OPENSSL_NO_SHA256 */
1012 		/* TODO: if /dev/urandom is available, PRNG is seeded
1013 		 * automatically. If this is not the case, random data should
1014 		 * be added here. */
1015 
1016 #ifdef PKCS12_FUNCS
1017 #ifndef OPENSSL_NO_RC2
1018 		/*
1019 		 * 40-bit RC2 is commonly used in PKCS#12 files, so enable it.
1020 		 * This is enabled by PKCS12_PBE_add() in OpenSSL 0.9.8
1021 		 * versions, but it looks like OpenSSL 1.0.0 does not do that
1022 		 * anymore.
1023 		 */
1024 		EVP_add_cipher(EVP_rc2_40_cbc());
1025 #endif /* OPENSSL_NO_RC2 */
1026 		PKCS12_PBE_add();
1027 #endif  /* PKCS12_FUNCS */
1028 #endif /* < 1.1.0 */
1029 	} else {
1030 		context = tls_context_new(conf);
1031 		if (context == NULL)
1032 			return NULL;
1033 	}
1034 	tls_openssl_ref_count++;
1035 
1036 	data = os_zalloc(sizeof(*data));
1037 	if (data)
1038 		ssl = SSL_CTX_new(SSLv23_method());
1039 	else
1040 		ssl = NULL;
1041 	if (ssl == NULL) {
1042 		tls_openssl_ref_count--;
1043 		if (context != tls_global)
1044 			os_free(context);
1045 		if (tls_openssl_ref_count == 0) {
1046 			os_free(tls_global);
1047 			tls_global = NULL;
1048 		}
1049 		os_free(data);
1050 		return NULL;
1051 	}
1052 	data->ssl = ssl;
1053 	if (conf) {
1054 		data->tls_session_lifetime = conf->tls_session_lifetime;
1055 		data->crl_reload_interval = conf->crl_reload_interval;
1056 	}
1057 
1058 	SSL_CTX_set_options(ssl, SSL_OP_NO_SSLv2);
1059 	SSL_CTX_set_options(ssl, SSL_OP_NO_SSLv3);
1060 
1061 #ifdef SSL_MODE_NO_AUTO_CHAIN
1062 	/* Number of deployed use cases assume the default OpenSSL behavior of
1063 	 * auto chaining the local certificate is in use. BoringSSL removed this
1064 	 * functionality by default, so we need to restore it here to avoid
1065 	 * breaking existing use cases. */
1066 	SSL_CTX_clear_mode(ssl, SSL_MODE_NO_AUTO_CHAIN);
1067 #endif /* SSL_MODE_NO_AUTO_CHAIN */
1068 
1069 	SSL_CTX_set_info_callback(ssl, ssl_info_cb);
1070 	SSL_CTX_set_app_data(ssl, context);
1071 	if (data->tls_session_lifetime > 0) {
1072 		SSL_CTX_set_quiet_shutdown(ssl, 1);
1073 		/*
1074 		 * Set default context here. In practice, this will be replaced
1075 		 * by the per-EAP method context in tls_connection_set_verify().
1076 		 */
1077 		SSL_CTX_set_session_id_context(ssl, (u8 *) "hostapd", 7);
1078 		SSL_CTX_set_session_cache_mode(ssl, SSL_SESS_CACHE_SERVER);
1079 		SSL_CTX_set_timeout(ssl, data->tls_session_lifetime);
1080 		SSL_CTX_sess_set_remove_cb(ssl, remove_session_cb);
1081 	} else {
1082 		SSL_CTX_set_session_cache_mode(ssl, SSL_SESS_CACHE_OFF);
1083 	}
1084 
1085 	if (tls_ex_idx_session < 0) {
1086 		tls_ex_idx_session = SSL_SESSION_get_ex_new_index(
1087 			0, NULL, NULL, NULL, NULL);
1088 		if (tls_ex_idx_session < 0) {
1089 			tls_deinit(data);
1090 			return NULL;
1091 		}
1092 	}
1093 
1094 #ifndef OPENSSL_NO_ENGINE
1095 	wpa_printf(MSG_DEBUG, "ENGINE: Loading builtin engines");
1096 	ENGINE_load_builtin_engines();
1097 
1098 	if (conf &&
1099 	    (conf->opensc_engine_path || conf->pkcs11_engine_path ||
1100 	     conf->pkcs11_module_path)) {
1101 		if (tls_engine_load_dynamic_opensc(conf->opensc_engine_path) ||
1102 		    tls_engine_load_dynamic_pkcs11(conf->pkcs11_engine_path,
1103 						   conf->pkcs11_module_path)) {
1104 			tls_deinit(data);
1105 			return NULL;
1106 		}
1107 	}
1108 #endif /* OPENSSL_NO_ENGINE */
1109 
1110 	if (conf && conf->openssl_ciphers)
1111 		ciphers = conf->openssl_ciphers;
1112 	else
1113 		ciphers = TLS_DEFAULT_CIPHERS;
1114 	if (SSL_CTX_set_cipher_list(ssl, ciphers) != 1) {
1115 		wpa_printf(MSG_ERROR,
1116 			   "OpenSSL: Failed to set cipher string '%s'",
1117 			   ciphers);
1118 		tls_deinit(data);
1119 		return NULL;
1120 	}
1121 
1122 	return data;
1123 }
1124 
1125 
tls_deinit(void * ssl_ctx)1126 void tls_deinit(void *ssl_ctx)
1127 {
1128 	struct tls_data *data = ssl_ctx;
1129 	SSL_CTX *ssl = data->ssl;
1130 	struct tls_context *context = SSL_CTX_get_app_data(ssl);
1131 	if (context != tls_global)
1132 		os_free(context);
1133 	if (data->tls_session_lifetime > 0)
1134 		SSL_CTX_flush_sessions(ssl, 0);
1135 	os_free(data->ca_cert);
1136 	SSL_CTX_free(ssl);
1137 
1138 	tls_openssl_ref_count--;
1139 	if (tls_openssl_ref_count == 0) {
1140 #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
1141 	(defined(LIBRESSL_VERSION_NUMBER) && \
1142 	 LIBRESSL_VERSION_NUMBER < 0x20700000L)
1143 #ifndef OPENSSL_NO_ENGINE
1144 		ENGINE_cleanup();
1145 #endif /* OPENSSL_NO_ENGINE */
1146 		CRYPTO_cleanup_all_ex_data();
1147 		ERR_remove_thread_state(NULL);
1148 		ERR_free_strings();
1149 		EVP_cleanup();
1150 #endif /* < 1.1.0 */
1151 		os_free(tls_global->ocsp_stapling_response);
1152 		tls_global->ocsp_stapling_response = NULL;
1153 		os_free(tls_global);
1154 		tls_global = NULL;
1155 	}
1156 
1157 	os_free(data->check_cert_subject);
1158 	os_free(data);
1159 }
1160 
1161 
1162 #ifndef OPENSSL_NO_ENGINE
1163 
1164 /* Cryptoki return values */
1165 #define CKR_PIN_INCORRECT 0x000000a0
1166 #define CKR_PIN_INVALID 0x000000a1
1167 #define CKR_PIN_LEN_RANGE 0x000000a2
1168 
1169 /* libp11 */
1170 #define ERR_LIB_PKCS11	ERR_LIB_USER
1171 
tls_is_pin_error(unsigned int err)1172 static int tls_is_pin_error(unsigned int err)
1173 {
1174 	return ERR_GET_LIB(err) == ERR_LIB_PKCS11 &&
1175 		(ERR_GET_REASON(err) == CKR_PIN_INCORRECT ||
1176 		 ERR_GET_REASON(err) == CKR_PIN_INVALID ||
1177 		 ERR_GET_REASON(err) == CKR_PIN_LEN_RANGE);
1178 }
1179 
1180 #endif /* OPENSSL_NO_ENGINE */
1181 
1182 
1183 #ifdef ANDROID
1184 /* EVP_PKEY_from_keystore comes from system/security/keystore-engine. */
1185 EVP_PKEY * EVP_PKEY_from_keystore(const char *key_id);
1186 #endif /* ANDROID */
1187 
tls_engine_init(struct tls_connection * conn,const char * engine_id,const char * pin,const char * key_id,const char * cert_id,const char * ca_cert_id)1188 static int tls_engine_init(struct tls_connection *conn, const char *engine_id,
1189 			   const char *pin, const char *key_id,
1190 			   const char *cert_id, const char *ca_cert_id)
1191 {
1192 #if defined(ANDROID) && defined(OPENSSL_IS_BORINGSSL)
1193 #if !defined(OPENSSL_NO_ENGINE)
1194 #error "This code depends on OPENSSL_NO_ENGINE being defined by BoringSSL."
1195 #endif
1196 	if (!key_id)
1197 		return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
1198 	conn->engine = NULL;
1199 	conn->private_key = EVP_PKEY_from_keystore(key_id);
1200 	if (!conn->private_key) {
1201 		wpa_printf(MSG_ERROR,
1202 			   "ENGINE: cannot load private key with id '%s' [%s]",
1203 			   key_id,
1204 			   ERR_error_string(ERR_get_error(), NULL));
1205 		return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
1206 	}
1207 #endif /* ANDROID && OPENSSL_IS_BORINGSSL */
1208 
1209 #ifndef OPENSSL_NO_ENGINE
1210 	int ret = -1;
1211 	if (engine_id == NULL) {
1212 		wpa_printf(MSG_ERROR, "ENGINE: Engine ID not set");
1213 		return -1;
1214 	}
1215 
1216 	ERR_clear_error();
1217 #ifdef ANDROID
1218 	ENGINE_load_dynamic();
1219 #endif
1220 	conn->engine = ENGINE_by_id(engine_id);
1221 	if (!conn->engine) {
1222 		wpa_printf(MSG_ERROR, "ENGINE: engine %s not available [%s]",
1223 			   engine_id, ERR_error_string(ERR_get_error(), NULL));
1224 		goto err;
1225 	}
1226 	if (ENGINE_init(conn->engine) != 1) {
1227 		wpa_printf(MSG_ERROR, "ENGINE: engine init failed "
1228 			   "(engine: %s) [%s]", engine_id,
1229 			   ERR_error_string(ERR_get_error(), NULL));
1230 		goto err;
1231 	}
1232 	wpa_printf(MSG_DEBUG, "ENGINE: engine initialized");
1233 
1234 #ifndef ANDROID
1235 	if (pin && ENGINE_ctrl_cmd_string(conn->engine, "PIN", pin, 0) == 0) {
1236 		wpa_printf(MSG_ERROR, "ENGINE: cannot set pin [%s]",
1237 			   ERR_error_string(ERR_get_error(), NULL));
1238 		goto err;
1239 	}
1240 #endif
1241 	if (key_id) {
1242 		/*
1243 		 * Ensure that the ENGINE does not attempt to use the OpenSSL
1244 		 * UI system to obtain a PIN, if we didn't provide one.
1245 		 */
1246 		struct {
1247 			const void *password;
1248 			const char *prompt_info;
1249 		} key_cb = { "", NULL };
1250 
1251 		/* load private key first in-case PIN is required for cert */
1252 		conn->private_key = ENGINE_load_private_key(conn->engine,
1253 							    key_id, NULL,
1254 							    &key_cb);
1255 		if (!conn->private_key) {
1256 			unsigned long err = ERR_get_error();
1257 
1258 			wpa_printf(MSG_ERROR,
1259 				   "ENGINE: cannot load private key with id '%s' [%s]",
1260 				   key_id,
1261 				   ERR_error_string(err, NULL));
1262 			if (tls_is_pin_error(err))
1263 				ret = TLS_SET_PARAMS_ENGINE_PRV_BAD_PIN;
1264 			else
1265 				ret = TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
1266 			goto err;
1267 		}
1268 	}
1269 
1270 	/* handle a certificate and/or CA certificate */
1271 	if (cert_id || ca_cert_id) {
1272 		const char *cmd_name = "LOAD_CERT_CTRL";
1273 
1274 		/* test if the engine supports a LOAD_CERT_CTRL */
1275 		if (!ENGINE_ctrl(conn->engine, ENGINE_CTRL_GET_CMD_FROM_NAME,
1276 				 0, (void *)cmd_name, NULL)) {
1277 			wpa_printf(MSG_ERROR, "ENGINE: engine does not support"
1278 				   " loading certificates");
1279 			ret = TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
1280 			goto err;
1281 		}
1282 	}
1283 
1284 	return 0;
1285 
1286 err:
1287 	if (conn->engine) {
1288 		ENGINE_free(conn->engine);
1289 		conn->engine = NULL;
1290 	}
1291 
1292 	if (conn->private_key) {
1293 		EVP_PKEY_free(conn->private_key);
1294 		conn->private_key = NULL;
1295 	}
1296 
1297 	return ret;
1298 #else /* OPENSSL_NO_ENGINE */
1299 	return 0;
1300 #endif /* OPENSSL_NO_ENGINE */
1301 }
1302 
1303 
tls_engine_deinit(struct tls_connection * conn)1304 static void tls_engine_deinit(struct tls_connection *conn)
1305 {
1306 #if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE)
1307 	wpa_printf(MSG_DEBUG, "ENGINE: engine deinit");
1308 	if (conn->private_key) {
1309 		EVP_PKEY_free(conn->private_key);
1310 		conn->private_key = NULL;
1311 	}
1312 	if (conn->engine) {
1313 #if !defined(OPENSSL_IS_BORINGSSL)
1314 		ENGINE_finish(conn->engine);
1315 #endif /* !OPENSSL_IS_BORINGSSL */
1316 		conn->engine = NULL;
1317 	}
1318 #endif /* ANDROID || !OPENSSL_NO_ENGINE */
1319 }
1320 
1321 
tls_get_errors(void * ssl_ctx)1322 int tls_get_errors(void *ssl_ctx)
1323 {
1324 	int count = 0;
1325 	unsigned long err;
1326 
1327 	while ((err = ERR_get_error())) {
1328 		wpa_printf(MSG_INFO, "TLS - SSL error: %s",
1329 			   ERR_error_string(err, NULL));
1330 		count++;
1331 	}
1332 
1333 	return count;
1334 }
1335 
1336 
openssl_content_type(int content_type)1337 static const char * openssl_content_type(int content_type)
1338 {
1339 	switch (content_type) {
1340 	case 20:
1341 		return "change cipher spec";
1342 	case 21:
1343 		return "alert";
1344 	case 22:
1345 		return "handshake";
1346 	case 23:
1347 		return "application data";
1348 	case 24:
1349 		return "heartbeat";
1350 	case 256:
1351 		return "TLS header info"; /* pseudo content type */
1352 	case 257:
1353 		return "inner content type"; /* pseudo content type */
1354 	default:
1355 		return "?";
1356 	}
1357 }
1358 
1359 
openssl_handshake_type(int content_type,const u8 * buf,size_t len)1360 static const char * openssl_handshake_type(int content_type, const u8 *buf,
1361 					   size_t len)
1362 {
1363 	if (content_type == 257 && buf && len == 1)
1364 		return openssl_content_type(buf[0]);
1365 	if (content_type != 22 || !buf || len == 0)
1366 		return "";
1367 	switch (buf[0]) {
1368 	case 0:
1369 		return "hello request";
1370 	case 1:
1371 		return "client hello";
1372 	case 2:
1373 		return "server hello";
1374 	case 3:
1375 		return "hello verify request";
1376 	case 4:
1377 		return "new session ticket";
1378 	case 5:
1379 		return "end of early data";
1380 	case 6:
1381 		return "hello retry request";
1382 	case 8:
1383 		return "encrypted extensions";
1384 	case 11:
1385 		return "certificate";
1386 	case 12:
1387 		return "server key exchange";
1388 	case 13:
1389 		return "certificate request";
1390 	case 14:
1391 		return "server hello done";
1392 	case 15:
1393 		return "certificate verify";
1394 	case 16:
1395 		return "client key exchange";
1396 	case 20:
1397 		return "finished";
1398 	case 21:
1399 		return "certificate url";
1400 	case 22:
1401 		return "certificate status";
1402 	case 23:
1403 		return "supplemental data";
1404 	case 24:
1405 		return "key update";
1406 	case 254:
1407 		return "message hash";
1408 	default:
1409 		return "?";
1410 	}
1411 }
1412 
1413 
1414 #ifdef CONFIG_SUITEB
1415 
check_server_hello(struct tls_connection * conn,const u8 * pos,const u8 * end)1416 static void check_server_hello(struct tls_connection *conn,
1417 			       const u8 *pos, const u8 *end)
1418 {
1419 	size_t payload_len, id_len;
1420 
1421 	/*
1422 	 * Parse ServerHello to get the selected cipher suite since OpenSSL does
1423 	 * not make it cleanly available during handshake and we need to know
1424 	 * whether DHE was selected.
1425 	 */
1426 
1427 	if (end - pos < 3)
1428 		return;
1429 	payload_len = WPA_GET_BE24(pos);
1430 	pos += 3;
1431 
1432 	if ((size_t) (end - pos) < payload_len)
1433 		return;
1434 	end = pos + payload_len;
1435 
1436 	/* Skip Version and Random */
1437 	if (end - pos < 2 + SSL3_RANDOM_SIZE)
1438 		return;
1439 	pos += 2 + SSL3_RANDOM_SIZE;
1440 
1441 	/* Skip Session ID */
1442 	if (end - pos < 1)
1443 		return;
1444 	id_len = *pos++;
1445 	if ((size_t) (end - pos) < id_len)
1446 		return;
1447 	pos += id_len;
1448 
1449 	if (end - pos < 2)
1450 		return;
1451 	conn->cipher_suite = WPA_GET_BE16(pos);
1452 	wpa_printf(MSG_DEBUG, "OpenSSL: Server selected cipher suite 0x%x",
1453 		   conn->cipher_suite);
1454 }
1455 
1456 
check_server_key_exchange(SSL * ssl,struct tls_connection * conn,const u8 * pos,const u8 * end)1457 static void check_server_key_exchange(SSL *ssl, struct tls_connection *conn,
1458 				      const u8 *pos, const u8 *end)
1459 {
1460 	size_t payload_len;
1461 	u16 dh_len;
1462 	BIGNUM *p;
1463 	int bits;
1464 
1465 	if (!(conn->flags & TLS_CONN_SUITEB))
1466 		return;
1467 
1468 	/* DHE is enabled only with DHE-RSA-AES256-GCM-SHA384 */
1469 	if (conn->cipher_suite != 0x9f)
1470 		return;
1471 
1472 	if (end - pos < 3)
1473 		return;
1474 	payload_len = WPA_GET_BE24(pos);
1475 	pos += 3;
1476 
1477 	if ((size_t) (end - pos) < payload_len)
1478 		return;
1479 	end = pos + payload_len;
1480 
1481 	if (end - pos < 2)
1482 		return;
1483 	dh_len = WPA_GET_BE16(pos);
1484 	pos += 2;
1485 
1486 	if ((size_t) (end - pos) < dh_len)
1487 		return;
1488 	p = BN_bin2bn(pos, dh_len, NULL);
1489 	if (!p)
1490 		return;
1491 
1492 	bits = BN_num_bits(p);
1493 	BN_free(p);
1494 
1495 	conn->server_dh_prime_len = bits;
1496 	wpa_printf(MSG_DEBUG, "OpenSSL: Server DH prime length: %d bits",
1497 		   conn->server_dh_prime_len);
1498 }
1499 
1500 #endif /* CONFIG_SUITEB */
1501 
1502 
tls_msg_cb(int write_p,int version,int content_type,const void * buf,size_t len,SSL * ssl,void * arg)1503 static void tls_msg_cb(int write_p, int version, int content_type,
1504 		       const void *buf, size_t len, SSL *ssl, void *arg)
1505 {
1506 	struct tls_connection *conn = arg;
1507 	const u8 *pos = buf;
1508 
1509 	if (write_p == 2) {
1510 		wpa_printf(MSG_DEBUG,
1511 			   "OpenSSL: session ver=0x%x content_type=%d",
1512 			   version, content_type);
1513 		wpa_hexdump_key(MSG_MSGDUMP, "OpenSSL: Data", buf, len);
1514 		return;
1515 	}
1516 
1517 	wpa_printf(MSG_DEBUG, "OpenSSL: %s ver=0x%x content_type=%d (%s/%s)",
1518 		   write_p ? "TX" : "RX", version, content_type,
1519 		   openssl_content_type(content_type),
1520 		   openssl_handshake_type(content_type, buf, len));
1521 	wpa_hexdump_key(MSG_MSGDUMP, "OpenSSL: Message", buf, len);
1522 	if (content_type == 24 && len >= 3 && pos[0] == 1) {
1523 		size_t payload_len = WPA_GET_BE16(pos + 1);
1524 		if (payload_len + 3 > len) {
1525 			wpa_printf(MSG_ERROR, "OpenSSL: Heartbeat attack detected");
1526 			conn->invalid_hb_used = 1;
1527 		}
1528 	}
1529 
1530 #ifdef CONFIG_SUITEB
1531 	/*
1532 	 * Need to parse these handshake messages to be able to check DH prime
1533 	 * length since OpenSSL does not expose the new cipher suite and DH
1534 	 * parameters during handshake (e.g., for cert_cb() callback).
1535 	 */
1536 	if (content_type == 22 && pos && len > 0 && pos[0] == 2)
1537 		check_server_hello(conn, pos + 1, pos + len);
1538 	if (content_type == 22 && pos && len > 0 && pos[0] == 12)
1539 		check_server_key_exchange(ssl, conn, pos + 1, pos + len);
1540 #endif /* CONFIG_SUITEB */
1541 }
1542 
1543 
tls_connection_init(void * ssl_ctx)1544 struct tls_connection * tls_connection_init(void *ssl_ctx)
1545 {
1546 	struct tls_data *data = ssl_ctx;
1547 	SSL_CTX *ssl = data->ssl;
1548 	struct tls_connection *conn;
1549 	long options;
1550 	X509_STORE *new_cert_store;
1551 	struct os_reltime now;
1552 	struct tls_context *context = SSL_CTX_get_app_data(ssl);
1553 
1554 	/* Replace X509 store if it is time to update CRL. */
1555 	if (data->crl_reload_interval > 0 && os_get_reltime(&now) == 0 &&
1556 	    os_reltime_expired(&now, &data->crl_last_reload,
1557 			       data->crl_reload_interval)) {
1558 		wpa_printf(MSG_INFO,
1559 			   "OpenSSL: Flushing X509 store with ca_cert file");
1560 		new_cert_store = tls_crl_cert_reload(data->ca_cert,
1561 						     data->check_crl);
1562 		if (!new_cert_store) {
1563 			wpa_printf(MSG_ERROR,
1564 				   "OpenSSL: Error replacing X509 store with ca_cert file");
1565 		} else {
1566 			/* Replace old store */
1567 			SSL_CTX_set_cert_store(ssl, new_cert_store);
1568 			data->crl_last_reload = now;
1569 		}
1570 	}
1571 
1572 	conn = os_zalloc(sizeof(*conn));
1573 	if (conn == NULL)
1574 		return NULL;
1575 	conn->data = data;
1576 	conn->ssl_ctx = ssl;
1577 	conn->ssl = SSL_new(ssl);
1578 	if (conn->ssl == NULL) {
1579 		tls_show_errors(MSG_INFO, __func__,
1580 				"Failed to initialize new SSL connection");
1581 		os_free(conn);
1582 		return NULL;
1583 	}
1584 
1585 	conn->context = context;
1586 	SSL_set_app_data(conn->ssl, conn);
1587 	SSL_set_msg_callback(conn->ssl, tls_msg_cb);
1588 	SSL_set_msg_callback_arg(conn->ssl, conn);
1589 	options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
1590 		SSL_OP_SINGLE_DH_USE;
1591 #ifdef SSL_OP_NO_COMPRESSION
1592 	options |= SSL_OP_NO_COMPRESSION;
1593 #endif /* SSL_OP_NO_COMPRESSION */
1594 	SSL_set_options(conn->ssl, options);
1595 #ifdef SSL_OP_ENABLE_MIDDLEBOX_COMPAT
1596 	/* Hopefully there is no need for middlebox compatibility mechanisms
1597 	 * when going through EAP authentication. */
1598 	SSL_clear_options(conn->ssl, SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
1599 #endif
1600 
1601 	conn->ssl_in = BIO_new(BIO_s_mem());
1602 	if (!conn->ssl_in) {
1603 		tls_show_errors(MSG_INFO, __func__,
1604 				"Failed to create a new BIO for ssl_in");
1605 		SSL_free(conn->ssl);
1606 		os_free(conn);
1607 		return NULL;
1608 	}
1609 
1610 	conn->ssl_out = BIO_new(BIO_s_mem());
1611 	if (!conn->ssl_out) {
1612 		tls_show_errors(MSG_INFO, __func__,
1613 				"Failed to create a new BIO for ssl_out");
1614 		SSL_free(conn->ssl);
1615 		BIO_free(conn->ssl_in);
1616 		os_free(conn);
1617 		return NULL;
1618 	}
1619 
1620 	SSL_set_bio(conn->ssl, conn->ssl_in, conn->ssl_out);
1621 
1622 	return conn;
1623 }
1624 
1625 
tls_connection_deinit(void * ssl_ctx,struct tls_connection * conn)1626 void tls_connection_deinit(void *ssl_ctx, struct tls_connection *conn)
1627 {
1628 	if (conn == NULL)
1629 		return;
1630 	if (conn->success_data) {
1631 		/*
1632 		 * Make sure ssl_clear_bad_session() does not remove this
1633 		 * session.
1634 		 */
1635 		SSL_set_quiet_shutdown(conn->ssl, 1);
1636 		SSL_shutdown(conn->ssl);
1637 	}
1638 	SSL_free(conn->ssl);
1639 	tls_engine_deinit(conn);
1640 	os_free(conn->subject_match);
1641 	os_free(conn->altsubject_match);
1642 	os_free(conn->suffix_match);
1643 	os_free(conn->domain_match);
1644 	os_free(conn->check_cert_subject);
1645 	os_free(conn->session_ticket);
1646 	os_free(conn);
1647 }
1648 
1649 
tls_connection_established(void * ssl_ctx,struct tls_connection * conn)1650 int tls_connection_established(void *ssl_ctx, struct tls_connection *conn)
1651 {
1652 	return conn ? SSL_is_init_finished(conn->ssl) : 0;
1653 }
1654 
1655 
tls_connection_peer_serial_num(void * tls_ctx,struct tls_connection * conn)1656 char * tls_connection_peer_serial_num(void *tls_ctx,
1657 				      struct tls_connection *conn)
1658 {
1659 	ASN1_INTEGER *ser;
1660 	char *serial_num;
1661 	size_t len;
1662 
1663 	if (!conn->peer_cert)
1664 		return NULL;
1665 
1666 	ser = X509_get_serialNumber(conn->peer_cert);
1667 	if (!ser)
1668 		return NULL;
1669 
1670 	len = ASN1_STRING_length(ser) * 2 + 1;
1671 	serial_num = os_malloc(len);
1672 	if (!serial_num)
1673 		return NULL;
1674 	wpa_snprintf_hex_uppercase(serial_num, len,
1675 				   ASN1_STRING_get0_data(ser),
1676 				   ASN1_STRING_length(ser));
1677 	return serial_num;
1678 }
1679 
1680 
tls_connection_shutdown(void * ssl_ctx,struct tls_connection * conn)1681 int tls_connection_shutdown(void *ssl_ctx, struct tls_connection *conn)
1682 {
1683 	if (conn == NULL)
1684 		return -1;
1685 
1686 	/* Shutdown previous TLS connection without notifying the peer
1687 	 * because the connection was already terminated in practice
1688 	 * and "close notify" shutdown alert would confuse AS. */
1689 	SSL_set_quiet_shutdown(conn->ssl, 1);
1690 	SSL_shutdown(conn->ssl);
1691 	return SSL_clear(conn->ssl) == 1 ? 0 : -1;
1692 }
1693 
1694 
tls_match_altsubject_component(X509 * cert,int type,const char * value,size_t len)1695 static int tls_match_altsubject_component(X509 *cert, int type,
1696 					  const char *value, size_t len)
1697 {
1698 	GENERAL_NAME *gen;
1699 	void *ext;
1700 	int found = 0;
1701 	stack_index_t i;
1702 
1703 	ext = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);
1704 
1705 	for (i = 0; ext && i < sk_GENERAL_NAME_num(ext); i++) {
1706 		gen = sk_GENERAL_NAME_value(ext, i);
1707 		if (gen->type != type)
1708 			continue;
1709 		if (os_strlen((char *) gen->d.ia5->data) == len &&
1710 		    os_memcmp(value, gen->d.ia5->data, len) == 0)
1711 			found++;
1712 	}
1713 
1714 	sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free);
1715 
1716 	return found;
1717 }
1718 
1719 
tls_match_altsubject(X509 * cert,const char * match)1720 static int tls_match_altsubject(X509 *cert, const char *match)
1721 {
1722 	int type;
1723 	const char *pos, *end;
1724 	size_t len;
1725 
1726 	pos = match;
1727 	do {
1728 		if (os_strncmp(pos, "EMAIL:", 6) == 0) {
1729 			type = GEN_EMAIL;
1730 			pos += 6;
1731 		} else if (os_strncmp(pos, "DNS:", 4) == 0) {
1732 			type = GEN_DNS;
1733 			pos += 4;
1734 		} else if (os_strncmp(pos, "URI:", 4) == 0) {
1735 			type = GEN_URI;
1736 			pos += 4;
1737 		} else {
1738 			wpa_printf(MSG_INFO, "TLS: Invalid altSubjectName "
1739 				   "match '%s'", pos);
1740 			return 0;
1741 		}
1742 		end = os_strchr(pos, ';');
1743 		while (end) {
1744 			if (os_strncmp(end + 1, "EMAIL:", 6) == 0 ||
1745 			    os_strncmp(end + 1, "DNS:", 4) == 0 ||
1746 			    os_strncmp(end + 1, "URI:", 4) == 0)
1747 				break;
1748 			end = os_strchr(end + 1, ';');
1749 		}
1750 		if (end)
1751 			len = end - pos;
1752 		else
1753 			len = os_strlen(pos);
1754 		if (tls_match_altsubject_component(cert, type, pos, len) > 0)
1755 			return 1;
1756 		pos = end + 1;
1757 	} while (end);
1758 
1759 	return 0;
1760 }
1761 
1762 
1763 #ifndef CONFIG_NATIVE_WINDOWS
domain_suffix_match(const u8 * val,size_t len,const char * match,size_t match_len,int full)1764 static int domain_suffix_match(const u8 *val, size_t len, const char *match,
1765 			       size_t match_len, int full)
1766 {
1767 	size_t i;
1768 
1769 	/* Check for embedded nuls that could mess up suffix matching */
1770 	for (i = 0; i < len; i++) {
1771 		if (val[i] == '\0') {
1772 			wpa_printf(MSG_DEBUG, "TLS: Embedded null in a string - reject");
1773 			return 0;
1774 		}
1775 	}
1776 
1777 	if (match_len > len || (full && match_len != len))
1778 		return 0;
1779 
1780 	if (os_strncasecmp((const char *) val + len - match_len, match,
1781 			   match_len) != 0)
1782 		return 0; /* no match */
1783 
1784 	if (match_len == len)
1785 		return 1; /* exact match */
1786 
1787 	if (val[len - match_len - 1] == '.')
1788 		return 1; /* full label match completes suffix match */
1789 
1790 	wpa_printf(MSG_DEBUG, "TLS: Reject due to incomplete label match");
1791 	return 0;
1792 }
1793 #endif /* CONFIG_NATIVE_WINDOWS */
1794 
1795 
1796 struct tls_dn_field_order_cnt {
1797 	u8 cn;
1798 	u8 c;
1799 	u8 l;
1800 	u8 st;
1801 	u8 o;
1802 	u8 ou;
1803 	u8 email;
1804 };
1805 
1806 
get_dn_field_index(const struct tls_dn_field_order_cnt * dn_cnt,int nid)1807 static int get_dn_field_index(const struct tls_dn_field_order_cnt *dn_cnt,
1808 			      int nid)
1809 {
1810 	switch (nid) {
1811 	case NID_commonName:
1812 		return dn_cnt->cn;
1813 	case NID_countryName:
1814 		return dn_cnt->c;
1815 	case NID_localityName:
1816 		return dn_cnt->l;
1817 	case NID_stateOrProvinceName:
1818 		return dn_cnt->st;
1819 	case NID_organizationName:
1820 		return dn_cnt->o;
1821 	case NID_organizationalUnitName:
1822 		return dn_cnt->ou;
1823 	case NID_pkcs9_emailAddress:
1824 		return dn_cnt->email;
1825 	default:
1826 		wpa_printf(MSG_ERROR,
1827 			   "TLS: Unknown NID '%d' in check_cert_subject",
1828 			   nid);
1829 		return -1;
1830 	}
1831 }
1832 
1833 
1834 /**
1835  * match_dn_field - Match configuration DN field against Certificate DN field
1836  * @cert: Certificate
1837  * @nid: NID of DN field
1838  * @field: Field name
1839  * @value DN field value which is passed from configuration
1840  *	e.g., if configuration have C=US and this argument will point to US.
1841  * @dn_cnt: DN matching context
1842  * Returns: 1 on success and 0 on failure
1843  */
match_dn_field(const X509 * cert,int nid,const char * field,const char * value,const struct tls_dn_field_order_cnt * dn_cnt)1844 static int match_dn_field(const X509 *cert, int nid, const char *field,
1845 			  const char *value,
1846 			  const struct tls_dn_field_order_cnt *dn_cnt)
1847 {
1848 	int i, ret = 0, len, config_dn_field_index, match_index = 0;
1849 	X509_NAME *name;
1850 
1851 	len = os_strlen(value);
1852 	name = X509_get_subject_name((X509 *) cert);
1853 
1854 	/* Assign incremented cnt for every field of DN to check DN field in
1855 	 * right order */
1856 	config_dn_field_index = get_dn_field_index(dn_cnt, nid);
1857 	if (config_dn_field_index < 0)
1858 		return 0;
1859 
1860 	/* Fetch value based on NID */
1861 	for (i = -1; (i = X509_NAME_get_index_by_NID(name, nid, i)) > -1;) {
1862 		X509_NAME_ENTRY *e;
1863 		ASN1_STRING *cn;
1864 
1865 		e = X509_NAME_get_entry(name, i);
1866 		if (!e)
1867 			continue;
1868 
1869 		cn = X509_NAME_ENTRY_get_data(e);
1870 		if (!cn)
1871 			continue;
1872 
1873 		match_index++;
1874 
1875 		/* check for more than one DN field with same name */
1876 		if (match_index != config_dn_field_index)
1877 			continue;
1878 
1879 		/* Check wildcard at the right end side */
1880 		/* E.g., if OU=develop* mentioned in configuration, allow 'OU'
1881 		 * of the subject in the client certificate to start with
1882 		 * 'develop' */
1883 		if (len > 0 && value[len - 1] == '*') {
1884 			/* Compare actual certificate DN field value with
1885 			 * configuration DN field value up to the specified
1886 			 * length. */
1887 			ret = ASN1_STRING_length(cn) >= len - 1 &&
1888 				os_memcmp(ASN1_STRING_get0_data(cn), value,
1889 					  len - 1) == 0;
1890 		} else {
1891 			/* Compare actual certificate DN field value with
1892 			 * configuration DN field value */
1893 			ret = ASN1_STRING_length(cn) == len &&
1894 				os_memcmp(ASN1_STRING_get0_data(cn), value,
1895 					  len) == 0;
1896 		}
1897 		if (!ret) {
1898 			wpa_printf(MSG_ERROR,
1899 				   "OpenSSL: Failed to match %s '%s' with certificate DN field value '%s'",
1900 				   field, value, ASN1_STRING_get0_data(cn));
1901 		}
1902 		break;
1903 	}
1904 
1905 	return ret;
1906 }
1907 
1908 
1909 /**
1910  * get_value_from_field - Get value from DN field
1911  * @cert: Certificate
1912  * @field_str: DN field string which is passed from configuration file (e.g.,
1913  *	 C=US)
1914  * @dn_cnt: DN matching context
1915  * Returns: 1 on success and 0 on failure
1916  */
get_value_from_field(const X509 * cert,char * field_str,struct tls_dn_field_order_cnt * dn_cnt)1917 static int get_value_from_field(const X509 *cert, char *field_str,
1918 				struct tls_dn_field_order_cnt *dn_cnt)
1919 {
1920 	int nid;
1921 	char *context = NULL, *name, *value;
1922 
1923 	if (os_strcmp(field_str, "*") == 0)
1924 		return 1; /* wildcard matches everything */
1925 
1926 	name = str_token(field_str, "=", &context);
1927 	if (!name)
1928 		return 0;
1929 
1930 	/* Compare all configured DN fields and assign nid based on that to
1931 	 * fetch correct value from certificate subject */
1932 	if (os_strcmp(name, "CN") == 0) {
1933 		nid = NID_commonName;
1934 		dn_cnt->cn++;
1935 	} else if(os_strcmp(name, "C") == 0) {
1936 		nid = NID_countryName;
1937 		dn_cnt->c++;
1938 	} else if (os_strcmp(name, "L") == 0) {
1939 		nid = NID_localityName;
1940 		dn_cnt->l++;
1941 	} else if (os_strcmp(name, "ST") == 0) {
1942 		nid = NID_stateOrProvinceName;
1943 		dn_cnt->st++;
1944 	} else if (os_strcmp(name, "O") == 0) {
1945 		nid = NID_organizationName;
1946 		dn_cnt->o++;
1947 	} else if (os_strcmp(name, "OU") == 0) {
1948 		nid = NID_organizationalUnitName;
1949 		dn_cnt->ou++;
1950 	} else if (os_strcmp(name, "emailAddress") == 0) {
1951 		nid = NID_pkcs9_emailAddress;
1952 		dn_cnt->email++;
1953 	} else {
1954 		wpa_printf(MSG_ERROR,
1955 			"TLS: Unknown field '%s' in check_cert_subject", name);
1956 		return 0;
1957 	}
1958 
1959 	value = str_token(field_str, "=", &context);
1960 	if (!value) {
1961 		wpa_printf(MSG_ERROR,
1962 			   "TLS: Distinguished Name field '%s' value is not defined in check_cert_subject",
1963 			   name);
1964 		return 0;
1965 	}
1966 
1967 	return match_dn_field(cert, nid, name, value, dn_cnt);
1968 }
1969 
1970 
1971 /**
1972  * tls_match_dn_field - Match subject DN field with check_cert_subject
1973  * @cert: Certificate
1974  * @match: check_cert_subject string
1975  * Returns: Return 1 on success and 0 on failure
1976 */
tls_match_dn_field(X509 * cert,const char * match)1977 static int tls_match_dn_field(X509 *cert, const char *match)
1978 {
1979 	const char *token, *last = NULL;
1980 	char field[256];
1981 	struct tls_dn_field_order_cnt dn_cnt;
1982 
1983 	os_memset(&dn_cnt, 0, sizeof(dn_cnt));
1984 
1985 	/* Maximum length of each DN field is 255 characters */
1986 
1987 	/* Process each '/' delimited field */
1988 	while ((token = cstr_token(match, "/", &last))) {
1989 		if (last - token >= (int) sizeof(field)) {
1990 			wpa_printf(MSG_ERROR,
1991 				   "OpenSSL: Too long DN matching field value in '%s'",
1992 				   match);
1993 			return 0;
1994 		}
1995 		os_memcpy(field, token, last - token);
1996 		field[last - token] = '\0';
1997 
1998 		if (!get_value_from_field(cert, field, &dn_cnt)) {
1999 			wpa_printf(MSG_DEBUG, "OpenSSL: No match for DN '%s'",
2000 				   field);
2001 			return 0;
2002 		}
2003 	}
2004 
2005 	return 1;
2006 }
2007 
2008 
2009 #ifndef CONFIG_NATIVE_WINDOWS
tls_match_suffix_helper(X509 * cert,const char * match,size_t match_len,int full)2010 static int tls_match_suffix_helper(X509 *cert, const char *match,
2011 				   size_t match_len, int full)
2012 {
2013 	GENERAL_NAME *gen;
2014 	void *ext;
2015 	int i;
2016 	stack_index_t j;
2017 	int dns_name = 0;
2018 	X509_NAME *name;
2019 
2020 	wpa_printf(MSG_DEBUG, "TLS: Match domain against %s%s",
2021 		   full ? "": "suffix ", match);
2022 
2023 	ext = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);
2024 
2025 	for (j = 0; ext && j < sk_GENERAL_NAME_num(ext); j++) {
2026 		gen = sk_GENERAL_NAME_value(ext, j);
2027 		if (gen->type != GEN_DNS)
2028 			continue;
2029 		dns_name++;
2030 		wpa_hexdump_ascii(MSG_DEBUG, "TLS: Certificate dNSName",
2031 				  gen->d.dNSName->data,
2032 				  gen->d.dNSName->length);
2033 		if (domain_suffix_match(gen->d.dNSName->data,
2034 					gen->d.dNSName->length,
2035 					match, match_len, full) == 1) {
2036 			wpa_printf(MSG_DEBUG, "TLS: %s in dNSName found",
2037 				   full ? "Match" : "Suffix match");
2038 			sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free);
2039 			return 1;
2040 		}
2041 	}
2042 	sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free);
2043 
2044 	if (dns_name) {
2045 		wpa_printf(MSG_DEBUG, "TLS: None of the dNSName(s) matched");
2046 		return 0;
2047 	}
2048 
2049 	name = X509_get_subject_name(cert);
2050 	i = -1;
2051 	for (;;) {
2052 		X509_NAME_ENTRY *e;
2053 		ASN1_STRING *cn;
2054 
2055 		i = X509_NAME_get_index_by_NID(name, NID_commonName, i);
2056 		if (i == -1)
2057 			break;
2058 		e = X509_NAME_get_entry(name, i);
2059 		if (e == NULL)
2060 			continue;
2061 		cn = X509_NAME_ENTRY_get_data(e);
2062 		if (cn == NULL)
2063 			continue;
2064 		wpa_hexdump_ascii(MSG_DEBUG, "TLS: Certificate commonName",
2065 				  cn->data, cn->length);
2066 		if (domain_suffix_match(cn->data, cn->length,
2067 					match, match_len, full) == 1) {
2068 			wpa_printf(MSG_DEBUG, "TLS: %s in commonName found",
2069 				   full ? "Match" : "Suffix match");
2070 			return 1;
2071 		}
2072 	}
2073 
2074 	wpa_printf(MSG_DEBUG, "TLS: No CommonName %smatch found",
2075 		   full ? "": "suffix ");
2076 	return 0;
2077 }
2078 #endif /* CONFIG_NATIVE_WINDOWS */
2079 
2080 
tls_match_suffix(X509 * cert,const char * match,int full)2081 static int tls_match_suffix(X509 *cert, const char *match, int full)
2082 {
2083 #ifdef CONFIG_NATIVE_WINDOWS
2084 	/* wincrypt.h has conflicting X509_NAME definition */
2085 	return -1;
2086 #else /* CONFIG_NATIVE_WINDOWS */
2087 	const char *token, *last = NULL;
2088 
2089 	/* Process each match alternative separately until a match is found */
2090 	while ((token = cstr_token(match, ";", &last))) {
2091 		if (tls_match_suffix_helper(cert, token, last - token, full))
2092 			return 1;
2093 	}
2094 
2095 	return 0;
2096 #endif /* CONFIG_NATIVE_WINDOWS */
2097 }
2098 
2099 
openssl_tls_fail_reason(int err)2100 static enum tls_fail_reason openssl_tls_fail_reason(int err)
2101 {
2102 	switch (err) {
2103 	case X509_V_ERR_CERT_REVOKED:
2104 		return TLS_FAIL_REVOKED;
2105 	case X509_V_ERR_CERT_NOT_YET_VALID:
2106 	case X509_V_ERR_CRL_NOT_YET_VALID:
2107 		return TLS_FAIL_NOT_YET_VALID;
2108 	case X509_V_ERR_CERT_HAS_EXPIRED:
2109 	case X509_V_ERR_CRL_HAS_EXPIRED:
2110 		return TLS_FAIL_EXPIRED;
2111 	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
2112 	case X509_V_ERR_UNABLE_TO_GET_CRL:
2113 	case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
2114 	case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
2115 	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
2116 	case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
2117 	case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
2118 	case X509_V_ERR_CERT_CHAIN_TOO_LONG:
2119 	case X509_V_ERR_PATH_LENGTH_EXCEEDED:
2120 	case X509_V_ERR_INVALID_CA:
2121 		return TLS_FAIL_UNTRUSTED;
2122 	case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
2123 	case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
2124 	case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
2125 	case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
2126 	case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
2127 	case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
2128 	case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
2129 	case X509_V_ERR_CERT_UNTRUSTED:
2130 	case X509_V_ERR_CERT_REJECTED:
2131 		return TLS_FAIL_BAD_CERTIFICATE;
2132 	default:
2133 		return TLS_FAIL_UNSPECIFIED;
2134 	}
2135 }
2136 
2137 
get_x509_cert(X509 * cert)2138 static struct wpabuf * get_x509_cert(X509 *cert)
2139 {
2140 	struct wpabuf *buf;
2141 	u8 *tmp;
2142 
2143 	int cert_len = i2d_X509(cert, NULL);
2144 	if (cert_len <= 0)
2145 		return NULL;
2146 
2147 	buf = wpabuf_alloc(cert_len);
2148 	if (buf == NULL)
2149 		return NULL;
2150 
2151 	tmp = wpabuf_put(buf, cert_len);
2152 	i2d_X509(cert, &tmp);
2153 	return buf;
2154 }
2155 
2156 
openssl_tls_fail_event(struct tls_connection * conn,X509 * err_cert,int err,int depth,const char * subject,const char * err_str,enum tls_fail_reason reason)2157 static void openssl_tls_fail_event(struct tls_connection *conn,
2158 				   X509 *err_cert, int err, int depth,
2159 				   const char *subject, const char *err_str,
2160 				   enum tls_fail_reason reason)
2161 {
2162 	union tls_event_data ev;
2163 	struct wpabuf *cert = NULL;
2164 	struct tls_context *context = conn->context;
2165 
2166 #ifdef ANDROID
2167 	log_cert_validation_failure(err_str);
2168 #endif
2169 
2170 	if (context->event_cb == NULL)
2171 		return;
2172 
2173 	cert = get_x509_cert(err_cert);
2174 	os_memset(&ev, 0, sizeof(ev));
2175 	ev.cert_fail.reason = reason != TLS_FAIL_UNSPECIFIED ?
2176 		reason : openssl_tls_fail_reason(err);
2177 	ev.cert_fail.depth = depth;
2178 	ev.cert_fail.subject = subject;
2179 	ev.cert_fail.reason_txt = err_str;
2180 	ev.cert_fail.cert = cert;
2181 	context->event_cb(context->cb_ctx, TLS_CERT_CHAIN_FAILURE, &ev);
2182 	wpabuf_free(cert);
2183 }
2184 
2185 
openssl_cert_tod(X509 * cert)2186 static int openssl_cert_tod(X509 *cert)
2187 {
2188 	CERTIFICATEPOLICIES *ext;
2189 	stack_index_t i;
2190 	char buf[100];
2191 	int res;
2192 	int tod = 0;
2193 
2194 	ext = X509_get_ext_d2i(cert, NID_certificate_policies, NULL, NULL);
2195 	if (!ext)
2196 		return 0;
2197 
2198 	for (i = 0; i < sk_POLICYINFO_num(ext); i++) {
2199 		POLICYINFO *policy;
2200 
2201 		policy = sk_POLICYINFO_value(ext, i);
2202 		res = OBJ_obj2txt(buf, sizeof(buf), policy->policyid, 0);
2203 		if (res < 0 || (size_t) res >= sizeof(buf))
2204 			continue;
2205 		wpa_printf(MSG_DEBUG, "OpenSSL: Certificate Policy %s", buf);
2206 		if (os_strcmp(buf, "1.3.6.1.4.1.40808.1.3.1") == 0)
2207 			tod = 1; /* TOD-STRICT */
2208 		else if (os_strcmp(buf, "1.3.6.1.4.1.40808.1.3.2") == 0 && !tod)
2209 			tod = 2; /* TOD-TOFU */
2210 	}
2211 	sk_POLICYINFO_pop_free(ext, POLICYINFO_free);
2212 
2213 	return tod;
2214 }
2215 
2216 
openssl_tls_cert_event(struct tls_connection * conn,X509 * err_cert,int depth,const char * subject)2217 static void openssl_tls_cert_event(struct tls_connection *conn,
2218 				   X509 *err_cert, int depth,
2219 				   const char *subject)
2220 {
2221 	struct wpabuf *cert = NULL;
2222 	union tls_event_data ev;
2223 	struct tls_context *context = conn->context;
2224 	char *altsubject[TLS_MAX_ALT_SUBJECT];
2225 	int alt, num_altsubject = 0;
2226 	GENERAL_NAME *gen;
2227 	void *ext;
2228 	stack_index_t i;
2229 	ASN1_INTEGER *ser;
2230 	char serial_num[128];
2231 #ifdef CONFIG_SHA256
2232 	u8 hash[32];
2233 #endif /* CONFIG_SHA256 */
2234 
2235 	if (context->event_cb == NULL)
2236 		return;
2237 
2238 	os_memset(&ev, 0, sizeof(ev));
2239 	if (conn->cert_probe || (conn->flags & TLS_CONN_EXT_CERT_CHECK) ||
2240 	    context->cert_in_cb) {
2241 		cert = get_x509_cert(err_cert);
2242 		ev.peer_cert.cert = cert;
2243 	}
2244 #ifdef CONFIG_SHA256
2245 	if (cert) {
2246 		const u8 *addr[1];
2247 		size_t len[1];
2248 		addr[0] = wpabuf_head(cert);
2249 		len[0] = wpabuf_len(cert);
2250 		if (sha256_vector(1, addr, len, hash) == 0) {
2251 			ev.peer_cert.hash = hash;
2252 			ev.peer_cert.hash_len = sizeof(hash);
2253 		}
2254 	}
2255 #endif /* CONFIG_SHA256 */
2256 	ev.peer_cert.depth = depth;
2257 	ev.peer_cert.subject = subject;
2258 
2259 	ser = X509_get_serialNumber(err_cert);
2260 	if (ser) {
2261 		wpa_snprintf_hex_uppercase(serial_num, sizeof(serial_num),
2262 					   ASN1_STRING_get0_data(ser),
2263 					   ASN1_STRING_length(ser));
2264 		ev.peer_cert.serial_num = serial_num;
2265 	}
2266 
2267 	ext = X509_get_ext_d2i(err_cert, NID_subject_alt_name, NULL, NULL);
2268 	for (i = 0; ext && i < sk_GENERAL_NAME_num(ext); i++) {
2269 		char *pos;
2270 
2271 		if (num_altsubject == TLS_MAX_ALT_SUBJECT)
2272 			break;
2273 		gen = sk_GENERAL_NAME_value(ext, i);
2274 		if (gen->type != GEN_EMAIL &&
2275 		    gen->type != GEN_DNS &&
2276 		    gen->type != GEN_URI)
2277 			continue;
2278 
2279 		pos = os_malloc(10 + gen->d.ia5->length + 1);
2280 		if (pos == NULL)
2281 			break;
2282 		altsubject[num_altsubject++] = pos;
2283 
2284 		switch (gen->type) {
2285 		case GEN_EMAIL:
2286 			os_memcpy(pos, "EMAIL:", 6);
2287 			pos += 6;
2288 			break;
2289 		case GEN_DNS:
2290 			os_memcpy(pos, "DNS:", 4);
2291 			pos += 4;
2292 			break;
2293 		case GEN_URI:
2294 			os_memcpy(pos, "URI:", 4);
2295 			pos += 4;
2296 			break;
2297 		}
2298 
2299 		os_memcpy(pos, gen->d.ia5->data, gen->d.ia5->length);
2300 		pos += gen->d.ia5->length;
2301 		*pos = '\0';
2302 	}
2303 	sk_GENERAL_NAME_pop_free(ext, GENERAL_NAME_free);
2304 
2305 	for (alt = 0; alt < num_altsubject; alt++)
2306 		ev.peer_cert.altsubject[alt] = altsubject[alt];
2307 	ev.peer_cert.num_altsubject = num_altsubject;
2308 
2309 	ev.peer_cert.tod = openssl_cert_tod(err_cert);
2310 
2311 	context->event_cb(context->cb_ctx, TLS_PEER_CERTIFICATE, &ev);
2312 	wpabuf_free(cert);
2313 	for (alt = 0; alt < num_altsubject; alt++)
2314 		os_free(altsubject[alt]);
2315 }
2316 
2317 
debug_print_cert(X509 * cert,const char * title)2318 static void debug_print_cert(X509 *cert, const char *title)
2319 {
2320 #ifndef CONFIG_NO_STDOUT_DEBUG
2321 	BIO *out;
2322 	size_t rlen;
2323 	char *txt;
2324 	int res;
2325 
2326 	if (wpa_debug_level > MSG_DEBUG)
2327 		return;
2328 
2329 	out = BIO_new(BIO_s_mem());
2330 	if (!out)
2331 		return;
2332 
2333 	X509_print(out, cert);
2334 	rlen = BIO_ctrl_pending(out);
2335 	txt = os_malloc(rlen + 1);
2336 	if (txt) {
2337 		res = BIO_read(out, txt, rlen);
2338 		if (res > 0) {
2339 			txt[res] = '\0';
2340 			wpa_printf(MSG_DEBUG, "OpenSSL: %s\n%s", title, txt);
2341 		}
2342 		os_free(txt);
2343 	}
2344 
2345 	BIO_free(out);
2346 #endif /* CONFIG_NO_STDOUT_DEBUG */
2347 }
2348 
2349 
tls_verify_cb(int preverify_ok,X509_STORE_CTX * x509_ctx)2350 static int tls_verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx)
2351 {
2352 	char buf[256];
2353 	X509 *err_cert;
2354 	int err, depth;
2355 	SSL *ssl;
2356 	struct tls_connection *conn;
2357 	struct tls_context *context;
2358 	char *match, *altmatch, *suffix_match, *domain_match;
2359 	const char *check_cert_subject;
2360 	const char *err_str;
2361 
2362 	err_cert = X509_STORE_CTX_get_current_cert(x509_ctx);
2363 	if (!err_cert)
2364 		return 0;
2365 
2366 	err = X509_STORE_CTX_get_error(x509_ctx);
2367 	depth = X509_STORE_CTX_get_error_depth(x509_ctx);
2368 	ssl = X509_STORE_CTX_get_ex_data(x509_ctx,
2369 					 SSL_get_ex_data_X509_STORE_CTX_idx());
2370 	os_snprintf(buf, sizeof(buf), "Peer certificate - depth %d", depth);
2371 	debug_print_cert(err_cert, buf);
2372 	X509_NAME_oneline(X509_get_subject_name(err_cert), buf, sizeof(buf));
2373 
2374 	conn = SSL_get_app_data(ssl);
2375 	if (conn == NULL)
2376 		return 0;
2377 
2378 	if (depth == 0)
2379 		conn->peer_cert = err_cert;
2380 	else if (depth == 1)
2381 		conn->peer_issuer = err_cert;
2382 	else if (depth == 2)
2383 		conn->peer_issuer_issuer = err_cert;
2384 
2385 	context = conn->context;
2386 	match = conn->subject_match;
2387 	altmatch = conn->altsubject_match;
2388 	suffix_match = conn->suffix_match;
2389 	domain_match = conn->domain_match;
2390 
2391 	if (!preverify_ok && !conn->ca_cert_verify)
2392 		preverify_ok = 1;
2393 	if (!preverify_ok && depth > 0 && conn->server_cert_only)
2394 		preverify_ok = 1;
2395 	if (!preverify_ok && (conn->flags & TLS_CONN_DISABLE_TIME_CHECKS) &&
2396 	    (err == X509_V_ERR_CERT_HAS_EXPIRED ||
2397 	     err == X509_V_ERR_CERT_NOT_YET_VALID)) {
2398 		wpa_printf(MSG_DEBUG, "OpenSSL: Ignore certificate validity "
2399 			   "time mismatch");
2400 		preverify_ok = 1;
2401 	}
2402 	if (!preverify_ok && !conn->data->check_crl_strict &&
2403 	    (err == X509_V_ERR_CRL_HAS_EXPIRED ||
2404 	     err == X509_V_ERR_CRL_NOT_YET_VALID)) {
2405 		wpa_printf(MSG_DEBUG,
2406 			   "OpenSSL: Ignore certificate validity CRL time mismatch");
2407 		preverify_ok = 1;
2408 	}
2409 
2410 	err_str = X509_verify_cert_error_string(err);
2411 
2412 #ifdef CONFIG_SHA256
2413 	/*
2414 	 * Do not require preverify_ok so we can explicity allow otherwise
2415 	 * invalid pinned server certificates.
2416 	 */
2417 	if (depth == 0 && conn->server_cert_only) {
2418 		struct wpabuf *cert;
2419 		cert = get_x509_cert(err_cert);
2420 		if (!cert) {
2421 			wpa_printf(MSG_DEBUG, "OpenSSL: Could not fetch "
2422 				   "server certificate data");
2423 			preverify_ok = 0;
2424 		} else {
2425 			u8 hash[32];
2426 			const u8 *addr[1];
2427 			size_t len[1];
2428 			addr[0] = wpabuf_head(cert);
2429 			len[0] = wpabuf_len(cert);
2430 			if (sha256_vector(1, addr, len, hash) < 0 ||
2431 			    os_memcmp(conn->srv_cert_hash, hash, 32) != 0) {
2432 				err_str = "Server certificate mismatch";
2433 				err = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
2434 				preverify_ok = 0;
2435 			} else if (!preverify_ok) {
2436 				/*
2437 				 * Certificate matches pinned certificate, allow
2438 				 * regardless of other problems.
2439 				 */
2440 				wpa_printf(MSG_DEBUG,
2441 					   "OpenSSL: Ignore validation issues for a pinned server certificate");
2442 				preverify_ok = 1;
2443 			}
2444 			wpabuf_free(cert);
2445 		}
2446 	}
2447 #endif /* CONFIG_SHA256 */
2448 
2449 	openssl_tls_cert_event(conn, err_cert, depth, buf);
2450 
2451 	if (!preverify_ok) {
2452 		if (depth > 0) {
2453 			/* Send cert event for the peer certificate so that
2454 			 * the upper layers get information about it even if
2455 			 * validation of a CA certificate fails. */
2456 			STACK_OF(X509) *chain;
2457 
2458 			chain = X509_STORE_CTX_get1_chain(x509_ctx);
2459 			if (chain && sk_X509_num(chain) > 0) {
2460 				char buf2[256];
2461 				X509 *cert;
2462 
2463 				cert = sk_X509_value(chain, 0);
2464 				X509_NAME_oneline(X509_get_subject_name(cert),
2465 						  buf2, sizeof(buf2));
2466 
2467 				openssl_tls_cert_event(conn, cert, 0, buf2);
2468 			}
2469 			if (chain)
2470 				sk_X509_pop_free(chain, X509_free);
2471 		}
2472 
2473 		wpa_printf(MSG_WARNING, "TLS: Certificate verification failed,"
2474 			   " error %d (%s) depth %d for '%s'", err, err_str,
2475 			   depth, buf);
2476 		openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2477 				       err_str, TLS_FAIL_UNSPECIFIED);
2478 		return preverify_ok;
2479 	}
2480 
2481 	wpa_printf(MSG_DEBUG, "TLS: tls_verify_cb - preverify_ok=%d "
2482 		   "err=%d (%s) ca_cert_verify=%d depth=%d buf='%s'",
2483 		   preverify_ok, err, err_str,
2484 		   conn->ca_cert_verify, depth, buf);
2485 	check_cert_subject = conn->check_cert_subject;
2486 	if (!check_cert_subject)
2487 		check_cert_subject = conn->data->check_cert_subject;
2488 	if (check_cert_subject) {
2489 		if (depth == 0 &&
2490 		    !tls_match_dn_field(err_cert, check_cert_subject)) {
2491 			preverify_ok = 0;
2492 			openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2493 					       "Distinguished Name",
2494 					       TLS_FAIL_DN_MISMATCH);
2495 		}
2496 	}
2497 	if (depth == 0 && match && os_strstr(buf, match) == NULL) {
2498 		wpa_printf(MSG_WARNING, "TLS: Subject '%s' did not "
2499 			   "match with '%s'", buf, match);
2500 		preverify_ok = 0;
2501 		openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2502 				       "Subject mismatch",
2503 				       TLS_FAIL_SUBJECT_MISMATCH);
2504 	} else if (depth == 0 && altmatch &&
2505 		   !tls_match_altsubject(err_cert, altmatch)) {
2506 		wpa_printf(MSG_WARNING, "TLS: altSubjectName match "
2507 			   "'%s' not found", altmatch);
2508 		preverify_ok = 0;
2509 		openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2510 				       "AltSubject mismatch",
2511 				       TLS_FAIL_ALTSUBJECT_MISMATCH);
2512 	} else if (depth == 0 && suffix_match &&
2513 		   !tls_match_suffix(err_cert, suffix_match, 0)) {
2514 		wpa_printf(MSG_WARNING, "TLS: Domain suffix match '%s' not found",
2515 			   suffix_match);
2516 		preverify_ok = 0;
2517 		openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2518 				       "Domain suffix mismatch",
2519 				       TLS_FAIL_DOMAIN_SUFFIX_MISMATCH);
2520 	} else if (depth == 0 && domain_match &&
2521 		   !tls_match_suffix(err_cert, domain_match, 1)) {
2522 		wpa_printf(MSG_WARNING, "TLS: Domain match '%s' not found",
2523 			   domain_match);
2524 		preverify_ok = 0;
2525 		openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2526 				       "Domain mismatch",
2527 				       TLS_FAIL_DOMAIN_MISMATCH);
2528 	}
2529 
2530 	if (conn->cert_probe && preverify_ok && depth == 0) {
2531 		wpa_printf(MSG_DEBUG, "OpenSSL: Reject server certificate "
2532 			   "on probe-only run");
2533 		preverify_ok = 0;
2534 		openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2535 				       "Server certificate chain probe",
2536 				       TLS_FAIL_SERVER_CHAIN_PROBE);
2537 	}
2538 
2539 #ifdef CONFIG_SUITEB
2540 	if (conn->flags & TLS_CONN_SUITEB) {
2541 		EVP_PKEY *pk;
2542 		RSA *rsa;
2543 		int len = -1;
2544 
2545 		pk = X509_get_pubkey(err_cert);
2546 		if (pk) {
2547 			rsa = EVP_PKEY_get1_RSA(pk);
2548 			if (rsa) {
2549 				len = RSA_bits(rsa);
2550 				RSA_free(rsa);
2551 			}
2552 			EVP_PKEY_free(pk);
2553 		}
2554 
2555 		if (len >= 0) {
2556 			wpa_printf(MSG_DEBUG,
2557 				   "OpenSSL: RSA modulus size: %d bits", len);
2558 			if (len < 3072) {
2559 				preverify_ok = 0;
2560 				openssl_tls_fail_event(
2561 					conn, err_cert, err,
2562 					depth, buf,
2563 					"Insufficient RSA modulus size",
2564 					TLS_FAIL_INSUFFICIENT_KEY_LEN);
2565 			}
2566 		}
2567 	}
2568 #endif /* CONFIG_SUITEB */
2569 
2570 #ifdef OPENSSL_IS_BORINGSSL
2571 	if (depth == 0 && (conn->flags & TLS_CONN_REQUEST_OCSP) &&
2572 	    preverify_ok) {
2573 		enum ocsp_result res;
2574 
2575 		res = check_ocsp_resp(conn->ssl_ctx, conn->ssl, err_cert,
2576 				      conn->peer_issuer,
2577 				      conn->peer_issuer_issuer);
2578 		if (res == OCSP_REVOKED) {
2579 			preverify_ok = 0;
2580 			openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2581 					       "certificate revoked",
2582 					       TLS_FAIL_REVOKED);
2583 			if (err == X509_V_OK)
2584 				X509_STORE_CTX_set_error(
2585 					x509_ctx, X509_V_ERR_CERT_REVOKED);
2586 		} else if (res != OCSP_GOOD &&
2587 			   (conn->flags & TLS_CONN_REQUIRE_OCSP)) {
2588 			preverify_ok = 0;
2589 			openssl_tls_fail_event(conn, err_cert, err, depth, buf,
2590 					       "bad certificate status response",
2591 					       TLS_FAIL_UNSPECIFIED);
2592 		}
2593 	}
2594 #endif /* OPENSSL_IS_BORINGSSL */
2595 
2596 	if (depth == 0 && preverify_ok && context->event_cb != NULL)
2597 		context->event_cb(context->cb_ctx,
2598 				  TLS_CERT_CHAIN_SUCCESS, NULL);
2599 
2600 	return preverify_ok;
2601 }
2602 
2603 
2604 #ifndef OPENSSL_NO_STDIO
tls_load_ca_der(struct tls_data * data,const char * ca_cert)2605 static int tls_load_ca_der(struct tls_data *data, const char *ca_cert)
2606 {
2607 	SSL_CTX *ssl_ctx = data->ssl;
2608 	X509_LOOKUP *lookup;
2609 	int ret = 0;
2610 
2611 	lookup = X509_STORE_add_lookup(SSL_CTX_get_cert_store(ssl_ctx),
2612 				       X509_LOOKUP_file());
2613 	if (lookup == NULL) {
2614 		tls_show_errors(MSG_WARNING, __func__,
2615 				"Failed add lookup for X509 store");
2616 		return -1;
2617 	}
2618 
2619 	if (!X509_LOOKUP_load_file(lookup, ca_cert, X509_FILETYPE_ASN1)) {
2620 		unsigned long err = ERR_peek_error();
2621 		tls_show_errors(MSG_WARNING, __func__,
2622 				"Failed load CA in DER format");
2623 		if (ERR_GET_LIB(err) == ERR_LIB_X509 &&
2624 		    ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE) {
2625 			wpa_printf(MSG_DEBUG, "OpenSSL: %s - ignoring "
2626 				   "cert already in hash table error",
2627 				   __func__);
2628 		} else
2629 			ret = -1;
2630 	}
2631 
2632 	return ret;
2633 }
2634 #endif /* OPENSSL_NO_STDIO */
2635 
2636 
tls_connection_ca_cert(struct tls_data * data,struct tls_connection * conn,const char * ca_cert,const u8 * ca_cert_blob,size_t ca_cert_blob_len,const char * ca_path)2637 static int tls_connection_ca_cert(struct tls_data *data,
2638 				  struct tls_connection *conn,
2639 				  const char *ca_cert, const u8 *ca_cert_blob,
2640 				  size_t ca_cert_blob_len, const char *ca_path)
2641 {
2642 	SSL_CTX *ssl_ctx = data->ssl;
2643 	X509_STORE *store;
2644 
2645 	/*
2646 	 * Remove previously configured trusted CA certificates before adding
2647 	 * new ones.
2648 	 */
2649 	store = X509_STORE_new();
2650 	if (store == NULL) {
2651 		wpa_printf(MSG_DEBUG, "OpenSSL: %s - failed to allocate new "
2652 			   "certificate store", __func__);
2653 		return -1;
2654 	}
2655 	SSL_CTX_set_cert_store(ssl_ctx, store);
2656 
2657 	SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb);
2658 	conn->ca_cert_verify = 1;
2659 
2660 	if (ca_cert && os_strncmp(ca_cert, "probe://", 8) == 0) {
2661 		wpa_printf(MSG_DEBUG, "OpenSSL: Probe for server certificate "
2662 			   "chain");
2663 		conn->cert_probe = 1;
2664 		conn->ca_cert_verify = 0;
2665 		return 0;
2666 	}
2667 
2668 	if (ca_cert && os_strncmp(ca_cert, "hash://", 7) == 0) {
2669 #ifdef CONFIG_SHA256
2670 		const char *pos = ca_cert + 7;
2671 		if (os_strncmp(pos, "server/sha256/", 14) != 0) {
2672 			wpa_printf(MSG_DEBUG, "OpenSSL: Unsupported ca_cert "
2673 				   "hash value '%s'", ca_cert);
2674 			return -1;
2675 		}
2676 		pos += 14;
2677 		if (os_strlen(pos) != 32 * 2) {
2678 			wpa_printf(MSG_DEBUG, "OpenSSL: Unexpected SHA256 "
2679 				   "hash length in ca_cert '%s'", ca_cert);
2680 			return -1;
2681 		}
2682 		if (hexstr2bin(pos, conn->srv_cert_hash, 32) < 0) {
2683 			wpa_printf(MSG_DEBUG, "OpenSSL: Invalid SHA256 hash "
2684 				   "value in ca_cert '%s'", ca_cert);
2685 			return -1;
2686 		}
2687 		conn->server_cert_only = 1;
2688 		wpa_printf(MSG_DEBUG, "OpenSSL: Checking only server "
2689 			   "certificate match");
2690 		return 0;
2691 #else /* CONFIG_SHA256 */
2692 		wpa_printf(MSG_INFO, "No SHA256 included in the build - "
2693 			   "cannot validate server certificate hash");
2694 		return -1;
2695 #endif /* CONFIG_SHA256 */
2696 	}
2697 
2698 	if (ca_cert_blob) {
2699 		X509 *cert = d2i_X509(NULL,
2700 				      (const unsigned char **) &ca_cert_blob,
2701 				      ca_cert_blob_len);
2702 		if (cert == NULL) {
2703 			BIO *bio = BIO_new_mem_buf(ca_cert_blob,
2704 						   ca_cert_blob_len);
2705 
2706 			if (bio) {
2707 				cert = PEM_read_bio_X509(bio, NULL, NULL, NULL);
2708 				BIO_free(bio);
2709 			}
2710 
2711 			if (!cert) {
2712 				tls_show_errors(MSG_WARNING, __func__,
2713 						"Failed to parse ca_cert_blob");
2714 				return -1;
2715 			}
2716 
2717 			while (ERR_get_error()) {
2718 				/* Ignore errors from DER conversion. */
2719 			}
2720 		}
2721 
2722 		if (!X509_STORE_add_cert(SSL_CTX_get_cert_store(ssl_ctx),
2723 					 cert)) {
2724 			unsigned long err = ERR_peek_error();
2725 			tls_show_errors(MSG_WARNING, __func__,
2726 					"Failed to add ca_cert_blob to "
2727 					"certificate store");
2728 			if (ERR_GET_LIB(err) == ERR_LIB_X509 &&
2729 			    ERR_GET_REASON(err) ==
2730 			    X509_R_CERT_ALREADY_IN_HASH_TABLE) {
2731 				wpa_printf(MSG_DEBUG, "OpenSSL: %s - ignoring "
2732 					   "cert already in hash table error",
2733 					   __func__);
2734 			} else {
2735 				X509_free(cert);
2736 				return -1;
2737 			}
2738 		}
2739 		X509_free(cert);
2740 		wpa_printf(MSG_DEBUG, "OpenSSL: %s - added ca_cert_blob "
2741 			   "to certificate store", __func__);
2742 		return 0;
2743 	}
2744 
2745 #ifdef ANDROID
2746 	/* Single alias */
2747 	if (ca_cert && os_strncmp("keystore://", ca_cert, 11) == 0) {
2748 		if (tls_add_ca_from_keystore(SSL_CTX_get_cert_store(ssl_ctx),
2749 					     &ca_cert[11]) < 0)
2750 			return -1;
2751 		SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb);
2752 		return 0;
2753 	}
2754 
2755 	/* Multiple aliases separated by space */
2756 	if (ca_cert && os_strncmp("keystores://", ca_cert, 12) == 0) {
2757 		char *aliases = os_strdup(&ca_cert[12]);
2758 		const char *delim = " ";
2759 		int rc = 0;
2760 		char *savedptr;
2761 		char *alias;
2762 
2763 		if (!aliases)
2764 			return -1;
2765 		alias = strtok_r(aliases, delim, &savedptr);
2766 		for (; alias; alias = strtok_r(NULL, delim, &savedptr)) {
2767 			if (tls_add_ca_from_keystore_encoded(
2768 				    SSL_CTX_get_cert_store(ssl_ctx), alias)) {
2769 				wpa_printf(MSG_WARNING,
2770 					   "OpenSSL: %s - Failed to add ca_cert %s from keystore",
2771 					   __func__, alias);
2772 				rc = -1;
2773 				break;
2774 			}
2775 		}
2776 		os_free(aliases);
2777 		if (rc)
2778 			return rc;
2779 
2780 		SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb);
2781 		return 0;
2782 	}
2783 #endif /* ANDROID */
2784 
2785 #ifdef CONFIG_NATIVE_WINDOWS
2786 	if (ca_cert && tls_cryptoapi_ca_cert(ssl_ctx, conn->ssl, ca_cert) ==
2787 	    0) {
2788 		wpa_printf(MSG_DEBUG, "OpenSSL: Added CA certificates from "
2789 			   "system certificate store");
2790 		return 0;
2791 	}
2792 #endif /* CONFIG_NATIVE_WINDOWS */
2793 
2794 	if (ca_cert || ca_path) {
2795 #ifndef OPENSSL_NO_STDIO
2796 		if (SSL_CTX_load_verify_locations(ssl_ctx, ca_cert, ca_path) !=
2797 		    1) {
2798 			tls_show_errors(MSG_WARNING, __func__,
2799 					"Failed to load root certificates");
2800 			if (ca_cert &&
2801 			    tls_load_ca_der(data, ca_cert) == 0) {
2802 				wpa_printf(MSG_DEBUG, "OpenSSL: %s - loaded "
2803 					   "DER format CA certificate",
2804 					   __func__);
2805 			} else
2806 				return -1;
2807 		} else {
2808 			wpa_printf(MSG_DEBUG, "TLS: Trusted root "
2809 				   "certificate(s) loaded");
2810 			tls_get_errors(data);
2811 		}
2812 #else /* OPENSSL_NO_STDIO */
2813 		wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO",
2814 			   __func__);
2815 		return -1;
2816 #endif /* OPENSSL_NO_STDIO */
2817 	} else {
2818 		/* No ca_cert configured - do not try to verify server
2819 		 * certificate */
2820 		conn->ca_cert_verify = 0;
2821 	}
2822 
2823 	return 0;
2824 }
2825 
2826 
tls_global_ca_cert(struct tls_data * data,const char * ca_cert)2827 static int tls_global_ca_cert(struct tls_data *data, const char *ca_cert)
2828 {
2829 	SSL_CTX *ssl_ctx = data->ssl;
2830 
2831 	if (ca_cert) {
2832 		if (SSL_CTX_load_verify_locations(ssl_ctx, ca_cert, NULL) != 1)
2833 		{
2834 			tls_show_errors(MSG_WARNING, __func__,
2835 					"Failed to load root certificates");
2836 			return -1;
2837 		}
2838 
2839 		wpa_printf(MSG_DEBUG, "TLS: Trusted root "
2840 			   "certificate(s) loaded");
2841 
2842 #ifndef OPENSSL_NO_STDIO
2843 		/* Add the same CAs to the client certificate requests */
2844 		SSL_CTX_set_client_CA_list(ssl_ctx,
2845 					   SSL_load_client_CA_file(ca_cert));
2846 #endif /* OPENSSL_NO_STDIO */
2847 
2848 		os_free(data->ca_cert);
2849 		data->ca_cert = os_strdup(ca_cert);
2850 	}
2851 
2852 	return 0;
2853 }
2854 
2855 
tls_global_set_verify(void * ssl_ctx,int check_crl,int strict)2856 int tls_global_set_verify(void *ssl_ctx, int check_crl, int strict)
2857 {
2858 	int flags;
2859 
2860 	if (check_crl) {
2861 		struct tls_data *data = ssl_ctx;
2862 		X509_STORE *cs = SSL_CTX_get_cert_store(data->ssl);
2863 		if (cs == NULL) {
2864 			tls_show_errors(MSG_INFO, __func__, "Failed to get "
2865 					"certificate store when enabling "
2866 					"check_crl");
2867 			return -1;
2868 		}
2869 		flags = X509_V_FLAG_CRL_CHECK;
2870 		if (check_crl == 2)
2871 			flags |= X509_V_FLAG_CRL_CHECK_ALL;
2872 		X509_STORE_set_flags(cs, flags);
2873 
2874 		data->check_crl = check_crl;
2875 		data->check_crl_strict = strict;
2876 		os_get_reltime(&data->crl_last_reload);
2877 	}
2878 	return 0;
2879 }
2880 
2881 
tls_connection_set_subject_match(struct tls_connection * conn,const char * subject_match,const char * altsubject_match,const char * suffix_match,const char * domain_match,const char * check_cert_subject)2882 static int tls_connection_set_subject_match(struct tls_connection *conn,
2883 					    const char *subject_match,
2884 					    const char *altsubject_match,
2885 					    const char *suffix_match,
2886 					    const char *domain_match,
2887 					    const char *check_cert_subject)
2888 {
2889 	os_free(conn->subject_match);
2890 	conn->subject_match = NULL;
2891 	if (subject_match) {
2892 		conn->subject_match = os_strdup(subject_match);
2893 		if (conn->subject_match == NULL)
2894 			return -1;
2895 	}
2896 
2897 	os_free(conn->altsubject_match);
2898 	conn->altsubject_match = NULL;
2899 	if (altsubject_match) {
2900 		conn->altsubject_match = os_strdup(altsubject_match);
2901 		if (conn->altsubject_match == NULL)
2902 			return -1;
2903 	}
2904 
2905 	os_free(conn->suffix_match);
2906 	conn->suffix_match = NULL;
2907 	if (suffix_match) {
2908 		conn->suffix_match = os_strdup(suffix_match);
2909 		if (conn->suffix_match == NULL)
2910 			return -1;
2911 	}
2912 
2913 	os_free(conn->domain_match);
2914 	conn->domain_match = NULL;
2915 	if (domain_match) {
2916 		conn->domain_match = os_strdup(domain_match);
2917 		if (conn->domain_match == NULL)
2918 			return -1;
2919 	}
2920 
2921 	os_free(conn->check_cert_subject);
2922 	conn->check_cert_subject = NULL;
2923 	if (check_cert_subject) {
2924 		conn->check_cert_subject = os_strdup(check_cert_subject);
2925 		if (!conn->check_cert_subject)
2926 			return -1;
2927 	}
2928 
2929 	return 0;
2930 }
2931 
2932 
2933 #ifdef CONFIG_SUITEB
2934 #if OPENSSL_VERSION_NUMBER >= 0x10002000L
suiteb_cert_cb(SSL * ssl,void * arg)2935 static int suiteb_cert_cb(SSL *ssl, void *arg)
2936 {
2937 	struct tls_connection *conn = arg;
2938 
2939 	/*
2940 	 * This cert_cb() is not really the best location for doing a
2941 	 * constraint check for the ServerKeyExchange message, but this seems to
2942 	 * be the only place where the current OpenSSL sequence can be
2943 	 * terminated cleanly with an TLS alert going out to the server.
2944 	 */
2945 
2946 	if (!(conn->flags & TLS_CONN_SUITEB))
2947 		return 1;
2948 
2949 	/* DHE is enabled only with DHE-RSA-AES256-GCM-SHA384 */
2950 	if (conn->cipher_suite != 0x9f)
2951 		return 1;
2952 
2953 	if (conn->server_dh_prime_len >= 3072)
2954 		return 1;
2955 
2956 	wpa_printf(MSG_DEBUG,
2957 		   "OpenSSL: Server DH prime length (%d bits) not sufficient for Suite B RSA - reject handshake",
2958 		   conn->server_dh_prime_len);
2959 	return 0;
2960 }
2961 #endif /* OPENSSL_VERSION_NUMBER */
2962 #endif /* CONFIG_SUITEB */
2963 
2964 
tls_set_conn_flags(struct tls_connection * conn,unsigned int flags,const char * openssl_ciphers)2965 static int tls_set_conn_flags(struct tls_connection *conn, unsigned int flags,
2966 			      const char *openssl_ciphers)
2967 {
2968 	SSL *ssl = conn->ssl;
2969 
2970 #ifdef SSL_OP_NO_TICKET
2971 	if (flags & TLS_CONN_DISABLE_SESSION_TICKET)
2972 		SSL_set_options(ssl, SSL_OP_NO_TICKET);
2973 	else
2974 		SSL_clear_options(ssl, SSL_OP_NO_TICKET);
2975 #endif /* SSL_OP_NO_TICKET */
2976 
2977 #ifdef SSL_OP_NO_TLSv1
2978 	if (flags & TLS_CONN_DISABLE_TLSv1_0)
2979 		SSL_set_options(ssl, SSL_OP_NO_TLSv1);
2980 	else
2981 		SSL_clear_options(ssl, SSL_OP_NO_TLSv1);
2982 #endif /* SSL_OP_NO_TLSv1 */
2983 #ifdef SSL_OP_NO_TLSv1_1
2984 	if (flags & TLS_CONN_DISABLE_TLSv1_1)
2985 		SSL_set_options(ssl, SSL_OP_NO_TLSv1_1);
2986 	else
2987 		SSL_clear_options(ssl, SSL_OP_NO_TLSv1_1);
2988 #endif /* SSL_OP_NO_TLSv1_1 */
2989 #ifdef SSL_OP_NO_TLSv1_2
2990 	if (flags & TLS_CONN_DISABLE_TLSv1_2)
2991 		SSL_set_options(ssl, SSL_OP_NO_TLSv1_2);
2992 	else
2993 		SSL_clear_options(ssl, SSL_OP_NO_TLSv1_2);
2994 #endif /* SSL_OP_NO_TLSv1_2 */
2995 #ifdef SSL_OP_NO_TLSv1_3
2996 	if (flags & TLS_CONN_DISABLE_TLSv1_3)
2997 		SSL_set_options(ssl, SSL_OP_NO_TLSv1_3);
2998 	else
2999 		SSL_clear_options(ssl, SSL_OP_NO_TLSv1_3);
3000 #endif /* SSL_OP_NO_TLSv1_3 */
3001 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
3002 	if (flags & (TLS_CONN_ENABLE_TLSv1_0 |
3003 		     TLS_CONN_ENABLE_TLSv1_1 |
3004 		     TLS_CONN_ENABLE_TLSv1_2)) {
3005 		int version = 0;
3006 
3007 		/* Explicit request to enable TLS versions even if needing to
3008 		 * override systemwide policies. */
3009 		if (flags & TLS_CONN_ENABLE_TLSv1_0) {
3010 			version = TLS1_VERSION;
3011 		} else if (flags & TLS_CONN_ENABLE_TLSv1_1) {
3012 			if (!(flags & TLS_CONN_DISABLE_TLSv1_0))
3013 				version = TLS1_1_VERSION;
3014 		} else if (flags & TLS_CONN_ENABLE_TLSv1_2) {
3015 			if (!(flags & (TLS_CONN_DISABLE_TLSv1_0 |
3016 				       TLS_CONN_DISABLE_TLSv1_1)))
3017 				version = TLS1_2_VERSION;
3018 		}
3019 		if (!version) {
3020 			wpa_printf(MSG_DEBUG,
3021 				   "OpenSSL: Invalid TLS version configuration");
3022 			return -1;
3023 		}
3024 
3025 		if (SSL_set_min_proto_version(ssl, version) != 1) {
3026 			wpa_printf(MSG_DEBUG,
3027 				   "OpenSSL: Failed to set minimum TLS version");
3028 			return -1;
3029 		}
3030 	}
3031 #endif /* >= 1.1.0 */
3032 
3033 #ifdef CONFIG_SUITEB
3034 #ifdef OPENSSL_IS_BORINGSSL
3035 	/* Start with defaults from BoringSSL */
3036 	SSL_CTX_set_verify_algorithm_prefs(conn->ssl_ctx, NULL, 0);
3037 #endif /* OPENSSL_IS_BORINGSSL */
3038 #if OPENSSL_VERSION_NUMBER >= 0x10002000L
3039 	if (flags & TLS_CONN_SUITEB_NO_ECDH) {
3040 		const char *ciphers = "DHE-RSA-AES256-GCM-SHA384";
3041 
3042 		if (openssl_ciphers) {
3043 			wpa_printf(MSG_DEBUG,
3044 				   "OpenSSL: Override ciphers for Suite B (no ECDH): %s",
3045 				   openssl_ciphers);
3046 			ciphers = openssl_ciphers;
3047 		}
3048 		if (SSL_set_cipher_list(ssl, ciphers) != 1) {
3049 			wpa_printf(MSG_INFO,
3050 				   "OpenSSL: Failed to set Suite B ciphers");
3051 			return -1;
3052 		}
3053 	} else if (flags & TLS_CONN_SUITEB) {
3054 		EC_KEY *ecdh;
3055 		const char *ciphers =
3056 			"ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384";
3057 		int nid[1] = { NID_secp384r1 };
3058 
3059 		if (openssl_ciphers) {
3060 			wpa_printf(MSG_DEBUG,
3061 				   "OpenSSL: Override ciphers for Suite B: %s",
3062 				   openssl_ciphers);
3063 			ciphers = openssl_ciphers;
3064 		}
3065 		if (SSL_set_cipher_list(ssl, ciphers) != 1) {
3066 			wpa_printf(MSG_INFO,
3067 				   "OpenSSL: Failed to set Suite B ciphers");
3068 			return -1;
3069 		}
3070 
3071 		if (SSL_set1_curves(ssl, nid, 1) != 1) {
3072 			wpa_printf(MSG_INFO,
3073 				   "OpenSSL: Failed to set Suite B curves");
3074 			return -1;
3075 		}
3076 
3077 		ecdh = EC_KEY_new_by_curve_name(NID_secp384r1);
3078 		if (!ecdh || SSL_set_tmp_ecdh(ssl, ecdh) != 1) {
3079 			EC_KEY_free(ecdh);
3080 			wpa_printf(MSG_INFO,
3081 				   "OpenSSL: Failed to set ECDH parameter");
3082 			return -1;
3083 		}
3084 		EC_KEY_free(ecdh);
3085 	}
3086 	if (flags & (TLS_CONN_SUITEB | TLS_CONN_SUITEB_NO_ECDH)) {
3087 #ifdef OPENSSL_IS_BORINGSSL
3088 		uint16_t sigalgs[1] = { SSL_SIGN_RSA_PKCS1_SHA384 };
3089 
3090 		if (SSL_CTX_set_verify_algorithm_prefs(conn->ssl_ctx, sigalgs,
3091 						       1) != 1) {
3092 			wpa_printf(MSG_INFO,
3093 				   "OpenSSL: Failed to set Suite B sigalgs");
3094 			return -1;
3095 		}
3096 #else /* OPENSSL_IS_BORINGSSL */
3097 		/* ECDSA+SHA384 if need to add EC support here */
3098 		if (SSL_set1_sigalgs_list(ssl, "RSA+SHA384") != 1) {
3099 			wpa_printf(MSG_INFO,
3100 				   "OpenSSL: Failed to set Suite B sigalgs");
3101 			return -1;
3102 		}
3103 #endif /* OPENSSL_IS_BORINGSSL */
3104 
3105 		SSL_set_options(ssl, SSL_OP_NO_TLSv1);
3106 		SSL_set_options(ssl, SSL_OP_NO_TLSv1_1);
3107 		SSL_set_cert_cb(ssl, suiteb_cert_cb, conn);
3108 	}
3109 #else /* OPENSSL_VERSION_NUMBER < 0x10002000L */
3110 	if (flags & (TLS_CONN_SUITEB | TLS_CONN_SUITEB_NO_ECDH)) {
3111 		wpa_printf(MSG_ERROR,
3112 			   "OpenSSL: Suite B RSA case not supported with this OpenSSL version");
3113 		return -1;
3114 	}
3115 #endif /* OPENSSL_VERSION_NUMBER */
3116 
3117 #ifdef OPENSSL_IS_BORINGSSL
3118 	if (openssl_ciphers && os_strcmp(openssl_ciphers, "SUITEB192") == 0) {
3119 		uint16_t sigalgs[1] = { SSL_SIGN_ECDSA_SECP384R1_SHA384 };
3120 		int nid[1] = { NID_secp384r1 };
3121 
3122 		if (SSL_set1_curves(ssl, nid, 1) != 1) {
3123 			wpa_printf(MSG_INFO,
3124 				   "OpenSSL: Failed to set Suite B curves");
3125 			return -1;
3126 		}
3127 
3128 		if (SSL_CTX_set_verify_algorithm_prefs(conn->ssl_ctx, sigalgs,
3129 						       1) != 1) {
3130 			wpa_printf(MSG_INFO,
3131 				   "OpenSSL: Failed to set Suite B sigalgs");
3132 			return -1;
3133 		}
3134 	}
3135 #else /* OPENSSL_IS_BORINGSSL */
3136 	if (!(flags & (TLS_CONN_SUITEB | TLS_CONN_SUITEB_NO_ECDH)) &&
3137 	    openssl_ciphers && SSL_set_cipher_list(ssl, openssl_ciphers) != 1) {
3138 		wpa_printf(MSG_INFO,
3139 			   "OpenSSL: Failed to set openssl_ciphers '%s'",
3140 			   openssl_ciphers);
3141 		return -1;
3142 	}
3143 #endif /* OPENSSL_IS_BORINGSSL */
3144 #else /* CONFIG_SUITEB */
3145 	if (openssl_ciphers && SSL_set_cipher_list(ssl, openssl_ciphers) != 1) {
3146 		wpa_printf(MSG_INFO,
3147 			   "OpenSSL: Failed to set openssl_ciphers '%s'",
3148 			   openssl_ciphers);
3149 		return -1;
3150 	}
3151 #endif /* CONFIG_SUITEB */
3152 
3153 	if (flags & TLS_CONN_TEAP_ANON_DH) {
3154 #ifndef TEAP_DH_ANON_CS
3155 #define TEAP_DH_ANON_CS \
3156 	"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:" \
3157 	"ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:" \
3158 	"ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:" \
3159 	"DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:" \
3160 	"DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:" \
3161 	"DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:" \
3162 	"ADH-AES256-GCM-SHA384:ADH-AES128-GCM-SHA256:" \
3163 	"ADH-AES256-SHA256:ADH-AES128-SHA256:ADH-AES256-SHA:ADH-AES128-SHA"
3164 #endif
3165 		static const char *cs = TEAP_DH_ANON_CS;
3166 
3167 #if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
3168 	!defined(LIBRESSL_VERSION_NUMBER) && \
3169 	!defined(OPENSSL_IS_BORINGSSL)
3170 		/*
3171 		 * Need to drop to security level 0 to allow anonymous
3172 		 * cipher suites for EAP-TEAP.
3173 		 */
3174 		SSL_set_security_level(conn->ssl, 0);
3175 #endif
3176 
3177 		wpa_printf(MSG_DEBUG,
3178 			   "OpenSSL: Enable cipher suites for anonymous EAP-TEAP provisioning: %s",
3179 			   cs);
3180 		if (SSL_set_cipher_list(conn->ssl, cs) != 1) {
3181 			tls_show_errors(MSG_INFO, __func__,
3182 					"Cipher suite configuration failed");
3183 			return -1;
3184 		}
3185 	}
3186 
3187 	return 0;
3188 }
3189 
3190 
tls_connection_set_verify(void * ssl_ctx,struct tls_connection * conn,int verify_peer,unsigned int flags,const u8 * session_ctx,size_t session_ctx_len)3191 int tls_connection_set_verify(void *ssl_ctx, struct tls_connection *conn,
3192 			      int verify_peer, unsigned int flags,
3193 			      const u8 *session_ctx, size_t session_ctx_len)
3194 {
3195 	static int counter = 0;
3196 	struct tls_data *data = ssl_ctx;
3197 
3198 	if (conn == NULL)
3199 		return -1;
3200 
3201 	if (verify_peer) {
3202 		conn->ca_cert_verify = 1;
3203 		SSL_set_verify(conn->ssl, SSL_VERIFY_PEER |
3204 			       SSL_VERIFY_FAIL_IF_NO_PEER_CERT |
3205 			       SSL_VERIFY_CLIENT_ONCE, tls_verify_cb);
3206 	} else {
3207 		conn->ca_cert_verify = 0;
3208 		SSL_set_verify(conn->ssl, SSL_VERIFY_NONE, NULL);
3209 	}
3210 
3211 	if (tls_set_conn_flags(conn, flags, NULL) < 0)
3212 		return -1;
3213 	conn->flags = flags;
3214 
3215 	SSL_set_accept_state(conn->ssl);
3216 
3217 	if (data->tls_session_lifetime == 0) {
3218 		/*
3219 		 * Set session id context to a unique value to make sure
3220 		 * session resumption cannot be used either through session
3221 		 * caching or TLS ticket extension.
3222 		 */
3223 		counter++;
3224 		SSL_set_session_id_context(conn->ssl,
3225 					   (const unsigned char *) &counter,
3226 					   sizeof(counter));
3227 	} else if (session_ctx) {
3228 		SSL_set_session_id_context(conn->ssl, session_ctx,
3229 					   session_ctx_len);
3230 	}
3231 
3232 	return 0;
3233 }
3234 
3235 
tls_connection_client_cert(struct tls_connection * conn,const char * client_cert,const u8 * client_cert_blob,size_t client_cert_blob_len)3236 static int tls_connection_client_cert(struct tls_connection *conn,
3237 				      const char *client_cert,
3238 				      const u8 *client_cert_blob,
3239 				      size_t client_cert_blob_len)
3240 {
3241 	if (client_cert == NULL && client_cert_blob == NULL)
3242 		return 0;
3243 
3244 #ifdef PKCS12_FUNCS
3245 #if OPENSSL_VERSION_NUMBER < 0x10002000L || defined(LIBRESSL_VERSION_NUMBER)
3246 	/*
3247 	 * Clear previously set extra chain certificates, if any, from PKCS#12
3248 	 * processing in tls_parse_pkcs12() to allow OpenSSL to build a new
3249 	 * chain properly.
3250 	 */
3251 	SSL_CTX_clear_extra_chain_certs(conn->ssl_ctx);
3252 #endif /* OPENSSL_VERSION_NUMBER < 0x10002000L */
3253 #endif /* PKCS12_FUNCS */
3254 
3255 	if (client_cert_blob &&
3256 	    SSL_use_certificate_ASN1(conn->ssl, (u8 *) client_cert_blob,
3257 				     client_cert_blob_len) == 1) {
3258 		wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_ASN1 --> "
3259 			   "OK");
3260 		return 0;
3261 	} else if (client_cert_blob) {
3262 		tls_show_errors(MSG_DEBUG, __func__,
3263 				"SSL_use_certificate_ASN1 failed");
3264 	}
3265 
3266 	if (client_cert == NULL)
3267 		return -1;
3268 
3269 #ifdef ANDROID
3270 	if (os_strncmp("keystore://", client_cert, 11) == 0) {
3271 		BIO *bio = BIO_from_keystore(&client_cert[11]);
3272 		X509 *x509 = NULL;
3273 		int ret = -1;
3274 		if (bio) {
3275 			x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
3276 		}
3277 		if (x509) {
3278 			if (SSL_use_certificate(conn->ssl, x509) == 1)
3279 				ret = 0;
3280 			X509_free(x509);
3281 		}
3282 
3283 		/* Read additional certificates into the chain. */
3284 		while (bio) {
3285 			x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
3286 			if (x509) {
3287 				/* Takes ownership of x509 */
3288 				SSL_add0_chain_cert(conn->ssl, x509);
3289 			} else {
3290 				BIO_free(bio);
3291 				bio = NULL;
3292 			}
3293 		}
3294 		return ret;
3295 	}
3296 #endif /* ANDROID */
3297 
3298 #ifndef OPENSSL_NO_STDIO
3299 	if (SSL_use_certificate_file(conn->ssl, client_cert,
3300 				     SSL_FILETYPE_ASN1) == 1) {
3301 		wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_file (DER)"
3302 			   " --> OK");
3303 		return 0;
3304 	}
3305 
3306 #if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
3307 	!defined(LIBRESSL_VERSION_NUMBER) && !defined(OPENSSL_IS_BORINGSSL)
3308 	if (SSL_use_certificate_chain_file(conn->ssl, client_cert) == 1) {
3309 		ERR_clear_error();
3310 		wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_chain_file"
3311 			   " --> OK");
3312 		return 0;
3313 	}
3314 #else
3315 	if (SSL_use_certificate_file(conn->ssl, client_cert,
3316 				     SSL_FILETYPE_PEM) == 1) {
3317 		ERR_clear_error();
3318 		wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_certificate_file (PEM)"
3319 			   " --> OK");
3320 		return 0;
3321 	}
3322 #endif
3323 
3324 	tls_show_errors(MSG_DEBUG, __func__,
3325 			"SSL_use_certificate_file failed");
3326 #else /* OPENSSL_NO_STDIO */
3327 	wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO", __func__);
3328 #endif /* OPENSSL_NO_STDIO */
3329 
3330 	return -1;
3331 }
3332 
3333 
tls_global_client_cert(struct tls_data * data,const char * client_cert)3334 static int tls_global_client_cert(struct tls_data *data,
3335 				  const char *client_cert)
3336 {
3337 #ifndef OPENSSL_NO_STDIO
3338 	SSL_CTX *ssl_ctx = data->ssl;
3339 
3340 	if (client_cert == NULL)
3341 		return 0;
3342 
3343 	if (SSL_CTX_use_certificate_file(ssl_ctx, client_cert,
3344 					 SSL_FILETYPE_ASN1) != 1 &&
3345 	    SSL_CTX_use_certificate_chain_file(ssl_ctx, client_cert) != 1 &&
3346 	    SSL_CTX_use_certificate_file(ssl_ctx, client_cert,
3347 					 SSL_FILETYPE_PEM) != 1) {
3348 		tls_show_errors(MSG_INFO, __func__,
3349 				"Failed to load client certificate");
3350 		return -1;
3351 	}
3352 	return 0;
3353 #else /* OPENSSL_NO_STDIO */
3354 	if (client_cert == NULL)
3355 		return 0;
3356 	wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO", __func__);
3357 	return -1;
3358 #endif /* OPENSSL_NO_STDIO */
3359 }
3360 
3361 
3362 #ifdef PKCS12_FUNCS
tls_parse_pkcs12(struct tls_data * data,SSL * ssl,PKCS12 * p12,const char * passwd)3363 static int tls_parse_pkcs12(struct tls_data *data, SSL *ssl, PKCS12 *p12,
3364 			    const char *passwd)
3365 {
3366 	EVP_PKEY *pkey;
3367 	X509 *cert;
3368 	STACK_OF(X509) *certs;
3369 	int res = 0;
3370 	char buf[256];
3371 
3372 	pkey = NULL;
3373 	cert = NULL;
3374 	certs = NULL;
3375 	if (!passwd)
3376 		passwd = "";
3377 	if (!PKCS12_parse(p12, passwd, &pkey, &cert, &certs)) {
3378 		tls_show_errors(MSG_DEBUG, __func__,
3379 				"Failed to parse PKCS12 file");
3380 		PKCS12_free(p12);
3381 		return -1;
3382 	}
3383 	wpa_printf(MSG_DEBUG, "TLS: Successfully parsed PKCS12 data");
3384 
3385 	if (cert) {
3386 		X509_NAME_oneline(X509_get_subject_name(cert), buf,
3387 				  sizeof(buf));
3388 		wpa_printf(MSG_DEBUG, "TLS: Got certificate from PKCS12: "
3389 			   "subject='%s'", buf);
3390 		if (ssl) {
3391 			if (SSL_use_certificate(ssl, cert) != 1)
3392 				res = -1;
3393 		} else {
3394 			if (SSL_CTX_use_certificate(data->ssl, cert) != 1)
3395 				res = -1;
3396 		}
3397 		X509_free(cert);
3398 	}
3399 
3400 	if (pkey) {
3401 		wpa_printf(MSG_DEBUG, "TLS: Got private key from PKCS12");
3402 		if (ssl) {
3403 			if (SSL_use_PrivateKey(ssl, pkey) != 1)
3404 				res = -1;
3405 		} else {
3406 			if (SSL_CTX_use_PrivateKey(data->ssl, pkey) != 1)
3407 				res = -1;
3408 		}
3409 		EVP_PKEY_free(pkey);
3410 	}
3411 
3412 	if (certs) {
3413 #if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER)
3414 		if (ssl)
3415 			SSL_clear_chain_certs(ssl);
3416 		else
3417 			SSL_CTX_clear_chain_certs(data->ssl);
3418 		while ((cert = sk_X509_pop(certs)) != NULL) {
3419 			X509_NAME_oneline(X509_get_subject_name(cert), buf,
3420 					  sizeof(buf));
3421 			wpa_printf(MSG_DEBUG, "TLS: additional certificate"
3422 				   " from PKCS12: subject='%s'", buf);
3423 			if ((ssl && SSL_add1_chain_cert(ssl, cert) != 1) ||
3424 			    (!ssl && SSL_CTX_add1_chain_cert(data->ssl,
3425 							     cert) != 1)) {
3426 				tls_show_errors(MSG_DEBUG, __func__,
3427 						"Failed to add additional certificate");
3428 				res = -1;
3429 				X509_free(cert);
3430 				break;
3431 			}
3432 			X509_free(cert);
3433 		}
3434 		if (!res) {
3435 			/* Try to continue anyway */
3436 		}
3437 		sk_X509_pop_free(certs, X509_free);
3438 #ifndef OPENSSL_IS_BORINGSSL
3439 		if (ssl)
3440 			res = SSL_build_cert_chain(
3441 				ssl,
3442 				SSL_BUILD_CHAIN_FLAG_CHECK |
3443 				SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR);
3444 		else
3445 			res = SSL_CTX_build_cert_chain(
3446 				data->ssl,
3447 				SSL_BUILD_CHAIN_FLAG_CHECK |
3448 				SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR);
3449 		if (!res) {
3450 			tls_show_errors(MSG_DEBUG, __func__,
3451 					"Failed to build certificate chain");
3452 		} else if (res == 2) {
3453 			wpa_printf(MSG_DEBUG,
3454 				   "TLS: Ignore certificate chain verification error when building chain with PKCS#12 extra certificates");
3455 		}
3456 #endif /* OPENSSL_IS_BORINGSSL */
3457 		/*
3458 		 * Try to continue regardless of result since it is possible for
3459 		 * the extra certificates not to be required.
3460 		 */
3461 		res = 0;
3462 #else /* OPENSSL_VERSION_NUMBER >= 0x10002000L */
3463 		SSL_CTX_clear_extra_chain_certs(data->ssl);
3464 		while ((cert = sk_X509_pop(certs)) != NULL) {
3465 			X509_NAME_oneline(X509_get_subject_name(cert), buf,
3466 					  sizeof(buf));
3467 			wpa_printf(MSG_DEBUG, "TLS: additional certificate"
3468 				   " from PKCS12: subject='%s'", buf);
3469 			/*
3470 			 * There is no SSL equivalent for the chain cert - so
3471 			 * always add it to the context...
3472 			 */
3473 			if (SSL_CTX_add_extra_chain_cert(data->ssl, cert) != 1)
3474 			{
3475 				X509_free(cert);
3476 				res = -1;
3477 				break;
3478 			}
3479 		}
3480 		sk_X509_pop_free(certs, X509_free);
3481 #endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */
3482 	}
3483 
3484 	PKCS12_free(p12);
3485 
3486 	if (res < 0)
3487 		tls_get_errors(data);
3488 
3489 	return res;
3490 }
3491 #endif  /* PKCS12_FUNCS */
3492 
3493 
tls_read_pkcs12(struct tls_data * data,SSL * ssl,const char * private_key,const char * passwd)3494 static int tls_read_pkcs12(struct tls_data *data, SSL *ssl,
3495 			   const char *private_key, const char *passwd)
3496 {
3497 #ifdef PKCS12_FUNCS
3498 	FILE *f;
3499 	PKCS12 *p12;
3500 
3501 	f = fopen(private_key, "rb");
3502 	if (f == NULL)
3503 		return -1;
3504 
3505 	p12 = d2i_PKCS12_fp(f, NULL);
3506 	fclose(f);
3507 
3508 	if (p12 == NULL) {
3509 		tls_show_errors(MSG_INFO, __func__,
3510 				"Failed to use PKCS#12 file");
3511 		return -1;
3512 	}
3513 
3514 	return tls_parse_pkcs12(data, ssl, p12, passwd);
3515 
3516 #else /* PKCS12_FUNCS */
3517 	wpa_printf(MSG_INFO, "TLS: PKCS12 support disabled - cannot read "
3518 		   "p12/pfx files");
3519 	return -1;
3520 #endif  /* PKCS12_FUNCS */
3521 }
3522 
3523 
tls_read_pkcs12_blob(struct tls_data * data,SSL * ssl,const u8 * blob,size_t len,const char * passwd)3524 static int tls_read_pkcs12_blob(struct tls_data *data, SSL *ssl,
3525 				const u8 *blob, size_t len, const char *passwd)
3526 {
3527 #ifdef PKCS12_FUNCS
3528 	PKCS12 *p12;
3529 
3530 	p12 = d2i_PKCS12(NULL, (const unsigned char **) &blob, len);
3531 	if (p12 == NULL) {
3532 		tls_show_errors(MSG_INFO, __func__,
3533 				"Failed to use PKCS#12 blob");
3534 		return -1;
3535 	}
3536 
3537 	return tls_parse_pkcs12(data, ssl, p12, passwd);
3538 
3539 #else /* PKCS12_FUNCS */
3540 	wpa_printf(MSG_INFO, "TLS: PKCS12 support disabled - cannot parse "
3541 		   "p12/pfx blobs");
3542 	return -1;
3543 #endif  /* PKCS12_FUNCS */
3544 }
3545 
3546 
3547 #ifndef OPENSSL_NO_ENGINE
tls_engine_get_cert(struct tls_connection * conn,const char * cert_id,X509 ** cert)3548 static int tls_engine_get_cert(struct tls_connection *conn,
3549 			       const char *cert_id,
3550 			       X509 **cert)
3551 {
3552 	/* this runs after the private key is loaded so no PIN is required */
3553 	struct {
3554 		const char *cert_id;
3555 		X509 *cert;
3556 	} params;
3557 	params.cert_id = cert_id;
3558 	params.cert = NULL;
3559 
3560 	if (!ENGINE_ctrl_cmd(conn->engine, "LOAD_CERT_CTRL",
3561 			     0, &params, NULL, 1)) {
3562 		unsigned long err = ERR_get_error();
3563 
3564 		wpa_printf(MSG_ERROR, "ENGINE: cannot load client cert with id"
3565 			   " '%s' [%s]", cert_id,
3566 			   ERR_error_string(err, NULL));
3567 		if (tls_is_pin_error(err))
3568 			return TLS_SET_PARAMS_ENGINE_PRV_BAD_PIN;
3569 		return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
3570 	}
3571 	if (!params.cert) {
3572 		wpa_printf(MSG_ERROR, "ENGINE: did not properly cert with id"
3573 			   " '%s'", cert_id);
3574 		return TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED;
3575 	}
3576 	*cert = params.cert;
3577 	return 0;
3578 }
3579 #endif /* OPENSSL_NO_ENGINE */
3580 
3581 
tls_connection_engine_client_cert(struct tls_connection * conn,const char * cert_id)3582 static int tls_connection_engine_client_cert(struct tls_connection *conn,
3583 					     const char *cert_id)
3584 {
3585 #ifndef OPENSSL_NO_ENGINE
3586 	X509 *cert;
3587 
3588 	if (tls_engine_get_cert(conn, cert_id, &cert))
3589 		return -1;
3590 
3591 	if (!SSL_use_certificate(conn->ssl, cert)) {
3592 		tls_show_errors(MSG_ERROR, __func__,
3593 				"SSL_use_certificate failed");
3594                 X509_free(cert);
3595 		return -1;
3596 	}
3597 	X509_free(cert);
3598 	wpa_printf(MSG_DEBUG, "ENGINE: SSL_use_certificate --> "
3599 		   "OK");
3600 	return 0;
3601 
3602 #else /* OPENSSL_NO_ENGINE */
3603 	return -1;
3604 #endif /* OPENSSL_NO_ENGINE */
3605 }
3606 
3607 
tls_connection_engine_ca_cert(struct tls_data * data,struct tls_connection * conn,const char * ca_cert_id)3608 static int tls_connection_engine_ca_cert(struct tls_data *data,
3609 					 struct tls_connection *conn,
3610 					 const char *ca_cert_id)
3611 {
3612 #ifndef OPENSSL_NO_ENGINE
3613 	X509 *cert;
3614 	SSL_CTX *ssl_ctx = data->ssl;
3615 	X509_STORE *store;
3616 
3617 	if (tls_engine_get_cert(conn, ca_cert_id, &cert))
3618 		return -1;
3619 
3620 	/* start off the same as tls_connection_ca_cert */
3621 	store = X509_STORE_new();
3622 	if (store == NULL) {
3623 		wpa_printf(MSG_DEBUG, "OpenSSL: %s - failed to allocate new "
3624 			   "certificate store", __func__);
3625 		X509_free(cert);
3626 		return -1;
3627 	}
3628 	SSL_CTX_set_cert_store(ssl_ctx, store);
3629 	if (!X509_STORE_add_cert(store, cert)) {
3630 		unsigned long err = ERR_peek_error();
3631 		tls_show_errors(MSG_WARNING, __func__,
3632 				"Failed to add CA certificate from engine "
3633 				"to certificate store");
3634 		if (ERR_GET_LIB(err) == ERR_LIB_X509 &&
3635 		    ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE) {
3636 			wpa_printf(MSG_DEBUG, "OpenSSL: %s - ignoring cert"
3637 				   " already in hash table error",
3638 				   __func__);
3639 		} else {
3640 			X509_free(cert);
3641 			return -1;
3642 		}
3643 	}
3644 	X509_free(cert);
3645 	wpa_printf(MSG_DEBUG, "OpenSSL: %s - added CA certificate from engine "
3646 		   "to certificate store", __func__);
3647 	SSL_set_verify(conn->ssl, SSL_VERIFY_PEER, tls_verify_cb);
3648 	conn->ca_cert_verify = 1;
3649 
3650 	return 0;
3651 
3652 #else /* OPENSSL_NO_ENGINE */
3653 	return -1;
3654 #endif /* OPENSSL_NO_ENGINE */
3655 }
3656 
3657 
tls_connection_engine_private_key(struct tls_connection * conn)3658 static int tls_connection_engine_private_key(struct tls_connection *conn)
3659 {
3660 #if defined(ANDROID) || !defined(OPENSSL_NO_ENGINE)
3661 	if (SSL_use_PrivateKey(conn->ssl, conn->private_key) != 1) {
3662 		tls_show_errors(MSG_ERROR, __func__,
3663 				"ENGINE: cannot use private key for TLS");
3664 		return -1;
3665 	}
3666 	if (!SSL_check_private_key(conn->ssl)) {
3667 		tls_show_errors(MSG_INFO, __func__,
3668 				"Private key failed verification");
3669 		return -1;
3670 	}
3671 	return 0;
3672 #else /* OPENSSL_NO_ENGINE */
3673 	wpa_printf(MSG_ERROR, "SSL: Configuration uses engine, but "
3674 		   "engine support was not compiled in");
3675 	return -1;
3676 #endif /* OPENSSL_NO_ENGINE */
3677 }
3678 
3679 
3680 #ifndef OPENSSL_NO_STDIO
tls_passwd_cb(char * buf,int size,int rwflag,void * password)3681 static int tls_passwd_cb(char *buf, int size, int rwflag, void *password)
3682 {
3683 	if (!password)
3684 		return 0;
3685 	os_strlcpy(buf, (const char *) password, size);
3686 	return os_strlen(buf);
3687 }
3688 #endif /* OPENSSL_NO_STDIO */
3689 
3690 
tls_use_private_key_file(struct tls_data * data,SSL * ssl,const char * private_key,const char * private_key_passwd)3691 static int tls_use_private_key_file(struct tls_data *data, SSL *ssl,
3692 				    const char *private_key,
3693 				    const char *private_key_passwd)
3694 {
3695 #ifndef OPENSSL_NO_STDIO
3696 	BIO *bio;
3697 	EVP_PKEY *pkey;
3698 	int ret;
3699 
3700 	/* First try ASN.1 (DER). */
3701 	bio = BIO_new_file(private_key, "r");
3702 	if (!bio)
3703 		return -1;
3704 	pkey = d2i_PrivateKey_bio(bio, NULL);
3705 	BIO_free(bio);
3706 
3707 	if (pkey) {
3708 		wpa_printf(MSG_DEBUG, "OpenSSL: %s (DER) --> loaded", __func__);
3709 	} else {
3710 		/* Try PEM with the provided password. */
3711 		bio = BIO_new_file(private_key, "r");
3712 		if (!bio)
3713 			return -1;
3714 		pkey = PEM_read_bio_PrivateKey(bio, NULL, tls_passwd_cb,
3715 					       (void *) private_key_passwd);
3716 		BIO_free(bio);
3717 		if (!pkey)
3718 			return -1;
3719 		wpa_printf(MSG_DEBUG, "OpenSSL: %s (PEM) --> loaded", __func__);
3720 		/* Clear errors from the previous failed load. */
3721 		ERR_clear_error();
3722 	}
3723 
3724 	if (ssl)
3725 		ret = SSL_use_PrivateKey(ssl, pkey);
3726 	else
3727 		ret = SSL_CTX_use_PrivateKey(data->ssl, pkey);
3728 
3729 	EVP_PKEY_free(pkey);
3730 	return ret == 1 ? 0 : -1;
3731 #else /* OPENSSL_NO_STDIO */
3732 	wpa_printf(MSG_DEBUG, "OpenSSL: %s - OPENSSL_NO_STDIO", __func__);
3733 	return -1;
3734 #endif /* OPENSSL_NO_STDIO */
3735 }
3736 
3737 
tls_connection_private_key(struct tls_data * data,struct tls_connection * conn,const char * private_key,const char * private_key_passwd,const u8 * private_key_blob,size_t private_key_blob_len)3738 static int tls_connection_private_key(struct tls_data *data,
3739 				      struct tls_connection *conn,
3740 				      const char *private_key,
3741 				      const char *private_key_passwd,
3742 				      const u8 *private_key_blob,
3743 				      size_t private_key_blob_len)
3744 {
3745 	int ok;
3746 
3747 	if (private_key == NULL && private_key_blob == NULL)
3748 		return 0;
3749 
3750 	ok = 0;
3751 	while (private_key_blob) {
3752 		if (SSL_use_PrivateKey_ASN1(EVP_PKEY_RSA, conn->ssl,
3753 					    (u8 *) private_key_blob,
3754 					    private_key_blob_len) == 1) {
3755 			wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_PrivateKey_"
3756 				   "ASN1(EVP_PKEY_RSA) --> OK");
3757 			ok = 1;
3758 			break;
3759 		}
3760 
3761 		if (SSL_use_PrivateKey_ASN1(EVP_PKEY_DSA, conn->ssl,
3762 					    (u8 *) private_key_blob,
3763 					    private_key_blob_len) == 1) {
3764 			wpa_printf(MSG_DEBUG, "OpenSSL: SSL_use_PrivateKey_"
3765 				   "ASN1(EVP_PKEY_DSA) --> OK");
3766 			ok = 1;
3767 			break;
3768 		}
3769 
3770 		if (SSL_use_RSAPrivateKey_ASN1(conn->ssl,
3771 					       (u8 *) private_key_blob,
3772 					       private_key_blob_len) == 1) {
3773 			wpa_printf(MSG_DEBUG, "OpenSSL: "
3774 				   "SSL_use_RSAPrivateKey_ASN1 --> OK");
3775 			ok = 1;
3776 			break;
3777 		}
3778 
3779 		if (tls_read_pkcs12_blob(data, conn->ssl, private_key_blob,
3780 					 private_key_blob_len,
3781 					 private_key_passwd) == 0) {
3782 			wpa_printf(MSG_DEBUG, "OpenSSL: PKCS#12 as blob --> "
3783 				   "OK");
3784 			ok = 1;
3785 			break;
3786 		}
3787 
3788 		break;
3789 	}
3790 
3791 	while (!ok && private_key) {
3792 		if (tls_use_private_key_file(data, conn->ssl, private_key,
3793 					     private_key_passwd) == 0) {
3794 			ok = 1;
3795 			break;
3796 		}
3797 
3798 		if (tls_read_pkcs12(data, conn->ssl, private_key,
3799 				    private_key_passwd) == 0) {
3800 			wpa_printf(MSG_DEBUG, "OpenSSL: Reading PKCS#12 file "
3801 				   "--> OK");
3802 			ok = 1;
3803 			break;
3804 		}
3805 
3806 		if (tls_cryptoapi_cert(conn->ssl, private_key) == 0) {
3807 			wpa_printf(MSG_DEBUG, "OpenSSL: Using CryptoAPI to "
3808 				   "access certificate store --> OK");
3809 			ok = 1;
3810 			break;
3811 		}
3812 
3813 		break;
3814 	}
3815 
3816 	if (!ok) {
3817 		tls_show_errors(MSG_INFO, __func__,
3818 				"Failed to load private key");
3819 		return -1;
3820 	}
3821 	ERR_clear_error();
3822 
3823 	if (!SSL_check_private_key(conn->ssl)) {
3824 		tls_show_errors(MSG_INFO, __func__, "Private key failed "
3825 				"verification");
3826 		return -1;
3827 	}
3828 
3829 	wpa_printf(MSG_DEBUG, "SSL: Private key loaded successfully");
3830 	return 0;
3831 }
3832 
3833 
tls_global_private_key(struct tls_data * data,const char * private_key,const char * private_key_passwd)3834 static int tls_global_private_key(struct tls_data *data,
3835 				  const char *private_key,
3836 				  const char *private_key_passwd)
3837 {
3838 	SSL_CTX *ssl_ctx = data->ssl;
3839 
3840 	if (private_key == NULL)
3841 		return 0;
3842 
3843 	if (tls_use_private_key_file(data, NULL, private_key,
3844 				     private_key_passwd) &&
3845 	    tls_read_pkcs12(data, NULL, private_key, private_key_passwd)) {
3846 		tls_show_errors(MSG_INFO, __func__,
3847 				"Failed to load private key");
3848 		ERR_clear_error();
3849 		return -1;
3850 	}
3851 	ERR_clear_error();
3852 
3853 	if (!SSL_CTX_check_private_key(ssl_ctx)) {
3854 		tls_show_errors(MSG_INFO, __func__,
3855 				"Private key failed verification");
3856 		return -1;
3857 	}
3858 
3859 	return 0;
3860 }
3861 
3862 
tls_connection_dh(struct tls_connection * conn,const char * dh_file)3863 static int tls_connection_dh(struct tls_connection *conn, const char *dh_file)
3864 {
3865 #ifdef OPENSSL_NO_DH
3866 	if (dh_file == NULL)
3867 		return 0;
3868 	wpa_printf(MSG_ERROR, "TLS: openssl does not include DH support, but "
3869 		   "dh_file specified");
3870 	return -1;
3871 #else /* OPENSSL_NO_DH */
3872 	DH *dh;
3873 	BIO *bio;
3874 
3875 	/* TODO: add support for dh_blob */
3876 	if (dh_file == NULL)
3877 		return 0;
3878 	if (conn == NULL)
3879 		return -1;
3880 
3881 	bio = BIO_new_file(dh_file, "r");
3882 	if (bio == NULL) {
3883 		wpa_printf(MSG_INFO, "TLS: Failed to open DH file '%s': %s",
3884 			   dh_file, ERR_error_string(ERR_get_error(), NULL));
3885 		return -1;
3886 	}
3887 	dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
3888 	BIO_free(bio);
3889 #ifndef OPENSSL_NO_DSA
3890 	while (dh == NULL) {
3891 		DSA *dsa;
3892 		wpa_printf(MSG_DEBUG, "TLS: Failed to parse DH file '%s': %s -"
3893 			   " trying to parse as DSA params", dh_file,
3894 			   ERR_error_string(ERR_get_error(), NULL));
3895 		bio = BIO_new_file(dh_file, "r");
3896 		if (bio == NULL)
3897 			break;
3898 		dsa = PEM_read_bio_DSAparams(bio, NULL, NULL, NULL);
3899 		BIO_free(bio);
3900 		if (!dsa) {
3901 			wpa_printf(MSG_DEBUG, "TLS: Failed to parse DSA file "
3902 				   "'%s': %s", dh_file,
3903 				   ERR_error_string(ERR_get_error(), NULL));
3904 			break;
3905 		}
3906 
3907 		wpa_printf(MSG_DEBUG, "TLS: DH file in DSA param format");
3908 		dh = DSA_dup_DH(dsa);
3909 		DSA_free(dsa);
3910 		if (dh == NULL) {
3911 			wpa_printf(MSG_INFO, "TLS: Failed to convert DSA "
3912 				   "params into DH params");
3913 			break;
3914 		}
3915 		break;
3916 	}
3917 #endif /* !OPENSSL_NO_DSA */
3918 	if (dh == NULL) {
3919 		wpa_printf(MSG_INFO, "TLS: Failed to read/parse DH/DSA file "
3920 			   "'%s'", dh_file);
3921 		return -1;
3922 	}
3923 
3924 	if (SSL_set_tmp_dh(conn->ssl, dh) != 1) {
3925 		wpa_printf(MSG_INFO, "TLS: Failed to set DH params from '%s': "
3926 			   "%s", dh_file,
3927 			   ERR_error_string(ERR_get_error(), NULL));
3928 		DH_free(dh);
3929 		return -1;
3930 	}
3931 	DH_free(dh);
3932 	return 0;
3933 #endif /* OPENSSL_NO_DH */
3934 }
3935 
3936 
tls_global_dh(struct tls_data * data,const char * dh_file)3937 static int tls_global_dh(struct tls_data *data, const char *dh_file)
3938 {
3939 #ifdef OPENSSL_NO_DH
3940 	if (dh_file == NULL)
3941 		return 0;
3942 	wpa_printf(MSG_ERROR, "TLS: openssl does not include DH support, but "
3943 		   "dh_file specified");
3944 	return -1;
3945 #else /* OPENSSL_NO_DH */
3946 	SSL_CTX *ssl_ctx = data->ssl;
3947 	DH *dh;
3948 	BIO *bio;
3949 
3950 	/* TODO: add support for dh_blob */
3951 	if (dh_file == NULL)
3952 		return 0;
3953 	if (ssl_ctx == NULL)
3954 		return -1;
3955 
3956 	bio = BIO_new_file(dh_file, "r");
3957 	if (bio == NULL) {
3958 		wpa_printf(MSG_INFO, "TLS: Failed to open DH file '%s': %s",
3959 			   dh_file, ERR_error_string(ERR_get_error(), NULL));
3960 		return -1;
3961 	}
3962 	dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
3963 	BIO_free(bio);
3964 #ifndef OPENSSL_NO_DSA
3965 	while (dh == NULL) {
3966 		DSA *dsa;
3967 		wpa_printf(MSG_DEBUG, "TLS: Failed to parse DH file '%s': %s -"
3968 			   " trying to parse as DSA params", dh_file,
3969 			   ERR_error_string(ERR_get_error(), NULL));
3970 		bio = BIO_new_file(dh_file, "r");
3971 		if (bio == NULL)
3972 			break;
3973 		dsa = PEM_read_bio_DSAparams(bio, NULL, NULL, NULL);
3974 		BIO_free(bio);
3975 		if (!dsa) {
3976 			wpa_printf(MSG_DEBUG, "TLS: Failed to parse DSA file "
3977 				   "'%s': %s", dh_file,
3978 				   ERR_error_string(ERR_get_error(), NULL));
3979 			break;
3980 		}
3981 
3982 		wpa_printf(MSG_DEBUG, "TLS: DH file in DSA param format");
3983 		dh = DSA_dup_DH(dsa);
3984 		DSA_free(dsa);
3985 		if (dh == NULL) {
3986 			wpa_printf(MSG_INFO, "TLS: Failed to convert DSA "
3987 				   "params into DH params");
3988 			break;
3989 		}
3990 		break;
3991 	}
3992 #endif /* !OPENSSL_NO_DSA */
3993 	if (dh == NULL) {
3994 		wpa_printf(MSG_INFO, "TLS: Failed to read/parse DH/DSA file "
3995 			   "'%s'", dh_file);
3996 		return -1;
3997 	}
3998 
3999 	if (SSL_CTX_set_tmp_dh(ssl_ctx, dh) != 1) {
4000 		wpa_printf(MSG_INFO, "TLS: Failed to set DH params from '%s': "
4001 			   "%s", dh_file,
4002 			   ERR_error_string(ERR_get_error(), NULL));
4003 		DH_free(dh);
4004 		return -1;
4005 	}
4006 	DH_free(dh);
4007 	return 0;
4008 #endif /* OPENSSL_NO_DH */
4009 }
4010 
4011 
tls_connection_get_random(void * ssl_ctx,struct tls_connection * conn,struct tls_random * keys)4012 int tls_connection_get_random(void *ssl_ctx, struct tls_connection *conn,
4013 			      struct tls_random *keys)
4014 {
4015 	SSL *ssl;
4016 
4017 	if (conn == NULL || keys == NULL)
4018 		return -1;
4019 	ssl = conn->ssl;
4020 	if (ssl == NULL)
4021 		return -1;
4022 
4023 	os_memset(keys, 0, sizeof(*keys));
4024 	keys->client_random = conn->client_random;
4025 	keys->client_random_len = SSL_get_client_random(
4026 		ssl, conn->client_random, sizeof(conn->client_random));
4027 	keys->server_random = conn->server_random;
4028 	keys->server_random_len = SSL_get_server_random(
4029 		ssl, conn->server_random, sizeof(conn->server_random));
4030 
4031 	return 0;
4032 }
4033 
4034 
4035 #ifdef OPENSSL_NEED_EAP_FAST_PRF
openssl_get_keyblock_size(SSL * ssl)4036 static int openssl_get_keyblock_size(SSL *ssl)
4037 {
4038 #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
4039 	(defined(LIBRESSL_VERSION_NUMBER) && \
4040 	 LIBRESSL_VERSION_NUMBER < 0x20700000L)
4041 	const EVP_CIPHER *c;
4042 	const EVP_MD *h;
4043 	int md_size;
4044 
4045 	if (ssl->enc_read_ctx == NULL || ssl->enc_read_ctx->cipher == NULL ||
4046 	    ssl->read_hash == NULL)
4047 		return -1;
4048 
4049 	c = ssl->enc_read_ctx->cipher;
4050 	h = EVP_MD_CTX_md(ssl->read_hash);
4051 	if (h)
4052 		md_size = EVP_MD_size(h);
4053 	else if (ssl->s3)
4054 		md_size = ssl->s3->tmp.new_mac_secret_size;
4055 	else
4056 		return -1;
4057 
4058 	wpa_printf(MSG_DEBUG, "OpenSSL: keyblock size: key_len=%d MD_size=%d "
4059 		   "IV_len=%d", EVP_CIPHER_key_length(c), md_size,
4060 		   EVP_CIPHER_iv_length(c));
4061 	return 2 * (EVP_CIPHER_key_length(c) +
4062 		    md_size +
4063 		    EVP_CIPHER_iv_length(c));
4064 #else
4065 	const SSL_CIPHER *ssl_cipher;
4066 	int cipher, digest;
4067 	const EVP_CIPHER *c;
4068 	const EVP_MD *h;
4069 	int mac_key_len, enc_key_len, fixed_iv_len;
4070 
4071 	ssl_cipher = SSL_get_current_cipher(ssl);
4072 	if (!ssl_cipher)
4073 		return -1;
4074 	cipher = SSL_CIPHER_get_cipher_nid(ssl_cipher);
4075 	digest = SSL_CIPHER_get_digest_nid(ssl_cipher);
4076 	wpa_printf(MSG_DEBUG, "OpenSSL: cipher nid %d digest nid %d",
4077 		   cipher, digest);
4078 	if (cipher < 0 || digest < 0)
4079 		return -1;
4080 	if (cipher == NID_undef) {
4081 		wpa_printf(MSG_DEBUG, "OpenSSL: no cipher in use?!");
4082 		return -1;
4083 	}
4084 	c = EVP_get_cipherbynid(cipher);
4085 	if (!c)
4086 		return -1;
4087 	enc_key_len = EVP_CIPHER_key_length(c);
4088 	if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE ||
4089 	    EVP_CIPHER_mode(c) == EVP_CIPH_CCM_MODE)
4090 		fixed_iv_len = 4; /* only part of IV from PRF */
4091 	else
4092 		fixed_iv_len = EVP_CIPHER_iv_length(c);
4093 	if (digest == NID_undef) {
4094 		wpa_printf(MSG_DEBUG, "OpenSSL: no digest in use (e.g., AEAD)");
4095 		mac_key_len = 0;
4096 	} else {
4097 		h = EVP_get_digestbynid(digest);
4098 		if (!h)
4099 			return -1;
4100 		mac_key_len = EVP_MD_size(h);
4101 	}
4102 
4103 	wpa_printf(MSG_DEBUG,
4104 		   "OpenSSL: keyblock size: mac_key_len=%d enc_key_len=%d fixed_iv_len=%d",
4105 		   mac_key_len, enc_key_len, fixed_iv_len);
4106 	return 2 * (mac_key_len + enc_key_len + fixed_iv_len);
4107 #endif
4108 }
4109 #endif /* OPENSSL_NEED_EAP_FAST_PRF */
4110 
4111 
tls_connection_export_key(void * tls_ctx,struct tls_connection * conn,const char * label,const u8 * context,size_t context_len,u8 * out,size_t out_len)4112 int tls_connection_export_key(void *tls_ctx, struct tls_connection *conn,
4113 			      const char *label, const u8 *context,
4114 			      size_t context_len, u8 *out, size_t out_len)
4115 {
4116 	if (!conn ||
4117 	    SSL_export_keying_material(conn->ssl, out, out_len, label,
4118 				       os_strlen(label), context, context_len,
4119 				       context != NULL) != 1)
4120 		return -1;
4121 	return 0;
4122 }
4123 
4124 
tls_connection_get_eap_fast_key(void * tls_ctx,struct tls_connection * conn,u8 * out,size_t out_len)4125 int tls_connection_get_eap_fast_key(void *tls_ctx, struct tls_connection *conn,
4126 				    u8 *out, size_t out_len)
4127 {
4128 #ifdef OPENSSL_NEED_EAP_FAST_PRF
4129 	SSL *ssl;
4130 	SSL_SESSION *sess;
4131 	u8 *rnd;
4132 	int ret = -1;
4133 	int skip = 0;
4134 	u8 *tmp_out = NULL;
4135 	u8 *_out = out;
4136 	unsigned char client_random[SSL3_RANDOM_SIZE];
4137 	unsigned char server_random[SSL3_RANDOM_SIZE];
4138 	unsigned char master_key[64];
4139 	size_t master_key_len;
4140 	const char *ver;
4141 
4142 	/*
4143 	 * TLS library did not support EAP-FAST key generation, so get the
4144 	 * needed TLS session parameters and use an internal implementation of
4145 	 * TLS PRF to derive the key.
4146 	 */
4147 
4148 	if (conn == NULL)
4149 		return -1;
4150 	ssl = conn->ssl;
4151 	if (ssl == NULL)
4152 		return -1;
4153 	ver = SSL_get_version(ssl);
4154 	sess = SSL_get_session(ssl);
4155 	if (!ver || !sess)
4156 		return -1;
4157 
4158 	skip = openssl_get_keyblock_size(ssl);
4159 	if (skip < 0)
4160 		return -1;
4161 	tmp_out = os_malloc(skip + out_len);
4162 	if (!tmp_out)
4163 		return -1;
4164 	_out = tmp_out;
4165 
4166 	rnd = os_malloc(2 * SSL3_RANDOM_SIZE);
4167 	if (!rnd) {
4168 		os_free(tmp_out);
4169 		return -1;
4170 	}
4171 
4172 	SSL_get_client_random(ssl, client_random, sizeof(client_random));
4173 	SSL_get_server_random(ssl, server_random, sizeof(server_random));
4174 	master_key_len = SSL_SESSION_get_master_key(sess, master_key,
4175 						    sizeof(master_key));
4176 
4177 	os_memcpy(rnd, server_random, SSL3_RANDOM_SIZE);
4178 	os_memcpy(rnd + SSL3_RANDOM_SIZE, client_random, SSL3_RANDOM_SIZE);
4179 
4180 	if (os_strcmp(ver, "TLSv1.2") == 0) {
4181 		tls_prf_sha256(master_key, master_key_len,
4182 			       "key expansion", rnd, 2 * SSL3_RANDOM_SIZE,
4183 			       _out, skip + out_len);
4184 		ret = 0;
4185 	} else if (tls_prf_sha1_md5(master_key, master_key_len,
4186 				    "key expansion", rnd, 2 * SSL3_RANDOM_SIZE,
4187 				    _out, skip + out_len) == 0) {
4188 		ret = 0;
4189 	}
4190 	forced_memzero(master_key, sizeof(master_key));
4191 	os_free(rnd);
4192 	if (ret == 0)
4193 		os_memcpy(out, _out + skip, out_len);
4194 	bin_clear_free(tmp_out, skip);
4195 
4196 	return ret;
4197 #else /* OPENSSL_NEED_EAP_FAST_PRF */
4198 	wpa_printf(MSG_ERROR,
4199 		   "OpenSSL: EAP-FAST keys cannot be exported in FIPS mode");
4200 	return -1;
4201 #endif /* OPENSSL_NEED_EAP_FAST_PRF */
4202 }
4203 
4204 
4205 static struct wpabuf *
openssl_handshake(struct tls_connection * conn,const struct wpabuf * in_data)4206 openssl_handshake(struct tls_connection *conn, const struct wpabuf *in_data)
4207 {
4208 	int res;
4209 	struct wpabuf *out_data;
4210 
4211 	/*
4212 	 * Give TLS handshake data from the server (if available) to OpenSSL
4213 	 * for processing.
4214 	 */
4215 	if (in_data && wpabuf_len(in_data) > 0 &&
4216 	    BIO_write(conn->ssl_in, wpabuf_head(in_data), wpabuf_len(in_data))
4217 	    < 0) {
4218 		tls_show_errors(MSG_INFO, __func__,
4219 				"Handshake failed - BIO_write");
4220 		return NULL;
4221 	}
4222 
4223 	/* Initiate TLS handshake or continue the existing handshake */
4224 	if (conn->server)
4225 		res = SSL_accept(conn->ssl);
4226 	else
4227 		res = SSL_connect(conn->ssl);
4228 	if (res != 1) {
4229 		int err = SSL_get_error(conn->ssl, res);
4230 		if (err == SSL_ERROR_WANT_READ)
4231 			wpa_printf(MSG_DEBUG, "SSL: SSL_connect - want "
4232 				   "more data");
4233 		else if (err == SSL_ERROR_WANT_WRITE)
4234 			wpa_printf(MSG_DEBUG, "SSL: SSL_connect - want to "
4235 				   "write");
4236 		else {
4237 			tls_show_errors(MSG_INFO, __func__, "SSL_connect");
4238 			conn->failed++;
4239 			if (!conn->server && !conn->client_hello_generated) {
4240 				/* The server would not understand TLS Alert
4241 				 * before ClientHello, so simply terminate
4242 				 * handshake on this type of error case caused
4243 				 * by a likely internal error like no ciphers
4244 				 * available. */
4245 				wpa_printf(MSG_DEBUG,
4246 					   "OpenSSL: Could not generate ClientHello");
4247 				conn->write_alerts++;
4248 				return NULL;
4249 			}
4250 		}
4251 	}
4252 
4253 	if (!conn->server && !conn->failed)
4254 		conn->client_hello_generated = 1;
4255 
4256 #ifdef CONFIG_SUITEB
4257 	if ((conn->flags & TLS_CONN_SUITEB) && !conn->server &&
4258 	    os_strncmp(SSL_get_cipher(conn->ssl), "DHE-", 4) == 0 &&
4259 	    conn->server_dh_prime_len < 3072) {
4260 		struct tls_context *context = conn->context;
4261 
4262 		/*
4263 		 * This should not be reached since earlier cert_cb should have
4264 		 * terminated the handshake. Keep this check here for extra
4265 		 * protection if anything goes wrong with the more low-level
4266 		 * checks based on having to parse the TLS handshake messages.
4267 		 */
4268 		wpa_printf(MSG_DEBUG,
4269 			   "OpenSSL: Server DH prime length: %d bits",
4270 			   conn->server_dh_prime_len);
4271 
4272 		if (context->event_cb) {
4273 			union tls_event_data ev;
4274 
4275 			os_memset(&ev, 0, sizeof(ev));
4276 			ev.alert.is_local = 1;
4277 			ev.alert.type = "fatal";
4278 			ev.alert.description = "insufficient security";
4279 			context->event_cb(context->cb_ctx, TLS_ALERT, &ev);
4280 		}
4281 		/*
4282 		 * Could send a TLS Alert to the server, but for now, simply
4283 		 * terminate handshake.
4284 		 */
4285 		conn->failed++;
4286 		conn->write_alerts++;
4287 		return NULL;
4288 	}
4289 #endif /* CONFIG_SUITEB */
4290 
4291 	/* Get the TLS handshake data to be sent to the server */
4292 	res = BIO_ctrl_pending(conn->ssl_out);
4293 	wpa_printf(MSG_DEBUG, "SSL: %d bytes pending from ssl_out", res);
4294 	out_data = wpabuf_alloc(res);
4295 	if (out_data == NULL) {
4296 		wpa_printf(MSG_DEBUG, "SSL: Failed to allocate memory for "
4297 			   "handshake output (%d bytes)", res);
4298 		if (BIO_reset(conn->ssl_out) < 0) {
4299 			tls_show_errors(MSG_INFO, __func__,
4300 					"BIO_reset failed");
4301 		}
4302 		return NULL;
4303 	}
4304 	res = res == 0 ? 0 : BIO_read(conn->ssl_out, wpabuf_mhead(out_data),
4305 				      res);
4306 	if (res < 0) {
4307 		tls_show_errors(MSG_INFO, __func__,
4308 				"Handshake failed - BIO_read");
4309 		if (BIO_reset(conn->ssl_out) < 0) {
4310 			tls_show_errors(MSG_INFO, __func__,
4311 					"BIO_reset failed");
4312 		}
4313 		wpabuf_free(out_data);
4314 		return NULL;
4315 	}
4316 	wpabuf_put(out_data, res);
4317 
4318 	return out_data;
4319 }
4320 
4321 
4322 static struct wpabuf *
openssl_get_appl_data(struct tls_connection * conn,size_t max_len)4323 openssl_get_appl_data(struct tls_connection *conn, size_t max_len)
4324 {
4325 	struct wpabuf *appl_data;
4326 	int res;
4327 
4328 	appl_data = wpabuf_alloc(max_len + 100);
4329 	if (appl_data == NULL)
4330 		return NULL;
4331 
4332 	res = SSL_read(conn->ssl, wpabuf_mhead(appl_data),
4333 		       wpabuf_size(appl_data));
4334 	if (res < 0) {
4335 		int err = SSL_get_error(conn->ssl, res);
4336 		if (err == SSL_ERROR_WANT_READ ||
4337 		    err == SSL_ERROR_WANT_WRITE) {
4338 			wpa_printf(MSG_DEBUG, "SSL: No Application Data "
4339 				   "included");
4340 		} else {
4341 			tls_show_errors(MSG_INFO, __func__,
4342 					"Failed to read possible "
4343 					"Application Data");
4344 		}
4345 		wpabuf_free(appl_data);
4346 		return NULL;
4347 	}
4348 
4349 	wpabuf_put(appl_data, res);
4350 	wpa_hexdump_buf_key(MSG_MSGDUMP, "SSL: Application Data in Finished "
4351 			    "message", appl_data);
4352 
4353 	return appl_data;
4354 }
4355 
4356 
4357 static struct wpabuf *
openssl_connection_handshake(struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data)4358 openssl_connection_handshake(struct tls_connection *conn,
4359 			     const struct wpabuf *in_data,
4360 			     struct wpabuf **appl_data)
4361 {
4362 	struct wpabuf *out_data;
4363 
4364 	if (appl_data)
4365 		*appl_data = NULL;
4366 
4367 	out_data = openssl_handshake(conn, in_data);
4368 	if (out_data == NULL)
4369 		return NULL;
4370 	if (conn->invalid_hb_used) {
4371 		wpa_printf(MSG_INFO, "TLS: Heartbeat attack detected - do not send response");
4372 		wpabuf_free(out_data);
4373 		return NULL;
4374 	}
4375 
4376 	if (SSL_is_init_finished(conn->ssl)) {
4377 		wpa_printf(MSG_DEBUG,
4378 			   "OpenSSL: Handshake finished - resumed=%d",
4379 			   tls_connection_resumed(conn->ssl_ctx, conn));
4380 		if (conn->server) {
4381 			char *buf;
4382 			size_t buflen = 2000;
4383 
4384 			buf = os_malloc(buflen);
4385 			if (buf) {
4386 				if (SSL_get_shared_ciphers(conn->ssl, buf,
4387 							   buflen)) {
4388 					buf[buflen - 1] = '\0';
4389 					wpa_printf(MSG_DEBUG,
4390 						   "OpenSSL: Shared ciphers: %s",
4391 						   buf);
4392 				}
4393 				os_free(buf);
4394 			}
4395 		}
4396 		if (appl_data && in_data)
4397 			*appl_data = openssl_get_appl_data(conn,
4398 							   wpabuf_len(in_data));
4399 	}
4400 
4401 	if (conn->invalid_hb_used) {
4402 		wpa_printf(MSG_INFO, "TLS: Heartbeat attack detected - do not send response");
4403 		if (appl_data) {
4404 			wpabuf_free(*appl_data);
4405 			*appl_data = NULL;
4406 		}
4407 		wpabuf_free(out_data);
4408 		return NULL;
4409 	}
4410 
4411 	return out_data;
4412 }
4413 
4414 
4415 struct wpabuf *
tls_connection_handshake(void * ssl_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data)4416 tls_connection_handshake(void *ssl_ctx, struct tls_connection *conn,
4417 			 const struct wpabuf *in_data,
4418 			 struct wpabuf **appl_data)
4419 {
4420 	return openssl_connection_handshake(conn, in_data, appl_data);
4421 }
4422 
4423 
tls_connection_server_handshake(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data)4424 struct wpabuf * tls_connection_server_handshake(void *tls_ctx,
4425 						struct tls_connection *conn,
4426 						const struct wpabuf *in_data,
4427 						struct wpabuf **appl_data)
4428 {
4429 	conn->server = 1;
4430 	return openssl_connection_handshake(conn, in_data, appl_data);
4431 }
4432 
4433 
tls_connection_encrypt(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data)4434 struct wpabuf * tls_connection_encrypt(void *tls_ctx,
4435 				       struct tls_connection *conn,
4436 				       const struct wpabuf *in_data)
4437 {
4438 	int res;
4439 	struct wpabuf *buf;
4440 
4441 	if (conn == NULL)
4442 		return NULL;
4443 
4444 	/* Give plaintext data for OpenSSL to encrypt into the TLS tunnel. */
4445 	if ((res = BIO_reset(conn->ssl_in)) < 0 ||
4446 	    (res = BIO_reset(conn->ssl_out)) < 0) {
4447 		tls_show_errors(MSG_INFO, __func__, "BIO_reset failed");
4448 		return NULL;
4449 	}
4450 	res = SSL_write(conn->ssl, wpabuf_head(in_data), wpabuf_len(in_data));
4451 	if (res < 0) {
4452 		tls_show_errors(MSG_INFO, __func__,
4453 				"Encryption failed - SSL_write");
4454 		return NULL;
4455 	}
4456 
4457 	/* Read encrypted data to be sent to the server */
4458 	buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
4459 	if (buf == NULL)
4460 		return NULL;
4461 	res = BIO_read(conn->ssl_out, wpabuf_mhead(buf), wpabuf_size(buf));
4462 	if (res < 0) {
4463 		tls_show_errors(MSG_INFO, __func__,
4464 				"Encryption failed - BIO_read");
4465 		wpabuf_free(buf);
4466 		return NULL;
4467 	}
4468 	wpabuf_put(buf, res);
4469 
4470 	return buf;
4471 }
4472 
4473 
tls_connection_decrypt(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data)4474 struct wpabuf * tls_connection_decrypt(void *tls_ctx,
4475 				       struct tls_connection *conn,
4476 				       const struct wpabuf *in_data)
4477 {
4478 	int res;
4479 	struct wpabuf *buf;
4480 
4481 	/* Give encrypted data from TLS tunnel for OpenSSL to decrypt. */
4482 	res = BIO_write(conn->ssl_in, wpabuf_head(in_data),
4483 			wpabuf_len(in_data));
4484 	if (res < 0) {
4485 		tls_show_errors(MSG_INFO, __func__,
4486 				"Decryption failed - BIO_write");
4487 		return NULL;
4488 	}
4489 	if (BIO_reset(conn->ssl_out) < 0) {
4490 		tls_show_errors(MSG_INFO, __func__, "BIO_reset failed");
4491 		return NULL;
4492 	}
4493 
4494 	/* Read decrypted data for further processing */
4495 	/*
4496 	 * Even though we try to disable TLS compression, it is possible that
4497 	 * this cannot be done with all TLS libraries. Add extra buffer space
4498 	 * to handle the possibility of the decrypted data being longer than
4499 	 * input data.
4500 	 */
4501 	buf = wpabuf_alloc((wpabuf_len(in_data) + 500) * 3);
4502 	if (buf == NULL)
4503 		return NULL;
4504 	res = SSL_read(conn->ssl, wpabuf_mhead(buf), wpabuf_size(buf));
4505 	if (res < 0) {
4506 		tls_show_errors(MSG_INFO, __func__,
4507 				"Decryption failed - SSL_read");
4508 		wpabuf_free(buf);
4509 		return NULL;
4510 	}
4511 	wpabuf_put(buf, res);
4512 
4513 	if (conn->invalid_hb_used) {
4514 		wpa_printf(MSG_INFO, "TLS: Heartbeat attack detected - do not send response");
4515 		wpabuf_free(buf);
4516 		return NULL;
4517 	}
4518 
4519 	return buf;
4520 }
4521 
4522 
tls_connection_resumed(void * ssl_ctx,struct tls_connection * conn)4523 int tls_connection_resumed(void *ssl_ctx, struct tls_connection *conn)
4524 {
4525 	return conn ? SSL_session_reused(conn->ssl) : 0;
4526 }
4527 
4528 
tls_connection_set_cipher_list(void * tls_ctx,struct tls_connection * conn,u8 * ciphers)4529 int tls_connection_set_cipher_list(void *tls_ctx, struct tls_connection *conn,
4530 				   u8 *ciphers)
4531 {
4532 	char buf[500], *pos, *end;
4533 	u8 *c;
4534 	int ret;
4535 
4536 	if (conn == NULL || conn->ssl == NULL || ciphers == NULL)
4537 		return -1;
4538 
4539 	buf[0] = '\0';
4540 	pos = buf;
4541 	end = pos + sizeof(buf);
4542 
4543 	c = ciphers;
4544 	while (*c != TLS_CIPHER_NONE) {
4545 		const char *suite;
4546 
4547 		switch (*c) {
4548 		case TLS_CIPHER_RC4_SHA:
4549 			suite = "RC4-SHA";
4550 			break;
4551 		case TLS_CIPHER_AES128_SHA:
4552 			suite = "AES128-SHA";
4553 			break;
4554 		case TLS_CIPHER_RSA_DHE_AES128_SHA:
4555 			suite = "DHE-RSA-AES128-SHA";
4556 			break;
4557 		case TLS_CIPHER_ANON_DH_AES128_SHA:
4558 			suite = "ADH-AES128-SHA";
4559 			break;
4560 		case TLS_CIPHER_RSA_DHE_AES256_SHA:
4561 			suite = "DHE-RSA-AES256-SHA";
4562 			break;
4563 		case TLS_CIPHER_AES256_SHA:
4564 			suite = "AES256-SHA";
4565 			break;
4566 		default:
4567 			wpa_printf(MSG_DEBUG, "TLS: Unsupported "
4568 				   "cipher selection: %d", *c);
4569 			return -1;
4570 		}
4571 		ret = os_snprintf(pos, end - pos, ":%s", suite);
4572 		if (os_snprintf_error(end - pos, ret))
4573 			break;
4574 		pos += ret;
4575 
4576 		c++;
4577 	}
4578 	if (!buf[0]) {
4579 		wpa_printf(MSG_DEBUG, "OpenSSL: No ciphers listed");
4580 		return -1;
4581 	}
4582 
4583 	wpa_printf(MSG_DEBUG, "OpenSSL: cipher suites: %s", buf + 1);
4584 
4585 #if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
4586 #ifdef EAP_FAST_OR_TEAP
4587 	if (os_strstr(buf, ":ADH-")) {
4588 		/*
4589 		 * Need to drop to security level 0 to allow anonymous
4590 		 * cipher suites for EAP-FAST.
4591 		 */
4592 		SSL_set_security_level(conn->ssl, 0);
4593 	} else if (SSL_get_security_level(conn->ssl) == 0) {
4594 		/* Force at least security level 1 */
4595 		SSL_set_security_level(conn->ssl, 1);
4596 	}
4597 #endif /* EAP_FAST_OR_TEAP */
4598 #endif
4599 
4600 	if (SSL_set_cipher_list(conn->ssl, buf + 1) != 1) {
4601 		tls_show_errors(MSG_INFO, __func__,
4602 				"Cipher suite configuration failed");
4603 		return -1;
4604 	}
4605 
4606 	return 0;
4607 }
4608 
4609 
tls_get_version(void * ssl_ctx,struct tls_connection * conn,char * buf,size_t buflen)4610 int tls_get_version(void *ssl_ctx, struct tls_connection *conn,
4611 		    char *buf, size_t buflen)
4612 {
4613 	const char *name;
4614 	if (conn == NULL || conn->ssl == NULL)
4615 		return -1;
4616 
4617 	name = SSL_get_version(conn->ssl);
4618 	if (name == NULL)
4619 		return -1;
4620 
4621 	os_strlcpy(buf, name, buflen);
4622 	return 0;
4623 }
4624 
4625 
tls_get_cipher(void * ssl_ctx,struct tls_connection * conn,char * buf,size_t buflen)4626 int tls_get_cipher(void *ssl_ctx, struct tls_connection *conn,
4627 		   char *buf, size_t buflen)
4628 {
4629 	const char *name;
4630 	if (conn == NULL || conn->ssl == NULL)
4631 		return -1;
4632 
4633 	name = SSL_get_cipher(conn->ssl);
4634 	if (name == NULL)
4635 		return -1;
4636 
4637 	os_strlcpy(buf, name, buflen);
4638 	return 0;
4639 }
4640 
4641 
tls_connection_enable_workaround(void * ssl_ctx,struct tls_connection * conn)4642 int tls_connection_enable_workaround(void *ssl_ctx,
4643 				     struct tls_connection *conn)
4644 {
4645 	SSL_set_options(conn->ssl, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
4646 
4647 	return 0;
4648 }
4649 
4650 
4651 #ifdef EAP_FAST_OR_TEAP
4652 /* ClientHello TLS extensions require a patch to openssl, so this function is
4653  * commented out unless explicitly needed for EAP-FAST in order to be able to
4654  * build this file with unmodified openssl. */
tls_connection_client_hello_ext(void * ssl_ctx,struct tls_connection * conn,int ext_type,const u8 * data,size_t data_len)4655 int tls_connection_client_hello_ext(void *ssl_ctx, struct tls_connection *conn,
4656 				    int ext_type, const u8 *data,
4657 				    size_t data_len)
4658 {
4659 	if (conn == NULL || conn->ssl == NULL || ext_type != 35)
4660 		return -1;
4661 
4662 	if (SSL_set_session_ticket_ext(conn->ssl, (void *) data,
4663 				       data_len) != 1)
4664 		return -1;
4665 
4666 	return 0;
4667 }
4668 #endif /* EAP_FAST_OR_TEAP */
4669 
4670 
tls_connection_get_failed(void * ssl_ctx,struct tls_connection * conn)4671 int tls_connection_get_failed(void *ssl_ctx, struct tls_connection *conn)
4672 {
4673 	if (conn == NULL)
4674 		return -1;
4675 	return conn->failed;
4676 }
4677 
4678 
tls_connection_get_read_alerts(void * ssl_ctx,struct tls_connection * conn)4679 int tls_connection_get_read_alerts(void *ssl_ctx, struct tls_connection *conn)
4680 {
4681 	if (conn == NULL)
4682 		return -1;
4683 	return conn->read_alerts;
4684 }
4685 
4686 
tls_connection_get_write_alerts(void * ssl_ctx,struct tls_connection * conn)4687 int tls_connection_get_write_alerts(void *ssl_ctx, struct tls_connection *conn)
4688 {
4689 	if (conn == NULL)
4690 		return -1;
4691 	return conn->write_alerts;
4692 }
4693 
4694 
4695 #ifdef HAVE_OCSP
4696 
ocsp_debug_print_resp(OCSP_RESPONSE * rsp)4697 static void ocsp_debug_print_resp(OCSP_RESPONSE *rsp)
4698 {
4699 #ifndef CONFIG_NO_STDOUT_DEBUG
4700 	BIO *out;
4701 	size_t rlen;
4702 	char *txt;
4703 	int res;
4704 
4705 	if (wpa_debug_level > MSG_DEBUG)
4706 		return;
4707 
4708 	out = BIO_new(BIO_s_mem());
4709 	if (!out)
4710 		return;
4711 
4712 	OCSP_RESPONSE_print(out, rsp, 0);
4713 	rlen = BIO_ctrl_pending(out);
4714 	txt = os_malloc(rlen + 1);
4715 	if (!txt) {
4716 		BIO_free(out);
4717 		return;
4718 	}
4719 
4720 	res = BIO_read(out, txt, rlen);
4721 	if (res > 0) {
4722 		txt[res] = '\0';
4723 		wpa_printf(MSG_DEBUG, "OpenSSL: OCSP Response\n%s", txt);
4724 	}
4725 	os_free(txt);
4726 	BIO_free(out);
4727 #endif /* CONFIG_NO_STDOUT_DEBUG */
4728 }
4729 
4730 
ocsp_resp_cb(SSL * s,void * arg)4731 static int ocsp_resp_cb(SSL *s, void *arg)
4732 {
4733 	struct tls_connection *conn = arg;
4734 	const unsigned char *p;
4735 	int len, status, reason, res;
4736 	OCSP_RESPONSE *rsp;
4737 	OCSP_BASICRESP *basic;
4738 	OCSP_CERTID *id;
4739 	ASN1_GENERALIZEDTIME *produced_at, *this_update, *next_update;
4740 	X509_STORE *store;
4741 	STACK_OF(X509) *certs = NULL;
4742 
4743 	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
4744 	if (!p) {
4745 		wpa_printf(MSG_DEBUG, "OpenSSL: No OCSP response received");
4746 		return (conn->flags & TLS_CONN_REQUIRE_OCSP) ? 0 : 1;
4747 	}
4748 
4749 	wpa_hexdump(MSG_DEBUG, "OpenSSL: OCSP response", p, len);
4750 
4751 	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
4752 	if (!rsp) {
4753 		wpa_printf(MSG_INFO, "OpenSSL: Failed to parse OCSP response");
4754 		return 0;
4755 	}
4756 
4757 	ocsp_debug_print_resp(rsp);
4758 
4759 	status = OCSP_response_status(rsp);
4760 	if (status != OCSP_RESPONSE_STATUS_SUCCESSFUL) {
4761 		wpa_printf(MSG_INFO, "OpenSSL: OCSP responder error %d (%s)",
4762 			   status, OCSP_response_status_str(status));
4763 		return 0;
4764 	}
4765 
4766 	basic = OCSP_response_get1_basic(rsp);
4767 	if (!basic) {
4768 		wpa_printf(MSG_INFO, "OpenSSL: Could not find BasicOCSPResponse");
4769 		return 0;
4770 	}
4771 
4772 	store = SSL_CTX_get_cert_store(conn->ssl_ctx);
4773 	if (conn->peer_issuer) {
4774 		debug_print_cert(conn->peer_issuer, "Add OCSP issuer");
4775 
4776 		if (X509_STORE_add_cert(store, conn->peer_issuer) != 1) {
4777 			tls_show_errors(MSG_INFO, __func__,
4778 					"OpenSSL: Could not add issuer to certificate store");
4779 		}
4780 		certs = sk_X509_new_null();
4781 		if (certs) {
4782 			X509 *cert;
4783 			cert = X509_dup(conn->peer_issuer);
4784 			if (cert && !sk_X509_push(certs, cert)) {
4785 				tls_show_errors(
4786 					MSG_INFO, __func__,
4787 					"OpenSSL: Could not add issuer to OCSP responder trust store");
4788 				X509_free(cert);
4789 				sk_X509_free(certs);
4790 				certs = NULL;
4791 			}
4792 			if (certs && conn->peer_issuer_issuer) {
4793 				cert = X509_dup(conn->peer_issuer_issuer);
4794 				if (cert && !sk_X509_push(certs, cert)) {
4795 					tls_show_errors(
4796 						MSG_INFO, __func__,
4797 						"OpenSSL: Could not add issuer's issuer to OCSP responder trust store");
4798 					X509_free(cert);
4799 				}
4800 			}
4801 		}
4802 	}
4803 
4804 	status = OCSP_basic_verify(basic, certs, store, OCSP_TRUSTOTHER);
4805 	sk_X509_pop_free(certs, X509_free);
4806 	if (status <= 0) {
4807 		tls_show_errors(MSG_INFO, __func__,
4808 				"OpenSSL: OCSP response failed verification");
4809 		OCSP_BASICRESP_free(basic);
4810 		OCSP_RESPONSE_free(rsp);
4811 		return 0;
4812 	}
4813 
4814 	wpa_printf(MSG_DEBUG, "OpenSSL: OCSP response verification succeeded");
4815 
4816 	if (!conn->peer_cert) {
4817 		wpa_printf(MSG_DEBUG, "OpenSSL: Peer certificate not available for OCSP status check");
4818 		OCSP_BASICRESP_free(basic);
4819 		OCSP_RESPONSE_free(rsp);
4820 		return 0;
4821 	}
4822 
4823 	if (!conn->peer_issuer) {
4824 		wpa_printf(MSG_DEBUG, "OpenSSL: Peer issuer certificate not available for OCSP status check");
4825 		OCSP_BASICRESP_free(basic);
4826 		OCSP_RESPONSE_free(rsp);
4827 		return 0;
4828 	}
4829 
4830 	id = OCSP_cert_to_id(EVP_sha256(), conn->peer_cert, conn->peer_issuer);
4831 	if (!id) {
4832 		wpa_printf(MSG_DEBUG,
4833 			   "OpenSSL: Could not create OCSP certificate identifier (SHA256)");
4834 		OCSP_BASICRESP_free(basic);
4835 		OCSP_RESPONSE_free(rsp);
4836 		return 0;
4837 	}
4838 
4839 	res = OCSP_resp_find_status(basic, id, &status, &reason, &produced_at,
4840 				    &this_update, &next_update);
4841 	if (!res) {
4842 		OCSP_CERTID_free(id);
4843 		id = OCSP_cert_to_id(NULL, conn->peer_cert, conn->peer_issuer);
4844 		if (!id) {
4845 			wpa_printf(MSG_DEBUG,
4846 				   "OpenSSL: Could not create OCSP certificate identifier (SHA1)");
4847 			OCSP_BASICRESP_free(basic);
4848 			OCSP_RESPONSE_free(rsp);
4849 			return 0;
4850 		}
4851 
4852 		res = OCSP_resp_find_status(basic, id, &status, &reason,
4853 					    &produced_at, &this_update,
4854 					    &next_update);
4855 	}
4856 
4857 	if (!res) {
4858 		wpa_printf(MSG_INFO, "OpenSSL: Could not find current server certificate from OCSP response%s",
4859 			   (conn->flags & TLS_CONN_REQUIRE_OCSP) ? "" :
4860 			   " (OCSP not required)");
4861 		OCSP_CERTID_free(id);
4862 		OCSP_BASICRESP_free(basic);
4863 		OCSP_RESPONSE_free(rsp);
4864 		return (conn->flags & TLS_CONN_REQUIRE_OCSP) ? 0 : 1;
4865 	}
4866 	OCSP_CERTID_free(id);
4867 
4868 	if (!OCSP_check_validity(this_update, next_update, 5 * 60, -1)) {
4869 		tls_show_errors(MSG_INFO, __func__,
4870 				"OpenSSL: OCSP status times invalid");
4871 		OCSP_BASICRESP_free(basic);
4872 		OCSP_RESPONSE_free(rsp);
4873 		return 0;
4874 	}
4875 
4876 	OCSP_BASICRESP_free(basic);
4877 	OCSP_RESPONSE_free(rsp);
4878 
4879 	wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status for server certificate: %s",
4880 		   OCSP_cert_status_str(status));
4881 
4882 	if (status == V_OCSP_CERTSTATUS_GOOD)
4883 		return 1;
4884 	if (status == V_OCSP_CERTSTATUS_REVOKED)
4885 		return 0;
4886 	if (conn->flags & TLS_CONN_REQUIRE_OCSP) {
4887 		wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status unknown, but OCSP required");
4888 		return 0;
4889 	}
4890 	wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status unknown, but OCSP was not required, so allow connection to continue");
4891 	return 1;
4892 }
4893 
4894 
ocsp_status_cb(SSL * s,void * arg)4895 static int ocsp_status_cb(SSL *s, void *arg)
4896 {
4897 	char *tmp;
4898 	char *resp;
4899 	size_t len;
4900 
4901 	if (tls_global->ocsp_stapling_response == NULL) {
4902 		wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status callback - no response configured");
4903 		return SSL_TLSEXT_ERR_OK;
4904 	}
4905 
4906 	resp = os_readfile(tls_global->ocsp_stapling_response, &len);
4907 	if (resp == NULL) {
4908 		wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status callback - could not read response file");
4909 		/* TODO: Build OCSPResponse with responseStatus = internalError
4910 		 */
4911 		return SSL_TLSEXT_ERR_OK;
4912 	}
4913 	wpa_printf(MSG_DEBUG, "OpenSSL: OCSP status callback - send cached response");
4914 	tmp = OPENSSL_malloc(len);
4915 	if (tmp == NULL) {
4916 		os_free(resp);
4917 		return SSL_TLSEXT_ERR_ALERT_FATAL;
4918 	}
4919 
4920 	os_memcpy(tmp, resp, len);
4921 	os_free(resp);
4922 	SSL_set_tlsext_status_ocsp_resp(s, tmp, len);
4923 
4924 	return SSL_TLSEXT_ERR_OK;
4925 }
4926 
4927 #endif /* HAVE_OCSP */
4928 
4929 
max_str_len(const char ** lines)4930 static size_t max_str_len(const char **lines)
4931 {
4932 	const char **p;
4933 	size_t max_len = 0;
4934 
4935 	for (p = lines; *p; p++) {
4936 		size_t len = os_strlen(*p);
4937 
4938 		if (len > max_len)
4939 			max_len = len;
4940 	}
4941 
4942 	return max_len;
4943 }
4944 
4945 
match_lines_in_file(const char * path,const char ** lines)4946 static int match_lines_in_file(const char *path, const char **lines)
4947 {
4948 	FILE *f;
4949 	char *buf;
4950 	size_t bufsize;
4951 	int found = 0, is_linestart = 1;
4952 
4953 	bufsize = max_str_len(lines) + sizeof("\r\n");
4954 	buf = os_malloc(bufsize);
4955 	if (!buf)
4956 		return 0;
4957 
4958 	f = fopen(path, "r");
4959 	if (!f) {
4960 		os_free(buf);
4961 		return 0;
4962 	}
4963 
4964 	while (!found && fgets(buf, bufsize, f)) {
4965 		int is_lineend;
4966 		size_t len;
4967 		const char **p;
4968 
4969 		len = strcspn(buf, "\r\n");
4970 		is_lineend = buf[len] != '\0';
4971 		buf[len] = '\0';
4972 
4973 		if (is_linestart && is_lineend) {
4974 			for (p = lines; !found && *p; p++)
4975 				found = os_strcmp(buf, *p) == 0;
4976 		}
4977 		is_linestart = is_lineend;
4978 	}
4979 
4980 	fclose(f);
4981 	bin_clear_free(buf, bufsize);
4982 
4983 	return found;
4984 }
4985 
4986 
is_tpm2_key(const char * path)4987 static int is_tpm2_key(const char *path)
4988 {
4989 	/* Check both new and old format of TPM2 PEM guard tag */
4990 	static const char *tpm2_tags[] = {
4991 		"-----BEGIN TSS2 PRIVATE KEY-----",
4992 		"-----BEGIN TSS2 KEY BLOB-----",
4993 		NULL
4994 	};
4995 
4996 	return match_lines_in_file(path, tpm2_tags);
4997 }
4998 
4999 
tls_connection_set_params(void * tls_ctx,struct tls_connection * conn,const struct tls_connection_params * params)5000 int tls_connection_set_params(void *tls_ctx, struct tls_connection *conn,
5001 			      const struct tls_connection_params *params)
5002 {
5003 	struct tls_data *data = tls_ctx;
5004 	int ret;
5005 	unsigned long err;
5006 	int can_pkcs11 = 0;
5007 	const char *key_id = params->key_id;
5008 	const char *cert_id = params->cert_id;
5009 	const char *ca_cert_id = params->ca_cert_id;
5010 	const char *engine_id = params->engine ? params->engine_id : NULL;
5011 	const char *ciphers;
5012 
5013 	if (conn == NULL)
5014 		return -1;
5015 
5016 	if (params->flags & TLS_CONN_REQUIRE_OCSP_ALL) {
5017 		wpa_printf(MSG_INFO,
5018 			   "OpenSSL: ocsp=3 not supported");
5019 		return -1;
5020 	}
5021 
5022 	/*
5023 	 * If the engine isn't explicitly configured, and any of the
5024 	 * cert/key fields are actually PKCS#11 URIs, then automatically
5025 	 * use the PKCS#11 ENGINE.
5026 	 */
5027 	if (!engine_id || os_strcmp(engine_id, "pkcs11") == 0)
5028 		can_pkcs11 = 1;
5029 
5030 	if (!key_id && params->private_key && can_pkcs11 &&
5031 	    os_strncmp(params->private_key, "pkcs11:", 7) == 0) {
5032 		can_pkcs11 = 2;
5033 		key_id = params->private_key;
5034 	}
5035 
5036 	if (!cert_id && params->client_cert && can_pkcs11 &&
5037 	    os_strncmp(params->client_cert, "pkcs11:", 7) == 0) {
5038 		can_pkcs11 = 2;
5039 		cert_id = params->client_cert;
5040 	}
5041 
5042 	if (!ca_cert_id && params->ca_cert && can_pkcs11 &&
5043 	    os_strncmp(params->ca_cert, "pkcs11:", 7) == 0) {
5044 		can_pkcs11 = 2;
5045 		ca_cert_id = params->ca_cert;
5046 	}
5047 
5048 	/* If we need to automatically enable the PKCS#11 ENGINE, do so. */
5049 	if (can_pkcs11 == 2 && !engine_id)
5050 		engine_id = "pkcs11";
5051 
5052 	/* If private_key points to a TPM2-wrapped key, automatically enable
5053 	 * tpm2 engine and use it to unwrap the key. */
5054 	if (params->private_key &&
5055 	    (!engine_id || os_strcmp(engine_id, "tpm2") == 0) &&
5056 	    is_tpm2_key(params->private_key)) {
5057 		wpa_printf(MSG_DEBUG, "OpenSSL: Found TPM2 wrapped key %s",
5058 			   params->private_key);
5059 		key_id = key_id ? key_id : params->private_key;
5060 		engine_id = engine_id ? engine_id : "tpm2";
5061 	}
5062 
5063 #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST)
5064 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
5065 	if (params->flags & TLS_CONN_EAP_FAST) {
5066 		wpa_printf(MSG_DEBUG,
5067 			   "OpenSSL: Use TLSv1_method() for EAP-FAST");
5068 		if (SSL_set_ssl_method(conn->ssl, TLSv1_method()) != 1) {
5069 			tls_show_errors(MSG_INFO, __func__,
5070 					"Failed to set TLSv1_method() for EAP-FAST");
5071 			return -1;
5072 		}
5073 	}
5074 #endif
5075 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
5076 #ifdef SSL_OP_NO_TLSv1_3
5077 	if (params->flags & TLS_CONN_EAP_FAST) {
5078 		/* Need to disable TLS v1.3 at least for now since OpenSSL 1.1.1
5079 		 * refuses to start the handshake with the modified ciphersuite
5080 		 * list (no TLS v1.3 ciphersuites included) for EAP-FAST. */
5081 		wpa_printf(MSG_DEBUG, "OpenSSL: Disable TLSv1.3 for EAP-FAST");
5082 		SSL_set_options(conn->ssl, SSL_OP_NO_TLSv1_3);
5083 	}
5084 #endif /* SSL_OP_NO_TLSv1_3 */
5085 #endif
5086 #endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */
5087 
5088 	while ((err = ERR_get_error())) {
5089 		wpa_printf(MSG_INFO, "%s: Clearing pending SSL error: %s",
5090 			   __func__, ERR_error_string(err, NULL));
5091 	}
5092 
5093 	if (engine_id) {
5094 		wpa_printf(MSG_DEBUG, "SSL: Initializing TLS engine %s",
5095 			   engine_id);
5096 		ret = tls_engine_init(conn, engine_id, params->pin,
5097 				      key_id, cert_id, ca_cert_id);
5098 		if (ret)
5099 			return ret;
5100 	}
5101 	if (tls_connection_set_subject_match(conn,
5102 					     params->subject_match,
5103 					     params->altsubject_match,
5104 					     params->suffix_match,
5105 					     params->domain_match,
5106 					     params->check_cert_subject))
5107 		return -1;
5108 
5109 	if (engine_id && ca_cert_id) {
5110 		if (tls_connection_engine_ca_cert(data, conn, ca_cert_id))
5111 			return TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED;
5112 	} else if (tls_connection_ca_cert(data, conn, params->ca_cert,
5113 					  params->ca_cert_blob,
5114 					  params->ca_cert_blob_len,
5115 					  params->ca_path))
5116 		return -1;
5117 
5118 	if (engine_id && cert_id) {
5119 		if (tls_connection_engine_client_cert(conn, cert_id))
5120 			return TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED;
5121 	} else if (tls_connection_client_cert(conn, params->client_cert,
5122 					      params->client_cert_blob,
5123 					      params->client_cert_blob_len))
5124 		return -1;
5125 
5126 	if (engine_id && key_id) {
5127 		wpa_printf(MSG_DEBUG, "TLS: Using private key from engine");
5128 		if (tls_connection_engine_private_key(conn))
5129 			return TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED;
5130 	} else if (tls_connection_private_key(data, conn,
5131 					      params->private_key,
5132 					      params->private_key_passwd,
5133 					      params->private_key_blob,
5134 					      params->private_key_blob_len)) {
5135 		wpa_printf(MSG_INFO, "TLS: Failed to load private key '%s'",
5136 			   params->private_key);
5137 		return -1;
5138 	}
5139 
5140 	if (tls_connection_dh(conn, params->dh_file)) {
5141 		wpa_printf(MSG_INFO, "TLS: Failed to load DH file '%s'",
5142 			   params->dh_file);
5143 		return -1;
5144 	}
5145 
5146 	ciphers = params->openssl_ciphers;
5147 #ifdef CONFIG_SUITEB
5148 #ifdef OPENSSL_IS_BORINGSSL
5149 	if (ciphers && os_strcmp(ciphers, "SUITEB192") == 0) {
5150 		/* BoringSSL removed support for SUITEB192, so need to handle
5151 		 * this with hardcoded ciphersuite and additional checks for
5152 		 * other parameters. */
5153 		ciphers = "ECDHE-ECDSA-AES256-GCM-SHA384";
5154 	}
5155 #endif /* OPENSSL_IS_BORINGSSL */
5156 #endif /* CONFIG_SUITEB */
5157 	if (ciphers && SSL_set_cipher_list(conn->ssl, ciphers) != 1) {
5158 		wpa_printf(MSG_INFO,
5159 			   "OpenSSL: Failed to set cipher string '%s'",
5160 			   ciphers);
5161 		return -1;
5162 	}
5163 
5164 	if (!params->openssl_ecdh_curves) {
5165 #ifndef OPENSSL_IS_BORINGSSL
5166 #ifndef OPENSSL_NO_EC
5167 #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && \
5168 	(OPENSSL_VERSION_NUMBER < 0x10100000L)
5169 		if (SSL_set_ecdh_auto(conn->ssl, 1) != 1) {
5170 			wpa_printf(MSG_INFO,
5171 				   "OpenSSL: Failed to set ECDH curves to auto");
5172 			return -1;
5173 		}
5174 #endif /* >= 1.0.2 && < 1.1.0 */
5175 #endif /* OPENSSL_NO_EC */
5176 #endif /* OPENSSL_IS_BORINGSSL */
5177 	} else if (params->openssl_ecdh_curves[0]) {
5178 #if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER < 0x10002000L)
5179 		wpa_printf(MSG_INFO,
5180 			"OpenSSL: ECDH configuration nnot supported");
5181 		return -1;
5182 #else /* OPENSSL_IS_BORINGSSL || < 1.0.2 */
5183 #ifndef OPENSSL_NO_EC
5184 		if (SSL_set1_curves_list(conn->ssl,
5185 					 params->openssl_ecdh_curves) != 1) {
5186 			wpa_printf(MSG_INFO,
5187 				   "OpenSSL: Failed to set ECDH curves '%s'",
5188 				   params->openssl_ecdh_curves);
5189 			return -1;
5190 		}
5191 #else /* OPENSSL_NO_EC */
5192 		wpa_printf(MSG_INFO, "OpenSSL: ECDH not supported");
5193 		return -1;
5194 #endif /* OPENSSL_NO_EC */
5195 #endif /* OPENSSL_IS_BORINGSSL */
5196 	}
5197 
5198 	if (tls_set_conn_flags(conn, params->flags,
5199 			       params->openssl_ciphers) < 0)
5200 		return -1;
5201 
5202 #ifdef OPENSSL_IS_BORINGSSL
5203 	if (params->flags & TLS_CONN_REQUEST_OCSP) {
5204 		SSL_enable_ocsp_stapling(conn->ssl);
5205 	}
5206 #else /* OPENSSL_IS_BORINGSSL */
5207 #ifdef HAVE_OCSP
5208 	if (params->flags & TLS_CONN_REQUEST_OCSP) {
5209 		SSL_CTX *ssl_ctx = data->ssl;
5210 		SSL_set_tlsext_status_type(conn->ssl, TLSEXT_STATUSTYPE_ocsp);
5211 		SSL_CTX_set_tlsext_status_cb(ssl_ctx, ocsp_resp_cb);
5212 		SSL_CTX_set_tlsext_status_arg(ssl_ctx, conn);
5213 	}
5214 #else /* HAVE_OCSP */
5215 	if (params->flags & TLS_CONN_REQUIRE_OCSP) {
5216 		wpa_printf(MSG_INFO,
5217 			   "OpenSSL: No OCSP support included - reject configuration");
5218 		return -1;
5219 	}
5220 	if (params->flags & TLS_CONN_REQUEST_OCSP) {
5221 		wpa_printf(MSG_DEBUG,
5222 			   "OpenSSL: No OCSP support included - allow optional OCSP case to continue");
5223 	}
5224 #endif /* HAVE_OCSP */
5225 #endif /* OPENSSL_IS_BORINGSSL */
5226 
5227 	conn->flags = params->flags;
5228 
5229 	tls_get_errors(data);
5230 
5231 	return 0;
5232 }
5233 
5234 
openssl_debug_dump_cipher_list(SSL_CTX * ssl_ctx)5235 static void openssl_debug_dump_cipher_list(SSL_CTX *ssl_ctx)
5236 {
5237 	SSL *ssl;
5238 	int i;
5239 
5240 	ssl = SSL_new(ssl_ctx);
5241 	if (!ssl)
5242 		return;
5243 
5244 	wpa_printf(MSG_DEBUG,
5245 		   "OpenSSL: Enabled cipher suites in priority order");
5246 	for (i = 0; ; i++) {
5247 		const char *cipher;
5248 
5249 		cipher = SSL_get_cipher_list(ssl, i);
5250 		if (!cipher)
5251 			break;
5252 		wpa_printf(MSG_DEBUG, "Cipher %d: %s", i, cipher);
5253 	}
5254 
5255 	SSL_free(ssl);
5256 }
5257 
5258 
5259 #if !defined(LIBRESSL_VERSION_NUMBER) && !defined(BORINGSSL_API_VERSION)
5260 
openssl_pkey_type_str(const EVP_PKEY * pkey)5261 static const char * openssl_pkey_type_str(const EVP_PKEY *pkey)
5262 {
5263 	if (!pkey)
5264 		return "NULL";
5265 	switch (EVP_PKEY_type(EVP_PKEY_id(pkey))) {
5266 	case EVP_PKEY_RSA:
5267 		return "RSA";
5268 	case EVP_PKEY_DSA:
5269 		return "DSA";
5270 	case EVP_PKEY_DH:
5271 		return "DH";
5272 	case EVP_PKEY_EC:
5273 		return "EC";
5274 	}
5275 	return "?";
5276 }
5277 
5278 
openssl_debug_dump_certificate(int i,X509 * cert)5279 static void openssl_debug_dump_certificate(int i, X509 *cert)
5280 {
5281 	char buf[256];
5282 	EVP_PKEY *pkey;
5283 	ASN1_INTEGER *ser;
5284 	char serial_num[128];
5285 
5286 	X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf));
5287 
5288 	ser = X509_get_serialNumber(cert);
5289 	if (ser)
5290 		wpa_snprintf_hex_uppercase(serial_num, sizeof(serial_num),
5291 					   ASN1_STRING_get0_data(ser),
5292 					   ASN1_STRING_length(ser));
5293 	else
5294 		serial_num[0] = '\0';
5295 
5296 	pkey = X509_get_pubkey(cert);
5297 	wpa_printf(MSG_DEBUG, "%d: %s (%s) %s", i, buf,
5298 		   openssl_pkey_type_str(pkey), serial_num);
5299 	EVP_PKEY_free(pkey);
5300 }
5301 
5302 
openssl_debug_dump_certificates(SSL_CTX * ssl_ctx)5303 static void openssl_debug_dump_certificates(SSL_CTX *ssl_ctx)
5304 {
5305 	STACK_OF(X509) *certs;
5306 
5307 	wpa_printf(MSG_DEBUG, "OpenSSL: Configured certificate chain");
5308 	if (SSL_CTX_get0_chain_certs(ssl_ctx, &certs) == 1) {
5309 		int i;
5310 
5311 		for (i = sk_X509_num(certs); i > 0; i--)
5312 			openssl_debug_dump_certificate(i, sk_X509_value(certs,
5313 									i - 1));
5314 	}
5315 	openssl_debug_dump_certificate(0, SSL_CTX_get0_certificate(ssl_ctx));
5316 }
5317 
5318 #endif
5319 
5320 
openssl_debug_dump_certificate_chains(SSL_CTX * ssl_ctx)5321 static void openssl_debug_dump_certificate_chains(SSL_CTX *ssl_ctx)
5322 {
5323 #if !defined(LIBRESSL_VERSION_NUMBER) && !defined(BORINGSSL_API_VERSION)
5324 	int res;
5325 
5326 	for (res = SSL_CTX_set_current_cert(ssl_ctx, SSL_CERT_SET_FIRST);
5327 	     res == 1;
5328 	     res = SSL_CTX_set_current_cert(ssl_ctx, SSL_CERT_SET_NEXT))
5329 		openssl_debug_dump_certificates(ssl_ctx);
5330 
5331 	SSL_CTX_set_current_cert(ssl_ctx, SSL_CERT_SET_FIRST);
5332 #endif
5333 }
5334 
5335 
openssl_debug_dump_ctx(SSL_CTX * ssl_ctx)5336 static void openssl_debug_dump_ctx(SSL_CTX *ssl_ctx)
5337 {
5338 	openssl_debug_dump_cipher_list(ssl_ctx);
5339 	openssl_debug_dump_certificate_chains(ssl_ctx);
5340 }
5341 
5342 
tls_global_set_params(void * tls_ctx,const struct tls_connection_params * params)5343 int tls_global_set_params(void *tls_ctx,
5344 			  const struct tls_connection_params *params)
5345 {
5346 	struct tls_data *data = tls_ctx;
5347 	SSL_CTX *ssl_ctx = data->ssl;
5348 	unsigned long err;
5349 
5350 	while ((err = ERR_get_error())) {
5351 		wpa_printf(MSG_INFO, "%s: Clearing pending SSL error: %s",
5352 			   __func__, ERR_error_string(err, NULL));
5353 	}
5354 
5355 	os_free(data->check_cert_subject);
5356 	data->check_cert_subject = NULL;
5357 	if (params->check_cert_subject) {
5358 		data->check_cert_subject =
5359 			os_strdup(params->check_cert_subject);
5360 		if (!data->check_cert_subject)
5361 			return -1;
5362 	}
5363 
5364 	if (tls_global_ca_cert(data, params->ca_cert) ||
5365 	    tls_global_client_cert(data, params->client_cert) ||
5366 	    tls_global_private_key(data, params->private_key,
5367 				   params->private_key_passwd) ||
5368 	    tls_global_client_cert(data, params->client_cert2) ||
5369 	    tls_global_private_key(data, params->private_key2,
5370 				   params->private_key_passwd2) ||
5371 	    tls_global_dh(data, params->dh_file)) {
5372 		wpa_printf(MSG_INFO, "TLS: Failed to set global parameters");
5373 		return -1;
5374 	}
5375 
5376 	if (params->openssl_ciphers &&
5377 	    SSL_CTX_set_cipher_list(ssl_ctx, params->openssl_ciphers) != 1) {
5378 		wpa_printf(MSG_INFO,
5379 			   "OpenSSL: Failed to set cipher string '%s'",
5380 			   params->openssl_ciphers);
5381 		return -1;
5382 	}
5383 
5384 	if (!params->openssl_ecdh_curves) {
5385 #ifndef OPENSSL_IS_BORINGSSL
5386 #ifndef OPENSSL_NO_EC
5387 #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && \
5388 	(OPENSSL_VERSION_NUMBER < 0x10100000L)
5389 		if (SSL_CTX_set_ecdh_auto(ssl_ctx, 1) != 1) {
5390 			wpa_printf(MSG_INFO,
5391 				   "OpenSSL: Failed to set ECDH curves to auto");
5392 			return -1;
5393 		}
5394 #endif /* >= 1.0.2 && < 1.1.0 */
5395 #endif /* OPENSSL_NO_EC */
5396 #endif /* OPENSSL_IS_BORINGSSL */
5397 	} else if (params->openssl_ecdh_curves[0]) {
5398 #if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER < 0x10002000L)
5399 		wpa_printf(MSG_INFO,
5400 			"OpenSSL: ECDH configuration nnot supported");
5401 		return -1;
5402 #else /* OPENSSL_IS_BORINGSSL || < 1.0.2 */
5403 #ifndef OPENSSL_NO_EC
5404 #if OPENSSL_VERSION_NUMBER < 0x10100000L
5405 		SSL_CTX_set_ecdh_auto(ssl_ctx, 1);
5406 #endif
5407 		if (SSL_CTX_set1_curves_list(ssl_ctx,
5408 					     params->openssl_ecdh_curves) !=
5409 		    1) {
5410 			wpa_printf(MSG_INFO,
5411 				   "OpenSSL: Failed to set ECDH curves '%s'",
5412 				   params->openssl_ecdh_curves);
5413 			return -1;
5414 		}
5415 #else /* OPENSSL_NO_EC */
5416 		wpa_printf(MSG_INFO, "OpenSSL: ECDH not supported");
5417 		return -1;
5418 #endif /* OPENSSL_NO_EC */
5419 #endif /* OPENSSL_IS_BORINGSSL */
5420 	}
5421 
5422 #ifdef SSL_OP_NO_TICKET
5423 	if (params->flags & TLS_CONN_DISABLE_SESSION_TICKET)
5424 		SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_TICKET);
5425 	else
5426 		SSL_CTX_clear_options(ssl_ctx, SSL_OP_NO_TICKET);
5427 #endif /*  SSL_OP_NO_TICKET */
5428 
5429 #ifdef HAVE_OCSP
5430 	SSL_CTX_set_tlsext_status_cb(ssl_ctx, ocsp_status_cb);
5431 	SSL_CTX_set_tlsext_status_arg(ssl_ctx, ssl_ctx);
5432 	os_free(tls_global->ocsp_stapling_response);
5433 	if (params->ocsp_stapling_response)
5434 		tls_global->ocsp_stapling_response =
5435 			os_strdup(params->ocsp_stapling_response);
5436 	else
5437 		tls_global->ocsp_stapling_response = NULL;
5438 #endif /* HAVE_OCSP */
5439 
5440 	openssl_debug_dump_ctx(ssl_ctx);
5441 
5442 	return 0;
5443 }
5444 
5445 
5446 #ifdef EAP_FAST_OR_TEAP
5447 /* Pre-shared secred requires a patch to openssl, so this function is
5448  * commented out unless explicitly needed for EAP-FAST in order to be able to
5449  * build this file with unmodified openssl. */
5450 
5451 #if (defined(OPENSSL_IS_BORINGSSL) || OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
tls_sess_sec_cb(SSL * s,void * secret,int * secret_len,STACK_OF (SSL_CIPHER)* peer_ciphers,const SSL_CIPHER ** cipher,void * arg)5452 static int tls_sess_sec_cb(SSL *s, void *secret, int *secret_len,
5453 			   STACK_OF(SSL_CIPHER) *peer_ciphers,
5454 			   const SSL_CIPHER **cipher, void *arg)
5455 #else /* OPENSSL_IS_BORINGSSL */
5456 static int tls_sess_sec_cb(SSL *s, void *secret, int *secret_len,
5457 			   STACK_OF(SSL_CIPHER) *peer_ciphers,
5458 			   SSL_CIPHER **cipher, void *arg)
5459 #endif /* OPENSSL_IS_BORINGSSL */
5460 {
5461 	struct tls_connection *conn = arg;
5462 	int ret;
5463 
5464 #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
5465 	(defined(LIBRESSL_VERSION_NUMBER) && \
5466 	 LIBRESSL_VERSION_NUMBER < 0x20700000L)
5467 	if (conn == NULL || conn->session_ticket_cb == NULL)
5468 		return 0;
5469 
5470 	ret = conn->session_ticket_cb(conn->session_ticket_cb_ctx,
5471 				      conn->session_ticket,
5472 				      conn->session_ticket_len,
5473 				      s->s3->client_random,
5474 				      s->s3->server_random, secret);
5475 #else
5476 	unsigned char client_random[SSL3_RANDOM_SIZE];
5477 	unsigned char server_random[SSL3_RANDOM_SIZE];
5478 
5479 	if (conn == NULL || conn->session_ticket_cb == NULL)
5480 		return 0;
5481 
5482 	SSL_get_client_random(s, client_random, sizeof(client_random));
5483 	SSL_get_server_random(s, server_random, sizeof(server_random));
5484 
5485 	ret = conn->session_ticket_cb(conn->session_ticket_cb_ctx,
5486 				      conn->session_ticket,
5487 				      conn->session_ticket_len,
5488 				      client_random,
5489 				      server_random, secret);
5490 #endif
5491 
5492 	os_free(conn->session_ticket);
5493 	conn->session_ticket = NULL;
5494 
5495 	if (ret <= 0)
5496 		return 0;
5497 
5498 	*secret_len = SSL_MAX_MASTER_KEY_LENGTH;
5499 	return 1;
5500 }
5501 
5502 
tls_session_ticket_ext_cb(SSL * s,const unsigned char * data,int len,void * arg)5503 static int tls_session_ticket_ext_cb(SSL *s, const unsigned char *data,
5504 				     int len, void *arg)
5505 {
5506 	struct tls_connection *conn = arg;
5507 
5508 	if (conn == NULL || conn->session_ticket_cb == NULL)
5509 		return 0;
5510 
5511 	wpa_printf(MSG_DEBUG, "OpenSSL: %s: length=%d", __func__, len);
5512 
5513 	os_free(conn->session_ticket);
5514 	conn->session_ticket = NULL;
5515 
5516 	wpa_hexdump(MSG_DEBUG, "OpenSSL: ClientHello SessionTicket "
5517 		    "extension", data, len);
5518 
5519 	conn->session_ticket = os_memdup(data, len);
5520 	if (conn->session_ticket == NULL)
5521 		return 0;
5522 
5523 	conn->session_ticket_len = len;
5524 
5525 	return 1;
5526 }
5527 #endif /* EAP_FAST_OR_TEAP */
5528 
5529 
tls_connection_set_session_ticket_cb(void * tls_ctx,struct tls_connection * conn,tls_session_ticket_cb cb,void * ctx)5530 int tls_connection_set_session_ticket_cb(void *tls_ctx,
5531 					 struct tls_connection *conn,
5532 					 tls_session_ticket_cb cb,
5533 					 void *ctx)
5534 {
5535 #ifdef EAP_FAST_OR_TEAP
5536 	conn->session_ticket_cb = cb;
5537 	conn->session_ticket_cb_ctx = ctx;
5538 
5539 	if (cb) {
5540 		if (SSL_set_session_secret_cb(conn->ssl, tls_sess_sec_cb,
5541 					      conn) != 1)
5542 			return -1;
5543 		SSL_set_session_ticket_ext_cb(conn->ssl,
5544 					      tls_session_ticket_ext_cb, conn);
5545 	} else {
5546 		if (SSL_set_session_secret_cb(conn->ssl, NULL, NULL) != 1)
5547 			return -1;
5548 		SSL_set_session_ticket_ext_cb(conn->ssl, NULL, NULL);
5549 	}
5550 
5551 	return 0;
5552 #else /* EAP_FAST_OR_TEAP */
5553 	return -1;
5554 #endif /* EAP_FAST_OR_TEAP */
5555 }
5556 
5557 
tls_get_library_version(char * buf,size_t buf_len)5558 int tls_get_library_version(char *buf, size_t buf_len)
5559 {
5560 #if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
5561 	return os_snprintf(buf, buf_len, "OpenSSL build=%s run=%s",
5562 			   OPENSSL_VERSION_TEXT,
5563 			   OpenSSL_version(OPENSSL_VERSION));
5564 #else
5565 	return os_snprintf(buf, buf_len, "OpenSSL build=%s run=%s",
5566 			   OPENSSL_VERSION_TEXT,
5567 			   SSLeay_version(SSLEAY_VERSION));
5568 #endif
5569 }
5570 
5571 
tls_connection_set_success_data(struct tls_connection * conn,struct wpabuf * data)5572 void tls_connection_set_success_data(struct tls_connection *conn,
5573 				     struct wpabuf *data)
5574 {
5575 	SSL_SESSION *sess;
5576 	struct wpabuf *old;
5577 
5578 	if (tls_ex_idx_session < 0)
5579 		goto fail;
5580 	sess = SSL_get_session(conn->ssl);
5581 	if (!sess)
5582 		goto fail;
5583 	old = SSL_SESSION_get_ex_data(sess, tls_ex_idx_session);
5584 	if (old) {
5585 		wpa_printf(MSG_DEBUG, "OpenSSL: Replacing old success data %p",
5586 			   old);
5587 		wpabuf_free(old);
5588 	}
5589 	if (SSL_SESSION_set_ex_data(sess, tls_ex_idx_session, data) != 1)
5590 		goto fail;
5591 
5592 	wpa_printf(MSG_DEBUG, "OpenSSL: Stored success data %p", data);
5593 	conn->success_data = 1;
5594 	return;
5595 
5596 fail:
5597 	wpa_printf(MSG_INFO, "OpenSSL: Failed to store success data");
5598 	wpabuf_free(data);
5599 }
5600 
5601 
tls_connection_set_success_data_resumed(struct tls_connection * conn)5602 void tls_connection_set_success_data_resumed(struct tls_connection *conn)
5603 {
5604 	wpa_printf(MSG_DEBUG,
5605 		   "OpenSSL: Success data accepted for resumed session");
5606 	conn->success_data = 1;
5607 }
5608 
5609 
5610 const struct wpabuf *
tls_connection_get_success_data(struct tls_connection * conn)5611 tls_connection_get_success_data(struct tls_connection *conn)
5612 {
5613 	SSL_SESSION *sess;
5614 
5615 	if (tls_ex_idx_session < 0 ||
5616 	    !(sess = SSL_get_session(conn->ssl)))
5617 		return NULL;
5618 	return SSL_SESSION_get_ex_data(sess, tls_ex_idx_session);
5619 }
5620 
5621 
tls_connection_remove_session(struct tls_connection * conn)5622 void tls_connection_remove_session(struct tls_connection *conn)
5623 {
5624 	SSL_SESSION *sess;
5625 
5626 	sess = SSL_get_session(conn->ssl);
5627 	if (!sess)
5628 		return;
5629 
5630 	if (SSL_CTX_remove_session(conn->ssl_ctx, sess) != 1)
5631 		wpa_printf(MSG_DEBUG,
5632 			   "OpenSSL: Session was not cached");
5633 	else
5634 		wpa_printf(MSG_DEBUG,
5635 			   "OpenSSL: Removed cached session to disable session resumption");
5636 }
5637 
5638 
tls_get_tls_unique(struct tls_connection * conn,u8 * buf,size_t max_len)5639 int tls_get_tls_unique(struct tls_connection *conn, u8 *buf, size_t max_len)
5640 {
5641 	size_t len;
5642 	int reused;
5643 
5644 	reused = SSL_session_reused(conn->ssl);
5645 	if ((conn->server && !reused) || (!conn->server && reused))
5646 		len = SSL_get_peer_finished(conn->ssl, buf, max_len);
5647 	else
5648 		len = SSL_get_finished(conn->ssl, buf, max_len);
5649 
5650 	if (len == 0 || len > max_len)
5651 		return -1;
5652 
5653 	return len;
5654 }
5655 
5656 
tls_connection_get_cipher_suite(struct tls_connection * conn)5657 u16 tls_connection_get_cipher_suite(struct tls_connection *conn)
5658 {
5659 	const SSL_CIPHER *cipher;
5660 
5661 	cipher = SSL_get_current_cipher(conn->ssl);
5662 	if (!cipher)
5663 		return 0;
5664 #if OPENSSL_VERSION_NUMBER >= 0x10101000L && !defined(LIBRESSL_VERSION_NUMBER)
5665 	return SSL_CIPHER_get_protocol_id(cipher);
5666 #else
5667 	return SSL_CIPHER_get_id(cipher) & 0xFFFF;
5668 #endif
5669 }
5670