diff options
| author | Srinivas Girigowda <sgirigow@qca.qualcomm.com> | 2013-12-30 16:59:12 -0800 |
|---|---|---|
| committer | Prakash Dhavali <pdhavali@codeaurora.org> | 2014-01-17 21:45:52 -0800 |
| commit | e3d5ca8677b7e28ef18c14529d45d4bede5b3c7a (patch) | |
| tree | 664ee8f20fd29a7cc5539d3b45b8977de8c99971 | |
| parent | c3d56f879a5659d13480885d23f60cab09a089e5 (diff) | |
wlan: PMF(802.11w) support on CLD
1. Invoking CNSS BIP algorithm API to validate integrity (MIC)
of the protected broadcast/multicast frames.
2. Enable RMF flag in add peer for PMF association.
3. Add CCMP header/trailer space for outgoing protected RMF
3. Strip CCMP header/trailer space for incoming protected RMF
.
Change-Id: I66dd4cf4375b00d15043206ca0826122053ccacf
CRs-Fixed: 590924
| -rw-r--r-- | CORE/CLD_TXRX/TLSHIM/tl_shim.c | 76 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/ieee80211_common.h | 3 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 79 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 14 | ||||
| -rw-r--r-- | CORE/VOSS/inc/i_vos_packet.h | 1 | ||||
| -rw-r--r-- | CORE/VOSS/inc/vos_utils.h | 5 | ||||
| -rw-r--r-- | CORE/VOSS/inc/wcnss_api.h | 38 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_utils.c | 140 |
8 files changed, 305 insertions, 51 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index f8f40ea86974..fb3e121ad8b4 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -43,6 +43,7 @@ #endif #include "adf_nbuf.h" #include "wma_api.h" +#include "vos_utils.h" #define ENTER() VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO, "Enter:%s", __func__) @@ -389,13 +390,18 @@ next_nbuf: #define TLSHIM_TGT_NOISE_FLOOR_DBM (-96) static int tlshim_mgmt_rx_process(void *context, u_int8_t *data, - u_int32_t data_len, bool saved_beacon) + u_int32_t data_len, bool saved_beacon, u_int32_t vdev_id) { void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL); struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx); WMI_MGMT_RX_EVENTID_param_tlvs *param_tlvs = NULL; wmi_mgmt_rx_hdr *hdr = NULL; +#ifdef WLAN_FEATURE_11W + struct wma_txrx_node *iface = NULL; + tp_wma_handle wma; + u_int8_t *efrm, *orig_hdr; +#endif /* WLAN_FEATURE_11W */ vos_pkt_t *rx_pkt; adf_nbuf_t wbuf; @@ -515,20 +521,82 @@ static int tlshim_mgmt_rx_process(void *context, u_int8_t *data, tl_shim->last_beacon_len = data_len; } } + +#ifdef WLAN_FEATURE_11W + wma = vos_get_context(VOS_MODULE_ID_WDA, vos_ctx); + if (wma) + iface = &wma->interfaces[vdev_id]; + if (iface && iface->rmfEnabled && mgt_type == IEEE80211_FC0_TYPE_MGT && + (mgt_subtype == IEEE80211_FC0_SUBTYPE_DISASSOC || + mgt_subtype == IEEE80211_FC0_SUBTYPE_DEAUTH || + mgt_subtype == IEEE80211_FC0_SUBTYPE_ACTION)) + { + if ((wh)->i_fc[1] & IEEE80211_FC1_WEP) + { + orig_hdr = (u_int8_t*) adf_nbuf_data(wbuf); + + /* Strip privacy headers (and trailer) + for a received frame */ + vos_mem_move(orig_hdr + IEEE80211_CCMP_HEADERLEN, + wh, sizeof(*wh)); + adf_nbuf_pull_head(wbuf, IEEE80211_CCMP_HEADERLEN); + adf_nbuf_trim_tail(wbuf, IEEE80211_CCMP_MICLEN); + + rx_pkt->pkt_meta.mpdu_hdr_ptr = adf_nbuf_data(wbuf); + rx_pkt->pkt_meta.mpdu_data_ptr = + rx_pkt->pkt_meta.mpdu_hdr_ptr + + rx_pkt->pkt_meta.mpdu_hdr_len; + rx_pkt->pkt_buf = wbuf; + } + else + { + if (IEEE80211_IS_BROADCAST(wh->i_addr1) || + IEEE80211_IS_MULTICAST(wh->i_addr1)) + { + efrm = adf_nbuf_data(wbuf) + adf_nbuf_len(wbuf); + if (vos_is_mmie_valid(iface->key.key, + iface->key.ipn, + (u_int8_t *)wh, efrm)) + { + TLSHIM_LOGD("Protected BC/MC frame MMIE" + " validation successful"); + + /* Remove MMIE */ + adf_nbuf_trim_tail(wbuf, + vos_get_mmie_size()); + } + else + { + TLSHIM_LOGE("BC/MC MIC error or MMIE" + " not present, dropping the frame"); + vos_pkt_return_packet(rx_pkt); + return 0; + } + } + else + { + TLSHIM_LOGD("Rx unprotected unicast mgmt frame"); + rx_pkt->pkt_meta.dpuFeedback = + DPU_FEEDBACK_UNPROTECTED_ERROR; + } + + } + } +#endif /* WLAN_FEATURE_11W */ return tl_shim->mgmt_rx(vos_ctx, rx_pkt); } static int tlshim_mgmt_rx_wmi_handler(void *context, u_int8_t *data, u_int32_t data_len) { - return (tlshim_mgmt_rx_process(context, data, data_len, FALSE)); + return (tlshim_mgmt_rx_process(context, data, data_len, FALSE, 0)); } #endif /* * tlshim_mgmt_roam_event_ind() is called from WMA layer when * BETTER_AP_FOUND event is received from roam engine. */ -int tlshim_mgmt_roam_event_ind(void *context) +int tlshim_mgmt_roam_event_ind(void *context, u_int32_t vdev_id) { void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL); struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL, @@ -536,7 +604,7 @@ int tlshim_mgmt_roam_event_ind(void *context) VOS_STATUS ret = VOS_STATUS_SUCCESS; if (tl_shim->last_beacon_data && tl_shim->last_beacon_len) { - ret = tlshim_mgmt_rx_process(context, tl_shim->last_beacon_data, tl_shim->last_beacon_len, TRUE); + ret = tlshim_mgmt_rx_process(context, tl_shim->last_beacon_data, tl_shim->last_beacon_len, TRUE, vdev_id); } return ret; } diff --git a/CORE/SERVICES/COMMON/ieee80211_common.h b/CORE/SERVICES/COMMON/ieee80211_common.h index c8c6c244461e..8927feb11753 100644 --- a/CORE/SERVICES/COMMON/ieee80211_common.h +++ b/CORE/SERVICES/COMMON/ieee80211_common.h @@ -1862,6 +1862,9 @@ enum { #define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */ #define IEEE80211_WEP_MICLEN 8 /* trailing MIC */ +#define IEEE80211_CCMP_HEADERLEN 8 +#define IEEE80211_CCMP_MICLEN 8 + #define IEEE80211_CRC_LEN 4 #define IEEE80211_8021Q_HEADER_LEN 4 diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index b753f7cd728b..8b59090c06fc 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -5046,6 +5046,10 @@ static int32_t wmi_unified_send_peer_assoc(tp_wma_handle wma, cmd->peer_vht_caps = params->vht_caps; #endif + + if (params->rmfEnabled) + cmd->peer_flags |= WMI_PEER_PMF; + rx_stbc = (params->ht_caps & IEEE80211_HTCAP_C_RXSTBC) >> IEEE80211_HTCAP_C_RXSTBC_S; if (rx_stbc) { @@ -6293,6 +6297,8 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) } adf_os_mem_copy(iface->addBssStaContext, &add_bss->staContext, sizeof(tAddStaParams)); + // Save parameters later needed by WDA_ADD_STA_REQ + iface->rmfEnabled = add_bss->rmfEnabled; iface->beaconInterval = add_bss->beaconInterval; iface->dtimPeriod = add_bss->dtimPeriod; iface->llbCoexist = add_bss->llbCoexist; @@ -7015,7 +7021,9 @@ static wmi_buf_t wma_setup_install_key_cmd(tp_wma_handle wma_handle, wmi_buf_t buf; u_int8_t *buf_ptr; u_int8_t *key_data; - +#ifdef WLAN_FEATURE_11W + struct wma_txrx_node *iface = NULL; +#endif /* WLAN_FEATURE_11W */ if ((key_params->key_type == eSIR_ED_NONE && key_params->key_len) || (key_params->key_type != eSIR_ED_NONE && !key_params->key_len)) { @@ -7085,6 +7093,11 @@ static wmi_buf_t wma_setup_install_key_cmd(tp_wma_handle wma_handle, case eSIR_ED_CCMP: cmd->key_cipher = WMI_CIPHER_AES_CCM; break; +#ifdef WLAN_FEATURE_11W + case eSIR_ED_AES_128_CMAC: + cmd->key_cipher = WMI_CIPHER_AES_CMAC; + break; +#endif /* WLAN_FEATURE_11W */ default: /* TODO: MFP ? */ WMA_LOGE("%s:Invalid encryption type:%d", __func__, key_params->key_type); @@ -7124,6 +7137,19 @@ static wmi_buf_t wma_setup_install_key_cmd(tp_wma_handle wma_handle, #endif cmd->key_len = key_params->key_len; +#ifdef WLAN_FEATURE_11W + if (key_params->key_type == eSIR_ED_AES_128_CMAC) + { + iface = &wma_handle->interfaces[key_params->vdev_id]; + if (iface) { + iface->key.key_length = key_params->key_len; + vos_mem_copy (iface->key.key, + (const void *) key_params->key_data, + iface->key.key_length); + } + } +#endif /* WLAN_FEATURE_11W */ + WMA_LOGD("Key setup : vdev_id %d key_idx %d key_type %d key_len %d" " unicast %d peer_mac %pM def_key_idx %d", key_params->vdev_id, key_params->key_idx, key_params->key_type, key_params->key_len, @@ -14007,6 +14033,14 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen, tpSirMacFrameCtl pFc = (tpSirMacFrameCtl)(adf_nbuf_data(tx_frame)); u_int8_t use_6mbps = 0; u_int8_t downld_comp_required = 0; +#ifdef WLAN_FEATURE_11W + tANI_U8 *pFrame = NULL; + void *pPacket = NULL; + u_int16_t newFrmLen = 0; + struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id]; + tpAniSirGlobal pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE, + wma_handle->vos_context); +#endif /* WLAN_FEATURE_11W */ /* Get the vdev handle from vdev id */ txrx_vdev = wma_handle->interfaces[vdev_id].handle; @@ -14021,6 +14055,12 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen, return VOS_STATUS_E_FAILURE; } +#ifdef WLAN_FEATURE_11W + if(!pMac) { + WMA_LOGE("pMac Handle is NULL"); + return VOS_STATUS_E_FAILURE; + } +#endif /* WLAN_FEATURE_11W */ /* * Currently only support to * send 80211 Mgmt and 80211 Data are added. @@ -14030,6 +14070,43 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen, WMA_LOGE("No Support to send other frames except 802.11 Mgmt/Data"); return VOS_STATUS_E_FAILURE; } +#ifdef WLAN_FEATURE_11W + if ((iface && iface->rmfEnabled && pFc->wep) && + (frmType == HAL_TXRX_FRM_802_11_MGMT) && + (pFc->subType == SIR_MAC_MGMT_DISASSOC || + pFc->subType == SIR_MAC_MGMT_DEAUTH || + pFc->subType == SIR_MAC_MGMT_ACTION)) { + struct ieee80211_frame *wh = + (struct ieee80211_frame *)adf_nbuf_data(tx_frame); + /* Allocate extra bytes for privacy header and trailer */ + newFrmLen = frmLen + IEEE80211_CCMP_HEADERLEN + IEEE80211_CCMP_MICLEN; + vos_status = palPktAlloc( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, + ( tANI_U16 )newFrmLen, ( void** ) &pFrame, + ( void** ) &pPacket ); + + if (!VOS_IS_STATUS_SUCCESS(vos_status)) { + WMA_LOGP("Failed to allocate %d bytes for RMF" + " status code (%x)", newFrmLen, vos_status); + /* Free the original packet memory */ + palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, + ( void* ) pData, ( void* ) tx_frame ); + goto error; + } + + /* Initialize the frame with 0's and only fill + MAC header and data, Keep the CCMP header and + trailer as 0's, firmware shall fill this */ + vos_mem_set( pFrame, newFrmLen , 0 ); + vos_mem_copy( pFrame, wh, sizeof(*wh)); + vos_mem_copy( pFrame + sizeof(*wh) + IEEE80211_CCMP_HEADERLEN, + pData + sizeof(*wh), frmLen - sizeof(*wh)); + + palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, + ( void* ) pData, ( void* ) tx_frame ); + tx_frame = pPacket; + frmLen = newFrmLen; + } +#endif /* WLAN_FEATURE_11W */ if ((frmType == HAL_TXRX_FRM_802_11_MGMT) && (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)) { diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index 9379ccc2e0ec..f5beb7c21e82 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -354,7 +354,14 @@ struct wma_wow { v_BOOL_t bmiss_enable; v_BOOL_t gtk_err_enable; }; - +#ifdef WLAN_FEATURE_11W +#define CMAC_IPN_LEN 6 +typedef struct { + u_int16_t key_length; + u_int8_t key[CSR_AES_KEY_LEN]; + u_int8_t ipn[CMAC_IPN_LEN]; +} wma_igtk_key_t; +#endif struct wma_txrx_node { u_int8_t addr[ETH_ALEN]; u_int8_t bssid[ETH_ALEN]; @@ -384,6 +391,11 @@ struct wma_txrx_node { u_int64_t tsfadjust; void *addBssStaContext; tANI_U8 aid; + /* Robust Management Frame (RMF) enabled/disabled */ + tANI_U8 rmfEnabled; +#ifdef WLAN_FEATURE_11W + wma_igtk_key_t key; +#endif /* WLAN_FEATURE_11W */ u_int32_t uapsd_cached_val; }; diff --git a/CORE/VOSS/inc/i_vos_packet.h b/CORE/VOSS/inc/i_vos_packet.h index 9e390736c0c8..0bdb3d572de9 100644 --- a/CORE/VOSS/inc/i_vos_packet.h +++ b/CORE/VOSS/inc/i_vos_packet.h @@ -62,6 +62,7 @@ typedef struct u_int8_t offloadScanLearn:1; u_int8_t roamCandidateInd:1; u_int8_t scan:1; + u_int8_t dpuFeedback; }t_packetmeta, *tp_packetmeta; /* implementation specific vos packet type */ diff --git a/CORE/VOSS/inc/vos_utils.h b/CORE/VOSS/inc/vos_utils.h index c3f0aba1cc33..1ddf2dcb8000 100644 --- a/CORE/VOSS/inc/vos_utils.h +++ b/CORE/VOSS/inc/vos_utils.h @@ -168,4 +168,9 @@ VOS_STATUS vos_decrypt_AES(v_U32_t cryptHandle, /* Handle */ v_U32_t vos_chan_to_freq(v_U8_t chan); v_U8_t vos_freq_to_chan(v_U32_t freq); +#ifdef WLAN_FEATURE_11W +v_BOOL_t vos_is_mmie_valid(v_U8_t *key, v_U8_t *ipn, + v_U8_t* frm, v_U8_t* efrm); +v_U8_t vos_get_mmie_size(void); +#endif /* WLAN_FEATURE_11W */ #endif // #if !defined __VOSS_UTILS_H diff --git a/CORE/VOSS/inc/wcnss_api.h b/CORE/VOSS/inc/wcnss_api.h index b5bc45e02506..197841ea2f5b 100644 --- a/CORE/VOSS/inc/wcnss_api.h +++ b/CORE/VOSS/inc/wcnss_api.h @@ -86,44 +86,6 @@ static inline unsigned int wcnss_get_serial_number(void) { return 0; } - -static inline void *wcnss_wlan_crypto_alloc_ahash(const char *alg_name, - unsigned int type, - unsigned int mask) -{ - return NULL; -} - -static inline int wcnss_wlan_crypto_ahash_digest(void *req) -{ - return 0; -} - -static inline void wcnss_wlan_crypto_free_ahash(void *tfm) -{ -} - -static inline int wcnss_wlan_crypto_ahash_setkey(void *tfm, - const u8 *key, - unsigned int keylen) -{ - return 0; -} - -static inline void *wcnss_wlan_crypto_alloc_ablkcipher(const char *alg_name, - u32 type, u32 mask) -{ - return NULL; -} - -static inline void wcnss_wlan_ablkcipher_request_free(void *req) -{ -} - -static inline void wcnss_wlan_crypto_free_ablkcipher(void *tfm) -{ -} - static inline int req_riva_power_on_lock(char *driver_name) { return 0; diff --git a/CORE/VOSS/src/vos_utils.c b/CORE/VOSS/src/vos_utils.c index 20b04d26cda0..4764d2693cfb 100644 --- a/CORE/VOSS/src/vos_utils.c +++ b/CORE/VOSS/src/vos_utils.c @@ -66,12 +66,20 @@ #include <linux/crypto.h> #include <linux/scatterlist.h> #include <linux/completion.h> +#include <linux/ieee80211.h> #include <crypto/hash.h> +#include <crypto/aes.h> #include <wcnss_api.h> +#include <linux/qcomwlan_secif.h> +#include "ieee80211_common.h" /*---------------------------------------------------------------------------- * Preprocessor Definitions and Constants * -------------------------------------------------------------------------*/ +#define AAD_LEN 20 +#define IV_SIZE_AES_128 16 +#define CMAC_IPN_LEN 6 + /*---------------------------------------------------------------------------- * Type Declarations @@ -178,6 +186,129 @@ VOS_STATUS vos_rand_get_bytes( v_U32_t cryptHandle, v_U8_t *pbBuf, v_U32_t numBy } +#ifdef WLAN_FEATURE_11W +v_U8_t vos_get_mmie_size() +{ + return sizeof(struct ieee80211_mmie); +} + +v_BOOL_t vos_is_mmie_valid(v_U8_t *igtk, v_U8_t *ipn, + v_U8_t* frm, v_U8_t* efrm) +{ + struct ieee80211_mmie *mmie; + struct ieee80211_frame *wh; + v_U8_t *rx_ipn, aad[AAD_LEN], mic[CMAC_TLEN], *input; + v_U16_t nBytes = 0; + int ret = 0; + struct crypto_cipher *tfm; + + /* Check if frame is invalid length */ + if ((efrm < frm) || ((efrm - frm) < sizeof(*wh))) { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "Invalid frame length"); + return VOS_FALSE; + } + + mmie = (struct ieee80211_mmie *)(efrm - sizeof(*mmie)); + + /* Check Element ID */ + if ((mmie->element_id != IEEE80211_ELEMID_MMIE) || + (mmie->length != (sizeof(*mmie)-2))) { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "IE is not Mgmt MIC IE or Invalid length"); + /* IE is not Mgmt MIC IE or invalid length */ + return VOS_FALSE; + } + + /* Validate IPN */ + rx_ipn = mmie->sequence_number; + if (OS_MEMCMP(rx_ipn, ipn, CMAC_IPN_LEN) <= 0) + { + /* Replay error */ + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + " mmie ipn %02X %02X %02X %02X %02X %02X" + " drvr ipn %02X %02X %02X %02X %02X %02X", + rx_ipn[0], rx_ipn[1], rx_ipn[2], rx_ipn[3], rx_ipn[4], rx_ipn[5], + ipn[0], ipn[1], ipn[2], ipn[3], ipn[4], ipn[5]); + return VOS_FALSE; + } + + tfm = wcnss_wlan_crypto_alloc_cipher( "aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(tfm)) { + ret = PTR_ERR(tfm); + VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, + "crypto_alloc_cipher failed (%d)", ret); + goto err_tfm; + } + + ret = crypto_cipher_setkey(tfm, igtk, AES_KEYSIZE_128); + if (ret) { + VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, + "crypto_cipher_setkey failed (%d)", ret); + goto err_tfm; + } + + /* Construct AAD */ + wh = (struct ieee80211_frame *)frm; + + /* Generate BIP AAD: FC(masked) || A1 || A2 || A3 */ + + /* FC type/subtype */ + aad[0] = wh->i_fc[0]; + /* Mask FC Retry, PwrMgt, MoreData flags to zero */ + aad[1] = wh->i_fc[1] & ~(IEEE80211_FC1_RETRY | IEEE80211_FC1_PWR_MGT | + IEEE80211_FC1_MORE_DATA); + /* A1 || A2 || A3 */ + vos_mem_copy(aad + 2, wh->i_addr_all, 3 * IEEE80211_ADDR_LEN); + + /* MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64) */ + nBytes = AAD_LEN + (efrm - (v_U8_t*)(wh+1)); + input = (v_U8_t *)vos_mem_malloc(nBytes); + if (NULL == input) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "Memory allocation failed"); + ret = VOS_STATUS_E_NOMEM; + goto err_tfm; + } + + /* Copy the AAD, MMIE with 8 bit MIC zeroed out */ + vos_mem_zero(input, nBytes); + vos_mem_copy(input, aad, AAD_LEN); + vos_mem_copy(input+AAD_LEN, (v_U8_t*)(wh+1), nBytes - AAD_LEN - CMAC_TLEN); + + wcnss_wlan_cmac_calc_mic(tfm, input, nBytes, mic); + vos_mem_free(input); + + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "CMAC(T)= %02X %02X %02X %02X %02X %02X %02X %02X", + mic[0], mic[1], mic[2], mic[3], + mic[4], mic[5], mic[6], mic[7]); + + if (OS_MEMCMP(mic, mmie->mic, CMAC_TLEN) != 0) { + /* MMIE MIC mismatch */ + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "BC/MC MGMT frame MMIE MIC check Failed" + " rmic %02X %02X %02X %02X %02X %02X %02X %02X" + " cmic %02X %02X %02X %02X %02X %02X %02X %02X", + mmie->mic[0], mmie->mic[1], mmie->mic[2], mmie->mic[3], + mmie->mic[4], mmie->mic[5], mmie->mic[6], mmie->mic[7], + mic[0], mic[1], mic[2], mic[3], + mic[4], mic[5], mic[6], mic[7]); + return VOS_FALSE; + } + + /* Update IPN */ + vos_mem_copy(ipn, rx_ipn, CMAC_IPN_LEN); + +err_tfm: + if (tfm) + wcnss_wlan_crypto_free_cipher(tfm); + + return !ret?VOS_TRUE:VOS_FALSE; +} + +#endif /* WLAN_FEATURE_11W */ /** * vos_sha1_hmac_str * @@ -532,16 +663,11 @@ static void ecb_aes_complete(struct crypto_async_request *req, int err) ( *** return value not considered yet ) --------------------------------------------------------------------------*/ -#define IV_SIZE_AES_128 16 -#define KEY_SIZE_AES_128 16 -#define AES_BLOCK_SIZE 16 - VOS_STATUS vos_encrypt_AES(v_U32_t cryptHandle, /* Handle */ v_U8_t *pPlainText, /* pointer to data stream */ v_U8_t *pCiphertext, v_U8_t *pKey) /* pointer to authentication key */ { -// VOS_STATUS uResult = VOS_STATUS_E_FAILURE; struct ecb_aes_result result; struct ablkcipher_request *req; struct crypto_ablkcipher *tfm; @@ -572,7 +698,7 @@ VOS_STATUS vos_encrypt_AES(v_U32_t cryptHandle, /* Handle */ crypto_ablkcipher_clear_flags(tfm, ~0); - ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128); + ret = crypto_ablkcipher_setkey(tfm, pKey, AES_KEYSIZE_128); if (ret) { VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed"); goto err_setkey; @@ -668,7 +794,7 @@ VOS_STATUS vos_decrypt_AES(v_U32_t cryptHandle, /* Handle */ crypto_ablkcipher_clear_flags(tfm, ~0); - ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128); + ret = crypto_ablkcipher_setkey(tfm, pKey, AES_KEYSIZE_128); if (ret) { VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed"); goto err_setkey; |
