eap状态机代码分析-(1)结构定义
eap状态机代码分析-(1)结构定义
通常来说,⼀个eap状态机关联于⼀个session内,在多次交互时根据state匹配到相同的session进⽽到同⼀个状态机并继续运⾏。本节我们关注于eap状态机部分。
⾸先看下eap状态机的定义:
/**
* struct eap_sm - EAP server state machine data
*/
struct eap_sm {
enum {
EAP_DISABLED, EAP_INITIALIZE, EAP_IDLE, EAP_RECEIVED,
EAP_INTEGRITY_CHECK, EAP_METHOD_RESPONSE, EAP_METHOD_REQUEST,
EAP_PROPOSE_METHOD, EAP_SELECT_ACTION, EAP_SEND_REQUEST,
EAP_DISCARD, EAP_NAK, EAP_RETRANSMIT, EAP_SUCCESS, EAP_FAILURE,
EAP_TIMEOUT_FAILURE, EAP_PICK_UP_METHOD,
EAP_INITIALIZE_PASSTHROUGH, EAP_IDLE2, EAP_RETRANSMIT2,
EAP_RECEIVED2, EAP_DISCARD2, EAP_SEND_REQUEST2,
EAP_AAA_REQUEST, EAP_AAA_RESPONSE, EAP_AAA_IDLE,
EAP_TIMEOUT_FAILURE2, EAP_FAILURE2, EAP_SUCCESS2
} EAP_state;
/* Constants */
int MaxRetrans;
[最⼤重传次数,eap⽀持超时重发机制.eap_sm在初始化时赋值为5
sm->MaxRetrans = 5; /* RFC 3748: max 3-5 retransmissions suggested */
当然你可根据需要将此值做成可配
]
struct eap_eapol_interface eap_if;
这个eap_if⾥⾯的变量以前版本是直接列在这⾥的,现在封装在eap_eapol_interface的变量内了,当然这样也清晰点。
主要放些直接与消息相关的,如req及resp的数据,当前是req还是resp,是否到了重传的时机(retransWhile)等。】
/* Full authenticator state machine local variables */
/* Long-term (maintained betwen packets) */
EapType currentMethod;
【当前采⽤的Method,初始为EAP_TYPE_NONE,其后根据响应中的type定或⾃选】
u8 currentId;
【当前eap id。开始设为-1,作为backend_AAA时被设为响应消息eapid,需要发送eapreq的时候设为nextId】
enum {
METHOD_PROPOSED, METHOD_CONTINUE, METHOD_END
} methodState;
【】
int retransCount;
【传送次数】
struct wpabuf *lastReqData;
【记下已经发出的请求数据,如需要重传时需要发此数据】
int methodTimeout;
/* Short-term (not maintained between packets) */
Boolean rxResp;
【收到消息的id为resp时设置rxResp为TRUE】
int respId;
【收到的resp消息的】
EapType respMethod;
int respVendor;
int respVendorMethod;
Boolean ignore;
enum {
pending
DECISION_SUCCESS, DECISION_FAILURE, DECISION_CONTINUE,
DECISION_PASSTHROUGH
} decision;
/* Miscellaneous variables */
const struct eap_method *m; /* selected EAP method */
【当前选定的eap method】
/* not defined in RFC 4137 */
Boolean changed;
【状态机是否改变,在不变时则退出状态机运⾏,后续可能要发送eapreq,eapsuccess或eapfailure,或在pending时不做事情】
void *eapol_ctx, *msg_ctx;
【eapol_ctx:上下⽂信息,在状态机初始化时指向session,之后不动。
msg_ctx:尚未使⽤】
struct eapol_callbacks *eapol_cb;
【状态机初始化时设置eapol_cb。
struct eapol_callbacks为多个需要⽤到的回调函数如get_eap_user等组成的结构体】
void *eap_method_priv;
【由各个eap method定义的数据,在EAP_INITIALIZE是sm->eap_method_priv = sm->m->initPickUp(sm)  指向eap_identity_data 在具体EAP method阶段则是具体eap_xxx_data】
u8 *identity;
size_t identity_len;
【在eap_identity_process内赋值,取⾃eap-resp/identity】
/* Whether Phase 2 method should validate identity match */
int require_identity_match;
【EAP-GTC⽤到】
int lastId; /* Identifier used in the last EAP-Packet */
struct eap_user *user;
int user_eap_method_index;
int init_phase2;
【eap_ttls_phase2_eap_init  eap_peap_phase2_init两个函数内设置为1】
void *ssl_ctx;
【在状态机初始化eap_server_sm_init内设置为⼀个全局的g_ssl_context上下⽂。后者通过
g_ssl_context = tls_init(NULL);
实现初始化。
void *eap_sim_db_priv;
【指向系统配置的eap_sim/aka的配置信息,为eap_sim_db_data结构。主要含有与hlr的通信套接字信息,假名表,重鉴权⽤户信
息,pending的⽤户查询等】
Boolean backend_auth;
【是否作为backend authentication server】
Boolean update_user;
【sm->identity是否更新了的标志,如为true时可能需要重新获取⽤户信息】
int eap_server;
【是作为eapserver还是passthrough?】
int num_rounds;
【eap交互次数,最⼤允许EAP_MAX_AUTH_ROUNDS=50次】
enum {
METHOD_PENDING_NONE, METHOD_PENDING_WAIT, METHOD_PENDING_CONT
} method_pending;
【状态机初始化时method_pending为METHOD_PENDING_NONE,因业务需要,可以将method_pending设置为
METHOD_PENDING_WAIT。
eap状态机在处理EAP_PROPOSE_METHOD或EAP_METHOD_RESPONSE时,如果为WAIT则什么不做,退出状态机。
如果为CONT则设置method_pending = METHOD_PENDING_NONE并继续执⾏EAP_METHOD_RESPONSE状态。
eap具体method业务在收到响应等需要的时候调⽤eap_sm_pending_cb,他会设置method_pending为CONT,这样再激活状态机他会继续执⾏。】
u8 *auth_challenge;
u8 *peer_challenge;
【均是eap-mschapv2鉴权过程中的参数,分别由server和peer⽣成的随机数】
u8 *pac_opaque_encr_key;
【如果配置⽂件配了:
# Encryption key for EAP-FAST PAC-Opaque values. This key must be a secret,
# random value. It is configured as a 16-octet value in hex format. It can be
# generated, e.g., with the following command:
# od -tx1 -v -N16 /dev/random | colrm 1 8 | tr -d ' '
#pac_opaque_encr_key=000102030405060708090a0b0c0d0e0f
则状态机初始化时会设置该变量,但是本版本没有使⽤。没到EAP-FAST】
u8 *eap_fast_a_id;
size_t eap_fast_a_id_len;
char *eap_fast_a_id_info;
enum {
NO_PROV, ANON_PROV, AUTH_PROV, BOTH_PROV
} eap_fast_prov;
int pac_key_lifetime;
int pac_key_refresh_time;
int eap_sim_aka_result_ind;
int tnc;
【以上均取⾃配置⽂件,eapserver⽤不着这些。】
struct wps_context *wps;
struct wpabuf *assoc_wps_ie;
Boolean start_reauth;
};

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。