⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmm_sanity.c

📁 ralink最新rt3070 usb wifi 无线网卡驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
 	}	else if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2)	// For authenticator	{		// check Replay Counter coresponds to MSG from authenticator, otherwise discard    	if (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY))    	{				bReplayDiff = TRUE;	            	}	}	// Replay Counter different condition	if (bReplayDiff)	{		// send wireless event - for replay counter different		if (pAd->CommonCfg.bWirelessEvent)			RTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); 		if (MsgType < EAPOL_GROUP_MSG_1)		{           	DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in pairwise msg %d of 4-way handshake!\n", MsgType));		}		else		{			DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));		}				hex_dump("Receive replay counter ", pMsg->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);		hex_dump("Current replay counter ", pEntry->R_Counter, LEN_KEY_DESC_REPLAY);	        return FALSE;	}	// 2. Verify MIC except Pairwise Msg1	if (MsgType != EAPOL_PAIR_MSG_1)	{		UCHAR			rcvd_mic[LEN_KEY_DESC_MIC];		// Record the received MIC for check later		NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);		NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);							        if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)	// TKIP        {	            hmac_md5(pEntry->PTK, LEN_EAP_MICK, (PUCHAR)pMsg, MsgLen, mic);        }        else if (pEntry->WepStatus == Ndis802_11Encryption3Enabled)	// AES                {                                    HMAC_SHA1((PUCHAR)pMsg, MsgLen, pEntry->PTK, LEN_EAP_MICK, digest);            NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);        }	        if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC))        {			// send wireless event - for MIC different			if (pAd->CommonCfg.bWirelessEvent)				RTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); 			if (MsgType < EAPOL_GROUP_MSG_1)			{            	DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in pairwise msg %d of 4-way handshake!\n", MsgType));			}			else			{				DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));			}				hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC);			hex_dump("Desired  MIC", mic, LEN_KEY_DESC_MIC);			return FALSE;        }        	}	// Extract the context of the Key Data field if it exist	// The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is un-encrypted.	// The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted.	if (pMsg->KeyDesc.KeyDataLen[1] > 0)	{				// Decrypt this field				if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))		{								if(pEntry->WepStatus == Ndis802_11Encryption3Enabled)			{				// AES 				AES_GTK_KEY_UNWRAP(&pEntry->PTK[16], KEYDATA, pMsg->KeyDesc.KeyDataLen[1],pMsg->KeyDesc.KeyData);       			} 			else	  			{				INT 	i;				UCHAR   Key[32];				// Decrypt TKIP GTK				// Construct 32 bytes RC4 Key				NdisMoveMemory(Key, pMsg->KeyDesc.KeyIv, 16);				NdisMoveMemory(&Key[16], &pEntry->PTK[16], 16);				ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, Key, 32);				//discard first 256 bytes				for(i = 0; i < 256; i++)					ARCFOUR_BYTE(&pAd->PrivateInfo.WEPCONTEXT);				// Decrypt GTK. Becareful, there is no ICV to check the result is correct or not				ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, KEYDATA, pMsg->KeyDesc.KeyData, pMsg->KeyDesc.KeyDataLen[1]);       			}				if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))				GroupKeyIndex = EapolKeyInfo.KeyIndex;					}		else if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2))		{								NdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData, pMsg->KeyDesc.KeyDataLen[1]);			     		}		else		{						return TRUE;		}		// Parse Key Data field to 		// 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2)		// 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2		// 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2)		if (!RTMPParseEapolKeyData(pAd, KEYDATA, pMsg->KeyDesc.KeyDataLen[1], GroupKeyIndex, MsgType, bWPA2, pEntry))		{			return FALSE;		}	}	return TRUE;	}#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORTBOOLEAN MlmeDlsReqSanity(	IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,    OUT PRT_802_11_DLS *pDLS,    OUT PUSHORT pReason){	MLME_DLS_REQ_STRUCT *pInfo;    pInfo = (MLME_DLS_REQ_STRUCT *)Msg;    	*pDLS = pInfo->pDLS;	*pReason = pInfo->Reason;	return TRUE;}#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //#ifdef QOS_DLS_SUPPORTBOOLEAN PeerDlsReqSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,    OUT PUCHAR pDA,    OUT PUCHAR pSA,    OUT USHORT *pCapabilityInfo,     OUT USHORT *pDlsTimeout,    OUT UCHAR *pRatesLen,    OUT UCHAR Rates[],	OUT UCHAR *pHtCapabilityLen,    OUT HT_CAPABILITY_IE *pHtCapability){	CHAR            *Ptr;    PFRAME_802_11	Fr = (PFRAME_802_11)Msg;	PEID_STRUCT  eid_ptr;    // to prevent caller from using garbage output value    *pCapabilityInfo	= 0;    *pDlsTimeout	= 0;	*pHtCapabilityLen = 0;    Ptr = Fr->Octet;	// offset to destination MAC address (Category and Action field)    Ptr += 2;    // get DA from payload and advance the pointer    NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN);    Ptr += MAC_ADDR_LEN;    // get SA from payload and advance the pointer    NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN);    Ptr += MAC_ADDR_LEN;    // get capability info from payload and advance the pointer    NdisMoveMemory(pCapabilityInfo, Ptr, 2);    Ptr += 2;    // get capability info from payload and advance the pointer    NdisMoveMemory(pDlsTimeout, Ptr, 2);    Ptr += 2;	// Category and Action field + DA + SA + capability + Timeout	eid_ptr = (PEID_STRUCT) &Fr->Octet[18];		while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((UCHAR*)Fr + MsgLen))	{		switch(eid_ptr->Eid)		{			case IE_SUPP_RATES:                if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && (eid_ptr->Len > 0))                {                    NdisMoveMemory(Rates, eid_ptr->Octet, eid_ptr->Len);                    DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - IE_SUPP_RATES., Len=%d. Rates[0]=%x\n",eid_ptr->Len, Rates[0]));                    DBGPRINT(RT_DEBUG_TRACE, ("Rates[1]=%x %x %x %x %x %x %x\n", Rates[1], Rates[2], Rates[3], Rates[4], Rates[5], Rates[6], Rates[7]));                    *pRatesLen = eid_ptr->Len;                }                else                {                    *pRatesLen = 8;					Rates[0] = 0x82;					Rates[1] = 0x84;					Rates[2] = 0x8b;					Rates[3] = 0x96;					Rates[4] = 0x12;					Rates[5] = 0x24;					Rates[6] = 0x48;					Rates[7] = 0x6c;                    DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - wrong IE_SUPP_RATES., Len=%d\n",eid_ptr->Len));                }				break;			case IE_EXT_SUPP_RATES:                if (eid_ptr->Len + *pRatesLen <= MAX_LEN_OF_SUPPORTED_RATES)                {                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, eid_ptr->Len);                    *pRatesLen = (*pRatesLen) + eid_ptr->Len;                }                else                {                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, MAX_LEN_OF_SUPPORTED_RATES - (*pRatesLen));                    *pRatesLen = MAX_LEN_OF_SUPPORTED_RATES;                }				break;			case IE_HT_CAP:				if (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE))				{					NdisMoveMemory(pHtCapability, eid_ptr->Octet, sizeof(HT_CAPABILITY_IE));					*(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));					*(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));					*pHtCapabilityLen = sizeof(HT_CAPABILITY_IE);					DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - IE_HT_CAP\n"));				}				else				{					DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\n", eid_ptr->Len));				}				break;			default:				break;		}		eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);	}    return TRUE;}BOOLEAN PeerDlsRspSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,    OUT PUCHAR pDA,    OUT PUCHAR pSA,    OUT USHORT *pCapabilityInfo,     OUT USHORT *pStatus,    OUT UCHAR *pRatesLen,    OUT UCHAR Rates[],    OUT UCHAR *pHtCapabilityLen,    OUT HT_CAPABILITY_IE *pHtCapability) {    CHAR            *Ptr;    PFRAME_802_11	Fr = (PFRAME_802_11)Msg;	PEID_STRUCT  eid_ptr;    // to prevent caller from using garbage output value    *pStatus		= 0;    *pCapabilityInfo	= 0;	*pHtCapabilityLen = 0;    Ptr = Fr->Octet;	// offset to destination MAC address (Category and Action field)    Ptr += 2;	// get status code from payload and advance the pointer    NdisMoveMemory(pStatus, Ptr, 2);    Ptr += 2;    // get DA from payload and advance the pointer    NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN);    Ptr += MAC_ADDR_LEN;    // get SA from payload and advance the pointer    NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN);    Ptr += MAC_ADDR_LEN;	if (pStatus == 0)	{	    // get capability info from payload and advance the pointer	    NdisMoveMemory(pCapabilityInfo, Ptr, 2);	    Ptr += 2;	}	// Category and Action field + status code + DA + SA + capability	eid_ptr = (PEID_STRUCT) &Fr->Octet[18];		while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((UCHAR*)Fr + MsgLen))	{		switch(eid_ptr->Eid)		{			case IE_SUPP_RATES:                if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && (eid_ptr->Len > 0))                {                    NdisMoveMemory(Rates, eid_ptr->Octet, eid_ptr->Len);                    DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - IE_SUPP_RATES., Len=%d. Rates[0]=%x\n",eid_ptr->Len, Rates[0]));                    DBGPRINT(RT_DEBUG_TRACE, ("Rates[1]=%x %x %x %x %x %x %x\n", Rates[1], Rates[2], Rates[3], Rates[4], Rates[5], Rates[6], Rates[7]));                    *pRatesLen = eid_ptr->Len;                }                else                {                    *pRatesLen = 8;					Rates[0] = 0x82;					Rates[1] = 0x84;					Rates[2] = 0x8b;					Rates[3] = 0x96;					Rates[4] = 0x12;					Rates[5] = 0x24;					Rates[6] = 0x48;					Rates[7] = 0x6c;                    DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - wrong IE_SUPP_RATES., Len=%d\n",eid_ptr->Len));                }				break;			case IE_EXT_SUPP_RATES:                if (eid_ptr->Len + *pRatesLen <= MAX_LEN_OF_SUPPORTED_RATES)                {                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, eid_ptr->Len);                    *pRatesLen = (*pRatesLen) + eid_ptr->Len;                }                else                {                    NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, MAX_LEN_OF_SUPPORTED_RATES - (*pRatesLen));                    *pRatesLen = MAX_LEN_OF_SUPPORTED_RATES;                }				break;			case IE_HT_CAP:				if (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE))				{					NdisMoveMemory(pHtCapability, eid_ptr->Octet, sizeof(HT_CAPABILITY_IE));					*(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));					*(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));					*pHtCapabilityLen = sizeof(HT_CAPABILITY_IE);					DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - IE_HT_CAP\n"));				}				else				{					DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\n", eid_ptr->Len));				}				break;			default:				break;		}		eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len);	}    return TRUE;}BOOLEAN PeerDlsTearDownSanity(    IN PRTMP_ADAPTER pAd,     IN VOID *Msg,     IN ULONG MsgLen,    OUT PUCHAR pDA,    OUT PUCHAR pSA,    OUT USHORT *pReason) {    CHAR            *Ptr;    PFRAME_802_11	Fr = (PFRAME_802_11)Msg;    // to prevent caller from using garbage output value    *pReason	= 0;    Ptr = Fr->Octet;	// offset to destination MAC address (Category and Action field)    Ptr += 2;    // get DA from payload and advance the pointer    NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN);    Ptr += MAC_ADDR_LEN;    // get SA from payload and advance the pointer    NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN);    Ptr += MAC_ADDR_LEN;	// get reason code from payload and advance the pointer    NdisMoveMemory(pReason, Ptr, 2);    Ptr += 2;    return TRUE;}#endif // QOS_DLS_SUPPORT //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -