xref: /freebsd/contrib/wpa/src/crypto/tls_internal.c (revision 4bc52338)
139beb93cSSam Leffler /*
2e28a4053SRui Paulo  * TLS interface functions and an internal TLS implementation
3*4bc52338SCy Schubert  * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
5f05cddf9SRui Paulo  * This software may be distributed under the terms of the BSD license.
6f05cddf9SRui Paulo  * See README for more details.
739beb93cSSam Leffler  *
839beb93cSSam Leffler  * This file interface functions for hostapd/wpa_supplicant to use the
939beb93cSSam Leffler  * integrated TLSv1 implementation.
1039beb93cSSam Leffler  */
1139beb93cSSam Leffler 
1239beb93cSSam Leffler #include "includes.h"
1339beb93cSSam Leffler 
1439beb93cSSam Leffler #include "common.h"
1539beb93cSSam Leffler #include "tls.h"
1639beb93cSSam Leffler #include "tls/tlsv1_client.h"
1739beb93cSSam Leffler #include "tls/tlsv1_server.h"
1839beb93cSSam Leffler 
1939beb93cSSam Leffler 
2039beb93cSSam Leffler static int tls_ref_count = 0;
2139beb93cSSam Leffler 
2239beb93cSSam Leffler struct tls_global {
2339beb93cSSam Leffler 	int server;
2439beb93cSSam Leffler 	struct tlsv1_credentials *server_cred;
2539beb93cSSam Leffler 	int check_crl;
26780fb4a2SCy Schubert 
27780fb4a2SCy Schubert 	void (*event_cb)(void *ctx, enum tls_event ev,
28780fb4a2SCy Schubert 			 union tls_event_data *data);
29780fb4a2SCy Schubert 	void *cb_ctx;
30780fb4a2SCy Schubert 	int cert_in_cb;
3139beb93cSSam Leffler };
3239beb93cSSam Leffler 
3339beb93cSSam Leffler struct tls_connection {
3439beb93cSSam Leffler 	struct tlsv1_client *client;
3539beb93cSSam Leffler 	struct tlsv1_server *server;
365b9c547cSRui Paulo 	struct tls_global *global;
3739beb93cSSam Leffler };
3839beb93cSSam Leffler 
3939beb93cSSam Leffler 
tls_init(const struct tls_config * conf)4039beb93cSSam Leffler void * tls_init(const struct tls_config *conf)
4139beb93cSSam Leffler {
4239beb93cSSam Leffler 	struct tls_global *global;
4339beb93cSSam Leffler 
4439beb93cSSam Leffler 	if (tls_ref_count == 0) {
4539beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
4639beb93cSSam Leffler 		if (tlsv1_client_global_init())
4739beb93cSSam Leffler 			return NULL;
4839beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
4939beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
5039beb93cSSam Leffler 		if (tlsv1_server_global_init())
5139beb93cSSam Leffler 			return NULL;
5239beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
5339beb93cSSam Leffler 	}
5439beb93cSSam Leffler 	tls_ref_count++;
5539beb93cSSam Leffler 
5639beb93cSSam Leffler 	global = os_zalloc(sizeof(*global));
5739beb93cSSam Leffler 	if (global == NULL)
5839beb93cSSam Leffler 		return NULL;
59780fb4a2SCy Schubert 	if (conf) {
60780fb4a2SCy Schubert 		global->event_cb = conf->event_cb;
61780fb4a2SCy Schubert 		global->cb_ctx = conf->cb_ctx;
62780fb4a2SCy Schubert 		global->cert_in_cb = conf->cert_in_cb;
63780fb4a2SCy Schubert 	}
6439beb93cSSam Leffler 
6539beb93cSSam Leffler 	return global;
6639beb93cSSam Leffler }
6739beb93cSSam Leffler 
tls_deinit(void * ssl_ctx)6839beb93cSSam Leffler void tls_deinit(void *ssl_ctx)
6939beb93cSSam Leffler {
7039beb93cSSam Leffler 	struct tls_global *global = ssl_ctx;
7139beb93cSSam Leffler 	tls_ref_count--;
7239beb93cSSam Leffler 	if (tls_ref_count == 0) {
7339beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
7439beb93cSSam Leffler 		tlsv1_client_global_deinit();
7539beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
7639beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
7739beb93cSSam Leffler 		tlsv1_server_global_deinit();
7839beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
7939beb93cSSam Leffler 	}
80780fb4a2SCy Schubert #ifdef CONFIG_TLS_INTERNAL_SERVER
81780fb4a2SCy Schubert 	tlsv1_cred_free(global->server_cred);
82780fb4a2SCy Schubert #endif /* CONFIG_TLS_INTERNAL_SERVER */
8339beb93cSSam Leffler 	os_free(global);
8439beb93cSSam Leffler }
8539beb93cSSam Leffler 
8639beb93cSSam Leffler 
tls_get_errors(void * tls_ctx)8739beb93cSSam Leffler int tls_get_errors(void *tls_ctx)
8839beb93cSSam Leffler {
8939beb93cSSam Leffler 	return 0;
9039beb93cSSam Leffler }
9139beb93cSSam Leffler 
9239beb93cSSam Leffler 
tls_connection_init(void * tls_ctx)9339beb93cSSam Leffler struct tls_connection * tls_connection_init(void *tls_ctx)
9439beb93cSSam Leffler {
9539beb93cSSam Leffler 	struct tls_connection *conn;
9639beb93cSSam Leffler 	struct tls_global *global = tls_ctx;
9739beb93cSSam Leffler 
9839beb93cSSam Leffler 	conn = os_zalloc(sizeof(*conn));
9939beb93cSSam Leffler 	if (conn == NULL)
10039beb93cSSam Leffler 		return NULL;
1015b9c547cSRui Paulo 	conn->global = global;
10239beb93cSSam Leffler 
10339beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
10439beb93cSSam Leffler 	if (!global->server) {
10539beb93cSSam Leffler 		conn->client = tlsv1_client_init();
10639beb93cSSam Leffler 		if (conn->client == NULL) {
10739beb93cSSam Leffler 			os_free(conn);
10839beb93cSSam Leffler 			return NULL;
10939beb93cSSam Leffler 		}
110780fb4a2SCy Schubert 		tlsv1_client_set_cb(conn->client, global->event_cb,
111780fb4a2SCy Schubert 				    global->cb_ctx, global->cert_in_cb);
11239beb93cSSam Leffler 	}
11339beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
11439beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
11539beb93cSSam Leffler 	if (global->server) {
11639beb93cSSam Leffler 		conn->server = tlsv1_server_init(global->server_cred);
11739beb93cSSam Leffler 		if (conn->server == NULL) {
11839beb93cSSam Leffler 			os_free(conn);
11939beb93cSSam Leffler 			return NULL;
12039beb93cSSam Leffler 		}
12139beb93cSSam Leffler 	}
12239beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
12339beb93cSSam Leffler 
12439beb93cSSam Leffler 	return conn;
12539beb93cSSam Leffler }
12639beb93cSSam Leffler 
12739beb93cSSam Leffler 
1285b9c547cSRui Paulo #ifdef CONFIG_TESTING_OPTIONS
1295b9c547cSRui Paulo #ifdef CONFIG_TLS_INTERNAL_SERVER
tls_connection_set_test_flags(struct tls_connection * conn,u32 flags)1305b9c547cSRui Paulo void tls_connection_set_test_flags(struct tls_connection *conn, u32 flags)
1315b9c547cSRui Paulo {
1325b9c547cSRui Paulo 	if (conn->server)
1335b9c547cSRui Paulo 		tlsv1_server_set_test_flags(conn->server, flags);
1345b9c547cSRui Paulo }
1355b9c547cSRui Paulo #endif /* CONFIG_TLS_INTERNAL_SERVER */
1365b9c547cSRui Paulo #endif /* CONFIG_TESTING_OPTIONS */
1375b9c547cSRui Paulo 
1385b9c547cSRui Paulo 
tls_connection_set_log_cb(struct tls_connection * conn,void (* log_cb)(void * ctx,const char * msg),void * ctx)1395b9c547cSRui Paulo void tls_connection_set_log_cb(struct tls_connection *conn,
1405b9c547cSRui Paulo 			       void (*log_cb)(void *ctx, const char *msg),
1415b9c547cSRui Paulo 			       void *ctx)
1425b9c547cSRui Paulo {
1435b9c547cSRui Paulo #ifdef CONFIG_TLS_INTERNAL_SERVER
1445b9c547cSRui Paulo 	if (conn->server)
1455b9c547cSRui Paulo 		tlsv1_server_set_log_cb(conn->server, log_cb, ctx);
1465b9c547cSRui Paulo #endif /* CONFIG_TLS_INTERNAL_SERVER */
1475b9c547cSRui Paulo }
1485b9c547cSRui Paulo 
1495b9c547cSRui Paulo 
tls_connection_deinit(void * tls_ctx,struct tls_connection * conn)15039beb93cSSam Leffler void tls_connection_deinit(void *tls_ctx, struct tls_connection *conn)
15139beb93cSSam Leffler {
15239beb93cSSam Leffler 	if (conn == NULL)
15339beb93cSSam Leffler 		return;
15439beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
15539beb93cSSam Leffler 	if (conn->client)
15639beb93cSSam Leffler 		tlsv1_client_deinit(conn->client);
15739beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
15839beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
15939beb93cSSam Leffler 	if (conn->server)
16039beb93cSSam Leffler 		tlsv1_server_deinit(conn->server);
16139beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
16239beb93cSSam Leffler 	os_free(conn);
16339beb93cSSam Leffler }
16439beb93cSSam Leffler 
16539beb93cSSam Leffler 
tls_connection_established(void * tls_ctx,struct tls_connection * conn)16639beb93cSSam Leffler int tls_connection_established(void *tls_ctx, struct tls_connection *conn)
16739beb93cSSam Leffler {
16839beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
16939beb93cSSam Leffler 	if (conn->client)
17039beb93cSSam Leffler 		return tlsv1_client_established(conn->client);
17139beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
17239beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
17339beb93cSSam Leffler 	if (conn->server)
17439beb93cSSam Leffler 		return tlsv1_server_established(conn->server);
17539beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
17639beb93cSSam Leffler 	return 0;
17739beb93cSSam Leffler }
17839beb93cSSam Leffler 
17939beb93cSSam Leffler 
tls_connection_peer_serial_num(void * tls_ctx,struct tls_connection * conn)18085732ac8SCy Schubert char * tls_connection_peer_serial_num(void *tls_ctx,
18185732ac8SCy Schubert 				      struct tls_connection *conn)
18285732ac8SCy Schubert {
18385732ac8SCy Schubert 	/* TODO */
18485732ac8SCy Schubert 	return NULL;
18585732ac8SCy Schubert }
18685732ac8SCy Schubert 
18785732ac8SCy Schubert 
tls_connection_shutdown(void * tls_ctx,struct tls_connection * conn)18839beb93cSSam Leffler int tls_connection_shutdown(void *tls_ctx, struct tls_connection *conn)
18939beb93cSSam Leffler {
19039beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
19139beb93cSSam Leffler 	if (conn->client)
19239beb93cSSam Leffler 		return tlsv1_client_shutdown(conn->client);
19339beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
19439beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
19539beb93cSSam Leffler 	if (conn->server)
19639beb93cSSam Leffler 		return tlsv1_server_shutdown(conn->server);
19739beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
19839beb93cSSam Leffler 	return -1;
19939beb93cSSam Leffler }
20039beb93cSSam Leffler 
20139beb93cSSam Leffler 
tls_connection_set_params(void * tls_ctx,struct tls_connection * conn,const struct tls_connection_params * params)20239beb93cSSam Leffler int tls_connection_set_params(void *tls_ctx, struct tls_connection *conn,
20339beb93cSSam Leffler 			      const struct tls_connection_params *params)
20439beb93cSSam Leffler {
20539beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
20639beb93cSSam Leffler 	struct tlsv1_credentials *cred;
20739beb93cSSam Leffler 
20839beb93cSSam Leffler 	if (conn->client == NULL)
20939beb93cSSam Leffler 		return -1;
21039beb93cSSam Leffler 
211780fb4a2SCy Schubert 	if (params->flags & TLS_CONN_EXT_CERT_CHECK) {
212780fb4a2SCy Schubert 		wpa_printf(MSG_INFO,
213780fb4a2SCy Schubert 			   "TLS: tls_ext_cert_check=1 not supported");
214780fb4a2SCy Schubert 		return -1;
215780fb4a2SCy Schubert 	}
216780fb4a2SCy Schubert 
21739beb93cSSam Leffler 	cred = tlsv1_cred_alloc();
21839beb93cSSam Leffler 	if (cred == NULL)
21939beb93cSSam Leffler 		return -1;
22039beb93cSSam Leffler 
2215b9c547cSRui Paulo 	if (params->subject_match) {
2225b9c547cSRui Paulo 		wpa_printf(MSG_INFO, "TLS: subject_match not supported");
223325151a3SRui Paulo 		tlsv1_cred_free(cred);
2245b9c547cSRui Paulo 		return -1;
2255b9c547cSRui Paulo 	}
2265b9c547cSRui Paulo 
2275b9c547cSRui Paulo 	if (params->altsubject_match) {
2285b9c547cSRui Paulo 		wpa_printf(MSG_INFO, "TLS: altsubject_match not supported");
229325151a3SRui Paulo 		tlsv1_cred_free(cred);
2305b9c547cSRui Paulo 		return -1;
2315b9c547cSRui Paulo 	}
2325b9c547cSRui Paulo 
2335b9c547cSRui Paulo 	if (params->suffix_match) {
2345b9c547cSRui Paulo 		wpa_printf(MSG_INFO, "TLS: suffix_match not supported");
235325151a3SRui Paulo 		tlsv1_cred_free(cred);
2365b9c547cSRui Paulo 		return -1;
2375b9c547cSRui Paulo 	}
2385b9c547cSRui Paulo 
2395b9c547cSRui Paulo 	if (params->domain_match) {
2405b9c547cSRui Paulo 		wpa_printf(MSG_INFO, "TLS: domain_match not supported");
241325151a3SRui Paulo 		tlsv1_cred_free(cred);
2425b9c547cSRui Paulo 		return -1;
2435b9c547cSRui Paulo 	}
2445b9c547cSRui Paulo 
2455b9c547cSRui Paulo 	if (params->openssl_ciphers) {
246325151a3SRui Paulo 		wpa_printf(MSG_INFO, "TLS: openssl_ciphers not supported");
247325151a3SRui Paulo 		tlsv1_cred_free(cred);
2485b9c547cSRui Paulo 		return -1;
2495b9c547cSRui Paulo 	}
2505b9c547cSRui Paulo 
251*4bc52338SCy Schubert 	if (params->openssl_ecdh_curves) {
252*4bc52338SCy Schubert 		wpa_printf(MSG_INFO, "TLS: openssl_ecdh_curves not supported");
253*4bc52338SCy Schubert 		tlsv1_cred_free(cred);
254*4bc52338SCy Schubert 		return -1;
255*4bc52338SCy Schubert 	}
256*4bc52338SCy Schubert 
25739beb93cSSam Leffler 	if (tlsv1_set_ca_cert(cred, params->ca_cert,
25839beb93cSSam Leffler 			      params->ca_cert_blob, params->ca_cert_blob_len,
25939beb93cSSam Leffler 			      params->ca_path)) {
26039beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to configure trusted CA "
26139beb93cSSam Leffler 			   "certificates");
26239beb93cSSam Leffler 		tlsv1_cred_free(cred);
26339beb93cSSam Leffler 		return -1;
26439beb93cSSam Leffler 	}
26539beb93cSSam Leffler 
26639beb93cSSam Leffler 	if (tlsv1_set_cert(cred, params->client_cert,
26739beb93cSSam Leffler 			   params->client_cert_blob,
26839beb93cSSam Leffler 			   params->client_cert_blob_len)) {
26939beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to configure client "
27039beb93cSSam Leffler 			   "certificate");
27139beb93cSSam Leffler 		tlsv1_cred_free(cred);
27239beb93cSSam Leffler 		return -1;
27339beb93cSSam Leffler 	}
27439beb93cSSam Leffler 
27539beb93cSSam Leffler 	if (tlsv1_set_private_key(cred, params->private_key,
27639beb93cSSam Leffler 				  params->private_key_passwd,
27739beb93cSSam Leffler 				  params->private_key_blob,
27839beb93cSSam Leffler 				  params->private_key_blob_len)) {
27939beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to load private key");
28039beb93cSSam Leffler 		tlsv1_cred_free(cred);
28139beb93cSSam Leffler 		return -1;
28239beb93cSSam Leffler 	}
28339beb93cSSam Leffler 
28439beb93cSSam Leffler 	if (tlsv1_set_dhparams(cred, params->dh_file, params->dh_blob,
28539beb93cSSam Leffler 			       params->dh_blob_len)) {
28639beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to load DH parameters");
28739beb93cSSam Leffler 		tlsv1_cred_free(cred);
28839beb93cSSam Leffler 		return -1;
28939beb93cSSam Leffler 	}
29039beb93cSSam Leffler 
29139beb93cSSam Leffler 	if (tlsv1_client_set_cred(conn->client, cred) < 0) {
29239beb93cSSam Leffler 		tlsv1_cred_free(cred);
29339beb93cSSam Leffler 		return -1;
29439beb93cSSam Leffler 	}
29539beb93cSSam Leffler 
296780fb4a2SCy Schubert 	tlsv1_client_set_flags(conn->client, params->flags);
297f05cddf9SRui Paulo 
29839beb93cSSam Leffler 	return 0;
29939beb93cSSam Leffler #else /* CONFIG_TLS_INTERNAL_CLIENT */
30039beb93cSSam Leffler 	return -1;
30139beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
30239beb93cSSam Leffler }
30339beb93cSSam Leffler 
30439beb93cSSam Leffler 
tls_global_set_params(void * tls_ctx,const struct tls_connection_params * params)30539beb93cSSam Leffler int tls_global_set_params(void *tls_ctx,
30639beb93cSSam Leffler 			  const struct tls_connection_params *params)
30739beb93cSSam Leffler {
30839beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
30939beb93cSSam Leffler 	struct tls_global *global = tls_ctx;
31039beb93cSSam Leffler 	struct tlsv1_credentials *cred;
31139beb93cSSam Leffler 
312*4bc52338SCy Schubert 	if (params->check_cert_subject)
313*4bc52338SCy Schubert 		return -1; /* not yet supported */
314*4bc52338SCy Schubert 
31539beb93cSSam Leffler 	/* Currently, global parameters are only set when running in server
31639beb93cSSam Leffler 	 * mode. */
31739beb93cSSam Leffler 	global->server = 1;
31839beb93cSSam Leffler 	tlsv1_cred_free(global->server_cred);
31939beb93cSSam Leffler 	global->server_cred = cred = tlsv1_cred_alloc();
32039beb93cSSam Leffler 	if (cred == NULL)
32139beb93cSSam Leffler 		return -1;
32239beb93cSSam Leffler 
32339beb93cSSam Leffler 	if (tlsv1_set_ca_cert(cred, params->ca_cert, params->ca_cert_blob,
32439beb93cSSam Leffler 			      params->ca_cert_blob_len, params->ca_path)) {
32539beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to configure trusted CA "
32639beb93cSSam Leffler 			   "certificates");
32739beb93cSSam Leffler 		return -1;
32839beb93cSSam Leffler 	}
32939beb93cSSam Leffler 
33039beb93cSSam Leffler 	if (tlsv1_set_cert(cred, params->client_cert, params->client_cert_blob,
33139beb93cSSam Leffler 			   params->client_cert_blob_len)) {
33239beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to configure server "
33339beb93cSSam Leffler 			   "certificate");
33439beb93cSSam Leffler 		return -1;
33539beb93cSSam Leffler 	}
33639beb93cSSam Leffler 
33739beb93cSSam Leffler 	if (tlsv1_set_private_key(cred, params->private_key,
33839beb93cSSam Leffler 				  params->private_key_passwd,
33939beb93cSSam Leffler 				  params->private_key_blob,
34039beb93cSSam Leffler 				  params->private_key_blob_len)) {
34139beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to load private key");
34239beb93cSSam Leffler 		return -1;
34339beb93cSSam Leffler 	}
34439beb93cSSam Leffler 
34539beb93cSSam Leffler 	if (tlsv1_set_dhparams(cred, params->dh_file, params->dh_blob,
34639beb93cSSam Leffler 			       params->dh_blob_len)) {
34739beb93cSSam Leffler 		wpa_printf(MSG_INFO, "TLS: Failed to load DH parameters");
34839beb93cSSam Leffler 		return -1;
34939beb93cSSam Leffler 	}
35039beb93cSSam Leffler 
351780fb4a2SCy Schubert 	if (params->ocsp_stapling_response)
352780fb4a2SCy Schubert 		cred->ocsp_stapling_response =
353780fb4a2SCy Schubert 			os_strdup(params->ocsp_stapling_response);
354780fb4a2SCy Schubert 	if (params->ocsp_stapling_response_multi)
355780fb4a2SCy Schubert 		cred->ocsp_stapling_response_multi =
356780fb4a2SCy Schubert 			os_strdup(params->ocsp_stapling_response_multi);
357780fb4a2SCy Schubert 
35839beb93cSSam Leffler 	return 0;
35939beb93cSSam Leffler #else /* CONFIG_TLS_INTERNAL_SERVER */
36039beb93cSSam Leffler 	return -1;
36139beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
36239beb93cSSam Leffler }
36339beb93cSSam Leffler 
36439beb93cSSam Leffler 
tls_global_set_verify(void * tls_ctx,int check_crl,int strict)365*4bc52338SCy Schubert int tls_global_set_verify(void *tls_ctx, int check_crl, int strict)
36639beb93cSSam Leffler {
36739beb93cSSam Leffler 	struct tls_global *global = tls_ctx;
36839beb93cSSam Leffler 	global->check_crl = check_crl;
36939beb93cSSam Leffler 	return 0;
37039beb93cSSam Leffler }
37139beb93cSSam Leffler 
37239beb93cSSam Leffler 
tls_connection_set_verify(void * tls_ctx,struct tls_connection * conn,int verify_peer,unsigned int flags,const u8 * session_ctx,size_t session_ctx_len)37339beb93cSSam Leffler int tls_connection_set_verify(void *tls_ctx, struct tls_connection *conn,
374325151a3SRui Paulo 			      int verify_peer, unsigned int flags,
375325151a3SRui Paulo 			      const u8 *session_ctx, size_t session_ctx_len)
37639beb93cSSam Leffler {
37739beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
37839beb93cSSam Leffler 	if (conn->server)
37939beb93cSSam Leffler 		return tlsv1_server_set_verify(conn->server, verify_peer);
38039beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
38139beb93cSSam Leffler 	return -1;
38239beb93cSSam Leffler }
38339beb93cSSam Leffler 
38439beb93cSSam Leffler 
tls_connection_get_random(void * tls_ctx,struct tls_connection * conn,struct tls_random * data)385325151a3SRui Paulo int tls_connection_get_random(void *tls_ctx, struct tls_connection *conn,
386325151a3SRui Paulo 			      struct tls_random *data)
38739beb93cSSam Leffler {
38839beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
38939beb93cSSam Leffler 	if (conn->client)
390325151a3SRui Paulo 		return tlsv1_client_get_random(conn->client, data);
39139beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
39239beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
39339beb93cSSam Leffler 	if (conn->server)
394325151a3SRui Paulo 		return tlsv1_server_get_random(conn->server, data);
395325151a3SRui Paulo #endif /* CONFIG_TLS_INTERNAL_SERVER */
396325151a3SRui Paulo 	return -1;
397325151a3SRui Paulo }
398325151a3SRui Paulo 
399325151a3SRui Paulo 
tls_get_keyblock_size(struct tls_connection * conn)400325151a3SRui Paulo static int tls_get_keyblock_size(struct tls_connection *conn)
401325151a3SRui Paulo {
402325151a3SRui Paulo #ifdef CONFIG_TLS_INTERNAL_CLIENT
403325151a3SRui Paulo 	if (conn->client)
404325151a3SRui Paulo 		return tlsv1_client_get_keyblock_size(conn->client);
405325151a3SRui Paulo #endif /* CONFIG_TLS_INTERNAL_CLIENT */
406325151a3SRui Paulo #ifdef CONFIG_TLS_INTERNAL_SERVER
407325151a3SRui Paulo 	if (conn->server)
408325151a3SRui Paulo 		return tlsv1_server_get_keyblock_size(conn->server);
40939beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
41039beb93cSSam Leffler 	return -1;
41139beb93cSSam Leffler }
41239beb93cSSam Leffler 
41339beb93cSSam Leffler 
tls_connection_prf(void * tls_ctx,struct tls_connection * conn,const char * label,const u8 * context,size_t context_len,int server_random_first,int skip_keyblock,u8 * out,size_t out_len)414780fb4a2SCy Schubert static int tls_connection_prf(void *tls_ctx, struct tls_connection *conn,
415*4bc52338SCy Schubert 			      const char *label, const u8 *context,
416*4bc52338SCy Schubert 			      size_t context_len, int server_random_first,
417325151a3SRui Paulo 			      int skip_keyblock, u8 *out, size_t out_len)
41839beb93cSSam Leffler {
419325151a3SRui Paulo 	int ret = -1, skip = 0;
420325151a3SRui Paulo 	u8 *tmp_out = NULL;
421325151a3SRui Paulo 	u8 *_out = out;
422325151a3SRui Paulo 
423325151a3SRui Paulo 	if (skip_keyblock) {
424325151a3SRui Paulo 		skip = tls_get_keyblock_size(conn);
425325151a3SRui Paulo 		if (skip < 0)
426325151a3SRui Paulo 			return -1;
427325151a3SRui Paulo 		tmp_out = os_malloc(skip + out_len);
428325151a3SRui Paulo 		if (!tmp_out)
429325151a3SRui Paulo 			return -1;
430325151a3SRui Paulo 		_out = tmp_out;
431325151a3SRui Paulo 	}
432325151a3SRui Paulo 
43339beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
43439beb93cSSam Leffler 	if (conn->client) {
435*4bc52338SCy Schubert 		ret = tlsv1_client_prf(conn->client, label, context,
436*4bc52338SCy Schubert 				       context_len, server_random_first,
437780fb4a2SCy Schubert 				       _out, skip + out_len);
43839beb93cSSam Leffler 	}
43939beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
44039beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
44139beb93cSSam Leffler 	if (conn->server) {
442*4bc52338SCy Schubert 		ret = tlsv1_server_prf(conn->server, label, context,
443*4bc52338SCy Schubert 				       context_len, server_random_first,
444780fb4a2SCy Schubert 				       _out, skip + out_len);
44539beb93cSSam Leffler 	}
44639beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
447325151a3SRui Paulo 	if (ret == 0 && skip_keyblock)
448325151a3SRui Paulo 		os_memcpy(out, _out + skip, out_len);
449325151a3SRui Paulo 	bin_clear_free(tmp_out, skip);
450325151a3SRui Paulo 
451325151a3SRui Paulo 	return ret;
45239beb93cSSam Leffler }
45339beb93cSSam Leffler 
45439beb93cSSam Leffler 
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)455780fb4a2SCy Schubert int tls_connection_export_key(void *tls_ctx, struct tls_connection *conn,
456*4bc52338SCy Schubert 			      const char *label, const u8 *context,
457*4bc52338SCy Schubert 			      size_t context_len, u8 *out, size_t out_len)
458780fb4a2SCy Schubert {
459*4bc52338SCy Schubert 	return tls_connection_prf(tls_ctx, conn, label, context, context_len,
460*4bc52338SCy Schubert 				  0, 0, out, out_len);
461780fb4a2SCy Schubert }
462780fb4a2SCy Schubert 
463780fb4a2SCy Schubert 
tls_connection_get_eap_fast_key(void * tls_ctx,struct tls_connection * conn,u8 * out,size_t out_len)464780fb4a2SCy Schubert int tls_connection_get_eap_fast_key(void *tls_ctx, struct tls_connection *conn,
465780fb4a2SCy Schubert 				    u8 *out, size_t out_len)
466780fb4a2SCy Schubert {
467*4bc52338SCy Schubert 	return tls_connection_prf(tls_ctx, conn, "key expansion", NULL, 0,
468*4bc52338SCy Schubert 				  1, 1, out, out_len);
469780fb4a2SCy Schubert }
470780fb4a2SCy Schubert 
471780fb4a2SCy Schubert 
tls_connection_handshake(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data)472e28a4053SRui Paulo struct wpabuf * tls_connection_handshake(void *tls_ctx,
473e28a4053SRui Paulo 					 struct tls_connection *conn,
474e28a4053SRui Paulo 					 const struct wpabuf *in_data,
475e28a4053SRui Paulo 					 struct wpabuf **appl_data)
47639beb93cSSam Leffler {
477f05cddf9SRui Paulo 	return tls_connection_handshake2(tls_ctx, conn, in_data, appl_data,
478f05cddf9SRui Paulo 					 NULL);
479f05cddf9SRui Paulo }
480f05cddf9SRui Paulo 
481f05cddf9SRui Paulo 
tls_connection_handshake2(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data,int * need_more_data)482f05cddf9SRui Paulo struct wpabuf * tls_connection_handshake2(void *tls_ctx,
483f05cddf9SRui Paulo 					  struct tls_connection *conn,
484f05cddf9SRui Paulo 					  const struct wpabuf *in_data,
485f05cddf9SRui Paulo 					  struct wpabuf **appl_data,
486f05cddf9SRui Paulo 					  int *need_more_data)
487f05cddf9SRui Paulo {
48839beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
489e28a4053SRui Paulo 	u8 *res, *ad;
490e28a4053SRui Paulo 	size_t res_len, ad_len;
491e28a4053SRui Paulo 	struct wpabuf *out;
492e28a4053SRui Paulo 
49339beb93cSSam Leffler 	if (conn->client == NULL)
49439beb93cSSam Leffler 		return NULL;
49539beb93cSSam Leffler 
496e28a4053SRui Paulo 	ad = NULL;
497e28a4053SRui Paulo 	res = tlsv1_client_handshake(conn->client,
498e28a4053SRui Paulo 				     in_data ? wpabuf_head(in_data) : NULL,
499e28a4053SRui Paulo 				     in_data ? wpabuf_len(in_data) : 0,
500f05cddf9SRui Paulo 				     &res_len, &ad, &ad_len, need_more_data);
501e28a4053SRui Paulo 	if (res == NULL)
502e28a4053SRui Paulo 		return NULL;
503e28a4053SRui Paulo 	out = wpabuf_alloc_ext_data(res, res_len);
504e28a4053SRui Paulo 	if (out == NULL) {
505e28a4053SRui Paulo 		os_free(res);
506e28a4053SRui Paulo 		os_free(ad);
507e28a4053SRui Paulo 		return NULL;
508e28a4053SRui Paulo 	}
509e28a4053SRui Paulo 	if (appl_data) {
510e28a4053SRui Paulo 		if (ad) {
511e28a4053SRui Paulo 			*appl_data = wpabuf_alloc_ext_data(ad, ad_len);
512e28a4053SRui Paulo 			if (*appl_data == NULL)
513e28a4053SRui Paulo 				os_free(ad);
514e28a4053SRui Paulo 		} else
51539beb93cSSam Leffler 			*appl_data = NULL;
516e28a4053SRui Paulo 	} else
517e28a4053SRui Paulo 		os_free(ad);
51839beb93cSSam Leffler 
519e28a4053SRui Paulo 	return out;
52039beb93cSSam Leffler #else /* CONFIG_TLS_INTERNAL_CLIENT */
52139beb93cSSam Leffler 	return NULL;
52239beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
52339beb93cSSam Leffler }
52439beb93cSSam Leffler 
52539beb93cSSam Leffler 
tls_connection_server_handshake(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data)526e28a4053SRui Paulo struct wpabuf * tls_connection_server_handshake(void *tls_ctx,
52739beb93cSSam Leffler 						struct tls_connection *conn,
528e28a4053SRui Paulo 						const struct wpabuf *in_data,
529e28a4053SRui Paulo 						struct wpabuf **appl_data)
53039beb93cSSam Leffler {
53139beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
532e28a4053SRui Paulo 	u8 *res;
533e28a4053SRui Paulo 	size_t res_len;
534e28a4053SRui Paulo 	struct wpabuf *out;
535e28a4053SRui Paulo 
53639beb93cSSam Leffler 	if (conn->server == NULL)
53739beb93cSSam Leffler 		return NULL;
53839beb93cSSam Leffler 
539e28a4053SRui Paulo 	if (appl_data)
540e28a4053SRui Paulo 		*appl_data = NULL;
541e28a4053SRui Paulo 
542e28a4053SRui Paulo 	res = tlsv1_server_handshake(conn->server, wpabuf_head(in_data),
543e28a4053SRui Paulo 				     wpabuf_len(in_data), &res_len);
544e28a4053SRui Paulo 	if (res == NULL && tlsv1_server_established(conn->server))
545e28a4053SRui Paulo 		return wpabuf_alloc(0);
546e28a4053SRui Paulo 	if (res == NULL)
547e28a4053SRui Paulo 		return NULL;
548e28a4053SRui Paulo 	out = wpabuf_alloc_ext_data(res, res_len);
549e28a4053SRui Paulo 	if (out == NULL) {
550e28a4053SRui Paulo 		os_free(res);
551e28a4053SRui Paulo 		return NULL;
55239beb93cSSam Leffler 	}
553e28a4053SRui Paulo 
55439beb93cSSam Leffler 	return out;
55539beb93cSSam Leffler #else /* CONFIG_TLS_INTERNAL_SERVER */
55639beb93cSSam Leffler 	return NULL;
55739beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
55839beb93cSSam Leffler }
55939beb93cSSam Leffler 
56039beb93cSSam Leffler 
tls_connection_encrypt(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data)561e28a4053SRui Paulo struct wpabuf * tls_connection_encrypt(void *tls_ctx,
562e28a4053SRui Paulo 				       struct tls_connection *conn,
563e28a4053SRui Paulo 				       const struct wpabuf *in_data)
56439beb93cSSam Leffler {
56539beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
56639beb93cSSam Leffler 	if (conn->client) {
567e28a4053SRui Paulo 		struct wpabuf *buf;
568e28a4053SRui Paulo 		int res;
569e28a4053SRui Paulo 		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
570e28a4053SRui Paulo 		if (buf == NULL)
571e28a4053SRui Paulo 			return NULL;
572e28a4053SRui Paulo 		res = tlsv1_client_encrypt(conn->client, wpabuf_head(in_data),
573e28a4053SRui Paulo 					   wpabuf_len(in_data),
574e28a4053SRui Paulo 					   wpabuf_mhead(buf),
575e28a4053SRui Paulo 					   wpabuf_size(buf));
576e28a4053SRui Paulo 		if (res < 0) {
577e28a4053SRui Paulo 			wpabuf_free(buf);
578e28a4053SRui Paulo 			return NULL;
579e28a4053SRui Paulo 		}
580e28a4053SRui Paulo 		wpabuf_put(buf, res);
581e28a4053SRui Paulo 		return buf;
58239beb93cSSam Leffler 	}
58339beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
58439beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
58539beb93cSSam Leffler 	if (conn->server) {
586e28a4053SRui Paulo 		struct wpabuf *buf;
587e28a4053SRui Paulo 		int res;
588e28a4053SRui Paulo 		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
589e28a4053SRui Paulo 		if (buf == NULL)
590e28a4053SRui Paulo 			return NULL;
591e28a4053SRui Paulo 		res = tlsv1_server_encrypt(conn->server, wpabuf_head(in_data),
592e28a4053SRui Paulo 					   wpabuf_len(in_data),
593e28a4053SRui Paulo 					   wpabuf_mhead(buf),
594e28a4053SRui Paulo 					   wpabuf_size(buf));
595e28a4053SRui Paulo 		if (res < 0) {
596e28a4053SRui Paulo 			wpabuf_free(buf);
597e28a4053SRui Paulo 			return NULL;
598e28a4053SRui Paulo 		}
599e28a4053SRui Paulo 		wpabuf_put(buf, res);
600e28a4053SRui Paulo 		return buf;
60139beb93cSSam Leffler 	}
60239beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
603e28a4053SRui Paulo 	return NULL;
60439beb93cSSam Leffler }
60539beb93cSSam Leffler 
60639beb93cSSam Leffler 
tls_connection_decrypt(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data)607e28a4053SRui Paulo struct wpabuf * tls_connection_decrypt(void *tls_ctx,
608e28a4053SRui Paulo 				       struct tls_connection *conn,
609e28a4053SRui Paulo 				       const struct wpabuf *in_data)
61039beb93cSSam Leffler {
611f05cddf9SRui Paulo 	return tls_connection_decrypt2(tls_ctx, conn, in_data, NULL);
612f05cddf9SRui Paulo }
613f05cddf9SRui Paulo 
614f05cddf9SRui Paulo 
tls_connection_decrypt2(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,int * need_more_data)615f05cddf9SRui Paulo struct wpabuf * tls_connection_decrypt2(void *tls_ctx,
616f05cddf9SRui Paulo 					struct tls_connection *conn,
617f05cddf9SRui Paulo 					const struct wpabuf *in_data,
618f05cddf9SRui Paulo 					int *need_more_data)
619f05cddf9SRui Paulo {
620f05cddf9SRui Paulo 	if (need_more_data)
621f05cddf9SRui Paulo 		*need_more_data = 0;
622f05cddf9SRui Paulo 
62339beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
62439beb93cSSam Leffler 	if (conn->client) {
625f05cddf9SRui Paulo 		return tlsv1_client_decrypt(conn->client, wpabuf_head(in_data),
626e28a4053SRui Paulo 					    wpabuf_len(in_data),
627f05cddf9SRui Paulo 					    need_more_data);
62839beb93cSSam Leffler 	}
62939beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
63039beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
63139beb93cSSam Leffler 	if (conn->server) {
632e28a4053SRui Paulo 		struct wpabuf *buf;
633e28a4053SRui Paulo 		int res;
634e28a4053SRui Paulo 		buf = wpabuf_alloc((wpabuf_len(in_data) + 500) * 3);
635e28a4053SRui Paulo 		if (buf == NULL)
636e28a4053SRui Paulo 			return NULL;
637e28a4053SRui Paulo 		res = tlsv1_server_decrypt(conn->server, wpabuf_head(in_data),
638e28a4053SRui Paulo 					   wpabuf_len(in_data),
639e28a4053SRui Paulo 					   wpabuf_mhead(buf),
640e28a4053SRui Paulo 					   wpabuf_size(buf));
641e28a4053SRui Paulo 		if (res < 0) {
642e28a4053SRui Paulo 			wpabuf_free(buf);
643e28a4053SRui Paulo 			return NULL;
644e28a4053SRui Paulo 		}
645e28a4053SRui Paulo 		wpabuf_put(buf, res);
646e28a4053SRui Paulo 		return buf;
64739beb93cSSam Leffler 	}
64839beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
649e28a4053SRui Paulo 	return NULL;
65039beb93cSSam Leffler }
65139beb93cSSam Leffler 
65239beb93cSSam Leffler 
tls_connection_resumed(void * tls_ctx,struct tls_connection * conn)65339beb93cSSam Leffler int tls_connection_resumed(void *tls_ctx, struct tls_connection *conn)
65439beb93cSSam Leffler {
65539beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
65639beb93cSSam Leffler 	if (conn->client)
65739beb93cSSam Leffler 		return tlsv1_client_resumed(conn->client);
65839beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
65939beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
66039beb93cSSam Leffler 	if (conn->server)
66139beb93cSSam Leffler 		return tlsv1_server_resumed(conn->server);
66239beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
66339beb93cSSam Leffler 	return -1;
66439beb93cSSam Leffler }
66539beb93cSSam Leffler 
66639beb93cSSam Leffler 
tls_connection_set_cipher_list(void * tls_ctx,struct tls_connection * conn,u8 * ciphers)66739beb93cSSam Leffler int tls_connection_set_cipher_list(void *tls_ctx, struct tls_connection *conn,
66839beb93cSSam Leffler 				   u8 *ciphers)
66939beb93cSSam Leffler {
67039beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
67139beb93cSSam Leffler 	if (conn->client)
67239beb93cSSam Leffler 		return tlsv1_client_set_cipher_list(conn->client, ciphers);
67339beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
67439beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
67539beb93cSSam Leffler 	if (conn->server)
67639beb93cSSam Leffler 		return tlsv1_server_set_cipher_list(conn->server, ciphers);
67739beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
67839beb93cSSam Leffler 	return -1;
67939beb93cSSam Leffler }
68039beb93cSSam Leffler 
68139beb93cSSam Leffler 
tls_get_version(void * ssl_ctx,struct tls_connection * conn,char * buf,size_t buflen)682325151a3SRui Paulo int tls_get_version(void *ssl_ctx, struct tls_connection *conn,
683325151a3SRui Paulo 		    char *buf, size_t buflen)
684325151a3SRui Paulo {
685780fb4a2SCy Schubert 	if (conn == NULL)
686780fb4a2SCy Schubert 		return -1;
687780fb4a2SCy Schubert #ifdef CONFIG_TLS_INTERNAL_CLIENT
688780fb4a2SCy Schubert 	if (conn->client)
689780fb4a2SCy Schubert 		return tlsv1_client_get_version(conn->client, buf, buflen);
690780fb4a2SCy Schubert #endif /* CONFIG_TLS_INTERNAL_CLIENT */
691325151a3SRui Paulo 	return -1;
692325151a3SRui Paulo }
693325151a3SRui Paulo 
694325151a3SRui Paulo 
tls_get_cipher(void * tls_ctx,struct tls_connection * conn,char * buf,size_t buflen)69539beb93cSSam Leffler int tls_get_cipher(void *tls_ctx, struct tls_connection *conn,
69639beb93cSSam Leffler 		   char *buf, size_t buflen)
69739beb93cSSam Leffler {
69839beb93cSSam Leffler 	if (conn == NULL)
69939beb93cSSam Leffler 		return -1;
70039beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
70139beb93cSSam Leffler 	if (conn->client)
70239beb93cSSam Leffler 		return tlsv1_client_get_cipher(conn->client, buf, buflen);
70339beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
70439beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
70539beb93cSSam Leffler 	if (conn->server)
70639beb93cSSam Leffler 		return tlsv1_server_get_cipher(conn->server, buf, buflen);
70739beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
70839beb93cSSam Leffler 	return -1;
70939beb93cSSam Leffler }
71039beb93cSSam Leffler 
71139beb93cSSam Leffler 
tls_connection_enable_workaround(void * tls_ctx,struct tls_connection * conn)71239beb93cSSam Leffler int tls_connection_enable_workaround(void *tls_ctx,
71339beb93cSSam Leffler 				     struct tls_connection *conn)
71439beb93cSSam Leffler {
71539beb93cSSam Leffler 	return -1;
71639beb93cSSam Leffler }
71739beb93cSSam Leffler 
71839beb93cSSam Leffler 
tls_connection_client_hello_ext(void * tls_ctx,struct tls_connection * conn,int ext_type,const u8 * data,size_t data_len)71939beb93cSSam Leffler int tls_connection_client_hello_ext(void *tls_ctx, struct tls_connection *conn,
72039beb93cSSam Leffler 				    int ext_type, const u8 *data,
72139beb93cSSam Leffler 				    size_t data_len)
72239beb93cSSam Leffler {
72339beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
72439beb93cSSam Leffler 	if (conn->client) {
72539beb93cSSam Leffler 		return tlsv1_client_hello_ext(conn->client, ext_type,
72639beb93cSSam Leffler 					      data, data_len);
72739beb93cSSam Leffler 	}
72839beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
72939beb93cSSam Leffler 	return -1;
73039beb93cSSam Leffler }
73139beb93cSSam Leffler 
73239beb93cSSam Leffler 
tls_connection_get_failed(void * tls_ctx,struct tls_connection * conn)73339beb93cSSam Leffler int tls_connection_get_failed(void *tls_ctx, struct tls_connection *conn)
73439beb93cSSam Leffler {
735*4bc52338SCy Schubert #ifdef CONFIG_TLS_INTERNAL_SERVER
736*4bc52338SCy Schubert 	if (conn->server)
737*4bc52338SCy Schubert 		return tlsv1_server_get_failed(conn->server);
738*4bc52338SCy Schubert #endif /* CONFIG_TLS_INTERNAL_SERVER */
73939beb93cSSam Leffler 	return 0;
74039beb93cSSam Leffler }
74139beb93cSSam Leffler 
74239beb93cSSam Leffler 
tls_connection_get_read_alerts(void * tls_ctx,struct tls_connection * conn)74339beb93cSSam Leffler int tls_connection_get_read_alerts(void *tls_ctx, struct tls_connection *conn)
74439beb93cSSam Leffler {
745*4bc52338SCy Schubert #ifdef CONFIG_TLS_INTERNAL_SERVER
746*4bc52338SCy Schubert 	if (conn->server)
747*4bc52338SCy Schubert 		return tlsv1_server_get_read_alerts(conn->server);
748*4bc52338SCy Schubert #endif /* CONFIG_TLS_INTERNAL_SERVER */
74939beb93cSSam Leffler 	return 0;
75039beb93cSSam Leffler }
75139beb93cSSam Leffler 
75239beb93cSSam Leffler 
tls_connection_get_write_alerts(void * tls_ctx,struct tls_connection * conn)75339beb93cSSam Leffler int tls_connection_get_write_alerts(void *tls_ctx,
75439beb93cSSam Leffler 				    struct tls_connection *conn)
75539beb93cSSam Leffler {
756*4bc52338SCy Schubert #ifdef CONFIG_TLS_INTERNAL_SERVER
757*4bc52338SCy Schubert 	if (conn->server)
758*4bc52338SCy Schubert 		return tlsv1_server_get_write_alerts(conn->server);
759*4bc52338SCy Schubert #endif /* CONFIG_TLS_INTERNAL_SERVER */
76039beb93cSSam Leffler 	return 0;
76139beb93cSSam Leffler }
76239beb93cSSam Leffler 
76339beb93cSSam Leffler 
tls_connection_set_session_ticket_cb(void * tls_ctx,struct tls_connection * conn,tls_session_ticket_cb cb,void * ctx)76439beb93cSSam Leffler int tls_connection_set_session_ticket_cb(void *tls_ctx,
76539beb93cSSam Leffler 					 struct tls_connection *conn,
76639beb93cSSam Leffler 					 tls_session_ticket_cb cb,
76739beb93cSSam Leffler 					 void *ctx)
76839beb93cSSam Leffler {
76939beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_CLIENT
77039beb93cSSam Leffler 	if (conn->client) {
77139beb93cSSam Leffler 		tlsv1_client_set_session_ticket_cb(conn->client, cb, ctx);
77239beb93cSSam Leffler 		return 0;
77339beb93cSSam Leffler 	}
77439beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_CLIENT */
77539beb93cSSam Leffler #ifdef CONFIG_TLS_INTERNAL_SERVER
77639beb93cSSam Leffler 	if (conn->server) {
77739beb93cSSam Leffler 		tlsv1_server_set_session_ticket_cb(conn->server, cb, ctx);
77839beb93cSSam Leffler 		return 0;
77939beb93cSSam Leffler 	}
78039beb93cSSam Leffler #endif /* CONFIG_TLS_INTERNAL_SERVER */
78139beb93cSSam Leffler 	return -1;
78239beb93cSSam Leffler }
7835b9c547cSRui Paulo 
7845b9c547cSRui Paulo 
tls_get_library_version(char * buf,size_t buf_len)7855b9c547cSRui Paulo int tls_get_library_version(char *buf, size_t buf_len)
7865b9c547cSRui Paulo {
7875b9c547cSRui Paulo 	return os_snprintf(buf, buf_len, "internal");
7885b9c547cSRui Paulo }
789325151a3SRui Paulo 
790325151a3SRui Paulo 
tls_connection_set_success_data(struct tls_connection * conn,struct wpabuf * data)791325151a3SRui Paulo void tls_connection_set_success_data(struct tls_connection *conn,
792325151a3SRui Paulo 				     struct wpabuf *data)
793325151a3SRui Paulo {
794325151a3SRui Paulo }
795325151a3SRui Paulo 
796325151a3SRui Paulo 
tls_connection_set_success_data_resumed(struct tls_connection * conn)797325151a3SRui Paulo void tls_connection_set_success_data_resumed(struct tls_connection *conn)
798325151a3SRui Paulo {
799325151a3SRui Paulo }
800325151a3SRui Paulo 
801325151a3SRui Paulo 
802325151a3SRui Paulo const struct wpabuf *
tls_connection_get_success_data(struct tls_connection * conn)803325151a3SRui Paulo tls_connection_get_success_data(struct tls_connection *conn)
804325151a3SRui Paulo {
805325151a3SRui Paulo 	return NULL;
806325151a3SRui Paulo }
807325151a3SRui Paulo 
808325151a3SRui Paulo 
tls_connection_remove_session(struct tls_connection * conn)809325151a3SRui Paulo void tls_connection_remove_session(struct tls_connection *conn)
810325151a3SRui Paulo {
811325151a3SRui Paulo }
812