16474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org/* 212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * WPA Supplicant / Configuration backend: Windows registry 312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * Copyright (c) 2003-2008, Jouni Malinen <j@w1.fi> 412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * 512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * This software may be distributed under the terms of the BSD license. 612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * See README for more details. 712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * 812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * This file implements a configuration backend for Windows registry. All the 96474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org * configuration information is stored in the registry and the format for 106474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org * network configuration fields is same as described in the sample 11d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org * configuration file, wpa_supplicant.conf. 1212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * 1312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * Configuration data is in 1412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * \a HKEY_LOCAL_MACHINE\\SOFTWARE\\%wpa_supplicant\\configs 1512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * key. Each configuration profile has its own key under this. In terms of text 1612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * files, each profile would map to a separate text file with possibly multiple 1712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * networks. Under each profile, there is a networks key that lists all 1812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org * networks as a subkey. Each network has set of values in the same way as 196474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org * network block in the configuration file. In addition, blobs subkey has 206474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org * possible blobs as values. 216474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org * 226474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org * Example network configuration block: 236474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org * \verbatim 246474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgHKEY_LOCAL_MACHINE\SOFTWARE\wpa_supplicant\configs\test\networks\0000 256474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ssid="example" 266474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org key_mgmt=WPA-PSK 276474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org\endverbatim 286474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org */ 2912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 306474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#include "includes.h" 316474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 326474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#include "common.h" 336474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#include "uuid.h" 346474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#include "config.h" 356474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 366474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#ifndef WPA_KEY_ROOT 376474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#define WPA_KEY_ROOT HKEY_LOCAL_MACHINE 386474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#endif 396474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#ifndef WPA_KEY_PREFIX 406474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#define WPA_KEY_PREFIX TEXT("SOFTWARE\\wpa_supplicant") 416474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#endif 426474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 436474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#ifdef UNICODE 446474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#define TSTR "%S" 456474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#else /* UNICODE */ 4612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define TSTR "%s" 4712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif /* UNICODE */ 486474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 496474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 506474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstatic int wpa_config_read_blobs(struct wpa_config *config, HKEY hk) 516474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org{ 526474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org struct wpa_config_blob *blob; 5312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int errors = 0; 546474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org HKEY bhk; 556474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org LONG ret; 566474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DWORD i; 576474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 586474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ret = RegOpenKeyEx(hk, TEXT("blobs"), 0, KEY_QUERY_VALUE, &bhk); 596474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (ret != ERROR_SUCCESS) { 606474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_printf(MSG_DEBUG, "Could not open wpa_supplicant config " 616474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org "blobs key"); 626474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return 0; /* assume no blobs */ 636474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 646474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 656474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org for (i = 0; ; i++) { 666474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org#define TNAMELEN 255 676474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org TCHAR name[TNAMELEN]; 686474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org char data[4096]; 696474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DWORD namelen, datalen, type; 706474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 716474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org namelen = TNAMELEN; 726474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org datalen = sizeof(data); 736474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ret = RegEnumValue(bhk, i, name, &namelen, NULL, &type, 746474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org (LPBYTE) data, &datalen); 756474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 766474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (ret == ERROR_NO_MORE_ITEMS) 776474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org break; 786474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 796474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (ret != ERROR_SUCCESS) { 806474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_printf(MSG_DEBUG, "RegEnumValue failed: 0x%x", 816474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org (unsigned int) ret); 826474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org break; 836474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 846474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (namelen >= TNAMELEN) 866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org namelen = TNAMELEN - 1; 876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org name[namelen] = TEXT('\0'); 886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_unicode2ascii_inplace(name); 896474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 906474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (datalen >= sizeof(data)) 916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org datalen = sizeof(data) - 1; 9212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 9312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_MSGDUMP, "blob %d: field='%s' len %d", 9412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (int) i, name, (int) datalen); 95eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org 96eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org blob = os_zalloc(sizeof(*blob)); 97eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org if (blob == NULL) { 98e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org errors++; 99e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org break; 10012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 10112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org blob->name = os_strdup((char *) name); 10212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org blob->data = os_malloc(datalen); 10312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (blob->name == NULL || blob->data == NULL) { 10412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_free_blob(blob); 10512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 10612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 10712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 10812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_memcpy(blob->data, data, datalen); 10912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org blob->len = datalen; 11012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_set_blob(config, blob); 11212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 11312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org RegCloseKey(bhk); 11512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return errors ? -1 : 0; 11712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 11812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic int wpa_config_read_reg_dword(HKEY hk, const TCHAR *name, int *_val) 12112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 12212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DWORD val, buflen; 12312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LONG ret; 12412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org buflen = sizeof(val); 12612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegQueryValueEx(hk, name, NULL, NULL, (LPBYTE) &val, &buflen); 12712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret == ERROR_SUCCESS && buflen == sizeof(val)) { 12812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_DEBUG, TSTR "=%d", name, (int) val); 12912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org *_val = val; 13012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 0; 13112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 13212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 1336474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return -1; 1346474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org} 13512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 13612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 13712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic char * wpa_config_read_reg_string(HKEY hk, const TCHAR *name) 13812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 13912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DWORD buflen; 140eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org LONG ret; 141eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org TCHAR *val; 14212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 14312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org buflen = 0; 14412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegQueryValueEx(hk, name, NULL, NULL, NULL, &buflen); 14512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) 14612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 14712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org val = os_malloc(buflen); 14812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (val == NULL) 14912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 15012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegQueryValueEx(hk, name, NULL, NULL, (LPBYTE) val, &buflen); 15212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 15312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(val); 15412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 15512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 15612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_unicode2ascii_inplace(val); 15812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_DEBUG, TSTR "=%s", name, (char *) val); 15912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return (char *) val; 16012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 16112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 163eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org#ifdef CONFIG_WPS 164eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.orgstatic int wpa_config_read_global_uuid(struct wpa_config *config, HKEY hk) 165eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org{ 16612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char *str; 16712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int ret = 0; 16812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org str = wpa_config_read_reg_string(hk, TEXT("uuid")); 17012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (str == NULL) 17112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 0; 1726474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 1736474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (uuid_str2bin(str, config->uuid)) 1746474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ret = -1; 175eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org 176eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org os_free(str); 177eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org 17812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return ret; 179e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org} 18012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 18112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 18212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic int wpa_config_read_global_os_version(struct wpa_config *config, 18312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HKEY hk) 18412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 18512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char *str; 18612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int ret = 0; 1876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 1886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org str = wpa_config_read_reg_string(hk, TEXT("os_version")); 189e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (str == NULL) 190e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org return 0; 191e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 192e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (hexstr2bin(str, config->os_version, 4)) 193e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org ret = -1; 194e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 195e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org os_free(str); 196e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 197e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org return ret; 198e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org} 199e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#endif /* CONFIG_WPS */ 200e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 201e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 202e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.orgstatic int wpa_config_read_global(struct wpa_config *config, HKEY hk) 203e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org{ 204e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org int errors = 0; 2056474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org int val; 2066474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 207e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("ap_scan"), &config->ap_scan); 208e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("fast_reauth"), 209e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org &config->fast_reauth); 210e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("dot11RSNAConfigPMKLifetime"), 211e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (int *) &config->dot11RSNAConfigPMKLifetime); 212e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, 213e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org TEXT("dot11RSNAConfigPMKReauthThreshold"), 214e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (int *) 215e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org &config->dot11RSNAConfigPMKReauthThreshold); 216e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("dot11RSNAConfigSATimeout"), 217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (int *) &config->dot11RSNAConfigSATimeout); 218e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("update_config"), 219e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org &config->update_config); 220e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 221e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (wpa_config_read_reg_dword(hk, TEXT("eapol_version"), 222e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org &config->eapol_version) == 0) { 223e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (config->eapol_version < 1 || 2246474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org config->eapol_version > 2) { 225e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_printf(MSG_ERROR, "Invalid EAPOL version (%d)", 226e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->eapol_version); 2276474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org errors++; 228e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 229e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 230e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 231e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->ctrl_interface = wpa_config_read_reg_string( 232e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org hk, TEXT("ctrl_interface")); 233e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 234e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#ifdef CONFIG_WPS 235e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (wpa_config_read_global_uuid(config, hk)) 236e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org errors++; 237e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->device_name = wpa_config_read_reg_string( 238e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org hk, TEXT("device_name")); 2396474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org config->manufacturer = wpa_config_read_reg_string( 2406474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org hk, TEXT("manufacturer")); 241e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->model_name = wpa_config_read_reg_string( 242e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org hk, TEXT("model_name")); 243e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->serial_number = wpa_config_read_reg_string( 244e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org hk, TEXT("serial_number")); 245e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org { 246e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org char *t = wpa_config_read_reg_string( 2476474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org hk, TEXT("device_type")); 248e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (t && wps_dev_type_str2bin(t, config->device_type)) 249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org errors++; 250e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org os_free(t); 251e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 252e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->config_methods = wpa_config_read_reg_string( 253e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org hk, TEXT("config_methods")); 254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (wpa_config_read_global_os_version(config, hk)) 255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org errors++; 256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("wps_cred_processing"), 257e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org &config->wps_cred_processing); 258e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#endif /* CONFIG_WPS */ 259e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#ifdef CONFIG_P2P 260e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->p2p_ssid_postfix = wpa_config_read_reg_string( 261e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org hk, TEXT("p2p_ssid_postfix")); 262e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("p2p_group_idle"), 263e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (int *) &config->p2p_group_idle); 264e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#endif /* CONFIG_P2P */ 265e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 266e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("bss_max_count"), 267e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (int *) &config->bss_max_count); 268e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("filter_ssids"), 269e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org &config->filter_ssids); 270e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("max_num_sta"), 271e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (int *) &config->max_num_sta); 272e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("disassoc_low_ack"), 273e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (int *) &config->disassoc_low_ack); 274e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 275e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("okc"), &config->okc); 2766474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_config_read_reg_dword(hk, TEXT("pmf"), &val); 277e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->pmf = val; 278e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 279e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org return errors ? -1 : 0; 280e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org} 281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 282e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.orgstatic struct wpa_ssid * wpa_config_read_network(HKEY hk, const TCHAR *netw, 284e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org int id) 2856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org{ 2866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org HKEY nhk; 2879aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LONG ret; 2889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DWORD i; 2896474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org struct wpa_ssid *ssid; 2906474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org int errors = 0; 2916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 2926474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ret = RegOpenKeyEx(hk, netw, 0, KEY_QUERY_VALUE, &nhk); 2936474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (ret != ERROR_SUCCESS) { 2946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_printf(MSG_DEBUG, "Could not open wpa_supplicant config " 2956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org "network '" TSTR "'", netw); 2966474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return NULL; 2976474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 2986474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 2996474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_printf(MSG_MSGDUMP, "Start of a new network '" TSTR "'", netw); 3009aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org ssid = os_zalloc(sizeof(*ssid)); 3019aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if (ssid == NULL) { 3026474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org RegCloseKey(nhk); 3036474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return NULL; 3046474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 3056474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org dl_list_init(&ssid->psk_list); 3066474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ssid->id = id; 3076474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 308e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_set_network_defaults(ssid); 309e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 310e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org for (i = 0; ; i++) { 311e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org TCHAR name[255], data[1024]; 312e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DWORD namelen, datalen, type; 313e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 314e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org namelen = 255; 315e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org datalen = sizeof(data); 316e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org ret = RegEnumValue(nhk, i, name, &namelen, NULL, &type, 317e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (LPBYTE) data, &datalen); 318e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 319e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (ret == ERROR_NO_MORE_ITEMS) 32012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 32112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 32212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 32312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_ERROR, "RegEnumValue failed: 0x%x", 32412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (unsigned int) ret); 32512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 32612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 327eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org 328e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (namelen >= 255) 329e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org namelen = 255 - 1; 330e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org name[namelen] = TEXT('\0'); 33112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 33212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (datalen >= 1024) 33312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org datalen = 1024 - 1; 33412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org data[datalen] = TEXT('\0'); 33512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 33612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_unicode2ascii_inplace(name); 33712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_unicode2ascii_inplace(data); 338e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (wpa_config_set(ssid, (char *) name, (char *) data, 0) < 0) 33912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 34012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 341e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 34212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org RegCloseKey(nhk); 34312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 34412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ssid->passphrase) { 34512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ssid->psk_set) { 34612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_ERROR, "Both PSK and passphrase " 34712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "configured for network '" TSTR "'.", netw); 34812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 34912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 35012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_update_psk(ssid); 35112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 35212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 35312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if ((ssid->group_cipher & WPA_CIPHER_CCMP) && 35412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !(ssid->pairwise_cipher & WPA_CIPHER_CCMP) && 35512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !(ssid->pairwise_cipher & WPA_CIPHER_NONE)) { 35612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org /* Group cipher cannot be stronger than the pairwise cipher. */ 35712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_DEBUG, "Removed CCMP from group cipher " 35812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "list since it was not allowed for pairwise " 35912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "cipher for network '" TSTR "'.", netw); 36012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ssid->group_cipher &= ~WPA_CIPHER_CCMP; 36112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 36212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 36312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (errors) { 36412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_free_ssid(ssid); 36512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ssid = NULL; 36612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 36712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 368d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org return ssid; 369d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org} 370d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org 37112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 37212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic int wpa_config_read_networks(struct wpa_config *config, HKEY hk) 37312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 37412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HKEY nhk; 37512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org struct wpa_ssid *ssid, *tail = NULL, *head = NULL; 37612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int errors = 0; 37712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LONG ret; 37812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DWORD i; 3796474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 3806474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ret = RegOpenKeyEx(hk, TEXT("networks"), 0, KEY_ENUMERATE_SUB_KEYS, 38112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org &nhk); 38212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 38312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_ERROR, "Could not open wpa_supplicant networks " 38412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "registry key"); 38512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return -1; 38612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 3870ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com 388e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org for (i = 0; ; i++) { 38912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org TCHAR name[255]; 39012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DWORD namelen; 39112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 3920ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com namelen = 255; 39312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegEnumKeyEx(nhk, i, name, &namelen, NULL, NULL, NULL, 39412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org NULL); 39512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 39612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret == ERROR_NO_MORE_ITEMS) 39712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 39812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 3996474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (ret != ERROR_SUCCESS) { 4006474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_printf(MSG_DEBUG, "RegEnumKeyEx failed: 0x%x", 4016474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org (unsigned int) ret); 40212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 40312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 40412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 40512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (namelen >= 255) 40612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org namelen = 255 - 1; 40712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org name[namelen] = '\0'; 40812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 40912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ssid = wpa_config_read_network(nhk, name, i); 4106474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (ssid == NULL) { 4116474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_printf(MSG_ERROR, "Failed to parse network " 41212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "profile '%s'.", name); 41312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 41412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org continue; 415e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 41612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (head == NULL) { 41712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org head = tail = ssid; 41812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 41912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org tail->next = ssid; 42012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org tail = ssid; 42112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 42212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (wpa_config_add_prio_network(config, ssid)) { 42312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_ERROR, "Failed to add network profile " 42412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "'%s' to priority list.", name); 42512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 42612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org continue; 4270ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com } 42812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 42912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4306474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org RegCloseKey(nhk); 4316474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 43212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->ssid = head; 43312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4340ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com return errors ? -1 : 0; 43512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 43612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 43712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 43812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstruct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp) 43912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 44012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org TCHAR buf[256]; 44112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int errors = 0; 44212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org struct wpa_config *config; 44312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HKEY hk; 44412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LONG ret; 44512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4466474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (name == NULL) 4476474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return NULL; 4486474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (cfgp) 44912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config = cfgp; 45012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org else 45112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config = wpa_config_alloc_empty(NULL, NULL); 45212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (config == NULL) 45312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 4546474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_printf(MSG_DEBUG, "Reading configuration profile '%s'", name); 45512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 45612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef UNICODE 45712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org _snwprintf(buf, 256, WPA_KEY_PREFIX TEXT("\\configs\\%S"), name); 45812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#else /* UNICODE */ 45912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_snprintf(buf, 256, WPA_KEY_PREFIX TEXT("\\configs\\%s"), name); 46012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif /* UNICODE */ 46112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 46212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegOpenKeyEx(WPA_KEY_ROOT, buf, 0, KEY_QUERY_VALUE, &hk); 46312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 46412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_ERROR, "Could not open wpa_supplicant " 46512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "configuration registry HKLM\\" TSTR, buf); 4666474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org os_free(config); 4676474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org return NULL; 4686474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 46912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (wpa_config_read_global(config, hk)) 47112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 47212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 473e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (wpa_config_read_networks(config, hk)) 47412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 47512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (wpa_config_read_blobs(config, hk)) 47712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 47812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_debug_dump_networks(config); 480a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 4819d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org RegCloseKey(hk); 4829d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 4839d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org if (errors) { 4849d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org wpa_config_free(config); 4859d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org config = NULL; 4869d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 4879d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 4889d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org return config; 4899d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 4909d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 4919d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 4929d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgstatic int wpa_config_write_reg_dword(HKEY hk, const TCHAR *name, int val, 4939d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org int def) 4949d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org{ 4959d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org LONG ret; 49612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DWORD _val = val; 4979d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 49812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (val == def) { 4999d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org RegDeleteValue(hk, name); 50012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 0; 5019d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 5029d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 5039d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org ret = RegSetValueEx(hk, name, 0, REG_DWORD, (LPBYTE) &_val, 50412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org sizeof(_val)); 50512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 50612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_ERROR, "WINREG: Failed to set %s=%d: error %d", 507eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org name, val, (int) GetLastError()); 5080ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com return -1; 5090ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com } 5100ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com 5110ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com return 0; 51212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 51312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 514e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 5156474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstatic int wpa_config_write_reg_string(HKEY hk, const char *name, 5166474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org const char *val) 51712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 51812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LONG ret; 51912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org TCHAR *_name, *_val; 52012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 52112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org _name = wpa_strdup_tchar(name); 52212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (_name == NULL) 5230ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com return -1; 5240ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com 52512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (val == NULL) { 52612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org RegDeleteValue(hk, _name); 52712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(_name); 5280ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com return 0; 52912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 53012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 53112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org _val = wpa_strdup_tchar(val); 53212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (_val == NULL) { 53312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(_name); 53412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return -1; 53512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 536e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org ret = RegSetValueEx(hk, _name, 0, REG_SZ, (BYTE *) _val, 53712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (os_strlen(val) + 1) * sizeof(TCHAR)); 53812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 53912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_ERROR, "WINREG: Failed to set %s='%s': " 54012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "error %d", name, val, (int) GetLastError()); 5413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org os_free(_name); 5423e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org os_free(_val); 54312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return -1; 544e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 54512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 54612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(_name); 547e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org os_free(_val); 54812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 0; 5496474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org} 55012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 5516474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 5526474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstatic int wpa_config_write_global(struct wpa_config *config, HKEY hk) 55312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 55412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef CONFIG_CTRL_IFACE 55512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "ctrl_interface", 55612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->ctrl_interface); 55712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif /* CONFIG_CTRL_IFACE */ 558474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 559474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("eapol_version"), 560474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org config->eapol_version, 561474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org DEFAULT_EAPOL_VERSION); 562474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("ap_scan"), config->ap_scan, 563474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org DEFAULT_AP_SCAN); 56412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("fast_reauth"), 56512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->fast_reauth, DEFAULT_FAST_REAUTH); 56612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("dot11RSNAConfigPMKLifetime"), 56712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->dot11RSNAConfigPMKLifetime, 0); 56812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, 56912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org TEXT("dot11RSNAConfigPMKReauthThreshold"), 57012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->dot11RSNAConfigPMKReauthThreshold, 57112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 0); 57212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("dot11RSNAConfigSATimeout"), 57312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->dot11RSNAConfigSATimeout, 0); 57412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("update_config"), 5753e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org config->update_config, 5763e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 0); 5773e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#ifdef CONFIG_WPS 57812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!is_nil_uuid(config->uuid)) { 57912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char buf[40]; 58012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org uuid_bin2str(config->uuid, buf, sizeof(buf)); 5816474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org wpa_config_write_reg_string(hk, "uuid", buf); 5826474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 58312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "device_name", config->device_name); 58412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "manufacturer", config->manufacturer); 58512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "model_name", config->model_name); 58612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "model_number", config->model_number); 587474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org wpa_config_write_reg_string(hk, "serial_number", 58812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->serial_number); 58912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org { 59012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char _buf[WPS_DEV_TYPE_BUFSIZE], *buf; 59112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org buf = wps_dev_type_bin2str(config->device_type, 59212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org _buf, sizeof(_buf)); 59312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "device_type", buf); 59412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 59512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "config_methods", 59612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->config_methods); 59712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (WPA_GET_BE32(config->os_version)) { 59812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char vbuf[10]; 59912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_snprintf(vbuf, sizeof(vbuf), "%08x", 60012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org WPA_GET_BE32(config->os_version)); 60112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "os_version", vbuf); 60212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 60312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("wps_cred_processing"), 60412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->wps_cred_processing, 0); 60512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif /* CONFIG_WPS */ 60612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef CONFIG_P2P 60712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "p2p_ssid_postfix", 608e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org config->p2p_ssid_postfix); 60912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("p2p_group_idle"), 61012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->p2p_group_idle, 0); 61112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif /* CONFIG_P2P */ 61212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 61312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("bss_max_count"), 61412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->bss_max_count, 61512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DEFAULT_BSS_MAX_COUNT); 61612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("filter_ssids"), 61712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->filter_ssids, 0); 61812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("max_num_sta"), 619eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org config->max_num_sta, DEFAULT_MAX_NUM_STA); 62012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("disassoc_low_ack"), 62112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->disassoc_low_ack, 0); 62212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 62312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("okc"), config->okc, 0); 62412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("pmf"), config->pmf, 0); 62512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 62612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_dword(hk, TEXT("external_sim"), 62712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org config->external_sim, 0); 62812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 62912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 0; 630eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org} 63112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 63212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 63312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic int wpa_config_delete_subkeys(HKEY hk, const TCHAR *key) 634e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org{ 63512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HKEY nhk; 63612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int i, errors = 0; 63712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LONG ret; 63812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 63912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegOpenKeyEx(hk, key, 0, KEY_ENUMERATE_SUB_KEYS | DELETE, &nhk); 64012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 641eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org wpa_printf(MSG_DEBUG, "WINREG: Could not open key '" TSTR 64212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "' for subkey deletion: error 0x%x (%d)", key, 64312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (unsigned int) ret, (int) GetLastError()); 64412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 0; 64512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 64612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 64712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (i = 0; ; i++) { 648eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org TCHAR name[255]; 649eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org DWORD namelen; 65012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 65112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org namelen = 255; 65212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegEnumKeyEx(nhk, i, name, &namelen, NULL, NULL, NULL, 65312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org NULL); 65412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 65512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret == ERROR_NO_MORE_ITEMS) 65612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 65712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 65812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 659e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_printf(MSG_DEBUG, "RegEnumKeyEx failed: 0x%x (%d)", 660e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (unsigned int) ret, (int) GetLastError()); 661e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org break; 66212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 66312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 66412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (namelen >= 255) 6656474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org namelen = 255 - 1; 6666474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org name[namelen] = TEXT('\0'); 66712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 66812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ret = RegDeleteKey(nhk, name); 66912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 67012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_DEBUG, "RegDeleteKey failed: 0x%x (%d)", 67112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (unsigned int) ret, (int) GetLastError()); 67212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org errors++; 67312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 67412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 6756474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 67612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org RegCloseKey(nhk); 67712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 67812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return errors ? -1 : 0; 67912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 68012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 68112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 68212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic void write_str(HKEY hk, const char *field, struct wpa_ssid *ssid) 6836313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org{ 68412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char *value = wpa_config_get(ssid, field); 68512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value == NULL) 68612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; 68712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, field, value); 68812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(value); 68912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 69012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 69112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 69212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic void write_int(HKEY hk, const char *field, int value, int def) 69312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 69412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char val[20]; 69512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value == def) 6965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 6975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org os_snprintf(val, sizeof(val), "%d", value); 698e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org wpa_config_write_reg_string(hk, field, val); 699e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org} 70012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 7015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void write_bssid(HKEY hk, struct wpa_ssid *ssid) 7035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org{ 7045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org char *value = wpa_config_get(ssid, "bssid"); 7055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (value == NULL) 7065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 7075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org wpa_config_write_reg_string(hk, "bssid", value); 7085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org os_free(value); 7095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 7105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void write_psk(HKEY hk, struct wpa_ssid *ssid) 7135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org{ 7141af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org char *value = wpa_config_get(ssid, "psk"); 7155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (value == NULL) 7165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 7175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org wpa_config_write_reg_string(hk, "psk", value); 7185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org os_free(value); 7195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 7205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void write_proto(HKEY hk, struct wpa_ssid *ssid) 7235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org{ 72412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char *value; 7255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (ssid->proto == DEFAULT_PROTO) 7275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 7285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org value = wpa_config_get(ssid, "proto"); 7305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (value == NULL) 7315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 7325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (value[0]) 7335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org wpa_config_write_reg_string(hk, "proto", value); 7345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org os_free(value); 7355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 7365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void write_key_mgmt(HKEY hk, struct wpa_ssid *ssid) 7395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org{ 7405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org char *value; 7415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (ssid->key_mgmt == DEFAULT_KEY_MGMT) 7435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 7445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 74512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value = wpa_config_get(ssid, "key_mgmt"); 7465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (value == NULL) 74712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; 7485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (value[0]) 7495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org wpa_config_write_reg_string(hk, "key_mgmt", value); 7505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org os_free(value); 7515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 7525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void write_pairwise(HKEY hk, struct wpa_ssid *ssid) 7555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org{ 7565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org char *value; 7575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (ssid->pairwise_cipher == DEFAULT_PAIRWISE) 7595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 7605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 7615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org value = wpa_config_get(ssid, "pairwise"); 7625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (value == NULL) 7635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return; 76412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value[0]) 76512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "pairwise", value); 76612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(value); 767eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org} 7680ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com 76912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 7700ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.comstatic void write_group(HKEY hk, struct wpa_ssid *ssid) 77112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 77212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char *value; 7736474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org 77412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ssid->group_cipher == DEFAULT_GROUP) 77512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; 77612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 77712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value = wpa_config_get(ssid, "group"); 77812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value == NULL) 77912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; 78012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value[0]) 78112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "group", value); 78212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(value); 78312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 78412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 78512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 78612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic void write_auth_alg(HKEY hk, struct wpa_ssid *ssid) 78712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 788eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org char *value; 7890ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com 79012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ssid->auth_alg == 0) 79112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; 79212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 793dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org value = wpa_config_get(ssid, "auth_alg"); 794dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (value == NULL) 79512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; 79612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value[0]) 79712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "auth_alg", value); 79812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(value); 79912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 80012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 80112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 802fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#ifdef IEEE8021X_EAPOL 8039aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgstatic void write_eap(HKEY hk, struct wpa_ssid *ssid) 804fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org{ 805eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org char *value; 806eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org 807eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org value = wpa_config_get(ssid, "eap"); 808e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (value == NULL) 80912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; 81012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 8110ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com if (value[0]) 81212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, "eap", value); 81312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(value); 8149aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org} 8150ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com#endif /* IEEE8021X_EAPOL */ 8160ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com 81712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 81812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic void write_wep_key(HKEY hk, int idx, struct wpa_ssid *ssid) 819e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org{ 82012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char field[20], *value; 8210ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com 82212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_snprintf(field, sizeof(field), "wep_key%d", idx); 82312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value = wpa_config_get(ssid, field); 82412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value) { 82512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_config_write_reg_string(hk, field, value); 82612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os_free(value); 8270ff70cc62b77c5de20e3fb2d1443e521c519d850akos.palfi@imgtec.com } 82812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 829eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org 83012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 83112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic int wpa_config_write_network(HKEY hk, struct wpa_ssid *ssid, int id) 83212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org{ 83312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int i, errors = 0; 83412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HKEY nhk, netw; 83512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LONG ret; 83612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org TCHAR name[5]; 83712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 8386474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org ret = RegOpenKeyEx(hk, TEXT("networks"), 0, KEY_CREATE_SUB_KEY, &nhk); 83912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (ret != ERROR_SUCCESS) { 84012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org wpa_printf(MSG_DEBUG, "WINREG: Could not open networks key " 841 "for subkey addition: error 0x%x (%d)", 842 (unsigned int) ret, (int) GetLastError()); 843 return 0; 844 } 845 846#ifdef UNICODE 847 wsprintf(name, L"%04d", id); 848#else /* UNICODE */ 849 os_snprintf(name, sizeof(name), "%04d", id); 850#endif /* UNICODE */ 851 ret = RegCreateKeyEx(nhk, name, 0, NULL, 0, KEY_WRITE, NULL, &netw, 852 NULL); 853 RegCloseKey(nhk); 854 if (ret != ERROR_SUCCESS) { 855 wpa_printf(MSG_DEBUG, "WINREG: Could not add network key '%s':" 856 " error 0x%x (%d)", 857 name, (unsigned int) ret, (int) GetLastError()); 858 return -1; 859 } 860 861#define STR(t) write_str(netw, #t, ssid) 862#define INT(t) write_int(netw, #t, ssid->t, 0) 863#define INTe(t) write_int(netw, #t, ssid->eap.t, 0) 864#define INT_DEF(t, def) write_int(netw, #t, ssid->t, def) 865#define INT_DEFe(t, def) write_int(netw, #t, ssid->eap.t, def) 866 867 STR(ssid); 868 INT(scan_ssid); 869 write_bssid(netw, ssid); 870 write_psk(netw, ssid); 871 write_proto(netw, ssid); 872 write_key_mgmt(netw, ssid); 873 write_pairwise(netw, ssid); 874 write_group(netw, ssid); 875 write_auth_alg(netw, ssid); 876#ifdef IEEE8021X_EAPOL 877 write_eap(netw, ssid); 878 STR(identity); 879 STR(anonymous_identity); 880 STR(password); 881 STR(ca_cert); 882 STR(ca_path); 883 STR(client_cert); 884 STR(private_key); 885 STR(private_key_passwd); 886 STR(dh_file); 887 STR(subject_match); 888 STR(altsubject_match); 889 STR(ca_cert2); 890 STR(ca_path2); 891 STR(client_cert2); 892 STR(private_key2); 893 STR(private_key2_passwd); 894 STR(dh_file2); 895 STR(subject_match2); 896 STR(altsubject_match2); 897 STR(phase1); 898 STR(phase2); 899 STR(pcsc); 900 STR(pin); 901 STR(engine_id); 902 STR(key_id); 903 STR(cert_id); 904 STR(ca_cert_id); 905 STR(key2_id); 906 STR(pin2); 907 STR(engine2_id); 908 STR(cert2_id); 909 STR(ca_cert2_id); 910 INTe(engine); 911 INTe(engine2); 912 INT_DEF(eapol_flags, DEFAULT_EAPOL_FLAGS); 913#endif /* IEEE8021X_EAPOL */ 914 for (i = 0; i < 4; i++) 915 write_wep_key(netw, i, ssid); 916 INT(wep_tx_keyidx); 917 INT(priority); 918#ifdef IEEE8021X_EAPOL 919 INT_DEF(eap_workaround, DEFAULT_EAP_WORKAROUND); 920 STR(pac_file); 921 INT_DEFe(fragment_size, DEFAULT_FRAGMENT_SIZE); 922#endif /* IEEE8021X_EAPOL */ 923 INT(mode); 924 write_int(netw, "proactive_key_caching", ssid->proactive_key_caching, 925 -1); 926 INT(disabled); 927 INT(peerkey); 928#ifdef CONFIG_IEEE80211W 929 write_int(netw, "ieee80211w", ssid->ieee80211w, 930 MGMT_FRAME_PROTECTION_DEFAULT); 931#endif /* CONFIG_IEEE80211W */ 932 STR(id_str); 933#ifdef CONFIG_HS20 934 INT(update_identifier); 935#endif /* CONFIG_HS20 */ 936 937#undef STR 938#undef INT 939#undef INT_DEF 940 941 RegCloseKey(netw); 942 943 return errors ? -1 : 0; 944} 945 946 947static int wpa_config_write_blob(HKEY hk, struct wpa_config_blob *blob) 948{ 949 HKEY bhk; 950 LONG ret; 951 TCHAR *name; 952 953 ret = RegCreateKeyEx(hk, TEXT("blobs"), 0, NULL, 0, KEY_WRITE, NULL, 954 &bhk, NULL); 955 if (ret != ERROR_SUCCESS) { 956 wpa_printf(MSG_DEBUG, "WINREG: Could not add blobs key: " 957 "error 0x%x (%d)", 958 (unsigned int) ret, (int) GetLastError()); 959 return -1; 960 } 961 962 name = wpa_strdup_tchar(blob->name); 963 ret = RegSetValueEx(bhk, name, 0, REG_BINARY, blob->data, 964 blob->len); 965 if (ret != ERROR_SUCCESS) { 966 wpa_printf(MSG_ERROR, "WINREG: Failed to set blob %s': " 967 "error 0x%x (%d)", blob->name, (unsigned int) ret, 968 (int) GetLastError()); 969 RegCloseKey(bhk); 970 os_free(name); 971 return -1; 972 } 973 os_free(name); 974 975 RegCloseKey(bhk); 976 977 return 0; 978} 979 980 981int wpa_config_write(const char *name, struct wpa_config *config) 982{ 983 TCHAR buf[256]; 984 HKEY hk; 985 LONG ret; 986 int errors = 0; 987 struct wpa_ssid *ssid; 988 struct wpa_config_blob *blob; 989 int id; 990 991 wpa_printf(MSG_DEBUG, "Writing configuration file '%s'", name); 992 993#ifdef UNICODE 994 _snwprintf(buf, 256, WPA_KEY_PREFIX TEXT("\\configs\\%S"), name); 995#else /* UNICODE */ 996 os_snprintf(buf, 256, WPA_KEY_PREFIX TEXT("\\configs\\%s"), name); 997#endif /* UNICODE */ 998 999 ret = RegOpenKeyEx(WPA_KEY_ROOT, buf, 0, KEY_SET_VALUE | DELETE, &hk); 1000 if (ret != ERROR_SUCCESS) { 1001 wpa_printf(MSG_ERROR, "Could not open wpa_supplicant " 1002 "configuration registry %s: error %d", buf, 1003 (int) GetLastError()); 1004 return -1; 1005 } 1006 1007 if (wpa_config_write_global(config, hk)) { 1008 wpa_printf(MSG_ERROR, "Failed to write global configuration " 1009 "data"); 1010 errors++; 1011 } 1012 1013 wpa_config_delete_subkeys(hk, TEXT("networks")); 1014 for (ssid = config->ssid, id = 0; ssid; ssid = ssid->next, id++) { 1015 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS) 1016 continue; /* do not save temporary WPS networks */ 1017 if (wpa_config_write_network(hk, ssid, id)) 1018 errors++; 1019 } 1020 1021 RegDeleteKey(hk, TEXT("blobs")); 1022 for (blob = config->blobs; blob; blob = blob->next) { 1023 if (wpa_config_write_blob(hk, blob)) 1024 errors++; 1025 } 1026 1027 RegCloseKey(hk); 1028 1029 wpa_printf(MSG_DEBUG, "Configuration '%s' written %ssuccessfully", 1030 name, errors ? "un" : ""); 1031 return errors ? -1 : 0; 1032} 1033