Home | History | Annotate | Download | only in Connection_Managment
      1 /*
      2  * broadcastKeySM.c
      3  *
      4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 /** \file broadcastKeySM.c
     35  * \brief broadcast key SM implementation
     36  *
     37  * \see broadcastKeySM.h
     38 */
     39 
     40 /****************************************************************************
     41  *                                                                          *
     42  *   MODULE:	broadcast key SM                               *
     43  *   PURPOSE:   broadcast key SM implementation				*
     44  *                                                                          *
     45  ****************************************************************************/
     46 
     47 #define __FILE_ID__  FILE_ID_24
     48 #include "osApi.h"
     49 #include "report.h"
     50 #include "rsnApi.h"
     51 
     52 #include "keyDerive.h"
     53 
     54 #include "broadcastKeySM.h"
     55 #include "broadcastKey802_1x.h"
     56 #include "broadcastKeyNone.h"
     57 
     58 /** number of states in the state machine */
     59 #define	BCAST_KEY_MAX_NUM_STATES		3
     60 
     61 /** number of events in the state machine */
     62 #define	BCAST_KEY_MAX_NUM_EVENTS		4
     63 
     64 
     65 /**
     66 *
     67 * Function  - Init KEY Parser module.
     68 *
     69 * \b Description:
     70 *
     71 * Called by RSN Manager.
     72 * Registers the function 'rsn_BroadcastKeyRecv()' at the distributor to receive KEY frames upon receiving a KEY_RECV event.
     73 *
     74 * \b ARGS:
     75 *
     76 *
     77 * \b RETURNS:
     78 *
     79 *  TI_STATUS - 0 on success, any other value on failure.
     80 *
     81 */
     82 
     83 broadcastKey_t* broadcastKey_create(TI_HANDLE hOs)
     84 {
     85 	TI_STATUS				status;
     86 	broadcastKey_t 		*pBroadcastKey;
     87 
     88 	/* allocate key parser context memory */
     89 	pBroadcastKey = (broadcastKey_t*)os_memoryAlloc(hOs, sizeof(broadcastKey_t));
     90 	if (pBroadcastKey == NULL)
     91 	{
     92 		return NULL;
     93 	}
     94 
     95 	os_memoryZero(hOs, pBroadcastKey, sizeof(broadcastKey_t));
     96 
     97 	/* allocate memory for association state machine */
     98 	status = fsm_Create(hOs, &pBroadcastKey->pBcastKeySm, BCAST_KEY_MAX_NUM_STATES, BCAST_KEY_MAX_NUM_EVENTS);
     99 	if (status != TI_OK)
    100 	{
    101 		os_memoryFree(hOs, pBroadcastKey, sizeof(broadcastKey_t));
    102 		return NULL;
    103 	}
    104 
    105 	pBroadcastKey->pKeyDerive = keyDerive_create(hOs);
    106 	if (pBroadcastKey->pKeyDerive == NULL)
    107 	{
    108 		fsm_Unload(hOs, pBroadcastKey->pBcastKeySm);
    109 		os_memoryFree(hOs, pBroadcastKey, sizeof(broadcastKey_t));
    110 		return NULL;
    111 	}
    112 
    113 	pBroadcastKey->hOs = hOs;
    114 
    115 	return pBroadcastKey;
    116 }
    117 
    118 /**
    119 *
    120 * Function  - Init KEY Parser module.
    121 *
    122 * \b Description:
    123 *
    124 * Called by RSN Manager.
    125 * Registers the function 'rsn_BroadcastKeyRecv()' at the distributor to receive KEY frames upon receiving a KEY_RECV event.
    126 *
    127 * \b ARGS:
    128 *
    129 *
    130 * \b RETURNS:
    131 *
    132 *  TI_STATUS - 0 on success, any other value on failure.
    133 *
    134 */
    135 
    136 TI_STATUS broadcastKey_unload(struct _broadcastKey_t *pBroadcastKey)
    137 {
    138 	TI_STATUS		status;
    139 
    140 	status = keyDerive_unload(pBroadcastKey->pKeyDerive);
    141 
    142 	if (status != TI_OK)
    143 	{
    144         TRACE0(pBroadcastKey->hReport, REPORT_SEVERITY_CONSOLE, "BCAST_KEY_SM: Error in unloading key derivation module\n");
    145 		WLAN_OS_REPORT(("BCAST_KEY_SM: Error in unloading key derivation module\n"));
    146 	}
    147 
    148 	status = fsm_Unload(pBroadcastKey->hOs, pBroadcastKey->pBcastKeySm);
    149 	if (status != TI_OK)
    150 	{
    151         TRACE0(pBroadcastKey->hReport, REPORT_SEVERITY_CONSOLE, "BCAST_KEY_SM: Error in unloading state machine\n");
    152 		WLAN_OS_REPORT(("BCAST_KEY_SM: Error in unloading state machine\n"));
    153 	}
    154 
    155 	/* free key parser context memory */
    156 	os_memoryFree(pBroadcastKey->hOs, pBroadcastKey, sizeof(broadcastKey_t));
    157 
    158 	return TI_OK;
    159 }
    160 
    161 /**
    162 *
    163 * Function  - Init KEY Parser module.
    164 *
    165 * \b Description:
    166 *
    167 * Called by RSN Manager.
    168 * Registers the function 'rsn_BroadcastKeyRecv()' at the distributor to receive KEY frames upon receiving a KEY_RECV event.
    169 *
    170 * \b ARGS:
    171 *
    172 *
    173 * \b RETURNS:
    174 *
    175 *  TI_STATUS - 0 on success, any other value on failure.
    176 *
    177 */
    178 
    179 TI_STATUS broadcastKey_config(struct _broadcastKey_t *pBroadcastKey,
    180                               TRsnPaeConfig *pPaeConfig,
    181                               struct _mainKeys_t *pParent,
    182                               TI_HANDLE hReport,
    183                               TI_HANDLE hOs)
    184 {
    185 	TI_STATUS		status = TI_NOK;
    186 
    187 	pBroadcastKey->hReport = hReport;
    188 	pBroadcastKey->hOs = hOs;
    189 	pBroadcastKey->pParent = pParent;
    190 
    191 	/* configure according to the keyMng suite and cipher suite */
    192 	switch (pPaeConfig->keyExchangeProtocol)
    193 	{
    194 	case RSN_KEY_MNG_NONE:
    195 		status = broadcastKeyNone_config(pBroadcastKey);
    196 		break;
    197 	case RSN_KEY_MNG_802_1X:
    198 		if (pPaeConfig->broadcastSuite == TWD_CIPHER_NONE)
    199 		{
    200 			status = broadcastKeyNone_config(pBroadcastKey);
    201 		} else {
    202 			status = broadcastKey802_1x_config(pBroadcastKey);
    203 		}
    204 		break;
    205     default:
    206 		status = broadcastKeyNone_config(pBroadcastKey);
    207 		break;
    208 	}
    209 
    210 	status = keyDerive_config(pBroadcastKey->pKeyDerive, pPaeConfig->broadcastSuite, pParent, hReport, hOs);
    211 
    212 	return status;
    213 }
    214 
    215 
    216 TI_STATUS broadcastKeySmUnexpected(struct _broadcastKey_t *pBroadcastKey)
    217 {
    218 TRACE0(pBroadcastKey->hReport, REPORT_SEVERITY_ERROR, "BROADCAST_KEY_SM: ERROR: UnExpected Event\n");
    219 
    220 	return(TI_NOK);
    221 }
    222 
    223 TI_STATUS broadcastKeySmNop(struct _broadcastKey_t *pBroadcastKey)
    224 {
    225 	return(TI_OK);
    226 }
    227 
    228