static uint32 wpssta_reg_config_init(wpssta_wksp_t *sta_wksp, char *ifname, char *bssid, char oob) { DevInfo info; char *value, *next; int auth = 0; char mac[6]; char ssid[MAX_SSID_LEN + 1] = {0}; char psk[MAX_USER_KEY_LEN + 1] = {0}; char akmstr[32]; char key[8]; unsigned int akm = 0; unsigned int wsec = 0; int wep_index = 0; /* wep key index */ char *wep_key = NULL; /* user-supplied wep key */ char dev_akm[64] = {0}; char dev_crypto[64] = {0}; char prefix[] = "wlXXXXXXXXXX_"; char tmp[100]; uint32 ret; /* TBD, is going to use osname only */ sprintf(prefix, "%s_", ifname); /* fill in device specific info. */ memset((char *)(&info), 0, sizeof(info)); info.version = WPS_VERSION; /* MAC addr */ wps_osl_get_mac(mac); memcpy(info.macAddr, mac, 6); memcpy(info.uuid, wps_get_uuid(), SIZE_16_BYTES); strcpy(info.deviceName, "Broadcom Registrar"); info.primDeviceCategory = WPS_DEVICE_TYPE_CAT_NW_INFRA; info.primDeviceOui = 0x0050F204; info.primDeviceSubCategory = WPS_DEVICE_TYPE_SUB_CAT_NW_GATEWAY; strcpy(info.manufacturer, "Broadcom"); strcpy(info.modelName, "WPS Wireless Registrar"); strcpy(info.modelNumber, "1234"); strcpy(info.serialNumber, "5678"); if (b_wps_version2) { info.configMethods = (WPS_CONFMET_VIRT_PBC | WPS_CONFMET_PHY_PBC | WPS_CONFMET_VIRT_DISPLAY); } else { info.configMethods = WPS_CONFMET_PBC | WPS_CONFMET_DISPLAY; } /* WSC 2.0, WPS-PSK and SHARED are deprecated. * When both the Registrar and the Enrollee are using protocol version 2.0 * or newer, this variable can use the value 0x0022 to indicate mixed mode * operation (both WPA-Personal and WPA2-Personal enabled) */ if (b_wps_version2) { info.authTypeFlags = (uint16)(WPS_AUTHTYPE_OPEN | WPS_AUTHTYPE_WPAPSK | WPS_AUTHTYPE_WPA2PSK); } else { info.authTypeFlags = (uint16)(WPS_AUTHTYPE_OPEN | WPS_AUTHTYPE_WPAPSK | WPS_AUTHTYPE_SHARED | WPS_AUTHTYPE_WPA2PSK); } /* ENCR_TYPE_FLAGS */ /* * WSC 2.0, deprecated WEP. TKIP can only be advertised on the AP when * Mixed Mode is enabled (Encryption Type is 0x000c) */ if (b_wps_version2) { info.encrTypeFlags = (uint16)(WPS_ENCRTYPE_NONE | WPS_ENCRTYPE_TKIP | WPS_ENCRTYPE_AES); } else { info.encrTypeFlags = (uint16)(WPS_ENCRTYPE_NONE | WPS_ENCRTYPE_WEP | WPS_ENCRTYPE_TKIP | WPS_ENCRTYPE_AES); } info.connTypeFlags = WPS_CONNTYPE_ESS; info.rfBand = WPS_RFBAND_24GHZ; info.osVersion = 0x80000000; info.featureId = 0x80000000; /* WSC 2.0 */ if (b_wps_version2) { value = wps_get_conf("wps_version2_num"); info.version2 = (uint8)(strtoul(value, NULL, 16)); info.settingsDelayTime = WPS_SETTING_DELAY_TIME_ROUTER; info.b_reqToEnroll = FALSE; info.b_nwKeyShareable = FALSE; } if (sta_wksp->configap == true) { /* * Before check oob mode, we have to * get ssid, akm, wep, crypto and mgmt key from config. * because oob mode might change the settings. */ value = wps_safe_get_conf(strcat_r(prefix, "ssid", tmp)); strncpy(ssid, value, MAX_SSID_LEN); value = wps_safe_get_conf(strcat_r(prefix, "akm", tmp)); foreach(akmstr, value, next) { if (!strcmp(akmstr, "psk")) akm |= WPA_AUTH_PSK; if (!strcmp(akmstr, "psk2")) akm |= WPA2_AUTH_PSK; } value = wps_safe_get_conf(strcat_r(prefix, "wep", tmp)); wsec = !strcmp(value, "enabled") ? WEP_ENABLED : 0; value = wps_safe_get_conf(strcat_r(prefix, "crypto", tmp)); if (WPS_WLAKM_PSK(akm) || WPS_WLAKM_PSK2(akm)) { if (!strcmp(value, "tkip")) wsec |= TKIP_ENABLED; else if (!strcmp(value, "aes")) wsec |= AES_ENABLED; else if (!strcmp(value, "tkip+aes")) wsec |= TKIP_ENABLED|AES_ENABLED; /* Set PSK key */ value = wps_safe_get_conf(strcat_r(prefix, "wpa_psk", tmp)); strncpy(psk, value, MAX_USER_KEY_LEN); psk[MAX_USER_KEY_LEN] = 0; } if (wsec & WEP_ENABLED) { /* Key index */ value = wps_safe_get_conf(strcat_r(prefix, "key", tmp)); wep_index = (int)strtoul(value, NULL, 0); /* Key */ sprintf(key, "key%s", value); wep_key = wps_safe_get_conf(strcat_r(prefix, key, tmp)); } /* Caution: wps_oob will over-write akm and wsec */ if (oob) { /* Generate random ssid and key */ if (wps_gen_ssid(ssid, sizeof(ssid), wps_get_conf("wps_random_ssid_prefix"), wps_safe_get_conf("wl0_hwaddr")) == FALSE || wps_gen_key(psk, sizeof(psk)) == FALSE) return WPS_ERR_SYSTEM; /* Open */ auth = 0; /* PSK, PSK2 */ akm = WPA_AUTH_PSK | WPA2_AUTH_PSK; wsec = AES_ENABLED; } /* * Let the user have a chance to override the credential. */ if (WPS_WLAKM_BOTH(akm)) strcpy(dev_akm, "WPA-PSK WPA2-PSK"); else if (WPS_WLAKM_PSK(akm)) strcpy(dev_akm, "WPA-PSK"); else if (WPS_WLAKM_PSK2(akm)) strcpy(dev_akm, "WPA2-PSK"); else dev_akm[0] = 0; /* Encryption algorithm */ if (WPS_WLENCR_BOTH(wsec)) strcpy(dev_crypto, "AES+TKIP"); else if (WPS_WLENCR_TKIP(wsec)) strcpy(dev_crypto, "TKIP"); else if (WPS_WLENCR_AES(wsec)) strcpy(dev_crypto, "AES"); else dev_crypto[0] = 0; /* Do customization, and check credentials again */ wpssta_update_custom_cred(ssid, psk, dev_akm, dev_crypto, oob, b_wps_version2); /* * After doing customized credentials modification, * fill ssid, psk, akm and crypto to ap_deviceinfo */ strcpy(info.ssid, ssid); /* Parsing return amk and crypto */ if (strlen(dev_akm)) { if (!strcmp(dev_akm, "WPA-PSK WPA2-PSK")) akm = WPA_AUTH_PSK | WPA2_AUTH_PSK; else if (!strcmp(dev_akm, "WPA-PSK")) akm = WPA_AUTH_PSK; else if (!strcmp(dev_akm, "WPA2-PSK")) akm = WPA2_AUTH_PSK; } if (strlen(dev_crypto)) { if (!strcmp(dev_crypto, "AES+TKIP")) wsec = AES_ENABLED | TKIP_ENABLED; else if (!strcmp(dev_crypto, "AES")) wsec = AES_ENABLED; else if (!strcmp(dev_crypto, "TKIP")) wsec = TKIP_ENABLED; } /* KEY MGMT */ /* WSC 2.0, deprecated SHARED */ if (auth) { strcpy(info.keyMgmt, "SHARED"); if (b_wps_version2 && !oob) { TUTRACE((TUTRACE_INFO, "wpssta_readConfigure: Error in configuration," "Authentication type is Shared, violate WSC 2.0\n")); return MC_ERR_CFGFILE_CONTENT; } } else { if (WPS_WLAKM_BOTH(akm)) strcpy(info.keyMgmt, "WPA-PSK WPA2-PSK"); else if (WPS_WLAKM_PSK(akm)) strcpy(info.keyMgmt, "WPA-PSK"); else if (WPS_WLAKM_PSK2(akm)) strcpy(info.keyMgmt, "WPA2-PSK"); else info.keyMgmt[0] = 0; } /* WEP index */ info.wep = (wsec & WEP_ENABLED) ? 1 : 0; /* Set crypto algorithm */ info.crypto = 0; if (wsec & TKIP_ENABLED) info.crypto |= WPS_ENCRTYPE_TKIP; if (wsec & AES_ENABLED) info.crypto |= WPS_ENCRTYPE_AES; if (info.crypto == 0) info.crypto = WPS_ENCRTYPE_TKIP; /* WSC 2.0 */ if (b_wps_version2) { /* Version 2 */ value = wps_get_conf("wps_version2_num"); info.version2 = (uint8)(strtoul(value, NULL, 16)); /* Setting Delay Time */ info.settingsDelayTime = WPS_SETTING_DELAY_TIME_ROUTER; } ret = wps_enr_reg_config_init(&info, psk, strlen(psk), bssid); } /* configap == true */
static uint32 wpssta_reg_config_init(wpssta_wksp_t *sta_wksp, char *ifname, char *bssid, char oob) { DevInfo info; char *value, *next; int auth = 0; char mac[6]; char ssid[MAX_SSID_LEN + 1] = {0}; char psk[MAX_USER_KEY_LEN + 1] = {0}; char akmstr[32]; char key[8]; unsigned int akm = 0; unsigned int wsec = 0; int wep_index = 0; /* wep key index */ char *wep_key = NULL; /* user-supplied wep key */ char dev_akm[64] = {0}; char dev_crypto[64] = {0}; char prefix[] = "wlXXXXXXXXXX_"; char tmp[100]; /* TBD, is going to use osname only */ sprintf(prefix, "%s_", ifname); /* fill in device specific info. */ memset((char *)(&info), 0, sizeof(info)); info.version = WPS_VERSION; /* MAC addr */ wps_osl_get_mac(mac); memcpy(info.macAddr, mac, 6); memcpy(info.uuid, wps_get_uuid(), SIZE_16_BYTES); if ((value = wps_get_conf("wps_sta_device_name")) == NULL) value = "ASUSTeK Registrar"; wps_strncpy(info.deviceName, value, sizeof(info.deviceName)); info.primDeviceCategory = WPS_DEVICE_TYPE_CAT_NW_INFRA; info.primDeviceOui = 0x0050F204; info.primDeviceSubCategory = WPS_DEVICE_TYPE_SUB_CAT_NW_GATEWAY; strcpy(info.manufacturer, "ASUSTeK"); strcpy(info.modelName, "WPS Wireless Registrar"); strcpy(info.modelNumber, "1234"); strcpy(info.serialNumber, "5678"); if (b_wps_version2) { info.configMethods = (WPS_CONFMET_VIRT_PBC | WPS_CONFMET_PHY_PBC | WPS_CONFMET_VIRT_DISPLAY); } else { info.configMethods = WPS_CONFMET_PBC | WPS_CONFMET_DISPLAY; } /* WSC 2.0, WPS-PSK and SHARED are deprecated. * When both the Registrar and the Enrollee are using protocol version 2.0 * or newer, this variable can use the value 0x0022 to indicate mixed mode * operation (both WPA-Personal and WPA2-Personal enabled) */ if (b_wps_version2) { info.authTypeFlags = (uint16)(WPS_AUTHTYPE_OPEN | WPS_AUTHTYPE_WPAPSK | WPS_AUTHTYPE_WPA2PSK); } else { info.authTypeFlags = (uint16)(WPS_AUTHTYPE_OPEN | WPS_AUTHTYPE_WPAPSK | WPS_AUTHTYPE_SHARED | WPS_AUTHTYPE_WPA2PSK); } /* ENCR_TYPE_FLAGS */ /* * WSC 2.0, deprecated WEP. TKIP can only be advertised on the AP when * Mixed Mode is enabled (Encryption Type is 0x000c) */ if (b_wps_version2) { info.encrTypeFlags = (uint16)(WPS_ENCRTYPE_NONE | WPS_ENCRTYPE_TKIP | WPS_ENCRTYPE_AES); } else { info.encrTypeFlags = (uint16)(WPS_ENCRTYPE_NONE | WPS_ENCRTYPE_WEP | WPS_ENCRTYPE_TKIP | WPS_ENCRTYPE_AES); } info.connTypeFlags = WPS_CONNTYPE_ESS; info.rfBand = WPS_RFBAND_24GHZ; info.osVersion = 0x80000000; info.featureId = 0x80000000; /* WSC 2.0 */ if (b_wps_version2) { value = wps_get_conf("wps_version2_num"); info.version2 = (uint8)(strtoul(value, NULL, 16)); info.settingsDelayTime = WPS_SETTING_DELAY_TIME_ROUTER; info.b_reqToEnroll = FALSE; info.b_nwKeyShareable = FALSE; } if (!sta_wksp->configap) { /* We don't care about our settings. All we want is get ap credential, * so, empty sta credential is okay. The state machine sends NACK, * when M7AP received. */ return wpssta_reg_init(&info, NULL, NULL); } /* Want to config AP with the STA registrar's crendentials */ if ((value = wps_ui_get_env("wps_ssid")) && strcmp(value, "") != 0) { /* SSID */ value = wps_ui_get_env("wps_ssid"); strncpy(ssid, value, MAX_SSID_LEN); /* AKM */ value = wps_ui_get_env("wps_akm"); foreach(akmstr, value, next) { if (!strcmp(akmstr, "psk")) akm |= WPA_AUTH_PSK; if (!strcmp(akmstr, "psk2")) akm |= WPA2_AUTH_PSK; } switch (akm) { case 0: case WPA2_AUTH_PSK: case (WPA_AUTH_PSK | WPA2_AUTH_PSK): break; default: TUTRACE((TUTRACE_INFO, "wpsap_readConfigure: Error in AKM\n")); return MC_ERR_CFGFILE_CONTENT; } /* Crypto */ if (akm) { value = wps_ui_get_env("wps_crypto"); if (!strcmp(value, "aes")) wsec = AES_ENABLED; else if (!strcmp(value, "tkip+aes")) wsec = TKIP_ENABLED|AES_ENABLED; else { TUTRACE((TUTRACE_INFO, "wpsap_readConfigure: Error in crypto\n")); return MC_ERR_CFGFILE_CONTENT; } /* Set PSK key */ value = wps_ui_get_env("wps_psk"); strncpy(psk, value, MAX_USER_KEY_LEN); psk[MAX_USER_KEY_LEN] = 0; } }