From: Grant Erickson Date: Tue, 15 May 2012 08:51:21 +0000 (-0700) Subject: gsupplicant: fix "raw" PSK support X-Git-Tag: 2.0_alpha~210 X-Git-Url: http://review.tizen.org/git/?p=framework%2Fconnectivity%2Fconnman.git;a=commitdiff_plain;h=fa0f6cdd3e7563608ae069936d5d5f98c1fe4129 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. --- diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index 977c0fb..a1891f0 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); } }