1189251Ssam/* 2189251Ssam * EAPOL supplicant state machines 3252726Srpaulo * Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi> 4189251Ssam * 5252726Srpaulo * This software may be distributed under the terms of the BSD license. 6252726Srpaulo * See README for more details. 7189251Ssam */ 8189251Ssam 9189251Ssam#ifndef EAPOL_SUPP_SM_H 10189251Ssam#define EAPOL_SUPP_SM_H 11189251Ssam 12214734Srpaulo#include "common/defs.h" 13189251Ssam 14351611Scystruct tls_cert_data; 15351611Scy 16189251Ssamtypedef enum { Unauthorized, Authorized } PortStatus; 17189251Ssamtypedef enum { Auto, ForceUnauthorized, ForceAuthorized } PortControl; 18189251Ssam 19189251Ssam/** 20189251Ssam * struct eapol_config - Per network configuration for EAPOL state machines 21189251Ssam */ 22189251Ssamstruct eapol_config { 23189251Ssam /** 24189251Ssam * accept_802_1x_keys - Accept IEEE 802.1X (non-WPA) EAPOL-Key frames 25189251Ssam * 26189251Ssam * This variable should be set to 1 when using EAPOL state machines 27189251Ssam * with non-WPA security policy to generate dynamic WEP keys. When 28189251Ssam * using WPA, this should be set to 0 so that WPA state machine can 29189251Ssam * process the EAPOL-Key frames. 30189251Ssam */ 31189251Ssam int accept_802_1x_keys; 32189251Ssam 33189251Ssam#define EAPOL_REQUIRE_KEY_UNICAST BIT(0) 34189251Ssam#define EAPOL_REQUIRE_KEY_BROADCAST BIT(1) 35189251Ssam /** 36189251Ssam * required_keys - Which EAPOL-Key packets are required 37189251Ssam * 38189251Ssam * This variable determines which EAPOL-Key packets are required before 39189251Ssam * marking connection authenticated. This is a bit field of 40189251Ssam * EAPOL_REQUIRE_KEY_UNICAST and EAPOL_REQUIRE_KEY_BROADCAST flags. 41189251Ssam */ 42189251Ssam int required_keys; 43189251Ssam 44189251Ssam /** 45189251Ssam * fast_reauth - Whether fast EAP reauthentication is enabled 46189251Ssam */ 47189251Ssam int fast_reauth; 48189251Ssam 49189251Ssam /** 50189251Ssam * workaround - Whether EAP workarounds are enabled 51189251Ssam */ 52189251Ssam unsigned int workaround; 53189251Ssam 54189251Ssam /** 55189251Ssam * eap_disabled - Whether EAP is disabled 56189251Ssam */ 57189251Ssam int eap_disabled; 58281806Srpaulo 59281806Srpaulo /** 60281806Srpaulo * external_sim - Use external processing for SIM/USIM operations 61281806Srpaulo */ 62281806Srpaulo int external_sim; 63281806Srpaulo 64281806Srpaulo#define EAPOL_LOCAL_WPS_IN_USE BIT(0) 65281806Srpaulo#define EAPOL_PEER_IS_WPS20_AP BIT(1) 66281806Srpaulo /** 67281806Srpaulo * wps - Whether this connection is used for WPS 68281806Srpaulo */ 69281806Srpaulo int wps; 70189251Ssam}; 71189251Ssam 72189251Ssamstruct eapol_sm; 73189251Ssamstruct wpa_config_blob; 74189251Ssam 75281806Srpauloenum eapol_supp_result { 76281806Srpaulo EAPOL_SUPP_RESULT_FAILURE, 77281806Srpaulo EAPOL_SUPP_RESULT_SUCCESS, 78281806Srpaulo EAPOL_SUPP_RESULT_EXPECTED_FAILURE 79281806Srpaulo}; 80281806Srpaulo 81189251Ssam/** 82189251Ssam * struct eapol_ctx - Global (for all networks) EAPOL state machine context 83189251Ssam */ 84189251Ssamstruct eapol_ctx { 85189251Ssam /** 86189251Ssam * ctx - Pointer to arbitrary upper level context 87189251Ssam */ 88189251Ssam void *ctx; 89189251Ssam 90189251Ssam /** 91189251Ssam * preauth - IEEE 802.11i/RSN pre-authentication 92189251Ssam * 93189251Ssam * This EAPOL state machine is used for IEEE 802.11i/RSN 94189251Ssam * pre-authentication 95189251Ssam */ 96189251Ssam int preauth; 97189251Ssam 98189251Ssam /** 99189251Ssam * cb - Function to be called when EAPOL negotiation has been completed 100189251Ssam * @eapol: Pointer to EAPOL state machine data 101281806Srpaulo * @result: Whether the authentication was completed successfully 102189251Ssam * @ctx: Pointer to context data (cb_ctx) 103189251Ssam * 104189251Ssam * This optional callback function will be called when the EAPOL 105189251Ssam * authentication has been completed. This allows the owner of the 106189251Ssam * EAPOL state machine to process the key and terminate the EAPOL state 107189251Ssam * machine. Currently, this is used only in RSN pre-authentication. 108189251Ssam */ 109281806Srpaulo void (*cb)(struct eapol_sm *eapol, enum eapol_supp_result result, 110281806Srpaulo void *ctx); 111189251Ssam 112189251Ssam /** 113189251Ssam * cb_ctx - Callback context for cb() 114189251Ssam */ 115189251Ssam void *cb_ctx; 116189251Ssam 117189251Ssam /** 118189251Ssam * msg_ctx - Callback context for wpa_msg() calls 119189251Ssam */ 120189251Ssam void *msg_ctx; 121189251Ssam 122189251Ssam /** 123189251Ssam * scard_ctx - Callback context for PC/SC scard_*() function calls 124189251Ssam * 125189251Ssam * This context can be updated with eapol_sm_register_scard_ctx(). 126189251Ssam */ 127189251Ssam void *scard_ctx; 128189251Ssam 129189251Ssam /** 130189251Ssam * eapol_send_ctx - Callback context for eapol_send() calls 131189251Ssam */ 132189251Ssam void *eapol_send_ctx; 133189251Ssam 134189251Ssam /** 135189251Ssam * eapol_done_cb - Function to be called at successful completion 136189251Ssam * @ctx: Callback context (ctx) 137189251Ssam * 138189251Ssam * This function is called at the successful completion of EAPOL 139189251Ssam * authentication. If dynamic WEP keys are used, this is called only 140189251Ssam * after all the expected keys have been received. 141189251Ssam */ 142189251Ssam void (*eapol_done_cb)(void *ctx); 143189251Ssam 144189251Ssam /** 145189251Ssam * eapol_send - Send EAPOL packets 146189251Ssam * @ctx: Callback context (eapol_send_ctx) 147189251Ssam * @type: EAPOL type (IEEE802_1X_TYPE_*) 148189251Ssam * @buf: Pointer to EAPOL payload 149189251Ssam * @len: Length of the EAPOL payload 150189251Ssam * Returns: 0 on success, -1 on failure 151189251Ssam */ 152189251Ssam int (*eapol_send)(void *ctx, int type, const u8 *buf, size_t len); 153189251Ssam 154189251Ssam /** 155189251Ssam * set_wep_key - Configure WEP keys 156189251Ssam * @ctx: Callback context (ctx) 157189251Ssam * @unicast: Non-zero = unicast, 0 = multicast/broadcast key 158189251Ssam * @keyidx: Key index (0..3) 159189251Ssam * @key: WEP key 160189251Ssam * @keylen: Length of the WEP key 161189251Ssam * Returns: 0 on success, -1 on failure 162189251Ssam */ 163189251Ssam int (*set_wep_key)(void *ctx, int unicast, int keyidx, 164189251Ssam const u8 *key, size_t keylen); 165189251Ssam 166189251Ssam /** 167189251Ssam * set_config_blob - Set or add a named configuration blob 168189251Ssam * @ctx: Callback context (ctx) 169189251Ssam * @blob: New value for the blob 170189251Ssam * 171189251Ssam * Adds a new configuration blob or replaces the current value of an 172189251Ssam * existing blob. 173189251Ssam */ 174189251Ssam void (*set_config_blob)(void *ctx, struct wpa_config_blob *blob); 175189251Ssam 176189251Ssam /** 177189251Ssam * get_config_blob - Get a named configuration blob 178189251Ssam * @ctx: Callback context (ctx) 179189251Ssam * @name: Name of the blob 180189251Ssam * Returns: Pointer to blob data or %NULL if not found 181189251Ssam */ 182189251Ssam const struct wpa_config_blob * (*get_config_blob)(void *ctx, 183189251Ssam const char *name); 184189251Ssam 185189251Ssam /** 186189251Ssam * aborted_cached - Notify that cached PMK attempt was aborted 187189251Ssam * @ctx: Callback context (ctx) 188189251Ssam */ 189189251Ssam void (*aborted_cached)(void *ctx); 190189251Ssam 191189251Ssam /** 192189251Ssam * opensc_engine_path - Path to the OpenSSL engine for opensc 193189251Ssam * 194189251Ssam * This is an OpenSSL specific configuration option for loading OpenSC 195189251Ssam * engine (engine_opensc.so); if %NULL, this engine is not loaded. 196189251Ssam */ 197189251Ssam const char *opensc_engine_path; 198189251Ssam 199189251Ssam /** 200189251Ssam * pkcs11_engine_path - Path to the OpenSSL engine for PKCS#11 201189251Ssam * 202189251Ssam * This is an OpenSSL specific configuration option for loading PKCS#11 203189251Ssam * engine (engine_pkcs11.so); if %NULL, this engine is not loaded. 204189251Ssam */ 205189251Ssam const char *pkcs11_engine_path; 206189251Ssam 207189251Ssam /** 208189251Ssam * pkcs11_module_path - Path to the OpenSSL OpenSC/PKCS#11 module 209189251Ssam * 210189251Ssam * This is an OpenSSL specific configuration option for configuring 211189251Ssam * path to OpenSC/PKCS#11 engine (opensc-pkcs11.so); if %NULL, this 212189251Ssam * module is not loaded. 213189251Ssam */ 214189251Ssam const char *pkcs11_module_path; 215189251Ssam 216189251Ssam /** 217281806Srpaulo * openssl_ciphers - OpenSSL cipher string 218281806Srpaulo * 219281806Srpaulo * This is an OpenSSL specific configuration option for configuring the 220281806Srpaulo * default ciphers. If not set, "DEFAULT:!EXP:!LOW" is used as the 221281806Srpaulo * default. 222281806Srpaulo */ 223281806Srpaulo const char *openssl_ciphers; 224281806Srpaulo 225281806Srpaulo /** 226189251Ssam * wps - WPS context data 227189251Ssam * 228189251Ssam * This is only used by EAP-WSC and can be left %NULL if not available. 229189251Ssam */ 230189251Ssam struct wps_context *wps; 231189251Ssam 232189251Ssam /** 233189251Ssam * eap_param_needed - Notify that EAP parameter is needed 234189251Ssam * @ctx: Callback context (ctx) 235252726Srpaulo * @field: Field indicator (e.g., WPA_CTRL_REQ_EAP_IDENTITY) 236189251Ssam * @txt: User readable text describing the required parameter 237189251Ssam */ 238252726Srpaulo void (*eap_param_needed)(void *ctx, enum wpa_ctrl_req_type field, 239189251Ssam const char *txt); 240214734Srpaulo 241214734Srpaulo /** 242214734Srpaulo * port_cb - Set port authorized/unauthorized callback (optional) 243214734Srpaulo * @ctx: Callback context (ctx) 244214734Srpaulo * @authorized: Whether the supplicant port is now in authorized state 245214734Srpaulo */ 246214734Srpaulo void (*port_cb)(void *ctx, int authorized); 247252726Srpaulo 248252726Srpaulo /** 249252726Srpaulo * cert_cb - Notification of a peer certificate 250252726Srpaulo * @ctx: Callback context (ctx) 251351611Scy * @cert: Certificate information 252252726Srpaulo * @cert_hash: SHA-256 hash of the certificate 253252726Srpaulo */ 254351611Scy void (*cert_cb)(void *ctx, struct tls_cert_data *cert, 255351611Scy const char *cert_hash); 256252726Srpaulo 257252726Srpaulo /** 258252726Srpaulo * cert_in_cb - Include server certificates in callback 259252726Srpaulo */ 260252726Srpaulo int cert_in_cb; 261252726Srpaulo 262252726Srpaulo /** 263252726Srpaulo * status_cb - Notification of a change in EAP status 264252726Srpaulo * @ctx: Callback context (ctx) 265252726Srpaulo * @status: Step in the process of EAP authentication 266252726Srpaulo * @parameter: Step-specific parameter, e.g., EAP method name 267252726Srpaulo */ 268252726Srpaulo void (*status_cb)(void *ctx, const char *status, 269252726Srpaulo const char *parameter); 270252726Srpaulo 271346981Scy /** 272346981Scy * eap_error_cb - Notification of EAP method error 273346981Scy * @ctx: Callback context (ctx) 274346981Scy * @error_code: EAP method error code 275346981Scy */ 276346981Scy void (*eap_error_cb)(void *ctx, int error_code); 277346981Scy 278281806Srpaulo#ifdef CONFIG_EAP_PROXY 279252726Srpaulo /** 280281806Srpaulo * eap_proxy_cb - Callback signifying any updates from eap_proxy 281281806Srpaulo * @ctx: eapol_ctx from eap_peer_sm_init() call 282281806Srpaulo */ 283281806Srpaulo void (*eap_proxy_cb)(void *ctx); 284346981Scy 285346981Scy /** 286346981Scy * eap_proxy_notify_sim_status - Notification of SIM status change 287346981Scy * @ctx: eapol_ctx from eap_peer_sm_init() call 288346981Scy * @status: One of enum value from sim_state 289346981Scy */ 290346981Scy void (*eap_proxy_notify_sim_status)(void *ctx, 291346981Scy enum eap_proxy_sim_state sim_state); 292281806Srpaulo#endif /* CONFIG_EAP_PROXY */ 293281806Srpaulo 294281806Srpaulo /** 295252726Srpaulo * set_anon_id - Set or add anonymous identity 296252726Srpaulo * @ctx: eapol_ctx from eap_peer_sm_init() call 297252726Srpaulo * @id: Anonymous identity (e.g., EAP-SIM pseudonym) 298252726Srpaulo * @len: Length of anonymous identity in octets 299252726Srpaulo */ 300252726Srpaulo void (*set_anon_id)(void *ctx, const u8 *id, size_t len); 301189251Ssam}; 302189251Ssam 303189251Ssam 304189251Ssamstruct eap_peer_config; 305252726Srpaulostruct ext_password_data; 306189251Ssam 307189251Ssam#ifdef IEEE8021X_EAPOL 308189251Ssamstruct eapol_sm *eapol_sm_init(struct eapol_ctx *ctx); 309189251Ssamvoid eapol_sm_deinit(struct eapol_sm *sm); 310189251Ssamvoid eapol_sm_step(struct eapol_sm *sm); 311189251Ssamint eapol_sm_get_status(struct eapol_sm *sm, char *buf, size_t buflen, 312189251Ssam int verbose); 313189251Ssamint eapol_sm_get_mib(struct eapol_sm *sm, char *buf, size_t buflen); 314189251Ssamvoid eapol_sm_configure(struct eapol_sm *sm, int heldPeriod, int authPeriod, 315189251Ssam int startPeriod, int maxStart); 316189251Ssamint eapol_sm_rx_eapol(struct eapol_sm *sm, const u8 *src, const u8 *buf, 317189251Ssam size_t len); 318189251Ssamvoid eapol_sm_notify_tx_eapol_key(struct eapol_sm *sm); 319189251Ssamvoid eapol_sm_notify_portEnabled(struct eapol_sm *sm, Boolean enabled); 320189251Ssamvoid eapol_sm_notify_portValid(struct eapol_sm *sm, Boolean valid); 321189251Ssamvoid eapol_sm_notify_eap_success(struct eapol_sm *sm, Boolean success); 322189251Ssamvoid eapol_sm_notify_eap_fail(struct eapol_sm *sm, Boolean fail); 323189251Ssamvoid eapol_sm_notify_config(struct eapol_sm *sm, 324189251Ssam struct eap_peer_config *config, 325189251Ssam const struct eapol_config *conf); 326189251Ssamint eapol_sm_get_key(struct eapol_sm *sm, u8 *key, size_t len); 327281806Srpauloconst u8 * eapol_sm_get_session_id(struct eapol_sm *sm, size_t *len); 328189251Ssamvoid eapol_sm_notify_logoff(struct eapol_sm *sm, Boolean logoff); 329189251Ssamvoid eapol_sm_notify_cached(struct eapol_sm *sm); 330281806Srpaulovoid eapol_sm_notify_pmkid_attempt(struct eapol_sm *sm); 331189251Ssamvoid eapol_sm_register_scard_ctx(struct eapol_sm *sm, void *ctx); 332189251Ssamvoid eapol_sm_notify_portControl(struct eapol_sm *sm, PortControl portControl); 333189251Ssamvoid eapol_sm_notify_ctrl_attached(struct eapol_sm *sm); 334189251Ssamvoid eapol_sm_notify_ctrl_response(struct eapol_sm *sm); 335189251Ssamvoid eapol_sm_request_reauth(struct eapol_sm *sm); 336189251Ssamvoid eapol_sm_notify_lower_layer_success(struct eapol_sm *sm, int in_eapol_sm); 337189251Ssamvoid eapol_sm_invalidate_cached_session(struct eapol_sm *sm); 338252726Srpauloconst char * eapol_sm_get_method_name(struct eapol_sm *sm); 339252726Srpaulovoid eapol_sm_set_ext_pw_ctx(struct eapol_sm *sm, 340252726Srpaulo struct ext_password_data *ext); 341252726Srpauloint eapol_sm_failed(struct eapol_sm *sm); 342281806Srpaulovoid eapol_sm_erp_flush(struct eapol_sm *sm); 343346981Scystruct wpabuf * eapol_sm_build_erp_reauth_start(struct eapol_sm *sm); 344346981Scyvoid eapol_sm_process_erp_finish(struct eapol_sm *sm, const u8 *buf, 345346981Scy size_t len); 346346981Scyint eapol_sm_get_eap_proxy_imsi(void *ctx, int sim_num, char *imsi, 347346981Scy size_t *len); 348346981Scyint eapol_sm_update_erp_next_seq_num(struct eapol_sm *sm, u16 next_seq_num); 349346981Scyint eapol_sm_get_erp_info(struct eapol_sm *sm, struct eap_peer_config *config, 350346981Scy const u8 **username, size_t *username_len, 351346981Scy const u8 **realm, size_t *realm_len, 352346981Scy u16 *erp_next_seq_num, const u8 **rrk, 353346981Scy size_t *rrk_len); 354346981Scy 355189251Ssam#else /* IEEE8021X_EAPOL */ 356189251Ssamstatic inline struct eapol_sm *eapol_sm_init(struct eapol_ctx *ctx) 357189251Ssam{ 358189251Ssam free(ctx); 359189251Ssam return (struct eapol_sm *) 1; 360189251Ssam} 361189251Ssamstatic inline void eapol_sm_deinit(struct eapol_sm *sm) 362189251Ssam{ 363189251Ssam} 364189251Ssamstatic inline void eapol_sm_step(struct eapol_sm *sm) 365189251Ssam{ 366189251Ssam} 367189251Ssamstatic inline int eapol_sm_get_status(struct eapol_sm *sm, char *buf, 368189251Ssam size_t buflen, int verbose) 369189251Ssam{ 370189251Ssam return 0; 371189251Ssam} 372189251Ssamstatic inline int eapol_sm_get_mib(struct eapol_sm *sm, char *buf, 373189251Ssam size_t buflen) 374189251Ssam{ 375189251Ssam return 0; 376189251Ssam} 377189251Ssamstatic inline void eapol_sm_configure(struct eapol_sm *sm, int heldPeriod, 378189251Ssam int authPeriod, int startPeriod, 379189251Ssam int maxStart) 380189251Ssam{ 381189251Ssam} 382189251Ssamstatic inline int eapol_sm_rx_eapol(struct eapol_sm *sm, const u8 *src, 383189251Ssam const u8 *buf, size_t len) 384189251Ssam{ 385189251Ssam return 0; 386189251Ssam} 387189251Ssamstatic inline void eapol_sm_notify_tx_eapol_key(struct eapol_sm *sm) 388189251Ssam{ 389189251Ssam} 390189251Ssamstatic inline void eapol_sm_notify_portEnabled(struct eapol_sm *sm, 391189251Ssam Boolean enabled) 392189251Ssam{ 393189251Ssam} 394189251Ssamstatic inline void eapol_sm_notify_portValid(struct eapol_sm *sm, 395189251Ssam Boolean valid) 396189251Ssam{ 397189251Ssam} 398189251Ssamstatic inline void eapol_sm_notify_eap_success(struct eapol_sm *sm, 399189251Ssam Boolean success) 400189251Ssam{ 401189251Ssam} 402189251Ssamstatic inline void eapol_sm_notify_eap_fail(struct eapol_sm *sm, Boolean fail) 403189251Ssam{ 404189251Ssam} 405189251Ssamstatic inline void eapol_sm_notify_config(struct eapol_sm *sm, 406189251Ssam struct eap_peer_config *config, 407189251Ssam struct eapol_config *conf) 408189251Ssam{ 409189251Ssam} 410189251Ssamstatic inline int eapol_sm_get_key(struct eapol_sm *sm, u8 *key, size_t len) 411189251Ssam{ 412189251Ssam return -1; 413189251Ssam} 414281806Srpaulostatic inline const u8 * 415281806Srpauloeapol_sm_get_session_id(struct eapol_sm *sm, size_t *len) 416281806Srpaulo{ 417281806Srpaulo return NULL; 418281806Srpaulo} 419189251Ssamstatic inline void eapol_sm_notify_logoff(struct eapol_sm *sm, Boolean logoff) 420189251Ssam{ 421189251Ssam} 422189251Ssamstatic inline void eapol_sm_notify_cached(struct eapol_sm *sm) 423189251Ssam{ 424189251Ssam} 425281806Srpaulostatic inline void eapol_sm_notify_pmkid_attempt(struct eapol_sm *sm) 426281806Srpaulo{ 427281806Srpaulo} 428189251Ssam#define eapol_sm_register_scard_ctx(sm, ctx) do { } while (0) 429189251Ssamstatic inline void eapol_sm_notify_portControl(struct eapol_sm *sm, 430189251Ssam PortControl portControl) 431189251Ssam{ 432189251Ssam} 433189251Ssamstatic inline void eapol_sm_notify_ctrl_attached(struct eapol_sm *sm) 434189251Ssam{ 435189251Ssam} 436189251Ssamstatic inline void eapol_sm_notify_ctrl_response(struct eapol_sm *sm) 437189251Ssam{ 438189251Ssam} 439189251Ssamstatic inline void eapol_sm_request_reauth(struct eapol_sm *sm) 440189251Ssam{ 441189251Ssam} 442189251Ssamstatic inline void eapol_sm_notify_lower_layer_success(struct eapol_sm *sm, 443189251Ssam int in_eapol_sm) 444189251Ssam{ 445189251Ssam} 446189251Ssamstatic inline void eapol_sm_invalidate_cached_session(struct eapol_sm *sm) 447189251Ssam{ 448189251Ssam} 449252726Srpaulostatic inline const char * eapol_sm_get_method_name(struct eapol_sm *sm) 450252726Srpaulo{ 451252726Srpaulo return NULL; 452252726Srpaulo} 453252726Srpaulostatic inline void eapol_sm_set_ext_pw_ctx(struct eapol_sm *sm, 454252726Srpaulo struct ext_password_data *ext) 455252726Srpaulo{ 456252726Srpaulo} 457252726Srpaulostatic inline int eapol_sm_failed(struct eapol_sm *sm) 458252726Srpaulo{ 459252726Srpaulo return 0; 460252726Srpaulo} 461281806Srpaulostatic inline void eapol_sm_erp_flush(struct eapol_sm *sm) 462281806Srpaulo{ 463281806Srpaulo} 464346981Scystatic inline struct wpabuf * 465346981Scyeapol_sm_build_erp_reauth_start(struct eapol_sm *sm) 466346981Scy{ 467346981Scy return NULL; 468346981Scy} 469346981Scystatic inline void eapol_sm_process_erp_finish(struct eapol_sm *sm, 470346981Scy const u8 *buf, size_t len) 471346981Scy{ 472346981Scy} 473346981Scystatic inline int eapol_sm_update_erp_next_seq_num(struct eapol_sm *sm, 474346981Scy u16 next_seq_num) 475346981Scy{ 476346981Scy return -1; 477346981Scy} 478346981Scystatic inline int 479346981Scyeapol_sm_get_erp_info(struct eapol_sm *sm, struct eap_peer_config *config, 480346981Scy const u8 **username, size_t *username_len, 481346981Scy const u8 **realm, size_t *realm_len, 482346981Scy u16 *erp_next_seq_num, const u8 **rrk, size_t *rrk_len) 483346981Scy{ 484346981Scy return -1; 485346981Scy} 486189251Ssam#endif /* IEEE8021X_EAPOL */ 487189251Ssam 488189251Ssam#endif /* EAPOL_SUPP_SM_H */ 489