diff options
author | Grant Erickson <marathon96@gmail.com> | 2012-05-15 01:51:21 -0700 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-05-15 14:34:56 +0300 |
commit | fa0f6cdd3e7563608ae069936d5d5f98c1fe4129 (patch) | |
tree | e516522ee00b238ae54955795dc23699c15948fa /gsupplicant | |
parent | c67ffeb366bd08b2204e23d524ab09d8d330dc3b (diff) | |
download | connman-fa0f6cdd3e7563608ae069936d5d5f98c1fe4129.tar.gz connman-fa0f6cdd3e7563608ae069936d5d5f98c1fe4129.tar.bz2 connman-fa0f6cdd3e7563608ae069936d5d5f98c1fe4129.zip |
gsupplicant: fix "raw" PSK support
This fixes "raw" PSK support by first converting the "raw" PSK from
a 64-character hexadecimal string to 32-byte array before appending
it to the network dictionary.
Diffstat (limited to 'gsupplicant')
-rw-r--r-- | gsupplicant/supplicant.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index 977c0fb3..a1891f0e 100644 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -2961,17 +2961,47 @@ static dbus_bool_t is_psk_raw_key(const char *psk) return TRUE; } +static unsigned char hexchar2bin(char c) +{ + if ((c >= '0') && (c <= '9')) + return (c - '0'); + else if ((c >= 'A') && (c <= 'F')) + return (c - 'A' + 10); + else if ((c >= 'a') && (c <= 'f')) + return (c - 'a' + 10); + else + return (c); +} + +static void hexstring2bin(const char *string, unsigned char *data, size_t data_len) +{ + size_t i; + + if ((data != NULL) && (string != NULL)) + for (i = 0; i < data_len; i++) + data[i] = (hexchar2bin(string[i * 2 + 0]) << 4 | + hexchar2bin(string[i * 2 + 1]) << 0); +} + static void add_network_security_psk(DBusMessageIter *dict, GSupplicantSSID *ssid) { if (ssid->passphrase && strlen(ssid->passphrase) > 0) { - if (is_psk_raw_key(ssid->passphrase) == TRUE) + const char *key = "psk"; + + if (is_psk_raw_key(ssid->passphrase) == TRUE) { + const size_t size = 32; + unsigned char data[size]; + unsigned char *datap = data; + + hexstring2bin(ssid->passphrase, datap, size); + supplicant_dbus_dict_append_fixed_array(dict, - "psk", DBUS_TYPE_BYTE, - &ssid->passphrase, 64); - else - supplicant_dbus_dict_append_basic(dict, "psk", - DBUS_TYPE_STRING, + key, DBUS_TYPE_BYTE, + &datap, size); + } else + supplicant_dbus_dict_append_basic(dict, + key, DBUS_TYPE_STRING, &ssid->passphrase); } } |