1 /* 2 * WPA Supplicant / Configuration backend: text file 3 * Copyright (c) 2003-2019, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 * 8 * This file implements a configuration backend for text files. All the 9 * configuration information is stored in a text file that uses a format 10 * described in the sample configuration file, wpa_supplicant.conf. 11 */ 12 13 #include "includes.h" 14 #ifdef ANDROID 15 #include <sys/stat.h> 16 #endif /* ANDROID */ 17 18 #include "common.h" 19 #include "config.h" 20 #include "base64.h" 21 #include "uuid.h" 22 #include "common/ieee802_1x_defs.h" 23 #include "p2p/p2p.h" 24 #include "eap_peer/eap_methods.h" 25 #include "eap_peer/eap.h" 26 #include "utils/config.h" 27 28 29 static int wpa_config_validate_network(struct wpa_ssid *ssid, int line) 30 { 31 int errors = 0; 32 33 if (ssid->passphrase) { 34 if (ssid->psk_set) { 35 wpa_printf(MSG_ERROR, "Line %d: both PSK and " 36 "passphrase configured.", line); 37 errors++; 38 } 39 wpa_config_update_psk(ssid); 40 } 41 42 if (ssid->disabled == 2) 43 ssid->p2p_persistent_group = 1; 44 45 if ((ssid->group_cipher & WPA_CIPHER_CCMP) && 46 !(ssid->pairwise_cipher & (WPA_CIPHER_CCMP | WPA_CIPHER_CCMP_256 | 47 WPA_CIPHER_GCMP | WPA_CIPHER_GCMP_256 | 48 WPA_CIPHER_NONE))) { 49 /* Group cipher cannot be stronger than the pairwise cipher. */ 50 wpa_printf(MSG_DEBUG, "Line %d: removed CCMP from group cipher" 51 " list since it was not allowed for pairwise " 52 "cipher", line); 53 ssid->group_cipher &= ~WPA_CIPHER_CCMP; 54 } 55 56 if (is_6ghz_freq(ssid->frequency) && ssid->mode == WPAS_MODE_MESH && 57 ssid->key_mgmt == WPA_KEY_MGMT_NONE) { 58 wpa_printf(MSG_ERROR, 59 "Line %d: key_mgmt for mesh network in 6 GHz should be SAE", 60 line); 61 errors++; 62 } 63 if (ssid->mode == WPAS_MODE_MESH && 64 (ssid->key_mgmt != WPA_KEY_MGMT_NONE && 65 ssid->key_mgmt != WPA_KEY_MGMT_SAE)) { 66 wpa_printf(MSG_ERROR, 67 "Line %d: key_mgmt for mesh network should be open or SAE", 68 line); 69 errors++; 70 } 71 72 #ifdef CONFIG_OCV 73 if (ssid->ocv && ssid->ieee80211w == NO_MGMT_FRAME_PROTECTION) { 74 wpa_printf(MSG_ERROR, 75 "Line %d: PMF needs to be enabled whenever using OCV", 76 line); 77 errors++; 78 } 79 #endif /* CONFIG_OCV */ 80 81 return errors; 82 } 83 84 85 static struct wpa_ssid * wpa_config_read_network(FILE *f, int *line, int id) 86 { 87 struct wpa_ssid *ssid; 88 int errors = 0, end = 0; 89 char buf[2000], *pos, *pos2; 90 91 wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new network block", 92 *line); 93 ssid = os_zalloc(sizeof(*ssid)); 94 if (ssid == NULL) 95 return NULL; 96 dl_list_init(&ssid->psk_list); 97 ssid->id = id; 98 99 wpa_config_set_network_defaults(ssid); 100 101 while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 102 if (os_strcmp(pos, "}") == 0) { 103 end = 1; 104 break; 105 } 106 107 pos2 = os_strchr(pos, '='); 108 if (pos2 == NULL) { 109 wpa_printf(MSG_ERROR, "Line %d: Invalid SSID line " 110 "'%s'.", *line, pos); 111 errors++; 112 continue; 113 } 114 115 *pos2++ = '\0'; 116 if (*pos2 == '"') { 117 if (os_strchr(pos2 + 1, '"') == NULL) { 118 wpa_printf(MSG_ERROR, "Line %d: invalid " 119 "quotation '%s'.", *line, pos2); 120 errors++; 121 continue; 122 } 123 } 124 125 if (wpa_config_set(ssid, pos, pos2, *line) < 0) { 126 #ifndef CONFIG_WEP 127 if (os_strcmp(pos, "wep_key0") == 0 || 128 os_strcmp(pos, "wep_key1") == 0 || 129 os_strcmp(pos, "wep_key2") == 0 || 130 os_strcmp(pos, "wep_key3") == 0 || 131 os_strcmp(pos, "wep_tx_keyidx") == 0) { 132 wpa_printf(MSG_ERROR, 133 "Line %d: unsupported WEP parameter", 134 *line); 135 ssid->disabled = 1; 136 continue; 137 } 138 #endif /* CONFIG_WEP */ 139 errors++; 140 } 141 } 142 143 if (!end) { 144 wpa_printf(MSG_ERROR, "Line %d: network block was not " 145 "terminated properly.", *line); 146 errors++; 147 } 148 149 errors += wpa_config_validate_network(ssid, *line); 150 151 if (errors) { 152 wpa_config_free_ssid(ssid); 153 ssid = NULL; 154 } 155 156 return ssid; 157 } 158 159 160 static struct wpa_cred * wpa_config_read_cred(FILE *f, int *line, int id) 161 { 162 struct wpa_cred *cred; 163 int errors = 0, end = 0; 164 char buf[256], *pos, *pos2; 165 166 wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new cred block", *line); 167 cred = os_zalloc(sizeof(*cred)); 168 if (cred == NULL) 169 return NULL; 170 cred->id = id; 171 cred->sim_num = DEFAULT_USER_SELECTED_SIM; 172 173 while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 174 if (os_strcmp(pos, "}") == 0) { 175 end = 1; 176 break; 177 } 178 179 pos2 = os_strchr(pos, '='); 180 if (pos2 == NULL) { 181 wpa_printf(MSG_ERROR, "Line %d: Invalid cred line " 182 "'%s'.", *line, pos); 183 errors++; 184 continue; 185 } 186 187 *pos2++ = '\0'; 188 if (*pos2 == '"') { 189 if (os_strchr(pos2 + 1, '"') == NULL) { 190 wpa_printf(MSG_ERROR, "Line %d: invalid " 191 "quotation '%s'.", *line, pos2); 192 errors++; 193 continue; 194 } 195 } 196 197 if (wpa_config_set_cred(cred, pos, pos2, *line) < 0) 198 errors++; 199 } 200 201 if (!end) { 202 wpa_printf(MSG_ERROR, "Line %d: cred block was not " 203 "terminated properly.", *line); 204 errors++; 205 } 206 207 if (errors) { 208 wpa_config_free_cred(cred); 209 cred = NULL; 210 } 211 212 return cred; 213 } 214 215 216 #ifndef CONFIG_NO_CONFIG_BLOBS 217 static struct wpa_config_blob * wpa_config_read_blob(FILE *f, int *line, 218 const char *name) 219 { 220 struct wpa_config_blob *blob; 221 char buf[256], *pos; 222 char *encoded = NULL, *nencoded; 223 int end = 0; 224 size_t encoded_len = 0, len; 225 226 wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new named blob '%s'", 227 *line, name); 228 229 while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 230 if (os_strcmp(pos, "}") == 0) { 231 end = 1; 232 break; 233 } 234 235 len = os_strlen(pos); 236 nencoded = os_realloc(encoded, encoded_len + len); 237 if (nencoded == NULL) { 238 wpa_printf(MSG_ERROR, "Line %d: not enough memory for " 239 "blob", *line); 240 os_free(encoded); 241 return NULL; 242 } 243 encoded = nencoded; 244 os_memcpy(encoded + encoded_len, pos, len); 245 encoded_len += len; 246 } 247 248 if (!end || !encoded) { 249 wpa_printf(MSG_ERROR, "Line %d: blob was not terminated " 250 "properly", *line); 251 os_free(encoded); 252 return NULL; 253 } 254 255 blob = os_zalloc(sizeof(*blob)); 256 if (blob == NULL) { 257 os_free(encoded); 258 return NULL; 259 } 260 blob->name = os_strdup(name); 261 blob->data = base64_decode(encoded, encoded_len, &blob->len); 262 os_free(encoded); 263 264 if (blob->name == NULL || blob->data == NULL) { 265 wpa_config_free_blob(blob); 266 return NULL; 267 } 268 269 return blob; 270 } 271 272 273 static int wpa_config_process_blob(struct wpa_config *config, FILE *f, 274 int *line, char *bname) 275 { 276 char *name_end; 277 struct wpa_config_blob *blob; 278 279 name_end = os_strchr(bname, '='); 280 if (name_end == NULL) { 281 wpa_printf(MSG_ERROR, "Line %d: no blob name terminator", 282 *line); 283 return -1; 284 } 285 *name_end = '\0'; 286 287 blob = wpa_config_read_blob(f, line, bname); 288 if (blob == NULL) { 289 wpa_printf(MSG_ERROR, "Line %d: failed to read blob %s", 290 *line, bname); 291 return -1; 292 } 293 wpa_config_set_blob(config, blob); 294 return 0; 295 } 296 #endif /* CONFIG_NO_CONFIG_BLOBS */ 297 298 299 struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp, 300 bool ro) 301 { 302 FILE *f; 303 char buf[512], *pos; 304 int errors = 0, line = 0; 305 struct wpa_ssid *ssid, *tail, *head; 306 struct wpa_cred *cred, *cred_tail, *cred_head; 307 struct wpa_config *config; 308 static int id = 0; 309 static int cred_id = 0; 310 311 if (name == NULL) 312 return NULL; 313 if (cfgp) 314 config = cfgp; 315 else 316 config = wpa_config_alloc_empty(NULL, NULL); 317 if (config == NULL) { 318 wpa_printf(MSG_ERROR, "Failed to allocate config file " 319 "structure"); 320 return NULL; 321 } 322 tail = head = config->ssid; 323 while (tail && tail->next) 324 tail = tail->next; 325 cred_tail = cred_head = config->cred; 326 while (cred_tail && cred_tail->next) 327 cred_tail = cred_tail->next; 328 329 wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name); 330 f = fopen(name, "r"); 331 if (f == NULL) { 332 wpa_printf(MSG_ERROR, "Failed to open config file '%s', " 333 "error: %s", name, strerror(errno)); 334 if (config != cfgp) 335 os_free(config); 336 return NULL; 337 } 338 339 while (wpa_config_get_line(buf, sizeof(buf), f, &line, &pos)) { 340 if (os_strcmp(pos, "network={") == 0) { 341 ssid = wpa_config_read_network(f, &line, id++); 342 if (ssid == NULL) { 343 wpa_printf(MSG_ERROR, "Line %d: failed to " 344 "parse network block.", line); 345 errors++; 346 continue; 347 } 348 ssid->ro = ro; 349 if (head == NULL) { 350 head = tail = ssid; 351 } else { 352 tail->next = ssid; 353 tail = ssid; 354 } 355 if (wpa_config_add_prio_network(config, ssid)) { 356 wpa_printf(MSG_ERROR, "Line %d: failed to add " 357 "network block to priority list.", 358 line); 359 errors++; 360 continue; 361 } 362 } else if (os_strcmp(pos, "cred={") == 0) { 363 cred = wpa_config_read_cred(f, &line, cred_id++); 364 if (cred == NULL) { 365 wpa_printf(MSG_ERROR, "Line %d: failed to " 366 "parse cred block.", line); 367 errors++; 368 continue; 369 } 370 if (cred_head == NULL) { 371 cred_head = cred_tail = cred; 372 } else { 373 cred_tail->next = cred; 374 cred_tail = cred; 375 } 376 #ifndef CONFIG_NO_CONFIG_BLOBS 377 } else if (os_strncmp(pos, "blob-base64-", 12) == 0) { 378 if (wpa_config_process_blob(config, f, &line, pos + 12) 379 < 0) { 380 wpa_printf(MSG_ERROR, "Line %d: failed to " 381 "process blob.", line); 382 errors++; 383 continue; 384 } 385 #endif /* CONFIG_NO_CONFIG_BLOBS */ 386 } else if (wpa_config_process_global(config, pos, line) < 0) { 387 wpa_printf(MSG_ERROR, "Line %d: Invalid configuration " 388 "line '%s'.", line, pos); 389 errors++; 390 continue; 391 } 392 } 393 394 fclose(f); 395 396 config->ssid = head; 397 wpa_config_debug_dump_networks(config); 398 config->cred = cred_head; 399 400 #ifndef WPA_IGNORE_CONFIG_ERRORS 401 if (errors) { 402 if (config != cfgp) 403 wpa_config_free(config); 404 config = NULL; 405 head = NULL; 406 } 407 #endif /* WPA_IGNORE_CONFIG_ERRORS */ 408 409 return config; 410 } 411 412 413 #ifndef CONFIG_NO_CONFIG_WRITE 414 415 static void write_str(FILE *f, const char *field, struct wpa_ssid *ssid) 416 { 417 char *value = wpa_config_get(ssid, field); 418 if (value == NULL) 419 return; 420 fprintf(f, "\t%s=%s\n", field, value); 421 str_clear_free(value); 422 } 423 424 425 static void write_int(FILE *f, const char *field, int value, int def) 426 { 427 if (value == def) 428 return; 429 fprintf(f, "\t%s=%d\n", field, value); 430 } 431 432 433 static void write_bssid(FILE *f, struct wpa_ssid *ssid) 434 { 435 char *value = wpa_config_get(ssid, "bssid"); 436 if (value == NULL) 437 return; 438 fprintf(f, "\tbssid=%s\n", value); 439 os_free(value); 440 } 441 442 443 static void write_bssid_hint(FILE *f, struct wpa_ssid *ssid) 444 { 445 char *value = wpa_config_get(ssid, "bssid_hint"); 446 447 if (!value) 448 return; 449 fprintf(f, "\tbssid_hint=%s\n", value); 450 os_free(value); 451 } 452 453 454 static void write_psk(FILE *f, struct wpa_ssid *ssid) 455 { 456 char *value; 457 458 if (ssid->mem_only_psk) 459 return; 460 461 value = wpa_config_get(ssid, "psk"); 462 if (value == NULL) 463 return; 464 fprintf(f, "\tpsk=%s\n", value); 465 os_free(value); 466 } 467 468 469 static void write_proto(FILE *f, struct wpa_ssid *ssid) 470 { 471 char *value; 472 473 if (ssid->proto == DEFAULT_PROTO) 474 return; 475 476 value = wpa_config_get(ssid, "proto"); 477 if (value == NULL) 478 return; 479 if (value[0]) 480 fprintf(f, "\tproto=%s\n", value); 481 os_free(value); 482 } 483 484 485 static void write_key_mgmt(FILE *f, struct wpa_ssid *ssid) 486 { 487 char *value; 488 489 if (ssid->key_mgmt == DEFAULT_KEY_MGMT) 490 return; 491 492 value = wpa_config_get(ssid, "key_mgmt"); 493 if (value == NULL) 494 return; 495 if (value[0]) 496 fprintf(f, "\tkey_mgmt=%s\n", value); 497 os_free(value); 498 } 499 500 501 static void write_pairwise(FILE *f, struct wpa_ssid *ssid) 502 { 503 char *value; 504 505 if (ssid->pairwise_cipher == DEFAULT_PAIRWISE) 506 return; 507 508 value = wpa_config_get(ssid, "pairwise"); 509 if (value == NULL) 510 return; 511 if (value[0]) 512 fprintf(f, "\tpairwise=%s\n", value); 513 os_free(value); 514 } 515 516 517 static void write_group(FILE *f, struct wpa_ssid *ssid) 518 { 519 char *value; 520 521 if (ssid->group_cipher == DEFAULT_GROUP) 522 return; 523 524 value = wpa_config_get(ssid, "group"); 525 if (value == NULL) 526 return; 527 if (value[0]) 528 fprintf(f, "\tgroup=%s\n", value); 529 os_free(value); 530 } 531 532 533 static void write_group_mgmt(FILE *f, struct wpa_ssid *ssid) 534 { 535 char *value; 536 537 if (!ssid->group_mgmt_cipher) 538 return; 539 540 value = wpa_config_get(ssid, "group_mgmt"); 541 if (!value) 542 return; 543 if (value[0]) 544 fprintf(f, "\tgroup_mgmt=%s\n", value); 545 os_free(value); 546 } 547 548 549 static void write_auth_alg(FILE *f, struct wpa_ssid *ssid) 550 { 551 char *value; 552 553 if (ssid->auth_alg == 0) 554 return; 555 556 value = wpa_config_get(ssid, "auth_alg"); 557 if (value == NULL) 558 return; 559 if (value[0]) 560 fprintf(f, "\tauth_alg=%s\n", value); 561 os_free(value); 562 } 563 564 565 #ifdef IEEE8021X_EAPOL 566 static void write_eap(FILE *f, struct wpa_ssid *ssid) 567 { 568 char *value; 569 570 value = wpa_config_get(ssid, "eap"); 571 if (value == NULL) 572 return; 573 574 if (value[0]) 575 fprintf(f, "\teap=%s\n", value); 576 os_free(value); 577 } 578 #endif /* IEEE8021X_EAPOL */ 579 580 581 #ifdef CONFIG_WEP 582 static void write_wep_key(FILE *f, int idx, struct wpa_ssid *ssid) 583 { 584 char field[20], *value; 585 int res; 586 587 res = os_snprintf(field, sizeof(field), "wep_key%d", idx); 588 if (os_snprintf_error(sizeof(field), res)) 589 return; 590 value = wpa_config_get(ssid, field); 591 if (value) { 592 fprintf(f, "\t%s=%s\n", field, value); 593 os_free(value); 594 } 595 } 596 #endif /* CONFIG_WEP */ 597 598 599 #ifdef CONFIG_P2P 600 601 static void write_go_p2p_dev_addr(FILE *f, struct wpa_ssid *ssid) 602 { 603 char *value = wpa_config_get(ssid, "go_p2p_dev_addr"); 604 if (value == NULL) 605 return; 606 fprintf(f, "\tgo_p2p_dev_addr=%s\n", value); 607 os_free(value); 608 } 609 610 static void write_p2p_client_list(FILE *f, struct wpa_ssid *ssid) 611 { 612 char *value = wpa_config_get(ssid, "p2p_client_list"); 613 if (value == NULL) 614 return; 615 fprintf(f, "\tp2p_client_list=%s\n", value); 616 os_free(value); 617 } 618 619 620 static void write_psk_list(FILE *f, struct wpa_ssid *ssid) 621 { 622 struct psk_list_entry *psk; 623 char hex[32 * 2 + 1]; 624 625 dl_list_for_each(psk, &ssid->psk_list, struct psk_list_entry, list) { 626 wpa_snprintf_hex(hex, sizeof(hex), psk->psk, sizeof(psk->psk)); 627 fprintf(f, "\tpsk_list=%s" MACSTR "-%s\n", 628 psk->p2p ? "P2P-" : "", MAC2STR(psk->addr), hex); 629 } 630 } 631 632 #endif /* CONFIG_P2P */ 633 634 635 #ifdef CONFIG_MACSEC 636 637 static void write_mka_cak(FILE *f, struct wpa_ssid *ssid) 638 { 639 char *value; 640 641 if (!(ssid->mka_psk_set & MKA_PSK_SET_CAK)) 642 return; 643 644 value = wpa_config_get(ssid, "mka_cak"); 645 if (!value) 646 return; 647 fprintf(f, "\tmka_cak=%s\n", value); 648 os_free(value); 649 } 650 651 652 static void write_mka_ckn(FILE *f, struct wpa_ssid *ssid) 653 { 654 char *value; 655 656 if (!(ssid->mka_psk_set & MKA_PSK_SET_CKN)) 657 return; 658 659 value = wpa_config_get(ssid, "mka_ckn"); 660 if (!value) 661 return; 662 fprintf(f, "\tmka_ckn=%s\n", value); 663 os_free(value); 664 } 665 666 #endif /* CONFIG_MACSEC */ 667 668 669 static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid) 670 { 671 #define STR(t) write_str(f, #t, ssid) 672 #define INT(t) write_int(f, #t, ssid->t, 0) 673 #define INTe(t, m) write_int(f, #t, ssid->eap.m, 0) 674 #define INT_DEF(t, def) write_int(f, #t, ssid->t, def) 675 #define INT_DEFe(t, m, def) write_int(f, #t, ssid->eap.m, def) 676 677 STR(ssid); 678 INT(scan_ssid); 679 write_bssid(f, ssid); 680 write_bssid_hint(f, ssid); 681 write_str(f, "bssid_ignore", ssid); 682 write_str(f, "bssid_accept", ssid); 683 write_psk(f, ssid); 684 INT(mem_only_psk); 685 STR(sae_password); 686 STR(sae_password_id); 687 write_int(f, "sae_pwe", ssid->sae_pwe, DEFAULT_SAE_PWE); 688 write_proto(f, ssid); 689 write_key_mgmt(f, ssid); 690 INT_DEF(bg_scan_period, DEFAULT_BG_SCAN_PERIOD); 691 write_pairwise(f, ssid); 692 write_group(f, ssid); 693 write_group_mgmt(f, ssid); 694 write_auth_alg(f, ssid); 695 STR(bgscan); 696 STR(autoscan); 697 STR(scan_freq); 698 #ifdef IEEE8021X_EAPOL 699 write_eap(f, ssid); 700 STR(identity); 701 STR(anonymous_identity); 702 STR(imsi_identity); 703 STR(machine_identity); 704 STR(password); 705 STR(machine_password); 706 STR(ca_cert); 707 STR(ca_path); 708 STR(client_cert); 709 STR(private_key); 710 STR(private_key_passwd); 711 STR(subject_match); 712 STR(check_cert_subject); 713 STR(altsubject_match); 714 STR(domain_suffix_match); 715 STR(domain_match); 716 STR(ca_cert2); 717 STR(ca_path2); 718 STR(client_cert2); 719 STR(private_key2); 720 STR(private_key2_passwd); 721 STR(subject_match2); 722 STR(check_cert_subject2); 723 STR(altsubject_match2); 724 STR(domain_suffix_match2); 725 STR(domain_match2); 726 STR(machine_ca_cert); 727 STR(machine_ca_path); 728 STR(machine_client_cert); 729 STR(machine_private_key); 730 STR(machine_private_key_passwd); 731 STR(machine_subject_match); 732 STR(machine_check_cert_subject); 733 STR(machine_altsubject_match); 734 STR(machine_domain_suffix_match); 735 STR(machine_domain_match); 736 STR(phase1); 737 STR(phase2); 738 STR(machine_phase2); 739 STR(pcsc); 740 STR(pin); 741 STR(engine_id); 742 STR(key_id); 743 STR(cert_id); 744 STR(ca_cert_id); 745 STR(key2_id); 746 STR(pin2); 747 STR(engine2_id); 748 STR(cert2_id); 749 STR(ca_cert2_id); 750 INTe(engine, cert.engine); 751 INTe(engine2, phase2_cert.engine); 752 INTe(machine_engine, machine_cert.engine); 753 INT_DEF(eapol_flags, DEFAULT_EAPOL_FLAGS); 754 STR(openssl_ciphers); 755 INTe(erp, erp); 756 #endif /* IEEE8021X_EAPOL */ 757 #ifdef CONFIG_WEP 758 { 759 int i; 760 761 for (i = 0; i < 4; i++) 762 write_wep_key(f, i, ssid); 763 INT(wep_tx_keyidx); 764 } 765 #endif /* CONFIG_WEP */ 766 INT(priority); 767 #ifdef IEEE8021X_EAPOL 768 INT_DEF(eap_workaround, DEFAULT_EAP_WORKAROUND); 769 STR(pac_file); 770 INT_DEFe(fragment_size, fragment_size, DEFAULT_FRAGMENT_SIZE); 771 INTe(ocsp, cert.ocsp); 772 INTe(ocsp2, phase2_cert.ocsp); 773 INTe(machine_ocsp, machine_cert.ocsp); 774 INT_DEFe(sim_num, sim_num, DEFAULT_USER_SELECTED_SIM); 775 #endif /* IEEE8021X_EAPOL */ 776 INT(mode); 777 INT(no_auto_peer); 778 INT(mesh_fwding); 779 INT(frequency); 780 INT(enable_edmg); 781 INT(edmg_channel); 782 INT(fixed_freq); 783 #ifdef CONFIG_ACS 784 INT(acs); 785 #endif /* CONFIG_ACS */ 786 write_int(f, "proactive_key_caching", ssid->proactive_key_caching, -1); 787 INT(disabled); 788 INT(mixed_cell); 789 INT_DEF(vht, 1); 790 INT_DEF(ht, 1); 791 INT(ht40); 792 INT_DEF(he, 1); 793 INT_DEF(max_oper_chwidth, DEFAULT_MAX_OPER_CHWIDTH); 794 INT(vht_center_freq1); 795 INT(vht_center_freq2); 796 INT(pbss); 797 INT(wps_disabled); 798 INT(fils_dh_group); 799 write_int(f, "ieee80211w", ssid->ieee80211w, 800 MGMT_FRAME_PROTECTION_DEFAULT); 801 STR(id_str); 802 #ifdef CONFIG_P2P 803 write_go_p2p_dev_addr(f, ssid); 804 write_p2p_client_list(f, ssid); 805 write_psk_list(f, ssid); 806 #endif /* CONFIG_P2P */ 807 INT(ap_max_inactivity); 808 INT(dtim_period); 809 INT(beacon_int); 810 #ifdef CONFIG_MACSEC 811 INT(macsec_policy); 812 write_mka_cak(f, ssid); 813 write_mka_ckn(f, ssid); 814 INT(macsec_integ_only); 815 INT(macsec_replay_protect); 816 INT(macsec_replay_window); 817 INT(macsec_offload); 818 INT(macsec_port); 819 INT_DEF(mka_priority, DEFAULT_PRIO_NOT_KEY_SERVER); 820 INT(macsec_csindex); 821 #endif /* CONFIG_MACSEC */ 822 #ifdef CONFIG_HS20 823 INT(update_identifier); 824 STR(roaming_consortium_selection); 825 #endif /* CONFIG_HS20 */ 826 write_int(f, "mac_addr", ssid->mac_addr, -1); 827 #ifdef CONFIG_MESH 828 STR(mesh_basic_rates); 829 INT_DEF(dot11MeshMaxRetries, DEFAULT_MESH_MAX_RETRIES); 830 INT_DEF(dot11MeshRetryTimeout, DEFAULT_MESH_RETRY_TIMEOUT); 831 INT_DEF(dot11MeshConfirmTimeout, DEFAULT_MESH_CONFIRM_TIMEOUT); 832 INT_DEF(dot11MeshHoldingTimeout, DEFAULT_MESH_HOLDING_TIMEOUT); 833 INT_DEF(mesh_rssi_threshold, DEFAULT_MESH_RSSI_THRESHOLD); 834 #endif /* CONFIG_MESH */ 835 INT(wpa_ptk_rekey); 836 INT(wpa_deny_ptk0_rekey); 837 INT(group_rekey); 838 INT(ignore_broadcast_ssid); 839 #ifdef CONFIG_DPP 840 STR(dpp_connector); 841 STR(dpp_netaccesskey); 842 INT(dpp_netaccesskey_expiry); 843 STR(dpp_csign); 844 STR(dpp_pp_key); 845 INT(dpp_pfs); 846 INT(dpp_connector_privacy); 847 #endif /* CONFIG_DPP */ 848 INT(owe_group); 849 INT(owe_only); 850 INT(owe_ptk_workaround); 851 INT(multi_ap_backhaul_sta); 852 INT(ft_eap_pmksa_caching); 853 INT(multi_ap_profile); 854 INT(beacon_prot); 855 INT(transition_disable); 856 INT(sae_pk); 857 #ifdef CONFIG_HT_OVERRIDES 858 INT_DEF(disable_ht, DEFAULT_DISABLE_HT); 859 INT_DEF(disable_ht40, DEFAULT_DISABLE_HT40); 860 INT_DEF(disable_sgi, DEFAULT_DISABLE_SGI); 861 INT_DEF(disable_ldpc, DEFAULT_DISABLE_LDPC); 862 INT(ht40_intolerant); 863 INT_DEF(tx_stbc, DEFAULT_TX_STBC); 864 INT_DEF(rx_stbc, DEFAULT_RX_STBC); 865 INT_DEF(disable_max_amsdu, DEFAULT_DISABLE_MAX_AMSDU); 866 INT_DEF(ampdu_factor, DEFAULT_AMPDU_FACTOR); 867 INT_DEF(ampdu_density, DEFAULT_AMPDU_DENSITY); 868 STR(ht_mcs); 869 #endif /* CONFIG_HT_OVERRIDES */ 870 #ifdef CONFIG_VHT_OVERRIDES 871 INT(disable_vht); 872 INT(vht_capa); 873 INT(vht_capa_mask); 874 INT_DEF(vht_rx_mcs_nss_1, -1); 875 INT_DEF(vht_rx_mcs_nss_2, -1); 876 INT_DEF(vht_rx_mcs_nss_3, -1); 877 INT_DEF(vht_rx_mcs_nss_4, -1); 878 INT_DEF(vht_rx_mcs_nss_5, -1); 879 INT_DEF(vht_rx_mcs_nss_6, -1); 880 INT_DEF(vht_rx_mcs_nss_7, -1); 881 INT_DEF(vht_rx_mcs_nss_8, -1); 882 INT_DEF(vht_tx_mcs_nss_1, -1); 883 INT_DEF(vht_tx_mcs_nss_2, -1); 884 INT_DEF(vht_tx_mcs_nss_3, -1); 885 INT_DEF(vht_tx_mcs_nss_4, -1); 886 INT_DEF(vht_tx_mcs_nss_5, -1); 887 INT_DEF(vht_tx_mcs_nss_6, -1); 888 INT_DEF(vht_tx_mcs_nss_7, -1); 889 INT_DEF(vht_tx_mcs_nss_8, -1); 890 #endif /* CONFIG_VHT_OVERRIDES */ 891 #ifdef CONFIG_HE_OVERRIDES 892 INT(disable_he); 893 #endif /* CONFIG_HE_OVERRIDES */ 894 INT(disable_eht); 895 INT(enable_4addr_mode); 896 INT(max_idle); 897 INT(ssid_protection); 898 899 #undef STR 900 #undef INT 901 #undef INT_DEF 902 } 903 904 905 static void wpa_config_write_cred(FILE *f, struct wpa_cred *cred) 906 { 907 size_t i; 908 909 if (cred->priority) 910 fprintf(f, "\tpriority=%d\n", cred->priority); 911 if (cred->pcsc) 912 fprintf(f, "\tpcsc=%d\n", cred->pcsc); 913 if (cred->realm) 914 fprintf(f, "\trealm=\"%s\"\n", cred->realm); 915 if (cred->username) 916 fprintf(f, "\tusername=\"%s\"\n", cred->username); 917 if (cred->password && cred->ext_password) 918 fprintf(f, "\tpassword=ext:%s\n", cred->password); 919 else if (cred->password) 920 fprintf(f, "\tpassword=\"%s\"\n", cred->password); 921 if (cred->ca_cert) 922 fprintf(f, "\tca_cert=\"%s\"\n", cred->ca_cert); 923 if (cred->client_cert) 924 fprintf(f, "\tclient_cert=\"%s\"\n", cred->client_cert); 925 if (cred->private_key) 926 fprintf(f, "\tprivate_key=\"%s\"\n", cred->private_key); 927 if (cred->private_key_passwd) 928 fprintf(f, "\tprivate_key_passwd=\"%s\"\n", 929 cred->private_key_passwd); 930 if (cred->imsi) 931 fprintf(f, "\timsi=\"%s\"\n", cred->imsi); 932 if (cred->milenage) 933 fprintf(f, "\tmilenage=\"%s\"\n", cred->milenage); 934 for (i = 0; i < cred->num_domain; i++) 935 fprintf(f, "\tdomain=\"%s\"\n", cred->domain[i]); 936 if (cred->domain_suffix_match) 937 fprintf(f, "\tdomain_suffix_match=\"%s\"\n", 938 cred->domain_suffix_match); 939 if (cred->eap_method) { 940 const char *name; 941 name = eap_get_name(cred->eap_method[0].vendor, 942 cred->eap_method[0].method); 943 if (name) 944 fprintf(f, "\teap=%s\n", name); 945 } 946 if (cred->phase1) 947 fprintf(f, "\tphase1=\"%s\"\n", cred->phase1); 948 if (cred->phase2) 949 fprintf(f, "\tphase2=\"%s\"\n", cred->phase2); 950 if (cred->excluded_ssid) { 951 size_t j; 952 for (i = 0; i < cred->num_excluded_ssid; i++) { 953 struct excluded_ssid *e = &cred->excluded_ssid[i]; 954 fprintf(f, "\texcluded_ssid="); 955 for (j = 0; j < e->ssid_len; j++) 956 fprintf(f, "%02x", e->ssid[j]); 957 fprintf(f, "\n"); 958 } 959 } 960 if (cred->roaming_partner) { 961 for (i = 0; i < cred->num_roaming_partner; i++) { 962 struct roaming_partner *p = &cred->roaming_partner[i]; 963 fprintf(f, "\troaming_partner=\"%s,%d,%u,%s\"\n", 964 p->fqdn, p->exact_match, p->priority, 965 p->country); 966 } 967 } 968 if (cred->update_identifier) 969 fprintf(f, "\tupdate_identifier=%d\n", cred->update_identifier); 970 971 if (cred->provisioning_sp) 972 fprintf(f, "\tprovisioning_sp=\"%s\"\n", cred->provisioning_sp); 973 if (cred->sp_priority) 974 fprintf(f, "\tsp_priority=%d\n", cred->sp_priority); 975 976 if (cred->min_dl_bandwidth_home) 977 fprintf(f, "\tmin_dl_bandwidth_home=%u\n", 978 cred->min_dl_bandwidth_home); 979 if (cred->min_ul_bandwidth_home) 980 fprintf(f, "\tmin_ul_bandwidth_home=%u\n", 981 cred->min_ul_bandwidth_home); 982 if (cred->min_dl_bandwidth_roaming) 983 fprintf(f, "\tmin_dl_bandwidth_roaming=%u\n", 984 cred->min_dl_bandwidth_roaming); 985 if (cred->min_ul_bandwidth_roaming) 986 fprintf(f, "\tmin_ul_bandwidth_roaming=%u\n", 987 cred->min_ul_bandwidth_roaming); 988 989 if (cred->max_bss_load) 990 fprintf(f, "\tmax_bss_load=%u\n", 991 cred->max_bss_load); 992 993 if (cred->ocsp) 994 fprintf(f, "\tocsp=%d\n", cred->ocsp); 995 996 if (cred->num_req_conn_capab) { 997 for (i = 0; i < cred->num_req_conn_capab; i++) { 998 int *ports; 999 1000 fprintf(f, "\treq_conn_capab=%u", 1001 cred->req_conn_capab_proto[i]); 1002 ports = cred->req_conn_capab_port[i]; 1003 if (ports) { 1004 int j; 1005 for (j = 0; ports[j] != -1; j++) { 1006 fprintf(f, "%s%d", j > 0 ? "," : ":", 1007 ports[j]); 1008 } 1009 } 1010 fprintf(f, "\n"); 1011 } 1012 } 1013 1014 if (cred->num_home_ois) { 1015 size_t j; 1016 1017 fprintf(f, "\thome_ois=\""); 1018 for (i = 0; i < cred->num_home_ois; i++) { 1019 if (i > 0) 1020 fprintf(f, ","); 1021 for (j = 0; j < cred->home_ois_len[i]; j++) 1022 fprintf(f, "%02x", 1023 cred->home_ois[i][j]); 1024 } 1025 fprintf(f, "\"\n"); 1026 } 1027 1028 if (cred->num_required_home_ois) { 1029 size_t j; 1030 1031 fprintf(f, "\trequired_home_ois=\""); 1032 for (i = 0; i < cred->num_required_home_ois; i++) { 1033 if (i > 0) 1034 fprintf(f, ","); 1035 for (j = 0; j < cred->required_home_ois_len[i]; j++) 1036 fprintf(f, "%02x", 1037 cred->required_home_ois[i][j]); 1038 } 1039 fprintf(f, "\"\n"); 1040 } 1041 1042 if (cred->num_roaming_consortiums) { 1043 size_t j; 1044 1045 fprintf(f, "\troaming_consortiums=\""); 1046 for (i = 0; i < cred->num_roaming_consortiums; i++) { 1047 if (i > 0) 1048 fprintf(f, ","); 1049 for (j = 0; j < cred->roaming_consortiums_len[i]; j++) 1050 fprintf(f, "%02x", 1051 cred->roaming_consortiums[i][j]); 1052 } 1053 fprintf(f, "\"\n"); 1054 } 1055 1056 if (cred->sim_num != DEFAULT_USER_SELECTED_SIM) 1057 fprintf(f, "\tsim_num=%d\n", cred->sim_num); 1058 1059 if (cred->engine) 1060 fprintf(f, "\tengine=%d\n", cred->engine); 1061 if (cred->engine_id) 1062 fprintf(f, "\tengine_id=\"%s\"\n", cred->engine_id); 1063 if (cred->key_id) 1064 fprintf(f, "\tkey_id=\"%s\"\n", cred->key_id); 1065 if (cred->cert_id) 1066 fprintf(f, "\tcert_id=\"%s\"\n", cred->cert_id); 1067 if (cred->ca_cert_id) 1068 fprintf(f, "\tca_cert_id=\"%s\"\n", cred->ca_cert_id); 1069 1070 if (cred->imsi_privacy_cert) 1071 fprintf(f, "\timsi_privacy_cert=\"%s\"\n", 1072 cred->imsi_privacy_cert); 1073 if (cred->imsi_privacy_attr) 1074 fprintf(f, "\timsi_privacy_attr=\"%s\"\n", 1075 cred->imsi_privacy_attr); 1076 } 1077 1078 1079 #ifndef CONFIG_NO_CONFIG_BLOBS 1080 static int wpa_config_write_blob(FILE *f, struct wpa_config_blob *blob) 1081 { 1082 char *encoded; 1083 1084 encoded = base64_encode(blob->data, blob->len, NULL); 1085 if (encoded == NULL) 1086 return -1; 1087 1088 fprintf(f, "\nblob-base64-%s={\n%s}\n", blob->name, encoded); 1089 os_free(encoded); 1090 return 0; 1091 } 1092 #endif /* CONFIG_NO_CONFIG_BLOBS */ 1093 1094 1095 static void write_global_bin(FILE *f, const char *field, 1096 const struct wpabuf *val) 1097 { 1098 size_t i; 1099 const u8 *pos; 1100 1101 if (val == NULL) 1102 return; 1103 1104 fprintf(f, "%s=", field); 1105 pos = wpabuf_head(val); 1106 for (i = 0; i < wpabuf_len(val); i++) 1107 fprintf(f, "%02X", *pos++); 1108 fprintf(f, "\n"); 1109 } 1110 1111 1112 static void wpa_config_write_global(FILE *f, struct wpa_config *config) 1113 { 1114 #ifdef CONFIG_CTRL_IFACE 1115 if (config->ctrl_interface) 1116 fprintf(f, "ctrl_interface=%s\n", config->ctrl_interface); 1117 if (config->ctrl_interface_group) 1118 fprintf(f, "ctrl_interface_group=%s\n", 1119 config->ctrl_interface_group); 1120 #endif /* CONFIG_CTRL_IFACE */ 1121 if (config->eapol_version != DEFAULT_EAPOL_VERSION) 1122 fprintf(f, "eapol_version=%d\n", config->eapol_version); 1123 if (config->ap_scan != DEFAULT_AP_SCAN) 1124 fprintf(f, "ap_scan=%d\n", config->ap_scan); 1125 if (config->disable_scan_offload) 1126 fprintf(f, "disable_scan_offload=%d\n", 1127 config->disable_scan_offload); 1128 if (config->fast_reauth != DEFAULT_FAST_REAUTH) 1129 fprintf(f, "fast_reauth=%d\n", config->fast_reauth); 1130 #ifndef CONFIG_OPENSC_ENGINE_PATH 1131 if (config->opensc_engine_path) 1132 fprintf(f, "opensc_engine_path=%s\n", 1133 config->opensc_engine_path); 1134 #endif /* CONFIG_OPENSC_ENGINE_PATH */ 1135 #ifndef CONFIG_PKCS11_ENGINE_PATH 1136 if (config->pkcs11_engine_path) 1137 fprintf(f, "pkcs11_engine_path=%s\n", 1138 config->pkcs11_engine_path); 1139 #endif /* CONFIG_PKCS11_ENGINE_PATH */ 1140 #ifndef CONFIG_PKCS11_MODULE_PATH 1141 if (config->pkcs11_module_path) 1142 fprintf(f, "pkcs11_module_path=%s\n", 1143 config->pkcs11_module_path); 1144 #endif /* CONFIG_PKCS11_MODULE_PATH */ 1145 if (config->openssl_ciphers) 1146 fprintf(f, "openssl_ciphers=%s\n", config->openssl_ciphers); 1147 if (config->pcsc_reader) 1148 fprintf(f, "pcsc_reader=%s\n", config->pcsc_reader); 1149 if (config->pcsc_pin) 1150 fprintf(f, "pcsc_pin=%s\n", config->pcsc_pin); 1151 if (config->driver_param) 1152 fprintf(f, "driver_param=%s\n", config->driver_param); 1153 if (config->dot11RSNAConfigPMKLifetime) 1154 fprintf(f, "dot11RSNAConfigPMKLifetime=%u\n", 1155 config->dot11RSNAConfigPMKLifetime); 1156 if (config->dot11RSNAConfigPMKReauthThreshold) 1157 fprintf(f, "dot11RSNAConfigPMKReauthThreshold=%u\n", 1158 config->dot11RSNAConfigPMKReauthThreshold); 1159 if (config->dot11RSNAConfigSATimeout) 1160 fprintf(f, "dot11RSNAConfigSATimeout=%u\n", 1161 config->dot11RSNAConfigSATimeout); 1162 if (config->update_config) 1163 fprintf(f, "update_config=%d\n", config->update_config); 1164 #ifdef CONFIG_WPS 1165 if (!is_nil_uuid(config->uuid)) { 1166 char buf[40]; 1167 uuid_bin2str(config->uuid, buf, sizeof(buf)); 1168 fprintf(f, "uuid=%s\n", buf); 1169 } 1170 if (config->auto_uuid) 1171 fprintf(f, "auto_uuid=%d\n", config->auto_uuid); 1172 if (config->device_name) 1173 fprintf(f, "device_name=%s\n", config->device_name); 1174 if (config->manufacturer) 1175 fprintf(f, "manufacturer=%s\n", config->manufacturer); 1176 if (config->model_name) 1177 fprintf(f, "model_name=%s\n", config->model_name); 1178 if (config->model_number) 1179 fprintf(f, "model_number=%s\n", config->model_number); 1180 if (config->serial_number) 1181 fprintf(f, "serial_number=%s\n", config->serial_number); 1182 { 1183 char _buf[WPS_DEV_TYPE_BUFSIZE], *buf; 1184 buf = wps_dev_type_bin2str(config->device_type, 1185 _buf, sizeof(_buf)); 1186 if (os_strcmp(buf, "0-00000000-0") != 0) 1187 fprintf(f, "device_type=%s\n", buf); 1188 } 1189 if (WPA_GET_BE32(config->os_version)) 1190 fprintf(f, "os_version=%08x\n", 1191 WPA_GET_BE32(config->os_version)); 1192 if (config->config_methods) 1193 fprintf(f, "config_methods=%s\n", config->config_methods); 1194 if (config->wps_cred_processing) 1195 fprintf(f, "wps_cred_processing=%d\n", 1196 config->wps_cred_processing); 1197 if (config->wps_cred_add_sae) 1198 fprintf(f, "wps_cred_add_sae=%d\n", 1199 config->wps_cred_add_sae); 1200 if (config->wps_vendor_ext_m1) { 1201 int i, len = wpabuf_len(config->wps_vendor_ext_m1); 1202 const u8 *p = wpabuf_head_u8(config->wps_vendor_ext_m1); 1203 if (len > 0) { 1204 fprintf(f, "wps_vendor_ext_m1="); 1205 for (i = 0; i < len; i++) 1206 fprintf(f, "%02x", *p++); 1207 fprintf(f, "\n"); 1208 } 1209 } 1210 #endif /* CONFIG_WPS */ 1211 #ifdef CONFIG_P2P 1212 { 1213 int i; 1214 char _buf[WPS_DEV_TYPE_BUFSIZE], *buf; 1215 1216 for (i = 0; i < config->num_sec_device_types; i++) { 1217 buf = wps_dev_type_bin2str(config->sec_device_type[i], 1218 _buf, sizeof(_buf)); 1219 if (buf) 1220 fprintf(f, "sec_device_type=%s\n", buf); 1221 } 1222 } 1223 if (config->p2p_listen_reg_class) 1224 fprintf(f, "p2p_listen_reg_class=%d\n", 1225 config->p2p_listen_reg_class); 1226 if (config->p2p_listen_channel) 1227 fprintf(f, "p2p_listen_channel=%d\n", 1228 config->p2p_listen_channel); 1229 if (config->p2p_oper_reg_class) 1230 fprintf(f, "p2p_oper_reg_class=%d\n", 1231 config->p2p_oper_reg_class); 1232 if (config->p2p_oper_channel) 1233 fprintf(f, "p2p_oper_channel=%d\n", config->p2p_oper_channel); 1234 if (config->p2p_go_intent != DEFAULT_P2P_GO_INTENT) 1235 fprintf(f, "p2p_go_intent=%d\n", config->p2p_go_intent); 1236 if (config->p2p_ssid_postfix) 1237 fprintf(f, "p2p_ssid_postfix=%s\n", config->p2p_ssid_postfix); 1238 if (config->persistent_reconnect) 1239 fprintf(f, "persistent_reconnect=%d\n", 1240 config->persistent_reconnect); 1241 if (config->p2p_intra_bss != DEFAULT_P2P_INTRA_BSS) 1242 fprintf(f, "p2p_intra_bss=%d\n", config->p2p_intra_bss); 1243 if (config->p2p_group_idle) 1244 fprintf(f, "p2p_group_idle=%d\n", config->p2p_group_idle); 1245 if (config->p2p_passphrase_len) 1246 fprintf(f, "p2p_passphrase_len=%u\n", 1247 config->p2p_passphrase_len); 1248 if (config->p2p_pref_chan) { 1249 unsigned int i; 1250 fprintf(f, "p2p_pref_chan="); 1251 for (i = 0; i < config->num_p2p_pref_chan; i++) { 1252 fprintf(f, "%s%u:%u", i > 0 ? "," : "", 1253 config->p2p_pref_chan[i].op_class, 1254 config->p2p_pref_chan[i].chan); 1255 } 1256 fprintf(f, "\n"); 1257 } 1258 if (config->p2p_no_go_freq.num) { 1259 char *val = freq_range_list_str(&config->p2p_no_go_freq); 1260 if (val) { 1261 fprintf(f, "p2p_no_go_freq=%s\n", val); 1262 os_free(val); 1263 } 1264 } 1265 if (config->p2p_add_cli_chan) 1266 fprintf(f, "p2p_add_cli_chan=%d\n", config->p2p_add_cli_chan); 1267 if (config->p2p_optimize_listen_chan != 1268 DEFAULT_P2P_OPTIMIZE_LISTEN_CHAN) 1269 fprintf(f, "p2p_optimize_listen_chan=%d\n", 1270 config->p2p_optimize_listen_chan); 1271 if (config->p2p_go_ht40) 1272 fprintf(f, "p2p_go_ht40=%d\n", config->p2p_go_ht40); 1273 if (config->p2p_go_vht) 1274 fprintf(f, "p2p_go_vht=%d\n", config->p2p_go_vht); 1275 if (config->p2p_go_he) 1276 fprintf(f, "p2p_go_he=%d\n", config->p2p_go_he); 1277 if (config->p2p_go_edmg) 1278 fprintf(f, "p2p_go_edmg=%d\n", config->p2p_go_edmg); 1279 if (config->p2p_go_ctwindow != DEFAULT_P2P_GO_CTWINDOW) 1280 fprintf(f, "p2p_go_ctwindow=%d\n", config->p2p_go_ctwindow); 1281 if (config->p2p_disabled) 1282 fprintf(f, "p2p_disabled=%d\n", config->p2p_disabled); 1283 if (config->p2p_no_group_iface) 1284 fprintf(f, "p2p_no_group_iface=%d\n", 1285 config->p2p_no_group_iface); 1286 if (config->p2p_ignore_shared_freq) 1287 fprintf(f, "p2p_ignore_shared_freq=%d\n", 1288 config->p2p_ignore_shared_freq); 1289 if (config->p2p_cli_probe) 1290 fprintf(f, "p2p_cli_probe=%d\n", config->p2p_cli_probe); 1291 if (config->p2p_go_freq_change_policy != DEFAULT_P2P_GO_FREQ_MOVE) 1292 fprintf(f, "p2p_go_freq_change_policy=%u\n", 1293 config->p2p_go_freq_change_policy); 1294 1295 if (config->p2p_6ghz_disable) 1296 fprintf(f, "p2p_6ghz_disable=%d\n", config->p2p_6ghz_disable); 1297 1298 if (WPA_GET_BE32(config->ip_addr_go)) 1299 fprintf(f, "ip_addr_go=%u.%u.%u.%u\n", 1300 config->ip_addr_go[0], config->ip_addr_go[1], 1301 config->ip_addr_go[2], config->ip_addr_go[3]); 1302 if (WPA_GET_BE32(config->ip_addr_mask)) 1303 fprintf(f, "ip_addr_mask=%u.%u.%u.%u\n", 1304 config->ip_addr_mask[0], config->ip_addr_mask[1], 1305 config->ip_addr_mask[2], config->ip_addr_mask[3]); 1306 if (WPA_GET_BE32(config->ip_addr_start)) 1307 fprintf(f, "ip_addr_start=%u.%u.%u.%u\n", 1308 config->ip_addr_start[0], config->ip_addr_start[1], 1309 config->ip_addr_start[2], config->ip_addr_start[3]); 1310 if (WPA_GET_BE32(config->ip_addr_end)) 1311 fprintf(f, "ip_addr_end=%u.%u.%u.%u\n", 1312 config->ip_addr_end[0], config->ip_addr_end[1], 1313 config->ip_addr_end[2], config->ip_addr_end[3]); 1314 #endif /* CONFIG_P2P */ 1315 if (config->country[0] && config->country[1]) { 1316 fprintf(f, "country=%c%c\n", 1317 config->country[0], config->country[1]); 1318 } 1319 if (config->bss_max_count != DEFAULT_BSS_MAX_COUNT) 1320 fprintf(f, "bss_max_count=%u\n", config->bss_max_count); 1321 if (config->bss_expiration_age != DEFAULT_BSS_EXPIRATION_AGE) 1322 fprintf(f, "bss_expiration_age=%u\n", 1323 config->bss_expiration_age); 1324 if (config->bss_expiration_scan_count != 1325 DEFAULT_BSS_EXPIRATION_SCAN_COUNT) 1326 fprintf(f, "bss_expiration_scan_count=%u\n", 1327 config->bss_expiration_scan_count); 1328 if (config->filter_ssids) 1329 fprintf(f, "filter_ssids=%d\n", config->filter_ssids); 1330 if (config->filter_rssi) 1331 fprintf(f, "filter_rssi=%d\n", config->filter_rssi); 1332 if (config->max_num_sta != DEFAULT_MAX_NUM_STA) 1333 fprintf(f, "max_num_sta=%u\n", config->max_num_sta); 1334 if (config->ap_isolate != DEFAULT_AP_ISOLATE) 1335 fprintf(f, "ap_isolate=%u\n", config->ap_isolate); 1336 if (config->disassoc_low_ack) 1337 fprintf(f, "disassoc_low_ack=%d\n", config->disassoc_low_ack); 1338 #ifdef CONFIG_HS20 1339 if (config->hs20) 1340 fprintf(f, "hs20=1\n"); 1341 #endif /* CONFIG_HS20 */ 1342 #ifdef CONFIG_INTERWORKING 1343 if (config->interworking) 1344 fprintf(f, "interworking=%d\n", config->interworking); 1345 if (!is_zero_ether_addr(config->hessid)) 1346 fprintf(f, "hessid=" MACSTR "\n", MAC2STR(config->hessid)); 1347 if (config->access_network_type != DEFAULT_ACCESS_NETWORK_TYPE) 1348 fprintf(f, "access_network_type=%d\n", 1349 config->access_network_type); 1350 if (config->go_interworking) 1351 fprintf(f, "go_interworking=%d\n", config->go_interworking); 1352 if (config->go_access_network_type) 1353 fprintf(f, "go_access_network_type=%d\n", 1354 config->go_access_network_type); 1355 if (config->go_internet) 1356 fprintf(f, "go_internet=%d\n", config->go_internet); 1357 if (config->go_venue_group) 1358 fprintf(f, "go_venue_group=%d\n", config->go_venue_group); 1359 if (config->go_venue_type) 1360 fprintf(f, "go_venue_type=%d\n", config->go_venue_type); 1361 #endif /* CONFIG_INTERWORKING */ 1362 if (config->pbc_in_m1) 1363 fprintf(f, "pbc_in_m1=%d\n", config->pbc_in_m1); 1364 if (config->wps_nfc_pw_from_config) { 1365 if (config->wps_nfc_dev_pw_id) 1366 fprintf(f, "wps_nfc_dev_pw_id=%d\n", 1367 config->wps_nfc_dev_pw_id); 1368 write_global_bin(f, "wps_nfc_dh_pubkey", 1369 config->wps_nfc_dh_pubkey); 1370 write_global_bin(f, "wps_nfc_dh_privkey", 1371 config->wps_nfc_dh_privkey); 1372 write_global_bin(f, "wps_nfc_dev_pw", config->wps_nfc_dev_pw); 1373 } 1374 1375 if (config->ext_password_backend) 1376 fprintf(f, "ext_password_backend=%s\n", 1377 config->ext_password_backend); 1378 if (config->p2p_go_max_inactivity != DEFAULT_P2P_GO_MAX_INACTIVITY) 1379 fprintf(f, "p2p_go_max_inactivity=%d\n", 1380 config->p2p_go_max_inactivity); 1381 if (config->auto_interworking) 1382 fprintf(f, "auto_interworking=%d\n", 1383 config->auto_interworking); 1384 if (config->okc) 1385 fprintf(f, "okc=%d\n", config->okc); 1386 if (config->pmf) 1387 fprintf(f, "pmf=%d\n", config->pmf); 1388 if (config->dtim_period) 1389 fprintf(f, "dtim_period=%d\n", config->dtim_period); 1390 if (config->beacon_int) 1391 fprintf(f, "beacon_int=%d\n", config->beacon_int); 1392 1393 if (config->sae_check_mfp) 1394 fprintf(f, "sae_check_mfp=%d\n", config->sae_check_mfp); 1395 1396 if (config->sae_groups) { 1397 int i; 1398 fprintf(f, "sae_groups="); 1399 for (i = 0; config->sae_groups[i] > 0; i++) { 1400 fprintf(f, "%s%d", i > 0 ? " " : "", 1401 config->sae_groups[i]); 1402 } 1403 fprintf(f, "\n"); 1404 } 1405 1406 if (config->sae_pwe) 1407 fprintf(f, "sae_pwe=%d\n", config->sae_pwe); 1408 1409 if (config->sae_pmkid_in_assoc) 1410 fprintf(f, "sae_pmkid_in_assoc=%d\n", 1411 config->sae_pmkid_in_assoc); 1412 1413 if (config->ap_vendor_elements) { 1414 int i, len = wpabuf_len(config->ap_vendor_elements); 1415 const u8 *p = wpabuf_head_u8(config->ap_vendor_elements); 1416 if (len > 0) { 1417 fprintf(f, "ap_vendor_elements="); 1418 for (i = 0; i < len; i++) 1419 fprintf(f, "%02x", *p++); 1420 fprintf(f, "\n"); 1421 } 1422 } 1423 1424 if (config->ap_assocresp_elements) { 1425 int i, len = wpabuf_len(config->ap_assocresp_elements); 1426 const u8 *p = wpabuf_head_u8(config->ap_assocresp_elements); 1427 1428 if (len > 0) { 1429 fprintf(f, "ap_assocresp_elements="); 1430 for (i = 0; i < len; i++) 1431 fprintf(f, "%02x", *p++); 1432 fprintf(f, "\n"); 1433 } 1434 } 1435 1436 if (config->ignore_old_scan_res) 1437 fprintf(f, "ignore_old_scan_res=%d\n", 1438 config->ignore_old_scan_res); 1439 1440 if (config->freq_list && config->freq_list[0]) { 1441 int i; 1442 fprintf(f, "freq_list="); 1443 for (i = 0; config->freq_list[i]; i++) { 1444 fprintf(f, "%s%d", i > 0 ? " " : "", 1445 config->freq_list[i]); 1446 } 1447 fprintf(f, "\n"); 1448 } 1449 if (config->initial_freq_list && config->initial_freq_list[0]) { 1450 int i; 1451 fprintf(f, "initial_freq_list="); 1452 for (i = 0; config->initial_freq_list[i]; i++) { 1453 fprintf(f, "%s%d", i > 0 ? " " : "", 1454 config->initial_freq_list[i]); 1455 } 1456 fprintf(f, "\n"); 1457 } 1458 if (config->scan_cur_freq != DEFAULT_SCAN_CUR_FREQ) 1459 fprintf(f, "scan_cur_freq=%d\n", config->scan_cur_freq); 1460 1461 if (config->scan_res_valid_for_connect != 1462 DEFAULT_SCAN_RES_VALID_FOR_CONNECT) 1463 fprintf(f, "scan_res_valid_for_connect=%d\n", 1464 config->scan_res_valid_for_connect); 1465 1466 if (config->sched_scan_interval) 1467 fprintf(f, "sched_scan_interval=%u\n", 1468 config->sched_scan_interval); 1469 1470 if (config->sched_scan_start_delay) 1471 fprintf(f, "sched_scan_start_delay=%u\n", 1472 config->sched_scan_start_delay); 1473 1474 if (config->external_sim) 1475 fprintf(f, "external_sim=%d\n", config->external_sim); 1476 1477 if (config->tdls_external_control) 1478 fprintf(f, "tdls_external_control=%d\n", 1479 config->tdls_external_control); 1480 1481 if (config->wowlan_triggers) 1482 fprintf(f, "wowlan_triggers=%s\n", 1483 config->wowlan_triggers); 1484 1485 if (config->bgscan) 1486 fprintf(f, "bgscan=\"%s\"\n", config->bgscan); 1487 1488 if (config->autoscan) 1489 fprintf(f, "autoscan=%s\n", config->autoscan); 1490 1491 if (config->p2p_search_delay != DEFAULT_P2P_SEARCH_DELAY) 1492 fprintf(f, "p2p_search_delay=%u\n", 1493 config->p2p_search_delay); 1494 1495 if (config->mac_addr) 1496 fprintf(f, "mac_addr=%d\n", config->mac_addr); 1497 1498 if (config->rand_addr_lifetime != DEFAULT_RAND_ADDR_LIFETIME) 1499 fprintf(f, "rand_addr_lifetime=%u\n", 1500 config->rand_addr_lifetime); 1501 1502 if (config->preassoc_mac_addr) 1503 fprintf(f, "preassoc_mac_addr=%d\n", config->preassoc_mac_addr); 1504 1505 if (config->key_mgmt_offload != DEFAULT_KEY_MGMT_OFFLOAD) 1506 fprintf(f, "key_mgmt_offload=%d\n", config->key_mgmt_offload); 1507 1508 if (config->user_mpm != DEFAULT_USER_MPM) 1509 fprintf(f, "user_mpm=%d\n", config->user_mpm); 1510 1511 if (config->max_peer_links != DEFAULT_MAX_PEER_LINKS) 1512 fprintf(f, "max_peer_links=%d\n", config->max_peer_links); 1513 1514 if (config->cert_in_cb != DEFAULT_CERT_IN_CB) 1515 fprintf(f, "cert_in_cb=%d\n", config->cert_in_cb); 1516 1517 if (config->mesh_max_inactivity != DEFAULT_MESH_MAX_INACTIVITY) 1518 fprintf(f, "mesh_max_inactivity=%d\n", 1519 config->mesh_max_inactivity); 1520 1521 if (config->mesh_fwding != DEFAULT_MESH_FWDING) 1522 fprintf(f, "mesh_fwding=%d\n", config->mesh_fwding); 1523 1524 if (config->dot11RSNASAERetransPeriod != 1525 DEFAULT_DOT11_RSNA_SAE_RETRANS_PERIOD) 1526 fprintf(f, "dot11RSNASAERetransPeriod=%d\n", 1527 config->dot11RSNASAERetransPeriod); 1528 1529 if (config->passive_scan) 1530 fprintf(f, "passive_scan=%d\n", config->passive_scan); 1531 1532 if (config->reassoc_same_bss_optim) 1533 fprintf(f, "reassoc_same_bss_optim=%d\n", 1534 config->reassoc_same_bss_optim); 1535 1536 if (config->wps_priority) 1537 fprintf(f, "wps_priority=%d\n", config->wps_priority); 1538 1539 if (config->wpa_rsc_relaxation != DEFAULT_WPA_RSC_RELAXATION) 1540 fprintf(f, "wpa_rsc_relaxation=%d\n", 1541 config->wpa_rsc_relaxation); 1542 1543 if (config->sched_scan_plans) 1544 fprintf(f, "sched_scan_plans=%s\n", config->sched_scan_plans); 1545 1546 #ifdef CONFIG_MBO 1547 if (config->non_pref_chan) 1548 fprintf(f, "non_pref_chan=%s\n", config->non_pref_chan); 1549 if (config->mbo_cell_capa != DEFAULT_MBO_CELL_CAPA) 1550 fprintf(f, "mbo_cell_capa=%u\n", config->mbo_cell_capa); 1551 if (config->disassoc_imminent_rssi_threshold != 1552 DEFAULT_DISASSOC_IMMINENT_RSSI_THRESHOLD) 1553 fprintf(f, "disassoc_imminent_rssi_threshold=%d\n", 1554 config->disassoc_imminent_rssi_threshold); 1555 if (config->oce != DEFAULT_OCE_SUPPORT) 1556 fprintf(f, "oce=%u\n", config->oce); 1557 #endif /* CONFIG_MBO */ 1558 1559 if (config->gas_address3) 1560 fprintf(f, "gas_address3=%d\n", config->gas_address3); 1561 1562 if (config->ftm_responder) 1563 fprintf(f, "ftm_responder=%d\n", config->ftm_responder); 1564 if (config->ftm_initiator) 1565 fprintf(f, "ftm_initiator=%d\n", config->ftm_initiator); 1566 1567 if (config->osu_dir) 1568 fprintf(f, "osu_dir=%s\n", config->osu_dir); 1569 1570 if (config->fst_group_id) 1571 fprintf(f, "fst_group_id=%s\n", config->fst_group_id); 1572 if (config->fst_priority) 1573 fprintf(f, "fst_priority=%d\n", config->fst_priority); 1574 if (config->fst_llt) 1575 fprintf(f, "fst_llt=%d\n", config->fst_llt); 1576 1577 if (config->gas_rand_addr_lifetime != DEFAULT_RAND_ADDR_LIFETIME) 1578 fprintf(f, "gas_rand_addr_lifetime=%u\n", 1579 config->gas_rand_addr_lifetime); 1580 if (config->gas_rand_mac_addr) 1581 fprintf(f, "gas_rand_mac_addr=%d\n", config->gas_rand_mac_addr); 1582 if (config->dpp_config_processing) 1583 fprintf(f, "dpp_config_processing=%d\n", 1584 config->dpp_config_processing); 1585 if (config->dpp_name) 1586 fprintf(f, "dpp_name=%s\n", config->dpp_name); 1587 if (config->dpp_mud_url) 1588 fprintf(f, "dpp_mud_url=%s\n", config->dpp_mud_url); 1589 if (config->dpp_extra_conf_req_name) 1590 fprintf(f, "dpp_extra_conf_req_name=%s\n", 1591 config->dpp_extra_conf_req_name); 1592 if (config->dpp_extra_conf_req_value) 1593 fprintf(f, "dpp_extra_conf_req_value=%s\n", 1594 config->dpp_extra_conf_req_value); 1595 if (config->dpp_connector_privacy_default) 1596 fprintf(f, "dpp_connector_privacy_default=%d\n", 1597 config->dpp_connector_privacy_default); 1598 if (config->coloc_intf_reporting) 1599 fprintf(f, "coloc_intf_reporting=%d\n", 1600 config->coloc_intf_reporting); 1601 if (config->p2p_device_random_mac_addr) 1602 fprintf(f, "p2p_device_random_mac_addr=%d\n", 1603 config->p2p_device_random_mac_addr); 1604 if (!is_zero_ether_addr(config->p2p_device_persistent_mac_addr)) 1605 fprintf(f, "p2p_device_persistent_mac_addr=" MACSTR "\n", 1606 MAC2STR(config->p2p_device_persistent_mac_addr)); 1607 if (config->p2p_interface_random_mac_addr) 1608 fprintf(f, "p2p_interface_random_mac_addr=%d\n", 1609 config->p2p_interface_random_mac_addr); 1610 if (config->disable_btm) 1611 fprintf(f, "disable_btm=1\n"); 1612 if (config->extended_key_id != DEFAULT_EXTENDED_KEY_ID) 1613 fprintf(f, "extended_key_id=%d\n", 1614 config->extended_key_id); 1615 if (config->wowlan_disconnect_on_deinit) 1616 fprintf(f, "wowlan_disconnect_on_deinit=%d\n", 1617 config->wowlan_disconnect_on_deinit); 1618 #ifdef CONFIG_TESTING_OPTIONS 1619 if (config->mld_force_single_link) 1620 fprintf(f, "mld_force_single_link=1\n"); 1621 if (config->mld_connect_band_pref != MLD_CONNECT_BAND_PREF_AUTO) 1622 fprintf(f, "mld_connect_band_pref=%d\n", 1623 config->mld_connect_band_pref); 1624 if (!is_zero_ether_addr(config->mld_connect_bssid_pref)) 1625 fprintf(f, "mld_connect_bssid_pref=" MACSTR "\n", 1626 MAC2STR(config->mld_connect_bssid_pref)); 1627 #endif /* CONFIG_TESTING_OPTIONS */ 1628 if (config->ft_prepend_pmkid) 1629 fprintf(f, "ft_prepend_pmkid=%d", config->ft_prepend_pmkid); 1630 } 1631 1632 #endif /* CONFIG_NO_CONFIG_WRITE */ 1633 1634 1635 int wpa_config_write(const char *name, struct wpa_config *config) 1636 { 1637 #ifndef CONFIG_NO_CONFIG_WRITE 1638 FILE *f; 1639 struct wpa_ssid *ssid; 1640 struct wpa_cred *cred; 1641 #ifndef CONFIG_NO_CONFIG_BLOBS 1642 struct wpa_config_blob *blob; 1643 #endif /* CONFIG_NO_CONFIG_BLOBS */ 1644 int ret = 0; 1645 const char *orig_name = name; 1646 int tmp_len; 1647 char *tmp_name; 1648 1649 if (!name) { 1650 wpa_printf(MSG_ERROR, "No configuration file for writing"); 1651 return -1; 1652 } 1653 1654 tmp_len = os_strlen(name) + 5; /* allow space for .tmp suffix */ 1655 tmp_name = os_malloc(tmp_len); 1656 if (tmp_name) { 1657 os_snprintf(tmp_name, tmp_len, "%s.tmp", name); 1658 name = tmp_name; 1659 } 1660 1661 wpa_printf(MSG_DEBUG, "Writing configuration file '%s'", name); 1662 1663 f = fopen(name, "w"); 1664 if (f == NULL) { 1665 wpa_printf(MSG_DEBUG, "Failed to open '%s' for writing", name); 1666 os_free(tmp_name); 1667 return -1; 1668 } 1669 1670 wpa_config_write_global(f, config); 1671 1672 for (cred = config->cred; cred; cred = cred->next) { 1673 if (cred->temporary) 1674 continue; 1675 fprintf(f, "\ncred={\n"); 1676 wpa_config_write_cred(f, cred); 1677 fprintf(f, "}\n"); 1678 } 1679 1680 for (ssid = config->ssid; ssid; ssid = ssid->next) { 1681 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS || ssid->temporary || 1682 ssid->ro) 1683 continue; /* do not save temporary networks */ 1684 if (wpa_key_mgmt_wpa_psk_no_sae(ssid->key_mgmt) && 1685 !ssid->psk_set && !ssid->passphrase) 1686 continue; /* do not save invalid network */ 1687 if (wpa_key_mgmt_sae(ssid->key_mgmt) && 1688 !ssid->passphrase && !ssid->sae_password) 1689 continue; /* do not save invalid network */ 1690 fprintf(f, "\nnetwork={\n"); 1691 wpa_config_write_network(f, ssid); 1692 fprintf(f, "}\n"); 1693 } 1694 1695 #ifndef CONFIG_NO_CONFIG_BLOBS 1696 for (blob = config->blobs; blob; blob = blob->next) { 1697 ret = wpa_config_write_blob(f, blob); 1698 if (ret) 1699 break; 1700 } 1701 #endif /* CONFIG_NO_CONFIG_BLOBS */ 1702 1703 os_fdatasync(f); 1704 1705 fclose(f); 1706 1707 if (tmp_name) { 1708 int chmod_ret = 0; 1709 1710 #ifdef ANDROID 1711 chmod_ret = chmod(tmp_name, 1712 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); 1713 #endif /* ANDROID */ 1714 if (chmod_ret != 0 || rename(tmp_name, orig_name) != 0) 1715 ret = -1; 1716 1717 os_free(tmp_name); 1718 } 1719 1720 wpa_printf(MSG_DEBUG, "Configuration file '%s' written %ssuccessfully", 1721 orig_name, ret ? "un" : ""); 1722 return ret; 1723 #else /* CONFIG_NO_CONFIG_WRITE */ 1724 return -1; 1725 #endif /* CONFIG_NO_CONFIG_WRITE */ 1726 } 1727