Home | History | Annotate | Download | only in crypto
      1 /*
      2  * TLS interface functions and an internal TLS implementation
      3  * Copyright (c) 2004-2011, Jouni Malinen <j (at) w1.fi>
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  *
      8  * This file interface functions for hostapd/wpa_supplicant to use the
      9  * integrated TLSv1 implementation.
     10  */
     11 
     12 #include "includes.h"
     13 
     14 #include "common.h"
     15 #include "tls.h"
     16 #include "tls/tlsv1_client.h"
     17 #include "tls/tlsv1_server.h"
     18 
     19 
     20 static int tls_ref_count = 0;
     21 
     22 struct tls_global {
     23 	int server;
     24 	struct tlsv1_credentials *server_cred;
     25 	int check_crl;
     26 
     27 	void (*event_cb)(void *ctx, enum tls_event ev,
     28 			 union tls_event_data *data);
     29 	void *cb_ctx;
     30 	int cert_in_cb;
     31 };
     32 
     33 struct tls_connection {
     34 	struct tlsv1_client *client;
     35 	struct tlsv1_server *server;
     36 	struct tls_global *global;
     37 };
     38 
     39 
     40 void * tls_init(const struct tls_config *conf)
     41 {
     42 	struct tls_global *global;
     43 
     44 	if (tls_ref_count == 0) {
     45 #ifdef CONFIG_TLS_INTERNAL_CLIENT
     46 		if (tlsv1_client_global_init())
     47 			return NULL;
     48 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
     49 #ifdef CONFIG_TLS_INTERNAL_SERVER
     50 		if (tlsv1_server_global_init())
     51 			return NULL;
     52 #endif /* CONFIG_TLS_INTERNAL_SERVER */
     53 	}
     54 	tls_ref_count++;
     55 
     56 	global = os_zalloc(sizeof(*global));
     57 	if (global == NULL)
     58 		return NULL;
     59 	if (conf) {
     60 		global->event_cb = conf->event_cb;
     61 		global->cb_ctx = conf->cb_ctx;
     62 		global->cert_in_cb = conf->cert_in_cb;
     63 	}
     64 
     65 	return global;
     66 }
     67 
     68 void tls_deinit(void *ssl_ctx)
     69 {
     70 	struct tls_global *global = ssl_ctx;
     71 	tls_ref_count--;
     72 	if (tls_ref_count == 0) {
     73 #ifdef CONFIG_TLS_INTERNAL_CLIENT
     74 		tlsv1_client_global_deinit();
     75 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
     76 #ifdef CONFIG_TLS_INTERNAL_SERVER
     77 		tlsv1_server_global_deinit();
     78 #endif /* CONFIG_TLS_INTERNAL_SERVER */
     79 	}
     80 #ifdef CONFIG_TLS_INTERNAL_SERVER
     81 	tlsv1_cred_free(global->server_cred);
     82 #endif /* CONFIG_TLS_INTERNAL_SERVER */
     83 	os_free(global);
     84 }
     85 
     86 
     87 int tls_get_errors(void *tls_ctx)
     88 {
     89 	return 0;
     90 }
     91 
     92 
     93 struct tls_connection * tls_connection_init(void *tls_ctx)
     94 {
     95 	struct tls_connection *conn;
     96 	struct tls_global *global = tls_ctx;
     97 
     98 	conn = os_zalloc(sizeof(*conn));
     99 	if (conn == NULL)
    100 		return NULL;
    101 	conn->global = global;
    102 
    103 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    104 	if (!global->server) {
    105 		conn->client = tlsv1_client_init();
    106 		if (conn->client == NULL) {
    107 			os_free(conn);
    108 			return NULL;
    109 		}
    110 		tlsv1_client_set_cb(conn->client, global->event_cb,
    111 				    global->cb_ctx, global->cert_in_cb);
    112 	}
    113 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    114 #ifdef CONFIG_TLS_INTERNAL_SERVER
    115 	if (global->server) {
    116 		conn->server = tlsv1_server_init(global->server_cred);
    117 		if (conn->server == NULL) {
    118 			os_free(conn);
    119 			return NULL;
    120 		}
    121 	}
    122 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    123 
    124 	return conn;
    125 }
    126 
    127 
    128 #ifdef CONFIG_TESTING_OPTIONS
    129 #ifdef CONFIG_TLS_INTERNAL_SERVER
    130 void tls_connection_set_test_flags(struct tls_connection *conn, u32 flags)
    131 {
    132 	if (conn->server)
    133 		tlsv1_server_set_test_flags(conn->server, flags);
    134 }
    135 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    136 #endif /* CONFIG_TESTING_OPTIONS */
    137 
    138 
    139 void tls_connection_set_log_cb(struct tls_connection *conn,
    140 			       void (*log_cb)(void *ctx, const char *msg),
    141 			       void *ctx)
    142 {
    143 #ifdef CONFIG_TLS_INTERNAL_SERVER
    144 	if (conn->server)
    145 		tlsv1_server_set_log_cb(conn->server, log_cb, ctx);
    146 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    147 }
    148 
    149 
    150 void tls_connection_deinit(void *tls_ctx, struct tls_connection *conn)
    151 {
    152 	if (conn == NULL)
    153 		return;
    154 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    155 	if (conn->client)
    156 		tlsv1_client_deinit(conn->client);
    157 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    158 #ifdef CONFIG_TLS_INTERNAL_SERVER
    159 	if (conn->server)
    160 		tlsv1_server_deinit(conn->server);
    161 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    162 	os_free(conn);
    163 }
    164 
    165 
    166 int tls_connection_established(void *tls_ctx, struct tls_connection *conn)
    167 {
    168 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    169 	if (conn->client)
    170 		return tlsv1_client_established(conn->client);
    171 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    172 #ifdef CONFIG_TLS_INTERNAL_SERVER
    173 	if (conn->server)
    174 		return tlsv1_server_established(conn->server);
    175 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    176 	return 0;
    177 }
    178 
    179 
    180 int tls_connection_shutdown(void *tls_ctx, struct tls_connection *conn)
    181 {
    182 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    183 	if (conn->client)
    184 		return tlsv1_client_shutdown(conn->client);
    185 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    186 #ifdef CONFIG_TLS_INTERNAL_SERVER
    187 	if (conn->server)
    188 		return tlsv1_server_shutdown(conn->server);
    189 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    190 	return -1;
    191 }
    192 
    193 
    194 int tls_connection_set_params(void *tls_ctx, struct tls_connection *conn,
    195 			      const struct tls_connection_params *params)
    196 {
    197 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    198 	struct tlsv1_credentials *cred;
    199 
    200 	if (conn->client == NULL)
    201 		return -1;
    202 
    203 	if (params->flags & TLS_CONN_EXT_CERT_CHECK) {
    204 		wpa_printf(MSG_INFO,
    205 			   "TLS: tls_ext_cert_check=1 not supported");
    206 		return -1;
    207 	}
    208 
    209 	cred = tlsv1_cred_alloc();
    210 	if (cred == NULL)
    211 		return -1;
    212 
    213 	if (params->subject_match) {
    214 		wpa_printf(MSG_INFO, "TLS: subject_match not supported");
    215 		tlsv1_cred_free(cred);
    216 		return -1;
    217 	}
    218 
    219 	if (params->altsubject_match) {
    220 		wpa_printf(MSG_INFO, "TLS: altsubject_match not supported");
    221 		tlsv1_cred_free(cred);
    222 		return -1;
    223 	}
    224 
    225 	if (params->suffix_match) {
    226 		wpa_printf(MSG_INFO, "TLS: suffix_match not supported");
    227 		tlsv1_cred_free(cred);
    228 		return -1;
    229 	}
    230 
    231 	if (params->domain_match) {
    232 		wpa_printf(MSG_INFO, "TLS: domain_match not supported");
    233 		tlsv1_cred_free(cred);
    234 		return -1;
    235 	}
    236 
    237 	if (params->openssl_ciphers) {
    238 		wpa_printf(MSG_INFO, "TLS: openssl_ciphers not supported");
    239 		tlsv1_cred_free(cred);
    240 		return -1;
    241 	}
    242 
    243 	if (tlsv1_set_ca_cert(cred, params->ca_cert,
    244 			      params->ca_cert_blob, params->ca_cert_blob_len,
    245 			      params->ca_path)) {
    246 		wpa_printf(MSG_INFO, "TLS: Failed to configure trusted CA "
    247 			   "certificates");
    248 		tlsv1_cred_free(cred);
    249 		return -1;
    250 	}
    251 
    252 	if (tlsv1_set_cert(cred, params->client_cert,
    253 			   params->client_cert_blob,
    254 			   params->client_cert_blob_len)) {
    255 		wpa_printf(MSG_INFO, "TLS: Failed to configure client "
    256 			   "certificate");
    257 		tlsv1_cred_free(cred);
    258 		return -1;
    259 	}
    260 
    261 	if (tlsv1_set_private_key(cred, params->private_key,
    262 				  params->private_key_passwd,
    263 				  params->private_key_blob,
    264 				  params->private_key_blob_len)) {
    265 		wpa_printf(MSG_INFO, "TLS: Failed to load private key");
    266 		tlsv1_cred_free(cred);
    267 		return -1;
    268 	}
    269 
    270 	if (tlsv1_set_dhparams(cred, params->dh_file, params->dh_blob,
    271 			       params->dh_blob_len)) {
    272 		wpa_printf(MSG_INFO, "TLS: Failed to load DH parameters");
    273 		tlsv1_cred_free(cred);
    274 		return -1;
    275 	}
    276 
    277 	if (tlsv1_client_set_cred(conn->client, cred) < 0) {
    278 		tlsv1_cred_free(cred);
    279 		return -1;
    280 	}
    281 
    282 	tlsv1_client_set_flags(conn->client, params->flags);
    283 
    284 	return 0;
    285 #else /* CONFIG_TLS_INTERNAL_CLIENT */
    286 	return -1;
    287 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    288 }
    289 
    290 
    291 int tls_global_set_params(void *tls_ctx,
    292 			  const struct tls_connection_params *params)
    293 {
    294 #ifdef CONFIG_TLS_INTERNAL_SERVER
    295 	struct tls_global *global = tls_ctx;
    296 	struct tlsv1_credentials *cred;
    297 
    298 	/* Currently, global parameters are only set when running in server
    299 	 * mode. */
    300 	global->server = 1;
    301 	tlsv1_cred_free(global->server_cred);
    302 	global->server_cred = cred = tlsv1_cred_alloc();
    303 	if (cred == NULL)
    304 		return -1;
    305 
    306 	if (tlsv1_set_ca_cert(cred, params->ca_cert, params->ca_cert_blob,
    307 			      params->ca_cert_blob_len, params->ca_path)) {
    308 		wpa_printf(MSG_INFO, "TLS: Failed to configure trusted CA "
    309 			   "certificates");
    310 		return -1;
    311 	}
    312 
    313 	if (tlsv1_set_cert(cred, params->client_cert, params->client_cert_blob,
    314 			   params->client_cert_blob_len)) {
    315 		wpa_printf(MSG_INFO, "TLS: Failed to configure server "
    316 			   "certificate");
    317 		return -1;
    318 	}
    319 
    320 	if (tlsv1_set_private_key(cred, params->private_key,
    321 				  params->private_key_passwd,
    322 				  params->private_key_blob,
    323 				  params->private_key_blob_len)) {
    324 		wpa_printf(MSG_INFO, "TLS: Failed to load private key");
    325 		return -1;
    326 	}
    327 
    328 	if (tlsv1_set_dhparams(cred, params->dh_file, params->dh_blob,
    329 			       params->dh_blob_len)) {
    330 		wpa_printf(MSG_INFO, "TLS: Failed to load DH parameters");
    331 		return -1;
    332 	}
    333 
    334 	if (params->ocsp_stapling_response)
    335 		cred->ocsp_stapling_response =
    336 			os_strdup(params->ocsp_stapling_response);
    337 	if (params->ocsp_stapling_response_multi)
    338 		cred->ocsp_stapling_response_multi =
    339 			os_strdup(params->ocsp_stapling_response_multi);
    340 
    341 	return 0;
    342 #else /* CONFIG_TLS_INTERNAL_SERVER */
    343 	return -1;
    344 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    345 }
    346 
    347 
    348 int tls_global_set_verify(void *tls_ctx, int check_crl)
    349 {
    350 	struct tls_global *global = tls_ctx;
    351 	global->check_crl = check_crl;
    352 	return 0;
    353 }
    354 
    355 
    356 int tls_connection_set_verify(void *tls_ctx, struct tls_connection *conn,
    357 			      int verify_peer, unsigned int flags,
    358 			      const u8 *session_ctx, size_t session_ctx_len)
    359 {
    360 #ifdef CONFIG_TLS_INTERNAL_SERVER
    361 	if (conn->server)
    362 		return tlsv1_server_set_verify(conn->server, verify_peer);
    363 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    364 	return -1;
    365 }
    366 
    367 
    368 int tls_connection_get_random(void *tls_ctx, struct tls_connection *conn,
    369 			      struct tls_random *data)
    370 {
    371 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    372 	if (conn->client)
    373 		return tlsv1_client_get_random(conn->client, data);
    374 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    375 #ifdef CONFIG_TLS_INTERNAL_SERVER
    376 	if (conn->server)
    377 		return tlsv1_server_get_random(conn->server, data);
    378 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    379 	return -1;
    380 }
    381 
    382 
    383 static int tls_get_keyblock_size(struct tls_connection *conn)
    384 {
    385 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    386 	if (conn->client)
    387 		return tlsv1_client_get_keyblock_size(conn->client);
    388 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    389 #ifdef CONFIG_TLS_INTERNAL_SERVER
    390 	if (conn->server)
    391 		return tlsv1_server_get_keyblock_size(conn->server);
    392 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    393 	return -1;
    394 }
    395 
    396 
    397 int tls_connection_prf(void *tls_ctx, struct tls_connection *conn,
    398 		       const char *label, int server_random_first,
    399 		       int skip_keyblock, u8 *out, size_t out_len)
    400 {
    401 	int ret = -1, skip = 0;
    402 	u8 *tmp_out = NULL;
    403 	u8 *_out = out;
    404 
    405 	if (skip_keyblock) {
    406 		skip = tls_get_keyblock_size(conn);
    407 		if (skip < 0)
    408 			return -1;
    409 		tmp_out = os_malloc(skip + out_len);
    410 		if (!tmp_out)
    411 			return -1;
    412 		_out = tmp_out;
    413 	}
    414 
    415 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    416 	if (conn->client) {
    417 		ret = tlsv1_client_prf(conn->client, label,
    418 				       server_random_first,
    419 				       _out, skip + out_len);
    420 	}
    421 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    422 #ifdef CONFIG_TLS_INTERNAL_SERVER
    423 	if (conn->server) {
    424 		ret = tlsv1_server_prf(conn->server, label,
    425 				       server_random_first,
    426 				       _out, skip + out_len);
    427 	}
    428 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    429 	if (ret == 0 && skip_keyblock)
    430 		os_memcpy(out, _out + skip, out_len);
    431 	bin_clear_free(tmp_out, skip);
    432 
    433 	return ret;
    434 }
    435 
    436 
    437 struct wpabuf * tls_connection_handshake(void *tls_ctx,
    438 					 struct tls_connection *conn,
    439 					 const struct wpabuf *in_data,
    440 					 struct wpabuf **appl_data)
    441 {
    442 	return tls_connection_handshake2(tls_ctx, conn, in_data, appl_data,
    443 					 NULL);
    444 }
    445 
    446 
    447 struct wpabuf * tls_connection_handshake2(void *tls_ctx,
    448 					  struct tls_connection *conn,
    449 					  const struct wpabuf *in_data,
    450 					  struct wpabuf **appl_data,
    451 					  int *need_more_data)
    452 {
    453 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    454 	u8 *res, *ad;
    455 	size_t res_len, ad_len;
    456 	struct wpabuf *out;
    457 
    458 	if (conn->client == NULL)
    459 		return NULL;
    460 
    461 	ad = NULL;
    462 	res = tlsv1_client_handshake(conn->client,
    463 				     in_data ? wpabuf_head(in_data) : NULL,
    464 				     in_data ? wpabuf_len(in_data) : 0,
    465 				     &res_len, &ad, &ad_len, need_more_data);
    466 	if (res == NULL)
    467 		return NULL;
    468 	out = wpabuf_alloc_ext_data(res, res_len);
    469 	if (out == NULL) {
    470 		os_free(res);
    471 		os_free(ad);
    472 		return NULL;
    473 	}
    474 	if (appl_data) {
    475 		if (ad) {
    476 			*appl_data = wpabuf_alloc_ext_data(ad, ad_len);
    477 			if (*appl_data == NULL)
    478 				os_free(ad);
    479 		} else
    480 			*appl_data = NULL;
    481 	} else
    482 		os_free(ad);
    483 
    484 	return out;
    485 #else /* CONFIG_TLS_INTERNAL_CLIENT */
    486 	return NULL;
    487 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    488 }
    489 
    490 
    491 struct wpabuf * tls_connection_server_handshake(void *tls_ctx,
    492 						struct tls_connection *conn,
    493 						const struct wpabuf *in_data,
    494 						struct wpabuf **appl_data)
    495 {
    496 #ifdef CONFIG_TLS_INTERNAL_SERVER
    497 	u8 *res;
    498 	size_t res_len;
    499 	struct wpabuf *out;
    500 
    501 	if (conn->server == NULL)
    502 		return NULL;
    503 
    504 	if (appl_data)
    505 		*appl_data = NULL;
    506 
    507 	res = tlsv1_server_handshake(conn->server, wpabuf_head(in_data),
    508 				     wpabuf_len(in_data), &res_len);
    509 	if (res == NULL && tlsv1_server_established(conn->server))
    510 		return wpabuf_alloc(0);
    511 	if (res == NULL)
    512 		return NULL;
    513 	out = wpabuf_alloc_ext_data(res, res_len);
    514 	if (out == NULL) {
    515 		os_free(res);
    516 		return NULL;
    517 	}
    518 
    519 	return out;
    520 #else /* CONFIG_TLS_INTERNAL_SERVER */
    521 	return NULL;
    522 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    523 }
    524 
    525 
    526 struct wpabuf * tls_connection_encrypt(void *tls_ctx,
    527 				       struct tls_connection *conn,
    528 				       const struct wpabuf *in_data)
    529 {
    530 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    531 	if (conn->client) {
    532 		struct wpabuf *buf;
    533 		int res;
    534 		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
    535 		if (buf == NULL)
    536 			return NULL;
    537 		res = tlsv1_client_encrypt(conn->client, wpabuf_head(in_data),
    538 					   wpabuf_len(in_data),
    539 					   wpabuf_mhead(buf),
    540 					   wpabuf_size(buf));
    541 		if (res < 0) {
    542 			wpabuf_free(buf);
    543 			return NULL;
    544 		}
    545 		wpabuf_put(buf, res);
    546 		return buf;
    547 	}
    548 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    549 #ifdef CONFIG_TLS_INTERNAL_SERVER
    550 	if (conn->server) {
    551 		struct wpabuf *buf;
    552 		int res;
    553 		buf = wpabuf_alloc(wpabuf_len(in_data) + 300);
    554 		if (buf == NULL)
    555 			return NULL;
    556 		res = tlsv1_server_encrypt(conn->server, wpabuf_head(in_data),
    557 					   wpabuf_len(in_data),
    558 					   wpabuf_mhead(buf),
    559 					   wpabuf_size(buf));
    560 		if (res < 0) {
    561 			wpabuf_free(buf);
    562 			return NULL;
    563 		}
    564 		wpabuf_put(buf, res);
    565 		return buf;
    566 	}
    567 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    568 	return NULL;
    569 }
    570 
    571 
    572 struct wpabuf * tls_connection_decrypt(void *tls_ctx,
    573 				       struct tls_connection *conn,
    574 				       const struct wpabuf *in_data)
    575 {
    576 	return tls_connection_decrypt2(tls_ctx, conn, in_data, NULL);
    577 }
    578 
    579 
    580 struct wpabuf * tls_connection_decrypt2(void *tls_ctx,
    581 					struct tls_connection *conn,
    582 					const struct wpabuf *in_data,
    583 					int *need_more_data)
    584 {
    585 	if (need_more_data)
    586 		*need_more_data = 0;
    587 
    588 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    589 	if (conn->client) {
    590 		return tlsv1_client_decrypt(conn->client, wpabuf_head(in_data),
    591 					    wpabuf_len(in_data),
    592 					    need_more_data);
    593 	}
    594 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    595 #ifdef CONFIG_TLS_INTERNAL_SERVER
    596 	if (conn->server) {
    597 		struct wpabuf *buf;
    598 		int res;
    599 		buf = wpabuf_alloc((wpabuf_len(in_data) + 500) * 3);
    600 		if (buf == NULL)
    601 			return NULL;
    602 		res = tlsv1_server_decrypt(conn->server, wpabuf_head(in_data),
    603 					   wpabuf_len(in_data),
    604 					   wpabuf_mhead(buf),
    605 					   wpabuf_size(buf));
    606 		if (res < 0) {
    607 			wpabuf_free(buf);
    608 			return NULL;
    609 		}
    610 		wpabuf_put(buf, res);
    611 		return buf;
    612 	}
    613 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    614 	return NULL;
    615 }
    616 
    617 
    618 int tls_connection_resumed(void *tls_ctx, struct tls_connection *conn)
    619 {
    620 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    621 	if (conn->client)
    622 		return tlsv1_client_resumed(conn->client);
    623 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    624 #ifdef CONFIG_TLS_INTERNAL_SERVER
    625 	if (conn->server)
    626 		return tlsv1_server_resumed(conn->server);
    627 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    628 	return -1;
    629 }
    630 
    631 
    632 int tls_connection_set_cipher_list(void *tls_ctx, struct tls_connection *conn,
    633 				   u8 *ciphers)
    634 {
    635 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    636 	if (conn->client)
    637 		return tlsv1_client_set_cipher_list(conn->client, ciphers);
    638 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    639 #ifdef CONFIG_TLS_INTERNAL_SERVER
    640 	if (conn->server)
    641 		return tlsv1_server_set_cipher_list(conn->server, ciphers);
    642 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    643 	return -1;
    644 }
    645 
    646 
    647 int tls_get_version(void *ssl_ctx, struct tls_connection *conn,
    648 		    char *buf, size_t buflen)
    649 {
    650 	if (conn == NULL)
    651 		return -1;
    652 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    653 	if (conn->client)
    654 		return tlsv1_client_get_version(conn->client, buf, buflen);
    655 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    656 	return -1;
    657 }
    658 
    659 
    660 int tls_get_cipher(void *tls_ctx, struct tls_connection *conn,
    661 		   char *buf, size_t buflen)
    662 {
    663 	if (conn == NULL)
    664 		return -1;
    665 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    666 	if (conn->client)
    667 		return tlsv1_client_get_cipher(conn->client, buf, buflen);
    668 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    669 #ifdef CONFIG_TLS_INTERNAL_SERVER
    670 	if (conn->server)
    671 		return tlsv1_server_get_cipher(conn->server, buf, buflen);
    672 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    673 	return -1;
    674 }
    675 
    676 
    677 int tls_connection_enable_workaround(void *tls_ctx,
    678 				     struct tls_connection *conn)
    679 {
    680 	return -1;
    681 }
    682 
    683 
    684 int tls_connection_client_hello_ext(void *tls_ctx, struct tls_connection *conn,
    685 				    int ext_type, const u8 *data,
    686 				    size_t data_len)
    687 {
    688 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    689 	if (conn->client) {
    690 		return tlsv1_client_hello_ext(conn->client, ext_type,
    691 					      data, data_len);
    692 	}
    693 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    694 	return -1;
    695 }
    696 
    697 
    698 int tls_connection_get_failed(void *tls_ctx, struct tls_connection *conn)
    699 {
    700 	return 0;
    701 }
    702 
    703 
    704 int tls_connection_get_read_alerts(void *tls_ctx, struct tls_connection *conn)
    705 {
    706 	return 0;
    707 }
    708 
    709 
    710 int tls_connection_get_write_alerts(void *tls_ctx,
    711 				    struct tls_connection *conn)
    712 {
    713 	return 0;
    714 }
    715 
    716 
    717 int tls_connection_set_session_ticket_cb(void *tls_ctx,
    718 					 struct tls_connection *conn,
    719 					 tls_session_ticket_cb cb,
    720 					 void *ctx)
    721 {
    722 #ifdef CONFIG_TLS_INTERNAL_CLIENT
    723 	if (conn->client) {
    724 		tlsv1_client_set_session_ticket_cb(conn->client, cb, ctx);
    725 		return 0;
    726 	}
    727 #endif /* CONFIG_TLS_INTERNAL_CLIENT */
    728 #ifdef CONFIG_TLS_INTERNAL_SERVER
    729 	if (conn->server) {
    730 		tlsv1_server_set_session_ticket_cb(conn->server, cb, ctx);
    731 		return 0;
    732 	}
    733 #endif /* CONFIG_TLS_INTERNAL_SERVER */
    734 	return -1;
    735 }
    736 
    737 
    738 int tls_get_library_version(char *buf, size_t buf_len)
    739 {
    740 	return os_snprintf(buf, buf_len, "internal");
    741 }
    742 
    743 
    744 void tls_connection_set_success_data(struct tls_connection *conn,
    745 				     struct wpabuf *data)
    746 {
    747 }
    748 
    749 
    750 void tls_connection_set_success_data_resumed(struct tls_connection *conn)
    751 {
    752 }
    753 
    754 
    755 const struct wpabuf *
    756 tls_connection_get_success_data(struct tls_connection *conn)
    757 {
    758 	return NULL;
    759 }
    760 
    761 
    762 void tls_connection_remove_session(struct tls_connection *conn)
    763 {
    764 }
    765