1 /* 2 * mainSecSm.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 mainSecSm.c 35 * \brief 802.1X finite state machine header file 36 * 37 * \see mainSecSm.h 38 */ 39 40 41 /***************************************************************************/ 42 /* */ 43 /* MODULE: mainSecSm.c */ 44 /* PURPOSE: Main Security State Machine API */ 45 /* */ 46 /***************************************************************************/ 47 48 #define __FILE_ID__ FILE_ID_39 49 #include "osApi.h" 50 #include "paramOut.h" 51 #include "report.h" 52 #include "DataCtrl_Api.h" 53 #include "smeApi.h" 54 #include "rsn.h" 55 #include "rsnApi.h" 56 #include "mainSecSm.h" 57 #include "mainSecNull.h" 58 #include "mainSecKeysOnly.h" 59 #include "mainKeysSm.h" 60 #include "externalSec.h" 61 62 /* Constants */ 63 64 /** number of events in the state machine */ 65 #define MAIN_SEC_MAX_NUM_EVENTS 7 66 67 /** number of states in the state machine */ 68 #define MAIN_SEC_MAX_NUM_STATES 6 69 70 /* Enumerations */ 71 72 /* Typedefs */ 73 74 /* Structures */ 75 76 /* External data definitions */ 77 78 /* External functions definitions */ 79 80 /* Global variables */ 81 82 /* Local function prototypes */ 83 84 TI_STATUS mainSec_setKey(struct _mainSec_t *pMainSec, TSecurityKeys *pKey); 85 TI_STATUS mainSec_removeKey(struct _mainSec_t *pMainSec, TSecurityKeys *pKey); 86 TI_STATUS mainSec_setDefaultKeyId(struct _mainSec_t *pMainSec, TI_UINT8 keyId); 87 88 /* functions */ 89 90 /** 91 * 92 * mainSec_create 93 * 94 * \b Description: 95 * 96 * Allocate memory for the main security context, and create all the rest of the needed contexts. 97 * 98 * \b ARGS: 99 * 100 * I - hOs - OS handle for OS operations. 101 * 102 * \b RETURNS: 103 * 104 * pointer to main security context. If failed, returns NULL. 105 * 106 * \sa 107 */ 108 mainSec_t* mainSec_create(TI_HANDLE hOs) 109 { 110 mainSec_t *pHandle; 111 TI_STATUS status; 112 113 /* allocate association context memory */ 114 pHandle = (mainSec_t*)os_memoryAlloc(hOs, sizeof(mainSec_t)); 115 if (pHandle == NULL) 116 { 117 return NULL; 118 } 119 120 os_memoryZero(hOs, pHandle, sizeof(mainSec_t)); 121 122 /* allocate memory for association state machine */ 123 status = fsm_Create(hOs, &pHandle->pMainSecSm, MAIN_SEC_MAX_NUM_STATES, MAIN_SEC_MAX_NUM_EVENTS); 124 if (status != TI_OK) 125 { 126 os_memoryFree(hOs, pHandle, sizeof(mainSec_t)); 127 return NULL; 128 } 129 130 pHandle->pMainKeys = mainKeys_create(hOs); 131 if (pHandle->pMainKeys == NULL) 132 { 133 fsm_Unload(hOs, pHandle->pMainSecSm); 134 os_memoryFree(hOs, pHandle, sizeof(mainSec_t)); 135 return NULL; 136 } 137 138 pHandle->pKeyParser = pHandle->pMainKeys->pKeyParser; 139 pHandle->hOs = hOs; 140 141 /* created only for external security mode */ 142 pHandle->pExternalSec = externalSec_create(hOs); 143 if (pHandle->pExternalSec == NULL) 144 { 145 mainKeys_unload(pHandle->pMainKeys); 146 fsm_Unload(hOs, pHandle->pMainSecSm); 147 os_memoryFree(hOs, pHandle, sizeof(mainSec_t)); 148 return NULL; 149 } 150 151 return pHandle; 152 } 153 154 /** 155 * 156 * mainSec_config 157 * 158 * \b Description: 159 * 160 * Init main security state machine state machine 161 * 162 * \b ARGS: 163 * 164 * none 165 * 166 * \b RETURNS: 167 * 168 * TI_OK on success, TI_NOK otherwise. 169 * 170 * \sa 171 */ 172 TI_STATUS mainSec_config (mainSec_t *pMainSec, 173 mainSecInitData_t *pInitData, 174 void *pParent, 175 TI_HANDLE hReport, 176 TI_HANDLE hOs, 177 TI_HANDLE hCtrlData, 178 TI_HANDLE hEvHandler, 179 TI_HANDLE hConn, 180 TI_HANDLE hTimer) 181 { 182 TI_STATUS status; 183 184 pMainSec->setKey = mainSec_setKey; 185 pMainSec->removeKey = mainSec_removeKey; 186 pMainSec->setDefaultKeyId = mainSec_setDefaultKeyId; 187 188 pMainSec->pParent = pParent; 189 pMainSec->hReport = hReport; 190 pMainSec->hOs = hOs; 191 192 TRACE4(pMainSec->hReport, REPORT_SEVERITY_SM, "MainSec SM: config, authProtocol = %d, keyExchangeProtocol=%d, unicastSuite=%d, broadcastSuite=%d\n", pInitData->pPaeConfig->authProtocol, pInitData->pPaeConfig->keyExchangeProtocol, pInitData->pPaeConfig->unicastSuite, pInitData->pPaeConfig->broadcastSuite); 193 194 if (TI_TRUE == pMainSec->pParent->bRsnExternalMode) 195 { 196 status = externalSec_config(pMainSec); 197 } 198 else 199 { 200 switch (pInitData->pPaeConfig->keyExchangeProtocol) 201 { 202 case RSN_KEY_MNG_NONE: 203 status = mainSecSmNull_config(pMainSec, pInitData->pPaeConfig); 204 break; 205 case RSN_KEY_MNG_802_1X: 206 status = mainSecKeysOnly_config(pMainSec, pInitData->pPaeConfig); 207 break; 208 default: 209 status = mainSecSmNull_config(pMainSec, pInitData->pPaeConfig); 210 break; 211 } 212 } 213 214 status = mainKeys_config (pMainSec->pMainKeys, 215 pInitData->pPaeConfig, 216 pMainSec, 217 pMainSec->hReport, 218 pMainSec->hOs, 219 hCtrlData, 220 hEvHandler, 221 hConn, 222 pMainSec->pParent, 223 hTimer); 224 if (status != TI_OK) 225 { 226 TRACE0(pMainSec->hReport, REPORT_SEVERITY_ERROR, "MAIN_SEC_SM: error in configuring mainKeys SM\n"); 227 return status; 228 } 229 230 TRACE0(pMainSec->hReport, REPORT_SEVERITY_SM, "MAIN_SEC_SM: successful configuration SM\n"); 231 232 return status; 233 } 234 235 /** 236 * 237 * mainSec_config 238 * 239 * \b Description: 240 * 241 * Init main security state machine state machine 242 * 243 * \b ARGS: 244 * 245 * none 246 * 247 * \b RETURNS: 248 * 249 * TI_OK on success, TI_NOK otherwise. 250 * 251 * \sa 252 */ 253 TI_STATUS mainSec_unload(mainSec_t *pMainSec) 254 { 255 TI_STATUS status; 256 257 if (pMainSec == NULL) 258 { 259 return TI_NOK; 260 } 261 262 status = mainKeys_unload(pMainSec->pMainKeys); 263 if (status != TI_OK) 264 { 265 /* report failure but don't stop... */ 266 TRACE0(pMainSec->hReport, REPORT_SEVERITY_ERROR, "MAIN_SEC_SM: Error releasing Main Keys SM memory \n"); 267 } 268 269 status = fsm_Unload(pMainSec->hOs, pMainSec->pMainSecSm); 270 if (status != TI_OK) 271 { 272 /* report failure but don't stop... */ 273 TRACE0(pMainSec->hReport, REPORT_SEVERITY_ERROR, "MAIN_SEC_SM: Error releasing FSM memory \n"); 274 } 275 276 status = externalSec_unload(pMainSec->pExternalSec); 277 if (status != TI_OK) 278 { 279 /* report failure but don't stop... */ 280 TRACE0(pMainSec->hReport, REPORT_SEVERITY_ERROR, "MAIN_SEC_SM: Error releasing ExternalSec memory \n"); 281 } 282 283 os_memoryFree(pMainSec->hOs, pMainSec, sizeof(mainSec_t)); 284 285 return TI_OK; 286 } 287 288 /** 289 * 290 * mainSec_setKey 291 * 292 * \b Description: 293 * 294 * Start the NULL main security SM. Reports success to the rsn module immediately. 295 * 296 * \b ARGS: 297 * 298 * none 299 * 300 * \b RETURNS: 301 * 302 * TI_OK on success, TI_NOK otherwise. 303 * 304 * \sa 305 */ 306 TI_STATUS mainSec_setKey(struct _mainSec_t *pMainSec, TSecurityKeys *pKey) 307 { 308 TI_STATUS status = TI_OK; 309 310 if ((pMainSec == NULL) || (pKey == NULL)) 311 { 312 return TI_NOK; 313 } 314 315 if (pKey->keyType != KEY_NULL) 316 { 317 TRACE6(pMainSec->hReport, REPORT_SEVERITY_INFORMATION, "MAIN_SEC_SM: setting key #%d, value = 0x%X 0x%X 0x%X 0x%X 0x%X\n", pKey->keyIndex, (TI_UINT8)pKey->encKey[0], (TI_UINT8)pKey->encKey[1], (TI_UINT8)pKey->encKey[2], (TI_UINT8)pKey->encKey[3], (TI_UINT8)pKey->encKey[4]); 318 319 status = pMainSec->pParent->setKey(pMainSec->pParent, pKey); 320 } 321 322 return status; 323 } 324 325 /** 326 * 327 * mainSec_removeKey 328 * 329 * \b Description: 330 * 331 * Start the NULL main security SM. Reports success to the rsn module immediately. 332 * 333 * \b ARGS: 334 * 335 * none 336 * 337 * \b RETURNS: 338 * 339 * TI_OK on success, TI_NOK otherwise. 340 * 341 * \sa 342 */ 343 TI_STATUS mainSec_removeKey(struct _mainSec_t *pMainSec, TSecurityKeys *pKey) 344 { 345 TI_STATUS status = TI_OK; 346 347 if ((pMainSec == NULL) || (pKey == NULL)) 348 { 349 return TI_NOK; 350 } 351 352 if (pKey->keyType != KEY_NULL) 353 { 354 TRACE1(pMainSec->hReport, REPORT_SEVERITY_INFORMATION, "MAIN_SEC_SM: removing key #%d, \n", pKey->keyIndex); 355 356 status = pMainSec->pParent->removeKey(pMainSec->pParent, pKey); 357 } 358 359 return status; 360 } 361 362 /** 363 * 364 * mainSec_setDefaultKeyId 365 * 366 * \b Description: 367 * 368 * Start the NULL main security SM. Reports success to the rsn module immediately. 369 * 370 * \b ARGS: 371 * 372 * none 373 * 374 * \b RETURNS: 375 * 376 * TI_OK on success, TI_NOK otherwise. 377 * 378 * \sa 379 */ 380 TI_STATUS mainSec_setDefaultKeyId(struct _mainSec_t *pMainSec, TI_UINT8 keyId) 381 { 382 TI_STATUS status = TI_OK; 383 384 if (pMainSec == NULL) 385 { 386 return TI_NOK; 387 } 388 389 status = pMainSec->pParent->setDefaultKeyId(pMainSec->pParent, keyId); 390 391 return status; 392 } 393 394 395