📄 wpa.c
字号:
if (bouseWECAoui)
{
*pu8payload++ = UMI_RSN_CIPHER_SUITE_TKIP;
}
else
{
*pu8payload++ = UMI_RSN_CIPHER_SUITE_CCMP;
}
}
else if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_GROUP_CIPHER_SUITE_WEP40)
{
*pu8payload++ = UMI_RSN_CIPHER_SUITE_WEP40;
}
else if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_GROUP_CIPHER_SUITE_TKIP)
{
*pu8payload++ = UMI_RSN_CIPHER_SUITE_TKIP;
}
else if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_GROUP_CIPHER_SUITE_WRAP)
{
*pu8payload++ = UMI_RSN_CIPHER_SUITE_WRAP;
}
else if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_GROUP_CIPHER_SUITE_CCMP)
{
*pu8payload++ = UMI_RSN_CIPHER_SUITE_CCMP;
}
else if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_GROUP_CIPHER_SUITE_WEP104)
{
*pu8payload++ = UMI_RSN_CIPHER_SUITE_WEP104;
}
else
{
/* Error - No Group Cipher Suite selected */
DBG_LEV0(("ERROR: Unknown RSN IE Group Cipher Suite Type, u32CapsMap = 0x%lx.\n", psRsnCaps->u32CapsMap));
// use the appropriate default group cipher suite
if (bouseWECAoui)
{ // refer to Wi-Fi Protected Access (WPA) document
*pu8payload++ = UMI_RSN_CIPHER_SUITE_TKIP;
}
else
{ // refer to IEEE 802.11i Standard
*pu8payload++ = UMI_RSN_CIPHER_SUITE_CCMP;
}
}
return pu8payload;
}
/*****************************************************************************
**
** NAME u16WPAgetPairwiseCipherSuiteCount
**
** PARAMETERS psRsnCaps pointer to structure with the RsnCaps
** for this Network
**
** RETURNS Number of Pairwise Cipher Suites this Network supports
**
** DESCRIPTION This function examines the RsnCaps structure and returns
** the number of Pairwise Cipher Suites this Network supports.
**
******************************************************************************/
static uint16 u16WPAgetPairwiseCipherSuiteCount(const UMI_RSN_CAPS *psRsnCaps)
{
return (((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_NONE) ? 1:0) +
((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_WEP40) ? 1:0) +
((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_TKIP) ? 1:0) +
((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_WRAP) ? 1:0) +
((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_CCMP) ? 1:0) +
((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_WEP104) ? 1:0));
}
/*****************************************************************************
**
** NAME pu8WPAaddRsnIePairwiseCipherFields
**
** PARAMETERS psRsnCaps - pointer to structure with the RsnCaps
** for this Network
** pu8OutPairwiseCipher - pointer to start of output field
**
** RETURNS pointer to start of next field
**
** DESCRIPTION This function inserts the Pairwise Cipher Suite Count and
** Pairwise Cipher Suite List fields into the RSN IE.
**
******************************************************************************/
static uint8 *pu8WPAaddRsnIePairwiseCipherFields(const UMI_RSN_CAPS *psRsnCaps, uint8 *pu8OutPairwiseCipher)
{
bool bouseWECAoui = (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_IE_TYPE_WECA) ? TRUE : FALSE;
uint8 * pu8payload = pu8OutPairwiseCipher;
/* Get the count of cipher suites */
uint16 u16count = u16WPAgetPairwiseCipherSuiteCount(psRsnCaps);
if (u16count == 0)
{
DBG_LEV0(("ERROR: Unknown RSN IE Pairwise Cipher Suite Type, u32CapsMap = 0x%lx.\n", psRsnCaps->u32CapsMap));
// set count to 1
u16count++;
*pu8payload++ = (uint8) u16count;
*pu8payload++ = (uint8)(u16count >> 8);
// use default Pairwise cipher suite
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
// use the appropriate default pairwise cipher suite
if (bouseWECAoui)
{ // refer to Wi-Fi Protected Access (WPA) document
*pu8payload++ = UMI_RSN_CIPHER_SUITE_TKIP;
}
else
{ // refer to IEEE 802.11i Standard
*pu8payload++ = UMI_RSN_CIPHER_SUITE_CCMP;
}
return pu8payload;
}
/* Fill in the count field */
*pu8payload++ = (uint8) u16count;
*pu8payload++ = (uint8)(u16count >> 8);
/* Add cipher suite selectors */
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_NONE)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_CIPHER_SUITE_NONE;
}
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_WEP40)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_CIPHER_SUITE_WEP40;
}
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_TKIP)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_CIPHER_SUITE_TKIP;
}
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_WRAP)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_CIPHER_SUITE_WRAP;
}
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_CCMP)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_CIPHER_SUITE_CCMP;
}
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PAIRWISE_CIPHER_SUITE_WEP104)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_CIPHER_SUITE_WEP104;
}
return pu8payload;
}
/*****************************************************************************
**
** NAME u16WPAgetAkmSuiteCount
**
** PARAMETERS psRsnCaps pointer to structure with the RsnCaps
** for this Network
**
** RETURNS Number of AKM Suites this Network supports
**
** DESCRIPTION This function examines the RsnCaps structure and returns
** the number of AKM Suites this Network supports.
**
******************************************************************************/
static uint16 u16WPAgetAkmSuiteCount(const UMI_RSN_CAPS *psRsnCaps)
{
return (((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_AUTH_SUITE_IEEE802_1X) ? 1:0) +
((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_AUTH_SUITE_PRESHARED_KEY) ? 1:0));
}
/*****************************************************************************
**
** NAME pu8WPAaddRsnIeAkmFields
**
** PARAMETERS psRsnCaps - pointer to structure with the RsnCaps
** for this Network
** pu8OutPairwiseCipher - pointer to start of output field
**
** RETURNS pointer to start of next field
**
** DESCRIPTION This function inserts the AKM Suite Count and AKM Suite
** List fields into the RSN IE.
**
******************************************************************************/
static uint8 *pu8WPAaddRsnIeAkmFields(const UMI_RSN_CAPS *psRsnCaps, uint8 *pu8OutAkm)
{
bool bouseWECAoui = (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_IE_TYPE_WECA) ? TRUE : FALSE;
uint8 * pu8payload = pu8OutAkm;
/* Get the count of AKM suites */
uint16 u16count = u16WPAgetAkmSuiteCount(psRsnCaps);
if (u16count == 0)
{
DBG_LEV0(("ERROR: Unknown RSN IE AKM Suite Type, u32CapsMap = 0x%lx.\n", psRsnCaps->u32CapsMap));
// set count to 1
u16count++;
*pu8payload++ = (uint8) u16count;
*pu8payload++ = (uint8)(u16count >> 8);
// use default AKM suite as defined in 802.11i.
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_KEY_MGMT_SUITE_802_1X;
return pu8payload;
}
/* Fill in the count field */
*pu8payload++ = (uint8) u16count;
*pu8payload++ = (uint8)(u16count >> 8);
/* Add auth suite selectors */
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_AUTH_SUITE_IEEE802_1X)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_KEY_MGMT_SUITE_802_1X;
}
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_AUTH_SUITE_PRESHARED_KEY)
{
pu8payload = pu8WPAaddRsnIeOuiField(bouseWECAoui, pu8payload);
*pu8payload++ = UMI_RSN_KEY_MGMT_SUITE_PRESHARED;
}
return pu8payload;
}
/*****************************************************************************
**
** NAME pu8WPAaddRsnIeRsnCapField
**
** PARAMETERS psRsnCaps - pointer to structure with the RsnCaps
** for this Network
** pu8OutPairwiseCipher - pointer to start of output field
**
** RETURNS pointer to start of next field
**
** DESCRIPTION This function inserts the RSN Capabilities Field into the
** RSN IE.
**
******************************************************************************/
static uint8 *pu8WPAaddRsnIeRsnCapField(const UMI_RSN_CAPS *psRsnCaps, uint8 *pu8OutRsnCap)
{
/* Clear all bits */
pu8OutRsnCap[0] = 0;
pu8OutRsnCap[1] = 0; // currently not used
/* Preauthentication supported? */
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_PRE_AUTH_SUPPORTED)
{
pu8OutRsnCap[0] |= UMI_RSN_CAPS_PREAUTH_SUPPORTED;
}
/* Use default pairwise keys? */
if (psRsnCaps->u32CapsMap & UMI_RSN_CAPS_USE_DEFAULT_PAIRWISE_KEY)
{
pu8OutRsnCap[0] |= UMI_RSN_CAPS_DEFAULT_PAIWISE_KEY;
}
/* Number of replay counters? */
pu8OutRsnCap[0] |= ((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_REPLAY_CNT_PW_MASK) >>
UMI_RSN_CAPS_REPLAY_CNT_PW_SHIFT) << UMI_RSN_CAPS_PTKSA_REPLAY_SHIFT;
pu8OutRsnCap[0] |= ((psRsnCaps->u32CapsMap & UMI_RSN_CAPS_REPLAY_CNT_GP_MASK) >>
UMI_RSN_CAPS_REPLAY_CNT_GP_SHIFT) << UMI_RSN_CAPS_GTKSA_REPLAY_SHIFT;
pu8OutRsnCap += UMI_RSN_IE_CAPABILITIES_LEN;
return pu8OutRsnCap;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -