📄 auth.c
字号:
}
else
{
// 2. shared key, need to be challenged
Seq++;
RemoteStatus = MLME_SUCCESS;
NStatus = MlmeAllocateMemory(pAd, (PVOID)&OutBuffer); //Get an unused nonpaged memory
if(NStatus != NDIS_STATUS_SUCCESS)
{
DBGPRINT(RT_DEBUG_TRACE, "AUTH - PeerAuthRspAtSeq2Action() allocate memory fail\n");
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
MlmeCntlConfirm(pAd, MT2_AUTH_CONF, MLME_FAIL_NO_RESOURCE);
return;
}
DBGPRINT(RT_DEBUG_TRACE, "AUTH - Send AUTH request seq#3...\n");
MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, &Addr2, &pAd->PortCfg.Bssid);
AuthHdr.Wep = 1;
// Encrypt challenge text & auth information
RTMPInitWepEngine(
pAd,
pAd->PortCfg.SharedKey[pAd->PortCfg.DefaultKeyId].Key,
pAd->PortCfg.DefaultKeyId,
pAd->PortCfg.SharedKey[pAd->PortCfg.DefaultKeyId].KeyLen,
CyperChlgText);
RTMPEncryptData(pAd, (PUCHAR) &Alg, CyperChlgText + 4, 2);
RTMPEncryptData(pAd, (PUCHAR) &Seq, CyperChlgText + 6, 2);
RTMPEncryptData(pAd, (PUCHAR) &RemoteStatus, CyperChlgText + 8, 2);
Element[0] = 16;
Element[1] = 128;
RTMPEncryptData(pAd, Element, CyperChlgText + 10, 2);
RTMPEncryptData(pAd, ChlgText, CyperChlgText + 12, 128);
RTMPSetICV(pAd, CyperChlgText + 140);
MakeOutgoingFrame(OutBuffer, &FrameLen,
MAC_HDR_LEN, &AuthHdr,
CIPHER_TEXT_LEN + 16, CyperChlgText,
END_OF_ARGS);
MiniportMMRequest(pAd, OutBuffer, FrameLen);
RTMPSetTimer(pAd, &pAd->Mlme.AuthAux.AuthTimer, AUTH_TIMEOUT); //AUTH_KEY_TIMEOUT);
pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ4;
}
}
else
{
pAd->PortCfg.AuthFailReason = Status;
COPY_MAC_ADDR(&pAd->PortCfg.AuthFailSta, &Addr2);
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
MlmeCntlConfirm(pAd, MT2_AUTH_CONF, Status);
}
}
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "AUTH - PeerAuthSanity() sanity check fail\n");
}
}
/*
==========================================================================
Description:
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID PeerAuthRspAtSeq4Action(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
MACADDR Addr2;
USHORT Alg, Seq, Status;
CHAR ChlgText[CIPHER_TEXT_LEN];
if(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, &Addr2, &Alg, &Seq, &Status, ChlgText))
{
if(MAC_ADDR_EQUAL(&(pAd->Mlme.AuthAux.Addr), &Addr2) && Seq == 4)
{
DBGPRINT(RT_DEBUG_TRACE, "AUTH - Receive AUTH_RSP seq#4 to me\n");
RTMPCancelTimer(&pAd->Mlme.AuthAux.AuthTimer);
if(Status == MLME_SUCCESS)
{
pAd->PortCfg.Mauth = TRUE;
}
else
{
pAd->PortCfg.AuthFailReason = Status;
pAd->PortCfg.AuthFailSta = Addr2;
}
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
MlmeCntlConfirm(pAd, MT2_AUTH_CONF, Status);
}
}
else
{
DBGPRINT(RT_DEBUG_TRACE, "AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n");
}
}
/*
==========================================================================
Description:
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID MlmeDeauthReqAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
MLME_DEAUTH_REQ_STRUCT *Info;
MACHDR Hdr;
UCHAR *OutBuffer = NULL;
NDIS_STATUS NStatus;
ULONG FrameLen = 0;
Info = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg;
NStatus = MlmeAllocateMemory(pAd, (PVOID)&OutBuffer); //Get an unused nonpaged memory
if (NStatus != NDIS_STATUS_SUCCESS)
{
DBGPRINT(RT_DEBUG_TRACE, "AUTH - MlmeDeauthReqAction() allocate memory fail\n");
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
MlmeCntlConfirm(pAd, MT2_DEAUTH_CONF, MLME_FAIL_NO_RESOURCE);
return;
}
DBGPRINT(RT_DEBUG_TRACE, "AUTH - Send DE-AUTH request...\n");
MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, &Info->Addr, &pAd->PortCfg.Bssid);
MakeOutgoingFrame(OutBuffer, &FrameLen,
sizeof(MACHDR), &Hdr,
2, &Info->Reason,
END_OF_ARGS);
MiniportMMRequest(pAd, OutBuffer, FrameLen);
pAd->PortCfg.DeauthReason = Info->Reason;
COPY_MAC_ADDR(&pAd->PortCfg.DeauthSta, &Info->Addr);
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
MlmeCntlConfirm(pAd, MT2_DEAUTH_CONF, MLME_SUCCESS);
}
/*
==========================================================================
Description:
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID AuthTimeoutAction(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "AUTH - AuthTimeoutAction\n");
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
MlmeCntlConfirm(pAd, MT2_AUTH_CONF, MLME_REJ_TIMEOUT);
}
/*
==========================================================================
Description:
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID InvalidStateWhenAuth(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
DBGPRINT(RT_DEBUG_TRACE, "AUTH - InvalidStateWhenAuth (state=%d), reset AUTH state machine\n", pAd->Mlme.AuthMachine.CurrState);
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
MlmeCntlConfirm(pAd, MT2_AUTH_CONF, MLME_STATE_MACHINE_REJECT);
}
/*
==========================================================================
Description:
Some STA/AP
Note:
This action should never trigger AUTH state transition, therefore we
separate it from AUTH state machine, and make it as a standalone service
IRQL = DISPATCH_LEVEL
==========================================================================
*/
VOID Cls2errAction(
IN PRT2570ADAPTER pAd,
IN PMACADDR pAddr)
{
MACHDR Hdr;
UCHAR *OutBuffer = NULL;
NDIS_STATUS NStatus;
ULONG FrameLen = 0;
USHORT Reason = REASON_CLS2ERR;
NStatus = MlmeAllocateMemory(pAd, (PVOID)&OutBuffer); //Get an unused nonpaged memory
if (NStatus != NDIS_STATUS_SUCCESS)
return;
DBGPRINT(RT_DEBUG_TRACE, "AUTH - Class 2 error, Send DEAUTH frame...\n");
MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_DEAUTH, 0, pAddr, &pAd->PortCfg.Bssid);
MakeOutgoingFrame(OutBuffer, &FrameLen,
sizeof(MACHDR), &Hdr,
2, &Reason,
END_OF_ARGS);
MiniportMMRequest(pAd, OutBuffer, FrameLen);
pAd->PortCfg.DeauthReason = Reason;
COPY_MAC_ADDR(&pAd->PortCfg.DeauthSta, pAddr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -