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);
}
Exemple #4
0
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);
}
Exemple #5
0
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);
}
Exemple #7
0
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);
}
Exemple #13
0
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;
}