static void write_pairwise(FILE *f, struct wpa_ssid *ssid) { char *value; if (ssid->pairwise_cipher == DEFAULT_PAIRWISE) return; value = wpa_config_get(ssid, "pairwise"); if (value == NULL) return; if (value[0]) fprintf(f, "\tpairwise=%s\n", value); os_free(value); }
static void write_proto(FILE *f, struct wpa_ssid *ssid) { char *value; if (ssid->proto == DEFAULT_PROTO) return; value = wpa_config_get(ssid, "proto"); if (value == NULL) return; if (value[0]) fprintf(f, "\tproto=%s\n", value); os_free(value); }
static void write_key_mgmt(FILE *f, struct wpa_ssid *ssid) { char *value; if (ssid->key_mgmt == DEFAULT_KEY_MGMT) return; value = wpa_config_get(ssid, "key_mgmt"); if (value == NULL) return; if (value[0]) fprintf(f, "\tkey_mgmt=%s\n", value); os_free(value); }
static void write_auth_alg(FILE *f, struct wpa_ssid *ssid) { char *value; if (ssid->auth_alg == 0) return; value = wpa_config_get(ssid, "auth_alg"); if (value == NULL) return; if (value[0]) fprintf(f, "\tauth_alg=%s\n", value); os_free(value); }
static void write_wep_key(FILE *f, int idx, struct wpa_ssid *ssid) { char field[20], *value; int res; res = os_snprintf(field, sizeof(field), "wep_key%d", idx); if (res < 0 || (size_t) res >= sizeof(field)) return; value = wpa_config_get(ssid, field); if (value) { fprintf(f, "\t%s=%s\n", field, value); os_free(value); } }
static void write_group_mgmt(FILE *f, struct wpa_ssid *ssid) { char *value; if (!ssid->group_mgmt_cipher) return; value = wpa_config_get(ssid, "group_mgmt"); if (!value) return; if (value[0]) fprintf(f, "\tgroup_mgmt=%s\n", value); os_free(value); }
static void write_group(FILE *f, struct wpa_ssid *ssid) { char *value; if (ssid->group_cipher == DEFAULT_GROUP) return; value = wpa_config_get(ssid, "group"); if (value == NULL) return; if (value[0]) fprintf(f, "\tgroup=%s\n", value); os_free(value); }
static void write_auth_alg(HKEY hk, struct wpa_ssid *ssid) { char *value; if (ssid->auth_alg == 0) return; value = wpa_config_get(ssid, "auth_alg"); if (value == NULL) return; if (value[0]) wpa_config_write_reg_string(hk, "auth_alg", value); os_free(value); }
static void write_group(HKEY hk, struct wpa_ssid *ssid) { char *value; if (ssid->group_cipher == DEFAULT_GROUP) return; value = wpa_config_get(ssid, "group"); if (value == NULL) return; if (value[0]) wpa_config_write_reg_string(hk, "group", value); os_free(value); }
static void write_pairwise(HKEY hk, struct wpa_ssid *ssid) { char *value; if (ssid->pairwise_cipher == DEFAULT_PAIRWISE) return; value = wpa_config_get(ssid, "pairwise"); if (value == NULL) return; if (value[0]) wpa_config_write_reg_string(hk, "pairwise", value); os_free(value); }
static void write_key_mgmt(HKEY hk, struct wpa_ssid *ssid) { char *value; if (ssid->key_mgmt == DEFAULT_KEY_MGMT) return; value = wpa_config_get(ssid, "key_mgmt"); if (value == NULL) return; if (value[0]) wpa_config_write_reg_string(hk, "key_mgmt", value); os_free(value); }
static void write_proto(HKEY hk, struct wpa_ssid *ssid) { char *value; if (ssid->proto == DEFAULT_PROTO) return; value = wpa_config_get(ssid, "proto"); if (value == NULL) return; if (value[0]) wpa_config_write_reg_string(hk, "proto", value); os_free(value); }
int wps_get_supplicant_ssid_configuration(void *ctx, int index, u8 **buf, size_t *len) { int ret = -1; struct wpa_supplicant *wpa_s = ctx; struct wpa_ssid *ssid; struct wps_data *wps = 0; u16 auth, encr; Boolean enabled8021x = 0; u8 nwKeyIdx = -1; u8 nwKey[64 + 1]; Boolean blval; size_t length; u8 nwIdx; do { if (!buf || !len) break; *buf = 0; *len = 0; ssid = wpa_config_get_network(wpa_s->conf, index); if (!ssid) break; if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X) { if (ssid->proto & WPA_PROTO_RSN) auth = WPS_AUTHTYPE_WPA2; else auth = WPS_AUTHTYPE_WPA; if (ssid->pairwise_cipher & WPA_CIPHER_CCMP) encr = WPS_ENCRTYPE_AES; else encr = WPS_ENCRTYPE_TKIP; enabled8021x = 1; } else if (ssid->key_mgmt & WPA_KEY_MGMT_PSK) { if (ssid->proto & WPA_PROTO_RSN) auth = WPS_AUTHTYPE_WPA2PSK; else auth = WPS_AUTHTYPE_WPAPSK; if (ssid->pairwise_cipher & WPA_CIPHER_CCMP) encr = WPS_ENCRTYPE_AES; else encr = WPS_ENCRTYPE_TKIP; nwKeyIdx = 0; } else if (ssid->key_mgmt & WPA_KEY_MGMT_NONE) { if (ssid->auth_alg & WPA_AUTH_ALG_SHARED) { auth = WPS_AUTHTYPE_SHARED; nwKeyIdx = ssid->wep_tx_keyidx + 1; } else auth = WPS_AUTHTYPE_OPEN; if ((ssid->pairwise_cipher & (WPA_CIPHER_WEP40|WPA_CIPHER_WEP104)) || (ssid->group_cipher & (WPA_CIPHER_WEP40|WPA_CIPHER_WEP104))) { encr = WPS_ENCRTYPE_WEP; nwKeyIdx = ssid->wep_tx_keyidx + 1; } else encr = WPS_ENCRTYPE_NONE; } else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) { auth = WPS_AUTHTYPE_OPEN; encr = WPS_ENCRTYPE_WEP; enabled8021x = 1; } if (wps_create_wps_data(&wps)) break; /* Network Index */ nwIdx = ssid->id; if (wps_set_value(wps, WPS_TYPE_NW_INDEX, &nwIdx, 0)) break; /* SSID */ if (wps_set_value(wps, WPS_TYPE_SSID, ssid->ssid, ssid->ssid_len)) break; /* Authentication Type */ if (wps_set_value(wps, WPS_TYPE_AUTH_TYPE, &auth, 0)) break; /* Encryption Type */ if (wps_set_value(wps, WPS_TYPE_ENCR_TYPE, &encr, 0)) break; if (nwKeyIdx != (u8)-1) { if (encr == WPS_ENCRTYPE_WEP) { if ((1 > nwKeyIdx) || (4 < nwKeyIdx)) { wpa_printf(MSG_WARNING, "Network Key Index is fixed. %d -> 1\n", nwKeyIdx); nwKeyIdx = 1; } /* Network Key Index (Option) */ if (wps_set_value(wps, WPS_TYPE_NW_KEY_INDEX, &nwKeyIdx, 0)) break; } /* Network Key */ if (ssid->passphrase) { length = os_strlen(ssid->passphrase); strncpy((char *)nwKey, ssid->passphrase, length); nwKey[length] = 0; } else if (ssid->psk_set) { length = PMK_LEN * 2; wpa_snprintf_hex_uppercase((char *)nwKey, sizeof(nwKey), ssid->psk, length); nwKey[length] = 0; } else { if (is_hex(ssid->wep_key[nwKeyIdx - 1], ssid->wep_key_len[nwKeyIdx - 1])) { length = (u16)ssid->wep_key_len[nwKeyIdx - 1] * 2; wpa_snprintf_hex_uppercase((char *)nwKey, sizeof(nwKey), ssid->wep_key[nwKeyIdx - 1], length); nwKey[length] = 0; } else { length = (u16)ssid->wep_key_len[nwKeyIdx - 1]; strncpy((char *)nwKey, (char *)ssid->wep_key[nwKeyIdx - 1], length); nwKey[length] = 0; } } if (wps_set_value(wps, WPS_TYPE_NW_KEY, nwKey, length)) break; } else { /* Network Key (No Key) */ if (wps_set_value(wps, WPS_TYPE_NW_KEY, 0, 0)) { break; } } /* MAC Address */ if (wps_set_value(wps, WPS_TYPE_MAC_ADDR, wpa_s->own_addr, ETH_ALEN)) break; if (enabled8021x) { char *value; /* EAP Type (Option) */ value = wpa_config_get(ssid, "eap"); if (value) { if (wps_set_value(wps, WPS_TYPE_EAP_TYPE, value, os_strlen(value))) { free(value); break; } free(value); } /* EAP Identity (Option) */ value = wpa_config_get(ssid, "identity"); if (value) { if (wps_set_value(wps, WPS_TYPE_EAP_IDENTITY, value, os_strlen(value))) { free(value); break; } free(value); } /* Key Provided Automaticaly (Option) */ blval = 1; if (wps_set_value(wps, WPS_TYPE_KEY_PROVIDED_AUTO, &blval, 0)) break; /* 802.1X Enabled (Option) */ if (wps_set_value(wps, WPS_TYPE_8021X_ENABLED, &enabled8021x, 0)) break; } if (wps_write_wps_data(wps, buf, len)) break; ret = 0; } while (0); (void)wps_destroy_wps_data(&wps); if (ret) { if (buf && *buf) { free(*buf); *buf = 0; } if (len) *len = 0; } return ret; }