📄 zdauthrsp.c
字号:
#ifndef __ZDAUTHRSP_C__
#define __ZDAUTHRSP_C__
#include "zd80211.h"
#include "zd1205.h"
U8 AuthRspState = STE_AUTH_RSP_IDLE;
static U8 arChalng[CHAL_TEXT_LEN]; //Challenge text
static MacAddr_t Sta2;
static MacAddr_t Sta;
extern struct net_device *g_dev;
BOOLEAN CheckAlg(U8 alg)
{
int i = 0;
for (i=0; i<3; i++){
if (i == 2)
return FALSE;
if (mAuthAlogrithms[i] == alg)
return TRUE;
}
return FALSE;
}
BOOLEAN AuthOdd_Idle(Signal_t *signal)
{
struct zd1205_private *macp=g_dev->priv;
FrmDesc_t *pfrmDesc;
Frame_t *rdu;
U16 arAlg;
U16 arSeq;
U16 arSC;
U8 vapId = 0;
ZDEBUG("AuthOdd_Idle");
pfrmDesc = signal->frmInfo.frmDesc;
rdu = pfrmDesc->mpdu;
arSeq = authSeqNum(rdu);
arAlg = authType(rdu);
memcpy((U8 *)&Sta, (U8 *)addr2(rdu), 6);
if (arSeq != 1){
arSC = SC_AUTH_OUT_OF_SEQ;
UpdateStaStatus(&Sta, STATION_STATE_NOT_AUTH, vapId);
mkAuthFrm(pfrmDesc, &Sta, arAlg, arSeq+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
if (!CheckAlg(arAlg)){
arSC = SC_UNSUPT_ALG;
UpdateStaStatus(&Sta, STATION_STATE_NOT_AUTH, vapId);
mkAuthFrm(pfrmDesc, &Sta, arAlg, arSeq+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
if (pdot11Obj->StatusNotify(STA_AUTH_REQ, (U8 *)&Sta)){ //Reject it
arSC = SC_UNSPEC_FAILURE;
UpdateStaStatus(&Sta, STATION_STATE_NOT_AUTH, vapId);
mkAuthFrm(pfrmDesc, &Sta, arAlg, arSeq+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
if (arAlg == OPEN_SYSTEM){
if (UpdateStaStatus(&Sta, STATION_STATE_AUTH_OPEN, vapId))
arSC = SC_SUCCESSFUL;
else
arSC = SC_AP_FULL;
mkAuthFrm(pfrmDesc, &Sta, arAlg, arSeq+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
if (arAlg == SHARE_KEY){
//WPA
if (macp->cardSetting.WPAIeLen){
//if ((mDynKeyMode == DYN_KEY_TKIP) || (mDynKeyMode == DYN_KEY_AES)){
arSC = SC_UNSUPT_ALG;
UpdateStaStatus(&Sta, STATION_STATE_NOT_AUTH, vapId);
mkAuthFrm(pfrmDesc, &Sta, arAlg, arSeq+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
else{
if ((mCurrConnUser + 1) > mLimitedUser)
arSC = SC_AP_FULL;
else
arSC = SC_SUCCESSFUL;
mkAuthFrm(pfrmDesc, &Sta, arAlg, arSeq+1, arSC, arChalng, vapId);
if (arSC == SC_SUCCESSFUL){
pdot11Obj->StartTimer(512, DO_CHAL);
AuthRspState = STE_AUTH_RSP_WAIT_CRSP;
}
return sendMgtFrame(signal, pfrmDesc);
}
}
freeFdesc(pfrmDesc);
return TRUE;
}
BOOLEAN AuthOdd_WaitChalRsp(Signal_t *signal)
{
FrmDesc_t *pfrmDesc;
Frame_t *rdu;
U8 arAlg2;
U16 arSeq2;
U16 arSC;
U8 vapId = 0;
U8 ChalText[130];
ZDEBUG("AuthOdd_WaitChalRsp");
pfrmDesc = signal->frmInfo.frmDesc;
rdu = pfrmDesc->mpdu;
arSeq2 = authSeqNum(rdu);
arAlg2 = authType(rdu);
memcpy((U8 *)&Sta2, (U8 *)addr2(rdu), 6);
if(arSeq2 == 1){
if (memcmp(&Sta, &Sta2, 6) == 0){ // open system request from a different station
arSC = SC_UNSPEC_FAILURE;
goto fail_sta2;
}
if (arAlg2 == OPEN_SYSTEM){
arSC = SC_SUCCESSFUL;
UpdateStaStatus(&Sta, STATION_STATE_AUTH_OPEN, vapId);
mkAuthFrm(pfrmDesc, &Sta2, arAlg2, arSeq2+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
else{
arSC = SC_UNSPEC_FAILURE;
goto fail_sta2;
}
}
else if(arSeq2 == 3){
if (memcmp(&Sta, &Sta2, 6) == 0){
pdot11Obj->StopTimer(DO_CHAL);
if (wepBit(rdu)){
if (!getElem(rdu, EID_CTEXT, (Element *)&ChalText[0],1)){
goto chal_failed;
}
else {
//zd1205_OctetDump("ChalText = ", &ChalText[0], CHAL_TEXT_LEN+2);
if (memcmp(&ChalText[2], arChalng, CHAL_TEXT_LEN) != 0){
goto chal_failed;
}
}
if (UpdateStaStatus(&Sta, STATION_STATE_AUTH_KEY, vapId))
arSC = SC_SUCCESSFUL;
else
arSC = SC_AP_FULL;
}
else{
chal_failed:
arSC = SC_CHAL_FAIL;
UpdateStaStatus(&Sta2, STATION_STATE_NOT_AUTH, vapId);
}
}
else{
arSC = SC_UNSPEC_FAILURE;
UpdateStaStatus(&Sta2, STATION_STATE_NOT_AUTH, vapId);
}
AuthRspState = STE_AUTH_RSP_IDLE;
mkAuthFrm(pfrmDesc, &Sta2, arAlg2, arSeq2+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
else{
arSC = SC_UNSPEC_FAILURE;
goto fail_sta2;
}
fail_sta2:
UpdateStaStatus(&Sta2, STATION_STATE_NOT_AUTH, vapId);
mkAuthFrm(pfrmDesc, &Sta2, arAlg2, arSeq2+1, arSC, NULL, vapId);
return sendMgtFrame(signal, pfrmDesc);
}
BOOLEAN Tchal_WaitChalRsp(Signal_t *signal)
{
U8 vapId = 0;
ZDEBUG("Tchal_WaitChalRsp");
if (AuthRspState == STE_AUTH_RSP_WAIT_CRSP){
UpdateStaStatus(&Sta, STATION_STATE_NOT_AUTH, vapId);
AuthRspState = STE_AUTH_RSP_IDLE;
}
return FALSE;
}
BOOLEAN Deauth(Signal_t *signal)
{
FrmDesc_t *pfrmDesc;
Frame_t *rdu;
U8 vapId = 0;
ZDEBUG("Deauth");
pfrmDesc = signal->frmInfo.frmDesc;
rdu = pfrmDesc->mpdu;
UpdateStaStatus(addr2(rdu), STATION_STATE_NOT_AUTH, vapId);
if (memcmp(&mBssId, addr2(rdu), 6) == 0)
pdot11Obj->StatusNotify(STA_DEAUTHED, (U8 *)addr2(rdu));
if (mBssType == INFRASTRUCTURE_BSS){
//if (memcmp(&mBssId, addr2(rdu), 6) == 0){
FPRINT("Deauth");
mAssoc = FALSE;
memset((U8 *)&mBssId, 0, 6);
mRequestFlag |= DIS_CONNECT_SET;
//}
}
//here to handle deauth ind.
freeFdesc(pfrmDesc);
return TRUE;
}
BOOLEAN AuthRspEntry(Signal_t *signal)
{
if (AuthRspState == STE_AUTH_RSP_IDLE){
switch(signal->id){
case SIG_AUTH_ODD:
return AuthOdd_Idle(signal);
case SIG_DEAUTH:
return Deauth(signal);
default:
return TRUE;
}
}
else if (AuthRspState == STE_AUTH_RSP_WAIT_CRSP){
switch(signal->id){
case SIG_AUTH_ODD:
return AuthOdd_WaitChalRsp(signal);
case SIG_DEAUTH:
return Deauth(signal);
case SIG_TO_CHAL:
return Tchal_WaitChalRsp(signal);
default:
return TRUE;
}
}
else
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -