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