139beb93cSSam Leffler /* 239beb93cSSam Leffler * EAP peer method: EAP-TLS (RFC 2716) 3*780fb4a2SCy Schubert * Copyright (c) 2004-2008, 2012-2015, 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 939beb93cSSam Leffler #include "includes.h" 1039beb93cSSam Leffler 1139beb93cSSam Leffler #include "common.h" 12e28a4053SRui Paulo #include "crypto/tls.h" 1339beb93cSSam Leffler #include "eap_i.h" 1439beb93cSSam Leffler #include "eap_tls_common.h" 1539beb93cSSam Leffler #include "eap_config.h" 1639beb93cSSam Leffler 1739beb93cSSam Leffler 1839beb93cSSam Leffler static void eap_tls_deinit(struct eap_sm *sm, void *priv); 1939beb93cSSam Leffler 2039beb93cSSam Leffler 2139beb93cSSam Leffler struct eap_tls_data { 2239beb93cSSam Leffler struct eap_ssl_data ssl; 2339beb93cSSam Leffler u8 *key_data; 245b9c547cSRui Paulo u8 *session_id; 255b9c547cSRui Paulo size_t id_len; 26f05cddf9SRui Paulo void *ssl_ctx; 27f05cddf9SRui Paulo u8 eap_type; 28*780fb4a2SCy Schubert struct wpabuf *pending_resp; 2939beb93cSSam Leffler }; 3039beb93cSSam Leffler 3139beb93cSSam Leffler 3239beb93cSSam Leffler static void * eap_tls_init(struct eap_sm *sm) 3339beb93cSSam Leffler { 3439beb93cSSam Leffler struct eap_tls_data *data; 3539beb93cSSam Leffler struct eap_peer_config *config = eap_get_config(sm); 3639beb93cSSam Leffler if (config == NULL || 3739beb93cSSam Leffler ((sm->init_phase2 ? config->private_key2 : config->private_key) 3839beb93cSSam Leffler == NULL && 3939beb93cSSam Leffler (sm->init_phase2 ? config->engine2 : config->engine) == 0)) { 4039beb93cSSam Leffler wpa_printf(MSG_INFO, "EAP-TLS: Private key not configured"); 4139beb93cSSam Leffler return NULL; 4239beb93cSSam Leffler } 4339beb93cSSam Leffler 4439beb93cSSam Leffler data = os_zalloc(sizeof(*data)); 4539beb93cSSam Leffler if (data == NULL) 4639beb93cSSam Leffler return NULL; 4739beb93cSSam Leffler 48f05cddf9SRui Paulo data->ssl_ctx = sm->init_phase2 && sm->ssl_ctx2 ? sm->ssl_ctx2 : 49f05cddf9SRui Paulo sm->ssl_ctx; 50f05cddf9SRui Paulo 51f05cddf9SRui Paulo if (eap_peer_tls_ssl_init(sm, &data->ssl, config, EAP_TYPE_TLS)) { 5239beb93cSSam Leffler wpa_printf(MSG_INFO, "EAP-TLS: Failed to initialize SSL."); 5339beb93cSSam Leffler eap_tls_deinit(sm, data); 5439beb93cSSam Leffler if (config->engine) { 5539beb93cSSam Leffler wpa_printf(MSG_DEBUG, "EAP-TLS: Requesting Smartcard " 5639beb93cSSam Leffler "PIN"); 5739beb93cSSam Leffler eap_sm_request_pin(sm); 5839beb93cSSam Leffler sm->ignore = TRUE; 5939beb93cSSam Leffler } else if (config->private_key && !config->private_key_passwd) 6039beb93cSSam Leffler { 6139beb93cSSam Leffler wpa_printf(MSG_DEBUG, "EAP-TLS: Requesting private " 6239beb93cSSam Leffler "key passphrase"); 6339beb93cSSam Leffler eap_sm_request_passphrase(sm); 6439beb93cSSam Leffler sm->ignore = TRUE; 6539beb93cSSam Leffler } 6639beb93cSSam Leffler return NULL; 6739beb93cSSam Leffler } 6839beb93cSSam Leffler 69f05cddf9SRui Paulo data->eap_type = EAP_TYPE_TLS; 70f05cddf9SRui Paulo 7139beb93cSSam Leffler return data; 7239beb93cSSam Leffler } 7339beb93cSSam Leffler 7439beb93cSSam Leffler 75f05cddf9SRui Paulo #ifdef EAP_UNAUTH_TLS 76f05cddf9SRui Paulo static void * eap_unauth_tls_init(struct eap_sm *sm) 77f05cddf9SRui Paulo { 78f05cddf9SRui Paulo struct eap_tls_data *data; 79f05cddf9SRui Paulo struct eap_peer_config *config = eap_get_config(sm); 80f05cddf9SRui Paulo 81f05cddf9SRui Paulo data = os_zalloc(sizeof(*data)); 82f05cddf9SRui Paulo if (data == NULL) 83f05cddf9SRui Paulo return NULL; 84f05cddf9SRui Paulo 85f05cddf9SRui Paulo data->ssl_ctx = sm->init_phase2 && sm->ssl_ctx2 ? sm->ssl_ctx2 : 86f05cddf9SRui Paulo sm->ssl_ctx; 87f05cddf9SRui Paulo 88f05cddf9SRui Paulo if (eap_peer_tls_ssl_init(sm, &data->ssl, config, 89f05cddf9SRui Paulo EAP_UNAUTH_TLS_TYPE)) { 90f05cddf9SRui Paulo wpa_printf(MSG_INFO, "EAP-TLS: Failed to initialize SSL."); 91f05cddf9SRui Paulo eap_tls_deinit(sm, data); 92f05cddf9SRui Paulo return NULL; 93f05cddf9SRui Paulo } 94f05cddf9SRui Paulo 95f05cddf9SRui Paulo data->eap_type = EAP_UNAUTH_TLS_TYPE; 96f05cddf9SRui Paulo 97f05cddf9SRui Paulo return data; 98f05cddf9SRui Paulo } 99f05cddf9SRui Paulo #endif /* EAP_UNAUTH_TLS */ 100f05cddf9SRui Paulo 101f05cddf9SRui Paulo 1025b9c547cSRui Paulo #ifdef CONFIG_HS20 1035b9c547cSRui Paulo static void * eap_wfa_unauth_tls_init(struct eap_sm *sm) 1045b9c547cSRui Paulo { 1055b9c547cSRui Paulo struct eap_tls_data *data; 1065b9c547cSRui Paulo struct eap_peer_config *config = eap_get_config(sm); 1075b9c547cSRui Paulo 1085b9c547cSRui Paulo data = os_zalloc(sizeof(*data)); 1095b9c547cSRui Paulo if (data == NULL) 1105b9c547cSRui Paulo return NULL; 1115b9c547cSRui Paulo 1125b9c547cSRui Paulo data->ssl_ctx = sm->init_phase2 && sm->ssl_ctx2 ? sm->ssl_ctx2 : 1135b9c547cSRui Paulo sm->ssl_ctx; 1145b9c547cSRui Paulo 1155b9c547cSRui Paulo if (eap_peer_tls_ssl_init(sm, &data->ssl, config, 1165b9c547cSRui Paulo EAP_WFA_UNAUTH_TLS_TYPE)) { 1175b9c547cSRui Paulo wpa_printf(MSG_INFO, "EAP-TLS: Failed to initialize SSL."); 1185b9c547cSRui Paulo eap_tls_deinit(sm, data); 1195b9c547cSRui Paulo return NULL; 1205b9c547cSRui Paulo } 1215b9c547cSRui Paulo 1225b9c547cSRui Paulo data->eap_type = EAP_WFA_UNAUTH_TLS_TYPE; 1235b9c547cSRui Paulo 1245b9c547cSRui Paulo return data; 1255b9c547cSRui Paulo } 1265b9c547cSRui Paulo #endif /* CONFIG_HS20 */ 1275b9c547cSRui Paulo 1285b9c547cSRui Paulo 1295b9c547cSRui Paulo static void eap_tls_free_key(struct eap_tls_data *data) 1305b9c547cSRui Paulo { 1315b9c547cSRui Paulo if (data->key_data) { 1325b9c547cSRui Paulo bin_clear_free(data->key_data, EAP_TLS_KEY_LEN + EAP_EMSK_LEN); 1335b9c547cSRui Paulo data->key_data = NULL; 1345b9c547cSRui Paulo } 1355b9c547cSRui Paulo } 1365b9c547cSRui Paulo 1375b9c547cSRui Paulo 13839beb93cSSam Leffler static void eap_tls_deinit(struct eap_sm *sm, void *priv) 13939beb93cSSam Leffler { 14039beb93cSSam Leffler struct eap_tls_data *data = priv; 14139beb93cSSam Leffler if (data == NULL) 14239beb93cSSam Leffler return; 14339beb93cSSam Leffler eap_peer_tls_ssl_deinit(sm, &data->ssl); 1445b9c547cSRui Paulo eap_tls_free_key(data); 1455b9c547cSRui Paulo os_free(data->session_id); 146*780fb4a2SCy Schubert wpabuf_free(data->pending_resp); 14739beb93cSSam Leffler os_free(data); 14839beb93cSSam Leffler } 14939beb93cSSam Leffler 15039beb93cSSam Leffler 15139beb93cSSam Leffler static struct wpabuf * eap_tls_failure(struct eap_sm *sm, 15239beb93cSSam Leffler struct eap_tls_data *data, 15339beb93cSSam Leffler struct eap_method_ret *ret, int res, 15439beb93cSSam Leffler struct wpabuf *resp, u8 id) 15539beb93cSSam Leffler { 15639beb93cSSam Leffler wpa_printf(MSG_DEBUG, "EAP-TLS: TLS processing failed"); 15739beb93cSSam Leffler 15839beb93cSSam Leffler ret->methodState = METHOD_DONE; 15939beb93cSSam Leffler ret->decision = DECISION_FAIL; 16039beb93cSSam Leffler 16139beb93cSSam Leffler if (resp) { 16239beb93cSSam Leffler /* 16339beb93cSSam Leffler * This is likely an alert message, so send it instead of just 16439beb93cSSam Leffler * ACKing the error. 16539beb93cSSam Leffler */ 16639beb93cSSam Leffler return resp; 16739beb93cSSam Leffler } 16839beb93cSSam Leffler 169f05cddf9SRui Paulo return eap_peer_tls_build_ack(id, data->eap_type, 0); 17039beb93cSSam Leffler } 17139beb93cSSam Leffler 17239beb93cSSam Leffler 17339beb93cSSam Leffler static void eap_tls_success(struct eap_sm *sm, struct eap_tls_data *data, 17439beb93cSSam Leffler struct eap_method_ret *ret) 17539beb93cSSam Leffler { 17639beb93cSSam Leffler wpa_printf(MSG_DEBUG, "EAP-TLS: Done"); 17739beb93cSSam Leffler 17839beb93cSSam Leffler ret->methodState = METHOD_DONE; 17939beb93cSSam Leffler ret->decision = DECISION_UNCOND_SUCC; 18039beb93cSSam Leffler 1815b9c547cSRui Paulo eap_tls_free_key(data); 18239beb93cSSam Leffler data->key_data = eap_peer_tls_derive_key(sm, &data->ssl, 18339beb93cSSam Leffler "client EAP encryption", 18439beb93cSSam Leffler EAP_TLS_KEY_LEN + 18539beb93cSSam Leffler EAP_EMSK_LEN); 18639beb93cSSam Leffler if (data->key_data) { 18739beb93cSSam Leffler wpa_hexdump_key(MSG_DEBUG, "EAP-TLS: Derived key", 18839beb93cSSam Leffler data->key_data, EAP_TLS_KEY_LEN); 18939beb93cSSam Leffler wpa_hexdump_key(MSG_DEBUG, "EAP-TLS: Derived EMSK", 19039beb93cSSam Leffler data->key_data + EAP_TLS_KEY_LEN, 19139beb93cSSam Leffler EAP_EMSK_LEN); 19239beb93cSSam Leffler } else { 19339beb93cSSam Leffler wpa_printf(MSG_INFO, "EAP-TLS: Failed to derive key"); 19439beb93cSSam Leffler } 1955b9c547cSRui Paulo 1965b9c547cSRui Paulo os_free(data->session_id); 1975b9c547cSRui Paulo data->session_id = eap_peer_tls_derive_session_id(sm, &data->ssl, 1985b9c547cSRui Paulo EAP_TYPE_TLS, 1995b9c547cSRui Paulo &data->id_len); 2005b9c547cSRui Paulo if (data->session_id) { 2015b9c547cSRui Paulo wpa_hexdump(MSG_DEBUG, "EAP-TLS: Derived Session-Id", 2025b9c547cSRui Paulo data->session_id, data->id_len); 2035b9c547cSRui Paulo } else { 2045b9c547cSRui Paulo wpa_printf(MSG_ERROR, "EAP-TLS: Failed to derive Session-Id"); 2055b9c547cSRui Paulo } 20639beb93cSSam Leffler } 20739beb93cSSam Leffler 20839beb93cSSam Leffler 20939beb93cSSam Leffler static struct wpabuf * eap_tls_process(struct eap_sm *sm, void *priv, 21039beb93cSSam Leffler struct eap_method_ret *ret, 21139beb93cSSam Leffler const struct wpabuf *reqData) 21239beb93cSSam Leffler { 21339beb93cSSam Leffler size_t left; 21439beb93cSSam Leffler int res; 21539beb93cSSam Leffler struct wpabuf *resp; 21639beb93cSSam Leffler u8 flags, id; 21739beb93cSSam Leffler const u8 *pos; 21839beb93cSSam Leffler struct eap_tls_data *data = priv; 219325151a3SRui Paulo struct wpabuf msg; 22039beb93cSSam Leffler 221*780fb4a2SCy Schubert if (sm->waiting_ext_cert_check && data->pending_resp) { 222*780fb4a2SCy Schubert struct eap_peer_config *config = eap_get_config(sm); 223*780fb4a2SCy Schubert 224*780fb4a2SCy Schubert if (config->pending_ext_cert_check == EXT_CERT_CHECK_GOOD) { 225*780fb4a2SCy Schubert wpa_printf(MSG_DEBUG, 226*780fb4a2SCy Schubert "EAP-TLS: External certificate check succeeded - continue handshake"); 227*780fb4a2SCy Schubert resp = data->pending_resp; 228*780fb4a2SCy Schubert data->pending_resp = NULL; 229*780fb4a2SCy Schubert sm->waiting_ext_cert_check = 0; 230*780fb4a2SCy Schubert return resp; 231*780fb4a2SCy Schubert } 232*780fb4a2SCy Schubert 233*780fb4a2SCy Schubert if (config->pending_ext_cert_check == EXT_CERT_CHECK_BAD) { 234*780fb4a2SCy Schubert wpa_printf(MSG_DEBUG, 235*780fb4a2SCy Schubert "EAP-TLS: External certificate check failed - force authentication failure"); 236*780fb4a2SCy Schubert ret->methodState = METHOD_DONE; 237*780fb4a2SCy Schubert ret->decision = DECISION_FAIL; 238*780fb4a2SCy Schubert sm->waiting_ext_cert_check = 0; 239*780fb4a2SCy Schubert return NULL; 240*780fb4a2SCy Schubert } 241*780fb4a2SCy Schubert 242*780fb4a2SCy Schubert wpa_printf(MSG_DEBUG, 243*780fb4a2SCy Schubert "EAP-TLS: Continuing to wait external server certificate validation"); 244*780fb4a2SCy Schubert return NULL; 245*780fb4a2SCy Schubert } 246*780fb4a2SCy Schubert 247f05cddf9SRui Paulo pos = eap_peer_tls_process_init(sm, &data->ssl, data->eap_type, ret, 24839beb93cSSam Leffler reqData, &left, &flags); 24939beb93cSSam Leffler if (pos == NULL) 25039beb93cSSam Leffler return NULL; 25139beb93cSSam Leffler id = eap_get_id(reqData); 25239beb93cSSam Leffler 25339beb93cSSam Leffler if (flags & EAP_TLS_FLAGS_START) { 25439beb93cSSam Leffler wpa_printf(MSG_DEBUG, "EAP-TLS: Start"); 25539beb93cSSam Leffler left = 0; /* make sure that this frame is empty, even though it 25639beb93cSSam Leffler * should always be, anyway */ 25739beb93cSSam Leffler } 25839beb93cSSam Leffler 25939beb93cSSam Leffler resp = NULL; 260325151a3SRui Paulo wpabuf_set(&msg, pos, left); 261f05cddf9SRui Paulo res = eap_peer_tls_process_helper(sm, &data->ssl, data->eap_type, 0, 262325151a3SRui Paulo id, &msg, &resp); 26339beb93cSSam Leffler 26439beb93cSSam Leffler if (res < 0) { 26539beb93cSSam Leffler return eap_tls_failure(sm, data, ret, res, resp, id); 26639beb93cSSam Leffler } 26739beb93cSSam Leffler 268*780fb4a2SCy Schubert if (sm->waiting_ext_cert_check) { 269*780fb4a2SCy Schubert wpa_printf(MSG_DEBUG, 270*780fb4a2SCy Schubert "EAP-TLS: Waiting external server certificate validation"); 271*780fb4a2SCy Schubert wpabuf_free(data->pending_resp); 272*780fb4a2SCy Schubert data->pending_resp = resp; 273*780fb4a2SCy Schubert return NULL; 274*780fb4a2SCy Schubert } 275*780fb4a2SCy Schubert 276f05cddf9SRui Paulo if (tls_connection_established(data->ssl_ctx, data->ssl.conn)) 27739beb93cSSam Leffler eap_tls_success(sm, data, ret); 27839beb93cSSam Leffler 27939beb93cSSam Leffler if (res == 1) { 28039beb93cSSam Leffler wpabuf_free(resp); 281f05cddf9SRui Paulo return eap_peer_tls_build_ack(id, data->eap_type, 0); 28239beb93cSSam Leffler } 28339beb93cSSam Leffler 28439beb93cSSam Leffler return resp; 28539beb93cSSam Leffler } 28639beb93cSSam Leffler 28739beb93cSSam Leffler 28839beb93cSSam Leffler static Boolean eap_tls_has_reauth_data(struct eap_sm *sm, void *priv) 28939beb93cSSam Leffler { 29039beb93cSSam Leffler struct eap_tls_data *data = priv; 291f05cddf9SRui Paulo return tls_connection_established(data->ssl_ctx, data->ssl.conn); 29239beb93cSSam Leffler } 29339beb93cSSam Leffler 29439beb93cSSam Leffler 29539beb93cSSam Leffler static void eap_tls_deinit_for_reauth(struct eap_sm *sm, void *priv) 29639beb93cSSam Leffler { 297*780fb4a2SCy Schubert struct eap_tls_data *data = priv; 298*780fb4a2SCy Schubert 299*780fb4a2SCy Schubert wpabuf_free(data->pending_resp); 300*780fb4a2SCy Schubert data->pending_resp = NULL; 30139beb93cSSam Leffler } 30239beb93cSSam Leffler 30339beb93cSSam Leffler 30439beb93cSSam Leffler static void * eap_tls_init_for_reauth(struct eap_sm *sm, void *priv) 30539beb93cSSam Leffler { 30639beb93cSSam Leffler struct eap_tls_data *data = priv; 3075b9c547cSRui Paulo eap_tls_free_key(data); 3085b9c547cSRui Paulo os_free(data->session_id); 3095b9c547cSRui Paulo data->session_id = NULL; 31039beb93cSSam Leffler if (eap_peer_tls_reauth_init(sm, &data->ssl)) { 31139beb93cSSam Leffler os_free(data); 31239beb93cSSam Leffler return NULL; 31339beb93cSSam Leffler } 31439beb93cSSam Leffler return priv; 31539beb93cSSam Leffler } 31639beb93cSSam Leffler 31739beb93cSSam Leffler 31839beb93cSSam Leffler static int eap_tls_get_status(struct eap_sm *sm, void *priv, char *buf, 31939beb93cSSam Leffler size_t buflen, int verbose) 32039beb93cSSam Leffler { 32139beb93cSSam Leffler struct eap_tls_data *data = priv; 32239beb93cSSam Leffler return eap_peer_tls_status(sm, &data->ssl, buf, buflen, verbose); 32339beb93cSSam Leffler } 32439beb93cSSam Leffler 32539beb93cSSam Leffler 32639beb93cSSam Leffler static Boolean eap_tls_isKeyAvailable(struct eap_sm *sm, void *priv) 32739beb93cSSam Leffler { 32839beb93cSSam Leffler struct eap_tls_data *data = priv; 32939beb93cSSam Leffler return data->key_data != NULL; 33039beb93cSSam Leffler } 33139beb93cSSam Leffler 33239beb93cSSam Leffler 33339beb93cSSam Leffler static u8 * eap_tls_getKey(struct eap_sm *sm, void *priv, size_t *len) 33439beb93cSSam Leffler { 33539beb93cSSam Leffler struct eap_tls_data *data = priv; 33639beb93cSSam Leffler u8 *key; 33739beb93cSSam Leffler 33839beb93cSSam Leffler if (data->key_data == NULL) 33939beb93cSSam Leffler return NULL; 34039beb93cSSam Leffler 34139beb93cSSam Leffler key = os_malloc(EAP_TLS_KEY_LEN); 34239beb93cSSam Leffler if (key == NULL) 34339beb93cSSam Leffler return NULL; 34439beb93cSSam Leffler 34539beb93cSSam Leffler *len = EAP_TLS_KEY_LEN; 34639beb93cSSam Leffler os_memcpy(key, data->key_data, EAP_TLS_KEY_LEN); 34739beb93cSSam Leffler 34839beb93cSSam Leffler return key; 34939beb93cSSam Leffler } 35039beb93cSSam Leffler 35139beb93cSSam Leffler 35239beb93cSSam Leffler static u8 * eap_tls_get_emsk(struct eap_sm *sm, void *priv, size_t *len) 35339beb93cSSam Leffler { 35439beb93cSSam Leffler struct eap_tls_data *data = priv; 35539beb93cSSam Leffler u8 *key; 35639beb93cSSam Leffler 35739beb93cSSam Leffler if (data->key_data == NULL) 35839beb93cSSam Leffler return NULL; 35939beb93cSSam Leffler 36039beb93cSSam Leffler key = os_malloc(EAP_EMSK_LEN); 36139beb93cSSam Leffler if (key == NULL) 36239beb93cSSam Leffler return NULL; 36339beb93cSSam Leffler 36439beb93cSSam Leffler *len = EAP_EMSK_LEN; 36539beb93cSSam Leffler os_memcpy(key, data->key_data + EAP_TLS_KEY_LEN, EAP_EMSK_LEN); 36639beb93cSSam Leffler 36739beb93cSSam Leffler return key; 36839beb93cSSam Leffler } 36939beb93cSSam Leffler 37039beb93cSSam Leffler 3715b9c547cSRui Paulo static u8 * eap_tls_get_session_id(struct eap_sm *sm, void *priv, size_t *len) 3725b9c547cSRui Paulo { 3735b9c547cSRui Paulo struct eap_tls_data *data = priv; 3745b9c547cSRui Paulo u8 *id; 3755b9c547cSRui Paulo 3765b9c547cSRui Paulo if (data->session_id == NULL) 3775b9c547cSRui Paulo return NULL; 3785b9c547cSRui Paulo 3795b9c547cSRui Paulo id = os_malloc(data->id_len); 3805b9c547cSRui Paulo if (id == NULL) 3815b9c547cSRui Paulo return NULL; 3825b9c547cSRui Paulo 3835b9c547cSRui Paulo *len = data->id_len; 3845b9c547cSRui Paulo os_memcpy(id, data->session_id, data->id_len); 3855b9c547cSRui Paulo 3865b9c547cSRui Paulo return id; 3875b9c547cSRui Paulo } 3885b9c547cSRui Paulo 3895b9c547cSRui Paulo 39039beb93cSSam Leffler int eap_peer_tls_register(void) 39139beb93cSSam Leffler { 39239beb93cSSam Leffler struct eap_method *eap; 39339beb93cSSam Leffler 39439beb93cSSam Leffler eap = eap_peer_method_alloc(EAP_PEER_METHOD_INTERFACE_VERSION, 39539beb93cSSam Leffler EAP_VENDOR_IETF, EAP_TYPE_TLS, "TLS"); 39639beb93cSSam Leffler if (eap == NULL) 39739beb93cSSam Leffler return -1; 39839beb93cSSam Leffler 39939beb93cSSam Leffler eap->init = eap_tls_init; 40039beb93cSSam Leffler eap->deinit = eap_tls_deinit; 40139beb93cSSam Leffler eap->process = eap_tls_process; 40239beb93cSSam Leffler eap->isKeyAvailable = eap_tls_isKeyAvailable; 40339beb93cSSam Leffler eap->getKey = eap_tls_getKey; 4045b9c547cSRui Paulo eap->getSessionId = eap_tls_get_session_id; 40539beb93cSSam Leffler eap->get_status = eap_tls_get_status; 40639beb93cSSam Leffler eap->has_reauth_data = eap_tls_has_reauth_data; 40739beb93cSSam Leffler eap->deinit_for_reauth = eap_tls_deinit_for_reauth; 40839beb93cSSam Leffler eap->init_for_reauth = eap_tls_init_for_reauth; 40939beb93cSSam Leffler eap->get_emsk = eap_tls_get_emsk; 41039beb93cSSam Leffler 411*780fb4a2SCy Schubert return eap_peer_method_register(eap); 41239beb93cSSam Leffler } 413f05cddf9SRui Paulo 414f05cddf9SRui Paulo 415f05cddf9SRui Paulo #ifdef EAP_UNAUTH_TLS 416f05cddf9SRui Paulo int eap_peer_unauth_tls_register(void) 417f05cddf9SRui Paulo { 418f05cddf9SRui Paulo struct eap_method *eap; 419f05cddf9SRui Paulo 420f05cddf9SRui Paulo eap = eap_peer_method_alloc(EAP_PEER_METHOD_INTERFACE_VERSION, 421f05cddf9SRui Paulo EAP_VENDOR_UNAUTH_TLS, 422f05cddf9SRui Paulo EAP_VENDOR_TYPE_UNAUTH_TLS, "UNAUTH-TLS"); 423f05cddf9SRui Paulo if (eap == NULL) 424f05cddf9SRui Paulo return -1; 425f05cddf9SRui Paulo 426f05cddf9SRui Paulo eap->init = eap_unauth_tls_init; 427f05cddf9SRui Paulo eap->deinit = eap_tls_deinit; 428f05cddf9SRui Paulo eap->process = eap_tls_process; 429f05cddf9SRui Paulo eap->isKeyAvailable = eap_tls_isKeyAvailable; 430f05cddf9SRui Paulo eap->getKey = eap_tls_getKey; 431f05cddf9SRui Paulo eap->get_status = eap_tls_get_status; 432f05cddf9SRui Paulo eap->has_reauth_data = eap_tls_has_reauth_data; 433f05cddf9SRui Paulo eap->deinit_for_reauth = eap_tls_deinit_for_reauth; 434f05cddf9SRui Paulo eap->init_for_reauth = eap_tls_init_for_reauth; 435f05cddf9SRui Paulo eap->get_emsk = eap_tls_get_emsk; 436f05cddf9SRui Paulo 437*780fb4a2SCy Schubert return eap_peer_method_register(eap); 438f05cddf9SRui Paulo } 439f05cddf9SRui Paulo #endif /* EAP_UNAUTH_TLS */ 4405b9c547cSRui Paulo 4415b9c547cSRui Paulo 4425b9c547cSRui Paulo #ifdef CONFIG_HS20 4435b9c547cSRui Paulo int eap_peer_wfa_unauth_tls_register(void) 4445b9c547cSRui Paulo { 4455b9c547cSRui Paulo struct eap_method *eap; 4465b9c547cSRui Paulo 4475b9c547cSRui Paulo eap = eap_peer_method_alloc(EAP_PEER_METHOD_INTERFACE_VERSION, 4485b9c547cSRui Paulo EAP_VENDOR_WFA_NEW, 4495b9c547cSRui Paulo EAP_VENDOR_WFA_UNAUTH_TLS, 4505b9c547cSRui Paulo "WFA-UNAUTH-TLS"); 4515b9c547cSRui Paulo if (eap == NULL) 4525b9c547cSRui Paulo return -1; 4535b9c547cSRui Paulo 4545b9c547cSRui Paulo eap->init = eap_wfa_unauth_tls_init; 4555b9c547cSRui Paulo eap->deinit = eap_tls_deinit; 4565b9c547cSRui Paulo eap->process = eap_tls_process; 4575b9c547cSRui Paulo eap->isKeyAvailable = eap_tls_isKeyAvailable; 4585b9c547cSRui Paulo eap->getKey = eap_tls_getKey; 4595b9c547cSRui Paulo eap->get_status = eap_tls_get_status; 4605b9c547cSRui Paulo eap->has_reauth_data = eap_tls_has_reauth_data; 4615b9c547cSRui Paulo eap->deinit_for_reauth = eap_tls_deinit_for_reauth; 4625b9c547cSRui Paulo eap->init_for_reauth = eap_tls_init_for_reauth; 4635b9c547cSRui Paulo eap->get_emsk = eap_tls_get_emsk; 4645b9c547cSRui Paulo 465*780fb4a2SCy Schubert return eap_peer_method_register(eap); 4665b9c547cSRui Paulo } 4675b9c547cSRui Paulo #endif /* CONFIG_HS20 */ 468