164064216a8433360745f69edddce19a606659163The Android Open Source Project/** \file wepBroadcastKeyDerivation.c
264064216a8433360745f69edddce19a606659163The Android Open Source Project * \brief WEP broadcast key derivation implementation.
364064216a8433360745f69edddce19a606659163The Android Open Source Project *
464064216a8433360745f69edddce19a606659163The Android Open Source Project * \see wepBroadcastKeyDerivation.h
564064216a8433360745f69edddce19a606659163The Android Open Source Project*/
664064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
764064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
864064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
964064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
1064064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved.                                                  |**
1164064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1264064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without    |**
1364064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions    |**
1464064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met:                                                              |**
1564064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1664064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions of source code must retain the above copyright     |**
1764064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer.      |**
1864064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions in binary form must reproduce the above copyright  |**
1964064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer in    |**
2064064216a8433360745f69edddce19a606659163The Android Open Source Project**|    the documentation and/or other materials provided with the         |**
2164064216a8433360745f69edddce19a606659163The Android Open Source Project**|    distribution.                                                      |**
2264064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Neither the name Texas Instruments nor the names of its            |**
2364064216a8433360745f69edddce19a606659163The Android Open Source Project**|    contributors may be used to endorse or promote products derived    |**
2464064216a8433360745f69edddce19a606659163The Android Open Source Project**|    from this software without specific prior written permission.      |**
2564064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
2664064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
3264064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
3364064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
3464064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
3564064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
3664064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
3764064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
3864064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
3964064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/
4064064216a8433360745f69edddce19a606659163The Android Open Source Project
4164064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
4264064216a8433360745f69edddce19a606659163The Android Open Source Project *                                                                          *
4364064216a8433360745f69edddce19a606659163The Android Open Source Project *   MODULE:	WEP broadcast key derivation                                *
4464064216a8433360745f69edddce19a606659163The Android Open Source Project *   PURPOSE:   WEP broadcast key derivation                                *
4564064216a8433360745f69edddce19a606659163The Android Open Source Project *                                                                          *
4664064216a8433360745f69edddce19a606659163The Android Open Source Project ****************************************************************************/
4764064216a8433360745f69edddce19a606659163The Android Open Source Project
4864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osApi.h"
4964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "utils.h"
5064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "report.h"
5164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "rsnApi.h"
5264064216a8433360745f69edddce19a606659163The Android Open Source Project
5364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "keyDerive.h"
5464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "keyDeriveWep.h"
5564064216a8433360745f69edddce19a606659163The Android Open Source Project
5664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "mainKeysSm.h"
5764064216a8433360745f69edddce19a606659163The Android Open Source Project
5864064216a8433360745f69edddce19a606659163The Android Open Source Project/**
5964064216a8433360745f69edddce19a606659163The Android Open Source Project*
6064064216a8433360745f69edddce19a606659163The Android Open Source Project* rsn_wepBroadcastKeyDerivationInit
6164064216a8433360745f69edddce19a606659163The Android Open Source Project*
6264064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
6364064216a8433360745f69edddce19a606659163The Android Open Source Project*
6464064216a8433360745f69edddce19a606659163The Android Open Source Project* WEP broadcast key derivation init function:
6564064216a8433360745f69edddce19a606659163The Android Open Source Project*							- Initializes the derive & remove callback functions
6664064216a8433360745f69edddce19a606659163The Android Open Source Project*							- Resets the key material in the system control block
6764064216a8433360745f69edddce19a606659163The Android Open Source Project*
6864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
6964064216a8433360745f69edddce19a606659163The Android Open Source Project*
7064064216a8433360745f69edddce19a606659163The Android Open Source Project*  None
7164064216a8433360745f69edddce19a606659163The Android Open Source Project*
7264064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
7364064216a8433360745f69edddce19a606659163The Android Open Source Project*
7464064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK otherwise.
7564064216a8433360745f69edddce19a606659163The Android Open Source Project*/
7664064216a8433360745f69edddce19a606659163The Android Open Source Project
7764064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS keyDeriveWep_config(struct _keyDerive_t *pKeyDerive)
7864064216a8433360745f69edddce19a606659163The Android Open Source Project{
7964064216a8433360745f69edddce19a606659163The Android Open Source Project	pKeyDerive->derive = keyDeriveWep_derive;
8064064216a8433360745f69edddce19a606659163The Android Open Source Project	pKeyDerive->remove = keyDeriveWep_remove;
8164064216a8433360745f69edddce19a606659163The Android Open Source Project
8264064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
8364064216a8433360745f69edddce19a606659163The Android Open Source Project}
8464064216a8433360745f69edddce19a606659163The Android Open Source Project
8564064216a8433360745f69edddce19a606659163The Android Open Source Project
8664064216a8433360745f69edddce19a606659163The Android Open Source Project/**
8764064216a8433360745f69edddce19a606659163The Android Open Source Project*
8864064216a8433360745f69edddce19a606659163The Android Open Source Project* wepBroadcastKeyDerivationDerive
8964064216a8433360745f69edddce19a606659163The Android Open Source Project*
9064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
9164064216a8433360745f69edddce19a606659163The Android Open Source Project*
9264064216a8433360745f69edddce19a606659163The Android Open Source Project* WEP broadcast key derivation function:
9364064216a8433360745f69edddce19a606659163The Android Open Source Project*							- Decodes the key material.
9464064216a8433360745f69edddce19a606659163The Android Open Source Project*							- Distribute the decoded key material to the driver.
9564064216a8433360745f69edddce19a606659163The Android Open Source Project*
9664064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
9764064216a8433360745f69edddce19a606659163The Android Open Source Project*
9864064216a8433360745f69edddce19a606659163The Android Open Source Project*  I - p - Pointer to the encoded key material.
9964064216a8433360745f69edddce19a606659163The Android Open Source Project*
10064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
10164064216a8433360745f69edddce19a606659163The Android Open Source Project*
10264064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK otherwise.
10364064216a8433360745f69edddce19a606659163The Android Open Source Project*/
10464064216a8433360745f69edddce19a606659163The Android Open Source Project
10564064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS keyDeriveWep_derive(struct _keyDerive_t *pKeyDerive, encodedKeyMaterial_t *pEncodedKey)
10664064216a8433360745f69edddce19a606659163The Android Open Source Project{
10764064216a8433360745f69edddce19a606659163The Android Open Source Project	TI_STATUS status;
10864064216a8433360745f69edddce19a606659163The Android Open Source Project	securityKeys_t	key;
10964064216a8433360745f69edddce19a606659163The Android Open Source Project
11064064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pEncodedKey==NULL)
11164064216a8433360745f69edddce19a606659163The Android Open Source Project    {
11264064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
11364064216a8433360745f69edddce19a606659163The Android Open Source Project    }
11464064216a8433360745f69edddce19a606659163The Android Open Source Project
11564064216a8433360745f69edddce19a606659163The Android Open Source Project	if ((pEncodedKey->keyLen != DERIVE_WEP_KEY_LEN_40) &&
11664064216a8433360745f69edddce19a606659163The Android Open Source Project		(pEncodedKey->keyLen != DERIVE_WEP_KEY_LEN_104) &&
11764064216a8433360745f69edddce19a606659163The Android Open Source Project		(pEncodedKey->keyLen != DERIVE_WEP_KEY_LEN_232))
11864064216a8433360745f69edddce19a606659163The Android Open Source Project	{
11964064216a8433360745f69edddce19a606659163The Android Open Source Project        WLAN_REPORT_ERROR(pKeyDerive->hReport, RSN_MODULE_LOG,
12064064216a8433360745f69edddce19a606659163The Android Open Source Project                          ("DeriveWep_derive: ERROR: it is not WEP key lenghth (len=%d) !!!\n", pEncodedKey->keyLen));
12164064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
12264064216a8433360745f69edddce19a606659163The Android Open Source Project   	}
12364064216a8433360745f69edddce19a606659163The Android Open Source Project
12464064216a8433360745f69edddce19a606659163The Android Open Source Project	key.keyType = WEP_KEY;
12564064216a8433360745f69edddce19a606659163The Android Open Source Project	key.keyIndex = (UINT8)pEncodedKey->keyId;
12664064216a8433360745f69edddce19a606659163The Android Open Source Project	key.encLen = (UINT16)pEncodedKey->keyLen;
12764064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pKeyDerive->hOs, (void *)key.encKey, pEncodedKey->pData, pEncodedKey->keyLen);
12864064216a8433360745f69edddce19a606659163The Android Open Source Project
12964064216a8433360745f69edddce19a606659163The Android Open Source Project	status = pKeyDerive->pMainKeys->setKey(pKeyDerive->pMainKeys, &key);
13064064216a8433360745f69edddce19a606659163The Android Open Source Project	if (status == OK)
13164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
13264064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pKeyDerive->hOs, &pKeyDerive->key, pEncodedKey, sizeof(encodedKeyMaterial_t));
13364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
13464064216a8433360745f69edddce19a606659163The Android Open Source Project
13564064216a8433360745f69edddce19a606659163The Android Open Source Project	return status;
13664064216a8433360745f69edddce19a606659163The Android Open Source Project}
13764064216a8433360745f69edddce19a606659163The Android Open Source Project
13864064216a8433360745f69edddce19a606659163The Android Open Source Project/**
13964064216a8433360745f69edddce19a606659163The Android Open Source Project*
14064064216a8433360745f69edddce19a606659163The Android Open Source Project* wepBroadcastKeyDerivationRemove
14164064216a8433360745f69edddce19a606659163The Android Open Source Project*
14264064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
14364064216a8433360745f69edddce19a606659163The Android Open Source Project*
14464064216a8433360745f69edddce19a606659163The Android Open Source Project* WEP broadcast key removal function:
14564064216a8433360745f69edddce19a606659163The Android Open Source Project*							- Remove the key material from the driver.
14664064216a8433360745f69edddce19a606659163The Android Open Source Project*
14764064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
14864064216a8433360745f69edddce19a606659163The Android Open Source Project*
14964064216a8433360745f69edddce19a606659163The Android Open Source Project*  None.
15064064216a8433360745f69edddce19a606659163The Android Open Source Project*
15164064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
15264064216a8433360745f69edddce19a606659163The Android Open Source Project*
15364064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK otherwise.
15464064216a8433360745f69edddce19a606659163The Android Open Source Project*/
15564064216a8433360745f69edddce19a606659163The Android Open Source Project
15664064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS keyDeriveWep_remove(struct _keyDerive_t *pKeyDerive, encodedKeyMaterial_t *pEncodedKey)
15764064216a8433360745f69edddce19a606659163The Android Open Source Project{
15864064216a8433360745f69edddce19a606659163The Android Open Source Project	TI_STATUS status;
15964064216a8433360745f69edddce19a606659163The Android Open Source Project	securityKeys_t	key;
16064064216a8433360745f69edddce19a606659163The Android Open Source Project
16164064216a8433360745f69edddce19a606659163The Android Open Source Project    os_memoryZero(pKeyDerive->hOs, &key, sizeof(securityKeys_t));
16264064216a8433360745f69edddce19a606659163The Android Open Source Project	key.keyType = WEP_KEY;
16364064216a8433360745f69edddce19a606659163The Android Open Source Project	key.keyIndex = (UINT8)pEncodedKey->keyId;
16464064216a8433360745f69edddce19a606659163The Android Open Source Project	key.encLen = (UINT16)pKeyDerive->key.keyLen;
16564064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pKeyDerive->hOs, (void *)key.macAddress.addr, pEncodedKey->pData, MAC_ADDR_LEN);
16664064216a8433360745f69edddce19a606659163The Android Open Source Project
16764064216a8433360745f69edddce19a606659163The Android Open Source Project	status = pKeyDerive->pMainKeys->removeKey(pKeyDerive->pMainKeys, &key);
16864064216a8433360745f69edddce19a606659163The Android Open Source Project	if (status == OK)
16964064216a8433360745f69edddce19a606659163The Android Open Source Project	{
17064064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryZero(pKeyDerive->hOs, &pKeyDerive->key, sizeof(encodedKeyMaterial_t));
17164064216a8433360745f69edddce19a606659163The Android Open Source Project	}
17264064216a8433360745f69edddce19a606659163The Android Open Source Project
17364064216a8433360745f69edddce19a606659163The Android Open Source Project	return status;
17464064216a8433360745f69edddce19a606659163The Android Open Source Project}
17564064216a8433360745f69edddce19a606659163The Android Open Source Project
17664064216a8433360745f69edddce19a606659163The Android Open Source Project
17764064216a8433360745f69edddce19a606659163The Android Open Source Project
17864064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS keyDeriveNone_config(struct _keyDerive_t *pKeyDerive)
17964064216a8433360745f69edddce19a606659163The Android Open Source Project{
18064064216a8433360745f69edddce19a606659163The Android Open Source Project	pKeyDerive->derive = keyDeriveNone_derive;
18164064216a8433360745f69edddce19a606659163The Android Open Source Project	pKeyDerive->remove = keyDeriveNone_remove;
18264064216a8433360745f69edddce19a606659163The Android Open Source Project
18364064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
18464064216a8433360745f69edddce19a606659163The Android Open Source Project}
18564064216a8433360745f69edddce19a606659163The Android Open Source Project
18664064216a8433360745f69edddce19a606659163The Android Open Source Project
18764064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS keyDeriveNone_derive(struct _keyDerive_t *pKeyDerive, encodedKeyMaterial_t *pEncodedKey)
18864064216a8433360745f69edddce19a606659163The Android Open Source Project{
18964064216a8433360745f69edddce19a606659163The Android Open Source Project	securityKeys_t	key;
19064064216a8433360745f69edddce19a606659163The Android Open Source Project
19164064216a8433360745f69edddce19a606659163The Android Open Source Project    if (pEncodedKey==NULL)
19264064216a8433360745f69edddce19a606659163The Android Open Source Project    {
19364064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
19464064216a8433360745f69edddce19a606659163The Android Open Source Project    }
19564064216a8433360745f69edddce19a606659163The Android Open Source Project
19664064216a8433360745f69edddce19a606659163The Android Open Source Project	if ((pEncodedKey->keyLen != DERIVE_WEP_KEY_LEN_40) &&
19764064216a8433360745f69edddce19a606659163The Android Open Source Project		(pEncodedKey->keyLen != DERIVE_WEP_KEY_LEN_104) &&
19864064216a8433360745f69edddce19a606659163The Android Open Source Project		(pEncodedKey->keyLen != DERIVE_WEP_KEY_LEN_232))
19964064216a8433360745f69edddce19a606659163The Android Open Source Project	{
20064064216a8433360745f69edddce19a606659163The Android Open Source Project        return NOK;
20164064216a8433360745f69edddce19a606659163The Android Open Source Project   	}
20264064216a8433360745f69edddce19a606659163The Android Open Source Project
20364064216a8433360745f69edddce19a606659163The Android Open Source Project	key.keyType = WEP_KEY;
20464064216a8433360745f69edddce19a606659163The Android Open Source Project	key.keyIndex = (UINT8)pEncodedKey->keyId;
20564064216a8433360745f69edddce19a606659163The Android Open Source Project	key.encLen = (UINT16)pEncodedKey->keyLen;
20664064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(pKeyDerive->hOs, (void *)key.encKey, pEncodedKey->pData, pEncodedKey->keyLen);
20764064216a8433360745f69edddce19a606659163The Android Open Source Project
20864064216a8433360745f69edddce19a606659163The Android Open Source Project	pKeyDerive->pMainKeys->setKey(pKeyDerive->pMainKeys, &key);
20964064216a8433360745f69edddce19a606659163The Android Open Source Project
21064064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
21164064216a8433360745f69edddce19a606659163The Android Open Source Project}
21264064216a8433360745f69edddce19a606659163The Android Open Source Project
21364064216a8433360745f69edddce19a606659163The Android Open Source Project
21464064216a8433360745f69edddce19a606659163The Android Open Source Project/**
21564064216a8433360745f69edddce19a606659163The Android Open Source Project*
21664064216a8433360745f69edddce19a606659163The Android Open Source Project* keyDeriveNone_remove
21764064216a8433360745f69edddce19a606659163The Android Open Source Project*
21864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
21964064216a8433360745f69edddce19a606659163The Android Open Source Project*
22064064216a8433360745f69edddce19a606659163The Android Open Source Project* WEP broadcast key removal function:
22164064216a8433360745f69edddce19a606659163The Android Open Source Project*							- Remove the key material from the driver.
22264064216a8433360745f69edddce19a606659163The Android Open Source Project*
22364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
22464064216a8433360745f69edddce19a606659163The Android Open Source Project*
22564064216a8433360745f69edddce19a606659163The Android Open Source Project*  None.
22664064216a8433360745f69edddce19a606659163The Android Open Source Project*
22764064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
22864064216a8433360745f69edddce19a606659163The Android Open Source Project*
22964064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK otherwise.
23064064216a8433360745f69edddce19a606659163The Android Open Source Project*/
23164064216a8433360745f69edddce19a606659163The Android Open Source Project
23264064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS keyDeriveNone_remove(struct _keyDerive_t *pKeyDerive, encodedKeyMaterial_t *pEncodedKey)
23364064216a8433360745f69edddce19a606659163The Android Open Source Project{
23464064216a8433360745f69edddce19a606659163The Android Open Source Project
23564064216a8433360745f69edddce19a606659163The Android Open Source Project    return OK;
23664064216a8433360745f69edddce19a606659163The Android Open Source Project}
23764064216a8433360745f69edddce19a606659163The Android Open Source Project
23864064216a8433360745f69edddce19a606659163The Android Open Source Project
23964064216a8433360745f69edddce19a606659163The Android Open Source Project
24064064216a8433360745f69edddce19a606659163The Android Open Source Project
241