16d49e1aeSJan Lentfer /*
23ff40c12SJohn Marino  * TLS interface functions and an internal TLS implementation
3*a1157835SDaniel Fojt  * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
46d49e1aeSJan Lentfer  *
53ff40c12SJohn Marino  * This software may be distributed under the terms of the BSD license.
63ff40c12SJohn Marino  * See README for more details.
76d49e1aeSJan Lentfer  *
86d49e1aeSJan Lentfer  * This file interface functions for hostapd/wpa_supplicant to use the
96d49e1aeSJan Lentfer  * integrated TLSv1 implementation.
106d49e1aeSJan Lentfer  */
116d49e1aeSJan Lentfer 
126d49e1aeSJan Lentfer #include "includes.h"
136d49e1aeSJan Lentfer 
146d49e1aeSJan Lentfer #include "common.h"
156d49e1aeSJan Lentfer #include "tls.h"
166d49e1aeSJan Lentfer #include "tls/tlsv1_client.h"
176d49e1aeSJan Lentfer #include "tls/tlsv1_server.h"
186d49e1aeSJan Lentfer 
196d49e1aeSJan Lentfer 
206d49e1aeSJan Lentfer static int tls_ref_count = 0;
216d49e1aeSJan Lentfer 
226d49e1aeSJan Lentfer struct tls_global {
236d49e1aeSJan Lentfer 	int server;
246d49e1aeSJan Lentfer 	struct tlsv1_credentials *server_cred;
256d49e1aeSJan Lentfer 	int check_crl;
26*a1157835SDaniel Fojt 
27*a1157835SDaniel Fojt 	void (*event_cb)(void *ctx, enum tls_event ev,
28*a1157835SDaniel Fojt 			 union tls_event_data *data);
29*a1157835SDaniel Fojt 	void *cb_ctx;
30*a1157835SDaniel Fojt 	int cert_in_cb;
316d49e1aeSJan Lentfer };
326d49e1aeSJan Lentfer 
336d49e1aeSJan Lentfer struct tls_connection {
346d49e1aeSJan Lentfer 	struct tlsv1_client *client;
356d49e1aeSJan Lentfer 	struct tlsv1_server *server;
36*a1157835SDaniel Fojt 	struct tls_global *global;
376d49e1aeSJan Lentfer };
386d49e1aeSJan Lentfer 
396d49e1aeSJan Lentfer 
tls_init(const struct tls_config * conf)406d49e1aeSJan Lentfer void * tls_init(const struct tls_config *conf)
416d49e1aeSJan Lentfer {
426d49e1aeSJan Lentfer 	struct tls_global *global;
436d49e1aeSJan Lentfer 
446d49e1aeSJan Lentfer 	if (tls_ref_count == 0) {
456d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
466d49e1aeSJan Lentfer 		if (tlsv1_client_global_init())
476d49e1aeSJan Lentfer 			return NULL;
486d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
496d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
506d49e1aeSJan Lentfer 		if (tlsv1_server_global_init())
516d49e1aeSJan Lentfer 			return NULL;
526d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
536d49e1aeSJan Lentfer 	}
546d49e1aeSJan Lentfer 	tls_ref_count++;
556d49e1aeSJan Lentfer 
566d49e1aeSJan Lentfer 	global = os_zalloc(sizeof(*global));
576d49e1aeSJan Lentfer 	if (global == NULL)
586d49e1aeSJan Lentfer 		return NULL;
59*a1157835SDaniel Fojt 	if (conf) {
60*a1157835SDaniel Fojt 		global->event_cb = conf->event_cb;
61*a1157835SDaniel Fojt 		global->cb_ctx = conf->cb_ctx;
62*a1157835SDaniel Fojt 		global->cert_in_cb = conf->cert_in_cb;
63*a1157835SDaniel Fojt 	}
646d49e1aeSJan Lentfer 
656d49e1aeSJan Lentfer 	return global;
666d49e1aeSJan Lentfer }
676d49e1aeSJan Lentfer 
tls_deinit(void * ssl_ctx)686d49e1aeSJan Lentfer void tls_deinit(void *ssl_ctx)
696d49e1aeSJan Lentfer {
706d49e1aeSJan Lentfer 	struct tls_global *global = ssl_ctx;
716d49e1aeSJan Lentfer 	tls_ref_count--;
726d49e1aeSJan Lentfer 	if (tls_ref_count == 0) {
736d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
746d49e1aeSJan Lentfer 		tlsv1_client_global_deinit();
756d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
766d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
776d49e1aeSJan Lentfer 		tlsv1_server_global_deinit();
786d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
796d49e1aeSJan Lentfer 	}
80*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_SERVER
81*a1157835SDaniel Fojt 	tlsv1_cred_free(global->server_cred);
82*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_SERVER */
836d49e1aeSJan Lentfer 	os_free(global);
846d49e1aeSJan Lentfer }
856d49e1aeSJan Lentfer 
866d49e1aeSJan Lentfer 
tls_get_errors(void * tls_ctx)876d49e1aeSJan Lentfer int tls_get_errors(void *tls_ctx)
886d49e1aeSJan Lentfer {
896d49e1aeSJan Lentfer 	return 0;
906d49e1aeSJan Lentfer }
916d49e1aeSJan Lentfer 
926d49e1aeSJan Lentfer 
tls_connection_init(void * tls_ctx)936d49e1aeSJan Lentfer struct tls_connection * tls_connection_init(void *tls_ctx)
946d49e1aeSJan Lentfer {
956d49e1aeSJan Lentfer 	struct tls_connection *conn;
966d49e1aeSJan Lentfer 	struct tls_global *global = tls_ctx;
976d49e1aeSJan Lentfer 
986d49e1aeSJan Lentfer 	conn = os_zalloc(sizeof(*conn));
996d49e1aeSJan Lentfer 	if (conn == NULL)
1006d49e1aeSJan Lentfer 		return NULL;
101*a1157835SDaniel Fojt 	conn->global = global;
1026d49e1aeSJan Lentfer 
1036d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
1046d49e1aeSJan Lentfer 	if (!global->server) {
1056d49e1aeSJan Lentfer 		conn->client = tlsv1_client_init();
1066d49e1aeSJan Lentfer 		if (conn->client == NULL) {
1076d49e1aeSJan Lentfer 			os_free(conn);
1086d49e1aeSJan Lentfer 			return NULL;
1096d49e1aeSJan Lentfer 		}
110*a1157835SDaniel Fojt 		tlsv1_client_set_cb(conn->client, global->event_cb,
111*a1157835SDaniel Fojt 				    global->cb_ctx, global->cert_in_cb);
1126d49e1aeSJan Lentfer 	}
1136d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
1146d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
1156d49e1aeSJan Lentfer 	if (global->server) {
1166d49e1aeSJan Lentfer 		conn->server = tlsv1_server_init(global->server_cred);
1176d49e1aeSJan Lentfer 		if (conn->server == NULL) {
1186d49e1aeSJan Lentfer 			os_free(conn);
1196d49e1aeSJan Lentfer 			return NULL;
1206d49e1aeSJan Lentfer 		}
1216d49e1aeSJan Lentfer 	}
1226d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
1236d49e1aeSJan Lentfer 
1246d49e1aeSJan Lentfer 	return conn;
1256d49e1aeSJan Lentfer }
1266d49e1aeSJan Lentfer 
1276d49e1aeSJan Lentfer 
128*a1157835SDaniel Fojt #ifdef CONFIG_TESTING_OPTIONS
129*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_SERVER
tls_connection_set_test_flags(struct tls_connection * conn,u32 flags)130*a1157835SDaniel Fojt void tls_connection_set_test_flags(struct tls_connection *conn, u32 flags)
131*a1157835SDaniel Fojt {
132*a1157835SDaniel Fojt 	if (conn->server)
133*a1157835SDaniel Fojt 		tlsv1_server_set_test_flags(conn->server, flags);
134*a1157835SDaniel Fojt }
135*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_SERVER */
136*a1157835SDaniel Fojt #endif /* CONFIG_TESTING_OPTIONS */
137*a1157835SDaniel Fojt 
138*a1157835SDaniel Fojt 
tls_connection_set_log_cb(struct tls_connection * conn,void (* log_cb)(void * ctx,const char * msg),void * ctx)139*a1157835SDaniel Fojt void tls_connection_set_log_cb(struct tls_connection *conn,
140*a1157835SDaniel Fojt 			       void (*log_cb)(void *ctx, const char *msg),
141*a1157835SDaniel Fojt 			       void *ctx)
142*a1157835SDaniel Fojt {
143*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_SERVER
144*a1157835SDaniel Fojt 	if (conn->server)
145*a1157835SDaniel Fojt 		tlsv1_server_set_log_cb(conn->server, log_cb, ctx);
146*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_SERVER */
147*a1157835SDaniel Fojt }
148*a1157835SDaniel Fojt 
149*a1157835SDaniel Fojt 
tls_connection_deinit(void * tls_ctx,struct tls_connection * conn)1506d49e1aeSJan Lentfer void tls_connection_deinit(void *tls_ctx, struct tls_connection *conn)
1516d49e1aeSJan Lentfer {
1526d49e1aeSJan Lentfer 	if (conn == NULL)
1536d49e1aeSJan Lentfer 		return;
1546d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
1556d49e1aeSJan Lentfer 	if (conn->client)
1566d49e1aeSJan Lentfer 		tlsv1_client_deinit(conn->client);
1576d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
1586d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
1596d49e1aeSJan Lentfer 	if (conn->server)
1606d49e1aeSJan Lentfer 		tlsv1_server_deinit(conn->server);
1616d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
1626d49e1aeSJan Lentfer 	os_free(conn);
1636d49e1aeSJan Lentfer }
1646d49e1aeSJan Lentfer 
1656d49e1aeSJan Lentfer 
tls_connection_established(void * tls_ctx,struct tls_connection * conn)1666d49e1aeSJan Lentfer int tls_connection_established(void *tls_ctx, struct tls_connection *conn)
1676d49e1aeSJan Lentfer {
1686d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
1696d49e1aeSJan Lentfer 	if (conn->client)
1706d49e1aeSJan Lentfer 		return tlsv1_client_established(conn->client);
1716d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
1726d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
1736d49e1aeSJan Lentfer 	if (conn->server)
1746d49e1aeSJan Lentfer 		return tlsv1_server_established(conn->server);
1756d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
1766d49e1aeSJan Lentfer 	return 0;
1776d49e1aeSJan Lentfer }
1786d49e1aeSJan Lentfer 
1796d49e1aeSJan Lentfer 
tls_connection_peer_serial_num(void * tls_ctx,struct tls_connection * conn)180*a1157835SDaniel Fojt char * tls_connection_peer_serial_num(void *tls_ctx,
181*a1157835SDaniel Fojt 				      struct tls_connection *conn)
182*a1157835SDaniel Fojt {
183*a1157835SDaniel Fojt 	/* TODO */
184*a1157835SDaniel Fojt 	return NULL;
185*a1157835SDaniel Fojt }
186*a1157835SDaniel Fojt 
187*a1157835SDaniel Fojt 
tls_connection_shutdown(void * tls_ctx,struct tls_connection * conn)1886d49e1aeSJan Lentfer int tls_connection_shutdown(void *tls_ctx, struct tls_connection *conn)
1896d49e1aeSJan Lentfer {
1906d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
1916d49e1aeSJan Lentfer 	if (conn->client)
1926d49e1aeSJan Lentfer 		return tlsv1_client_shutdown(conn->client);
1936d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
1946d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
1956d49e1aeSJan Lentfer 	if (conn->server)
1966d49e1aeSJan Lentfer 		return tlsv1_server_shutdown(conn->server);
1976d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
1986d49e1aeSJan Lentfer 	return -1;
1996d49e1aeSJan Lentfer }
2006d49e1aeSJan Lentfer 
2016d49e1aeSJan Lentfer 
tls_connection_set_params(void * tls_ctx,struct tls_connection * conn,const struct tls_connection_params * params)2026d49e1aeSJan Lentfer int tls_connection_set_params(void *tls_ctx, struct tls_connection *conn,
2036d49e1aeSJan Lentfer 			      const struct tls_connection_params *params)
2046d49e1aeSJan Lentfer {
2056d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
2066d49e1aeSJan Lentfer 	struct tlsv1_credentials *cred;
2076d49e1aeSJan Lentfer 
2086d49e1aeSJan Lentfer 	if (conn->client == NULL)
2096d49e1aeSJan Lentfer 		return -1;
2106d49e1aeSJan Lentfer 
211*a1157835SDaniel Fojt 	if (params->flags & TLS_CONN_EXT_CERT_CHECK) {
212*a1157835SDaniel Fojt 		wpa_printf(MSG_INFO,
213*a1157835SDaniel Fojt 			   "TLS: tls_ext_cert_check=1 not supported");
214*a1157835SDaniel Fojt 		return -1;
215*a1157835SDaniel Fojt 	}
216*a1157835SDaniel Fojt 
2176d49e1aeSJan Lentfer 	cred = tlsv1_cred_alloc();
2186d49e1aeSJan Lentfer 	if (cred == NULL)
2196d49e1aeSJan Lentfer 		return -1;
2206d49e1aeSJan Lentfer 
221*a1157835SDaniel Fojt 	if (params->subject_match) {
222*a1157835SDaniel Fojt 		wpa_printf(MSG_INFO, "TLS: subject_match not supported");
223*a1157835SDaniel Fojt 		tlsv1_cred_free(cred);
224*a1157835SDaniel Fojt 		return -1;
225*a1157835SDaniel Fojt 	}
226*a1157835SDaniel Fojt 
227*a1157835SDaniel Fojt 	if (params->altsubject_match) {
228*a1157835SDaniel Fojt 		wpa_printf(MSG_INFO, "TLS: altsubject_match not supported");
229*a1157835SDaniel Fojt 		tlsv1_cred_free(cred);
230*a1157835SDaniel Fojt 		return -1;
231*a1157835SDaniel Fojt 	}
232*a1157835SDaniel Fojt 
233*a1157835SDaniel Fojt 	if (params->suffix_match) {
234*a1157835SDaniel Fojt 		wpa_printf(MSG_INFO, "TLS: suffix_match not supported");
235*a1157835SDaniel Fojt 		tlsv1_cred_free(cred);
236*a1157835SDaniel Fojt 		return -1;
237*a1157835SDaniel Fojt 	}
238*a1157835SDaniel Fojt 
239*a1157835SDaniel Fojt 	if (params->domain_match) {
240*a1157835SDaniel Fojt 		wpa_printf(MSG_INFO, "TLS: domain_match not supported");
241*a1157835SDaniel Fojt 		tlsv1_cred_free(cred);
242*a1157835SDaniel Fojt 		return -1;
243*a1157835SDaniel Fojt 	}
244*a1157835SDaniel Fojt 
245*a1157835SDaniel Fojt 	if (params->openssl_ciphers) {
246*a1157835SDaniel Fojt 		wpa_printf(MSG_INFO, "TLS: openssl_ciphers not supported");
247*a1157835SDaniel Fojt 		tlsv1_cred_free(cred);
248*a1157835SDaniel Fojt 		return -1;
249*a1157835SDaniel Fojt 	}
250*a1157835SDaniel Fojt 
251*a1157835SDaniel Fojt 	if (params->openssl_ecdh_curves) {
252*a1157835SDaniel Fojt 		wpa_printf(MSG_INFO, "TLS: openssl_ecdh_curves not supported");
253*a1157835SDaniel Fojt 		tlsv1_cred_free(cred);
254*a1157835SDaniel Fojt 		return -1;
255*a1157835SDaniel Fojt 	}
256*a1157835SDaniel Fojt 
2576d49e1aeSJan Lentfer 	if (tlsv1_set_ca_cert(cred, params->ca_cert,
2586d49e1aeSJan Lentfer 			      params->ca_cert_blob, params->ca_cert_blob_len,
2596d49e1aeSJan Lentfer 			      params->ca_path)) {
2606d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to configure trusted CA "
2616d49e1aeSJan Lentfer 			   "certificates");
2626d49e1aeSJan Lentfer 		tlsv1_cred_free(cred);
2636d49e1aeSJan Lentfer 		return -1;
2646d49e1aeSJan Lentfer 	}
2656d49e1aeSJan Lentfer 
2666d49e1aeSJan Lentfer 	if (tlsv1_set_cert(cred, params->client_cert,
2676d49e1aeSJan Lentfer 			   params->client_cert_blob,
2686d49e1aeSJan Lentfer 			   params->client_cert_blob_len)) {
2696d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to configure client "
2706d49e1aeSJan Lentfer 			   "certificate");
2716d49e1aeSJan Lentfer 		tlsv1_cred_free(cred);
2726d49e1aeSJan Lentfer 		return -1;
2736d49e1aeSJan Lentfer 	}
2746d49e1aeSJan Lentfer 
2756d49e1aeSJan Lentfer 	if (tlsv1_set_private_key(cred, params->private_key,
2766d49e1aeSJan Lentfer 				  params->private_key_passwd,
2776d49e1aeSJan Lentfer 				  params->private_key_blob,
2786d49e1aeSJan Lentfer 				  params->private_key_blob_len)) {
2796d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to load private key");
2806d49e1aeSJan Lentfer 		tlsv1_cred_free(cred);
2816d49e1aeSJan Lentfer 		return -1;
2826d49e1aeSJan Lentfer 	}
2836d49e1aeSJan Lentfer 
2846d49e1aeSJan Lentfer 	if (tlsv1_set_dhparams(cred, params->dh_file, params->dh_blob,
2856d49e1aeSJan Lentfer 			       params->dh_blob_len)) {
2866d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to load DH parameters");
2876d49e1aeSJan Lentfer 		tlsv1_cred_free(cred);
2886d49e1aeSJan Lentfer 		return -1;
2896d49e1aeSJan Lentfer 	}
2906d49e1aeSJan Lentfer 
2916d49e1aeSJan Lentfer 	if (tlsv1_client_set_cred(conn->client, cred) < 0) {
2926d49e1aeSJan Lentfer 		tlsv1_cred_free(cred);
2936d49e1aeSJan Lentfer 		return -1;
2946d49e1aeSJan Lentfer 	}
2956d49e1aeSJan Lentfer 
296*a1157835SDaniel Fojt 	tlsv1_client_set_flags(conn->client, params->flags);
2973ff40c12SJohn Marino 
2986d49e1aeSJan Lentfer 	return 0;
2996d49e1aeSJan Lentfer #else /* CONFIG_TLS_INTERNAL_CLIENT */
3006d49e1aeSJan Lentfer 	return -1;
3016d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
3026d49e1aeSJan Lentfer }
3036d49e1aeSJan Lentfer 
3046d49e1aeSJan Lentfer 
tls_global_set_params(void * tls_ctx,const struct tls_connection_params * params)3056d49e1aeSJan Lentfer int tls_global_set_params(void *tls_ctx,
3066d49e1aeSJan Lentfer 			  const struct tls_connection_params *params)
3076d49e1aeSJan Lentfer {
3086d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
3096d49e1aeSJan Lentfer 	struct tls_global *global = tls_ctx;
3106d49e1aeSJan Lentfer 	struct tlsv1_credentials *cred;
3116d49e1aeSJan Lentfer 
312*a1157835SDaniel Fojt 	if (params->check_cert_subject)
313*a1157835SDaniel Fojt 		return -1; /* not yet supported */
314*a1157835SDaniel Fojt 
3156d49e1aeSJan Lentfer 	/* Currently, global parameters are only set when running in server
3166d49e1aeSJan Lentfer 	 * mode. */
3176d49e1aeSJan Lentfer 	global->server = 1;
3186d49e1aeSJan Lentfer 	tlsv1_cred_free(global->server_cred);
3196d49e1aeSJan Lentfer 	global->server_cred = cred = tlsv1_cred_alloc();
3206d49e1aeSJan Lentfer 	if (cred == NULL)
3216d49e1aeSJan Lentfer 		return -1;
3226d49e1aeSJan Lentfer 
3236d49e1aeSJan Lentfer 	if (tlsv1_set_ca_cert(cred, params->ca_cert, params->ca_cert_blob,
3246d49e1aeSJan Lentfer 			      params->ca_cert_blob_len, params->ca_path)) {
3256d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to configure trusted CA "
3266d49e1aeSJan Lentfer 			   "certificates");
3276d49e1aeSJan Lentfer 		return -1;
3286d49e1aeSJan Lentfer 	}
3296d49e1aeSJan Lentfer 
3306d49e1aeSJan Lentfer 	if (tlsv1_set_cert(cred, params->client_cert, params->client_cert_blob,
3316d49e1aeSJan Lentfer 			   params->client_cert_blob_len)) {
3326d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to configure server "
3336d49e1aeSJan Lentfer 			   "certificate");
3346d49e1aeSJan Lentfer 		return -1;
3356d49e1aeSJan Lentfer 	}
3366d49e1aeSJan Lentfer 
3376d49e1aeSJan Lentfer 	if (tlsv1_set_private_key(cred, params->private_key,
3386d49e1aeSJan Lentfer 				  params->private_key_passwd,
3396d49e1aeSJan Lentfer 				  params->private_key_blob,
3406d49e1aeSJan Lentfer 				  params->private_key_blob_len)) {
3416d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to load private key");
3426d49e1aeSJan Lentfer 		return -1;
3436d49e1aeSJan Lentfer 	}
3446d49e1aeSJan Lentfer 
3456d49e1aeSJan Lentfer 	if (tlsv1_set_dhparams(cred, params->dh_file, params->dh_blob,
3466d49e1aeSJan Lentfer 			       params->dh_blob_len)) {
3476d49e1aeSJan Lentfer 		wpa_printf(MSG_INFO, "TLS: Failed to load DH parameters");
3486d49e1aeSJan Lentfer 		return -1;
3496d49e1aeSJan Lentfer 	}
3506d49e1aeSJan Lentfer 
351*a1157835SDaniel Fojt 	if (params->ocsp_stapling_response)
352*a1157835SDaniel Fojt 		cred->ocsp_stapling_response =
353*a1157835SDaniel Fojt 			os_strdup(params->ocsp_stapling_response);
354*a1157835SDaniel Fojt 	if (params->ocsp_stapling_response_multi)
355*a1157835SDaniel Fojt 		cred->ocsp_stapling_response_multi =
356*a1157835SDaniel Fojt 			os_strdup(params->ocsp_stapling_response_multi);
357*a1157835SDaniel Fojt 
3586d49e1aeSJan Lentfer 	return 0;
3596d49e1aeSJan Lentfer #else /* CONFIG_TLS_INTERNAL_SERVER */
3606d49e1aeSJan Lentfer 	return -1;
3616d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
3626d49e1aeSJan Lentfer }
3636d49e1aeSJan Lentfer 
3646d49e1aeSJan Lentfer 
tls_global_set_verify(void * tls_ctx,int check_crl,int strict)365*a1157835SDaniel Fojt int tls_global_set_verify(void *tls_ctx, int check_crl, int strict)
3666d49e1aeSJan Lentfer {
3676d49e1aeSJan Lentfer 	struct tls_global *global = tls_ctx;
3686d49e1aeSJan Lentfer 	global->check_crl = check_crl;
3696d49e1aeSJan Lentfer 	return 0;
3706d49e1aeSJan Lentfer }
3716d49e1aeSJan Lentfer 
3726d49e1aeSJan Lentfer 
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)3736d49e1aeSJan Lentfer int tls_connection_set_verify(void *tls_ctx, struct tls_connection *conn,
374*a1157835SDaniel Fojt 			      int verify_peer, unsigned int flags,
375*a1157835SDaniel Fojt 			      const u8 *session_ctx, size_t session_ctx_len)
3766d49e1aeSJan Lentfer {
3776d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
3786d49e1aeSJan Lentfer 	if (conn->server)
3796d49e1aeSJan Lentfer 		return tlsv1_server_set_verify(conn->server, verify_peer);
3806d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
3816d49e1aeSJan Lentfer 	return -1;
3826d49e1aeSJan Lentfer }
3836d49e1aeSJan Lentfer 
3846d49e1aeSJan Lentfer 
tls_connection_get_random(void * tls_ctx,struct tls_connection * conn,struct tls_random * data)385*a1157835SDaniel Fojt int tls_connection_get_random(void *tls_ctx, struct tls_connection *conn,
386*a1157835SDaniel Fojt 			      struct tls_random *data)
3876d49e1aeSJan Lentfer {
3886d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
3896d49e1aeSJan Lentfer 	if (conn->client)
390*a1157835SDaniel Fojt 		return tlsv1_client_get_random(conn->client, data);
3916d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
3926d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
3936d49e1aeSJan Lentfer 	if (conn->server)
394*a1157835SDaniel Fojt 		return tlsv1_server_get_random(conn->server, data);
3956d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
3966d49e1aeSJan Lentfer 	return -1;
3976d49e1aeSJan Lentfer }
3986d49e1aeSJan Lentfer 
3996d49e1aeSJan Lentfer 
tls_get_keyblock_size(struct tls_connection * conn)400*a1157835SDaniel Fojt static int tls_get_keyblock_size(struct tls_connection *conn)
4016d49e1aeSJan Lentfer {
4026d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
403*a1157835SDaniel Fojt 	if (conn->client)
404*a1157835SDaniel Fojt 		return tlsv1_client_get_keyblock_size(conn->client);
405*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_CLIENT */
406*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_SERVER
407*a1157835SDaniel Fojt 	if (conn->server)
408*a1157835SDaniel Fojt 		return tlsv1_server_get_keyblock_size(conn->server);
409*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_SERVER */
410*a1157835SDaniel Fojt 	return -1;
411*a1157835SDaniel Fojt }
412*a1157835SDaniel Fojt 
413*a1157835SDaniel Fojt 
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)414*a1157835SDaniel Fojt static int tls_connection_prf(void *tls_ctx, struct tls_connection *conn,
415*a1157835SDaniel Fojt 			      const char *label, const u8 *context,
416*a1157835SDaniel Fojt 			      size_t context_len, int server_random_first,
417*a1157835SDaniel Fojt 			      int skip_keyblock, u8 *out, size_t out_len)
418*a1157835SDaniel Fojt {
419*a1157835SDaniel Fojt 	int ret = -1, skip = 0;
420*a1157835SDaniel Fojt 	u8 *tmp_out = NULL;
421*a1157835SDaniel Fojt 	u8 *_out = out;
422*a1157835SDaniel Fojt 
423*a1157835SDaniel Fojt 	if (skip_keyblock) {
424*a1157835SDaniel Fojt 		skip = tls_get_keyblock_size(conn);
425*a1157835SDaniel Fojt 		if (skip < 0)
426*a1157835SDaniel Fojt 			return -1;
427*a1157835SDaniel Fojt 		tmp_out = os_malloc(skip + out_len);
428*a1157835SDaniel Fojt 		if (!tmp_out)
429*a1157835SDaniel Fojt 			return -1;
430*a1157835SDaniel Fojt 		_out = tmp_out;
431*a1157835SDaniel Fojt 	}
432*a1157835SDaniel Fojt 
433*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_CLIENT
4346d49e1aeSJan Lentfer 	if (conn->client) {
435*a1157835SDaniel Fojt 		ret = tlsv1_client_prf(conn->client, label, context,
436*a1157835SDaniel Fojt 				       context_len, server_random_first,
437*a1157835SDaniel Fojt 				       _out, skip + out_len);
4386d49e1aeSJan Lentfer 	}
4396d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
4406d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
4416d49e1aeSJan Lentfer 	if (conn->server) {
442*a1157835SDaniel Fojt 		ret = tlsv1_server_prf(conn->server, label, context,
443*a1157835SDaniel Fojt 				       context_len, server_random_first,
444*a1157835SDaniel Fojt 				       _out, skip + out_len);
4456d49e1aeSJan Lentfer 	}
4466d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
447*a1157835SDaniel Fojt 	if (ret == 0 && skip_keyblock)
448*a1157835SDaniel Fojt 		os_memcpy(out, _out + skip, out_len);
449*a1157835SDaniel Fojt 	bin_clear_free(tmp_out, skip);
450*a1157835SDaniel Fojt 
451*a1157835SDaniel Fojt 	return ret;
452*a1157835SDaniel Fojt }
453*a1157835SDaniel Fojt 
454*a1157835SDaniel Fojt 
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)455*a1157835SDaniel Fojt int tls_connection_export_key(void *tls_ctx, struct tls_connection *conn,
456*a1157835SDaniel Fojt 			      const char *label, const u8 *context,
457*a1157835SDaniel Fojt 			      size_t context_len, u8 *out, size_t out_len)
458*a1157835SDaniel Fojt {
459*a1157835SDaniel Fojt 	return tls_connection_prf(tls_ctx, conn, label, context, context_len,
460*a1157835SDaniel Fojt 				  0, 0, out, out_len);
461*a1157835SDaniel Fojt }
462*a1157835SDaniel Fojt 
463*a1157835SDaniel Fojt 
tls_connection_get_eap_fast_key(void * tls_ctx,struct tls_connection * conn,u8 * out,size_t out_len)464*a1157835SDaniel Fojt int tls_connection_get_eap_fast_key(void *tls_ctx, struct tls_connection *conn,
465*a1157835SDaniel Fojt 				    u8 *out, size_t out_len)
466*a1157835SDaniel Fojt {
467*a1157835SDaniel Fojt 	return tls_connection_prf(tls_ctx, conn, "key expansion", NULL, 0,
468*a1157835SDaniel Fojt 				  1, 1, out, out_len);
4696d49e1aeSJan Lentfer }
4706d49e1aeSJan Lentfer 
4716d49e1aeSJan Lentfer 
tls_connection_handshake(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data)4723ff40c12SJohn Marino struct wpabuf * tls_connection_handshake(void *tls_ctx,
4733ff40c12SJohn Marino 					 struct tls_connection *conn,
4743ff40c12SJohn Marino 					 const struct wpabuf *in_data,
4753ff40c12SJohn Marino 					 struct wpabuf **appl_data)
4763ff40c12SJohn Marino {
4773ff40c12SJohn Marino 	return tls_connection_handshake2(tls_ctx, conn, in_data, appl_data,
4783ff40c12SJohn Marino 					 NULL);
4793ff40c12SJohn Marino }
4803ff40c12SJohn Marino 
4813ff40c12SJohn Marino 
tls_connection_handshake2(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data,int * need_more_data)4823ff40c12SJohn Marino struct wpabuf * tls_connection_handshake2(void *tls_ctx,
4833ff40c12SJohn Marino 					  struct tls_connection *conn,
4843ff40c12SJohn Marino 					  const struct wpabuf *in_data,
4853ff40c12SJohn Marino 					  struct wpabuf **appl_data,
4863ff40c12SJohn Marino 					  int *need_more_data)
4876d49e1aeSJan Lentfer {
4886d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
4893ff40c12SJohn Marino 	u8 *res, *ad;
4903ff40c12SJohn Marino 	size_t res_len, ad_len;
4913ff40c12SJohn Marino 	struct wpabuf *out;
4923ff40c12SJohn Marino 
4936d49e1aeSJan Lentfer 	if (conn->client == NULL)
4946d49e1aeSJan Lentfer 		return NULL;
4956d49e1aeSJan Lentfer 
4963ff40c12SJohn Marino 	ad = NULL;
4973ff40c12SJohn Marino 	res = tlsv1_client_handshake(conn->client,
4983ff40c12SJohn Marino 				     in_data ? wpabuf_head(in_data) : NULL,
4993ff40c12SJohn Marino 				     in_data ? wpabuf_len(in_data) : 0,
5003ff40c12SJohn Marino 				     &res_len, &ad, &ad_len, need_more_data);
5013ff40c12SJohn Marino 	if (res == NULL)
5023ff40c12SJohn Marino 		return NULL;
5033ff40c12SJohn Marino 	out = wpabuf_alloc_ext_data(res, res_len);
5043ff40c12SJohn Marino 	if (out == NULL) {
5053ff40c12SJohn Marino 		os_free(res);
5063ff40c12SJohn Marino 		os_free(ad);
5073ff40c12SJohn Marino 		return NULL;
5083ff40c12SJohn Marino 	}
5093ff40c12SJohn Marino 	if (appl_data) {
5103ff40c12SJohn Marino 		if (ad) {
5113ff40c12SJohn Marino 			*appl_data = wpabuf_alloc_ext_data(ad, ad_len);
5123ff40c12SJohn Marino 			if (*appl_data == NULL)
5133ff40c12SJohn Marino 				os_free(ad);
5143ff40c12SJohn Marino 		} else
5156d49e1aeSJan Lentfer 			*appl_data = NULL;
5163ff40c12SJohn Marino 	} else
5173ff40c12SJohn Marino 		os_free(ad);
5186d49e1aeSJan Lentfer 
5193ff40c12SJohn Marino 	return out;
5206d49e1aeSJan Lentfer #else /* CONFIG_TLS_INTERNAL_CLIENT */
5216d49e1aeSJan Lentfer 	return NULL;
5226d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
5236d49e1aeSJan Lentfer }
5246d49e1aeSJan Lentfer 
5256d49e1aeSJan Lentfer 
tls_connection_server_handshake(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,struct wpabuf ** appl_data)5263ff40c12SJohn Marino struct wpabuf * tls_connection_server_handshake(void *tls_ctx,
5276d49e1aeSJan Lentfer 						struct tls_connection *conn,
5283ff40c12SJohn Marino 						const struct wpabuf *in_data,
5293ff40c12SJohn Marino 						struct wpabuf **appl_data)
5306d49e1aeSJan Lentfer {
5316d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
5323ff40c12SJohn Marino 	u8 *res;
5333ff40c12SJohn Marino 	size_t res_len;
5343ff40c12SJohn Marino 	struct wpabuf *out;
5353ff40c12SJohn Marino 
5366d49e1aeSJan Lentfer 	if (conn->server == NULL)
5376d49e1aeSJan Lentfer 		return NULL;
5386d49e1aeSJan Lentfer 
5393ff40c12SJohn Marino 	if (appl_data)
5403ff40c12SJohn Marino 		*appl_data = NULL;
5413ff40c12SJohn Marino 
5423ff40c12SJohn Marino 	res = tlsv1_server_handshake(conn->server, wpabuf_head(in_data),
5433ff40c12SJohn Marino 				     wpabuf_len(in_data), &res_len);
5443ff40c12SJohn Marino 	if (res == NULL && tlsv1_server_established(conn->server))
5453ff40c12SJohn Marino 		return wpabuf_alloc(0);
5463ff40c12SJohn Marino 	if (res == NULL)
5473ff40c12SJohn Marino 		return NULL;
5483ff40c12SJohn Marino 	out = wpabuf_alloc_ext_data(res, res_len);
5493ff40c12SJohn Marino 	if (out == NULL) {
5503ff40c12SJohn Marino 		os_free(res);
5513ff40c12SJohn Marino 		return NULL;
5526d49e1aeSJan Lentfer 	}
5533ff40c12SJohn Marino 
5546d49e1aeSJan Lentfer 	return out;
5556d49e1aeSJan Lentfer #else /* CONFIG_TLS_INTERNAL_SERVER */
5566d49e1aeSJan Lentfer 	return NULL;
5576d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
5586d49e1aeSJan Lentfer }
5596d49e1aeSJan Lentfer 
5606d49e1aeSJan Lentfer 
tls_connection_encrypt(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data)5613ff40c12SJohn Marino struct wpabuf * tls_connection_encrypt(void *tls_ctx,
5623ff40c12SJohn Marino 				       struct tls_connection *conn,
5633ff40c12SJohn Marino 				       const struct wpabuf *in_data)
5646d49e1aeSJan Lentfer {
5656d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
5666d49e1aeSJan Lentfer 	if (conn->client) {
5673ff40c12SJohn Marino 		struct wpabuf *buf;
5683ff40c12SJohn Marino 		int res;
5693ff40c12SJohn Marino 		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
5703ff40c12SJohn Marino 		if (buf == NULL)
5713ff40c12SJohn Marino 			return NULL;
5723ff40c12SJohn Marino 		res = tlsv1_client_encrypt(conn->client, wpabuf_head(in_data),
5733ff40c12SJohn Marino 					   wpabuf_len(in_data),
5743ff40c12SJohn Marino 					   wpabuf_mhead(buf),
5753ff40c12SJohn Marino 					   wpabuf_size(buf));
5763ff40c12SJohn Marino 		if (res < 0) {
5773ff40c12SJohn Marino 			wpabuf_free(buf);
5783ff40c12SJohn Marino 			return NULL;
5793ff40c12SJohn Marino 		}
5803ff40c12SJohn Marino 		wpabuf_put(buf, res);
5813ff40c12SJohn Marino 		return buf;
5826d49e1aeSJan Lentfer 	}
5836d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
5846d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
5856d49e1aeSJan Lentfer 	if (conn->server) {
5863ff40c12SJohn Marino 		struct wpabuf *buf;
5873ff40c12SJohn Marino 		int res;
5883ff40c12SJohn Marino 		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
5893ff40c12SJohn Marino 		if (buf == NULL)
5903ff40c12SJohn Marino 			return NULL;
5913ff40c12SJohn Marino 		res = tlsv1_server_encrypt(conn->server, wpabuf_head(in_data),
5923ff40c12SJohn Marino 					   wpabuf_len(in_data),
5933ff40c12SJohn Marino 					   wpabuf_mhead(buf),
5943ff40c12SJohn Marino 					   wpabuf_size(buf));
5953ff40c12SJohn Marino 		if (res < 0) {
5963ff40c12SJohn Marino 			wpabuf_free(buf);
5973ff40c12SJohn Marino 			return NULL;
5983ff40c12SJohn Marino 		}
5993ff40c12SJohn Marino 		wpabuf_put(buf, res);
6003ff40c12SJohn Marino 		return buf;
6016d49e1aeSJan Lentfer 	}
6026d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
6033ff40c12SJohn Marino 	return NULL;
6046d49e1aeSJan Lentfer }
6056d49e1aeSJan Lentfer 
6066d49e1aeSJan Lentfer 
tls_connection_decrypt(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data)6073ff40c12SJohn Marino struct wpabuf * tls_connection_decrypt(void *tls_ctx,
6083ff40c12SJohn Marino 				       struct tls_connection *conn,
6093ff40c12SJohn Marino 				       const struct wpabuf *in_data)
6106d49e1aeSJan Lentfer {
6113ff40c12SJohn Marino 	return tls_connection_decrypt2(tls_ctx, conn, in_data, NULL);
6123ff40c12SJohn Marino }
6133ff40c12SJohn Marino 
6143ff40c12SJohn Marino 
tls_connection_decrypt2(void * tls_ctx,struct tls_connection * conn,const struct wpabuf * in_data,int * need_more_data)6153ff40c12SJohn Marino struct wpabuf * tls_connection_decrypt2(void *tls_ctx,
6163ff40c12SJohn Marino 					struct tls_connection *conn,
6173ff40c12SJohn Marino 					const struct wpabuf *in_data,
6183ff40c12SJohn Marino 					int *need_more_data)
6193ff40c12SJohn Marino {
6203ff40c12SJohn Marino 	if (need_more_data)
6213ff40c12SJohn Marino 		*need_more_data = 0;
6223ff40c12SJohn Marino 
6236d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
6246d49e1aeSJan Lentfer 	if (conn->client) {
6253ff40c12SJohn Marino 		return tlsv1_client_decrypt(conn->client, wpabuf_head(in_data),
6263ff40c12SJohn Marino 					    wpabuf_len(in_data),
6273ff40c12SJohn Marino 					    need_more_data);
6286d49e1aeSJan Lentfer 	}
6296d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
6306d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
6316d49e1aeSJan Lentfer 	if (conn->server) {
6323ff40c12SJohn Marino 		struct wpabuf *buf;
6333ff40c12SJohn Marino 		int res;
6343ff40c12SJohn Marino 		buf = wpabuf_alloc((wpabuf_len(in_data) + 500) * 3);
6353ff40c12SJohn Marino 		if (buf == NULL)
6363ff40c12SJohn Marino 			return NULL;
6373ff40c12SJohn Marino 		res = tlsv1_server_decrypt(conn->server, wpabuf_head(in_data),
6383ff40c12SJohn Marino 					   wpabuf_len(in_data),
6393ff40c12SJohn Marino 					   wpabuf_mhead(buf),
6403ff40c12SJohn Marino 					   wpabuf_size(buf));
6413ff40c12SJohn Marino 		if (res < 0) {
6423ff40c12SJohn Marino 			wpabuf_free(buf);
6433ff40c12SJohn Marino 			return NULL;
6443ff40c12SJohn Marino 		}
6453ff40c12SJohn Marino 		wpabuf_put(buf, res);
6463ff40c12SJohn Marino 		return buf;
6476d49e1aeSJan Lentfer 	}
6486d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
6493ff40c12SJohn Marino 	return NULL;
6506d49e1aeSJan Lentfer }
6516d49e1aeSJan Lentfer 
6526d49e1aeSJan Lentfer 
tls_connection_resumed(void * tls_ctx,struct tls_connection * conn)6536d49e1aeSJan Lentfer int tls_connection_resumed(void *tls_ctx, struct tls_connection *conn)
6546d49e1aeSJan Lentfer {
6556d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
6566d49e1aeSJan Lentfer 	if (conn->client)
6576d49e1aeSJan Lentfer 		return tlsv1_client_resumed(conn->client);
6586d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
6596d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
6606d49e1aeSJan Lentfer 	if (conn->server)
6616d49e1aeSJan Lentfer 		return tlsv1_server_resumed(conn->server);
6626d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
6636d49e1aeSJan Lentfer 	return -1;
6646d49e1aeSJan Lentfer }
6656d49e1aeSJan Lentfer 
6666d49e1aeSJan Lentfer 
tls_connection_set_cipher_list(void * tls_ctx,struct tls_connection * conn,u8 * ciphers)6676d49e1aeSJan Lentfer int tls_connection_set_cipher_list(void *tls_ctx, struct tls_connection *conn,
6686d49e1aeSJan Lentfer 				   u8 *ciphers)
6696d49e1aeSJan Lentfer {
6706d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
6716d49e1aeSJan Lentfer 	if (conn->client)
6726d49e1aeSJan Lentfer 		return tlsv1_client_set_cipher_list(conn->client, ciphers);
6736d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
6746d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
6756d49e1aeSJan Lentfer 	if (conn->server)
6766d49e1aeSJan Lentfer 		return tlsv1_server_set_cipher_list(conn->server, ciphers);
6776d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
6786d49e1aeSJan Lentfer 	return -1;
6796d49e1aeSJan Lentfer }
6806d49e1aeSJan Lentfer 
6816d49e1aeSJan Lentfer 
tls_get_version(void * ssl_ctx,struct tls_connection * conn,char * buf,size_t buflen)682*a1157835SDaniel Fojt int tls_get_version(void *ssl_ctx, struct tls_connection *conn,
683*a1157835SDaniel Fojt 		    char *buf, size_t buflen)
684*a1157835SDaniel Fojt {
685*a1157835SDaniel Fojt 	if (conn == NULL)
686*a1157835SDaniel Fojt 		return -1;
687*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_CLIENT
688*a1157835SDaniel Fojt 	if (conn->client)
689*a1157835SDaniel Fojt 		return tlsv1_client_get_version(conn->client, buf, buflen);
690*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_CLIENT */
691*a1157835SDaniel Fojt 	return -1;
692*a1157835SDaniel Fojt }
693*a1157835SDaniel Fojt 
694*a1157835SDaniel Fojt 
tls_get_cipher(void * tls_ctx,struct tls_connection * conn,char * buf,size_t buflen)6956d49e1aeSJan Lentfer int tls_get_cipher(void *tls_ctx, struct tls_connection *conn,
6966d49e1aeSJan Lentfer 		   char *buf, size_t buflen)
6976d49e1aeSJan Lentfer {
6986d49e1aeSJan Lentfer 	if (conn == NULL)
6996d49e1aeSJan Lentfer 		return -1;
7006d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
7016d49e1aeSJan Lentfer 	if (conn->client)
7026d49e1aeSJan Lentfer 		return tlsv1_client_get_cipher(conn->client, buf, buflen);
7036d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
7046d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
7056d49e1aeSJan Lentfer 	if (conn->server)
7066d49e1aeSJan Lentfer 		return tlsv1_server_get_cipher(conn->server, buf, buflen);
7076d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
7086d49e1aeSJan Lentfer 	return -1;
7096d49e1aeSJan Lentfer }
7106d49e1aeSJan Lentfer 
7116d49e1aeSJan Lentfer 
tls_connection_enable_workaround(void * tls_ctx,struct tls_connection * conn)7126d49e1aeSJan Lentfer int tls_connection_enable_workaround(void *tls_ctx,
7136d49e1aeSJan Lentfer 				     struct tls_connection *conn)
7146d49e1aeSJan Lentfer {
7156d49e1aeSJan Lentfer 	return -1;
7166d49e1aeSJan Lentfer }
7176d49e1aeSJan Lentfer 
7186d49e1aeSJan Lentfer 
tls_connection_client_hello_ext(void * tls_ctx,struct tls_connection * conn,int ext_type,const u8 * data,size_t data_len)7196d49e1aeSJan Lentfer int tls_connection_client_hello_ext(void *tls_ctx, struct tls_connection *conn,
7206d49e1aeSJan Lentfer 				    int ext_type, const u8 *data,
7216d49e1aeSJan Lentfer 				    size_t data_len)
7226d49e1aeSJan Lentfer {
7236d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
7246d49e1aeSJan Lentfer 	if (conn->client) {
7256d49e1aeSJan Lentfer 		return tlsv1_client_hello_ext(conn->client, ext_type,
7266d49e1aeSJan Lentfer 					      data, data_len);
7276d49e1aeSJan Lentfer 	}
7286d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
7296d49e1aeSJan Lentfer 	return -1;
7306d49e1aeSJan Lentfer }
7316d49e1aeSJan Lentfer 
7326d49e1aeSJan Lentfer 
tls_connection_get_failed(void * tls_ctx,struct tls_connection * conn)7336d49e1aeSJan Lentfer int tls_connection_get_failed(void *tls_ctx, struct tls_connection *conn)
7346d49e1aeSJan Lentfer {
735*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_SERVER
736*a1157835SDaniel Fojt 	if (conn->server)
737*a1157835SDaniel Fojt 		return tlsv1_server_get_failed(conn->server);
738*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_SERVER */
7396d49e1aeSJan Lentfer 	return 0;
7406d49e1aeSJan Lentfer }
7416d49e1aeSJan Lentfer 
7426d49e1aeSJan Lentfer 
tls_connection_get_read_alerts(void * tls_ctx,struct tls_connection * conn)7436d49e1aeSJan Lentfer int tls_connection_get_read_alerts(void *tls_ctx, struct tls_connection *conn)
7446d49e1aeSJan Lentfer {
745*a1157835SDaniel Fojt #ifdef CONFIG_TLS_INTERNAL_SERVER
746*a1157835SDaniel Fojt 	if (conn->server)
747*a1157835SDaniel Fojt 		return tlsv1_server_get_read_alerts(conn->server);
748*a1157835SDaniel Fojt #endif /* CONFIG_TLS_INTERNAL_SERVER */
7496d49e1aeSJan Lentfer 	return 0;
7506d49e1aeSJan Lentfer }
7516d49e1aeSJan Lentfer 
7526d49e1aeSJan Lentfer 
tls_connection_get_write_alerts(void * tls_ctx,struct tls_connection * conn)7536d49e1aeSJan Lentfer int tls_connection_get_write_alerts(void *tls_ctx,
7546d49e1aeSJan Lentfer 				    struct tls_connection *conn)
7556d49e1aeSJan Lentfer {
7566d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
7576d49e1aeSJan Lentfer 	if (conn->server)
758*a1157835SDaniel Fojt 		return tlsv1_server_get_write_alerts(conn->server);
7596d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
7606d49e1aeSJan Lentfer 	return 0;
7616d49e1aeSJan Lentfer }
7626d49e1aeSJan Lentfer 
7636d49e1aeSJan Lentfer 
tls_connection_set_session_ticket_cb(void * tls_ctx,struct tls_connection * conn,tls_session_ticket_cb cb,void * ctx)7646d49e1aeSJan Lentfer int tls_connection_set_session_ticket_cb(void *tls_ctx,
7656d49e1aeSJan Lentfer 					 struct tls_connection *conn,
7666d49e1aeSJan Lentfer 					 tls_session_ticket_cb cb,
7676d49e1aeSJan Lentfer 					 void *ctx)
7686d49e1aeSJan Lentfer {
7696d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_CLIENT
7706d49e1aeSJan Lentfer 	if (conn->client) {
7716d49e1aeSJan Lentfer 		tlsv1_client_set_session_ticket_cb(conn->client, cb, ctx);
7726d49e1aeSJan Lentfer 		return 0;
7736d49e1aeSJan Lentfer 	}
7746d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_CLIENT */
7756d49e1aeSJan Lentfer #ifdef CONFIG_TLS_INTERNAL_SERVER
7766d49e1aeSJan Lentfer 	if (conn->server) {
7776d49e1aeSJan Lentfer 		tlsv1_server_set_session_ticket_cb(conn->server, cb, ctx);
7786d49e1aeSJan Lentfer 		return 0;
7796d49e1aeSJan Lentfer 	}
7806d49e1aeSJan Lentfer #endif /* CONFIG_TLS_INTERNAL_SERVER */
7816d49e1aeSJan Lentfer 	return -1;
7826d49e1aeSJan Lentfer }
783*a1157835SDaniel Fojt 
784*a1157835SDaniel Fojt 
tls_get_library_version(char * buf,size_t buf_len)785*a1157835SDaniel Fojt int tls_get_library_version(char *buf, size_t buf_len)
786*a1157835SDaniel Fojt {
787*a1157835SDaniel Fojt 	return os_snprintf(buf, buf_len, "internal");
788*a1157835SDaniel Fojt }
789*a1157835SDaniel Fojt 
790*a1157835SDaniel Fojt 
tls_connection_set_success_data(struct tls_connection * conn,struct wpabuf * data)791*a1157835SDaniel Fojt void tls_connection_set_success_data(struct tls_connection *conn,
792*a1157835SDaniel Fojt 				     struct wpabuf *data)
793*a1157835SDaniel Fojt {
794*a1157835SDaniel Fojt }
795*a1157835SDaniel Fojt 
796*a1157835SDaniel Fojt 
tls_connection_set_success_data_resumed(struct tls_connection * conn)797*a1157835SDaniel Fojt void tls_connection_set_success_data_resumed(struct tls_connection *conn)
798*a1157835SDaniel Fojt {
799*a1157835SDaniel Fojt }
800*a1157835SDaniel Fojt 
801*a1157835SDaniel Fojt 
802*a1157835SDaniel Fojt const struct wpabuf *
tls_connection_get_success_data(struct tls_connection * conn)803*a1157835SDaniel Fojt tls_connection_get_success_data(struct tls_connection *conn)
804*a1157835SDaniel Fojt {
805*a1157835SDaniel Fojt 	return NULL;
806*a1157835SDaniel Fojt }
807*a1157835SDaniel Fojt 
808*a1157835SDaniel Fojt 
tls_connection_remove_session(struct tls_connection * conn)809*a1157835SDaniel Fojt void tls_connection_remove_session(struct tls_connection *conn)
810*a1157835SDaniel Fojt {
811*a1157835SDaniel Fojt }
812