📄 bcmwpa.c
字号:
/* * bcmwpa.c - shared WPA-related functions * * * Copyright 2005-2006, Broadcom Corporation * All Rights Reserved. * * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. * $Id$ */#include <bcmendian.h>/* include wl driver config file if this file is compiled for driver */#ifdef BCMDRIVER#include <osl.h>#else#if defined(__GNUC__)extern void bcopy(const void *src, void *dst, int len);extern int bcmp(const void *b1, const void *b2, int len);extern void bzero(void *b, int len);#else#define bcopy(src, dst, len) memcpy((dst), (src), (len))#define bcmp(b1, b2, len) memcmp((b1), (b2), (len))#define bzero(b, len) memset((b), 0, (len))#endif /* defined(__GNUC__) */#endif /* BCMDRIVER */#include <wlioctl.h>#include <proto/802.11.h>#include <proto/eapol.h>#include <bcmutils.h>#include <bcmwpa.h>/* Convert WPA/WPA2 IE cipher suite to locally used value */static boolrsn_cipher(wpa_suite_t *suite, ushort *cipher, uint8 *std_oui, bool wep_ok){ bool ret = TRUE; if (!bcmp((char *)suite->oui, std_oui, DOT11_OUI_LEN)) { switch (suite->type) { case WPA_CIPHER_TKIP: *cipher = CRYPTO_ALGO_TKIP; break; case WPA_CIPHER_AES_CCM: *cipher = CRYPTO_ALGO_AES_CCM; break; case WPA_CIPHER_WEP_40: if (wep_ok) *cipher = CRYPTO_ALGO_WEP1; else ret = FALSE; break; case WPA_CIPHER_WEP_104: if (wep_ok) *cipher = CRYPTO_ALGO_WEP128; else ret = FALSE; break; default: ret = FALSE; break; } return ret; } /* check for other vendor OUIs */ return FALSE;}boolwpa_cipher(wpa_suite_t *suite, ushort *cipher, bool wep_ok){ return rsn_cipher(suite, cipher, (uchar*)WPA_OUI, wep_ok);}/* Is this body of this tlvs entry a WPA entry? If *//* not update the tlvs buffer pointer/length */boolbcm_is_wpa_ie(uint8 *ie, uint8 **tlvs, uint *tlvs_len){ /* If the contents match the WPA_OUI and type=1 */ if ((ie[TLV_LEN_OFF] > (WPA_OUI_LEN+1)) && !bcmp(&ie[TLV_BODY_OFF], WPA_OUI "\x01", WPA_OUI_LEN + 1)) { return TRUE; } /* point to the next ie */ ie += ie[TLV_LEN_OFF] + TLV_HDR_LEN; /* calculate the length of the rest of the buffer */ *tlvs_len -= (int)(ie - *tlvs); /* update the pointer to the start of the buffer */ *tlvs = ie; return FALSE;}wpa_ie_fixed_t *bcm_find_wpaie(uint8 *parse, uint len){ bcm_tlv_t *ie; while ((ie = bcm_parse_tlvs(parse, len, DOT11_MNG_WPA_ID))) { if (bcm_is_wpa_ie((uint8*)ie, &parse, &len)) { return (wpa_ie_fixed_t *)ie; } } return NULL;}uchar *wpa_array_cmp(int max, uint8 *x, uint8 *y, int len){ int i; uint8 *ret = x; for (i = 0; i < len; i++) if (x[i] != y[i]) break; if (i == len) { return NULL; } if (max && (y[i] > x[i])) ret = y; if (!max && (y[i] < x[i])) ret = y; return (ret);}voidwpa_incr_array(uint8 *array, int len){ int i; for (i = (len-1); i >= 0; i--) if (array[i]++ != 0xff) { break; }}/* map akm suite to internal WPA_AUTH_XXXX *//* akms points to 4 byte suite (oui + type) */boolbcmwpa_akm2WPAauth(uint8 *akm, uint32 *auth){ if (!bcmp(akm, WPA_OUI, DOT11_OUI_LEN)) { switch (akm[DOT11_OUI_LEN]) { case RSN_AKM_NONE: *auth = WPA_AUTH_NONE; break; case RSN_AKM_UNSPECIFIED: *auth = WPA_AUTH_UNSPECIFIED; break; case RSN_AKM_PSK: *auth = WPA_AUTH_PSK; break; default: return FALSE; } return TRUE; } return FALSE;}/* map cipher suite to internal WSEC_XXXX *//* cs points 4 byte cipher suite, and only the type is used for non CCX ciphers */boolbcmwpa_cipher2wsec(uint8 *cipher, uint32 *wsec){ switch (cipher[DOT11_OUI_LEN]) { case WPA_CIPHER_NONE: *wsec = 0; break; case WPA_CIPHER_WEP_40: case WPA_CIPHER_WEP_104: *wsec = WEP_ENABLED; break; case WPA_CIPHER_TKIP: *wsec = TKIP_ENABLED; break; case WPA_CIPHER_AES_CCM: *wsec = AES_ENABLED; break; default: return FALSE; } return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -