xref: /wlan-dirver/utils/sigma-dut/dpp.c (revision bf7f295416be581fd15d5d28db23c0195dd1c9ae)
1d86e5828SJouni Malinen /*
2d86e5828SJouni Malinen  * Sigma Control API DUT (station/AP/sniffer)
3d86e5828SJouni Malinen  * Copyright (c) 2017, Qualcomm Atheros, Inc.
4ec5a4a44SJouni Malinen  * Copyright (c) 2018-2020, The Linux Foundation
5d86e5828SJouni Malinen  * All Rights Reserved.
6d86e5828SJouni Malinen  * Licensed under the Clear BSD license. See README for more details.
7d86e5828SJouni Malinen  */
8d86e5828SJouni Malinen 
9d86e5828SJouni Malinen #include "sigma_dut.h"
101a38cc37SJouni Malinen #include <sys/wait.h>
11d86e5828SJouni Malinen #include "wpa_ctrl.h"
12d86e5828SJouni Malinen #include "wpa_helpers.h"
13d86e5828SJouni Malinen 
14ec5a4a44SJouni Malinen extern char *sigma_wpas_ctrl;
159541ee87SJouni Malinen extern char *sigma_cert_path;
16ec5a4a44SJouni Malinen 
171a38cc37SJouni Malinen #ifdef ANDROID
18bc9e055cSSrinivas Dasari char *dpp_qrcode_file = "/sdcard/wpadebug_qrdata.txt";
191a38cc37SJouni Malinen #endif /* ANDROID */
20bc9e055cSSrinivas Dasari 
21d86e5828SJouni Malinen 
sigma_dut_is_ap(struct sigma_dut * dut)22d86e5828SJouni Malinen static int sigma_dut_is_ap(struct sigma_dut *dut)
23d86e5828SJouni Malinen {
24d86e5828SJouni Malinen 	return dut->device_type == AP_unknown ||
25d86e5828SJouni Malinen 		dut->device_type == AP_testbed ||
26d86e5828SJouni Malinen 		dut->device_type == AP_dut;
27d86e5828SJouni Malinen }
28d86e5828SJouni Malinen 
29d86e5828SJouni Malinen 
dpp_hostapd_run(struct sigma_dut * dut)30d86e5828SJouni Malinen static int dpp_hostapd_run(struct sigma_dut *dut)
31d86e5828SJouni Malinen {
32d86e5828SJouni Malinen 	if (dut->hostapd_running)
33d86e5828SJouni Malinen 		return 0;
34d86e5828SJouni Malinen 
35d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
36d86e5828SJouni Malinen 			"Starting hostapd in unconfigured state for DPP");
37d86e5828SJouni Malinen 	snprintf(dut->ap_ssid, sizeof(dut->ap_ssid), "unconfigured");
389149afc1Spriyadharshini gowthaman 	if (!dut->ap_oper_chn)
39d86e5828SJouni Malinen 		dut->ap_channel = 11;
40d86e5828SJouni Malinen 	dut->ap_is_dual = 0;
41fa2d7c3aSpriyadharshini gowthaman 	dut->ap_mode = dut->ap_channel <= 14 ? AP_11ng : AP_11na;
42d86e5828SJouni Malinen 	dut->ap_key_mgmt = AP_OPEN;
43d86e5828SJouni Malinen 	dut->ap_cipher = AP_PLAIN;
44d2e9bb3eSJouni Malinen 	if (!dut->ap_dpp_conf_addr || !dut->ap_dpp_conf_pkhash)
45d2e9bb3eSJouni Malinen 		dut->ap_start_disabled = 1;
46d86e5828SJouni Malinen 	return cmd_ap_config_commit(dut, NULL, NULL) == 1 ? 0 : -1;
47d86e5828SJouni Malinen }
48d86e5828SJouni Malinen 
49d86e5828SJouni Malinen 
dpp_hostapd_beacon(struct sigma_dut * dut)50d2e9bb3eSJouni Malinen static int dpp_hostapd_beacon(struct sigma_dut *dut)
51d2e9bb3eSJouni Malinen {
52d2e9bb3eSJouni Malinen 	const char *ifname = dut->hostapd_ifname;
53d2e9bb3eSJouni Malinen 
54d2e9bb3eSJouni Malinen 	if (!dut->ap_start_disabled)
55d2e9bb3eSJouni Malinen 		return 0;
56d2e9bb3eSJouni Malinen 
578bb0a7b1SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Start beaconing");
58d2e9bb3eSJouni Malinen 	if (!ifname ||
59d2e9bb3eSJouni Malinen 	    wpa_command(ifname, "SET start_disabled 0") < 0 ||
60d2e9bb3eSJouni Malinen 	    wpa_command(ifname, "DISABLE") < 0 ||
61d2e9bb3eSJouni Malinen 	    wpa_command(ifname, "ENABLE") < 0)
62d2e9bb3eSJouni Malinen 		return -1;
63d2e9bb3eSJouni Malinen 
64d2e9bb3eSJouni Malinen 	dut->ap_start_disabled = 0;
65d2e9bb3eSJouni Malinen 	return 0;
66d2e9bb3eSJouni Malinen }
67d2e9bb3eSJouni Malinen 
68d2e9bb3eSJouni Malinen 
dpp_get_curve(struct sigma_cmd * cmd,const char * arg)69d86e5828SJouni Malinen static const char * dpp_get_curve(struct sigma_cmd *cmd, const char *arg)
70d86e5828SJouni Malinen {
71d86e5828SJouni Malinen 	const char *val = get_param(cmd, arg);
72d86e5828SJouni Malinen 
73d86e5828SJouni Malinen 	if (!val)
74d86e5828SJouni Malinen 		val = "P-256";
75d86e5828SJouni Malinen 	else if (strcasecmp(val, "BP-256R1") == 0)
76d86e5828SJouni Malinen 		val = "BP-256";
77d86e5828SJouni Malinen 	else if (strcasecmp(val, "BP-384R1") == 0)
78d86e5828SJouni Malinen 		val = "BP-384";
79d86e5828SJouni Malinen 	else if (strcasecmp(val, "BP-512R1") == 0)
80d86e5828SJouni Malinen 		val = "BP-512";
81d86e5828SJouni Malinen 
82d86e5828SJouni Malinen 	return val;
83d86e5828SJouni Malinen }
84d86e5828SJouni Malinen 
85d86e5828SJouni Malinen 
8689cf6d64SJouni Malinen static enum sigma_cmd_result
dpp_get_local_bootstrap(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd,int send_result,int * success)8789cf6d64SJouni Malinen dpp_get_local_bootstrap(struct sigma_dut *dut, struct sigma_conn *conn,
8889cf6d64SJouni Malinen 			struct sigma_cmd *cmd, int send_result, int *success)
89d86e5828SJouni Malinen {
90d86e5828SJouni Malinen 	const char *curve = dpp_get_curve(cmd, "DPPCryptoIdentifier");
91d86e5828SJouni Malinen 	const char *bs = get_param(cmd, "DPPBS");
924161c3f0SJouni Malinen 	const char *chan_list = get_param(cmd, "DPPChannelList");
93e2d1af0aSJouni Malinen 	const char *tcp = get_param(cmd, "DPPOverTCP");
944161c3f0SJouni Malinen 	char *pos, mac[50], buf[200], resp[1000], hex[2000];
95016ae6c8SJouni Malinen 	const char *ifname = get_station_ifname(dut);
963aa72861SJouni Malinen 	int res;
976f4ce416SJouni Malinen 	const char *type;
98e2d1af0aSJouni Malinen 	int include_mac;
99e2d1af0aSJouni Malinen 
100e2d1af0aSJouni Malinen 	include_mac = !tcp || strcasecmp(tcp, "yes") != 0;
101d86e5828SJouni Malinen 
102bc9e055cSSrinivas Dasari 	if (success)
103bc9e055cSSrinivas Dasari 		*success = 0;
1046f4ce416SJouni Malinen 	if (strcasecmp(bs, "QR") == 0) {
1056f4ce416SJouni Malinen 		type = "qrcode";
1066f4ce416SJouni Malinen 	} else if (strcasecmp(bs, "NFC") == 0) {
1076f4ce416SJouni Malinen 		type ="nfc-uri";
1086f4ce416SJouni Malinen 	} else {
109d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
110d86e5828SJouni Malinen 			  "errorCode,Unsupported DPPBS");
11189cf6d64SJouni Malinen 		return STATUS_SENT_ERROR;
112d86e5828SJouni Malinen 	}
113d86e5828SJouni Malinen 
114d86e5828SJouni Malinen 	if (sigma_dut_is_ap(dut)) {
115d86e5828SJouni Malinen 		u8 bssid[ETH_ALEN];
116d86e5828SJouni Malinen 
117d86e5828SJouni Malinen 		if (!dut->hostapd_ifname) {
118d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
119d86e5828SJouni Malinen 					"hostapd ifname not specified (-j)");
12089cf6d64SJouni Malinen 			return ERROR_SEND_STATUS;
121d86e5828SJouni Malinen 		}
122d86e5828SJouni Malinen 		ifname = dut->hostapd_ifname;
123d86e5828SJouni Malinen 		if (get_hwaddr(dut->hostapd_ifname, bssid) < 0) {
124d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
125d86e5828SJouni Malinen 					"Could not get MAC address for %s",
126d86e5828SJouni Malinen 					dut->hostapd_ifname);
12789cf6d64SJouni Malinen 			return ERROR_SEND_STATUS;
128d86e5828SJouni Malinen 		}
129d86e5828SJouni Malinen 		snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x",
130d86e5828SJouni Malinen 			 bssid[0], bssid[1], bssid[2],
131d86e5828SJouni Malinen 			 bssid[3], bssid[4], bssid[5]);
132d86e5828SJouni Malinen 	} else {
1334046416bSJouni Malinen 		if (get_wpa_status(ifname, "address", mac, sizeof(mac)) < 0) {
1344046416bSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1354046416bSJouni Malinen 				  "errorCode,Failed to get own MAC address from wpa_supplicant");
1364046416bSJouni Malinen 			return STATUS_SENT_ERROR;
1374046416bSJouni Malinen 		}
138d86e5828SJouni Malinen 	}
139d86e5828SJouni Malinen 
140d86e5828SJouni Malinen 	pos = mac;
141d86e5828SJouni Malinen 	while (*pos) {
142d86e5828SJouni Malinen 		if (*pos == ':')
143d86e5828SJouni Malinen 			memmove(pos, pos + 1, strlen(pos));
144d86e5828SJouni Malinen 		else
145d86e5828SJouni Malinen 			pos++;
146d86e5828SJouni Malinen 	}
147d86e5828SJouni Malinen 
148d86e5828SJouni Malinen 	if (sigma_dut_is_ap(dut) && dpp_hostapd_run(dut) < 0) {
149d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
150d86e5828SJouni Malinen 			  "errorCode,Failed to start hostapd");
15189cf6d64SJouni Malinen 		return STATUS_SENT_ERROR;
152d86e5828SJouni Malinen 	}
153d86e5828SJouni Malinen 
1544161c3f0SJouni Malinen 	if (chan_list &&
1554161c3f0SJouni Malinen 	    (strcmp(chan_list, "0/0") == 0 || chan_list[0] == '\0')) {
1564161c3f0SJouni Malinen 		/* No channel list */
1573aa72861SJouni Malinen 		res = snprintf(buf, sizeof(buf),
158e2d1af0aSJouni Malinen 			       "DPP_BOOTSTRAP_GEN type=%s curve=%s%s%s",
159e2d1af0aSJouni Malinen 			       type, curve,
160e2d1af0aSJouni Malinen 			       include_mac ? " mac=" : "",
161e2d1af0aSJouni Malinen 			       include_mac ? mac : "");
1624161c3f0SJouni Malinen 	} else if (chan_list) {
1634161c3f0SJouni Malinen 		/* Channel list override (CTT case) - space separated tuple(s)
1644161c3f0SJouni Malinen 		 * of OperatingClass/Channel; convert to wpa_supplicant/hostapd
1654161c3f0SJouni Malinen 		 * format: comma separated tuples */
1664161c3f0SJouni Malinen 		strlcpy(resp, chan_list, sizeof(resp));
1674161c3f0SJouni Malinen 		for (pos = resp; *pos; pos++) {
1684161c3f0SJouni Malinen 			if (*pos == ' ')
1694161c3f0SJouni Malinen 				*pos = ',';
1704161c3f0SJouni Malinen 		}
1713aa72861SJouni Malinen 		res = snprintf(buf, sizeof(buf),
172e2d1af0aSJouni Malinen 			       "DPP_BOOTSTRAP_GEN type=%s curve=%s chan=%s%s%s",
173e2d1af0aSJouni Malinen 			       type, curve, resp, include_mac ? " mac=" : "",
174e2d1af0aSJouni Malinen 			       include_mac ? mac : "");
1754161c3f0SJouni Malinen 	} else {
176f8d81aa4SJouni Malinen 		int channel = 11;
177f8d81aa4SJouni Malinen 
1784161c3f0SJouni Malinen 		/* Default channel list (normal DUT case) */
179f8d81aa4SJouni Malinen 		if (sigma_dut_is_ap(dut) && dut->hostapd_running &&
180f8d81aa4SJouni Malinen 		    dut->ap_oper_chn &&
181f8d81aa4SJouni Malinen 		    dut->ap_channel > 0 && dut->ap_channel <= 13)
182f8d81aa4SJouni Malinen 			channel = dut->ap_channel;
1833aa72861SJouni Malinen 		res = snprintf(buf, sizeof(buf),
184e2d1af0aSJouni Malinen 			       "DPP_BOOTSTRAP_GEN type=%s curve=%s chan=81/%d%s%s",
185e2d1af0aSJouni Malinen 			       type, curve, channel, include_mac ? " mac=" : "",
186e2d1af0aSJouni Malinen 			       include_mac ? mac : "");
1874161c3f0SJouni Malinen 	}
1884161c3f0SJouni Malinen 
1893aa72861SJouni Malinen 	if (res < 0 || res >= sizeof(buf) ||
19089cf6d64SJouni Malinen 	    wpa_command_resp(ifname, buf, resp, sizeof(resp)) < 0 ||
19189cf6d64SJouni Malinen 	    strncmp(resp, "FAIL", 4) == 0)
19289cf6d64SJouni Malinen 		return ERROR_SEND_STATUS;
193d86e5828SJouni Malinen 	dut->dpp_local_bootstrap = atoi(resp);
194d86e5828SJouni Malinen 	snprintf(buf, sizeof(buf), "DPP_BOOTSTRAP_GET_URI %d",
195d86e5828SJouni Malinen 		 atoi(resp));
19689cf6d64SJouni Malinen 	if (wpa_command_resp(ifname, buf, resp, sizeof(resp)) < 0 ||
19789cf6d64SJouni Malinen 	    strncmp(resp, "FAIL", 4) == 0)
19889cf6d64SJouni Malinen 		return ERROR_SEND_STATUS;
199d86e5828SJouni Malinen 
200d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "URI: %s", resp);
201bc9e055cSSrinivas Dasari 
202bc9e055cSSrinivas Dasari 	if (send_result) {
203d86e5828SJouni Malinen 		ascii2hexstr(resp, hex);
2043aa72861SJouni Malinen 		res = snprintf(resp, sizeof(resp), "BootstrappingData,%s", hex);
2053aa72861SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
2063aa72861SJouni Malinen 			  res >= 0 && res < sizeof(resp) ? resp : NULL);
207bc9e055cSSrinivas Dasari 	}
208bc9e055cSSrinivas Dasari 
209bc9e055cSSrinivas Dasari 	if (success)
210bc9e055cSSrinivas Dasari 		*success = 1;
21189cf6d64SJouni Malinen 	return STATUS_SENT;
212d86e5828SJouni Malinen }
213d86e5828SJouni Malinen 
214d86e5828SJouni Malinen 
dpp_set_peer_bootstrap(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)21589cf6d64SJouni Malinen static enum sigma_cmd_result dpp_set_peer_bootstrap(struct sigma_dut *dut,
216d86e5828SJouni Malinen 						    struct sigma_conn *conn,
217d86e5828SJouni Malinen 						    struct sigma_cmd *cmd)
218d86e5828SJouni Malinen {
219d86e5828SJouni Malinen 	const char *val = get_param(cmd, "DPPBootstrappingdata");
220b1dd21f8SJouni Malinen 	char uri[1000];
221d86e5828SJouni Malinen 	int res;
222d86e5828SJouni Malinen 
223d86e5828SJouni Malinen 	if (!val) {
224d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
225d86e5828SJouni Malinen 			  "errorCode,Missing DPPBootstrappingdata");
22689cf6d64SJouni Malinen 		return STATUS_SENT_ERROR;
227d86e5828SJouni Malinen 	}
228d86e5828SJouni Malinen 
229d86e5828SJouni Malinen 	res = parse_hexstr(val, (unsigned char *) uri, sizeof(uri));
230d86e5828SJouni Malinen 	if (res < 0 || (size_t) res >= sizeof(uri))
23189cf6d64SJouni Malinen 		return ERROR_SEND_STATUS;
232d86e5828SJouni Malinen 	uri[res] = '\0';
233d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "URI: %s", uri);
234b1dd21f8SJouni Malinen 	free(dut->dpp_peer_uri);
235b1dd21f8SJouni Malinen 	dut->dpp_peer_uri = strdup(uri);
236d86e5828SJouni Malinen 
23789cf6d64SJouni Malinen 	return SUCCESS_SEND_STATUS;
238d86e5828SJouni Malinen }
239d86e5828SJouni Malinen 
240d86e5828SJouni Malinen 
dpp_hostapd_conf_update(struct sigma_dut * dut,struct sigma_conn * conn,const char * ifname,struct wpa_ctrl * ctrl)241d86e5828SJouni Malinen static int dpp_hostapd_conf_update(struct sigma_dut *dut,
242d86e5828SJouni Malinen 				   struct sigma_conn *conn, const char *ifname,
243d86e5828SJouni Malinen 				   struct wpa_ctrl *ctrl)
244d86e5828SJouni Malinen {
245d86e5828SJouni Malinen 	int res;
246d86e5828SJouni Malinen 	char buf[2000], buf2[2500], *pos, *pos2;
247b4c5e3b8SJouni Malinen 	const char *conf_data_events[] = {
248b4c5e3b8SJouni Malinen 		"DPP-CONNECTOR",
249b4c5e3b8SJouni Malinen 		"DPP-CONFOBJ-PASS",
250b4c5e3b8SJouni Malinen 		"DPP-CONFOBJ-PSK",
2510cd6e363SJouni Malinen 		"DPP-C-SIGN-KEY",
2520cd6e363SJouni Malinen 		"DPP-NET-ACCESS-KEY",
253b4c5e3b8SJouni Malinen 		NULL
254b4c5e3b8SJouni Malinen 	};
25520465812SJouni Malinen 	unsigned int old_timeout;
2560cd6e363SJouni Malinen 	int legacy_akm, dpp_akm;
2570cd6e363SJouni Malinen 	char *connector = NULL, *psk = NULL, *csign = NULL,
2580cd6e363SJouni Malinen 		*net_access_key = NULL;
2590cd6e363SJouni Malinen 	char pass[64];
2600cd6e363SJouni Malinen 	int pass_len = 0;
2610cd6e363SJouni Malinen 	int ret = 0;
262d86e5828SJouni Malinen 
263d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
264d86e5828SJouni Malinen 			"Update hostapd configuration based on DPP Config Object");
265d86e5828SJouni Malinen 
266d86e5828SJouni Malinen 	if (wpa_command(ifname, "SET wpa 2") < 0 ||
267d86e5828SJouni Malinen 	    wpa_command(ifname, "SET wpa_key_mgmt DPP") < 0 ||
2680d34723dSJouni Malinen 	    wpa_command(ifname, "SET ieee80211w 1") < 0 ||
269d86e5828SJouni Malinen 	    wpa_command(ifname, "SET rsn_pairwise CCMP") < 0) {
270d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
271d86e5828SJouni Malinen 			  "errorCode,Failed to update AP security parameters");
272d86e5828SJouni Malinen 		goto out;
273d86e5828SJouni Malinen 	}
274d86e5828SJouni Malinen 
2750cd6e363SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-CONFOBJ-AKM", buf, sizeof(buf));
2760cd6e363SJouni Malinen 	if (res < 0) {
2770cd6e363SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
2780cd6e363SJouni Malinen 			  "errorCode,No DPP-CONFOBJ-AKM");
2790cd6e363SJouni Malinen 		goto out;
2800cd6e363SJouni Malinen 	}
2810cd6e363SJouni Malinen 	pos = strchr(buf, ' ');
2820cd6e363SJouni Malinen 	if (!pos)
2830cd6e363SJouni Malinen 		return -2;
2840cd6e363SJouni Malinen 	pos++;
2850cd6e363SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
2860cd6e363SJouni Malinen 			"DPP: Config Object AKM: %s", pos);
2870cd6e363SJouni Malinen 	legacy_akm = strstr(pos, "psk") != NULL || strstr(pos, "sae") != NULL;
2880cd6e363SJouni Malinen 	dpp_akm = strstr(pos, "dpp") != NULL;
2890cd6e363SJouni Malinen 
290d86e5828SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-CONFOBJ-SSID",
291d86e5828SJouni Malinen 				buf, sizeof(buf));
292d86e5828SJouni Malinen 	if (res < 0) {
293d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
294d86e5828SJouni Malinen 			  "errorCode,No DPP-CONFOBJ-SSID");
295d86e5828SJouni Malinen 		goto out;
296d86e5828SJouni Malinen 	}
297d86e5828SJouni Malinen 	pos = strchr(buf, ' ');
298d86e5828SJouni Malinen 	if (!pos)
299d86e5828SJouni Malinen 		return -2;
300d86e5828SJouni Malinen 	pos++;
301d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
302d86e5828SJouni Malinen 			"DPP: Config Object SSID: %s", pos);
303d86e5828SJouni Malinen 	snprintf(buf2, sizeof(buf2), "SET ssid %s", pos);
304d86e5828SJouni Malinen 	if (wpa_command(ifname, buf2) < 0) {
305d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
306d86e5828SJouni Malinen 			  "errorCode,Failed to update AP SSID");
307d86e5828SJouni Malinen 		goto out;
308d86e5828SJouni Malinen 	}
309d86e5828SJouni Malinen 
310a7631f10SJouni Malinen 	if (wpa_command(ifname, "SET utf8_ssid 1") < 0) {
311a7631f10SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
312a7631f10SJouni Malinen 			  "errorCode,Failed to update AP UTF-8 SSID capa");
313a7631f10SJouni Malinen 		goto out;
314a7631f10SJouni Malinen 	}
315a7631f10SJouni Malinen 
3160cd6e363SJouni Malinen 	while ((dpp_akm && (!connector || !csign || !net_access_key)) ||
3170cd6e363SJouni Malinen 	       (legacy_akm && !pass_len && !psk)) {
3180cd6e363SJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conf_data_events,
3190cd6e363SJouni Malinen 					 buf, sizeof(buf));
320d86e5828SJouni Malinen 		if (res < 0) {
321d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
3220cd6e363SJouni Malinen 				  "errorCode,Not all config object information received");
323d86e5828SJouni Malinen 			goto out;
324d86e5828SJouni Malinen 		}
325b4c5e3b8SJouni Malinen 
3260cd6e363SJouni Malinen 		if (strstr(buf, "DPP-CONNECTOR")) {
3270cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3280cd6e363SJouni Malinen 			if (!pos) {
3290cd6e363SJouni Malinen 				ret = -2;
3300cd6e363SJouni Malinen 				goto out;
3310cd6e363SJouni Malinen 			}
3320cd6e363SJouni Malinen 			pos++;
3330cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO, "DPP: Connector: %s",
3340cd6e363SJouni Malinen 					pos);
3350cd6e363SJouni Malinen 			if (!connector)
3360cd6e363SJouni Malinen 				connector = strdup(pos);
3370cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-C-SIGN-KEY")) {
3380cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3390cd6e363SJouni Malinen 			if (!pos) {
3400cd6e363SJouni Malinen 				ret = -2;
3410cd6e363SJouni Malinen 				goto out;
3420cd6e363SJouni Malinen 			}
3430cd6e363SJouni Malinen 			pos++;
3440cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
3450cd6e363SJouni Malinen 					"DPP: C-sign-key: %s", pos);
3460cd6e363SJouni Malinen 			if (!csign)
3470cd6e363SJouni Malinen 				csign = strdup(pos);
3480cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-NET-ACCESS-KEY")) {
3490cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3500cd6e363SJouni Malinen 			if (!pos) {
3510cd6e363SJouni Malinen 				ret = -2;
3520cd6e363SJouni Malinen 				goto out;
3530cd6e363SJouni Malinen 			}
3540cd6e363SJouni Malinen 			pos++;
3550cd6e363SJouni Malinen 			if (!net_access_key)
3560cd6e363SJouni Malinen 				net_access_key = strdup(pos);
3570cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-CONFOBJ-PASS")) {
3580cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3590cd6e363SJouni Malinen 			if (!pos) {
3600cd6e363SJouni Malinen 				ret = -2;
3610cd6e363SJouni Malinen 				goto out;
3620cd6e363SJouni Malinen 			}
3630cd6e363SJouni Malinen 			pos++;
3640cd6e363SJouni Malinen 			pass_len = parse_hexstr(pos, (u8 *) pass, sizeof(pass));
3650cd6e363SJouni Malinen 			if (pass_len < 0 || (size_t) pass_len >= sizeof(pass)) {
3660cd6e363SJouni Malinen 				ret = -2;
3670cd6e363SJouni Malinen 				goto out;
3680cd6e363SJouni Malinen 			}
3690cd6e363SJouni Malinen 			pass[pass_len] = '\0';
3700cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
3710cd6e363SJouni Malinen 					"DPP: Passphrase: %s", pass);
3720cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-CONFOBJ-PSK")) {
3730cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3740cd6e363SJouni Malinen 			if (!pos) {
3750cd6e363SJouni Malinen 				ret = -2;
3760cd6e363SJouni Malinen 				goto out;
3770cd6e363SJouni Malinen 			}
3780cd6e363SJouni Malinen 			pos++;
3790cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO, "DPP: PSK: %s", pos);
3800cd6e363SJouni Malinen 			if (!psk)
3810cd6e363SJouni Malinen 				psk = strdup(pos);
3820cd6e363SJouni Malinen 		}
3830cd6e363SJouni Malinen 	}
3840cd6e363SJouni Malinen 
3850cd6e363SJouni Malinen 	if ((!connector || !dpp_akm) &&
3860cd6e363SJouni Malinen 	    wpa_command(ifname, "SET wpa_key_mgmt WPA-PSK") < 0) {
387b4c5e3b8SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
388b4c5e3b8SJouni Malinen 			  "errorCode,Failed to update AP security parameters");
389b4c5e3b8SJouni Malinen 		goto out;
390b4c5e3b8SJouni Malinen 	}
391b4c5e3b8SJouni Malinen 
3920cd6e363SJouni Malinen 	if (connector && dpp_akm && legacy_akm &&
3930cd6e363SJouni Malinen 	    wpa_command(ifname, "SET wpa_key_mgmt DPP WPA-PSK") < 0) {
3940cd6e363SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
3950cd6e363SJouni Malinen 			  "errorCode,Failed to update AP security parameters");
3960cd6e363SJouni Malinen 		goto out;
3970cd6e363SJouni Malinen 	}
398b4c5e3b8SJouni Malinen 
3990cd6e363SJouni Malinen 	if (pass_len) {
400b4c5e3b8SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET wpa_passphrase %s",
401b4c5e3b8SJouni Malinen 			 pass);
402b4c5e3b8SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
403b4c5e3b8SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
404b4c5e3b8SJouni Malinen 				  "errorCode,Failed to set passphrase");
405b4c5e3b8SJouni Malinen 			goto out;
406b4c5e3b8SJouni Malinen 		}
4070cd6e363SJouni Malinen 	} else if (psk) {
4080cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET wpa_psk %s", psk);
409b4c5e3b8SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
410b4c5e3b8SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
411b4c5e3b8SJouni Malinen 				  "errorCode,Failed to set PSK");
412b4c5e3b8SJouni Malinen 			goto out;
413b4c5e3b8SJouni Malinen 		}
414b4c5e3b8SJouni Malinen 	}
415b4c5e3b8SJouni Malinen 
4160cd6e363SJouni Malinen 	if (connector) {
4170cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET dpp_connector %s", connector);
418d86e5828SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
419d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
420d86e5828SJouni Malinen 				  "errorCode,Failed to update AP Connector");
421d86e5828SJouni Malinen 			goto out;
422d86e5828SJouni Malinen 		}
423d86e5828SJouni Malinen 	}
4240cd6e363SJouni Malinen 
4250cd6e363SJouni Malinen 	if (csign) {
4260cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET dpp_csign %s", csign);
427d86e5828SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
428d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
429d86e5828SJouni Malinen 				  "errorCode,Failed to update AP C-sign-key");
430d86e5828SJouni Malinen 			goto out;
431d86e5828SJouni Malinen 		}
432d86e5828SJouni Malinen 	}
4330cd6e363SJouni Malinen 
4340cd6e363SJouni Malinen 	if (net_access_key) {
4350cd6e363SJouni Malinen 		pos2 = strchr(net_access_key, ' ');
436d86e5828SJouni Malinen 		if (pos2)
437d86e5828SJouni Malinen 			*pos2++ = '\0';
4380cd6e363SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "DPP: netAccessKey: %s",
4390cd6e363SJouni Malinen 				net_access_key);
4400cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET dpp_netaccesskey %s",
4410cd6e363SJouni Malinen 			 net_access_key);
442d86e5828SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
443d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
444d86e5828SJouni Malinen 				  "errorCode,Failed to update AP netAccessKey");
445d86e5828SJouni Malinen 			goto out;
446d86e5828SJouni Malinen 		}
447d86e5828SJouni Malinen 		if (pos2) {
448d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
449d86e5828SJouni Malinen 					"DPP: netAccessKey expiry: %s", pos2);
4500cd6e363SJouni Malinen 			snprintf(buf2, sizeof(buf2),
4510cd6e363SJouni Malinen 				 "SET dpp_netaccesskey_expiry %s", pos2);
452d86e5828SJouni Malinen 			if (wpa_command(ifname, buf2) < 0) {
453d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
454d86e5828SJouni Malinen 					  "errorCode,Failed to update AP netAccessKey expiry");
455d86e5828SJouni Malinen 				goto out;
456d86e5828SJouni Malinen 			}
457d86e5828SJouni Malinen 		}
4580cd6e363SJouni Malinen 	}
459d86e5828SJouni Malinen 
4608bb0a7b1SJouni Malinen 	if (dut->ap_start_disabled)
4618bb0a7b1SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "Clear ap_start_disabled");
462d2e9bb3eSJouni Malinen 	if (wpa_command(ifname, "SET start_disabled 0") < 0 &&
463d2e9bb3eSJouni Malinen 	    dut->ap_start_disabled) {
464d2e9bb3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
465d2e9bb3eSJouni Malinen 			  "errorCode,Failed to update AP security parameters");
466d2e9bb3eSJouni Malinen 		goto out;
467d2e9bb3eSJouni Malinen 	}
468d2e9bb3eSJouni Malinen 	dut->ap_start_disabled = 0;
469d2e9bb3eSJouni Malinen 
47020465812SJouni Malinen 	/* Wait for a possible Configuration Result to be sent */
47120465812SJouni Malinen 	old_timeout = dut->default_timeout;
47220465812SJouni Malinen 	dut->default_timeout = 1;
47320465812SJouni Malinen 	get_wpa_cli_event(dut, ctrl, "DPP-TX-STATUS", buf, sizeof(buf));
47420465812SJouni Malinen 	dut->default_timeout = old_timeout;
4758bb0a7b1SJouni Malinen 
4768bb0a7b1SJouni Malinen 	if (dut->ap_oper_chn) {
4778bb0a7b1SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
4788bb0a7b1SJouni Malinen 				"Set AP operating channel %d",
4798bb0a7b1SJouni Malinen 				dut->ap_channel);
4808bb0a7b1SJouni Malinen 		snprintf(buf, sizeof(buf), "SET channel %d", dut->ap_channel);
4818bb0a7b1SJouni Malinen 		wpa_command(ifname, buf);
4828bb0a7b1SJouni Malinen 	}
483d86e5828SJouni Malinen 	if (wpa_command(ifname, "DISABLE") < 0 ||
484d86e5828SJouni Malinen 	    wpa_command(ifname, "ENABLE") < 0) {
485d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
486d86e5828SJouni Malinen 			  "errorCode,Failed to update AP configuration");
487d86e5828SJouni Malinen 		goto out;
488d86e5828SJouni Malinen 	}
489d86e5828SJouni Malinen 
490d86e5828SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "AP-ENABLED", buf, sizeof(buf));
491d86e5828SJouni Malinen 	if (res < 0) {
492d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,No AP-ENABLED");
493d86e5828SJouni Malinen 		goto out;
494d86e5828SJouni Malinen 	}
495d86e5828SJouni Malinen 
4960cd6e363SJouni Malinen 	ret = 1;
497d86e5828SJouni Malinen out:
4980cd6e363SJouni Malinen 	free(connector);
4990cd6e363SJouni Malinen 	free(psk);
5000cd6e363SJouni Malinen 	free(csign);
5010cd6e363SJouni Malinen 	free(net_access_key);
5020cd6e363SJouni Malinen 	return ret;
503d86e5828SJouni Malinen }
504d86e5828SJouni Malinen 
505d86e5828SJouni Malinen 
506772299f1SJouni Malinen struct dpp_test_info {
507772299f1SJouni Malinen 	const char *step;
508772299f1SJouni Malinen 	const char *frame;
509772299f1SJouni Malinen 	const char *attr;
510772299f1SJouni Malinen 	int value;
511772299f1SJouni Malinen };
512772299f1SJouni Malinen 
513772299f1SJouni Malinen static const struct dpp_test_info dpp_tests[] = {
514772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "WrappedData", 1 },
515772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "WrappedData", 2 },
516f96fcee3SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "PrimaryWrappedData", 2 },
517772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "WrappedData", 3 },
518772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRRequest", "WrappedData", 4 },
519772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRResponse", "WrappedData", 5 },
520772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationRequest", "WrappedData", 6 },
521772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationResponse", "WrappedData", 7 },
522772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitCapabilities", 8 },
523772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "RespBSKeyHash", 10 },
524772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitBSKeyHash", 11 },
525772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitProtocolKey", 12 },
526772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitNonce", 13 },
527772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitCapabilities", 14 },
528772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "WrappedData", 15 },
529772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "DPPStatus", 16 },
530772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespBSKeyHash", 17 },
531772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "InitBSKeyHash", 18 },
532772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespProtocolKey", 19 },
533772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespNonce", 20 },
534772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "InitNonce", 21 },
535772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespCapabilities",
536772299f1SJouni Malinen 	  22 },
537772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespAuthTag", 23 },
538772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "WrappedData", 24 },
539f96fcee3SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "PrimaryWrappedData",
540f96fcee3SJouni Malinen 	  24 },
541772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "DPPStatus", 25 },
542772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "RespBSKeyHash", 26 },
543772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "InitBSKeyHash", 27 },
544772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "InitAuthTag", 28 },
545772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "WrappedData", 29 },
546772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "InitNonce", 30 },
547772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespCapabilities", 31 },
548772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespAuthTag", 32 },
549772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "InitAuthTag", 33 },
550772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeRequest", "FiniteCyclicGroup", 34 },
551772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeRequest", "EncryptedKey", 35 },
552772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeResponse", "DPPStatus", 36 },
553772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeResponse", "EncryptedKey", 37 },
554772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRRequest", "BSKey", 38 },
555772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRRequest", "InitAuthTag", 39 },
556772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRRequest", "WrappedData", 40 },
557772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRResponse", "BSKey", 41 },
558772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRResponse", "RespAuthTag", 42 },
559772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRResponse", "WrappedData", 43 },
560772299f1SJouni Malinen 	{ "InvalidValue", "PKEXExchangeRequest", "EncryptedKey", 44 },
561772299f1SJouni Malinen 	{ "InvalidValue", "PKEXExchangeResponse", "EncryptedKey", 45 },
562772299f1SJouni Malinen 	{ "InvalidValue", "PKEXExchangeResponse", "DPPStatus", 46 },
563772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRRequest", "BSKey", 47 },
564772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRResponse", "BSKey", 48 },
565772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRRequest", "InitAuthTag", 49 },
566772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRResponse", "RespAuthTag", 50 },
567772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationRequest", "EnrolleeNonce", 51 },
568772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationRequest", "ConfigAttr", 52 },
569772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationRequest", "WrappedData", 53 },
570772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "EnrolleeNonce", 54 },
571772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "ConfigObj", 55 },
572772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "DPPStatus", 56 },
573772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "WrappedData", 57 },
574772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationResponse", "DPPStatus", 58 },
575772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationResponse", "EnrolleeNonce", 59 },
57653558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryRequest", "TransactionID", 60 },
57753558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryRequest", "Connector", 61 },
57853558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryResponse", "TransactionID", 62 },
57953558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryResponse", "DPPStatus", 63 },
58053558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryResponse", "Connector", 64 },
581ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitProtocolKey", 66 },
582ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespProtocolKey", 67 },
583ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "RespBSKeyHash", 68 },
584ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitBSKeyHash", 69 },
585ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespBSKeyHash", 70 },
586ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "InitBSKeyHash", 71 },
587ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "RespBSKeyHash", 72 },
588ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "InitBSKeyHash", 73 },
589ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "DPPStatus", 74 },
590ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "DPPStatus", 75 },
591ae624487SJouni Malinen 	{ "InvalidValue", "ConfigurationRequest", "ConfigAttr", 76 },
592ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryResponse", "TransactionID", 77 },
593ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryResponse", "DPPStatus", 78 },
594ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryResponse", "Connector", 79 },
595ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryRequest", "Connector", 80 },
59667795a76SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitNonce", 81 },
597188839b6SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryRequest", "TransactionID", 82 },
598188839b6SJouni Malinen 	{ "InvalidValue", "ConfigurationRequest", "EnrolleeNonce", 83 },
5993a6b92a6SJouni Malinen 	{ "Timeout", "PKEXExchangeResponse", NULL, 84 },
6003a6b92a6SJouni Malinen 	{ "Timeout", "PKEXCRRequest", NULL, 85 },
6013a6b92a6SJouni Malinen 	{ "Timeout", "PKEXCRResponse", NULL, 86 },
6023a6b92a6SJouni Malinen 	{ "Timeout", "AuthenticationRequest", NULL, 87 },
6033a6b92a6SJouni Malinen 	{ "Timeout", "AuthenticationResponse", NULL, 88 },
6043a6b92a6SJouni Malinen 	{ "Timeout", "AuthenticationConfirm", NULL, 89 },
6053a6b92a6SJouni Malinen 	{ "Timeout", "ConfigurationRequest", NULL, 90 },
606772299f1SJouni Malinen 	{ NULL, NULL, NULL, 0 }
607772299f1SJouni Malinen };
608772299f1SJouni Malinen 
609772299f1SJouni Malinen 
dpp_get_test(const char * step,const char * frame,const char * attr)610772299f1SJouni Malinen static int dpp_get_test(const char *step, const char *frame, const char *attr)
611772299f1SJouni Malinen {
612772299f1SJouni Malinen 	int i;
613772299f1SJouni Malinen 
614772299f1SJouni Malinen 	for (i = 0; dpp_tests[i].step; i++) {
615772299f1SJouni Malinen 		if (strcasecmp(step, dpp_tests[i].step) == 0 &&
616772299f1SJouni Malinen 		    strcasecmp(frame, dpp_tests[i].frame) == 0 &&
6173a6b92a6SJouni Malinen 		    ((!attr && dpp_tests[i].attr == NULL) ||
6183a6b92a6SJouni Malinen 		     (attr && strcasecmp(attr, dpp_tests[i].attr) == 0)))
619772299f1SJouni Malinen 			return dpp_tests[i].value;
620772299f1SJouni Malinen 	}
621772299f1SJouni Malinen 
622772299f1SJouni Malinen 	return -1;
623772299f1SJouni Malinen }
624772299f1SJouni Malinen 
625772299f1SJouni Malinen 
dpp_wait_tx(struct sigma_dut * dut,struct wpa_ctrl * ctrl,int frame_type)6266792ff4dSJouni Malinen static int dpp_wait_tx(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
6276792ff4dSJouni Malinen 		       int frame_type)
6286792ff4dSJouni Malinen {
6296792ff4dSJouni Malinen 	char buf[200], tmp[20];
6306792ff4dSJouni Malinen 	int res;
6316792ff4dSJouni Malinen 
6326792ff4dSJouni Malinen 	snprintf(tmp, sizeof(tmp), "type=%d", frame_type);
6336792ff4dSJouni Malinen 	for (;;) {
6346792ff4dSJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-TX", buf, sizeof(buf));
6356792ff4dSJouni Malinen 		if (res < 0)
6366792ff4dSJouni Malinen 			return -1;
6376792ff4dSJouni Malinen 		if (strstr(buf, tmp) != NULL)
6386792ff4dSJouni Malinen 			break;
6396792ff4dSJouni Malinen 	}
6406792ff4dSJouni Malinen 
6416792ff4dSJouni Malinen 	return 0;
6426792ff4dSJouni Malinen }
6436792ff4dSJouni Malinen 
6446792ff4dSJouni Malinen 
dpp_wait_tx_status(struct sigma_dut * dut,struct wpa_ctrl * ctrl,int frame_type)645772299f1SJouni Malinen static int dpp_wait_tx_status(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
646772299f1SJouni Malinen 			      int frame_type)
647772299f1SJouni Malinen {
648772299f1SJouni Malinen 	char buf[200], tmp[20];
649772299f1SJouni Malinen 	int res;
650772299f1SJouni Malinen 
651772299f1SJouni Malinen 	snprintf(tmp, sizeof(tmp), "type=%d", frame_type);
652772299f1SJouni Malinen 	for (;;) {
653772299f1SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-TX", buf, sizeof(buf));
654772299f1SJouni Malinen 		if (res < 0)
655772299f1SJouni Malinen 			return -1;
656772299f1SJouni Malinen 		if (strstr(buf, tmp) != NULL)
657772299f1SJouni Malinen 			break;
658772299f1SJouni Malinen 	}
659772299f1SJouni Malinen 
660772299f1SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-TX-STATUS",
661772299f1SJouni Malinen 				buf, sizeof(buf));
662772299f1SJouni Malinen 	if (res < 0 || strstr(buf, "result=FAILED") != NULL)
663772299f1SJouni Malinen 		return -1;
664772299f1SJouni Malinen 
665772299f1SJouni Malinen 	return 0;
666772299f1SJouni Malinen }
667772299f1SJouni Malinen 
668772299f1SJouni Malinen 
dpp_wait_rx(struct sigma_dut * dut,struct wpa_ctrl * ctrl,int frame_type,unsigned int max_wait)6693a6b92a6SJouni Malinen static int dpp_wait_rx(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
6703e4344e7SJouni Malinen 		       int frame_type, unsigned int max_wait)
6713a6b92a6SJouni Malinen {
6723a6b92a6SJouni Malinen 	char buf[200], tmp[20];
6733a6b92a6SJouni Malinen 	int res;
6749a3415c2SJouni Malinen 	unsigned int old_timeout;
6759a3415c2SJouni Malinen 
6769a3415c2SJouni Malinen 	old_timeout = dut->default_timeout;
6779a3415c2SJouni Malinen 	if (max_wait > 0 && dut->default_timeout > max_wait)
6789a3415c2SJouni Malinen 		dut->default_timeout = max_wait;
6793a6b92a6SJouni Malinen 
6803a6b92a6SJouni Malinen 	snprintf(tmp, sizeof(tmp), "type=%d", frame_type);
6813a6b92a6SJouni Malinen 	for (;;) {
6823a6b92a6SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-RX", buf, sizeof(buf));
6839a3415c2SJouni Malinen 		if (res < 0) {
6849a3415c2SJouni Malinen 			dut->default_timeout = old_timeout;
6853a6b92a6SJouni Malinen 			return -1;
6869a3415c2SJouni Malinen 		}
6873a6b92a6SJouni Malinen 		if (strstr(buf, tmp) != NULL)
6883a6b92a6SJouni Malinen 			break;
6893a6b92a6SJouni Malinen 	}
6903a6b92a6SJouni Malinen 
6919a3415c2SJouni Malinen 	dut->default_timeout = old_timeout;
6929a3415c2SJouni Malinen 	return 0;
6939a3415c2SJouni Malinen }
6949a3415c2SJouni Malinen 
6959a3415c2SJouni Malinen 
dpp_wait_rx_conf_req(struct sigma_dut * dut,struct wpa_ctrl * ctrl,unsigned int max_wait)6969a3415c2SJouni Malinen static int dpp_wait_rx_conf_req(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
6973e4344e7SJouni Malinen 				unsigned int max_wait)
6989a3415c2SJouni Malinen {
6999a3415c2SJouni Malinen 	char buf[200];
7009a3415c2SJouni Malinen 	int res;
7019a3415c2SJouni Malinen 	unsigned int old_timeout;
7029a3415c2SJouni Malinen 
7039a3415c2SJouni Malinen 	old_timeout = dut->default_timeout;
7049a3415c2SJouni Malinen 	if (max_wait > 0 && dut->default_timeout > max_wait)
7059a3415c2SJouni Malinen 		dut->default_timeout = max_wait;
7069a3415c2SJouni Malinen 
7079a3415c2SJouni Malinen 	for (;;) {
7089a3415c2SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CONF-REQ-RX",
7099a3415c2SJouni Malinen 					buf, sizeof(buf));
7109a3415c2SJouni Malinen 		if (res < 0) {
7119a3415c2SJouni Malinen 			dut->default_timeout = old_timeout;
7129a3415c2SJouni Malinen 			return -1;
7139a3415c2SJouni Malinen 		}
7149a3415c2SJouni Malinen 
7159a3415c2SJouni Malinen 		break;
7169a3415c2SJouni Malinen 	}
7179a3415c2SJouni Malinen 
7189a3415c2SJouni Malinen 	dut->default_timeout = old_timeout;
7193a6b92a6SJouni Malinen 	return 0;
7203a6b92a6SJouni Malinen }
7213a6b92a6SJouni Malinen 
7223a6b92a6SJouni Malinen 
dpp_scan_peer_qrcode(struct sigma_dut * dut)723bc9e055cSSrinivas Dasari static int dpp_scan_peer_qrcode(struct sigma_dut *dut)
724d86e5828SJouni Malinen {
7251a38cc37SJouni Malinen #ifdef ANDROID
726bc9e055cSSrinivas Dasari 	char buf[100];
727bc9e055cSSrinivas Dasari 	char *buf2 = NULL;
728bc9e055cSSrinivas Dasari 	FILE *fp = NULL;
729bc9e055cSSrinivas Dasari 	uint32_t length;
730bc9e055cSSrinivas Dasari 	unsigned int count;
731bc9e055cSSrinivas Dasari 
732bc9e055cSSrinivas Dasari 	unlink(dpp_qrcode_file);
733bc9e055cSSrinivas Dasari 
734bc9e055cSSrinivas Dasari 	snprintf(buf, sizeof(buf),
73507458342SJouni Malinen 		 "am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeReadActivity");
736bc9e055cSSrinivas Dasari 	if (system(buf) != 0) {
73707458342SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
73807458342SJouni Malinen 				"Failed to launch QR Code scanner");
739d86e5828SJouni Malinen 		return -1;
740d86e5828SJouni Malinen 	}
741d86e5828SJouni Malinen 
742bc9e055cSSrinivas Dasari 	count = 0;
743bc9e055cSSrinivas Dasari 	while (!(fp = fopen(dpp_qrcode_file, "r"))) {
744bc9e055cSSrinivas Dasari 		if (count > dut->default_timeout) {
745bc9e055cSSrinivas Dasari 			sigma_dut_print(dut, DUT_MSG_ERROR,
746bc9e055cSSrinivas Dasari 					"Failed to open dpp_qrcode_file - QR Code scanning timed out");
747bc9e055cSSrinivas Dasari 			return -1;
748bc9e055cSSrinivas Dasari 		}
749bc9e055cSSrinivas Dasari 
750bc9e055cSSrinivas Dasari 		sleep(1);
751bc9e055cSSrinivas Dasari 		count++;
752bc9e055cSSrinivas Dasari 	}
753bc9e055cSSrinivas Dasari 
754bc9e055cSSrinivas Dasari 	if (fseek(fp, 0, SEEK_END) < 0 || (length = ftell(fp)) <= 0 ||
755bc9e055cSSrinivas Dasari 	    fseek(fp, 0, SEEK_SET) < 0) {
756bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_ERROR,
757bc9e055cSSrinivas Dasari 				"Failed to get QR Code result file length");
758bc9e055cSSrinivas Dasari 		fclose(fp);
759bc9e055cSSrinivas Dasari 		return -1;
760bc9e055cSSrinivas Dasari 	}
761bc9e055cSSrinivas Dasari 
762bc9e055cSSrinivas Dasari 	buf2 = malloc(length + 1);
763bc9e055cSSrinivas Dasari 	if (!buf2) {
764bc9e055cSSrinivas Dasari 		fclose(fp);
765bc9e055cSSrinivas Dasari 		return -1;
766bc9e055cSSrinivas Dasari 	}
767bc9e055cSSrinivas Dasari 
768bc9e055cSSrinivas Dasari 	if (fread(buf2, 1, length, fp) != length) {
769bc9e055cSSrinivas Dasari 		fclose(fp);
770bc9e055cSSrinivas Dasari 		free(buf2);
771bc9e055cSSrinivas Dasari 		return -1;
772bc9e055cSSrinivas Dasari 	}
773bc9e055cSSrinivas Dasari 
774bc9e055cSSrinivas Dasari 	fclose(fp);
775bc9e055cSSrinivas Dasari 	buf2[length] = '\0';
776bc9e055cSSrinivas Dasari 
777bc9e055cSSrinivas Dasari 	free(dut->dpp_peer_uri);
778bc9e055cSSrinivas Dasari 	dut->dpp_peer_uri = strdup(buf2);
779bc9e055cSSrinivas Dasari 	free(buf2);
780bc9e055cSSrinivas Dasari 	return 0;
7811a38cc37SJouni Malinen #else /* ANDROID */
7821a38cc37SJouni Malinen 	pid_t pid;
7831a38cc37SJouni Malinen 	int pid_status;
7841a38cc37SJouni Malinen 	int pipe_out[2];
7851a38cc37SJouni Malinen 	char buf[4000], *pos;
7861a38cc37SJouni Malinen 	ssize_t len;
7871a38cc37SJouni Malinen 	int res = -1, ret;
7881a38cc37SJouni Malinen 	struct timeval tv;
7891a38cc37SJouni Malinen 	fd_set rfd;
7901a38cc37SJouni Malinen 
7911a38cc37SJouni Malinen 	if (pipe(pipe_out) != 0) {
7921a38cc37SJouni Malinen 		perror("pipe");
7931a38cc37SJouni Malinen 		return -1;
7941a38cc37SJouni Malinen 	}
7951a38cc37SJouni Malinen 
7961a38cc37SJouni Malinen 	pid = fork();
7971a38cc37SJouni Malinen 	if (pid < 0) {
7981a38cc37SJouni Malinen 		perror("fork");
7991a38cc37SJouni Malinen 		close(pipe_out[0]);
8001a38cc37SJouni Malinen 		close(pipe_out[1]);
8011a38cc37SJouni Malinen 		return -1;
8021a38cc37SJouni Malinen 	}
8031a38cc37SJouni Malinen 
8041a38cc37SJouni Malinen 	if (pid == 0) {
8051a38cc37SJouni Malinen 		char *argv[4] = { "zbarcam", "--raw", "--prescale=320x240",
8061a38cc37SJouni Malinen 				  NULL };
8071a38cc37SJouni Malinen 
8081a38cc37SJouni Malinen 		dup2(pipe_out[1], STDOUT_FILENO);
8091a38cc37SJouni Malinen 		close(pipe_out[0]);
8101a38cc37SJouni Malinen 		close(pipe_out[1]);
8111a38cc37SJouni Malinen 		execv("/usr/bin/zbarcam", argv);
8121a38cc37SJouni Malinen 		perror("execv");
8131a38cc37SJouni Malinen 		exit(0);
8141a38cc37SJouni Malinen 		return -1;
8151a38cc37SJouni Malinen 	}
8161a38cc37SJouni Malinen 
8171a38cc37SJouni Malinen 	close(pipe_out[1]);
8181a38cc37SJouni Malinen 
8191a38cc37SJouni Malinen 	FD_ZERO(&rfd);
8201a38cc37SJouni Malinen 	FD_SET(pipe_out[0], &rfd);
8211a38cc37SJouni Malinen 	tv.tv_sec = dut->default_timeout;
8221a38cc37SJouni Malinen 	tv.tv_usec = 0;
8231a38cc37SJouni Malinen 
8241a38cc37SJouni Malinen 	ret = select(pipe_out[0] + 1, &rfd, NULL, NULL, &tv);
8251a38cc37SJouni Malinen 	if (ret < 0) {
8261a38cc37SJouni Malinen 		perror("select");
8271a38cc37SJouni Malinen 		goto out;
8281a38cc37SJouni Malinen 	}
8291a38cc37SJouni Malinen 	if (ret == 0) {
8301a38cc37SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG,
8311a38cc37SJouni Malinen 				"QR Code scanning timed out");
8321a38cc37SJouni Malinen 		goto out;
8331a38cc37SJouni Malinen 	}
8341a38cc37SJouni Malinen 
8351a38cc37SJouni Malinen 	len = read(pipe_out[0], buf, sizeof(buf));
8361a38cc37SJouni Malinen 	if (len <= 0)
8371a38cc37SJouni Malinen 		goto out;
8381a38cc37SJouni Malinen 	if (len == sizeof(buf))
8391a38cc37SJouni Malinen 		len--;
8401a38cc37SJouni Malinen 	buf[len] = '\0';
8411a38cc37SJouni Malinen 	pos = strchr(buf, '\n');
8421a38cc37SJouni Malinen 	if (pos)
8431a38cc37SJouni Malinen 		*pos = '\0';
8441a38cc37SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "URI from QR scanner: %s", buf);
8451a38cc37SJouni Malinen 
8461a38cc37SJouni Malinen 	free(dut->dpp_peer_uri);
8471a38cc37SJouni Malinen 	dut->dpp_peer_uri = strdup(buf);
8481a38cc37SJouni Malinen 	res = 0;
8491a38cc37SJouni Malinen out:
8501a38cc37SJouni Malinen 	close(pipe_out[0]);
8511a38cc37SJouni Malinen 	kill(pid, SIGTERM);
8521a38cc37SJouni Malinen 	waitpid(pid, &pid_status, 0);
8531a38cc37SJouni Malinen 
8541a38cc37SJouni Malinen 	return res;
8551a38cc37SJouni Malinen #endif /* ANDROID */
856bc9e055cSSrinivas Dasari }
857bc9e055cSSrinivas Dasari 
858bc9e055cSSrinivas Dasari 
dpp_display_own_qrcode(struct sigma_dut * dut)859bc9e055cSSrinivas Dasari static int dpp_display_own_qrcode(struct sigma_dut *dut)
860bc9e055cSSrinivas Dasari {
861bc9e055cSSrinivas Dasari 	char buf[200], resp[2000];
862016ae6c8SJouni Malinen 	const char *ifname = get_station_ifname(dut);
8631a38cc37SJouni Malinen #ifdef ANDROID
864bc9e055cSSrinivas Dasari 	FILE *fp;
8651a38cc37SJouni Malinen #else /* ANDROID */
8661a38cc37SJouni Malinen 	pid_t pid;
8671a38cc37SJouni Malinen 	int pid_status;
8681a38cc37SJouni Malinen #endif /* ANDROID */
869bc9e055cSSrinivas Dasari 
870bc9e055cSSrinivas Dasari 	snprintf(buf, sizeof(buf), "DPP_BOOTSTRAP_GET_URI %d",
871bc9e055cSSrinivas Dasari 		 dut->dpp_local_bootstrap);
872bc9e055cSSrinivas Dasari 	if (wpa_command_resp(ifname, buf, resp, sizeof(resp)) < 0 ||
873bc9e055cSSrinivas Dasari 	    strncmp(resp, "FAIL", 4) == 0)
874bc9e055cSSrinivas Dasari 		return -2;
8751a38cc37SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "Own bootstrap URI: %s", resp);
876bc9e055cSSrinivas Dasari 
8771a38cc37SJouni Malinen #ifdef ANDROID
878bc9e055cSSrinivas Dasari 	unlink(dpp_qrcode_file);
879bc9e055cSSrinivas Dasari 
880bc9e055cSSrinivas Dasari 	fp = fopen(dpp_qrcode_file, "w");
881bc9e055cSSrinivas Dasari 	if (!fp) {
882bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_ERROR, "Failed to open file %s",
883bc9e055cSSrinivas Dasari 				dpp_qrcode_file);
884bc9e055cSSrinivas Dasari 		return -2;
885bc9e055cSSrinivas Dasari 	}
886bc9e055cSSrinivas Dasari 
887bc9e055cSSrinivas Dasari 	fwrite(resp, 1, strlen(resp), fp);
888bc9e055cSSrinivas Dasari 	fclose(fp);
889bc9e055cSSrinivas Dasari 
890bc9e055cSSrinivas Dasari 	snprintf(buf, sizeof(buf),
891bc9e055cSSrinivas Dasari 		 "am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeDisplayActivity");
892bc9e055cSSrinivas Dasari 	if (system(buf) != 0) {
893bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_ERROR, "Failed to display QR Code");
894bc9e055cSSrinivas Dasari 		return -1;
895bc9e055cSSrinivas Dasari 	}
8961a38cc37SJouni Malinen #else /* ANDROID */
8971a38cc37SJouni Malinen 	pid = fork();
8981a38cc37SJouni Malinen 	if (pid < 0) {
8991a38cc37SJouni Malinen 		perror("fork");
9001a38cc37SJouni Malinen 		return -1;
9011a38cc37SJouni Malinen 	}
9021a38cc37SJouni Malinen 
9031a38cc37SJouni Malinen 	if (pid == 0) {
9041a38cc37SJouni Malinen 		char *argv[3] = { "qr", resp, NULL };
9051a38cc37SJouni Malinen 
9061a38cc37SJouni Malinen 		execv("/usr/bin/qr", argv);
9071a38cc37SJouni Malinen 		perror("execv");
9081a38cc37SJouni Malinen 		exit(0);
9091a38cc37SJouni Malinen 		return -1;
9101a38cc37SJouni Malinen 	}
9111a38cc37SJouni Malinen 
9121a38cc37SJouni Malinen 	waitpid(pid, &pid_status, 0);
9131a38cc37SJouni Malinen #endif /* ANDROID */
914bc9e055cSSrinivas Dasari 
915bc9e055cSSrinivas Dasari 	return 0;
916bc9e055cSSrinivas Dasari }
917bc9e055cSSrinivas Dasari 
918d86e5828SJouni Malinen 
dpp_process_auth_response(struct sigma_dut * dut,struct sigma_conn * conn,struct wpa_ctrl * ctrl,const char ** auth_events,const char * action_type,int check_mutual,char * buf,size_t buflen)9198d88d822SSrinivas Dasari static int dpp_process_auth_response(struct sigma_dut *dut,
9208d88d822SSrinivas Dasari 				     struct sigma_conn *conn,
9218d88d822SSrinivas Dasari 				     struct wpa_ctrl *ctrl,
9228d88d822SSrinivas Dasari 				     const char **auth_events,
9238d88d822SSrinivas Dasari 				     const char *action_type,
9248d88d822SSrinivas Dasari 				     int check_mutual, char *buf, size_t buflen)
9258d88d822SSrinivas Dasari {
9268d88d822SSrinivas Dasari 	int res;
9278d88d822SSrinivas Dasari 
9288d88d822SSrinivas Dasari 	res = get_wpa_cli_events(dut, ctrl, auth_events, buf, buflen);
9298d88d822SSrinivas Dasari 	if (res < 0) {
9308d88d822SSrinivas Dasari 		send_resp(dut, conn, SIGMA_COMPLETE,
9318d88d822SSrinivas Dasari 			  "BootstrapResult,OK,AuthResult,Timeout");
9328d88d822SSrinivas Dasari 		return res;
9338d88d822SSrinivas Dasari 	}
9348d88d822SSrinivas Dasari 	sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth result: %s", buf);
9358d88d822SSrinivas Dasari 
9368d88d822SSrinivas Dasari 	if (strstr(buf, "DPP-RESPONSE-PENDING")) {
9378d88d822SSrinivas Dasari 		/* Display own QR code in manual mode */
9388d88d822SSrinivas Dasari 		if (action_type && strcasecmp(action_type, "ManualDPP") == 0 &&
9398d88d822SSrinivas Dasari 		    dpp_display_own_qrcode(dut) < 0) {
9408d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_ERROR,
9418d88d822SSrinivas Dasari 				  "errorCode,Failed to display own QR code");
9428d88d822SSrinivas Dasari 			return -1;
9438d88d822SSrinivas Dasari 		}
9448d88d822SSrinivas Dasari 
9458d88d822SSrinivas Dasari 		/* Wait for the actual result after the peer has scanned the
9468d88d822SSrinivas Dasari 		 * QR Code. */
9478d88d822SSrinivas Dasari 		res = get_wpa_cli_events(dut, ctrl, auth_events,
9488d88d822SSrinivas Dasari 					 buf, buflen);
9498d88d822SSrinivas Dasari 		if (res < 0) {
9508d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_COMPLETE,
9518d88d822SSrinivas Dasari 				  "BootstrapResult,OK,AuthResult,Timeout");
9528d88d822SSrinivas Dasari 			return res;
9538d88d822SSrinivas Dasari 		}
9548d88d822SSrinivas Dasari 
9558d88d822SSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth result: %s", buf);
956ed629d51SJouni Malinen 	} else if (strstr(buf, "DPP-AUTH-INIT-FAILED")) {
957*bf7f2954SSunil Dutt 		send_resp(dut, conn, SIGMA_COMPLETE,
958*bf7f2954SSunil Dutt 			  "BootstrapResult,OK,AuthResult,Timeout");
959ed629d51SJouni Malinen 		return -1;
9608d88d822SSrinivas Dasari 	}
9618d88d822SSrinivas Dasari 
9628d88d822SSrinivas Dasari 	if (check_mutual) {
9638d88d822SSrinivas Dasari 		if (strstr(buf, "DPP-NOT-COMPATIBLE")) {
9648d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_COMPLETE,
9658d88d822SSrinivas Dasari 				  "BootstrapResult,OK,AuthResult,ROLES_NOT_COMPATIBLE");
9668d88d822SSrinivas Dasari 			return -1;
9678d88d822SSrinivas Dasari 		}
9688d88d822SSrinivas Dasari 
9698d88d822SSrinivas Dasari 		if (!strstr(buf, "DPP-AUTH-DIRECTION")) {
9708d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_ERROR,
9718d88d822SSrinivas Dasari 				  "errorCode,No event for auth direction seen");
9728d88d822SSrinivas Dasari 			return -1;
9738d88d822SSrinivas Dasari 		}
9748d88d822SSrinivas Dasari 
9758d88d822SSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth direction: %s",
9768d88d822SSrinivas Dasari 				buf);
9778d88d822SSrinivas Dasari 		if (strstr(buf, "mutual=1") == NULL) {
9788d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_ERROR,
9798d88d822SSrinivas Dasari 				  "errorCode,Peer did not use mutual authentication");
9808d88d822SSrinivas Dasari 			return -1;
9818d88d822SSrinivas Dasari 		}
9828d88d822SSrinivas Dasari 	}
9838d88d822SSrinivas Dasari 
9848d88d822SSrinivas Dasari 	return 0;
9858d88d822SSrinivas Dasari }
9868d88d822SSrinivas Dasari 
9878d88d822SSrinivas Dasari 
dpp_process_csr(struct sigma_dut * dut,const char * ifname,char * csr_event)9889541ee87SJouni Malinen static int dpp_process_csr(struct sigma_dut *dut, const char *ifname,
9899541ee87SJouni Malinen 			   char *csr_event)
9909541ee87SJouni Malinen {
9919541ee87SJouni Malinen 	FILE *f;
9929541ee87SJouni Malinen 	char buf[2000], cmd[2500], tmp[300];
9939541ee87SJouni Malinen 	char *pos;
9949541ee87SJouni Malinen 	int peer;
9959541ee87SJouni Malinen 	size_t len;
9969541ee87SJouni Malinen 
9979541ee87SJouni Malinen 	pos = strstr(csr_event, " peer=");
9989541ee87SJouni Malinen 	if (!pos) {
9999541ee87SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "No peer id known for CSR");
10009541ee87SJouni Malinen 		return -1;
10019541ee87SJouni Malinen 	}
10029541ee87SJouni Malinen 	pos += 6;
10039541ee87SJouni Malinen 	peer = atoi(pos);
10049541ee87SJouni Malinen 
10059541ee87SJouni Malinen 	pos = strstr(csr_event, " csr=");
10069541ee87SJouni Malinen 	if (!pos) {
10079541ee87SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "No CSR found");
10089541ee87SJouni Malinen 		return -1;
10099541ee87SJouni Malinen 	}
10109541ee87SJouni Malinen 	pos += 5;
10119541ee87SJouni Malinen 
10129541ee87SJouni Malinen 	snprintf(tmp, sizeof(tmp), "%s/dpp-ca-certbag", sigma_cert_path);
10139541ee87SJouni Malinen 	unlink(tmp);
10149541ee87SJouni Malinen 
10159541ee87SJouni Malinen 	snprintf(tmp, sizeof(tmp), "%s/dpp-ca-csr", sigma_cert_path);
10169541ee87SJouni Malinen 	f = fopen(tmp, "w");
10179541ee87SJouni Malinen 	if (!f) {
10189541ee87SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "Failed to write CSR file");
10199541ee87SJouni Malinen 		return -1;
10209541ee87SJouni Malinen 	}
10219541ee87SJouni Malinen 	fprintf(f, "%s", pos);
10229541ee87SJouni Malinen 	fclose(f);
10239541ee87SJouni Malinen 
10249541ee87SJouni Malinen 	if (run_system_wrapper(dut, "./dpp-ca.py %s", sigma_cert_path) < 0) {
10259541ee87SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "Failed to run dpp-ca.py");
10269541ee87SJouni Malinen 		return -1;
10279541ee87SJouni Malinen 	}
10289541ee87SJouni Malinen 
10299541ee87SJouni Malinen 	snprintf(tmp, sizeof(tmp), "%s/dpp-ca-certbag", sigma_cert_path);
10309541ee87SJouni Malinen 	f = fopen(tmp, "r");
10319541ee87SJouni Malinen 	if (!f) {
10329541ee87SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "No certBag available");
10339541ee87SJouni Malinen 		return -1;
10349541ee87SJouni Malinen 	}
10359541ee87SJouni Malinen 	len = fread(buf, 1, sizeof(buf), f);
10369541ee87SJouni Malinen 	fclose(f);
10379541ee87SJouni Malinen 	if (len >= sizeof(buf)) {
10389541ee87SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "No bufferroom for certBag");
10399541ee87SJouni Malinen 		return -1;
10409541ee87SJouni Malinen 	}
10419541ee87SJouni Malinen 	buf[len] = '\0';
10429541ee87SJouni Malinen 
10439541ee87SJouni Malinen 	snprintf(cmd, sizeof(cmd), "DPP_CA_SET peer=%d name=certBag value=%s",
10449541ee87SJouni Malinen 		 peer, buf);
10459541ee87SJouni Malinen 	if (wpa_command(ifname, cmd) < 0) {
10469541ee87SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "DPP_CA_SET failed");
10479541ee87SJouni Malinen 		return -1;
10489541ee87SJouni Malinen 	}
10499541ee87SJouni Malinen 
10509541ee87SJouni Malinen 	return 0;
10519541ee87SJouni Malinen }
10529541ee87SJouni Malinen 
10539541ee87SJouni Malinen 
dpp_automatic_dpp(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)105489cf6d64SJouni Malinen static enum sigma_cmd_result dpp_automatic_dpp(struct sigma_dut *dut,
1055d86e5828SJouni Malinen 					       struct sigma_conn *conn,
1056d86e5828SJouni Malinen 					       struct sigma_cmd *cmd)
1057d86e5828SJouni Malinen {
1058d86e5828SJouni Malinen 	const char *bs = get_param(cmd, "DPPBS");
1059ed629d51SJouni Malinen 	const char *type = get_param(cmd, "DPPActionType");
1060d86e5828SJouni Malinen 	const char *auth_role = get_param(cmd, "DPPAuthRole");
1061d86e5828SJouni Malinen 	const char *prov_role = get_param(cmd, "DPPProvisioningRole");
1062d86e5828SJouni Malinen 	const char *pkex_code = get_param(cmd, "DPPPKEXCode");
1063d86e5828SJouni Malinen 	const char *pkex_code_id = get_param(cmd, "DPPPKEXCodeIdentifier");
1064d86e5828SJouni Malinen 	const char *wait_conn = get_param(cmd, "DPPWaitForConnect");
1065d86e5828SJouni Malinen 	const char *self_conf = get_param(cmd, "DPPSelfConfigure");
1066772299f1SJouni Malinen 	const char *step = get_param(cmd, "DPPStep");
1067772299f1SJouni Malinen 	const char *frametype = get_param(cmd, "DPPFrameType");
1068772299f1SJouni Malinen 	const char *attr = get_param(cmd, "DPPIEAttribute");
1069bc9e055cSSrinivas Dasari 	const char *action_type = get_param(cmd, "DPPActionType");
1070785afb44SJouni Malinen 	const char *tcp = get_param(cmd, "DPPOverTCP");
1071f37fda0fSJouni Malinen 	const char *nfc_handover = get_param(cmd, "DPPNFCHandover");
1072d86e5828SJouni Malinen 	const char *role;
1073a28608abSJouni Malinen 	const char *netrole = NULL;
1074d86e5828SJouni Malinen 	const char *val;
1075d86e5828SJouni Malinen 	const char *conf_role;
1076d86e5828SJouni Malinen 	int conf_index = -1;
10773d16ccbdSJouni Malinen 	char buf[2000], *pos, *pos2;
1078dd85cff0SJouni Malinen 	char buf2[200];
1079d86e5828SJouni Malinen 	char conf_ssid[100];
1080d86e5828SJouni Malinen 	char conf_pass[100];
10819541ee87SJouni Malinen 	char csrattrs[200];
1082d86e5828SJouni Malinen 	char pkex_identifier[200];
1083d86e5828SJouni Malinen 	struct wpa_ctrl *ctrl;
1084d86e5828SJouni Malinen 	int res;
1085d86e5828SJouni Malinen 	unsigned int old_timeout;
1086d86e5828SJouni Malinen 	int own_pkex_id = -1;
1087016ae6c8SJouni Malinen 	const char *ifname = get_station_ifname(dut);
1088d86e5828SJouni Malinen 	const char *auth_events[] = {
1089d86e5828SJouni Malinen 		"DPP-AUTH-SUCCESS",
1090ed629d51SJouni Malinen 		"DPP-AUTH-INIT-FAILED",
1091d86e5828SJouni Malinen 		"DPP-NOT-COMPATIBLE",
1092d86e5828SJouni Malinen 		"DPP-RESPONSE-PENDING",
1093d86e5828SJouni Malinen 		"DPP-SCAN-PEER-QR-CODE",
1094bc9e055cSSrinivas Dasari 		"DPP-AUTH-DIRECTION",
1095d86e5828SJouni Malinen 		NULL
1096d86e5828SJouni Malinen 	};
1097d86e5828SJouni Malinen 	const char *conf_events[] = {
1098d86e5828SJouni Malinen 		"DPP-CONF-RECEIVED",
1099d86e5828SJouni Malinen 		"DPP-CONF-SENT",
1100d86e5828SJouni Malinen 		"DPP-CONF-FAILED",
110183bfc38fSJouni Malinen 		"DPP-MUD-URL",
1102d86e5828SJouni Malinen 		NULL
1103d86e5828SJouni Malinen 	};
1104d86e5828SJouni Malinen 	const char *conn_events[] = {
1105d86e5828SJouni Malinen 		"PMKSA-CACHE-ADDED",
1106d86e5828SJouni Malinen 		"CTRL-EVENT-CONNECTED",
1107d86e5828SJouni Malinen 		NULL
1108d86e5828SJouni Malinen 	};
110911ab72c2SPurushottam Kushwaha 	const char *group_id_str = NULL;
111011ab72c2SPurushottam Kushwaha 	char group_id[100];
1111dd85cff0SJouni Malinen 	char conf2[300];
1112772299f1SJouni Malinen 	const char *result;
1113d1e22f76SJouni Malinen 	int check_mutual = 0;
1114e89cdbf5SJouni Malinen 	int enrollee_ap;
1115a28608abSJouni Malinen 	int enrollee_configurator;
1116f2fa0d00SJouni Malinen 	int force_gas_fragm = 0;
111785a5a2e5SJouni Malinen 	int not_dpp_akm = 0;
11187a7ecf73SJouni Malinen 	int akm_use_selector = 0;
11199be22eddSJouni Malinen 	int conn_status;
1120c240fe5aSJouni Malinen 	int chirp = 0;
1121ed629d51SJouni Malinen 	int manual = strcasecmp(type, "ManualDPP") == 0;
1122ee7975a7SJouni Malinen 	time_t start, now;
11239541ee87SJouni Malinen 	FILE *f;
112483bfc38fSJouni Malinen 	char *no_mud_url = "";
112583bfc38fSJouni Malinen 	char *mud_url = no_mud_url;
1126ee7975a7SJouni Malinen 
1127ee7975a7SJouni Malinen 	time(&start);
1128d86e5828SJouni Malinen 
1129d86e5828SJouni Malinen 	if (!wait_conn)
1130d86e5828SJouni Malinen 		wait_conn = "no";
1131d86e5828SJouni Malinen 	if (!self_conf)
1132d86e5828SJouni Malinen 		self_conf = "no";
1133d86e5828SJouni Malinen 
1134d86e5828SJouni Malinen 	if (!prov_role) {
1135d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1136d86e5828SJouni Malinen 			  "errorCode,Missing DPPProvisioningRole");
113789cf6d64SJouni Malinen 		return STATUS_SENT_ERROR;
1138d86e5828SJouni Malinen 	}
1139d86e5828SJouni Malinen 
1140e89cdbf5SJouni Malinen 	val = get_param(cmd, "DPPConfEnrolleeRole");
1141a28608abSJouni Malinen 	if (val) {
1142e89cdbf5SJouni Malinen 		enrollee_ap = strcasecmp(val, "AP") == 0;
1143a28608abSJouni Malinen 		enrollee_configurator = strcasecmp(val, "Configurator") == 0;
1144a28608abSJouni Malinen 	} else {
1145e89cdbf5SJouni Malinen 		enrollee_ap = sigma_dut_is_ap(dut);
1146a28608abSJouni Malinen 		enrollee_configurator = 0;
1147a28608abSJouni Malinen 	}
1148a28608abSJouni Malinen 
1149a28608abSJouni Malinen 	val = get_param(cmd, "DPPNetworkRole");
1150a28608abSJouni Malinen 	if (val) {
1151a28608abSJouni Malinen 		if (strcasecmp(val, "AP") == 0) {
1152a28608abSJouni Malinen 			netrole = "ap";
1153a28608abSJouni Malinen 		} else if (strcasecmp(val, "STA") == 0) {
1154a28608abSJouni Malinen 			netrole = "sta";
1155a28608abSJouni Malinen 		} else if (strcasecmp(val, "Configurator") == 0) {
1156a28608abSJouni Malinen 			netrole = "configurator";
1157a28608abSJouni Malinen 		} else {
1158a28608abSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1159a28608abSJouni Malinen 				  "errorCode,Unsupported DPPNetworkRole value");
116089cf6d64SJouni Malinen 			return STATUS_SENT_ERROR;
1161a28608abSJouni Malinen 		}
1162a28608abSJouni Malinen 	}
1163e89cdbf5SJouni Malinen 
1164c240fe5aSJouni Malinen 	val = get_param(cmd, "DPPChirp");
1165c240fe5aSJouni Malinen 	if (val)
1166c240fe5aSJouni Malinen 		chirp = get_enable_disable(val);
1167c240fe5aSJouni Malinen 
11683a6b92a6SJouni Malinen 	if ((step || frametype) && (!step || !frametype)) {
1169772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1170772299f1SJouni Malinen 			  "errorCode,Invalid DPPStep,DPPFrameType,DPPIEAttribute combination");
117189cf6d64SJouni Malinen 		return STATUS_SENT_ERROR;
1172772299f1SJouni Malinen 	}
1173772299f1SJouni Malinen 
117490776b1fSJouni Malinen 	val = get_param(cmd, "MUDURL");
117590776b1fSJouni Malinen 	if (val) {
117690776b1fSJouni Malinen 		snprintf(buf, sizeof(buf), "SET dpp_mud_url %s", val);
117790776b1fSJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
117890776b1fSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
117990776b1fSJouni Malinen 				  "errorCode,Failed to set MUD URL");
118089cf6d64SJouni Malinen 			return STATUS_SENT_ERROR;
118190776b1fSJouni Malinen 		}
118290776b1fSJouni Malinen 	}
118390776b1fSJouni Malinen 
1184d86e5828SJouni Malinen 	if (sigma_dut_is_ap(dut)) {
1185d86e5828SJouni Malinen 		if (!dut->hostapd_ifname) {
1186d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1187d86e5828SJouni Malinen 					"hostapd ifname not specified (-j)");
118889cf6d64SJouni Malinen 			return ERROR_SEND_STATUS;
1189d86e5828SJouni Malinen 		}
1190d86e5828SJouni Malinen 		ifname = dut->hostapd_ifname;
1191d86e5828SJouni Malinen 
1192d86e5828SJouni Malinen 		if (dpp_hostapd_run(dut) < 0) {
1193d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1194d86e5828SJouni Malinen 				  "errorCode,Failed to start hostapd");
119589cf6d64SJouni Malinen 			return STATUS_SENT_ERROR;
1196d86e5828SJouni Malinen 		}
1197d86e5828SJouni Malinen 	}
1198d86e5828SJouni Malinen 
119967acb0cfSJouni Malinen 	if (strcasecmp(prov_role, "Configurator") == 0 ||
120067acb0cfSJouni Malinen 	    strcasecmp(prov_role, "Both") == 0) {
1201d86e5828SJouni Malinen 		if (dut->dpp_conf_id < 0) {
1202d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1203d86e5828SJouni Malinen 				 "DPP_CONFIGURATOR_ADD curve=%s",
1204d86e5828SJouni Malinen 				 dpp_get_curve(cmd, "DPPSigningKeyECC"));
1205d86e5828SJouni Malinen 			if (wpa_command_resp(ifname, buf,
1206d86e5828SJouni Malinen 					     buf, sizeof(buf)) < 0) {
1207d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1208d86e5828SJouni Malinen 					  "errorCode,Failed to set up configurator");
120989cf6d64SJouni Malinen 				return STATUS_SENT_ERROR;
1210d86e5828SJouni Malinen 			}
1211d86e5828SJouni Malinen 			dut->dpp_conf_id = atoi(buf);
1212d86e5828SJouni Malinen 		}
121367acb0cfSJouni Malinen 		if (strcasecmp(prov_role, "Configurator") == 0)
1214d86e5828SJouni Malinen 			role = "configurator";
121567acb0cfSJouni Malinen 		else
121667acb0cfSJouni Malinen 			role = "either";
1217d86e5828SJouni Malinen 	} else if (strcasecmp(prov_role, "Enrollee") == 0) {
1218d86e5828SJouni Malinen 		role = "enrollee";
1219d86e5828SJouni Malinen 	} else {
1220d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1221d86e5828SJouni Malinen 			  "errorCode,Unknown DPPProvisioningRole");
122289cf6d64SJouni Malinen 		return STATUS_SENT_ERROR;
1223d86e5828SJouni Malinen 	}
1224d86e5828SJouni Malinen 
1225d86e5828SJouni Malinen 	pkex_identifier[0] = '\0';
1226d86e5828SJouni Malinen 	if (strcasecmp(bs, "PKEX") == 0) {
12274f47a272SJouni Malinen 		if (sigma_dut_is_ap(dut) && dut->ap_channel != 6) {
12284f47a272SJouni Malinen 			/* For now, have to make operating channel match DPP
12294f47a272SJouni Malinen 			 * listen channel. This should be removed once hostapd
12304f47a272SJouni Malinen 			 * has support for DPP listen on non-operating channel.
12314f47a272SJouni Malinen 			 */
12324f47a272SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
12334f47a272SJouni Malinen 					"Update hostapd operating channel to match listen needs");
12344f47a272SJouni Malinen 			dut->ap_channel = 6;
1235b4de1962Spriyadharshini gowthaman 
1236016ae6c8SJouni Malinen 			if (get_driver_type(dut) == DRIVER_OPENWRT) {
1237b4de1962Spriyadharshini gowthaman 				snprintf(buf, sizeof(buf),
1238b4de1962Spriyadharshini gowthaman 					 "iwconfig %s channel %d",
1239b4de1962Spriyadharshini gowthaman 					 dut->hostapd_ifname, dut->ap_channel);
1240b4de1962Spriyadharshini gowthaman 				run_system(dut, buf);
1241b4de1962Spriyadharshini gowthaman 			}
1242b4de1962Spriyadharshini gowthaman 
12434f47a272SJouni Malinen 			if (wpa_command(ifname, "SET channel 6") < 0 ||
12444f47a272SJouni Malinen 			    wpa_command(ifname, "DISABLE") < 0 ||
12454f47a272SJouni Malinen 			    wpa_command(ifname, "ENABLE") < 0) {
12464f47a272SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
12474f47a272SJouni Malinen 					  "errorCode,Failed to update channel");
124889cf6d64SJouni Malinen 				return STATUS_SENT_ERROR;
12494f47a272SJouni Malinen 			}
12504f47a272SJouni Malinen 		}
12514f47a272SJouni Malinen 
1252d86e5828SJouni Malinen 		if (!pkex_code) {
1253d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1254d86e5828SJouni Malinen 				  "errorCode,Missing DPPPKEXCode");
125589cf6d64SJouni Malinen 			return STATUS_SENT_ERROR;
1256d86e5828SJouni Malinen 		}
1257d86e5828SJouni Malinen 
1258d86e5828SJouni Malinen 		if (pkex_code_id)
1259d86e5828SJouni Malinen 			snprintf(pkex_identifier, sizeof(pkex_identifier),
1260d86e5828SJouni Malinen 				 "identifier=%s ", pkex_code_id);
1261d86e5828SJouni Malinen 
1262d86e5828SJouni Malinen 		snprintf(buf, sizeof(buf),
1263d86e5828SJouni Malinen 			 "DPP_BOOTSTRAP_GEN type=pkex curve=%s",
1264d86e5828SJouni Malinen 			 dpp_get_curve(cmd, "DPPCryptoIdentifier"));
1265d86e5828SJouni Malinen 		if (wpa_command_resp(ifname, buf, buf, sizeof(buf)) < 0) {
1266d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1267d86e5828SJouni Malinen 				  "errorCode,Failed to set up PKEX");
126889cf6d64SJouni Malinen 			return STATUS_SENT_ERROR;
1269d86e5828SJouni Malinen 		}
1270d86e5828SJouni Malinen 		own_pkex_id = atoi(buf);
1271d86e5828SJouni Malinen 	}
1272d86e5828SJouni Malinen 
1273d86e5828SJouni Malinen 	ctrl = open_wpa_mon(ifname);
1274d86e5828SJouni Malinen 	if (!ctrl) {
1275d86e5828SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1276d86e5828SJouni Malinen 				"Failed to open wpa_supplicant monitor connection");
127789cf6d64SJouni Malinen 		return ERROR_SEND_STATUS;
1278d86e5828SJouni Malinen 	}
1279d86e5828SJouni Malinen 
1280d86e5828SJouni Malinen 	old_timeout = dut->default_timeout;
1281d86e5828SJouni Malinen 	val = get_param(cmd, "DPPTimeout");
1282d86e5828SJouni Malinen 	if (val && atoi(val) > 0) {
1283d86e5828SJouni Malinen 		dut->default_timeout = atoi(val);
1284d86e5828SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP timeout: %u",
1285d86e5828SJouni Malinen 				dut->default_timeout);
1286d86e5828SJouni Malinen 	}
1287d86e5828SJouni Malinen 
12889be22eddSJouni Malinen 	val = get_param(cmd, "DPPStatusQuery");
12899be22eddSJouni Malinen 	conn_status = val && strcasecmp(val, "Yes") == 0;
12909be22eddSJouni Malinen 
1291d86e5828SJouni Malinen 	conf_ssid[0] = '\0';
1292d86e5828SJouni Malinen 	conf_pass[0] = '\0';
12939541ee87SJouni Malinen 	csrattrs[0] = '\0';
129411ab72c2SPurushottam Kushwaha 	group_id[0] = '\0';
1295dd85cff0SJouni Malinen 	conf2[0] = '\0';
129605142208SJouni Malinen 	if (!enrollee_configurator) {
1297d86e5828SJouni Malinen 		val = get_param(cmd, "DPPConfIndex");
1298d86e5828SJouni Malinen 		if (val)
1299d86e5828SJouni Malinen 			conf_index = atoi(val);
130005142208SJouni Malinen 	}
1301d86e5828SJouni Malinen 	switch (conf_index) {
1302258cc26aSJouni Malinen 	case -1:
1303a28608abSJouni Malinen 		if (enrollee_configurator)
1304a28608abSJouni Malinen 			conf_role = "configurator";
1305a28608abSJouni Malinen 		else
1306258cc26aSJouni Malinen 			conf_role = NULL;
1307258cc26aSJouni Malinen 		break;
1308d86e5828SJouni Malinen 	case 1:
1309d86e5828SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
13103aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
13113aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
13123aa72861SJouni Malinen 			goto err;
1313e89cdbf5SJouni Malinen 		if (enrollee_ap) {
1314d86e5828SJouni Malinen 			conf_role = "ap-dpp";
13153d291f70SJouni Malinen 		} else {
1316d86e5828SJouni Malinen 			conf_role = "sta-dpp";
13173d291f70SJouni Malinen 		}
131811ab72c2SPurushottam Kushwaha 		group_id_str = "DPPGROUP_DPP_INFRA";
1319d86e5828SJouni Malinen 		break;
1320d86e5828SJouni Malinen 	case 2:
1321d86e5828SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
13223aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
13233aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
13243aa72861SJouni Malinen 			goto err;
13258f81cdfaSJouni Malinen 		snprintf(conf_pass, sizeof(conf_pass),
13268f81cdfaSJouni Malinen 			 "psk=10506e102ad1e7f95112f6b127675bb8344dacacea60403f3fa4055aec85b0fc");
1327e89cdbf5SJouni Malinen 		if (enrollee_ap)
1328d86e5828SJouni Malinen 			conf_role = "ap-psk";
1329d86e5828SJouni Malinen 		else
1330d86e5828SJouni Malinen 			conf_role = "sta-psk";
1331d86e5828SJouni Malinen 		break;
1332d86e5828SJouni Malinen 	case 3:
1333d86e5828SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
13343aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
13353aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
13363aa72861SJouni Malinen 			goto err;
1337d86e5828SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
13383aa72861SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
13393aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
13403aa72861SJouni Malinen 			goto err;
1341e89cdbf5SJouni Malinen 		if (enrollee_ap)
1342d86e5828SJouni Malinen 			conf_role = "ap-psk";
1343d86e5828SJouni Malinen 		else
1344d86e5828SJouni Malinen 			conf_role = "sta-psk";
1345d86e5828SJouni Malinen 		break;
13463d291f70SJouni Malinen 	case 4:
13473d291f70SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
13483aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
13493aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
13503aa72861SJouni Malinen 			goto err;
1351e89cdbf5SJouni Malinen 		if (enrollee_ap) {
13523d291f70SJouni Malinen 			conf_role = "ap-dpp";
13533d291f70SJouni Malinen 		} else {
13543d291f70SJouni Malinen 			conf_role = "sta-dpp";
13553d291f70SJouni Malinen 		}
135611ab72c2SPurushottam Kushwaha 		group_id_str = "DPPGROUP_DPP_INFRA2";
13573d291f70SJouni Malinen 		break;
13587d031c77SJouni Malinen 	case 5:
13597d031c77SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
13603aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
13613aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
13623aa72861SJouni Malinen 			goto err;
13637d031c77SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
13643aa72861SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
13653aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
13663aa72861SJouni Malinen 			goto err;
13677d031c77SJouni Malinen 		if (enrollee_ap)
13687d031c77SJouni Malinen 			conf_role = "ap-sae";
13697d031c77SJouni Malinen 		else
13707d031c77SJouni Malinen 			conf_role = "sta-sae";
13717d031c77SJouni Malinen 		break;
13727d031c77SJouni Malinen 	case 6:
13737d031c77SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
13743aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
13753aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
13763aa72861SJouni Malinen 			goto err;
13777d031c77SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
13783aa72861SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
13793aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
13803aa72861SJouni Malinen 			goto err;
13817d031c77SJouni Malinen 		if (enrollee_ap)
13827d031c77SJouni Malinen 			conf_role = "ap-psk-sae";
13837d031c77SJouni Malinen 		else
13847d031c77SJouni Malinen 			conf_role = "sta-psk-sae";
13857d031c77SJouni Malinen 		break;
1386f2fa0d00SJouni Malinen 	case 7:
1387f2fa0d00SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
13883aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
13893aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
13903aa72861SJouni Malinen 			goto err;
1391f2fa0d00SJouni Malinen 		if (enrollee_ap) {
1392f2fa0d00SJouni Malinen 			conf_role = "ap-dpp";
1393f2fa0d00SJouni Malinen 		} else {
1394f2fa0d00SJouni Malinen 			conf_role = "sta-dpp";
1395f2fa0d00SJouni Malinen 		}
139611ab72c2SPurushottam Kushwaha 		group_id_str = "DPPGROUP_DPP_INFRA";
1397f2fa0d00SJouni Malinen 		force_gas_fragm = 1;
1398f2fa0d00SJouni Malinen 		break;
13990e3941c5SJouni Malinen 	case 8:
14007a7ecf73SJouni Malinen 	case 9:
14010e3941c5SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
14020e3941c5SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
14030e3941c5SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
14040e3941c5SJouni Malinen 			goto err;
14050e3941c5SJouni Malinen 		ascii2hexstr("This_is_legacy_password", buf);
14060e3941c5SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
14070e3941c5SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
14080e3941c5SJouni Malinen 			goto err;
14090e3941c5SJouni Malinen 		if (enrollee_ap) {
14100e3941c5SJouni Malinen 			conf_role = "ap-dpp+psk+sae";
14110e3941c5SJouni Malinen 		} else {
14120e3941c5SJouni Malinen 			conf_role = "sta-dpp+psk+sae";
14130e3941c5SJouni Malinen 		}
14140e3941c5SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA1";
14157a7ecf73SJouni Malinen 		if (conf_index == 9)
14167a7ecf73SJouni Malinen 			akm_use_selector = 1;
14170e3941c5SJouni Malinen 		break;
1418dd85cff0SJouni Malinen 	case 10:
1419dd85cff0SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
1420dd85cff0SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
1421dd85cff0SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
1422dd85cff0SJouni Malinen 			goto err;
1423dd85cff0SJouni Malinen 		if (enrollee_ap)
1424dd85cff0SJouni Malinen 			conf_role = "ap-dpp";
1425dd85cff0SJouni Malinen 		else
1426dd85cff0SJouni Malinen 			conf_role = "sta-dpp";
1427dd85cff0SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA1";
1428dd85cff0SJouni Malinen 		ascii2hexstr("DPPNET02", buf);
1429dd85cff0SJouni Malinen 		ascii2hexstr("This_is_legacy_password", buf2);
1430dd85cff0SJouni Malinen 		res = snprintf(conf2, sizeof(conf2),
1431dd85cff0SJouni Malinen 			       " @CONF-OBJ-SEP@ conf=%s-dpp+psk+sae ssid=%s pass=%s group_id=DPPGROUP_DPP_INFRA2",
1432dd85cff0SJouni Malinen 			       enrollee_ap ? "ap" : "sta", buf, buf2);
14337ee04b93SJouni Malinen 		if (res < 0 || res >= sizeof(conf2))
14347ee04b93SJouni Malinen 			goto err;
1435dd85cff0SJouni Malinen 		break;
14369541ee87SJouni Malinen 	case 11:
14379541ee87SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
14389541ee87SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
14399541ee87SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
14409541ee87SJouni Malinen 			goto err;
14419541ee87SJouni Malinen 		if (enrollee_ap) {
14429541ee87SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
14439541ee87SJouni Malinen 				  "errorCode,dot1x AKM provisioning not supported for AP");
14449541ee87SJouni Malinen 			goto out;
14459541ee87SJouni Malinen 		}
14469541ee87SJouni Malinen 		conf_role = "sta-dot1x";
14479541ee87SJouni Malinen 		snprintf(buf, sizeof(buf), "%s/dpp-ca-csrattrs",
14489541ee87SJouni Malinen 			 sigma_cert_path);
14499541ee87SJouni Malinen 		f = fopen(buf, "r");
14509541ee87SJouni Malinen 		if (f) {
14519541ee87SJouni Malinen 			size_t len;
14529541ee87SJouni Malinen 			int r;
14539541ee87SJouni Malinen 
14549541ee87SJouni Malinen 			len = fread(buf, 1, sizeof(buf), f);
14559541ee87SJouni Malinen 			fclose(f);
14569541ee87SJouni Malinen 			if (len >= sizeof(buf)) {
14579541ee87SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
14589541ee87SJouni Malinen 					  "errorCode,No room for csrAttrs");
14599541ee87SJouni Malinen 				goto out;
14609541ee87SJouni Malinen 			}
14619541ee87SJouni Malinen 			buf[len] = '\0';
14629541ee87SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
14639541ee87SJouni Malinen 					"Use csrAttrs from file");
14649541ee87SJouni Malinen 			r = snprintf(csrattrs, sizeof(csrattrs),
14659541ee87SJouni Malinen 				     " csrattrs=%s", buf);
14669541ee87SJouni Malinen 			if (r <= 0 || r >= sizeof(csrattrs)) {
14679541ee87SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
14689541ee87SJouni Malinen 					  "errorCode,No room for csrAttrs");
14699541ee87SJouni Malinen 				goto out;
14709541ee87SJouni Malinen 			}
14719541ee87SJouni Malinen 		} else {
14729541ee87SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
14739541ee87SJouni Malinen 					"Use default csrAttrs");
14749541ee87SJouni Malinen 			snprintf(csrattrs, sizeof(csrattrs), "%s",
14759541ee87SJouni Malinen 				 " csrattrs=MAsGCSqGSIb3DQEJBw==");
14769541ee87SJouni Malinen 		}
14779541ee87SJouni Malinen 		break;
1478f7490768SJouni Malinen 	default:
1479f7490768SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1480f7490768SJouni Malinen 			  "errorCode,Unsupported DPPConfIndex");
1481f7490768SJouni Malinen 		goto out;
1482d86e5828SJouni Malinen 	}
1483d86e5828SJouni Malinen 
148411ab72c2SPurushottam Kushwaha 	if (group_id_str)
148511ab72c2SPurushottam Kushwaha 		snprintf(group_id, sizeof(group_id), " group_id=%s",
148611ab72c2SPurushottam Kushwaha 			 group_id_str);
14873d291f70SJouni Malinen 
14882b2230fbSJouni Malinen 	if (force_gas_fragm) {
14892b2230fbSJouni Malinen 		char spaces[1500];
14902b2230fbSJouni Malinen 
14912b2230fbSJouni Malinen 		memset(spaces, ' ', sizeof(spaces));
14922b2230fbSJouni Malinen 		spaces[sizeof(spaces) - 1] = '\0';
14932b2230fbSJouni Malinen 
14942b2230fbSJouni Malinen 		snprintf(buf, sizeof(buf),
14952b2230fbSJouni Malinen 			 "SET dpp_discovery_override {\"ssid\":\"DPPNET01\"}%s",
14962b2230fbSJouni Malinen 			 spaces);
14972b2230fbSJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
14982b2230fbSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
14992b2230fbSJouni Malinen 				  "errorCode,Failed to set discovery override");
15002b2230fbSJouni Malinen 			goto out;
15012b2230fbSJouni Malinen 		}
15022b2230fbSJouni Malinen 	}
15032b2230fbSJouni Malinen 
1504772299f1SJouni Malinen 	if (step) {
1505772299f1SJouni Malinen 		int test;
1506772299f1SJouni Malinen 
1507772299f1SJouni Malinen 		test = dpp_get_test(step, frametype, attr);
1508772299f1SJouni Malinen 		if (test <= 0) {
1509772299f1SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1510772299f1SJouni Malinen 				  "errorCode,Unsupported DPPStep/DPPFrameType/DPPIEAttribute");
1511772299f1SJouni Malinen 			goto out;
1512772299f1SJouni Malinen 		}
1513772299f1SJouni Malinen 
1514772299f1SJouni Malinen 		snprintf(buf, sizeof(buf), "SET dpp_test %d", test);
1515772299f1SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
1516772299f1SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1517772299f1SJouni Malinen 				  "errorCode,Failed to set dpp_test");
1518772299f1SJouni Malinen 			goto out;
1519772299f1SJouni Malinen 		}
1520772299f1SJouni Malinen 	} else {
1521772299f1SJouni Malinen 		wpa_command(ifname, "SET dpp_test 0");
1522772299f1SJouni Malinen 	}
1523772299f1SJouni Malinen 
1524fbb268d7SJouni Malinen 	if (strcasecmp(self_conf, "Yes") == 0) {
1525fbb268d7SJouni Malinen 		if (strcasecmp(prov_role, "Configurator") != 0) {
1526fbb268d7SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1527fbb268d7SJouni Malinen 				  "errorCode,Invalid DPPSelfConfigure use - only allowed for Configurator role");
1528fbb268d7SJouni Malinen 			goto out;
1529fbb268d7SJouni Malinen 		}
1530fbb268d7SJouni Malinen 		if (!conf_role) {
1531fbb268d7SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1532fbb268d7SJouni Malinen 				  "errorCode,Missing DPPConfIndex");
1533fbb268d7SJouni Malinen 			goto out;
1534fbb268d7SJouni Malinen 		}
1535fbb268d7SJouni Malinen 
1536fbb268d7SJouni Malinen 		snprintf(buf, sizeof(buf),
1537fbb268d7SJouni Malinen 			 "DPP_CONFIGURATOR_SIGN  conf=%s %s %s configurator=%d",
1538fbb268d7SJouni Malinen 			 conf_role, conf_ssid, conf_pass, dut->dpp_conf_id);
1539fbb268d7SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
1540fbb268d7SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1541fbb268d7SJouni Malinen 				  "errorCode,Failed to initiate DPP self-configuration");
1542fbb268d7SJouni Malinen 			goto out;
1543fbb268d7SJouni Malinen 		}
1544174db64fSJouni Malinen 		if (sigma_dut_is_ap(dut))
1545174db64fSJouni Malinen 			goto update_ap;
1546fbb268d7SJouni Malinen 		goto wait_connect;
1547ed629d51SJouni Malinen 	} else if (manual && strcasecmp(bs, "NFC") == 0) {
1548ed629d51SJouni Malinen 		const char *val = get_param(cmd, "DPPNFCInit");
15490cf4423bSJouni Malinen 		int init = !val || atoi(val) > 0;
1550ed629d51SJouni Malinen 		pid_t pid;
1551ed629d51SJouni Malinen 		int pid_status;
1552ed629d51SJouni Malinen 		int enrollee = 0;
1553997fb3edSJouni Malinen 		int tag_read = 0;
1554997fb3edSJouni Malinen 		int tag_write_uri = 0;
1555997fb3edSJouni Malinen 		int tag_write_hs = 0;
1556baef6b14SJouni Malinen 		const char *tx_rx_events[] = { "DPP-TX", "DPP-RX", NULL };
1557175c39d4SJouni Malinen 		const char *chan_list, *alt_chan_list;
1558175c39d4SJouni Malinen 		char chan_list2[200], alt_chan_list2[200];
1559ed629d51SJouni Malinen 
1560ed629d51SJouni Malinen 		if (strcasecmp(prov_role, "Configurator") == 0 ||
1561ed629d51SJouni Malinen 		    strcasecmp(prov_role, "Both") == 0) {
1562ed629d51SJouni Malinen 			if (!conf_role) {
1563ed629d51SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1564ed629d51SJouni Malinen 					  "errorCode,Missing DPPConfIndex");
1565ed629d51SJouni Malinen 				goto out;
1566ed629d51SJouni Malinen 			}
1567ed629d51SJouni Malinen 			snprintf(buf, sizeof(buf),
15689541ee87SJouni Malinen 				 "SET dpp_configurator_params  conf=%s %s %s configurator=%d%s%s%s%s%s",
1569ed629d51SJouni Malinen 				 conf_role, conf_ssid, conf_pass,
1570ed629d51SJouni Malinen 				 dut->dpp_conf_id, group_id,
1571ed629d51SJouni Malinen 				 akm_use_selector ? " akm_use_selector=1" : "",
15729541ee87SJouni Malinen 				 conn_status ? " conn_status=1" : "",
15739541ee87SJouni Malinen 				 csrattrs, conf2);
1574ed629d51SJouni Malinen 			if (wpa_command(ifname, buf) < 0) {
1575ed629d51SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1576ed629d51SJouni Malinen 					  "errorCode,Failed to set configurator parameters");
1577ed629d51SJouni Malinen 				goto out;
1578ed629d51SJouni Malinen 			}
1579ed629d51SJouni Malinen 			snprintf(buf, sizeof(buf),
15809541ee87SJouni Malinen 				 "conf=%s %s %s configurator=%d%s%s%s%s%s",
1581ed629d51SJouni Malinen 				 conf_role, conf_ssid, conf_pass,
1582ed629d51SJouni Malinen 				 dut->dpp_conf_id, group_id,
1583ed629d51SJouni Malinen 				 akm_use_selector ? " akm_use_selector=1" : "",
15849541ee87SJouni Malinen 				 conn_status ? " conn_status=1" : "", csrattrs,
15859541ee87SJouni Malinen 				 conf2);
1586ed629d51SJouni Malinen 		} else {
1587ed629d51SJouni Malinen 			buf[0] = '\0';
1588ed629d51SJouni Malinen 			enrollee = 1;
1589ed629d51SJouni Malinen 		}
1590ed629d51SJouni Malinen 
1591997fb3edSJouni Malinen 		val = get_param(cmd, "DPPNFCTag");
1592997fb3edSJouni Malinen 		if (val) {
1593997fb3edSJouni Malinen 			if (strcasecmp(val, "Read") == 0) {
1594997fb3edSJouni Malinen 				tag_read = 1;
1595997fb3edSJouni Malinen 			} else if (strcasecmp(val, "Write-HS") == 0) {
1596997fb3edSJouni Malinen 				tag_write_hs = 1;
1597997fb3edSJouni Malinen 			} else if (strcasecmp(val, "Write-URI") == 0) {
1598997fb3edSJouni Malinen 				tag_write_uri = 1;
1599997fb3edSJouni Malinen 			} else {
1600997fb3edSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1601997fb3edSJouni Malinen 					  "errorCode,Unsupported DPPNFCTag value");
1602997fb3edSJouni Malinen 				goto out;
1603997fb3edSJouni Malinen 			}
1604997fb3edSJouni Malinen 		}
1605997fb3edSJouni Malinen 
1606175c39d4SJouni Malinen 		chan_list = get_param(cmd, "DPPChannelList");
1607175c39d4SJouni Malinen 		if (chan_list) {
1608175c39d4SJouni Malinen 			strlcpy(chan_list2, chan_list, sizeof(chan_list2));
1609175c39d4SJouni Malinen 			for (pos = chan_list2; *pos; pos++) {
1610175c39d4SJouni Malinen 				if (*pos == ' ')
1611175c39d4SJouni Malinen 					*pos = ',';
1612175c39d4SJouni Malinen 			}
1613175c39d4SJouni Malinen 		}
1614175c39d4SJouni Malinen 		alt_chan_list = get_param(cmd, "DPPNFCAltChannelList");
1615175c39d4SJouni Malinen 		if (alt_chan_list) {
1616175c39d4SJouni Malinen 			strlcpy(alt_chan_list2, alt_chan_list,
1617175c39d4SJouni Malinen 				sizeof(alt_chan_list2));
1618175c39d4SJouni Malinen 			for (pos = alt_chan_list2; *pos; pos++) {
1619175c39d4SJouni Malinen 				if (*pos == ' ')
1620175c39d4SJouni Malinen 					*pos = ',';
1621175c39d4SJouni Malinen 			}
1622175c39d4SJouni Malinen 		}
1623175c39d4SJouni Malinen 
1624ed629d51SJouni Malinen 		run_system(dut, "killall dpp-nfc.py");
1625ed629d51SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "Manual NFC operation");
1626ed629d51SJouni Malinen 		if (!file_exists("dpp-nfc.py")) {
1627ed629d51SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1628ed629d51SJouni Malinen 				  "errorCode,dpp-nfc.py not found");
1629ed629d51SJouni Malinen 			goto out;
1630ed629d51SJouni Malinen 		}
1631ed629d51SJouni Malinen 
1632ed629d51SJouni Malinen 		pid = fork();
1633ed629d51SJouni Malinen 		if (pid < 0) {
1634ed629d51SJouni Malinen 			perror("fork");
1635ed629d51SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1636ed629d51SJouni Malinen 				  "errorCode,fork() failed");
1637ed629d51SJouni Malinen 			goto out;
1638ed629d51SJouni Malinen 		}
1639ed629d51SJouni Malinen 
1640ed629d51SJouni Malinen 		if (pid == 0) {
1641997fb3edSJouni Malinen 			char *argv[100];
1642997fb3edSJouni Malinen 			int pos = 0;
1643997fb3edSJouni Malinen 
1644997fb3edSJouni Malinen 			argv[pos++] = "dpp-nfc.py";
1645997fb3edSJouni Malinen 			argv[pos++] = "--only-one";
1646997fb3edSJouni Malinen 			argv[pos++] = "--no-input";
1647997fb3edSJouni Malinen 			argv[pos++] = "-i";
1648997fb3edSJouni Malinen 			argv[pos++] = (char *) ifname;
1649997fb3edSJouni Malinen 			argv[pos++] = "--ctrl";
1650997fb3edSJouni Malinen 			argv[pos++] = sigma_wpas_ctrl;
1651997fb3edSJouni Malinen 			argv[pos++] = enrollee ? "--enrollee" :
1652997fb3edSJouni Malinen 				"--configurator";
1653997fb3edSJouni Malinen 			argv[pos++] = "--config-params";
1654997fb3edSJouni Malinen 			argv[pos++] = buf;
1655175c39d4SJouni Malinen 			if (chan_list && strcmp(chan_list, "0/0") != 0) {
1656175c39d4SJouni Malinen 				argv[pos++] = "--chan";
1657175c39d4SJouni Malinen 				argv[pos++] = chan_list2;
1658175c39d4SJouni Malinen 			}
1659175c39d4SJouni Malinen 			if (alt_chan_list &&
1660175c39d4SJouni Malinen 			    strcmp(alt_chan_list, "0/0") != 0) {
1661175c39d4SJouni Malinen 				argv[pos++] = "--altchan";
1662175c39d4SJouni Malinen 				argv[pos++] = alt_chan_list2;
1663175c39d4SJouni Malinen 			}
1664997fb3edSJouni Malinen 			if (init)
1665997fb3edSJouni Malinen 				argv[pos++] = "-I";
1666753678b1SJouni Malinen 			if (netrole) {
1667753678b1SJouni Malinen 				argv[pos++] = "--netrole";
1668753678b1SJouni Malinen 				argv[pos++] = (char *) netrole;
1669753678b1SJouni Malinen 			}
1670997fb3edSJouni Malinen 			if (tag_read || tag_write_hs || tag_write_uri)
1671997fb3edSJouni Malinen 				argv[pos++] = "--no-wait";
1672a745074dSJouni Malinen 			if (!tag_read && !tag_write_hs && !tag_write_uri)
1673a745074dSJouni Malinen 				argv[pos++] = "--handover-only";
1674997fb3edSJouni Malinen 			if (tag_read)
1675997fb3edSJouni Malinen 				argv[pos++] = "--tag-read-only";
1676997fb3edSJouni Malinen 			else if (tag_write_hs)
1677997fb3edSJouni Malinen 				argv[pos++] = "write-nfc-hs";
1678997fb3edSJouni Malinen 			else if (tag_write_uri)
1679997fb3edSJouni Malinen 				argv[pos++] = "write-nfc-uri";
1680997fb3edSJouni Malinen 			argv[pos] = NULL;
1681ed629d51SJouni Malinen 
1682ed629d51SJouni Malinen 			execv("./dpp-nfc.py", argv);
1683ed629d51SJouni Malinen 			perror("execv");
1684ed629d51SJouni Malinen 			exit(0);
1685ed629d51SJouni Malinen 			return -1;
1686ed629d51SJouni Malinen 		}
1687ed629d51SJouni Malinen 
1688ee7975a7SJouni Malinen 		usleep(300000);
1689ed629d51SJouni Malinen 		for (;;) {
1690ed629d51SJouni Malinen 			if (waitpid(pid, &pid_status, WNOHANG) > 0) {
16915c0f77dcSJouni Malinen 				int status = WEXITSTATUS(pid_status);
16925c0f77dcSJouni Malinen 
1693ed629d51SJouni Malinen 				sigma_dut_print(dut, DUT_MSG_DEBUG,
16945c0f77dcSJouni Malinen 						"dpp-nfc.py exited (status %d)",
16955c0f77dcSJouni Malinen 						status);
16965c0f77dcSJouni Malinen 				if (status == 1) {
16975c0f77dcSJouni Malinen 					send_resp(dut, conn, SIGMA_ERROR,
16985c0f77dcSJouni Malinen 						  "errorCode,dpp-nfc.py operation failed");
16995c0f77dcSJouni Malinen 					goto out;
17005c0f77dcSJouni Malinen 				}
1701ed629d51SJouni Malinen 				break;
1702ed629d51SJouni Malinen 			}
1703ee7975a7SJouni Malinen 
1704ee7975a7SJouni Malinen 			time(&now);
1705ee7975a7SJouni Malinen 			if ((unsigned int) (now - start) >=
1706ee7975a7SJouni Malinen 			    dut->default_timeout) {
1707ed629d51SJouni Malinen 				sigma_dut_print(dut, DUT_MSG_DEBUG,
1708ed629d51SJouni Malinen 						"dpp-nfc.py did not exit within timeout - stop it");
1709ed629d51SJouni Malinen 				kill(pid, SIGTERM);
1710ee7975a7SJouni Malinen 				waitpid(pid, &pid_status, 0);
1711ee7975a7SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1712ee7975a7SJouni Malinen 					  "errorCode,dpp-nfc.py did not complete within timeout");
1713ee7975a7SJouni Malinen 				goto out;
1714ed629d51SJouni Malinen 			}
1715ed629d51SJouni Malinen 
1716ed629d51SJouni Malinen 			old_timeout = dut->default_timeout;
1717ee7975a7SJouni Malinen 			dut->default_timeout = 2;
1718baef6b14SJouni Malinen 
1719baef6b14SJouni Malinen 			res = get_wpa_cli_events(dut, ctrl, tx_rx_events,
1720ed629d51SJouni Malinen 						buf, sizeof(buf));
1721ed629d51SJouni Malinen 			dut->default_timeout = old_timeout;
1722ed629d51SJouni Malinen 			if (res >= 0) {
1723ed629d51SJouni Malinen 				sigma_dut_print(dut, DUT_MSG_DEBUG,
1724ed629d51SJouni Malinen 						"DPP exchange started");
1725ee7975a7SJouni Malinen 				usleep(500000);
1726ed629d51SJouni Malinen 				kill(pid, SIGTERM);
1727ee7975a7SJouni Malinen 				waitpid(pid, &pid_status, 0);
1728ee7975a7SJouni Malinen 				break;
1729ed629d51SJouni Malinen 			}
1730ed629d51SJouni Malinen 		}
1731f37fda0fSJouni Malinen 	} else if ((nfc_handover &&
1732f37fda0fSJouni Malinen 		    strcasecmp(nfc_handover, "Negotiated_Requestor") == 0) ||
1733a833025dSJouni Malinen 		   ((!nfc_handover ||
1734a833025dSJouni Malinen 		     strcasecmp(nfc_handover, "Static") == 0) &&
1735ed629d51SJouni Malinen 		    auth_role && strcasecmp(auth_role, "Initiator") == 0)) {
1736d86e5828SJouni Malinen 		char own_txt[20];
1737b1dd21f8SJouni Malinen 		int dpp_peer_bootstrap = -1;
1738b5ab828bSJouni Malinen 		char neg_freq[30];
1739b5ab828bSJouni Malinen 
1740d1e22f76SJouni Malinen 		val = get_param(cmd, "DPPAuthDirection");
1741d1e22f76SJouni Malinen 		check_mutual = val && strcasecmp(val, "Mutual") == 0;
1742d1e22f76SJouni Malinen 
1743b5ab828bSJouni Malinen 		neg_freq[0] = '\0';
1744b5ab828bSJouni Malinen 		val = get_param(cmd, "DPPSubsequentChannel");
1745b5ab828bSJouni Malinen 		if (val) {
1746b5ab828bSJouni Malinen 			int opclass, channel, freq;
1747b5ab828bSJouni Malinen 
1748b5ab828bSJouni Malinen 			opclass = atoi(val);
1749b5ab828bSJouni Malinen 			val = strchr(val, '/');
1750b5ab828bSJouni Malinen 			if (opclass == 0 || !val) {
1751b5ab828bSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1752b5ab828bSJouni Malinen 					  "errorCode,Invalid DPPSubsequentChannel");
1753b5ab828bSJouni Malinen 				goto out;
1754b5ab828bSJouni Malinen 			}
1755b5ab828bSJouni Malinen 			val++;
1756b5ab828bSJouni Malinen 			channel = atoi(val);
1757b5ab828bSJouni Malinen 
1758b5ab828bSJouni Malinen 			/* Ignoring opclass for now; could use it here for more
1759b5ab828bSJouni Malinen 			 * robust frequency determination. */
1760093569ffSAlexei Avshalom Lazar 			freq = channel_to_freq(dut, channel);
1761b5ab828bSJouni Malinen 			if (!freq) {
1762b5ab828bSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1763b5ab828bSJouni Malinen 					  "errorCode,Unsupported DPPSubsequentChannel channel");
1764b5ab828bSJouni Malinen 				goto out;
1765b5ab828bSJouni Malinen 			}
1766b5ab828bSJouni Malinen 			snprintf(neg_freq, sizeof(neg_freq), " neg_freq=%d",
1767b5ab828bSJouni Malinen 				 freq);
1768b5ab828bSJouni Malinen 		}
1769b1dd21f8SJouni Malinen 
1770b1dd21f8SJouni Malinen 		if (strcasecmp(bs, "QR") == 0) {
1771b1dd21f8SJouni Malinen 			if (!dut->dpp_peer_uri) {
1772b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1773b1dd21f8SJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
1774b1dd21f8SJouni Malinen 				goto out;
1775b1dd21f8SJouni Malinen 			}
1776b1dd21f8SJouni Malinen 
1777b1dd21f8SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
1778b1dd21f8SJouni Malinen 				 dut->dpp_peer_uri);
1779b1dd21f8SJouni Malinen 			if (wpa_command_resp(ifname, buf, buf,
17803c27aa82SJouni Malinen 					     sizeof(buf)) < 0 ||
17813c27aa82SJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
1782b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1783b1dd21f8SJouni Malinen 					  "errorCode,Failed to parse URI");
1784b1dd21f8SJouni Malinen 				goto out;
1785b1dd21f8SJouni Malinen 			}
1786b1dd21f8SJouni Malinen 			dpp_peer_bootstrap = atoi(buf);
1787a833025dSJouni Malinen 		} else if (strcasecmp(bs, "NFC") == 0 && nfc_handover &&
1788a833025dSJouni Malinen 			   strcasecmp(nfc_handover, "Static") == 0) {
1789a833025dSJouni Malinen 			if (!dut->dpp_peer_uri) {
1790a833025dSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1791a833025dSJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
1792a833025dSJouni Malinen 				goto out;
1793a833025dSJouni Malinen 			}
1794a833025dSJouni Malinen 
1795a833025dSJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_NFC_URI %s",
1796a833025dSJouni Malinen 				 dut->dpp_peer_uri);
1797a833025dSJouni Malinen 			if (wpa_command_resp(ifname, buf,
1798a833025dSJouni Malinen 					     buf, sizeof(buf)) < 0 ||
1799a833025dSJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
1800a833025dSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1801a833025dSJouni Malinen 					  "errorCode,Failed to process URI from NFC Tag");
1802a833025dSJouni Malinen 				goto out;
1803a833025dSJouni Malinen 			}
1804a833025dSJouni Malinen 			dpp_peer_bootstrap = atoi(buf);
1805f37fda0fSJouni Malinen 		} else if (strcasecmp(bs, "NFC") == 0) {
1806f37fda0fSJouni Malinen 			if (!dut->dpp_peer_uri) {
1807f37fda0fSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1808f37fda0fSJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
1809f37fda0fSJouni Malinen 				goto out;
1810f37fda0fSJouni Malinen 			}
1811f37fda0fSJouni Malinen 			if (dut->dpp_local_bootstrap < 0) {
1812f37fda0fSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1813f37fda0fSJouni Malinen 					  "errorCode,Missing own bootstrapping info");
1814f37fda0fSJouni Malinen 				goto out;
1815f37fda0fSJouni Malinen 			}
1816f37fda0fSJouni Malinen 
1817f37fda0fSJouni Malinen 			snprintf(buf, sizeof(buf),
1818f37fda0fSJouni Malinen 				 "DPP_NFC_HANDOVER_SEL own=%d uri=%s",
1819f37fda0fSJouni Malinen 				 dut->dpp_local_bootstrap, dut->dpp_peer_uri);
1820f37fda0fSJouni Malinen 			if (wpa_command_resp(ifname, buf,
1821f37fda0fSJouni Malinen 					     buf, sizeof(buf)) < 0 ||
1822f37fda0fSJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
1823f37fda0fSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1824f37fda0fSJouni Malinen 					  "errorCode,Failed to process NFC Handover Select");
1825f37fda0fSJouni Malinen 				goto out;
1826f37fda0fSJouni Malinen 			}
1827f37fda0fSJouni Malinen 			dpp_peer_bootstrap = atoi(buf);
1828b1dd21f8SJouni Malinen 		}
1829d86e5828SJouni Malinen 
183063d5041cSJouni Malinen 		if (dut->dpp_local_bootstrap >= 0)
1831d86e5828SJouni Malinen 			snprintf(own_txt, sizeof(own_txt), " own=%d",
1832d86e5828SJouni Malinen 				 dut->dpp_local_bootstrap);
1833d86e5828SJouni Malinen 		else
1834d86e5828SJouni Malinen 			own_txt[0] = '\0';
1835c240fe5aSJouni Malinen 		if (chirp) {
1836efe4ae75SJouni Malinen 			int freq = 2437; /* default: channel 6 */
1837c240fe5aSJouni Malinen 
1838c240fe5aSJouni Malinen 			val = get_param(cmd, "DPPChirpChannel");
1839c240fe5aSJouni Malinen 			if (val) {
1840c240fe5aSJouni Malinen 				freq = channel_to_freq(dut, atoi(val));
1841c240fe5aSJouni Malinen 				if (!freq) {
1842c240fe5aSJouni Malinen 					send_resp(dut, conn, SIGMA_ERROR,
1843c240fe5aSJouni Malinen 						  "errorCode,Unsupported DPPChirpChannel channel");
1844c240fe5aSJouni Malinen 					goto out;
1845c240fe5aSJouni Malinen 				}
1846c240fe5aSJouni Malinen 			}
1847c240fe5aSJouni Malinen 
1848c240fe5aSJouni Malinen 			if (strcasecmp(prov_role, "Configurator") == 0 ||
1849c240fe5aSJouni Malinen 			    strcasecmp(prov_role, "Both") == 0) {
1850c240fe5aSJouni Malinen 				if (!conf_role) {
1851c240fe5aSJouni Malinen 					send_resp(dut, conn, SIGMA_ERROR,
1852c240fe5aSJouni Malinen 						  "errorCode,Missing DPPConfIndex");
1853c240fe5aSJouni Malinen 					goto out;
1854c240fe5aSJouni Malinen 				}
1855c240fe5aSJouni Malinen 				snprintf(buf, sizeof(buf),
18569541ee87SJouni Malinen 					 "SET dpp_configurator_params  conf=%s %s %s configurator=%d%s%s%s%s%s",
1857c240fe5aSJouni Malinen 					 conf_role, conf_ssid, conf_pass,
1858c240fe5aSJouni Malinen 					 dut->dpp_conf_id, group_id,
1859c240fe5aSJouni Malinen 					 akm_use_selector ?
1860c240fe5aSJouni Malinen 					 " akm_use_selector=1" : "",
1861c240fe5aSJouni Malinen 					 conn_status ? " conn_status=1" : "",
18629541ee87SJouni Malinen 					 csrattrs, conf2);
1863c240fe5aSJouni Malinen 				if (wpa_command(ifname, buf) < 0) {
1864c240fe5aSJouni Malinen 					send_resp(dut, conn, SIGMA_ERROR,
1865c240fe5aSJouni Malinen 						  "errorCode,Failed to set configurator parameters");
1866c240fe5aSJouni Malinen 					goto out;
1867c240fe5aSJouni Malinen 				}
1868c240fe5aSJouni Malinen 			}
1869c240fe5aSJouni Malinen 
1870c240fe5aSJouni Malinen 			if (tcp && strcasecmp(tcp, "yes") == 0) {
187168b49bc3SJouni Malinen 				wpa_command(ifname, "DPP_STOP_LISTEN");
1872c240fe5aSJouni Malinen 				snprintf(buf, sizeof(buf),
1873c240fe5aSJouni Malinen 					 "DPP_CONTROLLER_START");
1874c240fe5aSJouni Malinen 			} else {
1875c240fe5aSJouni Malinen 				snprintf(buf, sizeof(buf),
1876c240fe5aSJouni Malinen 					 "DPP_LISTEN %d role=%s%s%s",
1877c240fe5aSJouni Malinen 					 freq, role,
1878c240fe5aSJouni Malinen 					 netrole ? " netrole=" : "",
1879c240fe5aSJouni Malinen 					 netrole ? netrole : "");
1880c240fe5aSJouni Malinen 			}
1881c240fe5aSJouni Malinen 		} else if ((strcasecmp(bs, "QR") == 0 ||
1882c240fe5aSJouni Malinen 			    strcasecmp(bs, "NFC") == 0) &&
188367acb0cfSJouni Malinen 			   (strcasecmp(prov_role, "Configurator") == 0 ||
188467acb0cfSJouni Malinen 			    strcasecmp(prov_role, "Both") == 0)) {
1885258cc26aSJouni Malinen 			if (!conf_role) {
1886258cc26aSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1887258cc26aSJouni Malinen 					  "errorCode,Missing DPPConfIndex");
1888258cc26aSJouni Malinen 				goto out;
1889258cc26aSJouni Malinen 			}
1890d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
18919541ee87SJouni Malinen 				 "DPP_AUTH_INIT peer=%d%s role=%s%s%s conf=%s %s %s configurator=%d%s%s%s%s%s%s%s%s",
1892b1dd21f8SJouni Malinen 				 dpp_peer_bootstrap, own_txt, role,
1893a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
1894a28608abSJouni Malinen 				 netrole ? netrole : "",
1895d86e5828SJouni Malinen 				 conf_role, conf_ssid, conf_pass,
18967a7ecf73SJouni Malinen 				 dut->dpp_conf_id, neg_freq, group_id,
18977a7ecf73SJouni Malinen 				 akm_use_selector ? " akm_use_selector=1" : "",
18989be22eddSJouni Malinen 				 conn_status ? " conn_status=1" : "",
1899fa1d9c93SJouni Malinen 				 tcp ? " tcp_addr=" : "",
1900fa1d9c93SJouni Malinen 				 tcp ? tcp : "",
19019541ee87SJouni Malinen 				 csrattrs, conf2);
1902f37fda0fSJouni Malinen 		} else if (tcp && (strcasecmp(bs, "QR") == 0 ||
1903f37fda0fSJouni Malinen 				   strcasecmp(bs, "NFC") == 0)) {
19041352f1e7SJouni Malinen 			snprintf(buf, sizeof(buf),
1905a28608abSJouni Malinen 				 "DPP_AUTH_INIT peer=%d%s role=%s%s%s tcp_addr=%s%s%s",
1906a28608abSJouni Malinen 				 dpp_peer_bootstrap, own_txt, role,
1907a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
1908a28608abSJouni Malinen 				 netrole ? netrole : "",
1909a28608abSJouni Malinen 				 tcp, neg_freq, group_id);
1910f37fda0fSJouni Malinen 		} else if (strcasecmp(bs, "QR") == 0 ||
1911f37fda0fSJouni Malinen 			   strcasecmp(bs, "NFC") == 0) {
1912d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1913a28608abSJouni Malinen 				 "DPP_AUTH_INIT peer=%d%s role=%s%s%s%s%s",
191411ab72c2SPurushottam Kushwaha 				 dpp_peer_bootstrap, own_txt, role,
1915a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
1916a28608abSJouni Malinen 				 netrole ? netrole : "",
191711ab72c2SPurushottam Kushwaha 				 neg_freq, group_id);
1918d86e5828SJouni Malinen 		} else if (strcasecmp(bs, "PKEX") == 0 &&
191967acb0cfSJouni Malinen 			   (strcasecmp(prov_role, "Configurator") == 0 ||
192067acb0cfSJouni Malinen 			    strcasecmp(prov_role, "Both") == 0)) {
1921258cc26aSJouni Malinen 			if (!conf_role) {
1922258cc26aSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1923258cc26aSJouni Malinen 					  "errorCode,Missing DPPConfIndex");
1924258cc26aSJouni Malinen 				goto out;
1925258cc26aSJouni Malinen 			}
1926d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
19279541ee87SJouni Malinen 				 "DPP_PKEX_ADD own=%d init=1 role=%s conf=%s %s %s configurator=%d%s %scode=%s",
1928d86e5828SJouni Malinen 				 own_pkex_id, role, conf_role,
1929d86e5828SJouni Malinen 				 conf_ssid, conf_pass, dut->dpp_conf_id,
19309541ee87SJouni Malinen 				 csrattrs, pkex_identifier, pkex_code);
1931d86e5828SJouni Malinen 		} else if (strcasecmp(bs, "PKEX") == 0) {
1932d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1933d86e5828SJouni Malinen 				 "DPP_PKEX_ADD own=%d init=1 role=%s %scode=%s",
1934d86e5828SJouni Malinen 				 own_pkex_id, role, pkex_identifier, pkex_code);
1935d551c6fcSJouni Malinen 		} else {
1936d551c6fcSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1937d551c6fcSJouni Malinen 				  "errorCode,Unsupported DPPBS");
1938d551c6fcSJouni Malinen 			goto out;
1939d86e5828SJouni Malinen 		}
1940d86e5828SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
1941d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1942d86e5828SJouni Malinen 				  "errorCode,Failed to initiate DPP authentication");
1943d86e5828SJouni Malinen 			goto out;
1944d86e5828SJouni Malinen 		}
19453d16ccbdSJouni Malinen 	} else if ((nfc_handover &&
19463d16ccbdSJouni Malinen 		    strcasecmp(nfc_handover, "Negotiated_Selector") == 0) ||
194704054cceSJouni Malinen 		   ((!nfc_handover ||
194804054cceSJouni Malinen 		     strcasecmp(nfc_handover, "Static") == 0) &&
1949ed629d51SJouni Malinen 		    auth_role && strcasecmp(auth_role, "Responder") == 0)) {
195067f096aaSJouni Malinen 		const char *delay_qr_resp;
195163d5041cSJouni Malinen 		int mutual;
1952d3afc5cbSJouni Malinen 		int freq = 2462; /* default: channel 11 */
1953d3afc5cbSJouni Malinen 
1954f8d81aa4SJouni Malinen 		if (sigma_dut_is_ap(dut) && dut->hostapd_running &&
1955f8d81aa4SJouni Malinen 		    dut->ap_oper_chn)
1956f8d81aa4SJouni Malinen 			freq = channel_to_freq(dut, dut->ap_channel);
1957f8d81aa4SJouni Malinen 
195806cfcb3eSJouni Malinen 		if (strcasecmp(bs, "PKEX") == 0) {
195906cfcb3eSJouni Malinen 			/* default: channel 6 for PKEX */
196006cfcb3eSJouni Malinen 			freq = 2437;
196106cfcb3eSJouni Malinen 		}
196206cfcb3eSJouni Malinen 
196367f096aaSJouni Malinen 		delay_qr_resp = get_param(cmd, "DPPDelayQRResponse");
196467f096aaSJouni Malinen 
196563d5041cSJouni Malinen 		val = get_param(cmd, "DPPAuthDirection");
196663d5041cSJouni Malinen 		mutual = val && strcasecmp(val, "Mutual") == 0;
196763d5041cSJouni Malinen 
1968d3afc5cbSJouni Malinen 		val = get_param(cmd, "DPPListenChannel");
1969d3afc5cbSJouni Malinen 		if (val) {
1970093569ffSAlexei Avshalom Lazar 			freq = channel_to_freq(dut, atoi(val));
1971d3afc5cbSJouni Malinen 			if (freq == 0) {
1972d3afc5cbSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1973d3afc5cbSJouni Malinen 					  "errorCode,Unsupported DPPListenChannel value");
1974d3afc5cbSJouni Malinen 				goto out;
1975d3afc5cbSJouni Malinen 			}
19768bb0a7b1SJouni Malinen 
19778bb0a7b1SJouni Malinen 			if (sigma_dut_is_ap(dut) && !chirp &&
19788bb0a7b1SJouni Malinen 			    dut->ap_start_disabled &&
19798bb0a7b1SJouni Malinen 			    atoi(val) != dut->ap_channel) {
19808bb0a7b1SJouni Malinen 				sigma_dut_print(dut, DUT_MSG_INFO,
19818bb0a7b1SJouni Malinen 						"Use requested listen channel as the initial operating channel");
19828bb0a7b1SJouni Malinen 				snprintf(buf, sizeof(buf), "SET channel %d",
19838bb0a7b1SJouni Malinen 					 atoi(val));
19848bb0a7b1SJouni Malinen 				wpa_command(ifname, buf);
19858bb0a7b1SJouni Malinen 			}
19868bb0a7b1SJouni Malinen 		}
19878bb0a7b1SJouni Malinen 
19888bb0a7b1SJouni Malinen 		if (sigma_dut_is_ap(dut) && dpp_hostapd_beacon(dut) < 0) {
19898bb0a7b1SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
19908bb0a7b1SJouni Malinen 				  "errorCode,Failed to start AP mode listen");
19918bb0a7b1SJouni Malinen 			goto out;
1992d3afc5cbSJouni Malinen 		}
1993d86e5828SJouni Malinen 
199404054cceSJouni Malinen 		if (strcasecmp(bs, "NFC") == 0 && nfc_handover &&
199504054cceSJouni Malinen 		    strcasecmp(nfc_handover, "Static") == 0) {
199604054cceSJouni Malinen 			/* No steps needed here - waiting for peer to initiate
199704054cceSJouni Malinen 			 * once it reads the URI from the NFC Tag */
199804054cceSJouni Malinen 		} else if (strcasecmp(bs, "NFC") == 0) {
19993d16ccbdSJouni Malinen 			if (!dut->dpp_peer_uri) {
20003d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
20013d16ccbdSJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
20023d16ccbdSJouni Malinen 				goto out;
20033d16ccbdSJouni Malinen 			}
20043d16ccbdSJouni Malinen 			if (dut->dpp_local_bootstrap < 0) {
20053d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
20063d16ccbdSJouni Malinen 					  "errorCode,Missing own bootstrapping info");
20073d16ccbdSJouni Malinen 				goto out;
20083d16ccbdSJouni Malinen 			}
20093d16ccbdSJouni Malinen 
20103d16ccbdSJouni Malinen 			snprintf(buf, sizeof(buf),
20113d16ccbdSJouni Malinen 				 "DPP_NFC_HANDOVER_REQ own=%d uri=%s",
20123d16ccbdSJouni Malinen 				 dut->dpp_local_bootstrap, dut->dpp_peer_uri);
20133d16ccbdSJouni Malinen 			if (wpa_command(ifname, buf) < 0) {
20143d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
20153d16ccbdSJouni Malinen 					  "errorCode,Failed to process NFC Handover Request");
20163d16ccbdSJouni Malinen 				goto out;
20173d16ccbdSJouni Malinen 			}
20183d16ccbdSJouni Malinen 
20193d16ccbdSJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_BOOTSTRAP_INFO %d",
20203d16ccbdSJouni Malinen 				 dut->dpp_local_bootstrap);
20213d16ccbdSJouni Malinen 			if (wpa_command_resp(ifname, buf,
20223d16ccbdSJouni Malinen 					     buf, sizeof(buf)) < 0 ||
20233d16ccbdSJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
20243d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
20253d16ccbdSJouni Malinen 					  "errorCode,Failed to get bootstrap information");
20263d16ccbdSJouni Malinen 				goto out;
20273d16ccbdSJouni Malinen 			}
20283d16ccbdSJouni Malinen 			pos = buf;
20293d16ccbdSJouni Malinen 			while (pos) {
20303d16ccbdSJouni Malinen 				pos2 = strchr(pos, '\n');
20313d16ccbdSJouni Malinen 				if (pos2)
20323d16ccbdSJouni Malinen 					*pos2 = '\0';
20333d16ccbdSJouni Malinen 				if (strncmp(pos, "use_freq=", 9) == 0) {
20343d16ccbdSJouni Malinen 					freq = atoi(pos + 9);
20353d16ccbdSJouni Malinen 					sigma_dut_print(dut, DUT_MSG_DEBUG,
20363d16ccbdSJouni Malinen 							"DPP negotiation frequency from NFC handover: %d MHz",
20373d16ccbdSJouni Malinen 							freq);
20383d16ccbdSJouni Malinen 					break;
20393d16ccbdSJouni Malinen 				}
20403d16ccbdSJouni Malinen 
20413d16ccbdSJouni Malinen 				if (!pos2)
20423d16ccbdSJouni Malinen 					break;
20433d16ccbdSJouni Malinen 				pos = pos2 + 1;
20443d16ccbdSJouni Malinen 			}
20453d16ccbdSJouni Malinen 		} else if (!delay_qr_resp && dut->dpp_peer_uri) {
2046b1dd21f8SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
2047b1dd21f8SJouni Malinen 				 dut->dpp_peer_uri);
2048b1dd21f8SJouni Malinen 			if (wpa_command_resp(ifname, buf, buf,
2049b1dd21f8SJouni Malinen 					     sizeof(buf)) < 0) {
2050b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
2051b1dd21f8SJouni Malinen 					  "errorCode,Failed to parse URI");
2052b1dd21f8SJouni Malinen 				goto out;
2053b1dd21f8SJouni Malinen 			}
2054b1dd21f8SJouni Malinen 		}
2055b1dd21f8SJouni Malinen 
2056d86e5828SJouni Malinen 		if (strcasecmp(prov_role, "Configurator") == 0) {
2057258cc26aSJouni Malinen 			if (!conf_role) {
2058258cc26aSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
2059258cc26aSJouni Malinen 					  "errorCode,Missing DPPConfIndex");
2060258cc26aSJouni Malinen 				goto out;
2061258cc26aSJouni Malinen 			}
2062d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
20639541ee87SJouni Malinen 				 "SET dpp_configurator_params  conf=%s %s %s configurator=%d%s%s%s%s%s",
2064d86e5828SJouni Malinen 				 conf_role, conf_ssid, conf_pass,
20657a7ecf73SJouni Malinen 				 dut->dpp_conf_id, group_id,
20667a7ecf73SJouni Malinen 				 akm_use_selector ? " akm_use_selector=1" : "",
20679541ee87SJouni Malinen 				 conn_status ? " conn_status=1" : "", csrattrs,
20687a7ecf73SJouni Malinen 				 conf2);
2069d86e5828SJouni Malinen 			if (wpa_command(ifname, buf) < 0) {
2070d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
2071d86e5828SJouni Malinen 					  "errorCode,Failed to set configurator parameters");
2072d86e5828SJouni Malinen 				goto out;
2073d86e5828SJouni Malinen 			}
2074d86e5828SJouni Malinen 		}
2075d86e5828SJouni Malinen 		if (strcasecmp(bs, "PKEX") == 0) {
2076d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
2077d86e5828SJouni Malinen 				 "DPP_PKEX_ADD own=%d role=%s %scode=%s",
2078d86e5828SJouni Malinen 				 own_pkex_id, role, pkex_identifier, pkex_code);
2079d86e5828SJouni Malinen 			if (wpa_command(ifname, buf) < 0) {
2080d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
2081d86e5828SJouni Malinen 					  "errorCode,Failed to configure DPP PKEX");
2082d86e5828SJouni Malinen 				goto out;
2083d86e5828SJouni Malinen 			}
2084d86e5828SJouni Malinen 		}
2085d86e5828SJouni Malinen 
2086c240fe5aSJouni Malinen 		if (chirp) {
208716b84d5dSJouni Malinen 			snprintf(buf, sizeof(buf),
208816b84d5dSJouni Malinen 				 "DPP_CHIRP own=%d iter=10 listen=%d",
2089c240fe5aSJouni Malinen 				 dut->dpp_local_bootstrap, freq);
2090c240fe5aSJouni Malinen 		} else if (tcp && strcasecmp(tcp, "yes") == 0) {
209141b29526SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_CONTROLLER_START%s",
209241b29526SJouni Malinen 				 (strcasecmp(bs, "QR") == 0 && mutual) ?
209341b29526SJouni Malinen 				 " qr=mutual" : "");
2094785afb44SJouni Malinen 		} else {
2095a28608abSJouni Malinen 			snprintf(buf, sizeof(buf),
2096a28608abSJouni Malinen 				 "DPP_LISTEN %d role=%s%s%s%s",
2097fd7359aeSJouni Malinen 				 freq, role,
2098fd7359aeSJouni Malinen 				 (strcasecmp(bs, "QR") == 0 && mutual) ?
2099a28608abSJouni Malinen 				 " qr=mutual" : "",
2100a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
2101a28608abSJouni Malinen 				 netrole ? netrole : "");
2102785afb44SJouni Malinen 		}
2103d86e5828SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
2104d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
2105c240fe5aSJouni Malinen 				  "errorCode,Failed to start DPP listen/chirp");
2106d86e5828SJouni Malinen 			goto out;
2107d86e5828SJouni Malinen 		}
2108b1dd21f8SJouni Malinen 
2109785afb44SJouni Malinen 		if (!(tcp && strcasecmp(tcp, "yes") == 0) &&
2110016ae6c8SJouni Malinen 		    get_driver_type(dut) == DRIVER_OPENWRT) {
2111b4de1962Spriyadharshini gowthaman 			snprintf(buf, sizeof(buf), "iwconfig %s channel %d",
2112b4de1962Spriyadharshini gowthaman 				 dut->hostapd_ifname, freq_to_channel(freq));
2113b4de1962Spriyadharshini gowthaman 			run_system(dut, buf);
2114b4de1962Spriyadharshini gowthaman 		}
2115b4de1962Spriyadharshini gowthaman 
2116b1dd21f8SJouni Malinen 		if (delay_qr_resp && mutual && dut->dpp_peer_uri) {
2117b1dd21f8SJouni Malinen 			int wait_time = atoi(delay_qr_resp);
2118b1dd21f8SJouni Malinen 
2119b1dd21f8SJouni Malinen 			res = get_wpa_cli_events(dut, ctrl, auth_events,
2120b1dd21f8SJouni Malinen 						 buf, sizeof(buf));
2121b1dd21f8SJouni Malinen 			if (res < 0) {
2122b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
2123b1dd21f8SJouni Malinen 					  "BootstrapResult,OK,AuthResult,Timeout");
2124b1dd21f8SJouni Malinen 				goto out;
2125b1dd21f8SJouni Malinen 			}
2126b1dd21f8SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
2127b1dd21f8SJouni Malinen 					"DPP auth result: %s", buf);
2128b1dd21f8SJouni Malinen 			if (strstr(buf, "DPP-SCAN-PEER-QR-CODE") == NULL) {
2129b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
2130b1dd21f8SJouni Malinen 					  "errorCode,No scan request for peer QR Code seen");
2131b1dd21f8SJouni Malinen 				goto out;
2132b1dd21f8SJouni Malinen 			}
2133b1dd21f8SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
2134b1dd21f8SJouni Malinen 					"Waiting %d second(s) before processing peer URI",
2135b1dd21f8SJouni Malinen 					wait_time);
2136b1dd21f8SJouni Malinen 			sleep(wait_time);
2137b1dd21f8SJouni Malinen 
2138b1dd21f8SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
2139b1dd21f8SJouni Malinen 				 dut->dpp_peer_uri);
2140b1dd21f8SJouni Malinen 			if (wpa_command_resp(ifname, buf, buf,
2141b1dd21f8SJouni Malinen 					     sizeof(buf)) < 0) {
2142b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
2143b1dd21f8SJouni Malinen 					  "errorCode,Failed to parse URI");
2144b1dd21f8SJouni Malinen 				goto out;
2145b1dd21f8SJouni Malinen 			}
2146bc9e055cSSrinivas Dasari 		} else if (mutual && action_type &&
2147bc9e055cSSrinivas Dasari 			   strcasecmp(action_type, "ManualDPP") == 0) {
2148bc9e055cSSrinivas Dasari 			res = get_wpa_cli_events(dut, ctrl, auth_events,
2149bc9e055cSSrinivas Dasari 						 buf, sizeof(buf));
2150bc9e055cSSrinivas Dasari 			if (res < 0) {
2151bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_COMPLETE,
2152bc9e055cSSrinivas Dasari 					  "BootstrapResult,OK,AuthResult,Timeout");
2153bc9e055cSSrinivas Dasari 				goto out;
2154bc9e055cSSrinivas Dasari 			}
2155bc9e055cSSrinivas Dasari 			sigma_dut_print(dut, DUT_MSG_DEBUG,
2156bc9e055cSSrinivas Dasari 					"DPP auth result: %s", buf);
2157e3b13933SSrinivas Dasari 			if (strstr(buf, "DPP-NOT-COMPATIBLE")) {
2158e3b13933SSrinivas Dasari 			    send_resp(dut, conn, SIGMA_COMPLETE,
2159e3b13933SSrinivas Dasari 				      "BootstrapResult,OK,AuthResult,ROLES_NOT_COMPATIBLE");
2160e3b13933SSrinivas Dasari 			    goto out;
2161e3b13933SSrinivas Dasari 			}
2162e3b13933SSrinivas Dasari 
2163bc9e055cSSrinivas Dasari 			if (strstr(buf, "DPP-SCAN-PEER-QR-CODE") == NULL) {
2164bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_ERROR,
2165bc9e055cSSrinivas Dasari 					  "errorCode,No scan request for peer QR Code seen");
2166bc9e055cSSrinivas Dasari 				goto out;
2167bc9e055cSSrinivas Dasari 			}
2168bc9e055cSSrinivas Dasari 
2169bc9e055cSSrinivas Dasari 			if (dpp_scan_peer_qrcode(dut) < 0) {
2170bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_ERROR,
2171bc9e055cSSrinivas Dasari 					  "errorCode,Failed to scan peer QR Code");
2172bc9e055cSSrinivas Dasari 				goto out;
2173bc9e055cSSrinivas Dasari 			}
2174bc9e055cSSrinivas Dasari 
2175bc9e055cSSrinivas Dasari 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
2176bc9e055cSSrinivas Dasari 				 dut->dpp_peer_uri);
2177bc9e055cSSrinivas Dasari 			if (wpa_command_resp(ifname, buf, buf,
2178bc9e055cSSrinivas Dasari 					     sizeof(buf)) < 0) {
2179bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_ERROR,
2180bc9e055cSSrinivas Dasari 					  "errorCode,Failed to parse URI");
2181bc9e055cSSrinivas Dasari 				goto out;
2182bc9e055cSSrinivas Dasari 			}
2183b1dd21f8SJouni Malinen 		}
2184d86e5828SJouni Malinen 	} else {
2185d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
2186d86e5828SJouni Malinen 			  "errorCode,Unknown DPPAuthRole");
2187d86e5828SJouni Malinen 		goto out;
2188d86e5828SJouni Malinen 	}
2189d86e5828SJouni Malinen 
21903a6b92a6SJouni Malinen 	if (step && strcasecmp(step, "Timeout") == 0) {
21913a6b92a6SJouni Malinen 		result = "errorCode,Unexpected state";
21923a6b92a6SJouni Malinen 
21933a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "PKEXExchangeResponse") == 0) {
21949a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 8, -1) < 0)
21953a6b92a6SJouni Malinen 				result = "BootstrapResult,Timeout";
21963a6b92a6SJouni Malinen 			else
21973a6b92a6SJouni Malinen 				result = "BootstrapResult,Errorsent";
21983a6b92a6SJouni Malinen 		}
21993a6b92a6SJouni Malinen 
22003a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "PKEXCRRequest") == 0) {
22019a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 9, -1) < 0)
22023a6b92a6SJouni Malinen 				result = "BootstrapResult,Timeout";
22033a6b92a6SJouni Malinen 			else
22043a6b92a6SJouni Malinen 				result = "BootstrapResult,Errorsent";
22053a6b92a6SJouni Malinen 		}
22063a6b92a6SJouni Malinen 
22073a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "PKEXCRResponse") == 0) {
22089a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 10, -1) < 0)
22093a6b92a6SJouni Malinen 				result = "BootstrapResult,Timeout";
22103a6b92a6SJouni Malinen 			else
22113a6b92a6SJouni Malinen 				result = "BootstrapResult,Errorsent";
22123a6b92a6SJouni Malinen 		}
22133a6b92a6SJouni Malinen 
22143a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "AuthenticationRequest") == 0) {
22159a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 0, -1) < 0)
22163a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Timeout";
22173a6b92a6SJouni Malinen 			else
22183a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Errorsent";
22193a6b92a6SJouni Malinen 		}
22203a6b92a6SJouni Malinen 
22213a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "AuthenticationResponse") == 0) {
22229a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 1, -1) < 0)
22233a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Timeout";
22243a6b92a6SJouni Malinen 			else
22253a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Errorsent";
22263a6b92a6SJouni Malinen 		}
22273a6b92a6SJouni Malinen 
22283a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "AuthenticationConfirm") == 0) {
2229ed629d51SJouni Malinen 			if (auth_role &&
2230ed629d51SJouni Malinen 			    strcasecmp(auth_role, "Initiator") == 0) {
2231a1199884SJouni Malinen 				/* This special case of DPPStep,Timeout with
2232a1199884SJouni Malinen 				 * DPPFrameType,AuthenticationConfirm on an
2233a1199884SJouni Malinen 				 * Initiator is used to cover need for stopping
2234a1199884SJouni Malinen 				 * the Initiator/Enrollee from sending out
2235a1199884SJouni Malinen 				 * Configuration Request message. */
2236a1199884SJouni Malinen 				if (strcasecmp(prov_role, "Enrollee") != 0) {
2237a1199884SJouni Malinen 					send_resp(dut, conn, SIGMA_ERROR,
2238a1199884SJouni Malinen 						  "errorCode,Unexpected use of timeout after AuthenticationConfirm TX in Configurator role");
2239a1199884SJouni Malinen 					goto out;
2240a1199884SJouni Malinen 				}
2241671c9e1aSSrinivas Dasari 				if (check_mutual &&
2242671c9e1aSSrinivas Dasari 				    dpp_process_auth_response(
2243671c9e1aSSrinivas Dasari 					    dut, conn, ctrl, auth_events,
2244671c9e1aSSrinivas Dasari 					    action_type, check_mutual,
2245671c9e1aSSrinivas Dasari 					    buf, sizeof(buf)) < 0)
2246671c9e1aSSrinivas Dasari 					goto out;
2247ecb49d8bSDeepak Dhamdhere 				if (dpp_wait_tx_status(dut, ctrl, 2) < 0)
2248ecb49d8bSDeepak Dhamdhere 					result = "BootstrapResult,OK,AuthResult,Timeout";
2249ecb49d8bSDeepak Dhamdhere 				else
2250a1199884SJouni Malinen 					result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponse";
2251ecb49d8bSDeepak Dhamdhere 			} else {
22529a3415c2SJouni Malinen 				if (dpp_wait_rx(dut, ctrl, 2, -1) < 0)
22533a6b92a6SJouni Malinen 					result = "BootstrapResult,OK,AuthResult,Timeout";
22543a6b92a6SJouni Malinen 				else
2255ecb49d8bSDeepak Dhamdhere 					result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationConfirm";
2256ecb49d8bSDeepak Dhamdhere 			}
22573a6b92a6SJouni Malinen 		}
22583a6b92a6SJouni Malinen 
22593a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "ConfigurationRequest") == 0) {
22603a6b92a6SJouni Malinen 			if (get_wpa_cli_event(dut, ctrl, "DPP-CONF-FAILED",
22613a6b92a6SJouni Malinen 					      buf, sizeof(buf)) < 0)
22623a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout";
22633a6b92a6SJouni Malinen 			else
22643a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Errorsent";
22653a6b92a6SJouni Malinen 		}
22663a6b92a6SJouni Malinen 
22673a6b92a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
22683a6b92a6SJouni Malinen 		goto out;
22693a6b92a6SJouni Malinen 	}
22703a6b92a6SJouni Malinen 
2271772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXExchangeRequest") == 0) {
2272772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 7) < 0)
2273772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
2274772299f1SJouni Malinen 		else
2275772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
2276772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2277772299f1SJouni Malinen 		goto out;
2278772299f1SJouni Malinen 	}
2279772299f1SJouni Malinen 
2280772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXExchangeResponse") == 0) {
2281772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 8) < 0)
2282772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
2283772299f1SJouni Malinen 		else
2284772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
2285772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2286772299f1SJouni Malinen 		goto out;
2287772299f1SJouni Malinen 	}
2288772299f1SJouni Malinen 
2289772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXCRRequest") == 0) {
2290772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 9) < 0)
2291772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
2292772299f1SJouni Malinen 		else
2293772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
2294772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2295772299f1SJouni Malinen 		goto out;
2296772299f1SJouni Malinen 	}
2297772299f1SJouni Malinen 
2298772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXCRResponse") == 0) {
2299772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 10) < 0)
2300772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
2301772299f1SJouni Malinen 		else
2302772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
2303772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2304772299f1SJouni Malinen 		goto out;
2305772299f1SJouni Malinen 	}
2306772299f1SJouni Malinen 
23076792ff4dSJouni Malinen 	if (!frametype && strcasecmp(bs, "PKEX") == 0 &&
2308ed629d51SJouni Malinen 	    auth_role && strcasecmp(auth_role, "Responder") == 0) {
23096792ff4dSJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 10) < 0) {
23106792ff4dSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
23116792ff4dSJouni Malinen 				  "BootstrapResult,Timeout");
23126792ff4dSJouni Malinen 			goto out;
23136792ff4dSJouni Malinen 		}
23146792ff4dSJouni Malinen 	}
23156792ff4dSJouni Malinen 
23166792ff4dSJouni Malinen 	if (!frametype && strcasecmp(bs, "PKEX") == 0 &&
2317ed629d51SJouni Malinen 	    auth_role && strcasecmp(auth_role, "Initiator") == 0) {
23186792ff4dSJouni Malinen 		if (dpp_wait_tx(dut, ctrl, 0) < 0) {
23196792ff4dSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
23206792ff4dSJouni Malinen 				  "BootstrapResult,Timeout");
23216792ff4dSJouni Malinen 			goto out;
23226792ff4dSJouni Malinen 		}
23236792ff4dSJouni Malinen 	}
23246792ff4dSJouni Malinen 
2325772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "AuthenticationRequest") == 0) {
23269a3415c2SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 0) < 0) {
23279a3415c2SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
23289a3415c2SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
23299a3415c2SJouni Malinen 			goto out;
23309a3415c2SJouni Malinen 		}
23319a3415c2SJouni Malinen 
23329a3415c2SJouni Malinen 		if (dpp_wait_rx(dut, ctrl, 1, 5) < 0)
23339a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,None";
2334b9f1eb9bSDeepak Dhamdhere 		else if	(get_wpa_cli_events(dut, ctrl, auth_events,
2335b9f1eb9bSDeepak Dhamdhere 					    buf, sizeof(buf)) >= 0 &&
2336b9f1eb9bSDeepak Dhamdhere 			 strstr(buf, "DPP-RESPONSE-PENDING") != NULL)
2337b9f1eb9bSDeepak Dhamdhere 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponseWithStatusPending";
2338772299f1SJouni Malinen 		else
23399a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponse";
2340772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2341772299f1SJouni Malinen 		goto out;
2342772299f1SJouni Malinen 	}
2343772299f1SJouni Malinen 
2344772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "AuthenticationResponse") == 0) {
23459a3415c2SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 1) < 0) {
23469a3415c2SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
23479a3415c2SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
23489a3415c2SJouni Malinen 			goto out;
23499a3415c2SJouni Malinen 		}
23509a3415c2SJouni Malinen 
23519a3415c2SJouni Malinen 		if (dpp_wait_rx(dut, ctrl, 2, 5) < 0)
23529a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationRequest";
2353772299f1SJouni Malinen 		else
23549a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationConfirm";
2355772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2356772299f1SJouni Malinen 		goto out;
2357772299f1SJouni Malinen 	}
2358772299f1SJouni Malinen 
23598d88d822SSrinivas Dasari 	if (dpp_process_auth_response(dut, conn, ctrl, auth_events, action_type,
23608d88d822SSrinivas Dasari 				      check_mutual, buf, sizeof(buf)) < 0)
2361bc9e055cSSrinivas Dasari 		goto out;
2362d1e22f76SJouni Malinen 
2363772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "AuthenticationConfirm") == 0) {
23649a3415c2SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 2) < 0) {
23659a3415c2SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
23669a3415c2SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
23679a3415c2SJouni Malinen 			goto out;
23689a3415c2SJouni Malinen 		}
23699a3415c2SJouni Malinen 
23709a3415c2SJouni Malinen 		if (dpp_wait_rx_conf_req(dut, ctrl, 5) < 0)
23719a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponse";
2372772299f1SJouni Malinen 		else
23739a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,ConfigurationRequest";
2374772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2375772299f1SJouni Malinen 		goto out;
2376772299f1SJouni Malinen 	}
2377772299f1SJouni Malinen 
2378bc9e055cSSrinivas Dasari 	if (strstr(buf, "DPP-AUTH-DIRECTION")) {
23792e9c8a46SJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, auth_events,
23802e9c8a46SJouni Malinen 					 buf, sizeof(buf));
23812e9c8a46SJouni Malinen 		if (res < 0) {
23822e9c8a46SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
23832e9c8a46SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
23842e9c8a46SJouni Malinen 			goto out;
23852e9c8a46SJouni Malinen 		}
2386bc9e055cSSrinivas Dasari 
2387bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth result: %s", buf);
23882e9c8a46SJouni Malinen 	}
23892e9c8a46SJouni Malinen 
2390d86e5828SJouni Malinen 	if (strstr(buf, "DPP-NOT-COMPATIBLE")) {
2391d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
2392d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,ROLES_NOT_COMPATIBLE");
2393d86e5828SJouni Malinen 		goto out;
2394d86e5828SJouni Malinen 	}
2395d86e5828SJouni Malinen 
2396d86e5828SJouni Malinen 	if (!strstr(buf, "DPP-AUTH-SUCCESS")) {
2397d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
2398d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,FAILED");
2399d86e5828SJouni Malinen 		goto out;
2400d86e5828SJouni Malinen 	}
2401d86e5828SJouni Malinen 
2402772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "ConfigurationRequest") == 0) {
2403772299f1SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "GAS-QUERY-DONE",
2404772299f1SJouni Malinen 					buf, sizeof(buf));
2405772299f1SJouni Malinen 		if (res < 0)
2406772299f1SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout";
2407772299f1SJouni Malinen 		else
2408772299f1SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Errorsent";
2409772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2410772299f1SJouni Malinen 		goto out;
2411772299f1SJouni Malinen 	}
2412772299f1SJouni Malinen 
2413772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "ConfigurationResponse") == 0) {
2414a97b745cSJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conf_events,
2415772299f1SJouni Malinen 					 buf, sizeof(buf));
241683bfc38fSJouni Malinen 		if (res >= 0 && strstr(buf, "DPP-MUD-URL "))
241783bfc38fSJouni Malinen 			res = get_wpa_cli_events(dut, ctrl, conf_events,
241883bfc38fSJouni Malinen 						 buf, sizeof(buf));
2419772299f1SJouni Malinen 		if (res < 0)
2420772299f1SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout";
2421772299f1SJouni Malinen 		else
24229b4f275cSDeepak Dhamdhere 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Errorsent,LastFrameReceived,ConfigurationRequest";
2423772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
2424772299f1SJouni Malinen 		goto out;
2425772299f1SJouni Malinen 	}
2426772299f1SJouni Malinen 
24279541ee87SJouni Malinen 	if (strcasecmp(prov_role, "Configurator") == 0 && csrattrs[0]) {
24289541ee87SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CSR", buf, sizeof(buf));
24299541ee87SJouni Malinen 		if (res < 0) {
24309541ee87SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
24319541ee87SJouni Malinen 				  "errorCode,No CSR received from Enrollee");
24329541ee87SJouni Malinen 			res = STATUS_SENT_ERROR;
24339541ee87SJouni Malinen 			goto out;
24349541ee87SJouni Malinen 		}
24359541ee87SJouni Malinen 
24369541ee87SJouni Malinen 		if (dpp_process_csr(dut, ifname, buf) < 0) {
24379541ee87SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
24389541ee87SJouni Malinen 				  "errorCode,Failed to process CSR");
24399541ee87SJouni Malinen 			res = STATUS_SENT_ERROR;
24409541ee87SJouni Malinen 			goto out;
24419541ee87SJouni Malinen 		}
24429541ee87SJouni Malinen 	}
24439541ee87SJouni Malinen 
2444d86e5828SJouni Malinen 	res = get_wpa_cli_events(dut, ctrl, conf_events, buf, sizeof(buf));
244583bfc38fSJouni Malinen 	if (res >= 0 && strstr(buf, "DPP-MUD-URL ")) {
244683bfc38fSJouni Malinen 		size_t url_len;
244783bfc38fSJouni Malinen 
244883bfc38fSJouni Malinen 		pos = strchr(buf, ' ');
244983bfc38fSJouni Malinen 		if (!pos)
245083bfc38fSJouni Malinen 			goto err;
245183bfc38fSJouni Malinen 		pos++;
245283bfc38fSJouni Malinen 		url_len = strlen(buf);
245383bfc38fSJouni Malinen 		mud_url = malloc(9 + url_len);
245483bfc38fSJouni Malinen 		if (!mud_url)
245583bfc38fSJouni Malinen 			goto err;
245683bfc38fSJouni Malinen 		memcpy(mud_url, ",MUDURL,", 8);
245783bfc38fSJouni Malinen 		memcpy(mud_url + 8, pos, url_len + 1);
245883bfc38fSJouni Malinen 
245983bfc38fSJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conf_events,
246083bfc38fSJouni Malinen 					 buf, sizeof(buf));
246183bfc38fSJouni Malinen 	}
2462d86e5828SJouni Malinen 	if (res < 0) {
2463d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
2464d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout");
2465d86e5828SJouni Malinen 		goto out;
2466d86e5828SJouni Malinen 	}
2467d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP conf result: %s", buf);
2468d86e5828SJouni Malinen 
2469d86e5828SJouni Malinen 	if (!strstr(buf, "DPP-CONF-SENT") &&
2470d86e5828SJouni Malinen 	    !strstr(buf, "DPP-CONF-RECEIVED")) {
2471d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
2472d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,OK,ConfResult,FAILED");
2473d86e5828SJouni Malinen 		goto out;
2474d86e5828SJouni Malinen 	}
2475d86e5828SJouni Malinen 
24769be22eddSJouni Malinen 	if (conn_status && strstr(buf, "DPP-CONF-SENT") &&
24779be22eddSJouni Malinen 	    strstr(buf, "wait_conn_status=1")) {
24789be22eddSJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CONN-STATUS-RESULT",
24799be22eddSJouni Malinen 					buf, sizeof(buf));
24809be22eddSJouni Malinen 		if (res < 0) {
24819be22eddSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
24829be22eddSJouni Malinen 				  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,StatusResult,Timeout");
24839be22eddSJouni Malinen 		} else {
24849be22eddSJouni Malinen 			pos = strstr(buf, "result=");
24859be22eddSJouni Malinen 			if (!pos) {
24869be22eddSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
24879be22eddSJouni Malinen 					  "errorCode,Status result value not reported");
24889be22eddSJouni Malinen 			} else {
24899be22eddSJouni Malinen 				pos += 7;
24909be22eddSJouni Malinen 				snprintf(buf, sizeof(buf),
249183bfc38fSJouni Malinen 					 "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,StatusResult,%d%s",
249283bfc38fSJouni Malinen 					 atoi(pos), mud_url);
24939be22eddSJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE, buf);
24949be22eddSJouni Malinen 			}
24959be22eddSJouni Malinen 		}
24969be22eddSJouni Malinen 		goto out;
24979be22eddSJouni Malinen 	}
24989be22eddSJouni Malinen 
2499a28608abSJouni Malinen 	if (strcasecmp(prov_role, "Enrollee") == 0 && netrole &&
2500a28608abSJouni Malinen 	    strcmp(netrole, "configurator") == 0) {
2501a28608abSJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CONFIGURATOR-ID",
2502a28608abSJouni Malinen 					buf, sizeof(buf));
2503a28608abSJouni Malinen 		if (res < 0) {
2504a28608abSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
2505a28608abSJouni Malinen 				  "errorCode,No DPP-CONFIGURATOR-ID");
2506a28608abSJouni Malinen 			goto out;
2507a28608abSJouni Malinen 		}
2508a28608abSJouni Malinen 		pos = strchr(buf, ' ');
2509a28608abSJouni Malinen 		if (!pos) {
2510a28608abSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
2511a28608abSJouni Malinen 				  "errorCode,Invalid DPP-CONFIGURATOR-ID");
2512a28608abSJouni Malinen 			goto out;
2513a28608abSJouni Malinen 		}
2514a28608abSJouni Malinen 		pos++;
2515a28608abSJouni Malinen 		dut->dpp_conf_id = atoi(pos);
2516a28608abSJouni Malinen 	} else if (sigma_dut_is_ap(dut) &&
2517d86e5828SJouni Malinen 		   strcasecmp(prov_role, "Enrollee") == 0) {
2518174db64fSJouni Malinen 	update_ap:
2519d86e5828SJouni Malinen 		res = dpp_hostapd_conf_update(dut, conn, ifname, ctrl);
2520d86e5828SJouni Malinen 		if (res == 0)
2521d86e5828SJouni Malinen 			goto out;
2522d86e5828SJouni Malinen 		if (res < 0) {
2523d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR, NULL);
2524d86e5828SJouni Malinen 			goto out;
2525d86e5828SJouni Malinen 		}
2526d86e5828SJouni Malinen 	}
2527d86e5828SJouni Malinen 
2528d86e5828SJouni Malinen 	if (strcasecmp(wait_conn, "Yes") == 0 &&
2529d86e5828SJouni Malinen 	    !sigma_dut_is_ap(dut) &&
2530d86e5828SJouni Malinen 	    strcasecmp(prov_role, "Enrollee") == 0) {
253185a5a2e5SJouni Malinen 		int netw_id;
253285a5a2e5SJouni Malinen 		char *pos;
253385a5a2e5SJouni Malinen 
253485a5a2e5SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-NETWORK-ID",
253585a5a2e5SJouni Malinen 					buf, sizeof(buf));
253685a5a2e5SJouni Malinen 		if (res < 0) {
253785a5a2e5SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
253885a5a2e5SJouni Malinen 				  "errorCode,No DPP-NETWORK-ID");
253985a5a2e5SJouni Malinen 			goto out;
254085a5a2e5SJouni Malinen 		}
254185a5a2e5SJouni Malinen 		pos = strchr(buf, ' ');
254285a5a2e5SJouni Malinen 		if (!pos) {
254385a5a2e5SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
254485a5a2e5SJouni Malinen 				  "errorCode,Invalid DPP-NETWORK-ID");
254585a5a2e5SJouni Malinen 			goto out;
254685a5a2e5SJouni Malinen 		}
254785a5a2e5SJouni Malinen 		pos++;
254885a5a2e5SJouni Malinen 		netw_id = atoi(pos);
254985a5a2e5SJouni Malinen 		snprintf(buf, sizeof(buf), "GET_NETWORK %d key_mgmt", netw_id);
255085a5a2e5SJouni Malinen 		if (wpa_command_resp(ifname, buf, buf, sizeof(buf)) < 0) {
255185a5a2e5SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
255285a5a2e5SJouni Malinen 				  "errorCode,Could not fetch provisioned key_mgmt");
255385a5a2e5SJouni Malinen 			goto out;
255485a5a2e5SJouni Malinen 		}
255585a5a2e5SJouni Malinen 		if (strncmp(buf, "SAE", 3) == 0) {
255685a5a2e5SJouni Malinen 			/* SAE generates PMKSA-CACHE-ADDED event */
255785a5a2e5SJouni Malinen 			not_dpp_akm = 1;
255885a5a2e5SJouni Malinen 		}
25591dabb5a6SJouni Malinen 		dut->dpp_network_id = netw_id;
2560fbb268d7SJouni Malinen 	wait_connect:
256153558e0fSJouni Malinen 		if (frametype && strcasecmp(frametype,
256253558e0fSJouni Malinen 					    "PeerDiscoveryRequest") == 0) {
256353558e0fSJouni Malinen 			if (dpp_wait_tx_status(dut, ctrl, 5) < 0)
256453558e0fSJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Timeout";
256553558e0fSJouni Malinen 			else
256653558e0fSJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Errorsent";
256753558e0fSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE, result);
256853558e0fSJouni Malinen 			goto out;
256953558e0fSJouni Malinen 		}
257053558e0fSJouni Malinen 
2571d86e5828SJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conn_events,
2572d86e5828SJouni Malinen 					 buf, sizeof(buf));
2573d86e5828SJouni Malinen 		if (res < 0) {
2574d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
2575d86e5828SJouni Malinen 				  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Timeout,NetworkConnectResult,Timeout");
2576d86e5828SJouni Malinen 			goto out;
2577d86e5828SJouni Malinen 		}
2578d86e5828SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP connect result: %s",
2579d86e5828SJouni Malinen 				buf);
2580d86e5828SJouni Malinen 
2581d86e5828SJouni Malinen 		if (strstr(buf, "PMKSA-CACHE-ADDED")) {
2582d86e5828SJouni Malinen 			res = get_wpa_cli_events(dut, ctrl, conn_events,
2583d86e5828SJouni Malinen 						 buf, sizeof(buf));
2584d86e5828SJouni Malinen 			if (res < 0) {
2585d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
258685a5a2e5SJouni Malinen 					  not_dpp_akm ?
258785a5a2e5SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,Timeout" :
2588d86e5828SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,Timeout");
2589d86e5828SJouni Malinen 				goto out;
2590d86e5828SJouni Malinen 			}
2591d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
2592d86e5828SJouni Malinen 					"DPP connect result: %s", buf);
2593d86e5828SJouni Malinen 			if (strstr(buf, "CTRL-EVENT-CONNECTED"))
2594d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
259585a5a2e5SJouni Malinen 					  not_dpp_akm ?
259685a5a2e5SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,OK" :
2597d86e5828SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,OK");
2598d86e5828SJouni Malinen 			else
2599d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
260085a5a2e5SJouni Malinen 					  not_dpp_akm ?
260185a5a2e5SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,Timeout" :
2602d86e5828SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,Timeout");
2603d86e5828SJouni Malinen 			goto out;
2604d86e5828SJouni Malinen 		}
2605d86e5828SJouni Malinen 
2606d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
2607d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,OK");
2608d86e5828SJouni Malinen 		goto out;
26091dabb5a6SJouni Malinen 	} else if (!sigma_dut_is_ap(dut) &&
26101dabb5a6SJouni Malinen 		   strcasecmp(prov_role, "Enrollee") == 0) {
26111dabb5a6SJouni Malinen 		/* Store DPP network id for reconfiguration */
26121dabb5a6SJouni Malinen 		char *pos;
26131dabb5a6SJouni Malinen 		unsigned int old_timeout;
26141dabb5a6SJouni Malinen 
26151dabb5a6SJouni Malinen 		old_timeout = dut->default_timeout;
26161dabb5a6SJouni Malinen 		dut->default_timeout = 3;
26171dabb5a6SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-NETWORK-ID",
26181dabb5a6SJouni Malinen 					buf, sizeof(buf));
26191dabb5a6SJouni Malinen 		dut->default_timeout = old_timeout;
26201dabb5a6SJouni Malinen 
26211dabb5a6SJouni Malinen 		if (res < 0) {
26221dabb5a6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO, "No DPP-NETWORK-ID");
26231dabb5a6SJouni Malinen 		} else {
26241dabb5a6SJouni Malinen 			pos = strchr(buf, ' ');
26251dabb5a6SJouni Malinen 			if (!pos) {
26261dabb5a6SJouni Malinen 				sigma_dut_print(dut, DUT_MSG_INFO,
26271dabb5a6SJouni Malinen 						"Invalid DPP-NETWORK-ID");
26281dabb5a6SJouni Malinen 			} else {
26291dabb5a6SJouni Malinen 				pos++;
26301dabb5a6SJouni Malinen 				dut->dpp_network_id = atoi(pos);
26311dabb5a6SJouni Malinen 			}
26321dabb5a6SJouni Malinen 		}
2633d86e5828SJouni Malinen 	}
2634d86e5828SJouni Malinen 
263553558e0fSJouni Malinen 	if (strcasecmp(wait_conn, "Yes") == 0 &&
263653558e0fSJouni Malinen 	    frametype && strcasecmp(frametype, "PeerDiscoveryResponse") == 0) {
263753558e0fSJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 6) < 0)
263853558e0fSJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Timeout";
263953558e0fSJouni Malinen 		else
264053558e0fSJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Errorsent";
264153558e0fSJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
264253558e0fSJouni Malinen 		goto out;
264353558e0fSJouni Malinen 	}
264453558e0fSJouni Malinen 
264583bfc38fSJouni Malinen 	snprintf(buf, sizeof(buf),
264683bfc38fSJouni Malinen 		 "BootstrapResult,OK,AuthResult,OK,ConfResult,OK%s", mud_url);
264783bfc38fSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
2648d86e5828SJouni Malinen out:
264983bfc38fSJouni Malinen 	if (mud_url != no_mud_url)
265083bfc38fSJouni Malinen 		free(mud_url);
2651d86e5828SJouni Malinen 	wpa_ctrl_detach(ctrl);
2652d86e5828SJouni Malinen 	wpa_ctrl_close(ctrl);
2653785afb44SJouni Malinen 	if (tcp && strcasecmp(tcp, "yes") == 0 &&
2654785afb44SJouni Malinen 	    auth_role && strcasecmp(auth_role, "Responder") == 0)
2655785afb44SJouni Malinen 		wpa_command(ifname, "DPP_CONTROLLER_STOP");
2656d86e5828SJouni Malinen 	dut->default_timeout = old_timeout;
265789cf6d64SJouni Malinen 	return STATUS_SENT;
26583aa72861SJouni Malinen err:
26593aa72861SJouni Malinen 	send_resp(dut, conn, SIGMA_ERROR, NULL);
26603aa72861SJouni Malinen 	goto out;
2661d86e5828SJouni Malinen }
2662d86e5828SJouni Malinen 
2663d86e5828SJouni Malinen 
dpp_manual_dpp(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)266489cf6d64SJouni Malinen static enum sigma_cmd_result dpp_manual_dpp(struct sigma_dut *dut,
2665bc9e055cSSrinivas Dasari 					    struct sigma_conn *conn,
2666bc9e055cSSrinivas Dasari 					    struct sigma_cmd *cmd)
2667bc9e055cSSrinivas Dasari {
2668bc9e055cSSrinivas Dasari 	const char *auth_role = get_param(cmd, "DPPAuthRole");
26692fa651beSpriyadharshini gowthaman 	const char *self_conf = get_param(cmd, "DPPSelfConfigure");
267089cf6d64SJouni Malinen 	enum sigma_cmd_result res = INVALID_SEND_STATUS;
267189cf6d64SJouni Malinen 	int success;
2672bc9e055cSSrinivas Dasari 	const char *val;
2673bc9e055cSSrinivas Dasari 	unsigned int old_timeout;
2674ed629d51SJouni Malinen 	const char *bs = get_param(cmd, "DPPBS");
2675bc9e055cSSrinivas Dasari 
26762fa651beSpriyadharshini gowthaman 	if (!self_conf)
26772fa651beSpriyadharshini gowthaman 		self_conf = "no";
26782fa651beSpriyadharshini gowthaman 
2679bc9e055cSSrinivas Dasari 	old_timeout = dut->default_timeout;
2680bc9e055cSSrinivas Dasari 	val = get_param(cmd, "DPPTimeout");
2681bc9e055cSSrinivas Dasari 	if (val && atoi(val) > 0) {
2682bc9e055cSSrinivas Dasari 		dut->default_timeout = atoi(val);
2683bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP timeout: %u",
2684bc9e055cSSrinivas Dasari 				dut->default_timeout);
2685bc9e055cSSrinivas Dasari 	}
2686bc9e055cSSrinivas Dasari 
2687ed629d51SJouni Malinen 	if (strcasecmp(bs, "NFC") == 0) {
2688ed629d51SJouni Malinen 		res = dpp_automatic_dpp(dut, conn, cmd);
2689ed629d51SJouni Malinen 		goto out;
2690ed629d51SJouni Malinen 	}
2691ed629d51SJouni Malinen 
2692bc9e055cSSrinivas Dasari 	res = dpp_get_local_bootstrap(dut, conn, cmd, 0, &success);
269389cf6d64SJouni Malinen 	if (res != STATUS_SENT || !success)
2694bc9e055cSSrinivas Dasari 		goto out;
2695bc9e055cSSrinivas Dasari 
26968551c51bSJouni Malinen 	if (!auth_role) {
26978551c51bSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
26988551c51bSJouni Malinen 			  "errorCode,Missing DPPAuthRole");
26998551c51bSJouni Malinen 		return STATUS_SENT_ERROR;
27008551c51bSJouni Malinen 	}
27018551c51bSJouni Malinen 
2702bc9e055cSSrinivas Dasari 	if (strcasecmp(auth_role, "Responder") == 0) {
270389cf6d64SJouni Malinen 		if (dpp_display_own_qrcode(dut) < 0) {
270489cf6d64SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
270589cf6d64SJouni Malinen 				  "errorCode,Failed to display own QR code");
270689cf6d64SJouni Malinen 			res = STATUS_SENT_ERROR;
2707bc9e055cSSrinivas Dasari 			goto out;
270889cf6d64SJouni Malinen 		}
2709bc9e055cSSrinivas Dasari 
2710bc9e055cSSrinivas Dasari 		res = dpp_automatic_dpp(dut, conn, cmd);
2711bc9e055cSSrinivas Dasari 		goto out;
2712bc9e055cSSrinivas Dasari 	}
2713bc9e055cSSrinivas Dasari 
2714bc9e055cSSrinivas Dasari 	if (strcasecmp(auth_role, "Initiator") == 0) {
27152fa651beSpriyadharshini gowthaman 		if (strcasecmp(self_conf, "Yes") != 0) {
271689cf6d64SJouni Malinen 			if (dpp_scan_peer_qrcode(dut) < 0) {
27171a38cc37SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
27181a38cc37SJouni Malinen 					  "errorCode,Failed to scan peer QR Code");
271989cf6d64SJouni Malinen 				res = STATUS_SENT_ERROR;
2720bc9e055cSSrinivas Dasari 				goto out;
27211a38cc37SJouni Malinen 			}
27222fa651beSpriyadharshini gowthaman 		}
2723bc9e055cSSrinivas Dasari 
2724bc9e055cSSrinivas Dasari 		res = dpp_automatic_dpp(dut, conn, cmd);
2725bc9e055cSSrinivas Dasari 		goto out;
2726bc9e055cSSrinivas Dasari 	}
2727bc9e055cSSrinivas Dasari 
2728bc9e055cSSrinivas Dasari 	send_resp(dut, conn, SIGMA_ERROR, "errorCode,Unknown DPPAuthRole");
272989cf6d64SJouni Malinen 	res = STATUS_SENT_ERROR;
2730bc9e055cSSrinivas Dasari out:
2731bc9e055cSSrinivas Dasari 	dut->default_timeout = old_timeout;
2732bc9e055cSSrinivas Dasari 	return res;
2733bc9e055cSSrinivas Dasari }
2734bc9e055cSSrinivas Dasari 
2735bc9e055cSSrinivas Dasari 
27361dabb5a6SJouni Malinen static enum sigma_cmd_result
dpp_reconfigure_configurator(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)27371dabb5a6SJouni Malinen dpp_reconfigure_configurator(struct sigma_dut *dut, struct sigma_conn *conn,
27381dabb5a6SJouni Malinen 			     struct sigma_cmd *cmd)
27391dabb5a6SJouni Malinen {
27401dabb5a6SJouni Malinen 	const char *val;
27411dabb5a6SJouni Malinen 	int freq;
27421dabb5a6SJouni Malinen 	struct wpa_ctrl *ctrl = NULL;
27431dabb5a6SJouni Malinen 	const char *ifname;
27441dabb5a6SJouni Malinen 	int conf_index;
27451dabb5a6SJouni Malinen 	const char *conf_role;
27461dabb5a6SJouni Malinen 	const char *group_id_str = NULL;
27471dabb5a6SJouni Malinen 	char *pos;
27481dabb5a6SJouni Malinen 	char buf[2000];
27491dabb5a6SJouni Malinen 	char buf2[200];
27501dabb5a6SJouni Malinen 	char conf_ssid[100];
27511dabb5a6SJouni Malinen 	char conf_pass[100];
27521dabb5a6SJouni Malinen 	char csrattrs[200];
27531dabb5a6SJouni Malinen 	char group_id[100];
27541dabb5a6SJouni Malinen 	char conf2[300];
27551dabb5a6SJouni Malinen 	FILE *f;
27561dabb5a6SJouni Malinen 	int enrollee_ap = 0;
27571dabb5a6SJouni Malinen 	int force_gas_fragm = 0;
27581dabb5a6SJouni Malinen 	int akm_use_selector = 0;
27591dabb5a6SJouni Malinen 	int conn_status;
27601dabb5a6SJouni Malinen 	int res;
27611dabb5a6SJouni Malinen 	const char *conf_events[] = {
27621dabb5a6SJouni Malinen 		"DPP-CONF-SENT",
27631dabb5a6SJouni Malinen 		"DPP-CONF-FAILED",
27641dabb5a6SJouni Malinen 		NULL
27651dabb5a6SJouni Malinen 	};
27661dabb5a6SJouni Malinen 
27671dabb5a6SJouni Malinen 	if (sigma_dut_is_ap(dut)) {
27681dabb5a6SJouni Malinen 		if (!dut->hostapd_ifname) {
27691dabb5a6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
27701dabb5a6SJouni Malinen 					"hostapd ifname not specified (-j)");
27711dabb5a6SJouni Malinen 			return ERROR_SEND_STATUS;
27721dabb5a6SJouni Malinen 		}
27731dabb5a6SJouni Malinen 		ifname = dut->hostapd_ifname;
27741dabb5a6SJouni Malinen 	} else {
27751dabb5a6SJouni Malinen 		ifname = get_station_ifname(dut);
27761dabb5a6SJouni Malinen 	}
27771dabb5a6SJouni Malinen 
27781dabb5a6SJouni Malinen 	val = get_param(cmd, "DPPConfEnrolleeRole");
27791dabb5a6SJouni Malinen 	if (val)
27801dabb5a6SJouni Malinen 		enrollee_ap = strcasecmp(val, "AP") == 0;
27811dabb5a6SJouni Malinen 
27821dabb5a6SJouni Malinen 	val = get_param(cmd, "DPPStatusQuery");
27831dabb5a6SJouni Malinen 	conn_status = val && strcasecmp(val, "Yes") == 0;
27841dabb5a6SJouni Malinen 
27851dabb5a6SJouni Malinen 	conf_ssid[0] = '\0';
27861dabb5a6SJouni Malinen 	conf_pass[0] = '\0';
27871dabb5a6SJouni Malinen 	csrattrs[0] = '\0';
27881dabb5a6SJouni Malinen 	group_id[0] = '\0';
27891dabb5a6SJouni Malinen 	conf2[0] = '\0';
27901dabb5a6SJouni Malinen 
27911dabb5a6SJouni Malinen 	val = get_param(cmd, "DPPConfIndex");
27921dabb5a6SJouni Malinen 	if (!val) {
27931dabb5a6SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
27941dabb5a6SJouni Malinen 				"DPPConfIndex not specified for Configurator");
27951dabb5a6SJouni Malinen 		return ERROR_SEND_STATUS;
27961dabb5a6SJouni Malinen 	}
27971dabb5a6SJouni Malinen 	conf_index = atoi(val);
27981dabb5a6SJouni Malinen 
27991dabb5a6SJouni Malinen 	switch (conf_index) {
28001dabb5a6SJouni Malinen 	case 1:
28011dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28021dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28031dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28041dabb5a6SJouni Malinen 			goto err;
28051dabb5a6SJouni Malinen 		if (enrollee_ap) {
28061dabb5a6SJouni Malinen 			conf_role = "ap-dpp";
28071dabb5a6SJouni Malinen 		} else {
28081dabb5a6SJouni Malinen 			conf_role = "sta-dpp";
28091dabb5a6SJouni Malinen 		}
28101dabb5a6SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA";
28111dabb5a6SJouni Malinen 		break;
28121dabb5a6SJouni Malinen 	case 2:
28131dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28141dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28151dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28161dabb5a6SJouni Malinen 			goto err;
28171dabb5a6SJouni Malinen 		snprintf(conf_pass, sizeof(conf_pass),
28181dabb5a6SJouni Malinen 			 "psk=10506e102ad1e7f95112f6b127675bb8344dacacea60403f3fa4055aec85b0fc");
28191dabb5a6SJouni Malinen 		if (enrollee_ap)
28201dabb5a6SJouni Malinen 			conf_role = "ap-psk";
28211dabb5a6SJouni Malinen 		else
28221dabb5a6SJouni Malinen 			conf_role = "sta-psk";
28231dabb5a6SJouni Malinen 		break;
28241dabb5a6SJouni Malinen 	case 3:
28251dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28261dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28271dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28281dabb5a6SJouni Malinen 			goto err;
28291dabb5a6SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
28301dabb5a6SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
28311dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
28321dabb5a6SJouni Malinen 			goto err;
28331dabb5a6SJouni Malinen 		if (enrollee_ap)
28341dabb5a6SJouni Malinen 			conf_role = "ap-psk";
28351dabb5a6SJouni Malinen 		else
28361dabb5a6SJouni Malinen 			conf_role = "sta-psk";
28371dabb5a6SJouni Malinen 		break;
28381dabb5a6SJouni Malinen 	case 4:
28391dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28401dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28411dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28421dabb5a6SJouni Malinen 			goto err;
28431dabb5a6SJouni Malinen 		if (enrollee_ap) {
28441dabb5a6SJouni Malinen 			conf_role = "ap-dpp";
28451dabb5a6SJouni Malinen 		} else {
28461dabb5a6SJouni Malinen 			conf_role = "sta-dpp";
28471dabb5a6SJouni Malinen 		}
28481dabb5a6SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA2";
28491dabb5a6SJouni Malinen 		break;
28501dabb5a6SJouni Malinen 	case 5:
28511dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28521dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28531dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28541dabb5a6SJouni Malinen 			goto err;
28551dabb5a6SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
28561dabb5a6SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
28571dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
28581dabb5a6SJouni Malinen 			goto err;
28591dabb5a6SJouni Malinen 		if (enrollee_ap)
28601dabb5a6SJouni Malinen 			conf_role = "ap-sae";
28611dabb5a6SJouni Malinen 		else
28621dabb5a6SJouni Malinen 			conf_role = "sta-sae";
28631dabb5a6SJouni Malinen 		break;
28641dabb5a6SJouni Malinen 	case 6:
28651dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28661dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28671dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28681dabb5a6SJouni Malinen 			goto err;
28691dabb5a6SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
28701dabb5a6SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
28711dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
28721dabb5a6SJouni Malinen 			goto err;
28731dabb5a6SJouni Malinen 		if (enrollee_ap)
28741dabb5a6SJouni Malinen 			conf_role = "ap-psk-sae";
28751dabb5a6SJouni Malinen 		else
28761dabb5a6SJouni Malinen 			conf_role = "sta-psk-sae";
28771dabb5a6SJouni Malinen 		break;
28781dabb5a6SJouni Malinen 	case 7:
28791dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28801dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28811dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28821dabb5a6SJouni Malinen 			goto err;
28831dabb5a6SJouni Malinen 		if (enrollee_ap) {
28841dabb5a6SJouni Malinen 			conf_role = "ap-dpp";
28851dabb5a6SJouni Malinen 		} else {
28861dabb5a6SJouni Malinen 			conf_role = "sta-dpp";
28871dabb5a6SJouni Malinen 		}
28881dabb5a6SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA";
28891dabb5a6SJouni Malinen 		force_gas_fragm = 1;
28901dabb5a6SJouni Malinen 		break;
28911dabb5a6SJouni Malinen 	case 8:
28921dabb5a6SJouni Malinen 	case 9:
28931dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
28941dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
28951dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
28961dabb5a6SJouni Malinen 			goto err;
28971dabb5a6SJouni Malinen 		ascii2hexstr("This_is_legacy_password", buf);
28981dabb5a6SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
28991dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
29001dabb5a6SJouni Malinen 			goto err;
29011dabb5a6SJouni Malinen 		if (enrollee_ap) {
29021dabb5a6SJouni Malinen 			conf_role = "ap-dpp+psk+sae";
29031dabb5a6SJouni Malinen 		} else {
29041dabb5a6SJouni Malinen 			conf_role = "sta-dpp+psk+sae";
29051dabb5a6SJouni Malinen 		}
29061dabb5a6SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA1";
29071dabb5a6SJouni Malinen 		if (conf_index == 9)
29081dabb5a6SJouni Malinen 			akm_use_selector = 1;
29091dabb5a6SJouni Malinen 		break;
29101dabb5a6SJouni Malinen 	case 10:
29111dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
29121dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
29131dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
29141dabb5a6SJouni Malinen 			goto err;
29151dabb5a6SJouni Malinen 		if (enrollee_ap)
29161dabb5a6SJouni Malinen 			conf_role = "ap-dpp";
29171dabb5a6SJouni Malinen 		else
29181dabb5a6SJouni Malinen 			conf_role = "sta-dpp";
29191dabb5a6SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA1";
29201dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET02", buf);
29211dabb5a6SJouni Malinen 		ascii2hexstr("This_is_legacy_password", buf2);
29221dabb5a6SJouni Malinen 		res = snprintf(conf2, sizeof(conf2),
29231dabb5a6SJouni Malinen 			       " @CONF-OBJ-SEP@ conf=%s-dpp+psk+sae ssid=%s pass=%s group_id=DPPGROUP_DPP_INFRA2",
29241dabb5a6SJouni Malinen 			       enrollee_ap ? "ap" : "sta", buf, buf2);
29251dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf2))
29261dabb5a6SJouni Malinen 			goto err;
29271dabb5a6SJouni Malinen 		break;
29281dabb5a6SJouni Malinen 	case 11:
29291dabb5a6SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
29301dabb5a6SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
29311dabb5a6SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
29321dabb5a6SJouni Malinen 			goto err;
29331dabb5a6SJouni Malinen 		if (enrollee_ap) {
29341dabb5a6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
29351dabb5a6SJouni Malinen 				  "errorCode,dot1x AKM provisioning not supported for AP");
29361dabb5a6SJouni Malinen 			goto out;
29371dabb5a6SJouni Malinen 		}
29381dabb5a6SJouni Malinen 		conf_role = "sta-dot1x";
29391dabb5a6SJouni Malinen 		snprintf(buf, sizeof(buf), "%s/dpp-ca-csrattrs",
29401dabb5a6SJouni Malinen 			 sigma_cert_path);
29411dabb5a6SJouni Malinen 		f = fopen(buf, "r");
29421dabb5a6SJouni Malinen 		if (f) {
29431dabb5a6SJouni Malinen 			size_t len;
29441dabb5a6SJouni Malinen 			int r;
29451dabb5a6SJouni Malinen 
29461dabb5a6SJouni Malinen 			len = fread(buf, 1, sizeof(buf), f);
29471dabb5a6SJouni Malinen 			fclose(f);
29481dabb5a6SJouni Malinen 			if (len >= sizeof(buf)) {
29491dabb5a6SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
29501dabb5a6SJouni Malinen 					  "errorCode,No room for csrAttrs");
29511dabb5a6SJouni Malinen 				goto out;
29521dabb5a6SJouni Malinen 			}
29531dabb5a6SJouni Malinen 			buf[len] = '\0';
29541dabb5a6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
29551dabb5a6SJouni Malinen 					"Use csrAttrs from file");
29561dabb5a6SJouni Malinen 			r = snprintf(csrattrs, sizeof(csrattrs),
29571dabb5a6SJouni Malinen 				     " csrattrs=%s", buf);
29581dabb5a6SJouni Malinen 			if (r <= 0 || r >= sizeof(csrattrs)) {
29591dabb5a6SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
29601dabb5a6SJouni Malinen 					  "errorCode,No room for csrAttrs");
29611dabb5a6SJouni Malinen 				goto out;
29621dabb5a6SJouni Malinen 			}
29631dabb5a6SJouni Malinen 		} else {
29641dabb5a6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
29651dabb5a6SJouni Malinen 					"Use default csrAttrs");
29661dabb5a6SJouni Malinen 			snprintf(csrattrs, sizeof(csrattrs), "%s",
29671dabb5a6SJouni Malinen 				 " csrattrs=MAsGCSqGSIb3DQEJBw==");
29681dabb5a6SJouni Malinen 		}
29691dabb5a6SJouni Malinen 		break;
29701dabb5a6SJouni Malinen 	default:
29711dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
29721dabb5a6SJouni Malinen 			  "errorCode,Unsupported DPPConfIndex");
29731dabb5a6SJouni Malinen 		goto out;
29741dabb5a6SJouni Malinen 	}
29751dabb5a6SJouni Malinen 
29761dabb5a6SJouni Malinen 	if (group_id_str)
29771dabb5a6SJouni Malinen 		snprintf(group_id, sizeof(group_id), " group_id=%s",
29781dabb5a6SJouni Malinen 			 group_id_str);
29791dabb5a6SJouni Malinen 
29801dabb5a6SJouni Malinen 	if (force_gas_fragm) {
29811dabb5a6SJouni Malinen 		char spaces[1500];
29821dabb5a6SJouni Malinen 
29831dabb5a6SJouni Malinen 		memset(spaces, ' ', sizeof(spaces));
29841dabb5a6SJouni Malinen 		spaces[sizeof(spaces) - 1] = '\0';
29851dabb5a6SJouni Malinen 
29861dabb5a6SJouni Malinen 		snprintf(buf, sizeof(buf),
29871dabb5a6SJouni Malinen 			 "SET dpp_discovery_override {\"ssid\":\"DPPNET01\"}%s",
29881dabb5a6SJouni Malinen 			 spaces);
29891dabb5a6SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
29901dabb5a6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
29911dabb5a6SJouni Malinen 				  "errorCode,Failed to set discovery override");
29921dabb5a6SJouni Malinen 			goto out;
29931dabb5a6SJouni Malinen 		}
29941dabb5a6SJouni Malinen 	}
29951dabb5a6SJouni Malinen 
29961dabb5a6SJouni Malinen 	snprintf(buf, sizeof(buf),
29971dabb5a6SJouni Malinen 		 "SET dpp_configurator_params  conf=%s %s %s configurator=%d%s%s%s%s%s",
29981dabb5a6SJouni Malinen 		 conf_role, conf_ssid, conf_pass,
29991dabb5a6SJouni Malinen 		 dut->dpp_conf_id, group_id,
30001dabb5a6SJouni Malinen 		 akm_use_selector ? " akm_use_selector=1" : "",
30011dabb5a6SJouni Malinen 		 conn_status ? " conn_status=1" : "", csrattrs,
30021dabb5a6SJouni Malinen 		 conf2);
30031dabb5a6SJouni Malinen 	if (wpa_command(ifname, buf) < 0) {
30041dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
30051dabb5a6SJouni Malinen 			  "errorCode,Failed to set configurator parameters");
30061dabb5a6SJouni Malinen 		goto out;
30071dabb5a6SJouni Malinen 	}
30081dabb5a6SJouni Malinen 
30091dabb5a6SJouni Malinen 	ctrl = open_wpa_mon(ifname);
30101dabb5a6SJouni Malinen 	if (!ctrl) {
30111dabb5a6SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
30121dabb5a6SJouni Malinen 				"Failed to open wpa_supplicant monitor connection");
30131dabb5a6SJouni Malinen 		return ERROR_SEND_STATUS;
30141dabb5a6SJouni Malinen 	}
30151dabb5a6SJouni Malinen 
30161dabb5a6SJouni Malinen 	val = get_param(cmd, "DPPListenChannel");
30171dabb5a6SJouni Malinen 	if (val) {
30181dabb5a6SJouni Malinen 		freq = channel_to_freq(dut, atoi(val));
30191dabb5a6SJouni Malinen 		if (freq == 0) {
30201dabb5a6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
30211dabb5a6SJouni Malinen 				  "errorCode,Unsupported DPPListenChannel value");
30221dabb5a6SJouni Malinen 			goto out;
30231dabb5a6SJouni Malinen 		}
30241dabb5a6SJouni Malinen 		snprintf(buf, sizeof(buf),
30251dabb5a6SJouni Malinen 			 "DPP_LISTEN %d role=configurator", freq);
30261dabb5a6SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
30271dabb5a6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
30281dabb5a6SJouni Malinen 				  "errorCode,Could not start listen state");
30291dabb5a6SJouni Malinen 			goto out;
30301dabb5a6SJouni Malinen 		}
30311dabb5a6SJouni Malinen 	}
30321dabb5a6SJouni Malinen 
30331dabb5a6SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-CONF-REQ-RX",
30341dabb5a6SJouni Malinen 				buf, sizeof(buf));
30351dabb5a6SJouni Malinen 	if (res < 0) {
30361dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
30371dabb5a6SJouni Malinen 			  "ReconfigAuthResult,Timeout");
30381dabb5a6SJouni Malinen 		goto out;
30391dabb5a6SJouni Malinen 	}
30401dabb5a6SJouni Malinen 
30411dabb5a6SJouni Malinen 	res = get_wpa_cli_events(dut, ctrl, conf_events, buf, sizeof(buf));
30421dabb5a6SJouni Malinen 	if (res < 0) {
30431dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
30441dabb5a6SJouni Malinen 			  "ReconfigAuthResult,OK,ConfResult,Timeout");
30451dabb5a6SJouni Malinen 		goto out;
30461dabb5a6SJouni Malinen 	}
30471dabb5a6SJouni Malinen 	if (!strstr(buf, "DPP-CONF-SENT")) {
30481dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
30491dabb5a6SJouni Malinen 			  "ReconfigAuthResult,OK,ConfResult,FAILED");
30501dabb5a6SJouni Malinen 		goto out;
30511dabb5a6SJouni Malinen 	}
30521dabb5a6SJouni Malinen 
30531dabb5a6SJouni Malinen 	if (conn_status && strstr(buf, "wait_conn_status=1")) {
30541dabb5a6SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CONN-STATUS-RESULT",
30551dabb5a6SJouni Malinen 					buf, sizeof(buf));
30561dabb5a6SJouni Malinen 		if (res < 0) {
30571dabb5a6SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
30581dabb5a6SJouni Malinen 				  "ReconfigAuthResult,OK,ConfResult,OK,StatusResult,Timeout");
30591dabb5a6SJouni Malinen 		} else {
30601dabb5a6SJouni Malinen 			pos = strstr(buf, "result=");
30611dabb5a6SJouni Malinen 			if (!pos) {
30621dabb5a6SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
30631dabb5a6SJouni Malinen 					  "errorCode,Status result value not reported");
30641dabb5a6SJouni Malinen 			} else {
30651dabb5a6SJouni Malinen 				pos += 7;
30661dabb5a6SJouni Malinen 				snprintf(buf, sizeof(buf),
30671dabb5a6SJouni Malinen 					 "ReconfigAuthResult,OK,ConfResult,OK,StatusResult,%d",
30681dabb5a6SJouni Malinen 					 atoi(pos));
30691dabb5a6SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE, buf);
30701dabb5a6SJouni Malinen 			}
30711dabb5a6SJouni Malinen 		}
30721dabb5a6SJouni Malinen 		goto out;
30731dabb5a6SJouni Malinen 	}
30741dabb5a6SJouni Malinen 
30751dabb5a6SJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE,
30761dabb5a6SJouni Malinen 		  "ReconfigAuthResult,OK,ConfResult,OK");
30771dabb5a6SJouni Malinen 
30781dabb5a6SJouni Malinen out:
30791dabb5a6SJouni Malinen 	if (ctrl) {
30801dabb5a6SJouni Malinen 		wpa_ctrl_detach(ctrl);
30811dabb5a6SJouni Malinen 		wpa_ctrl_close(ctrl);
30821dabb5a6SJouni Malinen 	}
30831dabb5a6SJouni Malinen 	return STATUS_SENT;
30841dabb5a6SJouni Malinen err:
30851dabb5a6SJouni Malinen 	send_resp(dut, conn, SIGMA_ERROR, NULL);
30861dabb5a6SJouni Malinen 	goto out;
30871dabb5a6SJouni Malinen }
30881dabb5a6SJouni Malinen 
30891dabb5a6SJouni Malinen 
dpp_reconfigure(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)30901dabb5a6SJouni Malinen static enum sigma_cmd_result dpp_reconfigure(struct sigma_dut *dut,
30911dabb5a6SJouni Malinen 					     struct sigma_conn *conn,
30921dabb5a6SJouni Malinen 					     struct sigma_cmd *cmd)
30931dabb5a6SJouni Malinen {
30941dabb5a6SJouni Malinen 	const char *wait_conn;
30951dabb5a6SJouni Malinen 	char buf[200];
3096d2b559b7SJouni Malinen 	char *pos;
30971dabb5a6SJouni Malinen 	const char *ifname;
30981dabb5a6SJouni Malinen 	struct wpa_ctrl *ctrl;
30991dabb5a6SJouni Malinen 	const char *conf_events[] = {
31001dabb5a6SJouni Malinen 		"DPP-CONF-RECEIVED",
31011dabb5a6SJouni Malinen 		"DPP-CONF-FAILED",
31021dabb5a6SJouni Malinen 		NULL
31031dabb5a6SJouni Malinen 	};
31041dabb5a6SJouni Malinen 	const char *conn_events[] = {
31051dabb5a6SJouni Malinen 		"PMKSA-CACHE-ADDED",
31061dabb5a6SJouni Malinen 		"CTRL-EVENT-CONNECTED",
31071dabb5a6SJouni Malinen 		NULL
31081dabb5a6SJouni Malinen 	};
31091dabb5a6SJouni Malinen 	int res;
31101dabb5a6SJouni Malinen 
31111dabb5a6SJouni Malinen 	if (get_param(cmd, "DPPConfIndex"))
31121dabb5a6SJouni Malinen 		return dpp_reconfigure_configurator(dut, conn, cmd);
31131dabb5a6SJouni Malinen 
31141dabb5a6SJouni Malinen 	/* Enrollee reconfiguration steps */
31151dabb5a6SJouni Malinen 	ifname = get_station_ifname(dut);
31161dabb5a6SJouni Malinen 	wait_conn = get_param(cmd, "DPPWaitForConnect");
31171dabb5a6SJouni Malinen 	if (!wait_conn)
31181dabb5a6SJouni Malinen 		wait_conn = "no";
31191dabb5a6SJouni Malinen 
31201dabb5a6SJouni Malinen 	ctrl = open_wpa_mon(ifname);
31211dabb5a6SJouni Malinen 	if (!ctrl) {
31221dabb5a6SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
31231dabb5a6SJouni Malinen 				"Failed to open wpa_supplicant monitor connection");
31241dabb5a6SJouni Malinen 		return ERROR_SEND_STATUS;
31251dabb5a6SJouni Malinen 	}
31261dabb5a6SJouni Malinen 
312718f9dfbcSJouni Malinen 	snprintf(buf, sizeof(buf), "DPP_RECONFIG %d iter=10",
312818f9dfbcSJouni Malinen 		 dut->dpp_network_id);
31291dabb5a6SJouni Malinen 	if (wpa_command(ifname, buf) < 0) {
31301dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
31311dabb5a6SJouni Malinen 			  "errorCode,Failed to start reconfiguration");
31321dabb5a6SJouni Malinen 		goto out;
31331dabb5a6SJouni Malinen 	}
31341dabb5a6SJouni Malinen 
31351dabb5a6SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "GAS-QUERY-START",
31361dabb5a6SJouni Malinen 				buf, sizeof(buf));
31371dabb5a6SJouni Malinen 	if (res < 0) {
31381dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
31391dabb5a6SJouni Malinen 			  "ReconfigAuthResult,Timeout");
31401dabb5a6SJouni Malinen 		goto out;
31411dabb5a6SJouni Malinen 	}
31421dabb5a6SJouni Malinen 
31431dabb5a6SJouni Malinen 	res = get_wpa_cli_events(dut, ctrl, conf_events, buf, sizeof(buf));
31441dabb5a6SJouni Malinen 	if (res < 0) {
31451dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
31461dabb5a6SJouni Malinen 			  "ReconfigAuthResult,OK,ConfResult,Timeout");
31471dabb5a6SJouni Malinen 		goto out;
31481dabb5a6SJouni Malinen 	}
31491dabb5a6SJouni Malinen 	if (!strstr(buf, "DPP-CONF-RECEIVED")) {
31501dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
31511dabb5a6SJouni Malinen 			  "ReconfigAuthResult,OK,ConfResult,FAILED");
31521dabb5a6SJouni Malinen 		goto out;
31531dabb5a6SJouni Malinen 	}
31541dabb5a6SJouni Malinen 
3155d2b559b7SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-NETWORK-ID", buf, sizeof(buf));
3156d2b559b7SJouni Malinen 	if (res < 0) {
3157d2b559b7SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
3158d2b559b7SJouni Malinen 			  "errorCode,No DPP-NETWORK-ID");
3159d2b559b7SJouni Malinen 		goto out;
3160d2b559b7SJouni Malinen 	}
3161d2b559b7SJouni Malinen 	pos = strchr(buf, ' ');
3162d2b559b7SJouni Malinen 	if (!pos) {
3163d2b559b7SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
3164d2b559b7SJouni Malinen 			  "errorCode,Invalid DPP-NETWORK-ID");
3165d2b559b7SJouni Malinen 		goto out;
3166d2b559b7SJouni Malinen 	}
3167d2b559b7SJouni Malinen 	pos++;
3168d2b559b7SJouni Malinen 	dut->dpp_network_id = atoi(pos);
3169d2b559b7SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG,
3170d2b559b7SJouni Malinen 			"Network ID for the reconfigured network: %d",
3171d2b559b7SJouni Malinen 			dut->dpp_network_id);
3172d2b559b7SJouni Malinen 
31731dabb5a6SJouni Malinen 	if (strcasecmp(wait_conn, "Yes") == 0) {
31741dabb5a6SJouni Malinen 		int not_dpp_akm = 0;
31751dabb5a6SJouni Malinen 
31761dabb5a6SJouni Malinen 		snprintf(buf, sizeof(buf), "GET_NETWORK %d key_mgmt",
31771dabb5a6SJouni Malinen 			 dut->dpp_network_id);
31781dabb5a6SJouni Malinen 		if (wpa_command_resp(ifname, buf, buf, sizeof(buf)) < 0) {
31791dabb5a6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
31801dabb5a6SJouni Malinen 				  "errorCode,Could not fetch provisioned key_mgmt");
31811dabb5a6SJouni Malinen 			goto out;
31821dabb5a6SJouni Malinen 		}
31831dabb5a6SJouni Malinen 		if (strncmp(buf, "SAE", 3) == 0) {
31841dabb5a6SJouni Malinen 			/* SAE generates PMKSA-CACHE-ADDED event */
31851dabb5a6SJouni Malinen 			not_dpp_akm = 1;
31861dabb5a6SJouni Malinen 		}
31871dabb5a6SJouni Malinen 
31881dabb5a6SJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conn_events,
31891dabb5a6SJouni Malinen 					 buf, sizeof(buf));
31901dabb5a6SJouni Malinen 		if (res < 0) {
31911dabb5a6SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
31921dabb5a6SJouni Malinen 				  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Timeout,NetworkConnectResult,Timeout");
31931dabb5a6SJouni Malinen 			goto out;
31941dabb5a6SJouni Malinen 		}
31951dabb5a6SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP connect result: %s",
31961dabb5a6SJouni Malinen 				buf);
31971dabb5a6SJouni Malinen 
31981dabb5a6SJouni Malinen 		if (strstr(buf, "PMKSA-CACHE-ADDED")) {
31991dabb5a6SJouni Malinen 			res = get_wpa_cli_events(dut, ctrl, conn_events,
32001dabb5a6SJouni Malinen 						 buf, sizeof(buf));
32011dabb5a6SJouni Malinen 			if (res < 0) {
32021dabb5a6SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
32031dabb5a6SJouni Malinen 					  not_dpp_akm ?
32041dabb5a6SJouni Malinen 					  "ReconfigAuthResult,OK,ConfResult,OK,NetworkConnectResult,Timeout" :
32051dabb5a6SJouni Malinen 					  "ReconfigAuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,Timeout");
32061dabb5a6SJouni Malinen 				goto out;
32071dabb5a6SJouni Malinen 			}
32081dabb5a6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
32091dabb5a6SJouni Malinen 					"DPP connect result: %s", buf);
32101dabb5a6SJouni Malinen 			if (strstr(buf, "CTRL-EVENT-CONNECTED"))
32111dabb5a6SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
32121dabb5a6SJouni Malinen 					  not_dpp_akm ?
32131dabb5a6SJouni Malinen 					  "ReconfigAuthResult,OK,ConfResult,OK,NetworkConnectResult,OK" :
32141dabb5a6SJouni Malinen 					  "ReconfigAuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,OK");
32151dabb5a6SJouni Malinen 			else
32161dabb5a6SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
32171dabb5a6SJouni Malinen 					  not_dpp_akm ?
32181dabb5a6SJouni Malinen 					  "ReconfigAuthResult,OK,ConfResult,OK,NetworkConnectResult,Timeout" :
32191dabb5a6SJouni Malinen 					  "ReconfigAuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,Timeout");
32201dabb5a6SJouni Malinen 			goto out;
32211dabb5a6SJouni Malinen 		}
32221dabb5a6SJouni Malinen 
32231dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
32241dabb5a6SJouni Malinen 			  "ReconfigAuthResult,OK,ConfResult,OK,NetworkConnectResult,OK");
32251dabb5a6SJouni Malinen 		goto out;
32261dabb5a6SJouni Malinen 	}
32271dabb5a6SJouni Malinen 
32281dabb5a6SJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE,
32291dabb5a6SJouni Malinen 		  "ReconfigAuthResult,OK,ConfResult,OK");
32301dabb5a6SJouni Malinen 
32311dabb5a6SJouni Malinen out:
32321dabb5a6SJouni Malinen 	wpa_ctrl_detach(ctrl);
32331dabb5a6SJouni Malinen 	wpa_ctrl_close(ctrl);
32341dabb5a6SJouni Malinen 	return STATUS_SENT;
32351dabb5a6SJouni Malinen }
32361dabb5a6SJouni Malinen 
32371dabb5a6SJouni Malinen 
dpp_dev_exec_action(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)323889cf6d64SJouni Malinen enum sigma_cmd_result dpp_dev_exec_action(struct sigma_dut *dut,
323989cf6d64SJouni Malinen 					  struct sigma_conn *conn,
3240d86e5828SJouni Malinen 					  struct sigma_cmd *cmd)
3241d86e5828SJouni Malinen {
3242d86e5828SJouni Malinen 	const char *type = get_param(cmd, "DPPActionType");
3243d86e5828SJouni Malinen 	const char *bs = get_param(cmd, "DPPBS");
3244d86e5828SJouni Malinen 
3245d86e5828SJouni Malinen 	if (!type) {
3246d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
3247d86e5828SJouni Malinen 			  "errorCode,Missing DPPActionType");
324889cf6d64SJouni Malinen 		return STATUS_SENT_ERROR;
3249d86e5828SJouni Malinen 	}
3250d86e5828SJouni Malinen 
32511dabb5a6SJouni Malinen 	if (strcasecmp(type, "DPPReconfigure") == 0)
32521dabb5a6SJouni Malinen 		return dpp_reconfigure(dut, conn, cmd);
32531dabb5a6SJouni Malinen 
32541dabb5a6SJouni Malinen 	if (!bs) {
32551dabb5a6SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
32561dabb5a6SJouni Malinen 			  "errorCode,Missing DPPBS");
32571dabb5a6SJouni Malinen 		return STATUS_SENT_ERROR;
32581dabb5a6SJouni Malinen 	}
32591dabb5a6SJouni Malinen 
3260d86e5828SJouni Malinen 	if (strcasecmp(type, "GetLocalBootstrap") == 0)
3261bc9e055cSSrinivas Dasari 		return dpp_get_local_bootstrap(dut, conn, cmd, 1, NULL);
3262d86e5828SJouni Malinen 	if (strcasecmp(type, "SetPeerBootstrap") == 0)
3263d86e5828SJouni Malinen 		return dpp_set_peer_bootstrap(dut, conn, cmd);
3264d86e5828SJouni Malinen 	if (strcasecmp(type, "ManualDPP") == 0)
3265d86e5828SJouni Malinen 		return dpp_manual_dpp(dut, conn, cmd);
3266d86e5828SJouni Malinen 	if (strcasecmp(type, "AutomaticDPP") == 0)
3267d86e5828SJouni Malinen 		return dpp_automatic_dpp(dut, conn, cmd);
3268d86e5828SJouni Malinen 
3269d86e5828SJouni Malinen 	send_resp(dut, conn, SIGMA_ERROR,
3270d86e5828SJouni Malinen 		  "errorCode,Unsupported DPPActionType");
327189cf6d64SJouni Malinen 	return STATUS_SENT_ERROR;
3272d86e5828SJouni Malinen }
3273