summaryrefslogtreecommitdiff
path: root/wl1271/stad/src/Connection_Managment/keyParserExternal.c
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/stad/src/Connection_Managment/keyParserExternal.c')
-rw-r--r--wl1271/stad/src/Connection_Managment/keyParserExternal.c393
1 files changed, 0 insertions, 393 deletions
diff --git a/wl1271/stad/src/Connection_Managment/keyParserExternal.c b/wl1271/stad/src/Connection_Managment/keyParserExternal.c
deleted file mode 100644
index c56f505..0000000
--- a/wl1271/stad/src/Connection_Managment/keyParserExternal.c
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * keyParserExternal.c
- *
- * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name Texas Instruments nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** \file keyParserExternal.c
- * \brief External key parser implementation.
- *
- * \see keyParser.h
-*/
-
-/****************************************************************************
- * *
- * MODULE: External Key Parser *
- * PURPOSE: EAP parser implementation *
- * *
- ****************************************************************************/
-
-#define __FILE_ID__ FILE_ID_34
-#include "tidef.h"
-#include "osApi.h"
-#include "report.h"
-
-#include "keyTypes.h"
-
-#include "keyParser.h"
-#include "keyParserExternal.h"
-#include "mainKeysSm.h"
-#include "mainSecSm.h"
-#include "admCtrl.h"
-
-#include "unicastKeySM.h"
-#include "broadcastKeySM.h"
-#include "DataCtrl_Api.h"
-
-#define TKIP_KEY_LEN 32
-#define AES_KEY_LEN 16
-
-
-/**
-*
-* Function - Init KEY Parser module.
-*
-* \b Description:
-*
-* Called by RSN Manager.
-* Registers the function 'rsn_keyParserRecv()' at the distributor to receive KEY frames upon receiving a KEY_RECV event.
-*
-* \b ARGS:
-*
-*
-* \b RETURNS:
-*
-* TI_STATUS - 0 on success, any other value on failure.
-*
-*/
-
-TI_STATUS keyParserExternal_config(struct _keyParser_t *pKeyParser)
-{
- pKeyParser->recv = keyParserExternal_recv;
- pKeyParser->replayReset = keyParser_nop;
- pKeyParser->remove = keyParserExternal_remove;
- return TI_OK;
-}
-
-
-/**
-*
-* keyParserExternal_recv
-*
-* \b Description:
-*
-* External key Parser receive function:
-* - Called by NDIS (Windows) upon receiving an External Key.
-* - Filters the following keys:
-* - Keys with invalid key index
-* - Keys with invalid MAC address
-*
-* \b ARGS:
-*
-* I - pKeyParser - Pointer to the keyParser context \n
-* I - pKeyData - A pointer to the Key Data. \n
-* I - keyDataLen - The Key Data length. \n
-*
-* \b RETURNS:
-*
-* TI_OK on success, TI_NOK otherwise.
-*
-*/
-
-TI_STATUS keyParserExternal_recv(struct _keyParser_t *pKeyParser,
- TI_UINT8 *pKeyData, TI_UINT32 keyDataLen)
-{
- TI_STATUS status;
- OS_802_11_KEY *pKeyDesc;
- encodedKeyMaterial_t encodedKeyMaterial;
- paramInfo_t macParam;
- TI_BOOL macEqual2Associated=TI_FALSE;
- TI_BOOL macIsBroadcast=TI_FALSE;
- TI_BOOL wepKey = TI_FALSE;
- TI_UINT8 broadcastMacAddr[MAC_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
- TI_UINT8 nullMacAddr[MAC_ADDR_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
- TI_UINT8 keyBuffer[MAC_ADDR_LEN+KEY_RSC_LEN+MAX_EXT_KEY_DATA_LENGTH];
-
-
- if (pKeyData == NULL)
- {
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: NULL KEY Data\n");
- return TI_NOK;
- }
-
- pKeyDesc = (OS_802_11_KEY*)pKeyData;
-
- /* copy the key data, mac address and RSC */
- MAC_COPY (keyBuffer, pKeyDesc->BSSID);
- /* configure keyRSC value (if needed) */
- if (pKeyDesc->KeyIndex & EXT_KEY_RSC_KEY_MASK)
- { /* set key recieve sequence counter */
- os_memoryCopy(pKeyParser->hOs, &keyBuffer[MAC_ADDR_LEN], (TI_UINT8*)&(pKeyDesc->KeyRSC), KEY_RSC_LEN);
- }
- else
- {
- os_memoryZero(pKeyParser->hOs, &keyBuffer[MAC_ADDR_LEN], KEY_RSC_LEN);
- }
-
- /* check type and validity of keys */
- /* check MAC Address validity */
- macParam.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
- status = ctrlData_getParam(pKeyParser->hCtrlData, &macParam);
-
- if (status != TI_OK)
- {
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Cannot get MAC address !!!\n");
- return TI_NOK;
- }
-
- /* check key length */
- if((pKeyDesc->KeyLength != WEP_KEY_LEN_40) &&
- (pKeyDesc->KeyLength != WEP_KEY_LEN_104) &&
- (pKeyDesc->KeyLength != WEP_KEY_LEN_232) &&
- (pKeyDesc->KeyLength != TKIP_KEY_LEN) &&
- (pKeyDesc->KeyLength != AES_KEY_LEN) )
-
- {
-TRACE1(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Incorrect key length - %d \n", pKeyDesc->KeyLength);
- return TI_NOK;
- }
- if (MAC_EQUAL(macParam.content.ctrlDataCurrentBSSID, pKeyDesc->BSSID))
- {
- macEqual2Associated = TI_TRUE;
- }
- if (MAC_EQUAL (pKeyDesc->BSSID, broadcastMacAddr))
- {
- macIsBroadcast = TI_TRUE;
- }
- if ((pKeyDesc->KeyLength == WEP_KEY_LEN_40) ||
- (pKeyDesc->KeyLength == WEP_KEY_LEN_104) ||
- (pKeyDesc->KeyLength == WEP_KEY_LEN_232))
- { /* In Add WEP the MAC address is nulled, since it's irrelevant */
- macEqual2Associated = TI_TRUE;
- wepKey = TI_TRUE;
- }
-
- if (pKeyDesc->KeyIndex & EXT_KEY_SUPP_AUTHENTICATOR_MASK)
- { /* The key is being set by an Authenticator - not allowed in IBSS mode */
- if (pKeyParser->pParent->pParent->pParent->pAdmCtrl->networkMode == RSN_IBSS)
- { /* in IBSS only Broadcast MAC is allowed */
- TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Authenticator set key in IBSS mode !!!\n");
- return TI_NOK;
- }
-
- }
-
- if (pKeyDesc->KeyIndex & EXT_KEY_REMAIN_BITS_MASK)
- { /* the reamining bits in the key index are not 0 (when they should be) */
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Key index bits 8-27 should be 0 !!!\n");
- return TI_NOK;
- }
-
- encodedKeyMaterial.pData = (char *) keyBuffer;
- /* Check key length according to the cipher suite - TKIP, etc...??? */
- if (wepKey)
- {
- if (!((pKeyDesc->KeyLength == WEP_KEY_LEN_40) || (pKeyDesc->KeyLength == WEP_KEY_LEN_104)
- || (pKeyDesc->KeyLength == WEP_KEY_LEN_232)))
- { /*Invalid key length*/
- TRACE1(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "WEP_KEY_PARSER: ERROR: Invalid Key length: %d !!!\n", pKeyDesc->KeyLength);
- return TI_NOK;
- }
-
- os_memoryCopy(pKeyParser->hOs, &keyBuffer[0], pKeyDesc->KeyMaterial, pKeyDesc->KeyLength);
- if (MAC_EQUAL (nullMacAddr, pKeyDesc->BSSID))
- {
- macIsBroadcast = TI_TRUE;
- }
-
- encodedKeyMaterial.keyLen = pKeyDesc->KeyLength;
- }
- else /* this is TKIP or CKIP */
- {
- if ((pKeyDesc->KeyLength == AES_KEY_LEN) && (pKeyParser->pPaeConfig->unicastSuite == TWD_CIPHER_CKIP))
- {
- os_memoryCopy(pKeyParser->hOs, &keyBuffer[0], pKeyDesc->KeyMaterial, pKeyDesc->KeyLength);
- encodedKeyMaterial.keyLen = pKeyDesc->KeyLength;
- }
- else
- {
- os_memoryCopy(pKeyParser->hOs,
- &keyBuffer[MAC_ADDR_LEN+KEY_RSC_LEN],
- pKeyDesc->KeyMaterial,
- pKeyDesc->KeyLength);
-
- encodedKeyMaterial.keyLen = MAC_ADDR_LEN+KEY_RSC_LEN+pKeyDesc->KeyLength;
- }
- }
-
- encodedKeyMaterial.keyId = pKeyDesc->KeyIndex;
-
-TRACE2(pKeyParser->hReport, REPORT_SEVERITY_INFORMATION, "EXT_KEY_PARSER: Key received keyId=%x, keyLen=%d \n", pKeyDesc->KeyIndex, pKeyDesc->KeyLength );
-
- if (pKeyDesc->KeyIndex & EXT_KEY_PAIRWISE_GROUP_MASK)
- { /* Pairwise key */
- /* check that the lower 8 bits of the key index are 0 */
- if (!wepKey && (pKeyDesc->KeyIndex & 0xff))
- {
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_WARNING, "EXT_KEY_PARSER: ERROR: Pairwise key must have index 0 !!!\n");
- return TI_NOK;
- }
-
- if (macIsBroadcast)
- {
- TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Broadcast MAC address for unicast !!!\n");
- return TI_NOK;
- }
- if (pKeyDesc->KeyIndex & EXT_KEY_TRANSMIT_MASK)
- { /* tx only pairwase key */
- /* set unicast keys */
- if (pKeyParser->pUcastKey->recvSuccess!=NULL)
- {
- status = pKeyParser->pUcastKey->recvSuccess(pKeyParser->pUcastKey, &encodedKeyMaterial);
- }
- } else {
- /* recieve only pairwase keys are not allowed */
- TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: recieve only pairwase keys are not allowed !!!\n");
- return TI_NOK;
- }
-
- }
- else
- { /* set broadcast keys */
- if (!macIsBroadcast)
- { /* not broadcast MAC */
- if (pKeyParser->pParent->pParent->pParent->pAdmCtrl->networkMode == RSN_IBSS)
- { /* in IBSS only Broadcast MAC is allowed */
- TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: not broadcast MAC in IBSS mode !!!\n");
- return TI_NOK;
- }
- else if (!macEqual2Associated)
- { /* ESS mode and MAC is different than the associated one */
- /* save the key for later */
- status = TI_OK; /* pKeyParser->pBcastKey->saveKey(pKeyParser->pBcastKey, &encodedKey);*/
- }
- else
- { /* MAC is equal to the associated one - configure immediately */
- if (!wepKey)
- {
- MAC_COPY (keyBuffer, broadcastMacAddr);
- }
- if (pKeyParser->pBcastKey->recvSuccess!=NULL)
- {
- status = pKeyParser->pBcastKey->recvSuccess(pKeyParser->pBcastKey, &encodedKeyMaterial);
- }
- }
- }
- else
- { /* MAC is broadcast - configure immediately */
- if (!wepKey)
- {
- MAC_COPY (keyBuffer, broadcastMacAddr);
- }
-
- /* set broadcast key */
- if (pKeyParser->pBcastKey->recvSuccess!=NULL)
- {
- status = pKeyParser->pBcastKey->recvSuccess(pKeyParser->pBcastKey, &encodedKeyMaterial);
- }
-
- if (pKeyDesc->KeyIndex & EXT_KEY_TRANSMIT_MASK)
- { /* Group key used to transmit */
- /* set as unicast key as well */
- if (pKeyParser->pUcastKey->recvSuccess!=NULL)
- {
- status = pKeyParser->pUcastKey->recvSuccess(pKeyParser->pUcastKey, &encodedKeyMaterial);
- }
- }
- }
- }
-
- return status;
-}
-
-
-
-
-TI_STATUS keyParserExternal_remove(struct _keyParser_t *pKeyParser, TI_UINT8 *pKeyData, TI_UINT32 keyDataLen)
-{
- TI_STATUS status;
- OS_802_11_KEY *pKeyDesc;
- paramInfo_t macParam;
- encodedKeyMaterial_t encodedKeyMaterial;
- TI_UINT8 broadcastMacAddr[MAC_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
- TI_UINT8 keyBuffer[MAC_ADDR_LEN+KEY_RSC_LEN+MAX_EXT_KEY_DATA_LENGTH];
-
- if (pKeyData == NULL)
- {
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: NULL KEY Data\n");
- return TI_NOK;
- }
-
- pKeyDesc = (OS_802_11_KEY*)pKeyData;
-
- if (pKeyDesc->KeyIndex & EXT_KEY_TRANSMIT_MASK)
- { /* Bit 31 should always be zero */
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Remove TX bit in key index can't be 1\n");
- return TI_NOK;
- }
- if (pKeyDesc->KeyIndex & EXT_KEY_REMAIN_BITS_MASK)
- { /* Bits 8-29 should always be zero */
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Remove none zero key index\n");
- return TI_NOK;
- }
-
- encodedKeyMaterial.keyId = pKeyDesc->KeyIndex;
- encodedKeyMaterial.keyLen = 0;
- encodedKeyMaterial.pData = (char *) keyBuffer;
-
- if (pKeyDesc->KeyIndex & EXT_KEY_PAIRWISE_GROUP_MASK)
- { /* delete all pairwise keys or for the current BSSID */
- if (!MAC_EQUAL(pKeyDesc->BSSID, broadcastMacAddr))
- {
- MAC_COPY (keyBuffer, pKeyDesc->BSSID);
- }
- else
- {
- macParam.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
- status = ctrlData_getParam(pKeyParser->hCtrlData, &macParam);
- if (status != TI_OK)
- {
-TRACE0(pKeyParser->hReport, REPORT_SEVERITY_ERROR, "EXT_KEY_PARSER: ERROR: Cannot get MAC address !!!\n");
- return TI_NOK;
- }
-
- MAC_COPY (keyBuffer, macParam.content.ctrlDataCurrentBSSID);
- }
-
- status = pKeyParser->pUcastKey->pKeyDerive->remove(pKeyParser->pUcastKey->pKeyDerive, &encodedKeyMaterial);
- }
- else
- { /* delete all group keys or for the current BSSID */
- MAC_COPY (keyBuffer, broadcastMacAddr);
- status = pKeyParser->pBcastKey->pKeyDerive->remove(pKeyParser->pUcastKey->pKeyDerive, &encodedKeyMaterial);
- }
-
- return status;
-}