#include "netif/ppp/ppp_opts.h"
#if PPP_SUPPORT && EAP_SUPPORT
#ifndef PPP_EAP_H
#define PPP_EAP_H
#include "ppp.h"
#ifdef __cplusplus
extern "C" {
#endif
#define EAP_HEADERLEN 4
#define EAP_REQUEST 1
#define EAP_RESPONSE 2
#define EAP_SUCCESS 3
#define EAP_FAILURE 4
#define EAPT_IDENTITY 1
#define EAPT_NOTIFICATION 2
#define EAPT_NAK 3
#define EAPT_MD5CHAP 4
#define EAPT_OTP 5
#define EAPT_TOKEN 6
#define EAPT_RSA 9
#define EAPT_DSS 10
#define EAPT_KEA 11
#define EAPT_KEA_VALIDATE 12
#define EAPT_TLS 13
#define EAPT_DEFENDER 14
#define EAPT_W2K 15
#define EAPT_ARCOT 16
#define EAPT_CISCOWIRELESS 17
#define EAPT_NOKIACARD 18
#define EAPT_SRP 19
#define EAPSRP_CHALLENGE 1
#define EAPSRP_CKEY 1
#define EAPSRP_SKEY 2
#define EAPSRP_CVALIDATOR 2
#define EAPSRP_SVALIDATOR 3
#define EAPSRP_ACK 3
#define EAPSRP_LWRECHALLENGE 4
#define SRPVAL_EBIT 0x00000001
#define SRP_PSEUDO_ID "pseudo_"
#define SRP_PSEUDO_LEN 7
#define MD5_SIGNATURE_SIZE 16
#define EAP_MIN_CHALLENGE_LENGTH 17
#define EAP_MAX_CHALLENGE_LENGTH 24
#define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH 3
#define EAP_STATES \
"Initial", "Pending", "Closed", "Listen", "Identify", \
"SRP1", "SRP2", "SRP3", "MD5Chall", "Open", "SRP4", "BadAuth"
#define eap_client_active(pcb) ((pcb)->eap.es_client.ea_state == eapListen)
#if PPP_SERVER
#define eap_server_active(pcb) \
((pcb)->eap.es_server.ea_state >= eapIdentify && \
(pcb)->eap.es_server.ea_state <= eapMD5Chall)
#endif
enum eap_state_code {
eapInitial = 0,
eapPending,
eapClosed,
eapListen,
eapIdentify,
eapSRP1,
eapSRP2,
eapSRP3,
eapMD5Chall,
eapOpen,
eapSRP4,
eapBadAuth
};
struct eap_auth {
const char *ea_name;
char ea_peer[MAXNAMELEN +1];
void *ea_session;
u_char *ea_skey;
u_short ea_namelen;
u_short ea_peerlen;
enum eap_state_code ea_state;
u_char ea_id;
u_char ea_requests;
u_char ea_responses;
u_char ea_type;
u32_t ea_keyflags;
};
#ifndef EAP_MAX_CHALLENGE_LENGTH
#define EAP_MAX_CHALLENGE_LENGTH 24
#endif
typedef struct eap_state {
struct eap_auth es_client;
#if PPP_SERVER
struct eap_auth es_server;
#endif
int es_savedtime;
int es_rechallenge;
int es_lwrechallenge;
u8_t es_usepseudo;
int es_usedpseudo;
int es_challen;
u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH];
} eap_state;
#if 0#endif
void eap_authwithpeer(ppp_pcb *pcb, const char *localname);
void eap_authpeer(ppp_pcb *pcb, const char *localname);
extern const struct protent eap_protent;
#ifdef __cplusplus
}
#endif
#endif
#endif