1 /****************************************************************************
2 **+-----------------------------------------------------------------------+**
4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
5 **| All rights reserved. |**
7 **| Redistribution and use in source and binary forms, with or without |**
8 **| modification, are permitted provided that the following conditions |**
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 |**
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. |**
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. |**
33 **+-----------------------------------------------------------------------+**
34 ****************************************************************************/
36 #include "whalCommon.h"
37 #include "whalCtrl_api.h"
39 #include "whalSecurity.h"
43 * ----------------------------------------------------------------------------
44 * Function : whalSecur_Create
50 * -----------------------------------------------------------------------------
52 TI_HANDLE whalSecur_Create (TI_HANDLE hOs, TI_HANDLE hWhalCtrl, UINT16 numOfStations)
54 WHAL_SECURITY* pWhalSecur;
56 pWhalSecur = (WHAL_SECURITY *)os_memoryAlloc (hOs, sizeof(WHAL_SECURITY));
57 if (pWhalSecur == NULL)
60 os_memoryZero (hOs, (void *)pWhalSecur, sizeof(WHAL_SECURITY));
62 pWhalSecur->pWhalCtrl = (WHAL_CTRL*)hWhalCtrl;
63 pWhalSecur->hOs = hOs;
64 pWhalSecur->securityMode = RSN_CIPHER_NONE;
66 pWhalSecur->pWhalWep = (WHAL_WEP*)whalWep_Create (hOs, hWhalCtrl);
67 if (pWhalSecur->pWhalWep == NULL)
69 whalSecur_Destroy(pWhalSecur, numOfStations);
72 pWhalSecur->pWhalWpa = (WHAL_WPA*)whalWpa_Create (hOs, hWhalCtrl);
73 if (pWhalSecur->pWhalWpa == NULL)
75 whalSecur_Destroy(pWhalSecur, numOfStations);
79 pWhalSecur->pWhalPrivacy = (privacy_t*)privacy_create (hOs);
80 pWhalSecur->pWhalExc = (WHAL_EXC*)whalExc_Create(hOs, hWhalCtrl);
81 if (pWhalSecur->pWhalExc == NULL)
83 whalSecur_Destroy(pWhalSecur, numOfStations);
86 #endif /* CKIP_ENABLED */
87 pWhalSecur->numOfStations = numOfStations;
88 pWhalSecur->reconfData.reconfKeys = (securityKeys_t*)os_memoryAlloc (hOs,
89 (sizeof(securityKeys_t))*(numOfStations*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS));
90 os_memoryZero (hOs, (void *)pWhalSecur->reconfData.reconfKeys,
91 (sizeof(securityKeys_t))*(numOfStations*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS));
93 return ((TI_HANDLE)pWhalSecur);
97 * ----------------------------------------------------------------------------
98 * Function : whalSecur_Config
104 * -----------------------------------------------------------------------------
106 int whalSecur_Config (TI_HANDLE hWhalSecur, whalSecur_config_t* pWhalSecurCfg)
109 whalWep_config_t wepCfg;
110 whalWpa_config_t wpaCfg;
112 whalExc_config_t excCfg;
113 #endif /* CKIP_ENABLED*/
115 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
117 /* Reset all reconfig valid fields*/
118 pWhalSecur->reconfData.isHwEncDecrEnableValid = FALSE;
119 pWhalSecur->reconfData.isDefaultKeyIdValid = FALSE;
120 for (index=0; index < ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS); index++)
121 (pWhalSecur->reconfData.reconfKeys+index)->keyType = NULL_KEY;
123 /* Save configuration parameters */
124 pWhalSecur->hMemMgr = pWhalSecurCfg->hMemMgr;
125 pWhalSecur->hReport = pWhalSecurCfg->hReport;
128 /* Config the wep sub-module*/
129 wepCfg.hMemMgr = pWhalSecur->hMemMgr;
130 wepCfg.hReport = pWhalSecur->hReport;
131 if (whalWep_Config (pWhalSecur->pWhalWep, &wepCfg) != OK)
134 /* Config the wpa sub-module*/
135 wpaCfg.hMemMgr = pWhalSecur->hMemMgr;
136 wpaCfg.hReport = pWhalSecur->hReport;
137 if (whalWpa_Config (pWhalSecur->pWhalWpa, &wpaCfg) != OK)
141 wpaCfg.pWhalPrivacy = pWhalSecur->pWhalPrivacy;
142 /* Config the privacy sub-module*/
143 if (privacy_config (pWhalSecur->pWhalPrivacy,
144 pWhalSecur->hReport, pWhalSecur->hOs) != OK)
146 excCfg.hMemMgr = pWhalSecur->hMemMgr;
147 excCfg.hReport = pWhalSecur->hReport;
148 excCfg.pWhalPrivacy = pWhalSecur->pWhalPrivacy;
149 if (whalExc_Config (pWhalSecur->pWhalExc, &excCfg) != OK)
151 #endif /*CKIP_ENABLED */
158 * ----------------------------------------------------------------------------
159 * Function : whalSecur_KeyAdd
165 * -----------------------------------------------------------------------------
167 int whalSecur_KeyAdd (TI_HANDLE hWhalSecur, securityKeys_t* pKey, BOOL reconfFlag, void *CB_Func, TI_HANDLE CB_handle)
169 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
170 UINT8 keyIdx = (UINT8)pKey->keyIndex;
172 /* store the security key for reconfigure time (FW reload)*/
173 if (reconfFlag != TRUE)
175 if (keyIdx >= ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS))
177 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
178 ("whalSecur_KeyAdd: ERROR Key keyIndex field out of range =%d, range is (0 to %d)\n",
179 pKey->keyIndex, (pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS-1));
184 if (pKey->keyType == NULL_KEY)
186 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
187 ("whalSecur_KeyAdd: ERROR KeyType is NULL_KEY\n"));
192 os_memoryCopy (pWhalSecur->hOs,
193 (void *)(pWhalSecur->reconfData.reconfKeys + keyIdx),
194 (void *)pKey, sizeof(securityKeys_t));
197 switch (pWhalSecur->securityMode)
200 case RSN_CIPHER_WEP104:
201 return (whalWep_KeyAdd (pWhalSecur->pWhalWep, pKey, CB_Func, CB_handle));
203 case RSN_CIPHER_TKIP:
204 case RSN_CIPHER_AES_CCMP:
205 return (whalWpa_KeyAdd (pWhalSecur->pWhalWpa, pKey, CB_Func, CB_handle));
214 * ----------------------------------------------------------------------------
215 * Function : whalSecur_KeyRemove
221 * -----------------------------------------------------------------------------
223 int whalSecur_KeyRemove (TI_HANDLE hWhalSecur, securityKeys_t* pKey, BOOL reconfFlag, void *CB_Func, TI_HANDLE CB_handle)
225 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
227 switch (pWhalSecur->securityMode)
230 case RSN_CIPHER_WEP104:
231 return (whalWep_KeyRemove (pWhalSecur->pWhalWep, pKey, CB_Func, CB_handle));
233 case RSN_CIPHER_TKIP:
234 case RSN_CIPHER_AES_CCMP:
235 return (whalWpa_KeyRemove (pWhalSecur->pWhalWpa, pKey, CB_Func, CB_handle));
244 * ----------------------------------------------------------------------------
245 * Function : whalSecur_DefaultKeyIdSet
251 * -----------------------------------------------------------------------------
253 int whalSecur_DefaultKeyIdSet (TI_HANDLE hWhalSecur, UINT8 aKeyId, void *CB_Func, TI_HANDLE CB_handle)
255 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
257 /* store the default key ID value for reconfigure time (FW reload)*/
258 pWhalSecur->reconfData.reconfDefaultKeyId = aKeyId;
260 switch (pWhalSecur->securityMode)
263 case RSN_CIPHER_WEP104:
264 pWhalSecur->reconfData.isDefaultKeyIdValid = TRUE;
265 return (whalWep_DefaultKeyIdSet (pWhalSecur->pWhalWep, aKeyId, CB_Func, CB_handle));
267 case RSN_CIPHER_TKIP:
268 case RSN_CIPHER_AES_CCMP:
269 pWhalSecur->reconfData.isDefaultKeyIdValid = TRUE;
270 return (whalWpa_DefaultKeyIdSet (pWhalSecur->pWhalWpa, aKeyId, CB_Func, CB_handle));
279 * ----------------------------------------------------------------------------
280 * Function : whalSecur_HwEncDecrEnable
286 * -----------------------------------------------------------------------------
288 int whalSecur_HwEncDecrEnable (TI_HANDLE hWhalSecur, BOOL aHwEncEnable)
290 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
292 /* store the HW encryption Enable flag for reconfigure time (FW reload)*/
293 pWhalSecur->reconfData.reconfHwEncEnable = aHwEncEnable;
295 pWhalSecur->reconfData.isHwEncDecrEnableValid = TRUE;
297 return (whal_hwCtrl_EncDecrSet (pWhalSecur->pWhalCtrl->pHwCtrl, aHwEncEnable, aHwEncEnable));
302 * ----------------------------------------------------------------------------
303 * Function : whalSecur_SwEncEnable
309 * -----------------------------------------------------------------------------
311 int whalSecur_SwEncEnable (TI_HANDLE hWhalSecur, BOOL aSwEncEnable)
313 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
315 return (whalExc_swEncEnable (pWhalSecur->pWhalExc, aSwEncEnable));
319 * ----------------------------------------------------------------------------
320 * Function : whalSecur_MicFieldEnable
326 * -----------------------------------------------------------------------------
328 int whalSecur_MicFieldEnable (TI_HANDLE hWhalSecur, BOOL aMicFieldEnable)
330 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
332 return (whalExc_micFieldEnable (pWhalSecur->pWhalExc, aMicFieldEnable));
334 #endif /*CKIP_ENABLED*/
337 * ----------------------------------------------------------------------------
338 * Function : whalSecur_SecurModeSet
344 * -----------------------------------------------------------------------------
346 int whalSecur_SecurModeSet (TI_HANDLE hWhalSecur, cipherSuite_e aSecurMode)
349 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
350 if (aSecurMode<=RSN_CIPHER_CKIP)
352 WLAN_REPORT_INFORMATION (pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
353 ("whalSecur_SecurModeSet: change security mode from %d --> %d\n",
354 pWhalSecur->securityMode, aSecurMode));
355 /* check if security mode is equal to previous one*/
356 if (pWhalSecur->securityMode == aSecurMode)
359 /* Reset all reconfig valid fields*/
360 pWhalSecur->reconfData.isHwEncDecrEnableValid = FALSE;
361 pWhalSecur->reconfData.isDefaultKeyIdValid = FALSE;
362 for (index=0; index < ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS); index++)
363 (pWhalSecur->reconfData.reconfKeys+index)->keyType = NULL_KEY;
365 /* set the new security mode*/
366 pWhalSecur->securityMode = aSecurMode;
369 /* Upon entering to RSN_PRIVACY_EXC mode, disable the excSwEnc and excMicField flags,
370 reset the privacy Enc sub-module */
371 if (aSecurMode == RSN_CIPHER_CKIP)
373 if (whalExc_swEncEnable (pWhalSecur->pWhalExc, FALSE) != OK)
376 if (whalExc_micFieldEnable (pWhalSecur->pWhalExc, FALSE) != OK)
379 if (privacy_resetEnc (pWhalSecur->pWhalPrivacy) != OK)
383 privacy_setPrivacyMode(pWhalSecur->pWhalPrivacy, aSecurMode);
384 #endif /* CKIP_ENABLED*/
386 /* disable defrag, duplicate detection on TNETW+EXC on chip level*/
387 if (pWhalSecur->securityMode==RSN_CIPHER_CKIP)
388 /* YV- to add fragmentation control (if there is- artur ?)*/
389 return (whal_hwCtrl_RxMsduFormatSet (pWhalSecur->pWhalCtrl->pHwCtrl, FALSE));
391 /* YV- to add fragmentation control (if there is- artur ?)*/
392 return (whal_hwCtrl_RxMsduFormatSet (pWhalSecur->pWhalCtrl->pHwCtrl, TRUE));
401 * ----------------------------------------------------------------------------
402 * Function : whalSecur_SecurModeGet
405 * Output : security mode
408 * -----------------------------------------------------------------------------
410 cipherSuite_e whalSecur_SecurModeGet (TI_HANDLE hWhalSecur)
412 WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
414 return pWhalSecur->securityMode;
419 * ----------------------------------------------------------------------------
420 * Function : whalSecur_KeysReconfig
424 * Process : Reconfig security keys, default key Id and encryption/decryption
427 * -----------------------------------------------------------------------------
429 int whalSecur_KeysReconfig (TI_HANDLE hWhalSecur)
432 WHAL_SECURITY* pWhalSecur = (WHAL_SECURITY *)hWhalSecur;
435 if (pWhalSecur->securityMode != RSN_CIPHER_NONE)
438 /* set the keys to the HW*/
439 for (index=0; index < ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS); index++)
441 if ((pWhalSecur->reconfData.reconfKeys+index)->keyType != NULL_KEY)
443 if (whalSecur_KeyAdd (pWhalSecur, pWhalSecur->reconfData.reconfKeys+index, TRUE, NULL, NULL) != OK)
445 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
446 ("whalSecur_KeysReconfig: ERROR whalSecur_KeyAdd failure index=%d\n", index));
452 if (pWhalSecur->reconfData.isDefaultKeyIdValid == TRUE)
454 /* set the deafult key ID to the HW*/
455 if (whalSecur_DefaultKeyIdSet (pWhalSecur, pWhalSecur->reconfData.reconfDefaultKeyId, NULL, NULL) != OK)
457 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
458 ("whalSecur_KeysReconfig: ERROR whalSecur_DefaultKeyIdSet failure \n"));
462 } /* pWhalSecur->securityMode != RSN_CIPHER_NONE */
465 /* set the encryption/decryption control on the HW*/
466 if (whalSecur_HwEncDecrEnable (pWhalSecur, pWhalSecur->reconfData.reconfHwEncEnable) != OK)
468 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
469 ("whalSecur_KeysReconfig: ERROR whalSecur_HwEncDecrEnable failure \n"));
477 * ----------------------------------------------------------------------------
478 * Function : whalSecur_Destroy
482 * Process : Unload the HAL security module
484 * -----------------------------------------------------------------------------
486 int whalSecur_Destroy (TI_HANDLE hWhalSecur, UINT16 numOfStations)
488 WHAL_SECURITY* pWhalSecur = (WHAL_SECURITY *)hWhalSecur;
493 whalExc_Destroy (pWhalSecur->pWhalExc);
494 if (privacy_unload(pWhalSecur->pWhalPrivacy) != OK)
495 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_CTRL_MODULE_LOG, (" whalSecur_Destroy: privacy_unload failure \n"));
496 #endif /* CKIP_ENABLED*/
498 if (whalWpa_Destroy (pWhalSecur->pWhalWpa) != OK)
499 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_CTRL_MODULE_LOG, (" whalSecur_Destroy: whalWpa_Destroy failure \n"));
500 if (whalWep_Destroy (pWhalSecur->pWhalWep) != OK)
501 WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_CTRL_MODULE_LOG, (" whalSecur_Destroy: whalWep_Destroy failure \n"));
503 if (pWhalSecur->reconfData.reconfKeys)
504 os_memoryFree (pWhalSecur->hOs, pWhalSecur->reconfData.reconfKeys,
505 (sizeof(securityKeys_t))*(numOfStations*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS));
507 os_memoryFree (pWhalSecur->hOs, pWhalSecur, sizeof(WHAL_SECURITY));