1 /* 2 * wpa_core.c 3 * 4 * Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/ 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 /**************************************************************************** 20 * 21 * MODULE: Wpa_Core.c 22 * 23 * PURPOSE: 24 * 25 * DESCRIPTION: 26 * ============ 27 * 28 * 29 ****************************************************************************/ 30 31 /* includes */ 32 /************/ 33 34 #ifdef ANDROID 35 #include <unistd.h> 36 #endif 37 38 #include <string.h> 39 #include "cu_osapi.h" 40 #include "TWDriver.h" 41 #include "common.h" 42 #include "config_ssid.h" 43 #include "driver.h" 44 #include "ipc_wpa.h" 45 #include "wpa_core.h" 46 #include "oserr.h" 47 48 /* defines */ 49 /***********/ 50 #ifdef CONFIG_EAP_WSC 51 #define WSC_MODE_OFF 0 52 #define WSC_MODE_PIN 1 53 #define WSC_MODE_PBC 2 54 #endif 55 56 /* local types */ 57 /***************/ 58 /* Network configuration block - holds candidate connection parameters */ 59 typedef struct 60 { 61 S32 mode; 62 S32 proto; 63 S32 key_mgmt; 64 S32 auth_alg; 65 S32 pair_wise; 66 S32 group; 67 U8 pass_phrase[WPACORE_MAX_PSK_STRING_LENGTH]; 68 U8 wep_key[4][32]; 69 U8 default_wep_key; 70 U8 wep_key_length; 71 #ifdef CONFIG_EAP_WSC 72 U8 WscMode; 73 PS8 pWscPin; 74 #endif 75 S32 eap; 76 U8 Identity[WPACORE_MAX_CERT_PASSWORD_LENGTH]; 77 U8 private_key_passwd[WPACORE_MAX_CERT_PASSWORD_LENGTH]; 78 U8 private_key[WPACORE_MAX_CERT_PASSWORD_LENGTH]; 79 U8 client_cert[WPACORE_MAX_CERT_FILE_NAME_LENGTH]; 80 U8 password[WPACORE_MAX_CERT_PASSWORD_LENGTH]; 81 U8 anyWpaMode; 82 #ifdef XCC_MODULE_INCLUDED 83 U16 XCC; 84 #endif 85 } TWpaCore_WpaSupplParams; 86 87 typedef struct 88 { 89 OS_802_11_AUTHENTICATION_MODE AuthMode; 90 OS_802_11_ENCRYPTION_TYPES EncryptionTypePairWise; 91 OS_802_11_ENCRYPTION_TYPES EncryptionTypeGroup; 92 } TWpaCore_WpaParams; 93 94 /* Module control block */ 95 typedef struct TWpaCore 96 { 97 THandle hIpcWpa; 98 99 S32 CurrentNetwork; 100 101 TWpaCore_WpaSupplParams WpaSupplParams; 102 TWpaCore_WpaParams WpaParams; 103 } TWpaCore; 104 105 /* local variables */ 106 /*******************/ 107 108 /* local fucntions */ 109 /*******************/ 110 static VOID WpaCore_InitWpaParams(TWpaCore* pWpaCore) 111 { 112 os_memset( &pWpaCore->WpaSupplParams, 0, sizeof(TWpaCore_WpaSupplParams)); 113 pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA; /* Default is Infrastructure mode */ 114 pWpaCore->WpaSupplParams.proto = 0; /* key negotiation protocol - WPA is ok even though no security is used */ 115 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE; /* No key management suite */ 116 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; /* Open authentication */ 117 pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_NONE; 118 pWpaCore->WpaSupplParams.group = WPA_CIPHER_NONE; 119 pWpaCore->WpaSupplParams.anyWpaMode = 0; 120 #ifdef CONFIG_EAP_WSC 121 pWpaCore->WpaSupplParams.pWscPin = NULL; 122 pWpaCore->WpaSupplParams.WscMode = WSC_MODE_OFF; 123 #endif 124 125 pWpaCore->WpaParams.AuthMode = os802_11AuthModeOpen; 126 pWpaCore->WpaParams.EncryptionTypeGroup = OS_ENCRYPTION_TYPE_NONE; 127 pWpaCore->WpaParams.EncryptionTypePairWise = OS_ENCRYPTION_TYPE_NONE; 128 } 129 130 /* functions */ 131 /*************/ 132 THandle WpaCore_Create(PS32 pRes, PS8 pSupplIfFile) 133 { 134 TWpaCore* pWpaCore = (TWpaCore*)os_MemoryCAlloc(sizeof(TWpaCore), sizeof(U8)); 135 if(pWpaCore == NULL) 136 { 137 *pRes = OK; 138 os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_Create - cant allocate control block\n"); 139 return NULL; 140 } 141 142 pWpaCore->hIpcWpa = IpcWpa_Create(pRes, pSupplIfFile); 143 if(pWpaCore->hIpcWpa == NULL) 144 { 145 WpaCore_Destroy(pWpaCore); 146 return NULL; 147 } 148 149 WpaCore_InitWpaParams(pWpaCore); 150 151 pWpaCore->CurrentNetwork = -1; 152 153 /* send default configuration to the supplicant */ 154 IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"AP_SCAN 2", FALSE); 155 156 return pWpaCore; 157 } 158 159 VOID WpaCore_Destroy(THandle hWpaCore) 160 { 161 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 162 163 if(pWpaCore->hIpcWpa) 164 IpcWpa_Destroy(pWpaCore->hIpcWpa); 165 #ifdef CONFIG_EAP_WSC 166 if(pWpaCore->WpaSupplParams.pWscPin) 167 os_MemoryFree(pWpaCore->WpaSupplParams.pWscPin); 168 #endif 169 170 os_MemoryFree(pWpaCore); 171 } 172 173 #ifdef XCC_MODULE_INCLUDED 174 S32 WpaCore_SetXCC(THandle hWpaCore, U16 XCCConfig) 175 { 176 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 177 178 pWpaCore->WpaSupplParams.XCC = XCCConfig; 179 180 return TI_OK; 181 } 182 #endif 183 184 S32 WpaCore_SetAuthMode(THandle hWpaCore, OS_802_11_AUTHENTICATION_MODE AuthMode) 185 { 186 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 187 188 pWpaCore->WpaParams.AuthMode = AuthMode; 189 190 switch (AuthMode) 191 { 192 case os802_11AuthModeOpen: 193 pWpaCore->WpaSupplParams.proto = 0; 194 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE; 195 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; 196 break; 197 case os802_11AuthModeShared: 198 pWpaCore->WpaSupplParams.proto = 0; 199 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE; 200 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_SHARED; 201 break; 202 case os802_11AuthModeWPANone: 203 pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA; 204 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_WPA_NONE; 205 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; 206 break; 207 case os802_11AuthModeWPAPSK: 208 pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA; 209 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_PSK; 210 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; 211 break; 212 case os802_11AuthModeWPA2PSK: 213 pWpaCore->WpaSupplParams.proto = WPA_PROTO_RSN; 214 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_PSK; 215 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; 216 break; 217 case os802_11AuthModeWPA: 218 pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA; 219 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_IEEE8021X; 220 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; 221 break; 222 case os802_11AuthModeWPA2: 223 pWpaCore->WpaSupplParams.proto = WPA_PROTO_RSN; 224 pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_IEEE8021X; 225 pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; 226 break; 227 228 default: 229 os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_SetAuthMode - unknown authentication mode (%d)!!!\n", AuthMode); 230 return ECUERR_WPA_CORE_ERROR_UNKNOWN_AUTH_MODE; 231 } 232 233 return OK; 234 } 235 236 237 S32 WpaCore_GetAuthMode(THandle hWpaCore, PU32 pAuthMode) 238 { 239 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 240 241 *pAuthMode = pWpaCore->WpaParams.AuthMode; 242 243 return OK; 244 } 245 246 S32 WpaCore_SetEncryptionPairWise(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES EncryptionType) 247 { 248 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 249 250 pWpaCore->WpaParams.EncryptionTypePairWise = EncryptionType; 251 252 switch (EncryptionType) 253 { 254 case OS_ENCRYPTION_TYPE_NONE: 255 pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_NONE; 256 break; 257 case OS_ENCRYPTION_TYPE_WEP: 258 pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_WEP40; 259 break; 260 case OS_ENCRYPTION_TYPE_TKIP: 261 pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_TKIP; 262 break; 263 case OS_ENCRYPTION_TYPE_AES: 264 pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_CCMP; 265 break; 266 } 267 268 return OK; 269 } 270 271 S32 WpaCore_SetPrivacyEap(THandle hWpaCore, OS_802_11_EAP_TYPES EapType) 272 { 273 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 274 275 pWpaCore->WpaSupplParams.eap = EapType; 276 277 return OK; 278 } 279 280 S32 WpaCore_GetEncryptionPairWise(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES* pEncryptionType) 281 { 282 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 283 284 *pEncryptionType = pWpaCore->WpaParams.EncryptionTypePairWise; 285 286 return OK; 287 } 288 289 S32 WpaCore_SetEncryptionGroup(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES EncryptionType) 290 { 291 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 292 293 pWpaCore->WpaParams.EncryptionTypeGroup = EncryptionType; 294 295 switch (EncryptionType) 296 { 297 case OS_ENCRYPTION_TYPE_NONE: 298 os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_SetEncryptionGroup - group encryption cant be NONE\n"); 299 break; 300 case OS_ENCRYPTION_TYPE_WEP: 301 pWpaCore->WpaSupplParams.group = WPA_CIPHER_WEP40; 302 break; 303 304 case OS_ENCRYPTION_TYPE_TKIP: 305 pWpaCore->WpaSupplParams.group = WPA_CIPHER_TKIP; 306 break; 307 case OS_ENCRYPTION_TYPE_AES: 308 pWpaCore->WpaSupplParams.group = WPA_CIPHER_CCMP; 309 break; 310 } 311 312 return OK; 313 } 314 315 S32 WpaCore_GetEncryptionGroup(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES* pEncryptionType) 316 { 317 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 318 319 *pEncryptionType = pWpaCore->WpaParams.EncryptionTypeGroup; 320 321 return OK; 322 } 323 324 S32 WpaCore_SetCredentials(THandle hWpaCore, PU8 Identity, PU8 Passward) 325 { 326 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 327 328 os_memcpy((PVOID)pWpaCore->WpaSupplParams.Identity, (PVOID)Identity, os_strlen((PS8)Identity)); 329 330 if (Passward !=NULL) 331 { 332 os_memcpy((PVOID)pWpaCore->WpaSupplParams.password, (PVOID)Passward, os_strlen((PS8)Passward)); 333 os_memcpy((PVOID)pWpaCore->WpaSupplParams.private_key_passwd, (PVOID)Passward, os_strlen((PS8)Passward)); 334 } 335 336 return OK; 337 } 338 339 S32 WpaCore_SetCertificate(THandle hWpaCore, PU8 Filepath) 340 { 341 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 342 343 os_memcpy((PVOID)pWpaCore->WpaSupplParams.client_cert, (PVOID)Filepath, os_strlen((PS8)Filepath)); 344 345 return OK; 346 347 } 348 349 S32 WpaCore_SetPskPassPhrase(THandle hWpaCore, PU8 pPassPhrase) 350 { 351 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 352 353 os_memcpy((PVOID)pWpaCore->WpaSupplParams.pass_phrase, (PVOID)pPassPhrase, os_strlen((PS8)pPassPhrase)); 354 355 return OK; 356 } 357 358 S32 WpaCore_StopSuppl(THandle hWpaCore) 359 { 360 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 361 362 IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"TERMINATE", TRUE); 363 364 return OK; 365 } 366 367 S32 WpaCore_ChangeSupplDebugLevels(THandle hWpaCore, S32 Level1, S32 Level2, S32 Level3) 368 { 369 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 370 S8 cmd[100]; 371 372 os_sprintf(cmd, (PS8)"CHANGE_SUPPLICANT_DEBUG %ld %ld %ld", Level1, Level2, Level3); 373 IpcWpa_Command(pWpaCore->hIpcWpa, cmd, TRUE); 374 375 return OK; 376 } 377 378 S32 WpaCore_AddKey(THandle hWpaCore, OS_802_11_WEP* pKey) 379 { 380 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 381 U32 WepKeyIndx; 382 383 WepKeyIndx = pKey->KeyIndex & 0x7FFFFFFF; 384 385 if ((pKey->KeyIndex & 0x80000000) == 0x80000000) 386 { 387 /* Add "1" to the default wep key index - since "0" is used to indicate no default wep key */ 388 pWpaCore->WpaSupplParams.default_wep_key = WepKeyIndx + 1; 389 } 390 391 /* If key length wasn't set so far - set it according to current key */ 392 if (pWpaCore->WpaSupplParams.wep_key_length == 0) 393 { 394 pWpaCore->WpaSupplParams.wep_key_length = pKey->KeyLength; 395 } 396 else 397 { 398 if (pWpaCore->WpaSupplParams.wep_key_length != pKey->KeyLength) return ECUERR_WPA_CORE_ERROR_KEY_LEN_MUST_BE_SAME; 399 } 400 401 os_memcpy(&pWpaCore->WpaSupplParams.wep_key[WepKeyIndx][0], pKey->KeyMaterial, pKey->KeyLength); 402 403 return OK; 404 } 405 406 S32 WpaCore_GetDefaultKey(THandle hWpaCore, U32* pDefaultKeyIndex) 407 { 408 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 409 410 *pDefaultKeyIndex = pWpaCore->WpaSupplParams.default_wep_key; 411 412 return OK; 413 } 414 415 #ifdef CONFIG_EAP_WSC 416 S32 WpaCore_StartWpsPIN(THandle hWpaCore) 417 { 418 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 419 420 pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PIN; 421 422 return OK; 423 } 424 425 S32 WpaCore_StartWpsPBC(THandle hWpaCore) 426 { 427 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 428 429 pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PBC; 430 431 return OK; 432 } 433 434 S32 WpaCore_StopWps(THandle hWpaCore) 435 { 436 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 437 438 pWpaCore->WpaSupplParams.WscMode = WSC_MODE_OFF; 439 440 return OK; 441 } 442 443 S32 WpaCore_SetPin(THandle hWpaCore, PS8 pPinStr) 444 { 445 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 446 int len = os_strlen(pPinStr); 447 448 if (len == 0) 449 return ECUERR_WPA_CORE_ERROR_IVALID_PIN; 450 451 pWpaCore->WpaSupplParams.pWscPin = (PS8)os_MemoryCAlloc(len, sizeof(char)); 452 if(!pWpaCore->WpaSupplParams.pWscPin) 453 return ECUERR_WPA_CORE_ERROR_CANT_ALLOC_PIN; 454 455 os_strcpy(pWpaCore->WpaSupplParams.pWscPin, pPinStr); 456 457 return OK; 458 } 459 #endif /* CONFIG_EAP_WSC */ 460 461 S32 WpaCore_SetAnyWpaMode(THandle hWpaCore, U8 anyWpaMode) 462 { 463 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 464 465 pWpaCore->WpaSupplParams.anyWpaMode = anyWpaMode; 466 467 return OK; 468 } 469 470 S32 WpaCore_GetAnyWpaMode(THandle hWpaCore, PU8 pAnyWpaMode) 471 { 472 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 473 474 *pAnyWpaMode = pWpaCore->WpaSupplParams.anyWpaMode; 475 476 return OK; 477 } 478 479 480 S32 WpaCore_SetBssType(THandle hWpaCore, U32 BssType) 481 { 482 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 483 484 switch(BssType) 485 { 486 case os802_11IBSS: 487 pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_IBSS; 488 break; 489 case os802_11Infrastructure: 490 pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA; 491 break; 492 default: 493 pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA; 494 break; 495 } 496 497 return OK; 498 } 499 500 S32 WpaCore_GetBssType(THandle hWpaCore, PU32 pBssType) 501 { 502 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 503 504 switch(pWpaCore->WpaSupplParams.mode) 505 { 506 case IEEE80211_MODE_IBSS: 507 *pBssType = os802_11IBSS; 508 break; 509 case IEEE80211_MODE_INFRA: 510 *pBssType = os802_11Infrastructure; 511 break; 512 } 513 514 return OK; 515 } 516 517 S32 WpaCore_SetSsid(THandle hWpaCore, OS_802_11_SSID* ssid, TMacAddr bssid) 518 { 519 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 520 S8 cmd[256]; 521 S8 Resp[IPC_WPA_RESP_MAX_LEN]; 522 PS8 pRespTemp; 523 U32 RespLen; 524 U32 NetworkID; 525 U32 SendCommand; 526 U8 Len; 527 528 #define WPACORE_SETSSID_FAIL \ 529 os_error_printf(CU_MSG_ERROR, (PS8)"Failed to connect to %s\n", ssid->Ssid); \ 530 return ECUERR_WPA_CORE_ERROR_FAILED_CONNECT_SSID; 531 532 /* First Add a new network block*/ 533 os_sprintf(cmd, (PS8)"ADD_NETWORK"); 534 if (IpcWpa_CommandWithResp(pWpaCore->hIpcWpa, cmd, TRUE, Resp, &RespLen)) 535 { 536 WPACORE_SETSSID_FAIL; 537 } 538 NetworkID = os_strtoul(Resp, &pRespTemp, 0); 539 540 /* Set the parameters in the new new network block*/ 541 542 /* Set the BSSID */ 543 if(!((bssid[0] == 0xFF) && 544 (bssid[1] == 0xFF) && 545 (bssid[2] == 0xFF) && 546 (bssid[3] == 0xFF) && 547 (bssid[4] == 0xFF) && 548 (bssid[5] == 0xFF))) 549 { 550 /* set th ebssid only if the bssid doesn't mean any bssid */ 551 S8 temp[20]; 552 os_sprintf(temp, (PS8)"%02x", bssid[0]); 553 os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[1]); 554 os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[2]); 555 os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[3]); 556 os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[4]); 557 os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[5]); 558 os_sprintf(cmd, (PS8)"SET_NETWORK %d bssid %s", NetworkID, temp); 559 560 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, FALSE)) 561 { 562 WPACORE_SETSSID_FAIL; 563 } 564 } 565 566 /* Set the SSID */ 567 os_sprintf(cmd, (PS8)"SET_NETWORK %d ssid \"%s\"", NetworkID, ssid->Ssid); 568 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 569 { 570 WPACORE_SETSSID_FAIL; 571 } 572 573 /* set mode of the new network block */ 574 os_sprintf(cmd, (PS8)"SET_NETWORK %d mode %d", NetworkID, pWpaCore->WpaSupplParams.mode); 575 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 576 { 577 WPACORE_SETSSID_FAIL; 578 } 579 580 /* set proto of the new network block */ 581 SendCommand = TRUE; 582 if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_WPA) 583 { 584 os_sprintf(cmd, (PS8)"SET_NETWORK %d proto WPA", NetworkID); 585 } 586 else if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_RSN) 587 { 588 os_sprintf(cmd, (PS8)"SET_NETWORK %d proto RSN", NetworkID); 589 } 590 else 591 { 592 SendCommand = FALSE; 593 } 594 595 if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 596 { 597 WPACORE_SETSSID_FAIL; 598 } 599 600 /* set key management of the new network block */ 601 SendCommand = TRUE; 602 if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_NONE) 603 { 604 if ((pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP) || 605 (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP) || 606 (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST)) 607 { 608 os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt IEEE8021X", NetworkID); 609 } 610 else 611 os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt NONE", NetworkID); 612 } 613 else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK) 614 os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-PSK", NetworkID); 615 else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_IEEE8021X) 616 #ifdef XCC_MODULE_INCLUDED 617 if((pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_CCKM)||(pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_ALL)) 618 { 619 os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP CCKM", NetworkID); 620 } 621 else 622 #endif 623 os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP", NetworkID); 624 else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_WPA_NONE) 625 os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-NONE", NetworkID); 626 else 627 { 628 SendCommand = FALSE; 629 } 630 631 if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 632 { 633 WPACORE_SETSSID_FAIL; 634 } 635 636 637 /* set authentication alog of the new network block */ 638 SendCommand = TRUE; 639 if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_OPEN) 640 os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg OPEN", NetworkID); 641 else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_SHARED) 642 os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg SHARED", NetworkID); 643 else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_LEAP) 644 os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg LEAP", NetworkID); 645 else 646 { 647 SendCommand = FALSE; 648 } 649 650 if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 651 { 652 WPACORE_SETSSID_FAIL; 653 } 654 655 656 /* set pairwise encryption of the new network block */ 657 SendCommand = TRUE; 658 if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_NONE) 659 os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID); 660 else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40) 661 os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID); 662 else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_TKIP) 663 os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise TKIP", NetworkID); 664 else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0)) 665 os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP", NetworkID); 666 else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1)) 667 os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP TKIP", NetworkID); 668 else 669 { 670 SendCommand = FALSE; 671 } 672 673 if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 674 { 675 WPACORE_SETSSID_FAIL; 676 } 677 678 /* set group encryption of the new network block */ 679 SendCommand = TRUE; 680 if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_WEP40) 681 os_sprintf(cmd, (PS8)"SET_NETWORK %d group WEP40", NetworkID); 682 else if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_TKIP) 683 os_sprintf(cmd, (PS8)"SET_NETWORK %d group TKIP", NetworkID); 684 else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0)) 685 os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP", NetworkID); 686 else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1)) 687 os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP TKIP", NetworkID); 688 else 689 { 690 SendCommand = FALSE; 691 } 692 693 if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 694 { 695 WPACORE_SETSSID_FAIL; 696 } 697 698 699 /* set eap of the new network block */ 700 if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_NONE) 701 SendCommand = FALSE; 702 else 703 { 704 SendCommand = TRUE; 705 if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MD5_CHALLENGE) 706 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MD5", NetworkID); 707 else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_GENERIC_TOKEN_CARD) 708 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap GTC", NetworkID); 709 else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TLS) 710 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TLS", NetworkID); 711 else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TTLS) 712 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TTLS", NetworkID); 713 else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP) 714 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap PEAP", NetworkID); 715 else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MS_CHAP_V2) 716 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MSCHAPV2", NetworkID); 717 #ifdef XCC_MODULE_INCLUDED 718 else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP) 719 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap LEAP", NetworkID); 720 else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST) 721 os_sprintf(cmd, (PS8)"SET_NETWORK %d eap FAST", NetworkID); 722 #endif 723 else 724 SendCommand = FALSE; 725 } 726 727 728 if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 729 { 730 WPACORE_SETSSID_FAIL; 731 } 732 733 if (pWpaCore->WpaSupplParams.Identity[0]) 734 { 735 os_sprintf(cmd, (PS8)"SET_NETWORK %d identity \"%s\"", NetworkID,pWpaCore->WpaSupplParams.Identity); 736 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 737 { 738 WPACORE_SETSSID_FAIL; 739 } 740 } 741 742 if (pWpaCore->WpaSupplParams.client_cert[0]) 743 { 744 os_sprintf(cmd, (PS8)"SET_NETWORK %d client_cert \"%s\"", NetworkID,pWpaCore->WpaSupplParams.client_cert); 745 746 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 747 { 748 WPACORE_SETSSID_FAIL; 749 } 750 751 } 752 753 754 if (pWpaCore->WpaSupplParams.client_cert[0]) 755 { 756 757 Len = os_strlen ((PS8)pWpaCore->WpaSupplParams.client_cert); 758 os_memcpy(pWpaCore->WpaSupplParams.private_key,pWpaCore->WpaSupplParams.client_cert,Len); 759 os_memcpy(&pWpaCore->WpaSupplParams.private_key[Len-3],"pem",3); 760 761 os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key); 762 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 763 { 764 WPACORE_SETSSID_FAIL; 765 } 766 } 767 768 if (pWpaCore->WpaSupplParams.private_key_passwd[0] ) 769 { 770 os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key_passwd \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key_passwd); 771 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 772 { 773 WPACORE_SETSSID_FAIL; 774 } 775 } 776 777 if (pWpaCore->WpaSupplParams.password[0] ) 778 { 779 os_sprintf(cmd, (PS8)"SET_NETWORK %d password \"%s\"", NetworkID,pWpaCore->WpaSupplParams.password); 780 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 781 { 782 WPACORE_SETSSID_FAIL; 783 } 784 785 } 786 787 788 if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST) 789 { 790 os_sprintf(cmd, (PS8)"SET_NETWORK %d phase1 \"fast_provisioning=3\"", NetworkID); 791 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 792 { 793 WPACORE_SETSSID_FAIL; 794 } 795 796 os_sprintf(cmd, (PS8)"SET_NETWORK %d pac_file \"/etc/wpa_supplicant.eap-fast-pac\"", NetworkID); 797 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 798 { 799 WPACORE_SETSSID_FAIL; 800 } 801 802 os_sprintf(cmd, (PS8)"SET_NETWORK %d anonymous_identity \"anonymous\"", NetworkID); 803 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 804 { 805 WPACORE_SETSSID_FAIL; 806 } 807 808 } 809 810 if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40) 811 { 812 S32 idx, idx2; 813 814 for (idx=0; idx<4; idx++) 815 { 816 S8 TempBuf[3]; 817 os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_key%d ", NetworkID, idx); 818 for (idx2=0; idx2 < pWpaCore->WpaSupplParams.wep_key_length; idx2++) 819 { 820 os_sprintf(TempBuf, (PS8)"%02x", pWpaCore->WpaSupplParams.wep_key[idx][idx2]); 821 os_strcat (cmd, TempBuf); 822 } 823 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 824 { 825 WPACORE_SETSSID_FAIL; 826 } 827 } 828 os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_tx_keyidx %d", NetworkID, pWpaCore->WpaSupplParams.default_wep_key-1); 829 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 830 { 831 WPACORE_SETSSID_FAIL; 832 } 833 } 834 835 if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK) 836 { 837 os_sprintf(cmd, (PS8)"SET_NETWORK %d psk \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pass_phrase); 838 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 839 { 840 WPACORE_SETSSID_FAIL; 841 } 842 } 843 844 845 #ifdef CONFIG_EAP_WSC 846 if (pWpaCore->WpaSupplParams.WscMode) 847 { 848 os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_mode %d", NetworkID, pWpaCore->WpaSupplParams.WscMode); 849 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 850 { 851 WPACORE_SETSSID_FAIL; 852 } 853 } 854 if (pWpaCore->WpaSupplParams.pWscPin) 855 { 856 os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_pin \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pWscPin); 857 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 858 { 859 WPACORE_SETSSID_FAIL; 860 } 861 } 862 #endif 863 864 /* Finaly Connect to the new network block */ 865 os_sprintf(cmd, (PS8)"SELECT_NETWORK %d", NetworkID); 866 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0)) 867 { 868 WPACORE_SETSSID_FAIL; 869 } 870 871 pWpaCore->CurrentNetwork = NetworkID; 872 IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 1); 873 874 /* 875 init the connection params thus the next time we connect we will by default 876 connect to an open 877 */ 878 WpaCore_InitWpaParams(pWpaCore); 879 880 return OK; 881 } 882 883 S32 WpaCore_Disassociate(THandle hWpaCore) 884 { 885 TWpaCore* pWpaCore = (TWpaCore*)hWpaCore; 886 S8 cmd[256]; 887 888 os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork); 889 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1)) 890 { 891 os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n"); 892 return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID; 893 } 894 895 pWpaCore->CurrentNetwork = -1; 896 IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0); 897 898 #if 0 /* for futur WPS work */ 899 if(pWpaCore->CurrentNetwork == -1) 900 { 901 os_sprintf(cmd, (PS8)"LIST_NETWORKS"); 902 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1)) 903 { 904 os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n"); 905 return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID; 906 } 907 } 908 else 909 { 910 os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork); 911 if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1)) 912 { 913 os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n"); 914 return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID; 915 } 916 917 pWpaCore->CurrentNetwork = -1; 918 IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0); 919 } 920 #endif /* #if 0 for futur WPS work */ 921 922 return OK; 923 } 924 925