summaryrefslogtreecommitdiff
path: root/gsupplicant
diff options
context:
space:
mode:
authorGrant Erickson <marathon96@gmail.com>2012-05-15 01:51:21 -0700
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-05-15 14:34:56 +0300
commitfa0f6cdd3e7563608ae069936d5d5f98c1fe4129 (patch)
treee516522ee00b238ae54955795dc23699c15948fa /gsupplicant
parentc67ffeb366bd08b2204e23d524ab09d8d330dc3b (diff)
downloadconnman-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.c42
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);
}
}