xref: /wlan-dirver/utils/sigma-dut/dpp.c (revision a833025d0e28cc363e3cfc55394c93ea486f16a1)
1d86e5828SJouni Malinen /*
2d86e5828SJouni Malinen  * Sigma Control API DUT (station/AP/sniffer)
3d86e5828SJouni Malinen  * Copyright (c) 2017, Qualcomm Atheros, Inc.
4c12ea4afSJouni Malinen  * Copyright (c) 2018, 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 
141a38cc37SJouni Malinen #ifdef ANDROID
15bc9e055cSSrinivas Dasari char *dpp_qrcode_file = "/sdcard/wpadebug_qrdata.txt";
161a38cc37SJouni Malinen #endif /* ANDROID */
17bc9e055cSSrinivas Dasari 
18d86e5828SJouni Malinen 
19d86e5828SJouni Malinen static int sigma_dut_is_ap(struct sigma_dut *dut)
20d86e5828SJouni Malinen {
21d86e5828SJouni Malinen 	return dut->device_type == AP_unknown ||
22d86e5828SJouni Malinen 		dut->device_type == AP_testbed ||
23d86e5828SJouni Malinen 		dut->device_type == AP_dut;
24d86e5828SJouni Malinen }
25d86e5828SJouni Malinen 
26d86e5828SJouni Malinen 
27d86e5828SJouni Malinen static int dpp_hostapd_run(struct sigma_dut *dut)
28d86e5828SJouni Malinen {
29d86e5828SJouni Malinen 	if (dut->hostapd_running)
30d86e5828SJouni Malinen 		return 0;
31d86e5828SJouni Malinen 
32d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
33d86e5828SJouni Malinen 			"Starting hostapd in unconfigured state for DPP");
34d86e5828SJouni Malinen 	snprintf(dut->ap_ssid, sizeof(dut->ap_ssid), "unconfigured");
359149afc1Spriyadharshini gowthaman 	if (!dut->ap_oper_chn)
36d86e5828SJouni Malinen 		dut->ap_channel = 11;
37d86e5828SJouni Malinen 	dut->ap_is_dual = 0;
38fa2d7c3aSpriyadharshini gowthaman 	dut->ap_mode = dut->ap_channel <= 14 ? AP_11ng : AP_11na;
39d86e5828SJouni Malinen 	dut->ap_key_mgmt = AP_OPEN;
40d86e5828SJouni Malinen 	dut->ap_cipher = AP_PLAIN;
41d86e5828SJouni Malinen 	return cmd_ap_config_commit(dut, NULL, NULL) == 1 ? 0 : -1;
42d86e5828SJouni Malinen }
43d86e5828SJouni Malinen 
44d86e5828SJouni Malinen 
45d86e5828SJouni Malinen static const char * dpp_get_curve(struct sigma_cmd *cmd, const char *arg)
46d86e5828SJouni Malinen {
47d86e5828SJouni Malinen 	const char *val = get_param(cmd, arg);
48d86e5828SJouni Malinen 
49d86e5828SJouni Malinen 	if (!val)
50d86e5828SJouni Malinen 		val = "P-256";
51d86e5828SJouni Malinen 	else if (strcasecmp(val, "BP-256R1") == 0)
52d86e5828SJouni Malinen 		val = "BP-256";
53d86e5828SJouni Malinen 	else if (strcasecmp(val, "BP-384R1") == 0)
54d86e5828SJouni Malinen 		val = "BP-384";
55d86e5828SJouni Malinen 	else if (strcasecmp(val, "BP-512R1") == 0)
56d86e5828SJouni Malinen 		val = "BP-512";
57d86e5828SJouni Malinen 
58d86e5828SJouni Malinen 	return val;
59d86e5828SJouni Malinen }
60d86e5828SJouni Malinen 
61d86e5828SJouni Malinen 
62d86e5828SJouni Malinen static int dpp_get_local_bootstrap(struct sigma_dut *dut,
63d86e5828SJouni Malinen 				   struct sigma_conn *conn,
64bc9e055cSSrinivas Dasari 				   struct sigma_cmd *cmd, int send_result,
65bc9e055cSSrinivas Dasari 				   int *success)
66d86e5828SJouni Malinen {
67d86e5828SJouni Malinen 	const char *curve = dpp_get_curve(cmd, "DPPCryptoIdentifier");
68d86e5828SJouni Malinen 	const char *bs = get_param(cmd, "DPPBS");
694161c3f0SJouni Malinen 	const char *chan_list = get_param(cmd, "DPPChannelList");
704161c3f0SJouni Malinen 	char *pos, mac[50], buf[200], resp[1000], hex[2000];
71016ae6c8SJouni Malinen 	const char *ifname = get_station_ifname(dut);
723aa72861SJouni Malinen 	int res;
736f4ce416SJouni Malinen 	const char *type;
74d86e5828SJouni Malinen 
75bc9e055cSSrinivas Dasari 	if (success)
76bc9e055cSSrinivas Dasari 		*success = 0;
776f4ce416SJouni Malinen 	if (strcasecmp(bs, "QR") == 0) {
786f4ce416SJouni Malinen 		type = "qrcode";
796f4ce416SJouni Malinen 	} else if (strcasecmp(bs, "NFC") == 0) {
806f4ce416SJouni Malinen 		type ="nfc-uri";
816f4ce416SJouni Malinen 	} else {
82d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
83d86e5828SJouni Malinen 			  "errorCode,Unsupported DPPBS");
84d86e5828SJouni Malinen 		return 0;
85d86e5828SJouni Malinen 	}
86d86e5828SJouni Malinen 
87d86e5828SJouni Malinen 	if (sigma_dut_is_ap(dut)) {
88d86e5828SJouni Malinen 		u8 bssid[ETH_ALEN];
89d86e5828SJouni Malinen 
90d86e5828SJouni Malinen 		if (!dut->hostapd_ifname) {
91d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
92d86e5828SJouni Malinen 					"hostapd ifname not specified (-j)");
93d86e5828SJouni Malinen 			return -2;
94d86e5828SJouni Malinen 		}
95d86e5828SJouni Malinen 		ifname = dut->hostapd_ifname;
96d86e5828SJouni Malinen 		if (get_hwaddr(dut->hostapd_ifname, bssid) < 0) {
97d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
98d86e5828SJouni Malinen 					"Could not get MAC address for %s",
99d86e5828SJouni Malinen 					dut->hostapd_ifname);
100d86e5828SJouni Malinen 			return -2;
101d86e5828SJouni Malinen 		}
102d86e5828SJouni Malinen 		snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x",
103d86e5828SJouni Malinen 			 bssid[0], bssid[1], bssid[2],
104d86e5828SJouni Malinen 			 bssid[3], bssid[4], bssid[5]);
105d86e5828SJouni Malinen 	} else {
106d86e5828SJouni Malinen 		if (get_wpa_status(ifname, "address", mac, sizeof(mac)) < 0)
107d86e5828SJouni Malinen 			return -2;
108d86e5828SJouni Malinen 	}
109d86e5828SJouni Malinen 
110d86e5828SJouni Malinen 	pos = mac;
111d86e5828SJouni Malinen 	while (*pos) {
112d86e5828SJouni Malinen 		if (*pos == ':')
113d86e5828SJouni Malinen 			memmove(pos, pos + 1, strlen(pos));
114d86e5828SJouni Malinen 		else
115d86e5828SJouni Malinen 			pos++;
116d86e5828SJouni Malinen 	}
117d86e5828SJouni Malinen 
118d86e5828SJouni Malinen 	if (sigma_dut_is_ap(dut) && dpp_hostapd_run(dut) < 0) {
119d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
120d86e5828SJouni Malinen 			  "errorCode,Failed to start hostapd");
121d86e5828SJouni Malinen 		return 0;
122d86e5828SJouni Malinen 	}
123d86e5828SJouni Malinen 
1244161c3f0SJouni Malinen 	if (chan_list &&
1254161c3f0SJouni Malinen 	    (strcmp(chan_list, "0/0") == 0 || chan_list[0] == '\0')) {
1264161c3f0SJouni Malinen 		/* No channel list */
1273aa72861SJouni Malinen 		res = snprintf(buf, sizeof(buf),
1286f4ce416SJouni Malinen 			       "DPP_BOOTSTRAP_GEN type=%s curve=%s mac=%s",
1296f4ce416SJouni Malinen 			       type, curve, mac);
1304161c3f0SJouni Malinen 	} else if (chan_list) {
1314161c3f0SJouni Malinen 		/* Channel list override (CTT case) - space separated tuple(s)
1324161c3f0SJouni Malinen 		 * of OperatingClass/Channel; convert to wpa_supplicant/hostapd
1334161c3f0SJouni Malinen 		 * format: comma separated tuples */
1344161c3f0SJouni Malinen 		strlcpy(resp, chan_list, sizeof(resp));
1354161c3f0SJouni Malinen 		for (pos = resp; *pos; pos++) {
1364161c3f0SJouni Malinen 			if (*pos == ' ')
1374161c3f0SJouni Malinen 				*pos = ',';
1384161c3f0SJouni Malinen 		}
1393aa72861SJouni Malinen 		res = snprintf(buf, sizeof(buf),
1406f4ce416SJouni Malinen 			       "DPP_BOOTSTRAP_GEN type=%s curve=%s chan=%s mac=%s",
1416f4ce416SJouni Malinen 			       type, curve, resp, mac);
1424161c3f0SJouni Malinen 	} else {
143f8d81aa4SJouni Malinen 		int channel = 11;
144f8d81aa4SJouni Malinen 
1454161c3f0SJouni Malinen 		/* Default channel list (normal DUT case) */
146f8d81aa4SJouni Malinen 		if (sigma_dut_is_ap(dut) && dut->hostapd_running &&
147f8d81aa4SJouni Malinen 		    dut->ap_oper_chn &&
148f8d81aa4SJouni Malinen 		    dut->ap_channel > 0 && dut->ap_channel <= 13)
149f8d81aa4SJouni Malinen 			channel = dut->ap_channel;
1503aa72861SJouni Malinen 		res = snprintf(buf, sizeof(buf),
1516f4ce416SJouni Malinen 			       "DPP_BOOTSTRAP_GEN type=%s curve=%s chan=81/%d mac=%s",
1526f4ce416SJouni Malinen 			       type, curve, channel, mac);
1534161c3f0SJouni Malinen 	}
1544161c3f0SJouni Malinen 
1553aa72861SJouni Malinen 	if (res < 0 || res >= sizeof(buf) ||
1563aa72861SJouni Malinen 	    wpa_command_resp(ifname, buf, resp, sizeof(resp)) < 0)
157d86e5828SJouni Malinen 		return -2;
158d86e5828SJouni Malinen 	if (strncmp(resp, "FAIL", 4) == 0)
159d86e5828SJouni Malinen 		return -2;
160d86e5828SJouni Malinen 	dut->dpp_local_bootstrap = atoi(resp);
161d86e5828SJouni Malinen 	snprintf(buf, sizeof(buf), "DPP_BOOTSTRAP_GET_URI %d",
162d86e5828SJouni Malinen 		 atoi(resp));
163d86e5828SJouni Malinen 	if (wpa_command_resp(ifname, buf, resp, sizeof(resp)) < 0)
164d86e5828SJouni Malinen 		return -2;
165d86e5828SJouni Malinen 	if (strncmp(resp, "FAIL", 4) == 0)
166d86e5828SJouni Malinen 		return -2;
167d86e5828SJouni Malinen 
168d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "URI: %s", resp);
169bc9e055cSSrinivas Dasari 
170bc9e055cSSrinivas Dasari 	if (send_result) {
171d86e5828SJouni Malinen 		ascii2hexstr(resp, hex);
1723aa72861SJouni Malinen 		res = snprintf(resp, sizeof(resp), "BootstrappingData,%s", hex);
1733aa72861SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
1743aa72861SJouni Malinen 			  res >= 0 && res < sizeof(resp) ? resp : NULL);
175bc9e055cSSrinivas Dasari 	}
176bc9e055cSSrinivas Dasari 
177bc9e055cSSrinivas Dasari 	if (success)
178bc9e055cSSrinivas Dasari 		*success = 1;
179d86e5828SJouni Malinen 	return 0;
180d86e5828SJouni Malinen }
181d86e5828SJouni Malinen 
182d86e5828SJouni Malinen 
183d86e5828SJouni Malinen static int dpp_set_peer_bootstrap(struct sigma_dut *dut,
184d86e5828SJouni Malinen 				  struct sigma_conn *conn,
185d86e5828SJouni Malinen 				  struct sigma_cmd *cmd)
186d86e5828SJouni Malinen {
187d86e5828SJouni Malinen 	const char *val = get_param(cmd, "DPPBootstrappingdata");
188b1dd21f8SJouni Malinen 	char uri[1000];
189d86e5828SJouni Malinen 	int res;
190d86e5828SJouni Malinen 
191d86e5828SJouni Malinen 	if (!val) {
192d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
193d86e5828SJouni Malinen 			  "errorCode,Missing DPPBootstrappingdata");
194d86e5828SJouni Malinen 		return 0;
195d86e5828SJouni Malinen 	}
196d86e5828SJouni Malinen 
197d86e5828SJouni Malinen 	res = parse_hexstr(val, (unsigned char *) uri, sizeof(uri));
198d86e5828SJouni Malinen 	if (res < 0 || (size_t) res >= sizeof(uri))
199d86e5828SJouni Malinen 		return -2;
200d86e5828SJouni Malinen 	uri[res] = '\0';
201d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "URI: %s", uri);
202b1dd21f8SJouni Malinen 	free(dut->dpp_peer_uri);
203b1dd21f8SJouni Malinen 	dut->dpp_peer_uri = strdup(uri);
204d86e5828SJouni Malinen 
205d86e5828SJouni Malinen 	return 1;
206d86e5828SJouni Malinen }
207d86e5828SJouni Malinen 
208d86e5828SJouni Malinen 
209d86e5828SJouni Malinen static int dpp_hostapd_conf_update(struct sigma_dut *dut,
210d86e5828SJouni Malinen 				   struct sigma_conn *conn, const char *ifname,
211d86e5828SJouni Malinen 				   struct wpa_ctrl *ctrl)
212d86e5828SJouni Malinen {
213d86e5828SJouni Malinen 	int res;
214d86e5828SJouni Malinen 	char buf[2000], buf2[2500], *pos, *pos2;
215b4c5e3b8SJouni Malinen 	const char *conf_data_events[] = {
216b4c5e3b8SJouni Malinen 		"DPP-CONNECTOR",
217b4c5e3b8SJouni Malinen 		"DPP-CONFOBJ-PASS",
218b4c5e3b8SJouni Malinen 		"DPP-CONFOBJ-PSK",
2190cd6e363SJouni Malinen 		"DPP-C-SIGN-KEY",
2200cd6e363SJouni Malinen 		"DPP-NET-ACCESS-KEY",
221b4c5e3b8SJouni Malinen 		NULL
222b4c5e3b8SJouni Malinen 	};
22320465812SJouni Malinen 	unsigned int old_timeout;
2240cd6e363SJouni Malinen 	int legacy_akm, dpp_akm;
2250cd6e363SJouni Malinen 	char *connector = NULL, *psk = NULL, *csign = NULL,
2260cd6e363SJouni Malinen 		*net_access_key = NULL;
2270cd6e363SJouni Malinen 	char pass[64];
2280cd6e363SJouni Malinen 	int pass_len = 0;
2290cd6e363SJouni Malinen 	int ret = 0;
230d86e5828SJouni Malinen 
231d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
232d86e5828SJouni Malinen 			"Update hostapd configuration based on DPP Config Object");
233d86e5828SJouni Malinen 
234d86e5828SJouni Malinen 	if (wpa_command(ifname, "SET wpa 2") < 0 ||
235d86e5828SJouni Malinen 	    wpa_command(ifname, "SET wpa_key_mgmt DPP") < 0 ||
2360d34723dSJouni Malinen 	    wpa_command(ifname, "SET ieee80211w 1") < 0 ||
237d86e5828SJouni Malinen 	    wpa_command(ifname, "SET rsn_pairwise CCMP") < 0) {
238d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
239d86e5828SJouni Malinen 			  "errorCode,Failed to update AP security parameters");
240d86e5828SJouni Malinen 		goto out;
241d86e5828SJouni Malinen 	}
242d86e5828SJouni Malinen 
2430cd6e363SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-CONFOBJ-AKM", buf, sizeof(buf));
2440cd6e363SJouni Malinen 	if (res < 0) {
2450cd6e363SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
2460cd6e363SJouni Malinen 			  "errorCode,No DPP-CONFOBJ-AKM");
2470cd6e363SJouni Malinen 		goto out;
2480cd6e363SJouni Malinen 	}
2490cd6e363SJouni Malinen 	pos = strchr(buf, ' ');
2500cd6e363SJouni Malinen 	if (!pos)
2510cd6e363SJouni Malinen 		return -2;
2520cd6e363SJouni Malinen 	pos++;
2530cd6e363SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
2540cd6e363SJouni Malinen 			"DPP: Config Object AKM: %s", pos);
2550cd6e363SJouni Malinen 	legacy_akm = strstr(pos, "psk") != NULL || strstr(pos, "sae") != NULL;
2560cd6e363SJouni Malinen 	dpp_akm = strstr(pos, "dpp") != NULL;
2570cd6e363SJouni Malinen 
258d86e5828SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-CONFOBJ-SSID",
259d86e5828SJouni Malinen 				buf, sizeof(buf));
260d86e5828SJouni Malinen 	if (res < 0) {
261d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
262d86e5828SJouni Malinen 			  "errorCode,No DPP-CONFOBJ-SSID");
263d86e5828SJouni Malinen 		goto out;
264d86e5828SJouni Malinen 	}
265d86e5828SJouni Malinen 	pos = strchr(buf, ' ');
266d86e5828SJouni Malinen 	if (!pos)
267d86e5828SJouni Malinen 		return -2;
268d86e5828SJouni Malinen 	pos++;
269d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
270d86e5828SJouni Malinen 			"DPP: Config Object SSID: %s", pos);
271d86e5828SJouni Malinen 	snprintf(buf2, sizeof(buf2), "SET ssid %s", pos);
272d86e5828SJouni Malinen 	if (wpa_command(ifname, buf2) < 0) {
273d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
274d86e5828SJouni Malinen 			  "errorCode,Failed to update AP SSID");
275d86e5828SJouni Malinen 		goto out;
276d86e5828SJouni Malinen 	}
277d86e5828SJouni Malinen 
278a7631f10SJouni Malinen 	if (wpa_command(ifname, "SET utf8_ssid 1") < 0) {
279a7631f10SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
280a7631f10SJouni Malinen 			  "errorCode,Failed to update AP UTF-8 SSID capa");
281a7631f10SJouni Malinen 		goto out;
282a7631f10SJouni Malinen 	}
283a7631f10SJouni Malinen 
2840cd6e363SJouni Malinen 	while ((dpp_akm && (!connector || !csign || !net_access_key)) ||
2850cd6e363SJouni Malinen 	       (legacy_akm && !pass_len && !psk)) {
2860cd6e363SJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conf_data_events,
2870cd6e363SJouni Malinen 					 buf, sizeof(buf));
288d86e5828SJouni Malinen 		if (res < 0) {
289d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
2900cd6e363SJouni Malinen 				  "errorCode,Not all config object information received");
291d86e5828SJouni Malinen 			goto out;
292d86e5828SJouni Malinen 		}
293b4c5e3b8SJouni Malinen 
2940cd6e363SJouni Malinen 		if (strstr(buf, "DPP-CONNECTOR")) {
2950cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
2960cd6e363SJouni Malinen 			if (!pos) {
2970cd6e363SJouni Malinen 				ret = -2;
2980cd6e363SJouni Malinen 				goto out;
2990cd6e363SJouni Malinen 			}
3000cd6e363SJouni Malinen 			pos++;
3010cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO, "DPP: Connector: %s",
3020cd6e363SJouni Malinen 					pos);
3030cd6e363SJouni Malinen 			if (!connector)
3040cd6e363SJouni Malinen 				connector = strdup(pos);
3050cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-C-SIGN-KEY")) {
3060cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3070cd6e363SJouni Malinen 			if (!pos) {
3080cd6e363SJouni Malinen 				ret = -2;
3090cd6e363SJouni Malinen 				goto out;
3100cd6e363SJouni Malinen 			}
3110cd6e363SJouni Malinen 			pos++;
3120cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
3130cd6e363SJouni Malinen 					"DPP: C-sign-key: %s", pos);
3140cd6e363SJouni Malinen 			if (!csign)
3150cd6e363SJouni Malinen 				csign = strdup(pos);
3160cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-NET-ACCESS-KEY")) {
3170cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3180cd6e363SJouni Malinen 			if (!pos) {
3190cd6e363SJouni Malinen 				ret = -2;
3200cd6e363SJouni Malinen 				goto out;
3210cd6e363SJouni Malinen 			}
3220cd6e363SJouni Malinen 			pos++;
3230cd6e363SJouni Malinen 			if (!net_access_key)
3240cd6e363SJouni Malinen 				net_access_key = strdup(pos);
3250cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-CONFOBJ-PASS")) {
3260cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3270cd6e363SJouni Malinen 			if (!pos) {
3280cd6e363SJouni Malinen 				ret = -2;
3290cd6e363SJouni Malinen 				goto out;
3300cd6e363SJouni Malinen 			}
3310cd6e363SJouni Malinen 			pos++;
3320cd6e363SJouni Malinen 			pass_len = parse_hexstr(pos, (u8 *) pass, sizeof(pass));
3330cd6e363SJouni Malinen 			if (pass_len < 0 || (size_t) pass_len >= sizeof(pass)) {
3340cd6e363SJouni Malinen 				ret = -2;
3350cd6e363SJouni Malinen 				goto out;
3360cd6e363SJouni Malinen 			}
3370cd6e363SJouni Malinen 			pass[pass_len] = '\0';
3380cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
3390cd6e363SJouni Malinen 					"DPP: Passphrase: %s", pass);
3400cd6e363SJouni Malinen 		} else if (strstr(buf, "DPP-CONFOBJ-PSK")) {
3410cd6e363SJouni Malinen 			pos = strchr(buf, ' ');
3420cd6e363SJouni Malinen 			if (!pos) {
3430cd6e363SJouni Malinen 				ret = -2;
3440cd6e363SJouni Malinen 				goto out;
3450cd6e363SJouni Malinen 			}
3460cd6e363SJouni Malinen 			pos++;
3470cd6e363SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO, "DPP: PSK: %s", pos);
3480cd6e363SJouni Malinen 			if (!psk)
3490cd6e363SJouni Malinen 				psk = strdup(pos);
3500cd6e363SJouni Malinen 		}
3510cd6e363SJouni Malinen 	}
3520cd6e363SJouni Malinen 
3530cd6e363SJouni Malinen 	if ((!connector || !dpp_akm) &&
3540cd6e363SJouni Malinen 	    wpa_command(ifname, "SET wpa_key_mgmt WPA-PSK") < 0) {
355b4c5e3b8SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
356b4c5e3b8SJouni Malinen 			  "errorCode,Failed to update AP security parameters");
357b4c5e3b8SJouni Malinen 		goto out;
358b4c5e3b8SJouni Malinen 	}
359b4c5e3b8SJouni Malinen 
3600cd6e363SJouni Malinen 	if (connector && dpp_akm && legacy_akm &&
3610cd6e363SJouni Malinen 	    wpa_command(ifname, "SET wpa_key_mgmt DPP WPA-PSK") < 0) {
3620cd6e363SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
3630cd6e363SJouni Malinen 			  "errorCode,Failed to update AP security parameters");
3640cd6e363SJouni Malinen 		goto out;
3650cd6e363SJouni Malinen 	}
366b4c5e3b8SJouni Malinen 
3670cd6e363SJouni Malinen 	if (pass_len) {
368b4c5e3b8SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET wpa_passphrase %s",
369b4c5e3b8SJouni Malinen 			 pass);
370b4c5e3b8SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
371b4c5e3b8SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
372b4c5e3b8SJouni Malinen 				  "errorCode,Failed to set passphrase");
373b4c5e3b8SJouni Malinen 			goto out;
374b4c5e3b8SJouni Malinen 		}
3750cd6e363SJouni Malinen 	} else if (psk) {
3760cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET wpa_psk %s", psk);
377b4c5e3b8SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
378b4c5e3b8SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
379b4c5e3b8SJouni Malinen 				  "errorCode,Failed to set PSK");
380b4c5e3b8SJouni Malinen 			goto out;
381b4c5e3b8SJouni Malinen 		}
382b4c5e3b8SJouni Malinen 	}
383b4c5e3b8SJouni Malinen 
3840cd6e363SJouni Malinen 	if (connector) {
3850cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET dpp_connector %s", connector);
386d86e5828SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
387d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
388d86e5828SJouni Malinen 				  "errorCode,Failed to update AP Connector");
389d86e5828SJouni Malinen 			goto out;
390d86e5828SJouni Malinen 		}
391d86e5828SJouni Malinen 	}
3920cd6e363SJouni Malinen 
3930cd6e363SJouni Malinen 	if (csign) {
3940cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET dpp_csign %s", csign);
395d86e5828SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
396d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
397d86e5828SJouni Malinen 				  "errorCode,Failed to update AP C-sign-key");
398d86e5828SJouni Malinen 			goto out;
399d86e5828SJouni Malinen 		}
400d86e5828SJouni Malinen 	}
4010cd6e363SJouni Malinen 
4020cd6e363SJouni Malinen 	if (net_access_key) {
4030cd6e363SJouni Malinen 		pos2 = strchr(net_access_key, ' ');
404d86e5828SJouni Malinen 		if (pos2)
405d86e5828SJouni Malinen 			*pos2++ = '\0';
4060cd6e363SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "DPP: netAccessKey: %s",
4070cd6e363SJouni Malinen 				net_access_key);
4080cd6e363SJouni Malinen 		snprintf(buf2, sizeof(buf2), "SET dpp_netaccesskey %s",
4090cd6e363SJouni Malinen 			 net_access_key);
410d86e5828SJouni Malinen 		if (wpa_command(ifname, buf2) < 0) {
411d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
412d86e5828SJouni Malinen 				  "errorCode,Failed to update AP netAccessKey");
413d86e5828SJouni Malinen 			goto out;
414d86e5828SJouni Malinen 		}
415d86e5828SJouni Malinen 		if (pos2) {
416d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
417d86e5828SJouni Malinen 					"DPP: netAccessKey expiry: %s", pos2);
4180cd6e363SJouni Malinen 			snprintf(buf2, sizeof(buf2),
4190cd6e363SJouni Malinen 				 "SET dpp_netaccesskey_expiry %s", pos2);
420d86e5828SJouni Malinen 			if (wpa_command(ifname, buf2) < 0) {
421d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
422d86e5828SJouni Malinen 					  "errorCode,Failed to update AP netAccessKey expiry");
423d86e5828SJouni Malinen 				goto out;
424d86e5828SJouni Malinen 			}
425d86e5828SJouni Malinen 		}
4260cd6e363SJouni Malinen 	}
427d86e5828SJouni Malinen 
42820465812SJouni Malinen 	/* Wait for a possible Configuration Result to be sent */
42920465812SJouni Malinen 	old_timeout = dut->default_timeout;
43020465812SJouni Malinen 	dut->default_timeout = 1;
43120465812SJouni Malinen 	get_wpa_cli_event(dut, ctrl, "DPP-TX-STATUS", buf, sizeof(buf));
43220465812SJouni Malinen 	dut->default_timeout = old_timeout;
433d86e5828SJouni Malinen 	if (wpa_command(ifname, "DISABLE") < 0 ||
434d86e5828SJouni Malinen 	    wpa_command(ifname, "ENABLE") < 0) {
435d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
436d86e5828SJouni Malinen 			  "errorCode,Failed to update AP configuration");
437d86e5828SJouni Malinen 		goto out;
438d86e5828SJouni Malinen 	}
439d86e5828SJouni Malinen 
440d86e5828SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "AP-ENABLED", buf, sizeof(buf));
441d86e5828SJouni Malinen 	if (res < 0) {
442d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,No AP-ENABLED");
443d86e5828SJouni Malinen 		goto out;
444d86e5828SJouni Malinen 	}
445d86e5828SJouni Malinen 
4460cd6e363SJouni Malinen 	ret = 1;
447d86e5828SJouni Malinen out:
4480cd6e363SJouni Malinen 	free(connector);
4490cd6e363SJouni Malinen 	free(psk);
4500cd6e363SJouni Malinen 	free(csign);
4510cd6e363SJouni Malinen 	free(net_access_key);
4520cd6e363SJouni Malinen 	return ret;
453d86e5828SJouni Malinen }
454d86e5828SJouni Malinen 
455d86e5828SJouni Malinen 
456772299f1SJouni Malinen struct dpp_test_info {
457772299f1SJouni Malinen 	const char *step;
458772299f1SJouni Malinen 	const char *frame;
459772299f1SJouni Malinen 	const char *attr;
460772299f1SJouni Malinen 	int value;
461772299f1SJouni Malinen };
462772299f1SJouni Malinen 
463772299f1SJouni Malinen static const struct dpp_test_info dpp_tests[] = {
464772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "WrappedData", 1 },
465772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "WrappedData", 2 },
466f96fcee3SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "PrimaryWrappedData", 2 },
467772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "WrappedData", 3 },
468772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRRequest", "WrappedData", 4 },
469772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRResponse", "WrappedData", 5 },
470772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationRequest", "WrappedData", 6 },
471772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationResponse", "WrappedData", 7 },
472772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitCapabilities", 8 },
473772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "RespBSKeyHash", 10 },
474772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitBSKeyHash", 11 },
475772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitProtocolKey", 12 },
476772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitNonce", 13 },
477772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "InitCapabilities", 14 },
478772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationRequest", "WrappedData", 15 },
479772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "DPPStatus", 16 },
480772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespBSKeyHash", 17 },
481772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "InitBSKeyHash", 18 },
482772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespProtocolKey", 19 },
483772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespNonce", 20 },
484772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "InitNonce", 21 },
485772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespCapabilities",
486772299f1SJouni Malinen 	  22 },
487772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "RespAuthTag", 23 },
488772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "WrappedData", 24 },
489f96fcee3SJouni Malinen 	{ "MissingAttribute", "AuthenticationResponse", "PrimaryWrappedData",
490f96fcee3SJouni Malinen 	  24 },
491772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "DPPStatus", 25 },
492772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "RespBSKeyHash", 26 },
493772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "InitBSKeyHash", 27 },
494772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "InitAuthTag", 28 },
495772299f1SJouni Malinen 	{ "MissingAttribute", "AuthenticationConfirm", "WrappedData", 29 },
496772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "InitNonce", 30 },
497772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespCapabilities", 31 },
498772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespAuthTag", 32 },
499772299f1SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "InitAuthTag", 33 },
500772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeRequest", "FiniteCyclicGroup", 34 },
501772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeRequest", "EncryptedKey", 35 },
502772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeResponse", "DPPStatus", 36 },
503772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXExchangeResponse", "EncryptedKey", 37 },
504772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRRequest", "BSKey", 38 },
505772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRRequest", "InitAuthTag", 39 },
506772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRRequest", "WrappedData", 40 },
507772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRResponse", "BSKey", 41 },
508772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRResponse", "RespAuthTag", 42 },
509772299f1SJouni Malinen 	{ "MissingAttribute", "PKEXCRResponse", "WrappedData", 43 },
510772299f1SJouni Malinen 	{ "InvalidValue", "PKEXExchangeRequest", "EncryptedKey", 44 },
511772299f1SJouni Malinen 	{ "InvalidValue", "PKEXExchangeResponse", "EncryptedKey", 45 },
512772299f1SJouni Malinen 	{ "InvalidValue", "PKEXExchangeResponse", "DPPStatus", 46 },
513772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRRequest", "BSKey", 47 },
514772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRResponse", "BSKey", 48 },
515772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRRequest", "InitAuthTag", 49 },
516772299f1SJouni Malinen 	{ "InvalidValue", "PKEXCRResponse", "RespAuthTag", 50 },
517772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationRequest", "EnrolleeNonce", 51 },
518772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationRequest", "ConfigAttr", 52 },
519772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationRequest", "WrappedData", 53 },
520772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "EnrolleeNonce", 54 },
521772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "ConfigObj", 55 },
522772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "DPPStatus", 56 },
523772299f1SJouni Malinen 	{ "MissingAttribute", "ConfigurationResponse", "WrappedData", 57 },
524772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationResponse", "DPPStatus", 58 },
525772299f1SJouni Malinen 	{ "InvalidValue", "ConfigurationResponse", "EnrolleeNonce", 59 },
52653558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryRequest", "TransactionID", 60 },
52753558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryRequest", "Connector", 61 },
52853558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryResponse", "TransactionID", 62 },
52953558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryResponse", "DPPStatus", 63 },
53053558e0fSJouni Malinen 	{ "MissingAttribute", "PeerDiscoveryResponse", "Connector", 64 },
531ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitProtocolKey", 66 },
532ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespProtocolKey", 67 },
533ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "RespBSKeyHash", 68 },
534ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitBSKeyHash", 69 },
535ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "RespBSKeyHash", 70 },
536ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "InitBSKeyHash", 71 },
537ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "RespBSKeyHash", 72 },
538ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "InitBSKeyHash", 73 },
539ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationResponse", "DPPStatus", 74 },
540ae624487SJouni Malinen 	{ "InvalidValue", "AuthenticationConfirm", "DPPStatus", 75 },
541ae624487SJouni Malinen 	{ "InvalidValue", "ConfigurationRequest", "ConfigAttr", 76 },
542ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryResponse", "TransactionID", 77 },
543ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryResponse", "DPPStatus", 78 },
544ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryResponse", "Connector", 79 },
545ae624487SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryRequest", "Connector", 80 },
54667795a76SJouni Malinen 	{ "InvalidValue", "AuthenticationRequest", "InitNonce", 81 },
547188839b6SJouni Malinen 	{ "InvalidValue", "PeerDiscoveryRequest", "TransactionID", 82 },
548188839b6SJouni Malinen 	{ "InvalidValue", "ConfigurationRequest", "EnrolleeNonce", 83 },
5493a6b92a6SJouni Malinen 	{ "Timeout", "PKEXExchangeResponse", NULL, 84 },
5503a6b92a6SJouni Malinen 	{ "Timeout", "PKEXCRRequest", NULL, 85 },
5513a6b92a6SJouni Malinen 	{ "Timeout", "PKEXCRResponse", NULL, 86 },
5523a6b92a6SJouni Malinen 	{ "Timeout", "AuthenticationRequest", NULL, 87 },
5533a6b92a6SJouni Malinen 	{ "Timeout", "AuthenticationResponse", NULL, 88 },
5543a6b92a6SJouni Malinen 	{ "Timeout", "AuthenticationConfirm", NULL, 89 },
5553a6b92a6SJouni Malinen 	{ "Timeout", "ConfigurationRequest", NULL, 90 },
556772299f1SJouni Malinen 	{ NULL, NULL, NULL, 0 }
557772299f1SJouni Malinen };
558772299f1SJouni Malinen 
559772299f1SJouni Malinen 
560772299f1SJouni Malinen static int dpp_get_test(const char *step, const char *frame, const char *attr)
561772299f1SJouni Malinen {
562772299f1SJouni Malinen 	int i;
563772299f1SJouni Malinen 
564772299f1SJouni Malinen 	for (i = 0; dpp_tests[i].step; i++) {
565772299f1SJouni Malinen 		if (strcasecmp(step, dpp_tests[i].step) == 0 &&
566772299f1SJouni Malinen 		    strcasecmp(frame, dpp_tests[i].frame) == 0 &&
5673a6b92a6SJouni Malinen 		    ((!attr && dpp_tests[i].attr == NULL) ||
5683a6b92a6SJouni Malinen 		     (attr && strcasecmp(attr, dpp_tests[i].attr) == 0)))
569772299f1SJouni Malinen 			return dpp_tests[i].value;
570772299f1SJouni Malinen 	}
571772299f1SJouni Malinen 
572772299f1SJouni Malinen 	return -1;
573772299f1SJouni Malinen }
574772299f1SJouni Malinen 
575772299f1SJouni Malinen 
5766792ff4dSJouni Malinen static int dpp_wait_tx(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
5776792ff4dSJouni Malinen 		       int frame_type)
5786792ff4dSJouni Malinen {
5796792ff4dSJouni Malinen 	char buf[200], tmp[20];
5806792ff4dSJouni Malinen 	int res;
5816792ff4dSJouni Malinen 
5826792ff4dSJouni Malinen 	snprintf(tmp, sizeof(tmp), "type=%d", frame_type);
5836792ff4dSJouni Malinen 	for (;;) {
5846792ff4dSJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-TX", buf, sizeof(buf));
5856792ff4dSJouni Malinen 		if (res < 0)
5866792ff4dSJouni Malinen 			return -1;
5876792ff4dSJouni Malinen 		if (strstr(buf, tmp) != NULL)
5886792ff4dSJouni Malinen 			break;
5896792ff4dSJouni Malinen 	}
5906792ff4dSJouni Malinen 
5916792ff4dSJouni Malinen 	return 0;
5926792ff4dSJouni Malinen }
5936792ff4dSJouni Malinen 
5946792ff4dSJouni Malinen 
595772299f1SJouni Malinen static int dpp_wait_tx_status(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
596772299f1SJouni Malinen 			      int frame_type)
597772299f1SJouni Malinen {
598772299f1SJouni Malinen 	char buf[200], tmp[20];
599772299f1SJouni Malinen 	int res;
600772299f1SJouni Malinen 
601772299f1SJouni Malinen 	snprintf(tmp, sizeof(tmp), "type=%d", frame_type);
602772299f1SJouni Malinen 	for (;;) {
603772299f1SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-TX", buf, sizeof(buf));
604772299f1SJouni Malinen 		if (res < 0)
605772299f1SJouni Malinen 			return -1;
606772299f1SJouni Malinen 		if (strstr(buf, tmp) != NULL)
607772299f1SJouni Malinen 			break;
608772299f1SJouni Malinen 	}
609772299f1SJouni Malinen 
610772299f1SJouni Malinen 	res = get_wpa_cli_event(dut, ctrl, "DPP-TX-STATUS",
611772299f1SJouni Malinen 				buf, sizeof(buf));
612772299f1SJouni Malinen 	if (res < 0 || strstr(buf, "result=FAILED") != NULL)
613772299f1SJouni Malinen 		return -1;
614772299f1SJouni Malinen 
615772299f1SJouni Malinen 	return 0;
616772299f1SJouni Malinen }
617772299f1SJouni Malinen 
618772299f1SJouni Malinen 
6193a6b92a6SJouni Malinen static int dpp_wait_rx(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
6203e4344e7SJouni Malinen 		       int frame_type, unsigned int max_wait)
6213a6b92a6SJouni Malinen {
6223a6b92a6SJouni Malinen 	char buf[200], tmp[20];
6233a6b92a6SJouni Malinen 	int res;
6249a3415c2SJouni Malinen 	unsigned int old_timeout;
6259a3415c2SJouni Malinen 
6269a3415c2SJouni Malinen 	old_timeout = dut->default_timeout;
6279a3415c2SJouni Malinen 	if (max_wait > 0 && dut->default_timeout > max_wait)
6289a3415c2SJouni Malinen 		dut->default_timeout = max_wait;
6293a6b92a6SJouni Malinen 
6303a6b92a6SJouni Malinen 	snprintf(tmp, sizeof(tmp), "type=%d", frame_type);
6313a6b92a6SJouni Malinen 	for (;;) {
6323a6b92a6SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-RX", buf, sizeof(buf));
6339a3415c2SJouni Malinen 		if (res < 0) {
6349a3415c2SJouni Malinen 			dut->default_timeout = old_timeout;
6353a6b92a6SJouni Malinen 			return -1;
6369a3415c2SJouni Malinen 		}
6373a6b92a6SJouni Malinen 		if (strstr(buf, tmp) != NULL)
6383a6b92a6SJouni Malinen 			break;
6393a6b92a6SJouni Malinen 	}
6403a6b92a6SJouni Malinen 
6419a3415c2SJouni Malinen 	dut->default_timeout = old_timeout;
6429a3415c2SJouni Malinen 	return 0;
6439a3415c2SJouni Malinen }
6449a3415c2SJouni Malinen 
6459a3415c2SJouni Malinen 
6469a3415c2SJouni Malinen static int dpp_wait_rx_conf_req(struct sigma_dut *dut, struct wpa_ctrl *ctrl,
6473e4344e7SJouni Malinen 				unsigned int max_wait)
6489a3415c2SJouni Malinen {
6499a3415c2SJouni Malinen 	char buf[200];
6509a3415c2SJouni Malinen 	int res;
6519a3415c2SJouni Malinen 	unsigned int old_timeout;
6529a3415c2SJouni Malinen 
6539a3415c2SJouni Malinen 	old_timeout = dut->default_timeout;
6549a3415c2SJouni Malinen 	if (max_wait > 0 && dut->default_timeout > max_wait)
6559a3415c2SJouni Malinen 		dut->default_timeout = max_wait;
6569a3415c2SJouni Malinen 
6579a3415c2SJouni Malinen 	for (;;) {
6589a3415c2SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CONF-REQ-RX",
6599a3415c2SJouni Malinen 					buf, sizeof(buf));
6609a3415c2SJouni Malinen 		if (res < 0) {
6619a3415c2SJouni Malinen 			dut->default_timeout = old_timeout;
6629a3415c2SJouni Malinen 			return -1;
6639a3415c2SJouni Malinen 		}
6649a3415c2SJouni Malinen 
6659a3415c2SJouni Malinen 		break;
6669a3415c2SJouni Malinen 	}
6679a3415c2SJouni Malinen 
6689a3415c2SJouni Malinen 	dut->default_timeout = old_timeout;
6693a6b92a6SJouni Malinen 	return 0;
6703a6b92a6SJouni Malinen }
6713a6b92a6SJouni Malinen 
6723a6b92a6SJouni Malinen 
673bc9e055cSSrinivas Dasari static int dpp_scan_peer_qrcode(struct sigma_dut *dut)
674d86e5828SJouni Malinen {
6751a38cc37SJouni Malinen #ifdef ANDROID
676bc9e055cSSrinivas Dasari 	char buf[100];
677bc9e055cSSrinivas Dasari 	char *buf2 = NULL;
678bc9e055cSSrinivas Dasari 	FILE *fp = NULL;
679bc9e055cSSrinivas Dasari 	uint32_t length;
680bc9e055cSSrinivas Dasari 	unsigned int count;
681bc9e055cSSrinivas Dasari 
682bc9e055cSSrinivas Dasari 	unlink(dpp_qrcode_file);
683bc9e055cSSrinivas Dasari 
684bc9e055cSSrinivas Dasari 	snprintf(buf, sizeof(buf),
68507458342SJouni Malinen 		 "am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeReadActivity");
686bc9e055cSSrinivas Dasari 	if (system(buf) != 0) {
68707458342SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
68807458342SJouni Malinen 				"Failed to launch QR Code scanner");
689d86e5828SJouni Malinen 		return -1;
690d86e5828SJouni Malinen 	}
691d86e5828SJouni Malinen 
692bc9e055cSSrinivas Dasari 	count = 0;
693bc9e055cSSrinivas Dasari 	while (!(fp = fopen(dpp_qrcode_file, "r"))) {
694bc9e055cSSrinivas Dasari 		if (count > dut->default_timeout) {
695bc9e055cSSrinivas Dasari 			sigma_dut_print(dut, DUT_MSG_ERROR,
696bc9e055cSSrinivas Dasari 					"Failed to open dpp_qrcode_file - QR Code scanning timed out");
697bc9e055cSSrinivas Dasari 			return -1;
698bc9e055cSSrinivas Dasari 		}
699bc9e055cSSrinivas Dasari 
700bc9e055cSSrinivas Dasari 		sleep(1);
701bc9e055cSSrinivas Dasari 		count++;
702bc9e055cSSrinivas Dasari 	}
703bc9e055cSSrinivas Dasari 
704bc9e055cSSrinivas Dasari 	if (fseek(fp, 0, SEEK_END) < 0 || (length = ftell(fp)) <= 0 ||
705bc9e055cSSrinivas Dasari 	    fseek(fp, 0, SEEK_SET) < 0) {
706bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_ERROR,
707bc9e055cSSrinivas Dasari 				"Failed to get QR Code result file length");
708bc9e055cSSrinivas Dasari 		fclose(fp);
709bc9e055cSSrinivas Dasari 		return -1;
710bc9e055cSSrinivas Dasari 	}
711bc9e055cSSrinivas Dasari 
712bc9e055cSSrinivas Dasari 	buf2 = malloc(length + 1);
713bc9e055cSSrinivas Dasari 	if (!buf2) {
714bc9e055cSSrinivas Dasari 		fclose(fp);
715bc9e055cSSrinivas Dasari 		return -1;
716bc9e055cSSrinivas Dasari 	}
717bc9e055cSSrinivas Dasari 
718bc9e055cSSrinivas Dasari 	if (fread(buf2, 1, length, fp) != length) {
719bc9e055cSSrinivas Dasari 		fclose(fp);
720bc9e055cSSrinivas Dasari 		free(buf2);
721bc9e055cSSrinivas Dasari 		return -1;
722bc9e055cSSrinivas Dasari 	}
723bc9e055cSSrinivas Dasari 
724bc9e055cSSrinivas Dasari 	fclose(fp);
725bc9e055cSSrinivas Dasari 	buf2[length] = '\0';
726bc9e055cSSrinivas Dasari 
727bc9e055cSSrinivas Dasari 	free(dut->dpp_peer_uri);
728bc9e055cSSrinivas Dasari 	dut->dpp_peer_uri = strdup(buf2);
729bc9e055cSSrinivas Dasari 	free(buf2);
730bc9e055cSSrinivas Dasari 	return 0;
7311a38cc37SJouni Malinen #else /* ANDROID */
7321a38cc37SJouni Malinen 	pid_t pid;
7331a38cc37SJouni Malinen 	int pid_status;
7341a38cc37SJouni Malinen 	int pipe_out[2];
7351a38cc37SJouni Malinen 	char buf[4000], *pos;
7361a38cc37SJouni Malinen 	ssize_t len;
7371a38cc37SJouni Malinen 	int res = -1, ret;
7381a38cc37SJouni Malinen 	struct timeval tv;
7391a38cc37SJouni Malinen 	fd_set rfd;
7401a38cc37SJouni Malinen 
7411a38cc37SJouni Malinen 	if (pipe(pipe_out) != 0) {
7421a38cc37SJouni Malinen 		perror("pipe");
7431a38cc37SJouni Malinen 		return -1;
7441a38cc37SJouni Malinen 	}
7451a38cc37SJouni Malinen 
7461a38cc37SJouni Malinen 	pid = fork();
7471a38cc37SJouni Malinen 	if (pid < 0) {
7481a38cc37SJouni Malinen 		perror("fork");
7491a38cc37SJouni Malinen 		close(pipe_out[0]);
7501a38cc37SJouni Malinen 		close(pipe_out[1]);
7511a38cc37SJouni Malinen 		return -1;
7521a38cc37SJouni Malinen 	}
7531a38cc37SJouni Malinen 
7541a38cc37SJouni Malinen 	if (pid == 0) {
7551a38cc37SJouni Malinen 		char *argv[4] = { "zbarcam", "--raw", "--prescale=320x240",
7561a38cc37SJouni Malinen 				  NULL };
7571a38cc37SJouni Malinen 
7581a38cc37SJouni Malinen 		dup2(pipe_out[1], STDOUT_FILENO);
7591a38cc37SJouni Malinen 		close(pipe_out[0]);
7601a38cc37SJouni Malinen 		close(pipe_out[1]);
7611a38cc37SJouni Malinen 		execv("/usr/bin/zbarcam", argv);
7621a38cc37SJouni Malinen 		perror("execv");
7631a38cc37SJouni Malinen 		exit(0);
7641a38cc37SJouni Malinen 		return -1;
7651a38cc37SJouni Malinen 	}
7661a38cc37SJouni Malinen 
7671a38cc37SJouni Malinen 	close(pipe_out[1]);
7681a38cc37SJouni Malinen 
7691a38cc37SJouni Malinen 	FD_ZERO(&rfd);
7701a38cc37SJouni Malinen 	FD_SET(pipe_out[0], &rfd);
7711a38cc37SJouni Malinen 	tv.tv_sec = dut->default_timeout;
7721a38cc37SJouni Malinen 	tv.tv_usec = 0;
7731a38cc37SJouni Malinen 
7741a38cc37SJouni Malinen 	ret = select(pipe_out[0] + 1, &rfd, NULL, NULL, &tv);
7751a38cc37SJouni Malinen 	if (ret < 0) {
7761a38cc37SJouni Malinen 		perror("select");
7771a38cc37SJouni Malinen 		goto out;
7781a38cc37SJouni Malinen 	}
7791a38cc37SJouni Malinen 	if (ret == 0) {
7801a38cc37SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG,
7811a38cc37SJouni Malinen 				"QR Code scanning timed out");
7821a38cc37SJouni Malinen 		goto out;
7831a38cc37SJouni Malinen 	}
7841a38cc37SJouni Malinen 
7851a38cc37SJouni Malinen 	len = read(pipe_out[0], buf, sizeof(buf));
7861a38cc37SJouni Malinen 	if (len <= 0)
7871a38cc37SJouni Malinen 		goto out;
7881a38cc37SJouni Malinen 	if (len == sizeof(buf))
7891a38cc37SJouni Malinen 		len--;
7901a38cc37SJouni Malinen 	buf[len] = '\0';
7911a38cc37SJouni Malinen 	pos = strchr(buf, '\n');
7921a38cc37SJouni Malinen 	if (pos)
7931a38cc37SJouni Malinen 		*pos = '\0';
7941a38cc37SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "URI from QR scanner: %s", buf);
7951a38cc37SJouni Malinen 
7961a38cc37SJouni Malinen 	free(dut->dpp_peer_uri);
7971a38cc37SJouni Malinen 	dut->dpp_peer_uri = strdup(buf);
7981a38cc37SJouni Malinen 	res = 0;
7991a38cc37SJouni Malinen out:
8001a38cc37SJouni Malinen 	close(pipe_out[0]);
8011a38cc37SJouni Malinen 	kill(pid, SIGTERM);
8021a38cc37SJouni Malinen 	waitpid(pid, &pid_status, 0);
8031a38cc37SJouni Malinen 
8041a38cc37SJouni Malinen 	return res;
8051a38cc37SJouni Malinen #endif /* ANDROID */
806bc9e055cSSrinivas Dasari }
807bc9e055cSSrinivas Dasari 
808bc9e055cSSrinivas Dasari 
809bc9e055cSSrinivas Dasari static int dpp_display_own_qrcode(struct sigma_dut *dut)
810bc9e055cSSrinivas Dasari {
811bc9e055cSSrinivas Dasari 	char buf[200], resp[2000];
812016ae6c8SJouni Malinen 	const char *ifname = get_station_ifname(dut);
8131a38cc37SJouni Malinen #ifdef ANDROID
814bc9e055cSSrinivas Dasari 	FILE *fp;
8151a38cc37SJouni Malinen #else /* ANDROID */
8161a38cc37SJouni Malinen 	pid_t pid;
8171a38cc37SJouni Malinen 	int pid_status;
8181a38cc37SJouni Malinen #endif /* ANDROID */
819bc9e055cSSrinivas Dasari 
820bc9e055cSSrinivas Dasari 	snprintf(buf, sizeof(buf), "DPP_BOOTSTRAP_GET_URI %d",
821bc9e055cSSrinivas Dasari 		 dut->dpp_local_bootstrap);
822bc9e055cSSrinivas Dasari 	if (wpa_command_resp(ifname, buf, resp, sizeof(resp)) < 0 ||
823bc9e055cSSrinivas Dasari 	    strncmp(resp, "FAIL", 4) == 0)
824bc9e055cSSrinivas Dasari 		return -2;
8251a38cc37SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "Own bootstrap URI: %s", resp);
826bc9e055cSSrinivas Dasari 
8271a38cc37SJouni Malinen #ifdef ANDROID
828bc9e055cSSrinivas Dasari 	unlink(dpp_qrcode_file);
829bc9e055cSSrinivas Dasari 
830bc9e055cSSrinivas Dasari 	fp = fopen(dpp_qrcode_file, "w");
831bc9e055cSSrinivas Dasari 	if (!fp) {
832bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_ERROR, "Failed to open file %s",
833bc9e055cSSrinivas Dasari 				dpp_qrcode_file);
834bc9e055cSSrinivas Dasari 		return -2;
835bc9e055cSSrinivas Dasari 	}
836bc9e055cSSrinivas Dasari 
837bc9e055cSSrinivas Dasari 	fwrite(resp, 1, strlen(resp), fp);
838bc9e055cSSrinivas Dasari 	fclose(fp);
839bc9e055cSSrinivas Dasari 
840bc9e055cSSrinivas Dasari 	snprintf(buf, sizeof(buf),
841bc9e055cSSrinivas Dasari 		 "am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeDisplayActivity");
842bc9e055cSSrinivas Dasari 	if (system(buf) != 0) {
843bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_ERROR, "Failed to display QR Code");
844bc9e055cSSrinivas Dasari 		return -1;
845bc9e055cSSrinivas Dasari 	}
8461a38cc37SJouni Malinen #else /* ANDROID */
8471a38cc37SJouni Malinen 	pid = fork();
8481a38cc37SJouni Malinen 	if (pid < 0) {
8491a38cc37SJouni Malinen 		perror("fork");
8501a38cc37SJouni Malinen 		return -1;
8511a38cc37SJouni Malinen 	}
8521a38cc37SJouni Malinen 
8531a38cc37SJouni Malinen 	if (pid == 0) {
8541a38cc37SJouni Malinen 		char *argv[3] = { "qr", resp, NULL };
8551a38cc37SJouni Malinen 
8561a38cc37SJouni Malinen 		execv("/usr/bin/qr", argv);
8571a38cc37SJouni Malinen 		perror("execv");
8581a38cc37SJouni Malinen 		exit(0);
8591a38cc37SJouni Malinen 		return -1;
8601a38cc37SJouni Malinen 	}
8611a38cc37SJouni Malinen 
8621a38cc37SJouni Malinen 	waitpid(pid, &pid_status, 0);
8631a38cc37SJouni Malinen #endif /* ANDROID */
864bc9e055cSSrinivas Dasari 
865bc9e055cSSrinivas Dasari 	return 0;
866bc9e055cSSrinivas Dasari }
867bc9e055cSSrinivas Dasari 
868d86e5828SJouni Malinen 
8698d88d822SSrinivas Dasari static int dpp_process_auth_response(struct sigma_dut *dut,
8708d88d822SSrinivas Dasari 				     struct sigma_conn *conn,
8718d88d822SSrinivas Dasari 				     struct wpa_ctrl *ctrl,
8728d88d822SSrinivas Dasari 				     const char **auth_events,
8738d88d822SSrinivas Dasari 				     const char *action_type,
8748d88d822SSrinivas Dasari 				     int check_mutual, char *buf, size_t buflen)
8758d88d822SSrinivas Dasari {
8768d88d822SSrinivas Dasari 	int res;
8778d88d822SSrinivas Dasari 
8788d88d822SSrinivas Dasari 	res = get_wpa_cli_events(dut, ctrl, auth_events, buf, buflen);
8798d88d822SSrinivas Dasari 	if (res < 0) {
8808d88d822SSrinivas Dasari 		send_resp(dut, conn, SIGMA_COMPLETE,
8818d88d822SSrinivas Dasari 			  "BootstrapResult,OK,AuthResult,Timeout");
8828d88d822SSrinivas Dasari 		return res;
8838d88d822SSrinivas Dasari 	}
8848d88d822SSrinivas Dasari 	sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth result: %s", buf);
8858d88d822SSrinivas Dasari 
8868d88d822SSrinivas Dasari 	if (strstr(buf, "DPP-RESPONSE-PENDING")) {
8878d88d822SSrinivas Dasari 		/* Display own QR code in manual mode */
8888d88d822SSrinivas Dasari 		if (action_type && strcasecmp(action_type, "ManualDPP") == 0 &&
8898d88d822SSrinivas Dasari 		    dpp_display_own_qrcode(dut) < 0) {
8908d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_ERROR,
8918d88d822SSrinivas Dasari 				  "errorCode,Failed to display own QR code");
8928d88d822SSrinivas Dasari 			return -1;
8938d88d822SSrinivas Dasari 		}
8948d88d822SSrinivas Dasari 
8958d88d822SSrinivas Dasari 		/* Wait for the actual result after the peer has scanned the
8968d88d822SSrinivas Dasari 		 * QR Code. */
8978d88d822SSrinivas Dasari 		res = get_wpa_cli_events(dut, ctrl, auth_events,
8988d88d822SSrinivas Dasari 					 buf, buflen);
8998d88d822SSrinivas Dasari 		if (res < 0) {
9008d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_COMPLETE,
9018d88d822SSrinivas Dasari 				  "BootstrapResult,OK,AuthResult,Timeout");
9028d88d822SSrinivas Dasari 			return res;
9038d88d822SSrinivas Dasari 		}
9048d88d822SSrinivas Dasari 
9058d88d822SSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth result: %s", buf);
9068d88d822SSrinivas Dasari 	}
9078d88d822SSrinivas Dasari 
9088d88d822SSrinivas Dasari 	if (check_mutual) {
9098d88d822SSrinivas Dasari 		if (strstr(buf, "DPP-NOT-COMPATIBLE")) {
9108d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_COMPLETE,
9118d88d822SSrinivas Dasari 				  "BootstrapResult,OK,AuthResult,ROLES_NOT_COMPATIBLE");
9128d88d822SSrinivas Dasari 			return -1;
9138d88d822SSrinivas Dasari 		}
9148d88d822SSrinivas Dasari 
9158d88d822SSrinivas Dasari 		if (!strstr(buf, "DPP-AUTH-DIRECTION")) {
9168d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_ERROR,
9178d88d822SSrinivas Dasari 				  "errorCode,No event for auth direction seen");
9188d88d822SSrinivas Dasari 			return -1;
9198d88d822SSrinivas Dasari 		}
9208d88d822SSrinivas Dasari 
9218d88d822SSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth direction: %s",
9228d88d822SSrinivas Dasari 				buf);
9238d88d822SSrinivas Dasari 		if (strstr(buf, "mutual=1") == NULL) {
9248d88d822SSrinivas Dasari 			send_resp(dut, conn, SIGMA_ERROR,
9258d88d822SSrinivas Dasari 				  "errorCode,Peer did not use mutual authentication");
9268d88d822SSrinivas Dasari 			return -1;
9278d88d822SSrinivas Dasari 		}
9288d88d822SSrinivas Dasari 	}
9298d88d822SSrinivas Dasari 
9308d88d822SSrinivas Dasari 	return 0;
9318d88d822SSrinivas Dasari }
9328d88d822SSrinivas Dasari 
9338d88d822SSrinivas Dasari 
934d86e5828SJouni Malinen static int dpp_automatic_dpp(struct sigma_dut *dut,
935d86e5828SJouni Malinen 			     struct sigma_conn *conn,
936d86e5828SJouni Malinen 			     struct sigma_cmd *cmd)
937d86e5828SJouni Malinen {
938d86e5828SJouni Malinen 	const char *bs = get_param(cmd, "DPPBS");
939d86e5828SJouni Malinen 	const char *auth_role = get_param(cmd, "DPPAuthRole");
940d86e5828SJouni Malinen 	const char *prov_role = get_param(cmd, "DPPProvisioningRole");
941d86e5828SJouni Malinen 	const char *pkex_code = get_param(cmd, "DPPPKEXCode");
942d86e5828SJouni Malinen 	const char *pkex_code_id = get_param(cmd, "DPPPKEXCodeIdentifier");
943d86e5828SJouni Malinen 	const char *wait_conn = get_param(cmd, "DPPWaitForConnect");
944d86e5828SJouni Malinen 	const char *self_conf = get_param(cmd, "DPPSelfConfigure");
945772299f1SJouni Malinen 	const char *step = get_param(cmd, "DPPStep");
946772299f1SJouni Malinen 	const char *frametype = get_param(cmd, "DPPFrameType");
947772299f1SJouni Malinen 	const char *attr = get_param(cmd, "DPPIEAttribute");
948bc9e055cSSrinivas Dasari 	const char *action_type = get_param(cmd, "DPPActionType");
949785afb44SJouni Malinen 	const char *tcp = get_param(cmd, "DPPOverTCP");
950f37fda0fSJouni Malinen 	const char *nfc_handover = get_param(cmd, "DPPNFCHandover");
951d86e5828SJouni Malinen 	const char *role;
952a28608abSJouni Malinen 	const char *netrole = NULL;
953d86e5828SJouni Malinen 	const char *val;
954d86e5828SJouni Malinen 	const char *conf_role;
955d86e5828SJouni Malinen 	int conf_index = -1;
9563d16ccbdSJouni Malinen 	char buf[2000], *pos, *pos2;
957dd85cff0SJouni Malinen 	char buf2[200];
958d86e5828SJouni Malinen 	char conf_ssid[100];
959d86e5828SJouni Malinen 	char conf_pass[100];
960d86e5828SJouni Malinen 	char pkex_identifier[200];
961d86e5828SJouni Malinen 	struct wpa_ctrl *ctrl;
962d86e5828SJouni Malinen 	int res;
963d86e5828SJouni Malinen 	unsigned int old_timeout;
964d86e5828SJouni Malinen 	int own_pkex_id = -1;
965016ae6c8SJouni Malinen 	const char *ifname = get_station_ifname(dut);
966d86e5828SJouni Malinen 	const char *auth_events[] = {
967d86e5828SJouni Malinen 		"DPP-AUTH-SUCCESS",
968d86e5828SJouni Malinen 		"DPP-NOT-COMPATIBLE",
969d86e5828SJouni Malinen 		"DPP-RESPONSE-PENDING",
970d86e5828SJouni Malinen 		"DPP-SCAN-PEER-QR-CODE",
971bc9e055cSSrinivas Dasari 		"DPP-AUTH-DIRECTION",
972d86e5828SJouni Malinen 		NULL
973d86e5828SJouni Malinen 	};
974d86e5828SJouni Malinen 	const char *conf_events[] = {
975d86e5828SJouni Malinen 		"DPP-CONF-RECEIVED",
976d86e5828SJouni Malinen 		"DPP-CONF-SENT",
977d86e5828SJouni Malinen 		"DPP-CONF-FAILED",
978d86e5828SJouni Malinen 		NULL
979d86e5828SJouni Malinen 	};
980d86e5828SJouni Malinen 	const char *conn_events[] = {
981d86e5828SJouni Malinen 		"PMKSA-CACHE-ADDED",
982d86e5828SJouni Malinen 		"CTRL-EVENT-CONNECTED",
983d86e5828SJouni Malinen 		NULL
984d86e5828SJouni Malinen 	};
98511ab72c2SPurushottam Kushwaha 	const char *group_id_str = NULL;
98611ab72c2SPurushottam Kushwaha 	char group_id[100];
987dd85cff0SJouni Malinen 	char conf2[300];
988772299f1SJouni Malinen 	const char *result;
989d1e22f76SJouni Malinen 	int check_mutual = 0;
990e89cdbf5SJouni Malinen 	int enrollee_ap;
991a28608abSJouni Malinen 	int enrollee_configurator;
992f2fa0d00SJouni Malinen 	int force_gas_fragm = 0;
99385a5a2e5SJouni Malinen 	int not_dpp_akm = 0;
9947a7ecf73SJouni Malinen 	int akm_use_selector = 0;
9959be22eddSJouni Malinen 	int conn_status;
996d86e5828SJouni Malinen 
997d86e5828SJouni Malinen 	if (!wait_conn)
998d86e5828SJouni Malinen 		wait_conn = "no";
999d86e5828SJouni Malinen 	if (!self_conf)
1000d86e5828SJouni Malinen 		self_conf = "no";
1001d86e5828SJouni Malinen 
1002d86e5828SJouni Malinen 	if (!auth_role) {
1003d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1004d86e5828SJouni Malinen 			  "errorCode,Missing DPPAuthRole");
1005d86e5828SJouni Malinen 		return 0;
1006d86e5828SJouni Malinen 	}
1007d86e5828SJouni Malinen 
1008d86e5828SJouni Malinen 	if (!prov_role) {
1009d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1010d86e5828SJouni Malinen 			  "errorCode,Missing DPPProvisioningRole");
1011d86e5828SJouni Malinen 		return 0;
1012d86e5828SJouni Malinen 	}
1013d86e5828SJouni Malinen 
1014e89cdbf5SJouni Malinen 	val = get_param(cmd, "DPPConfEnrolleeRole");
1015a28608abSJouni Malinen 	if (val) {
1016e89cdbf5SJouni Malinen 		enrollee_ap = strcasecmp(val, "AP") == 0;
1017a28608abSJouni Malinen 		enrollee_configurator = strcasecmp(val, "Configurator") == 0;
1018a28608abSJouni Malinen 	} else {
1019e89cdbf5SJouni Malinen 		enrollee_ap = sigma_dut_is_ap(dut);
1020a28608abSJouni Malinen 		enrollee_configurator = 0;
1021a28608abSJouni Malinen 	}
1022a28608abSJouni Malinen 
1023a28608abSJouni Malinen 	val = get_param(cmd, "DPPNetworkRole");
1024a28608abSJouni Malinen 	if (val) {
1025a28608abSJouni Malinen 		if (strcasecmp(val, "AP") == 0) {
1026a28608abSJouni Malinen 			netrole = "ap";
1027a28608abSJouni Malinen 		} else if (strcasecmp(val, "STA") == 0) {
1028a28608abSJouni Malinen 			netrole = "sta";
1029a28608abSJouni Malinen 		} else if (strcasecmp(val, "Configurator") == 0) {
1030a28608abSJouni Malinen 			netrole = "configurator";
1031a28608abSJouni Malinen 		} else {
1032a28608abSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1033a28608abSJouni Malinen 				  "errorCode,Unsupported DPPNetworkRole value");
1034a28608abSJouni Malinen 			return 0;
1035a28608abSJouni Malinen 		}
1036a28608abSJouni Malinen 	}
1037e89cdbf5SJouni Malinen 
10383a6b92a6SJouni Malinen 	if ((step || frametype) && (!step || !frametype)) {
1039772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1040772299f1SJouni Malinen 			  "errorCode,Invalid DPPStep,DPPFrameType,DPPIEAttribute combination");
1041772299f1SJouni Malinen 		return 0;
1042772299f1SJouni Malinen 	}
1043772299f1SJouni Malinen 
1044d86e5828SJouni Malinen 	if (sigma_dut_is_ap(dut)) {
1045d86e5828SJouni Malinen 		if (!dut->hostapd_ifname) {
1046d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1047d86e5828SJouni Malinen 					"hostapd ifname not specified (-j)");
1048d86e5828SJouni Malinen 			return -2;
1049d86e5828SJouni Malinen 		}
1050d86e5828SJouni Malinen 		ifname = dut->hostapd_ifname;
1051d86e5828SJouni Malinen 
1052d86e5828SJouni Malinen 		if (dpp_hostapd_run(dut) < 0) {
1053d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1054d86e5828SJouni Malinen 				  "errorCode,Failed to start hostapd");
1055d86e5828SJouni Malinen 			return 0;
1056d86e5828SJouni Malinen 		}
1057d86e5828SJouni Malinen 	}
1058d86e5828SJouni Malinen 
105967acb0cfSJouni Malinen 	if (strcasecmp(prov_role, "Configurator") == 0 ||
106067acb0cfSJouni Malinen 	    strcasecmp(prov_role, "Both") == 0) {
1061d86e5828SJouni Malinen 		if (dut->dpp_conf_id < 0) {
1062d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1063d86e5828SJouni Malinen 				 "DPP_CONFIGURATOR_ADD curve=%s",
1064d86e5828SJouni Malinen 				 dpp_get_curve(cmd, "DPPSigningKeyECC"));
1065d86e5828SJouni Malinen 			if (wpa_command_resp(ifname, buf,
1066d86e5828SJouni Malinen 					     buf, sizeof(buf)) < 0) {
1067d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1068d86e5828SJouni Malinen 					  "errorCode,Failed to set up configurator");
1069d86e5828SJouni Malinen 				return 0;
1070d86e5828SJouni Malinen 			}
1071d86e5828SJouni Malinen 			dut->dpp_conf_id = atoi(buf);
1072d86e5828SJouni Malinen 		}
107367acb0cfSJouni Malinen 		if (strcasecmp(prov_role, "Configurator") == 0)
1074d86e5828SJouni Malinen 			role = "configurator";
107567acb0cfSJouni Malinen 		else
107667acb0cfSJouni Malinen 			role = "either";
1077d86e5828SJouni Malinen 	} else if (strcasecmp(prov_role, "Enrollee") == 0) {
1078d86e5828SJouni Malinen 		role = "enrollee";
1079d86e5828SJouni Malinen 	} else {
1080d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1081d86e5828SJouni Malinen 			  "errorCode,Unknown DPPProvisioningRole");
1082d86e5828SJouni Malinen 		return 0;
1083d86e5828SJouni Malinen 	}
1084d86e5828SJouni Malinen 
1085d86e5828SJouni Malinen 	pkex_identifier[0] = '\0';
1086d86e5828SJouni Malinen 	if (strcasecmp(bs, "PKEX") == 0) {
10874f47a272SJouni Malinen 		if (sigma_dut_is_ap(dut) && dut->ap_channel != 6) {
10884f47a272SJouni Malinen 			/* For now, have to make operating channel match DPP
10894f47a272SJouni Malinen 			 * listen channel. This should be removed once hostapd
10904f47a272SJouni Malinen 			 * has support for DPP listen on non-operating channel.
10914f47a272SJouni Malinen 			 */
10924f47a272SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
10934f47a272SJouni Malinen 					"Update hostapd operating channel to match listen needs");
10944f47a272SJouni Malinen 			dut->ap_channel = 6;
1095b4de1962Spriyadharshini gowthaman 
1096016ae6c8SJouni Malinen 			if (get_driver_type(dut) == DRIVER_OPENWRT) {
1097b4de1962Spriyadharshini gowthaman 				snprintf(buf, sizeof(buf),
1098b4de1962Spriyadharshini gowthaman 					 "iwconfig %s channel %d",
1099b4de1962Spriyadharshini gowthaman 					 dut->hostapd_ifname, dut->ap_channel);
1100b4de1962Spriyadharshini gowthaman 				run_system(dut, buf);
1101b4de1962Spriyadharshini gowthaman 			}
1102b4de1962Spriyadharshini gowthaman 
11034f47a272SJouni Malinen 			if (wpa_command(ifname, "SET channel 6") < 0 ||
11044f47a272SJouni Malinen 			    wpa_command(ifname, "DISABLE") < 0 ||
11054f47a272SJouni Malinen 			    wpa_command(ifname, "ENABLE") < 0) {
11064f47a272SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
11074f47a272SJouni Malinen 					  "errorCode,Failed to update channel");
11084f47a272SJouni Malinen 				return 0;
11094f47a272SJouni Malinen 			}
11104f47a272SJouni Malinen 		}
11114f47a272SJouni Malinen 
1112d86e5828SJouni Malinen 		if (!pkex_code) {
1113d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1114d86e5828SJouni Malinen 				  "errorCode,Missing DPPPKEXCode");
1115d86e5828SJouni Malinen 			return 0;
1116d86e5828SJouni Malinen 		}
1117d86e5828SJouni Malinen 
1118d86e5828SJouni Malinen 		if (pkex_code_id)
1119d86e5828SJouni Malinen 			snprintf(pkex_identifier, sizeof(pkex_identifier),
1120d86e5828SJouni Malinen 				 "identifier=%s ", pkex_code_id);
1121d86e5828SJouni Malinen 
1122d86e5828SJouni Malinen 		snprintf(buf, sizeof(buf),
1123d86e5828SJouni Malinen 			 "DPP_BOOTSTRAP_GEN type=pkex curve=%s",
1124d86e5828SJouni Malinen 			 dpp_get_curve(cmd, "DPPCryptoIdentifier"));
1125d86e5828SJouni Malinen 		if (wpa_command_resp(ifname, buf, buf, sizeof(buf)) < 0) {
1126d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1127d86e5828SJouni Malinen 				  "errorCode,Failed to set up PKEX");
1128d86e5828SJouni Malinen 			return 0;
1129d86e5828SJouni Malinen 		}
1130d86e5828SJouni Malinen 		own_pkex_id = atoi(buf);
1131d86e5828SJouni Malinen 	}
1132d86e5828SJouni Malinen 
1133d86e5828SJouni Malinen 	ctrl = open_wpa_mon(ifname);
1134d86e5828SJouni Malinen 	if (!ctrl) {
1135d86e5828SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1136d86e5828SJouni Malinen 				"Failed to open wpa_supplicant monitor connection");
1137d86e5828SJouni Malinen 		return -2;
1138d86e5828SJouni Malinen 	}
1139d86e5828SJouni Malinen 
1140d86e5828SJouni Malinen 	old_timeout = dut->default_timeout;
1141d86e5828SJouni Malinen 	val = get_param(cmd, "DPPTimeout");
1142d86e5828SJouni Malinen 	if (val && atoi(val) > 0) {
1143d86e5828SJouni Malinen 		dut->default_timeout = atoi(val);
1144d86e5828SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP timeout: %u",
1145d86e5828SJouni Malinen 				dut->default_timeout);
1146d86e5828SJouni Malinen 	}
1147d86e5828SJouni Malinen 
11489be22eddSJouni Malinen 	val = get_param(cmd, "DPPStatusQuery");
11499be22eddSJouni Malinen 	conn_status = val && strcasecmp(val, "Yes") == 0;
11509be22eddSJouni Malinen 
1151d86e5828SJouni Malinen 	conf_ssid[0] = '\0';
1152d86e5828SJouni Malinen 	conf_pass[0] = '\0';
115311ab72c2SPurushottam Kushwaha 	group_id[0] = '\0';
1154dd85cff0SJouni Malinen 	conf2[0] = '\0';
115505142208SJouni Malinen 	if (!enrollee_configurator) {
1156d86e5828SJouni Malinen 		val = get_param(cmd, "DPPConfIndex");
1157d86e5828SJouni Malinen 		if (val)
1158d86e5828SJouni Malinen 			conf_index = atoi(val);
115905142208SJouni Malinen 	}
1160d86e5828SJouni Malinen 	switch (conf_index) {
1161258cc26aSJouni Malinen 	case -1:
1162a28608abSJouni Malinen 		if (enrollee_configurator)
1163a28608abSJouni Malinen 			conf_role = "configurator";
1164a28608abSJouni Malinen 		else
1165258cc26aSJouni Malinen 			conf_role = NULL;
1166258cc26aSJouni Malinen 		break;
1167d86e5828SJouni Malinen 	case 1:
1168d86e5828SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
11693aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
11703aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
11713aa72861SJouni Malinen 			goto err;
1172e89cdbf5SJouni Malinen 		if (enrollee_ap) {
1173d86e5828SJouni Malinen 			conf_role = "ap-dpp";
11743d291f70SJouni Malinen 		} else {
1175d86e5828SJouni Malinen 			conf_role = "sta-dpp";
11763d291f70SJouni Malinen 		}
117711ab72c2SPurushottam Kushwaha 		group_id_str = "DPPGROUP_DPP_INFRA";
1178d86e5828SJouni Malinen 		break;
1179d86e5828SJouni Malinen 	case 2:
1180d86e5828SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
11813aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
11823aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
11833aa72861SJouni Malinen 			goto err;
11848f81cdfaSJouni Malinen 		snprintf(conf_pass, sizeof(conf_pass),
11858f81cdfaSJouni Malinen 			 "psk=10506e102ad1e7f95112f6b127675bb8344dacacea60403f3fa4055aec85b0fc");
1186e89cdbf5SJouni Malinen 		if (enrollee_ap)
1187d86e5828SJouni Malinen 			conf_role = "ap-psk";
1188d86e5828SJouni Malinen 		else
1189d86e5828SJouni Malinen 			conf_role = "sta-psk";
1190d86e5828SJouni Malinen 		break;
1191d86e5828SJouni Malinen 	case 3:
1192d86e5828SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
11933aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
11943aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
11953aa72861SJouni Malinen 			goto err;
1196d86e5828SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
11973aa72861SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
11983aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
11993aa72861SJouni Malinen 			goto err;
1200e89cdbf5SJouni Malinen 		if (enrollee_ap)
1201d86e5828SJouni Malinen 			conf_role = "ap-psk";
1202d86e5828SJouni Malinen 		else
1203d86e5828SJouni Malinen 			conf_role = "sta-psk";
1204d86e5828SJouni Malinen 		break;
12053d291f70SJouni Malinen 	case 4:
12063d291f70SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
12073aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
12083aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
12093aa72861SJouni Malinen 			goto err;
1210e89cdbf5SJouni Malinen 		if (enrollee_ap) {
12113d291f70SJouni Malinen 			conf_role = "ap-dpp";
12123d291f70SJouni Malinen 		} else {
12133d291f70SJouni Malinen 			conf_role = "sta-dpp";
12143d291f70SJouni Malinen 		}
121511ab72c2SPurushottam Kushwaha 		group_id_str = "DPPGROUP_DPP_INFRA2";
12163d291f70SJouni Malinen 		break;
12177d031c77SJouni Malinen 	case 5:
12187d031c77SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
12193aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
12203aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
12213aa72861SJouni Malinen 			goto err;
12227d031c77SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
12233aa72861SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
12243aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
12253aa72861SJouni Malinen 			goto err;
12267d031c77SJouni Malinen 		if (enrollee_ap)
12277d031c77SJouni Malinen 			conf_role = "ap-sae";
12287d031c77SJouni Malinen 		else
12297d031c77SJouni Malinen 			conf_role = "sta-sae";
12307d031c77SJouni Malinen 		break;
12317d031c77SJouni Malinen 	case 6:
12327d031c77SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
12333aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
12343aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
12353aa72861SJouni Malinen 			goto err;
12367d031c77SJouni Malinen 		ascii2hexstr("ThisIsDppPassphrase", buf);
12373aa72861SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
12383aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
12393aa72861SJouni Malinen 			goto err;
12407d031c77SJouni Malinen 		if (enrollee_ap)
12417d031c77SJouni Malinen 			conf_role = "ap-psk-sae";
12427d031c77SJouni Malinen 		else
12437d031c77SJouni Malinen 			conf_role = "sta-psk-sae";
12447d031c77SJouni Malinen 		break;
1245f2fa0d00SJouni Malinen 	case 7:
1246f2fa0d00SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
12473aa72861SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
12483aa72861SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
12493aa72861SJouni Malinen 			goto err;
1250f2fa0d00SJouni Malinen 		if (enrollee_ap) {
1251f2fa0d00SJouni Malinen 			conf_role = "ap-dpp";
1252f2fa0d00SJouni Malinen 		} else {
1253f2fa0d00SJouni Malinen 			conf_role = "sta-dpp";
1254f2fa0d00SJouni Malinen 		}
125511ab72c2SPurushottam Kushwaha 		group_id_str = "DPPGROUP_DPP_INFRA";
1256f2fa0d00SJouni Malinen 		force_gas_fragm = 1;
1257f2fa0d00SJouni Malinen 		break;
12580e3941c5SJouni Malinen 	case 8:
12597a7ecf73SJouni Malinen 	case 9:
12600e3941c5SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
12610e3941c5SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
12620e3941c5SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
12630e3941c5SJouni Malinen 			goto err;
12640e3941c5SJouni Malinen 		ascii2hexstr("This_is_legacy_password", buf);
12650e3941c5SJouni Malinen 		res = snprintf(conf_pass, sizeof(conf_pass), "pass=%s", buf);
12660e3941c5SJouni Malinen 		if (res < 0 || res >= sizeof(conf_pass))
12670e3941c5SJouni Malinen 			goto err;
12680e3941c5SJouni Malinen 		if (enrollee_ap) {
12690e3941c5SJouni Malinen 			conf_role = "ap-dpp+psk+sae";
12700e3941c5SJouni Malinen 		} else {
12710e3941c5SJouni Malinen 			conf_role = "sta-dpp+psk+sae";
12720e3941c5SJouni Malinen 		}
12730e3941c5SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA1";
12747a7ecf73SJouni Malinen 		if (conf_index == 9)
12757a7ecf73SJouni Malinen 			akm_use_selector = 1;
12760e3941c5SJouni Malinen 		break;
1277dd85cff0SJouni Malinen 	case 10:
1278dd85cff0SJouni Malinen 		ascii2hexstr("DPPNET01", buf);
1279dd85cff0SJouni Malinen 		res = snprintf(conf_ssid, sizeof(conf_ssid), "ssid=%s", buf);
1280dd85cff0SJouni Malinen 		if (res < 0 || res >= sizeof(conf_ssid))
1281dd85cff0SJouni Malinen 			goto err;
1282dd85cff0SJouni Malinen 		if (enrollee_ap)
1283dd85cff0SJouni Malinen 			conf_role = "ap-dpp";
1284dd85cff0SJouni Malinen 		else
1285dd85cff0SJouni Malinen 			conf_role = "sta-dpp";
1286dd85cff0SJouni Malinen 		group_id_str = "DPPGROUP_DPP_INFRA1";
1287dd85cff0SJouni Malinen 		ascii2hexstr("DPPNET02", buf);
1288dd85cff0SJouni Malinen 		ascii2hexstr("This_is_legacy_password", buf2);
1289dd85cff0SJouni Malinen 		res = snprintf(conf2, sizeof(conf2),
1290dd85cff0SJouni Malinen 			       " @CONF-OBJ-SEP@ conf=%s-dpp+psk+sae ssid=%s pass=%s group_id=DPPGROUP_DPP_INFRA2",
1291dd85cff0SJouni Malinen 			       enrollee_ap ? "ap" : "sta", buf, buf2);
12927ee04b93SJouni Malinen 		if (res < 0 || res >= sizeof(conf2))
12937ee04b93SJouni Malinen 			goto err;
1294dd85cff0SJouni Malinen 		break;
1295f7490768SJouni Malinen 	default:
1296f7490768SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1297f7490768SJouni Malinen 			  "errorCode,Unsupported DPPConfIndex");
1298f7490768SJouni Malinen 		goto out;
1299d86e5828SJouni Malinen 	}
1300d86e5828SJouni Malinen 
130111ab72c2SPurushottam Kushwaha 	if (group_id_str)
130211ab72c2SPurushottam Kushwaha 		snprintf(group_id, sizeof(group_id), " group_id=%s",
130311ab72c2SPurushottam Kushwaha 			 group_id_str);
13043d291f70SJouni Malinen 
13052b2230fbSJouni Malinen 	if (force_gas_fragm) {
13062b2230fbSJouni Malinen 		char spaces[1500];
13072b2230fbSJouni Malinen 
13082b2230fbSJouni Malinen 		memset(spaces, ' ', sizeof(spaces));
13092b2230fbSJouni Malinen 		spaces[sizeof(spaces) - 1] = '\0';
13102b2230fbSJouni Malinen 
13112b2230fbSJouni Malinen 		snprintf(buf, sizeof(buf),
13122b2230fbSJouni Malinen 			 "SET dpp_discovery_override {\"ssid\":\"DPPNET01\"}%s",
13132b2230fbSJouni Malinen 			 spaces);
13142b2230fbSJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
13152b2230fbSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
13162b2230fbSJouni Malinen 				  "errorCode,Failed to set discovery override");
13172b2230fbSJouni Malinen 			goto out;
13182b2230fbSJouni Malinen 		}
13192b2230fbSJouni Malinen 	}
13202b2230fbSJouni Malinen 
1321772299f1SJouni Malinen 	if (step) {
1322772299f1SJouni Malinen 		int test;
1323772299f1SJouni Malinen 
1324772299f1SJouni Malinen 		test = dpp_get_test(step, frametype, attr);
1325772299f1SJouni Malinen 		if (test <= 0) {
1326772299f1SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1327772299f1SJouni Malinen 				  "errorCode,Unsupported DPPStep/DPPFrameType/DPPIEAttribute");
1328772299f1SJouni Malinen 			goto out;
1329772299f1SJouni Malinen 		}
1330772299f1SJouni Malinen 
1331772299f1SJouni Malinen 		snprintf(buf, sizeof(buf), "SET dpp_test %d", test);
1332772299f1SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
1333772299f1SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1334772299f1SJouni Malinen 				  "errorCode,Failed to set dpp_test");
1335772299f1SJouni Malinen 			goto out;
1336772299f1SJouni Malinen 		}
1337772299f1SJouni Malinen 	} else {
1338772299f1SJouni Malinen 		wpa_command(ifname, "SET dpp_test 0");
1339772299f1SJouni Malinen 	}
1340772299f1SJouni Malinen 
1341fbb268d7SJouni Malinen 	if (strcasecmp(self_conf, "Yes") == 0) {
1342fbb268d7SJouni Malinen 		if (strcasecmp(prov_role, "Configurator") != 0) {
1343fbb268d7SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1344fbb268d7SJouni Malinen 				  "errorCode,Invalid DPPSelfConfigure use - only allowed for Configurator role");
1345fbb268d7SJouni Malinen 			goto out;
1346fbb268d7SJouni Malinen 		}
1347fbb268d7SJouni Malinen 		if (!conf_role) {
1348fbb268d7SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1349fbb268d7SJouni Malinen 				  "errorCode,Missing DPPConfIndex");
1350fbb268d7SJouni Malinen 			goto out;
1351fbb268d7SJouni Malinen 		}
1352fbb268d7SJouni Malinen 
1353fbb268d7SJouni Malinen 		snprintf(buf, sizeof(buf),
1354fbb268d7SJouni Malinen 			 "DPP_CONFIGURATOR_SIGN  conf=%s %s %s configurator=%d",
1355fbb268d7SJouni Malinen 			 conf_role, conf_ssid, conf_pass, dut->dpp_conf_id);
1356fbb268d7SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
1357fbb268d7SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1358fbb268d7SJouni Malinen 				  "errorCode,Failed to initiate DPP self-configuration");
1359fbb268d7SJouni Malinen 			goto out;
1360fbb268d7SJouni Malinen 		}
1361174db64fSJouni Malinen 		if (sigma_dut_is_ap(dut))
1362174db64fSJouni Malinen 			goto update_ap;
1363fbb268d7SJouni Malinen 		goto wait_connect;
1364f37fda0fSJouni Malinen 	} else if ((nfc_handover &&
1365f37fda0fSJouni Malinen 		    strcasecmp(nfc_handover, "Negotiated_Requestor") == 0) ||
1366*a833025dSJouni Malinen 		   ((!nfc_handover ||
1367*a833025dSJouni Malinen 		     strcasecmp(nfc_handover, "Static") == 0) &&
1368*a833025dSJouni Malinen 		    strcasecmp(auth_role, "Initiator") == 0)) {
1369d86e5828SJouni Malinen 		char own_txt[20];
1370b1dd21f8SJouni Malinen 		int dpp_peer_bootstrap = -1;
1371b5ab828bSJouni Malinen 		char neg_freq[30];
1372b5ab828bSJouni Malinen 
1373d1e22f76SJouni Malinen 		val = get_param(cmd, "DPPAuthDirection");
1374d1e22f76SJouni Malinen 		check_mutual = val && strcasecmp(val, "Mutual") == 0;
1375d1e22f76SJouni Malinen 
1376b5ab828bSJouni Malinen 		neg_freq[0] = '\0';
1377b5ab828bSJouni Malinen 		val = get_param(cmd, "DPPSubsequentChannel");
1378b5ab828bSJouni Malinen 		if (val) {
1379b5ab828bSJouni Malinen 			int opclass, channel, freq;
1380b5ab828bSJouni Malinen 
1381b5ab828bSJouni Malinen 			opclass = atoi(val);
1382b5ab828bSJouni Malinen 			val = strchr(val, '/');
1383b5ab828bSJouni Malinen 			if (opclass == 0 || !val) {
1384b5ab828bSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1385b5ab828bSJouni Malinen 					  "errorCode,Invalid DPPSubsequentChannel");
1386b5ab828bSJouni Malinen 				goto out;
1387b5ab828bSJouni Malinen 			}
1388b5ab828bSJouni Malinen 			val++;
1389b5ab828bSJouni Malinen 			channel = atoi(val);
1390b5ab828bSJouni Malinen 
1391b5ab828bSJouni Malinen 			/* Ignoring opclass for now; could use it here for more
1392b5ab828bSJouni Malinen 			 * robust frequency determination. */
1393093569ffSAlexei Avshalom Lazar 			freq = channel_to_freq(dut, channel);
1394b5ab828bSJouni Malinen 			if (!freq) {
1395b5ab828bSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1396b5ab828bSJouni Malinen 					  "errorCode,Unsupported DPPSubsequentChannel channel");
1397b5ab828bSJouni Malinen 				goto out;
1398b5ab828bSJouni Malinen 			}
1399b5ab828bSJouni Malinen 			snprintf(neg_freq, sizeof(neg_freq), " neg_freq=%d",
1400b5ab828bSJouni Malinen 				 freq);
1401b5ab828bSJouni Malinen 		}
1402b1dd21f8SJouni Malinen 
1403b1dd21f8SJouni Malinen 		if (strcasecmp(bs, "QR") == 0) {
1404b1dd21f8SJouni Malinen 			if (!dut->dpp_peer_uri) {
1405b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1406b1dd21f8SJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
1407b1dd21f8SJouni Malinen 				goto out;
1408b1dd21f8SJouni Malinen 			}
1409b1dd21f8SJouni Malinen 
1410b1dd21f8SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
1411b1dd21f8SJouni Malinen 				 dut->dpp_peer_uri);
1412b1dd21f8SJouni Malinen 			if (wpa_command_resp(ifname, buf, buf,
14133c27aa82SJouni Malinen 					     sizeof(buf)) < 0 ||
14143c27aa82SJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
1415b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1416b1dd21f8SJouni Malinen 					  "errorCode,Failed to parse URI");
1417b1dd21f8SJouni Malinen 				goto out;
1418b1dd21f8SJouni Malinen 			}
1419b1dd21f8SJouni Malinen 			dpp_peer_bootstrap = atoi(buf);
1420*a833025dSJouni Malinen 		} else if (strcasecmp(bs, "NFC") == 0 && nfc_handover &&
1421*a833025dSJouni Malinen 			   strcasecmp(nfc_handover, "Static") == 0) {
1422*a833025dSJouni Malinen 			if (!dut->dpp_peer_uri) {
1423*a833025dSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1424*a833025dSJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
1425*a833025dSJouni Malinen 				goto out;
1426*a833025dSJouni Malinen 			}
1427*a833025dSJouni Malinen 
1428*a833025dSJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_NFC_URI %s",
1429*a833025dSJouni Malinen 				 dut->dpp_peer_uri);
1430*a833025dSJouni Malinen 			if (wpa_command_resp(ifname, buf,
1431*a833025dSJouni Malinen 					     buf, sizeof(buf)) < 0 ||
1432*a833025dSJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
1433*a833025dSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1434*a833025dSJouni Malinen 					  "errorCode,Failed to process URI from NFC Tag");
1435*a833025dSJouni Malinen 				goto out;
1436*a833025dSJouni Malinen 			}
1437*a833025dSJouni Malinen 			dpp_peer_bootstrap = atoi(buf);
1438f37fda0fSJouni Malinen 		} else if (strcasecmp(bs, "NFC") == 0) {
1439f37fda0fSJouni Malinen 			if (!dut->dpp_peer_uri) {
1440f37fda0fSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1441f37fda0fSJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
1442f37fda0fSJouni Malinen 				goto out;
1443f37fda0fSJouni Malinen 			}
1444f37fda0fSJouni Malinen 			if (dut->dpp_local_bootstrap < 0) {
1445f37fda0fSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1446f37fda0fSJouni Malinen 					  "errorCode,Missing own bootstrapping info");
1447f37fda0fSJouni Malinen 				goto out;
1448f37fda0fSJouni Malinen 			}
1449f37fda0fSJouni Malinen 
1450f37fda0fSJouni Malinen 			snprintf(buf, sizeof(buf),
1451f37fda0fSJouni Malinen 				 "DPP_NFC_HANDOVER_SEL own=%d uri=%s",
1452f37fda0fSJouni Malinen 				 dut->dpp_local_bootstrap, dut->dpp_peer_uri);
1453f37fda0fSJouni Malinen 			if (wpa_command_resp(ifname, buf,
1454f37fda0fSJouni Malinen 					     buf, sizeof(buf)) < 0 ||
1455f37fda0fSJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
1456f37fda0fSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1457f37fda0fSJouni Malinen 					  "errorCode,Failed to process NFC Handover Select");
1458f37fda0fSJouni Malinen 				goto out;
1459f37fda0fSJouni Malinen 			}
1460f37fda0fSJouni Malinen 			dpp_peer_bootstrap = atoi(buf);
1461b1dd21f8SJouni Malinen 		}
1462d86e5828SJouni Malinen 
146363d5041cSJouni Malinen 		if (dut->dpp_local_bootstrap >= 0)
1464d86e5828SJouni Malinen 			snprintf(own_txt, sizeof(own_txt), " own=%d",
1465d86e5828SJouni Malinen 				 dut->dpp_local_bootstrap);
1466d86e5828SJouni Malinen 		else
1467d86e5828SJouni Malinen 			own_txt[0] = '\0';
1468f37fda0fSJouni Malinen 		if ((strcasecmp(bs, "QR") == 0 || strcasecmp(bs, "NFC") == 0) &&
146967acb0cfSJouni Malinen 		    (strcasecmp(prov_role, "Configurator") == 0 ||
147067acb0cfSJouni Malinen 		     strcasecmp(prov_role, "Both") == 0)) {
1471258cc26aSJouni Malinen 			if (!conf_role) {
1472258cc26aSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1473258cc26aSJouni Malinen 					  "errorCode,Missing DPPConfIndex");
1474258cc26aSJouni Malinen 				goto out;
1475258cc26aSJouni Malinen 			}
1476d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1477a28608abSJouni Malinen 				 "DPP_AUTH_INIT peer=%d%s role=%s%s%s conf=%s %s %s configurator=%d%s%s%s%s%s",
1478b1dd21f8SJouni Malinen 				 dpp_peer_bootstrap, own_txt, role,
1479a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
1480a28608abSJouni Malinen 				 netrole ? netrole : "",
1481d86e5828SJouni Malinen 				 conf_role, conf_ssid, conf_pass,
14827a7ecf73SJouni Malinen 				 dut->dpp_conf_id, neg_freq, group_id,
14837a7ecf73SJouni Malinen 				 akm_use_selector ? " akm_use_selector=1" : "",
14849be22eddSJouni Malinen 				 conn_status ? " conn_status=1" : "",
14857a7ecf73SJouni Malinen 				 conf2);
1486f37fda0fSJouni Malinen 		} else if (tcp && (strcasecmp(bs, "QR") == 0 ||
1487f37fda0fSJouni Malinen 				   strcasecmp(bs, "NFC") == 0)) {
14881352f1e7SJouni Malinen 			snprintf(buf, sizeof(buf),
1489a28608abSJouni Malinen 				 "DPP_AUTH_INIT peer=%d%s role=%s%s%s tcp_addr=%s%s%s",
1490a28608abSJouni Malinen 				 dpp_peer_bootstrap, own_txt, role,
1491a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
1492a28608abSJouni Malinen 				 netrole ? netrole : "",
1493a28608abSJouni Malinen 				 tcp, neg_freq, group_id);
1494f37fda0fSJouni Malinen 		} else if (strcasecmp(bs, "QR") == 0 ||
1495f37fda0fSJouni Malinen 			   strcasecmp(bs, "NFC") == 0) {
1496d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1497a28608abSJouni Malinen 				 "DPP_AUTH_INIT peer=%d%s role=%s%s%s%s%s",
149811ab72c2SPurushottam Kushwaha 				 dpp_peer_bootstrap, own_txt, role,
1499a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
1500a28608abSJouni Malinen 				 netrole ? netrole : "",
150111ab72c2SPurushottam Kushwaha 				 neg_freq, group_id);
1502d86e5828SJouni Malinen 		} else if (strcasecmp(bs, "PKEX") == 0 &&
150367acb0cfSJouni Malinen 			   (strcasecmp(prov_role, "Configurator") == 0 ||
150467acb0cfSJouni Malinen 			    strcasecmp(prov_role, "Both") == 0)) {
1505258cc26aSJouni Malinen 			if (!conf_role) {
1506258cc26aSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1507258cc26aSJouni Malinen 					  "errorCode,Missing DPPConfIndex");
1508258cc26aSJouni Malinen 				goto out;
1509258cc26aSJouni Malinen 			}
1510d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1511d86e5828SJouni Malinen 				 "DPP_PKEX_ADD own=%d init=1 role=%s conf=%s %s %s configurator=%d %scode=%s",
1512d86e5828SJouni Malinen 				 own_pkex_id, role, conf_role,
1513d86e5828SJouni Malinen 				 conf_ssid, conf_pass, dut->dpp_conf_id,
1514d86e5828SJouni Malinen 				 pkex_identifier, pkex_code);
1515d86e5828SJouni Malinen 		} else if (strcasecmp(bs, "PKEX") == 0) {
1516d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1517d86e5828SJouni Malinen 				 "DPP_PKEX_ADD own=%d init=1 role=%s %scode=%s",
1518d86e5828SJouni Malinen 				 own_pkex_id, role, pkex_identifier, pkex_code);
1519d551c6fcSJouni Malinen 		} else {
1520d551c6fcSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1521d551c6fcSJouni Malinen 				  "errorCode,Unsupported DPPBS");
1522d551c6fcSJouni Malinen 			goto out;
1523d86e5828SJouni Malinen 		}
1524d86e5828SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
1525d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1526d86e5828SJouni Malinen 				  "errorCode,Failed to initiate DPP authentication");
1527d86e5828SJouni Malinen 			goto out;
1528d86e5828SJouni Malinen 		}
15293d16ccbdSJouni Malinen 	} else if ((nfc_handover &&
15303d16ccbdSJouni Malinen 		    strcasecmp(nfc_handover, "Negotiated_Selector") == 0) ||
15313d16ccbdSJouni Malinen 		   (!nfc_handover && strcasecmp(auth_role, "Responder") == 0)) {
153267f096aaSJouni Malinen 		const char *delay_qr_resp;
153363d5041cSJouni Malinen 		int mutual;
1534d3afc5cbSJouni Malinen 		int freq = 2462; /* default: channel 11 */
1535d3afc5cbSJouni Malinen 
1536f8d81aa4SJouni Malinen 		if (sigma_dut_is_ap(dut) && dut->hostapd_running &&
1537f8d81aa4SJouni Malinen 		    dut->ap_oper_chn)
1538f8d81aa4SJouni Malinen 			freq = channel_to_freq(dut, dut->ap_channel);
1539f8d81aa4SJouni Malinen 
154006cfcb3eSJouni Malinen 		if (strcasecmp(bs, "PKEX") == 0) {
154106cfcb3eSJouni Malinen 			/* default: channel 6 for PKEX */
154206cfcb3eSJouni Malinen 			freq = 2437;
154306cfcb3eSJouni Malinen 		}
154406cfcb3eSJouni Malinen 
154567f096aaSJouni Malinen 		delay_qr_resp = get_param(cmd, "DPPDelayQRResponse");
154667f096aaSJouni Malinen 
154763d5041cSJouni Malinen 		val = get_param(cmd, "DPPAuthDirection");
154863d5041cSJouni Malinen 		mutual = val && strcasecmp(val, "Mutual") == 0;
154963d5041cSJouni Malinen 
1550d3afc5cbSJouni Malinen 		val = get_param(cmd, "DPPListenChannel");
1551d3afc5cbSJouni Malinen 		if (val) {
1552093569ffSAlexei Avshalom Lazar 			freq = channel_to_freq(dut, atoi(val));
1553d3afc5cbSJouni Malinen 			if (freq == 0) {
1554d3afc5cbSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1555d3afc5cbSJouni Malinen 					  "errorCode,Unsupported DPPListenChannel value");
1556d3afc5cbSJouni Malinen 				goto out;
1557d3afc5cbSJouni Malinen 			}
1558d3afc5cbSJouni Malinen 		}
1559d86e5828SJouni Malinen 
15603d16ccbdSJouni Malinen 		if (strcasecmp(bs, "NFC") == 0) {
15613d16ccbdSJouni Malinen 			if (!dut->dpp_peer_uri) {
15623d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
15633d16ccbdSJouni Malinen 					  "errorCode,Missing peer bootstrapping info");
15643d16ccbdSJouni Malinen 				goto out;
15653d16ccbdSJouni Malinen 			}
15663d16ccbdSJouni Malinen 			if (dut->dpp_local_bootstrap < 0) {
15673d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
15683d16ccbdSJouni Malinen 					  "errorCode,Missing own bootstrapping info");
15693d16ccbdSJouni Malinen 				goto out;
15703d16ccbdSJouni Malinen 			}
15713d16ccbdSJouni Malinen 
15723d16ccbdSJouni Malinen 			snprintf(buf, sizeof(buf),
15733d16ccbdSJouni Malinen 				 "DPP_NFC_HANDOVER_REQ own=%d uri=%s",
15743d16ccbdSJouni Malinen 				 dut->dpp_local_bootstrap, dut->dpp_peer_uri);
15753d16ccbdSJouni Malinen 			if (wpa_command(ifname, buf) < 0) {
15763d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
15773d16ccbdSJouni Malinen 					  "errorCode,Failed to process NFC Handover Request");
15783d16ccbdSJouni Malinen 				goto out;
15793d16ccbdSJouni Malinen 			}
15803d16ccbdSJouni Malinen 
15813d16ccbdSJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_BOOTSTRAP_INFO %d",
15823d16ccbdSJouni Malinen 				 dut->dpp_local_bootstrap);
15833d16ccbdSJouni Malinen 			if (wpa_command_resp(ifname, buf,
15843d16ccbdSJouni Malinen 					     buf, sizeof(buf)) < 0 ||
15853d16ccbdSJouni Malinen 			    strncmp(buf, "FAIL", 4) == 0) {
15863d16ccbdSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
15873d16ccbdSJouni Malinen 					  "errorCode,Failed to get bootstrap information");
15883d16ccbdSJouni Malinen 				goto out;
15893d16ccbdSJouni Malinen 			}
15903d16ccbdSJouni Malinen 			pos = buf;
15913d16ccbdSJouni Malinen 			while (pos) {
15923d16ccbdSJouni Malinen 				pos2 = strchr(pos, '\n');
15933d16ccbdSJouni Malinen 				if (pos2)
15943d16ccbdSJouni Malinen 					*pos2 = '\0';
15953d16ccbdSJouni Malinen 				if (strncmp(pos, "use_freq=", 9) == 0) {
15963d16ccbdSJouni Malinen 					freq = atoi(pos + 9);
15973d16ccbdSJouni Malinen 					sigma_dut_print(dut, DUT_MSG_DEBUG,
15983d16ccbdSJouni Malinen 							"DPP negotiation frequency from NFC handover: %d MHz",
15993d16ccbdSJouni Malinen 							freq);
16003d16ccbdSJouni Malinen 					break;
16013d16ccbdSJouni Malinen 				}
16023d16ccbdSJouni Malinen 
16033d16ccbdSJouni Malinen 				if (!pos2)
16043d16ccbdSJouni Malinen 					break;
16053d16ccbdSJouni Malinen 				pos = pos2 + 1;
16063d16ccbdSJouni Malinen 			}
16073d16ccbdSJouni Malinen 		} else if (!delay_qr_resp && dut->dpp_peer_uri) {
1608b1dd21f8SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
1609b1dd21f8SJouni Malinen 				 dut->dpp_peer_uri);
1610b1dd21f8SJouni Malinen 			if (wpa_command_resp(ifname, buf, buf,
1611b1dd21f8SJouni Malinen 					     sizeof(buf)) < 0) {
1612b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1613b1dd21f8SJouni Malinen 					  "errorCode,Failed to parse URI");
1614b1dd21f8SJouni Malinen 				goto out;
1615b1dd21f8SJouni Malinen 			}
1616b1dd21f8SJouni Malinen 		}
1617b1dd21f8SJouni Malinen 
1618d86e5828SJouni Malinen 		if (strcasecmp(prov_role, "Configurator") == 0) {
1619258cc26aSJouni Malinen 			if (!conf_role) {
1620258cc26aSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1621258cc26aSJouni Malinen 					  "errorCode,Missing DPPConfIndex");
1622258cc26aSJouni Malinen 				goto out;
1623258cc26aSJouni Malinen 			}
1624d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
16259be22eddSJouni Malinen 				 "SET dpp_configurator_params  conf=%s %s %s configurator=%d%s%s%s%s",
1626d86e5828SJouni Malinen 				 conf_role, conf_ssid, conf_pass,
16277a7ecf73SJouni Malinen 				 dut->dpp_conf_id, group_id,
16287a7ecf73SJouni Malinen 				 akm_use_selector ? " akm_use_selector=1" : "",
16299be22eddSJouni Malinen 				 conn_status ? " conn_status=1" : "",
16307a7ecf73SJouni Malinen 				 conf2);
1631d86e5828SJouni Malinen 			if (wpa_command(ifname, buf) < 0) {
1632d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1633d86e5828SJouni Malinen 					  "errorCode,Failed to set configurator parameters");
1634d86e5828SJouni Malinen 				goto out;
1635d86e5828SJouni Malinen 			}
1636d86e5828SJouni Malinen 		}
1637d86e5828SJouni Malinen 		if (strcasecmp(bs, "PKEX") == 0) {
1638d86e5828SJouni Malinen 			snprintf(buf, sizeof(buf),
1639d86e5828SJouni Malinen 				 "DPP_PKEX_ADD own=%d role=%s %scode=%s",
1640d86e5828SJouni Malinen 				 own_pkex_id, role, pkex_identifier, pkex_code);
1641d86e5828SJouni Malinen 			if (wpa_command(ifname, buf) < 0) {
1642d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1643d86e5828SJouni Malinen 					  "errorCode,Failed to configure DPP PKEX");
1644d86e5828SJouni Malinen 				goto out;
1645d86e5828SJouni Malinen 			}
1646d86e5828SJouni Malinen 		}
1647d86e5828SJouni Malinen 
1648785afb44SJouni Malinen 		if (tcp && strcasecmp(tcp, "yes") == 0) {
1649785afb44SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_CONTROLLER_START");
1650785afb44SJouni Malinen 		} else {
1651a28608abSJouni Malinen 			snprintf(buf, sizeof(buf),
1652a28608abSJouni Malinen 				 "DPP_LISTEN %d role=%s%s%s%s",
1653fd7359aeSJouni Malinen 				 freq, role,
1654fd7359aeSJouni Malinen 				 (strcasecmp(bs, "QR") == 0 && mutual) ?
1655a28608abSJouni Malinen 				 " qr=mutual" : "",
1656a28608abSJouni Malinen 				 netrole ? " netrole=" : "",
1657a28608abSJouni Malinen 				 netrole ? netrole : "");
1658785afb44SJouni Malinen 		}
1659d86e5828SJouni Malinen 		if (wpa_command(ifname, buf) < 0) {
1660d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1661d86e5828SJouni Malinen 				  "errorCode,Failed to start DPP listen");
1662d86e5828SJouni Malinen 			goto out;
1663d86e5828SJouni Malinen 		}
1664b1dd21f8SJouni Malinen 
1665785afb44SJouni Malinen 		if (!(tcp && strcasecmp(tcp, "yes") == 0) &&
1666016ae6c8SJouni Malinen 		    get_driver_type(dut) == DRIVER_OPENWRT) {
1667b4de1962Spriyadharshini gowthaman 			snprintf(buf, sizeof(buf), "iwconfig %s channel %d",
1668b4de1962Spriyadharshini gowthaman 				 dut->hostapd_ifname, freq_to_channel(freq));
1669b4de1962Spriyadharshini gowthaman 			run_system(dut, buf);
1670b4de1962Spriyadharshini gowthaman 		}
1671b4de1962Spriyadharshini gowthaman 
1672b1dd21f8SJouni Malinen 		if (delay_qr_resp && mutual && dut->dpp_peer_uri) {
1673b1dd21f8SJouni Malinen 			int wait_time = atoi(delay_qr_resp);
1674b1dd21f8SJouni Malinen 
1675b1dd21f8SJouni Malinen 			res = get_wpa_cli_events(dut, ctrl, auth_events,
1676b1dd21f8SJouni Malinen 						 buf, sizeof(buf));
1677b1dd21f8SJouni Malinen 			if (res < 0) {
1678b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
1679b1dd21f8SJouni Malinen 					  "BootstrapResult,OK,AuthResult,Timeout");
1680b1dd21f8SJouni Malinen 				goto out;
1681b1dd21f8SJouni Malinen 			}
1682b1dd21f8SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
1683b1dd21f8SJouni Malinen 					"DPP auth result: %s", buf);
1684b1dd21f8SJouni Malinen 			if (strstr(buf, "DPP-SCAN-PEER-QR-CODE") == NULL) {
1685b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1686b1dd21f8SJouni Malinen 					  "errorCode,No scan request for peer QR Code seen");
1687b1dd21f8SJouni Malinen 				goto out;
1688b1dd21f8SJouni Malinen 			}
1689b1dd21f8SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
1690b1dd21f8SJouni Malinen 					"Waiting %d second(s) before processing peer URI",
1691b1dd21f8SJouni Malinen 					wait_time);
1692b1dd21f8SJouni Malinen 			sleep(wait_time);
1693b1dd21f8SJouni Malinen 
1694b1dd21f8SJouni Malinen 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
1695b1dd21f8SJouni Malinen 				 dut->dpp_peer_uri);
1696b1dd21f8SJouni Malinen 			if (wpa_command_resp(ifname, buf, buf,
1697b1dd21f8SJouni Malinen 					     sizeof(buf)) < 0) {
1698b1dd21f8SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
1699b1dd21f8SJouni Malinen 					  "errorCode,Failed to parse URI");
1700b1dd21f8SJouni Malinen 				goto out;
1701b1dd21f8SJouni Malinen 			}
1702bc9e055cSSrinivas Dasari 		} else if (mutual && action_type &&
1703bc9e055cSSrinivas Dasari 			   strcasecmp(action_type, "ManualDPP") == 0) {
1704bc9e055cSSrinivas Dasari 			res = get_wpa_cli_events(dut, ctrl, auth_events,
1705bc9e055cSSrinivas Dasari 						 buf, sizeof(buf));
1706bc9e055cSSrinivas Dasari 			if (res < 0) {
1707bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_COMPLETE,
1708bc9e055cSSrinivas Dasari 					  "BootstrapResult,OK,AuthResult,Timeout");
1709bc9e055cSSrinivas Dasari 				goto out;
1710bc9e055cSSrinivas Dasari 			}
1711bc9e055cSSrinivas Dasari 			sigma_dut_print(dut, DUT_MSG_DEBUG,
1712bc9e055cSSrinivas Dasari 					"DPP auth result: %s", buf);
1713e3b13933SSrinivas Dasari 			if (strstr(buf, "DPP-NOT-COMPATIBLE")) {
1714e3b13933SSrinivas Dasari 			    send_resp(dut, conn, SIGMA_COMPLETE,
1715e3b13933SSrinivas Dasari 				      "BootstrapResult,OK,AuthResult,ROLES_NOT_COMPATIBLE");
1716e3b13933SSrinivas Dasari 			    goto out;
1717e3b13933SSrinivas Dasari 			}
1718e3b13933SSrinivas Dasari 
1719bc9e055cSSrinivas Dasari 			if (strstr(buf, "DPP-SCAN-PEER-QR-CODE") == NULL) {
1720bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_ERROR,
1721bc9e055cSSrinivas Dasari 					  "errorCode,No scan request for peer QR Code seen");
1722bc9e055cSSrinivas Dasari 				goto out;
1723bc9e055cSSrinivas Dasari 			}
1724bc9e055cSSrinivas Dasari 
1725bc9e055cSSrinivas Dasari 			if (dpp_scan_peer_qrcode(dut) < 0) {
1726bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_ERROR,
1727bc9e055cSSrinivas Dasari 					  "errorCode,Failed to scan peer QR Code");
1728bc9e055cSSrinivas Dasari 				goto out;
1729bc9e055cSSrinivas Dasari 			}
1730bc9e055cSSrinivas Dasari 
1731bc9e055cSSrinivas Dasari 			snprintf(buf, sizeof(buf), "DPP_QR_CODE %s",
1732bc9e055cSSrinivas Dasari 				 dut->dpp_peer_uri);
1733bc9e055cSSrinivas Dasari 			if (wpa_command_resp(ifname, buf, buf,
1734bc9e055cSSrinivas Dasari 					     sizeof(buf)) < 0) {
1735bc9e055cSSrinivas Dasari 				send_resp(dut, conn, SIGMA_ERROR,
1736bc9e055cSSrinivas Dasari 					  "errorCode,Failed to parse URI");
1737bc9e055cSSrinivas Dasari 				goto out;
1738bc9e055cSSrinivas Dasari 			}
1739b1dd21f8SJouni Malinen 		}
1740d86e5828SJouni Malinen 	} else {
1741d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1742d86e5828SJouni Malinen 			  "errorCode,Unknown DPPAuthRole");
1743d86e5828SJouni Malinen 		goto out;
1744d86e5828SJouni Malinen 	}
1745d86e5828SJouni Malinen 
17463a6b92a6SJouni Malinen 	if (step && strcasecmp(step, "Timeout") == 0) {
17473a6b92a6SJouni Malinen 		result = "errorCode,Unexpected state";
17483a6b92a6SJouni Malinen 
17493a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "PKEXExchangeResponse") == 0) {
17509a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 8, -1) < 0)
17513a6b92a6SJouni Malinen 				result = "BootstrapResult,Timeout";
17523a6b92a6SJouni Malinen 			else
17533a6b92a6SJouni Malinen 				result = "BootstrapResult,Errorsent";
17543a6b92a6SJouni Malinen 		}
17553a6b92a6SJouni Malinen 
17563a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "PKEXCRRequest") == 0) {
17579a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 9, -1) < 0)
17583a6b92a6SJouni Malinen 				result = "BootstrapResult,Timeout";
17593a6b92a6SJouni Malinen 			else
17603a6b92a6SJouni Malinen 				result = "BootstrapResult,Errorsent";
17613a6b92a6SJouni Malinen 		}
17623a6b92a6SJouni Malinen 
17633a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "PKEXCRResponse") == 0) {
17649a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 10, -1) < 0)
17653a6b92a6SJouni Malinen 				result = "BootstrapResult,Timeout";
17663a6b92a6SJouni Malinen 			else
17673a6b92a6SJouni Malinen 				result = "BootstrapResult,Errorsent";
17683a6b92a6SJouni Malinen 		}
17693a6b92a6SJouni Malinen 
17703a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "AuthenticationRequest") == 0) {
17719a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 0, -1) < 0)
17723a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Timeout";
17733a6b92a6SJouni Malinen 			else
17743a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Errorsent";
17753a6b92a6SJouni Malinen 		}
17763a6b92a6SJouni Malinen 
17773a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "AuthenticationResponse") == 0) {
17789a3415c2SJouni Malinen 			if (dpp_wait_rx(dut, ctrl, 1, -1) < 0)
17793a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Timeout";
17803a6b92a6SJouni Malinen 			else
17813a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,Errorsent";
17823a6b92a6SJouni Malinen 		}
17833a6b92a6SJouni Malinen 
17843a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "AuthenticationConfirm") == 0) {
1785ecb49d8bSDeepak Dhamdhere 			if (strcasecmp(auth_role, "Initiator") == 0) {
1786a1199884SJouni Malinen 				/* This special case of DPPStep,Timeout with
1787a1199884SJouni Malinen 				 * DPPFrameType,AuthenticationConfirm on an
1788a1199884SJouni Malinen 				 * Initiator is used to cover need for stopping
1789a1199884SJouni Malinen 				 * the Initiator/Enrollee from sending out
1790a1199884SJouni Malinen 				 * Configuration Request message. */
1791a1199884SJouni Malinen 				if (strcasecmp(prov_role, "Enrollee") != 0) {
1792a1199884SJouni Malinen 					send_resp(dut, conn, SIGMA_ERROR,
1793a1199884SJouni Malinen 						  "errorCode,Unexpected use of timeout after AuthenticationConfirm TX in Configurator role");
1794a1199884SJouni Malinen 					goto out;
1795a1199884SJouni Malinen 				}
1796671c9e1aSSrinivas Dasari 				if (check_mutual &&
1797671c9e1aSSrinivas Dasari 				    dpp_process_auth_response(
1798671c9e1aSSrinivas Dasari 					    dut, conn, ctrl, auth_events,
1799671c9e1aSSrinivas Dasari 					    action_type, check_mutual,
1800671c9e1aSSrinivas Dasari 					    buf, sizeof(buf)) < 0)
1801671c9e1aSSrinivas Dasari 					goto out;
1802ecb49d8bSDeepak Dhamdhere 				if (dpp_wait_tx_status(dut, ctrl, 2) < 0)
1803ecb49d8bSDeepak Dhamdhere 					result = "BootstrapResult,OK,AuthResult,Timeout";
1804ecb49d8bSDeepak Dhamdhere 				else
1805a1199884SJouni Malinen 					result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponse";
1806ecb49d8bSDeepak Dhamdhere 			} else {
18079a3415c2SJouni Malinen 				if (dpp_wait_rx(dut, ctrl, 2, -1) < 0)
18083a6b92a6SJouni Malinen 					result = "BootstrapResult,OK,AuthResult,Timeout";
18093a6b92a6SJouni Malinen 				else
1810ecb49d8bSDeepak Dhamdhere 					result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationConfirm";
1811ecb49d8bSDeepak Dhamdhere 			}
18123a6b92a6SJouni Malinen 		}
18133a6b92a6SJouni Malinen 
18143a6b92a6SJouni Malinen 		if (strcasecmp(frametype, "ConfigurationRequest") == 0) {
18153a6b92a6SJouni Malinen 			if (get_wpa_cli_event(dut, ctrl, "DPP-CONF-FAILED",
18163a6b92a6SJouni Malinen 					      buf, sizeof(buf)) < 0)
18173a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout";
18183a6b92a6SJouni Malinen 			else
18193a6b92a6SJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Errorsent";
18203a6b92a6SJouni Malinen 		}
18213a6b92a6SJouni Malinen 
18223a6b92a6SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
18233a6b92a6SJouni Malinen 		goto out;
18243a6b92a6SJouni Malinen 	}
18253a6b92a6SJouni Malinen 
1826772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXExchangeRequest") == 0) {
1827772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 7) < 0)
1828772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
1829772299f1SJouni Malinen 		else
1830772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
1831772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1832772299f1SJouni Malinen 		goto out;
1833772299f1SJouni Malinen 	}
1834772299f1SJouni Malinen 
1835772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXExchangeResponse") == 0) {
1836772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 8) < 0)
1837772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
1838772299f1SJouni Malinen 		else
1839772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
1840772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1841772299f1SJouni Malinen 		goto out;
1842772299f1SJouni Malinen 	}
1843772299f1SJouni Malinen 
1844772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXCRRequest") == 0) {
1845772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 9) < 0)
1846772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
1847772299f1SJouni Malinen 		else
1848772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
1849772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1850772299f1SJouni Malinen 		goto out;
1851772299f1SJouni Malinen 	}
1852772299f1SJouni Malinen 
1853772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "PKEXCRResponse") == 0) {
1854772299f1SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 10) < 0)
1855772299f1SJouni Malinen 			result = "BootstrapResult,Timeout";
1856772299f1SJouni Malinen 		else
1857772299f1SJouni Malinen 			result = "BootstrapResult,Errorsent";
1858772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1859772299f1SJouni Malinen 		goto out;
1860772299f1SJouni Malinen 	}
1861772299f1SJouni Malinen 
18626792ff4dSJouni Malinen 	if (!frametype && strcasecmp(bs, "PKEX") == 0 &&
18636792ff4dSJouni Malinen 	    strcasecmp(auth_role, "Responder") == 0) {
18646792ff4dSJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 10) < 0) {
18656792ff4dSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
18666792ff4dSJouni Malinen 				  "BootstrapResult,Timeout");
18676792ff4dSJouni Malinen 			goto out;
18686792ff4dSJouni Malinen 		}
18696792ff4dSJouni Malinen 	}
18706792ff4dSJouni Malinen 
18716792ff4dSJouni Malinen 	if (!frametype && strcasecmp(bs, "PKEX") == 0 &&
18726792ff4dSJouni Malinen 	    strcasecmp(auth_role, "Initiator") == 0) {
18736792ff4dSJouni Malinen 		if (dpp_wait_tx(dut, ctrl, 0) < 0) {
18746792ff4dSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
18756792ff4dSJouni Malinen 				  "BootstrapResult,Timeout");
18766792ff4dSJouni Malinen 			goto out;
18776792ff4dSJouni Malinen 		}
18786792ff4dSJouni Malinen 	}
18796792ff4dSJouni Malinen 
1880772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "AuthenticationRequest") == 0) {
18819a3415c2SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 0) < 0) {
18829a3415c2SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
18839a3415c2SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
18849a3415c2SJouni Malinen 			goto out;
18859a3415c2SJouni Malinen 		}
18869a3415c2SJouni Malinen 
18879a3415c2SJouni Malinen 		if (dpp_wait_rx(dut, ctrl, 1, 5) < 0)
18889a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,None";
1889b9f1eb9bSDeepak Dhamdhere 		else if	(get_wpa_cli_events(dut, ctrl, auth_events,
1890b9f1eb9bSDeepak Dhamdhere 					    buf, sizeof(buf)) >= 0 &&
1891b9f1eb9bSDeepak Dhamdhere 			 strstr(buf, "DPP-RESPONSE-PENDING") != NULL)
1892b9f1eb9bSDeepak Dhamdhere 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponseWithStatusPending";
1893772299f1SJouni Malinen 		else
18949a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponse";
1895772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1896772299f1SJouni Malinen 		goto out;
1897772299f1SJouni Malinen 	}
1898772299f1SJouni Malinen 
1899772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "AuthenticationResponse") == 0) {
19009a3415c2SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 1) < 0) {
19019a3415c2SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
19029a3415c2SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
19039a3415c2SJouni Malinen 			goto out;
19049a3415c2SJouni Malinen 		}
19059a3415c2SJouni Malinen 
19069a3415c2SJouni Malinen 		if (dpp_wait_rx(dut, ctrl, 2, 5) < 0)
19079a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationRequest";
1908772299f1SJouni Malinen 		else
19099a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationConfirm";
1910772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1911772299f1SJouni Malinen 		goto out;
1912772299f1SJouni Malinen 	}
1913772299f1SJouni Malinen 
19148d88d822SSrinivas Dasari 	if (dpp_process_auth_response(dut, conn, ctrl, auth_events, action_type,
19158d88d822SSrinivas Dasari 				      check_mutual, buf, sizeof(buf)) < 0)
1916bc9e055cSSrinivas Dasari 		goto out;
1917d1e22f76SJouni Malinen 
1918772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "AuthenticationConfirm") == 0) {
19199a3415c2SJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 2) < 0) {
19209a3415c2SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
19219a3415c2SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
19229a3415c2SJouni Malinen 			goto out;
19239a3415c2SJouni Malinen 		}
19249a3415c2SJouni Malinen 
19259a3415c2SJouni Malinen 		if (dpp_wait_rx_conf_req(dut, ctrl, 5) < 0)
19269a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,AuthenticationResponse";
1927772299f1SJouni Malinen 		else
19289a3415c2SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,Errorsent,LastFrameReceived,ConfigurationRequest";
1929772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1930772299f1SJouni Malinen 		goto out;
1931772299f1SJouni Malinen 	}
1932772299f1SJouni Malinen 
1933bc9e055cSSrinivas Dasari 	if (strstr(buf, "DPP-AUTH-DIRECTION")) {
19342e9c8a46SJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, auth_events,
19352e9c8a46SJouni Malinen 					 buf, sizeof(buf));
19362e9c8a46SJouni Malinen 		if (res < 0) {
19372e9c8a46SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
19382e9c8a46SJouni Malinen 				  "BootstrapResult,OK,AuthResult,Timeout");
19392e9c8a46SJouni Malinen 			goto out;
19402e9c8a46SJouni Malinen 		}
1941bc9e055cSSrinivas Dasari 
1942bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP auth result: %s", buf);
19432e9c8a46SJouni Malinen 	}
19442e9c8a46SJouni Malinen 
1945d86e5828SJouni Malinen 	if (strstr(buf, "DPP-NOT-COMPATIBLE")) {
1946d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
1947d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,ROLES_NOT_COMPATIBLE");
1948d86e5828SJouni Malinen 		goto out;
1949d86e5828SJouni Malinen 	}
1950d86e5828SJouni Malinen 
1951d86e5828SJouni Malinen 	if (!strstr(buf, "DPP-AUTH-SUCCESS")) {
1952d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
1953d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,FAILED");
1954d86e5828SJouni Malinen 		goto out;
1955d86e5828SJouni Malinen 	}
1956d86e5828SJouni Malinen 
1957772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "ConfigurationRequest") == 0) {
1958772299f1SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "GAS-QUERY-DONE",
1959772299f1SJouni Malinen 					buf, sizeof(buf));
1960772299f1SJouni Malinen 		if (res < 0)
1961772299f1SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout";
1962772299f1SJouni Malinen 		else
1963772299f1SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Errorsent";
1964772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1965772299f1SJouni Malinen 		goto out;
1966772299f1SJouni Malinen 	}
1967772299f1SJouni Malinen 
1968772299f1SJouni Malinen 	if (frametype && strcasecmp(frametype, "ConfigurationResponse") == 0) {
1969a97b745cSJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conf_events,
1970772299f1SJouni Malinen 					 buf, sizeof(buf));
1971772299f1SJouni Malinen 		if (res < 0)
1972772299f1SJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout";
1973772299f1SJouni Malinen 		else
19749b4f275cSDeepak Dhamdhere 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,Errorsent,LastFrameReceived,ConfigurationRequest";
1975772299f1SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
1976772299f1SJouni Malinen 		goto out;
1977772299f1SJouni Malinen 	}
1978772299f1SJouni Malinen 
1979d86e5828SJouni Malinen 	res = get_wpa_cli_events(dut, ctrl, conf_events, buf, sizeof(buf));
1980d86e5828SJouni Malinen 	if (res < 0) {
1981d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
1982d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,OK,ConfResult,Timeout");
1983d86e5828SJouni Malinen 		goto out;
1984d86e5828SJouni Malinen 	}
1985d86e5828SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP conf result: %s", buf);
1986d86e5828SJouni Malinen 
1987d86e5828SJouni Malinen 	if (!strstr(buf, "DPP-CONF-SENT") &&
1988d86e5828SJouni Malinen 	    !strstr(buf, "DPP-CONF-RECEIVED")) {
1989d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
1990d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,OK,ConfResult,FAILED");
1991d86e5828SJouni Malinen 		goto out;
1992d86e5828SJouni Malinen 	}
1993d86e5828SJouni Malinen 
19949be22eddSJouni Malinen 	if (conn_status && strstr(buf, "DPP-CONF-SENT") &&
19959be22eddSJouni Malinen 	    strstr(buf, "wait_conn_status=1")) {
19969be22eddSJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CONN-STATUS-RESULT",
19979be22eddSJouni Malinen 					buf, sizeof(buf));
19989be22eddSJouni Malinen 		if (res < 0) {
19999be22eddSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
20009be22eddSJouni Malinen 				  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,StatusResult,Timeout");
20019be22eddSJouni Malinen 		} else {
20029be22eddSJouni Malinen 			pos = strstr(buf, "result=");
20039be22eddSJouni Malinen 			if (!pos) {
20049be22eddSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
20059be22eddSJouni Malinen 					  "errorCode,Status result value not reported");
20069be22eddSJouni Malinen 			} else {
20079be22eddSJouni Malinen 				pos += 7;
20089be22eddSJouni Malinen 				snprintf(buf, sizeof(buf),
20099be22eddSJouni Malinen 					 "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,StatusResult,%d",
20109be22eddSJouni Malinen 					 atoi(pos));
20119be22eddSJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE, buf);
20129be22eddSJouni Malinen 			}
20139be22eddSJouni Malinen 		}
20149be22eddSJouni Malinen 		goto out;
20159be22eddSJouni Malinen 	}
20169be22eddSJouni Malinen 
2017a28608abSJouni Malinen 	if (strcasecmp(prov_role, "Enrollee") == 0 && netrole &&
2018a28608abSJouni Malinen 	    strcmp(netrole, "configurator") == 0) {
2019a28608abSJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-CONFIGURATOR-ID",
2020a28608abSJouni Malinen 					buf, sizeof(buf));
2021a28608abSJouni Malinen 		if (res < 0) {
2022a28608abSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
2023a28608abSJouni Malinen 				  "errorCode,No DPP-CONFIGURATOR-ID");
2024a28608abSJouni Malinen 			goto out;
2025a28608abSJouni Malinen 		}
2026a28608abSJouni Malinen 		pos = strchr(buf, ' ');
2027a28608abSJouni Malinen 		if (!pos) {
2028a28608abSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
2029a28608abSJouni Malinen 				  "errorCode,Invalid DPP-CONFIGURATOR-ID");
2030a28608abSJouni Malinen 			goto out;
2031a28608abSJouni Malinen 		}
2032a28608abSJouni Malinen 		pos++;
2033a28608abSJouni Malinen 		dut->dpp_conf_id = atoi(pos);
2034a28608abSJouni Malinen 	} else if (sigma_dut_is_ap(dut) &&
2035d86e5828SJouni Malinen 		   strcasecmp(prov_role, "Enrollee") == 0) {
2036174db64fSJouni Malinen 	update_ap:
2037d86e5828SJouni Malinen 		res = dpp_hostapd_conf_update(dut, conn, ifname, ctrl);
2038d86e5828SJouni Malinen 		if (res == 0)
2039d86e5828SJouni Malinen 			goto out;
2040d86e5828SJouni Malinen 		if (res < 0) {
2041d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR, NULL);
2042d86e5828SJouni Malinen 			goto out;
2043d86e5828SJouni Malinen 		}
2044d86e5828SJouni Malinen 	}
2045d86e5828SJouni Malinen 
2046d86e5828SJouni Malinen 	if (strcasecmp(wait_conn, "Yes") == 0 &&
2047d86e5828SJouni Malinen 	    !sigma_dut_is_ap(dut) &&
2048d86e5828SJouni Malinen 	    strcasecmp(prov_role, "Enrollee") == 0) {
204985a5a2e5SJouni Malinen 		int netw_id;
205085a5a2e5SJouni Malinen 		char *pos;
205185a5a2e5SJouni Malinen 
205285a5a2e5SJouni Malinen 		res = get_wpa_cli_event(dut, ctrl, "DPP-NETWORK-ID",
205385a5a2e5SJouni Malinen 					buf, sizeof(buf));
205485a5a2e5SJouni Malinen 		if (res < 0) {
205585a5a2e5SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
205685a5a2e5SJouni Malinen 				  "errorCode,No DPP-NETWORK-ID");
205785a5a2e5SJouni Malinen 			goto out;
205885a5a2e5SJouni Malinen 		}
205985a5a2e5SJouni Malinen 		pos = strchr(buf, ' ');
206085a5a2e5SJouni Malinen 		if (!pos) {
206185a5a2e5SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
206285a5a2e5SJouni Malinen 				  "errorCode,Invalid DPP-NETWORK-ID");
206385a5a2e5SJouni Malinen 			goto out;
206485a5a2e5SJouni Malinen 		}
206585a5a2e5SJouni Malinen 		pos++;
206685a5a2e5SJouni Malinen 		netw_id = atoi(pos);
206785a5a2e5SJouni Malinen 		snprintf(buf, sizeof(buf), "GET_NETWORK %d key_mgmt", netw_id);
206885a5a2e5SJouni Malinen 		if (wpa_command_resp(ifname, buf, buf, sizeof(buf)) < 0) {
206985a5a2e5SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
207085a5a2e5SJouni Malinen 				  "errorCode,Could not fetch provisioned key_mgmt");
207185a5a2e5SJouni Malinen 			goto out;
207285a5a2e5SJouni Malinen 		}
207385a5a2e5SJouni Malinen 		if (strncmp(buf, "SAE", 3) == 0) {
207485a5a2e5SJouni Malinen 			/* SAE generates PMKSA-CACHE-ADDED event */
207585a5a2e5SJouni Malinen 			not_dpp_akm = 1;
207685a5a2e5SJouni Malinen 		}
2077fbb268d7SJouni Malinen 	wait_connect:
207853558e0fSJouni Malinen 		if (frametype && strcasecmp(frametype,
207953558e0fSJouni Malinen 					    "PeerDiscoveryRequest") == 0) {
208053558e0fSJouni Malinen 			if (dpp_wait_tx_status(dut, ctrl, 5) < 0)
208153558e0fSJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Timeout";
208253558e0fSJouni Malinen 			else
208353558e0fSJouni Malinen 				result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Errorsent";
208453558e0fSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE, result);
208553558e0fSJouni Malinen 			goto out;
208653558e0fSJouni Malinen 		}
208753558e0fSJouni Malinen 
2088d86e5828SJouni Malinen 		res = get_wpa_cli_events(dut, ctrl, conn_events,
2089d86e5828SJouni Malinen 					 buf, sizeof(buf));
2090d86e5828SJouni Malinen 		if (res < 0) {
2091d86e5828SJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
2092d86e5828SJouni Malinen 				  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Timeout,NetworkConnectResult,Timeout");
2093d86e5828SJouni Malinen 			goto out;
2094d86e5828SJouni Malinen 		}
2095d86e5828SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP connect result: %s",
2096d86e5828SJouni Malinen 				buf);
2097d86e5828SJouni Malinen 
2098d86e5828SJouni Malinen 		if (strstr(buf, "PMKSA-CACHE-ADDED")) {
2099d86e5828SJouni Malinen 			res = get_wpa_cli_events(dut, ctrl, conn_events,
2100d86e5828SJouni Malinen 						 buf, sizeof(buf));
2101d86e5828SJouni Malinen 			if (res < 0) {
2102d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
210385a5a2e5SJouni Malinen 					  not_dpp_akm ?
210485a5a2e5SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,Timeout" :
2105d86e5828SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,Timeout");
2106d86e5828SJouni Malinen 				goto out;
2107d86e5828SJouni Malinen 			}
2108d86e5828SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
2109d86e5828SJouni Malinen 					"DPP connect result: %s", buf);
2110d86e5828SJouni Malinen 			if (strstr(buf, "CTRL-EVENT-CONNECTED"))
2111d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
211285a5a2e5SJouni Malinen 					  not_dpp_akm ?
211385a5a2e5SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,OK" :
2114d86e5828SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,OK");
2115d86e5828SJouni Malinen 			else
2116d86e5828SJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE,
211785a5a2e5SJouni Malinen 					  not_dpp_akm ?
211885a5a2e5SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,Timeout" :
2119d86e5828SJouni Malinen 					  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,OK,NetworkConnectResult,Timeout");
2120d86e5828SJouni Malinen 			goto out;
2121d86e5828SJouni Malinen 		}
2122d86e5828SJouni Malinen 
2123d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE,
2124d86e5828SJouni Malinen 			  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkConnectResult,OK");
2125d86e5828SJouni Malinen 		goto out;
2126d86e5828SJouni Malinen 	}
2127d86e5828SJouni Malinen 
212853558e0fSJouni Malinen 	if (strcasecmp(wait_conn, "Yes") == 0 &&
212953558e0fSJouni Malinen 	    frametype && strcasecmp(frametype, "PeerDiscoveryResponse") == 0) {
213053558e0fSJouni Malinen 		if (dpp_wait_tx_status(dut, ctrl, 6) < 0)
213153558e0fSJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Timeout";
213253558e0fSJouni Malinen 		else
213353558e0fSJouni Malinen 			result = "BootstrapResult,OK,AuthResult,OK,ConfResult,OK,NetworkIntroResult,Errorsent";
213453558e0fSJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, result);
213553558e0fSJouni Malinen 		goto out;
213653558e0fSJouni Malinen 	}
213753558e0fSJouni Malinen 
2138d86e5828SJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE,
2139d86e5828SJouni Malinen 		  "BootstrapResult,OK,AuthResult,OK,ConfResult,OK");
2140d86e5828SJouni Malinen out:
2141d86e5828SJouni Malinen 	wpa_ctrl_detach(ctrl);
2142d86e5828SJouni Malinen 	wpa_ctrl_close(ctrl);
2143785afb44SJouni Malinen 	if (tcp && strcasecmp(tcp, "yes") == 0 &&
2144785afb44SJouni Malinen 	    auth_role && strcasecmp(auth_role, "Responder") == 0)
2145785afb44SJouni Malinen 		wpa_command(ifname, "DPP_CONTROLLER_STOP");
2146d86e5828SJouni Malinen 	dut->default_timeout = old_timeout;
2147d86e5828SJouni Malinen 	return 0;
21483aa72861SJouni Malinen err:
21493aa72861SJouni Malinen 	send_resp(dut, conn, SIGMA_ERROR, NULL);
21503aa72861SJouni Malinen 	goto out;
2151d86e5828SJouni Malinen }
2152d86e5828SJouni Malinen 
2153d86e5828SJouni Malinen 
2154bc9e055cSSrinivas Dasari static int dpp_manual_dpp(struct sigma_dut *dut,
2155bc9e055cSSrinivas Dasari 			  struct sigma_conn *conn,
2156bc9e055cSSrinivas Dasari 			  struct sigma_cmd *cmd)
2157bc9e055cSSrinivas Dasari {
2158bc9e055cSSrinivas Dasari 	const char *auth_role = get_param(cmd, "DPPAuthRole");
21592fa651beSpriyadharshini gowthaman 	const char *self_conf = get_param(cmd, "DPPSelfConfigure");
2160bc9e055cSSrinivas Dasari 	int res = -1, success;
2161bc9e055cSSrinivas Dasari 	const char *val;
2162bc9e055cSSrinivas Dasari 	unsigned int old_timeout;
2163bc9e055cSSrinivas Dasari 
2164bc9e055cSSrinivas Dasari 	if (!auth_role) {
2165bc9e055cSSrinivas Dasari 		send_resp(dut, conn, SIGMA_ERROR,
2166bc9e055cSSrinivas Dasari 			  "errorCode,Missing DPPAuthRole");
2167bc9e055cSSrinivas Dasari 		return 0;
2168bc9e055cSSrinivas Dasari 	}
2169bc9e055cSSrinivas Dasari 
21702fa651beSpriyadharshini gowthaman 	if (!self_conf)
21712fa651beSpriyadharshini gowthaman 		self_conf = "no";
21722fa651beSpriyadharshini gowthaman 
2173bc9e055cSSrinivas Dasari 	old_timeout = dut->default_timeout;
2174bc9e055cSSrinivas Dasari 	val = get_param(cmd, "DPPTimeout");
2175bc9e055cSSrinivas Dasari 	if (val && atoi(val) > 0) {
2176bc9e055cSSrinivas Dasari 		dut->default_timeout = atoi(val);
2177bc9e055cSSrinivas Dasari 		sigma_dut_print(dut, DUT_MSG_DEBUG, "DPP timeout: %u",
2178bc9e055cSSrinivas Dasari 				dut->default_timeout);
2179bc9e055cSSrinivas Dasari 	}
2180bc9e055cSSrinivas Dasari 
2181bc9e055cSSrinivas Dasari 	res = dpp_get_local_bootstrap(dut, conn, cmd, 0, &success);
2182bc9e055cSSrinivas Dasari 	if (res || !success)
2183bc9e055cSSrinivas Dasari 		goto out;
2184bc9e055cSSrinivas Dasari 
2185bc9e055cSSrinivas Dasari 	if (strcasecmp(auth_role, "Responder") == 0) {
2186bc9e055cSSrinivas Dasari 		res = dpp_display_own_qrcode(dut);
2187bc9e055cSSrinivas Dasari 		if (res < 0)
2188bc9e055cSSrinivas Dasari 			goto out;
2189bc9e055cSSrinivas Dasari 
2190bc9e055cSSrinivas Dasari 		res = dpp_automatic_dpp(dut, conn, cmd);
2191bc9e055cSSrinivas Dasari 		goto out;
2192bc9e055cSSrinivas Dasari 	}
2193bc9e055cSSrinivas Dasari 
2194bc9e055cSSrinivas Dasari 	if (strcasecmp(auth_role, "Initiator") == 0) {
21952fa651beSpriyadharshini gowthaman 		if (strcasecmp(self_conf, "Yes") != 0) {
2196bc9e055cSSrinivas Dasari 			res = dpp_scan_peer_qrcode(dut);
21971a38cc37SJouni Malinen 			if (res < 0) {
21981a38cc37SJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
21991a38cc37SJouni Malinen 					"errorCode,Failed to scan peer QR Code");
22001a38cc37SJouni Malinen 				res = 0;
2201bc9e055cSSrinivas Dasari 				goto out;
22021a38cc37SJouni Malinen 			}
22032fa651beSpriyadharshini gowthaman 		}
2204bc9e055cSSrinivas Dasari 
2205bc9e055cSSrinivas Dasari 		res = dpp_automatic_dpp(dut, conn, cmd);
2206bc9e055cSSrinivas Dasari 		goto out;
2207bc9e055cSSrinivas Dasari 	}
2208bc9e055cSSrinivas Dasari 
2209bc9e055cSSrinivas Dasari 	send_resp(dut, conn, SIGMA_ERROR, "errorCode,Unknown DPPAuthRole");
2210bc9e055cSSrinivas Dasari 	res = 0;
2211bc9e055cSSrinivas Dasari out:
2212bc9e055cSSrinivas Dasari 	dut->default_timeout = old_timeout;
2213bc9e055cSSrinivas Dasari 	return res;
2214bc9e055cSSrinivas Dasari }
2215bc9e055cSSrinivas Dasari 
2216bc9e055cSSrinivas Dasari 
2217d86e5828SJouni Malinen int dpp_dev_exec_action(struct sigma_dut *dut, struct sigma_conn *conn,
2218d86e5828SJouni Malinen 			struct sigma_cmd *cmd)
2219d86e5828SJouni Malinen {
2220d86e5828SJouni Malinen 	const char *type = get_param(cmd, "DPPActionType");
2221d86e5828SJouni Malinen 	const char *bs = get_param(cmd, "DPPBS");
2222d86e5828SJouni Malinen 
2223d86e5828SJouni Malinen 	if (!bs) {
2224d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
2225d86e5828SJouni Malinen 			  "errorCode,Missing DPPBS");
2226d86e5828SJouni Malinen 		return 0;
2227d86e5828SJouni Malinen 	}
2228d86e5828SJouni Malinen 
2229d86e5828SJouni Malinen 	if (!type) {
2230d86e5828SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
2231d86e5828SJouni Malinen 			  "errorCode,Missing DPPActionType");
2232d86e5828SJouni Malinen 		return 0;
2233d86e5828SJouni Malinen 	}
2234d86e5828SJouni Malinen 
2235d86e5828SJouni Malinen 	if (strcasecmp(type, "GetLocalBootstrap") == 0)
2236bc9e055cSSrinivas Dasari 		return dpp_get_local_bootstrap(dut, conn, cmd, 1, NULL);
2237d86e5828SJouni Malinen 	if (strcasecmp(type, "SetPeerBootstrap") == 0)
2238d86e5828SJouni Malinen 		return dpp_set_peer_bootstrap(dut, conn, cmd);
2239d86e5828SJouni Malinen 	if (strcasecmp(type, "ManualDPP") == 0)
2240d86e5828SJouni Malinen 		return dpp_manual_dpp(dut, conn, cmd);
2241d86e5828SJouni Malinen 	if (strcasecmp(type, "AutomaticDPP") == 0)
2242d86e5828SJouni Malinen 		return dpp_automatic_dpp(dut, conn, cmd);
2243d86e5828SJouni Malinen 
2244d86e5828SJouni Malinen 	send_resp(dut, conn, SIGMA_ERROR,
2245d86e5828SJouni Malinen 		  "errorCode,Unsupported DPPActionType");
2246d86e5828SJouni Malinen 	return 0;
2247d86e5828SJouni Malinen }
2248