Home | History | Annotate | Download | only in eapol_auth
      1 /*
      2  * IEEE 802.1X-2004 Authenticator - State dump
      3  * Copyright (c) 2002-2013, Jouni Malinen <j (at) w1.fi>
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #include "includes.h"
     10 
     11 #include "common.h"
     12 #include "eap_server/eap.h"
     13 #include "eapol_auth_sm.h"
     14 #include "eapol_auth_sm_i.h"
     15 
     16 static inline const char * port_type_txt(PortTypes pt)
     17 {
     18 	switch (pt) {
     19 	case ForceUnauthorized: return "ForceUnauthorized";
     20 	case ForceAuthorized: return "ForceAuthorized";
     21 	case Auto: return "Auto";
     22 	default: return "Unknown";
     23 	}
     24 }
     25 
     26 
     27 static inline const char * port_state_txt(PortState ps)
     28 {
     29 	switch (ps) {
     30 	case Unauthorized: return "Unauthorized";
     31 	case Authorized: return "Authorized";
     32 	default: return "Unknown";
     33 	}
     34 }
     35 
     36 
     37 static inline const char * ctrl_dir_txt(ControlledDirection dir)
     38 {
     39 	switch (dir) {
     40 	case Both: return "Both";
     41 	case In: return "In";
     42 	default: return "Unknown";
     43 	}
     44 }
     45 
     46 
     47 static inline const char * auth_pae_state_txt(int s)
     48 {
     49 	switch (s) {
     50 	case AUTH_PAE_INITIALIZE: return "INITIALIZE";
     51 	case AUTH_PAE_DISCONNECTED: return "DISCONNECTED";
     52 	case AUTH_PAE_CONNECTING: return "CONNECTING";
     53 	case AUTH_PAE_AUTHENTICATING: return "AUTHENTICATING";
     54 	case AUTH_PAE_AUTHENTICATED: return "AUTHENTICATED";
     55 	case AUTH_PAE_ABORTING: return "ABORTING";
     56 	case AUTH_PAE_HELD: return "HELD";
     57 	case AUTH_PAE_FORCE_AUTH: return "FORCE_AUTH";
     58 	case AUTH_PAE_FORCE_UNAUTH: return "FORCE_UNAUTH";
     59 	case AUTH_PAE_RESTART: return "RESTART";
     60 	default: return "Unknown";
     61 	}
     62 }
     63 
     64 
     65 static inline const char * be_auth_state_txt(int s)
     66 {
     67 	switch (s) {
     68 	case BE_AUTH_REQUEST: return "REQUEST";
     69 	case BE_AUTH_RESPONSE: return "RESPONSE";
     70 	case BE_AUTH_SUCCESS: return "SUCCESS";
     71 	case BE_AUTH_FAIL: return "FAIL";
     72 	case BE_AUTH_TIMEOUT: return "TIMEOUT";
     73 	case BE_AUTH_IDLE: return "IDLE";
     74 	case BE_AUTH_INITIALIZE: return "INITIALIZE";
     75 	case BE_AUTH_IGNORE: return "IGNORE";
     76 	default: return "Unknown";
     77 	}
     78 }
     79 
     80 
     81 static inline const char * reauth_timer_state_txt(int s)
     82 {
     83 	switch (s) {
     84 	case REAUTH_TIMER_INITIALIZE: return "INITIALIZE";
     85 	case REAUTH_TIMER_REAUTHENTICATE: return "REAUTHENTICATE";
     86 	default: return "Unknown";
     87 	}
     88 }
     89 
     90 
     91 static inline const char * auth_key_tx_state_txt(int s)
     92 {
     93 	switch (s) {
     94 	case AUTH_KEY_TX_NO_KEY_TRANSMIT: return "NO_KEY_TRANSMIT";
     95 	case AUTH_KEY_TX_KEY_TRANSMIT: return "KEY_TRANSMIT";
     96 	default: return "Unknown";
     97 	}
     98 }
     99 
    100 
    101 static inline const char * key_rx_state_txt(int s)
    102 {
    103 	switch (s) {
    104 	case KEY_RX_NO_KEY_RECEIVE: return "NO_KEY_RECEIVE";
    105 	case KEY_RX_KEY_RECEIVE: return "KEY_RECEIVE";
    106 	default: return "Unknown";
    107 	}
    108 }
    109 
    110 
    111 static inline const char * ctrl_dir_state_txt(int s)
    112 {
    113 	switch (s) {
    114 	case CTRL_DIR_FORCE_BOTH: return "FORCE_BOTH";
    115 	case CTRL_DIR_IN_OR_BOTH: return "IN_OR_BOTH";
    116 	default: return "Unknown";
    117 	}
    118 }
    119 
    120 
    121 int eapol_auth_dump_state(struct eapol_state_machine *sm, char *buf,
    122 			  size_t buflen)
    123 {
    124 	char *pos, *end;
    125 	int ret;
    126 
    127 	pos = buf;
    128 	end = pos + buflen;
    129 
    130 	ret = os_snprintf(pos, end - pos, "aWhile=%d\nquietWhile=%d\n"
    131 			  "reAuthWhen=%d\n",
    132 			  sm->aWhile, sm->quietWhile, sm->reAuthWhen);
    133 	if (os_snprintf_error(end - pos, ret))
    134 		return pos - buf;
    135 	pos += ret;
    136 
    137 #define _SB(b) ((b) ? "TRUE" : "FALSE")
    138 	ret = os_snprintf(pos, end - pos,
    139 			  "authAbort=%s\n"
    140 			  "authFail=%s\n"
    141 			  "authPortStatus=%s\n"
    142 			  "authStart=%s\n"
    143 			  "authTimeout=%s\n"
    144 			  "authSuccess=%s\n"
    145 			  "eapFail=%s\n"
    146 			  "eapolEap=%s\n"
    147 			  "eapSuccess=%s\n"
    148 			  "eapTimeout=%s\n"
    149 			  "initialize=%s\n"
    150 			  "keyAvailable=%s\n"
    151 			  "keyDone=%s\n"
    152 			  "keyRun=%s\n"
    153 			  "keyTxEnabled=%s\n"
    154 			  "portControl=%s\n"
    155 			  "portEnabled=%s\n"
    156 			  "portValid=%s\n"
    157 			  "reAuthenticate=%s\n",
    158 			  _SB(sm->authAbort),
    159 			  _SB(sm->authFail),
    160 			  port_state_txt(sm->authPortStatus),
    161 			  _SB(sm->authStart),
    162 			  _SB(sm->authTimeout),
    163 			  _SB(sm->authSuccess),
    164 			  _SB(sm->eap_if->eapFail),
    165 			  _SB(sm->eapolEap),
    166 			  _SB(sm->eap_if->eapSuccess),
    167 			  _SB(sm->eap_if->eapTimeout),
    168 			  _SB(sm->initialize),
    169 			  _SB(sm->eap_if->eapKeyAvailable),
    170 			  _SB(sm->keyDone), _SB(sm->keyRun),
    171 			  _SB(sm->keyTxEnabled),
    172 			  port_type_txt(sm->portControl),
    173 			  _SB(sm->eap_if->portEnabled),
    174 			  _SB(sm->portValid),
    175 			  _SB(sm->reAuthenticate));
    176 	if (os_snprintf_error(end - pos, ret))
    177 		return pos - buf;
    178 	pos += ret;
    179 
    180 	ret = os_snprintf(pos, end - pos,
    181 			  "auth_pae_state=%s\n"
    182 			  "eapolLogoff=%s\n"
    183 			  "eapolStart=%s\n"
    184 			  "eapRestart=%s\n"
    185 			  "portMode=%s\n"
    186 			  "reAuthCount=%d\n"
    187 			  "quietPeriod=%d\n"
    188 			  "reAuthMax=%d\n"
    189 			  "authEntersConnecting=%d\n"
    190 			  "authEapLogoffsWhileConnecting=%d\n"
    191 			  "authEntersAuthenticating=%d\n"
    192 			  "authAuthSuccessesWhileAuthenticating=%d\n"
    193 			  "authAuthTimeoutsWhileAuthenticating=%d\n"
    194 			  "authAuthFailWhileAuthenticating=%d\n"
    195 			  "authAuthEapStartsWhileAuthenticating=%d\n"
    196 			  "authAuthEapLogoffWhileAuthenticating=%d\n"
    197 			  "authAuthReauthsWhileAuthenticated=%d\n"
    198 			  "authAuthEapStartsWhileAuthenticated=%d\n"
    199 			  "authAuthEapLogoffWhileAuthenticated=%d\n",
    200 			  auth_pae_state_txt(sm->auth_pae_state),
    201 			  _SB(sm->eapolLogoff),
    202 			  _SB(sm->eapolStart),
    203 			  _SB(sm->eap_if->eapRestart),
    204 			  port_type_txt(sm->portMode),
    205 			  sm->reAuthCount,
    206 			  sm->quietPeriod, sm->reAuthMax,
    207 			  sm->authEntersConnecting,
    208 			  sm->authEapLogoffsWhileConnecting,
    209 			  sm->authEntersAuthenticating,
    210 			  sm->authAuthSuccessesWhileAuthenticating,
    211 			  sm->authAuthTimeoutsWhileAuthenticating,
    212 			  sm->authAuthFailWhileAuthenticating,
    213 			  sm->authAuthEapStartsWhileAuthenticating,
    214 			  sm->authAuthEapLogoffWhileAuthenticating,
    215 			  sm->authAuthReauthsWhileAuthenticated,
    216 			  sm->authAuthEapStartsWhileAuthenticated,
    217 			  sm->authAuthEapLogoffWhileAuthenticated);
    218 	if (os_snprintf_error(end - pos, ret))
    219 		return pos - buf;
    220 	pos += ret;
    221 
    222 	ret = os_snprintf(pos, end - pos,
    223 			  "be_auth_state=%s\n"
    224 			  "eapNoReq=%s\n"
    225 			  "eapReq=%s\n"
    226 			  "eapResp=%s\n"
    227 			  "serverTimeout=%d\n"
    228 			  "backendResponses=%d\n"
    229 			  "backendAccessChallenges=%d\n"
    230 			  "backendOtherRequestsToSupplicant=%d\n"
    231 			  "backendAuthSuccesses=%d\n"
    232 			  "backendAuthFails=%d\n",
    233 			  be_auth_state_txt(sm->be_auth_state),
    234 			  _SB(sm->eap_if->eapNoReq),
    235 			  _SB(sm->eap_if->eapReq),
    236 			  _SB(sm->eap_if->eapResp),
    237 			  sm->serverTimeout,
    238 			  sm->backendResponses,
    239 			  sm->backendAccessChallenges,
    240 			  sm->backendOtherRequestsToSupplicant,
    241 			  sm->backendAuthSuccesses,
    242 			  sm->backendAuthFails);
    243 	if (os_snprintf_error(end - pos, ret))
    244 		return pos - buf;
    245 	pos += ret;
    246 
    247 	ret = os_snprintf(pos, end - pos,
    248 			  "reauth_timer_state=%s\n"
    249 			  "reAuthPeriod=%d\n"
    250 			  "reAuthEnabled=%s\n",
    251 			  reauth_timer_state_txt(sm->reauth_timer_state),
    252 			  sm->reAuthPeriod,
    253 			  _SB(sm->reAuthEnabled));
    254 	if (os_snprintf_error(end - pos, ret))
    255 		return pos - buf;
    256 	pos += ret;
    257 
    258 	ret = os_snprintf(pos, end - pos,
    259 			  "auth_key_tx_state=%s\n",
    260 			  auth_key_tx_state_txt(sm->auth_key_tx_state));
    261 	if (os_snprintf_error(end - pos, ret))
    262 		return pos - buf;
    263 	pos += ret;
    264 
    265 	ret = os_snprintf(pos, end - pos,
    266 			  "key_rx_state=%s\n"
    267 			  "rxKey=%s\n",
    268 			  key_rx_state_txt(sm->key_rx_state),
    269 			  _SB(sm->rxKey));
    270 	if (os_snprintf_error(end - pos, ret))
    271 		return pos - buf;
    272 	pos += ret;
    273 
    274 	ret = os_snprintf(pos, end - pos,
    275 			  "ctrl_dir_state=%s\n"
    276 			  "adminControlledDirections=%s\n"
    277 			  "operControlledDirections=%s\n"
    278 			  "operEdge=%s\n",
    279 			  ctrl_dir_state_txt(sm->ctrl_dir_state),
    280 			  ctrl_dir_txt(sm->adminControlledDirections),
    281 			  ctrl_dir_txt(sm->operControlledDirections),
    282 			  _SB(sm->operEdge));
    283 	if (os_snprintf_error(end - pos, ret))
    284 		return pos - buf;
    285 	pos += ret;
    286 #undef _SB
    287 
    288 	return pos - buf;
    289 }
    290