18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hostapd / EAP Full Authenticator state machine (RFC 4137)
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef EAP_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/defs.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_common/eap_defs.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "eap_server/eap_methods.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpabuf.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_sm;
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_TTLS_AUTH_PAP 1
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_TTLS_AUTH_CHAP 2
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_TTLS_AUTH_MSCHAP 4
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_TTLS_AUTH_MSCHAPV2 8
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_user {
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct {
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int vendor;
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		u32 method;
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} methods[EAP_MAX_METHODS];
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *password;
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t password_len;
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int password_hash; /* whether password is hashed with
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    * nt_password_hash() */
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int phase2;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int force_version;
35f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	unsigned int remediation:1;
36df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt	unsigned int macacl:1;
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ttls_auth; /* bitfield of
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			* EAP_TTLS_AUTH_{PAP,CHAP,MSCHAP,MSCHAPV2} */
39818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt	struct hostapd_radius_attr *accept_attr;
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_eapol_interface {
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Lower layer to full authenticator variables */
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapResp; /* shared with EAPOL Backend Authentication */
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpabuf *eapRespData;
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean portEnabled;
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int retransWhile;
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapRestart; /* shared with EAPOL Authenticator PAE */
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int eapSRTT;
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int eapRTTVAR;
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Full authenticator to lower layer variables */
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapReq; /* shared with EAPOL Backend Authentication */
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapNoReq; /* shared with EAPOL Backend Authentication */
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapSuccess;
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapFail;
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapTimeout;
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpabuf *eapReqData;
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *eapKeyData;
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t eapKeyDataLen;
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean eapKeyAvailable; /* called keyAvailable in IEEE 802.1X-2004 */
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* AAA interface to full authenticator variables */
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean aaaEapReq;
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean aaaEapNoReq;
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean aaaSuccess;
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean aaaFail;
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpabuf *aaaEapReqData;
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *aaaEapKeyData;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t aaaEapKeyDataLen;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean aaaEapKeyAvailable;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int aaaMethodTimeout;
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Full authenticator to AAA interface variables */
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean aaaEapResp;
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpabuf *aaaEapRespData;
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* aaaIdentity -> eap_get_identity() */
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean aaaTimeout;
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eapol_callbacks {
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int (*get_eap_user)(void *ctx, const u8 *identity, size_t identity_len,
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    int phase2, struct eap_user *user);
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char * (*get_eap_req_id_text)(void *ctx, size_t *len);
85818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt	void (*log_msg)(void *ctx, const char *msg);
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_config {
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	void *ssl_ctx;
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	void *msg_ctx;
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	void *eap_sim_db_priv;
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	Boolean backend_auth;
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int eap_server;
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u16 pwd_group;
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *pac_opaque_encr_key;
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 *eap_fast_a_id;
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t eap_fast_a_id_len;
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *eap_fast_a_id_info;
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int eap_fast_prov;
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int pac_key_lifetime;
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int pac_key_refresh_time;
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int eap_sim_aka_result_ind;
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int tnc;
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wps_context *wps;
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpabuf *assoc_wps_ie;
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const struct wpabuf *assoc_p2p_ie;
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *peer_addr;
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int fragment_size;
10987fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen
11087fd279308af3f806848c8f2ab65ef18c6ac4c30Jouni Malinen	int pbc_in_m1;
11134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt
11234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt	const u8 *server_id;
11334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt	size_t server_id_len;
114818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt
115818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS
116818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt	u32 tls_test_flags;
117818ea489ef32dcdc7c098d8a336d6e1dd8996112Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_sm * eap_server_sm_init(void *eapol_ctx,
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct eapol_callbacks *eapol_cb,
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct eap_config *eap_conf);
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eap_server_sm_deinit(struct eap_sm *sm);
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eap_server_sm_step(struct eap_sm *sm);
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eap_sm_notify_cached(struct eap_sm *sm);
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eap_sm_pending_cb(struct eap_sm *sm);
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eap_sm_method_pending(struct eap_sm *sm);
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst u8 * eap_get_identity(struct eap_sm *sm, size_t *len);
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_eapol_interface * eap_get_interface(struct eap_sm *sm);
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eap_server_clear_identity(struct eap_sm *sm);
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_H */
134