[PATCH] wpa_passphrase: Encode non-ascii SSID in hex
Jörn Bethune
bethune+hostap at posteo.de
Sun Nov 13 01:37:42 PST 2022
Issue: wpa_passphrase does not encode non-ascii SSID names.
wpa_supplicant needs the name to be encoded to identify the
right configuration entry when connecting.
Cause: Feature is missing
Fix: Check if the SSID contains non-ascii characters and then encode it
as a hex string without quotes.
This is my first contribution to this project.
Demo:
Current implementation:
$ wpa_passphrase "netwörk" thepassword
network={
ssid="netwörk"
#psk="thepassword"
psk=30cd9c223d9ba6bf1536b2fd88947c4f21c3b0b4ce680ab502b06d293721e327
}
The password is correct. But the SSID won't be matched by
wpa_supplicant.
Patched implementation:
$ ./wpa_passphrase "netwörk" thepassword
network={
#ssid="netwörk"
ssid=6e657477c3b6726b
#psk="thepassword"
psk=30cd9c223d9ba6bf1536b2fd88947c4f21c3b0b4ce680ab502b06d293721e327
}
The patched wpa_passphrase includes the human-readable SSID as a
comment, just like what we already have for the psk parameter. In the
above example, the "ö" is represented by the two-byte sequence c3b6.
If the SSID is all-ASCII, then the old quoted SSID will be used:
$ ./wpa_passphrase "network" mypassword
network={
ssid="network"
#psk="mypassword"
psk=41551420291c01bdaaa5a93798f1519e9bd31d34055cbfaad942dda786157d74
}
Signed-off-by : Jörn Bethune <bethune+hostap at posteo dot de>
diff --git a/src/utils/common.c b/src/utils/common.c
index 6acfcbd89..28bb03d6e 100644
--- a/src/utils/common.c
+++ b/src/utils/common.c
@@ -731,6 +731,17 @@ int has_newline(const char *str)
}
+int is_within_ascii_range(const char *str)
+{
+ while (*str) {
+ if (*str < 0 || *str >= 0x80)
+ return 0;
+ str++;
+ }
+ return 1;
+}
+
+
size_t merge_byte_arrays(u8 *res, size_t res_len,
const u8 *src1, size_t src1_len,
const u8 *src2, size_t src2_len)
diff --git a/src/utils/common.h b/src/utils/common.h
index 435a9a84c..5ce03d2ac 100644
--- a/src/utils/common.h
+++ b/src/utils/common.h
@@ -511,6 +511,7 @@ char * wpa_config_parse_string(const char *value, size_t *len);
int is_hex(const u8 *data, size_t len);
int has_ctrl_char(const u8 *data, size_t len);
int has_newline(const char *str);
+int is_within_ascii_range(const char *str);
size_t merge_byte_arrays(u8 *res, size_t res_len,
const u8 *src1, size_t src1_len,
const u8 *src2, size_t src2_len);
diff --git a/wpa_supplicant/wpa_passphrase.c b/wpa_supplicant/wpa_passphrase.c
index d9c07e673..ad942f37c 100644
--- a/wpa_supplicant/wpa_passphrase.c
+++ b/wpa_supplicant/wpa_passphrase.c
@@ -65,7 +65,17 @@ int main(int argc, char *argv[])
}
printf("network={\n");
- printf("\tssid=\"%s\"\n", ssid);
+ if (is_within_ascii_range(ssid)) {
+ printf("\tssid=\"%s\"\n", ssid);
+ } else {
+ printf("\t#ssid=\"%s\"\n", ssid);
+ printf("\tssid=");
+ unsigned char * s = (unsigned char *) ssid;
+ while (*s) {
+ printf("%02x", *s++);
+ }
+ putchar('\n');
+ }
printf("\t#psk=\"%s\"\n", passphrase);
printf("\tpsk=");
for (i = 0; i < 32; i++)
More information about the Hostap
mailing list