• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
broadcastKey_create(TI_HANDLE hOs)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 
broadcastKey_unload(struct _broadcastKey_t * pBroadcastKey)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 
broadcastKey_config(struct _broadcastKey_t * pBroadcastKey,TRsnPaeConfig * pPaeConfig,struct _mainKeys_t * pParent,TI_HANDLE hReport,TI_HANDLE hOs)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 
broadcastKeySmUnexpected(struct _broadcastKey_t * pBroadcastKey)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 
broadcastKeySmNop(struct _broadcastKey_t * pBroadcastKey)223 TI_STATUS broadcastKeySmNop(struct _broadcastKey_t *pBroadcastKey)
224 {
225 	return(TI_OK);
226 }
227 
228