Skip to content

Commit

Permalink
[gsupplicant] Use common GSUPPLICANT_CIPHER map. JB#41874
Browse files Browse the repository at this point in the history
  • Loading branch information
monich committed Jan 16, 2023
1 parent 74b779b commit 9d5835e
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 84 deletions.
5 changes: 4 additions & 1 deletion include/gsupplicant_types.h
Expand Up @@ -52,7 +52,10 @@ typedef enum gsupplicant_cipher {
GSUPPLICANT_CIPHER_TKIP = (0x00000004),
GSUPPLICANT_CIPHER_WEP104 = (0x00000008),
GSUPPLICANT_CIPHER_WEP40 = (0x00000010),
GSUPPLICANT_CIPHER_AES128_CMAC = (0x00000020)
GSUPPLICANT_CIPHER_AES128_CMAC = (0x00000020),
GSUPPLICANT_CIPHER_CCMP_256 = (0x00000040), /* Since 1.0.27 */
GSUPPLICANT_CIPHER_GCMP = (0x00000080), /* Since 1.0.27 */
GSUPPLICANT_CIPHER_GCMP_256 = (0x00000100) /* Since 1.0.27 */
} GSUPPLICANT_CIPHER;

typedef enum gsupplicant_keymgmt {
Expand Down
23 changes: 22 additions & 1 deletion src/gsupplicant.c
Expand Up @@ -177,7 +177,10 @@ static const GSupNameIntPair gsupplicant_cipher_suites [] = {
{ "tkip", GSUPPLICANT_CIPHER_TKIP },
{ "wep104", GSUPPLICANT_CIPHER_WEP104 },
{ "wep40", GSUPPLICANT_CIPHER_WEP40 },
{ "aes128cmac", GSUPPLICANT_CIPHER_AES128_CMAC }
{ "aes128cmac", GSUPPLICANT_CIPHER_AES128_CMAC },
{ "ccmp-256", GSUPPLICANT_CIPHER_CCMP_256 },
{ "gcmp", GSUPPLICANT_CIPHER_GCMP },
{ "gcmp-256", GSUPPLICANT_CIPHER_GCMP_256 }
};

static const GSupNameIntPair gsupplicant_keymgmt_suites [] = {
Expand Down Expand Up @@ -898,6 +901,24 @@ gsupplicant_keymgmt_suite_name(
* Internal API
*==========================================================================*/

GSUPPLICANT_CIPHER
gsupplicant_parse_cipher_value(
const char* name,
GVariant* value)
{
return gsupplicant_parse_bit_value(name, value,
gsupplicant_cipher_suites, G_N_ELEMENTS(gsupplicant_cipher_suites));
}

GSUPPLICANT_CIPHER
gsupplicant_parse_cipher_list(
const char* name,
GVariant* value)
{
return gsupplicant_parse_bits_array(0, name, value,
gsupplicant_cipher_suites, G_N_ELEMENTS(gsupplicant_cipher_suites));
}

GSUPPLICANT_KEYMGMT
gsupplicant_parse_keymgmt_list(
const char* name,
Expand Down
62 changes: 5 additions & 57 deletions src/gsupplicant_bss.c
Expand Up @@ -484,29 +484,9 @@ gsupplicant_bss_parse_wpa(
if (!g_strcmp0(name, "KeyMgmt")) {
wpa->keymgmt = gsupplicant_parse_keymgmt_list(name, value);
} else if (!g_strcmp0(name, "Pairwise")) {
static const GSupNameIntPair pairwise_map [] = {
{ "ccmp", GSUPPLICANT_CIPHER_CCMP },
{ "tkip", GSUPPLICANT_CIPHER_TKIP }
};
wpa->pairwise = gsupplicant_parse_bits_array(0, name, value,
pairwise_map, G_N_ELEMENTS(pairwise_map));
wpa->pairwise = gsupplicant_parse_cipher_list(name, value);
} else if (!g_strcmp0(name, "Group")) {
static const GSupNameIntPair group_map [] = {
{ "ccmp", GSUPPLICANT_CIPHER_CCMP },
{ "tkip", GSUPPLICANT_CIPHER_TKIP },
{ "wep104", GSUPPLICANT_CIPHER_WEP104 },
{ "wep40", GSUPPLICANT_CIPHER_WEP40 }
};
GASSERT(g_variant_is_of_type(value, G_VARIANT_TYPE_STRING));
if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
const char* str = g_variant_get_string(value, NULL);
const GSupNameIntPair* pair = gsupplicant_name_int_find_name(str,
group_map, G_N_ELEMENTS(group_map));
if (pair) {
GVERBOSE(" %s: %s", name, str);
wpa->group = pair->value;
}
}
wpa->group = gsupplicant_parse_cipher_value(name, value);
} else {
GWARN("Unexpected WPA dictionary key %s", name);
}
Expand Down Expand Up @@ -550,43 +530,11 @@ gsupplicant_bss_parse_rsn(
if (!g_strcmp0(name, "KeyMgmt")) {
rsn->keymgmt = gsupplicant_parse_keymgmt_list(name, value);
} else if (!g_strcmp0(name, "Pairwise")) {
static const GSupNameIntPair pairwise_map [] = {
{ "ccmp", GSUPPLICANT_CIPHER_CCMP },
{ "tkip", GSUPPLICANT_CIPHER_TKIP }
};
rsn->pairwise = gsupplicant_parse_bits_array(0, name, value,
pairwise_map, G_N_ELEMENTS(pairwise_map));
rsn->pairwise = gsupplicant_parse_cipher_list(name, value);
} else if (!g_strcmp0(name, "Group")) {
static const GSupNameIntPair group_map [] = {
{ "ccmp", GSUPPLICANT_CIPHER_CCMP },
{ "tkip", GSUPPLICANT_CIPHER_TKIP },
{ "wep104", GSUPPLICANT_CIPHER_WEP104 },
{ "wep40", GSUPPLICANT_CIPHER_WEP40 }
};
GASSERT(g_variant_is_of_type(value, G_VARIANT_TYPE_STRING));
if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
const char* str = g_variant_get_string(value, NULL);
const GSupNameIntPair* pair = gsupplicant_name_int_find_name(str,
group_map, G_N_ELEMENTS(group_map));
if (pair) {
GVERBOSE(" %s: %s", name, str);
rsn->group = pair->value;
}
}
rsn->group = gsupplicant_parse_cipher_value(name, value);
} else if (!g_strcmp0(name, "MgmtGroup")) {
static const GSupNameIntPair mgmt_group_map [] = {
{ "aes128cmac", GSUPPLICANT_CIPHER_AES128_CMAC }
};
GASSERT(g_variant_is_of_type(value, G_VARIANT_TYPE_STRING));
if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
const char* str = g_variant_get_string(value, NULL);
const GSupNameIntPair* pair = gsupplicant_name_int_find_name(str,
mgmt_group_map, G_N_ELEMENTS(mgmt_group_map));
if (pair) {
GVERBOSE(" %s: %s", name, str);
rsn->mgmt_group = pair->value;
}
}
rsn->mgmt_group = gsupplicant_parse_cipher_value(name, value);
} else {
GWARN("Unexpected RSN dictionary key %s", name);
}
Expand Down
17 changes: 2 additions & 15 deletions src/gsupplicant_interface.c
Expand Up @@ -1461,22 +1461,9 @@ gsupplicant_interface_parse_cap(
{
GSupplicantInterfaceCaps* caps = data;
if (!g_strcmp0(name, "Pairwise")) {
static const GSupNameIntPair pairwise_map [] = {
{ "ccmp", GSUPPLICANT_CIPHER_CCMP },
{ "tkip", GSUPPLICANT_CIPHER_TKIP },
{ "none", GSUPPLICANT_CIPHER_NONE }
};
caps->pairwise = gsupplicant_parse_bits_array(0, name, value,
pairwise_map, G_N_ELEMENTS(pairwise_map));
caps->pairwise = gsupplicant_parse_cipher_list(name, value);
} else if (!g_strcmp0(name, "Group")) {
static const GSupNameIntPair group_map [] = {
{ "ccmp", GSUPPLICANT_CIPHER_CCMP },
{ "tkip", GSUPPLICANT_CIPHER_TKIP },
{ "wep104", GSUPPLICANT_CIPHER_WEP104 },
{ "wep40", GSUPPLICANT_CIPHER_WEP40 }
};
caps->group = gsupplicant_parse_bits_array(0, name, value,
group_map, G_N_ELEMENTS(group_map));
caps->group = gsupplicant_parse_cipher_list(name, value);
} else if (!g_strcmp0(name, "KeyMgmt")) {
caps->keymgmt = gsupplicant_parse_keymgmt_list(name, value);
} else if (!g_strcmp0(name, "Protocol")) {
Expand Down
14 changes: 13 additions & 1 deletion src/gsupplicant_p.h
Expand Up @@ -34,10 +34,22 @@

#include "gsupplicant_types_p.h"

GSUPPLICANT_CIPHER
gsupplicant_parse_cipher_value(
const char* name,
GVariant* value) /* G_VARIANT_TYPE_STRING */
GSUPPLICANT_INTERNAL;

GSUPPLICANT_CIPHER
gsupplicant_parse_cipher_list(
const char* name,
GVariant* value) /* G_VARIANT_TYPE_STRING_ARRAY */
GSUPPLICANT_INTERNAL;

GSUPPLICANT_KEYMGMT
gsupplicant_parse_keymgmt_list(
const char* name,
GVariant* value)
GVariant* value) /* G_VARIANT_TYPE_STRING_ARRAY */
GSUPPLICANT_INTERNAL;

#endif /* GSUPPLICANT_PRIVATE_H */
Expand Down
30 changes: 28 additions & 2 deletions src/gsupplicant_util.c
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2015-2021 Jolla Ltd.
* Copyright (C) 2015-2021 Slava Monich <slava.monich@jolla.com>
* Copyright (C) 2015-2023 Slava Monich <slava@monich.com>
*
* You may use this file under the terms of BSD license as follows:
*
Expand Down Expand Up @@ -159,6 +159,32 @@ gsupplicant_name_int_concat(
return buf ? g_string_free(buf, FALSE) : NULL;
}

guint32
gsupplicant_parse_bit_value(
const char* name,
GVariant* value,
const GSupNameIntPair* map,
gsize count)
{
if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
const char* str = g_variant_get_string(value, NULL);
const GSupNameIntPair* pair = gsupplicant_name_int_find_name(str,
map, count);
if (pair) {
GVERBOSE(" %s: %s", name, str);
return pair->value;
} else if (!str[0]) {
/* Don't complain about empty strings, just return zero */
GVERBOSE(" %s: ", name);
} else {
GWARN("Unexpected %s value %s", name, str);
}
} else {
GWARN("Unexpected value type for %s", name);
}
return 0;
}

guint32
gsupplicant_parse_bits_array(
guint32 mask,
Expand All @@ -167,7 +193,7 @@ gsupplicant_parse_bits_array(
const GSupNameIntPair* map,
gsize count)
{
if (g_variant_is_of_type(value, G_VARIANT_TYPE("as"))) {
if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY)) {
GVariantIter it;
char* str = NULL;
#if GUTIL_LOG_VERBOSE
Expand Down
10 changes: 9 additions & 1 deletion src/gsupplicant_util_p.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2015-2021 Jolla Ltd.
* Copyright (C) 2015-2021 Slava Monich <slava.monich@jolla.com>
* Copyright (C) 2015-2023 Slava Monich <slava@monich.com>
*
* You may use this file under the terms of BSD license as follows:
*
Expand Down Expand Up @@ -49,6 +49,14 @@ void
GVariant* value,
void* data);

guint32
gsupplicant_parse_bit_value(
const char* name,
GVariant* value,
const GSupNameIntPair* map,
gsize count)
GSUPPLICANT_INTERNAL;

guint32
gsupplicant_parse_bits_array(
guint32 mask,
Expand Down
55 changes: 49 additions & 6 deletions test/test_util/test_util.c
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2017-2021 Jolla Ltd.
* Copyright (C) 2017-2021 Slava Monich <slava.monich@jolla.com>
* Copyright (C) 2017-2023 Slava Monich <slava@monich.com>
*
* You may use this file under the terms of BSD license as follows:
*
Expand Down Expand Up @@ -205,6 +205,7 @@ test_util_parse_bits_array(
{
GVariantBuilder builder;
GVariant* var;

g_variant_builder_init(&builder, G_VARIANT_TYPE("ai"));
g_variant_builder_add_value(&builder, g_variant_new_int32(0));
var = g_variant_ref_sink(g_variant_builder_end(&builder));
Expand All @@ -218,8 +219,45 @@ test_util_parse_bits_array(
g_variant_builder_add_value(&builder, g_variant_new_string("unknown"));
var = g_variant_ref_sink(g_variant_builder_end(&builder));

g_assert(gsupplicant_parse_bits_array(0, "test", var,
test_map, G_N_ELEMENTS(test_map)) == BIT_FOO);
g_assert_cmpuint(gsupplicant_parse_bits_array(0, "test", var,
test_map, G_N_ELEMENTS(test_map)), == ,BIT_FOO);
g_variant_unref(var);
}

/*==========================================================================*
* parse_bit_value
*==========================================================================*/

static
void
test_util_parse_bit_value(
void)
{
GVariant* var;

/* Unexpected type */
var = g_variant_ref_sink(g_variant_new_int32(0));
g_assert(!gsupplicant_parse_bit_value("test", var,
test_map, G_N_ELEMENTS(test_map)));
g_variant_unref(var);

/* Unexpected value */
var = g_variant_new_string("unknown");
g_assert(!gsupplicant_parse_bit_value("test", var,
test_map, G_N_ELEMENTS(test_map)));
g_variant_unref(var);

/* Empty string */
var = g_variant_new_string("");
g_assert(!gsupplicant_parse_bit_value("test", var, NULL, 0));
g_assert(gsupplicant_parse_bit_value("test", var, test_map,
G_N_ELEMENTS(test_map))); /* This map contains empty string */
g_variant_unref(var);

/* Success */
var = g_variant_new_string(test_map->name);
g_assert_cmpuint(gsupplicant_parse_bit_value("test", var,
test_map, G_N_ELEMENTS(test_map)), == ,test_map->value);
g_variant_unref(var);
}

Expand Down Expand Up @@ -394,6 +432,7 @@ test_util_dict_parse(
g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
gsupplicant_dict_add_boolean(&builder, "true", TRUE);
gsupplicant_dict_add_uint32(&builder, "one", 1);
gsupplicant_dict_add_value(&builder, "two", g_variant_new_uint32(2));
gsupplicant_dict_add_string0(&builder, NULL, NULL);
gsupplicant_dict_add_string0(&builder, NULL, "ignored");
gsupplicant_dict_add_string0(&builder, "string", NULL);
Expand All @@ -409,13 +448,16 @@ test_util_dict_parse(
gsupplicant_dict_add_bytes0(&builder, "bytes", test_bytes);
dict = g_variant_ref_sink(g_variant_builder_end(&builder));
GDEBUG_("%u", (guint)g_variant_n_children(dict));
g_assert(g_variant_n_children(dict) == 5);
g_assert_cmpuint(g_variant_n_children(dict), == ,6);

g_assert(!gsupplicant_dict_parse(NULL, test_util_dict_cb, values));
g_assert(!g_hash_table_size(values));
g_assert(gsupplicant_dict_parse(dict, test_util_dict_cb, values) == 5);
g_assert(gsupplicant_dict_parse(dict, test_util_dict_cb, values) == 6);
g_assert(g_variant_get_boolean(g_hash_table_lookup(values, "true")));
g_assert(g_variant_get_uint32(g_hash_table_lookup(values, "one")) == 1);
g_assert_cmpuint(g_variant_get_uint32(g_hash_table_lookup(values,
"one")), == ,1);
g_assert_cmpuint(g_variant_get_uint32(g_hash_table_lookup(values,
"two")), == ,2);
g_assert(!g_strcmp0(g_variant_get_string(g_hash_table_lookup(values,
"string"), NULL), "string"));
g_assert(!g_strcmp0(g_variant_get_string(g_hash_table_lookup(values,
Expand Down Expand Up @@ -562,6 +604,7 @@ int main(int argc, char* argv[])
g_test_init(&argc, &argv, NULL);
g_test_add_func(TEST_PREFIX "name_int", test_util_name_int);
g_test_add_func(TEST_PREFIX "parse_bits_array", test_util_parse_bits_array);
g_test_add_func(TEST_PREFIX "parse_bit_value", test_util_parse_bit_value);
g_test_add_func(TEST_PREFIX "format_bytes", test_util_format_bytes);
g_test_add_func(TEST_PREFIX "cancel_later", test_util_cancel_later);
g_test_add_func(TEST_PREFIX "abs_path", test_util_abs_path);
Expand Down

0 comments on commit 9d5835e

Please sign in to comment.